From b708482f2b2022e1f673eb4e7bad43f5c1d083d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 7 Jan 2021 14:04:21 +0800 Subject: [PATCH 0001/1766] update smart-servlet to 0.1.3-SNAPSHOT --- frameworks/Java/smart-socket/pom.xml | 2 +- .../java/org/smartboot/servlet/Bootstrap.java | 23 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 684419d007a..d54ebeeb924 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -12,7 +12,7 @@ 11 2.11.0 1.0.2 - 0.1.2-SNAPSHOT + 0.1.3-SNAPSHOT 1.5.5-SNAPSHOT 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 d550c8301ca..cff3ca28d73 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 @@ -1,9 +1,12 @@ package org.smartboot.servlet; import org.smartboot.aio.EnhanceAsynchronousChannelProvider; +import org.smartboot.http.HttpRequest; +import org.smartboot.http.HttpResponse; import org.smartboot.http.server.HttpMessageProcessor; import org.smartboot.http.server.HttpRequestProtocol; import org.smartboot.http.server.Request; +import org.smartboot.http.server.handle.HttpHandle; import org.smartboot.servlet.conf.ServletInfo; import org.smartboot.socket.StateMachineEnum; import org.smartboot.socket.buffer.BufferFactory; @@ -24,26 +27,30 @@ public class Bootstrap { public static void main(String[] args) { System.setProperty("java.nio.channels.spi.AsynchronousChannelProvider", EnhanceAsynchronousChannelProvider.class.getName()); - ServletHttpHandle httpHandle = new ServletHttpHandle(); - ContainerRuntime containerRuntime = new ContainerRuntime("/"); + ContainerRuntime containerRuntime = new ContainerRuntime(); // plaintext + ApplicationRuntime applicationRuntime = new ApplicationRuntime("/"); ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); plainTextServletInfo.addMapping("/plaintext"); - containerRuntime.getDeploymentInfo().addServlet(plainTextServletInfo); + applicationRuntime.getDeploymentInfo().addServlet(plainTextServletInfo); // json ServletInfo jsonServletInfo = new ServletInfo(); jsonServletInfo.setServletName("json"); jsonServletInfo.setServletClass(HelloWorldServlet.class.getName()); jsonServletInfo.addMapping("/json"); - containerRuntime.getDeploymentInfo().addServlet(jsonServletInfo); - httpHandle.addRuntime(containerRuntime); - - httpHandle.start(); + applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); + containerRuntime.addRuntime(applicationRuntime); + containerRuntime.start(); HttpMessageProcessor processor = new HttpMessageProcessor(); - processor.pipeline(httpHandle); + processor.pipeline(new HttpHandle() { + @Override + public void doHandle(HttpRequest request, HttpResponse response) throws IOException { + containerRuntime.doHandle(request, response); + } + }); http(processor); } From 538056d4cd86d7d587275bef50bea6756ef97057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 7 Jan 2021 21:05:15 +0800 Subject: [PATCH 0002/1766] update aio-enhance to 1.0.3-SNAPSHOT --- 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 d54ebeeb924..20fc84bbe4c 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 11 11 2.11.0 - 1.0.2 + 1.0.3-SNAPSHOT 0.1.3-SNAPSHOT 1.5.5-SNAPSHOT From dc42109cd82e5a35aef3edf786b4f7a399396d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sun, 24 Jan 2021 11:17:15 +0800 Subject: [PATCH 0003/1766] smart-servlet bugfix --- .../src/main/java/org/smartboot/servlet/Bootstrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cff3ca28d73..99098b0472d 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 @@ -39,7 +39,7 @@ public static void main(String[] args) { // json ServletInfo jsonServletInfo = new ServletInfo(); jsonServletInfo.setServletName("json"); - jsonServletInfo.setServletClass(HelloWorldServlet.class.getName()); + jsonServletInfo.setServletClass(JsonServlet.class.getName()); jsonServletInfo.addMapping("/json"); applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); containerRuntime.addRuntime(applicationRuntime); From b946e2583a3cbacb466173c9fc69c5e1000db720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 1 Feb 2021 18:29:16 +0800 Subject: [PATCH 0004/1766] bugfix --- frameworks/Java/smart-socket/pom.xml | 11 ++++ .../java/org/smartboot/http/Bootstrap.java | 55 +++++----------- .../java/org/smartboot/servlet/Bootstrap.java | 63 ++++++------------- 3 files changed, 47 insertions(+), 82 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 20fc84bbe4c..01427d6c7be 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -63,6 +63,17 @@ postgresql 42.2.5 + + + org.apache.velocity + velocity + 1.7 + + + oro + oro + 2.0.8 + diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 0228cc4c811..2a75ca95108 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -12,16 +12,11 @@ import com.zaxxer.hikari.HikariDataSource; import org.smartboot.Message; import org.smartboot.aio.EnhanceAsynchronousChannelProvider; -import org.smartboot.http.server.HttpMessageProcessor; -import org.smartboot.http.server.HttpRequestProtocol; import org.smartboot.http.server.Request; import org.smartboot.http.server.handle.HttpHandle; import org.smartboot.http.server.handle.HttpRouteHandle; import org.smartboot.socket.StateMachineEnum; -import org.smartboot.socket.buffer.BufferFactory; -import org.smartboot.socket.buffer.BufferPagePool; import org.smartboot.socket.extension.processor.AbstractMessageProcessor; -import org.smartboot.socket.transport.AioQuickServer; import org.smartboot.socket.transport.AioSession; import javax.sql.DataSource; @@ -55,45 +50,25 @@ public void doHandle(HttpRequest request, HttpResponse response) throws IOExcept } }); initDB(routeHandle); - HttpMessageProcessor processor = new HttpMessageProcessor(); - processor.pipeline(routeHandle); - http(processor); - } - - public static void http(final HttpMessageProcessor processor) { - AbstractMessageProcessor messageProcessor = new AbstractMessageProcessor() { - @Override - public void process0(AioSession session, Request msg) { - processor.process(session, msg); - } - - @Override - public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { - processor.stateEvent(session, stateMachineEnum, throwable); - } - }; -// messageProcessor.addPlugin(new MonitorPlugin(5)); -// messageProcessor.addPlugin(new SocketOptionPlugin()); - int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - AioQuickServer server = new AioQuickServer<>(8080, new HttpRequestProtocol(), messageProcessor); - server.setThreadNum(cpuNum + 2) + HttpBootstrap bootstrap = new HttpBootstrap(); + bootstrap.setPort(8080).setThreadNum(cpuNum + 2) .setReadBufferSize(1024 * 4) - .setBufferFactory(new BufferFactory() { + .setReadPageSize(16384 * 1024 * 4) + .setBufferPool(10 * 1024 * 1024, cpuNum + 2, 1024 * 4) + .pipeline(routeHandle) + .wrapProcessor(processor -> new AbstractMessageProcessor<>() { @Override - public BufferPagePool create() { - return new BufferPagePool(10 * 1024 * 1024, cpuNum + 2, 64 * 1024 * 1024, true); + public void process0(AioSession session, Request msg) { + processor.process(session, msg); } - }) - .setWriteBuffer(1024 * 4, 8); -// messageProcessor.addPlugin(new BufferPageMonitorPlugin(server, 6)); - try { - server.start(); - } catch (IOException e) { - e.printStackTrace(); - } + @Override + public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { + processor.stateEvent(session, stateMachineEnum, throwable); + } + }).start(); } private static void initDB(HttpRouteHandle routeHandle) { @@ -107,9 +82,13 @@ private static void initDB(HttpRouteHandle routeHandle) { config.setUsername("benchmarkdbuser"); config.setPassword("benchmarkdbpass"); config.setMaximumPoolSize(64); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); DataSource dataSource = new HikariDataSource(config); routeHandle.route("/db", new SingleQueryHandler(dataSource)) .route("/queries", new MultipleQueriesHandler(dataSource)) .route("/updates", new UpdateHandler(dataSource)); +// .route("/fortunes", new FortunesHandler(dataSource)); } } 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 99098b0472d..2323c5c0396 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 @@ -1,19 +1,14 @@ package org.smartboot.servlet; import org.smartboot.aio.EnhanceAsynchronousChannelProvider; +import org.smartboot.http.HttpBootstrap; import org.smartboot.http.HttpRequest; import org.smartboot.http.HttpResponse; -import org.smartboot.http.server.HttpMessageProcessor; -import org.smartboot.http.server.HttpRequestProtocol; import org.smartboot.http.server.Request; import org.smartboot.http.server.handle.HttpHandle; import org.smartboot.servlet.conf.ServletInfo; import org.smartboot.socket.StateMachineEnum; -import org.smartboot.socket.buffer.BufferFactory; -import org.smartboot.socket.buffer.BufferPagePool; -import org.smartboot.socket.extension.plugins.MonitorPlugin; import org.smartboot.socket.extension.processor.AbstractMessageProcessor; -import org.smartboot.socket.transport.AioQuickServer; import org.smartboot.socket.transport.AioSession; import java.io.IOException; @@ -44,50 +39,30 @@ public static void main(String[] args) { applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); containerRuntime.addRuntime(applicationRuntime); containerRuntime.start(); - HttpMessageProcessor processor = new HttpMessageProcessor(); - processor.pipeline(new HttpHandle() { - @Override - public void doHandle(HttpRequest request, HttpResponse response) throws IOException { - containerRuntime.doHandle(request, response); - } - }); - http(processor); - } - - public static void http(final HttpMessageProcessor processor) { - AbstractMessageProcessor messageProcessor = new AbstractMessageProcessor() { - @Override - public void process0(AioSession session, Request msg) { - processor.process(session, msg); - } - - @Override - public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { - processor.stateEvent(session, stateMachineEnum, throwable); - } - }; - messageProcessor.addPlugin(new MonitorPlugin(5)); -// messageProcessor.addPlugin(new SocketOptionPlugin()); - int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - AioQuickServer server = new AioQuickServer<>(8080, new HttpRequestProtocol(), messageProcessor); - server.setThreadNum(cpuNum + 2) + HttpBootstrap bootstrap = new HttpBootstrap(); + bootstrap.setPort(8080).setThreadNum(cpuNum + 2) .setReadBufferSize(1024 * 4) - .setBufferFactory(new BufferFactory() { + .setReadPageSize(16384 * 1024 * 4) + .setBannerEnabled(false) + .setBufferPool(10 * 1024 * 1024, cpuNum + 2, 1024 * 4) + .pipeline(new HttpHandle() { @Override - public BufferPagePool create() { - return new BufferPagePool(10 * 1024 * 1024, cpuNum + 2, 64 * 1024 * 1024, true); + public void doHandle(HttpRequest request, HttpResponse response) throws IOException { + containerRuntime.doHandle(request, response); } }) - .setBannerEnabled(false) - .setWriteBuffer(1024 * 4, 8); + .wrapProcessor(processor -> new AbstractMessageProcessor<>() { + @Override + public void process0(AioSession session, Request msg) { + processor.process(session, msg); + } -// messageProcessor.addPlugin(new BufferPageMonitorPlugin(server, 6)); - try { - server.start(); - } catch (IOException e) { - e.printStackTrace(); - } + @Override + public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { + processor.stateEvent(session, stateMachineEnum, throwable); + } + }).start(); } } From bdec05d6548f6c41a588612e7361d93cc9c753c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sun, 14 Feb 2021 11:10:18 +0800 Subject: [PATCH 0005/1766] update smart-socket to 1.5.6-SNAPSHOT --- frameworks/Java/smart-socket/pom.xml | 4 +- .../java/org/smartboot/http/Bootstrap.java | 11 +- .../org/smartboot/http/FortunesHandler.java | 111 ++++++++++++++++++ .../java/org/smartboot/http/JsonUtil.java | 1 + .../http/MultipleQueriesHandler.java | 8 +- .../smartboot/http/SingleQueryHandler.java | 6 +- .../org/smartboot/http/UpdateHandler.java | 8 +- .../java/org/smartboot/servlet/Bootstrap.java | 12 +- .../src/main/resources/fortunes.vm | 21 ++++ 9 files changed, 162 insertions(+), 20 deletions(-) create mode 100644 frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java create mode 100644 frameworks/Java/smart-socket/src/main/resources/fortunes.vm diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 01427d6c7be..9769b2d0306 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,9 +11,9 @@ 11 11 2.11.0 - 1.0.3-SNAPSHOT + 1.0.3 0.1.3-SNAPSHOT - 1.5.5-SNAPSHOT + 1.5.6-SNAPSHOT diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 2a75ca95108..84d7c2ec497 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -12,9 +12,12 @@ import com.zaxxer.hikari.HikariDataSource; import org.smartboot.Message; import org.smartboot.aio.EnhanceAsynchronousChannelProvider; -import org.smartboot.http.server.Request; -import org.smartboot.http.server.handle.HttpHandle; +import org.smartboot.http.server.HttpBootstrap; +import org.smartboot.http.server.HttpRequest; +import org.smartboot.http.server.HttpResponse; +import org.smartboot.http.server.HttpServerHandle; import org.smartboot.http.server.handle.HttpRouteHandle; +import org.smartboot.http.server.impl.Request; import org.smartboot.socket.StateMachineEnum; import org.smartboot.socket.extension.processor.AbstractMessageProcessor; import org.smartboot.socket.transport.AioSession; @@ -30,7 +33,7 @@ public static void main(String[] args) { HttpRouteHandle routeHandle = new HttpRouteHandle(); routeHandle - .route("/plaintext", new HttpHandle() { + .route("/plaintext", new HttpServerHandle() { @Override @@ -40,7 +43,7 @@ public void doHandle(HttpRequest request, HttpResponse response) throws IOExcept response.write(body); } }) - .route("/json", new HttpHandle() { + .route("/json", new HttpServerHandle() { @Override public void doHandle(HttpRequest request, HttpResponse response) throws IOException { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java new file mode 100644 index 00000000000..8f5f7111949 --- /dev/null +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java @@ -0,0 +1,111 @@ +package org.smartboot.http; + +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; +import org.smartboot.http.server.HttpRequest; +import org.smartboot.http.server.HttpResponse; +import org.smartboot.http.server.HttpServerHandle; + +import javax.sql.DataSource; +import java.io.IOException; +import java.io.StringWriter; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; + +/** + * @author 三刀(zhengjunweimail@163.com) + * @version V1.0 , 2021/1/24 + */ +public class FortunesHandler extends HttpServerHandle { + private final DataSource dataSource; + private final Template template; + + public FortunesHandler(DataSource dataSource) { + this.dataSource = dataSource; + // 初始化模板引擎 + VelocityEngine ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); + ve.setProperty("output.encoding", "utf8"); + ve.setProperty("input.encoding", "utf8"); + ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); + ve.setProperty("eventhandler.referenceinsertion.class", "org.apache.velocity.app.event.implement.EscapeHtmlReference"); + ve.setProperty("eventhandler.escape.html.match", "/^(?!\\$\\!?unesc_).*/"); + ve.init(); + // 获取模板文件 + template = ve.getTemplate("fortunes.vm", "utf8"); + } + + public static void main(String[] args) { + // 初始化模板引擎 + VelocityEngine ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); + ve.setProperty("output.encoding", "MS932"); + ve.setProperty("input.encoding", "MS932"); + ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); + ve.setProperty("eventhandler.referenceinsertion.class", "org.apache.velocity.app.event.implement.EscapeHtmlReference"); + ve.setProperty("eventhandler.escape.html.match", "/^(?!\\$\\!?unesc_).*/"); + ve.init(); + // 获取模板文件 + Template template = ve.getTemplate("fortunes.vm", "MS932"); + VelocityContext ctx = new VelocityContext(); + List fortunes = new ArrayList<>(); + fortunes.add(new Fortune(1, "")); + ctx.put("fortunes", fortunes); + ctx.put("text", "フレームワークのベンチマーク"); + StringWriter sw = new StringWriter(); + template.merge(ctx, sw); + System.out.println(sw); + System.out.println("フレームワークのベンチマーク"); + } + + @Override + public void doHandle(HttpRequest request, HttpResponse response) throws IOException { + List fortunes = new ArrayList<>(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM fortune"); + ResultSet resultSet = preparedStatement.executeQuery();) { + while (resultSet.next()) { + fortunes.add(new Fortune(resultSet.getInt(1), resultSet.getString(2))); + } + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + fortunes.sort(Comparator.comparing(fortune -> fortune.message)); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + VelocityContext ctx = new VelocityContext(); + ctx.put("fortunes", fortunes); + StringWriter sw = new StringWriter(); + template.merge(ctx, sw); + byte[] bytes = sw.toString().getBytes("utf8"); + response.setContentLength(bytes.length); + response.setContentType("text/plain; charset=UTF-8"); + response.write(bytes); + } + + public static final class Fortune { + public final int id; + public final String message; + + public Fortune(int id, String message) { + this.id = id; + this.message = Objects.requireNonNull(message); + } + + public int getId() { + return id; + } + + public String getMessage() { + return message; + } + } +} 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 930c98164d8..0b507e9142d 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 @@ -4,6 +4,7 @@ import com.jsoniter.output.JsonStreamPool; import com.jsoniter.spi.JsonException; import com.jsoniter.spi.Slice; +import org.smartboot.http.server.HttpResponse; import javax.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index 0a368256a63..0896790de9f 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -1,7 +1,9 @@ package org.smartboot.http; -import org.smartboot.http.server.handle.HttpHandle; -import org.smartboot.http.utils.NumberUtils; +import org.smartboot.http.common.utils.NumberUtils; +import org.smartboot.http.server.HttpRequest; +import org.smartboot.http.server.HttpResponse; +import org.smartboot.http.server.HttpServerHandle; import javax.sql.DataSource; import java.io.IOException; @@ -15,7 +17,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class MultipleQueriesHandler extends HttpHandle { +public class MultipleQueriesHandler extends HttpServerHandle { private DataSource dataSource; public MultipleQueriesHandler(DataSource dataSource) { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index 3473d75f88c..4b15f15d516 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -1,6 +1,8 @@ package org.smartboot.http; -import org.smartboot.http.server.handle.HttpHandle; +import org.smartboot.http.server.HttpRequest; +import org.smartboot.http.server.HttpResponse; +import org.smartboot.http.server.HttpServerHandle; import javax.sql.DataSource; import java.io.IOException; @@ -14,7 +16,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class SingleQueryHandler extends HttpHandle { +public class SingleQueryHandler extends HttpServerHandle { private DataSource dataSource; public SingleQueryHandler(DataSource dataSource) { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index 82307b684a2..51477460746 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -1,7 +1,9 @@ package org.smartboot.http; -import org.smartboot.http.server.handle.HttpHandle; -import org.smartboot.http.utils.NumberUtils; +import org.smartboot.http.common.utils.NumberUtils; +import org.smartboot.http.server.HttpRequest; +import org.smartboot.http.server.HttpResponse; +import org.smartboot.http.server.HttpServerHandle; import javax.sql.DataSource; import java.io.IOException; @@ -16,7 +18,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class UpdateHandler extends HttpHandle { +public class UpdateHandler extends HttpServerHandle { private DataSource dataSource; public UpdateHandler(DataSource dataSource) { 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 2323c5c0396..8571ce93bbd 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 @@ -1,11 +1,11 @@ package org.smartboot.servlet; import org.smartboot.aio.EnhanceAsynchronousChannelProvider; -import org.smartboot.http.HttpBootstrap; -import org.smartboot.http.HttpRequest; -import org.smartboot.http.HttpResponse; -import org.smartboot.http.server.Request; -import org.smartboot.http.server.handle.HttpHandle; +import org.smartboot.http.server.HttpBootstrap; +import org.smartboot.http.server.HttpRequest; +import org.smartboot.http.server.HttpResponse; +import org.smartboot.http.server.HttpServerHandle; +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; @@ -47,7 +47,7 @@ public static void main(String[] args) { .setReadPageSize(16384 * 1024 * 4) .setBannerEnabled(false) .setBufferPool(10 * 1024 * 1024, cpuNum + 2, 1024 * 4) - .pipeline(new HttpHandle() { + .pipeline(new HttpServerHandle() { @Override public void doHandle(HttpRequest request, HttpResponse response) throws IOException { containerRuntime.doHandle(request, response); diff --git a/frameworks/Java/smart-socket/src/main/resources/fortunes.vm b/frameworks/Java/smart-socket/src/main/resources/fortunes.vm new file mode 100644 index 00000000000..baa01946e42 --- /dev/null +++ b/frameworks/Java/smart-socket/src/main/resources/fortunes.vm @@ -0,0 +1,21 @@ + + + + Fortunes + + + + + + + + #foreach($i in $fortunes) + + + + + #end +
idmessage
${i.id}${i.message}
+${text} + + \ No newline at end of file From 2e8869b03458fea1ca674b8a63e8d67b4bab27c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sat, 20 Feb 2021 14:30:04 +0800 Subject: [PATCH 0006/1766] remove file --- .../org/smartboot/http/FortunesHandler.java | 111 ------------------ 1 file changed, 111 deletions(-) delete mode 100644 frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java deleted file mode 100644 index 8f5f7111949..00000000000 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FortunesHandler.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.smartboot.http; - -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandle; - -import javax.sql.DataSource; -import java.io.IOException; -import java.io.StringWriter; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; - -/** - * @author 三刀(zhengjunweimail@163.com) - * @version V1.0 , 2021/1/24 - */ -public class FortunesHandler extends HttpServerHandle { - private final DataSource dataSource; - private final Template template; - - public FortunesHandler(DataSource dataSource) { - this.dataSource = dataSource; - // 初始化模板引擎 - VelocityEngine ve = new VelocityEngine(); - ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); - ve.setProperty("output.encoding", "utf8"); - ve.setProperty("input.encoding", "utf8"); - ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); - ve.setProperty("eventhandler.referenceinsertion.class", "org.apache.velocity.app.event.implement.EscapeHtmlReference"); - ve.setProperty("eventhandler.escape.html.match", "/^(?!\\$\\!?unesc_).*/"); - ve.init(); - // 获取模板文件 - template = ve.getTemplate("fortunes.vm", "utf8"); - } - - public static void main(String[] args) { - // 初始化模板引擎 - VelocityEngine ve = new VelocityEngine(); - ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); - ve.setProperty("output.encoding", "MS932"); - ve.setProperty("input.encoding", "MS932"); - ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); - ve.setProperty("eventhandler.referenceinsertion.class", "org.apache.velocity.app.event.implement.EscapeHtmlReference"); - ve.setProperty("eventhandler.escape.html.match", "/^(?!\\$\\!?unesc_).*/"); - ve.init(); - // 获取模板文件 - Template template = ve.getTemplate("fortunes.vm", "MS932"); - VelocityContext ctx = new VelocityContext(); - List fortunes = new ArrayList<>(); - fortunes.add(new Fortune(1, "")); - ctx.put("fortunes", fortunes); - ctx.put("text", "フレームワークのベンチマーク"); - StringWriter sw = new StringWriter(); - template.merge(ctx, sw); - System.out.println(sw); - System.out.println("フレームワークのベンチマーク"); - } - - @Override - public void doHandle(HttpRequest request, HttpResponse response) throws IOException { - List fortunes = new ArrayList<>(); - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM fortune"); - ResultSet resultSet = preparedStatement.executeQuery();) { - while (resultSet.next()) { - fortunes.add(new Fortune(resultSet.getInt(1), resultSet.getString(2))); - } - fortunes.add(new Fortune(0, "Additional fortune added at request time.")); - fortunes.sort(Comparator.comparing(fortune -> fortune.message)); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - VelocityContext ctx = new VelocityContext(); - ctx.put("fortunes", fortunes); - StringWriter sw = new StringWriter(); - template.merge(ctx, sw); - byte[] bytes = sw.toString().getBytes("utf8"); - response.setContentLength(bytes.length); - response.setContentType("text/plain; charset=UTF-8"); - response.write(bytes); - } - - public static final class Fortune { - public final int id; - public final String message; - - public Fortune(int id, String message) { - this.id = id; - this.message = Objects.requireNonNull(message); - } - - public int getId() { - return id; - } - - public String getMessage() { - return message; - } - } -} From 4b4541cfc8fb7fe6fad0c7ef95d55ffb755c7857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 22 Feb 2021 10:38:21 +0800 Subject: [PATCH 0007/1766] update aio-enhance to 1.0.4-SNAPSHOT --- 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 9769b2d0306..6fafddf107c 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 11 11 2.11.0 - 1.0.3 + 1.0.4-SNAPSHOT 0.1.3-SNAPSHOT 1.5.6-SNAPSHOT From 9bd5a505d9d3f97b2a186d714ba82dc0d4acd5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 22 Feb 2021 21:25:00 +0800 Subject: [PATCH 0008/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/smartboot/http/Bootstrap.java | 16 +++++----- .../java/org/smartboot/servlet/Bootstrap.java | 30 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 84d7c2ec497..f18b4f9e14e 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -56,12 +56,13 @@ public void doHandle(HttpRequest request, HttpResponse response) throws IOExcept int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); - bootstrap.setPort(8080).setThreadNum(cpuNum + 2) - .setReadBufferSize(1024 * 4) - .setReadPageSize(16384 * 1024 * 4) - .setBufferPool(10 * 1024 * 1024, cpuNum + 2, 1024 * 4) - .pipeline(routeHandle) - .wrapProcessor(processor -> new AbstractMessageProcessor<>() { + bootstrap.configuration() + .threadNum(cpuNum + 2) + .readBufferSize(1024 * 4) + .writeBufferSize(1024 * 4) + .readMemoryPool(16384 * 1024 * 4) + .writeMemoryPool(10 * 1024 * 1024 * (cpuNum + 2), cpuNum + 2) + .messageProcessor(processor -> new AbstractMessageProcessor<>() { @Override public void process0(AioSession session, Request msg) { processor.process(session, msg); @@ -71,7 +72,8 @@ public void process0(AioSession session, Request msg) { public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { processor.stateEvent(session, stateMachineEnum, throwable); } - }).start(); + }); + bootstrap.setPort(8080).start(); } private static void initDB(HttpRouteHandle routeHandle) { 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 8571ce93bbd..c1f58f5c1bc 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 @@ -42,18 +42,14 @@ public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); - bootstrap.setPort(8080).setThreadNum(cpuNum + 2) - .setReadBufferSize(1024 * 4) - .setReadPageSize(16384 * 1024 * 4) - .setBannerEnabled(false) - .setBufferPool(10 * 1024 * 1024, cpuNum + 2, 1024 * 4) - .pipeline(new HttpServerHandle() { - @Override - public void doHandle(HttpRequest request, HttpResponse response) throws IOException { - containerRuntime.doHandle(request, response); - } - }) - .wrapProcessor(processor -> new AbstractMessageProcessor<>() { + bootstrap.configuration() + .threadNum(cpuNum + 2) + .bannerEnabled(false) + .readBufferSize(1024 * 4) + .writeBufferSize(1024 * 4) + .readMemoryPool(16384 * 1024 * 4) + .writeMemoryPool(10 * 1024 * 1024 * (cpuNum + 2), cpuNum + 2) + .messageProcessor(processor -> new AbstractMessageProcessor<>() { @Override public void process0(AioSession session, Request msg) { processor.process(session, msg); @@ -63,6 +59,14 @@ public void process0(AioSession session, Request msg) { public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { processor.stateEvent(session, stateMachineEnum, throwable); } - }).start(); + }); + bootstrap.setPort(8080) + .pipeline(new HttpServerHandle() { + @Override + public void doHandle(HttpRequest request, HttpResponse response) throws IOException { + containerRuntime.doHandle(request, response); + } + }) + .start(); } } From e9e77413ed6c97d6007f05086e5197bfd4d2ba4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Tue, 23 Feb 2021 11:20:32 +0800 Subject: [PATCH 0009/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/smartboot/http/Bootstrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index f18b4f9e14e..04f80544d4b 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -73,7 +73,7 @@ public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, T processor.stateEvent(session, stateMachineEnum, throwable); } }); - bootstrap.setPort(8080).start(); + bootstrap.pipeline(routeHandle).setPort(8080).start(); } private static void initDB(HttpRouteHandle routeHandle) { From 34ce1b268d5c33b664f34d28ab79260f56496f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Wed, 3 Mar 2021 14:12:18 +0800 Subject: [PATCH 0010/1766] update smart-socket to 1.5.6 --- 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 6fafddf107c..3f4fcf669ca 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -13,7 +13,7 @@ 2.11.0 1.0.4-SNAPSHOT 0.1.3-SNAPSHOT - 1.5.6-SNAPSHOT + 1.5.6 From b708443dbec32c45f204f436fa58cb7e3d280c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Wed, 3 Mar 2021 14:36:34 +0800 Subject: [PATCH 0011/1766] config threadNum --- .../src/main/java/org/smartboot/http/Bootstrap.java | 4 ++-- .../src/main/java/org/smartboot/servlet/Bootstrap.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 04f80544d4b..85c6d89aaef 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -57,11 +57,11 @@ public void doHandle(HttpRequest request, HttpResponse response) throws IOExcept // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); bootstrap.configuration() - .threadNum(cpuNum + 2) + .threadNum(cpuNum) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * (cpuNum + 2), cpuNum + 2) + .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum) .messageProcessor(processor -> new AbstractMessageProcessor<>() { @Override public void process0(AioSession session, Request msg) { 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 c1f58f5c1bc..163fc8f5326 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 @@ -43,12 +43,12 @@ public static void main(String[] args) { // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); bootstrap.configuration() - .threadNum(cpuNum + 2) + .threadNum(cpuNum) .bannerEnabled(false) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * (cpuNum + 2), cpuNum + 2) + .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum) .messageProcessor(processor -> new AbstractMessageProcessor<>() { @Override public void process0(AioSession session, Request msg) { From 5f5beea5091826dd692a5f2f6da93e27ebb9e58e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Wed, 17 Mar 2021 16:21:42 +0800 Subject: [PATCH 0012/1766] update smart-socket to 1.5.7-SNAPSHOT --- 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 3f4fcf669ca..42c144e4caf 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -13,7 +13,7 @@ 2.11.0 1.0.4-SNAPSHOT 0.1.3-SNAPSHOT - 1.5.6 + 1.5.7-SNAPSHOT From 30734b3504020977d60e31c72d78ec71417e2af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Wed, 26 May 2021 19:19:33 +0800 Subject: [PATCH 0013/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smart-socket/src/main/java/org/smartboot/http/JsonUtil.java | 1 - 1 file changed, 1 deletion(-) 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 0b507e9142d..d8491ef6118 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 @@ -19,7 +19,6 @@ public static void writeJsonBytes(HttpResponse httpResponse, Object obj) { try { stream.reset(null); stream.writeVal(obj.getClass(), obj); - stream.buffer(); Slice slice = stream.buffer(); httpResponse.setContentLength(slice.tail()); httpResponse.getOutputStream().write(slice.data(), 0, slice.tail()); From e4e2a72ae8c88b5605cdf400c3dff0c026c8429b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 4 Jun 2021 11:29:53 +0800 Subject: [PATCH 0014/1766] update smart-socket to 1.5.10-SNAPSHOT --- frameworks/Java/smart-socket/pom.xml | 4 ++-- .../src/main/java/org/smartboot/servlet/Bootstrap.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 42c144e4caf..096b64b0123 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -12,8 +12,8 @@ 11 2.11.0 1.0.4-SNAPSHOT - 0.1.3-SNAPSHOT - 1.5.7-SNAPSHOT + 0.1.5-SNAPSHOT + 1.5.10-SNAPSHOT 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 163fc8f5326..b589d5e1720 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 @@ -24,7 +24,7 @@ public static void main(String[] args) { ContainerRuntime containerRuntime = new ContainerRuntime(); // plaintext - ApplicationRuntime applicationRuntime = new ApplicationRuntime("/"); + ServletContextRuntime applicationRuntime = new ServletContextRuntime("/"); ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); From 6ef1f6cea3acce1b40888bea0455416c6100eeb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 4 Jun 2021 13:51:49 +0800 Subject: [PATCH 0015/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smart-socket/src/main/java/org/smartboot/http/JsonUtil.java | 1 - 1 file changed, 1 deletion(-) 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 d8491ef6118..20e0ebcc5b8 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 @@ -34,7 +34,6 @@ public static void writeJsonBytes(HttpServletResponse httpResponse, Object obj) try { stream.reset(null); stream.writeVal(obj.getClass(), obj); - stream.buffer(); Slice slice = stream.buffer(); httpResponse.setContentLength(slice.tail()); httpResponse.getOutputStream().write(slice.data(), 0, slice.tail()); From b92bd1a508fb3b87791d5409f70b4875e06d2205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 10 Jun 2021 21:01:21 +0800 Subject: [PATCH 0016/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/smartboot/http/Bootstrap.java | 16 ++++++++-------- .../smartboot/http/MultipleQueriesHandler.java | 6 +++--- .../org/smartboot/http/SingleQueryHandler.java | 6 +++--- .../java/org/smartboot/http/UpdateHandler.java | 6 +++--- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 85c6d89aaef..267a03dde42 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -15,8 +15,8 @@ import org.smartboot.http.server.HttpBootstrap; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandle; -import org.smartboot.http.server.handle.HttpRouteHandle; +import org.smartboot.http.server.HttpServerHandler; +import org.smartboot.http.server.handler.HttpRouteHandler; import org.smartboot.http.server.impl.Request; import org.smartboot.socket.StateMachineEnum; import org.smartboot.socket.extension.processor.AbstractMessageProcessor; @@ -31,22 +31,22 @@ public class Bootstrap { public static void main(String[] args) { System.setProperty("java.nio.channels.spi.AsynchronousChannelProvider", EnhanceAsynchronousChannelProvider.class.getName()); - HttpRouteHandle routeHandle = new HttpRouteHandle(); + HttpRouteHandler routeHandle = new HttpRouteHandler(); routeHandle - .route("/plaintext", new HttpServerHandle() { + .route("/plaintext", new HttpServerHandler() { @Override - public void doHandle(HttpRequest request, HttpResponse response) throws IOException { + public void handle(HttpRequest request, HttpResponse response) throws IOException { response.setContentLength(body.length); response.setContentType("text/plain; charset=UTF-8"); response.write(body); } }) - .route("/json", new HttpServerHandle() { + .route("/json", new HttpServerHandler() { @Override - public void doHandle(HttpRequest request, HttpResponse response) throws IOException { + public void handle(HttpRequest request, HttpResponse response) throws IOException { response.setContentType("application/json"); JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); @@ -76,7 +76,7 @@ public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, T bootstrap.pipeline(routeHandle).setPort(8080).start(); } - private static void initDB(HttpRouteHandle routeHandle) { + private static void initDB(HttpRouteHandler routeHandle) { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index 0896790de9f..d623f3bf1de 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -3,7 +3,7 @@ import org.smartboot.http.common.utils.NumberUtils; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandle; +import org.smartboot.http.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; @@ -17,7 +17,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class MultipleQueriesHandler extends HttpServerHandle { +public class MultipleQueriesHandler extends HttpServerHandler { private DataSource dataSource; public MultipleQueriesHandler(DataSource dataSource) { @@ -25,7 +25,7 @@ public MultipleQueriesHandler(DataSource dataSource) { } @Override - public void doHandle(HttpRequest httpRequest, HttpResponse response) throws IOException { + public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); World[] worlds = new World[queries]; try (Connection connection = dataSource.getConnection(); diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index 4b15f15d516..e72f4b06433 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -2,7 +2,7 @@ import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandle; +import org.smartboot.http.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; @@ -16,7 +16,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class SingleQueryHandler extends HttpServerHandle { +public class SingleQueryHandler extends HttpServerHandler { private DataSource dataSource; public SingleQueryHandler(DataSource dataSource) { @@ -24,7 +24,7 @@ public SingleQueryHandler(DataSource dataSource) { } @Override - public void doHandle(HttpRequest httpRequest, HttpResponse response) throws IOException { + public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { World world = new World(); try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index 51477460746..065bed5a9a6 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -3,7 +3,7 @@ import org.smartboot.http.common.utils.NumberUtils; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandle; +import org.smartboot.http.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; @@ -18,7 +18,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class UpdateHandler extends HttpServerHandle { +public class UpdateHandler extends HttpServerHandler { private DataSource dataSource; public UpdateHandler(DataSource dataSource) { @@ -26,7 +26,7 @@ public UpdateHandler(DataSource dataSource) { } @Override - public void doHandle(HttpRequest httpRequest, HttpResponse response) throws IOException { + public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); World[] worlds = new World[queries]; StringJoiner updateSql = new StringJoiner( From 48a3430cc1397e754639c16fc234fe58555cbca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 10 Jun 2021 21:07:23 +0800 Subject: [PATCH 0017/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/smartboot/servlet/Bootstrap.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 b589d5e1720..3cc870dfbdf 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,7 +4,7 @@ import org.smartboot.http.server.HttpBootstrap; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandle; +import org.smartboot.http.server.HttpServerHandler; import org.smartboot.http.server.impl.Request; import org.smartboot.servlet.conf.ServletInfo; import org.smartboot.socket.StateMachineEnum; @@ -61,9 +61,9 @@ public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, T } }); bootstrap.setPort(8080) - .pipeline(new HttpServerHandle() { + .pipeline(new HttpServerHandler() { @Override - public void doHandle(HttpRequest request, HttpResponse response) throws IOException { + public void handle(HttpRequest request, HttpResponse response) throws IOException { containerRuntime.doHandle(request, response); } }) From 6aae4926f737ee7586698a17172e94d098120e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 28 Jun 2021 20:33:23 +0800 Subject: [PATCH 0018/1766] =?UTF-8?q?=E5=BC=82=E5=B8=B8aio-enhance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 6 ------ .../src/main/java/org/smartboot/http/Bootstrap.java | 3 --- .../src/main/java/org/smartboot/servlet/Bootstrap.java | 3 --- 3 files changed, 12 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 096b64b0123..a8b52e153ad 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,6 @@ 11 11 2.11.0 - 1.0.4-SNAPSHOT 0.1.5-SNAPSHOT 1.5.10-SNAPSHOT @@ -22,11 +21,6 @@ servlet-core ${smartservlet.version} - - org.smartboot.aio - aio-enhance - ${aio-enhance.version} - com.zaxxer HikariCP diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 267a03dde42..9d431a2787a 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -11,7 +11,6 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.smartboot.Message; -import org.smartboot.aio.EnhanceAsynchronousChannelProvider; import org.smartboot.http.server.HttpBootstrap; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; @@ -29,8 +28,6 @@ public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); public static void main(String[] args) { - System.setProperty("java.nio.channels.spi.AsynchronousChannelProvider", EnhanceAsynchronousChannelProvider.class.getName()); - HttpRouteHandler routeHandle = new HttpRouteHandler(); routeHandle .route("/plaintext", new HttpServerHandler() { 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 3cc870dfbdf..c482bbedafa 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 @@ -1,6 +1,5 @@ package org.smartboot.servlet; -import org.smartboot.aio.EnhanceAsynchronousChannelProvider; import org.smartboot.http.server.HttpBootstrap; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; @@ -20,8 +19,6 @@ public class Bootstrap { public static void main(String[] args) { - System.setProperty("java.nio.channels.spi.AsynchronousChannelProvider", EnhanceAsynchronousChannelProvider.class.getName()); - ContainerRuntime containerRuntime = new ContainerRuntime(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime("/"); From 83d238f0a33ccce4394c01f6be351753c23f7b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sun, 25 Jul 2021 10:42:54 +0800 Subject: [PATCH 0019/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/smartboot/http/Bootstrap.java | 2 +- .../src/main/java/org/smartboot/servlet/Bootstrap.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 9d431a2787a..023528ae873 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -70,7 +70,7 @@ public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, T processor.stateEvent(session, stateMachineEnum, throwable); } }); - bootstrap.pipeline(routeHandle).setPort(8080).start(); + bootstrap.httpHandler(routeHandle).setPort(8080).start(); } private static void initDB(HttpRouteHandler routeHandle) { 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 c482bbedafa..763554df801 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 @@ -58,7 +58,7 @@ public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, T } }); bootstrap.setPort(8080) - .pipeline(new HttpServerHandler() { + .httpHandler(new HttpServerHandler() { @Override public void handle(HttpRequest request, HttpResponse response) throws IOException { containerRuntime.doHandle(request, response); From 517dd69292aa4ae28c67d0dc51d82db7bbfde29f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sun, 25 Jul 2021 14:39:10 +0800 Subject: [PATCH 0020/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index a8b52e153ad..5dc7be1243c 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -79,6 +79,12 @@ sonatype-nexus-snapshots Sonatype Nexus Snapshots https://oss.sonatype.org/content/repositories/snapshots + + false + + + true +
From 12a691d8ce6754c17c782f1e85dddc3af6f54c4b Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 13 Aug 2021 17:08:53 +0200 Subject: [PATCH 0021/1766] Fix error with URLs in JEE servers --- frameworks/Kotlin/hexagon/build.gradle | 8 ++++---- frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt | 3 ++- .../Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index eeedb367dcf..71fce93860d 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,13 +4,13 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.3.20/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.0/gradle" - hexagonVersion = "1.3.20" - hikariVersion = "4.0.3" // TODO Check with 3.4.5, 4.0.3 or 5.0.0 + hexagonVersion = "1.4.0" + hikariVersion = "5.0.0" jettyVersion = "10.0.6" postgresqlVersion = "42.2.23" - cache2kVersion = "2.0.0.Final" + cache2kVersion = "2.2.1.Final" jacksonBlackbirdVersion = "2.12.4" } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 9ad9ea60fc4..8df102971de 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -6,6 +6,7 @@ import com.hexagonkt.serialization.Json import com.hexagonkt.serialization.toFieldsMap import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort +import java.net.URL import java.util.concurrent.ThreadLocalRandom class Controller(private val settings: Settings) { @@ -42,7 +43,7 @@ class Controller(private val settings: Settings) { val context = mapOf("fortunes" to sortedFortunes) response.contentType = "text/html;charset=utf-8" - ok(templateAdapter.render("fortunes.$templateKind.html", context)) + ok(templateAdapter.render(URL("classpath:fortunes.$templateKind.html"), context)) } private fun Call.dbQuery(store: BenchmarkStore) { diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index dfdf941d3cd..b2114fdf3ff 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -10,6 +10,7 @@ import javax.servlet.annotation.WebListener @WebListener class WebListenerServer(settings: Settings = Settings()) : ServletServer(Controller(settings).router) { init { + ClasspathHandler.registerHandler() Json.mapper.registerModule(BlackbirdModule()) SerializationManager.mapper = JacksonMapper SerializationManager.formats = linkedSetOf(Json) From 5242fd2c83badadb827a8db1c48143d11f6f11d9 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 13 Aug 2021 17:33:48 +0200 Subject: [PATCH 0022/1766] Clean up --- frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index b2114fdf3ff..174f5417267 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -15,6 +15,4 @@ import javax.servlet.annotation.WebListener SerializationManager.mapper = JacksonMapper SerializationManager.formats = linkedSetOf(Json) } - - val webRouter = super.router } \ No newline at end of file From 1ca6c4c0c4902ab812aab7995e87afc4e9a46cc9 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 13 Aug 2021 17:58:39 +0200 Subject: [PATCH 0023/1766] Avoid classpath URLs --- frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt | 8 +++++++- .../Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 8df102971de..e6f5107d987 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -1,5 +1,6 @@ package com.hexagonkt +import com.hexagonkt.helpers.require import com.hexagonkt.http.server.Call import com.hexagonkt.http.server.Router import com.hexagonkt.serialization.Json @@ -11,6 +12,11 @@ import java.util.concurrent.ThreadLocalRandom class Controller(private val settings: Settings) { + private val classLoader = Thread.currentThread().contextClassLoader + private val templates: Map = mapOf( + "pebble" to (classLoader.getResource("classpath:fortunes.pebble.html") ?: error("Template not found")) + ) + internal val router: Router by lazy { Router { before { @@ -43,7 +49,7 @@ class Controller(private val settings: Settings) { val context = mapOf("fortunes" to sortedFortunes) response.contentType = "text/html;charset=utf-8" - ok(templateAdapter.render(URL("classpath:fortunes.$templateKind.html"), context)) + ok(templateAdapter.render(templates.require(templateKind), context)) } private fun Call.dbQuery(store: BenchmarkStore) { diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index 174f5417267..488388534d3 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -10,7 +10,6 @@ import javax.servlet.annotation.WebListener @WebListener class WebListenerServer(settings: Settings = Settings()) : ServletServer(Controller(settings).router) { init { - ClasspathHandler.registerHandler() Json.mapper.registerModule(BlackbirdModule()) SerializationManager.mapper = JacksonMapper SerializationManager.formats = linkedSetOf(Json) From 6f5641bb2bd9244ae13fa6104041c04395401b95 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 13 Aug 2021 18:16:39 +0200 Subject: [PATCH 0024/1766] Fix template loading error --- frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index e6f5107d987..8e6d39ed8cb 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -14,7 +14,7 @@ class Controller(private val settings: Settings) { private val classLoader = Thread.currentThread().contextClassLoader private val templates: Map = mapOf( - "pebble" to (classLoader.getResource("classpath:fortunes.pebble.html") ?: error("Template not found")) + "pebble" to (classLoader.getResource("fortunes.pebble.html") ?: error("Template not found")) ) internal val router: Router by lazy { From 5fa3b6232b3e1510c6d9972290dca1bc11250a06 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 13 Aug 2021 18:28:49 +0200 Subject: [PATCH 0025/1766] Fix template loading error --- frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 8e6d39ed8cb..2e2fb70ba0f 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -12,9 +12,9 @@ import java.util.concurrent.ThreadLocalRandom class Controller(private val settings: Settings) { - private val classLoader = Thread.currentThread().contextClassLoader + private val classLoader = ClassLoader.getSystemClassLoader() private val templates: Map = mapOf( - "pebble" to (classLoader.getResource("fortunes.pebble.html") ?: error("Template not found")) + "pebble" to (classLoader.getResource("/fortunes.pebble.html") ?: error("Template not found")) ) internal val router: Router by lazy { From 6f8264fe4025c5af599350f93b34a04317bbe61e Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 13 Aug 2021 18:47:03 +0200 Subject: [PATCH 0026/1766] Chores --- frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 2e2fb70ba0f..ae49e8e5c54 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -14,7 +14,7 @@ class Controller(private val settings: Settings) { private val classLoader = ClassLoader.getSystemClassLoader() private val templates: Map = mapOf( - "pebble" to (classLoader.getResource("/fortunes.pebble.html") ?: error("Template not found")) + "pebble" to (classLoader.getResource("fortunes.pebble.html") ?: error("Template not found")) ) internal val router: Router by lazy { From c3941d1c8ebcaf2577768bd81ef55d139d6219f8 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 13 Aug 2021 19:11:46 +0200 Subject: [PATCH 0027/1766] Fix template loading error --- .../Kotlin/hexagon/hexagon-resin-mongodb.dockerfile | 1 + .../hexagon/hexagon-resin-postgresql.dockerfile | 1 + .../Kotlin/hexagon/src/main/kotlin/Controller.kt | 11 +++++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile b/frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile index 9884c856d38..69ebbd5ecfa 100644 --- a/frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile @@ -21,5 +21,6 @@ WORKDIR /resin RUN curl -sL $RESIN | tar xz --strip-components=1 RUN rm -rf webapps/* COPY --from=gradle_build /hexagon/build/libs/ROOT.war webapps/ROOT.war +COPY src/main/resources/fortunes.pebble.html fortunes.pebble.html EXPOSE 9090 CMD ["java", "-jar", "lib/resin.jar", "console"] diff --git a/frameworks/Kotlin/hexagon/hexagon-resin-postgresql.dockerfile b/frameworks/Kotlin/hexagon/hexagon-resin-postgresql.dockerfile index 87c1fec3f51..4c88f47740f 100644 --- a/frameworks/Kotlin/hexagon/hexagon-resin-postgresql.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-resin-postgresql.dockerfile @@ -21,5 +21,6 @@ WORKDIR /resin RUN curl -sL $RESIN | tar xz --strip-components=1 RUN rm -rf webapps/* COPY --from=gradle_build /hexagon/build/libs/ROOT.war webapps/ROOT.war +COPY src/main/resources/fortunes.pebble.html fortunes.pebble.html EXPOSE 8080 CMD ["java", "-jar", "lib/resin.jar", "console"] diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index ae49e8e5c54..62f010c2eb2 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -12,9 +12,8 @@ import java.util.concurrent.ThreadLocalRandom class Controller(private val settings: Settings) { - private val classLoader = ClassLoader.getSystemClassLoader() private val templates: Map = mapOf( - "pebble" to (classLoader.getResource("fortunes.pebble.html") ?: error("Template not found")) + "pebble" to (urlOrNull("classpath:fortunes.pebble.html") ?: URL("file:/resin/fortunes.pebble.html")) ) internal val router: Router by lazy { @@ -84,4 +83,12 @@ class Controller(private val settings: Settings) { private fun randomWorld(): Int = ThreadLocalRandom.current().nextInt(settings.worldRows) + 1 + + private fun urlOrNull(path: String): URL? = + try { + URL(path) + } + catch (e: Exception) { + null + } } \ No newline at end of file From 65f27d1f1d24ae3e81c285122d93c2e73371c2a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sat, 14 Aug 2021 22:05:15 +0800 Subject: [PATCH 0028/1766] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 5dc7be1243c..09ac77285dd 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,8 +11,8 @@ 11 11 2.11.0 - 0.1.5-SNAPSHOT - 1.5.10-SNAPSHOT + 0.1.6 + 1.5.11 From afb6d8bbd25064f4a2773d31e232cd271c72eaef Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Wed, 18 Aug 2021 22:53:20 +0200 Subject: [PATCH 0029/1766] Inverno framework test --- frameworks/Java/inverno/README.md | 45 +++ frameworks/Java/inverno/benchmark_config.json | 47 +++ .../Java/inverno/inverno-postgres.dockerfile | 11 + frameworks/Java/inverno/inverno.dockerfile | 9 + frameworks/Java/inverno/pom.xml | 125 +++++++ .../src/jmods/io.vertx.core/module-info.java | 99 ++++++ .../jmods/r2dbc.postgresql/module-info.java | 38 ++ .../inverno/benchmark/AppConfiguration.java | 36 ++ .../techempower/inverno/benchmark/Main.java | 21 ++ .../inverno/benchmark/internal/Handler.java | 325 ++++++++++++++++++ .../internal/PoolSqlClientReactorScope.java | 67 ++++ .../PooledClientSqlClientReactorScope.java | 67 ++++ .../inverno/benchmark/model/Fortune.java | 25 ++ .../inverno/benchmark/model/Message.java | 14 + .../inverno/benchmark/model/World.java | 33 ++ .../benchmark/templates/FortunesTemplate.irt | 30 ++ .../inverno/src/main/java/module-info.java | 28 ++ .../src/main/resources/configuration.cprops | 16 + .../Java/inverno/src/main/resources/db.sql | 25 ++ 19 files changed, 1061 insertions(+) create mode 100755 frameworks/Java/inverno/README.md create mode 100755 frameworks/Java/inverno/benchmark_config.json create mode 100644 frameworks/Java/inverno/inverno-postgres.dockerfile create mode 100644 frameworks/Java/inverno/inverno.dockerfile create mode 100644 frameworks/Java/inverno/pom.xml create mode 100644 frameworks/Java/inverno/src/jmods/io.vertx.core/module-info.java create mode 100644 frameworks/Java/inverno/src/jmods/r2dbc.postgresql/module-info.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/AppConfiguration.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Handler.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PoolSqlClientReactorScope.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/templates/FortunesTemplate.irt create mode 100644 frameworks/Java/inverno/src/main/java/module-info.java create mode 100644 frameworks/Java/inverno/src/main/resources/configuration.cprops create mode 100644 frameworks/Java/inverno/src/main/resources/db.sql diff --git a/frameworks/Java/inverno/README.md b/frameworks/Java/inverno/README.md new file mode 100755 index 00000000000..18f28c8d4ff --- /dev/null +++ b/frameworks/Java/inverno/README.md @@ -0,0 +1,45 @@ +# inverno Benchmarking Test + +### Test Type Implementation Source Code + +* [JSON](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) +* [PLAINTEXT](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) +* [DB](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) +* [QUERY](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) +* [CACHED QUERY](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) +* [UPDATE](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) +* [FORTUNES](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) + +## Important Libraries +The tests were run with: +* [Java OpenJDK 16](https://openjdk.java.net/) +* [Inverno 1.2.1](https://inverno.io) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/query?queries= + +### CACHED QUERY + +http://localhost:8080/cached_query?queries= + +### UPDATE + +http://localhost:8080/update?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Java/inverno/benchmark_config.json b/frameworks/Java/inverno/benchmark_config.json new file mode 100755 index 00000000000..f91b0aac623 --- /dev/null +++ b/frameworks/Java/inverno/benchmark_config.json @@ -0,0 +1,47 @@ +{ + "framework": "inverno", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "inverno", + "language": "Java", + "flavor": "None", + "orm": "Micro", + "platform": "Inverno", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "inverno", + "notes": "", + "versus": "None" + }, + "postgres": { + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "inverno", + "language": "Java", + "flavor": "None", + "orm": "Micro", + "platform": "Inverno", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "inverno", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile new file mode 100644 index 00000000000..5a2928679e3 --- /dev/null +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -0,0 +1,11 @@ +FROM maven:3.8.2-openjdk-16 as maven +WORKDIR /inverno +COPY src src +COPY pom.xml pom.xml +RUN mvn package -q + +EXPOSE 8080 + +# CMD [ "target/maven-inverno/application_linux_amd64/inverno-benchmark-1.0.0-SNAPSHOT/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 diff --git a/frameworks/Java/inverno/inverno.dockerfile b/frameworks/Java/inverno/inverno.dockerfile new file mode 100644 index 00000000000..6af60a189dc --- /dev/null +++ b/frameworks/Java/inverno/inverno.dockerfile @@ -0,0 +1,9 @@ +FROM maven:3.8.2-openjdk-16 as maven +WORKDIR /inverno +COPY src src +COPY pom.xml pom.xml +RUN mvn package -q + +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" ] diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml new file mode 100644 index 00000000000..adf81017f13 --- /dev/null +++ b/frameworks/Java/inverno/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + io.inverno.dist + inverno-parent + 1.2.1 + + com.techempower + inverno-benchmark + 1.0.0-SNAPSHOT + jar + + inverno-benchmark + Inverno framework benchmark test + + + 16 + 16 + 16 + + + + + io.inverno + inverno-core + + + io.inverno.mod + inverno-boot + + + io.inverno.mod + inverno-configuration + + + io.inverno.mod + inverno-http-server + + + io.inverno.mod + inverno-irt + + + io.inverno.mod + inverno-sql-vertx + + + + org.unbescape + unbescape + 1.1.6.RELEASE + + + io.vertx + vertx-pg-client + + + + io.netty + netty-codec-dns + ${version.netty} + + + io.netty + netty-codec-socks + ${version.netty} + + + io.netty + netty-handler-proxy + ${version.netty} + + + io.netty + netty-resolver-dns + ${version.netty} + + + + io.netty + netty-transport-native-epoll + linux-x86_64 + + + + org.apache.logging.log4j + 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 + + + + + + + + + + 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 new file mode 100644 index 00000000000..56fbff0c18c --- /dev/null +++ b/frameworks/Java/inverno/src/jmods/io.vertx.core/module-info.java @@ -0,0 +1,99 @@ +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 new file mode 100644 index 00000000000..18208e43b04 --- /dev/null +++ b/frameworks/Java/inverno/src/jmods/r2dbc.postgresql/module-info.java @@ -0,0 +1,38 @@ +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/AppConfiguration.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/AppConfiguration.java new file mode 100644 index 00000000000..542733af9be --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/AppConfiguration.java @@ -0,0 +1,36 @@ +package com.techempower.inverno.benchmark; + +import io.inverno.core.annotation.NestedBean; +import io.inverno.mod.boot.BootConfiguration; +import io.inverno.mod.configuration.Configuration; +import io.inverno.mod.http.server.HttpServerConfiguration; + +@Configuration +public interface AppConfiguration { + + @NestedBean + BootConfiguration boot(); + + @NestedBean + HttpServerConfiguration http_server(); + + default String db_database() { + return "postgres"; + } + + default String db_host() { + return "localhost"; + } + + default int db_port() { + return 5432; + } + + default String db_username() { + return "postgres"; + } + + default String db_password() { + return "password"; + } +} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java new file mode 100644 index 00000000000..74aaf730a7e --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java @@ -0,0 +1,21 @@ +package com.techempower.inverno.benchmark; + +import java.io.IOException; +import java.util.function.Supplier; + +import io.inverno.core.annotation.Bean; +import io.inverno.core.v1.Application; +import io.inverno.mod.configuration.ConfigurationSource; +import io.inverno.mod.configuration.source.BootstrapConfigurationSource; + +public class Main { + + @Bean + public interface AppConfigurationSource extends Supplier> {} + + public static void main(String[] args) throws IllegalStateException, IOException { + Application.with(new Benchmark.Builder() + .setAppConfigurationSource(new BootstrapConfigurationSource(Main.class.getModule(), args)) + ).run(); + } +} 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/Handler.java new file mode 100644 index 00000000000..40f50082b0d --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Handler.java @@ -0,0 +1,325 @@ +package com.techempower.inverno.benchmark.internal; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.techempower.inverno.benchmark.model.Fortune; +import com.techempower.inverno.benchmark.model.Message; +import com.techempower.inverno.benchmark.model.World; +import com.techempower.inverno.benchmark.templates.FortunesTemplate; + +import io.inverno.core.annotation.Bean; +import io.inverno.core.annotation.Bean.Visibility; +import io.inverno.core.annotation.Destroy; +import io.inverno.core.annotation.Init; +import io.inverno.mod.base.Charsets; +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.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.ExchangeHandler; +import io.inverno.mod.sql.SqlClient; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.EventLoopGroup; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.util.AsciiString; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Bean( visibility = Visibility.PRIVATE ) +public class Handler implements ExchangeHandler { + + 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 static final CharSequence STATIC_SERVER = AsciiString.cached("inverno"); + + private final Reactor reactor; + private final ObjectMapper mapper; + private final ReactorScope pooledClientSqlClient; + private final ReactorScope poolSqlClient; + + private EventLoopGroup dateEventLoopGroup; + + private CharSequence date; + + public Handler(Reactor reactor, + ObjectMapper mapper, + ReactorScope pooledClientSqlClient, + ReactorScope poolSqlClient + ) { + this.reactor = reactor; + this.mapper = mapper; + this.pooledClientSqlClient = pooledClientSqlClient; + this.poolSqlClient = poolSqlClient; + } + + @Init + public void init() { + this.dateEventLoopGroup = this.reactor.createIoEventLoopGroup(1); + this.dateEventLoopGroup.scheduleAtFixedRate(() -> { + this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); + }, 0, 1000, TimeUnit.MILLISECONDS); + } + + @Destroy + public void destroy() { + this.dateEventLoopGroup.shutdownGracefully(); + } + + @Override + public void handle(Exchange exchange) throws HttpException { + switch(exchange.request().getPath()) { + case PATH_PLAINTEXT: { + this.handle_plaintext(exchange); + break; + } + case PATH_JSON: { + this.handle_json(exchange); + break; + } + case PATH_DB: { + this.handle_db(exchange); + break; + } + case PATH_FORTUNES: { + this.handle_fortunes(exchange); + break; + } + default: { + switch(exchange.request().getPathAbsolute()) { + case PATH_QUERIES: { + this.handle_queries(exchange); + break; + } + case PATH_UPDATES: { + this.handle_updates(exchange); + break; + } + default: { + exchange.response() + .headers(h -> h.status(Status.NOT_FOUND)) + .body() + .empty(); + } + } + } + } + } + + private static final byte[] STATIC_PLAINTEXT = "Hello, World!".getBytes(Charsets.UTF_8); + private static final int STATIC_PLAINTEXT_LEN = STATIC_PLAINTEXT.length; + + private static final ByteBuf STATIC_PLAINTEXT_BYTEBUF; + static { + ByteBuf tmpBuf = Unpooled.directBuffer(STATIC_PLAINTEXT_LEN); + tmpBuf.writeBytes(STATIC_PLAINTEXT); + STATIC_PLAINTEXT_BYTEBUF = Unpooled.unreleasableBuffer(tmpBuf); + } + + private static final CharSequence STATIC_PLAINTEXT_LEN_VALUE = AsciiString.cached(String.valueOf(STATIC_PLAINTEXT_LEN)); + + private static class PlaintextSupplier implements Supplier { + @Override + public ByteBuf get() { + return STATIC_PLAINTEXT_BYTEBUF.duplicate(); + } + } + + private static final Mono PLAIN_TEXT_MONO = Mono.fromSupplier(new PlaintextSupplier()); + + public void handle_plaintext(Exchange exchange) throws HttpException { + exchange.response() + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, date) + .add(HttpHeaderNames.CONTENT_LENGTH, STATIC_PLAINTEXT_LEN_VALUE) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.TEXT_PLAIN) + ) + .body() + .raw() + .stream(PLAIN_TEXT_MONO); + } + + public void handle_json(Exchange exchange) throws HttpException { + try { + exchange.response() + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + ) + .body() + .raw() + .value(Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!"))))); + } + catch (JsonProcessingException | IllegalStateException e) { + throw new InternalServerErrorException("Error serializing message as JSON", e); + } + } + + private static final String DB_SELECT_WORLD = "SELECT id, randomnumber from WORLD where id = $1"; + + private static int randomWorldId() { + return 1 + ThreadLocalRandom.current().nextInt(10000); + } + + public void handle_db(Exchange exchange) throws HttpException { + exchange.response() + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + ) + .body() + .raw().stream(this.pooledClientSqlClient.get().queryForObject( + DB_SELECT_WORLD, + row -> { + try { + return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1))))); + } + catch (JsonProcessingException e) { + throw new InternalServerErrorException(e); + } + }, + randomWorldId() + ) + ); + } + + private static final String PARAMETER_QUERIES = "queries"; + + private int extractQueriesParameter(Exchange exchange) { + try { + return Math.min(500, Math.max(1, exchange.request().queryParameters().get(PARAMETER_QUERIES).map(Parameter::asInteger).orElse(1))); + } + catch (ConverterException e) { // TODO + return 1; + } + } + + public void handle_queries(Exchange exchange) throws HttpException { + int queries = this.extractQueriesParameter(exchange); + exchange.response() + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + ) + .body() + .raw().stream(Flux.range(0, queries) + .flatMap(ign -> this.pooledClientSqlClient.get().queryForObject( + DB_SELECT_WORLD, + row -> new World(row.getInteger(0), row.getInteger(1)), + randomWorldId() + )) + .collectList() + .map(worlds -> { + try { + return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); + } + catch (JsonProcessingException e) { + throw new InternalServerErrorException(e); + } + }) + ); + } + + private static final String DB_UPDATE_WORLD = "UPDATE world SET randomnumber=$1 WHERE id=$2"; + + public void handle_updates(Exchange exchange) throws HttpException { + int queries = this.extractQueriesParameter(exchange); + + this.poolSqlClient.get().connection(ops -> Flux.range(0, queries) + .flatMap(ign -> ops.queryForObject( + DB_SELECT_WORLD, + row -> new World(row.getInteger(0), randomWorldId()), + randomWorldId() + ) + ) + .collectSortedList() + .delayUntil(worlds -> ops.batchUpdate( + DB_UPDATE_WORLD, + worlds.stream().map(world -> new Object[] { world.getRandomNumber(), world.getId() }) + ) + ) + .map(worlds -> { + try { + return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); + } + catch (JsonProcessingException e) { + throw new InternalServerErrorException(e); + } + })); + + exchange.response() + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + ) + .body() + .raw().stream(this.poolSqlClient.get().connection(ops -> Flux.range(0, queries) + .flatMap(ign -> ops.queryForObject( + DB_SELECT_WORLD, + row -> new World(row.getInteger(0), randomWorldId()), + randomWorldId() + ) + ) + .collectSortedList() + .delayUntil(worlds -> ops.batchUpdate( + DB_UPDATE_WORLD, + worlds.stream().map(world -> new Object[] { world.getRandomNumber(), world.getId() }) + ) + ) + .map(worlds -> { + try { + return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); + } + catch (JsonProcessingException e) { + throw new InternalServerErrorException(e); + } + })) + ); + } + + private static final String DB_SELECT_FORTUNE = "SELECT id, message from FORTUNE"; + private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8"); + + public void handle_fortunes(Exchange exchange) throws HttpException { + exchange.response() + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, MEDIA_TEXT_HTML_UTF8) + ) + .body() + .raw().stream(Flux.from(this.pooledClientSqlClient.get().query( + DB_SELECT_FORTUNE, + row -> new Fortune(row.getInteger(0), row.getString(1)) + )) + .collectList() + .flatMap(fortunes -> { + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + Collections.sort(fortunes); + return Mono.fromFuture(() -> FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer())).render(fortunes)); + }) + ); + } +} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PoolSqlClientReactorScope.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PoolSqlClientReactorScope.java new file mode 100644 index 00000000000..76eed32483b --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PoolSqlClientReactorScope.java @@ -0,0 +1,67 @@ +package com.techempower.inverno.benchmark.internal; + +import com.techempower.inverno.benchmark.AppConfiguration; + +import io.inverno.core.annotation.Bean; +import io.inverno.core.annotation.Destroy; +import io.inverno.core.annotation.Init; +import io.inverno.core.annotation.Bean.Visibility; +import io.inverno.mod.base.concurrent.Reactor; +import io.inverno.mod.base.concurrent.ReactorScope; +import io.inverno.mod.base.concurrent.VertxReactor; +import io.inverno.mod.sql.SqlClient; +import io.inverno.mod.sql.vertx.PoolSqlClient; +import io.vertx.core.Vertx; +import io.vertx.core.VertxOptions; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgPool; +import io.vertx.sqlclient.PoolOptions; + +@Bean( name = "poolSqlClient", visibility = Visibility.PRIVATE ) +public class PoolSqlClientReactorScope extends ReactorScope { + + private final AppConfiguration configuration; + private final Reactor reactor; + + private Vertx vertx; + private PgConnectOptions connectOptions; + private PoolOptions poolOptions; + + public PoolSqlClientReactorScope(AppConfiguration configuration, Reactor reactor) { + this.configuration = configuration; + this.reactor = reactor; + } + + @Init + public void init() { + if(this.reactor instanceof VertxReactor) { + this.vertx = ((VertxReactor)this.reactor).getVertx(); + } + else { + this.vertx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(this.configuration.boot().prefer_native_transport())); + } + + this.connectOptions = new PgConnectOptions() + .setHost(this.configuration.db_host()) + .setPort(this.configuration.db_port()) + .setDatabase(this.configuration.db_database()) + .setUser(this.configuration.db_username()) + .setPassword(this.configuration.db_password()) + .setCachePreparedStatements(true); + + this.poolOptions = new PoolOptions().setMaxSize(4); + } + + @Destroy + public void destroy() { + if(!(this.reactor instanceof VertxReactor)) { + this.vertx.close(); + } + } + + @Override + protected SqlClient create() { + return new PoolSqlClient(PgPool.pool(this.vertx, this.connectOptions, this.poolOptions)); + } + +} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java new file mode 100644 index 00000000000..06516866c47 --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java @@ -0,0 +1,67 @@ +package com.techempower.inverno.benchmark.internal; + +import com.techempower.inverno.benchmark.AppConfiguration; + +import io.inverno.core.annotation.Bean; +import io.inverno.core.annotation.Bean.Visibility; +import io.inverno.core.annotation.Destroy; +import io.inverno.core.annotation.Init; +import io.inverno.mod.base.concurrent.Reactor; +import io.inverno.mod.base.concurrent.ReactorScope; +import io.inverno.mod.base.concurrent.VertxReactor; +import io.inverno.mod.sql.SqlClient; +import io.inverno.mod.sql.vertx.PooledClientSqlClient; +import io.vertx.core.Vertx; +import io.vertx.core.VertxOptions; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgPool; +import io.vertx.sqlclient.PoolOptions; + +@Bean( name = "pooledClientSqlClient", visibility = Visibility.PRIVATE ) +public class PooledClientSqlClientReactorScope extends ReactorScope { + + private final AppConfiguration configuration; + private final Reactor reactor; + + private Vertx vertx; + private PgConnectOptions connectOptions; + private PoolOptions poolOptions; + + public PooledClientSqlClientReactorScope(AppConfiguration configuration, Reactor reactor) { + this.configuration = configuration; + this.reactor = reactor; + } + + @Init + public void init() { + if(this.reactor instanceof VertxReactor) { + this.vertx = ((VertxReactor)this.reactor).getVertx(); + } + else { + this.vertx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(this.configuration.boot().prefer_native_transport())); + } + + this.connectOptions = new PgConnectOptions() + .setHost(this.configuration.db_host()) + .setPort(this.configuration.db_port()) + .setDatabase(this.configuration.db_database()) + .setUser(this.configuration.db_username()) + .setPassword(this.configuration.db_password()) + .setCachePreparedStatements(true); + + this.poolOptions = new PoolOptions().setMaxSize(1); + } + + @Destroy + public void destroy() { + if(!(this.reactor instanceof VertxReactor)) { + this.vertx.close(); + } + } + + @Override + protected SqlClient create() { + return new PooledClientSqlClient(PgPool.client(this.vertx, this.connectOptions, this.poolOptions)); + } + +} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java new file mode 100644 index 00000000000..de4017c3c0d --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java @@ -0,0 +1,25 @@ +package com.techempower.inverno.benchmark.model; + +public final class Fortune implements Comparable { + + private final int id; + private final String message; + + public Fortune(int id, String message) { + this.id = id; + this.message = message; + } + + public int getId() { + return this.id; + } + + public String getMessage() { + return this.message; + } + + @Override + public int compareTo(Fortune other) { + return getMessage().compareTo(other.getMessage()); + } +} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java new file mode 100644 index 00000000000..c9d554903d7 --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java @@ -0,0 +1,14 @@ +package com.techempower.inverno.benchmark.model; + +public final class Message { + + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return this.message; + } +} \ No newline at end of file diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java new file mode 100644 index 00000000000..f0f1825f3b9 --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java @@ -0,0 +1,33 @@ +package com.techempower.inverno.benchmark.model; + +public final class World implements Comparable { + + private final int id; + private int randomNumber; + + public World(int id) { + this.id = id; + } + + public World(int id, int randomNumber) { + this.id = id; + this.randomNumber = randomNumber; + } + + public int getId() { + return this.id; + } + + public int getRandomNumber() { + return this.randomNumber; + } + + public void setRandomNumber(int randomNumber) { + this.randomNumber = randomNumber; + } + + @Override + public int compareTo(World o) { + return Integer.compare(id, o.id); + } +} \ No newline at end of file diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/templates/FortunesTemplate.irt b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/templates/FortunesTemplate.irt new file mode 100644 index 00000000000..e0330edbb1c --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/templates/FortunesTemplate.irt @@ -0,0 +1,30 @@ +package com.techempower.inverno.benchmark.templates; + +import com.techempower.inverno.benchmark.model.Fortune; + +import java.util.List; +import org.unbescape.html.HtmlEscape; + +option modes = {"STRING", "BYTEBUF", "STREAM", "PUBLISHER_STRING", "PUBLISHER_BYTEBUF"}; +option charset = "utf-8"; + +(List fortunes) -> { + + +Fortunes + + + + + + {fortunes} +
idmessage
+ + +} + +(Fortune fortune) -> { + + {@fortune.id} + {@fortune.message|((String s) -> HtmlEscape.escapeHtml5Xml(s))} + } diff --git a/frameworks/Java/inverno/src/main/java/module-info.java b/frameworks/Java/inverno/src/main/java/module-info.java new file mode 100644 index 00000000000..8370bb11766 --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/module-info.java @@ -0,0 +1,28 @@ +@io.inverno.core.annotation.Module( excludes = { "io.inverno.mod.sql.vertx" } ) + +@io.inverno.core.annotation.Wire(beans="pooledClientSqlClient", into="handler:pooledClientSqlClient") +@io.inverno.core.annotation.Wire(beans="poolSqlClient", into="handler:poolSqlClient") +module com.techempower.inverno.benchmark { + requires io.inverno.mod.boot; + requires io.inverno.mod.http.server; + requires io.inverno.mod.irt; + + requires io.inverno.mod.sql; + requires io.inverno.mod.sql.vertx; + + requires io.netty.common; + requires io.netty.codec.http; + requires unbescape; + + requires io.vertx.client.sql.pg; + requires io.vertx.client.sql; + 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; + + exports com.techempower.inverno.benchmark; + exports com.techempower.inverno.benchmark.model; +} diff --git a/frameworks/Java/inverno/src/main/resources/configuration.cprops b/frameworks/Java/inverno/src/main/resources/configuration.cprops new file mode 100644 index 00000000000..df4680e124b --- /dev/null +++ b/frameworks/Java/inverno/src/main/resources/configuration.cprops @@ -0,0 +1,16 @@ +com.techempower.inverno.benchmark.appConfiguration { + boot { + reactor_prefer_vertx = true + accept_backlog = null + } + http_server { + tls_enabled = false + server_port = 8080 + h2c_enabled = false + } + db_database = "hello_world" + db_host = "tfb-database" + db_port = 5432 + db_username = "benchmarkdbuser" + db_password = "benchmarkdbpass" +} diff --git a/frameworks/Java/inverno/src/main/resources/db.sql b/frameworks/Java/inverno/src/main/resources/db.sql new file mode 100644 index 00000000000..2fd0de35be5 --- /dev/null +++ b/frameworks/Java/inverno/src/main/resources/db.sql @@ -0,0 +1,25 @@ +DROP TABLE IF EXISTS World; + +CREATE TABLE World (id integer NOT NULL, randomNumber integer NOT NULL default 0, PRIMARY KEY (id)); +GRANT SELECT, UPDATE ON World to benchmarkdbuser; + +INSERT INTO World (id, randomnumber) SELECT x.id, random() * 10000 + 1 FROM generate_series(1,10000) as x(id); + + + +DROP TABLE IF EXISTS Fortune; +CREATE TABLE Fortune (id integer NOT NULL, message varchar(2048) NOT NULL, PRIMARY KEY (id)); +GRANT SELECT ON Fortune to benchmarkdbuser; + +INSERT INTO Fortune (id, message) VALUES (1, 'fortune: No such file or directory'); +INSERT INTO Fortune (id, message) VALUES (2, 'A computer scientist is someone who fixes things that aren''t broken.'); +INSERT INTO Fortune (id, message) VALUES (3, 'After enough decimal places, nobody gives a damn.'); +INSERT INTO Fortune (id, message) VALUES (4, 'A bad random number generator: 1, 1, 1, 1, 1, 4.33e+67, 1, 1, 1'); +INSERT INTO Fortune (id, message) VALUES (5, 'A computer program does what you tell it to do, not what you want it to do.'); +INSERT INTO Fortune (id, message) VALUES (6, 'Emacs is a nice operating system, but I prefer UNIX. — Tom Christaensen'); +INSERT INTO Fortune (id, message) VALUES (7, 'Any program that runs right is obsolete.'); +INSERT INTO Fortune (id, message) VALUES (8, 'A list is only as strong as its weakest link. — Donald Knuth'); +INSERT INTO Fortune (id, message) VALUES (9, 'Feature: A bug with seniority.'); +INSERT INTO Fortune (id, message) VALUES (10, 'Computers make very fast, very accurate mistakes.'); +INSERT INTO Fortune (id, message) VALUES (11, ''); +INSERT INTO Fortune (id, message) VALUES (12, 'フレームワークのベンチマーク'); \ No newline at end of file From 04043d89d1c159fbda72716b0475abd67537b25f Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Fri, 20 Aug 2021 18:35:23 +0200 Subject: [PATCH 0030/1766] Remove unused code --- .../inverno/benchmark/internal/Handler.java | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) 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/Handler.java index 40f50082b0d..a2eb6548f9a 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/Handler.java @@ -121,7 +121,7 @@ public void handle(Exchange exchange) throws HttpException { } } } - } + } private static final byte[] STATIC_PLAINTEXT = "Hello, World!".getBytes(Charsets.UTF_8); private static final int STATIC_PLAINTEXT_LEN = STATIC_PLAINTEXT.length; @@ -246,28 +246,6 @@ public void handle_queries(Exchange exchange) throws HttpException { public void handle_updates(Exchange exchange) throws HttpException { int queries = this.extractQueriesParameter(exchange); - this.poolSqlClient.get().connection(ops -> Flux.range(0, queries) - .flatMap(ign -> ops.queryForObject( - DB_SELECT_WORLD, - row -> new World(row.getInteger(0), randomWorldId()), - randomWorldId() - ) - ) - .collectSortedList() - .delayUntil(worlds -> ops.batchUpdate( - DB_UPDATE_WORLD, - worlds.stream().map(world -> new Object[] { world.getRandomNumber(), world.getId() }) - ) - ) - .map(worlds -> { - try { - return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); - } - catch (JsonProcessingException e) { - throw new InternalServerErrorException(e); - } - })); - exchange.response() .headers(h -> h .add(HttpHeaderNames.SERVER, STATIC_SERVER) From 102d1cbf164f6eccc01d3a943eb46b3aaeb93aec Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Mon, 23 Aug 2021 08:52:38 +0200 Subject: [PATCH 0031/1766] Optimization --- .../com/techempower/inverno/benchmark/internal/Handler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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/Handler.java index a2eb6548f9a..d4a98ecd184 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/Handler.java @@ -3,6 +3,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Collections; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -280,6 +281,8 @@ public void handle_updates(Exchange exchange) throws HttpException { private static final String DB_SELECT_FORTUNE = "SELECT id, message from FORTUNE"; private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8"); + private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer())); + public void handle_fortunes(Exchange exchange) throws HttpException { exchange.response() .headers(h -> h @@ -296,7 +299,7 @@ public void handle_fortunes(Exchange exchange) throws HttpException { .flatMap(fortunes -> { fortunes.add(new Fortune(0, "Additional fortune added at request time.")); Collections.sort(fortunes); - return Mono.fromFuture(() -> FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer())).render(fortunes)); + return Mono.fromFuture(() -> FORTUNES_RENDERER.render(fortunes)); }) ); } From 4fe8ef6b71db0853018718b2270f185e0dffecad Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 24 Aug 2021 19:01:21 +0200 Subject: [PATCH 0032/1766] Delete MongoDB DB support Storage support in Hexagon will be moved outside the Toolkit, and so, it will be left outside the benchmark. --- frameworks/Kotlin/hexagon/README.md | 5 +- .../Kotlin/hexagon/benchmark_config.json | 48 +--------------- frameworks/Kotlin/hexagon/build.gradle | 5 +- frameworks/Kotlin/hexagon/config.toml | 38 +------------ .../hexagon-jetty-postgresql.dockerfile | 25 -------- .../hexagon/hexagon-resin-mongodb.dockerfile | 26 --------- ...ql.dockerfile => hexagon-resin.dockerfile} | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 6 +- .../hexagon/src/main/kotlin/Benchmark.kt | 6 +- .../kotlin/store/BenchmarkMongoDbStore.kt | 57 ------------------- 10 files changed, 10 insertions(+), 208 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon-jetty-postgresql.dockerfile delete mode 100644 frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile rename frameworks/Kotlin/hexagon/{hexagon-resin-postgresql.dockerfile => hexagon-resin.dockerfile} (93%) delete mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkMongoDbStore.kt diff --git a/frameworks/Kotlin/hexagon/README.md b/frameworks/Kotlin/hexagon/README.md index 004f35927b4..54c66442a82 100644 --- a/frameworks/Kotlin/hexagon/README.md +++ b/frameworks/Kotlin/hexagon/README.md @@ -18,10 +18,7 @@ You can run tests against any running server passing the `verify.endpoint` proje ## Test URLs -In URLs replace `${DB_ENGINE}` with one of: - -* mongodb -* postgresql +In URLs replace `${DB_ENGINE}` with: `postgresql` and `${TEMPLATE_ENGINE}` with: `pebble` diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 424fcbb5e8a..7bca1a660ad 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -3,52 +3,6 @@ "tests": [ { "default": { - "json_url": "/json", - "db_url": "/mongodb/db", - "query_url": "/mongodb/query?queries=", - "fortune_url": "/mongodb/pebble/fortunes", - "update_url": "/mongodb/update?queries=", - "cached_query_url": "/mongodb/cached?count=", - "plaintext_url": "/plaintext", - "port": 9090, - "approach": "Realistic", - "classification": "Micro", - "database": "mongodb", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Servlet", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Jetty MongoDB", - "notes": "http://hexagonkt.com", - "versus": "servlet" - }, - "resin-mongodb": { - "json_url": "/json", - "db_url": "/mongodb/db", - "query_url": "/mongodb/query?queries=", - "fortune_url": "/mongodb/pebble/fortunes", - "update_url": "/mongodb/update?queries=", - "cached_query_url": "/mongodb/cached?count=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "mongodb", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Servlet", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Resin MongoDB", - "notes": "http://hexagonkt.com", - "versus": "servlet" - }, - "jetty-postgresql": { "json_url": "/json", "db_url": "/postgresql/db", "query_url": "/postgresql/query?queries=", @@ -71,7 +25,7 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, - "resin-postgresql": { + "resin": { "json_url": "/json", "db_url": "/postgresql/db", "query_url": "/postgresql/query?queries=", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 71fce93860d..ae2ce077696 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,9 +4,9 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.0/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.1/gradle" - hexagonVersion = "1.4.0" + hexagonVersion = "1.4.1" hikariVersion = "5.0.0" jettyVersion = "10.0.6" postgresqlVersion = "42.2.23" @@ -32,7 +32,6 @@ war { installDist.dependsOn("war") dependencies { - implementation("com.hexagonkt:store_mongodb:$hexagonVersion") implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index c83738043be..c688baad5a8 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -4,24 +4,6 @@ name = "hexagon" [main] urls.plaintext = "/plaintext" urls.json = "/json" -urls.db = "/mongodb/db" -urls.query = "/mongodb/query?queries=" -urls.update = "/mongodb/update?queries=" -urls.fortune = "/mongodb/pebble/fortunes" -urls.cached_query = "/mongodb/cached?count=" -approach = "Realistic" -classification = "Micro" -database = "mongodb" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Servlet" -webserver = "None" -versus = "servlet" - -[resin-postgresql] -urls.plaintext = "/plaintext" -urls.json = "/json" urls.db = "/postgresql/db" urls.query = "/postgresql/query?queries=" urls.update = "/postgresql/update?queries=" @@ -37,7 +19,7 @@ platform = "Servlet" webserver = "None" versus = "servlet" -[jetty-postgresql] +[resin] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/postgresql/db" @@ -54,21 +36,3 @@ orm = "Raw" platform = "Servlet" webserver = "None" versus = "servlet" - -[resin-mongodb] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/mongodb/db" -urls.query = "/mongodb/query?queries=" -urls.update = "/mongodb/update?queries=" -urls.fortune = "/mongodb/pebble/fortunes" -urls.cached_query = "/mongodb/cached?count=" -approach = "Realistic" -classification = "Micro" -database = "mongodb" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Servlet" -webserver = "None" -versus = "servlet" diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-postgresql.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-postgresql.dockerfile deleted file mode 100644 index 08611f3b42d..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-jetty-postgresql.dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -# -# BUILD -# -FROM gradle:7.1-jdk11 AS gradle_build -USER root -WORKDIR /hexagon - -COPY src src -COPY build.gradle build.gradle -RUN gradle --quiet --exclude-task test - -# -# RUNTIME -# -FROM adoptopenjdk:11-jre-hotspot-bionic -ENV DBSTORE postgresql -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE jetty -ENV PROJECT hexagon - -COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT - -EXPOSE 9090 - -ENTRYPOINT /opt/$PROJECT/bin/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile b/frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile deleted file mode 100644 index 69ebbd5ecfa..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-resin-mongodb.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# -# BUILD -# -FROM gradle:7.1-jdk11 AS gradle_build -USER root -WORKDIR /hexagon - -COPY src src -COPY build.gradle build.gradle -RUN gradle --quiet --exclude-task test - -# -# RUNTIME -# -FROM adoptopenjdk:11-jre-hotspot-bionic -ENV DBSTORE mongodb -ENV MONGODB_DB_HOST tfb-database -ENV RESIN http://caucho.com/download/resin-4.0.65.tar.gz - -WORKDIR /resin -RUN curl -sL $RESIN | tar xz --strip-components=1 -RUN rm -rf webapps/* -COPY --from=gradle_build /hexagon/build/libs/ROOT.war webapps/ROOT.war -COPY src/main/resources/fortunes.pebble.html fortunes.pebble.html -EXPOSE 9090 -CMD ["java", "-jar", "lib/resin.jar", "console"] diff --git a/frameworks/Kotlin/hexagon/hexagon-resin-postgresql.dockerfile b/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile similarity index 93% rename from frameworks/Kotlin/hexagon/hexagon-resin-postgresql.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-resin.dockerfile index 4c88f47740f..7ad188cd213 100644 --- a/frameworks/Kotlin/hexagon/hexagon-resin-postgresql.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.1-jdk11 AS gradle_build +FROM gradle:7.2-jdk11 AS gradle_build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index a846802eb3b..ad0603eb837 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.1-jdk11 AS gradle_build +FROM gradle:7.2-jdk11 AS gradle_build USER root WORKDIR /hexagon @@ -13,8 +13,8 @@ RUN gradle --quiet --exclude-task test # RUNTIME # FROM adoptopenjdk:11-jre-hotspot-bionic -ENV DBSTORE mongodb -ENV MONGODB_DB_HOST tfb-database +ENV DBSTORE postgresql +ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE jetty ENV PROJECT hexagon diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index e60779051f1..8ee2a680413 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -6,7 +6,6 @@ import com.hexagonkt.http.server.ServerPort import com.hexagonkt.http.server.ServerSettings import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.serialization.* -import com.hexagonkt.store.BenchmarkMongoDbStore import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort @@ -14,10 +13,7 @@ import com.hexagonkt.templates.pebble.PebbleAdapter import java.net.InetAddress internal val benchmarkStores: Map by lazy { - mapOf( - "mongodb" to BenchmarkMongoDbStore("mongodb"), - "postgresql" to BenchmarkSqlStore("postgresql") - ) + mapOf("postgresql" to BenchmarkSqlStore("postgresql")) } internal val benchmarkTemplateEngines: Map by lazy { diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkMongoDbStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkMongoDbStore.kt deleted file mode 100644 index eb0ce04612e..00000000000 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkMongoDbStore.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.hexagonkt.store - -import com.hexagonkt.CachedWorld -import com.hexagonkt.Fortune -import com.hexagonkt.Settings -import com.hexagonkt.World -import com.hexagonkt.helpers.Jvm -import com.hexagonkt.helpers.fail -import com.hexagonkt.store.mongodb.MongoDbStore -import org.cache2k.Cache - -internal class BenchmarkMongoDbStore(engine: String, private val settings: Settings = Settings()) - : BenchmarkStore(settings) { - - data class MongoDbWorld(val _id: Int, val id: Int, val randomNumber: Int) - data class MongoDbFortune(val _id: Int, val message: String) - - private val dbHost: String by lazy { Jvm.systemSetting("${engine.uppercase()}_DB_HOST") ?: "localhost" } - - private val dbUrl: String by lazy { "mongodb://$dbHost/${settings.databaseName}" } - - private val worldRepository: MongoDbStore by lazy { - MongoDbStore(MongoDbWorld::class, MongoDbWorld::_id, dbUrl, settings.worldName) - } - - private val fortuneRepository by lazy { - MongoDbStore(MongoDbFortune::class, MongoDbFortune::_id, dbUrl, settings.fortuneName) - } - - override fun findAllFortunes(): List = fortuneRepository.findAll().map { Fortune(it._id, it.message) } - - override fun findWorlds(ids: List): List = - ids.mapNotNull { worldRepository.findOne(it) }.map { World(it.id, it.randomNumber) } - - override fun replaceWorlds(worlds: List) { - worlds.forEach { - val world = worldRepository.findOne(it.id) ?: fail - val worldCopy = world.copy(randomNumber = it.randomNumber) - worldRepository.replaceOne(worldCopy) - } - } - - override fun initWorldsCache(cache: Cache) { - worldRepository.findAll().forEach { - cache.put(it.id, CachedWorld(it.id, it.randomNumber)) - } - } - - override fun loadCachedWorld(id: Int): CachedWorld = - worldRepository.findOne(id) - ?.let { world -> CachedWorld(world.id, world.randomNumber) } - ?: error("World not found: $id") - - override fun close() { - /* Not needed */ - } -} \ No newline at end of file From 55852f184390c8b7019cc0ac215b061090e7b631 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 24 Aug 2021 19:36:22 +0200 Subject: [PATCH 0033/1766] Fix runtime problem --- frameworks/Kotlin/hexagon/build.gradle | 1 + frameworks/Kotlin/hexagon/hexagon-resin.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index ae2ce077696..ef7e121a996 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -32,6 +32,7 @@ war { installDist.dependsOn("war") dependencies { + implementation("org.jetbrains.kotlin:kotlin-reflect:1.5.21") // TODO Remove on 1.4.2 implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") diff --git a/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile b/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile index 7ad188cd213..3bc3ddb7838 100644 --- a/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile @@ -7,7 +7,7 @@ WORKDIR /hexagon COPY src src COPY build.gradle build.gradle -RUN gradle --quiet --exclude-task test +RUN gradle --quiet # # RUNTIME diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index ad0603eb837..f40c3b93d3d 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -7,7 +7,7 @@ WORKDIR /hexagon COPY src src COPY build.gradle build.gradle -RUN gradle --quiet --exclude-task test +RUN gradle --quiet # # RUNTIME From 0046df55ebd80b8990cc9c0c8dbd6a7418ed6ed7 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 24 Aug 2021 22:25:48 +0200 Subject: [PATCH 0034/1766] Update Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index ef7e121a996..70718db9f04 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,9 +4,9 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.1/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.2/gradle" - hexagonVersion = "1.4.1" + hexagonVersion = "1.4.2" hikariVersion = "5.0.0" jettyVersion = "10.0.6" postgresqlVersion = "42.2.23" @@ -32,7 +32,6 @@ war { installDist.dependsOn("war") dependencies { - implementation("org.jetbrains.kotlin:kotlin-reflect:1.5.21") // TODO Remove on 1.4.2 implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") From a89d3d4cfa4403519c4193cf1c93b0d110a450da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Wed, 25 Aug 2021 23:14:08 +0800 Subject: [PATCH 0035/1766] remove aio-pro --- frameworks/Java/smart-socket/pom.xml | 14 +------------- .../main/java/org/smartboot/http/Bootstrap.java | 1 + .../main/java/org/smartboot/servlet/Bootstrap.java | 1 + 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 09ac77285dd..5bfcb2446f5 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,8 +11,7 @@ 11 11 2.11.0 - 0.1.6 - 1.5.11 + 0.1.7-SNAPSHOT @@ -26,11 +25,6 @@ HikariCP 3.4.5 - - org.smartboot.socket - aio-pro - ${smartsocket.version} - com.jsoniter jsoniter @@ -79,12 +73,6 @@ sonatype-nexus-snapshots Sonatype Nexus Snapshots https://oss.sonatype.org/content/repositories/snapshots - - false - - - true - diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 023528ae873..8ffea7a118f 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -55,6 +55,7 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio HttpBootstrap bootstrap = new HttpBootstrap(); bootstrap.configuration() .threadNum(cpuNum) + .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) 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 763554df801..0f1985cb01b 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 @@ -42,6 +42,7 @@ public static void main(String[] args) { bootstrap.configuration() .threadNum(cpuNum) .bannerEnabled(false) + .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) From 010d153ae8ceb037c48785020c161bb8fccadc19 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 25 Aug 2021 21:27:48 +0200 Subject: [PATCH 0036/1766] Make Jackson Blackbird module optional --- frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index 8ee2a680413..7a851fd0174 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -36,7 +36,8 @@ internal val benchmarkServer: Server by lazy { } fun main() { - Json.mapper.registerModule(BlackbirdModule()) + if (System.getenv().containsKey("ENABLE_BLACKBIRD")) + Json.mapper.registerModule(BlackbirdModule()) SerializationManager.mapper = JacksonMapper SerializationManager.formats = linkedSetOf(Json) From eec498ee22934edaa6df7d892518a79fb36ee38f Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Mon, 6 Sep 2021 22:59:27 +0200 Subject: [PATCH 0037/1766] remove db.sql --- .../Java/inverno/src/main/resources/db.sql | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 frameworks/Java/inverno/src/main/resources/db.sql diff --git a/frameworks/Java/inverno/src/main/resources/db.sql b/frameworks/Java/inverno/src/main/resources/db.sql deleted file mode 100644 index 2fd0de35be5..00000000000 --- a/frameworks/Java/inverno/src/main/resources/db.sql +++ /dev/null @@ -1,25 +0,0 @@ -DROP TABLE IF EXISTS World; - -CREATE TABLE World (id integer NOT NULL, randomNumber integer NOT NULL default 0, PRIMARY KEY (id)); -GRANT SELECT, UPDATE ON World to benchmarkdbuser; - -INSERT INTO World (id, randomnumber) SELECT x.id, random() * 10000 + 1 FROM generate_series(1,10000) as x(id); - - - -DROP TABLE IF EXISTS Fortune; -CREATE TABLE Fortune (id integer NOT NULL, message varchar(2048) NOT NULL, PRIMARY KEY (id)); -GRANT SELECT ON Fortune to benchmarkdbuser; - -INSERT INTO Fortune (id, message) VALUES (1, 'fortune: No such file or directory'); -INSERT INTO Fortune (id, message) VALUES (2, 'A computer scientist is someone who fixes things that aren''t broken.'); -INSERT INTO Fortune (id, message) VALUES (3, 'After enough decimal places, nobody gives a damn.'); -INSERT INTO Fortune (id, message) VALUES (4, 'A bad random number generator: 1, 1, 1, 1, 1, 4.33e+67, 1, 1, 1'); -INSERT INTO Fortune (id, message) VALUES (5, 'A computer program does what you tell it to do, not what you want it to do.'); -INSERT INTO Fortune (id, message) VALUES (6, 'Emacs is a nice operating system, but I prefer UNIX. — Tom Christaensen'); -INSERT INTO Fortune (id, message) VALUES (7, 'Any program that runs right is obsolete.'); -INSERT INTO Fortune (id, message) VALUES (8, 'A list is only as strong as its weakest link. — Donald Knuth'); -INSERT INTO Fortune (id, message) VALUES (9, 'Feature: A bug with seniority.'); -INSERT INTO Fortune (id, message) VALUES (10, 'Computers make very fast, very accurate mistakes.'); -INSERT INTO Fortune (id, message) VALUES (11, ''); -INSERT INTO Fortune (id, message) VALUES (12, 'フレームワークのベンチマーク'); \ No newline at end of file From 6872c7839fb7a9c3aaa6ebb64c1057157ba4274e Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Wed, 15 Sep 2021 21:56:03 +0200 Subject: [PATCH 0038/1766] Upgrade to Inverno 1.2.2 --- 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 adf81017f13..27b2a3a3f5d 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.2.1 + 1.2.2 com.techempower inverno-benchmark From cbddd2c2526f144404a2fa1532f128e1488c1c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 30 Sep 2021 17:49:02 +0800 Subject: [PATCH 0039/1766] remove headerLimiter --- .../java/org/smartboot/http/Bootstrap.java | 18 +----------------- .../java/org/smartboot/servlet/Bootstrap.java | 14 +------------- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 8ffea7a118f..3d26a672e59 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -16,10 +16,6 @@ import org.smartboot.http.server.HttpResponse; import org.smartboot.http.server.HttpServerHandler; import org.smartboot.http.server.handler.HttpRouteHandler; -import org.smartboot.http.server.impl.Request; -import org.smartboot.socket.StateMachineEnum; -import org.smartboot.socket.extension.processor.AbstractMessageProcessor; -import org.smartboot.socket.transport.AioSession; import javax.sql.DataSource; import java.io.IOException; @@ -55,22 +51,10 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio HttpBootstrap bootstrap = new HttpBootstrap(); bootstrap.configuration() .threadNum(cpuNum) - .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum) - .messageProcessor(processor -> new AbstractMessageProcessor<>() { - @Override - public void process0(AioSession session, Request msg) { - processor.process(session, msg); - } - - @Override - public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { - processor.stateEvent(session, stateMachineEnum, throwable); - } - }); + .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum); bootstrap.httpHandler(routeHandle).setPort(8080).start(); } 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 0f1985cb01b..a8fd3d35396 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 @@ -42,22 +42,10 @@ public static void main(String[] args) { bootstrap.configuration() .threadNum(cpuNum) .bannerEnabled(false) - .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum) - .messageProcessor(processor -> new AbstractMessageProcessor<>() { - @Override - public void process0(AioSession session, Request msg) { - processor.process(session, msg); - } - - @Override - public void stateEvent0(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) { - processor.stateEvent(session, stateMachineEnum, throwable); - } - }); + .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum); bootstrap.setPort(8080) .httpHandler(new HttpServerHandler() { @Override From dc625615d783f6e8519ad68c9762e42d9b6c0b20 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 13 Oct 2021 21:24:21 +0200 Subject: [PATCH 0040/1766] Add variation with Blackbird module enabled --- .../Kotlin/hexagon/benchmark_config.json | 23 ++++++++++++++++ frameworks/Kotlin/hexagon/config.toml | 18 +++++++++++++ .../hexagon/hexagon-blackbird.dockerfile | 26 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 7bca1a660ad..44da569131b 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -25,6 +25,29 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, + "blackbird": { + "json_url": "/json", + "db_url": "/postgresql/db", + "query_url": "/postgresql/query?queries=", + "fortune_url": "/postgresql/pebble/fortunes", + "update_url": "/postgresql/update?queries=", + "cached_query_url": "/postgresql/cached?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Servlet", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Jetty PostgreSQL", + "notes": "http://hexagonkt.com", + "versus": "servlet" + }, "resin": { "json_url": "/json", "db_url": "/postgresql/db", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index c688baad5a8..dfbcd24f032 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -19,6 +19,24 @@ platform = "Servlet" webserver = "None" versus = "servlet" +[blackbird] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/postgresql/db" +urls.query = "/postgresql/query?queries=" +urls.update = "/postgresql/update?queries=" +urls.fortune = "/postgresql/pebble/fortunes" +urls.cached_query = "/postgresql/cached?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Servlet" +webserver = "None" +versus = "servlet" + [resin] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile b/frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile new file mode 100644 index 00000000000..07d9771d2e0 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile @@ -0,0 +1,26 @@ +# +# BUILD +# +FROM gradle:7.2-jdk11 AS gradle_build +USER root +WORKDIR /hexagon + +COPY src src +COPY build.gradle build.gradle +RUN gradle --quiet + +# +# RUNTIME +# +FROM adoptopenjdk:11-jre-hotspot-bionic +ENV DBSTORE postgresql +ENV POSTGRESQL_DB_HOST tfb-database +ENV WEBENGINE jetty +ENV PROJECT hexagon +ENV ENABLE_BLACKBIRD true + +COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT + +EXPOSE 9090 + +ENTRYPOINT /opt/$PROJECT/bin/$PROJECT From 349756851dfc0b992846b8ea82f89754d754dc4d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 13 Oct 2021 21:25:08 +0200 Subject: [PATCH 0041/1766] Upgrade Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 12 ++++++------ .../Kotlin/hexagon/src/main/kotlin/Benchmark.kt | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 70718db9f04..64e344c8d71 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,17 +1,17 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.5.21" + id "org.jetbrains.kotlin.jvm" version "1.5.31" } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.2/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.7/gradle" - hexagonVersion = "1.4.2" + hexagonVersion = "1.4.7" hikariVersion = "5.0.0" - jettyVersion = "10.0.6" - postgresqlVersion = "42.2.23" + jettyVersion = "10.0.7" + postgresqlVersion = "42.2.24" cache2kVersion = "2.2.1.Final" - jacksonBlackbirdVersion = "2.12.4" + jacksonBlackbirdVersion = "2.13.0" } apply(from: "$gradleScripts/kotlin.gradle") diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index 7a851fd0174..bfa87425fe1 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -1,6 +1,7 @@ package com.hexagonkt import com.fasterxml.jackson.module.blackbird.BlackbirdModule +import com.hexagonkt.helpers.Jvm import com.hexagonkt.http.server.Server import com.hexagonkt.http.server.ServerPort import com.hexagonkt.http.server.ServerSettings @@ -36,7 +37,7 @@ internal val benchmarkServer: Server by lazy { } fun main() { - if (System.getenv().containsKey("ENABLE_BLACKBIRD")) + if (Jvm.systemFlag("ENABLE_BLACKBIRD")) Json.mapper.registerModule(BlackbirdModule()) SerializationManager.mapper = JacksonMapper SerializationManager.formats = linkedSetOf(Json) From 73bd7b399c5011cf84bc0c67df2ee6fac0f46eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 9 Dec 2021 10:38:25 +0800 Subject: [PATCH 0042/1766] update hikaricp version --- frameworks/Java/smart-socket/pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 5bfcb2446f5..e71c9d8972c 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -12,6 +12,8 @@ 11 2.11.0 0.1.7-SNAPSHOT + 5.0.0 + 0.9.23 @@ -23,12 +25,12 @@ com.zaxxer HikariCP - 3.4.5 + ${hikaricp.version} com.jsoniter jsoniter - 0.9.23 + ${jsoniter.version} org.apache.logging.log4j From 8a565d196bf565857556e03fecff52a94b5cceef Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 23 Dec 2021 08:36:56 +0100 Subject: [PATCH 0043/1766] Enable blackbird Jackson module by default --- .../Kotlin/hexagon/benchmark_config.json | 23 ---------------- frameworks/Kotlin/hexagon/config.toml | 18 ------------- .../hexagon/hexagon-blackbird.dockerfile | 26 ------------------- frameworks/Kotlin/hexagon/hexagon.dockerfile | 3 ++- 4 files changed, 2 insertions(+), 68 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 44da569131b..7bca1a660ad 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -25,29 +25,6 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, - "blackbird": { - "json_url": "/json", - "db_url": "/postgresql/db", - "query_url": "/postgresql/query?queries=", - "fortune_url": "/postgresql/pebble/fortunes", - "update_url": "/postgresql/update?queries=", - "cached_query_url": "/postgresql/cached?count=", - "plaintext_url": "/plaintext", - "port": 9090, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Servlet", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Jetty PostgreSQL", - "notes": "http://hexagonkt.com", - "versus": "servlet" - }, "resin": { "json_url": "/json", "db_url": "/postgresql/db", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index dfbcd24f032..c688baad5a8 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -19,24 +19,6 @@ platform = "Servlet" webserver = "None" versus = "servlet" -[blackbird] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/postgresql/db" -urls.query = "/postgresql/query?queries=" -urls.update = "/postgresql/update?queries=" -urls.fortune = "/postgresql/pebble/fortunes" -urls.cached_query = "/postgresql/cached?count=" -approach = "Realistic" -classification = "Micro" -database = "postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Servlet" -webserver = "None" -versus = "servlet" - [resin] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile b/frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile deleted file mode 100644 index 07d9771d2e0..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# -# BUILD -# -FROM gradle:7.2-jdk11 AS gradle_build -USER root -WORKDIR /hexagon - -COPY src src -COPY build.gradle build.gradle -RUN gradle --quiet - -# -# RUNTIME -# -FROM adoptopenjdk:11-jre-hotspot-bionic -ENV DBSTORE postgresql -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE jetty -ENV PROJECT hexagon -ENV ENABLE_BLACKBIRD true - -COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT - -EXPOSE 9090 - -ENTRYPOINT /opt/$PROJECT/bin/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index f40c3b93d3d..28a74cb7352 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.2-jdk11 AS gradle_build +FROM gradle:7.3.3-jdk11 AS gradle_build USER root WORKDIR /hexagon @@ -17,6 +17,7 @@ ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE jetty ENV PROJECT hexagon +ENV ENABLE_BLACKBIRD true COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT From 8f9854b4f51f0853838d05d9f2c0eda5a4d20b7f Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 23 Dec 2021 09:22:14 +0100 Subject: [PATCH 0044/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 10 +++++----- frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt | 3 ++- .../Kotlin/hexagon/src/main/kotlin/Controller.kt | 6 +++--- frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt | 4 ++-- .../hexagon/src/main/kotlin/WebListenerServer.kt | 6 +++--- .../hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt | 4 ++-- 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 64e344c8d71..a492c71f81b 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,16 +1,16 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.5.31" + id "org.jetbrains.kotlin.jvm" version "1.6.10" } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.7/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.5.1/gradle" - hexagonVersion = "1.4.7" + hexagonVersion = "1.5.1" hikariVersion = "5.0.0" jettyVersion = "10.0.7" - postgresqlVersion = "42.2.24" - cache2kVersion = "2.2.1.Final" + postgresqlVersion = "42.3.1" + cache2kVersion = "2.4.1.Final" jacksonBlackbirdVersion = "2.13.0" } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index bfa87425fe1..2c0ab6a27de 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -1,12 +1,13 @@ package com.hexagonkt import com.fasterxml.jackson.module.blackbird.BlackbirdModule -import com.hexagonkt.helpers.Jvm +import com.hexagonkt.core.helpers.Jvm import com.hexagonkt.http.server.Server import com.hexagonkt.http.server.ServerPort import com.hexagonkt.http.server.ServerSettings import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.serialization.* +import com.hexagonkt.serialization.json.* import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 62f010c2eb2..e95d526691d 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -1,9 +1,9 @@ package com.hexagonkt -import com.hexagonkt.helpers.require +import com.hexagonkt.core.helpers.require import com.hexagonkt.http.server.Call import com.hexagonkt.http.server.Router -import com.hexagonkt.serialization.Json +import com.hexagonkt.serialization.json.Json import com.hexagonkt.serialization.toFieldsMap import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort @@ -91,4 +91,4 @@ class Controller(private val settings: Settings) { catch (e: Exception) { null } -} \ No newline at end of file +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index 578b11b45d9..94992292acc 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -1,6 +1,6 @@ package com.hexagonkt -import com.hexagonkt.helpers.Jvm.systemSetting +import com.hexagonkt.core.helpers.Jvm.systemSetting data class Settings( val bindPort: Int = systemSetting("bindPort") ?: 9090, @@ -25,4 +25,4 @@ data class Settings( val textMessage: String = "Hello, World!", val queriesParam: String = "queries", val cachedQueriesParam: String = "count", -) \ No newline at end of file +) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index 488388534d3..81a912606f1 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -2,8 +2,8 @@ package com.hexagonkt import com.fasterxml.jackson.module.blackbird.BlackbirdModule import com.hexagonkt.http.server.servlet.ServletServer -import com.hexagonkt.serialization.JacksonMapper -import com.hexagonkt.serialization.Json +import com.hexagonkt.serialization.json.JacksonMapper +import com.hexagonkt.serialization.json.Json import com.hexagonkt.serialization.SerializationManager import javax.servlet.annotation.WebListener @@ -14,4 +14,4 @@ import javax.servlet.annotation.WebListener SerializationManager.mapper = JacksonMapper SerializationManager.formats = linkedSetOf(Json) } -} \ No newline at end of file +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index b0fdd6f6f85..acf4e978a6a 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -4,7 +4,7 @@ import com.hexagonkt.CachedWorld import com.hexagonkt.Fortune import com.hexagonkt.Settings import com.hexagonkt.World -import com.hexagonkt.helpers.Jvm +import com.hexagonkt.core.helpers.Jvm import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import org.cache2k.Cache @@ -100,4 +100,4 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings rs.next() return World(rs.getInt(1), rs.getInt(2)) } -} \ No newline at end of file +} From cdf705baa769f2cfc3c6f33c2137b26041300900 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 8 Jan 2022 11:26:03 +0100 Subject: [PATCH 0045/1766] Use Hexagon version 2.0.0-B1 (and a little cleanup) --- frameworks/Kotlin/hexagon/build.gradle | 10 +- .../hexagon/src/main/kotlin/Benchmark.kt | 39 +++--- .../hexagon/src/main/kotlin/Controller.kt | 116 +++++++++++------- .../hexagon/src/main/kotlin/Settings.kt | 4 + .../src/main/kotlin/WebListenerServer.kt | 16 +-- 5 files changed, 103 insertions(+), 82 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index a492c71f81b..a737206edd9 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,14 +4,13 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.5.1/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0-B1/gradle" - hexagonVersion = "1.5.1" + hexagonVersion = "2.0.0-B1" hikariVersion = "5.0.0" - jettyVersion = "10.0.7" + jettyVersion = "11.0.7" postgresqlVersion = "42.3.1" cache2kVersion = "2.4.1.Final" - jacksonBlackbirdVersion = "2.13.0" } apply(from: "$gradleScripts/kotlin.gradle") @@ -35,9 +34,8 @@ dependencies { implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") - implementation("com.hexagonkt:serialization_json:$hexagonVersion") + implementation("com.hexagonkt:serialization_jackson_json:$hexagonVersion") - implementation("com.fasterxml.jackson.module:jackson-module-blackbird:$jacksonBlackbirdVersion") implementation("org.cache2k:cache2k-core:$cache2kVersion") implementation("com.zaxxer:HikariCP:$hikariVersion") implementation("org.postgresql:postgresql:$postgresqlVersion") diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index 2c0ab6a27de..c8174411b35 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -1,47 +1,44 @@ package com.hexagonkt -import com.fasterxml.jackson.module.blackbird.BlackbirdModule -import com.hexagonkt.core.helpers.Jvm -import com.hexagonkt.http.server.Server -import com.hexagonkt.http.server.ServerPort -import com.hexagonkt.http.server.ServerSettings +import com.hexagonkt.http.server.HttpServer +import com.hexagonkt.http.server.HttpServerPort +import com.hexagonkt.http.server.HttpServerSettings import com.hexagonkt.http.server.jetty.JettyServletAdapter -import com.hexagonkt.serialization.* -import com.hexagonkt.serialization.json.* import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort import com.hexagonkt.templates.pebble.PebbleAdapter import java.net.InetAddress -internal val benchmarkStores: Map by lazy { +internal val stores: Map by lazy { mapOf("postgresql" to BenchmarkSqlStore("postgresql")) } -internal val benchmarkTemplateEngines: Map by lazy { +internal val templateEngines: Map by lazy { mapOf("pebble" to PebbleAdapter) } -internal val benchmarkEngines: Map by lazy { +private val engines: Map by lazy { mapOf("jetty" to JettyServletAdapter()) } -internal val benchmarkServer: Server by lazy { +private val server: HttpServer by lazy { val settings = Settings() - val engine = benchmarkEngines[settings.webEngine] ?: error("Unsupported server engine") - val serverSettings = ServerSettings( + val engine = engines[settings.webEngine] ?: error("Unsupported server engine") + val controller = Controller(settings, stores, templateEngines) + val serverSettings = HttpServerSettings( bindAddress = InetAddress.getByName(settings.bindAddress), - bindPort = settings.bindPort + bindPort = settings.bindPort, + options = mapOf( + "sendDateHeader" to settings.sendDateHeader, + "sendServerVersion" to settings.sendServerVersion, + "sendXPoweredBy" to settings.sendXPoweredBy, + ), ) - Server(engine, Controller(settings).router, serverSettings) + HttpServer(engine, listOf(controller.path), serverSettings) } fun main() { - if (Jvm.systemFlag("ENABLE_BLACKBIRD")) - Json.mapper.registerModule(BlackbirdModule()) - SerializationManager.mapper = JacksonMapper - SerializationManager.formats = linkedSetOf(Json) - - benchmarkServer.start() + server.start() } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index e95d526691d..c77cc9de631 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -1,78 +1,110 @@ package com.hexagonkt import com.hexagonkt.core.helpers.require -import com.hexagonkt.http.server.Call -import com.hexagonkt.http.server.Router -import com.hexagonkt.serialization.json.Json -import com.hexagonkt.serialization.toFieldsMap +import com.hexagonkt.core.media.ApplicationMedia.JSON +import com.hexagonkt.core.media.TextMedia.HTML +import com.hexagonkt.core.media.TextMedia.PLAIN +import com.hexagonkt.http.model.ContentType +import com.hexagonkt.http.server.handlers.HttpServerContext +import com.hexagonkt.http.server.handlers.PathHandler +import com.hexagonkt.http.server.handlers.path +import com.hexagonkt.serialization.jackson.json.Json +import com.hexagonkt.serialization.serialize import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort + import java.net.URL import java.util.concurrent.ThreadLocalRandom -class Controller(private val settings: Settings) { +import kotlin.text.Charsets.UTF_8 + +internal class Controller( + settings: Settings, + stores: Map, + templateEngines: Map, +) { + private val queriesParam: String = settings.queriesParam + private val cachedQueriesParam: String = settings.cachedQueriesParam + private val worldRows: Int = settings.worldRows + + private val plain: ContentType = ContentType(PLAIN) + private val json: ContentType = ContentType(JSON) + private val html: ContentType = ContentType(HTML, charset = UTF_8) private val templates: Map = mapOf( "pebble" to (urlOrNull("classpath:fortunes.pebble.html") ?: URL("file:/resin/fortunes.pebble.html")) ) - internal val router: Router by lazy { - Router { - before { - response.headers["Server"] = "Servlet/3.1" - response.headers["Transfer-Encoding"] = "chunked" - } - - get("/plaintext") { ok(settings.textMessage, "text/plain") } - get("/json") { ok(Message(settings.textMessage), Json) } - - benchmarkStores.forEach { (storeEngine, store) -> - benchmarkTemplateEngines.forEach { (templateEngineId, templateEngine) -> - val path = "/$storeEngine/${templateEngineId}/fortunes" - - get(path) { listFortunes(store, templateEngineId, templateEngine) } + internal val path: PathHandler by lazy { + path { + get("/plaintext") { ok(settings.textMessage, contentType = plain) } + get("/json") { ok(Message(settings.textMessage).serialize(Json), contentType = json) } + + stores.forEach { (storeEngine, store) -> + path("/$storeEngine") { + templateEngines.forEach { (templateEngineId, templateEngine) -> + get("/${templateEngineId}/fortunes") { listFortunes(store, templateEngineId, templateEngine) } + } + + get("/db") { dbQuery(store) } + get("/query") { getWorlds(store) } + get("/cached") { getCachedWorlds(store) } + get("/update") { updateWorlds(store) } } - - get("/$storeEngine/db") { dbQuery(store) } - get("/$storeEngine/query") { getWorlds(store) } - get("/$storeEngine/cached") { getCachedWorlds(store) } - get("/$storeEngine/update") { updateWorlds(store) } } } } - private fun Call.listFortunes(store: BenchmarkStore, templateKind: String, templateAdapter: TemplatePort) { + private fun HttpServerContext.listFortunes( + store: BenchmarkStore, templateKind: String, templateAdapter: TemplatePort + ): HttpServerContext { val fortunes = store.findAllFortunes() + Fortune(0, "Additional fortune added at request time.") val sortedFortunes = fortunes.sortedBy { it.message } val context = mapOf("fortunes" to sortedFortunes) + val body = templateAdapter.render(templates.require(templateKind), context) - response.contentType = "text/html;charset=utf-8" - ok(templateAdapter.render(templates.require(templateKind), context)) + return ok(body, contentType = html) } - private fun Call.dbQuery(store: BenchmarkStore) { - ok(store.findWorlds(listOf(randomWorld())).first(), Json) + private fun HttpServerContext.dbQuery(store: BenchmarkStore): HttpServerContext { + val ids = listOf(randomWorld()) + val worlds = store.findWorlds(ids) + val world = worlds.first() + + return sendJson(world) } - private fun Call.getWorlds(store: BenchmarkStore) { - val ids = (1..getWorldsCount(settings.queriesParam)).map { randomWorld() } - ok(store.findWorlds(ids), Json) + private fun HttpServerContext.getWorlds(store: BenchmarkStore): HttpServerContext { + val worldsCount = getWorldsCount(queriesParam) + val ids = (1..worldsCount).map { randomWorld() } + val worlds = store.findWorlds(ids) + + return sendJson(worlds) } - private fun Call.getCachedWorlds(store: BenchmarkStore) { - val ids = (1..getWorldsCount(settings.cachedQueriesParam)).map { randomWorld() } - ok(store.findCachedWorlds(ids).map { it.toFieldsMap() }, Json) + private fun HttpServerContext.getCachedWorlds(store: BenchmarkStore): HttpServerContext { + val worldsCount = getWorldsCount(cachedQueriesParam) + val ids = (1..worldsCount).map { randomWorld() } + val worlds = store.findCachedWorlds(ids) + + return sendJson(worlds) } - private fun Call.updateWorlds(store: BenchmarkStore) { - val worlds = (1..getWorldsCount(settings.queriesParam)).map { World(randomWorld(), randomWorld()) } + private fun HttpServerContext.updateWorlds(store: BenchmarkStore): HttpServerContext { + val worldsCount = getWorldsCount(queriesParam) + val worlds = (1..worldsCount).map { World(randomWorld(), randomWorld()) } + store.replaceWorlds(worlds) - ok(worlds, Json) + + return sendJson(worlds) } - private fun Call.getWorldsCount(parameter: String): Int = - queryParametersValues[parameter]?.firstOrNull()?.toIntOrNull().let { + private fun HttpServerContext.sendJson(body: Any): HttpServerContext = + ok(body.serialize(Json), contentType = json) + + private fun HttpServerContext.getWorldsCount(parameter: String): Int = + request.queryParameters[parameter]?.toIntOrNull().let { when { it == null -> 1 it < 1 -> 1 @@ -82,7 +114,7 @@ class Controller(private val settings: Settings) { } private fun randomWorld(): Int = - ThreadLocalRandom.current().nextInt(settings.worldRows) + 1 + ThreadLocalRandom.current().nextInt(worldRows) + 1 private fun urlOrNull(path: String): URL? = try { diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index 94992292acc..71e58b4da42 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -21,6 +21,10 @@ data class Settings( val fortuneName: String = systemSetting("fortuneCollection") ?: "fortune", val databaseName: String = systemSetting("database") ?: "hello_world", + val sendDateHeader: Boolean = systemSetting("sendDateHeader") ?: false, + val sendServerVersion: Boolean = systemSetting("sendServerVersion") ?: true, + val sendXPoweredBy: Boolean = systemSetting("sendXPoweredBy") ?: false, + val worldRows: Int = 10_000, val textMessage: String = "Hello, World!", val queriesParam: String = "queries", diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index 81a912606f1..1c95b0881ad 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -1,17 +1,7 @@ package com.hexagonkt -import com.fasterxml.jackson.module.blackbird.BlackbirdModule import com.hexagonkt.http.server.servlet.ServletServer -import com.hexagonkt.serialization.json.JacksonMapper -import com.hexagonkt.serialization.json.Json -import com.hexagonkt.serialization.SerializationManager -import javax.servlet.annotation.WebListener +import jakarta.servlet.annotation.WebListener -@WebListener class WebListenerServer(settings: Settings = Settings()) : ServletServer(Controller(settings).router) { - - init { - Json.mapper.registerModule(BlackbirdModule()) - SerializationManager.mapper = JacksonMapper - SerializationManager.formats = linkedSetOf(Json) - } -} +@WebListener class WebListenerServer(settings: Settings = Settings()) : + ServletServer(listOf(Controller(settings, stores, templateEngines).path)) From f8236d58e88a8f2f9c96e13e59ecbafda1f19590 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 8 Jan 2022 11:37:09 +0100 Subject: [PATCH 0046/1766] Use Hexagon version 2.0.0-B1 (and a little cleanup) --- frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index 71e58b4da42..2506fb74e43 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -21,7 +21,7 @@ data class Settings( val fortuneName: String = systemSetting("fortuneCollection") ?: "fortune", val databaseName: String = systemSetting("database") ?: "hello_world", - val sendDateHeader: Boolean = systemSetting("sendDateHeader") ?: false, + val sendDateHeader: Boolean = systemSetting("sendDateHeader") ?: true, val sendServerVersion: Boolean = systemSetting("sendServerVersion") ?: true, val sendXPoweredBy: Boolean = systemSetting("sendXPoweredBy") ?: false, From a344738f4c806abc98693cad622fa0188b76b679 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 8 Jan 2022 15:19:37 +0100 Subject: [PATCH 0047/1766] Use Tomcat instead Resin to test JEE integration --- frameworks/Kotlin/hexagon/README.md | 2 +- .../Kotlin/hexagon/benchmark_config.json | 4 ++-- frameworks/Kotlin/hexagon/config.toml | 2 +- ...n.dockerfile => hexagon-tomcat.dockerfile} | 8 ++------ .../hexagon/src/main/kotlin/Controller.kt | 12 ++--------- .../hexagon/src/main/kotlin/Settings.kt | 1 + .../src/main/kotlin/WebListenerServer.kt | 20 +++++++++++++++++-- .../main/kotlin/store/BenchmarkSqlStore.kt | 5 +++-- .../src/main/kotlin/store/BenchmarkStore.kt | 4 ++-- 9 files changed, 32 insertions(+), 26 deletions(-) rename frameworks/Kotlin/hexagon/{hexagon-resin.dockerfile => hexagon-tomcat.dockerfile} (61%) diff --git a/frameworks/Kotlin/hexagon/README.md b/frameworks/Kotlin/hexagon/README.md index 54c66442a82..b83921aecdc 100644 --- a/frameworks/Kotlin/hexagon/README.md +++ b/frameworks/Kotlin/hexagon/README.md @@ -31,7 +31,7 @@ and `${TEMPLATE_ENGINE}` with: `pebble` * Database updates: http://localhost:9090/${DB_ENGINE}/update * Database queries: http://localhost:9090/${DB_ENGINE}/query -### Resin +### Tomcat * JSON Encoding Test: http://localhost:8080/json * Plain Text Test: http://localhost:8080/plaintext diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 7bca1a660ad..78527517668 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -25,7 +25,7 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, - "resin": { + "tomcat": { "json_url": "/json", "db_url": "/postgresql/db", "query_url": "/postgresql/query?queries=", @@ -44,7 +44,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Resin PostgreSQL", + "display_name": "Hexagon Tomcat PostgreSQL", "notes": "http://hexagonkt.com", "versus": "servlet" } diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index c688baad5a8..886a19b270f 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -19,7 +19,7 @@ platform = "Servlet" webserver = "None" versus = "servlet" -[resin] +[tomcat] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/postgresql/db" diff --git a/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile similarity index 61% rename from frameworks/Kotlin/hexagon/hexagon-resin.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 3bc3ddb7838..3351663c034 100644 --- a/frameworks/Kotlin/hexagon/hexagon-resin.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -12,15 +12,11 @@ RUN gradle --quiet # # RUNTIME # -FROM adoptopenjdk:11-jre-hotspot-bionic +FROM tomcat:10.0.14-jre17-temurin ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database -ENV RESIN http://caucho.com/download/resin-4.0.65.tar.gz -WORKDIR /resin -RUN curl -sL $RESIN | tar xz --strip-components=1 -RUN rm -rf webapps/* +WORKDIR /usr/local/tomcat COPY --from=gradle_build /hexagon/build/libs/ROOT.war webapps/ROOT.war COPY src/main/resources/fortunes.pebble.html fortunes.pebble.html EXPOSE 8080 -CMD ["java", "-jar", "lib/resin.jar", "console"] diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index c77cc9de631..dc8045343cf 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -18,7 +18,7 @@ import java.util.concurrent.ThreadLocalRandom import kotlin.text.Charsets.UTF_8 -internal class Controller( +class Controller( settings: Settings, stores: Map, templateEngines: Map, @@ -32,7 +32,7 @@ internal class Controller( private val html: ContentType = ContentType(HTML, charset = UTF_8) private val templates: Map = mapOf( - "pebble" to (urlOrNull("classpath:fortunes.pebble.html") ?: URL("file:/resin/fortunes.pebble.html")) + "pebble" to URL("classpath:fortunes.pebble.html") ) internal val path: PathHandler by lazy { @@ -115,12 +115,4 @@ internal class Controller( private fun randomWorld(): Int = ThreadLocalRandom.current().nextInt(worldRows) + 1 - - private fun urlOrNull(path: String): URL? = - try { - URL(path) - } - catch (e: Exception) { - null - } } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index 2506fb74e43..148b69b62f0 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -20,6 +20,7 @@ data class Settings( val worldName: String = systemSetting("worldCollection") ?: "world", val fortuneName: String = systemSetting("fortuneCollection") ?: "fortune", val databaseName: String = systemSetting("database") ?: "hello_world", + val databaseDriver: String = systemSetting("databaseDriver") ?: "org.postgresql.Driver", val sendDateHeader: Boolean = systemSetting("sendDateHeader") ?: true, val sendServerVersion: Boolean = systemSetting("sendServerVersion") ?: true, diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index 1c95b0881ad..ab8752055bd 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -1,7 +1,23 @@ package com.hexagonkt +import com.hexagonkt.core.helpers.multiMapOf +import com.hexagonkt.http.server.handlers.HttpHandler +import com.hexagonkt.http.server.handlers.OnHandler import com.hexagonkt.http.server.servlet.ServletServer import jakarta.servlet.annotation.WebListener -@WebListener class WebListenerServer(settings: Settings = Settings()) : - ServletServer(listOf(Controller(settings, stores, templateEngines).path)) +@WebListener class WebListenerServer(settings: Settings = Settings()) : ServletServer(createHandlers(settings)) { + + private companion object { + + fun createHandlers(settings: Settings): List { + val controller = Controller(settings, stores, templateEngines) + val controllerPath = controller.path + val serverHeaderHandler = OnHandler { + send(headers = multiMapOf("server" to "Tomcat")) + } + + return listOf(serverHeaderHandler, controllerPath) + } + } +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index acf4e978a6a..d1f4ae726e3 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -27,8 +27,9 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings val config = HikariConfig().apply { jdbcUrl = "jdbc:postgresql://$dbHost/${settings.databaseName}" maximumPoolSize = Jvm.systemSetting(Int::class, "maximumPoolSize") ?: poolSize - username = Jvm.systemSetting("databaseUsername") ?: "benchmarkdbuser" - password = Jvm.systemSetting("databasePassword") ?: "benchmarkdbpass" + driverClassName = settings.databaseDriver + username = settings.databaseUsername + password = settings.databasePassword } HikariDataSource(config) } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt index 30eaeb9dfc4..2c6ce918128 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt @@ -7,7 +7,7 @@ import com.hexagonkt.World import org.cache2k.Cache import org.cache2k.Cache2kBuilder -internal abstract class BenchmarkStore(settings: Settings) { +abstract class BenchmarkStore(settings: Settings) { abstract fun findAllFortunes(): List abstract fun findWorlds(ids: List): List @@ -30,4 +30,4 @@ internal abstract class BenchmarkStore(settings: Settings) { fun findCachedWorlds(ids: List): List { return ids.mapNotNull { worldsCache.get(it) } } -} \ No newline at end of file +} From 06fe67aaed0de9b54242b70d93d53c4a40e14d24 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 8 Jan 2022 15:53:24 +0100 Subject: [PATCH 0048/1766] Remove unused environment variable --- frameworks/Kotlin/hexagon/hexagon.dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 28a74cb7352..3d1dab5fb55 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -17,7 +17,6 @@ ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE jetty ENV PROJECT hexagon -ENV ENABLE_BLACKBIRD true COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT From 0f7fff4b78c1bcf21358b175574b4b8db41d8cd9 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 8 Jan 2022 18:21:13 +0100 Subject: [PATCH 0049/1766] Clean Tomcat dockerfile --- frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 3351663c034..ae472669f14 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -16,7 +16,5 @@ FROM tomcat:10.0.14-jre17-temurin ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database -WORKDIR /usr/local/tomcat -COPY --from=gradle_build /hexagon/build/libs/ROOT.war webapps/ROOT.war -COPY src/main/resources/fortunes.pebble.html fortunes.pebble.html +COPY --from=gradle_build /hexagon/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080 From 516f4c5da773165c50721c2e4e446988d2deb4cb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 8 Jan 2022 18:58:35 +0100 Subject: [PATCH 0050/1766] Minor improvements --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt | 2 +- frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index a737206edd9..915f4a3e4e3 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,9 +4,9 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0-B1/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0-B2/gradle" - hexagonVersion = "2.0.0-B1" + hexagonVersion = "2.0.0-B2" hikariVersion = "5.0.0" jettyVersion = "11.0.7" postgresqlVersion = "42.3.1" diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index c8174411b35..00b895d74ea 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -36,7 +36,7 @@ private val server: HttpServer by lazy { ), ) - HttpServer(engine, listOf(controller.path), serverSettings) + HttpServer(engine, controller.path, serverSettings) } fun main() { diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index dc8045343cf..8ecb1eb527f 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -38,7 +38,7 @@ class Controller( internal val path: PathHandler by lazy { path { get("/plaintext") { ok(settings.textMessage, contentType = plain) } - get("/json") { ok(Message(settings.textMessage).serialize(Json), contentType = json) } + get("/json") { ok(Message(settings.textMessage).serialize(Json.raw), contentType = json) } stores.forEach { (storeEngine, store) -> path("/$storeEngine") { @@ -101,7 +101,7 @@ class Controller( } private fun HttpServerContext.sendJson(body: Any): HttpServerContext = - ok(body.serialize(Json), contentType = json) + ok(body.serialize(Json.raw), contentType = json) private fun HttpServerContext.getWorldsCount(parameter: String): Int = request.queryParameters[parameter]?.toIntOrNull().let { From 9e4176a2da4267e5abc60362cbd620e9e1b50f6d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jan 2022 15:03:37 +0100 Subject: [PATCH 0051/1766] Minor improvements --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- .../Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 915f4a3e4e3..43dc7c28bc4 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,9 +4,9 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0-B2/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0-B3/gradle" - hexagonVersion = "2.0.0-B2" + hexagonVersion = "2.0.0-B3" hikariVersion = "5.0.0" jettyVersion = "11.0.7" postgresqlVersion = "42.3.1" diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index ab8752055bd..0794bda5ef4 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -13,7 +13,7 @@ import jakarta.servlet.annotation.WebListener fun createHandlers(settings: Settings): List { val controller = Controller(settings, stores, templateEngines) val controllerPath = controller.path - val serverHeaderHandler = OnHandler { + val serverHeaderHandler = OnHandler("*") { send(headers = multiMapOf("server" to "Tomcat")) } From ccd6fc40d966e0eece147ed247c83f15aa854e51 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 13 Jan 2022 17:59:54 +0100 Subject: [PATCH 0052/1766] Update to release version --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt | 2 +- frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt | 2 +- .../Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt | 2 +- .../Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 43dc7c28bc4..b8d18ca7a89 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,9 +4,9 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0-B3/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0/gradle" - hexagonVersion = "2.0.0-B3" + hexagonVersion = "2.0.0" hikariVersion = "5.0.0" jettyVersion = "11.0.7" postgresqlVersion = "42.3.1" diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 8ecb1eb527f..71d770cbb62 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -1,6 +1,6 @@ package com.hexagonkt -import com.hexagonkt.core.helpers.require +import com.hexagonkt.core.require import com.hexagonkt.core.media.ApplicationMedia.JSON import com.hexagonkt.core.media.TextMedia.HTML import com.hexagonkt.core.media.TextMedia.PLAIN diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index 148b69b62f0..cc1fe17ce0c 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -1,6 +1,6 @@ package com.hexagonkt -import com.hexagonkt.core.helpers.Jvm.systemSetting +import com.hexagonkt.core.Jvm.systemSetting data class Settings( val bindPort: Int = systemSetting("bindPort") ?: 9090, diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index 0794bda5ef4..eec6f2571d3 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -1,6 +1,6 @@ package com.hexagonkt -import com.hexagonkt.core.helpers.multiMapOf +import com.hexagonkt.core.multiMapOf import com.hexagonkt.http.server.handlers.HttpHandler import com.hexagonkt.http.server.handlers.OnHandler import com.hexagonkt.http.server.servlet.ServletServer diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index d1f4ae726e3..2c3d20939f7 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -4,7 +4,7 @@ import com.hexagonkt.CachedWorld import com.hexagonkt.Fortune import com.hexagonkt.Settings import com.hexagonkt.World -import com.hexagonkt.core.helpers.Jvm +import com.hexagonkt.core.Jvm import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import org.cache2k.Cache From 5a963940e6b26c4f701c2305af5e1b6ce49d5c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sat, 22 Jan 2022 13:43:19 +0800 Subject: [PATCH 0053/1766] replace json util --- frameworks/Java/smart-socket/pom.xml | 5 ++ .../java/org/smartboot/http/JsonUtil.java | 61 +++++++++++++------ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index e71c9d8972c..3c8f5afa3f3 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -17,6 +17,11 @@ + + io.edap + edapx-json + 0.1-SNAPSHOT + org.smartboot.servlet servlet-core 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 20e0ebcc5b8..0aa0f44a2d1 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,9 +1,8 @@ package org.smartboot.http; -import com.jsoniter.output.JsonStream; -import com.jsoniter.output.JsonStreamPool; import com.jsoniter.spi.JsonException; -import com.jsoniter.spi.Slice; +import io.edap.x.json.Eson; +import io.edap.x.json.JsonWriter; import org.smartboot.http.server.HttpResponse; import javax.servlet.http.HttpServletResponse; @@ -15,32 +14,56 @@ */ public class JsonUtil { public static void writeJsonBytes(HttpResponse 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(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); } } } From f641771f5e907f3ff0bbcbc8b025ebbd6be16727 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 26 Jan 2022 19:32:40 +0100 Subject: [PATCH 0054/1766] Update to the latest Hexagon release --- frameworks/Kotlin/hexagon/build.gradle | 6 ++--- .../hexagon/src/main/kotlin/Settings.kt | 22 +++++++++---------- .../main/kotlin/store/BenchmarkSqlStore.kt | 6 ++--- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index b8d18ca7a89..fe6101d4d62 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,10 +4,10 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.0/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.2/gradle" - hexagonVersion = "2.0.0" - hikariVersion = "5.0.0" + hexagonVersion = "2.0.2" + hikariVersion = "5.0.1" jettyVersion = "11.0.7" postgresqlVersion = "42.3.1" cache2kVersion = "2.4.1.Final" diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index cc1fe17ce0c..53b82c5181d 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -1,9 +1,9 @@ package com.hexagonkt -import com.hexagonkt.core.Jvm.systemSetting +import com.hexagonkt.core.Jvm.systemSettingOrNull data class Settings( - val bindPort: Int = systemSetting("bindPort") ?: 9090, + val bindPort: Int = systemSettingOrNull("bindPort") ?: 9090, val bindAddress: String = "0.0.0.0", val database: String = "hello_world", @@ -13,18 +13,18 @@ data class Settings( val databaseUsername: String = "benchmarkdbuser", val databasePassword: String = "benchmarkdbpass", - val maximumPoolSize: Int = systemSetting("maximumPoolSize") ?: 96, + val maximumPoolSize: Int = systemSettingOrNull("maximumPoolSize") ?: 96, - val webEngine: String = systemSetting("WEBENGINE") ?: "jetty", + val webEngine: String = systemSettingOrNull("WEBENGINE") ?: "jetty", - val worldName: String = systemSetting("worldCollection") ?: "world", - val fortuneName: String = systemSetting("fortuneCollection") ?: "fortune", - val databaseName: String = systemSetting("database") ?: "hello_world", - val databaseDriver: String = systemSetting("databaseDriver") ?: "org.postgresql.Driver", + val worldName: String = systemSettingOrNull("worldCollection") ?: "world", + val fortuneName: String = systemSettingOrNull("fortuneCollection") ?: "fortune", + val databaseName: String = systemSettingOrNull("database") ?: "hello_world", + val databaseDriver: String = systemSettingOrNull("databaseDriver") ?: "org.postgresql.Driver", - val sendDateHeader: Boolean = systemSetting("sendDateHeader") ?: true, - val sendServerVersion: Boolean = systemSetting("sendServerVersion") ?: true, - val sendXPoweredBy: Boolean = systemSetting("sendXPoweredBy") ?: false, + val sendDateHeader: Boolean = systemSettingOrNull("sendDateHeader") ?: true, + val sendServerVersion: Boolean = systemSettingOrNull("sendServerVersion") ?: true, + val sendXPoweredBy: Boolean = systemSettingOrNull("sendXPoweredBy") ?: false, val worldRows: Int = 10_000, val textMessage: String = "Hello, World!", diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index 2c3d20939f7..3a724dd900e 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -21,12 +21,12 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings } private val dataSource: HikariDataSource by lazy { - val dbHost = Jvm.systemSetting("${engine.uppercase()}_DB_HOST") ?: "localhost" - val environment = Jvm.systemSetting(String::class, "BENCHMARK_ENV")?.lowercase() + val dbHost = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost" + val environment = Jvm.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase() val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 val config = HikariConfig().apply { jdbcUrl = "jdbc:postgresql://$dbHost/${settings.databaseName}" - maximumPoolSize = Jvm.systemSetting(Int::class, "maximumPoolSize") ?: poolSize + maximumPoolSize = Jvm.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize driverClassName = settings.databaseDriver username = settings.databaseUsername password = settings.databasePassword From 3a86f43648848ed6c5e8b54afcde37be8d846689 Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Wed, 9 Feb 2022 15:47:22 +0100 Subject: [PATCH 0055/1766] Upgrade to Inverno 1.4.1 --- frameworks/Java/inverno/pom.xml | 2 +- .../inverno/benchmark/internal/Handler.java | 110 ++++++++++-------- .../PooledClientSqlClientReactorScope.java | 67 ----------- ...rScope.java => SqlClientReactorScope.java} | 25 ++-- .../inverno/src/main/java/module-info.java | 3 - 5 files changed, 72 insertions(+), 135 deletions(-) delete mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java rename frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/{PoolSqlClientReactorScope.java => SqlClientReactorScope.java} (70%) diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index 27b2a3a3f5d..296f7d99246 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.2.2 + 1.4.1 com.techempower inverno-benchmark 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/Handler.java index d4a98ecd184..1e7052c275e 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/Handler.java @@ -28,8 +28,10 @@ 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.ExchangeHandler; +import io.inverno.mod.http.server.ExchangeContext; +import io.inverno.mod.http.server.RootExchangeHandler; import io.inverno.mod.sql.SqlClient; +import io.inverno.mod.sql.UnsafeSqlOperations; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.EventLoopGroup; @@ -40,7 +42,7 @@ import reactor.core.publisher.Mono; @Bean( visibility = Visibility.PRIVATE ) -public class Handler implements ExchangeHandler { +public class Handler implements RootExchangeHandler> { private static final String PATH_PLAINTEXT = "/plaintext"; private static final String PATH_JSON = "/json"; @@ -49,12 +51,15 @@ public class Handler implements ExchangeHandler { private static final String PATH_UPDATES = "/updates"; private static final String PATH_FORTUNES = "/fortunes"; + public static final String DB_SELECT_WORLD = "SELECT id, randomnumber from WORLD where id = $1"; + public static final String DB_UPDATE_WORLD = "UPDATE world SET randomnumber=$1 WHERE id=$2"; + public static final String DB_SELECT_FORTUNE = "SELECT id, message from FORTUNE"; + private static final CharSequence STATIC_SERVER = AsciiString.cached("inverno"); private final Reactor reactor; private final ObjectMapper mapper; - private final ReactorScope pooledClientSqlClient; - private final ReactorScope poolSqlClient; + private final ReactorScope> sqlClient; private EventLoopGroup dateEventLoopGroup; @@ -62,13 +67,11 @@ public class Handler implements ExchangeHandler { public Handler(Reactor reactor, ObjectMapper mapper, - ReactorScope pooledClientSqlClient, - ReactorScope poolSqlClient + ReactorScope> sqlClient ) { this.reactor = reactor; this.mapper = mapper; - this.pooledClientSqlClient = pooledClientSqlClient; - this.poolSqlClient = poolSqlClient; + this.sqlClient = sqlClient; } @Init @@ -85,7 +88,7 @@ public void destroy() { } @Override - public void handle(Exchange exchange) throws HttpException { + public void handle(Exchange exchange) throws HttpException { switch(exchange.request().getPath()) { case PATH_PLAINTEXT: { this.handle_plaintext(exchange); @@ -145,7 +148,7 @@ public ByteBuf get() { private static final Mono PLAIN_TEXT_MONO = Mono.fromSupplier(new PlaintextSupplier()); - public void handle_plaintext(Exchange exchange) throws HttpException { + public void handle_plaintext(Exchange exchange) throws HttpException { exchange.response() .headers(h -> h .add(HttpHeaderNames.SERVER, STATIC_SERVER) @@ -158,7 +161,7 @@ public void handle_plaintext(Exchange exchange) throws HttpException { .stream(PLAIN_TEXT_MONO); } - public void handle_json(Exchange exchange) throws HttpException { + public void handle_json(Exchange exchange) throws HttpException { try { exchange.response() .headers(h -> h @@ -175,13 +178,11 @@ public void handle_json(Exchange exchange) throws HttpException { } } - private static final String DB_SELECT_WORLD = "SELECT id, randomnumber from WORLD where id = $1"; - private static int randomWorldId() { return 1 + ThreadLocalRandom.current().nextInt(10000); } - public void handle_db(Exchange exchange) throws HttpException { + public void handle_db(Exchange exchange) throws HttpException { exchange.response() .headers(h -> h .add(HttpHeaderNames.SERVER, STATIC_SERVER) @@ -189,7 +190,8 @@ public void handle_db(Exchange exchange) throws HttpException { .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) ) .body() - .raw().stream(this.pooledClientSqlClient.get().queryForObject( + .raw().stream(this.sqlClient.get().flatMap(client -> + client.queryForObject( DB_SELECT_WORLD, row -> { try { @@ -201,21 +203,21 @@ public void handle_db(Exchange exchange) throws HttpException { }, randomWorldId() ) - ); + )); } private static final String PARAMETER_QUERIES = "queries"; - private int extractQueriesParameter(Exchange exchange) { + private int extractQueriesParameter(Exchange exchange) { try { return Math.min(500, Math.max(1, exchange.request().queryParameters().get(PARAMETER_QUERIES).map(Parameter::asInteger).orElse(1))); } - catch (ConverterException e) { // TODO + catch (ConverterException e) { return 1; } } - public void handle_queries(Exchange exchange) throws HttpException { + public void handle_queries(Exchange exchange) throws HttpException { int queries = this.extractQueriesParameter(exchange); exchange.response() .headers(h -> h @@ -224,12 +226,17 @@ public void handle_queries(Exchange exchange) throws HttpException { .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) ) .body() - .raw().stream(Flux.range(0, queries) - .flatMap(ign -> this.pooledClientSqlClient.get().queryForObject( - DB_SELECT_WORLD, - row -> new World(row.getInteger(0), row.getInteger(1)), - randomWorldId() - )) + .raw().stream(this.sqlClient.get() + .flatMapMany(client -> ((UnsafeSqlOperations)client) + .batchQueries(ops -> + Flux.range(0, queries) + .map(ign -> ops.queryForObject( + DB_SELECT_WORLD, + row -> new World(row.getInteger(0), row.getInteger(1)), + randomWorldId() + )) + ) + ) .collectList() .map(worlds -> { try { @@ -242,27 +249,28 @@ public void handle_queries(Exchange exchange) throws HttpException { ); } - private static final String DB_UPDATE_WORLD = "UPDATE world SET randomnumber=$1 WHERE id=$2"; - - public void handle_updates(Exchange exchange) throws HttpException { + public void handle_updates(Exchange exchange) throws HttpException { int queries = this.extractQueriesParameter(exchange); exchange.response() - .headers(h -> h - .add(HttpHeaderNames.SERVER, STATIC_SERVER) - .add(HttpHeaderNames.DATE, this.date) - .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) - ) - .body() - .raw().stream(this.poolSqlClient.get().connection(ops -> Flux.range(0, queries) - .flatMap(ign -> ops.queryForObject( - DB_SELECT_WORLD, - row -> new World(row.getInteger(0), randomWorldId()), - randomWorldId() - ) - ) + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + ) + .body() + .raw().stream(this.sqlClient.get() + .flatMapMany(client -> Flux.from(((UnsafeSqlOperations)client) + .batchQueries(ops -> + Flux.range(0, queries) + .map(ign -> ops.queryForObject( + DB_SELECT_WORLD, + row -> new World(row.getInteger(0), randomWorldId()), + randomWorldId() + )) + )) .collectSortedList() - .delayUntil(worlds -> ops.batchUpdate( + .delayUntil(worlds -> client.batchUpdate( DB_UPDATE_WORLD, worlds.stream().map(world -> new Object[] { world.getRandomNumber(), world.getId() }) ) @@ -274,16 +282,16 @@ public void handle_updates(Exchange exchange) throws HttpException { catch (JsonProcessingException e) { throw new InternalServerErrorException(e); } - })) - ); + }) + ) + ); } - private static final String DB_SELECT_FORTUNE = "SELECT id, message from FORTUNE"; private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8"); private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer())); - public void handle_fortunes(Exchange exchange) throws HttpException { + public void handle_fortunes(Exchange exchange) throws HttpException { exchange.response() .headers(h -> h .add(HttpHeaderNames.SERVER, STATIC_SERVER) @@ -291,10 +299,12 @@ public void handle_fortunes(Exchange exchange) throws HttpException { .add(HttpHeaderNames.CONTENT_TYPE, MEDIA_TEXT_HTML_UTF8) ) .body() - .raw().stream(Flux.from(this.pooledClientSqlClient.get().query( - DB_SELECT_FORTUNE, - row -> new Fortune(row.getInteger(0), row.getString(1)) - )) + .raw().stream(this.sqlClient.get().flatMapMany(client -> + client.query( + DB_SELECT_FORTUNE, + row -> new Fortune(row.getInteger(0), row.getString(1)) + ) + ) .collectList() .flatMap(fortunes -> { fortunes.add(new Fortune(0, "Additional fortune added at request time.")); diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java deleted file mode 100644 index 06516866c47..00000000000 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PooledClientSqlClientReactorScope.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.techempower.inverno.benchmark.internal; - -import com.techempower.inverno.benchmark.AppConfiguration; - -import io.inverno.core.annotation.Bean; -import io.inverno.core.annotation.Bean.Visibility; -import io.inverno.core.annotation.Destroy; -import io.inverno.core.annotation.Init; -import io.inverno.mod.base.concurrent.Reactor; -import io.inverno.mod.base.concurrent.ReactorScope; -import io.inverno.mod.base.concurrent.VertxReactor; -import io.inverno.mod.sql.SqlClient; -import io.inverno.mod.sql.vertx.PooledClientSqlClient; -import io.vertx.core.Vertx; -import io.vertx.core.VertxOptions; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.pgclient.PgPool; -import io.vertx.sqlclient.PoolOptions; - -@Bean( name = "pooledClientSqlClient", visibility = Visibility.PRIVATE ) -public class PooledClientSqlClientReactorScope extends ReactorScope { - - private final AppConfiguration configuration; - private final Reactor reactor; - - private Vertx vertx; - private PgConnectOptions connectOptions; - private PoolOptions poolOptions; - - public PooledClientSqlClientReactorScope(AppConfiguration configuration, Reactor reactor) { - this.configuration = configuration; - this.reactor = reactor; - } - - @Init - public void init() { - if(this.reactor instanceof VertxReactor) { - this.vertx = ((VertxReactor)this.reactor).getVertx(); - } - else { - this.vertx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(this.configuration.boot().prefer_native_transport())); - } - - this.connectOptions = new PgConnectOptions() - .setHost(this.configuration.db_host()) - .setPort(this.configuration.db_port()) - .setDatabase(this.configuration.db_database()) - .setUser(this.configuration.db_username()) - .setPassword(this.configuration.db_password()) - .setCachePreparedStatements(true); - - this.poolOptions = new PoolOptions().setMaxSize(1); - } - - @Destroy - public void destroy() { - if(!(this.reactor instanceof VertxReactor)) { - this.vertx.close(); - } - } - - @Override - protected SqlClient create() { - return new PooledClientSqlClient(PgPool.client(this.vertx, this.connectOptions, this.poolOptions)); - } - -} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PoolSqlClientReactorScope.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java similarity index 70% rename from frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PoolSqlClientReactorScope.java rename to frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java index 76eed32483b..81b30069ec2 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/PoolSqlClientReactorScope.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java @@ -3,31 +3,30 @@ import com.techempower.inverno.benchmark.AppConfiguration; import io.inverno.core.annotation.Bean; +import io.inverno.core.annotation.Bean.Visibility; import io.inverno.core.annotation.Destroy; import io.inverno.core.annotation.Init; -import io.inverno.core.annotation.Bean.Visibility; import io.inverno.mod.base.concurrent.Reactor; import io.inverno.mod.base.concurrent.ReactorScope; import io.inverno.mod.base.concurrent.VertxReactor; import io.inverno.mod.sql.SqlClient; -import io.inverno.mod.sql.vertx.PoolSqlClient; +import io.inverno.mod.sql.vertx.ConnectionSqlClient; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; import io.vertx.pgclient.PgConnectOptions; -import io.vertx.pgclient.PgPool; -import io.vertx.sqlclient.PoolOptions; +import io.vertx.pgclient.PgConnection; +import reactor.core.publisher.Mono; -@Bean( name = "poolSqlClient", visibility = Visibility.PRIVATE ) -public class PoolSqlClientReactorScope extends ReactorScope { +@Bean( name = "SqlClient", visibility = Visibility.PRIVATE ) +public class SqlClientReactorScope extends ReactorScope> { private final AppConfiguration configuration; private final Reactor reactor; private Vertx vertx; private PgConnectOptions connectOptions; - private PoolOptions poolOptions; - public PoolSqlClientReactorScope(AppConfiguration configuration, Reactor reactor) { + public SqlClientReactorScope(AppConfiguration configuration, Reactor reactor) { this.configuration = configuration; this.reactor = reactor; } @@ -47,9 +46,8 @@ public void init() { .setDatabase(this.configuration.db_database()) .setUser(this.configuration.db_username()) .setPassword(this.configuration.db_password()) - .setCachePreparedStatements(true); - - this.poolOptions = new PoolOptions().setMaxSize(4); + .setCachePreparedStatements(true) + .setPipeliningLimit(100_100); } @Destroy @@ -60,8 +58,7 @@ public void destroy() { } @Override - protected SqlClient create() { - return new PoolSqlClient(PgPool.pool(this.vertx, this.connectOptions, this.poolOptions)); + protected Mono create() { + return Mono.fromCompletionStage(PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()).map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn)).cache(); } - } diff --git a/frameworks/Java/inverno/src/main/java/module-info.java b/frameworks/Java/inverno/src/main/java/module-info.java index 8370bb11766..7f0f44d7b65 100644 --- a/frameworks/Java/inverno/src/main/java/module-info.java +++ b/frameworks/Java/inverno/src/main/java/module-info.java @@ -1,7 +1,4 @@ @io.inverno.core.annotation.Module( excludes = { "io.inverno.mod.sql.vertx" } ) - -@io.inverno.core.annotation.Wire(beans="pooledClientSqlClient", into="handler:pooledClientSqlClient") -@io.inverno.core.annotation.Wire(beans="poolSqlClient", into="handler:poolSqlClient") module com.techempower.inverno.benchmark { requires io.inverno.mod.boot; requires io.inverno.mod.http.server; From a516c0a23bc4ba1c33e8093c6427f5052afa5dd8 Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Wed, 9 Feb 2022 15:50:26 +0100 Subject: [PATCH 0056/1766] Update README.md --- frameworks/Java/inverno/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/inverno/README.md b/frameworks/Java/inverno/README.md index 18f28c8d4ff..b205ef706b6 100755 --- a/frameworks/Java/inverno/README.md +++ b/frameworks/Java/inverno/README.md @@ -13,7 +13,7 @@ ## Important Libraries The tests were run with: * [Java OpenJDK 16](https://openjdk.java.net/) -* [Inverno 1.2.1](https://inverno.io) +* [Inverno 1.4.1](https://inverno.io) ## Test URLs ### JSON From a41e4f629de4b456b73c00c2a1f9921d1356ed9d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 16 Feb 2022 11:32:43 +0100 Subject: [PATCH 0057/1766] Add Netty adapter test --- .../Kotlin/hexagon/benchmark_config.json | 25 ++++++++++++++++++- frameworks/Kotlin/hexagon/build.gradle | 11 ++++---- frameworks/Kotlin/hexagon/config.toml | 20 ++++++++++++++- .../Kotlin/hexagon/hexagon-netty.dockerfile | 25 +++++++++++++++++++ .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- .../hexagon/src/main/kotlin/Benchmark.kt | 18 +++++++------ .../hexagon/src/main/kotlin/Controller.kt | 12 +++++++++ .../hexagon/src/main/kotlin/Settings.kt | 4 +-- 9 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon-netty.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 78527517668..d7186d7d9e8 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -25,6 +25,29 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, + "netty": { + "json_url": "/json", + "db_url": "/postgresql/db", + "query_url": "/postgresql/query?queries=", + "fortune_url": "/postgresql/pebble/fortunes", + "update_url": "/postgresql/update?queries=", + "cached_query_url": "/postgresql/cached?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Netty PostgreSQL", + "notes": "http://hexagonkt.com", + "versus": "netty" + }, "tomcat": { "json_url": "/json", "db_url": "/postgresql/db", @@ -41,7 +64,7 @@ "language": "Kotlin", "orm": "Raw", "platform": "Servlet", - "webserver": "None", + "webserver": "Tomcat", "os": "Linux", "database_os": "Linux", "display_name": "Hexagon Tomcat PostgreSQL", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index fe6101d4d62..dd9480a848c 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,13 +4,13 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.2/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.3/gradle" - hexagonVersion = "2.0.2" + hexagonVersion = "2.0.3" hikariVersion = "5.0.1" - jettyVersion = "11.0.7" - postgresqlVersion = "42.3.1" - cache2kVersion = "2.4.1.Final" + jettyVersion = "11.0.8" + postgresqlVersion = "42.3.3" + cache2kVersion = "2.6.1.Final" } apply(from: "$gradleScripts/kotlin.gradle") @@ -31,6 +31,7 @@ war { installDist.dependsOn("war") dependencies { + implementation("com.hexagonkt:http_server_netty:$hexagonVersion") implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index 886a19b270f..91b846defad 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -19,6 +19,24 @@ platform = "Servlet" webserver = "None" versus = "servlet" +[netty] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/postgresql/db" +urls.query = "/postgresql/query?queries=" +urls.update = "/postgresql/update?queries=" +urls.fortune = "/postgresql/pebble/fortunes" +urls.cached_query = "/postgresql/cached?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "netty" + [tomcat] urls.plaintext = "/plaintext" urls.json = "/json" @@ -34,5 +52,5 @@ database_os = "Linux" os = "Linux" orm = "Raw" platform = "Servlet" -webserver = "None" +webserver = "Tomcat" versus = "servlet" diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile new file mode 100644 index 00000000000..fad88b2d257 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -0,0 +1,25 @@ +# +# BUILD +# +FROM gradle:7.4-jdk11 AS gradle_build +USER root +WORKDIR /hexagon + +COPY src src +COPY build.gradle build.gradle +RUN gradle --quiet + +# +# RUNTIME +# +FROM adoptopenjdk:11-jre-hotspot-bionic +ENV DBSTORE postgresql +ENV POSTGRESQL_DB_HOST tfb-database +ENV WEBENGINE netty +ENV PROJECT hexagon + +COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT + +EXPOSE 9090 + +ENTRYPOINT /opt/$PROJECT/bin/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index ae472669f14..e8ad5a4e2ec 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.2-jdk11 AS gradle_build +FROM gradle:7.4-jdk11 AS gradle_build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 3d1dab5fb55..1c50885a34a 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.3.3-jdk11 AS gradle_build +FROM gradle:7.4-jdk11 AS gradle_build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index 00b895d74ea..70ab0ba2cf2 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -4,12 +4,15 @@ import com.hexagonkt.http.server.HttpServer import com.hexagonkt.http.server.HttpServerPort import com.hexagonkt.http.server.HttpServerSettings import com.hexagonkt.http.server.jetty.JettyServletAdapter +import com.hexagonkt.http.server.netty.NettyServerAdapter import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort import com.hexagonkt.templates.pebble.PebbleAdapter import java.net.InetAddress +internal val settings = Settings() + internal val stores: Map by lazy { mapOf("postgresql" to BenchmarkSqlStore("postgresql")) } @@ -19,21 +22,22 @@ internal val templateEngines: Map by lazy { } private val engines: Map by lazy { - mapOf("jetty" to JettyServletAdapter()) + mapOf( + "jetty" to JettyServletAdapter( + sendDateHeader = settings.sendDateHeader, + sendServerVersion = settings.sendServerVersion, + sendXPoweredBy = settings.sendXPoweredBy, + ), + "netty" to NettyServerAdapter(), + ) } private val server: HttpServer by lazy { - val settings = Settings() val engine = engines[settings.webEngine] ?: error("Unsupported server engine") val controller = Controller(settings, stores, templateEngines) val serverSettings = HttpServerSettings( bindAddress = InetAddress.getByName(settings.bindAddress), bindPort = settings.bindPort, - options = mapOf( - "sendDateHeader" to settings.sendDateHeader, - "sendServerVersion" to settings.sendServerVersion, - "sendXPoweredBy" to settings.sendXPoweredBy, - ), ) HttpServer(engine, controller.path, serverSettings) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 71d770cbb62..1454f9f37cc 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -4,16 +4,19 @@ import com.hexagonkt.core.require import com.hexagonkt.core.media.ApplicationMedia.JSON import com.hexagonkt.core.media.TextMedia.HTML import com.hexagonkt.core.media.TextMedia.PLAIN +import com.hexagonkt.core.multiMapOf import com.hexagonkt.http.model.ContentType import com.hexagonkt.http.server.handlers.HttpServerContext import com.hexagonkt.http.server.handlers.PathHandler import com.hexagonkt.http.server.handlers.path +import com.hexagonkt.http.toHttpFormat import com.hexagonkt.serialization.jackson.json.Json import com.hexagonkt.serialization.serialize import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort import java.net.URL +import java.time.LocalDateTime.now import java.util.concurrent.ThreadLocalRandom import kotlin.text.Charsets.UTF_8 @@ -37,6 +40,15 @@ class Controller( internal val path: PathHandler by lazy { path { + on("*") { + val headers = multiMapOf( + "server" to "Hexagon", + "date" to now().toHttpFormat(), + ) + + send(headers = headers) + } + get("/plaintext") { ok(settings.textMessage, contentType = plain) } get("/json") { ok(Message(settings.textMessage).serialize(Json.raw), contentType = json) } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index 53b82c5181d..e5c9994f856 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -22,8 +22,8 @@ data class Settings( val databaseName: String = systemSettingOrNull("database") ?: "hello_world", val databaseDriver: String = systemSettingOrNull("databaseDriver") ?: "org.postgresql.Driver", - val sendDateHeader: Boolean = systemSettingOrNull("sendDateHeader") ?: true, - val sendServerVersion: Boolean = systemSettingOrNull("sendServerVersion") ?: true, + val sendDateHeader: Boolean = systemSettingOrNull("sendDateHeader") ?: false, + val sendServerVersion: Boolean = systemSettingOrNull("sendServerVersion") ?: false, val sendXPoweredBy: Boolean = systemSettingOrNull("sendXPoweredBy") ?: false, val worldRows: Int = 10_000, From 138c9d30c9ca1d11414fd641f4ed9c3ff005d602 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 16 Feb 2022 11:53:50 +0100 Subject: [PATCH 0058/1766] Remove Gradle Wrapper --- frameworks/Kotlin/hexagon/gradlew | 183 -------------------------- frameworks/Kotlin/hexagon/gradlew.bat | 103 --------------- 2 files changed, 286 deletions(-) delete mode 100755 frameworks/Kotlin/hexagon/gradlew delete mode 100644 frameworks/Kotlin/hexagon/gradlew.bat diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew deleted file mode 100755 index 2fe81a7d95e..00000000000 --- a/frameworks/Kotlin/hexagon/gradlew +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat deleted file mode 100644 index 62bd9b9ccef..00000000000 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ /dev/null @@ -1,103 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -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. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -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. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega From 2ca72bcf914aae64a7beafc4a093a36872626148 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 18 Feb 2022 15:43:03 +0100 Subject: [PATCH 0059/1766] Update version --- frameworks/Kotlin/hexagon/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index dd9480a848c..a6c80ec4975 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,13 +4,13 @@ plugins { } ext { - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/2.0.3/gradle" - - hexagonVersion = "2.0.3" + hexagonVersion = "2.0.4" hikariVersion = "5.0.1" jettyVersion = "11.0.8" postgresqlVersion = "42.3.3" cache2kVersion = "2.6.1.Final" + + gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } apply(from: "$gradleScripts/kotlin.gradle") From 7c1e0607cf9050c4bbcb22781ea62aef269e2647 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 21 Feb 2022 20:43:06 +0100 Subject: [PATCH 0060/1766] Update version --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index a6c80ec4975..b5de5912a03 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,7 +4,7 @@ plugins { } ext { - hexagonVersion = "2.0.4" + hexagonVersion = "2.0.5" hikariVersion = "5.0.1" jettyVersion = "11.0.8" postgresqlVersion = "42.3.3" From 5a0fe666300550792907ada2864eb694ab8af1f2 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 1 Apr 2022 08:08:23 +0200 Subject: [PATCH 0061/1766] Minimize template --- frameworks/Kotlin/hexagon/build.gradle | 10 ++++++++++ frameworks/Kotlin/hexagon/hexagon.dockerfile | 1 + 2 files changed, 11 insertions(+) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index b5de5912a03..50eec566d02 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -44,3 +44,13 @@ dependencies { // providedCompile excludes the dependency only in the WAR, not in the distribution providedCompile("org.eclipse.jetty:jetty-webapp:$jettyVersion") { exclude module: "slf4j-api" } } + +task("minimizeTemplate") { + doLast { + File template = file("$buildDir/resources/main/fortunes.pebble.html") + List lines = template.readLines().collect { it.trim() } + template.write(lines.join("")) + } +} + +assemble.dependsOn("minimizeTemplate") diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 1c50885a34a..4ca671e517d 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -17,6 +17,7 @@ ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE jetty ENV PROJECT hexagon +ENV DISABLE_CHECKS true COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT From 9c200b4391faf5fb2e2fdfaef10ad8ddae7c1db0 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 18 Apr 2022 18:38:20 +0200 Subject: [PATCH 0062/1766] Skip Hexagon checks in the container --- frameworks/Kotlin/hexagon/hexagon-netty.dockerfile | 1 + frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index fad88b2d257..95f35051bc8 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -17,6 +17,7 @@ ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE netty ENV PROJECT hexagon +ENV DISABLE_CHECKS true COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index e8ad5a4e2ec..27b931d8626 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -15,6 +15,7 @@ RUN gradle --quiet FROM tomcat:10.0.14-jre17-temurin ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database +ENV DISABLE_CHECKS true COPY --from=gradle_build /hexagon/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080 From cf21e3c3fa9fab60dae117f3d7b87c1e90b3f83c Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 29 Apr 2022 09:19:45 +0200 Subject: [PATCH 0063/1766] Add Netty Epoll benchmark --- frameworks/Kotlin/hexagon/README.md | 26 ++++++++++++++++--- .../Kotlin/hexagon/benchmark_config.json | 23 ++++++++++++++++ frameworks/Kotlin/hexagon/build.gradle | 11 +++++--- frameworks/Kotlin/hexagon/config.toml | 18 +++++++++++++ .../Kotlin/hexagon/hexagon-netty.dockerfile | 4 +-- .../hexagon/hexagon-nettyepoll.dockerfile | 26 +++++++++++++++++++ .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 4 +-- .../hexagon/src/main/kotlin/Benchmark.kt | 2 ++ 9 files changed, 103 insertions(+), 13 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile diff --git a/frameworks/Kotlin/hexagon/README.md b/frameworks/Kotlin/hexagon/README.md index b83921aecdc..779811d7c31 100644 --- a/frameworks/Kotlin/hexagon/README.md +++ b/frameworks/Kotlin/hexagon/README.md @@ -6,11 +6,11 @@ of web development platforms. The test utilizes Hexagon routes, serialization an ## Tests -You can run tests against any running server passing the `verify.endpoint` project property. I.e.: -`./gradlew verify -Pverify.endpoint=http://host:1234` +You can verify the benchmarks with the following command (from the project root): +`./tfb --mode verify --test hexagon hexagon-jetty hexagon-tomcat hexagon-netty hexagon-nettyepoll` -* [Hexagon Web](src/main/kotlin/com/hexagonkt/Benchmark.kt) -* [Hexagon Storage](src/main/kotlin/com/hexagonkt/BenchmarkStorage.kt) +To run the full benchmarks locally, on the project root (not this directory) execute: +`./tfb --mode benchmark --test hexagon hexagon-jetty hexagon-tomcat hexagon-netty hexagon-nettyepoll` ## Infrastructure Software Versions @@ -31,6 +31,24 @@ and `${TEMPLATE_ENGINE}` with: `pebble` * Database updates: http://localhost:9090/${DB_ENGINE}/update * Database queries: http://localhost:9090/${DB_ENGINE}/query +### Netty + +* JSON Encoding Test: http://localhost:9090/json +* Plain Text Test: http://localhost:9090/plaintext +* Data-Store/Database Mapping Test: http://localhost:9090/${DB_ENGINE}/db?queries=5 +* Fortunes: http://localhost:9090/${DB_ENGINE}/${TEMPLATE_ENGINE}/fortunes +* Database updates: http://localhost:9090/${DB_ENGINE}/update +* Database queries: http://localhost:9090/${DB_ENGINE}/query + +### Netty Epoll + +* JSON Encoding Test: http://localhost:9090/json +* Plain Text Test: http://localhost:9090/plaintext +* Data-Store/Database Mapping Test: http://localhost:9090/${DB_ENGINE}/db?queries=5 +* Fortunes: http://localhost:9090/${DB_ENGINE}/${TEMPLATE_ENGINE}/fortunes +* Database updates: http://localhost:9090/${DB_ENGINE}/update +* Database queries: http://localhost:9090/${DB_ENGINE}/query + ### Tomcat * JSON Encoding Test: http://localhost:8080/json diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index d7186d7d9e8..aa47cabbe96 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -48,6 +48,29 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, + "nettyepoll": { + "json_url": "/json", + "db_url": "/postgresql/db", + "query_url": "/postgresql/query?queries=", + "fortune_url": "/postgresql/pebble/fortunes", + "update_url": "/postgresql/update?queries=", + "cached_query_url": "/postgresql/cached?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Netty Epoll PostgreSQL", + "notes": "http://hexagonkt.com", + "versus": "netty" + }, "tomcat": { "json_url": "/json", "db_url": "/postgresql/db", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 50eec566d02..a247ae755d1 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,14 +1,15 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.6.10" + id "org.jetbrains.kotlin.jvm" version "1.6.21" } ext { - hexagonVersion = "2.0.5" + hexagonVersion = "2.0.7" hikariVersion = "5.0.1" - jettyVersion = "11.0.8" - postgresqlVersion = "42.3.3" + jettyVersion = "11.0.9" + postgresqlVersion = "42.3.4" cache2kVersion = "2.6.1.Final" + nettyVersion = "4.1.76.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } @@ -32,11 +33,13 @@ installDist.dependsOn("war") dependencies { implementation("com.hexagonkt:http_server_netty:$hexagonVersion") + implementation("com.hexagonkt:http_server_netty_epoll:$hexagonVersion") implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") implementation("com.hexagonkt:serialization_jackson_json:$hexagonVersion") + implementation("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") implementation("org.cache2k:cache2k-core:$cache2kVersion") implementation("com.zaxxer:HikariCP:$hikariVersion") implementation("org.postgresql:postgresql:$postgresqlVersion") diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index 91b846defad..edc7c2cf9aa 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -37,6 +37,24 @@ platform = "Netty" webserver = "None" versus = "netty" +[nettyepoll] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/postgresql/db" +urls.query = "/postgresql/query?queries=" +urls.update = "/postgresql/update?queries=" +urls.fortune = "/postgresql/pebble/fortunes" +urls.cached_query = "/postgresql/cached?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "netty" + [tomcat] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index 95f35051bc8..3480f54996e 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.4-jdk11 AS gradle_build +FROM gradle:7.4.2-jdk11 AS gradle_build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet # # RUNTIME # -FROM adoptopenjdk:11-jre-hotspot-bionic +FROM eclipse-temurin:17-jre-alpine ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE netty diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile new file mode 100644 index 00000000000..e97878b9e9e --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -0,0 +1,26 @@ +# +# BUILD +# +FROM gradle:7.4.2-jdk11 AS gradle_build +USER root +WORKDIR /hexagon + +COPY src src +COPY build.gradle build.gradle +RUN gradle --quiet + +# +# RUNTIME +# +FROM eclipse-temurin:17-jre-alpine +ENV DBSTORE postgresql +ENV POSTGRESQL_DB_HOST tfb-database +ENV WEBENGINE netty_epoll +ENV PROJECT hexagon +ENV DISABLE_CHECKS true + +COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT + +EXPOSE 9090 + +ENTRYPOINT /opt/$PROJECT/bin/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 27b931d8626..682ca865413 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.4-jdk11 AS gradle_build +FROM gradle:7.4.2-jdk11 AS gradle_build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 4ca671e517d..8742932ca3b 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.4-jdk11 AS gradle_build +FROM gradle:7.4.2-jdk11 AS gradle_build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet # # RUNTIME # -FROM adoptopenjdk:11-jre-hotspot-bionic +FROM eclipse-temurin:17-jre-alpine ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE jetty diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index 70ab0ba2cf2..e86e894e1ec 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -5,6 +5,7 @@ import com.hexagonkt.http.server.HttpServerPort import com.hexagonkt.http.server.HttpServerSettings import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.http.server.netty.NettyServerAdapter +import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort @@ -29,6 +30,7 @@ private val engines: Map by lazy { sendXPoweredBy = settings.sendXPoweredBy, ), "netty" to NettyServerAdapter(), + "netty_epoll" to NettyEpollServerAdapter(), ) } From 45209e632ccb728fb23715396e2bf4faaa7ad053 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 4 May 2022 07:41:57 +0200 Subject: [PATCH 0064/1766] Database and template improvements --- .../hexagon/src/main/kotlin/Controller.kt | 7 ++++--- .../main/kotlin/store/BenchmarkSqlStore.kt | 20 ++++++++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 1454f9f37cc..199e8588f75 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -55,7 +55,8 @@ class Controller( stores.forEach { (storeEngine, store) -> path("/$storeEngine") { templateEngines.forEach { (templateEngineId, templateEngine) -> - get("/${templateEngineId}/fortunes") { listFortunes(store, templateEngineId, templateEngine) } + val templateUrl = templates.require(templateEngineId) + get("/${templateEngineId}/fortunes") { listFortunes(store, templateUrl, templateEngine) } } get("/db") { dbQuery(store) } @@ -68,13 +69,13 @@ class Controller( } private fun HttpServerContext.listFortunes( - store: BenchmarkStore, templateKind: String, templateAdapter: TemplatePort + store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort ): HttpServerContext { val fortunes = store.findAllFortunes() + Fortune(0, "Additional fortune added at request time.") val sortedFortunes = fortunes.sortedBy { it.message } val context = mapOf("fortunes" to sortedFortunes) - val body = templateAdapter.render(templates.require(templateKind), context) + val body = templateAdapter.render(templateUrl, context) return ok(body, contentType = html) } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index 3a724dd900e..ccab68ddc10 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -24,8 +24,26 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings val dbHost = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost" val environment = Jvm.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase() val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + val postgresqlSettings = listOf( + "useSSL=false", + "jdbcCompliantTruncation=false", + "elideSetAutoCommits=true", + "useLocalSessionState=true", + "cachePrepStmts=true", + "cacheCallableStmts=true", + "alwaysSendSetIsolation=false", + "prepStmtCacheSize=4096", + "cacheServerConfiguration=true", + "prepStmtCacheSqlLimit=2048", + "traceProtocol=false", + "useUnbufferedInput=false", + "useReadAheadInput=false", + "maintainTimeStats=false", + "useServerPrepStmts=true", + "cacheRSMetadata=true" + ).joinToString("&") val config = HikariConfig().apply { - jdbcUrl = "jdbc:postgresql://$dbHost/${settings.databaseName}" + jdbcUrl = "jdbc:postgresql://$dbHost/${settings.databaseName}?$postgresqlSettings" maximumPoolSize = Jvm.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize driverClassName = settings.databaseDriver username = settings.databaseUsername From d687db0db69a1d2253cb6c517ce21c2db852f097 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 4 May 2022 08:50:21 +0200 Subject: [PATCH 0065/1766] Update Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index a247ae755d1..04323e8be2e 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,7 +4,7 @@ plugins { } ext { - hexagonVersion = "2.0.7" + hexagonVersion = "2.0.8" hikariVersion = "5.0.1" jettyVersion = "11.0.9" postgresqlVersion = "42.3.4" From 0875de00638050d7f171275356da72d3fe15ca02 Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Wed, 4 May 2022 09:10:32 +0200 Subject: [PATCH 0066/1766] Update Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index a247ae755d1..04323e8be2e 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,7 +4,7 @@ plugins { } ext { - hexagonVersion = "2.0.7" + hexagonVersion = "2.0.8" hikariVersion = "5.0.1" jettyVersion = "11.0.9" postgresqlVersion = "42.3.4" From d7a1c14f8172c3174a80c785dad18e99c7f7bea8 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 7 May 2022 13:28:10 +0200 Subject: [PATCH 0067/1766] Update DB settings --- frameworks/Kotlin/hexagon/build.gradle | 2 +- .../main/kotlin/store/BenchmarkSqlStore.kt | 21 +++++-------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 04323e8be2e..45fcb70ef33 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -7,7 +7,7 @@ ext { hexagonVersion = "2.0.8" hikariVersion = "5.0.1" jettyVersion = "11.0.9" - postgresqlVersion = "42.3.4" + postgresqlVersion = "42.3.5" cache2kVersion = "2.6.1.Final" nettyVersion = "4.1.76.Final" diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index ccab68ddc10..a7b58ac2d84 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -25,22 +25,11 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings val environment = Jvm.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase() val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 val postgresqlSettings = listOf( - "useSSL=false", - "jdbcCompliantTruncation=false", - "elideSetAutoCommits=true", - "useLocalSessionState=true", - "cachePrepStmts=true", - "cacheCallableStmts=true", - "alwaysSendSetIsolation=false", - "prepStmtCacheSize=4096", - "cacheServerConfiguration=true", - "prepStmtCacheSqlLimit=2048", - "traceProtocol=false", - "useUnbufferedInput=false", - "useReadAheadInput=false", - "maintainTimeStats=false", - "useServerPrepStmts=true", - "cacheRSMetadata=true" + "ssl=false", + "assumeMinServerVersion=12.10", + "databaseMetadataCacheFieldsMiB=8", + "prepareThreshold=1", + "reWriteBatchedInserts=true", ).joinToString("&") val config = HikariConfig().apply { jdbcUrl = "jdbc:postgresql://$dbHost/${settings.databaseName}?$postgresqlSettings" From 33e5726bdf66bcfd85ff7617ff4474994cbc45d9 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 7 Jun 2022 23:01:52 +0200 Subject: [PATCH 0068/1766] Use a single store and template engine to simplify benchmark --- frameworks/Kotlin/hexagon/README.md | 36 ++++++++--------- .../Kotlin/hexagon/benchmark_config.json | 40 +++++++++---------- frameworks/Kotlin/hexagon/build.gradle | 7 ++-- frameworks/Kotlin/hexagon/config.toml | 40 +++++++++---------- .../hexagon/src/main/kotlin/Benchmark.kt | 12 +----- .../hexagon/src/main/kotlin/Controller.kt | 40 +++++++------------ .../src/main/kotlin/WebListenerServer.kt | 10 +++-- .../main/kotlin/store/BenchmarkSqlStore.kt | 4 +- 8 files changed, 83 insertions(+), 106 deletions(-) diff --git a/frameworks/Kotlin/hexagon/README.md b/frameworks/Kotlin/hexagon/README.md index 779811d7c31..11e0c78336e 100644 --- a/frameworks/Kotlin/hexagon/README.md +++ b/frameworks/Kotlin/hexagon/README.md @@ -18,42 +18,38 @@ To run the full benchmarks locally, on the project root (not this directory) exe ## Test URLs -In URLs replace `${DB_ENGINE}` with: `postgresql` - -and `${TEMPLATE_ENGINE}` with: `pebble` - ### Jetty * JSON Encoding Test: http://localhost:9090/json * Plain Text Test: http://localhost:9090/plaintext -* Data-Store/Database Mapping Test: http://localhost:9090/${DB_ENGINE}/db?queries=5 -* Fortunes: http://localhost:9090/${DB_ENGINE}/${TEMPLATE_ENGINE}/fortunes -* Database updates: http://localhost:9090/${DB_ENGINE}/update -* Database queries: http://localhost:9090/${DB_ENGINE}/query +* Data-Store/Database Mapping Test: http://localhost:9090/db?queries=5 +* Fortunes: http://localhost:9090/fortunes +* Database updates: http://localhost:9090/update +* Database queries: http://localhost:9090/query ### Netty * JSON Encoding Test: http://localhost:9090/json * Plain Text Test: http://localhost:9090/plaintext -* Data-Store/Database Mapping Test: http://localhost:9090/${DB_ENGINE}/db?queries=5 -* Fortunes: http://localhost:9090/${DB_ENGINE}/${TEMPLATE_ENGINE}/fortunes -* Database updates: http://localhost:9090/${DB_ENGINE}/update -* Database queries: http://localhost:9090/${DB_ENGINE}/query +* Data-Store/Database Mapping Test: http://localhost:9090/db?queries=5 +* Fortunes: http://localhost:9090/fortunes +* Database updates: http://localhost:9090/update +* Database queries: http://localhost:9090/query ### Netty Epoll * JSON Encoding Test: http://localhost:9090/json * Plain Text Test: http://localhost:9090/plaintext -* Data-Store/Database Mapping Test: http://localhost:9090/${DB_ENGINE}/db?queries=5 -* Fortunes: http://localhost:9090/${DB_ENGINE}/${TEMPLATE_ENGINE}/fortunes -* Database updates: http://localhost:9090/${DB_ENGINE}/update -* Database queries: http://localhost:9090/${DB_ENGINE}/query +* Data-Store/Database Mapping Test: http://localhost:9090/db?queries=5 +* Fortunes: http://localhost:9090/fortunes +* Database updates: http://localhost:9090/update +* Database queries: http://localhost:9090/query ### Tomcat * JSON Encoding Test: http://localhost:8080/json * Plain Text Test: http://localhost:8080/plaintext -* Data-Store/Database Mapping Test: http://localhost:8080/${DB_ENGINE}/db?queries=5 -* Fortunes: http://localhost:8080/${DB_ENGINE}/${TEMPLATE_ENGINE}/fortunes -* Database updates: http://localhost:8080/${DB_ENGINE}/update -* Database queries: http://localhost:8080/${DB_ENGINE}/query +* Data-Store/Database Mapping Test: http://localhost:8080/db?queries=5 +* Fortunes: http://localhost:8080/fortunes +* Database updates: http://localhost:8080/update +* Database queries: http://localhost:8080/query diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index aa47cabbe96..fd4254a3355 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -4,11 +4,11 @@ { "default": { "json_url": "/json", - "db_url": "/postgresql/db", - "query_url": "/postgresql/query?queries=", - "fortune_url": "/postgresql/pebble/fortunes", - "update_url": "/postgresql/update?queries=", - "cached_query_url": "/postgresql/cached?count=", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", @@ -27,11 +27,11 @@ }, "netty": { "json_url": "/json", - "db_url": "/postgresql/db", - "query_url": "/postgresql/query?queries=", - "fortune_url": "/postgresql/pebble/fortunes", - "update_url": "/postgresql/update?queries=", - "cached_query_url": "/postgresql/cached?count=", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", @@ -50,11 +50,11 @@ }, "nettyepoll": { "json_url": "/json", - "db_url": "/postgresql/db", - "query_url": "/postgresql/query?queries=", - "fortune_url": "/postgresql/pebble/fortunes", - "update_url": "/postgresql/update?queries=", - "cached_query_url": "/postgresql/cached?count=", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", @@ -73,11 +73,11 @@ }, "tomcat": { "json_url": "/json", - "db_url": "/postgresql/db", - "query_url": "/postgresql/query?queries=", - "fortune_url": "/postgresql/pebble/fortunes", - "update_url": "/postgresql/update?queries=", - "cached_query_url": "/postgresql/cached?count=", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 45fcb70ef33..e0eb8da23d1 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,12 +4,12 @@ plugins { } ext { - hexagonVersion = "2.0.8" + hexagonVersion = "2.0.10" hikariVersion = "5.0.1" jettyVersion = "11.0.9" - postgresqlVersion = "42.3.5" + postgresqlVersion = "42.3.6" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.76.Final" + nettyVersion = "4.1.77.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } @@ -32,7 +32,6 @@ war { installDist.dependsOn("war") dependencies { - implementation("com.hexagonkt:http_server_netty:$hexagonVersion") implementation("com.hexagonkt:http_server_netty_epoll:$hexagonVersion") implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index edc7c2cf9aa..ad228b9203e 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -4,11 +4,11 @@ name = "hexagon" [main] urls.plaintext = "/plaintext" urls.json = "/json" -urls.db = "/postgresql/db" -urls.query = "/postgresql/query?queries=" -urls.update = "/postgresql/update?queries=" -urls.fortune = "/postgresql/pebble/fortunes" -urls.cached_query = "/postgresql/cached?count=" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" approach = "Realistic" classification = "Micro" database = "postgres" @@ -22,11 +22,11 @@ versus = "servlet" [netty] urls.plaintext = "/plaintext" urls.json = "/json" -urls.db = "/postgresql/db" -urls.query = "/postgresql/query?queries=" -urls.update = "/postgresql/update?queries=" -urls.fortune = "/postgresql/pebble/fortunes" -urls.cached_query = "/postgresql/cached?count=" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" approach = "Realistic" classification = "Micro" database = "postgres" @@ -40,11 +40,11 @@ versus = "netty" [nettyepoll] urls.plaintext = "/plaintext" urls.json = "/json" -urls.db = "/postgresql/db" -urls.query = "/postgresql/query?queries=" -urls.update = "/postgresql/update?queries=" -urls.fortune = "/postgresql/pebble/fortunes" -urls.cached_query = "/postgresql/cached?count=" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" approach = "Realistic" classification = "Micro" database = "postgres" @@ -58,11 +58,11 @@ versus = "netty" [tomcat] urls.plaintext = "/plaintext" urls.json = "/json" -urls.db = "/postgresql/db" -urls.query = "/postgresql/query?queries=" -urls.update = "/postgresql/update?queries=" -urls.fortune = "/postgresql/pebble/fortunes" -urls.cached_query = "/postgresql/cached?count=" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" approach = "Realistic" classification = "Micro" database = "postgres" diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index e86e894e1ec..310bbb81c0a 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -7,21 +7,11 @@ import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.http.server.netty.NettyServerAdapter import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.store.BenchmarkStore -import com.hexagonkt.templates.TemplatePort import com.hexagonkt.templates.pebble.PebbleAdapter import java.net.InetAddress internal val settings = Settings() -internal val stores: Map by lazy { - mapOf("postgresql" to BenchmarkSqlStore("postgresql")) -} - -internal val templateEngines: Map by lazy { - mapOf("pebble" to PebbleAdapter) -} - private val engines: Map by lazy { mapOf( "jetty" to JettyServletAdapter( @@ -36,7 +26,7 @@ private val engines: Map by lazy { private val server: HttpServer by lazy { val engine = engines[settings.webEngine] ?: error("Unsupported server engine") - val controller = Controller(settings, stores, templateEngines) + val controller = Controller(settings, BenchmarkSqlStore("postgresql"), PebbleAdapter) val serverSettings = HttpServerSettings( bindAddress = InetAddress.getByName(settings.bindAddress), bindPort = settings.bindPort, diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 199e8588f75..2c82ad706b8 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -1,11 +1,11 @@ package com.hexagonkt -import com.hexagonkt.core.require import com.hexagonkt.core.media.ApplicationMedia.JSON import com.hexagonkt.core.media.TextMedia.HTML import com.hexagonkt.core.media.TextMedia.PLAIN -import com.hexagonkt.core.multiMapOf import com.hexagonkt.http.model.ContentType +import com.hexagonkt.http.model.Header +import com.hexagonkt.http.model.HttpFields import com.hexagonkt.http.server.handlers.HttpServerContext import com.hexagonkt.http.server.handlers.PathHandler import com.hexagonkt.http.server.handlers.path @@ -23,8 +23,8 @@ import kotlin.text.Charsets.UTF_8 class Controller( settings: Settings, - stores: Map, - templateEngines: Map, + store: BenchmarkStore, + templateEngine: TemplatePort, ) { private val queriesParam: String = settings.queriesParam private val cachedQueriesParam: String = settings.cachedQueriesParam @@ -34,37 +34,25 @@ class Controller( private val json: ContentType = ContentType(JSON) private val html: ContentType = ContentType(HTML, charset = UTF_8) - private val templates: Map = mapOf( - "pebble" to URL("classpath:fortunes.pebble.html") + private val templateUrl: URL = URL("classpath:fortunes.pebble.html") + + private val headers = HttpFields( + Header("server", "Hexagon"), ) internal val path: PathHandler by lazy { path { on("*") { - val headers = multiMapOf( - "server" to "Hexagon", - "date" to now().toHttpFormat(), - ) - - send(headers = headers) + send(headers = headers + Header("date", now().toHttpFormat())) } get("/plaintext") { ok(settings.textMessage, contentType = plain) } get("/json") { ok(Message(settings.textMessage).serialize(Json.raw), contentType = json) } - - stores.forEach { (storeEngine, store) -> - path("/$storeEngine") { - templateEngines.forEach { (templateEngineId, templateEngine) -> - val templateUrl = templates.require(templateEngineId) - get("/${templateEngineId}/fortunes") { listFortunes(store, templateUrl, templateEngine) } - } - - get("/db") { dbQuery(store) } - get("/query") { getWorlds(store) } - get("/cached") { getCachedWorlds(store) } - get("/update") { updateWorlds(store) } - } - } + get("/fortunes") { listFortunes(store, templateUrl, templateEngine) } + get("/db") { dbQuery(store) } + get("/query") { getWorlds(store) } + get("/cached-queries") { getCachedWorlds(store) } + get("/update") { updateWorlds(store) } } } diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index eec6f2571d3..d269138faec 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -1,20 +1,24 @@ package com.hexagonkt -import com.hexagonkt.core.multiMapOf +import com.hexagonkt.http.model.Header +import com.hexagonkt.http.model.HttpFields import com.hexagonkt.http.server.handlers.HttpHandler import com.hexagonkt.http.server.handlers.OnHandler import com.hexagonkt.http.server.servlet.ServletServer +import com.hexagonkt.store.BenchmarkSqlStore +import com.hexagonkt.templates.pebble.PebbleAdapter import jakarta.servlet.annotation.WebListener @WebListener class WebListenerServer(settings: Settings = Settings()) : ServletServer(createHandlers(settings)) { private companion object { + val headers = HttpFields(Header("server", "Tomcat")) fun createHandlers(settings: Settings): List { - val controller = Controller(settings, stores, templateEngines) + val controller = Controller(settings, BenchmarkSqlStore("postgresql"), PebbleAdapter) val controllerPath = controller.path val serverHeaderHandler = OnHandler("*") { - send(headers = multiMapOf("server" to "Tomcat")) + send(headers = headers) } return listOf(serverHeaderHandler, controllerPath) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index a7b58ac2d84..f2d68d7cb6c 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -42,12 +42,12 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings } override fun findAllFortunes(): List { - val fortunes = mutableListOf() + var fortunes = listOf() dataSource.connection.use { con: Connection -> val rs = con.prepareStatement(SELECT_ALL_FORTUNES).executeQuery() while (rs.next()) - fortunes += Fortune(rs.getInt(1), rs.getString(2)) + fortunes = fortunes + Fortune(rs.getInt(1), rs.getString(2)) } return fortunes From fb135f1ab283caaab91c742cd7dd114fb3077f9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 06:32:27 +0000 Subject: [PATCH 0069/1766] 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] --- frameworks/Java/wicket/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/wicket/pom.xml b/frameworks/Java/wicket/pom.xml index 8c8473d6ab0..ec30df52f27 100644 --- a/frameworks/Java/wicket/pom.xml +++ b/frameworks/Java/wicket/pom.xml @@ -64,7 +64,7 @@ mysql mysql-connector-java - 8.0.27 + 8.0.28 From 1192a06038bf88da2fc4c8e41a65e33734836a0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jun 2022 17:27:10 +0000 Subject: [PATCH 0070/1766] 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] --- 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 98e5d550d4c..a3ff499ca84 100644 --- a/frameworks/Java/javalin/pom.xml +++ b/frameworks/Java/javalin/pom.xml @@ -16,7 +16,7 @@ 2.12.6.1 4.0.2 42.3.3 - 4.2.0 + 4.2.1 3.1.5 From 310167b127eb1d7d31bc1543fa28ea24ec210c1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:32:15 +0000 Subject: [PATCH 0071/1766] 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] --- 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 5d52022437d..a9d791c7b47 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -2,6 +2,6 @@ asyncpg==0.25.0 gunicorn==20.1.0 Jinja2==3.1.2 starlette==0.19.1 -ujson==5.2.0 +ujson==5.4.0 uvicorn==0.17.6 uvloop==0.16.0 From 37e0005e273f2d1cb607a564da4d9943e3e98da3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:40:09 +0000 Subject: [PATCH 0072/1766] 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] --- 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 e9c9255cbcb..0c8cdd97725 100644 --- a/frameworks/Python/django/requirements.txt +++ b/frameworks/Python/django/requirements.txt @@ -5,4 +5,4 @@ meinheld==1.0.2 mysqlclient==1.4.6 psycopg2==2.8.6 pytz==2020.4 -ujson==5.2.0 \ No newline at end of file +ujson==5.4.0 \ No newline at end of file From 9d1378cde62f3a87fe810e5e10c7ef212a69cfe3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:40:11 +0000 Subject: [PATCH 0073/1766] 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] --- 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 9080a3c642b..7b68e45f102 100644 --- a/frameworks/Python/routerling/requirements.txt +++ b/frameworks/Python/routerling/requirements.txt @@ -6,6 +6,6 @@ h11==0.12.0 Jinja2==3.0.1 MarkupSafe==2.0.1 routerling==0.3.1 -ujson==5.2.0 +ujson==5.4.0 uvloop==0.16.0 uvicorn==0.14.0 From e0bb50bc632dd80144d0a50c6ab1444119e21151 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:44:16 +0000 Subject: [PATCH 0074/1766] 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] --- frameworks/Python/japronto/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/japronto/requirements.txt b/frameworks/Python/japronto/requirements.txt index 2990ff079ea..a28213a7c90 100644 --- a/frameworks/Python/japronto/requirements.txt +++ b/frameworks/Python/japronto/requirements.txt @@ -1,2 +1,2 @@ git+https://github.com/squeaky-pl/japronto.git#egg=japronto -ujson==5.2.0 +ujson==5.4.0 From 5299732a41c300aa60f40aa502e3a70d11fbb29b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:45:58 +0000 Subject: [PATCH 0075/1766] 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] --- 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 e53fe307dd3..dc928416e92 100644 --- a/frameworks/Python/fastapi/requirements.txt +++ b/frameworks/Python/fastapi/requirements.txt @@ -2,7 +2,7 @@ asyncpg==0.21.0 gunicorn==20.0.4 Jinja2==2.11.3 markupsafe==2.0.1 -ujson==5.2.0 +ujson==5.4.0 uvloop==0.14.0 uvicorn==0.11.3 fastapi==0.65.2 From 8dffc32f73cbad2c3d5a7e1a2bf4bbf50cf885de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:47:15 +0000 Subject: [PATCH 0076/1766] 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] --- 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 5eabe2676f4..e2bb7f3304a 100644 --- a/frameworks/Python/uvicorn/requirements.txt +++ b/frameworks/Python/uvicorn/requirements.txt @@ -1,6 +1,6 @@ asyncpg==0.21.0 gunicorn==20.0.4 Jinja2==3.0.3 -ujson==5.2.0 +ujson==5.4.0 uvloop==0.14.0 uvicorn==0.11.7 From cf9a280f5a762ccfe7027da718b88c69d6f82e0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:52:09 +0000 Subject: [PATCH 0077/1766] 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] --- frameworks/Python/flask/requirements-pypy.txt | 2 +- frameworks/Python/flask/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Python/flask/requirements-pypy.txt b/frameworks/Python/flask/requirements-pypy.txt index 756f6e93297..132102fdc92 100644 --- a/frameworks/Python/flask/requirements-pypy.txt +++ b/frameworks/Python/flask/requirements-pypy.txt @@ -11,4 +11,4 @@ MarkupSafe==2.0.1 meinheld==1.0.2 uWSGI==2.0.19.1 Werkzeug==2.0.1 -ujson==5.2.0 \ No newline at end of file +ujson==5.4.0 \ No newline at end of file diff --git a/frameworks/Python/flask/requirements.txt b/frameworks/Python/flask/requirements.txt index 744b623e065..89d3bb2e297 100644 --- a/frameworks/Python/flask/requirements.txt +++ b/frameworks/Python/flask/requirements.txt @@ -12,5 +12,5 @@ MarkupSafe==2.0.1 meinheld==1.0.2 uWSGI==2.0.19.1 Werkzeug==2.0.1 -ujson==5.2.0 +ujson==5.4.0 orjson==3.6.0 From a4fe6ec04baa58a1c9264c4ec58310cb4fc98996 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:57:17 +0000 Subject: [PATCH 0078/1766] 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] --- 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 b11893aec72..aea8aff7754 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -5,5 +5,5 @@ gunicorn==20.1 jinja2==3.0.3 psycopg2==2.9.2 SQLAlchemy==1.4.29 -ujson==5.1 +ujson==5.4.0 uvloop==0.16 From 31887ce0e5e9e7ef1dc69f4f7f60ea588e84c9e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Jul 2022 11:43:52 +0000 Subject: [PATCH 0079/1766] 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] --- 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 819c83670c6..dfc9e4fd60e 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -80,7 +80,7 @@ GEM listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.13.0) + loofah (2.18.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -139,7 +139,7 @@ GEM rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.4.2) + rails-html-sanitizer (1.4.3) loofah (~> 2.3) railties (7.0.1) actionpack (= 7.0.1) From 8534e0eb2c8b8d6b69be037dd686715ee23e41ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Jul 2022 22:15:33 +0000 Subject: [PATCH 0080/1766] 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] --- frameworks/Java/jetty/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/jetty/pom.xml b/frameworks/Java/jetty/pom.xml index c860b1d4bf4..79112565a05 100644 --- a/frameworks/Java/jetty/pom.xml +++ b/frameworks/Java/jetty/pom.xml @@ -11,7 +11,7 @@ UTF-8 11 11 - 9.4.41.v20210516 + 10.0.10 hello.handler.HelloWebServer From 32f13be742dd857ad7e96e9c758b25c41e879359 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Jul 2022 21:34:24 +0000 Subject: [PATCH 0081/1766] 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] --- 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 61f2251bff3..6d766169f9c 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -19,7 +19,7 @@ 3.2.1 0.9.6 42.3.3 - 2.2.11.Final + 2.2.15.Final From fc3dfc1c41713e1671015fd4c59401bc84c9ff1d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 19 Jul 2022 18:49:14 +0200 Subject: [PATCH 0082/1766] Update versions --- frameworks/Kotlin/hexagon/build.gradle | 10 +++++----- frameworks/Kotlin/hexagon/hexagon-netty.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 4 ++-- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index e0eb8da23d1..8ee07ba3ca1 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,15 +1,15 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.6.21" + id "org.jetbrains.kotlin.jvm" version "1.7.10" } ext { - hexagonVersion = "2.0.10" + hexagonVersion = "2.0.17" hikariVersion = "5.0.1" - jettyVersion = "11.0.9" - postgresqlVersion = "42.3.6" + jettyVersion = "11.0.11" + postgresqlVersion = "42.4.0" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.77.Final" + nettyVersion = "4.1.79.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index 3480f54996e..579a9402136 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.4.2-jdk11 AS gradle_build +FROM gradle:7.5.0-jdk17-alpine AS gradle_build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index e97878b9e9e..e9caab6bc32 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.4.2-jdk11 AS gradle_build +FROM gradle:7.5.0-jdk17-alpine AS gradle_build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 682ca865413..5134fedad4c 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.4.2-jdk11 AS gradle_build +FROM gradle:7.5.0-jdk17-alpine AS gradle_build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet # # RUNTIME # -FROM tomcat:10.0.14-jre17-temurin +FROM tomcat:10.1.0-jre17-temurin ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV DISABLE_CHECKS true diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 8742932ca3b..465f2d82146 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.4.2-jdk11 AS gradle_build +FROM gradle:7.5.0-jdk17-alpine AS gradle_build USER root WORKDIR /hexagon From d7715ab8c0886e4f858b230f81f49972671be6ef Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Wed, 20 Jul 2022 10:56:28 +0200 Subject: [PATCH 0083/1766] Update README.md --- frameworks/Kotlin/hexagon/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/README.md b/frameworks/Kotlin/hexagon/README.md index 11e0c78336e..28397711a58 100644 --- a/frameworks/Kotlin/hexagon/README.md +++ b/frameworks/Kotlin/hexagon/README.md @@ -2,7 +2,7 @@ # Hexagon Benchmarking Test This is the Hexagon portion of a [benchmarking test suite](../../../README.md) comparing a variety -of web development platforms. The test utilizes Hexagon routes, serialization and database access. +of web development platforms. The test utilizes Hexagon routes and serialization. ## Tests From a1db1c88c79fc93c64f7e5f33b355df0748f73bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:21:44 +0000 Subject: [PATCH 0084/1766] 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] --- 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 13b48a818a3..36f8d2c8246 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 -sanic==22.3.1 +sanic==22.6.1 uvloop==0.16.0 From 6325b02dcb6fb9188f6f9406319bcc05e3c97ca3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:24 +0000 Subject: [PATCH 0085/1766] 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] --- 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 14cf18d003c..ebe3634dc9d 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -28,7 +28,7 @@ 2.2.15.Final 3.3.1 8.0.28 - 42.3.3 + 42.4.1 1.8.4 0.9.6 3.8.0 From 382854885dc78c7aa2a1a68ddbcd57fc64a59853 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:24 +0000 Subject: [PATCH 0086/1766] 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] --- 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 57b2e1c9c6b..eed7ef401d9 100644 --- a/frameworks/Java/rapidoid/pom.xml +++ b/frameworks/Java/rapidoid/pom.xml @@ -28,7 +28,7 @@ org.postgresql postgresql - 42.3.3 + 42.4.1 com.zaxxer From 7c3305d41807547cdb3c9dbcf1a351eb37b8395a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:24 +0000 Subject: [PATCH 0087/1766] 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] --- 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 efb0b9d81c9..8839413f957 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -14,7 +14,7 @@ 2.9.5 4.1.77.Final 1.9.5 - 42.3.3 + 42.4.1 UTF-8 11 11 From f0d8e988577bcfceab0797cabbc64417cd33da06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:24 +0000 Subject: [PATCH 0088/1766] 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] --- 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 631fb2788b5..fd63f64978f 100644 --- a/frameworks/Java/servlet/pom.xml +++ b/frameworks/Java/servlet/pom.xml @@ -108,7 +108,7 @@ org.postgresql postgresql - 42.3.3 + 42.4.1 From 70aebd078421c6bb86db9d806484ab56be9c899d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:25 +0000 Subject: [PATCH 0089/1766] 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] --- 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 e0e17a2cdef..43b7bedcaef 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.3.3 + 42.4.1 0.11.4 0.2.4 1.0.0.M7 From 9bddbe971e80e5ea2d976b5dc6484b45170c75cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:25 +0000 Subject: [PATCH 0090/1766] 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] --- 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 9bd1b1f1af3..1c48ccf3ea4 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -56,7 +56,7 @@ org.postgresql postgresql - 42.3.3 + 42.4.1 From 58b628d75de475b623cc1a53d1b37288505e63e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:25 +0000 Subject: [PATCH 0091/1766] 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] --- 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 a27f7409769..c65ea1dfce7 100644 --- a/frameworks/Java/act/pom.xml +++ b/frameworks/Java/act/pom.xml @@ -70,7 +70,7 @@ 1.8 5.1.47 - 42.3.3 + 42.4.1 1.3.2 3.4 com.techempower.act.AppEntry From 1f8d756e10dc72057d0af9541e204624e47a6594 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:27 +0000 Subject: [PATCH 0092/1766] 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] --- 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 51160f7f72a..0dfc7bc9f84 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -13,7 +13,7 @@ 2.9.5 - 42.3.3 + 42.4.1 UTF-8 11 11 From 468cb594cffe85e37cfa65aa94b8576600ed5ab2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:56:27 +0000 Subject: [PATCH 0093/1766] 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] --- 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 8fcbeb3c6b6..319c13f37ff 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.3.3 + 42.4.1 3.8.0 3.1.0 3.1.1 From ee593a29ca8d3c9a8d2850b68daa7fb3100fea02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 05:59:58 +0000 Subject: [PATCH 0094/1766] 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] --- 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 291ff8be9a2..8699552d1ba 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -10,7 +10,7 @@ UTF-8 3.3.1 - 42.3.3 + 42.4.1 2.9.90 From 03ca6af0c9aa1aad7231fe25f7da0f482cb4d766 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 06:07:01 +0000 Subject: [PATCH 0095/1766] 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] --- 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 f13755d14d7..080c2cf7ae3 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.0 + 42.4.1 2.2.18.Final From 36ae7377838e58e6202b4b95eca0ac8b51c6043c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Aug 2022 07:04:23 +0000 Subject: [PATCH 0096/1766] 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] --- 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 b891cc71479..ab847c5b2c0 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -20,7 +20,7 @@ 5.0.0 1.2.4 8.0.28 - 42.2.23 + 42.4.1 From b851884430cda491cebc1251a71f6bad294a223d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 6 Aug 2022 13:34:08 +0200 Subject: [PATCH 0097/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 8ee07ba3ca1..1b41c2be7ce 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -7,7 +7,7 @@ ext { hexagonVersion = "2.0.17" hikariVersion = "5.0.1" jettyVersion = "11.0.11" - postgresqlVersion = "42.4.0" + postgresqlVersion = "42.4.1" cache2kVersion = "2.6.1.Final" nettyVersion = "4.1.79.Final" From 4759c4c0335c1767d59b89b27f0f5dcff2a77646 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Aug 2022 19:09:33 +0000 Subject: [PATCH 0098/1766] 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] --- 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 ebe3634dc9d..499d698332b 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -25,7 +25,7 @@ 11 2.0.1 1.2.3 - 2.2.15.Final + 2.2.19.Final 3.3.1 8.0.28 42.4.1 From be64e352cfd44ca7acd5c5e6664f3ddbae19ab88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Aug 2022 19:09:43 +0000 Subject: [PATCH 0099/1766] 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] --- 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 080c2cf7ae3..7244e5c4253 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -20,7 +20,7 @@ 3.2.2 0.9.10 42.4.1 - 2.2.18.Final + 2.2.19.Final From 05f31bfb8e1a32e5625fe7f95d2071591ded31c5 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 8 Sep 2022 17:11:53 +0200 Subject: [PATCH 0100/1766] Delete Gradle Wrapper --- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - frameworks/Kotlin/hexagon/gradlew | 234 ------------------ frameworks/Kotlin/hexagon/gradlew.bat | 89 ------- 4 files changed, 328 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar delete mode 100644 frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties delete mode 100755 frameworks/Kotlin/hexagon/gradlew delete mode 100644 frameworks/Kotlin/hexagon/gradlew.bat diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 41d9927a4d4fb3f96a785543079b8df6723c946b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59821 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 diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 41dfb87909a..00000000000 --- a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew deleted file mode 100755 index 1b6c787337f..00000000000 --- a/frameworks/Kotlin/hexagon/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat deleted file mode 100644 index 107acd32c4e..00000000000 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "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. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -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. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega From 189e19de6cc85450cc23fd23237e9cd75899a324 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 8 Sep 2022 22:42:39 +0200 Subject: [PATCH 0101/1766] Use different JSON serializer --- frameworks/Kotlin/hexagon/build.gradle | 8 +++--- .../hexagon/src/main/kotlin/Controller.kt | 28 +++++++++++++++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 1b41c2be7ce..4d3e714d3f4 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,12 +4,12 @@ plugins { } ext { - hexagonVersion = "2.0.17" + hexagonVersion = "2.0.22" hikariVersion = "5.0.1" jettyVersion = "11.0.11" - postgresqlVersion = "42.4.1" + postgresqlVersion = "42.5.0" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.79.Final" + nettyVersion = "4.1.80.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } @@ -36,7 +36,7 @@ dependencies { implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") implementation("com.hexagonkt:templates_pebble:$hexagonVersion") implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") - implementation("com.hexagonkt:serialization_jackson_json:$hexagonVersion") + implementation("com.hexagonkt:serialization_dsl_json:$hexagonVersion") implementation("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") implementation("org.cache2k:cache2k-core:$cache2kVersion") diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index 2c82ad706b8..b805071c521 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -1,5 +1,6 @@ package com.hexagonkt +import com.hexagonkt.core.fieldsMapOf import com.hexagonkt.core.media.ApplicationMedia.JSON import com.hexagonkt.core.media.TextMedia.HTML import com.hexagonkt.core.media.TextMedia.PLAIN @@ -10,7 +11,7 @@ import com.hexagonkt.http.server.handlers.HttpServerContext import com.hexagonkt.http.server.handlers.PathHandler import com.hexagonkt.http.server.handlers.path import com.hexagonkt.http.toHttpFormat -import com.hexagonkt.serialization.jackson.json.Json +import com.hexagonkt.serialization.dsl.json.Json import com.hexagonkt.serialization.serialize import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort @@ -47,7 +48,7 @@ class Controller( } get("/plaintext") { ok(settings.textMessage, contentType = plain) } - get("/json") { ok(Message(settings.textMessage).serialize(Json.raw), contentType = json) } + get("/json") { ok(Message(settings.textMessage).toMap().serialize(Json.raw), contentType = json) } get("/fortunes") { listFortunes(store, templateUrl, templateEngine) } get("/db") { dbQuery(store) } get("/query") { getWorlds(store) } @@ -71,7 +72,7 @@ class Controller( private fun HttpServerContext.dbQuery(store: BenchmarkStore): HttpServerContext { val ids = listOf(randomWorld()) val worlds = store.findWorlds(ids) - val world = worlds.first() + val world = worlds.first().toMap() return sendJson(world) } @@ -79,7 +80,7 @@ class Controller( private fun HttpServerContext.getWorlds(store: BenchmarkStore): HttpServerContext { val worldsCount = getWorldsCount(queriesParam) val ids = (1..worldsCount).map { randomWorld() } - val worlds = store.findWorlds(ids) + val worlds = store.findWorlds(ids).map { it.toMap() } return sendJson(worlds) } @@ -87,7 +88,7 @@ class Controller( private fun HttpServerContext.getCachedWorlds(store: BenchmarkStore): HttpServerContext { val worldsCount = getWorldsCount(cachedQueriesParam) val ids = (1..worldsCount).map { randomWorld() } - val worlds = store.findCachedWorlds(ids) + val worlds = store.findCachedWorlds(ids).map { it.toMap() } return sendJson(worlds) } @@ -98,7 +99,7 @@ class Controller( store.replaceWorlds(worlds) - return sendJson(worlds) + return sendJson(worlds.map { it.toMap() }) } private fun HttpServerContext.sendJson(body: Any): HttpServerContext = @@ -116,4 +117,19 @@ class Controller( private fun randomWorld(): Int = ThreadLocalRandom.current().nextInt(worldRows) + 1 + + private fun Message.toMap(): Map = + fieldsMapOf(Message::message to message) + + private fun World.toMap(): Map = + fieldsMapOf( + World::id to id, + World::randomNumber to randomNumber, + ) + + private fun CachedWorld.toMap(): Map = + fieldsMapOf( + CachedWorld::id to id, + CachedWorld::randomNumber to randomNumber, + ) } From 5e47af8fcd3b54154c169473195e2409c80cd75d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 8 Sep 2022 22:53:18 +0200 Subject: [PATCH 0102/1766] Restore non Hexagon files --- frameworks/Java/dropwizard/pom.xml | 2 +- frameworks/Python/sanic/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/dropwizard/pom.xml b/frameworks/Java/dropwizard/pom.xml index 319c13f37ff..8fcbeb3c6b6 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.1 + 42.3.3 3.8.0 3.1.0 3.1.1 diff --git a/frameworks/Python/sanic/requirements.txt b/frameworks/Python/sanic/requirements.txt index 36f8d2c8246..13b48a818a3 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 -sanic==22.6.1 +sanic==22.3.1 uvloop==0.16.0 From 67f6bf1a1794ee0450c3654cd23f7dba733ebdba Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 8 Sep 2022 23:25:40 +0200 Subject: [PATCH 0103/1766] Update Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 4d3e714d3f4..fd9276185c4 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,7 +4,7 @@ plugins { } ext { - hexagonVersion = "2.0.22" + hexagonVersion = "2.0.23" hikariVersion = "5.0.1" jettyVersion = "11.0.11" postgresqlVersion = "42.5.0" From c2f187e8661ed5673a0e014a085848118ee9eb56 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 8 Sep 2022 23:45:00 +0200 Subject: [PATCH 0104/1766] Run pipeline From 61b499fbb3b447c38034566337db100c2ee8ad49 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 9 Sep 2022 08:19:30 +0200 Subject: [PATCH 0105/1766] Run pipeline From 4422de8915e70cdca67a07c2e0fdb0610757924b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 03:28:55 +0000 Subject: [PATCH 0106/1766] 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] --- frameworks/Rust/axum/Cargo.lock | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index f7ced7468a4..dd0590e28d8 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -123,9 +123,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f44a0e6200e9d11a1cdc989e4b358f6e3d354fbf48478f345a17f4e43f8635" +checksum = "d9f0c0a60006f2a293d82d571f635042a72edf927539b7685bd62d361963839b" dependencies = [ "async-trait", "bytes", @@ -133,6 +133,8 @@ dependencies = [ "http", "http-body", "mime", + "tower-layer", + "tower-service", ] [[package]] From 534bc5f5811e580b680ebd366449df3d2d37deb3 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 15 Sep 2022 11:28:41 +0200 Subject: [PATCH 0107/1766] Revert "Bump axum-core from 0.2.7 to 0.2.8 in /frameworks/Rust/axum" This reverts commit 4422de8915e70cdca67a07c2e0fdb0610757924b. --- frameworks/Rust/axum/Cargo.lock | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index dd0590e28d8..f7ced7468a4 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -123,9 +123,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.2.8" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f0c0a60006f2a293d82d571f635042a72edf927539b7685bd62d361963839b" +checksum = "e4f44a0e6200e9d11a1cdc989e4b358f6e3d354fbf48478f345a17f4e43f8635" dependencies = [ "async-trait", "bytes", @@ -133,8 +133,6 @@ dependencies = [ "http", "http-body", "mime", - "tower-layer", - "tower-service", ] [[package]] From c882c082563fd6d895491259a7c8b9f4cfaee2ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 21 Nov 2022 10:57:04 +0800 Subject: [PATCH 0108/1766] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/smartboot/http/Bootstrap.java | 22 ++++++++++++++----- .../java/org/smartboot/servlet/Bootstrap.java | 3 ++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 3d26a672e59..a4acd4df6b7 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -19,11 +19,19 @@ import javax.sql.DataSource; import java.io.IOException; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); public static void main(String[] args) { + ExecutorService executorService = new ThreadPoolExecutor(1, 1, + 0L, TimeUnit.MILLISECONDS, + new ArrayBlockingQueue<>(128), new ThreadPoolExecutor.CallerRunsPolicy()); HttpRouteHandler routeHandle = new HttpRouteHandler(); routeHandle .route("/plaintext", new HttpServerHandler() { @@ -37,12 +45,16 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio } }) .route("/json", new HttpServerHandler() { - @Override - public void handle(HttpRequest request, HttpResponse response) throws IOException { - - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); + public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws IOException { + executorService.execute(() -> { + try { + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); + } finally { + completableFuture.complete(null); + } + }); } }); initDB(routeHandle); 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 a8fd3d35396..23efbecbd3f 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 @@ -35,7 +35,7 @@ public static void main(String[] args) { jsonServletInfo.addMapping("/json"); applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); containerRuntime.addRuntime(applicationRuntime); - containerRuntime.start(); + int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); @@ -46,6 +46,7 @@ public static void main(String[] args) { .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum); + containerRuntime.start(bootstrap.configuration()); bootstrap.setPort(8080) .httpHandler(new HttpServerHandler() { @Override From 2f49faa21d7702789807b599e079940fcc4389d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Tue, 22 Nov 2022 13:21:58 +0800 Subject: [PATCH 0109/1766] upgrade smart-servlet to 0.1.9-SNAPSHOT --- 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 1c48ccf3ea4..4f192131ac4 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 11 11 2.17.1 - 0.1.7-SNAPSHOT + 0.1.9-SNAPSHOT 5.0.0 0.9.23 From 9df2ba8c02756000be15e874e6a8151fc6b5ecc1 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 29 Nov 2022 14:22:23 +0100 Subject: [PATCH 0110/1766] Version updates, code refactor and new benchmark cases --- .../Kotlin/hexagon/benchmark_config.json | 69 +++++ frameworks/Kotlin/hexagon/build.gradle | 10 +- frameworks/Kotlin/hexagon/config.toml | 54 ++++ .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 61574 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- frameworks/Kotlin/hexagon/gradlew | 269 +++++++++++------- frameworks/Kotlin/hexagon/gradlew.bat | 15 +- .../hexagon-jettyloom-pgclient.dockerfile | 27 ++ .../hexagon/hexagon-jettyloom.dockerfile | 27 ++ .../Kotlin/hexagon/hexagon-netty.dockerfile | 9 +- .../hexagon-nettyepoll-pgclient.dockerfile | 27 ++ .../hexagon/hexagon-nettyepoll.dockerfile | 9 +- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 9 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 9 +- .../hexagon/src/main/kotlin/Benchmark.kt | 20 +- .../hexagon/src/main/kotlin/Controller.kt | 7 +- .../Kotlin/hexagon/src/main/kotlin/Model.kt | 6 - .../hexagon/src/main/kotlin/Settings.kt | 1 + .../src/main/kotlin/WebListenerServer.kt | 6 +- .../src/main/kotlin/model/CachedWorld.kt | 3 + .../hexagon/src/main/kotlin/model/Fortune.kt | 3 + .../hexagon/src/main/kotlin/model/Message.kt | 3 + .../hexagon/src/main/kotlin/model/World.kt | 3 + .../kotlin/store/BenchmarkPgClientStore.kt | 116 ++++++++ .../main/kotlin/store/BenchmarkSqlStore.kt | 21 +- .../src/main/kotlin/store/BenchmarkStore.kt | 6 +- 26 files changed, 574 insertions(+), 158 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile delete mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/Model.kt create mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/model/CachedWorld.kt create mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/model/Fortune.kt create mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/model/Message.kt create mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/model/World.kt create mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkPgClientStore.kt diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index fd4254a3355..2a4022a088b 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -25,6 +25,52 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, + "jettyloom": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Servlet", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Jetty Loom PostgreSQL", + "notes": "http://hexagonkt.com", + "versus": "servlet" + }, + "jettyloom-pgclient": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Servlet", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Jetty Loom PgClient", + "notes": "http://hexagonkt.com", + "versus": "servlet" + }, "netty": { "json_url": "/json", "db_url": "/db", @@ -71,6 +117,29 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, + "nettyepoll-pgclient": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Netty Epoll PgClient", + "notes": "http://hexagonkt.com", + "versus": "netty" + }, "tomcat": { "json_url": "/json", "db_url": "/db", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index fd9276185c4..ad55d00bcfd 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,15 +1,16 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.7.10" + id "org.jetbrains.kotlin.jvm" version "1.7.22" } ext { - hexagonVersion = "2.0.23" + hexagonVersion = "2.2.7" hikariVersion = "5.0.1" - jettyVersion = "11.0.11" + jettyVersion = "11.0.12" postgresqlVersion = "42.5.0" + vertxVersion = "4.3.5" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.80.Final" + nettyVersion = "4.1.85.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } @@ -42,6 +43,7 @@ dependencies { implementation("org.cache2k:cache2k-core:$cache2kVersion") implementation("com.zaxxer:HikariCP:$hikariVersion") implementation("org.postgresql:postgresql:$postgresqlVersion") + implementation("io.vertx:vertx-pg-client:$vertxVersion") // providedCompile excludes the dependency only in the WAR, not in the distribution providedCompile("org.eclipse.jetty:jetty-webapp:$jettyVersion") { exclude module: "slf4j-api" } diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index ad228b9203e..d51d0e8ccf6 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -19,6 +19,42 @@ platform = "Servlet" webserver = "None" versus = "servlet" +[jettyloom] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Servlet" +webserver = "None" +versus = "servlet" + +[jettyloom-pgclient] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Servlet" +webserver = "None" +versus = "servlet" + [netty] urls.plaintext = "/plaintext" urls.json = "/json" @@ -55,6 +91,24 @@ platform = "Netty" webserver = "None" versus = "netty" +[nettyepoll-pgclient] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "netty" + [tomcat] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36900 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

yHlr~Qj z%`kgh<2P>C>fTYE?E#Zh!{+2Qw=75K)1B;8ZJ3zCdDjI$qG`W%*$ojvA?sB=lZvgK zCFeTxA=XpCI{8fHWVEwdoN>)8KI3>wS1$ku!D@vDi!H##`d8bvA;7sf3*MOzNT&#^ z6;g_U-7z1Ji^{Am0x$ju^_X3VOn#pQQ_u;Ery^^ukw>}3FKln<4!Fg-PrZajr)_E1<>}I=v!q+(^ic#+0V+3yx3Z0nrya_ z9ic5(Ikj|7NP?0XaV4ST+E6HsCdv`M=q3j>e)^RmxA|<+tdj)5`<9`iZFSU6^%l5* zuUeaN*&D0)#-8)Fe8S>ey88ImsV>hoi8l7tzto01!b%xWUi?smIhTFWrN(* z72BPsG2KQLsTev>OM7u4F?%B<)XaC6+c>m+gLJt14bLXKdsoBql`8Ch7U`e5&WtBI z{7_XNoZW&^y+%(!etb)eRFCFwWNp11VzQfYOez$uKK4HTM0Tqzw##t8%t{NA6gj9W zKr&BClpUjOKiNRO!TZ#1dGtT= zB`TCkrZO!<(Z~t%LVQWIwqm8~$~fG4edEMFghmK%DbN7NvY2B^SOBG4jSsoeU9}I8 z@8tTrx#)0!Xk0e)MZ`Fi?_`7re_2^HlZb*ubafpShf`3ZQHVytq3Y_Yy!VIl$x_mk z4=1NlMp^cA)$r!Ekfy3uHS+39uf5rJpqII8@)&kPvu8s|XKlfWi*nPacSu_ocf{qc z+xaIq-h_5~osS{9#FPQ&ab=Z9DCd27WKnP7`JEqNIt4Mih~u8SY>LJssztE)gH8&1 zo7?yh*HL<>%aIbkUB;2UVY6-5xHtskHxzkB=KL#I`rI|7FOR8h83?)nmh`T}qu5h% zQWjOGpb_k!((<5@6aw=PODD3#6s27RkYmVFX7bHtkAD_PHnK>4bo@4=f40un2ISaZ zT*dnU7O4-Dn}eO`yK#}wA`O{eMAJn8;TFq&{Vj>EwfS1;EX%&RCIj(z_&GnYOCG*= zwdURH4UVPWsV0Lc#x`s1unv=`3@^@^dnq>ruZX5Nx190n~xHjIs1bmta%p3XQ;HW;dWus-?1PTxQh) zTo&#LVZXaVb-7~QO>QaTsjo9s|JE5c@9J1V{ndcBAc|v8VreFNW38yh^~0^ z0b;Cn#MZ0x-y<`c!rvJ&GLS)L$Mi~j!FC?X^IYlY~!7^!u=K`S0asx?9WJ`VOnME#>b-Xb@JrQG- zr5(}9i1&C=%^H_Ir3HO~9k{JaV}g?f_~p{Avg8mkb53wO!3WfW>>Wz1=%~{p^gcbW zKS!c|wH)MPm1XM06~_X-U>V7%5x}_>GOUo5M0~&DJ&YVY1tkdWOzZo_G^87HWV^JUE$HO3acF-XQ z+MH^-f^k$^xO}KuQ=&*qC}otWrr=C6BX_8~NKU4eX}OjoV4!&HCUn?2Bv4W`bMK@xJVgK%Up<|o zBI0#8S^-@%7*f5za7q*^w2;)zZmZru;SI7)F(0tJL5+UVAZg=|vfGSk$631oW1Ut^ z1_L6E*=(dzpt-5w0=T$QdW{hNfA|H7-D2&%m-u0XU)OVLJ&a5?T|?A!4O2Ucm%5Q9Qea6=O|vm?(voLlGudNwwm}k{+C`LbTmF=T z5rS3bW*+k13AaxniDC5b;o$6Rk=33KK+@qxqhe|?zt%m1$`}STyM7B z21-TZyt3Ga)$UF!(yzp{>Eps~TVLqdG1#n=M6lV0(P~-8o`^^y@=&2rLAn#nVm05f zaY~j-$-G$RtY3~A{LO&9Km@;LC*E5l@FrYm{^ zKJAg#f$PL%jYUBr)Hir5sGn@)={bU`+9f(d)>5!kp?iSJ25sX;KKaYZP$%Zn-;o1N z7;s0u&geOrpsh$p8QBw*A;N~N(pucAB1R7zW}POLuaIgf<@Ep*VCs`>W9Elsw`f%_ zk%{y$3mGxospU5L;HOsQI<7D$T3hZG^lM=`-#YbXg4t(pVt@h&J$w7NE7M+6eqof~ zDc!?A3%@=~jpoWA85f3mg#AW=s7u-qAf1MCP+JNKRdNTIZBe0WyQN97 zUtvi7c!Os|Rv_yPpq#vZ0UJ7`S;RH{d+HAtoL+JM#w^-owJ!-YvHZXmtJIbw4C+Kq z6jyD#gP8qhnPn5UEPPGeQcgj~S$0tFV8ML>^23b4x4n@>@VD!cNUpccQAU3*2Z3j# z+8+KxiX;S7f+bp%6hkBjXf7w@*8mNmaqy2M9u>VIB1Myn7xyq~Y_{O)xyraKctQH0 z?~NBFTNp<88^%1VKj*ZV2x5|XF*`l`Wp3_n_kO?DMgU~)xal9O1Y#BKn#5XLWJwqy z1)@^#BKt4hXk4}1D<|sr1QPp@;zSZ#6}jh1OHJfIO@$7d^_3D|Kpt4=GM)tImtJT> zgU9nNvxw6~6*6xbEY0SloDTm%7QL2yayPX5lwXp9tK%8JqSy63_6^)TkzL%3o} zc-?8@C?-^{(v{JP)I2^IH}&v*o5VO0I(I^@-Yw_!g*V8!%n(y&3r z_V%_g!9~|ZlYbCz%)}y)f8MQhMNp5!Cz%d*w6cwk=1D~2aYQg{F1eC13byfgd#)G< zEZz@&Y;tD3-*U4P0k6T~v7Q*oRCZvF-o`k`=vfVJn$9^3*kGB)?_)c?j}cG{U1-JO zyXb{>^n)efW_trzrdtwxS$Enxp4}g3lKV;0=o9npPXnMaaz zS3vrg8MfvefljB-XdU2Mwob`m%S_oOr_#1o`Mak!=}#fUxQB)as+A^>;-#>>1uZN{ zs+NoDCKaz6?9|~)u+hAZckk&uk&aH%tHgQR@6yW56xoFaxTeH^$+E8^*Y$Fkft7kl z%dYE1_7)v)qKR!c@RmB3o914w-S!^!A(g^QV@ex`XOM%CEv*1&3EvAp-B{wGS)2)) zZ$$I$Eg0S$q@ileW6b@YEtB{t^`TWt3sGTs_fuJzE41v9@Ia&Nz4ozqe)O{aJ72J@ zm*fK$Fftpa;g1*98=yQE+E=em`>XU-lqMPTT)qp*0j_8$RRbnc1owJl4Q#e;ms)|9 z2Xp*v>&$32XHtM3SxouMyghcezJH^W zIFx)fU|kyWBy}VOPVyC6DiNtA^qd5^Gs}Kw_~%XPBTWhcgNxh|b%gvDyoL;<3B$x=6@kASCN-9KVH$I;`3F?2+8j2rri z(6i_VCTT$HUTt}5V)PzJw!QWz46ZM0m3O@K1nQ>PuK2zLXl{|fBZ~(R1Ja~4$>MeT z<1j_9gbRWbmDHv~;6sXqHzuW+f^^@$Dpfi?zl1495W^E9U5P}ohPFMQGYGQcE=ii9 z3@A&KQtA+QYNI!E`@msN(Ts%37irtKZTr zcJTpy2?z06PMxVAXO3&Mf1AB7r-nWAqw+m_f4q$87#k) z6Tfl)mrG?cb(OZ<57m7A<6|wJWQ2y7gn$o`q&}>ndr&jcYTajGI zj0#HtKCeFWyGdRW7oOQvZGo{jZXxQ&+2l}zNDl}h z=t}ue@=MPpb{@pAWEi|wV4WvV&8J?AmmZU5HU=+xOOGY<1pbx} z<^0(d?6zBR10*GO%Q5$>S+2rI2J^wUt>>@A*qFCEfJ}2ls=3dj_0{^nwx!g~K>=6e zWs{OwSijrMBXLn3CI+x|A^tf)mF!mF${J6CzrURVzBimNA_xbU#eUqPinfVmORr4< z6qZjPf-*~ajJ^X|Obn(UuyUH1Vsm!uA0dut0B0@DQ3`%8A15y4G2KhPYWMC2#X~mx z#0Ri6&uda3+5G8*=n$(0bC*;TPqRnRjLVL;@fo}<->3AZjPwc{#0NA_Zn1#gfdT?1 zYq|6&GN6#^?(de2X<@tA7p;Uq8)zO)QmpB(~UT3Tfd@q&lr&dVTkzz z{ZB;lxlo>+|5+^{M*;%k`=7#_J-|(xqrn4IH;dJv)6m0C#KRY}xSB5p;#_rwM@lL= zh&W>KDp&vY+CumaJ$d2q;5_ePNh-Dlwt78Gd*0b{e|{tbeB3{_0cqccM0;(K75#FT zX_pYEVoyd9Juo9-aMVZcK8@~_5@rtk1r-`CwoY3Ftn-o_X;=?TPAiU`s1)V>x|9m| zJ6S&J07}AayiRR`b9IpQZnhN-fq6RsiEljq1icj)=IJRqSmg7GX&|5y}w+=U&V@wtyFqN1aaCU{7LusiK zW&i=rjQYp@D^Cq?RoSYwvC+DTy}G4Xk7Q-hjFWylUpaoSYI z&>g2q$0|K^liVTSFI1oAs$xGjBjXm%7q|ePMrbu>gp%)UAg0r|s+CDBzLFk5Q(N-J zy7~7S2-67y)=BLVdkLG#w}#yF`)(f^m7HvDB6Y)#VkxNe3|dzw?|LURBb2?+>{ack z2_;=D{FZL}kD}qWO>BsH7vGzDnktf}wtz`SQ&OjQ(D5NHRgHc75KAm&m@>C_#k369 zr0x{n{AG(!1*M2SCrh5^SrP`|l8}b9o6smM7z51j{rg1M@xn}BKh;KWa*A1B+f!?H z3c7a4%7HNKS=)-I*1+DuudI|%wbe1=enkeFe#8vA&{BOq zumn1_KyAQDxA3ocHBxwvc8)A^^&jlDpmKVI+AL+4x;H)L8lC;+3Md(XyXumYn#N{f zRc3{GVq1o`3ccr=-B$IOR8!h5bXA+oK-D^3edD(3;{cJnPO2>40T8N<7LCF zs1n%wZE0{DYIlq~YIhW18yfyEAK0}s>7ULesZzTTQ zL)SiCRG&fkZ`3@g7hOR*bzW%rz54zVi**z*?J}*Ir0`=@f3}%&I!M;p;!?2RWown? za3_`3ODncBEjHLMBQVXxSlInzu|fR_mI&{&##0LDGGk*r#K%Sd|{b3l))N z*=_TwbRdE(IpOQ@+~lpdpG>Wq<*VPp65tkF~I&r-rK2T ze5ag!qh}8VOin*$e^_&;jf^U(1-cGfUJ>nUo@*(I?D%_NBytL7_Qh#CBHHeYxJ1VB z!c_X6X~B5aL$4*-Rh{7qPk_Ok`G9bP*m8LM0g;i+WeshTV9FzlOLAt6)EZOVp3~<) znKvafZ+hK#R*e!-9Kpyn9I-%!)W6(=PVs+mfhukREY3zkiSP#aM4|Iwq{zWo? z0G6k3dANxSFaY?z+n~iS%bwiJ$r`A-Gzx)ix%%4&SZv@u zSypcZ;O=uCN7^Hz?5d~&`uX-HqQmp*Wj>;nZee;7{e~QGdHj$8e>EHj?=_Nr8l&!7 zv-Wi(4-Pxp`p?RpP;55My%=Db{8vl<4f3S}05C@QxVym#Eh&uM|jG8R1P&8hDniW$T*;Zu{xc3 zg>KJNcpGE?u=FB~95RgI2PBYuyVW}VO9p%@@hW@M+3%#`GOw@C4$Sy#66>)wuJNE8PNQ{8S^7ddoadRBf)RbmxSCU3#$; zL%W1hV++9DCkw-t9(zPhA#qdLE{AB+OytP@kbEeg1fFoUi?CDh{h!|?5>4znLJBwI zF2uIeHQuqIe=`ZUEPe#{O72X}2-Db2XmcNX2v)s5HwoM_HY^SD?19gsGd7>pZ){Sl@N%ey z2}Uag$*6e%_1qKU1co1Rr^xT%X`y4KyRAVWZ-gAF?1H9+eq0NwKn5z>qFt`&koghB zACn50u5e%Ld)7{b*6o3XKe%uwjsqw2slnM6sCmr&hF=hcU6_=z*TV09kk1oiX23)2 zc8tSRQWR9ecV^LHf4z+YrNByY55fxac${Qg3ntuRv2@{-&X)UuTqL20#s4a*|;( zJ%Z5~fu6ss4Wcblpc3Z1{4f4X6;y`5@~5JQe=7R_b#J?DWQ4_z`|YI3?7EX=#Z+?J zGJgcAdK{?G#Lx-|!NjQTamJEJ+35hoJ)Fqn74wYL?rW-E(G}w+x*@SpU`f=dvNV+C z;U?-rN&~K;!F#M(TeT^)o2KKbxJnGmV0CQMfeZD}3LOqJf6fV}kwuohtvWg~@K51& z-}B>7&8Awrd0-Ll2W|{sZ=pp@S1ObmrOwtZ*{VuCMyufNV3To!IH+|s7oPw*NE!4Z zZxgK+Tu+nm7`@sX2lyi`uAA&5zk|AJrP@RKX`OpAPW4pezFL1Ll6CvS4k`9NMD`tr zfVce%X{4a->Sg`PCYl!0Bi}+RPUUS!v~mm5J%!8!+IRCnLVHkd=L(X>_i zr5n|!=~Ql;r*q?<`1OsIi)Z$ayB#HT){Ow~FoI+rWG1hRdy-MQ9u2Op9jyUPJ0)&TwKk0O zi3M{d;slF`;72|n70KBicfm*nMA$$>SdG%bkV~116mA19PiREGP8fR%Ut058kxjI! z?17|HM&UkIkqcPbb0C*F%aBMXV6gAgQKmAgs(CMg<6$Dblp_Ooc)SZDxs>$#$Rk+v zBnS5w`E@bW=XprvmHYth4Gz&=q8VnWjIkY(j) z5s~e}I`5PxXyKwbRBC<54Yx%SPKhdcE7DU>cI3kJSQ@0)?*%5YaLyVQQl}!lsP+Fv zdZm;7o$mT6(#oGA<@lMF*gIJ;SU4G(+9cVcA^rC|cb5%3>6}vn?0dA_Af}0(D+U=zJF5eN_v=l|T*|8?+ZR8$Ems##)6X*iD%+gdgnlAIF!TchtaXlfs{i_e@McHfOjwmNinCu7t7Z0Gk%BiJKKQgc61+ zZP0d)r*5w{)EgEGe-*QFYV(7njrVG;x&^@L^7#i?L}5OByT5Fv@L$(0@{nrpcHOqJ zriCJn(25bJrkk&YSy}H{u>DKvNw{plOphymr?5TNipNw8X0%#HJ(S2f%&z-jR3q_sNTq1s%7&0Gt$P|xgVrQ~g9SOUti{HV&WvrH5L=c3Rtfw~*+qmFb27ivH= zfbRGyOrx9V%(8thJ~HUIAru0ZVNTWE-Op?T=V+-K(TwOA)5#*jN|Aa8wXINSK$E(I1wHAqAG!Fu~{$uvNxWtKljP z5?62fmwOZwlgnTrJ#-AV#QD~I`~xs#u)XDW@sfNtZe8e&a8`RF_WnqDY=qn6d_Wgk z0G~wHT}Cs912@ym)IT$|yg_Ag7>F;HJ!Am4-%F%0^`ylpiJi2iyuu z8)907bo$J<+}x4CMj;e_f)UN|!7DvbKUFZZ0+amRg9VnP9dh zQ4CL;xtnjE1abNr*g!DP4xfPhn_&Zs4r0E~_~A7FdU=3;go3mTKVXD)V#sp8)kC+W z58UjoMx210{7Nj!U#!YOHWPx;Ew0L%7>go4QLZ?;{6n0^Bjv6Vcq5x0UwDHDFLsxC z%cc{TLv%>AiU`|oGBjKdK8Z`xRJlE*g56y8%ueEz#2f`#TS$KrSp3Kb75foSH&C9X zz<~S_<3Ae}3n9nG~F~j_GCFNUAKv= z)R(&ciL5mJZo$Hcg(^T2Q}0GCC3?;6yr;l%)^qQ(t9hS~_cu~MvAWBHiFg=22AtQ1ul!T8?^=_u=ziBoscx#)IMjB~#4BzI$`c&p8+uK#8UVZD_*3W#jboPlb6h zN7^2BPwblV4VBZPb1dZU9KNJ0D&*hqAj=pRz!Ag+ zNw(C5qA_D)rklIcI_7xQNQG=P+^??H*L`iuCq74zV7ca{6U&+O_iDwMCjti*v~zTjmCt7 z;=T8z7`&v$Su@8#n{c9a2Y=5cUG2S^{;fnX{_9){ScC~36hNO`x@ENzFVmN#?8cyW zQ4>H$qKLXKc2QfyFgm@Pa$`_5v8Wy%ch4!f=Gr!7Msh0VA$5IJ^$b(Y3}*mIBSFLS zjqVmiUd8EQxs~GVjW;PHpi+qCnL!cWfngxTDj3y1f{m?59!JdzAuq^&(QwI|wqh>3 z+;=nwv}=hF#fJrSBffj>@XB0M#Z!&ra5dJ;tXt6@d#)}>*!uWMmwzK<8a@X(v$^bg zy)AQ?GuraWA)()aR^3wDT(#+-Yl~eJ*cj#2w@usd{^`5Kg`3?n66MtNyA1xbzgNpD z6B}re9&YJT*|&2}4Bj-^rw;$tXn2a|?+`=+2%~G5x%%?Ijllz97jWj5B12tgAO~u# z@}H1ajE$hSK}m$yz{>1YoA3#HeZ-#8mTgK9M9y6A3SmP;sXdUF^})!>rr7FIU5hm7 zt)tnLrYZ_a!xO;h%2O!I2=@DFp;VjC40lxxizzsa(#PG{G!Ibh!; zqJv{N`rq0JhZ#+{?H^>e{z+vN_#b3u6xV=C!7+g0u-iIiXo?rF0ER;>;)6i{323sR z`e7me??G??y@`#HvvZD?m7(rP!k2Vr28WkdtJy{)pP|hj$iGyk*7_qAejqFv_SA+1 zglSE$L~;DN@C>9@PT}@Jq*%mQLlocu!!Xdm4pW$b4Y~F~=&&MRx^vHCHv)m9-UxIy~ONLQl-w}Z^G5B}mm}VmcJ(Ck040Km z^ais%LteX4umg2>GT{YD6=L+rW`?M%Q|Qsa2us-{*T9LXK*uJ2WDb&BMPiqT3^`H& zWqrre>nw&Wr$8eg@-|ij#u})JBg<+sB)P2Is`Hq$LVc?c;~%p(U?C+DO8k@6r{8+j z+uDV6uC`Dt=5wQLR_M_!=CjZv`w^vAw#(KMjEmC0WM*0|r>8U5Oid<#x$*=tv6$@2 z1%5jW}YtyNbUY`3>G)EbTas9|0It=4F6QbJar!|EefU&#j#t}r!iZ>jZ= zr{}9Dyap;M>1>qnNnsT&mg5BK6;D`0w@3s=Tw&7bCUkW6e__Fk|EaS5b*~|2a=CKZ zU}(KwZ3h)riMOd9LR?yN@gbJX#f=Fs;m#iHmQfSi1v>f0wCXeJ>1a01iiXDo__uba z$lFe5vl!6}Rv<~)AQ`WtJn8&E8`YXA4Y*of?=i{3(kX)k3#lrk8@PEhq%HR2Ny-(K z2v02Y3F&NYs;F+0i2=1pwZXQrw`v8As$r9ZCp&C|{V3+5Hx8GgacfDRnBO2y*GUvt zo4Z$zM6l->QeMBUHhhW~m&ZW`oFwnFkkmxm;>+>{5oSiS9w}lxl9A5a6fRBRxIWFo zQA3$*%Nn7&n9*E25!->EqZcK)s)=N!S*^EE`=6dkgNI~|=?UwC-9SQHZ_J|BYqE7H z*8g6=7~&qD0HG2NcL1i;$H0P3Wcx;LM@guRi?26LU(rqi&WfNkVplloB-B;0}m<}+~i=cE-p+n|TXh3#Mm%z&Ug}vODE}%L+ zHA%v#J6ch<%NeHE11u3)70N?xHC;7wc(cJmICL%Q%Wk&kfpgt}00>ZeN|ju#3%dku z+)^b2o)VRe3J4wTX%C-2*%>TgOERJ20m}LdTwUhy4zp_67O-K?idqS%ObQV<41`&} zS^wk~t~6n+NkYaCz@;jconW^jbzryrap1P9#dilTMau)|W}!xT+GEJ+LYpJ4{(847 zDDt9Sz$XqgGZo7L{&WPnl!vzI&cv_9Si6?B^RR8$Nou-bA}5p+={YeWk-gu*MnDZQ zmNhQM2fM&fhix(S+^FK{39r{wZ@KIZ(jA3fB)1cF6_3Ts95IW~r_n&-kwqPpz>f@8 zGK=&QX;2s1V>_kj%6T-et~6?o*tUnLMYCvhlvGAL=7H-1CeCfdXwhS^oMM!{KK?dC zhUln`LSA;N*RmYyIQ0;5P)cl3YG67g`E15#9sL%u8@LSJqHe>w!y}`9-vS?LBx;*- z*V63hFOH1CV4ii=n`ZT_4O|M-LWkp}NVdLKoXH8@B6FvRaj9o%+_rHAj??0j-P?%6 z6zQdSHceLsU_|{y%rLW%Qb)pd2LTvO+jJTHiM$W>MS2;YEuHcLIF2AfxAI1EfvrXG z759!a@bmB|!ntvN!M*-$(TxY)AwFl=;Vr~rirwxTj~I>*QICvvnB3Uu zz$*=u8cEZ}iVyOQ&@D(3V@4`2)W#YH9}f%DjnLuoHlT-UX5UskHFnmpRQ56(UJk7t zI{qZ#(uk3#+UWbd9@kEt4<>t$lrEP${Y!0B7RimLI9nz%i6DDUB#H?2;h)1%9*)po z9Exy%c5gLYT?6F6LIf+^i085J(&9as64>!u2yB6&8Ju`B6UF6Bo&wGF_-Ana67(axgbJ{ET9OESa1Ez60$&?0iMij*+#C10&6I)I}3q1;r1d zu9|;A)$%Lm^!lu$UD#FRTYK%NaYuQ$|Dgo_ zfLdnPa?l@SBPjqI8Khh;GnwiLc$fLI2rNys8Yo1V~= zm0iOL`g%uq1{UvSgQfdgX#AftM!tV5X~1X}ETQthDTtc{Nj(2)S@YYeW55Hz8X5Uq zu;aa~;$|fc-n&BX)|^;&kYUIK{9G$2zH~8?!p=Z<-I~UP4--J5;DnA~>moS-o!j=l zw)K`DTYf#CaD!t%AVJ?XZclSMwbJeQZ3qMk?OJ$-H!bwMKH{+IQOc@4jdEq;cEfi$IlJ9ddzYtFQGcWZ83btpIhaB}+pK_;p}IEa8uR zIf`GqJJk^O`TRP@!HZTjzr|r`%s=Asmaw*k(9>~Yb@)JJ-~crGE86mOZ2Y(pn#*4) z=E#@wFU%my&4W?1VOw{tct~L1V7j)wS^s8KL)TG*e_MSy#(`T=KEXj2+P~mYUnhbx zkRDDe4tZj;ewqCwZ>EM-0LIPZJ}R=Ve4rG%kXpY^eLY5!wGX=)5>+Hx4f;Ir$5F@l zK3|HgMUqwIh)bo|zgzBNRGgbPWtXJ9;blHb;zw5HYau^@(tApI?*LlT%15dukY4`j z@q(^VDlL8s2^pU5qw(4mTIrdB?#f02GE`M<&DAI;G2NXg=oN)(z$3&*Px)5Npud0> zz1o1>@6O5vog|IqGF|mg!sA8iFJ(8hwet*OSBc_WWUUns+uRGDuYG>nQu@T&+NNHF zrLaXAq_fq88JjJ48*?)T`MPy`vGB+;3Z;Q3URgtASuvFJdUzT~{>?{7W02MZ;D>xH z4P%leLlhHR7W`3k0B;P;?b>>z!2xl%%;a-DTwW2_*a9_);iO0N1eIl)v5O=X_mQkk z8hNl8ikl=w;bI7V2QbEzT=<0k@R8D&A2`nu*TeW!yXwv`$DxQW6`-H(4y!gv;J}M3 z6vx>qJ(c>2V8rtLXb8bUV6%%6>qi!f%NMP*nk_y9>z&dGSa-p8&kBUNMRbWUVe%7= z<^A0dpR1H;fQib!W)>! z$Wb=={zAnzGh#B~(pK&_x^R%KtOAcavllH4T{C?T>ooObQ7~Vl`qj#cx`@jX zOjAp28XwL>xi61_q`}0V+aMO6_TwY9S$%U1WX_h%p^jg9d${Tm)h(6_kufQ@qt((I zX)2$a5X3({I}mE!6aBuc_Fxp7->?Wy6kX@SST0TkP!VI8-E#j3Y7EfK9aI7S+@m;_ z+pm~0H5h8=j63NLIO$EWD1FG0o1rL}=bE{HS(AZ%pyX50?8JhgqkUvSdAp&dlg};S zTbjdi4OQ9WnpJ$TI$gfW4n5g`-o6DZ#Zzi}M=&AIfZqe#B`lL%j&V}@{7?#esBh~7b9gkx}G zi}TJ2Orz~&E8dvGy>TQM5|)hV(hW}oLRW()lAf>WPZ>w&Ft)5b6QND{-3VSJsPS!4&eILoa8y> zF^rq?+#14qbZA2ADAAf^IW3_{LsA(@Lzd}wiX4wxztrw}ZSCx8dXP{#r@BOmN>tl( zjWJ9zCMIpt1N)mB+Pn9k-}n2Q&-Z)popbN~4c*<4qQA*Qwdpx=`=ar`MyjA)=TPVj(d-n08Z;$`OZaF0^yEZ&JDd+g%Zn=l$&+uh@K{Pw$6<)HL^Gt>_MJCo8fd|H80eCo5~iE+~0ScyWCJ* z!+v&WM_=34an9!x+DU;UjWraLi%E)4b$r$(3B9xtb^*Gg1;hEmqH>TE>f%mBYQN8g`;?eizdzJqapW8M zn0Iws_;WqzB4Jj?b(+qAo&8K$EMY)B#cE(R6LzE-A<+;D6;2>e6ILnQu+*CHdRJ6^ z`4q*gd{CBZ>JZ`lIfyrh3kTe=(gWvToJ1L^3-n+?Av^HRxS#0CfiG z7-h-VX;gjV!M>BQE({xF0p~DMEgD=3B%4UFzQG3S4za+E$VpWfh7UObtr${Ow$6vd z5FPuv)&klHyc#S}u`o*OI)yRX^@W)|+c$+5oxCRj@}&%Hx;+cARurBufTy)> zpjj6Svp-T84nJaaovD+G@cP5(M=RLg&A`+>VFBnNB2X7Tdx}7# z2tS)mLPumYXeYD5)ZHzoPzco)J#8)&kdrqFT4H2N0rHltjfz?*(8{AEq>|au$ns*i zu*V4ed<;$cL17Oaqm+J9EZ3eOE!%qRX=Kd|oIsX)O36u&UOS9Zc0jRAItd%x7ejHc zE%yJk?-VD(Q$z^zAg_Uv=A9zYD8dhy!w&W`Nc7TaWRe$_$&J7vG3j2N+m*|WX=I+P z;H443&rQzTVq{hV{b^UwyX;Ky$gd=C;Ki!BYOfe2KurOgsz}gjwK)k=0@M_6yas`m zFtN`GY;1;#@I~-W9}DpABheC?zFG>hAHbkjF(Bd*L>*Sf>jP*g1+M;bxN7*L*VE~- GTKgBj+ffbx diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 05679dc3c18..3f4def4a917 100644 --- a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https://services.gradle.org/distributions/gradle-7.6-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index 744e882ed57..65dcd68d65c 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat index 107acd32c4e..93e3f59f135 100644 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ b/frameworks/Kotlin/hexagon/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile new file mode 100644 index 00000000000..18d9d309d13 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -0,0 +1,27 @@ +# +# BUILD +# +FROM gradle:7.5.1-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +COPY src src +COPY build.gradle build.gradle +RUN gradle --quiet -x test + +# +# RUNTIME +# +FROM eclipse-temurin:19-jre-alpine +ENV DBSTORE pg_client +ENV POSTGRESQL_DB_HOST tfb-database +ENV WEBENGINE jetty_loom +ENV PROJECT hexagon +ENV DISABLE_CHECKS true +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT + +EXPOSE 9090 + +ENTRYPOINT /opt/$PROJECT/bin/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile new file mode 100644 index 00000000000..e681fc03572 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -0,0 +1,27 @@ +# +# BUILD +# +FROM gradle:7.5.1-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +COPY src src +COPY build.gradle build.gradle +RUN gradle --quiet -x test + +# +# RUNTIME +# +FROM eclipse-temurin:19-jre-alpine +ENV DBSTORE postgresql +ENV POSTGRESQL_DB_HOST tfb-database +ENV WEBENGINE jetty_loom +ENV PROJECT hexagon +ENV DISABLE_CHECKS true +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT + +EXPOSE 9090 + +ENTRYPOINT /opt/$PROJECT/bin/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index 579a9402136..05c93562cf0 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -1,25 +1,26 @@ # # BUILD # -FROM gradle:7.5.0-jdk17-alpine AS gradle_build +FROM gradle:7.5.1-jdk17-alpine AS build USER root WORKDIR /hexagon COPY src src COPY build.gradle build.gradle -RUN gradle --quiet +RUN gradle --quiet -x test # # RUNTIME # -FROM eclipse-temurin:17-jre-alpine +FROM eclipse-temurin:19-jre-alpine ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE netty ENV PROJECT hexagon ENV DISABLE_CHECKS true +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile new file mode 100644 index 00000000000..efc4db12aaa --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -0,0 +1,27 @@ +# +# BUILD +# +FROM gradle:7.5.1-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +COPY src src +COPY build.gradle build.gradle +RUN gradle --quiet -x test + +# +# RUNTIME +# +FROM eclipse-temurin:19-jre-alpine +ENV DBSTORE pg_client +ENV POSTGRESQL_DB_HOST tfb-database +ENV WEBENGINE netty_epoll +ENV PROJECT hexagon +ENV DISABLE_CHECKS true +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT + +EXPOSE 9090 + +ENTRYPOINT /opt/$PROJECT/bin/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index e9caab6bc32..87260f430e9 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,25 +1,26 @@ # # BUILD # -FROM gradle:7.5.0-jdk17-alpine AS gradle_build +FROM gradle:7.5.1-jdk17-alpine AS build USER root WORKDIR /hexagon COPY src src COPY build.gradle build.gradle -RUN gradle --quiet +RUN gradle --quiet -x test # # RUNTIME # -FROM eclipse-temurin:17-jre-alpine +FROM eclipse-temurin:19-jre-alpine ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE netty_epoll ENV PROJECT hexagon ENV DISABLE_CHECKS true +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 5134fedad4c..d15c7180a93 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,21 +1,22 @@ # # BUILD # -FROM gradle:7.5.0-jdk17-alpine AS gradle_build +FROM gradle:7.5.1-jdk17-alpine AS build USER root WORKDIR /hexagon COPY src src COPY build.gradle build.gradle -RUN gradle --quiet +RUN gradle --quiet -x test # # RUNTIME # -FROM tomcat:10.1.0-jre17-temurin +FROM tomcat:10.1.2-jre17-temurin ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV DISABLE_CHECKS true +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=gradle_build /hexagon/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war +COPY --from=build /hexagon/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080 diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 465f2d82146..6edc32dc1dd 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,25 +1,26 @@ # # BUILD # -FROM gradle:7.5.0-jdk17-alpine AS gradle_build +FROM gradle:7.5.1-jdk17-alpine AS build USER root WORKDIR /hexagon COPY src src COPY build.gradle build.gradle -RUN gradle --quiet +RUN gradle --quiet -x test # # RUNTIME # -FROM eclipse-temurin:17-jre-alpine +FROM eclipse-temurin:19-jre-alpine ENV DBSTORE postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV WEBENGINE jetty ENV PROJECT hexagon ENV DISABLE_CHECKS true +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt index 310bbb81c0a..a296a9d261d 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt @@ -6,7 +6,9 @@ import com.hexagonkt.http.server.HttpServerSettings import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.http.server.netty.NettyServerAdapter import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter +import com.hexagonkt.store.BenchmarkPgClientStore import com.hexagonkt.store.BenchmarkSqlStore +import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.pebble.PebbleAdapter import java.net.InetAddress @@ -19,14 +21,28 @@ private val engines: Map by lazy { sendServerVersion = settings.sendServerVersion, sendXPoweredBy = settings.sendXPoweredBy, ), + "jetty_loom" to JettyServletAdapter( + sendDateHeader = settings.sendDateHeader, + sendServerVersion = settings.sendServerVersion, + sendXPoweredBy = settings.sendXPoweredBy, + useVirtualThreads = true, + ), "netty" to NettyServerAdapter(), "netty_epoll" to NettyEpollServerAdapter(), ) } -private val server: HttpServer by lazy { +private val stores: Map by lazy { + mapOf( + "postgresql" to BenchmarkSqlStore("postgresql"), + "pg_client" to BenchmarkPgClientStore("postgresql"), + ) +} + +internal val server: HttpServer by lazy { val engine = engines[settings.webEngine] ?: error("Unsupported server engine") - val controller = Controller(settings, BenchmarkSqlStore("postgresql"), PebbleAdapter) + val store = stores[settings.dataStore] ?: error("Unsupported data store") + val controller = Controller(settings, store, PebbleAdapter()) val serverSettings = HttpServerSettings( bindAddress = InetAddress.getByName(settings.bindAddress), bindPort = settings.bindPort, diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt index b805071c521..ce82a5c152f 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt @@ -6,11 +6,12 @@ import com.hexagonkt.core.media.TextMedia.HTML import com.hexagonkt.core.media.TextMedia.PLAIN import com.hexagonkt.http.model.ContentType import com.hexagonkt.http.model.Header -import com.hexagonkt.http.model.HttpFields +import com.hexagonkt.http.model.Headers import com.hexagonkt.http.server.handlers.HttpServerContext import com.hexagonkt.http.server.handlers.PathHandler import com.hexagonkt.http.server.handlers.path import com.hexagonkt.http.toHttpFormat +import com.hexagonkt.model.* import com.hexagonkt.serialization.dsl.json.Json import com.hexagonkt.serialization.serialize import com.hexagonkt.store.BenchmarkStore @@ -37,7 +38,7 @@ class Controller( private val templateUrl: URL = URL("classpath:fortunes.pebble.html") - private val headers = HttpFields( + private val headers = Headers( Header("server", "Hexagon"), ) @@ -106,7 +107,7 @@ class Controller( ok(body.serialize(Json.raw), contentType = json) private fun HttpServerContext.getWorldsCount(parameter: String): Int = - request.queryParameters[parameter]?.toIntOrNull().let { + request.queryParameters[parameter]?.value?.toIntOrNull().let { when { it == null -> 1 it < 1 -> 1 diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Model.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Model.kt deleted file mode 100644 index be314dcd20a..00000000000 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Model.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.hexagonkt - -data class Message(val message: String) -data class Fortune(val id: Int, val message: String) -data class World(val id: Int, val randomNumber: Int) -data class CachedWorld(val id: Int, val randomNumber: Int) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt index e5c9994f856..36c8f8f44e2 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt @@ -16,6 +16,7 @@ data class Settings( val maximumPoolSize: Int = systemSettingOrNull("maximumPoolSize") ?: 96, val webEngine: String = systemSettingOrNull("WEBENGINE") ?: "jetty", + val dataStore: String = systemSettingOrNull("DATASTORE") ?: "postgresql", val worldName: String = systemSettingOrNull("worldCollection") ?: "world", val fortuneName: String = systemSettingOrNull("fortuneCollection") ?: "fortune", diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt index d269138faec..7da14b44cf5 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt @@ -1,7 +1,7 @@ package com.hexagonkt import com.hexagonkt.http.model.Header -import com.hexagonkt.http.model.HttpFields +import com.hexagonkt.http.model.Headers import com.hexagonkt.http.server.handlers.HttpHandler import com.hexagonkt.http.server.handlers.OnHandler import com.hexagonkt.http.server.servlet.ServletServer @@ -12,10 +12,10 @@ import jakarta.servlet.annotation.WebListener @WebListener class WebListenerServer(settings: Settings = Settings()) : ServletServer(createHandlers(settings)) { private companion object { - val headers = HttpFields(Header("server", "Tomcat")) + val headers = Headers(Header("server", "Tomcat")) fun createHandlers(settings: Settings): List { - val controller = Controller(settings, BenchmarkSqlStore("postgresql"), PebbleAdapter) + val controller = Controller(settings, BenchmarkSqlStore("postgresql"), PebbleAdapter()) val controllerPath = controller.path val serverHeaderHandler = OnHandler("*") { send(headers = headers) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/CachedWorld.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/model/CachedWorld.kt new file mode 100644 index 00000000000..101176e3c39 --- /dev/null +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/model/CachedWorld.kt @@ -0,0 +1,3 @@ +package com.hexagonkt.model + +data class CachedWorld(val id: Int, val randomNumber: Int) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/Fortune.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/model/Fortune.kt new file mode 100644 index 00000000000..b4781735ec1 --- /dev/null +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/model/Fortune.kt @@ -0,0 +1,3 @@ +package com.hexagonkt.model + +data class Fortune(val id: Int, val message: String) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/Message.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/model/Message.kt new file mode 100644 index 00000000000..090dcbf0be6 --- /dev/null +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/model/Message.kt @@ -0,0 +1,3 @@ +package com.hexagonkt.model + +data class Message(val message: String) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/World.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/model/World.kt new file mode 100644 index 00000000000..5f3316f9a5a --- /dev/null +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/model/World.kt @@ -0,0 +1,3 @@ +package com.hexagonkt.model + +data class World(val id: Int, val randomNumber: Int) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkPgClientStore.kt new file mode 100644 index 00000000000..cd467c6c34d --- /dev/null +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkPgClientStore.kt @@ -0,0 +1,116 @@ +package com.hexagonkt.store + +import com.hexagonkt.Settings +import com.hexagonkt.core.Jvm +import com.hexagonkt.model.CachedWorld +import com.hexagonkt.model.Fortune +import com.hexagonkt.model.World +import io.vertx.core.Future +import io.vertx.pgclient.PgConnectOptions +import io.vertx.pgclient.PgPool +import io.vertx.sqlclient.* +import org.cache2k.Cache + +internal class BenchmarkPgClientStore( + engine: String, private val settings: Settings = Settings() +) : BenchmarkStore(settings) { + + companion object { + private const val SELECT_WORLD: String = "select * from world where id = $1" + private const val UPDATE_WORLD: String = "update world set randomNumber = $1 where id = $2" + private const val SELECT_ALL_FORTUNES: String = "select * from fortune" + } + + private val connectOptions: PgConnectOptions by lazy { + PgConnectOptions().apply { + host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost" + database = settings.databaseName + user = settings.databaseUsername + password = settings.databasePassword + cachePreparedStatements = true + } + } + + private val poolOptions: PoolOptions by lazy { + PoolOptions().apply { + val environment = Jvm.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() + maxSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + } + } + + private val dataSource: SqlClient by lazy { PgPool.client(connectOptions, poolOptions) } + + override fun findAllFortunes(): List = + dataSource.preparedQuery(SELECT_ALL_FORTUNES) + .execute() + .map { rowSet -> + rowSet.map { row -> + Fortune(row.getInteger(0), row.getString(1)) + } + } + .toCompletionStage() + .toCompletableFuture() + .get() + + override fun findWorlds(ids: List): List = + ids.map { + findWorld(it, dataSource).toCompletionStage().toCompletableFuture().get() + } + + override fun replaceWorlds(worlds: List) { + worlds.forEach { + val worldId = it.id + val newRandomNumber = it.randomNumber + dataSource + .preparedQuery(SELECT_WORLD) + .execute(Tuple.of(worldId)) + .map { rowSet -> + val row = rowSet.iterator().next() + row.getInteger(1) // Read 'randomNumber' to comply with Test type 5, point 6 + dataSource + .preparedQuery(UPDATE_WORLD) + .execute(Tuple.of(newRandomNumber, worldId)) + } + .toCompletionStage() + .toCompletableFuture() + .get() + + } + } + + override fun initWorldsCache(cache: Cache) { + dataSource + .preparedQuery("select * from world") + .execute() + .map { rowSet -> + rowSet.map { row -> + val id = row.getInteger(0) + val randomNumber = row.getInteger(1) + cache.put(id, CachedWorld(id, randomNumber)) + } + } + .toCompletionStage() + .toCompletableFuture() + .get() + } + + override fun loadCachedWorld(id: Int): CachedWorld = + findWorld(id, dataSource) + .map { world -> CachedWorld(world.id, world.randomNumber) } + .toCompletionStage() + .toCompletableFuture() + .get() + + override fun close() { + dataSource.close() + } + + private fun findWorld(id: Int, client: SqlClient): Future = + client + .preparedQuery(SELECT_WORLD) + .execute(Tuple.of(id)) + .map { rowSet -> + val row = rowSet.iterator().next() + World(row.getInteger(0), row.getInteger(1)) + } +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt index f2d68d7cb6c..157ad7c982c 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt @@ -1,9 +1,9 @@ package com.hexagonkt.store -import com.hexagonkt.CachedWorld -import com.hexagonkt.Fortune +import com.hexagonkt.model.CachedWorld +import com.hexagonkt.model.Fortune import com.hexagonkt.Settings -import com.hexagonkt.World +import com.hexagonkt.model.World import com.hexagonkt.core.Jvm import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource @@ -11,13 +11,14 @@ import org.cache2k.Cache import java.sql.Connection import java.sql.PreparedStatement -internal class BenchmarkSqlStore(engine: String, private val settings: Settings = Settings()) - : BenchmarkStore(settings) { +internal class BenchmarkSqlStore( + engine: String, private val settings: Settings = Settings() +) : BenchmarkStore(settings) { companion object { - private const val SELECT_WORLD = "select * from world where id = ?" - private const val UPDATE_WORLD = "update world set randomNumber = ? where id = ?" - private const val SELECT_ALL_FORTUNES = "select * from fortune" + private const val SELECT_WORLD: String = "select * from world where id = ?" + private const val UPDATE_WORLD: String = "update world set randomNumber = ? where id = ?" + private const val SELECT_ALL_FORTUNES: String = "select * from fortune" } private val dataSource: HikariDataSource by lazy { @@ -102,7 +103,9 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings dataSource.close() } - private fun Connection.findWorld(id: Int, stmtSelect: PreparedStatement = prepareStatement(SELECT_WORLD)): World { + private fun Connection.findWorld( + id: Int, stmtSelect: PreparedStatement = prepareStatement(SELECT_WORLD) + ): World { stmtSelect.setInt(1, id) val rs = stmtSelect.executeQuery() rs.next() diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt index 2c6ce918128..5182fe4ccae 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt +++ b/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt @@ -1,9 +1,9 @@ package com.hexagonkt.store -import com.hexagonkt.CachedWorld -import com.hexagonkt.Fortune +import com.hexagonkt.model.CachedWorld +import com.hexagonkt.model.Fortune import com.hexagonkt.Settings -import com.hexagonkt.World +import com.hexagonkt.model.World import org.cache2k.Cache import org.cache2k.Cache2kBuilder From 2eda84c7a5658c100df2b8cfa246149e53b24331 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 3 Jan 2023 20:20:22 +0100 Subject: [PATCH 0111/1766] Version updates --- frameworks/Kotlin/hexagon/build.gradle | 15 ++++++++------- .../hexagon/hexagon-jettyloom-pgclient.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-jettyloom.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-netty.dockerfile | 2 +- .../hexagon-nettyepoll-pgclient.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- 8 files changed, 15 insertions(+), 14 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index ad55d00bcfd..d4830752b19 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,16 +1,17 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.7.22" + id "org.jetbrains.kotlin.jvm" version "1.8.0" } ext { - hexagonVersion = "2.2.7" + hexagonVersion = "2.3.1" + hexagonExtraVersion = "2.3.1" hikariVersion = "5.0.1" - jettyVersion = "11.0.12" - postgresqlVersion = "42.5.0" - vertxVersion = "4.3.5" + jettyVersion = "11.0.13" + postgresqlVersion = "42.5.1" + vertxVersion = "4.3.7" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.85.Final" + nettyVersion = "4.1.86.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } @@ -49,7 +50,7 @@ dependencies { providedCompile("org.eclipse.jetty:jetty-webapp:$jettyVersion") { exclude module: "slf4j-api" } } -task("minimizeTemplate") { +tasks.register("minimizeTemplate") { doLast { File template = file("$buildDir/resources/main/fortunes.pebble.html") List lines = template.readLines().collect { it.trim() } diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 18d9d309d13..0325868b645 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.5.1-jdk17-alpine AS build +FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index e681fc03572..2bd37096b09 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.5.1-jdk17-alpine AS build +FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index 05c93562cf0..9c11f65f9ae 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.5.1-jdk17-alpine AS build +FROM gradle:7.6-jdk17-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 efc4db12aaa..2ceeae57fe7 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.5.1-jdk17-alpine AS build +FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 87260f430e9..31052f788cd 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.5.1-jdk17-alpine AS build +FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index d15c7180a93..ecef1005aad 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.5.1-jdk17-alpine AS build +FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 6edc32dc1dd..45a775be916 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.5.1-jdk17-alpine AS build +FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon From 40afa7e5dbd7c0ee9de65fe2de5326671e47af32 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 6 Jan 2023 19:16:12 +0100 Subject: [PATCH 0112/1766] Version updates --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index d4830752b19..cc2cd56c48b 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,8 +4,8 @@ plugins { } ext { - hexagonVersion = "2.3.1" - hexagonExtraVersion = "2.3.1" + hexagonVersion = "2.4.0" + hexagonExtraVersion = "2.4.0" hikariVersion = "5.0.1" jettyVersion = "11.0.13" postgresqlVersion = "42.5.1" From 9515299f484a45c20c031dae153e2eec61a62a90 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 7 Jan 2023 00:28:11 +0100 Subject: [PATCH 0113/1766] Version updates --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index cc2cd56c48b..471454d5304 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -4,7 +4,7 @@ plugins { } ext { - hexagonVersion = "2.4.0" + hexagonVersion = "2.4.1" hexagonExtraVersion = "2.4.0" hikariVersion = "5.0.1" jettyVersion = "11.0.13" From 000034778069927c9ca91b1c1712c0f366292509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 27 Jan 2023 15:35:43 +0800 Subject: [PATCH 0114/1766] config thread num --- .../src/main/java/org/smartboot/http/Bootstrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index a4acd4df6b7..5447ca24445 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -29,7 +29,7 @@ public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); public static void main(String[] args) { - ExecutorService executorService = new ThreadPoolExecutor(1, 1, + ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors(), 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(128), new ThreadPoolExecutor.CallerRunsPolicy()); HttpRouteHandler routeHandle = new HttpRouteHandler(); From b26a9446995b718e135c495573856ad83277c8f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 27 Jan 2023 15:46:27 +0800 Subject: [PATCH 0115/1766] config thread num --- .../java/org/smartboot/http/Bootstrap.java | 10 +-- .../http/MultipleQueriesHandler.java | 54 +++++++------ .../smartboot/http/SingleQueryHandler.java | 41 ++++++---- .../org/smartboot/http/UpdateHandler.java | 78 +++++++++++-------- 4 files changed, 107 insertions(+), 76 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 5447ca24445..c44f67335b0 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -57,7 +57,7 @@ public void handle(HttpRequest request, HttpResponse response, CompletableFuture }); } }); - initDB(routeHandle); + initDB(routeHandle,executorService); int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); @@ -70,7 +70,7 @@ public void handle(HttpRequest request, HttpResponse response, CompletableFuture bootstrap.httpHandler(routeHandle).setPort(8080).start(); } - private static void initDB(HttpRouteHandler routeHandle) { + private static void initDB(HttpRouteHandler routeHandle,ExecutorService executorService) { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { @@ -85,9 +85,9 @@ private static void initDB(HttpRouteHandler routeHandle) { config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); DataSource dataSource = new HikariDataSource(config); - routeHandle.route("/db", new SingleQueryHandler(dataSource)) - .route("/queries", new MultipleQueriesHandler(dataSource)) - .route("/updates", new UpdateHandler(dataSource)); + routeHandle.route("/db", new SingleQueryHandler(dataSource,executorService)) + .route("/queries", new MultipleQueriesHandler(dataSource,executorService)) + .route("/updates", new UpdateHandler(dataSource,executorService)); // .route("/fortunes", new FortunesHandler(dataSource)); } } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index d623f3bf1de..d411f813ac1 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -11,6 +11,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadLocalRandom; /** @@ -19,34 +21,42 @@ */ public class MultipleQueriesHandler extends HttpServerHandler { private DataSource dataSource; + private ExecutorService executorService; - public MultipleQueriesHandler(DataSource dataSource) { + public MultipleQueriesHandler(DataSource dataSource, ExecutorService executorService) { this.dataSource = dataSource; + this.executorService = executorService; } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); - World[] worlds = new World[queries]; - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - - for (int i = 0; i < queries; i++) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - World world = new World(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - worlds[i] = world; - preparedStatement.clearParameters(); - } + public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws IOException { + executorService.execute(() -> { + try { + int queries = Math.min(Math.max(NumberUtils.toInt(request.getParameter("queries"), 1), 1), 500); + World[] worlds = new World[queries]; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + + for (int i = 0; i < queries; i++) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + World world = new World(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + worlds[i] = world; + preparedStatement.clearParameters(); + } - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, worlds); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, worlds); + } finally { + completableFuture.complete(null); + } + }); } protected int getRandomNumber() { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index e72f4b06433..c531a161ca4 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -10,6 +10,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadLocalRandom; /** @@ -19,25 +21,34 @@ public class SingleQueryHandler extends HttpServerHandler { private DataSource dataSource; - public SingleQueryHandler(DataSource dataSource) { + private ExecutorService executorService; + + public SingleQueryHandler(DataSource dataSource, ExecutorService executorService) { this.dataSource = dataSource; + this.executorService = executorService; } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - World world = new World(); - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, world); + public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws IOException { + executorService.execute(() -> { + try { + World world = new World(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, world); + } finally { + completableFuture.complete(null); + } + }); } protected int getRandomNumber() { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index 065bed5a9a6..7b81f2e8772 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -12,6 +12,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.StringJoiner; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadLocalRandom; /** @@ -20,49 +22,57 @@ */ public class UpdateHandler extends HttpServerHandler { private DataSource dataSource; + private ExecutorService executorService; - public UpdateHandler(DataSource dataSource) { + public UpdateHandler(DataSource dataSource, ExecutorService executorService) { this.dataSource = dataSource; + this.executorService = executorService; } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); - World[] worlds = new World[queries]; - StringJoiner updateSql = new StringJoiner( - ", ", - "UPDATE world SET randomnumber = temp.randomnumber FROM (VALUES ", - " ORDER BY 1) AS temp(id, randomnumber) WHERE temp.id = world.id"); - try (Connection connection = dataSource.getConnection()) { + public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { + executorService.execute(() -> { + try { + int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); + World[] worlds = new World[queries]; + StringJoiner updateSql = new StringJoiner( + ", ", + "UPDATE world SET randomnumber = temp.randomnumber FROM (VALUES ", + " ORDER BY 1) AS temp(id, randomnumber) WHERE temp.id = world.id"); + try (Connection connection = dataSource.getConnection()) { - try (PreparedStatement queryPreparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - for (int i = 0; i < queries; i++) { - queryPreparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = queryPreparedStatement.executeQuery(); - resultSet.next(); - World world = new World(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(getRandomNumber()); - worlds[i] = world; - queryPreparedStatement.clearParameters(); - updateSql.add("(?, ?)"); - } - } + try (PreparedStatement queryPreparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + for (int i = 0; i < queries; i++) { + queryPreparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = queryPreparedStatement.executeQuery(); + resultSet.next(); + World world = new World(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(getRandomNumber()); + worlds[i] = world; + queryPreparedStatement.clearParameters(); + updateSql.add("(?, ?)"); + } + } - try (PreparedStatement preparedStatement = connection.prepareStatement(updateSql.toString());) { - int i = 0; - for (World world : worlds) { - preparedStatement.setInt(++i, world.getId()); - preparedStatement.setInt(++i, world.getRandomNumber()); + try (PreparedStatement preparedStatement = connection.prepareStatement(updateSql.toString());) { + int i = 0; + for (World world : worlds) { + preparedStatement.setInt(++i, world.getId()); + preparedStatement.setInt(++i, world.getRandomNumber()); + } + preparedStatement.executeUpdate(); + } + + } catch (SQLException throwables) { + throwables.printStackTrace(); } - preparedStatement.executeUpdate(); + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, worlds); + } finally { + completableFuture.complete(null); } - - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, worlds); + }); } protected int getRandomNumber() { From 243d6beadda4666780c77ca12624d8a6d8b2aa6a Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 1 Feb 2023 15:35:16 +0100 Subject: [PATCH 0116/1766] [Hexagon] Refactor and updates: * Update Hexagon version * Use Rocker template * Modularize the different scenarios --- frameworks/Kotlin/hexagon/build.gradle | 55 ++++-------------- frameworks/Kotlin/hexagon/core/build.gradle | 34 +++++++++++ .../hexagon/core/src/main/kotlin/Benchmark.kt | 27 +++++++++ .../{ => core}/src/main/kotlin/Controller.kt | 25 ++++----- .../{ => core}/src/main/kotlin/Settings.kt | 7 ++- .../src/main/kotlin/model/CachedWorld.kt | 0 .../src/main/kotlin/model/Fortune.kt | 0 .../src/main/kotlin/model/Message.kt | 0 .../{ => core}/src/main/kotlin/model/World.kt | 0 .../src/main/kotlin/store/BenchmarkStore.kt | 0 .../src/main/resources/fortunes.pebble.html | 0 .../src/main/resources/fortunes.rocker.html | 24 ++++++++ .../hexagon-jettyloom-pgclient.dockerfile | 14 ++--- .../hexagon/hexagon-jettyloom.dockerfile | 14 ++--- .../Kotlin/hexagon/hexagon-netty.dockerfile | 16 ++---- .../hexagon-nettyepoll-pgclient.dockerfile | 16 ++---- .../hexagon/hexagon-nettyepoll.dockerfile | 16 ++---- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 12 ++-- frameworks/Kotlin/hexagon/hexagon.dockerfile | 16 ++---- .../hexagon_jetty_pgclient/build.gradle | 13 +++++ .../src/main/kotlin/Benchmark.kt | 23 ++++++++ .../hexagon_jetty_postgresql/build.gradle | 13 +++++ .../src/main/kotlin/Benchmark.kt | 23 ++++++++ .../hexagon_netty_postgresql/build.gradle | 13 +++++ .../src/main/kotlin/Benchmark.kt | 17 ++++++ .../hexagon_nettyepoll_pgclient/build.gradle | 14 +++++ .../src/main/kotlin/Benchmark.kt | 17 ++++++ .../build.gradle | 14 +++++ .../src/main/kotlin/Benchmark.kt | 17 ++++++ .../hexagon_tomcat_postgresql/build.gradle | 15 +++++ .../src/main/kotlin/WebListenerServer.kt | 12 +++- frameworks/Kotlin/hexagon/settings.gradle | 13 +++++ .../hexagon/src/main/kotlin/Benchmark.kt | 56 ------------------- .../hexagon/store_pgclient/build.gradle | 6 ++ .../main/kotlin}/BenchmarkPgClientStore.kt | 5 +- .../Kotlin/hexagon/store_sql/build.gradle | 6 ++ .../src/main/kotlin}/BenchmarkSqlStore.kt | 2 +- 37 files changed, 367 insertions(+), 188 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/core/build.gradle create mode 100644 frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt rename frameworks/Kotlin/hexagon/{ => core}/src/main/kotlin/Controller.kt (88%) rename frameworks/Kotlin/hexagon/{ => core}/src/main/kotlin/Settings.kt (82%) rename frameworks/Kotlin/hexagon/{ => core}/src/main/kotlin/model/CachedWorld.kt (100%) rename frameworks/Kotlin/hexagon/{ => core}/src/main/kotlin/model/Fortune.kt (100%) rename frameworks/Kotlin/hexagon/{ => core}/src/main/kotlin/model/Message.kt (100%) rename frameworks/Kotlin/hexagon/{ => core}/src/main/kotlin/model/World.kt (100%) rename frameworks/Kotlin/hexagon/{ => core}/src/main/kotlin/store/BenchmarkStore.kt (100%) rename frameworks/Kotlin/hexagon/{ => core}/src/main/resources/fortunes.pebble.html (100%) create mode 100644 frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.rocker.html create mode 100644 frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle rename frameworks/Kotlin/hexagon/{ => hexagon_tomcat_postgresql}/src/main/kotlin/WebListenerServer.kt (62%) create mode 100644 frameworks/Kotlin/hexagon/settings.gradle delete mode 100644 frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/store_pgclient/build.gradle rename frameworks/Kotlin/hexagon/{src/main/kotlin/store => store_pgclient/src/main/kotlin}/BenchmarkPgClientStore.kt (97%) create mode 100644 frameworks/Kotlin/hexagon/store_sql/build.gradle rename frameworks/Kotlin/hexagon/{src/main/kotlin/store => store_sql/src/main/kotlin}/BenchmarkSqlStore.kt (99%) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 471454d5304..c20ee5868d8 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,61 +1,26 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.8.0" + id "org.jetbrains.kotlin.jvm" version "1.8.0" apply false } +version = "1.0.0" +description = "TFB benchmark" +group = "com.hexagonkt" + ext { - hexagonVersion = "2.4.1" - hexagonExtraVersion = "2.4.0" + hexagonVersion = "2.5.0" hikariVersion = "5.0.1" jettyVersion = "11.0.13" postgresqlVersion = "42.5.1" vertxVersion = "4.3.7" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.86.Final" + nettyVersion = "4.1.87.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } -apply(from: "$gradleScripts/kotlin.gradle") -apply(from: "$gradleScripts/application.gradle") - -apply(plugin: "war") +defaultTasks("build") -defaultTasks("installDist") - -application { - mainClass.set("com.hexagonkt.BenchmarkKt") +subprojects { + apply(from: "$gradleScripts/kotlin.gradle") } - -war { - archiveFileName = "ROOT.war" -} - -installDist.dependsOn("war") - -dependencies { - implementation("com.hexagonkt:http_server_netty_epoll:$hexagonVersion") - implementation("com.hexagonkt:http_server_jetty:$hexagonVersion") - implementation("com.hexagonkt:templates_pebble:$hexagonVersion") - implementation("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") - implementation("com.hexagonkt:serialization_dsl_json:$hexagonVersion") - - implementation("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") - implementation("org.cache2k:cache2k-core:$cache2kVersion") - implementation("com.zaxxer:HikariCP:$hikariVersion") - implementation("org.postgresql:postgresql:$postgresqlVersion") - implementation("io.vertx:vertx-pg-client:$vertxVersion") - - // providedCompile excludes the dependency only in the WAR, not in the distribution - providedCompile("org.eclipse.jetty:jetty-webapp:$jettyVersion") { exclude module: "slf4j-api" } -} - -tasks.register("minimizeTemplate") { - doLast { - File template = file("$buildDir/resources/main/fortunes.pebble.html") - List lines = template.readLines().collect { it.trim() } - template.write(lines.join("")) - } -} - -assemble.dependsOn("minimizeTemplate") diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle new file mode 100644 index 00000000000..45d18cda86f --- /dev/null +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -0,0 +1,34 @@ + +plugins { + id("nu.studer.rocker") version("3.0.4") +} + +dependencies { + api("com.hexagonkt:http_server:$hexagonVersion") + api("com.hexagonkt:templates_pebble:$hexagonVersion") + api("com.hexagonkt:templates_rocker:$hexagonVersion") + api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") + api("com.hexagonkt:serialization_dsl_json:$hexagonVersion") + api("org.cache2k:cache2k-core:$cache2kVersion") +} + +tasks.register("minimizeTemplate") { + doLast { + [ "fortunes.pebble.html", "fortunes.rocker.html" ].forEach { t -> + File template = file("$buildDir/resources/main/$t") + List lines = template.readLines().collect { it.trim() } + template.write(lines.join("")) + } + } +} + +jar.dependsOn("minimizeTemplate") + +rocker { + configurations { + create("main") { + templateDir.set(file("src/main/resources")) + optimize.set(true) + } + } +} diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..ef2da876dae --- /dev/null +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt @@ -0,0 +1,27 @@ +package com.hexagonkt + +import com.hexagonkt.http.server.HttpServer +import com.hexagonkt.http.server.HttpServerPort +import com.hexagonkt.http.server.HttpServerSettings +import com.hexagonkt.store.BenchmarkStore +import com.hexagonkt.templates.TemplatePort +import java.net.InetAddress +import java.net.URL + +class Benchmark( + private val engine: HttpServerPort, + private val store: BenchmarkStore, + private val template: TemplatePort, + private val templateUrl: URL, + private val settings: Settings = Settings(), +) { + val server: HttpServer by lazy { + val controller = Controller(settings, store, template, templateUrl) + val serverSettings = HttpServerSettings( + bindAddress = InetAddress.getByName(settings.bindAddress), + bindPort = settings.bindPort, + ) + + HttpServer(engine, controller.path, serverSettings) + } +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt similarity index 88% rename from frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt rename to frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt index ce82a5c152f..4ad7055e8e1 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt @@ -7,10 +7,10 @@ import com.hexagonkt.core.media.TextMedia.PLAIN import com.hexagonkt.http.model.ContentType import com.hexagonkt.http.model.Header import com.hexagonkt.http.model.Headers +import com.hexagonkt.http.server.callbacks.DateCallback import com.hexagonkt.http.server.handlers.HttpServerContext import com.hexagonkt.http.server.handlers.PathHandler import com.hexagonkt.http.server.handlers.path -import com.hexagonkt.http.toHttpFormat import com.hexagonkt.model.* import com.hexagonkt.serialization.dsl.json.Json import com.hexagonkt.serialization.serialize @@ -18,7 +18,6 @@ import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort import java.net.URL -import java.time.LocalDateTime.now import java.util.concurrent.ThreadLocalRandom import kotlin.text.Charsets.UTF_8 @@ -27,29 +26,26 @@ class Controller( settings: Settings, store: BenchmarkStore, templateEngine: TemplatePort, + templateUrl: URL, ) { private val queriesParam: String = settings.queriesParam private val cachedQueriesParam: String = settings.cachedQueriesParam private val worldRows: Int = settings.worldRows + private val textMessage: String = settings.textMessage private val plain: ContentType = ContentType(PLAIN) private val json: ContentType = ContentType(JSON) private val html: ContentType = ContentType(HTML, charset = UTF_8) - private val templateUrl: URL = URL("classpath:fortunes.pebble.html") + private val headers = Headers(Header("server", "Hexagon")) - private val headers = Headers( - Header("server", "Hexagon"), - ) - - internal val path: PathHandler by lazy { + val path: PathHandler by lazy { path { - on("*") { - send(headers = headers + Header("date", now().toHttpFormat())) - } + on("*") { send(headers = headers) } + on("*", DateCallback()) - get("/plaintext") { ok(settings.textMessage, contentType = plain) } - get("/json") { ok(Message(settings.textMessage).toMap().serialize(Json.raw), contentType = json) } + get("/plaintext") { ok(textMessage, contentType = plain) } + get("/json") { ok(Message(textMessage).toJson(), contentType = json) } get("/fortunes") { listFortunes(store, templateUrl, templateEngine) } get("/db") { dbQuery(store) } get("/query") { getWorlds(store) } @@ -58,6 +54,9 @@ class Controller( } } + private fun Message.toJson(): String = + toMap().serialize(Json.raw) + private fun HttpServerContext.listFortunes( store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort ): HttpServerContext { diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Settings.kt similarity index 82% rename from frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt rename to frameworks/Kotlin/hexagon/core/src/main/kotlin/Settings.kt index 36c8f8f44e2..b11ed02c9e9 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Settings.kt @@ -1,5 +1,6 @@ package com.hexagonkt +import com.hexagonkt.core.Jvm.systemFlag import com.hexagonkt.core.Jvm.systemSettingOrNull data class Settings( @@ -23,9 +24,9 @@ data class Settings( val databaseName: String = systemSettingOrNull("database") ?: "hello_world", val databaseDriver: String = systemSettingOrNull("databaseDriver") ?: "org.postgresql.Driver", - val sendDateHeader: Boolean = systemSettingOrNull("sendDateHeader") ?: false, - val sendServerVersion: Boolean = systemSettingOrNull("sendServerVersion") ?: false, - val sendXPoweredBy: Boolean = systemSettingOrNull("sendXPoweredBy") ?: false, + val sendDateHeader: Boolean = systemFlag("sendDateHeader"), + val sendServerVersion: Boolean = systemFlag("sendServerVersion"), + val sendXPoweredBy: Boolean = systemFlag("sendXPoweredBy"), val worldRows: Int = 10_000, val textMessage: String = "Hello, World!", diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/CachedWorld.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/model/CachedWorld.kt similarity index 100% rename from frameworks/Kotlin/hexagon/src/main/kotlin/model/CachedWorld.kt rename to frameworks/Kotlin/hexagon/core/src/main/kotlin/model/CachedWorld.kt diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/Fortune.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/model/Fortune.kt similarity index 100% rename from frameworks/Kotlin/hexagon/src/main/kotlin/model/Fortune.kt rename to frameworks/Kotlin/hexagon/core/src/main/kotlin/model/Fortune.kt diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/Message.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/model/Message.kt similarity index 100% rename from frameworks/Kotlin/hexagon/src/main/kotlin/model/Message.kt rename to frameworks/Kotlin/hexagon/core/src/main/kotlin/model/Message.kt diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/model/World.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/model/World.kt similarity index 100% rename from frameworks/Kotlin/hexagon/src/main/kotlin/model/World.kt rename to frameworks/Kotlin/hexagon/core/src/main/kotlin/model/World.kt diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/store/BenchmarkStore.kt similarity index 100% rename from frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkStore.kt rename to frameworks/Kotlin/hexagon/core/src/main/kotlin/store/BenchmarkStore.kt diff --git a/frameworks/Kotlin/hexagon/src/main/resources/fortunes.pebble.html b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html similarity index 100% rename from frameworks/Kotlin/hexagon/src/main/resources/fortunes.pebble.html rename to frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html diff --git a/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.rocker.html b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.rocker.html new file mode 100644 index 00000000000..c9a9d4037e5 --- /dev/null +++ b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.rocker.html @@ -0,0 +1,24 @@ +@import java.util.* +@import com.hexagonkt.model.Fortune +@args(Map context) + + + + + Fortunes + + + + + + + + @for ((fortune) : (Collection)context.get("fortunes")) { + + + + + } +
idmessage
@fortune.getId()@fortune.getMessage()
+ + diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 0325868b645..c04d91d0118 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -5,22 +5,18 @@ FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon -COPY src src -COPY build.gradle build.gradle +ADD . . +RUN gradle --quiet compileRocker RUN gradle --quiet -x test # # RUNTIME # FROM eclipse-temurin:19-jre-alpine -ENV DBSTORE pg_client -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE jetty_loom -ENV PROJECT hexagon -ENV DISABLE_CHECKS true -ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV PROJECT hexagon_jetty_pgclient +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true -COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 2bd37096b09..656cf8f03ed 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -5,22 +5,18 @@ FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon -COPY src src -COPY build.gradle build.gradle +ADD . . +RUN gradle --quiet compileRocker RUN gradle --quiet -x test # # RUNTIME # FROM eclipse-temurin:19-jre-alpine -ENV DBSTORE postgresql -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE jetty_loom -ENV PROJECT hexagon -ENV DISABLE_CHECKS true -ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV PROJECT hexagon_jetty_postgresql +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true -COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index 9c11f65f9ae..c11b0302d41 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -5,22 +5,18 @@ FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon -COPY src src -COPY build.gradle build.gradle +ADD . . +RUN gradle --quiet compileRocker RUN gradle --quiet -x test # # RUNTIME # -FROM eclipse-temurin:19-jre-alpine -ENV DBSTORE postgresql -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE netty -ENV PROJECT hexagon -ENV DISABLE_CHECKS true -ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +FROM eclipse-temurin:17-jre-alpine +ENV PROJECT hexagon_netty_postgresql +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index 2ceeae57fe7..e9d065bbf95 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -5,22 +5,18 @@ FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon -COPY src src -COPY build.gradle build.gradle +ADD . . +RUN gradle --quiet compileRocker RUN gradle --quiet -x test # # RUNTIME # -FROM eclipse-temurin:19-jre-alpine -ENV DBSTORE pg_client -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE netty_epoll -ENV PROJECT hexagon -ENV DISABLE_CHECKS true -ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +FROM eclipse-temurin:17-jre-alpine +ENV PROJECT hexagon_nettyepoll_pgclient +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 31052f788cd..c7beb493420 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -5,22 +5,18 @@ FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon -COPY src src -COPY build.gradle build.gradle +ADD . . +RUN gradle --quiet compileRocker RUN gradle --quiet -x test # # RUNTIME # -FROM eclipse-temurin:19-jre-alpine -ENV DBSTORE postgresql -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE netty_epoll -ENV PROJECT hexagon -ENV DISABLE_CHECKS true -ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +FROM eclipse-temurin:17-jre-alpine +ENV PROJECT hexagon_nettyepoll_postgresql +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index ecef1005aad..c8c2f74a319 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -5,18 +5,16 @@ FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon -COPY src src -COPY build.gradle build.gradle +ADD . . +RUN gradle --quiet compileRocker RUN gradle --quiet -x test # # RUNTIME # FROM tomcat:10.1.2-jre17-temurin -ENV DBSTORE postgresql -ENV POSTGRESQL_DB_HOST tfb-database -ENV DISABLE_CHECKS true -ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV MODULE /hexagon/hexagon_tomcat_postgresql +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=build /hexagon/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war +COPY --from=build $MODULE/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080 diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 45a775be916..2d1ee3d3819 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -5,22 +5,18 @@ FROM gradle:7.6-jdk17-alpine AS build USER root WORKDIR /hexagon -COPY src src -COPY build.gradle build.gradle +ADD . . +RUN gradle --quiet compileRocker RUN gradle --quiet -x test # # RUNTIME # -FROM eclipse-temurin:19-jre-alpine -ENV DBSTORE postgresql -ENV POSTGRESQL_DB_HOST tfb-database -ENV WEBENGINE jetty -ENV PROJECT hexagon -ENV DISABLE_CHECKS true -ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +FROM eclipse-temurin:17-jre-alpine +ENV PROJECT hexagon_jetty_postgresql +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -COPY --from=build /hexagon/build/install/$PROJECT /opt/$PROJECT +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT EXPOSE 9090 diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle new file mode 100644 index 00000000000..71e2dc0f44f --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle @@ -0,0 +1,13 @@ + +apply(from: "$gradleScripts/application.gradle") + +application { + mainClass.set("com.hexagonkt.BenchmarkKt") +} + +dependencies { + api(project(":store_pgclient")) + api("com.hexagonkt:http_server_jetty:$hexagonVersion") +} + +build.dependsOn("installDist") diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..983831ad866 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt @@ -0,0 +1,23 @@ +package com.hexagonkt + +import com.hexagonkt.core.Jvm.systemFlag +import com.hexagonkt.http.server.jetty.JettyServletAdapter +import com.hexagonkt.store.BenchmarkPgClientStore +import com.hexagonkt.templates.rocker.RockerAdapter +import java.net.URL + +fun main() { + val settings = Settings() + val store = BenchmarkPgClientStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = URL("classpath:fortunes.rocker.html") + val engine = JettyServletAdapter( + sendDateHeader = settings.sendDateHeader, + sendServerVersion = settings.sendServerVersion, + sendXPoweredBy = settings.sendXPoweredBy, + useVirtualThreads = systemFlag("virtualThreads"), + ) + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle new file mode 100644 index 00000000000..09dde4a8327 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle @@ -0,0 +1,13 @@ + +apply(from: "$gradleScripts/application.gradle") + +application { + mainClass.set("com.hexagonkt.BenchmarkKt") +} + +dependencies { + api(project(":store_sql")) + api("com.hexagonkt:http_server_jetty:$hexagonVersion") +} + +build.dependsOn("installDist") diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..1ba499672b8 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt @@ -0,0 +1,23 @@ +package com.hexagonkt + +import com.hexagonkt.core.Jvm.systemFlag +import com.hexagonkt.http.server.jetty.JettyServletAdapter +import com.hexagonkt.store.BenchmarkSqlStore +import com.hexagonkt.templates.rocker.RockerAdapter +import java.net.URL + +fun main() { + val settings = Settings() + val store = BenchmarkSqlStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = URL("classpath:fortunes.rocker.html") + val engine = JettyServletAdapter( + sendDateHeader = settings.sendDateHeader, + sendServerVersion = settings.sendServerVersion, + sendXPoweredBy = settings.sendXPoweredBy, + useVirtualThreads = systemFlag("virtualThreads"), + ) + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle new file mode 100644 index 00000000000..e06ac14aff0 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle @@ -0,0 +1,13 @@ + +apply(from: "$gradleScripts/application.gradle") + +application { + mainClass.set("com.hexagonkt.BenchmarkKt") +} + +dependencies { + api(project(":store_sql")) + api("com.hexagonkt:http_server_netty:$hexagonVersion") +} + +build.dependsOn("installDist") diff --git a/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..100af29d51e --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt @@ -0,0 +1,17 @@ +package com.hexagonkt + +import com.hexagonkt.http.server.netty.NettyServerAdapter +import com.hexagonkt.store.BenchmarkSqlStore +import com.hexagonkt.templates.rocker.RockerAdapter +import java.net.URL + +fun main() { + val settings = Settings() + val store = BenchmarkSqlStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = URL("classpath:fortunes.rocker.html") + val engine = NettyServerAdapter() + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle new file mode 100644 index 00000000000..07ecf663690 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle @@ -0,0 +1,14 @@ + +apply(from: "$gradleScripts/application.gradle") + +application { + mainClass.set("com.hexagonkt.BenchmarkKt") +} + +dependencies { + api(project(":store_pgclient")) + api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion") + api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") +} + +build.dependsOn("installDist") diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..abe085171f2 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt @@ -0,0 +1,17 @@ +package com.hexagonkt + +import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter +import com.hexagonkt.store.BenchmarkPgClientStore +import com.hexagonkt.templates.rocker.RockerAdapter +import java.net.URL + +fun main() { + val settings = Settings() + val store = BenchmarkPgClientStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = URL("classpath:fortunes.rocker.html") + val engine = NettyEpollServerAdapter() + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle new file mode 100644 index 00000000000..b314102ff80 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle @@ -0,0 +1,14 @@ + +apply(from: "$gradleScripts/application.gradle") + +application { + mainClass.set("com.hexagonkt.BenchmarkKt") +} + +dependencies { + api(project(":store_sql")) + api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion") + api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") +} + +build.dependsOn("installDist") diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..d0c2aa58347 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt @@ -0,0 +1,17 @@ +package com.hexagonkt + +import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter +import com.hexagonkt.store.BenchmarkSqlStore +import com.hexagonkt.templates.rocker.RockerAdapter +import java.net.URL + +fun main() { + val settings = Settings() + val store = BenchmarkSqlStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = URL("classpath:fortunes.rocker.html") + val engine = NettyEpollServerAdapter() + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle new file mode 100644 index 00000000000..3c72b9d4b0a --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle @@ -0,0 +1,15 @@ + +apply(plugin: "war") + +war { + archiveFileName = "ROOT.war" +} + +build.dependsOn("war") + +dependencies { + api(project(":store_sql")) + api("com.hexagonkt:http_server_servlet:$hexagonVersion") + + compileOnly("jakarta.servlet:jakarta.servlet-api:5.0.0") +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt similarity index 62% rename from frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt rename to frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt index 7da14b44cf5..cdf911e1ee9 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt @@ -6,16 +6,22 @@ import com.hexagonkt.http.server.handlers.HttpHandler import com.hexagonkt.http.server.handlers.OnHandler import com.hexagonkt.http.server.servlet.ServletServer import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.pebble.PebbleAdapter +import com.hexagonkt.templates.rocker.RockerAdapter import jakarta.servlet.annotation.WebListener +import java.net.URL -@WebListener class WebListenerServer(settings: Settings = Settings()) : ServletServer(createHandlers(settings)) { +@WebListener class WebListenerServer( + settings: Settings = Settings() +) : ServletServer(createHandlers(settings)) { private companion object { val headers = Headers(Header("server", "Tomcat")) fun createHandlers(settings: Settings): List { - val controller = Controller(settings, BenchmarkSqlStore("postgresql"), PebbleAdapter()) + val store = BenchmarkSqlStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = URL("classpath:fortunes.rocker.html") + val controller = Controller(settings, store, templateEngine, templateUrl) val controllerPath = controller.path val serverHeaderHandler = OnHandler("*") { send(headers = headers) diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle new file mode 100644 index 00000000000..2d571cdc706 --- /dev/null +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -0,0 +1,13 @@ + +include( + "core", + "store_pgclient", + "store_sql", + + "hexagon_jetty_pgclient", + "hexagon_jetty_postgresql", + "hexagon_netty_postgresql", + "hexagon_nettyepoll_pgclient", + "hexagon_nettyepoll_postgresql", + "hexagon_tomcat_postgresql", +) diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt deleted file mode 100644 index a296a9d261d..00000000000 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.hexagonkt - -import com.hexagonkt.http.server.HttpServer -import com.hexagonkt.http.server.HttpServerPort -import com.hexagonkt.http.server.HttpServerSettings -import com.hexagonkt.http.server.jetty.JettyServletAdapter -import com.hexagonkt.http.server.netty.NettyServerAdapter -import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter -import com.hexagonkt.store.BenchmarkPgClientStore -import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.store.BenchmarkStore -import com.hexagonkt.templates.pebble.PebbleAdapter -import java.net.InetAddress - -internal val settings = Settings() - -private val engines: Map by lazy { - mapOf( - "jetty" to JettyServletAdapter( - sendDateHeader = settings.sendDateHeader, - sendServerVersion = settings.sendServerVersion, - sendXPoweredBy = settings.sendXPoweredBy, - ), - "jetty_loom" to JettyServletAdapter( - sendDateHeader = settings.sendDateHeader, - sendServerVersion = settings.sendServerVersion, - sendXPoweredBy = settings.sendXPoweredBy, - useVirtualThreads = true, - ), - "netty" to NettyServerAdapter(), - "netty_epoll" to NettyEpollServerAdapter(), - ) -} - -private val stores: Map by lazy { - mapOf( - "postgresql" to BenchmarkSqlStore("postgresql"), - "pg_client" to BenchmarkPgClientStore("postgresql"), - ) -} - -internal val server: HttpServer by lazy { - val engine = engines[settings.webEngine] ?: error("Unsupported server engine") - val store = stores[settings.dataStore] ?: error("Unsupported data store") - val controller = Controller(settings, store, PebbleAdapter()) - val serverSettings = HttpServerSettings( - bindAddress = InetAddress.getByName(settings.bindAddress), - bindPort = settings.bindPort, - ) - - HttpServer(engine, controller.path, serverSettings) -} - -fun main() { - server.start() -} diff --git a/frameworks/Kotlin/hexagon/store_pgclient/build.gradle b/frameworks/Kotlin/hexagon/store_pgclient/build.gradle new file mode 100644 index 00000000000..6d0c88ad20e --- /dev/null +++ b/frameworks/Kotlin/hexagon/store_pgclient/build.gradle @@ -0,0 +1,6 @@ + +dependencies { + api(project(":core")) + implementation("io.vertx:vertx-pg-client:$vertxVersion") + implementation("com.ongres.scram:client:2.1") +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt similarity index 97% rename from frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkPgClientStore.kt rename to frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt index cd467c6c34d..5cd13ccee0a 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkPgClientStore.kt +++ b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt @@ -11,8 +11,9 @@ import io.vertx.pgclient.PgPool import io.vertx.sqlclient.* import org.cache2k.Cache -internal class BenchmarkPgClientStore( - engine: String, private val settings: Settings = Settings() +class BenchmarkPgClientStore( + engine: String, + private val settings: Settings = Settings(), ) : BenchmarkStore(settings) { companion object { diff --git a/frameworks/Kotlin/hexagon/store_sql/build.gradle b/frameworks/Kotlin/hexagon/store_sql/build.gradle new file mode 100644 index 00000000000..f154eb6dbae --- /dev/null +++ b/frameworks/Kotlin/hexagon/store_sql/build.gradle @@ -0,0 +1,6 @@ + +dependencies { + api(project(":core")) + implementation("com.zaxxer:HikariCP:$hikariVersion") + implementation("org.postgresql:postgresql:$postgresqlVersion") +} diff --git a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt similarity index 99% rename from frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt rename to frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt index 157ad7c982c..ea871ec1b13 100644 --- a/frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt @@ -11,7 +11,7 @@ import org.cache2k.Cache import java.sql.Connection import java.sql.PreparedStatement -internal class BenchmarkSqlStore( +class BenchmarkSqlStore( engine: String, private val settings: Settings = Settings() ) : BenchmarkStore(settings) { From 90717cc577e1b5b6882b6b632d2eff6223456031 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 1 Feb 2023 16:03:10 +0100 Subject: [PATCH 0117/1766] Fix connection problems --- frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile | 1 + frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile | 1 + frameworks/Kotlin/hexagon/hexagon-netty.dockerfile | 1 + frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile | 1 + frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 1 + frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 1 + frameworks/Kotlin/hexagon/hexagon.dockerfile | 1 + 7 files changed, 7 insertions(+) diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index c04d91d0118..388fd1036b2 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -13,6 +13,7 @@ RUN gradle --quiet -x test # RUNTIME # FROM eclipse-temurin:19-jre-alpine +ENV POSTGRESQL_DB_HOST tfb-database ENV PROJECT hexagon_jetty_pgclient ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 656cf8f03ed..ccf6f8711ee 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -13,6 +13,7 @@ RUN gradle --quiet -x test # RUNTIME # FROM eclipse-temurin:19-jre-alpine +ENV POSTGRESQL_DB_HOST tfb-database ENV PROJECT hexagon_jetty_postgresql ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index c11b0302d41..687f0ce38d1 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -13,6 +13,7 @@ RUN gradle --quiet -x test # RUNTIME # FROM eclipse-temurin:17-jre-alpine +ENV POSTGRESQL_DB_HOST tfb-database ENV PROJECT hexagon_netty_postgresql ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index e9d065bbf95..f3f948746da 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -13,6 +13,7 @@ RUN gradle --quiet -x test # RUNTIME # FROM eclipse-temurin:17-jre-alpine +ENV POSTGRESQL_DB_HOST tfb-database ENV PROJECT hexagon_nettyepoll_pgclient ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index c7beb493420..1bfd11780d3 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -13,6 +13,7 @@ RUN gradle --quiet -x test # RUNTIME # FROM eclipse-temurin:17-jre-alpine +ENV POSTGRESQL_DB_HOST tfb-database ENV PROJECT hexagon_nettyepoll_postgresql ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index c8c2f74a319..677823b9ba7 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -13,6 +13,7 @@ RUN gradle --quiet -x test # RUNTIME # FROM tomcat:10.1.2-jre17-temurin +ENV POSTGRESQL_DB_HOST tfb-database ENV MODULE /hexagon/hexagon_tomcat_postgresql ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 2d1ee3d3819..d0e259d10e0 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -13,6 +13,7 @@ RUN gradle --quiet -x test # RUNTIME # FROM eclipse-temurin:17-jre-alpine +ENV POSTGRESQL_DB_HOST tfb-database ENV PROJECT hexagon_jetty_postgresql ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA From 5418509d3ca2c671ef7a6f27f27e91419a1a0e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 9 Feb 2023 20:52:36 +0800 Subject: [PATCH 0118/1766] revert code --- .../java/org/smartboot/http/Bootstrap.java | 32 +++----- .../http/MultipleQueriesHandler.java | 54 ++++++------- .../smartboot/http/SingleQueryHandler.java | 41 ++++------ .../org/smartboot/http/UpdateHandler.java | 78 ++++++++----------- 4 files changed, 81 insertions(+), 124 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index c44f67335b0..bfa60e03af5 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -19,19 +19,11 @@ import javax.sql.DataSource; import java.io.IOException; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); public static void main(String[] args) { - ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors(), - 0L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(128), new ThreadPoolExecutor.CallerRunsPolicy()); HttpRouteHandler routeHandle = new HttpRouteHandler(); routeHandle .route("/plaintext", new HttpServerHandler() { @@ -45,19 +37,15 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio } }) .route("/json", new HttpServerHandler() { + @Override - public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws IOException { - executorService.execute(() -> { - try { - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); - } finally { - completableFuture.complete(null); - } - }); + public void handle(HttpRequest request, HttpResponse response) throws IOException { + + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); } }); - initDB(routeHandle,executorService); +// initDB(routeHandle); int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); @@ -70,7 +58,7 @@ public void handle(HttpRequest request, HttpResponse response, CompletableFuture bootstrap.httpHandler(routeHandle).setPort(8080).start(); } - private static void initDB(HttpRouteHandler routeHandle,ExecutorService executorService) { + private static void initDB(HttpRouteHandler routeHandle) { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { @@ -85,9 +73,9 @@ private static void initDB(HttpRouteHandler routeHandle,ExecutorService executor config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); DataSource dataSource = new HikariDataSource(config); - routeHandle.route("/db", new SingleQueryHandler(dataSource,executorService)) - .route("/queries", new MultipleQueriesHandler(dataSource,executorService)) - .route("/updates", new UpdateHandler(dataSource,executorService)); + routeHandle.route("/db", new SingleQueryHandler(dataSource)) + .route("/queries", new MultipleQueriesHandler(dataSource)) + .route("/updates", new UpdateHandler(dataSource)); // .route("/fortunes", new FortunesHandler(dataSource)); } } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index d411f813ac1..d623f3bf1de 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -11,8 +11,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadLocalRandom; /** @@ -21,42 +19,34 @@ */ public class MultipleQueriesHandler extends HttpServerHandler { private DataSource dataSource; - private ExecutorService executorService; - public MultipleQueriesHandler(DataSource dataSource, ExecutorService executorService) { + public MultipleQueriesHandler(DataSource dataSource) { this.dataSource = dataSource; - this.executorService = executorService; } @Override - public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws IOException { - executorService.execute(() -> { - try { - int queries = Math.min(Math.max(NumberUtils.toInt(request.getParameter("queries"), 1), 1), 500); - World[] worlds = new World[queries]; - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - - for (int i = 0; i < queries; i++) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - World world = new World(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - worlds[i] = world; - preparedStatement.clearParameters(); - } - - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, worlds); - } finally { - completableFuture.complete(null); + public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { + int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); + World[] worlds = new World[queries]; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + + for (int i = 0; i < queries; i++) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + World world = new World(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + worlds[i] = world; + preparedStatement.clearParameters(); } - }); + + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, worlds); } protected int getRandomNumber() { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index c531a161ca4..e72f4b06433 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -10,8 +10,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadLocalRandom; /** @@ -21,34 +19,25 @@ public class SingleQueryHandler extends HttpServerHandler { private DataSource dataSource; - private ExecutorService executorService; - - public SingleQueryHandler(DataSource dataSource, ExecutorService executorService) { + public SingleQueryHandler(DataSource dataSource) { this.dataSource = dataSource; - this.executorService = executorService; } @Override - public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws IOException { - executorService.execute(() -> { - try { - World world = new World(); - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, world); - } finally { - completableFuture.complete(null); - } - }); + public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { + World world = new World(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, world); } protected int getRandomNumber() { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index 7b81f2e8772..065bed5a9a6 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -12,8 +12,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.StringJoiner; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadLocalRandom; /** @@ -22,57 +20,49 @@ */ public class UpdateHandler extends HttpServerHandler { private DataSource dataSource; - private ExecutorService executorService; - public UpdateHandler(DataSource dataSource, ExecutorService executorService) { + public UpdateHandler(DataSource dataSource) { this.dataSource = dataSource; - this.executorService = executorService; } @Override - public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { - executorService.execute(() -> { - try { - int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); - World[] worlds = new World[queries]; - StringJoiner updateSql = new StringJoiner( - ", ", - "UPDATE world SET randomnumber = temp.randomnumber FROM (VALUES ", - " ORDER BY 1) AS temp(id, randomnumber) WHERE temp.id = world.id"); - try (Connection connection = dataSource.getConnection()) { + public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { + int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); + World[] worlds = new World[queries]; + StringJoiner updateSql = new StringJoiner( + ", ", + "UPDATE world SET randomnumber = temp.randomnumber FROM (VALUES ", + " ORDER BY 1) AS temp(id, randomnumber) WHERE temp.id = world.id"); + try (Connection connection = dataSource.getConnection()) { - try (PreparedStatement queryPreparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - for (int i = 0; i < queries; i++) { - queryPreparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = queryPreparedStatement.executeQuery(); - resultSet.next(); - World world = new World(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(getRandomNumber()); - worlds[i] = world; - queryPreparedStatement.clearParameters(); - updateSql.add("(?, ?)"); - } - } - - try (PreparedStatement preparedStatement = connection.prepareStatement(updateSql.toString());) { - int i = 0; - for (World world : worlds) { - preparedStatement.setInt(++i, world.getId()); - preparedStatement.setInt(++i, world.getRandomNumber()); - } - preparedStatement.executeUpdate(); - } + try (PreparedStatement queryPreparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + for (int i = 0; i < queries; i++) { + queryPreparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = queryPreparedStatement.executeQuery(); + resultSet.next(); + World world = new World(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(getRandomNumber()); + worlds[i] = world; + queryPreparedStatement.clearParameters(); + updateSql.add("(?, ?)"); + } + } - } catch (SQLException throwables) { - throwables.printStackTrace(); + try (PreparedStatement preparedStatement = connection.prepareStatement(updateSql.toString());) { + int i = 0; + for (World world : worlds) { + preparedStatement.setInt(++i, world.getId()); + preparedStatement.setInt(++i, world.getRandomNumber()); } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, worlds); - } finally { - completableFuture.complete(null); + preparedStatement.executeUpdate(); } - }); + + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, worlds); } protected int getRandomNumber() { From 500ae8d1629c48828ac9e5398fc8816260bfbdf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 9 Feb 2023 20:52:51 +0800 Subject: [PATCH 0119/1766] revert code --- .../src/main/java/org/smartboot/http/Bootstrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index bfa60e03af5..3d26a672e59 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -45,7 +45,7 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); } }); -// initDB(routeHandle); + initDB(routeHandle); int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); From 45f074343d0025f2a5d1e0613d5c4de9008543aa Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 9 Mar 2023 18:25:35 +0100 Subject: [PATCH 0120/1766] Update Hexagon --- frameworks/Kotlin/hexagon/build.gradle | 12 ++++++------ .../hexagon/core/src/main/kotlin/Controller.kt | 14 ++++++-------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index c20ee5868d8..31ab9116d9d 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.8.0" apply false + id "org.jetbrains.kotlin.jvm" version "1.8.10" apply false } version = "1.0.0" @@ -8,13 +8,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "2.5.0" + hexagonVersion = "2.6.3" hikariVersion = "5.0.1" - jettyVersion = "11.0.13" - postgresqlVersion = "42.5.1" - vertxVersion = "4.3.7" + jettyVersion = "11.0.14" + postgresqlVersion = "42.5.4" + vertxVersion = "4.4.0" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.87.Final" + nettyVersion = "4.1.89.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt index 4ad7055e8e1..c747fa889e9 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt @@ -1,9 +1,9 @@ package com.hexagonkt import com.hexagonkt.core.fieldsMapOf -import com.hexagonkt.core.media.ApplicationMedia.JSON -import com.hexagonkt.core.media.TextMedia.HTML -import com.hexagonkt.core.media.TextMedia.PLAIN +import com.hexagonkt.core.media.APPLICATION_JSON +import com.hexagonkt.core.media.TEXT_HTML +import com.hexagonkt.core.media.TEXT_PLAIN import com.hexagonkt.http.model.ContentType import com.hexagonkt.http.model.Header import com.hexagonkt.http.model.Headers @@ -16,10 +16,8 @@ import com.hexagonkt.serialization.dsl.json.Json import com.hexagonkt.serialization.serialize import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort - import java.net.URL import java.util.concurrent.ThreadLocalRandom - import kotlin.text.Charsets.UTF_8 class Controller( @@ -33,9 +31,9 @@ class Controller( private val worldRows: Int = settings.worldRows private val textMessage: String = settings.textMessage - private val plain: ContentType = ContentType(PLAIN) - private val json: ContentType = ContentType(JSON) - private val html: ContentType = ContentType(HTML, charset = UTF_8) + private val plain: ContentType = ContentType(TEXT_PLAIN) + private val json: ContentType = ContentType(APPLICATION_JSON) + private val html: ContentType = ContentType(TEXT_HTML, charset = UTF_8) private val headers = Headers(Header("server", "Hexagon")) From 5df374d3f34b034f9175d7f644501c1f6ed70f97 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 9 Mar 2023 18:55:41 +0100 Subject: [PATCH 0121/1766] Update Gradle --- .../Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-netty.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 3f4def4a917..f0ae57febc4 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-7.6-bin.zip +distributionUrl=https://services.gradle.org/distributions/gradle-8.0.2-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 388fd1036b2..f047e7e599b 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.6-jdk17-alpine AS build +FROM gradle:8.0.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index ccf6f8711ee..18963d4dfe1 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.6-jdk17-alpine AS build +FROM gradle:8.0.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index 687f0ce38d1..e343078fb6e 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.6-jdk17-alpine AS build +FROM gradle:8.0.2-jdk17-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 f3f948746da..d40959b0e0e 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.6-jdk17-alpine AS build +FROM gradle:8.0.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 1bfd11780d3..575378b8583 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.6-jdk17-alpine AS build +FROM gradle:8.0.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 677823b9ba7..7ca5725be48 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.6-jdk17-alpine AS build +FROM gradle:8.0.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index d0e259d10e0..e228bd5a7db 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM gradle:7.6-jdk17-alpine AS build +FROM gradle:8.0.2-jdk17-alpine AS build USER root WORKDIR /hexagon From 8978ca1c145fa3ee44cee04fed604197abed8d32 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sun, 19 Mar 2023 16:41:10 +0100 Subject: [PATCH 0122/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 6 +++--- frameworks/Kotlin/hexagon/core/build.gradle | 3 +-- .../Kotlin/hexagon/core/src/main/kotlin/Controller.kt | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 31ab9116d9d..6b15fbd1da9 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -8,13 +8,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "2.6.3" + hexagonVersion = "2.6.5" hikariVersion = "5.0.1" jettyVersion = "11.0.14" - postgresqlVersion = "42.5.4" + postgresqlVersion = "42.6.0" vertxVersion = "4.4.0" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.89.Final" + nettyVersion = "4.1.90.Final" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle index 45d18cda86f..af7552398d3 100644 --- a/frameworks/Kotlin/hexagon/core/build.gradle +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -5,10 +5,9 @@ plugins { dependencies { api("com.hexagonkt:http_server:$hexagonVersion") - api("com.hexagonkt:templates_pebble:$hexagonVersion") api("com.hexagonkt:templates_rocker:$hexagonVersion") api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") - api("com.hexagonkt:serialization_dsl_json:$hexagonVersion") + api("com.hexagonkt:serialization_jackson_json:$hexagonVersion") api("org.cache2k:cache2k-core:$cache2kVersion") } diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt index c747fa889e9..b4714a76049 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt @@ -12,7 +12,7 @@ import com.hexagonkt.http.server.handlers.HttpServerContext import com.hexagonkt.http.server.handlers.PathHandler import com.hexagonkt.http.server.handlers.path import com.hexagonkt.model.* -import com.hexagonkt.serialization.dsl.json.Json +import com.hexagonkt.serialization.jackson.json.Json import com.hexagonkt.serialization.serialize import com.hexagonkt.store.BenchmarkStore import com.hexagonkt.templates.TemplatePort From 370a13223bc2dbe1df194e9980a19f95d94b9ab2 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 20 Mar 2023 14:20:58 +0100 Subject: [PATCH 0123/1766] Update Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 6b15fbd1da9..4aad4ab8f98 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -8,7 +8,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "2.6.5" + hexagonVersion = "2.6.6" hikariVersion = "5.0.1" jettyVersion = "11.0.14" postgresqlVersion = "42.6.0" From 147afa02f39d62659a37954c2bbeeb77798e51e7 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 30 Mar 2023 19:56:54 +0200 Subject: [PATCH 0124/1766] Update Gradle Wrapper --- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 61608 bytes frameworks/Kotlin/hexagon/gradlew | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..ccebba7710deaf9f98673a68957ea02138b60d0a 100644 GIT binary patch delta 5094 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 delta 5107 zcmY*d1zc0@|J{HQlai7V5+f#EN-H%&UP4MFm6QgFfuJK4DG4u#ARsbQL4i>MB1q|w zmWd#pqd~BR-yN@ieE-|$^W1aKIZtf&-p_fyw{(Uwc7_sWYDh^12cY!qXvcPQ!qF;q@b0nYU7 zP&ht}K7j%}P%%|ffm;4F0^i3P0R`a!2wm89L5P3Kfu;tTZJre<{N5}AzsH+E3DS`Q zJLIl`LRMf`JOTBLf(;IV(9(h{(}dXK!cPoSLm(o@fz8vRz}6fOw%3}3VYOsCczLF` za2RTsCWa2sS-uw(6|HLJg)Xf@S8#|+(Z5Y)ER+v+8;btfB3&9sWH6<=U}0)o-jIts zsi?Nko;No&JyZI%@1G&zsG5kKo^Zd7rk_9VIUao9;fC~nv(T0F&Af0&Rp`?x94EIS zUBPyBe5R5#okNiB1Xe--q4|hPyGzhJ?Lurt#Ci09BQ+}rlHpBhm;EmfLw{EbCz)sg zgseAE#f$met1jo;`Z6ihk?O1be3aa$IGV69{nzagziA!M*~E5lMc(Sp+NGm2IUjmn zql((DU9QP~Tn1pt6L`}|$Na-v(P+Zg&?6bAN@2u%KiB*Gmf}Z)R zMENRJgjKMqVbMpzPO{`!J~2Jyu7&xXnTDW?V?IJgy+-35q1)-J8T**?@_-2H`%X+6f5 zIRv`uLp&*?g7L~6+3O*saXT~gWsmhF*FNKw4X$29ePKi02G*)ysenhHv{u9-y?_do ztT(Cu04pk>51n}zu~=wgToY5Cx|MTlNw}GR>+`|6CAhQn=bh@S<7N)`w};;KTywDU z=QWO@RBj$WKOXSgCWg{BD`xl&DS!G}`Mm3$)=%3jzO_C+s+mfTFH5JL>}*(JKs@MqX|o2b#ZBX5P;p7;c)$F1y4HwvJ?KA938$rd)gn_U^CcUtmdaBW57 zlPph>Fz&L`cSScFjcj+7Jif3vxb20Ag~FPstm?9#OrD$e?Y~#1osDB0CFZ9Mu&%iE zSj~wZpFqu6!k%BT)}$F@Z%(d-Pqy07`N8ch2F7z^=S-!r-@j{#&{SM@a8O$P#SySx zZLD_z=I300OCA1YmKV0^lo@>^)THfZvW}s<$^w^#^Ce=kO5ymAnk>H7pK!+NJ-+F7 z1Bb6Y=r)0nZ+hRXUyD+BKAyecZxb+$JTHK5k(nWv*5%2a+u*GDt|rpReYQ}vft zXrIt#!kGO85o^~|9Oc-M5A!S@9Q)O$$&g8u>1=ew?T35h8B{-Z_S78oe=E(-YZhBPe@Y1sUt63A-Cdv>D1nIT~=Rub6$?8g>meFb7Ic@w^%@RN2z72oPZ#Ta%b(P1|&6I z61iO<8hT*)p19Bgd0JgXP{^c{P2~K@^DIXv=dF(u|DFfqD^dMIl8-x)xKIpJRZru@ zDxicyYJG}mh}=1Dfg%B$#H`CiAxPTj^;f4KRMZHUz-_x6)lEq!^mu%72*PI=t$6{Uql#dqm4 zClgaN63!&?v*enz4k1sbaM+yCqUf+i9rw$(YrY%ir1+%cWRB<;r}$8si!6QcNAk~J zk3?dejBaC`>=T<=y=>QVt*4kL>SwYwn$(4ES793qaH)>n(axyV3R5jdXDh#e-N0K- zuUgk|N^|3*D1!Wlz-!M*b}Zc5=;K6I+>1N$&Q%)&8LWUiTYi&aQIj(luA< zN5R<8Y8L#*i0xBio$jWcaiZ4S2w3#R@CGemesy~akKP)2GojQF6!$}!_RdUJPBevX zG#~uz%Yirb0@1wgQ;ayb=qD}6{=QXxjuZQ@@kxbN!QWhtEvuhS2yAZe8fZy6*4Inr zdSyR9Dec4HrE|I=z-U;IlH;_h#7e^Hq}gaJ<-z^}{*s!m^66wu2=(*EM0UaV*&u1q zJrq!K23TO8a(ecSQFdD$y+`xu)Xk36Z*;1i{hS=H2E<8<5yHuHG~22-S+Jq|3HMAw z%qBz3auT=M!=5F|Wqke|I^E8pmJ-}>_DwX5w%d3MSdC>xW%$ocm8w8HRdZ|^#cEt1 zM*I7S6sLQq;;Mecet(Q()+?s+&MeVLOvx}(MkvytkvLHl7h*N0AT1#AqC&(he(^%przH`KqA$z_dAvJJb409@F)fYwD$JW_{_Oie8!@VdJE zU>D$@B?LawAf5$;`AZ1E!krn=aAC%4+YQrzL!59yl1;|T2)u=RBYA8lk0Ek&gS!Rb zt0&hVuyhSa0}rpZGjTA>Gz}>Uv*4)F zf7S%D2nfA7x?gPEXZWk8DZimQs#xi0?So_k`2zb!UVQEAcbvjPLK9v>J~!awnxGpq zEh$EPOc4q&jywmglnC&D)1-P0DH!@)x;uJwMHdhPh>ZLWDw+p1pf52{X2dk{_|UOmakJa4MHu?CY`6Hhv!!d7=aNwiB5z zb*Wlq1zf^3iDlPf)b_SzI*{JCx2jN;*s~ra8NeB!PghqP!0po-ZL?0Jk;2~*~sCQ<%wU`mRImd)~!23RS?XJu|{u( ztFPy3*F=ZhJmBugTv48WX)4U*pNmm~4oD4}$*-92&<)n=R)5lT z-VpbEDk>(C1hoo#-H_u0`#%L6L$ zln(}h2*Cl(5(JtVM{YZ26@Fwmp;?Qt}9$_F%`?+-JHbC;bPZj8PLq9 zWo-KFw!i&r8WuA-!3F_m9!24Z(RhalAUR~_H#Ln=$%b5GY z)oB)zO%J5TY}&BXq^7#M>euVL%01Tzj4$6^ZOjT*7@zr~q@6GEjGi)nbwzSL`TiLN z{DVG~I$w@%^#tD{>1Ap@%=XogG_^Hvy_xiRn4yy?LKsC+ zU!S79X8orh&D%>1S`x2iyi&(iG&r#YT{}~iy(FIOo8?MZU#eo*c*(RjAGj@uDi zARJur)-*{n0PgW~&mFeg`MJ?(Kr;NUom)jh?ozZtyywN9bea6ikQlh}953Oul~N%4 z@Sx!@>?l1e7V*@HZMJx!gMo0TeXdU~#W6^n?YVQJ$)nuFRkvKbfwv_s*2g(!wPO|@ zvuXF=2MiPIX)A7x!|BthSa$GB%ECnuZe_Scx&AlnC z!~6C_SF24#@^VMIw)a-7{00}}Cr5NImPbW8OTIHoo6@NcxLVTna8<<;uy~YaaeMnd z;k_ynYc_8jQn9vW_W8QLkgaHtmwGC}wRcgZ^I^GPbz{lW)p#YYoinez1MjkY%6LBd z+Vr>j&^!?b-*Vk>8I!28o`r3w&^Lal8@=50zV4&9V9oXI{^r8;JmVeos&wf?O!;_o zk))^k*1fvYw9?WrS!sG2TcX`hH@Y3mF&@{i05;_AV{>Umi8{uZP_0W5_1V2yHU<)E z+qviK*7SJtnL;76{WK!?Pv$-!w$08<%8Qy|sB|P%GiV1<+dHw*sj!C~SjsB6+1L@so+Q~n# z+Uc5+Uz+mGmkR@>H7D*c?mm8WQz;3VOpktU_DeBi>3#@z zmLe;3gP<7KPy>~k47nEeT?G?7e2g6316Xdb_y+ja5C9Ayg6QTNr~&Kbs(1>7zp|f@le;9B z1e(+Ga%jPWR7oc}=XcB4$z?YD)l;%#U;}~gZzGViI=fwu9OAPCCK!0w>Ay^#$b49k zT&|M?JaIyRT<;@*t_jp1ifWPvL;{maf6o0T#X!#9YX;0Q;LTQ0}0tg^_Ru4pkSr4#P zmnW|D0`A#Ie6pEfBDv39=jN2;kiUoT6I&kChsbI!jMuY6zuZql5!&i%5!c zjsHlXtjT;NV?jAb`%vy)JOK_j1rponLqc>(2qgYlLPEs>|0QV<=Pw~C`fLFKJJitt zyC6003{rxCsmtGKjhB%W2W~*%vKH8l$pZoOFT*K@uL9%CD^3rh=ZtuTU1 zJpf4|%n^yjh#dKSSCJI8;YU*CD!8Wv20*e5`-fya^75@ADLU^RdHDg3Bk3k6)dGi7 z!!z;|O1h$8q!vO*w6 I6Xdi10eY*&F8}}l diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index 65dcd68d65c..79a61d421cc 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac From 3ff91b6431ac612a86a25b1c79ab41ab6b76db57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Wed, 3 May 2023 11:56:44 +0800 Subject: [PATCH 0125/1766] upgrade smart-servlet to 0.2.1-SNAPSHOT --- 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 275e01c1900..e4bbc87e873 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 11 11 2.17.1 - 0.1.9-SNAPSHOT + 0.2.1-SNAPSHOT 5.0.0 0.9.23 From 89352f11b0173bd30053c9a4381af7dc10cdaba3 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 7 Jun 2023 13:39:48 +0200 Subject: [PATCH 0126/1766] Add async and native support --- frameworks/Kotlin/hexagon/.dockerignore | 2 + frameworks/Kotlin/hexagon/build.gradle | 19 ++- frameworks/Kotlin/hexagon/core/build.gradle | 9 +- .../core/src/main/kotlin/Controller.kt | 24 ++-- .../core/native-image.properties | 7 + .../core/reflect-config.json | 23 +++ .../src/main/resources/fortunes.pebble.html | 21 --- .../Kotlin/hexagon/core_async/build.gradle | 32 +++++ .../core_async/src/main/kotlin/Benchmark.kt | 28 ++++ .../core_async/src/main/kotlin/Controller.kt | 133 ++++++++++++++++++ .../src/main/kotlin/store/BenchmarkStore.kt | 34 +++++ .../core/native-image.properties | 7 + .../core/reflect-config.json | 23 +++ .../src/main/resources/fortunes.rocker.html | 24 ++++ .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 62076 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 7 +- .../hexagon/hexagon-jetty-native.dockerfile | 21 +++ .../hexagon-jettyloom-pgclient.dockerfile | 15 +- .../hexagon/hexagon-jettyloom.dockerfile | 15 +- .../hexagon/hexagon-netty-native.dockerfile | 21 +++ .../Kotlin/hexagon/hexagon-netty.dockerfile | 15 +- .../hexagon-nettyepoll-pgclient.dockerfile | 15 +- .../hexagon/hexagon-nettyepoll.dockerfile | 15 +- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 10 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 15 +- .../hexagon_jetty_pgclient/build.gradle | 6 - .../hexagon_jetty_postgresql/build.gradle | 7 +- .../hexagon_netty_async_pgclient/build.gradle | 7 + .../src/main/kotlin/Benchmark.kt | 25 ++++ .../hexagon_netty_postgresql/build.gradle | 7 +- .../src/main/kotlin/Benchmark.kt | 7 + .../hexagon_nettyepoll_pgclient/build.gradle | 6 - .../src/main/kotlin/Benchmark.kt | 7 + .../build.gradle | 6 - .../src/main/kotlin/Benchmark.kt | 7 + .../src/main/kotlin/WebListenerServer.kt | 4 +- .../hexagon_vertx_pgclient/build.gradle | 9 ++ .../src/main/kotlin/Benchmark.kt | 33 +++++ frameworks/Kotlin/hexagon/model/build.gradle | 4 + .../src/main/kotlin/Settings.kt | 0 .../src/main/kotlin/model/CachedWorld.kt | 0 .../src/main/kotlin/model/Fortune.kt | 0 .../src/main/kotlin/model/Message.kt | 0 .../src/main/kotlin/model/World.kt | 0 frameworks/Kotlin/hexagon/settings.gradle | 5 + .../hexagon/store_pgclient_async/build.gradle | 6 + .../src/main/kotlin/BenchmarkPgClientStore.kt | 114 +++++++++++++++ 48 files changed, 663 insertions(+), 134 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/.dockerignore create mode 100644 frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties create mode 100644 frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json delete mode 100644 frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html create mode 100644 frameworks/Kotlin/hexagon/core_async/build.gradle create mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt create mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt create mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties create mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json create mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html create mode 100644 frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon-netty-native.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/model/build.gradle rename frameworks/Kotlin/hexagon/{core => model}/src/main/kotlin/Settings.kt (100%) rename frameworks/Kotlin/hexagon/{core => model}/src/main/kotlin/model/CachedWorld.kt (100%) rename frameworks/Kotlin/hexagon/{core => model}/src/main/kotlin/model/Fortune.kt (100%) rename frameworks/Kotlin/hexagon/{core => model}/src/main/kotlin/model/Message.kt (100%) rename frameworks/Kotlin/hexagon/{core => model}/src/main/kotlin/model/World.kt (100%) create mode 100644 frameworks/Kotlin/hexagon/store_pgclient_async/build.gradle create mode 100644 frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt diff --git a/frameworks/Kotlin/hexagon/.dockerignore b/frameworks/Kotlin/hexagon/.dockerignore new file mode 100644 index 00000000000..5b154f2de67 --- /dev/null +++ b/frameworks/Kotlin/hexagon/.dockerignore @@ -0,0 +1,2 @@ + +**/build/ diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 4aad4ab8f98..755096930bc 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,6 +1,7 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.8.10" apply false + id "org.jetbrains.kotlin.jvm" version "1.8.21" apply false + id "org.graalvm.buildtools.native" version "0.9.22" apply false } version = "1.0.0" @@ -8,19 +9,23 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "2.6.6" + hexagonVersion = "3.0.0-B1" + jettyVersion = "11.0.15" + nettyVersion = "4.1.93.Final" + hikariVersion = "5.0.1" - jettyVersion = "11.0.14" postgresqlVersion = "42.6.0" - vertxVersion = "4.4.0" + vertxVersion = "4.4.2" cache2kVersion = "2.6.1.Final" - nettyVersion = "4.1.90.Final" + applicationClass = "com.hexagonkt.BenchmarkKt" + modules = "java.naming,java.sql,java.management" + options = "--enable-preview" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } -defaultTasks("build") - subprojects { + version = rootProject.version + apply(from: "$gradleScripts/kotlin.gradle") } diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle index af7552398d3..4cf6f44b80c 100644 --- a/frameworks/Kotlin/hexagon/core/build.gradle +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -4,6 +4,7 @@ plugins { } dependencies { + api(project(":model")) api("com.hexagonkt:http_server:$hexagonVersion") api("com.hexagonkt:templates_rocker:$hexagonVersion") api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") @@ -13,11 +14,9 @@ dependencies { tasks.register("minimizeTemplate") { doLast { - [ "fortunes.pebble.html", "fortunes.rocker.html" ].forEach { t -> - File template = file("$buildDir/resources/main/$t") - List lines = template.readLines().collect { it.trim() } - template.write(lines.join("")) - } + File template = file("$buildDir/resources/main/fortunes.rocker.html") + List lines = template.readLines().collect { it.trim() } + template.write(lines.join("")) } } diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt index b4714a76049..37ab786e791 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt @@ -8,9 +8,9 @@ import com.hexagonkt.http.model.ContentType import com.hexagonkt.http.model.Header import com.hexagonkt.http.model.Headers import com.hexagonkt.http.server.callbacks.DateCallback -import com.hexagonkt.http.server.handlers.HttpServerContext -import com.hexagonkt.http.server.handlers.PathHandler -import com.hexagonkt.http.server.handlers.path +import com.hexagonkt.http.handlers.HttpContext +import com.hexagonkt.http.handlers.PathHandler +import com.hexagonkt.http.handlers.path import com.hexagonkt.model.* import com.hexagonkt.serialization.jackson.json.Json import com.hexagonkt.serialization.serialize @@ -55,9 +55,9 @@ class Controller( private fun Message.toJson(): String = toMap().serialize(Json.raw) - private fun HttpServerContext.listFortunes( + private fun HttpContext.listFortunes( store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort - ): HttpServerContext { + ): HttpContext { val fortunes = store.findAllFortunes() + Fortune(0, "Additional fortune added at request time.") val sortedFortunes = fortunes.sortedBy { it.message } @@ -67,7 +67,7 @@ class Controller( return ok(body, contentType = html) } - private fun HttpServerContext.dbQuery(store: BenchmarkStore): HttpServerContext { + private fun HttpContext.dbQuery(store: BenchmarkStore): HttpContext { val ids = listOf(randomWorld()) val worlds = store.findWorlds(ids) val world = worlds.first().toMap() @@ -75,7 +75,7 @@ class Controller( return sendJson(world) } - private fun HttpServerContext.getWorlds(store: BenchmarkStore): HttpServerContext { + private fun HttpContext.getWorlds(store: BenchmarkStore): HttpContext { val worldsCount = getWorldsCount(queriesParam) val ids = (1..worldsCount).map { randomWorld() } val worlds = store.findWorlds(ids).map { it.toMap() } @@ -83,7 +83,7 @@ class Controller( return sendJson(worlds) } - private fun HttpServerContext.getCachedWorlds(store: BenchmarkStore): HttpServerContext { + private fun HttpContext.getCachedWorlds(store: BenchmarkStore): HttpContext { val worldsCount = getWorldsCount(cachedQueriesParam) val ids = (1..worldsCount).map { randomWorld() } val worlds = store.findCachedWorlds(ids).map { it.toMap() } @@ -91,7 +91,7 @@ class Controller( return sendJson(worlds) } - private fun HttpServerContext.updateWorlds(store: BenchmarkStore): HttpServerContext { + private fun HttpContext.updateWorlds(store: BenchmarkStore): HttpContext { val worldsCount = getWorldsCount(queriesParam) val worlds = (1..worldsCount).map { World(randomWorld(), randomWorld()) } @@ -100,11 +100,11 @@ class Controller( return sendJson(worlds.map { it.toMap() }) } - private fun HttpServerContext.sendJson(body: Any): HttpServerContext = + private fun HttpContext.sendJson(body: Any): HttpContext = ok(body.serialize(Json.raw), contentType = json) - private fun HttpServerContext.getWorldsCount(parameter: String): Int = - request.queryParameters[parameter]?.value?.toIntOrNull().let { + private fun HttpContext.getWorldsCount(parameter: String): Int = + request.queryParameters[parameter]?.string()?.toIntOrNull().let { when { it == null -> 1 it < 1 -> 1 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 new file mode 100644 index 00000000000..ee1c0199d95 --- /dev/null +++ b/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties @@ -0,0 +1,7 @@ +Args= \ + -H:IncludeResources=.*\\.(html|class) \ + --enable-preview \ + --static \ + --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \ + --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter$1 \ + --initialize-at-build-time=org.slf4j.LoggerFactory diff --git a/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json b/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json new file mode 100644 index 00000000000..11815306be2 --- /dev/null +++ b/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json @@ -0,0 +1,23 @@ +[ + { + "name": "fortunes", + "allPublicMethods": true, + "allDeclaredFields": true, + "allDeclaredMethods": true, + "allDeclaredConstructors": true + }, + { + "name": "fortunes$Template", + "allPublicMethods": true, + "allDeclaredFields": true, + "allDeclaredMethods": true, + "allDeclaredConstructors": true + }, + { + "name": "fortunes$PlainText", + "allPublicMethods": true, + "allDeclaredFields": true, + "allDeclaredMethods": true, + "allDeclaredConstructors": true + } +] diff --git a/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html deleted file mode 100644 index 1a74dd9800c..00000000000 --- a/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fortunes - - - - - - - - {% for fortune in fortunes %} - - - - - {% endfor %} -
idmessage
{{ fortune.id }}{{ fortune.message }}
- - diff --git a/frameworks/Kotlin/hexagon/core_async/build.gradle b/frameworks/Kotlin/hexagon/core_async/build.gradle new file mode 100644 index 00000000000..0a33387738e --- /dev/null +++ b/frameworks/Kotlin/hexagon/core_async/build.gradle @@ -0,0 +1,32 @@ + +plugins { + id("nu.studer.rocker") version("3.0.4") +} + +dependencies { + api(project(":model")) + api("com.hexagonkt:http_server_async:$hexagonVersion") + api("com.hexagonkt:templates_rocker:$hexagonVersion") + api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") + api("com.hexagonkt:serialization_jackson_json:$hexagonVersion") + api("org.cache2k:cache2k-core:$cache2kVersion") +} + +tasks.register("minimizeTemplate") { + doLast { + File template = file("$buildDir/resources/main/fortunes.rocker.html") + List lines = template.readLines().collect { it.trim() } + template.write(lines.join("")) + } +} + +jar.dependsOn("minimizeTemplate") + +rocker { + configurations { + create("main") { + templateDir.set(file("src/main/resources")) + optimize.set(true) + } + } +} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..2bda28da73e --- /dev/null +++ b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt @@ -0,0 +1,28 @@ +package com.hexagonkt.async + +import com.hexagonkt.Settings +import com.hexagonkt.http.server.async.HttpServer +import com.hexagonkt.http.server.async.HttpServerPort +import com.hexagonkt.http.server.async.HttpServerSettings +import com.hexagonkt.async.store.BenchmarkStore +import com.hexagonkt.templates.TemplatePort +import java.net.InetAddress +import java.net.URL + +class Benchmark( + private val engine: HttpServerPort, + private val store: BenchmarkStore, + private val template: TemplatePort, + private val templateUrl: URL, + private val settings: Settings = Settings(), +) { + val server: HttpServer by lazy { + val controller = Controller(settings, store, template, templateUrl) + val serverSettings = HttpServerSettings( + bindAddress = InetAddress.getByName(settings.bindAddress), + bindPort = settings.bindPort, + ) + + HttpServer(engine, controller.path, serverSettings) + } +} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt new file mode 100644 index 00000000000..683d39f4ffa --- /dev/null +++ b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt @@ -0,0 +1,133 @@ +package com.hexagonkt.async + +import com.hexagonkt.Settings +import com.hexagonkt.core.fieldsMapOf +import com.hexagonkt.core.media.APPLICATION_JSON +import com.hexagonkt.core.media.TEXT_HTML +import com.hexagonkt.core.media.TEXT_PLAIN +import com.hexagonkt.handlers.async.done +import com.hexagonkt.http.model.ContentType +import com.hexagonkt.http.model.Header +import com.hexagonkt.http.model.Headers +import com.hexagonkt.http.server.async.callbacks.DateCallback +import com.hexagonkt.http.handlers.async.HttpContext +import com.hexagonkt.http.handlers.async.PathHandler +import com.hexagonkt.http.handlers.async.path +import com.hexagonkt.model.* +import com.hexagonkt.serialization.jackson.json.Json +import com.hexagonkt.serialization.serialize +import com.hexagonkt.async.store.BenchmarkStore +import com.hexagonkt.templates.TemplatePort +import java.net.URL +import java.util.concurrent.CompletableFuture +import java.util.concurrent.ThreadLocalRandom +import kotlin.text.Charsets.UTF_8 + +class Controller( + settings: Settings, + store: BenchmarkStore, + templateEngine: TemplatePort, + templateUrl: URL, +) { + private val queriesParam: String = settings.queriesParam + private val cachedQueriesParam: String = settings.cachedQueriesParam + private val worldRows: Int = settings.worldRows + private val textMessage: String = settings.textMessage + + private val plain: ContentType = ContentType(TEXT_PLAIN) + private val json: ContentType = ContentType(APPLICATION_JSON) + private val html: ContentType = ContentType(TEXT_HTML, charset = UTF_8) + + private val headers = Headers(Header("server", "Hexagon")) + + val path: PathHandler by lazy { + path { + on("*") { send(headers = headers).done() } + on("*", DateCallback()) + + get("/plaintext") { ok(textMessage, contentType = plain).done() } + get("/json") { ok(Message(textMessage).toJson(), contentType = json).done() } + get("/fortunes") { listFortunes(store, templateUrl, templateEngine) } + get("/db") { dbQuery(store) } + get("/query") { getWorlds(store) } + get("/cached-queries") { getCachedWorlds(store) } + get("/update") { updateWorlds(store) } + } + } + + private fun Message.toJson(): String = + toMap().serialize(Json.raw) + + private fun HttpContext.listFortunes( + store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort + ): CompletableFuture = + store + .findAllFortunes() + .thenApply { it + Fortune(0, "Additional fortune added at request time.") } + .thenApply { fortunes -> fortunes.sortedBy { it.message } } + .thenApply { sortedFortunes -> mapOf("fortunes" to sortedFortunes) } + .thenApply { context -> templateAdapter.render(templateUrl, context) } + .thenApply { body -> ok(body, contentType = html) } + + private fun HttpContext.dbQuery(store: BenchmarkStore): CompletableFuture { + val ids = listOf(randomWorld()) + return store.findWorlds(ids) + .thenApply { worlds -> worlds.first().toMap()} + .thenApply { world -> sendJson(world) } + } + + private fun HttpContext.getWorlds(store: BenchmarkStore): CompletableFuture { + val worldsCount = getWorldsCount(queriesParam) + val ids = (1..worldsCount).map { randomWorld() } + return store.findWorlds(ids) + .thenApply { worlds -> worlds.map { it.toMap() } } + .thenApply { worlds -> sendJson(worlds) } + } + + private fun HttpContext.getCachedWorlds(store: BenchmarkStore): CompletableFuture { + val worldsCount = getWorldsCount(cachedQueriesParam) + val ids = (1..worldsCount).map { randomWorld() } + val worlds = store.findCachedWorlds(ids).map { it.toMap() } + + return sendJson(worlds).done() + } + + private fun HttpContext.updateWorlds(store: BenchmarkStore): CompletableFuture { + val worldsCount = getWorldsCount(queriesParam) + val worlds = (1..worldsCount).map { World(randomWorld(), randomWorld()) } + + return store.replaceWorlds(worlds) + .thenApply { sendJson(worlds.map { it.toMap() }) } + } + + private fun HttpContext.sendJson(body: Any): HttpContext = + ok(body.serialize(Json.raw), contentType = json) + + private fun HttpContext.getWorldsCount(parameter: String): Int = + request.queryParameters[parameter]?.string()?.toIntOrNull().let { + when { + it == null -> 1 + it < 1 -> 1 + it > 500 -> 500 + else -> it + } + } + + private fun randomWorld(): Int = + ThreadLocalRandom.current().nextInt(worldRows) + 1 + + private fun Message.toMap(): Map = + fieldsMapOf(Message::message to message) + + private fun World.toMap(): Map = + fieldsMapOf( + World::id to id, + World::randomNumber to randomNumber, + ) + + private fun CachedWorld.toMap(): Map = + fieldsMapOf( + CachedWorld::id to id, + CachedWorld::randomNumber to randomNumber, + ) +} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt new file mode 100644 index 00000000000..13f5aae7108 --- /dev/null +++ b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt @@ -0,0 +1,34 @@ +package com.hexagonkt.async.store + +import com.hexagonkt.model.CachedWorld +import com.hexagonkt.model.Fortune +import com.hexagonkt.Settings +import com.hexagonkt.model.World +import org.cache2k.Cache +import org.cache2k.Cache2kBuilder +import java.util.concurrent.CompletableFuture + +abstract class BenchmarkStore(settings: Settings) { + + abstract fun findAllFortunes(): CompletableFuture> + abstract fun findWorlds(ids: List): CompletableFuture> + abstract fun replaceWorlds(worlds: List): CompletableFuture<*> + abstract fun initWorldsCache(cache: Cache) + abstract fun loadCachedWorld(id: Int): CachedWorld + abstract fun close() + + private val worldsCache: Cache by lazy { + object : Cache2kBuilder() {} + .eternal(true) + .disableMonitoring(true) + .disableStatistics(true) + .entryCapacity(settings.worldRows.toLong()) + .loader { id -> loadCachedWorld(id) } + .build() + .apply { initWorldsCache(this) } + } + + fun findCachedWorlds(ids: List): List { + return ids.mapNotNull { worldsCache.get(it) } + } +} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties b/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties new file mode 100644 index 00000000000..ee1c0199d95 --- /dev/null +++ b/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties @@ -0,0 +1,7 @@ +Args= \ + -H:IncludeResources=.*\\.(html|class) \ + --enable-preview \ + --static \ + --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \ + --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter$1 \ + --initialize-at-build-time=org.slf4j.LoggerFactory diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json b/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json new file mode 100644 index 00000000000..11815306be2 --- /dev/null +++ b/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json @@ -0,0 +1,23 @@ +[ + { + "name": "fortunes", + "allPublicMethods": true, + "allDeclaredFields": true, + "allDeclaredMethods": true, + "allDeclaredConstructors": true + }, + { + "name": "fortunes$Template", + "allPublicMethods": true, + "allDeclaredFields": true, + "allDeclaredMethods": true, + "allDeclaredConstructors": true + }, + { + "name": "fortunes$PlainText", + "allPublicMethods": true, + "allDeclaredFields": true, + "allDeclaredMethods": true, + "allDeclaredConstructors": true + } +] diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html b/frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html new file mode 100644 index 00000000000..c9a9d4037e5 --- /dev/null +++ b/frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html @@ -0,0 +1,24 @@ +@import java.util.* +@import com.hexagonkt.model.Fortune +@args(Map context) + + + + + Fortunes + + + + + + + + @for ((fortune) : (Collection)context.get("fortunes")) { + + + + + } +
idmessage
@fortune.getId()@fortune.getMessage()
+ + diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index ccebba7710deaf9f98673a68957ea02138b60d0a..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 8979 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 F{TFmrHLU;u delta 8469 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"BENCHMARK_ENV")?.lowercase() + maxSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + } + } + + private val dataSource: SqlClient by lazy { PgPool.pool(vertx(), connectOptions, poolOptions) } + + override fun findAllFortunes(): CompletableFuture> = + dataSource.preparedQuery(SELECT_ALL_FORTUNES) + .execute() + .map { rowSet -> + rowSet.map { row -> Fortune(row.getInteger(0), row.getString(1)) } + } + .toCompletionStage() + .toCompletableFuture() + + override fun findWorlds(ids: List): CompletableFuture> { + val futures = ids.map { findWorld(it, dataSource) } + return all(futures).map { it.list() }.toCompletionStage().toCompletableFuture() + } + + override fun replaceWorlds(worlds: List): CompletableFuture<*> { + val futures = worlds.map { + val worldId = it.id + val newRandomNumber = it.randomNumber + dataSource + .preparedQuery(SELECT_WORLD) + .execute(Tuple.of(worldId)) + .flatMap { rowSet -> + val row = rowSet.iterator().next() + row.getInteger(1) // Read 'randomNumber' to comply with Test type 5, point 6 + dataSource + .preparedQuery(UPDATE_WORLD) + .execute(Tuple.of(newRandomNumber, worldId)) + } + } + return all(futures).toCompletionStage().toCompletableFuture() + } + + override fun initWorldsCache(cache: Cache) { + dataSource + .preparedQuery("select * from world") + .execute() + .map { rowSet -> + rowSet.map { row -> + val id = row.getInteger(0) + val randomNumber = row.getInteger(1) + cache.put(id, CachedWorld(id, randomNumber)) + } + } + .toCompletionStage() + .toCompletableFuture() + .get() + } + + override fun loadCachedWorld(id: Int): CachedWorld = + findWorld(id, dataSource) + .map { world -> CachedWorld(world.id, world.randomNumber) } + .toCompletionStage() + .toCompletableFuture() + .get() + + override fun close() { + dataSource.close() + } + + private fun findWorld(id: Int, client: SqlClient): Future = + client + .preparedQuery(SELECT_WORLD) + .execute(Tuple.of(id)) + .map { rowSet -> + val row = rowSet.iterator().next() + World(row.getInteger(0), row.getInteger(1)) + } +} From 745aabf430b2a95fee6352dbc815608743ecb624 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 7 Jun 2023 16:05:40 +0200 Subject: [PATCH 0127/1766] Add async and native support --- .../Kotlin/hexagon/benchmark_config.json | 69 +++++++++++++++++++ frameworks/Kotlin/hexagon/config.toml | 54 +++++++++++++++ .../hexagon-netty-async-pgclient.dockerfile | 23 +++++++ .../hexagon/hexagon-vertx-pgclient.dockerfile | 23 +++++++ .../src/main/kotlin/BenchmarkPgClientStore.kt | 2 +- .../src/main/kotlin/BenchmarkPgClientStore.kt | 2 +- .../src/main/kotlin/BenchmarkSqlStore.kt | 2 +- 7 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 4bcc8b23f66..d5134ade6c8 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -136,6 +136,75 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, + "netty-native": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Netty Native PostgreSQL", + "notes": "http://hexagonkt.com", + "versus": "netty" + }, + "netty-async-pgclient": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Netty Async PgClient", + "notes": "http://hexagonkt.com", + "versus": "netty" + }, + "vertx-pgclient": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Vertx", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Vertx PgClient", + "notes": "http://hexagonkt.com", + "versus": "vertx" + }, "tomcat": { "json_url": "/json", "db_url": "/db", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index d51d0e8ccf6..baeb6ac78ad 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -73,6 +73,24 @@ platform = "Netty" webserver = "None" versus = "netty" +[netty-native] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "netty" + [nettyepoll] urls.plaintext = "/plaintext" urls.json = "/json" @@ -109,6 +127,24 @@ platform = "Netty" webserver = "None" versus = "netty" +[nettyepoll-async-pgclient] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "netty" + [tomcat] urls.plaintext = "/plaintext" urls.json = "/json" @@ -126,3 +162,21 @@ orm = "Raw" platform = "Servlet" webserver = "Tomcat" versus = "servlet" + +[vertx-pgclient] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Vertx" +webserver = "None" +versus = "vertx" diff --git a/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile new file mode 100644 index 00000000000..09845f263cb --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile @@ -0,0 +1,23 @@ +# +# BUILD +# +FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +ADD . . +RUN gradle --quiet classes +RUN gradle --quiet -x test installDist + +# +# RUNTIME +# +FROM docker.io/eclipse-temurin:17-jre-alpine +ARG PROJECT=hexagon_netty_async_pgclient + +ENV POSTGRESQL_DB_HOST tfb-database +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT + +ENTRYPOINT [ "/opt/hexagon_netty_async_pgclient/bin/hexagon_netty_async_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile new file mode 100644 index 00000000000..5b8ff2cd1b1 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile @@ -0,0 +1,23 @@ +# +# BUILD +# +FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +ADD . . +RUN gradle --quiet classes +RUN gradle --quiet -x test installDist + +# +# RUNTIME +# +FROM docker.io/eclipse-temurin:17-jre-alpine +ARG PROJECT=hexagon_vertx_pgclient + +ENV POSTGRESQL_DB_HOST tfb-database +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT + +ENTRYPOINT [ "/opt/hexagon_vertx_pgclient/bin/hexagon_vertx_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt index 5cd13ccee0a..1fb9547353f 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt +++ b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt @@ -24,7 +24,7 @@ class BenchmarkPgClientStore( private val connectOptions: PgConnectOptions by lazy { PgConnectOptions().apply { - host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost" + host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" database = settings.databaseName user = settings.databaseUsername password = settings.databasePassword diff --git a/frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt index f7b0350bfe9..8266b3120e4 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt +++ b/frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt @@ -27,7 +27,7 @@ class BenchmarkPgClientStore( private val connectOptions: PgConnectOptions by lazy { PgConnectOptions().apply { - host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost" + host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" database = settings.databaseName user = settings.databaseUsername password = settings.databasePassword diff --git a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt index ea871ec1b13..501a4d9ce34 100644 --- a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt @@ -22,7 +22,7 @@ class BenchmarkSqlStore( } private val dataSource: HikariDataSource by lazy { - val dbHost = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost" + val dbHost = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" val environment = Jvm.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase() val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 val postgresqlSettings = listOf( From f54f8803eabf78bb55ac83e3a3582dff3fbf2306 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 7 Jun 2023 16:12:35 +0200 Subject: [PATCH 0128/1766] Add async and native support --- frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 77cf13f6cbb..e35db7b9f68 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -7,7 +7,7 @@ WORKDIR /hexagon ADD . . RUN gradle --quiet classes -RUN gradle --quiet -x test +RUN gradle --quiet -x test war # # RUNTIME From 267c4b626513161721edfce382629d5c79ce7d83 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 16 Jun 2023 11:26:16 +0200 Subject: [PATCH 0129/1766] Replace Vert.x adapter by Netty Epoll Async adapter --- frameworks/Kotlin/hexagon/build.gradle | 6 ++--- ...xagon-nettyepoll-async-pgclient.dockerfile | 23 +++++++++++++++++++ .../build.gradle | 8 +++++++ .../src/main/kotlin/Benchmark.kt | 4 ++-- .../hexagon_vertx_pgclient/build.gradle | 9 -------- frameworks/Kotlin/hexagon/settings.gradle | 2 +- 6 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle rename frameworks/Kotlin/hexagon/{hexagon_vertx_pgclient => hexagon_nettyepoll_async_pgclient}/src/main/kotlin/Benchmark.kt (89%) delete mode 100644 frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/build.gradle diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 755096930bc..f4a2ad995c7 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.8.21" apply false + id "org.jetbrains.kotlin.jvm" version "1.8.22" apply false id "org.graalvm.buildtools.native" version "0.9.22" apply false } @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.0-B1" + hexagonVersion = "3.0.0-B3" jettyVersion = "11.0.15" nettyVersion = "4.1.93.Final" hikariVersion = "5.0.1" postgresqlVersion = "42.6.0" - vertxVersion = "4.4.2" + vertxVersion = "4.4.3" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile new file mode 100644 index 00000000000..17234b76d4f --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile @@ -0,0 +1,23 @@ +# +# BUILD +# +FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +ADD . . +RUN gradle --quiet classes +RUN gradle --quiet -x test installDist + +# +# RUNTIME +# +FROM docker.io/eclipse-temurin:17-jre-alpine +ARG PROJECT=hexagon_nettyepoll_async_pgclient + +ENV POSTGRESQL_DB_HOST tfb-database +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT + +ENTRYPOINT [ "/opt/hexagon_vertx_pgclient/bin/hexagon_vertx_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle new file mode 100644 index 00000000000..9fb1cc22c05 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle @@ -0,0 +1,8 @@ + +apply(from: "$gradleScripts/application.gradle") + +dependencies { + api(project(":store_pgclient_async")) + api("com.hexagonkt:http_server_netty_epoll_async:$hexagonVersion") + api("io.netty:netty-transport-native-epoll:$nettyVersion") +} diff --git a/frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt similarity index 89% rename from frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/src/main/kotlin/Benchmark.kt rename to frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt index 6b52be6d68f..1e40fa3ffaf 100644 --- a/frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt @@ -2,7 +2,7 @@ package com.hexagonkt import com.hexagonkt.async.Benchmark import com.hexagonkt.async.store.BenchmarkPgClientStore -import com.hexagonkt.http.server.vertx.VertxServerAdapter +import com.hexagonkt.http.server.netty.epoll.async.NettyEpollServerAdapter import com.hexagonkt.templates.rocker.RockerAdapter import io.netty.util.ResourceLeakDetector import io.netty.util.ResourceLeakDetector.Level.DISABLED @@ -26,7 +26,7 @@ fun main() { val store = BenchmarkPgClientStore("postgresql") val templateEngine = RockerAdapter() val templateUrl = URL("classpath:fortunes.rocker.html") - val engine = VertxServerAdapter(preferNativeTransport = true) + val engine = NettyEpollServerAdapter(bossGroupThreads = 48) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) benchmark.server.start() diff --git a/frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/build.gradle deleted file mode 100644 index 2d5cdaf23d7..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ - -apply(from: "$gradleScripts/application.gradle") - -dependencies { - api(project(":store_pgclient_async")) - api("com.hexagonkt:http_server_vertx_async:$hexagonVersion") - api("io.vertx:vertx-io_uring-incubator:4.4.2") - api("io.netty:netty-transport-native-epoll:4.1.93.Final") -} diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle index 7b6af470769..cf4ad98fdac 100644 --- a/frameworks/Kotlin/hexagon/settings.gradle +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -12,7 +12,7 @@ include( "hexagon_netty_postgresql", "hexagon_netty_async_pgclient", "hexagon_nettyepoll_pgclient", + "hexagon_nettyepoll_async_pgclient", "hexagon_nettyepoll_postgresql", - "hexagon_vertx_pgclient", "hexagon_tomcat_postgresql", ) From 9c2385b3785dee56e4843d771e3d52fbdd6e6678 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 16 Jun 2023 12:31:53 +0200 Subject: [PATCH 0130/1766] Replace Vert.x adapter by Netty Epoll Async adapter --- .../Kotlin/hexagon/benchmark_config.json | 6 ++--- frameworks/Kotlin/hexagon/config.toml | 6 ++--- .../hexagon/hexagon-vertx-pgclient.dockerfile | 23 ------------------- 3 files changed, 6 insertions(+), 29 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index d5134ade6c8..d9f60d20b6f 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -182,7 +182,7 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, - "vertx-pgclient": { + "nettyepoll-async-pgclient": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -197,13 +197,13 @@ "framework": "Hexagon", "language": "Kotlin", "orm": "Raw", - "platform": "Vertx", + "platform": "Netty", "webserver": "None", "os": "Linux", "database_os": "Linux", "display_name": "Hexagon Vertx PgClient", "notes": "http://hexagonkt.com", - "versus": "vertx" + "versus": "netty" }, "tomcat": { "json_url": "/json", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index baeb6ac78ad..d30e5353e5a 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -163,7 +163,7 @@ platform = "Servlet" webserver = "Tomcat" versus = "servlet" -[vertx-pgclient] +[nettyepoll-async-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -177,6 +177,6 @@ database = "postgres" database_os = "Linux" os = "Linux" orm = "Raw" -platform = "Vertx" +platform = "Netty" webserver = "None" -versus = "vertx" +versus = "netty" diff --git a/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile deleted file mode 100644 index 5b8ff2cd1b1..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# BUILD -# -FROM docker.io/gradle:8.1.1-jdk17-alpine AS build -USER root -WORKDIR /hexagon - -ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist - -# -# RUNTIME -# -FROM docker.io/eclipse-temurin:17-jre-alpine -ARG PROJECT=hexagon_vertx_pgclient - -ENV POSTGRESQL_DB_HOST tfb-database -ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA - -COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT - -ENTRYPOINT [ "/opt/hexagon_vertx_pgclient/bin/hexagon_vertx_pgclient" ] From 10081f798389d199144618e4446b731d5a80fdee Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 16 Jun 2023 14:20:51 +0200 Subject: [PATCH 0131/1766] Replace Vert.x adapter by Netty Epoll Async adapter --- .../Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile index 17234b76d4f..7e4c80d6cd4 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile @@ -20,4 +20,4 @@ ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -ENTRYPOINT [ "/opt/hexagon_vertx_pgclient/bin/hexagon_vertx_pgclient" ] +ENTRYPOINT [ "/opt/hexagon_nettyepoll_async_pgclient/bin/hexagon_nettyepoll_async_pgclient" ] From 10b312c8765639fd0343ad45da4b89276953fd15 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 16 Jun 2023 16:18:31 +0200 Subject: [PATCH 0132/1766] Replace Vert.x adapter by Netty Epoll Async adapter --- .../hexagon/hexagon_nettyepoll_async_pgclient/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle index 9fb1cc22c05..148de98b406 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle @@ -4,5 +4,5 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_pgclient_async")) api("com.hexagonkt:http_server_netty_epoll_async:$hexagonVersion") - api("io.netty:netty-transport-native-epoll:$nettyVersion") + api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") } From efc7321d5a7f065bb306c01588747bf251a6b44d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 17 Jun 2023 12:58:42 +0200 Subject: [PATCH 0133/1766] Replace Vert.x adapter by Netty Epoll Async adapter --- .../Kotlin/hexagon/benchmark_config.json | 18 +++++++-------- frameworks/Kotlin/hexagon/config.toml | 18 --------------- ...xagon-nettyepoll-async-pgclient.dockerfile | 2 +- .../hexagon/hexagon-vertx-pgclient.dockerfile | 23 ------------------- .../src/main/kotlin/Benchmark.kt | 8 ------- 5 files changed, 9 insertions(+), 60 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index d5134ade6c8..90db8bffd93 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -136,14 +136,12 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, - "netty-native": { - "json_url": "/json", + "nettyepoll-async-pgclient": { "db_url": "/db", "query_url": "/query?queries=", "fortune_url": "/fortunes", "update_url": "/update?queries=", "cached_query_url": "/cached-queries?count=", - "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", "classification": "Micro", @@ -155,11 +153,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Native PostgreSQL", + "display_name": "Hexagon Netty Epoll PgClient", "notes": "http://hexagonkt.com", "versus": "netty" }, - "netty-async-pgclient": { + "netty-native": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -178,11 +176,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Async PgClient", + "display_name": "Hexagon Netty Native PostgreSQL", "notes": "http://hexagonkt.com", "versus": "netty" }, - "vertx-pgclient": { + "netty-async-pgclient": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -197,13 +195,13 @@ "framework": "Hexagon", "language": "Kotlin", "orm": "Raw", - "platform": "Vertx", + "platform": "Netty", "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Vertx PgClient", + "display_name": "Hexagon Netty Async PgClient", "notes": "http://hexagonkt.com", - "versus": "vertx" + "versus": "netty" }, "tomcat": { "json_url": "/json", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index baeb6ac78ad..488f052bb61 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -162,21 +162,3 @@ orm = "Raw" platform = "Servlet" webserver = "Tomcat" versus = "servlet" - -[vertx-pgclient] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/query?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -urls.cached_query = "/cached-queries?count=" -approach = "Realistic" -classification = "Micro" -database = "postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Vertx" -webserver = "None" -versus = "vertx" diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile index 17234b76d4f..7e4c80d6cd4 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile @@ -20,4 +20,4 @@ ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -ENTRYPOINT [ "/opt/hexagon_vertx_pgclient/bin/hexagon_vertx_pgclient" ] +ENTRYPOINT [ "/opt/hexagon_nettyepoll_async_pgclient/bin/hexagon_nettyepoll_async_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile deleted file mode 100644 index 5b8ff2cd1b1..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# BUILD -# -FROM docker.io/gradle:8.1.1-jdk17-alpine AS build -USER root -WORKDIR /hexagon - -ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist - -# -# RUNTIME -# -FROM docker.io/eclipse-temurin:17-jre-alpine -ARG PROJECT=hexagon_vertx_pgclient - -ENV POSTGRESQL_DB_HOST tfb-database -ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA - -COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT - -ENTRYPOINT [ "/opt/hexagon_vertx_pgclient/bin/hexagon_vertx_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt index 1e40fa3ffaf..0b21842bc8f 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt @@ -11,14 +11,6 @@ import java.net.URL fun main() { ResourceLeakDetector.setLevel(DISABLED) - System.setProperty("vertx.disableMetrics", "true") - System.setProperty("vertx.disableH2c", "true") - System.setProperty("vertx.disableWebsockets", "true") - System.setProperty("vertx.flashPolicyHandler", "false") - System.setProperty("vertx.threadChecks", "false") - System.setProperty("vertx.disableContextTimings", "true") - System.setProperty("vertx.disableTCCL", "true") - System.setProperty("vertx.disableHttpHeadersValidation", "true") System.setProperty("io.netty.buffer.checkBounds", "false") System.setProperty("io.netty.buffer.checkAccessible", "false") From 3b053f41613114925dcb8973536360aa52e6fcfb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 17 Jun 2023 22:16:45 +0200 Subject: [PATCH 0134/1766] Add Jasync store --- .../Kotlin/hexagon/benchmark_config.json | 23 ++++ frameworks/Kotlin/hexagon/build.gradle | 1 + frameworks/Kotlin/hexagon/config.toml | 18 +++ ...hexagon-nettyepoll-async-jasync.dockerfile | 23 ++++ .../build.gradle | 8 ++ .../src/main/kotlin/Benchmark.kt | 25 +++++ .../src/main/kotlin/Benchmark.kt | 8 ++ frameworks/Kotlin/hexagon/settings.gradle | 2 + .../Kotlin/hexagon/store_jasync/build.gradle | 5 + .../src/main/kotlin/BenchmarkJasyncStore.kt | 106 ++++++++++++++++++ 10 files changed, 219 insertions(+) create mode 100644 frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/store_jasync/build.gradle create mode 100644 frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 90db8bffd93..e16837acbe8 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -180,6 +180,29 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, + "netty-async-jasync": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Netty Async Jasync", + "notes": "http://hexagonkt.com", + "versus": "netty" + }, "netty-async-pgclient": { "json_url": "/json", "db_url": "/db", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index f4a2ad995c7..47101f72dbf 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -16,6 +16,7 @@ ext { hikariVersion = "5.0.1" postgresqlVersion = "42.6.0" vertxVersion = "4.4.3" + jasyncVersion = "2.2.0" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index 488f052bb61..be5cfb36a91 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -145,6 +145,24 @@ platform = "Netty" webserver = "None" versus = "netty" +[nettyepoll-async-jasync] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "netty" + [tomcat] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile new file mode 100644 index 00000000000..d35474e1b0b --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile @@ -0,0 +1,23 @@ +# +# BUILD +# +FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +ADD . . +RUN gradle --quiet classes +RUN gradle --quiet -x test installDist + +# +# RUNTIME +# +FROM docker.io/eclipse-temurin:17-jre-alpine +ARG PROJECT=hexagon_nettyepoll_async_jasync + +ENV POSTGRESQL_DB_HOST tfb-database +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT + +ENTRYPOINT [ "/opt/hexagon_nettyepoll_async_jasync/bin/hexagon_nettyepoll_async_jasync" ] diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle new file mode 100644 index 00000000000..62804c2f8c4 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle @@ -0,0 +1,8 @@ + +apply(from: "$gradleScripts/application.gradle") + +dependencies { + api(project(":store_jasync")) + api("com.hexagonkt:http_server_netty_epoll_async:$hexagonVersion") + api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") +} diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..eee45899d05 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt @@ -0,0 +1,25 @@ +package com.hexagonkt + +import com.hexagonkt.async.Benchmark +import com.hexagonkt.async.store.BenchmarkJasyncStore +import com.hexagonkt.http.server.netty.epoll.async.NettyEpollServerAdapter +import com.hexagonkt.templates.rocker.RockerAdapter +import io.netty.util.ResourceLeakDetector +import io.netty.util.ResourceLeakDetector.Level.DISABLED +import java.net.URL + +fun main() { + ResourceLeakDetector.setLevel(DISABLED) + + System.setProperty("io.netty.buffer.checkBounds", "false") + System.setProperty("io.netty.buffer.checkAccessible", "false") + + val settings = Settings() + val store = BenchmarkJasyncStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = URL("classpath:fortunes.rocker.html") + val engine = NettyEpollServerAdapter(bossGroupThreads = 48) + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt index 0b21842bc8f..1e40fa3ffaf 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt @@ -11,6 +11,14 @@ import java.net.URL fun main() { ResourceLeakDetector.setLevel(DISABLED) + System.setProperty("vertx.disableMetrics", "true") + System.setProperty("vertx.disableH2c", "true") + System.setProperty("vertx.disableWebsockets", "true") + System.setProperty("vertx.flashPolicyHandler", "false") + System.setProperty("vertx.threadChecks", "false") + System.setProperty("vertx.disableContextTimings", "true") + System.setProperty("vertx.disableTCCL", "true") + System.setProperty("vertx.disableHttpHeadersValidation", "true") System.setProperty("io.netty.buffer.checkBounds", "false") System.setProperty("io.netty.buffer.checkAccessible", "false") diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle index cf4ad98fdac..d07b35f2779 100644 --- a/frameworks/Kotlin/hexagon/settings.gradle +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -3,6 +3,7 @@ include( "model", "core", "core_async", + "store_jasync", "store_pgclient", "store_pgclient_async", "store_sql", @@ -12,6 +13,7 @@ include( "hexagon_netty_postgresql", "hexagon_netty_async_pgclient", "hexagon_nettyepoll_pgclient", + "hexagon_nettyepoll_async_jasync", "hexagon_nettyepoll_async_pgclient", "hexagon_nettyepoll_postgresql", "hexagon_tomcat_postgresql", diff --git a/frameworks/Kotlin/hexagon/store_jasync/build.gradle b/frameworks/Kotlin/hexagon/store_jasync/build.gradle new file mode 100644 index 00000000000..5ead678dd16 --- /dev/null +++ b/frameworks/Kotlin/hexagon/store_jasync/build.gradle @@ -0,0 +1,5 @@ + +dependencies { + api(project(":core_async")) + implementation("com.github.jasync-sql:jasync-postgresql:$jasyncVersion") +} diff --git a/frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt b/frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt new file mode 100644 index 00000000000..0f5702c5e84 --- /dev/null +++ b/frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt @@ -0,0 +1,106 @@ +package com.hexagonkt.async.store + +import com.github.jasync.sql.db.ConnectionPoolConfigurationBuilder +import com.github.jasync.sql.db.pool.ConnectionPool +import com.github.jasync.sql.db.postgresql.PostgreSQLConnection +import com.github.jasync.sql.db.postgresql.PostgreSQLConnectionBuilder +import com.hexagonkt.Settings +import com.hexagonkt.core.Jvm +import com.hexagonkt.model.CachedWorld +import com.hexagonkt.model.Fortune +import com.hexagonkt.model.World +import org.cache2k.Cache +import java.util.concurrent.CompletableFuture +import java.util.concurrent.CompletableFuture.allOf + +class BenchmarkJasyncStore( + engine: String, + private val settings: Settings = Settings(), +) : BenchmarkStore(settings) { + + companion object { + private const val SELECT_WORLD: String = "select * from world where id = $1" + private const val UPDATE_WORLD: String = "update world set randomNumber = $1 where id = $2" + private const val SELECT_ALL_FORTUNES: String = "select * from fortune" + } + + private val dataSource: ConnectionPool by lazy { + ConnectionPoolConfigurationBuilder().let { + val environment = Jvm.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() + val cpuCount = Jvm.cpuCount + + it.maxActiveConnections = 8 + if (environment == "citrine") cpuCount else cpuCount * 2 + it.host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" + it.database = settings.databaseName + it.username = settings.databaseUsername + it.password = settings.databasePassword + + PostgreSQLConnectionBuilder.createConnectionPool(it.build()) + } + } + + override fun findAllFortunes(): CompletableFuture> = + dataSource.sendPreparedStatement(SELECT_ALL_FORTUNES) + .thenApply { result -> + val rowSet = result.rows + rowSet.map { row -> + val id = row.getInt(0) ?: error("") + val message = row.getString(1) ?: error("") + Fortune(id, message) + } + } + + override fun findWorlds(ids: List): CompletableFuture> { + val futures = ids.map { findWorld(it, dataSource) }.toTypedArray() + return allOf(*futures).thenApply { futures.map { f -> f.get() ?: error("") } } + } + + override fun replaceWorlds(worlds: List): CompletableFuture<*> { + val futures = worlds.map { + val worldId = it.id + val newRandomNumber = it.randomNumber + dataSource + .sendPreparedStatement(SELECT_WORLD, listOf(worldId)) + .thenApply { rowSet -> + val row = rowSet.rows.iterator().next() + row.getInt(1) // Read 'randomNumber' to comply with Test type 5, point 6 + dataSource + .sendPreparedStatement(UPDATE_WORLD, listOf(newRandomNumber, worldId)) + } + }.toTypedArray() + + return allOf(*futures).thenApply { futures.map { f -> f.get() ?: error("") } } + } + + override fun initWorldsCache(cache: Cache) { + dataSource + .sendPreparedStatement("select * from world") + .thenApply { rowSet -> + rowSet.rows.map { row -> + val id = row.getInt(0) ?: error("") + val randomNumber = row.getInt(1) ?: error("") + cache.put(id, CachedWorld(id, randomNumber)) + } + } + .get() + } + + override fun loadCachedWorld(id: Int): CachedWorld = + findWorld(id, dataSource) + .thenApply { world -> CachedWorld(world.id, world.randomNumber) } + .get() + + override fun close() { + dataSource.disconnect().get() + } + + private fun findWorld(id: Int, client: ConnectionPool<*>): CompletableFuture = + client + .sendPreparedStatement(SELECT_WORLD, listOf(id)) + .thenApply { rowSet -> + val row = rowSet.rows.iterator().next() + val id1 = row.getInt(0) ?: error("") + val randomNumber = row.getInt(1) ?: error("") + World(id1, randomNumber) + } +} From 3c6475953104029274b29ae9a91ee0fa8cf5e8ce Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sun, 18 Jun 2023 08:52:52 +0200 Subject: [PATCH 0135/1766] Add Jasync store --- frameworks/Kotlin/hexagon/benchmark_config.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index e16837acbe8..4874edffd24 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -153,11 +153,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll PgClient", + "display_name": "Hexagon Netty Epoll Async PgClient", "notes": "http://hexagonkt.com", "versus": "netty" }, - "netty-native": { + "nettyepoll-async-jasync": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -176,11 +176,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Native PostgreSQL", + "display_name": "Hexagon Netty Epoll Async Jasync", "notes": "http://hexagonkt.com", "versus": "netty" }, - "netty-async-jasync": { + "netty-native": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -199,7 +199,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Async Jasync", + "display_name": "Hexagon Netty Native PostgreSQL", "notes": "http://hexagonkt.com", "versus": "netty" }, From 4c921b4bdf41ca9efb676f2588b8f496e5c4382f Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 19:39:26 +0200 Subject: [PATCH 0136/1766] Update --- frameworks/Kotlin/hexagon/build.gradle | 10 +- .../hexagon-jettyloom-pgclient.dockerfile | 2 +- .../hexagon/hexagon-jettyloom.dockerfile | 2 +- .../hexagon-netty-async-pgclient.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-netty.dockerfile | 2 +- ...hexagon-nettyepoll-async-jasync.dockerfile | 10 +- .../hexagon/hexagon-nettyepoll.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- .../build.gradle | 8 -- .../src/main/kotlin/Benchmark.kt | 25 ----- .../Kotlin/hexagon/store_jasync/build.gradle | 5 - .../src/main/kotlin/BenchmarkJasyncStore.kt | 106 ------------------ 12 files changed, 12 insertions(+), 164 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle delete mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt delete mode 100644 frameworks/Kotlin/hexagon/store_jasync/build.gradle delete mode 100644 frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index f4a2ad995c7..fecbf1174e6 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.8.22" apply false - id "org.graalvm.buildtools.native" version "0.9.22" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.0" apply false + id "org.graalvm.buildtools.native" version "0.9.23" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.0-B3" + hexagonVersion = "3.0.0-B8" jettyVersion = "11.0.15" - nettyVersion = "4.1.93.Final" + nettyVersion = "4.1.94.Final" hikariVersion = "5.0.1" postgresqlVersion = "42.6.0" - vertxVersion = "4.4.3" + vertxVersion = "4.4.4" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 804555dae57..390ce706bc6 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.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 1d64e9246dd..97809e8cc05 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.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile index 09845f263cb..ddb35d90de8 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile index 18fce97d813..16b71649263 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile index 9307f4120ab..aae9e180c7d 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon @@ -13,19 +13,11 @@ RUN gradle --quiet -x test installDist # RUNTIME # FROM docker.io/eclipse-temurin:17-jre-alpine -<<<<<<<< HEAD:frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile -ARG PROJECT=hexagon_nettyepoll_async_jasync -======== ARG PROJECT=hexagon_nettyepoll_async_pgclient ->>>>>>>> 1d0e4006abc9d1d1cfee1f3f2e5bdbc9fbab8f11:frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -<<<<<<<< HEAD:frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile -ENTRYPOINT [ "/opt/hexagon_nettyepoll_async_jasync/bin/hexagon_nettyepoll_async_jasync" ] -======== ENTRYPOINT [ "/opt/hexagon_nettyepoll_async_pgclient/bin/hexagon_nettyepoll_async_pgclient" ] ->>>>>>>> 1d0e4006abc9d1d1cfee1f3f2e5bdbc9fbab8f11:frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index c8a5592b67e..9b083b9683d 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.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 6bc878580ab..2cf68db7f9f 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle deleted file mode 100644 index 62804c2f8c4..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ - -apply(from: "$gradleScripts/application.gradle") - -dependencies { - api(project(":store_jasync")) - api("com.hexagonkt:http_server_netty_epoll_async:$hexagonVersion") - api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") -} diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt deleted file mode 100644 index eee45899d05..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_jasync/src/main/kotlin/Benchmark.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.hexagonkt - -import com.hexagonkt.async.Benchmark -import com.hexagonkt.async.store.BenchmarkJasyncStore -import com.hexagonkt.http.server.netty.epoll.async.NettyEpollServerAdapter -import com.hexagonkt.templates.rocker.RockerAdapter -import io.netty.util.ResourceLeakDetector -import io.netty.util.ResourceLeakDetector.Level.DISABLED -import java.net.URL - -fun main() { - ResourceLeakDetector.setLevel(DISABLED) - - System.setProperty("io.netty.buffer.checkBounds", "false") - System.setProperty("io.netty.buffer.checkAccessible", "false") - - val settings = Settings() - val store = BenchmarkJasyncStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") - val engine = NettyEpollServerAdapter(bossGroupThreads = 48) - - val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) - benchmark.server.start() -} diff --git a/frameworks/Kotlin/hexagon/store_jasync/build.gradle b/frameworks/Kotlin/hexagon/store_jasync/build.gradle deleted file mode 100644 index 5ead678dd16..00000000000 --- a/frameworks/Kotlin/hexagon/store_jasync/build.gradle +++ /dev/null @@ -1,5 +0,0 @@ - -dependencies { - api(project(":core_async")) - implementation("com.github.jasync-sql:jasync-postgresql:$jasyncVersion") -} diff --git a/frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt b/frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt deleted file mode 100644 index 0f5702c5e84..00000000000 --- a/frameworks/Kotlin/hexagon/store_jasync/src/main/kotlin/BenchmarkJasyncStore.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.hexagonkt.async.store - -import com.github.jasync.sql.db.ConnectionPoolConfigurationBuilder -import com.github.jasync.sql.db.pool.ConnectionPool -import com.github.jasync.sql.db.postgresql.PostgreSQLConnection -import com.github.jasync.sql.db.postgresql.PostgreSQLConnectionBuilder -import com.hexagonkt.Settings -import com.hexagonkt.core.Jvm -import com.hexagonkt.model.CachedWorld -import com.hexagonkt.model.Fortune -import com.hexagonkt.model.World -import org.cache2k.Cache -import java.util.concurrent.CompletableFuture -import java.util.concurrent.CompletableFuture.allOf - -class BenchmarkJasyncStore( - engine: String, - private val settings: Settings = Settings(), -) : BenchmarkStore(settings) { - - companion object { - private const val SELECT_WORLD: String = "select * from world where id = $1" - private const val UPDATE_WORLD: String = "update world set randomNumber = $1 where id = $2" - private const val SELECT_ALL_FORTUNES: String = "select * from fortune" - } - - private val dataSource: ConnectionPool by lazy { - ConnectionPoolConfigurationBuilder().let { - val environment = Jvm.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() - val cpuCount = Jvm.cpuCount - - it.maxActiveConnections = 8 + if (environment == "citrine") cpuCount else cpuCount * 2 - it.host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" - it.database = settings.databaseName - it.username = settings.databaseUsername - it.password = settings.databasePassword - - PostgreSQLConnectionBuilder.createConnectionPool(it.build()) - } - } - - override fun findAllFortunes(): CompletableFuture> = - dataSource.sendPreparedStatement(SELECT_ALL_FORTUNES) - .thenApply { result -> - val rowSet = result.rows - rowSet.map { row -> - val id = row.getInt(0) ?: error("") - val message = row.getString(1) ?: error("") - Fortune(id, message) - } - } - - override fun findWorlds(ids: List): CompletableFuture> { - val futures = ids.map { findWorld(it, dataSource) }.toTypedArray() - return allOf(*futures).thenApply { futures.map { f -> f.get() ?: error("") } } - } - - override fun replaceWorlds(worlds: List): CompletableFuture<*> { - val futures = worlds.map { - val worldId = it.id - val newRandomNumber = it.randomNumber - dataSource - .sendPreparedStatement(SELECT_WORLD, listOf(worldId)) - .thenApply { rowSet -> - val row = rowSet.rows.iterator().next() - row.getInt(1) // Read 'randomNumber' to comply with Test type 5, point 6 - dataSource - .sendPreparedStatement(UPDATE_WORLD, listOf(newRandomNumber, worldId)) - } - }.toTypedArray() - - return allOf(*futures).thenApply { futures.map { f -> f.get() ?: error("") } } - } - - override fun initWorldsCache(cache: Cache) { - dataSource - .sendPreparedStatement("select * from world") - .thenApply { rowSet -> - rowSet.rows.map { row -> - val id = row.getInt(0) ?: error("") - val randomNumber = row.getInt(1) ?: error("") - cache.put(id, CachedWorld(id, randomNumber)) - } - } - .get() - } - - override fun loadCachedWorld(id: Int): CachedWorld = - findWorld(id, dataSource) - .thenApply { world -> CachedWorld(world.id, world.randomNumber) } - .get() - - override fun close() { - dataSource.disconnect().get() - } - - private fun findWorld(id: Int, client: ConnectionPool<*>): CompletableFuture = - client - .sendPreparedStatement(SELECT_WORLD, listOf(id)) - .thenApply { rowSet -> - val row = rowSet.rows.iterator().next() - val id1 = row.getInt(0) ?: error("") - val randomNumber = row.getInt(1) ?: error("") - World(id1, randomNumber) - } -} From da155321b774f18accc5d4880b830b9afb101fc0 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 19:39:52 +0200 Subject: [PATCH 0137/1766] Update --- ...hexagon-nettyepoll-async-jasync.dockerfile | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile deleted file mode 100644 index aae9e180c7d..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-jasync.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# BUILD -# -FROM docker.io/gradle:8.2-jdk17-alpine AS build -USER root -WORKDIR /hexagon - -ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist - -# -# RUNTIME -# -FROM docker.io/eclipse-temurin:17-jre-alpine -ARG PROJECT=hexagon_nettyepoll_async_pgclient - -ENV POSTGRESQL_DB_HOST tfb-database -ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA - -COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT - -ENTRYPOINT [ "/opt/hexagon_nettyepoll_async_pgclient/bin/hexagon_nettyepoll_async_pgclient" ] From 8bf5f23aa2bf2eff013b517166fe67bea9b99512 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 19:53:05 +0200 Subject: [PATCH 0138/1766] Update --- .../Kotlin/hexagon/benchmark_config.json | 60 +++---------------- frameworks/Kotlin/hexagon/config.toml | 20 +------ .../hexagon/hexagon-jetty-native.dockerfile | 21 ------- .../hexagon-netty-async-pgclient.dockerfile | 23 ------- 4 files changed, 9 insertions(+), 115 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile delete mode 100644 frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index a9e45ab3204..7319f7f601a 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -92,7 +92,7 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, - "nettyepoll": { + "netty-native": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -111,53 +111,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll PostgreSQL", - "notes": "http://hexagonkt.com", - "versus": "netty" - }, - "nettyepoll-pgclient": { - "db_url": "/db", - "query_url": "/query?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "cached_query_url": "/cached-queries?count=", - "port": 9090, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Netty Epoll PgClient", - "notes": "http://hexagonkt.com", - "versus": "netty" - }, - "nettyepoll-async-pgclient": { - "db_url": "/db", - "query_url": "/query?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "cached_query_url": "/cached-queries?count=", - "port": 9090, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Netty Epoll Async PgClient", + "display_name": "Hexagon Netty Native PostgreSQL", "notes": "http://hexagonkt.com", "versus": "netty" }, - "nettyepoll-async-jasync": { + "nettyepoll": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -176,11 +134,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll Async Jasync", + "display_name": "Hexagon Netty Epoll PostgreSQL", "notes": "http://hexagonkt.com", "versus": "netty" }, - "netty-native": { + "nettyepoll-async-pgclient": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -199,18 +157,16 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Native PostgreSQL", + "display_name": "Hexagon Netty Epoll Async PgClient", "notes": "http://hexagonkt.com", "versus": "netty" }, - "nettyepoll-async-pgclient": { - "json_url": "/json", + "nettyepoll-pgclient": { "db_url": "/db", "query_url": "/query?queries=", "fortune_url": "/fortunes", "update_url": "/update?queries=", "cached_query_url": "/cached-queries?count=", - "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", "classification": "Micro", @@ -222,7 +178,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Async PgClient", + "display_name": "Hexagon Netty Epoll PgClient", "notes": "http://hexagonkt.com", "versus": "netty" }, diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index a670485de47..edb6b6e4a5f 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -109,24 +109,6 @@ platform = "Netty" webserver = "None" versus = "netty" -[nettyepoll-pgclient] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/query?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -urls.cached_query = "/cached-queries?count=" -approach = "Realistic" -classification = "Micro" -database = "postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Netty" -webserver = "None" -versus = "netty" - [nettyepoll-async-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" @@ -145,7 +127,7 @@ platform = "Netty" webserver = "None" versus = "netty" -[nettyepoll-async-pgclient] +[nettyepoll-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile deleted file mode 100644 index 223aae81894..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -# -# BUILD -# -FROM ghcr.io/graalvm/native-image:ol9-java17-22.3.2 as build -USER root -WORKDIR /hexagon - -ADD . . -RUN microdnf -y install findutils -RUN ./gradlew --quiet classes -RUN ./gradlew --quiet -x test nativeCompile - -# -# RUNTIME -# -FROM scratch -ARG PROJECT=hexagon_jetty_postgresql - -COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / - -ENTRYPOINT [ "/hexagon_jetty_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile deleted file mode 100644 index ddb35d90de8..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# BUILD -# -FROM docker.io/gradle:8.2-jdk17-alpine AS build -USER root -WORKDIR /hexagon - -ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist - -# -# RUNTIME -# -FROM docker.io/eclipse-temurin:17-jre-alpine -ARG PROJECT=hexagon_netty_async_pgclient - -ENV POSTGRESQL_DB_HOST tfb-database -ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA - -COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT - -ENTRYPOINT [ "/opt/hexagon_netty_async_pgclient/bin/hexagon_netty_async_pgclient" ] From c55d98afa600bf3c5ddc36f7cc674bb12d0888dd Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 20:47:53 +0200 Subject: [PATCH 0139/1766] Update Gradle --- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 63375 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 ++- frameworks/Kotlin/hexagon/gradlew | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 16170 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 delta 14892 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 diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index ed4fda0fcea..ab1eb5eecd1 100644 --- a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index aeb74cbb43e..fcb6fca147c 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -130,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. From 5083e68d01c43e03cafcdbd524ffc3f81d25d5eb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 20:50:12 +0200 Subject: [PATCH 0140/1766] Benchmark Netty Epoll only --- .../hexagon_netty_async_pgclient/build.gradle | 7 ------ .../src/main/kotlin/Benchmark.kt | 25 ------------------- .../src/main/kotlin/Benchmark.kt | 24 ------------------ .../build.gradle | 1 + 4 files changed, 1 insertion(+), 56 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/build.gradle delete mode 100644 frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/src/main/kotlin/Benchmark.kt delete mode 100644 frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt diff --git a/frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/build.gradle deleted file mode 100644 index f29d1703b61..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ - -apply(from: "$gradleScripts/application.gradle") - -dependencies { - api(project(":store_pgclient_async")) - api("com.hexagonkt:http_server_netty_async:$hexagonVersion") -} diff --git a/frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/src/main/kotlin/Benchmark.kt deleted file mode 100644 index e5a9de4c597..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/src/main/kotlin/Benchmark.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.hexagonkt - -import com.hexagonkt.async.Benchmark -import com.hexagonkt.async.store.BenchmarkPgClientStore -import com.hexagonkt.http.server.netty.async.NettyServerAdapter -import com.hexagonkt.templates.rocker.RockerAdapter -import io.netty.util.ResourceLeakDetector -import io.netty.util.ResourceLeakDetector.Level.DISABLED -import java.net.URL - -fun main() { - ResourceLeakDetector.setLevel(DISABLED) - - System.setProperty("io.netty.buffer.checkBounds", "false") - System.setProperty("io.netty.buffer.checkAccessible", "false") - - val settings = Settings() - val store = BenchmarkPgClientStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") - val engine = NettyServerAdapter(bossGroupThreads = 48) - - val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) - benchmark.server.start() -} diff --git a/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt deleted file mode 100644 index 2a95e7385fc..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.hexagonkt - -import com.hexagonkt.http.server.netty.NettyServerAdapter -import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.rocker.RockerAdapter -import io.netty.util.ResourceLeakDetector -import io.netty.util.ResourceLeakDetector.Level.DISABLED -import java.net.URL - -fun main() { - ResourceLeakDetector.setLevel(DISABLED) - - System.setProperty("io.netty.buffer.checkBounds", "false") - System.setProperty("io.netty.buffer.checkAccessible", "false") - - val settings = Settings() - val store = BenchmarkSqlStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") - val engine = NettyServerAdapter() - - val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) - benchmark.server.start() -} diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle index 243fa57c121..d3ce42499e4 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle @@ -1,4 +1,5 @@ +apply(from: "$gradleScripts/native.gradle") apply(from: "$gradleScripts/application.gradle") dependencies { From 927a7001a1bc4e2e3713a599c2cac733b1213cdb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 20:54:37 +0200 Subject: [PATCH 0141/1766] Add Nima adapter --- .../Kotlin/hexagon/benchmark_config.json | 55 +++++++++++++------ frameworks/Kotlin/hexagon/config.toml | 36 +++++++++--- .../hexagon_nima_pgclient/build.gradle | 7 +++ .../src/main/kotlin/Benchmark.kt | 17 ++++++ .../build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 17 ++++++ frameworks/Kotlin/hexagon/settings.gradle | 4 +- 7 files changed, 110 insertions(+), 28 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_nima_pgclient/src/main/kotlin/Benchmark.kt rename frameworks/Kotlin/hexagon/{hexagon_netty_postgresql => hexagon_nima_postgresql}/build.gradle (70%) create mode 100644 frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 7319f7f601a..a03055d3a3d 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -69,7 +69,7 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, - "netty": { + "nettyepoll": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -88,11 +88,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty PostgreSQL", + "display_name": "Hexagon Netty Epoll PostgreSQL", "notes": "http://hexagonkt.com", "versus": "netty" }, - "netty-native": { + "nettyepoll-async-pgclient": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -111,18 +111,16 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Native PostgreSQL", + "display_name": "Hexagon Netty Epoll Async PgClient", "notes": "http://hexagonkt.com", "versus": "netty" }, - "nettyepoll": { - "json_url": "/json", + "nettyepoll-pgclient": { "db_url": "/db", "query_url": "/query?queries=", "fortune_url": "/fortunes", "update_url": "/update?queries=", "cached_query_url": "/cached-queries?count=", - "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", "classification": "Micro", @@ -134,11 +132,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll PostgreSQL", + "display_name": "Hexagon Netty Epoll PgClient", "notes": "http://hexagonkt.com", "versus": "netty" }, - "nettyepoll-async-pgclient": { + "nima": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -153,20 +151,22 @@ "framework": "Hexagon", "language": "Kotlin", "orm": "Raw", - "platform": "Netty", + "platform": "Helidon", "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll Async PgClient", + "display_name": "Hexagon Nima PostgreSQL", "notes": "http://hexagonkt.com", - "versus": "netty" + "versus": "helidon-nima" }, - "nettyepoll-pgclient": { + "nima-native": { + "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", "fortune_url": "/fortunes", "update_url": "/update?queries=", "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", "classification": "Micro", @@ -174,13 +174,36 @@ "framework": "Hexagon", "language": "Kotlin", "orm": "Raw", - "platform": "Netty", + "platform": "Helidon", "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll PgClient", + "display_name": "Hexagon Nima Native PostgreSQL", "notes": "http://hexagonkt.com", - "versus": "netty" + "versus": "helidon-nima" + }, + "nima-pgclient": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Helidon", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Nima PgClient", + "notes": "http://hexagonkt.com", + "versus": "helidon-nima" }, "tomcat": { "json_url": "/json", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index edb6b6e4a5f..10a0418dbe4 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -55,7 +55,7 @@ platform = "Servlet" webserver = "None" versus = "servlet" -[netty] +[nettyepoll] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -73,7 +73,7 @@ platform = "Netty" webserver = "None" versus = "netty" -[netty-native] +[nettyepoll-async-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -91,7 +91,7 @@ platform = "Netty" webserver = "None" versus = "netty" -[nettyepoll] +[nettyepoll-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -109,7 +109,7 @@ platform = "Netty" webserver = "None" versus = "netty" -[nettyepoll-async-pgclient] +[nima] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -123,11 +123,11 @@ database = "postgres" database_os = "Linux" os = "Linux" orm = "Raw" -platform = "Netty" +platform = "Helidon" webserver = "None" -versus = "netty" +versus = "helidon-nima" -[nettyepoll-pgclient] +[nima-native] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -141,9 +141,27 @@ database = "postgres" database_os = "Linux" os = "Linux" orm = "Raw" -platform = "Netty" +platform = "Helidon" webserver = "None" -versus = "netty" +versus = "helidon-nima" + +[nima-pgclient] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Helidon" +webserver = "None" +versus = "helidon-nima" [tomcat] urls.plaintext = "/plaintext" diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle new file mode 100644 index 00000000000..86d2692a326 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle @@ -0,0 +1,7 @@ + +apply(from: "$gradleScripts/application.gradle") + +dependencies { + api(project(":store_pgclient")) + api("com.hexagonkt:http_server_nima:$hexagonVersion") +} diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..9df2914829b --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/src/main/kotlin/Benchmark.kt @@ -0,0 +1,17 @@ +package com.hexagonkt + +import com.hexagonkt.core.urlOf +import com.hexagonkt.http.server.nima.NimaServerAdapter +import com.hexagonkt.store.BenchmarkPgClientStore +import com.hexagonkt.templates.rocker.RockerAdapter + +fun main() { + val settings = Settings() + val store = BenchmarkPgClientStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = urlOf("classpath:fortunes.rocker.html") + val engine = NimaServerAdapter() + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle similarity index 70% rename from frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle rename to frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle index 01884cb3583..2957919e905 100644 --- a/frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle @@ -4,5 +4,5 @@ apply(from: "$gradleScripts/native.gradle") dependencies { api(project(":store_sql")) - api("com.hexagonkt:http_server_netty:$hexagonVersion") + api("com.hexagonkt:http_server_nima:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..16e4797e37a --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt @@ -0,0 +1,17 @@ +package com.hexagonkt + +import com.hexagonkt.core.urlOf +import com.hexagonkt.http.server.nima.NimaServerAdapter +import com.hexagonkt.store.BenchmarkSqlStore +import com.hexagonkt.templates.rocker.RockerAdapter + +fun main() { + val settings = Settings() + val store = BenchmarkSqlStore("postgresql") + val templateEngine = RockerAdapter() + val templateUrl = urlOf("classpath:fortunes.rocker.html") + val engine = NimaServerAdapter() + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle index cf4ad98fdac..2b234d2bbc6 100644 --- a/frameworks/Kotlin/hexagon/settings.gradle +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -9,8 +9,8 @@ include( "hexagon_jetty_pgclient", "hexagon_jetty_postgresql", - "hexagon_netty_postgresql", - "hexagon_netty_async_pgclient", + "hexagon_nima_pgclient", + "hexagon_nima_postgresql", "hexagon_nettyepoll_pgclient", "hexagon_nettyepoll_async_pgclient", "hexagon_nettyepoll_postgresql", From 494167f5a5d87ff72fed01753af6b56f87aa3d07 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 20:58:12 +0200 Subject: [PATCH 0142/1766] Update container builds --- ...xagon-nettyepoll-async-pgclient.dockerfile | 2 +- .../hexagon-nettyepoll-pgclient.dockerfile | 2 +- ...kerfile => hexagon-nima-native.dockerfile} | 6 ++--- ...rfile => hexagon-nima-pgclient.dockerfile} | 4 ++-- .../Kotlin/hexagon/hexagon-nima.dockerfile | 23 +++++++++++++++++++ .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- 6 files changed, 31 insertions(+), 8 deletions(-) rename frameworks/Kotlin/hexagon/{hexagon-netty-native.dockerfile => hexagon-nima-native.dockerfile} (64%) rename frameworks/Kotlin/hexagon/{hexagon-netty.dockerfile => hexagon-nima-pgclient.dockerfile} (78%) create mode 100644 frameworks/Kotlin/hexagon/hexagon-nima.dockerfile diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile index 7e4c80d6cd4..aae9e180c7d 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-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 afe2e155ccc..e753730c6e4 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.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-netty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile similarity index 64% rename from frameworks/Kotlin/hexagon/hexagon-netty-native.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile index 5443b48eb8f..004b0dba351 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM ghcr.io/graalvm/native-image:ol9-java17-22.3.2 as build +FROM ghcr.io/graalvm/native-image-community:17-ol9 as build USER root WORKDIR /hexagon @@ -14,8 +14,8 @@ RUN ./gradlew --quiet -x test nativeCompile # RUNTIME # FROM scratch -ARG PROJECT=hexagon_netty_postgresql +ARG PROJECT=hexagon_nima_postgresql COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / -ENTRYPOINT [ "/hexagon_netty_postgresql" ] +ENTRYPOINT [ "/hexagon_nima_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile similarity index 78% rename from frameworks/Kotlin/hexagon/hexagon-netty.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile index 16b71649263..88861993f80 100644 --- a/frameworks/Kotlin/hexagon/hexagon-netty.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile @@ -13,11 +13,11 @@ RUN gradle --quiet -x test installDist # RUNTIME # FROM docker.io/eclipse-temurin:17-jre-alpine -ARG PROJECT=hexagon_netty_postgresql +ARG PROJECT=hexagon_nima_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -ENTRYPOINT [ "/opt/hexagon_netty_postgresql/bin/hexagon_netty_postgresql" ] +ENTRYPOINT [ "/opt/hexagon_nima_pgclient/bin/hexagon_nima_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile new file mode 100644 index 00000000000..64e403b8eed --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile @@ -0,0 +1,23 @@ +# +# BUILD +# +FROM docker.io/gradle:8.2-jdk17-alpine AS build +USER root +WORKDIR /hexagon + +ADD . . +RUN gradle --quiet classes +RUN gradle --quiet -x test installDist + +# +# RUNTIME +# +FROM docker.io/eclipse-temurin:17-jre-alpine +ARG PROJECT=hexagon_nima_postgresql + +ENV POSTGRESQL_DB_HOST tfb-database +ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA + +COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT + +ENTRYPOINT [ "/opt/hexagon_nima_postgresql/bin/hexagon_nima_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index e35db7b9f68..7fd1f9ca4e4 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.1.1-jdk17-alpine AS build +FROM docker.io/gradle:8.2-jdk17-alpine AS build USER root WORKDIR /hexagon From 8c6ae8e8a7830e529eb288076bbf45c2576b54ea Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 21:05:04 +0200 Subject: [PATCH 0143/1766] Fix missing endpoints --- frameworks/Kotlin/hexagon/benchmark_config.json | 4 ++++ frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index a03055d3a3d..f88f6dcd6da 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -49,11 +49,13 @@ "versus": "servlet" }, "jettyloom-pgclient": { + "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", "fortune_url": "/fortunes", "update_url": "/update?queries=", "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", "classification": "Micro", @@ -116,11 +118,13 @@ "versus": "netty" }, "nettyepoll-pgclient": { + "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", "fortune_url": "/fortunes", "update_url": "/update?queries=", "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", "port": 9090, "approach": "Realistic", "classification": "Micro", diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile index 004b0dba351..2f43ec310d0 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM ghcr.io/graalvm/native-image-community:17-ol9 as build +FROM ghcr.io/graalvm/native-image-community:20-ol9 as build USER root WORKDIR /hexagon From 8917827356bcb7368fbd3833336ef1eca363a35f Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 10 Jul 2023 21:45:56 +0200 Subject: [PATCH 0144/1766] Fix Nima benchmarks --- .../Kotlin/hexagon/benchmark_config.json | 23 ------------------- frameworks/Kotlin/hexagon/config.toml | 18 --------------- .../hexagon/hexagon-nima-native.dockerfile | 21 ----------------- .../hexagon/hexagon-nima-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-nima.dockerfile | 4 ++-- 5 files changed, 4 insertions(+), 66 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index f88f6dcd6da..c98335451d2 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -163,29 +163,6 @@ "notes": "http://hexagonkt.com", "versus": "helidon-nima" }, - "nima-native": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/query?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "cached_query_url": "/cached-queries?count=", - "plaintext_url": "/plaintext", - "port": 9090, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Helidon", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Nima Native PostgreSQL", - "notes": "http://hexagonkt.com", - "versus": "helidon-nima" - }, "nima-pgclient": { "json_url": "/json", "db_url": "/db", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index 10a0418dbe4..5629b5a7d8d 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -127,24 +127,6 @@ platform = "Helidon" webserver = "None" versus = "helidon-nima" -[nima-native] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/query?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -urls.cached_query = "/cached-queries?count=" -approach = "Realistic" -classification = "Micro" -database = "postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Helidon" -webserver = "None" -versus = "helidon-nima" - [nima-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile deleted file mode 100644 index 2f43ec310d0..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -# -# BUILD -# -FROM ghcr.io/graalvm/native-image-community:20-ol9 as build -USER root -WORKDIR /hexagon - -ADD . . -RUN microdnf -y install findutils -RUN ./gradlew --quiet classes -RUN ./gradlew --quiet -x test nativeCompile - -# -# RUNTIME -# -FROM scratch -ARG PROJECT=hexagon_nima_postgresql - -COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / - -ENTRYPOINT [ "/hexagon_nima_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile index 88861993f80..f99ae730145 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile @@ -12,11 +12,11 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:17-jre-alpine +FROM docker.io/eclipse-temurin:20-jre-alpine ARG PROJECT=hexagon_nima_pgclient ENV POSTGRESQL_DB_HOST tfb-database -ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile index 64e403b8eed..cfb1f55454d 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile @@ -12,11 +12,11 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:17-jre-alpine +FROM docker.io/eclipse-temurin:20-jre-alpine ARG PROJECT=hexagon_nima_postgresql ENV POSTGRESQL_DB_HOST tfb-database -ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT From c1e45d26d78dcc2b774fe8e2debc0ed818816109 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 3 Aug 2023 09:11:03 +0200 Subject: [PATCH 0145/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index fecbf1174e6..c8031c34b7e 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,9 +9,9 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.0-B8" + hexagonVersion = "3.0.0-B9" jettyVersion = "11.0.15" - nettyVersion = "4.1.94.Final" + nettyVersion = "4.1.96.Final" hikariVersion = "5.0.1" postgresqlVersion = "42.6.0" From 58635b12866ca95c5566086dabc18717c7db54bb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 15 Aug 2023 19:53:44 +0200 Subject: [PATCH 0146/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 6 +- .../Kotlin/hexagon/core_async/build.gradle | 32 ----- .../core_async/src/main/kotlin/Benchmark.kt | 28 ---- .../core_async/src/main/kotlin/Controller.kt | 133 ------------------ .../src/main/kotlin/store/BenchmarkStore.kt | 34 ----- .../core/native-image.properties | 7 - .../core/reflect-config.json | 23 --- .../src/main/resources/fortunes.rocker.html | 24 ---- .../hexagon-jettyloom-pgclient.dockerfile | 2 +- .../hexagon/hexagon-jettyloom.dockerfile | 2 +- ...xagon-nettyepoll-async-pgclient.dockerfile | 23 --- .../hexagon-nettyepoll-pgclient.dockerfile | 2 +- .../hexagon/hexagon-nettyepoll.dockerfile | 2 +- .../hexagon/hexagon-nima-native.dockerfile | 21 +++ .../hexagon/hexagon-nima-pgclient.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-nima.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- .../build.gradle | 8 -- .../src/main/kotlin/Benchmark.kt | 33 ----- frameworks/Kotlin/hexagon/settings.gradle | 4 +- .../hexagon/store_pgclient_async/build.gradle | 6 - .../src/main/kotlin/BenchmarkPgClientStore.kt | 114 --------------- 23 files changed, 33 insertions(+), 479 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/core_async/build.gradle delete mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt delete mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt delete mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt delete mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties delete mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json delete mode 100644 frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html delete mode 100644 frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile create mode 100644 frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile delete mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle delete mode 100644 frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt delete mode 100644 frameworks/Kotlin/hexagon/store_pgclient_async/build.gradle delete mode 100644 frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index c8031c34b7e..669495460e6 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.0" apply false - id "org.graalvm.buildtools.native" version "0.9.23" apply false + id "org.graalvm.buildtools.native" version "0.9.24" apply false } version = "1.0.0" @@ -9,8 +9,8 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.0-B9" - jettyVersion = "11.0.15" + hexagonVersion = "3.0.0" + jettyVersion = "12.0.0" nettyVersion = "4.1.96.Final" hikariVersion = "5.0.1" diff --git a/frameworks/Kotlin/hexagon/core_async/build.gradle b/frameworks/Kotlin/hexagon/core_async/build.gradle deleted file mode 100644 index 0a33387738e..00000000000 --- a/frameworks/Kotlin/hexagon/core_async/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ - -plugins { - id("nu.studer.rocker") version("3.0.4") -} - -dependencies { - api(project(":model")) - api("com.hexagonkt:http_server_async:$hexagonVersion") - api("com.hexagonkt:templates_rocker:$hexagonVersion") - api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") - api("com.hexagonkt:serialization_jackson_json:$hexagonVersion") - api("org.cache2k:cache2k-core:$cache2kVersion") -} - -tasks.register("minimizeTemplate") { - doLast { - File template = file("$buildDir/resources/main/fortunes.rocker.html") - List lines = template.readLines().collect { it.trim() } - template.write(lines.join("")) - } -} - -jar.dependsOn("minimizeTemplate") - -rocker { - configurations { - create("main") { - templateDir.set(file("src/main/resources")) - optimize.set(true) - } - } -} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt deleted file mode 100644 index 2bda28da73e..00000000000 --- a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.hexagonkt.async - -import com.hexagonkt.Settings -import com.hexagonkt.http.server.async.HttpServer -import com.hexagonkt.http.server.async.HttpServerPort -import com.hexagonkt.http.server.async.HttpServerSettings -import com.hexagonkt.async.store.BenchmarkStore -import com.hexagonkt.templates.TemplatePort -import java.net.InetAddress -import java.net.URL - -class Benchmark( - private val engine: HttpServerPort, - private val store: BenchmarkStore, - private val template: TemplatePort, - private val templateUrl: URL, - private val settings: Settings = Settings(), -) { - val server: HttpServer by lazy { - val controller = Controller(settings, store, template, templateUrl) - val serverSettings = HttpServerSettings( - bindAddress = InetAddress.getByName(settings.bindAddress), - bindPort = settings.bindPort, - ) - - HttpServer(engine, controller.path, serverSettings) - } -} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt deleted file mode 100644 index 683d39f4ffa..00000000000 --- a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt +++ /dev/null @@ -1,133 +0,0 @@ -package com.hexagonkt.async - -import com.hexagonkt.Settings -import com.hexagonkt.core.fieldsMapOf -import com.hexagonkt.core.media.APPLICATION_JSON -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.media.TEXT_PLAIN -import com.hexagonkt.handlers.async.done -import com.hexagonkt.http.model.ContentType -import com.hexagonkt.http.model.Header -import com.hexagonkt.http.model.Headers -import com.hexagonkt.http.server.async.callbacks.DateCallback -import com.hexagonkt.http.handlers.async.HttpContext -import com.hexagonkt.http.handlers.async.PathHandler -import com.hexagonkt.http.handlers.async.path -import com.hexagonkt.model.* -import com.hexagonkt.serialization.jackson.json.Json -import com.hexagonkt.serialization.serialize -import com.hexagonkt.async.store.BenchmarkStore -import com.hexagonkt.templates.TemplatePort -import java.net.URL -import java.util.concurrent.CompletableFuture -import java.util.concurrent.ThreadLocalRandom -import kotlin.text.Charsets.UTF_8 - -class Controller( - settings: Settings, - store: BenchmarkStore, - templateEngine: TemplatePort, - templateUrl: URL, -) { - private val queriesParam: String = settings.queriesParam - private val cachedQueriesParam: String = settings.cachedQueriesParam - private val worldRows: Int = settings.worldRows - private val textMessage: String = settings.textMessage - - private val plain: ContentType = ContentType(TEXT_PLAIN) - private val json: ContentType = ContentType(APPLICATION_JSON) - private val html: ContentType = ContentType(TEXT_HTML, charset = UTF_8) - - private val headers = Headers(Header("server", "Hexagon")) - - val path: PathHandler by lazy { - path { - on("*") { send(headers = headers).done() } - on("*", DateCallback()) - - get("/plaintext") { ok(textMessage, contentType = plain).done() } - get("/json") { ok(Message(textMessage).toJson(), contentType = json).done() } - get("/fortunes") { listFortunes(store, templateUrl, templateEngine) } - get("/db") { dbQuery(store) } - get("/query") { getWorlds(store) } - get("/cached-queries") { getCachedWorlds(store) } - get("/update") { updateWorlds(store) } - } - } - - private fun Message.toJson(): String = - toMap().serialize(Json.raw) - - private fun HttpContext.listFortunes( - store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort - ): CompletableFuture = - store - .findAllFortunes() - .thenApply { it + Fortune(0, "Additional fortune added at request time.") } - .thenApply { fortunes -> fortunes.sortedBy { it.message } } - .thenApply { sortedFortunes -> mapOf("fortunes" to sortedFortunes) } - .thenApply { context -> templateAdapter.render(templateUrl, context) } - .thenApply { body -> ok(body, contentType = html) } - - private fun HttpContext.dbQuery(store: BenchmarkStore): CompletableFuture { - val ids = listOf(randomWorld()) - return store.findWorlds(ids) - .thenApply { worlds -> worlds.first().toMap()} - .thenApply { world -> sendJson(world) } - } - - private fun HttpContext.getWorlds(store: BenchmarkStore): CompletableFuture { - val worldsCount = getWorldsCount(queriesParam) - val ids = (1..worldsCount).map { randomWorld() } - return store.findWorlds(ids) - .thenApply { worlds -> worlds.map { it.toMap() } } - .thenApply { worlds -> sendJson(worlds) } - } - - private fun HttpContext.getCachedWorlds(store: BenchmarkStore): CompletableFuture { - val worldsCount = getWorldsCount(cachedQueriesParam) - val ids = (1..worldsCount).map { randomWorld() } - val worlds = store.findCachedWorlds(ids).map { it.toMap() } - - return sendJson(worlds).done() - } - - private fun HttpContext.updateWorlds(store: BenchmarkStore): CompletableFuture { - val worldsCount = getWorldsCount(queriesParam) - val worlds = (1..worldsCount).map { World(randomWorld(), randomWorld()) } - - return store.replaceWorlds(worlds) - .thenApply { sendJson(worlds.map { it.toMap() }) } - } - - private fun HttpContext.sendJson(body: Any): HttpContext = - ok(body.serialize(Json.raw), contentType = json) - - private fun HttpContext.getWorldsCount(parameter: String): Int = - request.queryParameters[parameter]?.string()?.toIntOrNull().let { - when { - it == null -> 1 - it < 1 -> 1 - it > 500 -> 500 - else -> it - } - } - - private fun randomWorld(): Int = - ThreadLocalRandom.current().nextInt(worldRows) + 1 - - private fun Message.toMap(): Map = - fieldsMapOf(Message::message to message) - - private fun World.toMap(): Map = - fieldsMapOf( - World::id to id, - World::randomNumber to randomNumber, - ) - - private fun CachedWorld.toMap(): Map = - fieldsMapOf( - CachedWorld::id to id, - CachedWorld::randomNumber to randomNumber, - ) -} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt b/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt deleted file mode 100644 index 13f5aae7108..00000000000 --- a/frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.hexagonkt.async.store - -import com.hexagonkt.model.CachedWorld -import com.hexagonkt.model.Fortune -import com.hexagonkt.Settings -import com.hexagonkt.model.World -import org.cache2k.Cache -import org.cache2k.Cache2kBuilder -import java.util.concurrent.CompletableFuture - -abstract class BenchmarkStore(settings: Settings) { - - abstract fun findAllFortunes(): CompletableFuture> - abstract fun findWorlds(ids: List): CompletableFuture> - abstract fun replaceWorlds(worlds: List): CompletableFuture<*> - abstract fun initWorldsCache(cache: Cache) - abstract fun loadCachedWorld(id: Int): CachedWorld - abstract fun close() - - private val worldsCache: Cache by lazy { - object : Cache2kBuilder() {} - .eternal(true) - .disableMonitoring(true) - .disableStatistics(true) - .entryCapacity(settings.worldRows.toLong()) - .loader { id -> loadCachedWorld(id) } - .build() - .apply { initWorldsCache(this) } - } - - fun findCachedWorlds(ids: List): List { - return ids.mapNotNull { worldsCache.get(it) } - } -} diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties b/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties deleted file mode 100644 index ee1c0199d95..00000000000 --- a/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties +++ /dev/null @@ -1,7 +0,0 @@ -Args= \ - -H:IncludeResources=.*\\.(html|class) \ - --enable-preview \ - --static \ - --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \ - --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter$1 \ - --initialize-at-build-time=org.slf4j.LoggerFactory diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json b/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json deleted file mode 100644 index 11815306be2..00000000000 --- a/frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "name": "fortunes", - "allPublicMethods": true, - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors": true - }, - { - "name": "fortunes$Template", - "allPublicMethods": true, - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors": true - }, - { - "name": "fortunes$PlainText", - "allPublicMethods": true, - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors": true - } -] diff --git a/frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html b/frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html deleted file mode 100644 index c9a9d4037e5..00000000000 --- a/frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html +++ /dev/null @@ -1,24 +0,0 @@ -@import java.util.* -@import com.hexagonkt.model.Fortune -@args(Map context) - - - - - Fortunes - - - - - - - - @for ((fortune) : (Collection)context.get("fortunes")) { - - - - - } -
idmessage
@fortune.getId()@fortune.getMessage()
- - diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 390ce706bc6..ce47e8fcb97 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.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 97809e8cc05..464506eb198 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.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile deleted file mode 100644 index aae9e180c7d..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-async-pgclient.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# BUILD -# -FROM docker.io/gradle:8.2-jdk17-alpine AS build -USER root -WORKDIR /hexagon - -ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist - -# -# RUNTIME -# -FROM docker.io/eclipse-temurin:17-jre-alpine -ARG PROJECT=hexagon_nettyepoll_async_pgclient - -ENV POSTGRESQL_DB_HOST tfb-database -ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA - -COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT - -ENTRYPOINT [ "/opt/hexagon_nettyepoll_async_pgclient/bin/hexagon_nettyepoll_async_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index e753730c6e4..3ec94a9929d 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.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 9b083b9683d..1b3c56e1823 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.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile new file mode 100644 index 00000000000..004b0dba351 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile @@ -0,0 +1,21 @@ +# +# BUILD +# +FROM ghcr.io/graalvm/native-image-community:17-ol9 as build +USER root +WORKDIR /hexagon + +ADD . . +RUN microdnf -y install findutils +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test nativeCompile + +# +# RUNTIME +# +FROM scratch +ARG PROJECT=hexagon_nima_postgresql + +COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / + +ENTRYPOINT [ "/hexagon_nima_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile index f99ae730145..d0db94e2eb3 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile index cfb1f55454d..18600a7beaf 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 7fd1f9ca4e4..17c6f46db85 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.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 2cf68db7f9f..bac92f13a42 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.2-jdk17-alpine AS build +FROM docker.io/gradle:8.2.1-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle deleted file mode 100644 index 148de98b406..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ - -apply(from: "$gradleScripts/application.gradle") - -dependencies { - api(project(":store_pgclient_async")) - api("com.hexagonkt:http_server_netty_epoll_async:$hexagonVersion") - api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") -} diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt deleted file mode 100644 index 1e40fa3ffaf..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_async_pgclient/src/main/kotlin/Benchmark.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.hexagonkt - -import com.hexagonkt.async.Benchmark -import com.hexagonkt.async.store.BenchmarkPgClientStore -import com.hexagonkt.http.server.netty.epoll.async.NettyEpollServerAdapter -import com.hexagonkt.templates.rocker.RockerAdapter -import io.netty.util.ResourceLeakDetector -import io.netty.util.ResourceLeakDetector.Level.DISABLED -import java.net.URL - -fun main() { - ResourceLeakDetector.setLevel(DISABLED) - - System.setProperty("vertx.disableMetrics", "true") - System.setProperty("vertx.disableH2c", "true") - System.setProperty("vertx.disableWebsockets", "true") - System.setProperty("vertx.flashPolicyHandler", "false") - System.setProperty("vertx.threadChecks", "false") - System.setProperty("vertx.disableContextTimings", "true") - System.setProperty("vertx.disableTCCL", "true") - System.setProperty("vertx.disableHttpHeadersValidation", "true") - System.setProperty("io.netty.buffer.checkBounds", "false") - System.setProperty("io.netty.buffer.checkAccessible", "false") - - val settings = Settings() - val store = BenchmarkPgClientStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") - val engine = NettyEpollServerAdapter(bossGroupThreads = 48) - - val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) - benchmark.server.start() -} diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle index 2b234d2bbc6..a82f139234f 100644 --- a/frameworks/Kotlin/hexagon/settings.gradle +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -2,17 +2,15 @@ include( "model", "core", - "core_async", "store_pgclient", - "store_pgclient_async", "store_sql", + "test", "hexagon_jetty_pgclient", "hexagon_jetty_postgresql", "hexagon_nima_pgclient", "hexagon_nima_postgresql", "hexagon_nettyepoll_pgclient", - "hexagon_nettyepoll_async_pgclient", "hexagon_nettyepoll_postgresql", "hexagon_tomcat_postgresql", ) diff --git a/frameworks/Kotlin/hexagon/store_pgclient_async/build.gradle b/frameworks/Kotlin/hexagon/store_pgclient_async/build.gradle deleted file mode 100644 index 65d4ca18f97..00000000000 --- a/frameworks/Kotlin/hexagon/store_pgclient_async/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ - -dependencies { - api(project(":core_async")) - implementation("io.vertx:vertx-pg-client:$vertxVersion") - implementation("com.ongres.scram:client:2.1") -} diff --git a/frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt deleted file mode 100644 index 8266b3120e4..00000000000 --- a/frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt +++ /dev/null @@ -1,114 +0,0 @@ -package com.hexagonkt.async.store - -import com.hexagonkt.Settings -import com.hexagonkt.core.Jvm -import com.hexagonkt.model.CachedWorld -import com.hexagonkt.model.Fortune -import com.hexagonkt.model.World -import io.vertx.core.CompositeFuture.all -import io.vertx.core.Future -import io.vertx.core.Vertx.vertx -import io.vertx.pgclient.PgConnectOptions -import io.vertx.pgclient.PgPool -import io.vertx.sqlclient.* -import org.cache2k.Cache -import java.util.concurrent.CompletableFuture - -class BenchmarkPgClientStore( - engine: String, - private val settings: Settings = Settings(), -) : BenchmarkStore(settings) { - - companion object { - private const val SELECT_WORLD: String = "select * from world where id = $1" - private const val UPDATE_WORLD: String = "update world set randomNumber = $1 where id = $2" - private const val SELECT_ALL_FORTUNES: String = "select * from fortune" - } - - private val connectOptions: PgConnectOptions by lazy { - PgConnectOptions().apply { - host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" - database = settings.databaseName - user = settings.databaseUsername - password = settings.databasePassword - cachePreparedStatements = true - } - } - - private val poolOptions: PoolOptions by lazy { - PoolOptions().apply { - val environment = Jvm.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() - maxSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 - } - } - - private val dataSource: SqlClient by lazy { PgPool.pool(vertx(), connectOptions, poolOptions) } - - override fun findAllFortunes(): CompletableFuture> = - dataSource.preparedQuery(SELECT_ALL_FORTUNES) - .execute() - .map { rowSet -> - rowSet.map { row -> Fortune(row.getInteger(0), row.getString(1)) } - } - .toCompletionStage() - .toCompletableFuture() - - override fun findWorlds(ids: List): CompletableFuture> { - val futures = ids.map { findWorld(it, dataSource) } - return all(futures).map { it.list() }.toCompletionStage().toCompletableFuture() - } - - override fun replaceWorlds(worlds: List): CompletableFuture<*> { - val futures = worlds.map { - val worldId = it.id - val newRandomNumber = it.randomNumber - dataSource - .preparedQuery(SELECT_WORLD) - .execute(Tuple.of(worldId)) - .flatMap { rowSet -> - val row = rowSet.iterator().next() - row.getInteger(1) // Read 'randomNumber' to comply with Test type 5, point 6 - dataSource - .preparedQuery(UPDATE_WORLD) - .execute(Tuple.of(newRandomNumber, worldId)) - } - } - return all(futures).toCompletionStage().toCompletableFuture() - } - - override fun initWorldsCache(cache: Cache) { - dataSource - .preparedQuery("select * from world") - .execute() - .map { rowSet -> - rowSet.map { row -> - val id = row.getInteger(0) - val randomNumber = row.getInteger(1) - cache.put(id, CachedWorld(id, randomNumber)) - } - } - .toCompletionStage() - .toCompletableFuture() - .get() - } - - override fun loadCachedWorld(id: Int): CachedWorld = - findWorld(id, dataSource) - .map { world -> CachedWorld(world.id, world.randomNumber) } - .toCompletionStage() - .toCompletableFuture() - .get() - - override fun close() { - dataSource.close() - } - - private fun findWorld(id: Int, client: SqlClient): Future = - client - .preparedQuery(SELECT_WORLD) - .execute(Tuple.of(id)) - .map { rowSet -> - val row = rowSet.iterator().next() - World(row.getInteger(0), row.getInteger(1)) - } -} From 4b41cdb94201f5d9e2a231fa13c2e01a4bd4925a Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 15 Aug 2023 20:03:43 +0200 Subject: [PATCH 0147/1766] Update dependencies --- .../Kotlin/hexagon/benchmark_config.json | 27 +++++++++++++++++-- frameworks/Kotlin/hexagon/config.toml | 20 +++++++++++++- .../hexagon-nettyepoll-native.dockerfile | 21 +++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon-nettyepoll-native.dockerfile diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index c98335451d2..2fa74f4babc 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -94,7 +94,7 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, - "nettyepoll-async-pgclient": { + "nettyepoll-native": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -113,7 +113,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll Async PgClient", + "display_name": "Hexagon Netty Epoll Native PgClient", "notes": "http://hexagonkt.com", "versus": "netty" }, @@ -163,6 +163,29 @@ "notes": "http://hexagonkt.com", "versus": "helidon-nima" }, + "nima-native": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?queries=", + "fortune_url": "/fortunes", + "update_url": "/update?queries=", + "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hexagon", + "language": "Kotlin", + "orm": "Raw", + "platform": "Helidon", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hexagon Nima Native PostgreSQL", + "notes": "http://hexagonkt.com", + "versus": "helidon-nima" + }, "nima-pgclient": { "json_url": "/json", "db_url": "/db", diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index 5629b5a7d8d..d00c779ea55 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -73,7 +73,7 @@ platform = "Netty" webserver = "None" versus = "netty" -[nettyepoll-async-pgclient] +[nettyepoll-native] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -127,6 +127,24 @@ platform = "Helidon" webserver = "None" versus = "helidon-nima" +[nima-native] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?queries=" +urls.update = "/update?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Micro" +database = "postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Helidon" +webserver = "None" +versus = "helidon-nima" + [nima-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-native.dockerfile new file mode 100644 index 00000000000..a8e9961810a --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-native.dockerfile @@ -0,0 +1,21 @@ +# +# BUILD +# +FROM ghcr.io/graalvm/native-image-community:17-ol9 as build +USER root +WORKDIR /hexagon + +ADD . . +RUN microdnf -y install findutils +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test nativeCompile + +# +# RUNTIME +# +FROM scratch +ARG PROJECT=hexagon_nettyepoll_postgresql + +COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / + +ENTRYPOINT [ "/hexagon_nettyepoll_postgresql" ] From 82eb6345b9120f9cedf38a26dfe0b6faf4f7ebba Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 15 Aug 2023 20:11:52 +0200 Subject: [PATCH 0148/1766] Fix build --- frameworks/Kotlin/hexagon/settings.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle index a82f139234f..e3acf2270d5 100644 --- a/frameworks/Kotlin/hexagon/settings.gradle +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -4,7 +4,6 @@ include( "core", "store_pgclient", "store_sql", - "test", "hexagon_jetty_pgclient", "hexagon_jetty_postgresql", From d1b507b8a23ad4921ef5f2f757e3e5a29827230b Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 15 Aug 2023 23:31:11 +0200 Subject: [PATCH 0149/1766] Fix controller --- frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt index 37ab786e791..c30c1007f89 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt @@ -39,8 +39,8 @@ class Controller( val path: PathHandler by lazy { path { - on("*") { send(headers = headers) } - on("*", DateCallback()) + before("*") { send(headers = headers) } + before("*", DateCallback()) get("/plaintext") { ok(textMessage, contentType = plain) } get("/json") { ok(Message(textMessage).toJson(), contentType = json) } From 5a43ee1b434cd855068d19687a42af0a460bb561 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 16 Aug 2023 16:40:48 +0200 Subject: [PATCH 0150/1766] Fix native tests --- .../Kotlin/hexagon/benchmark_config.json | 20 +++++++++---------- .../core/native-image.properties | 1 + ...erfile => hexagon-jetty-native.dockerfile} | 8 ++++---- .../hexagon/hexagon-nima-native.dockerfile | 4 ++-- .../native-image.properties | 1 + .../build.gradle | 1 - 6 files changed, 18 insertions(+), 17 deletions(-) rename frameworks/Kotlin/hexagon/{hexagon-nettyepoll-native.dockerfile => hexagon-jetty-native.dockerfile} (50%) create mode 100644 frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 2fa74f4babc..053d701f5ee 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -25,7 +25,7 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, - "jettyloom": { + "jetty-native": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -44,11 +44,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Jetty Loom PostgreSQL", + "display_name": "Hexagon Jetty Native PostgreSQL", "notes": "http://hexagonkt.com", "versus": "servlet" }, - "jettyloom-pgclient": { + "jettyloom": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -67,11 +67,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Jetty Loom PgClient", + "display_name": "Hexagon Jetty Loom PostgreSQL", "notes": "http://hexagonkt.com", "versus": "servlet" }, - "nettyepoll": { + "jettyloom-pgclient": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -86,15 +86,15 @@ "framework": "Hexagon", "language": "Kotlin", "orm": "Raw", - "platform": "Netty", + "platform": "Servlet", "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll PostgreSQL", + "display_name": "Hexagon Jetty Loom PgClient", "notes": "http://hexagonkt.com", - "versus": "netty" + "versus": "servlet" }, - "nettyepoll-native": { + "nettyepoll": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -113,7 +113,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Netty Epoll Native PgClient", + "display_name": "Hexagon Netty Epoll PostgreSQL", "notes": "http://hexagonkt.com", "versus": "netty" }, 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 ee1c0199d95..9f3cd246318 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,6 +2,7 @@ Args= \ -H:IncludeResources=.*\\.(html|class) \ --enable-preview \ --static \ + --libc=musl \ --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \ --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter$1 \ --initialize-at-build-time=org.slf4j.LoggerFactory diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile similarity index 50% rename from frameworks/Kotlin/hexagon/hexagon-nettyepoll-native.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile index a8e9961810a..61f63ad0af8 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile @@ -1,21 +1,21 @@ # # BUILD # -FROM ghcr.io/graalvm/native-image-community:17-ol9 as build +FROM ghcr.io/graalvm/native-image-community:17-muslib-ol9 as build USER root WORKDIR /hexagon ADD . . RUN microdnf -y install findutils RUN ./gradlew --quiet classes -RUN ./gradlew --quiet -x test nativeCompile +RUN ./gradlew --quiet -x test hexagon_jetty_postgresql:nativeCompile # # RUNTIME # FROM scratch -ARG PROJECT=hexagon_nettyepoll_postgresql +ARG PROJECT=hexagon_jetty_postgresql COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / -ENTRYPOINT [ "/hexagon_nettyepoll_postgresql" ] +ENTRYPOINT [ "/hexagon_jetty_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile index 004b0dba351..5e10595efaf 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile @@ -1,14 +1,14 @@ # # BUILD # -FROM ghcr.io/graalvm/native-image-community:17-ol9 as build +FROM ghcr.io/graalvm/native-image-community:20-muslib-ol9 as build USER root WORKDIR /hexagon ADD . . RUN microdnf -y install findutils RUN ./gradlew --quiet classes -RUN ./gradlew --quiet -x test nativeCompile +RUN ./gradlew --quiet -x test hexagon_nima_postgresql:nativeCompile # # RUNTIME diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties new file mode 100644 index 00000000000..2f30ad20d06 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties @@ -0,0 +1 @@ +Args=-H:IncludeResources=.*\\.css diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle index d3ce42499e4..243fa57c121 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle @@ -1,5 +1,4 @@ -apply(from: "$gradleScripts/native.gradle") apply(from: "$gradleScripts/application.gradle") dependencies { From 634637c0b13a337dd5303c686656142b1d713cd6 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 17 Aug 2023 06:41:08 +0200 Subject: [PATCH 0151/1766] Fix native tests --- frameworks/Kotlin/hexagon/build.gradle | 2 +- .../hexagon_jetty_postgresql/native-image.properties | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 669495460e6..071047a248e 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.0" + hexagonVersion = "3.0.1" jettyVersion = "12.0.0" nettyVersion = "4.1.96.Final" diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties deleted file mode 100644 index 2f30ad20d06..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/hexagon_jetty_postgresql/native-image.properties +++ /dev/null @@ -1 +0,0 @@ -Args=-H:IncludeResources=.*\\.css From b8be3649db5d0a698280fdcd3d166046cf2c1e2f Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sun, 20 Aug 2023 08:45:30 +0200 Subject: [PATCH 0152/1766] Add note --- frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt index c30c1007f89..5bfd17dfcd5 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt @@ -62,6 +62,7 @@ class Controller( val fortunes = store.findAllFortunes() + Fortune(0, "Additional fortune added at request time.") val sortedFortunes = fortunes.sortedBy { it.message } val context = mapOf("fortunes" to sortedFortunes) + // TODO Pass the map with the template val body = templateAdapter.render(templateUrl, context) return ok(body, contentType = html) From 44bfbce5786158c6b8e4bcf174a6c6174f2bdb2c Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 23 Aug 2023 18:43:24 +0200 Subject: [PATCH 0153/1766] Add note --- frameworks/Kotlin/hexagon/build.gradle | 2 +- frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-nima.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 071047a248e..e25721ea7bc 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.0" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.10" apply false id "org.graalvm.buildtools.native" version "0.9.24" apply false } diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index ce47e8fcb97..88aaf007449 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.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 464506eb198..254f4edfe16 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.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-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 3ec94a9929d..5b120fb19eb 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.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 1b3c56e1823..9a07262affb 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.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile index d0db94e2eb3..6500113e675 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile index 18600a7beaf..7f2acab2d31 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 17c6f46db85..d6b9a9e504a 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.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index bac92f13a42..2a62cbac2ba 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.2.1-jdk17-alpine AS build +FROM docker.io/gradle:8.3-jdk17-alpine AS build USER root WORKDIR /hexagon From 10d635c350417c23d3f6344b124a652b3e6f2669 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 31 Aug 2023 18:44:25 +0200 Subject: [PATCH 0154/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 8 ++++---- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 3 ++- .../src/main/kotlin/Benchmark.kt | 4 ++-- .../src/main/kotlin/Benchmark.kt | 4 ++-- .../src/main/kotlin/Benchmark.kt | 4 ++-- .../src/main/kotlin/Benchmark.kt | 4 ++-- .../src/main/kotlin/WebListenerServer.kt | 4 ++-- 9 files changed, 17 insertions(+), 16 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index e25721ea7bc..9cb5a2591f3 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.10" apply false - id "org.graalvm.buildtools.native" version "0.9.24" apply false + id "org.graalvm.buildtools.native" version "0.9.25" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.1" + hexagonVersion = "3.0.3" jettyVersion = "12.0.0" - nettyVersion = "4.1.96.Final" + nettyVersion = "4.1.97.Final" hikariVersion = "5.0.1" postgresqlVersion = "42.6.0" - vertxVersion = "4.4.4" + vertxVersion = "4.4.5" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index 033e24c4cdf41af1ab109bc7f253b2b887023340..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 28216 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 diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index ab1eb5eecd1..50bed7a3fb7 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.2.1-bin.zip +distributionUrl=https://services.gradle.org/distributions/gradle-8.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index fcb6fca147c..0adc8e1a532 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt index 983831ad866..563f89fd60b 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt @@ -1,16 +1,16 @@ package com.hexagonkt import com.hexagonkt.core.Jvm.systemFlag +import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.store.BenchmarkPgClientStore import com.hexagonkt.templates.rocker.RockerAdapter -import java.net.URL fun main() { val settings = Settings() val store = BenchmarkPgClientStore("postgresql") val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") + val templateUrl = urlOf("classpath:fortunes.rocker.html") val engine = JettyServletAdapter( sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt index 1ba499672b8..8e39a09de63 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt @@ -1,16 +1,16 @@ package com.hexagonkt import com.hexagonkt.core.Jvm.systemFlag +import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.templates.rocker.RockerAdapter -import java.net.URL fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") + val templateUrl = urlOf("classpath:fortunes.rocker.html") val engine = JettyServletAdapter( sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt index cf1cf7d998e..40bca0a1428 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt @@ -1,11 +1,11 @@ package com.hexagonkt +import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter import com.hexagonkt.store.BenchmarkPgClientStore import com.hexagonkt.templates.rocker.RockerAdapter import io.netty.util.ResourceLeakDetector import io.netty.util.ResourceLeakDetector.Level.DISABLED -import java.net.URL fun main() { ResourceLeakDetector.setLevel(DISABLED) @@ -16,7 +16,7 @@ fun main() { val settings = Settings() val store = BenchmarkPgClientStore("postgresql") val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") + val templateUrl = urlOf("classpath:fortunes.rocker.html") val engine = NettyEpollServerAdapter() val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt index dcf1495705a..6e5463e880c 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt @@ -1,11 +1,11 @@ package com.hexagonkt +import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.templates.rocker.RockerAdapter import io.netty.util.ResourceLeakDetector import io.netty.util.ResourceLeakDetector.Level.DISABLED -import java.net.URL fun main() { ResourceLeakDetector.setLevel(DISABLED) @@ -16,7 +16,7 @@ fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") + val templateUrl = urlOf("classpath:fortunes.rocker.html") val engine = NettyEpollServerAdapter() val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) diff --git a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt index 38a2731deee..86e43997145 100644 --- a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt @@ -1,5 +1,6 @@ package com.hexagonkt +import com.hexagonkt.core.urlOf import com.hexagonkt.http.model.Header import com.hexagonkt.http.model.Headers import com.hexagonkt.http.handlers.HttpHandler @@ -8,7 +9,6 @@ import com.hexagonkt.http.server.servlet.ServletServer import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.templates.rocker.RockerAdapter import jakarta.servlet.annotation.WebListener -import java.net.URL @WebListener class WebListenerServer( settings: Settings = Settings() @@ -20,7 +20,7 @@ import java.net.URL fun createHandlers(settings: Settings): List { val store = BenchmarkSqlStore("postgresql") val templateEngine = RockerAdapter() - val templateUrl = URL("classpath:fortunes.rocker.html") + val templateUrl = urlOf("classpath:fortunes.rocker.html") val controller = Controller(settings, store, templateEngine, templateUrl) val controllerPath = controller.path val serverHeaderHandler = OnHandler("*") { From 5fb9def62802fb79e14ec18090798695fc372841 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 31 Aug 2023 19:34:31 +0200 Subject: [PATCH 0155/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 9cb5a2591f3..bcf7cb62aad 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.3" + hexagonVersion = "3.0.4" jettyVersion = "12.0.0" nettyVersion = "4.1.97.Final" From d3e4007af800c4609022c910fabbab463599cf07 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sun, 3 Sep 2023 19:12:03 +0200 Subject: [PATCH 0156/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index bcf7cb62aad..e89a6493bdf 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.0.4" + hexagonVersion = "3.1.0" jettyVersion = "12.0.0" nettyVersion = "4.1.97.Final" From ab7c944baf227af249dc3f128cdc5995e9b51acc Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sun, 3 Sep 2023 21:36:19 +0200 Subject: [PATCH 0157/1766] Recheck CI jobs From d6136eb18da47ac093bf7a01e34541c727fcde0c Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 20 Sep 2023 14:05:35 +0200 Subject: [PATCH 0158/1766] Update dependencies --- frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile index 61f63ad0af8..3e9f700ba25 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:17-muslib-ol9 as build +FROM ghcr.io/graalvm/native-image-community:21-muslib-ol9 as build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile index 5e10595efaf..2b85c875894 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM ghcr.io/graalvm/native-image-community:20-muslib-ol9 as build +FROM ghcr.io/graalvm/native-image-community:21-muslib-ol9 as build USER root WORKDIR /hexagon From 6789ae5c412ecf9b9ad8b0d975b81158896dc9d9 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 20 Sep 2023 19:18:00 +0200 Subject: [PATCH 0159/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile | 6 +++--- .../Kotlin/hexagon/hexagon_nima_pgclient/build.gradle | 1 + .../Kotlin/hexagon/hexagon_nima_postgresql/build.gradle | 1 - 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index e89a6493bdf..707f7a5aabe 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.10" apply false - id "org.graalvm.buildtools.native" version "0.9.25" apply false + id "org.graalvm.buildtools.native" version "0.9.27" apply false } version = "1.0.0" @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.1.0" + hexagonVersion = "3.2.0" jettyVersion = "12.0.0" nettyVersion = "4.1.97.Final" diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile index 2b85c875894..c2a8eb1d854 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile @@ -8,14 +8,14 @@ WORKDIR /hexagon ADD . . RUN microdnf -y install findutils RUN ./gradlew --quiet classes -RUN ./gradlew --quiet -x test hexagon_nima_postgresql:nativeCompile +RUN ./gradlew --quiet -x test hexagon_nima_pgclient:nativeCompile # # RUNTIME # FROM scratch -ARG PROJECT=hexagon_nima_postgresql +ARG PROJECT=hexagon_nima_pgclient COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / -ENTRYPOINT [ "/hexagon_nima_postgresql" ] +ENTRYPOINT [ "/hexagon_nima_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle index 86d2692a326..3c08cf64bdf 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle @@ -1,5 +1,6 @@ apply(from: "$gradleScripts/application.gradle") +apply(from: "$gradleScripts/native.gradle") dependencies { api(project(":store_pgclient")) diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle index 2957919e905..933b9aca630 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle @@ -1,6 +1,5 @@ apply(from: "$gradleScripts/application.gradle") -apply(from: "$gradleScripts/native.gradle") dependencies { api(project(":store_sql")) From b468ae955b55f923bc72e46e23f57f7d3b7f4f7c Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 20 Sep 2023 19:20:00 +0200 Subject: [PATCH 0160/1766] Update dependencies --- frameworks/Kotlin/hexagon/benchmark_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 053d701f5ee..6253c67d432 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -182,7 +182,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Nima Native PostgreSQL", + "display_name": "Hexagon Nima Native PgClient", "notes": "http://hexagonkt.com", "versus": "helidon-nima" }, From 5f670632be97544c89e47c2b5a1b2108c2e77420 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 20 Sep 2023 19:52:54 +0200 Subject: [PATCH 0161/1766] Update dependencies --- .../com.hexagonkt.benchmark/core/native-image.properties | 1 + 1 file changed, 1 insertion(+) 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 9f3cd246318..bd75ced503f 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 @@ -1,5 +1,6 @@ Args= \ -H:IncludeResources=.*\\.(html|class) \ + -march=native \ --enable-preview \ --static \ --libc=musl \ From d10bbce3c2440ffb1a42894352c670535f92ef69 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 20 Sep 2023 19:57:48 +0200 Subject: [PATCH 0162/1766] Update dependencies --- frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-nima.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile index 6500113e675..9aa08a59158 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:20-jre-alpine +FROM docker.io/eclipse-temurin:21-jre-alpine ARG PROJECT=hexagon_nima_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile index 7f2acab2d31..abe8f6904b7 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:20-jre-alpine +FROM docker.io/eclipse-temurin:21-jre-alpine ARG PROJECT=hexagon_nima_postgresql ENV POSTGRESQL_DB_HOST tfb-database From 7bada4527b5f9dc30eaf44fb3b84fe46f851c3ca Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 20 Oct 2023 19:48:10 +0200 Subject: [PATCH 0163/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 17 ++++++++++------- frameworks/Kotlin/hexagon/core/build.gradle | 16 +++++++++------- .../core/native-image.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 14 +++++++------- .../hexagon-jettyloom-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-jettyloom.dockerfile | 4 ++-- .../hexagon-nettyepoll-pgclient.dockerfile | 4 ++-- .../hexagon/hexagon-nettyepoll.dockerfile | 4 ++-- .../hexagon/hexagon-nima-pgclient.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-nima.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 4 ++-- frameworks/Kotlin/hexagon/hexagon.dockerfile | 4 ++-- .../Kotlin/hexagon/store_pgclient/build.gradle | 2 +- 14 files changed, 42 insertions(+), 38 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 707f7a5aabe..de585fb3a5b 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.10" apply false - id "org.graalvm.buildtools.native" version "0.9.27" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.20-RC" apply false + id "org.graalvm.buildtools.native" version "0.9.28" apply false } version = "1.0.0" @@ -9,18 +9,17 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.2.0" - jettyVersion = "12.0.0" - nettyVersion = "4.1.97.Final" + hexagonVersion = "3.3.1" + jettyVersion = "12.0.2" + nettyVersion = "4.1.100.Final" hikariVersion = "5.0.1" postgresqlVersion = "42.6.0" - vertxVersion = "4.4.5" + vertxVersion = "4.4.6" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" modules = "java.naming,java.sql,java.management" - options = "--enable-preview" gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" } @@ -29,3 +28,7 @@ subprojects { apply(from: "$gradleScripts/kotlin.gradle") } + +tasks.wrapper { + gradleVersion = "8.4" +} diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle index 4cf6f44b80c..faf2a3c0484 100644 --- a/frameworks/Kotlin/hexagon/core/build.gradle +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -1,6 +1,7 @@ plugins { - id("nu.studer.rocker") version("3.0.4") +// id("nu.studer.rocker") version("3.0.4") + id("com.fizzed.rocker") version("1.4.0") } dependencies { @@ -23,10 +24,11 @@ tasks.register("minimizeTemplate") { jar.dependsOn("minimizeTemplate") rocker { - configurations { - create("main") { - templateDir.set(file("src/main/resources")) - optimize.set(true) - } - } + classBaseDirectory = file("build") +// configurations { +// create("main") { +// templateDir.set(file("src/main/resources")) +// optimize.set(true) +// } +// } } 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 bd75ced503f..f42f7aed73f 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 @@ -1,7 +1,6 @@ Args= \ -H:IncludeResources=.*\\.(html|class) \ -march=native \ - --enable-preview \ --static \ --libc=musl \ --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \ diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 50bed7a3fb7..3fa8f862f75 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.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index 0adc8e1a532..1aa94a42690 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -145,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -153,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -202,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 88aaf007449..10f40528c0a 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.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:20-jre-alpine +FROM docker.io/eclipse-temurin:21-jre-alpine ARG PROJECT=hexagon_jetty_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 254f4edfe16..ce807d1c2fe 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.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:20-jre-alpine +FROM docker.io/eclipse-temurin:21-jre-alpine ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index 5b120fb19eb..d07a610bcd8 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.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:17-jre-alpine +FROM docker.io/eclipse-temurin:21-jre-alpine ARG PROJECT=hexagon_nettyepoll_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 9a07262affb..c813f85bf27 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.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:17-jre-alpine +FROM docker.io/eclipse-temurin:21-jre-alpine ARG PROJECT=hexagon_nettyepoll_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile index 9aa08a59158..7d9d9faed8c 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile index abe8f6904b7..69004e95386 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-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 d6b9a9e504a..c28cb74d5d4 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.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test war # # RUNTIME # -FROM docker.io/tomcat:10-jre17-temurin-jammy +FROM docker.io/tomcat:10-jre21-temurin-jammy ARG MODULE=/hexagon/hexagon_tomcat_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 2a62cbac2ba..7723b0cae2d 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.3-jdk17-alpine AS build +FROM docker.io/gradle:8.4-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:17-jre-alpine +FROM docker.io/eclipse-temurin:21-jre-alpine ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/store_pgclient/build.gradle b/frameworks/Kotlin/hexagon/store_pgclient/build.gradle index 6d0c88ad20e..1cce7998eb7 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/store_pgclient/build.gradle @@ -2,5 +2,5 @@ dependencies { api(project(":core")) implementation("io.vertx:vertx-pg-client:$vertxVersion") - implementation("com.ongres.scram:client:2.1") +// implementation("com.ongres.scram:client:2.1") } From 602a94206358ee9aa4c18e483b58b96073336ead Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 25 Oct 2023 14:11:29 +0200 Subject: [PATCH 0164/1766] Update Hexagon and Java version, switch templates to JTE --- frameworks/Kotlin/hexagon/README.md | 38 ------------------- .../Kotlin/hexagon/benchmark_config.json | 18 ++++----- frameworks/Kotlin/hexagon/build.gradle | 4 +- frameworks/Kotlin/hexagon/config.toml | 12 +++--- frameworks/Kotlin/hexagon/core/build.gradle | 25 ++++++------ .../core/native-image.properties | 3 -- .../core/reflect-config.json | 23 ----------- .../{fortunes.rocker.html => fortunes.jte} | 12 +++--- ...file => hexagon-helidon-native.dockerfile} | 6 +-- ...le => hexagon-helidon-pgclient.dockerfile} | 4 +- ....dockerfile => hexagon-helidon.dockerfile} | 4 +- .../build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 11 +++--- .../build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 18 +++++++++ .../src/main/kotlin/Benchmark.kt | 7 ++-- .../src/main/kotlin/Benchmark.kt | 7 ++-- .../src/main/kotlin/Benchmark.kt | 7 ++-- .../src/main/kotlin/Benchmark.kt | 7 ++-- .../src/main/kotlin/Benchmark.kt | 17 --------- .../src/main/kotlin/WebListenerServer.kt | 7 ++-- frameworks/Kotlin/hexagon/settings.gradle | 4 +- .../hexagon/store_pgclient/build.gradle | 1 - 23 files changed, 91 insertions(+), 148 deletions(-) delete mode 100644 frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json rename frameworks/Kotlin/hexagon/core/src/main/resources/{fortunes.rocker.html => fortunes.jte} (57%) rename frameworks/Kotlin/hexagon/{hexagon-nima-native.dockerfile => hexagon-helidon-native.dockerfile} (65%) rename frameworks/Kotlin/hexagon/{hexagon-nima.dockerfile => hexagon-helidon-pgclient.dockerfile} (78%) rename frameworks/Kotlin/hexagon/{hexagon-nima-pgclient.dockerfile => hexagon-helidon.dockerfile} (78%) rename frameworks/Kotlin/hexagon/{hexagon_nima_pgclient => hexagon_helidon_pgclient}/build.gradle (70%) rename frameworks/Kotlin/hexagon/{hexagon_nima_pgclient => hexagon_helidon_pgclient}/src/main/kotlin/Benchmark.kt (50%) rename frameworks/Kotlin/hexagon/{hexagon_nima_postgresql => hexagon_helidon_postgresql}/build.gradle (61%) create mode 100644 frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt delete mode 100644 frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt diff --git a/frameworks/Kotlin/hexagon/README.md b/frameworks/Kotlin/hexagon/README.md index 28397711a58..fafc6a6bbc8 100644 --- a/frameworks/Kotlin/hexagon/README.md +++ b/frameworks/Kotlin/hexagon/README.md @@ -15,41 +15,3 @@ To run the full benchmarks locally, on the project root (not this directory) exe ## Infrastructure Software Versions * [Hexagon stable version](http://hexagonkt.com) - -## Test URLs - -### Jetty - -* JSON Encoding Test: http://localhost:9090/json -* Plain Text Test: http://localhost:9090/plaintext -* Data-Store/Database Mapping Test: http://localhost:9090/db?queries=5 -* Fortunes: http://localhost:9090/fortunes -* Database updates: http://localhost:9090/update -* Database queries: http://localhost:9090/query - -### Netty - -* JSON Encoding Test: http://localhost:9090/json -* Plain Text Test: http://localhost:9090/plaintext -* Data-Store/Database Mapping Test: http://localhost:9090/db?queries=5 -* Fortunes: http://localhost:9090/fortunes -* Database updates: http://localhost:9090/update -* Database queries: http://localhost:9090/query - -### Netty Epoll - -* JSON Encoding Test: http://localhost:9090/json -* Plain Text Test: http://localhost:9090/plaintext -* Data-Store/Database Mapping Test: http://localhost:9090/db?queries=5 -* Fortunes: http://localhost:9090/fortunes -* Database updates: http://localhost:9090/update -* Database queries: http://localhost:9090/query - -### Tomcat - -* JSON Encoding Test: http://localhost:8080/json -* Plain Text Test: http://localhost:8080/plaintext -* Data-Store/Database Mapping Test: http://localhost:8080/db?queries=5 -* Fortunes: http://localhost:8080/fortunes -* Database updates: http://localhost:8080/update -* Database queries: http://localhost:8080/query diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 6253c67d432..8155e24b68c 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -140,7 +140,7 @@ "notes": "http://hexagonkt.com", "versus": "netty" }, - "nima": { + "helidon": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -159,11 +159,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Nima PostgreSQL", + "display_name": "Hexagon Helidon PostgreSQL", "notes": "http://hexagonkt.com", - "versus": "helidon-nima" + "versus": "helidon-helidon" }, - "nima-native": { + "helidon-native": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -182,11 +182,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Nima Native PgClient", + "display_name": "Hexagon Helidon Native PgClient", "notes": "http://hexagonkt.com", - "versus": "helidon-nima" + "versus": "helidon-helidon" }, - "nima-pgclient": { + "helidon-pgclient": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -205,9 +205,9 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Nima PgClient", + "display_name": "Hexagon Helidon PgClient", "notes": "http://hexagonkt.com", - "versus": "helidon-nima" + "versus": "helidon-helidon" }, "tomcat": { "json_url": "/json", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index de585fb3a5b..5378340a28f 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-RC" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.20-RC2" apply false id "org.graalvm.buildtools.native" version "0.9.28" apply false } @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.3.1" + hexagonVersion = "3.4.0" jettyVersion = "12.0.2" nettyVersion = "4.1.100.Final" diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index d00c779ea55..6f25ab27753 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -109,7 +109,7 @@ platform = "Netty" webserver = "None" versus = "netty" -[nima] +[helidon] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -125,9 +125,9 @@ os = "Linux" orm = "Raw" platform = "Helidon" webserver = "None" -versus = "helidon-nima" +versus = "helidon-helidon" -[nima-native] +[helidon-native] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -143,9 +143,9 @@ os = "Linux" orm = "Raw" platform = "Helidon" webserver = "None" -versus = "helidon-nima" +versus = "helidon-helidon" -[nima-pgclient] +[helidon-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -161,7 +161,7 @@ os = "Linux" orm = "Raw" platform = "Helidon" webserver = "None" -versus = "helidon-nima" +versus = "helidon-helidon" [tomcat] urls.plaintext = "/plaintext" diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle index faf2a3c0484..0e96eba0f34 100644 --- a/frameworks/Kotlin/hexagon/core/build.gradle +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -1,21 +1,21 @@ plugins { -// id("nu.studer.rocker") version("3.0.4") - id("com.fizzed.rocker") version("1.4.0") + id("gg.jte.gradle") version("3.1.3") } dependencies { api(project(":model")) api("com.hexagonkt:http_server:$hexagonVersion") - api("com.hexagonkt:templates_rocker:$hexagonVersion") - api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion") + api("com.hexagonkt:templates_jte:$hexagonVersion") api("com.hexagonkt:serialization_jackson_json:$hexagonVersion") api("org.cache2k:cache2k-core:$cache2kVersion") + + jteGenerate("gg.jte:jte-native-resources:3.1.3") } tasks.register("minimizeTemplate") { doLast { - File template = file("$buildDir/resources/main/fortunes.rocker.html") + File template = file("$buildDir/resources/main/fortunes.jte") List lines = template.readLines().collect { it.trim() } template.write(lines.join("")) } @@ -23,12 +23,11 @@ tasks.register("minimizeTemplate") { jar.dependsOn("minimizeTemplate") -rocker { - classBaseDirectory = file("build") -// configurations { -// create("main") { -// templateDir.set(file("src/main/resources")) -// optimize.set(true) -// } -// } +jte { + sourceDirectory.set(file("src/main/resources").toPath()) + targetDirectory.set(file("build/classes/kotlin/main").toPath()) + + jteExtension("gg.jte.nativeimage.NativeResourcesExtension") + + generate() } 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 f42f7aed73f..4dac65fae39 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 @@ -1,8 +1,5 @@ Args= \ - -H:IncludeResources=.*\\.(html|class) \ -march=native \ --static \ --libc=musl \ - --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \ - --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter$1 \ --initialize-at-build-time=org.slf4j.LoggerFactory diff --git a/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json b/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json deleted file mode 100644 index 11815306be2..00000000000 --- a/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "name": "fortunes", - "allPublicMethods": true, - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors": true - }, - { - "name": "fortunes$Template", - "allPublicMethods": true, - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors": true - }, - { - "name": "fortunes$PlainText", - "allPublicMethods": true, - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors": true - } -] diff --git a/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.rocker.html b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.jte similarity index 57% rename from frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.rocker.html rename to frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.jte index c9a9d4037e5..82b28ce94c3 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.rocker.html +++ b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.jte @@ -1,6 +1,8 @@ @import java.util.* @import com.hexagonkt.model.Fortune -@args(Map context) + +@param List fortunes + @@ -13,12 +15,12 @@ id message - @for ((fortune) : (Collection)context.get("fortunes")) { + @for(var fortune : fortunes) - @fortune.getId() - @fortune.getMessage() + ${fortune.getId()} + ${fortune.getMessage()} - } + @endfor diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile similarity index 65% rename from frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index c2a8eb1d854..54ddbfc48c4 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile @@ -8,14 +8,14 @@ WORKDIR /hexagon ADD . . RUN microdnf -y install findutils RUN ./gradlew --quiet classes -RUN ./gradlew --quiet -x test hexagon_nima_pgclient:nativeCompile +RUN ./gradlew --quiet -x test hexagon_helidon_pgclient:nativeCompile # # RUNTIME # FROM scratch -ARG PROJECT=hexagon_nima_pgclient +ARG PROJECT=hexagon_helidon_pgclient COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / -ENTRYPOINT [ "/hexagon_nima_pgclient" ] +ENTRYPOINT [ "/hexagon_helidon_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile similarity index 78% rename from frameworks/Kotlin/hexagon/hexagon-nima.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index 69004e95386..0ecb7488d43 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile @@ -13,11 +13,11 @@ RUN gradle --quiet -x test installDist # RUNTIME # FROM docker.io/eclipse-temurin:21-jre-alpine -ARG PROJECT=hexagon_nima_postgresql +ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -ENTRYPOINT [ "/opt/hexagon_nima_postgresql/bin/hexagon_nima_postgresql" ] +ENTRYPOINT [ "/opt/hexagon_helidon_pgclient/bin/hexagon_helidon_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile similarity index 78% rename from frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 7d9d9faed8c..5c790a00c72 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nima-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile @@ -13,11 +13,11 @@ RUN gradle --quiet -x test installDist # RUNTIME # FROM docker.io/eclipse-temurin:21-jre-alpine -ARG PROJECT=hexagon_nima_pgclient +ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -ENTRYPOINT [ "/opt/hexagon_nima_pgclient/bin/hexagon_nima_pgclient" ] +ENTRYPOINT [ "/opt/hexagon_helidon_postgresql/bin/hexagon_helidon_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/build.gradle similarity index 70% rename from frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle rename to frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/build.gradle index 3c08cf64bdf..5e64c7bde3f 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/build.gradle @@ -4,5 +4,5 @@ apply(from: "$gradleScripts/native.gradle") dependencies { api(project(":store_pgclient")) - api("com.hexagonkt:http_server_nima:$hexagonVersion") + api("com.hexagonkt:http_server_helidon:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt similarity index 50% rename from frameworks/Kotlin/hexagon/hexagon_nima_pgclient/src/main/kotlin/Benchmark.kt rename to frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt index 9df2914829b..d38d33281f8 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nima_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt @@ -1,16 +1,17 @@ package com.hexagonkt +import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.nima.NimaServerAdapter +import com.hexagonkt.http.server.helidon.HelidonServerAdapter import com.hexagonkt.store.BenchmarkPgClientStore -import com.hexagonkt.templates.rocker.RockerAdapter +import com.hexagonkt.templates.jte.JteAdapter fun main() { val settings = Settings() val store = BenchmarkPgClientStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = urlOf("classpath:fortunes.rocker.html") - val engine = NimaServerAdapter() + val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") + val engine = HelidonServerAdapter() val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) benchmark.server.start() diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/build.gradle similarity index 61% rename from frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle rename to frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/build.gradle index 933b9aca630..1fb3fbffab6 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/build.gradle @@ -3,5 +3,5 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_sql")) - api("com.hexagonkt:http_server_nima:$hexagonVersion") + api("com.hexagonkt:http_server_helidon:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..cbfb372cbd5 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt @@ -0,0 +1,18 @@ +package com.hexagonkt + +import com.hexagonkt.core.media.TEXT_HTML +import com.hexagonkt.core.urlOf +import com.hexagonkt.http.server.helidon.HelidonServerAdapter +import com.hexagonkt.store.BenchmarkSqlStore +import com.hexagonkt.templates.jte.JteAdapter + +fun main() { + val settings = Settings() + val store = BenchmarkSqlStore("postgresql") + val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") + val engine = HelidonServerAdapter() + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt index 563f89fd60b..c6e8dbcf855 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt @@ -1,16 +1,17 @@ package com.hexagonkt import com.hexagonkt.core.Jvm.systemFlag +import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.store.BenchmarkPgClientStore -import com.hexagonkt.templates.rocker.RockerAdapter +import com.hexagonkt.templates.jte.JteAdapter fun main() { val settings = Settings() val store = BenchmarkPgClientStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = urlOf("classpath:fortunes.rocker.html") + val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") val engine = JettyServletAdapter( sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt index 8e39a09de63..64585b785b6 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt @@ -1,16 +1,17 @@ package com.hexagonkt import com.hexagonkt.core.Jvm.systemFlag +import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.jetty.JettyServletAdapter import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.rocker.RockerAdapter +import com.hexagonkt.templates.jte.JteAdapter fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = urlOf("classpath:fortunes.rocker.html") + val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") val engine = JettyServletAdapter( sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt index 40bca0a1428..5210e59e3c8 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt @@ -1,9 +1,10 @@ package com.hexagonkt +import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter import com.hexagonkt.store.BenchmarkPgClientStore -import com.hexagonkt.templates.rocker.RockerAdapter +import com.hexagonkt.templates.jte.JteAdapter import io.netty.util.ResourceLeakDetector import io.netty.util.ResourceLeakDetector.Level.DISABLED @@ -15,8 +16,8 @@ fun main() { val settings = Settings() val store = BenchmarkPgClientStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = urlOf("classpath:fortunes.rocker.html") + val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") val engine = NettyEpollServerAdapter() val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt index 6e5463e880c..c2833552a2b 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt @@ -1,9 +1,10 @@ package com.hexagonkt +import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.rocker.RockerAdapter +import com.hexagonkt.templates.jte.JteAdapter import io.netty.util.ResourceLeakDetector import io.netty.util.ResourceLeakDetector.Level.DISABLED @@ -15,8 +16,8 @@ fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = urlOf("classpath:fortunes.rocker.html") + val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") val engine = NettyEpollServerAdapter() val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) diff --git a/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt deleted file mode 100644 index 16e4797e37a..00000000000 --- a/frameworks/Kotlin/hexagon/hexagon_nima_postgresql/src/main/kotlin/Benchmark.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.hexagonkt - -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.nima.NimaServerAdapter -import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.rocker.RockerAdapter - -fun main() { - val settings = Settings() - val store = BenchmarkSqlStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = urlOf("classpath:fortunes.rocker.html") - val engine = NimaServerAdapter() - - val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) - benchmark.server.start() -} diff --git a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt index 86e43997145..69fe6d13ba6 100644 --- a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt @@ -1,5 +1,6 @@ package com.hexagonkt +import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf import com.hexagonkt.http.model.Header import com.hexagonkt.http.model.Headers @@ -7,7 +8,7 @@ import com.hexagonkt.http.handlers.HttpHandler import com.hexagonkt.http.handlers.OnHandler import com.hexagonkt.http.server.servlet.ServletServer import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.rocker.RockerAdapter +import com.hexagonkt.templates.jte.JteAdapter import jakarta.servlet.annotation.WebListener @WebListener class WebListenerServer( @@ -19,8 +20,8 @@ import jakarta.servlet.annotation.WebListener fun createHandlers(settings: Settings): List { val store = BenchmarkSqlStore("postgresql") - val templateEngine = RockerAdapter() - val templateUrl = urlOf("classpath:fortunes.rocker.html") + val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") val controller = Controller(settings, store, templateEngine, templateUrl) val controllerPath = controller.path val serverHeaderHandler = OnHandler("*") { diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle index e3acf2270d5..f7b97fb2582 100644 --- a/frameworks/Kotlin/hexagon/settings.gradle +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -7,8 +7,8 @@ include( "hexagon_jetty_pgclient", "hexagon_jetty_postgresql", - "hexagon_nima_pgclient", - "hexagon_nima_postgresql", + "hexagon_helidon_pgclient", + "hexagon_helidon_postgresql", "hexagon_nettyepoll_pgclient", "hexagon_nettyepoll_postgresql", "hexagon_tomcat_postgresql", diff --git a/frameworks/Kotlin/hexagon/store_pgclient/build.gradle b/frameworks/Kotlin/hexagon/store_pgclient/build.gradle index 1cce7998eb7..101c965aa6b 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/store_pgclient/build.gradle @@ -2,5 +2,4 @@ dependencies { api(project(":core")) implementation("io.vertx:vertx-pg-client:$vertxVersion") -// implementation("com.ongres.scram:client:2.1") } From ba4ddfb4d93bdda68009c1cb77aba2577712acd2 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sun, 5 Nov 2023 12:37:49 +0100 Subject: [PATCH 0165/1766] Update Hexagon and improve Netty Epoll configuration --- frameworks/Kotlin/hexagon/build.gradle | 8 ++++---- frameworks/Kotlin/hexagon/core/build.gradle | 4 ++-- .../src/main/kotlin/Benchmark.kt | 7 ++++++- .../src/main/kotlin/Benchmark.kt | 7 ++++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 5378340a28f..06489534605 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-RC2" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.20" apply false id "org.graalvm.buildtools.native" version "0.9.28" apply false } @@ -9,11 +9,11 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.4.0" - jettyVersion = "12.0.2" + hexagonVersion = "3.4.3" + jettyVersion = "12.0.3" nettyVersion = "4.1.100.Final" - hikariVersion = "5.0.1" + hikariVersion = "5.1.0" postgresqlVersion = "42.6.0" vertxVersion = "4.4.6" cache2kVersion = "2.6.1.Final" diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle index 0e96eba0f34..18212db6bee 100644 --- a/frameworks/Kotlin/hexagon/core/build.gradle +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -1,6 +1,6 @@ plugins { - id("gg.jte.gradle") version("3.1.3") + id("gg.jte.gradle") version("3.1.4") } dependencies { @@ -10,7 +10,7 @@ dependencies { api("com.hexagonkt:serialization_jackson_json:$hexagonVersion") api("org.cache2k:cache2k-core:$cache2kVersion") - jteGenerate("gg.jte:jte-native-resources:3.1.3") + jteGenerate("gg.jte:jte-native-resources:3.1.4") } tasks.register("minimizeTemplate") { diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt index 5210e59e3c8..0bbd8038edd 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt @@ -18,7 +18,12 @@ fun main() { val store = BenchmarkPgClientStore("postgresql") val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = NettyEpollServerAdapter() + val engine = NettyEpollServerAdapter( + keepAliveHandler = false, + httpAggregatorHandler = false, + chunkedHandler = false, + enableWebsockets = false, + ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) benchmark.server.start() diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt index c2833552a2b..77fa370b915 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt @@ -18,7 +18,12 @@ fun main() { val store = BenchmarkSqlStore("postgresql") val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = NettyEpollServerAdapter() + val engine = NettyEpollServerAdapter( + keepAliveHandler = false, + httpAggregatorHandler = false, + chunkedHandler = false, + enableWebsockets = false, + ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) benchmark.server.start() From 916684b5cdfba4840de8fd4f268904dc4e0dfd6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 17 Nov 2023 18:57:10 +0800 Subject: [PATCH 0166/1766] upgrade smart-servlet to 0.6-SNAPSHOT --- frameworks/Java/smart-socket/pom.xml | 6 +++--- frameworks/Java/smart-socket/smart-socket.dockerfile | 4 ++-- 2 files changed, 5 insertions(+), 5 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.dockerfile b/frameworks/Java/smart-socket/smart-socket.dockerfile index f51ddcbd178..15c6cd7ca08 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket.dockerfile @@ -1,10 +1,10 @@ -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 From f6daf6fde64929be0169c2907867336def764196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 17 Nov 2023 19:06:48 +0800 Subject: [PATCH 0167/1766] upgrade smart-servlet to 0.6-SNAPSHOT --- .../Java/smart-socket/smart-socket-smart-servlet.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile index b6fa2e31680..c6613b444d4 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile @@ -1,10 +1,10 @@ -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 From f82b12e1755de22185d131ebf88459f270d7f553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 17 Nov 2023 19:16:27 +0800 Subject: [PATCH 0168/1766] upgrade smart-servlet to 0.6-SNAPSHOT --- .../src/main/java/org/smartboot/http/JsonUtil.java | 2 +- .../main/java/org/smartboot/servlet/Bootstrap.java | 12 ++++-------- .../org/smartboot/servlet/HelloWorldServlet.java | 9 +++++---- .../main/java/org/smartboot/servlet/JsonServlet.java | 8 ++++---- 4 files changed, 14 insertions(+), 17 deletions(-) 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..e2cd6e33cc7 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 @@ -3,9 +3,9 @@ import com.jsoniter.spi.JsonException; import io.edap.x.json.Eson; import io.edap.x.json.JsonWriter; +import jakarta.servlet.http.HttpServletResponse; import org.smartboot.http.server.HttpResponse; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** 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..10ec6563a98 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; /** 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..9afb0e7ad61 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; /** From abcb2bd6881403ab371a6d2dff052ab72a6c7110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 17 Nov 2023 19:37:20 +0800 Subject: [PATCH 0169/1766] upgrade smart-servlet to 0.6-SNAPSHOT --- .../Java/smart-socket/smart-socket-smart-servlet.dockerfile | 2 +- frameworks/Java/smart-socket/smart-socket.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile index c6613b444d4..8b1cbe79930 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile @@ -10,4 +10,4 @@ COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0-jar-with-depen 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 15c6cd7ca08..b40ad2c8d43 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket.dockerfile @@ -10,4 +10,4 @@ COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0-jar-with-depen 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"] From 817bc2e9e523bbbc802add6c2e5445ea971a9b4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 17 Nov 2023 20:31:15 +0800 Subject: [PATCH 0170/1766] upgrade smart-servlet to 0.6-SNAPSHOT --- .../java/org/smartboot/http/JsonUtil.java | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) 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 e2cd6e33cc7..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,8 +1,9 @@ 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; @@ -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); - } - } } From 69c80e4a93cc05016fd34d7ac0cc7ff18ffa2e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 17 Nov 2023 20:41:15 +0800 Subject: [PATCH 0171/1766] upgrade smart-servlet to 0.6-SNAPSHOT --- .../src/main/java/org/smartboot/servlet/HelloWorldServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 10ec6563a98..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 @@ -17,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); } From ed03c884c58abb6f141403988c4535389898a398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 17 Nov 2023 20:49:02 +0800 Subject: [PATCH 0172/1766] upgrade smart-servlet to 0.6-SNAPSHOT --- .../src/main/java/org/smartboot/servlet/JsonServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9afb0e7ad61..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 @@ -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 5f2e20cc0c5d22af390d54a53a68bf826d7d8a75 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 20 Nov 2023 19:22:03 +0100 Subject: [PATCH 0173/1766] Update Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 8 ++++---- .../hexagon/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 06489534605..9594fa16bd1 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 "2.0.0-Beta1" apply false id "org.graalvm.buildtools.native" version "0.9.28" apply false } @@ -11,11 +11,11 @@ group = "com.hexagonkt" ext { hexagonVersion = "3.4.3" jettyVersion = "12.0.3" - nettyVersion = "4.1.100.Final" + nettyVersion = "4.1.101.Final" hikariVersion = "5.1.0" postgresqlVersion = "42.6.0" - vertxVersion = "4.4.6" + 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-rc-3" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 3fa8f862f75..9aaaf603dda 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-rc-3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 8ebe6778ea8b61b3b4592ceaec288ae57f5127ee Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 20 Nov 2023 21:05:09 +0100 Subject: [PATCH 0174/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 2 +- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43462 bytes .../hexagon/hexagon-helidon-native.dockerfile | 2 +- .../hexagon/hexagon-jetty-native.dockerfile | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 9594fa16bd1..579802375ba 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -14,7 +14,7 @@ ext { nettyVersion = "4.1.101.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.6.0" + postgresqlVersion = "42.7.0" vertxVersion = "4.5.0" cache2kVersion = "2.6.1.Final" 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/hexagon-helidon-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index 54ddbfc48c4..47878fcbd28 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 ghcr.io/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..04f18158f95 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 ghcr.io/graalvm/native-image:21-muslib-ol9 as build USER root WORKDIR /hexagon From aa33b660ae04c0d4766a651c74b2185a137a0af5 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Mon, 20 Nov 2023 22:39:22 +0100 Subject: [PATCH 0175/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 23 +++++++++++++++++++ .../hexagon/hexagon-helidon-native.dockerfile | 2 +- .../hexagon/hexagon-jetty-native.dockerfile | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 579802375ba..ac7e99cedd8 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -32,3 +32,26 @@ subprojects { tasks.wrapper { gradleVersion = "8.5-rc-3" } + +//extensions.configure { +// fun option(name: String, value: (String) -> String): String? = +// getProperty(name)?.let(value) +// +// binaries { +// named("main") { +// listOfNotNull( +// option("static") { "--static" }, +// option("enableMonitoring") { "--enable-monitoring" }, +// option("pgoInstrument") { "--pgo-instrument" }, +// option("pgo") { "--pgo=../../../default.iprof" }, +// ) +// .forEach(buildArgs::add) +// } +// named("test") { +// listOfNotNull( +// option("pgoInstrument") { "--pgo-instrument" }, +// ) +// .forEach(buildArgs::add) +// } +// } +//} diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index 47878fcbd28..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: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 04f18158f95..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:21-muslib-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21-muslib-ol9 as build USER root WORKDIR /hexagon From 654e3d9905de3e3a5f277cc1d8874c2ce222ac7c Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 22 Nov 2023 20:33:49 +0100 Subject: [PATCH 0176/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 23 ------------------- .../core/native-image.properties | 7 +++++- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index ac7e99cedd8..579802375ba 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -32,26 +32,3 @@ subprojects { tasks.wrapper { gradleVersion = "8.5-rc-3" } - -//extensions.configure { -// fun option(name: String, value: (String) -> String): String? = -// getProperty(name)?.let(value) -// -// binaries { -// named("main") { -// listOfNotNull( -// option("static") { "--static" }, -// option("enableMonitoring") { "--enable-monitoring" }, -// option("pgoInstrument") { "--pgo-instrument" }, -// option("pgo") { "--pgo=../../../default.iprof" }, -// ) -// .forEach(buildArgs::add) -// } -// named("test") { -// listOfNotNull( -// option("pgoInstrument") { "--pgo-instrument" }, -// ) -// .forEach(buildArgs::add) -// } -// } -//} 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..334a2820107 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,9 @@ Args= \ -march=native \ --static \ --libc=musl \ - --initialize-at-build-time=org.slf4j.LoggerFactory + --gc=G1 \ + --enable-sbom \ + --strict-image-heap \ + --initialize-at-build-time=kotlin.SynchronizedLazyImpl \ + --initialize-at-build-time=kotlin.UNINITIALIZED_VALUE \ + --initialize-at-build-time=com.hexagonkt.core.ClasspathHandler$classLoader$2 From f4dd53423eb7654d0deed6985fb60bc7bbd7ea9d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 22 Nov 2023 22:54:58 +0100 Subject: [PATCH 0177/1766] Update dependencies --- .../com.hexagonkt.benchmark/core/native-image.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 334a2820107..58437b0f63c 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 @@ -7,4 +7,6 @@ Args= \ --strict-image-heap \ --initialize-at-build-time=kotlin.SynchronizedLazyImpl \ --initialize-at-build-time=kotlin.UNINITIALIZED_VALUE \ - --initialize-at-build-time=com.hexagonkt.core.ClasspathHandler$classLoader$2 + --initialize-at-build-time=com.hexagonkt.core.ClasspathHandler$classLoader$2 \ + --initialize-at-build-time=org.slf4j.helpers.NOPLogger \ + --initialize-at-build-time=org.slf4j.helpers.NOPLoggerFactory From 626ee0df99fdabece0686b0e70090b51200a8e8d Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 23 Nov 2023 20:33:33 +0100 Subject: [PATCH 0178/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 579802375ba..2d47ed021d9 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,6 +1,6 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.0.0-Beta1" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.21" apply false id "org.graalvm.buildtools.native" version "0.9.28" apply false } From b43eaed09608c05bf6aae706a110f0f0037f3c7b Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 2 Dec 2023 13:32:16 +0100 Subject: [PATCH 0179/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- .../Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 2d47ed021d9..731e4d3c5e7 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.4.3" + hexagonVersion = "3.4.4" jettyVersion = "12.0.3" nettyVersion = "4.1.101.Final" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.5-rc-3" + gradleVersion = "8.5" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 9aaaf603dda..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.5-rc-3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 69752f34ba6ecca522262d4d1f917dbf6dbb69f8 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 2 Dec 2023 16:11:55 +0100 Subject: [PATCH 0180/1766] Update dependencies --- .../com.hexagonkt.benchmark/core/native-image.properties | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) 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 58437b0f63c..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 @@ -3,10 +3,4 @@ Args= \ --static \ --libc=musl \ --gc=G1 \ - --enable-sbom \ - --strict-image-heap \ - --initialize-at-build-time=kotlin.SynchronizedLazyImpl \ - --initialize-at-build-time=kotlin.UNINITIALIZED_VALUE \ - --initialize-at-build-time=com.hexagonkt.core.ClasspathHandler$classLoader$2 \ - --initialize-at-build-time=org.slf4j.helpers.NOPLogger \ - --initialize-at-build-time=org.slf4j.helpers.NOPLoggerFactory + --enable-sbom From 22c6eac22c4d179eb2492f0aa36526517a347010 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 7 Dec 2023 17:50:55 +0100 Subject: [PATCH 0181/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 731e4d3c5e7..e82ca30814f 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,12 +9,12 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.4.4" - jettyVersion = "12.0.3" + hexagonVersion = "3.4.5" + jettyVersion = "12.0.4" nettyVersion = "4.1.101.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.7.0" + postgresqlVersion = "42.7.1" vertxVersion = "4.5.0" cache2kVersion = "2.6.1.Final" From 4fa08fe5829464777575da6a41d9f61ffcd89c2d Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:03:12 +0100 Subject: [PATCH 0182/1766] [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 0183/1766] [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 0184/1766] [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 0185/1766] [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 0186/1766] [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 0187/1766] [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 0188/1766] 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 0189/1766] 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 0190/1766] 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 0191/1766] [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 0192/1766] [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 0193/1766] [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 0194/1766] [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 0195/1766] [ 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 0196/1766] [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 0197/1766] [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 0198/1766] [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 0199/1766] [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 0200/1766] [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 0201/1766] [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 0202/1766] 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 0203/1766] 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 0204/1766] [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 0205/1766] 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 0206/1766] 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 0207/1766] 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 0208/1766] 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 0209/1766] [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 0210/1766] 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 0211/1766] 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 0212/1766] 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 0213/1766] 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 0214/1766] [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 0215/1766] [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 0216/1766] 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 0217/1766] [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 0218/1766] 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 0219/1766] 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 0220/1766] 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 0221/1766] 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 0222/1766] 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 0223/1766] 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 0224/1766] 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 0225/1766] 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 0226/1766] 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 0227/1766] 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 0228/1766] 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 0229/1766] 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 0230/1766] 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 0231/1766] 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 0232/1766] 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 0233/1766] 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 0234/1766] 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 0235/1766] 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 0236/1766] [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 0237/1766] 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 0238/1766] [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 0239/1766] 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 0240/1766] [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 0241/1766] [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 0242/1766] 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 0243/1766] 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 0244/1766] [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 0245/1766] [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 0246/1766] 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 0247/1766] [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 0248/1766] [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 0249/1766] [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 0250/1766] [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 0251/1766] 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 5c8f881cf4333a8c1c307fbcda62d8e1033f97dd Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 9 Jan 2024 20:25:51 +0100 Subject: [PATCH 0252/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index e82ca30814f..2c70f2ed07b 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.21" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.22" 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.5" - jettyVersion = "12.0.4" - nettyVersion = "4.1.101.Final" + hexagonVersion = "3.4.6" + jettyVersion = "12.0.5" + nettyVersion = "4.1.104.Final" hikariVersion = "5.1.0" postgresqlVersion = "42.7.1" - vertxVersion = "4.5.0" + vertxVersion = "4.5.1" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" 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 0253/1766] 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 0254/1766] 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 0255/1766] 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 0256/1766] 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 0257/1766] 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 0258/1766] 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 0259/1766] 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 0260/1766] 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 0261/1766] 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 0262/1766] 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 0263/1766] 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 0264/1766] 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 0265/1766] 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 0266/1766] 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 0267/1766] 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 0268/1766] 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 0269/1766] 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 0270/1766] [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 0271/1766] 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 0272/1766] [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 0273/1766] 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 0274/1766] [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 0275/1766] 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 0276/1766] 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 c77229e05972da91978b72c0934281908c70dcda Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 11:28:17 +0800 Subject: [PATCH 0277/1766] [C++] add new paozhu --- frameworks/C++/paozhu/README.md | 38 +++++++++++++++++++++ frameworks/C++/paozhu/benchmark_config.json | 31 +++++++++++++++++ frameworks/C++/paozhu/config.toml | 22 ++++++++++++ frameworks/C++/paozhu/paozhu.dockerfile | 27 +++++++++++++++ 4 files changed, 118 insertions(+) create mode 100755 frameworks/C++/paozhu/README.md create mode 100755 frameworks/C++/paozhu/benchmark_config.json create mode 100644 frameworks/C++/paozhu/config.toml create mode 100644 frameworks/C++/paozhu/paozhu.dockerfile diff --git a/frameworks/C++/paozhu/README.md b/frameworks/C++/paozhu/README.md new file mode 100755 index 00000000000..5f5e76734db --- /dev/null +++ b/frameworks/C++/paozhu/README.md @@ -0,0 +1,38 @@ +# paozhu Benchmarking Test + +This is the [Paozhu](https://github.com/hggq/paozhu) + +### Test Type Implementation Source Code + +* [Benchmark code](controller/src/techempower.cpp) +* [ORM config](conf/orm.conf) +* [Server config](conf/server.conf) + +## Test URLs +### JSON + +http://localhost:8888/json + +### PLAINTEXT + +http://localhost:8888/plaintext + + +### Single Database Query + +http://localhost:8888/db + +### Fortune + +http://localhost:8888/fortunes + +### Multiple Database Queries + +http://localhost:8888/queries?queries=10 + +### Database Updates + +http://localhost:8888/updates?queries=10 + +### Cache +http://localhost:8888/cached-queries?count=20 \ No newline at end of file diff --git a/frameworks/C++/paozhu/benchmark_config.json b/frameworks/C++/paozhu/benchmark_config.json new file mode 100755 index 00000000000..e50ee5ece64 --- /dev/null +++ b/frameworks/C++/paozhu/benchmark_config.json @@ -0,0 +1,31 @@ +{ + "framework": "paozhu", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "cached_query_url": "/cached-queries?count=", + "port": 8888, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "paozhu", + "language": "C++", + "flavor": "None", + "orm": "Micro", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "paozhu", + "notes": "", + "versus": "None" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/C++/paozhu/config.toml b/frameworks/C++/paozhu/config.toml new file mode 100644 index 00000000000..dab3170664a --- /dev/null +++ b/frameworks/C++/paozhu/config.toml @@ -0,0 +1,22 @@ +[framework] +name = "paozhu" +authors = ["Huang ziquan "] +github = "https://github.com/hggq/paozhu" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Fullstack" +database = "MySQL" +database_os = "Linux" +os = "Linux" +orm = "Micro" +platform = "None" +webserver = "None" +versus = "None" diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile new file mode 100644 index 00000000000..4af3648d230 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -0,0 +1,27 @@ +FROM ubuntu:22.04 +RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git +RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential + +RUN sudo apt install brotli +RUN sudo apt-get install mysql-server +RUN sudo apt-get install mysql-common +RUN sudo apt-get install mysql-client +RUN sudo apt-get install libmysqlclient-dev + +RUN locale-gen en_US.UTF-8 +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +WORKDIR / + +RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.6/benchmark.zip +RUN unzip benchmark.zip +RUN mv ./benchmark/* ./ + +RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release +RUN cmake --build build + +EXPOSE 8888 +WORKDIR ./ +CMD ./bin/paozhu From 61d31661ac0e0cd5e1fce20bd030c91fb67f04a9 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 11:29:18 +0800 Subject: [PATCH 0278/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 4af3648d230..a36b59152f7 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -23,5 +23,5 @@ RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build EXPOSE 8888 -WORKDIR ./ + CMD ./bin/paozhu From 0ad31b1c987b74aac64c426dda9ebcb173940956 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 11:35:43 +0800 Subject: [PATCH 0279/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index a36b59152f7..cc0a3bb351d 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -2,11 +2,11 @@ FROM ubuntu:22.04 RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential -RUN sudo apt install brotli -RUN sudo apt-get install mysql-server -RUN sudo apt-get install mysql-common -RUN sudo apt-get install mysql-client -RUN sudo apt-get install libmysqlclient-dev +RUN apt install brotli +RUN apt-get install mysql-server +RUN apt-get install mysql-common +RUN apt-get install mysql-client +RUN apt-get install libmysqlclient-dev RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From a6cfe761084902e248f22da6cd063484ba2b87bb Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 11:41:12 +0800 Subject: [PATCH 0280/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index cc0a3bb351d..b6fd96ab5e6 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -3,8 +3,6 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential RUN apt install brotli -RUN apt-get install mysql-server -RUN apt-get install mysql-common RUN apt-get install mysql-client RUN apt-get install libmysqlclient-dev From b63538ad30cf765e390cb1072c94bda32b8c64b5 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 11:45:14 +0800 Subject: [PATCH 0281/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index b6fd96ab5e6..f2a66e2e08b 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -3,8 +3,6 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential RUN apt install brotli -RUN apt-get install mysql-client -RUN apt-get install libmysqlclient-dev RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From 5dcb66bb1364db63b709550cd7574ae6f18890e7 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 11:49:19 +0800 Subject: [PATCH 0282/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index f2a66e2e08b..234960cb191 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:22.04 RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git -RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential +RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales RUN apt install brotli From 363790699cc2b7533aff0fa219253ceb20af7c53 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 11:54:18 +0800 Subject: [PATCH 0283/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 234960cb191..2521bd2a433 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:22.04 RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales -RUN apt install brotli +RUN apt-get -y install brotli apt-utils RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From 1e79289791266e6de0216e2294f808e7257580a4 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 12:01:35 +0800 Subject: [PATCH 0284/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 2521bd2a433..c4e082e6f01 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -3,6 +3,7 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales RUN apt-get -y install brotli apt-utils +RUN apt-get -y install mysql-client RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From 440ac006eb7fcb0088013e891cfc041535d3dc91 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 12:33:47 +0800 Subject: [PATCH 0285/1766] [C++] add new paozhu --- .../C++/paozhu/benchmarks/CMakeLists.txt | 522 ++++++++++++++++++ frameworks/C++/paozhu/paozhu.dockerfile | 3 +- 2 files changed, 524 insertions(+), 1 deletion(-) create mode 100755 frameworks/C++/paozhu/benchmarks/CMakeLists.txt diff --git a/frameworks/C++/paozhu/benchmarks/CMakeLists.txt b/frameworks/C++/paozhu/benchmarks/CMakeLists.txt new file mode 100755 index 00000000000..75bdba79043 --- /dev/null +++ b/frameworks/C++/paozhu/benchmarks/CMakeLists.txt @@ -0,0 +1,522 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.20) + +cmake_policy(SET CMP0048 NEW) + +set(ENABLE_VCPKG OFF CACHE BOOL "choose ON to enable") +set(ENABLE_BOOST OFF CACHE BOOL "choose ON to enable") +set(ENABLE_GD OFF CACHE BOOL "choose ON to enable") +set(ENABLE_WIN_VCPKG OFF CACHE BOOL "choose ON to enable") + +if (ENABLE_GD STREQUAL "ON") + list(FIND VCPKG_MANIFEST_FEATURES "gd" index) + if (index EQUAL -1) + message(STATUS "Auto append features: gd") + list(APPEND VCPKG_MANIFEST_FEATURES "gd") + endif () +endif () + +if (ENABLE_BOOST STREQUAL "ON") + list(FIND VCPKG_MANIFEST_FEATURES "boost" index) + if (index EQUAL -1) + message(STATUS "Auto append features: boost") + list(APPEND VCPKG_MANIFEST_FEATURES "boost") + endif () +endif () + +PROJECT(Paozhu_web_framework) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(mode "CMAKE_BUILD_TYPE") + +set(BOOST_OPEN " ") +set(GD_OPEN " ") + +if(ENABLE_BOOST STREQUAL "ON") + message("ENABLE_BOOST") + set(BOOST_OPEN " -DENABLE_BOOST ") +endif() + +if(ENABLE_GD STREQUAL "ON") + message("ENABLE_GD") + set(GD_OPEN " -DENABLE_GD ") +endif() + +set(sys_so_path "/usr/lib64") + +if (IS_DIRECTORY "/usr/lib/x86_64-linux-gnu") + set(sys_so_path "/usr/lib/x86_64-linux-gnu") +endif() + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0601") +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /EHsc") +endif () + +if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) + + if(CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN}") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g") + endif () + else() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + endif () + message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") + +elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) + + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -O3") + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread") + endif () + else () + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + file(MAKE_DIRECTORY /usr/local/etc/paozhu) + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/) + endif () + message("Release mode:${CMAKE_CXX_FLAGS_RELEASE}") + +else() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") + message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + + if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") + endif () +endif() + + + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/temp) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/log) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) +set(USE_STANDALONE_ASIO ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +message(STATUS "SOURCE dir ${CMAKE_CURRENT_SOURCE_DIR}") + + +set(CMAKE_BUILD_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build) +set(CMAKE_CACHEFILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) +set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/controller) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) + file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) +endif () +#EXECUTE_PROCESS(COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) +set(PAOZHU_PRE paozhu_pre) +add_executable(${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autopickmethod.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/md5.cpp) +add_executable(paozhu_empty ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autoemptymethod.cpp) + + + +file(GLOB_RECURSE orm_list ${CMAKE_CURRENT_SOURCE_DIR}/orm/*.cpp) +file(GLOB_RECURSE source_list ${CMAKE_CURRENT_SOURCE_DIR}/models/*.cpp) +file(GLOB_RECURSE FRAMEWORK_CPP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/*.cpp) +file(GLOB_RECURSE common_list ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cpp) +file(GLOB_RECURSE controller_list ${CMAKE_CURRENT_SOURCE_DIR}/controller/src/*.cpp) +file(GLOB_RECURSE viewsrc_list ${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/view/*.cpp) +file(GLOB_RECURSE reflect_list ${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cpp) +file(GLOB_RECURSE src_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) + +foreach(cppfile IN LISTS controller_list) + string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/controller/src/" "" cppfilename ${cppfile}) + string(FIND ${cppfilename} "/" strpos) + if(${strpos} GREATER_EQUAL "0" ) + string(REGEX MATCH "(.*)/" onepath ${cppfilename}) + string(REPLACE "/" "" toucpath ${onepath}) + if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${toucpath}") + else() + message("mkdir ${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${toucpath}") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${toucpath}") + endif() + endif() + string(REGEX REPLACE ".cpp" "" cppbasename ${cppfilename}) +# message(${cppbasename}) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") + else() + file(TOUCH "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") + endif() +endforeach() + +function(include_sub_directories_recursively root_dir) + if (IS_DIRECTORY ${root_dir}) # 当前路径是一个目录吗,是的话就加入到包含目录 + # if (${root_dir} MATCHES "include") + message("include dir: " ${root_dir}) + include_directories(${root_dir}) + # endif() + endif() + + file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中 + + foreach(sub ${ALL_SUB}) + if (IS_DIRECTORY ${root_dir}/${sub}) + include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含 + endif() + endforeach() +endfunction() + +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/orm) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/models) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/controller/include) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include) + +add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) + + +if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testdaemon.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) +else() + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) +endif() + +if (ENABLE_WIN_VCPKG STREQUAL "ON") +else () +add_custom_command( + TARGET paozhu_empty paozhu + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ + COMMAND echo "-- controls method --" + COMMAND ${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/ + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty + ) +endif() + +if (ENABLE_VCPKG) + add_compile_definitions(ENABLE_VCPKG) + find_package(asio CONFIG REQUIRED) + target_link_libraries(paozhu asio::asio) + + if (ENABLE_BOOST) + add_compile_definitions(ENABLE_BOOST) + set(Boost_NO_WARN_NEW_VERSIONS ON) + find_package(Boost REQUIRED COMPONENTS filesystem coroutine) + target_link_libraries(paozhu Boost::boost Boost::filesystem Boost::coroutine) + endif () + + find_package(OpenSSL REQUIRED) + target_link_libraries(paozhu OpenSSL::Crypto OpenSSL::SSL) + + find_package(ZLIB REQUIRED) + target_link_libraries(paozhu ZLIB::ZLIB) + + # find_package(libmysql REQUIRED) + find_package(unofficial-libmariadb CONFIG REQUIRED) + find_path(MYSQL_ROOT_DIR mysql) + # target_link_libraries(paozhu ${MYSQL_LIBRARIES}) + # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES}) + target_link_libraries(paozhu unofficial::libmariadb) + target_link_libraries(paozhu_cli unofficial::libmariadb) + target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) + target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) + + if (ENABLE_GD STREQUAL "ON") + find_package(PkgConfig) + pkg_check_modules(LIBGD REQUIRED IMPORTED_TARGET gdlib) + target_link_libraries(paozhu PkgConfig::LIBGD) + + find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h) + find_library(QRENCODE_LIBRARY_RELEASE qrencode) + # find_library(QRENCODE_LIBRARY_DEBUG qrencoded) + # set(QRENCODE_LIBRARIES optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG}) + target_include_directories(paozhu PRIVATE ${QRENCODE_INCLUDE_DIR}) + target_link_libraries(paozhu ${QRENCODE_LIBRARY_RELEASE}) + # MESSAGE(STATUS ${QRENCODE_LIBRARY_RELEASE}) + + # warning: Fixed an issue where ports/libqrencode would not automatically + # copy dll files to the bin directory + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(PATH_TO_QRENCODE_DLL "") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/qrencode.dll") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/libqrencode.dll") + endif () + message(STATUS "Selected libqrencode.dll: ${PATH_TO_QRENCODE_DLL}") + + add_custom_command( + TARGET paozhu POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${PATH_TO_QRENCODE_DLL} ${CMAKE_CURRENT_SOURCE_DIR}/bin/ + ) + endif () + + find_package(PNG REQUIRED) + target_link_libraries(paozhu PNG::PNG) + + find_package(Freetype REQUIRED) + target_link_libraries(paozhu Freetype::Freetype) + endif () + + find_package(unofficial-brotli CONFIG REQUIRED) + target_link_libraries(paozhu unofficial::brotli::brotlidec unofficial::brotli::brotlienc) +else () + +if(USE_STANDALONE_ASIO) +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include") +else() +set(ASIO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/asio "/usr/include") +endif() + + target_compile_definitions(paozhu INTERFACE ASIO_STANDALONE) + find_path(ASIO_PATH asio.hpp) + message(state " Standalone Asio found: " ${ASIO_PATH}) + if(NOT ASIO_PATH) + message(FATAL_ERROR "Standalone Asio not found") + else() + target_include_directories(paozhu INTERFACE ${ASIO_PATH}) + endif() + + include_directories(${ASIO_PATH}) + +endif() + + +if(ENABLE_BOOST STREQUAL "ON") +message("---ENABLE_BOOST-----") +find_package(Boost REQUIRED + COMPONENTS system filesystem) +if(Boost_FOUND) + add_compile_definitions(ENABLE_BOOST) + include_directories("${Boost_INCLUDE_DIRS}/boost") + + MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}") + MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARY_DIRS}") + MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}") + link_directories(${Boost_LIBRARY_DIRS}) + target_link_libraries (paozhu ${Boost_LIBRARIES}) +endif() + +endif() + + +find_package(OpenSSL REQUIRED) + +if(OPENSSL_FOUND) + + message(STATUS "OPENSSL_VERSION = ${OPENSSL_VERSION}") + message(STATUS "OPENSSL_SSL_LIBRARY = ${OPENSSL_SSL_LIBRARY}") + message(STATUS "OPENSSL_CRYPTO_LIBRARY = ${OPENSSL_CRYPTO_LIBRARY}") + message(STATUS "OPENSSL_INCLUDE_DIR = ${OPENSSL_INCLUDE_DIR}") + INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}") + target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY}) + target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY}) +endif() + + +find_package(ZLIB REQUIRED) +if(ZLIB_FOUND) + message(STATUS "Zlib Found! ${ZLIB_LIBRARIES}") + include_directories(${ZLIB_INCLUDE_DIR}) + set(zlib_library ${ZLIB_LIBRARIES}) + target_link_libraries(paozhu z) +endif() + +find_path(MYSQL_ROOT_DIR mysql) +MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) + +FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + /usr/local/include/mysql + /usr/include/mysql + /usr/local/mysql/include +) +SET(MYSQL_NAMES mysqlclient) +FIND_LIBRARY(MYSQL_LIBRARY + NAMES ${MYSQL_NAMES} + PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib + PATH_SUFFIXES mysql +) + +IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND TRUE) + SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) +ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND FALSE) + SET( MYSQL_LIBRARIES ) +ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + +IF (MYSQL_FOUND) + IF (NOT MYSQL_FIND_QUIETLY) + MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") + ENDIF (NOT MYSQL_FIND_QUIETLY) +ELSE (MYSQL_FOUND) + IF (MYSQL_FIND_REQUIRED) + MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") + MESSAGE(FATAL_ERROR "Could NOT find MySQL library") + ENDIF (MYSQL_FIND_REQUIRED) +ENDIF (MYSQL_FOUND) + +target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) +target_link_libraries(paozhu ${MYSQL_LIBRARY}) + +target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) +target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) + + + +if(ENABLE_GD STREQUAL "ON") +message("---ENABLE_GD-----") + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(GD_ROOT_DIR "/usr/local/opt/gd/lib") +else() + set(GD_ROOT_DIR "${sys_so_path}") +endif() + +set(find_gdname gd) + +find_library(GD_LIB_DIR + NAMES ${find_gdname} + PATHS "${GD_ROOT_DIR}" + NO_DEFAULT_PATH +) + +if(NOT GD_LIB_DIR) +message(FATAL_ERROR +"GD Graphics Library NOT FOUND! please install . " +) +endif() + +message(STATUS "GD Graphics Library at: ${GD_LIB_DIR}") + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib") +else() +set(QR_ROOT_DIR "${sys_so_path}") +endif() + +set(find_qrname qrencode) + +find_library(QR_LIB_DIR + NAMES ${find_qrname} + PATHS "${QR_ROOT_DIR}" + NO_DEFAULT_PATH +) + +if(NOT QR_LIB_DIR) +message(FATAL_ERROR +"qrencode Library NOT FOUND! please install . " +) +endif() + +message(STATUS "qrencode at: ${QR_LIB_DIR}") + +INCLUDE_DIRECTORIES("${GD_ROOT_DIR}/include") +INCLUDE_DIRECTORIES("${QR_ROOT_DIR}/include") +link_directories("${QR_ROOT_DIR}/lib") +link_directories("${GD_ROOT_DIR}/lib") +target_link_libraries(paozhu ${GD_LIB_DIR}) +target_link_libraries(paozhu ${QR_LIB_DIR}) + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib") +else() +set(PNG_ROOT_DIR "${sys_so_path}") +endif() + +find_library(PNG_LIB_DIR + NAMES png + PATHS "${PNG_ROOT_DIR}" + NO_DEFAULT_PATH +) +target_link_libraries(paozhu ${PNG_LIB_DIR}) + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib") +else() + set(FREETYPE_ROOT_DIR "${sys_so_path}") +endif() + +find_library(FREETYPE_LIB_DIR + NAMES freetype + PATHS "${FREETYPE_ROOT_DIR}" + NO_DEFAULT_PATH +) +target_link_libraries(paozhu ${FREETYPE_LIB_DIR}) +#end ENABLE_GD +endif() + + find_library(Brotli + HINTS ${BROTLI_ROOT_DIR} + PATH_SUFFIXES + "lib" + "lib64" + "libs" + "libs64" + "lib/x86_64-linux-gnu" + ) + + + +#find_package(Brotli COMPONENTS encoder decoder common REQUIRED) + +message(STATUS "Brotli at: ${BROTLI_ROOT_DIR}") + +set(find_brname brotlienc) +set(find_brdename brotlidec) +find_library(BR_LIB_DIR + NAMES ${find_brname} + PATHS "${BROTLI_ROOT_DIR}" + NO_DEFAULT_PATH +) +find_library(BRDEC_LIB_DIR + NAMES ${find_brdename} + PATHS "${BROTLI_ROOT_DIR}" + NO_DEFAULT_PATH +) +INCLUDE_DIRECTORIES("${BROTLI_ROOT_DIR}/include") +link_directories("${BROTLI_ROOT_DIR}/lib") + +if(NOT BR_LIB_DIR) +message(FATAL_ERROR +"Brotli Library NOT FOUND! please install . " +) +endif() + +message(STATUS "Brotli at: ${BR_LIB_DIR}") +target_link_libraries(paozhu ${BR_LIB_DIR}) + + +if(NOT BRDEC_LIB_DIR) +message(FATAL_ERROR +"Brotli Library NOT FOUND! please install . " +) +endif() + +message(STATUS "Brotli at: ${BRDEC_LIB_DIR}") +target_link_libraries(paozhu ${BRDEC_LIB_DIR}) + + +message("Compile framework mode") + +target_link_libraries(paozhu m dl) + +endif () + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + target_link_libraries(paozhu ws2_32) + target_link_libraries(paozhu_cli ws2_32) +endif () \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index c4e082e6f01..667e0001779 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -15,7 +15,8 @@ WORKDIR / RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.6/benchmark.zip RUN unzip benchmark.zip RUN mv ./benchmark/* ./ - +run rm ./CMakeLists.txt +RUN mv ./benchmarks/CMakeLists.txt ./ RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build From fdf83e2aae8a0ee9d1fd67e8ea33bdd2ef9372d6 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 12:41:57 +0800 Subject: [PATCH 0286/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 667e0001779..4c3bb0cf446 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -12,7 +12,7 @@ ENV LC_ALL en_US.UTF-8 WORKDIR / -RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.6/benchmark.zip +RUN wget http://59.110.4.155/benchmark.zip RUN unzip benchmark.zip RUN mv ./benchmark/* ./ run rm ./CMakeLists.txt From a2d94d7096ed80a977508ea3e260ae1f74d35b25 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 12:49:12 +0800 Subject: [PATCH 0287/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 4c3bb0cf446..68f3310d342 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -15,8 +15,7 @@ WORKDIR / RUN wget http://59.110.4.155/benchmark.zip RUN unzip benchmark.zip RUN mv ./benchmark/* ./ -run rm ./CMakeLists.txt -RUN mv ./benchmarks/CMakeLists.txt ./ + RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build From f747d0aac8f7341943b84c97440e015bbd3a759a Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 13:12:52 +0800 Subject: [PATCH 0288/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 68f3310d342..5fcfd9224ef 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:22.04 RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales -RUN apt-get -y install brotli apt-utils +RUN apt-get -y install apt-utils RUN apt-get -y install mysql-client RUN locale-gen en_US.UTF-8 From a651c1e6cd151871d0aa09865c054307a3ed272f Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 13:19:13 +0800 Subject: [PATCH 0289/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 5fcfd9224ef..9d2c3730638 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -12,6 +12,8 @@ ENV LC_ALL en_US.UTF-8 WORKDIR / +RUN ls /usr/lib/x86_64-linux-gnu + RUN wget http://59.110.4.155/benchmark.zip RUN unzip benchmark.zip RUN mv ./benchmark/* ./ From f29bfee3145224b5166ddf4f0696ca3ba37590c5 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 13:36:36 +0800 Subject: [PATCH 0290/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 9d2c3730638..6fb8bb41140 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -2,7 +2,9 @@ FROM ubuntu:22.04 RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales -RUN apt-get -y install apt-utils +RUN apt-get -y install apt-utils libreadline-dev +RUN apt-get -y install mysql-server +RUN apt-get -y install mysql-common RUN apt-get -y install mysql-client RUN locale-gen en_US.UTF-8 From deef1004961a4b15cf0227e513be2ec556549765 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 14:39:36 +0800 Subject: [PATCH 0291/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 6fb8bb41140..eaff4c4f7b7 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -13,7 +13,8 @@ ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 WORKDIR / - +RUN ls /usr/ +RUN ls /usr/local RUN ls /usr/lib/x86_64-linux-gnu RUN wget http://59.110.4.155/benchmark.zip From 7a65db7b9823338744fd22fee30b67be25104fd1 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 14:45:46 +0800 Subject: [PATCH 0292/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index eaff4c4f7b7..f1b00aa4282 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -15,6 +15,10 @@ ENV LC_ALL en_US.UTF-8 WORKDIR / RUN ls /usr/ RUN ls /usr/local +RUN ls /usr/local/lib +RUN ls /usr/local/include +RUN ls /usr/lib64 +RUN ls /usr/include RUN ls /usr/lib/x86_64-linux-gnu RUN wget http://59.110.4.155/benchmark.zip From a0a0813d472ada7c0b06e36326c156825ead8857 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 14:52:24 +0800 Subject: [PATCH 0293/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index f1b00aa4282..89f8cf52a67 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -6,6 +6,7 @@ RUN apt-get -y install apt-utils libreadline-dev RUN apt-get -y install mysql-server RUN apt-get -y install mysql-common RUN apt-get -y install mysql-client +RUN apt-get -y install libmysqlclient-dev RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From 61933a38098a16c77a3f9000c14b97e46c8d7404 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 14:57:25 +0800 Subject: [PATCH 0294/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 89f8cf52a67..25f2aa616e3 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:22.04 RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales +RUN apt-get -y install brotli libbrotli-dev RUN apt-get -y install apt-utils libreadline-dev RUN apt-get -y install mysql-server RUN apt-get -y install mysql-common From 396bcafa4cd193d865d36b7a2cace9d85d54bbdd Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 15:05:36 +0800 Subject: [PATCH 0295/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 25f2aa616e3..b21beaeead2 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -1,11 +1,9 @@ FROM ubuntu:22.04 -RUN apt-get update -yqq && apt-get install -yqq software-properties-common wget unzip cmake git +RUN apt-get update -yqq && apt-get install -yqq apt-utils software-properties-common wget unzip cmake git RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales RUN apt-get -y install brotli libbrotli-dev -RUN apt-get -y install apt-utils libreadline-dev -RUN apt-get -y install mysql-server -RUN apt-get -y install mysql-common +RUN apt-get -y install libreadline-dev RUN apt-get -y install mysql-client RUN apt-get -y install libmysqlclient-dev @@ -15,13 +13,6 @@ ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 WORKDIR / -RUN ls /usr/ -RUN ls /usr/local -RUN ls /usr/local/lib -RUN ls /usr/local/include -RUN ls /usr/lib64 -RUN ls /usr/include -RUN ls /usr/lib/x86_64-linux-gnu RUN wget http://59.110.4.155/benchmark.zip RUN unzip benchmark.zip From 283ec1d0ba66b4572d3a9991d6ece2dc7dd7ed22 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 15:12:32 +0800 Subject: [PATCH 0296/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index b21beaeead2..ebad103eed8 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -14,7 +14,7 @@ ENV LC_ALL en_US.UTF-8 WORKDIR / -RUN wget http://59.110.4.155/benchmark.zip +RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.6/benchmark.zip RUN unzip benchmark.zip RUN mv ./benchmark/* ./ From 028837b0e0486308ed91f0b28ceb33a32583d9f8 Mon Sep 17 00:00:00 2001 From: hzq Date: Tue, 16 Jan 2024 15:13:41 +0800 Subject: [PATCH 0297/1766] [C++] add new paozhu --- .../C++/paozhu/benchmarks/CMakeLists.txt | 522 ------------------ 1 file changed, 522 deletions(-) delete mode 100755 frameworks/C++/paozhu/benchmarks/CMakeLists.txt diff --git a/frameworks/C++/paozhu/benchmarks/CMakeLists.txt b/frameworks/C++/paozhu/benchmarks/CMakeLists.txt deleted file mode 100755 index 75bdba79043..00000000000 --- a/frameworks/C++/paozhu/benchmarks/CMakeLists.txt +++ /dev/null @@ -1,522 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 3.20) - -cmake_policy(SET CMP0048 NEW) - -set(ENABLE_VCPKG OFF CACHE BOOL "choose ON to enable") -set(ENABLE_BOOST OFF CACHE BOOL "choose ON to enable") -set(ENABLE_GD OFF CACHE BOOL "choose ON to enable") -set(ENABLE_WIN_VCPKG OFF CACHE BOOL "choose ON to enable") - -if (ENABLE_GD STREQUAL "ON") - list(FIND VCPKG_MANIFEST_FEATURES "gd" index) - if (index EQUAL -1) - message(STATUS "Auto append features: gd") - list(APPEND VCPKG_MANIFEST_FEATURES "gd") - endif () -endif () - -if (ENABLE_BOOST STREQUAL "ON") - list(FIND VCPKG_MANIFEST_FEATURES "boost" index) - if (index EQUAL -1) - message(STATUS "Auto append features: boost") - list(APPEND VCPKG_MANIFEST_FEATURES "boost") - endif () -endif () - -PROJECT(Paozhu_web_framework) -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -set(mode "CMAKE_BUILD_TYPE") - -set(BOOST_OPEN " ") -set(GD_OPEN " ") - -if(ENABLE_BOOST STREQUAL "ON") - message("ENABLE_BOOST") - set(BOOST_OPEN " -DENABLE_BOOST ") -endif() - -if(ENABLE_GD STREQUAL "ON") - message("ENABLE_GD") - set(GD_OPEN " -DENABLE_GD ") -endif() - -set(sys_so_path "/usr/lib64") - -if (IS_DIRECTORY "/usr/lib/x86_64-linux-gnu") - set(sys_so_path "/usr/lib/x86_64-linux-gnu") -endif() - -if (CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0601") -endif() - -if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /EHsc") -endif () - -if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) - - if(CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN}") - if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g") - endif () - else() - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) - endif () - message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") - -elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) - - if (CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -O3") - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread") - endif () - else () - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) - file(MAKE_DIRECTORY /usr/local/etc/paozhu) - file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/) - endif () - message("Release mode:${CMAKE_CXX_FLAGS_RELEASE}") - -else() - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") - message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) - - if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") - endif () -endif() - - - -file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/temp) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/log) -set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) -set(USE_STANDALONE_ASIO ON) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -message(STATUS "SOURCE dir ${CMAKE_CURRENT_SOURCE_DIR}") - - -set(CMAKE_BUILD_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build) -set(CMAKE_CACHEFILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) -set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/controller) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) - -if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) - file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) -endif () -#EXECUTE_PROCESS(COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) -set(PAOZHU_PRE paozhu_pre) -add_executable(${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autopickmethod.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/md5.cpp) -add_executable(paozhu_empty ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autoemptymethod.cpp) - - - -file(GLOB_RECURSE orm_list ${CMAKE_CURRENT_SOURCE_DIR}/orm/*.cpp) -file(GLOB_RECURSE source_list ${CMAKE_CURRENT_SOURCE_DIR}/models/*.cpp) -file(GLOB_RECURSE FRAMEWORK_CPP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/*.cpp) -file(GLOB_RECURSE common_list ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cpp) -file(GLOB_RECURSE controller_list ${CMAKE_CURRENT_SOURCE_DIR}/controller/src/*.cpp) -file(GLOB_RECURSE viewsrc_list ${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/view/*.cpp) -file(GLOB_RECURSE reflect_list ${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cpp) -file(GLOB_RECURSE src_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) - -foreach(cppfile IN LISTS controller_list) - string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/controller/src/" "" cppfilename ${cppfile}) - string(FIND ${cppfilename} "/" strpos) - if(${strpos} GREATER_EQUAL "0" ) - string(REGEX MATCH "(.*)/" onepath ${cppfilename}) - string(REPLACE "/" "" toucpath ${onepath}) - if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${toucpath}") - else() - message("mkdir ${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${toucpath}") - file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${toucpath}") - endif() - endif() - string(REGEX REPLACE ".cpp" "" cppbasename ${cppfilename}) -# message(${cppbasename}) - if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") - else() - file(TOUCH "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") - endif() -endforeach() - -function(include_sub_directories_recursively root_dir) - if (IS_DIRECTORY ${root_dir}) # 当前路径是一个目录吗,是的话就加入到包含目录 - # if (${root_dir} MATCHES "include") - message("include dir: " ${root_dir}) - include_directories(${root_dir}) - # endif() - endif() - - file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中 - - foreach(sub ${ALL_SUB}) - if (IS_DIRECTORY ${root_dir}/${sub}) - include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含 - endif() - endforeach() -endfunction() - -include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver) -include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/orm) -include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/models) -include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/controller/include) -include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs) -include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include) - -add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) - - -if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) - add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testdaemon.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) -else() - add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) -endif() - -if (ENABLE_WIN_VCPKG STREQUAL "ON") -else () -add_custom_command( - TARGET paozhu_empty paozhu - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre - PRE_BUILD - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ - COMMAND echo "-- controls method --" - COMMAND ${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/ - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty - ) -endif() - -if (ENABLE_VCPKG) - add_compile_definitions(ENABLE_VCPKG) - find_package(asio CONFIG REQUIRED) - target_link_libraries(paozhu asio::asio) - - if (ENABLE_BOOST) - add_compile_definitions(ENABLE_BOOST) - set(Boost_NO_WARN_NEW_VERSIONS ON) - find_package(Boost REQUIRED COMPONENTS filesystem coroutine) - target_link_libraries(paozhu Boost::boost Boost::filesystem Boost::coroutine) - endif () - - find_package(OpenSSL REQUIRED) - target_link_libraries(paozhu OpenSSL::Crypto OpenSSL::SSL) - - find_package(ZLIB REQUIRED) - target_link_libraries(paozhu ZLIB::ZLIB) - - # find_package(libmysql REQUIRED) - find_package(unofficial-libmariadb CONFIG REQUIRED) - find_path(MYSQL_ROOT_DIR mysql) - # target_link_libraries(paozhu ${MYSQL_LIBRARIES}) - # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES}) - target_link_libraries(paozhu unofficial::libmariadb) - target_link_libraries(paozhu_cli unofficial::libmariadb) - target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) - target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) - - if (ENABLE_GD STREQUAL "ON") - find_package(PkgConfig) - pkg_check_modules(LIBGD REQUIRED IMPORTED_TARGET gdlib) - target_link_libraries(paozhu PkgConfig::LIBGD) - - find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h) - find_library(QRENCODE_LIBRARY_RELEASE qrencode) - # find_library(QRENCODE_LIBRARY_DEBUG qrencoded) - # set(QRENCODE_LIBRARIES optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG}) - target_include_directories(paozhu PRIVATE ${QRENCODE_INCLUDE_DIR}) - target_link_libraries(paozhu ${QRENCODE_LIBRARY_RELEASE}) - # MESSAGE(STATUS ${QRENCODE_LIBRARY_RELEASE}) - - # warning: Fixed an issue where ports/libqrencode would not automatically - # copy dll files to the bin directory - if (CMAKE_SYSTEM_NAME MATCHES "Windows") - set(PATH_TO_QRENCODE_DLL "") - if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/qrencode.dll") - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/libqrencode.dll") - endif () - message(STATUS "Selected libqrencode.dll: ${PATH_TO_QRENCODE_DLL}") - - add_custom_command( - TARGET paozhu POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${PATH_TO_QRENCODE_DLL} ${CMAKE_CURRENT_SOURCE_DIR}/bin/ - ) - endif () - - find_package(PNG REQUIRED) - target_link_libraries(paozhu PNG::PNG) - - find_package(Freetype REQUIRED) - target_link_libraries(paozhu Freetype::Freetype) - endif () - - find_package(unofficial-brotli CONFIG REQUIRED) - target_link_libraries(paozhu unofficial::brotli::brotlidec unofficial::brotli::brotlienc) -else () - -if(USE_STANDALONE_ASIO) -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") -set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include") -else() -set(ASIO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/asio "/usr/include") -endif() - - target_compile_definitions(paozhu INTERFACE ASIO_STANDALONE) - find_path(ASIO_PATH asio.hpp) - message(state " Standalone Asio found: " ${ASIO_PATH}) - if(NOT ASIO_PATH) - message(FATAL_ERROR "Standalone Asio not found") - else() - target_include_directories(paozhu INTERFACE ${ASIO_PATH}) - endif() - - include_directories(${ASIO_PATH}) - -endif() - - -if(ENABLE_BOOST STREQUAL "ON") -message("---ENABLE_BOOST-----") -find_package(Boost REQUIRED - COMPONENTS system filesystem) -if(Boost_FOUND) - add_compile_definitions(ENABLE_BOOST) - include_directories("${Boost_INCLUDE_DIRS}/boost") - - MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}") - MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARY_DIRS}") - MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}") - link_directories(${Boost_LIBRARY_DIRS}) - target_link_libraries (paozhu ${Boost_LIBRARIES}) -endif() - -endif() - - -find_package(OpenSSL REQUIRED) - -if(OPENSSL_FOUND) - - message(STATUS "OPENSSL_VERSION = ${OPENSSL_VERSION}") - message(STATUS "OPENSSL_SSL_LIBRARY = ${OPENSSL_SSL_LIBRARY}") - message(STATUS "OPENSSL_CRYPTO_LIBRARY = ${OPENSSL_CRYPTO_LIBRARY}") - message(STATUS "OPENSSL_INCLUDE_DIR = ${OPENSSL_INCLUDE_DIR}") - INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}") - target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY}) - target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY}) -endif() - - -find_package(ZLIB REQUIRED) -if(ZLIB_FOUND) - message(STATUS "Zlib Found! ${ZLIB_LIBRARIES}") - include_directories(${ZLIB_INCLUDE_DIR}) - set(zlib_library ${ZLIB_LIBRARIES}) - target_link_libraries(paozhu z) -endif() - -find_path(MYSQL_ROOT_DIR mysql) -MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") -find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) - -FIND_PATH(MYSQL_INCLUDE_DIR mysql.h - /usr/local/include/mysql - /usr/include/mysql - /usr/local/mysql/include -) -SET(MYSQL_NAMES mysqlclient) -FIND_LIBRARY(MYSQL_LIBRARY - NAMES ${MYSQL_NAMES} - PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib - PATH_SUFFIXES mysql -) - -IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - SET(MYSQL_FOUND TRUE) - SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) -ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - SET(MYSQL_FOUND FALSE) - SET( MYSQL_LIBRARIES ) -ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - -IF (MYSQL_FOUND) - IF (NOT MYSQL_FIND_QUIETLY) - MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") - ENDIF (NOT MYSQL_FIND_QUIETLY) -ELSE (MYSQL_FOUND) - IF (MYSQL_FIND_REQUIRED) - MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") - MESSAGE(FATAL_ERROR "Could NOT find MySQL library") - ENDIF (MYSQL_FIND_REQUIRED) -ENDIF (MYSQL_FOUND) - -target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) -target_link_libraries(paozhu ${MYSQL_LIBRARY}) - -target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) -target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) - - - -if(ENABLE_GD STREQUAL "ON") -message("---ENABLE_GD-----") - -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(GD_ROOT_DIR "/usr/local/opt/gd/lib") -else() - set(GD_ROOT_DIR "${sys_so_path}") -endif() - -set(find_gdname gd) - -find_library(GD_LIB_DIR - NAMES ${find_gdname} - PATHS "${GD_ROOT_DIR}" - NO_DEFAULT_PATH -) - -if(NOT GD_LIB_DIR) -message(FATAL_ERROR -"GD Graphics Library NOT FOUND! please install . " -) -endif() - -message(STATUS "GD Graphics Library at: ${GD_LIB_DIR}") - -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") -set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib") -else() -set(QR_ROOT_DIR "${sys_so_path}") -endif() - -set(find_qrname qrencode) - -find_library(QR_LIB_DIR - NAMES ${find_qrname} - PATHS "${QR_ROOT_DIR}" - NO_DEFAULT_PATH -) - -if(NOT QR_LIB_DIR) -message(FATAL_ERROR -"qrencode Library NOT FOUND! please install . " -) -endif() - -message(STATUS "qrencode at: ${QR_LIB_DIR}") - -INCLUDE_DIRECTORIES("${GD_ROOT_DIR}/include") -INCLUDE_DIRECTORIES("${QR_ROOT_DIR}/include") -link_directories("${QR_ROOT_DIR}/lib") -link_directories("${GD_ROOT_DIR}/lib") -target_link_libraries(paozhu ${GD_LIB_DIR}) -target_link_libraries(paozhu ${QR_LIB_DIR}) - -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") -set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib") -else() -set(PNG_ROOT_DIR "${sys_so_path}") -endif() - -find_library(PNG_LIB_DIR - NAMES png - PATHS "${PNG_ROOT_DIR}" - NO_DEFAULT_PATH -) -target_link_libraries(paozhu ${PNG_LIB_DIR}) - -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib") -else() - set(FREETYPE_ROOT_DIR "${sys_so_path}") -endif() - -find_library(FREETYPE_LIB_DIR - NAMES freetype - PATHS "${FREETYPE_ROOT_DIR}" - NO_DEFAULT_PATH -) -target_link_libraries(paozhu ${FREETYPE_LIB_DIR}) -#end ENABLE_GD -endif() - - find_library(Brotli - HINTS ${BROTLI_ROOT_DIR} - PATH_SUFFIXES - "lib" - "lib64" - "libs" - "libs64" - "lib/x86_64-linux-gnu" - ) - - - -#find_package(Brotli COMPONENTS encoder decoder common REQUIRED) - -message(STATUS "Brotli at: ${BROTLI_ROOT_DIR}") - -set(find_brname brotlienc) -set(find_brdename brotlidec) -find_library(BR_LIB_DIR - NAMES ${find_brname} - PATHS "${BROTLI_ROOT_DIR}" - NO_DEFAULT_PATH -) -find_library(BRDEC_LIB_DIR - NAMES ${find_brdename} - PATHS "${BROTLI_ROOT_DIR}" - NO_DEFAULT_PATH -) -INCLUDE_DIRECTORIES("${BROTLI_ROOT_DIR}/include") -link_directories("${BROTLI_ROOT_DIR}/lib") - -if(NOT BR_LIB_DIR) -message(FATAL_ERROR -"Brotli Library NOT FOUND! please install . " -) -endif() - -message(STATUS "Brotli at: ${BR_LIB_DIR}") -target_link_libraries(paozhu ${BR_LIB_DIR}) - - -if(NOT BRDEC_LIB_DIR) -message(FATAL_ERROR -"Brotli Library NOT FOUND! please install . " -) -endif() - -message(STATUS "Brotli at: ${BRDEC_LIB_DIR}") -target_link_libraries(paozhu ${BRDEC_LIB_DIR}) - - -message("Compile framework mode") - -target_link_libraries(paozhu m dl) - -endif () - -if (CMAKE_SYSTEM_NAME MATCHES "Windows") - target_link_libraries(paozhu ws2_32) - target_link_libraries(paozhu_cli ws2_32) -endif () \ No newline at end of file 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 0298/1766] 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 0299/1766] 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 0300/1766] 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 0301/1766] 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 49b1a4fa660c7fb6e58c56f53dc3cb7219495247 Mon Sep 17 00:00:00 2001 From: hzq Date: Sun, 21 Jan 2024 20:15:43 +0800 Subject: [PATCH 0302/1766] [C++] add new paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index ebad103eed8..ce2013236c6 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -14,7 +14,7 @@ ENV LC_ALL en_US.UTF-8 WORKDIR / -RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.6/benchmark.zip +RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.7/benchmark.zip RUN unzip benchmark.zip RUN mv ./benchmark/* ./ From 9d6563ec394156f959162f6b647680a197dfdae8 Mon Sep 17 00:00:00 2001 From: hzq Date: Sun, 21 Jan 2024 20:58:08 +0800 Subject: [PATCH 0303/1766] [C++] add new paozhu --- frameworks/C++/paozhu/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/C++/paozhu/README.md b/frameworks/C++/paozhu/README.md index 5f5e76734db..a67f0db427f 100755 --- a/frameworks/C++/paozhu/README.md +++ b/frameworks/C++/paozhu/README.md @@ -2,6 +2,8 @@ This is the [Paozhu](https://github.com/hggq/paozhu) +This Benchmarking Test code from https://github.com/hggq/paozhu/releases/tag/v1.5.7 + ### Test Type Implementation Source Code * [Benchmark code](controller/src/techempower.cpp) 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 0304/1766] 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 0305/1766] 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 0306/1766] 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 3da7823721bc8740769b1af325d9d96bd7e7d80e Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 26 Jan 2024 12:17:48 +0800 Subject: [PATCH 0307/1766] update benchmark to v1.5.8 --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index ce2013236c6..4054761398f 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -14,7 +14,7 @@ ENV LC_ALL en_US.UTF-8 WORKDIR / -RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.7/benchmark.zip +RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip RUN unzip benchmark.zip RUN mv ./benchmark/* ./ From 4cb0e3db110a4e655ba53c780d3a67ab7fb2ba9e Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 26 Jan 2024 20:27:43 +0800 Subject: [PATCH 0308/1766] update benchmark to v1.5.8 --- frameworks/C++/paozhu/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/README.md b/frameworks/C++/paozhu/README.md index a67f0db427f..089e3030ca3 100755 --- a/frameworks/C++/paozhu/README.md +++ b/frameworks/C++/paozhu/README.md @@ -2,7 +2,7 @@ This is the [Paozhu](https://github.com/hggq/paozhu) -This Benchmarking Test code from https://github.com/hggq/paozhu/releases/tag/v1.5.7 +This Benchmarking Test code from https://github.com/hggq/paozhu/releases/tag/v1.5.8 ### Test Type Implementation Source Code 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 0309/1766] 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 0310/1766] 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 0311/1766] 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 0312/1766] 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 0313/1766] 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 0314/1766] 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 4a500ea81d16f8714ef2cb85f34ec91c51f7314a Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Tue, 6 Feb 2024 11:05:28 +0100 Subject: [PATCH 0315/1766] Upgrade to Inverno 1.6.2 --- .../Java/inverno/inverno-postgres.dockerfile | 6 +- frameworks/Java/inverno/inverno.dockerfile | 6 +- 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, 111 insertions(+), 185 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..367a708fb45 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -1,11 +1,11 @@ -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 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 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/maven-inverno/application_linux_amd64/inverno-benchmark-1.0.0-SNAPSHOT/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..2850508516e 100644 --- a/frameworks/Java/inverno/inverno.dockerfile +++ b/frameworks/Java/inverno/inverno.dockerfile @@ -1,9 +1,9 @@ -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 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 93791a57d2cf74cf9f055f1abc7f9eb5c790cdae Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Tue, 6 Feb 2024 11:41:52 +0100 Subject: [PATCH 0316/1766] Add missing binutils when building docker images --- frameworks/Java/inverno/inverno-postgres.dockerfile | 1 + frameworks/Java/inverno/inverno.dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile index 367a708fb45..bcac4561d5f 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -2,6 +2,7 @@ FROM maven:3.9.6-amazoncorretto-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml +RUN yum -y install binutils RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 diff --git a/frameworks/Java/inverno/inverno.dockerfile b/frameworks/Java/inverno/inverno.dockerfile index 2850508516e..1dd39d53b27 100644 --- a/frameworks/Java/inverno/inverno.dockerfile +++ b/frameworks/Java/inverno/inverno.dockerfile @@ -2,6 +2,7 @@ FROM maven:3.9.6-amazoncorretto-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml +RUN yum -y install binutils RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 From 71af367a7b876d05f7339dbe2b0385c5ec87e871 Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Tue, 6 Feb 2024 11:57:23 +0100 Subject: [PATCH 0317/1766] Fix inverno postgres CMD --- frameworks/Java/inverno/inverno-postgres.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile index bcac4561d5f..6a3fcd9070f 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -7,6 +7,6 @@ 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\" + target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" 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 0318/1766] 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 0319/1766] 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 0320/1766] [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 0321/1766] [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 0322/1766] 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 0323/1766] 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 0324/1766] 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 0325/1766] [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 0326/1766] 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 0327/1766] 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 0328/1766] 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 0329/1766] 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 0330/1766] [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 0331/1766] 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 0332/1766] [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 0333/1766] 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 0334/1766] 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 0335/1766] 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 0336/1766] 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 0337/1766] 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 0338/1766] 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 0339/1766] 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 0340/1766] 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 0341/1766] 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 0342/1766] 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 0343/1766] 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 0344/1766] 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 0345/1766] 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 0346/1766] 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 0347/1766] 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 0348/1766] 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 0349/1766] 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 0350/1766] 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 0351/1766] 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 0352/1766] 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 0353/1766] 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 0354/1766] [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 0355/1766] 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 dd4d49e54e9b684c486561ec97040d916ad082b8 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 22 Feb 2024 18:26:19 +0100 Subject: [PATCH 0356/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 12 ++++++------ .../hexagon/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 2c70f2ed07b..3debf65bace 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.22" apply false - id "org.graalvm.buildtools.native" version "0.9.28" 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.6" + hexagonVersion = "3.4.7" jettyVersion = "12.0.5" - nettyVersion = "4.1.104.Final" + nettyVersion = "4.1.107.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.7.1" - vertxVersion = "4.5.1" + postgresqlVersion = "42.7.2" + vertxVersion = "4.5.3" 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 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 0357/1766] 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 0fc994537312ce7804497d354395016df165760c Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Thu, 22 Feb 2024 22:52:01 +0100 Subject: [PATCH 0358/1766] 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 950a0478e1bbbf05811268ec45d43d1f2743956e Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 26 Feb 2024 12:18:06 +0800 Subject: [PATCH 0359/1766] Add benchmark files --- .../paozhu/paozhu_benchmark/CMakeLists.txt | 508 ++++++++++++++++++ .../common/autocontrolmethod.hpp | 51 ++ .../common/autorestfulpaths.hpp | 28 + .../paozhu_benchmark/common/cost_define.h | 9 + .../paozhu_benchmark/common/httphook.cpp | 39 ++ .../common/json_reflect_headers.h | 32 ++ .../paozhu_benchmark/common/reghttpmethod.hpp | 16 + .../common/reghttpmethod_pre.hpp | 20 + .../common/websockets_method_reg.hpp | 19 + .../controller/include/techempower.h | 19 + .../controller/src/techempower.cpp | 241 +++++++++ .../libs/types/techempower_json.h | 15 + .../types/techempower_json_jsonreflect.cpp | 290 ++++++++++ .../paozhu_benchmark/test/testbenchmark.cpp | 126 +++++ 14 files changed, 1413 insertions(+) create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt new file mode 100755 index 00000000000..b8bf972dbc2 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -0,0 +1,508 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.20) + +cmake_policy(SET CMP0048 NEW) + +set(ENABLE_VCPKG OFF CACHE BOOL "choose ON to enable") +set(ENABLE_BOOST OFF CACHE BOOL "choose ON to enable") +set(ENABLE_GD OFF CACHE BOOL "choose ON to enable") +set(ENABLE_WIN_VCPKG OFF CACHE BOOL "choose ON to enable") + +if (ENABLE_GD STREQUAL "ON") + list(FIND VCPKG_MANIFEST_FEATURES "gd" index) + if (index EQUAL -1) + message(STATUS "Auto append features: gd") + list(APPEND VCPKG_MANIFEST_FEATURES "gd") + endif () +endif () + +if (ENABLE_BOOST STREQUAL "ON") + list(FIND VCPKG_MANIFEST_FEATURES "boost" index) + if (index EQUAL -1) + message(STATUS "Auto append features: boost") + list(APPEND VCPKG_MANIFEST_FEATURES "boost") + endif () +endif () + +PROJECT(Paozhu_web_framework) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(mode "CMAKE_BUILD_TYPE") + +set(BOOST_OPEN " ") +set(GD_OPEN " ") + +if(ENABLE_BOOST STREQUAL "ON") + message("ENABLE_BOOST") + set(BOOST_OPEN " -DENABLE_BOOST ") +endif() + +if(ENABLE_GD STREQUAL "ON") + message("ENABLE_GD") + set(GD_OPEN " -DENABLE_GD ") +endif() + +set(sys_so_path "/usr/lib64") + +if (IS_DIRECTORY "/usr/lib/x86_64-linux-gnu") + set(sys_so_path "/usr/lib/x86_64-linux-gnu") +endif() + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0601") +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /EHsc") +endif () + +if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) + + if(CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN}") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g") + endif () + else() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + endif () + message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") + +elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) + + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -O3") + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread") + endif () + else () + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + file(MAKE_DIRECTORY /usr/local/etc/paozhu) + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/) + endif () + message("Release mode:${CMAKE_CXX_FLAGS_RELEASE}") + +else() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") + message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + + if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") + endif () +endif() + + + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/temp) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/log) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) +set(USE_STANDALONE_ASIO ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +message(STATUS "SOURCE dir ${CMAKE_CURRENT_SOURCE_DIR}") + + +set(CMAKE_BUILD_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build) +set(CMAKE_CACHEFILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) +set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/controller) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) + file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) +endif () +#EXECUTE_PROCESS(COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) +set(PAOZHU_PRE paozhu_pre) +add_executable(${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autopickmethod.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/md5.cpp) +add_executable(paozhu_empty ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autoemptymethod.cpp) + + + +file(GLOB_RECURSE orm_list ${CMAKE_CURRENT_SOURCE_DIR}/orm/*.cpp) +file(GLOB_RECURSE source_list ${CMAKE_CURRENT_SOURCE_DIR}/models/*.cpp) +file(GLOB_RECURSE FRAMEWORK_CPP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/*.cpp) +file(GLOB_RECURSE common_list ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cpp) +file(GLOB_RECURSE controller_list ${CMAKE_CURRENT_SOURCE_DIR}/controller/src/*.cpp) +file(GLOB_RECURSE viewsrc_list ${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/view/*.cpp) +file(GLOB_RECURSE reflect_list ${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cpp) +file(GLOB_RECURSE src_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) + +foreach(cppfile IN LISTS controller_list) + string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/controller/src/" "" cppfilename ${cppfile}) + string(REGEX REPLACE ".cpp" "" cppbasename ${cppfilename}) +# message(${cppbasename}) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") + else() + file(TOUCH "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") + endif() +endforeach() + +function(include_sub_directories_recursively root_dir) + if (IS_DIRECTORY ${root_dir}) # 当前路径是一个目录吗,是的话就加入到包含目录 + # if (${root_dir} MATCHES "include") + message("include dir: " ${root_dir}) + include_directories(${root_dir}) + # endif() + endif() + + file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中 + + foreach(sub ${ALL_SUB}) + if (IS_DIRECTORY ${root_dir}/${sub}) + include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含 + endif() + endforeach() +endfunction() + +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/orm) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/models) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/controller/include) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include) + +add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) + + +if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testbenchmark.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) +else() + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) +endif() + +if (ENABLE_WIN_VCPKG STREQUAL "ON") +else () +add_custom_command( + TARGET paozhu_empty paozhu + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ + COMMAND echo "-- controls method --" + COMMAND ${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/ + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty + ) +endif() + +if (ENABLE_VCPKG) + add_compile_definitions(ENABLE_VCPKG) + find_package(asio CONFIG REQUIRED) + target_link_libraries(paozhu asio::asio) + + if (ENABLE_BOOST) + add_compile_definitions(ENABLE_BOOST) + set(Boost_NO_WARN_NEW_VERSIONS ON) + find_package(Boost REQUIRED COMPONENTS filesystem coroutine) + target_link_libraries(paozhu Boost::boost Boost::filesystem Boost::coroutine) + endif () + + find_package(OpenSSL REQUIRED) + target_link_libraries(paozhu OpenSSL::Crypto OpenSSL::SSL) + + find_package(ZLIB REQUIRED) + target_link_libraries(paozhu ZLIB::ZLIB) + + # find_package(libmysql REQUIRED) + find_package(unofficial-libmariadb CONFIG REQUIRED) + find_path(MYSQL_ROOT_DIR mysql) + # target_link_libraries(paozhu ${MYSQL_LIBRARIES}) + # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES}) + target_link_libraries(paozhu unofficial::libmariadb) + target_link_libraries(paozhu_cli unofficial::libmariadb) + target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) + target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) + + if (ENABLE_GD STREQUAL "ON") + find_package(PkgConfig) + pkg_check_modules(LIBGD REQUIRED IMPORTED_TARGET gdlib) + target_link_libraries(paozhu PkgConfig::LIBGD) + + find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h) + find_library(QRENCODE_LIBRARY_RELEASE qrencode) + # find_library(QRENCODE_LIBRARY_DEBUG qrencoded) + # set(QRENCODE_LIBRARIES optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG}) + target_include_directories(paozhu PRIVATE ${QRENCODE_INCLUDE_DIR}) + target_link_libraries(paozhu ${QRENCODE_LIBRARY_RELEASE}) + # MESSAGE(STATUS ${QRENCODE_LIBRARY_RELEASE}) + + # warning: Fixed an issue where ports/libqrencode would not automatically + # copy dll files to the bin directory + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(PATH_TO_QRENCODE_DLL "") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/qrencode.dll") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/libqrencode.dll") + endif () + message(STATUS "Selected libqrencode.dll: ${PATH_TO_QRENCODE_DLL}") + + add_custom_command( + TARGET paozhu POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${PATH_TO_QRENCODE_DLL} ${CMAKE_CURRENT_SOURCE_DIR}/bin/ + ) + endif () + + find_package(PNG REQUIRED) + target_link_libraries(paozhu PNG::PNG) + + find_package(Freetype REQUIRED) + target_link_libraries(paozhu Freetype::Freetype) + endif () + + find_package(unofficial-brotli CONFIG REQUIRED) + target_link_libraries(paozhu unofficial::brotli::brotlidec unofficial::brotli::brotlienc) +else () + +if(USE_STANDALONE_ASIO) +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include") +else() +set(ASIO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/asio "/usr/include") +endif() + + target_compile_definitions(paozhu INTERFACE ASIO_STANDALONE) + find_path(ASIO_PATH asio.hpp) + message(state " Standalone Asio found: " ${ASIO_PATH}) + if(NOT ASIO_PATH) + message(FATAL_ERROR "Standalone Asio not found") + else() + target_include_directories(paozhu INTERFACE ${ASIO_PATH}) + endif() + + include_directories(${ASIO_PATH}) + +endif() + + +if(ENABLE_BOOST STREQUAL "ON") +message("---ENABLE_BOOST-----") +find_package(Boost REQUIRED + COMPONENTS system filesystem) +if(Boost_FOUND) + add_compile_definitions(ENABLE_BOOST) + include_directories("${Boost_INCLUDE_DIRS}/boost") + + MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}") + MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARY_DIRS}") + MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}") + link_directories(${Boost_LIBRARY_DIRS}) + target_link_libraries (paozhu ${Boost_LIBRARIES}) +endif() + +endif() + + +find_package(OpenSSL REQUIRED) + +if(OPENSSL_FOUND) + + message(STATUS "OPENSSL_VERSION = ${OPENSSL_VERSION}") + message(STATUS "OPENSSL_SSL_LIBRARY = ${OPENSSL_SSL_LIBRARY}") + message(STATUS "OPENSSL_CRYPTO_LIBRARY = ${OPENSSL_CRYPTO_LIBRARY}") + message(STATUS "OPENSSL_INCLUDE_DIR = ${OPENSSL_INCLUDE_DIR}") + INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}") + target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY}) + target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY}) +endif() + + +find_package(ZLIB REQUIRED) +if(ZLIB_FOUND) + message(STATUS "Zlib Found! ${ZLIB_LIBRARIES}") + include_directories(${ZLIB_INCLUDE_DIR}) + set(zlib_library ${ZLIB_LIBRARIES}) + target_link_libraries(paozhu z) +endif() + +find_path(MYSQL_ROOT_DIR mysql) +MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) + +FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + /usr/local/include/mysql + /usr/include/mysql + /usr/local/mysql/include +) +SET(MYSQL_NAMES mysqlclient) +FIND_LIBRARY(MYSQL_LIBRARY + NAMES ${MYSQL_NAMES} + PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib + PATH_SUFFIXES mysql +) + +IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND TRUE) + SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) +ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND FALSE) + SET( MYSQL_LIBRARIES ) +ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + +IF (MYSQL_FOUND) + IF (NOT MYSQL_FIND_QUIETLY) + MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") + ENDIF (NOT MYSQL_FIND_QUIETLY) +ELSE (MYSQL_FOUND) + IF (MYSQL_FIND_REQUIRED) + MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") + MESSAGE(FATAL_ERROR "Could NOT find MySQL library") + ENDIF (MYSQL_FIND_REQUIRED) +ENDIF (MYSQL_FOUND) + +target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) +target_link_libraries(paozhu ${MYSQL_LIBRARY}) + +target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) +target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) + + + +if(ENABLE_GD STREQUAL "ON") +message("---ENABLE_GD-----") + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(GD_ROOT_DIR "/usr/local/opt/gd/lib") +else() + set(GD_ROOT_DIR "${sys_so_path}") +endif() + +set(find_gdname gd) + +find_library(GD_LIB_DIR + NAMES ${find_gdname} + PATHS "${GD_ROOT_DIR}" + NO_DEFAULT_PATH +) + +if(NOT GD_LIB_DIR) +message(FATAL_ERROR +"GD Graphics Library NOT FOUND! please install . " +) +endif() + +message(STATUS "GD Graphics Library at: ${GD_LIB_DIR}") + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib") +else() +set(QR_ROOT_DIR "${sys_so_path}") +endif() + +set(find_qrname qrencode) + +find_library(QR_LIB_DIR + NAMES ${find_qrname} + PATHS "${QR_ROOT_DIR}" + NO_DEFAULT_PATH +) + +if(NOT QR_LIB_DIR) +message(FATAL_ERROR +"qrencode Library NOT FOUND! please install . " +) +endif() + +message(STATUS "qrencode at: ${QR_LIB_DIR}") + +INCLUDE_DIRECTORIES("${GD_ROOT_DIR}/include") +INCLUDE_DIRECTORIES("${QR_ROOT_DIR}/include") +link_directories("${QR_ROOT_DIR}/lib") +link_directories("${GD_ROOT_DIR}/lib") +target_link_libraries(paozhu ${GD_LIB_DIR}) +target_link_libraries(paozhu ${QR_LIB_DIR}) + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib") +else() +set(PNG_ROOT_DIR "${sys_so_path}") +endif() + +find_library(PNG_LIB_DIR + NAMES png + PATHS "${PNG_ROOT_DIR}" + NO_DEFAULT_PATH +) +target_link_libraries(paozhu ${PNG_LIB_DIR}) + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib") +else() + set(FREETYPE_ROOT_DIR "${sys_so_path}") +endif() + +find_library(FREETYPE_LIB_DIR + NAMES freetype + PATHS "${FREETYPE_ROOT_DIR}" + NO_DEFAULT_PATH +) +target_link_libraries(paozhu ${FREETYPE_LIB_DIR}) +#end ENABLE_GD +endif() + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(BROTLI_ROOT_DIR "/usr/local/opt/brotli/lib") +else() + set(BROTLI_ROOT_DIR "${sys_so_path}") +endif() + + + +#find_package(Brotli COMPONENTS encoder decoder common REQUIRED) + +message(STATUS "Brotli at: ${BROTLI_ROOT_DIR}") + +set(find_brname brotlienc) +set(find_brdename brotlidec) +find_library(BR_LIB_DIR + NAMES ${find_brname} + PATHS "${BROTLI_ROOT_DIR}" + NO_DEFAULT_PATH +) +find_library(BRDEC_LIB_DIR + NAMES ${find_brdename} + PATHS "${BROTLI_ROOT_DIR}" + NO_DEFAULT_PATH +) +INCLUDE_DIRECTORIES("${BROTLI_ROOT_DIR}/include") +link_directories("${BROTLI_ROOT_DIR}/lib") + +if(NOT BR_LIB_DIR) +message(FATAL_ERROR +"Brotli Library NOT FOUND! please install . " +) +endif() + +message(STATUS "Brotli at: ${BR_LIB_DIR}") +target_link_libraries(paozhu ${BR_LIB_DIR}) + + +if(NOT BRDEC_LIB_DIR) +message(FATAL_ERROR +"Brotli Library NOT FOUND! please install . " +) +endif() + +message(STATUS "Brotli at: ${BRDEC_LIB_DIR}") +target_link_libraries(paozhu ${BRDEC_LIB_DIR}) + + +message("Compile framework mode") + +target_link_libraries(paozhu m dl) + +endif () + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + target_link_libraries(paozhu ws2_32) + target_link_libraries(paozhu_cli ws2_32) +endif () \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp new file mode 100755 index 00000000000..faddf242daa --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp @@ -0,0 +1,51 @@ + +#ifndef __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP +#define __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" + +#include "techempower.h" + + +namespace http +{ + void _initauto_control_httpmethodregto(std::map &methodcallback) + { + struct regmethold_t temp; + + temp.pre = nullptr; + temp.regfun = techempowerplaintext; + methodcallback.emplace("plaintext",temp); + temp.pre = nullptr; + temp.regfun = techempowerjson; + methodcallback.emplace("json",temp); + temp.pre = nullptr; + temp.regfun = techempowerdb; + methodcallback.emplace("db",temp); + temp.pre = nullptr; + temp.regfun = techempowerqueries; + methodcallback.emplace("queries",temp); + temp.pre = nullptr; + temp.regfun = techempowerfortunes; + methodcallback.emplace("fortunes",temp); + temp.pre = nullptr; + temp.regfun = techempowerupdates; + methodcallback.emplace("updates",temp); + temp.pre = nullptr; + temp.regfun = techempowercached_queries; + methodcallback.emplace("cached-queries",temp); + temp.pre = nullptr; + temp.regfun = techempowercached_db; + methodcallback.emplace("cached-db",temp); + + + } +} + +#endif + + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp new file mode 100755 index 00000000000..d7a1d639822 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp @@ -0,0 +1,28 @@ + +#ifndef __HTTP_AUTO_REG_CONTROL_HTTPRESTFUL_HPP +#define __HTTP_AUTO_REG_CONTROL_HTTPRESTFUL_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" + + + +namespace http +{ + void _initauto_control_httprestful_paths(std::map> &restfulmethod) + { + + + if(restfulmethod.size()) + {} + + + } +} + +#endif + + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h new file mode 100755 index 00000000000..47fb182f0e0 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h @@ -0,0 +1,9 @@ +#pragma once +#ifndef _CONST_DEFINE_FUNC_H +#define _CONST_DEFINE_FUNC_H + +#define CONST_MONEY_PART 1000000 +#define CONST_HTTP_HEADER_BODY_SIZE 16384 +#define CONST_PHP_BODY_POST_SIZE 16777216 + +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp new file mode 100755 index 00000000000..3440c23f84b --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "httppeer.h" +namespace http +{ +std::map _block_ip_tables; +std::map _block_host_tables; +bool check_blockip(const std::string &client_ip) +{ + if (client_ip.size() > 0) + { + return false; + } + return false; +} +bool hook_host_http1(std::shared_ptr peer) +{ + if (peer->host.size() > 0) + { + return false; + } + return false; +} +bool hook_host_http2(std::shared_ptr peer) +{ + if (peer->host.size() > 0) + { + return false; + } + return false; +} +}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h new file mode 100755 index 00000000000..176500bf383 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h @@ -0,0 +1,32 @@ +#pragma once +#include +#include +#include +#include + +#include "types/techempower_json.h" +#include "unicode.h" + +template +std::string json_encode([[maybe_unused]] const JSON_REF_OBJ_TEMP &json_reflectobj) { return ""; } + +template +std::string json_encode([[maybe_unused]] const std::vector &json_reflectobj) { return ""; } + +template +unsigned int json_decode([[maybe_unused]] JSON_REF_OBJ_TEMP &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } + +template +unsigned int json_decode([[maybe_unused]] std::vector &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } + +namespace http +{ + +std::string json_encode(const techempower_outjson_t &json_reflectobj); + +std::string json_encode(const std::vector &json_reflectobj); + +unsigned int json_decode(techempower_outjson_t &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); + +unsigned int json_decode(std::vector &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); +}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp new file mode 100755 index 00000000000..3333ed08bf0 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp @@ -0,0 +1,16 @@ +#ifndef __HTTP_REGHTTPMETHOD_HPP +#define __HTTP_REGHTTPMETHOD_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif// defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" +namespace http +{ +void _inithttpmethodregto(std::map &methodcallback) +{ +} + +}// namespace http +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp new file mode 100755 index 00000000000..bf2d5407381 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp @@ -0,0 +1,20 @@ +#ifndef __HTTP_REGHTTPMETHOD_PRE_HPP +#define __HTTP_REGHTTPMETHOD_PRE_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif// defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" +namespace http +{ +void _inithttpmethodregto_pre(std::map &methodcallback) +{ + struct regmethold_t temp; + //temp.pre = adminlogin; + //temp.regfun = adminmar; + //methodcallback.emplace("adminmar", temp); +} + +}// namespace http +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp new file mode 100755 index 00000000000..b8e9c718ea9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp @@ -0,0 +1,19 @@ +#pragma once +#include +#include "httppeer.h" +#include "websockets.h" +#include "mywebsockets.hpp" +#include "websockets_callback.h" +namespace http +{ +void _initwebsocketmethodregto(WEBSOCKET_REG &methodcallback) +{ + + methodcallback.emplace("wstest", [](std::weak_ptr p) -> std::shared_ptr + { return http::mywebsockets::create(p); }); + // methodcallback.emplace("looptest",[](std::weak_ptr p)->std::shared_ptr{ + // return http::loopwebsockets::create(p); + // }); +} + +}// namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h new file mode 100755 index 00000000000..f1697f616b9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h @@ -0,0 +1,19 @@ + +#pragma once +#include +#include +#include "httppeer.h" + +namespace http +{ + + + std::string techempowerplaintext(std::shared_ptr peer); + std::string techempowerjson(std::shared_ptr peer); + std::string techempowerdb(std::shared_ptr peer); + std::string techempowerqueries(std::shared_ptr peer); + std::string techempowerfortunes(std::shared_ptr peer); + std::string techempowerupdates(std::shared_ptr peer); + std::string techempowercached_queries(std::shared_ptr peer); + std::string techempowercached_db(std::shared_ptr peer); +} diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp new file mode 100755 index 00000000000..43906f42156 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -0,0 +1,241 @@ +#include "orm.h" +#include +#include +#include +#include +#include +#include "httppeer.h" +#include "techempower.h" +#include "techempower_json.h" +#include "datetime.h" +#include "func.h" +#include "pzcache.h" +#include "json_reflect_headers.h" +namespace http +{ +//@urlpath(null,plaintext) +std::string techempowerplaintext(std::shared_ptr peer) +{ + peer->type("text/plain; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + peer->output = "Hello, World!"; + return ""; +} + +//@urlpath(null,json) +std::string techempowerjson(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + struct techempower_outjson_t a; + a.message = "Hello, World!"; + peer->output = json_encode(a); + return ""; +} + +//@urlpath(null,db) +std::string techempowerdb(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + auto myworld = orm::World(); + unsigned int rd_num = rand_range(1, 10000); + myworld.get_one(rd_num); + + peer->output = myworld.data_tojson(); + return ""; +} + +//@urlpath(null,queries) +std::string techempowerqueries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + unsigned int get_num = peer->get["queries"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + unsigned int rd_num = rand_range(1, 10000); + myworld.where("id", rd_num).fetch_append(); + } + + peer->output = myworld.to_json(); + return ""; +} + +//@urlpath(null,fortunes) +std::string techempowerfortunes(std::shared_ptr peer) +{ + peer->type("text/html; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + auto myfortune = orm::Fortune(); + myfortune.fetch(); + myfortune.data.id = 0; + myfortune.data.message = "Additional fortune added at request time."; + myfortune.record.push_back(myfortune.data); + + std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) + { return lhs.message < rhs.message; }); + peer->val["list"].set_array(); + OBJ_ARRAY item; + for (unsigned int i = 0; i < myfortune.record.size(); i++) + { + item["id"] = myfortune.record[i].id; + item["message"] = html_encode(myfortune.record[i].message); + peer->val["list"].push(item); + } + + peer->view("techempower/fortunes"); + return ""; +} + +//@urlpath(null,updates) +std::string techempowerupdates(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + unsigned int get_num = peer->get["queries"].to_int(); + + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.clear(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + myworld.where("id", rand_range(1, 10000)).fetch_append(); + if (myworld.effect() > 0) + { + unsigned int j = myworld.record.size() - 1; + myworld.data.randomnumber = rand_range(1, 10000); + myworld.record[j].randomnumber = myworld.data.randomnumber; + myworld.update("randomnumber"); + } + } + peer->output = myworld.to_json(); + return ""; +} + +//@urlpath(null,cached-queries) +std::string techempowercached_queries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "alldatacache"; + + pzcache> &temp_cache = pzcache>::conn(); + + std::vector allcachedata_array; + allcachedata_array.reserve(10000); + //create rand data to cache + if (temp_cache.check(mycacheid) > -1) + { + allcachedata_array = temp_cache.get(mycacheid); + } + else + { + allcachedata_array.resize(10000); + for (unsigned int i = 0; i < 10000; i++) + { + allcachedata_array[i].id = i + 1; + allcachedata_array[i].randomnumber = rand_range(1, 10000); + } + temp_cache.save(mycacheid, allcachedata_array, 120); + } + //get rand data from cache + mycacheid = "my" + std::to_string(get_num); + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + if (allcachedata_array.size() == 10000) + { + for (unsigned int i = 0; i < get_num; i++) + { + unsigned int temp_rid = rand_range(0, 9999); + myworld.record.push_back(allcachedata_array[temp_rid]); + } + } + temp_cache.save(mycacheid, myworld.record, 120); + } + + peer->output = myworld.to_json(); + return ""; +} + +//@urlpath(null,cached-db) +std::string techempowercached_db(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + //this test from database to cache + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "my" + std::to_string(get_num); + + pzcache> &temp_cache = pzcache>::conn(); + + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + std::vector cacheid; + for (unsigned int i = 0; i < get_num; i++) + { + cacheid.push_back(rand_range(1, 10000)); + } + + std::string sqlstr = array_to_sql(cacheid); + myworld.whereIn("id", sqlstr).fetch(); + temp_cache.save(mycacheid, myworld.record, 120); + } + + peer->output = myworld.to_json(); + return ""; +} + +}// namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h new file mode 100755 index 00000000000..364c06bb2cf --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h @@ -0,0 +1,15 @@ +#ifndef LIBS_TYPES_TECHEMPOWER_TYPE_H +#define LIBS_TYPES_TECHEMPOWER_TYPE_H +#include +#include + +namespace http +{ +//@reflect json to_json from_json +struct techempower_outjson_t +{ + std::string message; +}; + +}// namespace http +#endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp new file mode 100755 index 00000000000..b5088efcdf9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp @@ -0,0 +1,290 @@ +#include +#include +#include +#include +#include "types/techempower_json.h" +#include "json_reflect_headers.h" +#include "unicode.h" +#include "func.h" + +namespace http +{ + + +std::string json_encode(const techempower_outjson_t &json_reflectobj) + { + + std::stringstream _stream; + _stream << "{"; + _stream << "\"message\":\"" << http::utf8_to_jsonstring(json_reflectobj.message)<< "\""; + + _stream << "}"; + + return _stream.str(); + + } + + +std::string json_encode(const std::vector &json_reflectobj) + { + std::stringstream _stream; + _stream << "["; + + for(unsigned int i=0;i0) + { + _stream <<","; + } + _stream < + //递归代码 + + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '}') + { + //offset++; + break; + } + if (_json_data[_offset] == '"') + { + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) + { + break; + } + } + } + } + + + if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) + { + _offset-=1; + } + //直接下一个,不用处理键值 + continue; + } + else if(_json_data[_offset]=='[') + { //表示有数组 + ////////////////////////////////////////////////////////////////////// + //begin level1 [] + //vector vector> vector> + //如果是非内置类型 直接使用json_decode<> + + //递归代码 + + + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == ']') + { + //offset++; + break; + } + if (_json_data[_offset] == '"') + { + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) + { + break; + } + } + } + } + + //直接下一个,不用处理键值 + if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) + { + _offset-=1; + } + continue; + //end level1[] + //////////////////////////////////////////////////////////////////// + } + else if(_json_data[_offset]==0x22) + { + //如果键值也是字符串 + temp_offset=_offset; + _json_value_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset); + _offset=temp_offset; + if(_json_data[_offset]==0x22) + { + if((_offset+1)<_json_data.size()) + { + if(_json_data[_offset+1]!=']'&&_json_data[_offset+1]!='}') + { + _offset+=1; + } + } + } + } + else + { + //表示是数字 bool NULL + for(;_offset<_json_data.size();_offset++) + { + //结束条件 + if(_json_data[_offset]==','||_json_data[_offset]==']'||_json_data[_offset]=='}'||_json_data[_offset]==0x20||_json_data[_offset]==0x0A||_json_data[_offset]==0x0D||_json_data[_offset]=='\t') + { + break; + } + _json_value_name.push_back(_json_data[_offset]); + } + //让前面循环退出或返回 + if(_offset < _json_data.size() && _json_data[_offset]=='}') + { + _offset-=1; + } + } + //////////////////////////////////////////////////////// + // level1 + //处理对象赋值 + if (http::str_casecmp(_json_key_name, "message")) + { + + json_reflectobj.message=_json_value_name; + } + + //////////////////////////////////////////////////////// + //继续循环下一个键值 + continue; + } + } + } + return _offset; + } + +unsigned int json_decode(std::vector &json_reflectobj,const std::string &_json_data,unsigned int _offset) + { + bool _isarray=false; + for(;_offset<_json_data.size();_offset++) + { + if(_json_data[_offset]=='{') + { + break; + } + if(_json_data[_offset]=='[') + { + _isarray=true; + break; + } + } + + if(_isarray) + { + if(_json_data[_offset]=='[') + { + _offset+=1; + } + for(;_offset<_json_data.size();_offset++) + { + _offset=http::json_string_trim(_json_data,_offset); + //直接返回,这样可以防插入空的对象 + if(_json_data[_offset]==0x5D) + { + return _offset; + }else if(_json_data[_offset]=='{') + { + techempower_outjson_t temp; + _offset=json_decode(temp,_json_data,_offset); + json_reflectobj.push_back(temp); + } + + } + + } + else + { + techempower_outjson_t temp; + _offset=json_decode(temp,_json_data,_offset); + json_reflectobj.push_back(temp); + + } + + return _offset; + } + +} diff --git a/frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp b/frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp new file mode 100755 index 00000000000..194c06e772a --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include "server.h" + +static sigjmp_buf env_startacs; +static void sig_child(int signo); +namespace fs = std::filesystem; +int main(int argc, char *argv[]) +{ + std::string argv_str; + if (argc > 1) + { + // server.conf filepath or confpath + argv_str.append(argv[1]); + fs::path conf_path = argv_str; + if (fs::is_regular_file(conf_path)) + { + } + else + { + if (argv_str.back() == '/') + { + argv_str = argv_str + "server.conf"; + } + else + { + argv_str = argv_str + "/server.conf"; + } + conf_path = argv_str; + if (fs::is_regular_file(conf_path)) + { + } + else + { + std::cout << "Not found server.conf file."; + return 0; + } + } + } + else + { + + fs::path conf_path = fs::current_path(); + argv_str = conf_path.string() + "/conf/server.conf"; + conf_path = argv_str; + if (fs::is_regular_file(conf_path)) + { + } + else + { + argv_str = "/usr/local/etc/paozhu/server.conf"; + conf_path = argv_str; + if (fs::is_regular_file(conf_path)) + { + } + else + { + std::cout << "Not found server.conf file. Please copy conf Directory rename to /usr/local/etc/paozhu\n"; + return 0; + } + } + } + + pid_t pid;//, subpid = 0; + signal(SIGCHLD, sig_child); + if (sigsetjmp(env_startacs, 1) == 0)// 设置记号 + { + printf("setjmp ok.....\n"); + } + else + { + printf("longjmp ok.....\n"); + } + + pid = fork(); + printf("fork id %d \n", pid); + if (pid < 0) + { + perror("fork error:"); + exit(1); + } + else if (pid == 0) + { + + try + { + http::httpserver &httpmy = http::get_server_app(); + httpmy.run(argv_str); + } + catch (std::exception &e) + { + std::printf("Exception: %s\n", e.what()); + } + exit(0); + } + else + { + + while (1) + { + std::this_thread::sleep_for(std::chrono::seconds(10)); + //Future features are added here + } + return 0; + } +} +static void sig_child(int signo) +{ + /*pid_t */ int pid; + int stat; + // 处理僵尸进程 + + switch (signo) + { + case SIGCHLD: + + pid = wait(&stat); + printf("SIGCHLD...farter id %d..%d\n", getpid(), pid); + siglongjmp(env_startacs, 1);// jump setjmp begin + break; + } + exit(0); +} From 641e936a3f6f9e1e4fad128e13e23eae269b4141 Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 26 Feb 2024 15:17:32 +0800 Subject: [PATCH 0360/1766] Add benchmark files --- .../orm/_rawsqlfile/default_Fortune.sql | 5 + .../orm/_rawsqlfile/default_World.sql | 5 + .../orm/include/fortunebase.h | 2556 +++++++++++++++++ .../paozhu_benchmark/orm/include/worldbase.h | 2370 +++++++++++++++ .../C++/paozhu/paozhu_benchmark/orm/orm.h | 4 + 5 files changed, 4940 insertions(+) create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql b/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql new file mode 100644 index 00000000000..ea350640341 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql @@ -0,0 +1,5 @@ +CREATE TABLE `fortune` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `message` varchar(2048) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql b/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql new file mode 100644 index 00000000000..d454446535d --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql @@ -0,0 +1,5 @@ +CREATE TABLE `world` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `randomNumber` int NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h new file mode 100644 index 00000000000..390c6cb8f46 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -0,0 +1,2556 @@ +#ifndef ORM_DEFAULT_FORTUNEBASEMATA_H +#define ORM_DEFAULT_FORTUNEBASEMATA_H +/* +*This file is auto create from cli +*本文件为自动生成 Sun, 21 Jan 2024 08:50:49 GMT +***/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mysql.h" +namespace orm { + + +struct fortunebase +{ + struct meta{ + unsigned int id= 0; // + std::string message=""; // + } data; + std::vector record; +std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . +std::vector _keypos{0x00}; +MYSQL_ROW _row; +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } +const std::array colnames={"id","message"}; +const std::array colnamestype= {3,253}; +std::string tablename="fortune"; +std::string modelname="Fortune"; + + unsigned char findcolpos(const std::string &coln){ + if(coln.size()==0) + { + return 255; + } + unsigned char bi=coln[0]; + + + if(bi<91&&bi>64){ + bi+=32; + } + switch(coln[0]){ + + + case 'i': + return 0; +break; +case 'm': + return 1; +break; + + } + return 255; + } + + int size(){ return record.size(); } + + std::string getPKname(){ + return "id"; +} + + void record_reset() + { + record.clear(); + } + void data_reset(){ + fortunebase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ + std::string temp; + + return temp; + } + void _setColnamevalue() + { + for(unsigned char i=0;i<_keypos.size();i++) + { + switch(_keypos[i]){ + case 0: + try{ + data.id=std::stoul(_row[i]); + }catch (...) { + data.id=0; + } + break; + case 1: + try{ + data.message.append((_row[i]==NULL?"":_row[i])); + }catch (...) { + data.message.clear(); + } + break; + default: + { } + + + } + + if(i>210){ + break; + } + } + } + void _addnewrowvalue(){ + fortunebase::meta metatemp; + + for(unsigned char i=0;i<_keypos.size();i++){ + + switch(_keypos[i]){ + + case 0: + try{ + metatemp.id=std::stoul(_row[i]); + }catch (...) { + metatemp.id=0; + } + break; + case 1: + try{ + metatemp.message.append((_row[i]==NULL?"":_row[i])); + }catch (...) { + metatemp.message.clear(); + } + break; + default: + { } + + + } + if(i>210){ + break; + } + } + record.emplace_back(std::move(metatemp)); + } + + inline std::string stringaddslash(std::string &content){ + std::string temp; + for(unsigned int i=0;i0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(data.id==0){ +tempsql<<"null"; + }else{ + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(insert_data.id==0){ +tempsql<<"null"; + }else{ + tempsql< &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES "; + + for(unsigned int i=0;i0) + { + tempsql<<","; + } + tempsql<<"("; + + + if(insert_data[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< keypos; + for(;jj0){ + unsigned char bpos_i=findcolpos(keyname); + #ifdef DEBUG + if (bpos_i == 254) + { + std::cout << "\033[1m\033[31m-----------\n" + << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" + << std::endl; + } +#endif + keypos.emplace_back(bpos_i); + keyname.clear(); + } + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"`id`=0"; + }else{ + tempsql<<"`id`="<0){ tempsql<<","; } +tempsql<<"`message`='"< data_toarray(std::string fileld=""){ + std::vector temparray; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj data_tomap(std::string fileld=""){ + std::map tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< list_content; + for(;json_offset0) + { + data=metatemp; + } + if(json_offset>=json_content.size()) + { + break; + } + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset1) + { + data=record[0]; + } + } + else + { + if(json_content[json_offset]=='{') + { + json_offset+=1; + std::string json_key_name,json_value_name; + + + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< func,std::string fileld=""){ + std::ostringstream tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< getRecord(){ + return record; +} + + + template::value,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="message") + { + return data.message; + } + return nullptr; + } + + + template,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="id") + { + return data.id; + } + return nullptr; + } + + + template,bool>::type = true > + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + case 0: + a.emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + return a; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + case 0: + return data.id; + break; + } + return 0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] fortunebase::meta & iter,[[maybe_unused]] std::string keyname) + { + + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + case 0: + return iter.id; + break; + + } + + return 0; + } + + template,bool>::type = true > + T getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + + + return 0.0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + } + + + + return 0.0; + } + + template::value,bool>::type = true > + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + case 1: + return data.message; + break; + + } + return ""; + } + + template::value,bool>::type = true > + std::string getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + case 1: + return iter.message; + break; + + } + + + + return ""; + } + + template::value,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + a.emplace_back(iter.message); + break; + } + } + + return a; + } + + std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) + { + std::ostringstream a; + + unsigned char kpos; + kpos=findcolpos(keyname); + int j=0; + if(isyinhao&&record.size()>0) + { + a<<'"'; + } + for(auto &iter:record) + { + if(j>0) + { + if(isyinhao) + { + a<<"\",\""; + }else{ + a<<','; + } + } + switch(kpos) + { + + case 0: + a<0){ + a<<'"'; + } + + return a.str(); + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp,vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + + return a; + } + + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + std::string vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace(iter.id,iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + a.emplace(iter.message,iter); + break; + + } + //a.emplace(ktemp,iter); + } + + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ +case 1: + vtemp=iter.message; + break; + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace_back(iter.id,iter); + break; + + } + } + + return a; + } + template::value,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + a.emplace_back(iter.message,iter); + break; + + } + } + + + return a; + } + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + a[ktemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + + } + } + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + a[ktemp].emplace_back(iter.message); + break; + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a[iter.id].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + a[iter.message].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; + + } + } + + return a; + } + + }; + + +} +#endif + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h new file mode 100644 index 00000000000..312571481d7 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -0,0 +1,2370 @@ +#ifndef ORM_DEFAULT_WORLDBASEMATA_H +#define ORM_DEFAULT_WORLDBASEMATA_H +/* +*This file is auto create from cli +*本文件为自动生成 Sun, 21 Jan 2024 08:50:49 GMT +***/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mysql.h" +namespace orm { + + +struct worldbase +{ + struct meta{ + unsigned int id= 0; // + int randomnumber= 0; // + } data; + std::vector record; +std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . +std::vector _keypos{0x00}; +MYSQL_ROW _row; +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } +const std::array colnames={"id","randomnumber"}; +const std::array colnamestype= {3,3}; +std::string tablename="world"; +std::string modelname="World"; + + unsigned char findcolpos(const std::string &coln){ + if(coln.size()==0) + { + return 255; + } + unsigned char bi=coln[0]; + + + if(bi<91&&bi>64){ + bi+=32; + } + switch(coln[0]){ + + + case 'i': + return 0; +break; +case 'r': + return 1; +break; + + } + return 255; + } + + int size(){ return record.size(); } + + std::string getPKname(){ + return "id"; +} + + void record_reset() + { + record.clear(); + } + void data_reset(){ + worldbase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ + std::string temp; + + return temp; + } + void _setColnamevalue() + { + for(unsigned char i=0;i<_keypos.size();i++) + { + switch(_keypos[i]){ + case 0: + try{ + data.id=std::stoul(_row[i]); + }catch (...) { + data.id=0; + } + break; + case 1: + try{ + data.randomnumber=std::stoi(_row[i]); + }catch (...) { + data.randomnumber=0; + } + break; + default: + { } + + + } + + if(i>210){ + break; + } + } + } + void _addnewrowvalue(){ + worldbase::meta metatemp; + + for(unsigned char i=0;i<_keypos.size();i++){ + + switch(_keypos[i]){ + + case 0: + try{ + metatemp.id=std::stoul(_row[i]); + }catch (...) { + metatemp.id=0; + } + break; + case 1: + try{ + metatemp.randomnumber=std::stoi(_row[i]); + }catch (...) { + metatemp.randomnumber=0; + } + break; + default: + { } + + + } + if(i>210){ + break; + } + } + record.emplace_back(std::move(metatemp)); + } + + inline std::string stringaddslash(std::string &content){ + std::string temp; + for(unsigned int i=0;i0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(data.id==0){ +tempsql<<"null"; + }else{ + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(insert_data.id==0){ +tempsql<<"null"; + }else{ + tempsql< &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES "; + + for(unsigned int i=0;i0) + { + tempsql<<","; + } + tempsql<<"("; + + + if(insert_data[i].id==0){ + tempsql<<"null"; + }else{ + tempsql<0){ + unsigned char bpos_i=findcolpos(keyname); + #ifdef DEBUG + if (bpos_i == 254) + { + std::cout << "\033[1m\033[31m-----------\n" + << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" + << std::endl; + } +#endif + keypos.emplace_back(bpos_i); + keyname.clear(); + } + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"`id`=0"; + }else{ + tempsql<<"`id`="<0){ tempsql<<","; } +if(data.randomnumber==0){ + tempsql<<"`randomnumber`=0"; + }else{ + tempsql<<"`randomnumber`="< data_toarray(std::string fileld=""){ + std::vector temparray; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj data_tomap(std::string fileld=""){ + std::map tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(data.randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< list_content; + for(;json_offset0) + { + data=metatemp; + } + if(json_offset>=json_content.size()) + { + break; + } + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset1) + { + data=record[0]; + } + } + else + { + if(json_content[json_offset]=='{') + { + json_offset+=1; + std::string json_key_name,json_value_name; + + + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(record[n].randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< func,std::string fileld=""){ + std::ostringstream tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(record[n].randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< getRecord(){ + return record; +} + + + template::value,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + + template,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="id") + { + return data.id; + } + if(key_name=="randomnumber") + { + return data.randomnumber; + } + return nullptr; + } + + + template,bool>::type = true > + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + case 0: + a.emplace_back(iter.id); + break; + case 1: + a.emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + return a; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + case 0: + return data.id; + break; + case 1: + return data.randomnumber; + break; + } + return 0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] worldbase::meta & iter,[[maybe_unused]] std::string keyname) + { + + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + case 0: + return iter.id; + break; + case 1: + return iter.randomnumber; + break; + + } + + return 0; + } + + template,bool>::type = true > + T getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + + + return 0.0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + } + + + + return 0.0; + } + + template::value,bool>::type = true > + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + return ""; + } + + template::value,bool>::type = true > + std::string getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + + + + return ""; + } + + template::value,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + + return a; + } + + std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) + { + std::ostringstream a; + + unsigned char kpos; + kpos=findcolpos(keyname); + int j=0; + if(isyinhao&&record.size()>0) + { + a<<'"'; + } + for(auto &iter:record) + { + if(j>0) + { + if(isyinhao) + { + a<<"\",\""; + }else{ + a<<','; + } + } + switch(kpos) + { + + case 0: + a<0){ + a<<'"'; + } + + return a.str(); + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; +case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + std::string vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace(iter.id,iter); + break; + case 1: + a.emplace(iter.randomnumber,iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + + switch(kpos) + { + + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + return a; + } + + template,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace_back(iter.id,iter); + break; +case 1: + a.emplace_back(iter.randomnumber,iter); + break; + + } + } + + return a; + } + template::value,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + + return a; + } + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + } + + switch(dpos){ + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + } + + switch(dpos){ + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + return a; + } + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a[iter.id].emplace_back(iter); + break; + case 1: + a[iter.randomnumber].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + + } + } + + return a; + } + + }; + + +} +#endif + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h new file mode 100644 index 00000000000..816b9ae4dc9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h @@ -0,0 +1,4 @@ +/*build this file time Tue, 20 Dec 2022 11:40:56 GMT*/ + +#include "Fortune.h" +#include "World.h" 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 0361/1766] 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 0362/1766] 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 0363/1766] 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 0364/1766] 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 0cec4c592fea0034b5dc331a6fe3a8c8aff30376 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 1 Mar 2024 20:29:01 +0100 Subject: [PATCH 0365/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 2 +- frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 3debf65bace..9714488c038 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.4.7" + hexagonVersion = "3.5.0" jettyVersion = "12.0.5" nettyVersion = "4.1.107.Final" 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 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 0366/1766] 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 0367/1766] 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 0368/1766] 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 6bcabf3f8fc8a6a373d358e5b4f49b4ff7d254fb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 9 Mar 2024 12:52:08 +0100 Subject: [PATCH 0369/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 6 +++--- frameworks/Kotlin/hexagon/gradlew.bat | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 9714488c038..cb67a8d98a9 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.22" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.23" apply false id "org.graalvm.buildtools.native" version "0.10.1" apply false } @@ -10,12 +10,12 @@ group = "com.hexagonkt" ext { hexagonVersion = "3.5.0" - jettyVersion = "12.0.5" + jettyVersion = "12.0.7" nettyVersion = "4.1.107.Final" hikariVersion = "5.1.0" postgresqlVersion = "42.7.2" - vertxVersion = "4.5.3" + vertxVersion = "4.5.4" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" 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 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 0370/1766] 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 0371/1766] 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 0372/1766] 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 0373/1766] 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 0374/1766] 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 0375/1766] 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 0376/1766] 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 0377/1766] 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 0378/1766] 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 0379/1766] 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 0380/1766] 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 0381/1766] 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 0382/1766] 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 0383/1766] 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 cc6e87eb3e06298397353f073bc374c913df97a8 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Fri, 15 Mar 2024 17:06:59 +0100 Subject: [PATCH 0384/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index cb67a8d98a9..0f7a08ea68f 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -14,8 +14,8 @@ ext { nettyVersion = "4.1.107.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.7.2" - vertxVersion = "4.5.4" + postgresqlVersion = "42.7.3" + vertxVersion = "4.5.5" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" From 1a847a17ce5dd4afc30a034f923eb1a8f60b4361 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sun, 17 Mar 2024 22:27:38 +0100 Subject: [PATCH 0385/1766] Update Hexagon version --- frameworks/Kotlin/hexagon/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 0f7a08ea68f..9279d3b38fd 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.5.0" + hexagonVersion = "3.5.1" jettyVersion = "12.0.7" nettyVersion = "4.1.107.Final" 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 0386/1766] 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 0387/1766] 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 0388/1766] 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 0389/1766] 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 0390/1766] 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 0391/1766] [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 0392/1766] 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 0393/1766] 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 0394/1766] 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 0395/1766] 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 0396/1766] [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 0397/1766] 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 0398/1766] 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 0399/1766] [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 0400/1766] 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 0401/1766] 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 0402/1766] 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 0403/1766] 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 0404/1766] [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 0405/1766] 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 From adcfa63f39ab9893a785c67bacd2dcedd36d9c16 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Wed, 3 Apr 2024 13:23:45 +0800 Subject: [PATCH 0406/1766] upgrade smart-servlet to 1.0-SNAPSHOT --- frameworks/Java/smart-socket/pom.xml | 2 +- .../src/main/java/org/smartboot/http/JsonUtil.java | 2 +- .../java/org/smartboot/servlet/HelloWorldServlet.java | 8 ++++---- .../src/main/java/org/smartboot/servlet/JsonServlet.java | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index b95e7d71c52..376f82878f7 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 17 17 2.17.1 - 0.6-SNAPSHOT + 1.0-SNAPSHOT 5.0.0 0.9.23 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 b20525ec571..5c46d0ca5ef 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 @@ -4,9 +4,9 @@ import com.jsoniter.output.JsonStreamPool; import com.jsoniter.spi.JsonException; 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; /** 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 c3900de716c..6ac97cc7606 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,10 +1,10 @@ package org.smartboot.servlet; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** 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 064bc80556d..e484da19fc3 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; /** From 9f24f6e1a8736c0fba426098bfeb9735ffad0e50 Mon Sep 17 00:00:00 2001 From: carrot <149851+lopcode@users.noreply.github.com> Date: Thu, 4 Apr 2024 18:17:24 +0100 Subject: [PATCH 0407/1766] Update Pellet runtime JVM to 22 (#8827) --- frameworks/Kotlin/pellet/pellet.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/pellet/pellet.dockerfile b/frameworks/Kotlin/pellet/pellet.dockerfile index f57e433dcd6..3600569ea35 100644 --- a/frameworks/Kotlin/pellet/pellet.dockerfile +++ b/frameworks/Kotlin/pellet/pellet.dockerfile @@ -4,7 +4,7 @@ COPY sample/build.gradle.kts build.gradle.kts COPY sample/src src RUN gradle clean shadowJar --no-daemon -FROM openjdk:21-jdk-buster +FROM openjdk:22-jdk-buster WORKDIR /sample COPY --from=gradle /sample/build/libs/sample-1.0.0-all.jar app.jar From 292e7a48d18599ecd489dd234df572b707dcaa19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 5 Apr 2024 01:23:52 +0800 Subject: [PATCH 0408/1766] update smart-servlet to 1.0-SNAPSHOT (#8833) 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 * upgrade smart-servlet to 1.0-SNAPSHOT --- frameworks/Java/smart-socket/pom.xml | 2 +- .../src/main/java/org/smartboot/http/JsonUtil.java | 2 +- .../java/org/smartboot/servlet/HelloWorldServlet.java | 8 ++++---- .../src/main/java/org/smartboot/servlet/JsonServlet.java | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index b95e7d71c52..376f82878f7 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 17 17 2.17.1 - 0.6-SNAPSHOT + 1.0-SNAPSHOT 5.0.0 0.9.23 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 b20525ec571..5c46d0ca5ef 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 @@ -4,9 +4,9 @@ import com.jsoniter.output.JsonStreamPool; import com.jsoniter.spi.JsonException; 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; /** 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 c3900de716c..6ac97cc7606 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,10 +1,10 @@ package org.smartboot.servlet; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** 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 064bc80556d..e484da19fc3 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; /** From 10ba7ee5abdcea41c2607f85642ba09e94419f35 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Fri, 5 Apr 2024 01:25:13 +0800 Subject: [PATCH 0409/1766] [xitca-web] fix wasi build (#8828) * [xitca-web] fix wasm build. * fix config. --- frameworks/Rust/xitca-web/.cargo/config.toml | 2 +- frameworks/Rust/xitca-web/Cargo.lock | 104 ++++++++++-------- frameworks/Rust/xitca-web/Cargo.toml | 4 +- frameworks/Rust/xitca-web/src/ser.rs | 2 +- .../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 | 4 +- .../Rust/xitca-web/xitca-web.dockerfile | 2 +- 9 files changed, 68 insertions(+), 56 deletions(-) diff --git a/frameworks/Rust/xitca-web/.cargo/config.toml b/frameworks/Rust/xitca-web/.cargo/config.toml index bca4c6c1b26..7d3c09f8a1a 100644 --- a/frameworks/Rust/xitca-web/.cargo/config.toml +++ b/frameworks/Rust/xitca-web/.cargo/config.toml @@ -2,5 +2,5 @@ rustflags = ["-C", "target-cpu=native"] incremental = false -[target.wasm32-wasi-preview1-threads] +[target.wasm32-wasip1-threads] rustflags = ["-C", "target-feature=+simd128", "--cfg", "tokio_unstable"] diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index fd001345246..c26187480b2 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.77" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", @@ -39,15 +39,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "axum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" dependencies = [ "async-trait", "axum-core", @@ -67,7 +67,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.0", "tower", "tower-layer", "tower-service", @@ -88,16 +88,16 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper", + "sync_wrapper 0.1.2", "tower-layer", "tower-service", ] [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -122,9 +122,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" @@ -143,9 +143,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" @@ -180,11 +180,11 @@ dependencies = [ [[package]] name = "diesel" -version = "2.1.4" +version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" +checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "byteorder", "diesel_derives", "itoa", @@ -194,9 +194,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8337737574f55a468005a83499da720f20c65586241ffea339db9ecdfd2b44" +checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" dependencies = [ "diesel_table_macro_syntax", "proc-macro2", @@ -361,12 +361,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -396,9 +396,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "itoap" @@ -446,9 +446,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mime" @@ -467,8 +467,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" -source = "git+https://github.com/fakeshadow/mio.git?rev=52b72d372bfe5807755b7f5e3e1edf282954d6ba#52b72d372bfe5807755b7f5e3e1edf282954d6ba" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -566,9 +567,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -622,9 +623,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -785,9 +786,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -796,9 +797,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ "itoa", "serde", @@ -847,9 +848,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -890,9 +891,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.52" +version = "2.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "11a6ae1e52eb25aab8f3fb9fca13be982a373b8f1157ca14b897a825ba4a2d35" dependencies = [ "proc-macro2", "quote", @@ -905,6 +906,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384595c11a4e2969895cad5a8c4029115f5ab956a9e5ef4de79d11a426e5f20c" + [[package]] name = "tinyvec" version = "1.6.0" @@ -922,9 +929,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "libc", @@ -972,7 +979,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "bytes", "http", "http-body", @@ -1247,9 +1254,9 @@ dependencies = [ [[package]] name = "xitca-io" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7581c12bcd8b2194271da2117926a577e4e974ab840c7a3f61cc187a249335c8" +checksum = "15e3340548aec525e517557432502238ed86ae69b6fc1eed851693773516b399" dependencies = [ "bytes", "tokio", @@ -1260,7 +1267,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=13a28c51a2f6e23e4e6b96e508a8af1e5e79d0b6#13a28c51a2f6e23e4e6b96e508a8af1e5e79d0b6" +source = "git+https://github.com/HFQR/xitca-web.git?rev=d76b2e188edcbdd801ecb4a7359b4d56070d6dc4#d76b2e188edcbdd801ecb4a7359b4d56070d6dc4" dependencies = [ "fallible-iterator", "percent-encoding", @@ -1358,3 +1365,8 @@ dependencies = [ "xitca-service", "xitca-unsafe-collection", ] + +[[patch.unused]] +name = "mio" +version = "1.0.0" +source = "git+https://github.com/fakeshadow/mio.git?rev=dcc85ea7a3af3159efdf7e3a17b3a8b58131a15f#dcc85ea7a3af3159efdf7e3a17b3a8b58131a15f" diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 8717e681c50..9911115fb58 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -92,5 +92,5 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "13a28c51a2f6e23e4e6b96e508a8af1e5e79d0b6" } -mio = { git = "https://github.com/fakeshadow/mio.git", rev = "52b72d372bfe5807755b7f5e3e1edf282954d6ba" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "d76b2e188edcbdd801ecb4a7359b4d56070d6dc4" } +mio = { git = "https://github.com/fakeshadow/mio.git", rev = "dcc85ea7a3af3159efdf7e3a17b3a8b58131a15f" } diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index 8e15ce71671..ca1c56caf70 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -173,6 +173,6 @@ where { serde_json::to_writer(BufMutWriter(buf), value)?; let mut res = req.into_response(buf.split().freeze()); - res.headers_mut().append(CONTENT_TYPE, JSON); + res.headers_mut().insert(CONTENT_TYPE, JSON); Ok(res) } diff --git a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile index 6c0422ea4ff..84a8606c1bc 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.76 +FROM rust:1.77 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 35e53b29db8..913fbfc075c 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.76 +FROM rust:1.77 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 93f848de2ec..5e71fa5d649 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.76 +FROM rust:1.77 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 d5611eb092d..51aa96fd4eb 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 +ARG WASM_TARGET=wasm32-wasip1-threads -FROM rust:1.76 AS compile +FROM rust:1.77 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 88ff778663c..bed37320e72 100644 --- a/frameworks/Rust/xitca-web/xitca-web.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.76 +FROM rust:1.77 ADD ./ /xitca-web WORKDIR /xitca-web From 48100f00dc7d661148a8764547c824bff582cec4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:41:32 +0000 Subject: [PATCH 0410/1766] Bump whoami from 1.1.3 to 1.5.1 in /frameworks/Rust/warp-rust Bumps [whoami](https://github.com/ardaku/whoami) from 1.1.3 to 1.5.1. - [Changelog](https://github.com/ardaku/whoami/blob/v1/CHANGELOG.md) - [Commits](https://github.com/ardaku/whoami/compare/v1.1.3...v1.5.1) --- updated-dependencies: - dependency-name: whoami dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/warp-rust/Cargo.lock | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/frameworks/Rust/warp-rust/Cargo.lock b/frameworks/Rust/warp-rust/Cargo.lock index fbd9a71340e..abf2a98b4a9 100644 --- a/frameworks/Rust/warp-rust/Cargo.lock +++ b/frameworks/Rust/warp-rust/Cargo.lock @@ -1179,7 +1179,7 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.10", "smallvec", "winapi", ] @@ -1345,6 +1345,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.4.0" @@ -1352,7 +1361,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ "getrandom", - "redox_syscall", + "redox_syscall 0.2.10", ] [[package]] @@ -1805,7 +1814,7 @@ dependencies = [ "cfg-if", "libc", "rand", - "redox_syscall", + "redox_syscall 0.2.10", "remove_dir_all", "winapi", ] @@ -2249,6 +2258,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.76" @@ -2334,11 +2349,12 @@ dependencies = [ [[package]] name = "whoami" -version = "1.1.3" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7741161a40200a867c96dfa5574544efa4178cf4c8f770b62dd1cc0362d7ae1" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "wasm-bindgen", + "redox_syscall 0.4.1", + "wasite", "web-sys", ] From a446e24bb2a324ebf67046ae49a11ac3d8897c5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:46:50 +0000 Subject: [PATCH 0411/1766] Bump whoami from 1.4.1 to 1.5.1 in /frameworks/Rust/trillium Bumps [whoami](https://github.com/ardaku/whoami) from 1.4.1 to 1.5.1. - [Changelog](https://github.com/ardaku/whoami/blob/v1/CHANGELOG.md) - [Commits](https://github.com/ardaku/whoami/compare/v1.4.1...v1.5.1) --- updated-dependencies: - dependency-name: whoami dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/trillium/Cargo.lock | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index ab1aceee5e0..007f4d2cef4 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -2638,6 +2638,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.91" @@ -2716,9 +2722,13 @@ dependencies = [ [[package]] name = "whoami" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +dependencies = [ + "redox_syscall", + "wasite", +] [[package]] name = "winapi" From 39786923c6bd8fe22f4c82f8a758b84c375251fb Mon Sep 17 00:00:00 2001 From: LLT21 <43903768+LLT21@users.noreply.github.com> Date: Fri, 5 Apr 2024 18:15:14 +0200 Subject: [PATCH 0412/1766] Increase max number of connections + write plaintext synchronously (#8829) * New versions * Synchronous plaintext generation * Write byte array * Increase number of connections * Determine string length dynamically --------- Co-authored-by: LLT21 Co-authored-by: LLT21 <> --- frameworks/CSharp/appmpower/src/Data/DbConnection.cs | 5 +---- frameworks/CSharp/appmpower/src/Data/DbConnections.cs | 2 +- frameworks/CSharp/appmpower/src/HttpApplication.cs | 3 ++- frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs | 11 +++++++++++ frameworks/CSharp/appmpower/src/Program.cs | 1 + frameworks/CSharp/appmpower/src/appMpower.csproj | 2 +- 6 files changed, 17 insertions(+), 7 deletions(-) diff --git a/frameworks/CSharp/appmpower/src/Data/DbConnection.cs b/frameworks/CSharp/appmpower/src/Data/DbConnection.cs index 31dc5a783dc..916e251a9c8 100644 --- a/frameworks/CSharp/appmpower/src/Data/DbConnection.cs +++ b/frameworks/CSharp/appmpower/src/Data/DbConnection.cs @@ -142,10 +142,7 @@ public void Dispose() public async Task OpenAsync() { -#if ADO && SQLSERVER - _internalConnection = new(); - _internalConnection.DbConnection = new System.Data.SqlClient.SqlConnection(_connectionString); -#elif ADO && POSTGRESQL +#if ADO && POSTGRESQL _internalConnection = new(); _internalConnection.DbConnection = new Npgsql.NpgsqlConnection(_connectionString); #else diff --git a/frameworks/CSharp/appmpower/src/Data/DbConnections.cs b/frameworks/CSharp/appmpower/src/Data/DbConnections.cs index d7658b41ebe..0b513a3d47f 100644 --- a/frameworks/CSharp/appmpower/src/Data/DbConnections.cs +++ b/frameworks/CSharp/appmpower/src/Data/DbConnections.cs @@ -7,7 +7,7 @@ public static class DbConnections { private static bool _connectionsCreated = false; private static short _createdConnections = 0; - private static short _maxConnections = 250; + private static short _maxConnections = 500; private static ConcurrentStack _stack = new(); private static ConcurrentQueue> _waitingQueue = new(); diff --git a/frameworks/CSharp/appmpower/src/HttpApplication.cs b/frameworks/CSharp/appmpower/src/HttpApplication.cs index b7d8048692f..1eac250ede5 100644 --- a/frameworks/CSharp/appmpower/src/HttpApplication.cs +++ b/frameworks/CSharp/appmpower/src/HttpApplication.cs @@ -35,7 +35,8 @@ public async Task ProcessRequestAsync(IFeatureCollection featureCollection) if (pathStringLength == 10 && pathStringStart == "p") { - await PlainText.RenderAsync(httpResponse.Headers, httpResponseBody.Writer, _plainText); + //await PlainText.RenderAsync(httpResponse.Headers, httpResponseBody.Writer, _plainText); + PlainText.Render(httpResponse.Headers, httpResponseBody, _plainText); return; } else if (pathStringLength == 5 && pathStringStart == "j") diff --git a/frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs b/frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs index cff1d028b23..e7ead33aa2e 100644 --- a/frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs +++ b/frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs @@ -4,6 +4,7 @@ using System.IO.Pipelines; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; +using Microsoft.AspNetCore.Http.Features; namespace appMpower.Kestrel { @@ -23,5 +24,15 @@ public static async Task RenderAsync(IHeaderDictionary headerDictionary, PipeWri await pipeWriter.WriteAsync(utf8String); pipeWriter.Complete(); } + + public static void Render(IHeaderDictionary headerDictionary, IHttpResponseBodyFeature httpResponseBodyFeature, byte[] utf8String) + { + headerDictionary.Add(_headerServer); + headerDictionary.Add(_headerContentType); + int length = utf8String.Length; + headerDictionary.Add(new KeyValuePair("Content-Length", length.ToString())); + + httpResponseBodyFeature.Stream.Write(utf8String, 0, length); + } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Program.cs b/frameworks/CSharp/appmpower/src/Program.cs index 5647ac9b787..6e748b08497 100644 --- a/frameworks/CSharp/appmpower/src/Program.cs +++ b/frameworks/CSharp/appmpower/src/Program.cs @@ -19,6 +19,7 @@ static async Task Main(string[] args) var kestrelServerOptions = new KestrelServerOptions(); kestrelServerOptions.Listen(IPAddress.Any, 8080); + kestrelServerOptions.AllowSynchronousIO = true; kestrelServerOptions.AddServerHeader = false; using var kestrelServer = new KestrelServer(Options.Create(kestrelServerOptions), socketTransportFactory, NullLoggerFactory.Instance); diff --git a/frameworks/CSharp/appmpower/src/appMpower.csproj b/frameworks/CSharp/appmpower/src/appMpower.csproj index 14258de5d67..579c54883b5 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.csproj +++ b/frameworks/CSharp/appmpower/src/appMpower.csproj @@ -43,7 +43,7 @@ - + From cfac0e28fcd46ae5d291285ef3ebb8a9c0a36b7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:15:21 +0000 Subject: [PATCH 0413/1766] Bump h2 from 0.3.24 to 0.3.26 in /frameworks/Rust/rocket Bumps [h2](https://github.com/hyperium/h2) from 0.3.24 to 0.3.26. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.26/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.24...v0.3.26) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/rocket/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index b22dcf8b1f9..ecc45fb37b4 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -677,9 +677,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", From 88d710fbdcd9e7d7e0d1809fd98518c4a21c5c60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:19:11 +0000 Subject: [PATCH 0414/1766] Bump whoami from 1.3.0 to 1.5.1 in /frameworks/Rust/rocket Bumps [whoami](https://github.com/ardaku/whoami) from 1.3.0 to 1.5.1. - [Changelog](https://github.com/ardaku/whoami/blob/v1/CHANGELOG.md) - [Commits](https://github.com/ardaku/whoami/compare/v1.3.0...v1.5.1) --- updated-dependencies: - dependency-name: whoami dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/rocket/Cargo.lock | 32 +++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index ecc45fb37b4..29378a41cca 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -471,7 +471,7 @@ checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "windows-sys", ] @@ -1253,7 +1253,7 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "winapi 0.3.9", ] @@ -1266,7 +1266,7 @@ checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "windows-sys", ] @@ -1480,6 +1480,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.4.3" @@ -1487,7 +1496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", - "redox_syscall", + "redox_syscall 0.2.16", "thiserror", ] @@ -2071,7 +2080,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "remove_dir_all", "winapi 0.3.9", ] @@ -2459,6 +2468,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.83" @@ -2544,11 +2559,12 @@ dependencies = [ [[package]] name = "whoami" -version = "1.3.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45dbc71f0cdca27dc261a9bd37ddec174e4a0af2b900b890f378460f745426e3" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "wasm-bindgen", + "redox_syscall 0.4.1", + "wasite", "web-sys", ] From df309902ae5a313d4f9aea3b8218df3abc252a08 Mon Sep 17 00:00:00 2001 From: CypherPotato Date: Tue, 9 Apr 2024 02:07:29 -0300 Subject: [PATCH 0415/1766] update sisk to v0.16.2-beta1 --- frameworks/CSharp/sisk/sisk/sisk.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/sisk/sisk/sisk.csproj b/frameworks/CSharp/sisk/sisk/sisk.csproj index 624dd50d4a3..335ebe0e3a1 100644 --- a/frameworks/CSharp/sisk/sisk/sisk.csproj +++ b/frameworks/CSharp/sisk/sisk/sisk.csproj @@ -9,7 +9,7 @@ - + From 69d6e8ac85197c6d9d347ce0ec6ac6958f1ad781 Mon Sep 17 00:00:00 2001 From: CypherPotato Date: Tue, 9 Apr 2024 02:25:16 -0300 Subject: [PATCH 0416/1766] fix prev commit --- frameworks/CSharp/sisk/sisk/sisk.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/sisk/sisk/sisk.csproj b/frameworks/CSharp/sisk/sisk/sisk.csproj index 335ebe0e3a1..7aa39fc67ee 100644 --- a/frameworks/CSharp/sisk/sisk/sisk.csproj +++ b/frameworks/CSharp/sisk/sisk/sisk.csproj @@ -9,7 +9,7 @@ - + From d71b70a41e2d0cc274dfad08e6dd5f4f1ac0b8a0 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 9 Apr 2024 18:44:28 +0200 Subject: [PATCH 0417/1766] [lua] Update to Openresty/1.25.3.1 (#8844) --- frameworks/Lua/openresty/openresty.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Lua/openresty/openresty.dockerfile b/frameworks/Lua/openresty/openresty.dockerfile index 1777000e241..83283446c19 100644 --- a/frameworks/Lua/openresty/openresty.dockerfile +++ b/frameworks/Lua/openresty/openresty.dockerfile @@ -1,4 +1,4 @@ -FROM openresty/openresty:1.19.9.1-focal +FROM openresty/openresty:1.25.3.1-2-jammy ADD ./nginx.conf /openresty/ ADD ./app.lua /openresty/ From 57e4811262074049fb5e427e8dd82bf2701155dc Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Tue, 9 Apr 2024 22:14:53 +0530 Subject: [PATCH 0418/1766] upgrade Deno to v1.42.1 (#8842) * upgrade Deno to v1.41.2 * Update deno.dockerfile --- frameworks/TypeScript/deno/deno.dockerfile | 4 ++-- frameworks/TypeScript/deno/src/main.ts | 27 ++++++++-------------- frameworks/TypeScript/deno/src/spawn.ts | 13 +++++++++++ 3 files changed, 25 insertions(+), 19 deletions(-) create mode 100644 frameworks/TypeScript/deno/src/spawn.ts diff --git a/frameworks/TypeScript/deno/deno.dockerfile b/frameworks/TypeScript/deno/deno.dockerfile index 0fccdf30e5a..bd98d179541 100644 --- a/frameworks/TypeScript/deno/deno.dockerfile +++ b/frameworks/TypeScript/deno/deno.dockerfile @@ -1,4 +1,4 @@ -FROM denoland/deno:1.36.4 +FROM denoland/deno:1.42.1 EXPOSE 8080 @@ -12,4 +12,4 @@ RUN deno cache main.ts EXPOSE 8080 -CMD ["run", "--allow-net", "--unstable", "main.ts"] +CMD ["run", "-A", "--unstable-net", "spawn.ts"] diff --git a/frameworks/TypeScript/deno/src/main.ts b/frameworks/TypeScript/deno/src/main.ts index da62d6dfae6..347e7f4c1a8 100644 --- a/frameworks/TypeScript/deno/src/main.ts +++ b/frameworks/TypeScript/deno/src/main.ts @@ -1,24 +1,17 @@ -const options = { - // Date and Content-Type headers are automatically set. - headers: { - "Server": "Deno", - }, -}; - -type HandlerFn = (req: Request) => Promise | Response; - -const handlers: Record = { - "/json": () => Response.json({ message: "Hello, World!" }, options), - "/plaintext": () => new Response("Hello, World!", options), -}; +const HELLO_WORLD_STR = "Hello, World!"; +const options: ResponseInit = { headers: { "Server": "Deno" } }; Deno.serve({ + reusePort: true, handler: (req: Request) => { const path = req.url.slice(req.url.indexOf("/", 8)); - const fn = handlers[path]; - return fn - ? fn(req) - : new Response("404 Not Found", { status: 404, ...options }); + if (path == "/plaintext") { + return new Response(HELLO_WORLD_STR, options); + } else if (path == "/json") { + return Response.json({ message: HELLO_WORLD_STR }, options); + } else { + return new Response("404 Not Found", { status: 404, ...options }); + } }, onError(err) { console.error(err); diff --git a/frameworks/TypeScript/deno/src/spawn.ts b/frameworks/TypeScript/deno/src/spawn.ts new file mode 100644 index 00000000000..cc56c4543b6 --- /dev/null +++ b/frameworks/TypeScript/deno/src/spawn.ts @@ -0,0 +1,13 @@ +import os from "node:os"; +import process from "node:process"; + +const numCPUs = os.cpus().length; +for (let i = 0; i < numCPUs; i++) { + new Deno.Command(Deno.execPath(), { + args: ["run", "-A", "--unstable-net", "main.ts"], + stdin: "inherit", + stdout: "inherit", + stderr: "inherit", + env: { ...process.env }, + }).spawn(); +} From 59ee5aacd787c731854ae4ebcb66c6a155fe1061 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 9 Apr 2024 18:45:07 +0200 Subject: [PATCH 0419/1766] [php] Update unit to PHP/8.3 (#8843) --- frameworks/PHP/php/php-unit.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/php/php-unit.dockerfile b/frameworks/PHP/php/php-unit.dockerfile index fa37e1cb4a9..bddd4e15b4f 100644 --- a/frameworks/PHP/php/php-unit.dockerfile +++ b/frameworks/PHP/php/php-unit.dockerfile @@ -1,4 +1,4 @@ -FROM unit:1.30.0-php8.2 +FROM unit:php8.3 ADD . /php WORKDIR /php From 2765ca23f9d5d46f67f0fb367c0ff2b26771e9ef Mon Sep 17 00:00:00 2001 From: Chrislearn Young Date: Wed, 10 Apr 2024 00:45:29 +0800 Subject: [PATCH 0420/1766] Update salvo to 0.67 (#8846) * Update salvo to 0.67 * remove useless import --- frameworks/Rust/salvo/Cargo.toml | 6 +++--- 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 +- frameworks/Rust/salvo/src/main.rs | 4 ++-- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Rust/salvo/Cargo.toml b/frameworks/Rust/salvo/Cargo.toml index cbeaff5e350..0ac4ec76ee3 100644 --- a/frameworks/Rust/salvo/Cargo.toml +++ b/frameworks/Rust/salvo/Cargo.toml @@ -40,8 +40,8 @@ anyhow = "1" async-trait = "0.1" bytes = "1" diesel = { version = "2", features = ["postgres", "r2d2"] } -deadpool = { version = "0.10", features = ["rt_tokio_1", "serde", "async-trait", "managed"] } -deadpool-postgres = "0.11" +deadpool = { version = "0.11", features = ["rt_tokio_1", "serde", "managed"] } +deadpool-postgres = "0.13" futures-util = "0.3" lru = "0.12.0" markup = "0.15" @@ -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", "server", "http1", "affix"] } +salvo = { version = "0.67", default-features = false, features = ["anyhow", "server", "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 81a2dbaa0a8..a0bb3a12d8d 100644 --- a/frameworks/Rust/salvo/salvo-diesel.dockerfile +++ b/frameworks/Rust/salvo/salvo-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 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 8cb63d2c03e..f209991e939 100644 --- a/frameworks/Rust/salvo/salvo-lru.dockerfile +++ b/frameworks/Rust/salvo/salvo-lru.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 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 ca7a5c8b495..4219a6534c6 100644 --- a/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 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 77fccfa0a50..caac03db963 100644 --- a/frameworks/Rust/salvo/salvo-mongo.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 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 40947697908..13628c45050 100644 --- a/frameworks/Rust/salvo/salvo-pg-pool.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg-pool.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 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 b4c10866c21..0b5c075fb63 100644 --- a/frameworks/Rust/salvo/salvo-pg.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 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 d3d0f56080b..5866030195a 100644 --- a/frameworks/Rust/salvo/salvo-sqlx.dockerfile +++ b/frameworks/Rust/salvo/salvo-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 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 186f5d755ee..b0d748a60ab 100644 --- a/frameworks/Rust/salvo/salvo.dockerfile +++ b/frameworks/Rust/salvo/salvo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.77 ADD ./ /salvo WORKDIR /salvo diff --git a/frameworks/Rust/salvo/src/main.rs b/frameworks/Rust/salvo/src/main.rs index db6c6d704d0..1326a09b57c 100644 --- a/frameworks/Rust/salvo/src/main.rs +++ b/frameworks/Rust/salvo/src/main.rs @@ -4,7 +4,6 @@ use std::sync::Arc; use bytes::Bytes; -use salvo::conn::tcp::TcpAcceptor; use salvo::http::body::ResBody; use salvo::http::header::{self, HeaderValue}; use salvo::prelude::*; @@ -50,7 +49,8 @@ fn main() { } async fn serve(router: Arc) { - let acceptor: TcpAcceptor = utils::reuse_listener().unwrap().try_into().unwrap(); + // let acceptor: TcpAcceptor = utils::reuse_listener().unwrap().try_into().unwrap(); + let acceptor = TcpListener::new("0.0.0.0:8080").bind().await; let mut server = Server::new(acceptor); let http1 = server.http1_mut(); http1.pipeline_flush(true); From 53352ca373fd9d56275e51deec5cf6fb53e35529 Mon Sep 17 00:00:00 2001 From: David Denton Date: Tue, 9 Apr 2024 17:45:58 +0100 Subject: [PATCH 0421/1766] Upgrade http4k, gradle, java. Tweaks to PGclient implementation (#8845) * Update versions of gradle, http4k etc * Update versions of gradle in dockerfile * Downgrade pgclient * Upgrade pgclient * update postgres database for pgclient * tweak * tweak to postgres client --- frameworks/Kotlin/http4k/build.gradle.kts | 8 +-- .../Kotlin/http4k/core-jdbc/build.gradle.kts | 4 +- .../src/main/kotlin/PostgresDatabase.kt | 63 +++++++++---------- .../Kotlin/http4k/core/build.gradle.kts | 8 +-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../http4k/http4k-apache-graalvm.dockerfile | 2 +- .../Kotlin/http4k/http4k-apache.dockerfile | 2 +- .../Kotlin/http4k/http4k-apache4.dockerfile | 2 +- .../Kotlin/http4k/http4k-graalvm.dockerfile | 2 +- .../http4k/http4k-helidon-graalvm.dockerfile | 2 +- .../http4k/http4k-helidon-jdbc.dockerfile | 2 +- .../http4k/http4k-helidon-pgclient.dockerfile | 2 +- .../Kotlin/http4k/http4k-jetty.dockerfile | 2 +- .../Kotlin/http4k/http4k-jetty11.dockerfile | 2 +- .../http4k/http4k-jetty11loom-jdbc.dockerfile | 2 +- .../http4k-jetty11loom-pgclient.dockerfile | 2 +- .../http4k/http4k-jettyloom-jdbc.dockerfile | 2 +- .../http4k-jettyloom-pgclient.dockerfile | 2 +- .../Kotlin/http4k/http4k-ktorcio.dockerfile | 2 +- .../Kotlin/http4k/http4k-ktornetty.dockerfile | 2 +- .../Kotlin/http4k/http4k-netty.dockerfile | 2 +- .../Kotlin/http4k/http4k-ratpack.dockerfile | 2 +- .../http4k/http4k-sunhttploom.dockerfile | 2 +- .../Kotlin/http4k/http4k-undertow.dockerfile | 2 +- frameworks/Kotlin/http4k/http4k.dockerfile | 2 +- 25 files changed, 59 insertions(+), 66 deletions(-) diff --git a/frameworks/Kotlin/http4k/build.gradle.kts b/frameworks/Kotlin/http4k/build.gradle.kts index 954b08a5fbc..37e2ce6aca6 100644 --- a/frameworks/Kotlin/http4k/build.gradle.kts +++ b/frameworks/Kotlin/http4k/build.gradle.kts @@ -4,7 +4,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.js.translate.context.Namer.kotlin plugins { - kotlin("jvm") version "1.9.22" + kotlin("jvm") version "1.9.23" application } @@ -35,14 +35,14 @@ allprojects { } java { - sourceCompatibility = VERSION_20 - targetCompatibility = VERSION_20 + sourceCompatibility = VERSION_21 + targetCompatibility = VERSION_21 } tasks { withType { kotlinOptions { - jvmTarget = "20" + jvmTarget = "21" allWarningsAsErrors = true } } diff --git a/frameworks/Kotlin/http4k/core-jdbc/build.gradle.kts b/frameworks/Kotlin/http4k/core-jdbc/build.gradle.kts index 1aa1eb417b6..68e2916ec1a 100644 --- a/frameworks/Kotlin/http4k/core-jdbc/build.gradle.kts +++ b/frameworks/Kotlin/http4k/core-jdbc/build.gradle.kts @@ -1,5 +1,5 @@ dependencies { api(project(":core")) - api("com.zaxxer:HikariCP:5.0.1") - api("org.postgresql:postgresql:42.5.0") + api("com.zaxxer:HikariCP:5.1.0") + api("org.postgresql:postgresql:42.7.3") } diff --git a/frameworks/Kotlin/http4k/core-pgclient/src/main/kotlin/PostgresDatabase.kt b/frameworks/Kotlin/http4k/core-pgclient/src/main/kotlin/PostgresDatabase.kt index e9b55d4c177..377d72aff87 100644 --- a/frameworks/Kotlin/http4k/core-pgclient/src/main/kotlin/PostgresDatabase.kt +++ b/frameworks/Kotlin/http4k/core-pgclient/src/main/kotlin/PostgresDatabase.kt @@ -1,6 +1,4 @@ import io.vertx.core.Future -import io.vertx.core.Vertx -import io.vertx.core.VertxOptions import io.vertx.pgclient.PgConnectOptions import io.vertx.pgclient.PgPool.client import io.vertx.sqlclient.PoolOptions @@ -11,13 +9,7 @@ import java.util.Random class PostgresDatabase : Database { - private val queryPool: SqlClient - private val updatePool: SqlClient - - private val random = Random() - - init { - val vertx = Vertx.vertx(VertxOptions().setPreferNativeTransport(true)) + private val dbPool = run { val connectOptions = PgConnectOptions().apply { port = 5432 cachePreparedStatements = true @@ -26,52 +18,53 @@ class PostgresDatabase : Database { user = "benchmarkdbuser" password = "benchmarkdbpass" } - val clientOptions = PoolOptions().setMaxSize(64) - queryPool = client(vertx, connectOptions, clientOptions) - updatePool = client(vertx, connectOptions, clientOptions) + client(connectOptions, PoolOptions().apply { maxSize = 64 }) } - override fun findWorld() = - queryPool.findWorld(random.world()).toCompletionStage().toCompletableFuture().get() + private val random = Random() + + override fun findWorld() = dbPool.findWorld(random.world()) - override fun loadAll() = queryPool.preparedQuery("SELECT id, randomnumber FROM world ") + override fun loadAll() = dbPool.preparedQuery("SELECT id, randomnumber FROM world") .execute() .map { it.map(::toWorld) } - .toCompletionStage().toCompletableFuture().get() + .awaitComplete() - override fun findWorlds(count: Int) = - Future - .all( - (1..count).map { queryPool.findWorld(random.world()) } - ).toCompletionStage().toCompletableFuture().get().list() + override fun findWorlds(count: Int) = (1..count) + .map { dbPool.findWorld(random.world()) } - override fun updateWorlds(count: Int) = (1..count).map { - queryPool.findWorld(random.world()) - .flatMap { world -> - updatePool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2") - .execute(Tuple.of(random.world(), world.first)) - .map { world } + override fun updateWorlds(count: Int) = (1..count) + .map { World(random.world(), random.world()) } + .onEach { + dbPool + .preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1") + .execute(Tuple.of(it.first)) + .map { rowSet -> + val row = rowSet.iterator().next() + row.getInteger(1) + dbPool + .preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2") + .execute(Tuple.of(it.second, it.first)) } - .toCompletionStage() - .toCompletableFuture() - .get() + .awaitComplete() } - override fun fortunes() = queryPool.preparedQuery("SELECT id, message FROM fortune") + override fun fortunes() = dbPool.preparedQuery("SELECT id, message FROM fortune") .execute() - .map { it.map(::toFortune) } + .map { it.map { Fortune(it.getInteger(0), it.getString(1)) } } .map { (it + Fortune(0, "Additional fortune added at request time.")) } .map { it.sortedBy { it.message } } - .toCompletionStage().toCompletableFuture().get() + .awaitComplete() companion object { private fun SqlClient.findWorld(id: Int) = preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1") .execute(Tuple.of(id)) - .map { toWorld(it.single()) } + .map { it.map(::toWorld).first() } + .awaitComplete() } } private fun toWorld(r: Row) = r.getInteger("id") to r.getInteger("randomnumber") -private fun toFortune(it: Row) = Fortune(it.getInteger(0), it.getString(1)) +private fun Future.awaitComplete(): T = toCompletionStage().toCompletableFuture().get() \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/core/build.gradle.kts b/frameworks/Kotlin/http4k/core/build.gradle.kts index 3780e39df97..9cd7e8f5269 100644 --- a/frameworks/Kotlin/http4k/core/build.gradle.kts +++ b/frameworks/Kotlin/http4k/core/build.gradle.kts @@ -4,13 +4,13 @@ plugins { } dependencies { - 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(platform("org.http4k:http4k-bom:5.14.4.0")) + api("org.jetbrains.kotlin:kotlin-stdlib:1.9.23") + api("org.jetbrains.kotlin:kotlin-reflect:1.9.23") 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.apache.commons:commons-lang3:3.14.0") api("org.cache2k:cache2k-core:2.6.1.Final") compileOnly("com.fizzed:rocker-compiler:1.4.0") diff --git a/frameworks/Kotlin/http4k/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/http4k/gradle/wrapper/gradle-wrapper.properties index 3fa8f862f75..b82aa23a4f0 100644 --- a/frameworks/Kotlin/http4k/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/http4k/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.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile b/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile index c6815f305cc..51132613c98 100644 --- a/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 as gradle +FROM gradle:8.7.0-jdk21 as gradle USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-apache.dockerfile b/frameworks/Kotlin/http4k/http4k-apache.dockerfile index 559b490293c..de62168324d 100644 --- a/frameworks/Kotlin/http4k/http4k-apache.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-apache.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-apache4.dockerfile b/frameworks/Kotlin/http4k/http4k-apache4.dockerfile index 4b61309baef..840bc34ca4a 100644 --- a/frameworks/Kotlin/http4k/http4k-apache4.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-apache4.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile b/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile index 667932c0441..e2688ac80a4 100644 --- a/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 as gradle +FROM gradle:8.7.0-jdk21 as gradle USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile b/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile index 0dd8a12cd2b..650f8dfc528 100644 --- a/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 as gradle +FROM gradle:8.7.0-jdk21 as gradle USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-helidon-jdbc.dockerfile b/frameworks/Kotlin/http4k/http4k-helidon-jdbc.dockerfile index 4e447003e55..f8a49b8b7dd 100644 --- a/frameworks/Kotlin/http4k/http4k-helidon-jdbc.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-helidon-jdbc.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-helidon-pgclient.dockerfile b/frameworks/Kotlin/http4k/http4k-helidon-pgclient.dockerfile index 0425f9da4e3..7e36fa04a8b 100644 --- a/frameworks/Kotlin/http4k/http4k-helidon-pgclient.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-helidon-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-jetty.dockerfile b/frameworks/Kotlin/http4k/http4k-jetty.dockerfile index cafa466fabf..674a7f34bba 100644 --- a/frameworks/Kotlin/http4k/http4k-jetty.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-jetty.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-jetty11.dockerfile b/frameworks/Kotlin/http4k/http4k-jetty11.dockerfile index de416c28a3d..d9c785409f0 100644 --- a/frameworks/Kotlin/http4k/http4k-jetty11.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-jetty11.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile b/frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile index 729ef447464..d085a9b1913 100644 --- a/frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile b/frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile index 0560643c10e..d2cd8bc3c65 100644 --- a/frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-jettyloom-jdbc.dockerfile b/frameworks/Kotlin/http4k/http4k-jettyloom-jdbc.dockerfile index 9f69eef32e6..a3837e51fa6 100644 --- a/frameworks/Kotlin/http4k/http4k-jettyloom-jdbc.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-jettyloom-jdbc.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/http4k/http4k-jettyloom-pgclient.dockerfile index 2751bfa30d8..7259d27378a 100644 --- a/frameworks/Kotlin/http4k/http4k-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-jettyloom-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-ktorcio.dockerfile b/frameworks/Kotlin/http4k/http4k-ktorcio.dockerfile index 11849d31a41..ff2a0ed08b5 100644 --- a/frameworks/Kotlin/http4k/http4k-ktorcio.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-ktorcio.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-ktornetty.dockerfile b/frameworks/Kotlin/http4k/http4k-ktornetty.dockerfile index e36719d5348..ed9db5cdae8 100644 --- a/frameworks/Kotlin/http4k/http4k-ktornetty.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-ktornetty.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-netty.dockerfile b/frameworks/Kotlin/http4k/http4k-netty.dockerfile index d7221f8d8b6..37dea590804 100644 --- a/frameworks/Kotlin/http4k/http4k-netty.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-netty.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-ratpack.dockerfile b/frameworks/Kotlin/http4k/http4k-ratpack.dockerfile index 62e01176850..6e496eb8501 100644 --- a/frameworks/Kotlin/http4k/http4k-ratpack.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-ratpack.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-sunhttploom.dockerfile b/frameworks/Kotlin/http4k/http4k-sunhttploom.dockerfile index a07a6c1fcd4..3fa136cb9fc 100644 --- a/frameworks/Kotlin/http4k/http4k-sunhttploom.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-sunhttploom.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k-undertow.dockerfile b/frameworks/Kotlin/http4k/http4k-undertow.dockerfile index 7e29e7c091c..3f0ab95fc50 100644 --- a/frameworks/Kotlin/http4k/http4k-undertow.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-undertow.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/http4k/http4k.dockerfile b/frameworks/Kotlin/http4k/http4k.dockerfile index 18ad4598276..ec643dda001 100644 --- a/frameworks/Kotlin/http4k/http4k.dockerfile +++ b/frameworks/Kotlin/http4k/http4k.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk21 +FROM gradle:8.7.0-jdk21 USER root WORKDIR /http4k COPY build.gradle.kts build.gradle.kts From cdb3e074ac60fff30b25476a3f71b70d23e8b02c Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Tue, 9 Apr 2024 12:46:57 -0400 Subject: [PATCH 0422/1766] Updates files to run with Helidon 4.0.3. (#8764) Signed-off-by: Santiago Pericasgeertsen --- .../Java/helidon/helidon-nima.dockerfile | 7 ++-- frameworks/Java/helidon/nima/pom.xml | 19 ++++----- .../java/io/helidon/benchmark/nima/Main.java | 36 ++++++++-------- .../nima/models/PgClientRepository.java | 41 +++++++++++-------- .../benchmark/nima/services/DbService.java | 8 ++-- .../nima/services/FortuneHandler.java | 6 +-- .../nima/src/main/resources/application.yaml | 30 ++++++-------- 7 files changed, 73 insertions(+), 74 deletions(-) diff --git a/frameworks/Java/helidon/helidon-nima.dockerfile b/frameworks/Java/helidon/helidon-nima.dockerfile index 94f67c40ffb..bfe655e52c0 100644 --- a/frameworks/Java/helidon/helidon-nima.dockerfile +++ b/frameworks/Java/helidon/helidon-nima.dockerfile @@ -1,17 +1,16 @@ -FROM docker.io/maven:3.9.2-eclipse-temurin-20 as maven +FROM docker.io/maven:3.9.6-eclipse-temurin-21 as maven WORKDIR /helidon COPY nima/src src COPY nima/pom.xml pom.xml RUN mvn package -q -FROM openjdk:20-jdk-slim +FROM openjdk:22-rc-jdk-slim WORKDIR /helidon COPY --from=maven /helidon/target/libs libs COPY --from=maven /helidon/target/benchmark-nima.jar app.jar EXPOSE 8080 -CMD java --enable-preview \ - -XX:+UseNUMA \ +CMD java -XX:+UseNUMA \ -XX:+UseParallelGC \ -jar app.jar diff --git a/frameworks/Java/helidon/nima/pom.xml b/frameworks/Java/helidon/nima/pom.xml index b08de529ffc..c884659a0a0 100644 --- a/frameworks/Java/helidon/nima/pom.xml +++ b/frameworks/Java/helidon/nima/pom.xml @@ -21,7 +21,7 @@ io.helidon.applications helidon-se - 4.0.0-ALPHA6 + 4.0.3 @@ -33,25 +33,25 @@ io.helidon.benchmark.nima.Main - 20 + 21 3.11.0 1.3.0 - 4.4.2 + 4.5.3 0.9.23 - io.helidon.nima.webserver - helidon-nima-webserver + io.helidon.webserver + helidon-webserver io.helidon.config helidon-config-yaml - io.helidon.nima.http.media - helidon-nima-http-media-jsonp + io.helidon.http.media + helidon-http-media-jsonp io.helidon.common @@ -83,8 +83,8 @@ ${rocker.version} - io.helidon.nima.testing.junit5 - helidon-nima-testing-junit5-webserver + io.helidon.common.testing + helidon-common-testing-junit5 test @@ -113,7 +113,6 @@ -Xlint:unchecked -Xpkginfo:always - --enable-preview
diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java index 6572acf9b27..92896867246 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java @@ -29,18 +29,17 @@ import io.helidon.benchmark.nima.models.PgClientRepository; import io.helidon.benchmark.nima.services.DbService; import io.helidon.benchmark.nima.services.FortuneHandler; -import io.helidon.common.http.Http; -import io.helidon.common.http.Http.Header; -import io.helidon.common.http.Http.HeaderValue; -import io.helidon.common.http.Http.HeaderValues; +import io.helidon.http.Header; +import io.helidon.http.HeaderNames; +import io.helidon.http.HeaderValues; import io.helidon.config.Config; import io.helidon.config.ConfigException; import io.helidon.logging.common.LogConfig; -import io.helidon.nima.webserver.WebServer; -import io.helidon.nima.webserver.http.Handler; -import io.helidon.nima.webserver.http.HttpRules; -import io.helidon.nima.webserver.http.ServerRequest; -import io.helidon.nima.webserver.http.ServerResponse; +import io.helidon.webserver.WebServer; +import io.helidon.webserver.http.Handler; +import io.helidon.webserver.http.HttpRules; +import io.helidon.webserver.http.ServerRequest; +import io.helidon.webserver.http.ServerResponse; /** * Main class of the benchmark. @@ -50,9 +49,9 @@ public final class Main { private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); - public static final Http.HeaderValue CONTENT_TYPE_HTML = - Http.Header.createCached(Http.Header.CONTENT_TYPE, "text/html; charset=UTF-8"); - public static final Http.HeaderValue SERVER = Http.Header.createCached(Http.Header.SERVER, "Nima"); + public static final Header CONTENT_TYPE_HTML = + HeaderValues.createCached(HeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8"); + public static final Header SERVER = HeaderValues.createCached(HeaderNames.SERVER, "Nima"); private Main() { } @@ -67,11 +66,14 @@ public static void main(String[] args) { LogConfig.configureRuntime(); WebServer.builder() + .config(Config.create().get("server")) .routing(Main::routing) + .build() .start(); } // exposed for tests + @SuppressWarnings("unchecked") static void routing(HttpRules rules) { Config config = Config.create(); @@ -107,9 +109,9 @@ private static byte[] serializeMsg(Message obj) { } static class PlaintextHandler implements Handler { - static final HeaderValue CONTENT_TYPE = Header.createCached(Header.CONTENT_TYPE, + static final Header CONTENT_TYPE = HeaderValues.createCached(HeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8"); - static final HeaderValue CONTENT_LENGTH = Header.createCached(Header.CONTENT_LENGTH, "13"); + static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, "13"); private static final byte[] RESPONSE_BYTES = "Hello, World!".getBytes(StandardCharsets.UTF_8); @@ -125,7 +127,7 @@ public void handle(ServerRequest req, ServerResponse res) { static class JsonHandler implements Handler { private static final String MESSAGE = "Hello, World!"; private static final int JSON_LENGTH = serializeMsg(new Message(MESSAGE)).length; - static final HeaderValue CONTENT_LENGTH = Header.createCached(Header.CONTENT_LENGTH, + static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, String.valueOf(JSON_LENGTH)); @Override @@ -142,13 +144,13 @@ private static Message newMsg() { } static class JsonKHandler implements Handler { - private final HeaderValue contentLength; + private final Header contentLength; private final String message; JsonKHandler(int kilobytes) { this.message = "a".repeat(1024 * kilobytes); int length = serializeMsg(new Message(message)).length; - this.contentLength = Header.createCached(Header.CONTENT_LENGTH, + this.contentLength = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, String.valueOf(length)); } diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java index 02a768add6c..7775a177537 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java @@ -110,29 +110,34 @@ public List getWorlds(int count) { @Override public World updateWorld(World world) { - try { - updateWorlds(List.of(world), 0, updatePool); - return world; - } catch (Exception e) { - throw new RuntimeException(e); - } + return Single.create(queryPool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2") + .execute(Tuple.of(world.id, world.id)) + .toCompletionStage() + .thenApply(rows -> world)).await(); } @Override public List updateWorlds(int count) { List worlds = getWorlds(count); - for (World w : worlds) { - w.randomNumber = randomWorldNumber(); - } - if (count <= batchSize) { - LOGGER.finest(() -> "Updating single batch of size " + count); - updateWorldsRetry(worlds, 0, 0); - } else { - int batches = count / batchSize + (count % batchSize == 0 ? 0 : 1); - for (int i = 0; i < batches; i++) { - final int from = i * batchSize; - LOGGER.finest(() -> "Updating batch from " + from + " to " + (from + batchSize)); - updateWorldsRetry(worlds, from, 0); + if (batchSize > 1) { // batching updates + for (World w : worlds) { + w.randomNumber = randomWorldNumber(); + } + if (count <= batchSize) { + LOGGER.finest(() -> "Updating single batch of size " + count); + updateWorldsRetry(worlds, 0, 0); + } else { + int batches = count / batchSize + (count % batchSize == 0 ? 0 : 1); + for (int i = 0; i < batches; i++) { + final int from = i * batchSize; + LOGGER.finest(() -> "Updating batch from " + from + " to " + (from + batchSize)); + updateWorldsRetry(worlds, from, 0); + } + } + } else { // no batching for size 1 + for (World w : worlds) { + w.randomNumber = randomWorldNumber(); + updateWorld(w); } } return worlds; diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java index 086c620f0c5..46c244d96f5 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java @@ -7,10 +7,10 @@ import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.World; import io.helidon.common.parameters.Parameters; -import io.helidon.nima.webserver.http.HttpRules; -import io.helidon.nima.webserver.http.HttpService; -import io.helidon.nima.webserver.http.ServerRequest; -import io.helidon.nima.webserver.http.ServerResponse; +import io.helidon.webserver.http.HttpRules; +import io.helidon.webserver.http.HttpService; +import io.helidon.webserver.http.ServerRequest; +import io.helidon.webserver.http.ServerResponse; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index 38eb950fcc1..8847b7d0bc1 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -7,9 +7,9 @@ import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput; import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.Fortune; -import io.helidon.nima.webserver.http.Handler; -import io.helidon.nima.webserver.http.ServerRequest; -import io.helidon.nima.webserver.http.ServerResponse; +import io.helidon.webserver.http.Handler; +import io.helidon.webserver.http.ServerRequest; +import io.helidon.webserver.http.ServerResponse; import views.fortunes; import static io.helidon.benchmark.nima.Main.CONTENT_TYPE_HTML; diff --git a/frameworks/Java/helidon/nima/src/main/resources/application.yaml b/frameworks/Java/helidon/nima/src/main/resources/application.yaml index 511b0173ae5..ff4aa100b67 100644 --- a/frameworks/Java/helidon/nima/src/main/resources/application.yaml +++ b/frameworks/Java/helidon/nima/src/main/resources/application.yaml @@ -1,5 +1,5 @@ # -# Copyright (c) 2022, 2023 Oracle and/or its affiliates. +# Copyright (c) 2022, 2024 Oracle and/or its affiliates. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,33 +15,27 @@ # server: + host: 0.0.0.0 port: 8080 - sockets: - - name: "@default" - host: 0.0.0.0 - port: 8080 - backlog: 8192 - receive-buffer-size: 64000 - # set write-queue-length to 0 or not setting it will disable async writes - # write-queue-length: 1024 - connection-options: - read-timeout-seconds: 0 - connect-timeout-seconds: 0 - send-buffer-size: 64000 - receive-buffer-size: 64000 - connection-providers: + backlog: 8192 + write-queue-length: 8192 + connection-options: + read-timeout: PT0S + connect-timeout: PT0S + tcp-no-delay: true + protocols: "http_1_1": - validate-headers: false + validate-request-headers: false + validate-response-headers: false validate-path: false recv-log: false send-log: false host: "tfb-database" -#host: "localhost" db: "hello_world" username: benchmarkdbuser password: benchmarkdbpass -sql-pool-size: 200 +sql-pool-size: 300 db-repository: "pgclient" # "pgclient" (default) or "hikari" # The following for pgclient only From 66b8a99e80451d678101ec3ea105570bfddbace2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:47:09 -0700 Subject: [PATCH 0423/1766] Bump h2 from 0.3.24 to 0.3.26 in /frameworks/Rust/actix (#8841) Bumps [h2](https://github.com/hyperium/h2) from 0.3.24 to 0.3.26. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.26/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.24...v0.3.26) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- 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 180b200226d..35e34f98efc 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.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", From e1cd56cdfcb341e86ebd5ac3f24a2fffd9246914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:47:20 -0700 Subject: [PATCH 0424/1766] Bump h2 from 0.3.24 to 0.3.26 in /frameworks/Rust/pavex (#8840) Bumps [h2](https://github.com/hyperium/h2) from 0.3.24 to 0.3.26. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.26/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.24...v0.3.26) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Rust/pavex/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/pavex/Cargo.lock b/frameworks/Rust/pavex/Cargo.lock index cf9569133b4..d9f8310b9d6 100644 --- a/frameworks/Rust/pavex/Cargo.lock +++ b/frameworks/Rust/pavex/Cargo.lock @@ -153,9 +153,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", From 38b860a2753594d22da7c06778c0666c28fbdabe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:48:00 -0700 Subject: [PATCH 0425/1766] Bump whoami from 1.4.1 to 1.5.1 in /frameworks/Rust/axum (#8838) Bumps [whoami](https://github.com/ardaku/whoami) from 1.4.1 to 1.5.1. - [Changelog](https://github.com/ardaku/whoami/blob/v1/CHANGELOG.md) - [Commits](https://github.com/ardaku/whoami/compare/v1.4.1...v1.5.1) --- updated-dependencies: - dependency-name: whoami 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 | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index dbda43b6d71..46c408fc73e 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -2849,6 +2849,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.89" @@ -2921,11 +2927,12 @@ checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "whoami" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "wasm-bindgen", + "redox_syscall", + "wasite", "web-sys", ] From 8fb5292da4697b7d71a975d61e11f36b3693279e Mon Sep 17 00:00:00 2001 From: Jacob Rothstein Date: Tue, 9 Apr 2024 12:42:29 -0700 Subject: [PATCH 0426/1766] rust/trillium: update dependencies (#8849) --- frameworks/Rust/trillium/Cargo.lock | 494 ++++++++---------- frameworks/Rust/trillium/Cargo.toml | 22 +- .../Rust/trillium/src/routes/fortune.rs | 2 +- .../Rust/trillium/src/routes/plaintext.rs | 2 +- 4 files changed, 236 insertions(+), 284 deletions(-) diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 007f4d2cef4..9928cb79e50 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -17,9 +17,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -38,9 +38,9 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -110,7 +110,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -146,23 +146,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 5.0.0", - "event-listener-strategy 0.5.0", + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "5f98c37cf288e302c16ef6c8472aad1e034c6c84ce5ea7b8101c98eb4a802fee" dependencies = [ "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.2.0", + "fastrand 2.0.2", + "futures-lite 2.3.0", "slab", ] @@ -174,10 +174,10 @@ checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel 2.2.0", "async-executor", - "async-io 2.3.1", + "async-io 2.3.2", "async-lock 3.3.0", "blocking", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "once_cell", ] @@ -203,18 +203,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" dependencies = [ "async-lock 3.3.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "parking", - "polling 3.4.0", - "rustix 0.38.31", + "polling 3.6.0", + "rustix 0.38.32", "slab", "tracing", "windows-sys 0.52.0", @@ -246,9 +246,9 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "async-io 2.3.1", + "async-io 2.3.2", "blocking", - "futures-lite 2.2.0", + "futures-lite 2.3.0", ] [[package]] @@ -296,7 +296,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -307,13 +307,13 @@ checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -337,21 +337,11 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atomic-write-file" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" -dependencies = [ - "nix", - "rand", -] - [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "base64" @@ -376,9 +366,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" @@ -398,18 +388,18 @@ dependencies = [ "async-channel 2.2.0", "async-lock 3.3.0", "async-task", - "fastrand 2.0.1", + "fastrand 2.0.2", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "piper", "tracing", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytecount" @@ -425,9 +415,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "camino" @@ -462,12 +452,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" [[package]] name = "cfg-if" @@ -650,9 +637,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c012a26a7f605efc424dd53697843a72be7dc86ad2d01f7814337794a12231d" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" dependencies = [ "anstream", "anstyle", @@ -716,9 +703,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.0.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" dependencies = [ "concurrent-queue", "parking", @@ -737,11 +724,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" dependencies = [ - "event-listener 5.0.0", + "event-listener 5.3.0", "pin-project-lite", ] @@ -756,9 +743,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "finl_unicode" @@ -854,11 +841,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.0.2", "futures-core", "futures-io", "parking", @@ -873,7 +860,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -918,9 +905,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", @@ -975,9 +962,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1051,9 +1038,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -1067,7 +1054,7 @@ checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -1101,9 +1088,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jemalloc-sys" @@ -1127,9 +1114,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1185,9 +1172,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" dependencies = [ "value-bag", ] @@ -1204,9 +1191,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mime" @@ -1272,17 +1259,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.4.2", - "cfg-if", - "libc", -] - [[package]] name = "nom" version = "7.1.3" @@ -1325,11 +1301,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.63" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cfg-if", "foreign-types", "libc", @@ -1346,7 +1322,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -1357,9 +1333,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.99" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -1397,7 +1373,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -1441,31 +1417,11 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pin-project" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1480,7 +1436,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.0.2", "futures-io", ] @@ -1508,14 +1464,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.4.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi", "pin-project-lite", - "rustix 0.38.31", + "rustix 0.38.32", "tracing", "windows-sys 0.52.0", ] @@ -1558,9 +1515,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -1571,7 +1528,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "memchr", "unicase", ] @@ -1636,7 +1593,7 @@ version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", ] [[package]] @@ -1650,9 +1607,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -1662,9 +1619,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -1673,9 +1630,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rlimit" @@ -1692,6 +1649,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0971d3c8943a6267d6bd0d782fdc4afa7593e7381a92a3df950ff58897e066b5" dependencies = [ + "memchr", "smartcow", "smartstring", ] @@ -1721,11 +1679,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys 0.4.13", @@ -1734,9 +1692,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -1772,14 +1730,14 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "sea-orm" -version = "0.12.14" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6632f499b80cc6aaa781b302e4c9fae663e0e3dcf2640e9d80034d5b10731efe" +checksum = "c8814e37dc25de54398ee62228323657520b7f29713b8e238649385dbe473ee0" dependencies = [ "async-stream", "async-trait", @@ -1799,15 +1757,15 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "0.12.14" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec13bfb4c4aef208f68dbea970dd40d13830c868aa8dcb4e106b956e6bb4f2fa" +checksum = "5e115c6b078e013aa963cc2d38c196c2c40b05f03d0ac872fe06b6e0d5265603" dependencies = [ "heck", "proc-macro2", "quote", "sea-bae", - "syn 2.0.48", + "syn 2.0.58", "unicode-ident", ] @@ -1834,9 +1792,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -1847,9 +1805,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", @@ -1866,29 +1824,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -1907,17 +1865,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1992,9 +1939,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smartcow" @@ -2039,9 +1986,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2050,9 +1997,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ "ahash", "async-io 1.13.0", @@ -2062,7 +2009,6 @@ dependencies = [ "bytes", "crc", "crossbeam-queue", - "dotenvy", "either", "event-listener 2.5.3", "futures-channel", @@ -2091,9 +2037,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" dependencies = [ "proc-macro2", "quote", @@ -2104,12 +2050,11 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ "async-std", - "atomic-write-file", "dotenvy", "either", "heck", @@ -2129,13 +2074,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64", - "bitflags 2.4.2", + "bitflags 2.5.0", "byteorder", "crc", "dotenvy", @@ -2156,7 +2101,6 @@ dependencies = [ "rand", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlx-core", @@ -2174,12 +2118,12 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stopper" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed8bff52ab3d70adfb76df17a225936c7676efdda1a1567ed5b11c22e3577bd3" +checksum = "66c82d03d16a1e591756e978782ce4bc4300f83048b57d44c5600dafa7337019" dependencies = [ - "event-listener 4.0.3", - "futures-lite 2.2.0", + "event-listener 5.3.0", + "futures-lite 2.3.0", "pin-project-lite", ] @@ -2219,9 +2163,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -2236,34 +2180,34 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "rustix 0.38.31", + "fastrand 2.0.2", + "rustix 0.38.32", "windows-sys 0.52.0", ] [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2334,7 +2278,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2348,12 +2292,11 @@ dependencies = [ [[package]] name = "trillium" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acca545b3933760b2b88b822d83e62ccf9aab8c24d16ae82e56df1f2a5af11c1" +checksum = "01c7180eac36666f14504c5a8606d027154a8e3a4704bd0acc69a13f56c202b6" dependencies = [ "async-trait", - "futures-lite 2.2.0", "log", "trillium-http", ] @@ -2384,12 +2327,12 @@ dependencies = [ [[package]] name = "trillium-http" -version = "0.3.14" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8afd3a7e9a46df93d81229fcd2011e089ed522c55ef633edee8893a23cb88e9" +checksum = "a18d82a9418c6fc1a872bc163fffd49320229edf783cbbb1aa62ba49f517cfad" dependencies = [ "encoding_rs", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "hashbrown", "httparse", "httpdate", @@ -2401,14 +2344,14 @@ dependencies = [ "smartstring", "stopper", "thiserror", - "trillium-macros", + "trillium-macros 0.0.6", ] [[package]] name = "trillium-logger" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d5329a0826c06cd7d36a81928345d97ab5277dcc7d1d624335eb52fa22d1a" +checksum = "da5e9b6c08a27d991b4a9c73dd7276c6f181fd4dee7218723b0fbd7fca3a1659" dependencies = [ "colored", "log", @@ -2425,14 +2368,25 @@ checksum = "916054381183f0cfed7604bf7de2044a760624a50d26eef5492468fb73083bbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", +] + +[[package]] +name = "trillium-macros" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916e37646d33632b88ca02d4b8c4e2e6376f2a89d9888de71b7d82c150ed1f6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", ] [[package]] name = "trillium-router" -version = "0.3.6" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71daa9c919d4b4a7afae1a846fa2e60aad712e5b924936751630a880a84e9659" +checksum = "6a7aed20d63101d7dcd165fd047141423009a7f4ccfc75db5b875312d8127dbe" dependencies = [ "log", "routefinder", @@ -2441,14 +2395,14 @@ dependencies = [ [[package]] name = "trillium-server-common" -version = "0.4.7" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f157b81051bb2630b6750d6583f648f545d241ef4b939781f4ad6a45fe700" +checksum = "a96faa60ceaf4b575886eb7d2ad3df4371acf67e0a4489585cccd4ff18966103" dependencies = [ "async-trait", "async_cell", "event-listener 4.0.3", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "log", "pin-project-lite", "rlimit", @@ -2459,22 +2413,21 @@ dependencies = [ [[package]] name = "trillium-smol" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f9ca9fc22be687543ee24d23d9730f7370d57796adc2a2f2ccd9ce51b78199" +checksum = "ec354b7f2e4b89cf14b9e47dcdb94fd1663ff0ba34d131ddd7082f24253319fa" dependencies = [ "async-global-executor", - "async-io 2.3.1", + "async-io 2.3.2", "async-net", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "log", "signal-hook", "signal-hook-async-std", "trillium", "trillium-http", - "trillium-macros", + "trillium-macros 0.0.5", "trillium-server-common", - "url", ] [[package]] @@ -2483,8 +2436,8 @@ version = "0.1.0" dependencies = [ "askama", "env_logger", - "fastrand 2.0.1", - "futures-lite 2.2.0", + "fastrand 2.0.2", + "futures-lite 2.3.0", "jemallocator", "moka", "sea-orm", @@ -2534,9 +2487,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", ] @@ -2555,22 +2508,21 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "unicycle" -version = "0.9.4" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfa5ca2452d3fbf68f7078c5e7f42b96f0c0c7def017994147f8acd8c4264d" +checksum = "6ca7c60c63c67acf573ef612b410c42b351c1028216085fd72fb43e2b1abd2fc" dependencies = [ "futures-core", "lock_api", "parking_lot", - "pin-project", "uniset", ] [[package]] name = "uniset" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c9f21fe154ca4d5d06fc2ebb8c58cc80e338eacc372ec794943f69e535c131c" +checksum = "40789245bbff5f31eb773c9ac4ee5c4e15eab9640d975e124d6ce4c34a6410d7" [[package]] name = "url" @@ -2600,9 +2552,9 @@ dependencies = [ [[package]] name = "value-bag" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126e423afe2dd9ac52142e7e9d5ce4135d7e13776c529d27fd6bc49f19e3280b" +checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8" [[package]] name = "vcpkg" @@ -2646,9 +2598,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2656,24 +2608,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -2683,9 +2635,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2693,28 +2645,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -2776,7 +2728,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]] @@ -2796,17 +2748,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]] @@ -2817,9 +2769,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" @@ -2829,9 +2781,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" @@ -2841,9 +2793,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" @@ -2853,9 +2805,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" @@ -2865,9 +2817,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" @@ -2877,9 +2829,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" @@ -2889,9 +2841,9 @@ 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 = "zerocopy" @@ -2910,5 +2862,5 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] diff --git a/frameworks/Rust/trillium/Cargo.toml b/frameworks/Rust/trillium/Cargo.toml index 6b31ed67ad6..81ec1e472d3 100644 --- a/frameworks/Rust/trillium/Cargo.toml +++ b/frameworks/Rust/trillium/Cargo.toml @@ -8,23 +8,23 @@ jemallocator = ["dep:jemallocator"] [dependencies] askama = "0.12.1" -fastrand = "2.0.1" -futures-lite = "2.2.0" -serde = { version = "1.0.196", features = ["derive"] } -serde_json = "1.0.113" -trillium = "0.2.16" +fastrand = "2.0.2" +futures-lite = "2.3.0" +serde = { version = "1.0.197", features = ["derive"] } +serde_json = "1.0.115" +trillium = "0.2.19" trillium-api = "0.1.0" 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.11.2" +trillium-smol = "0.4.0" +trillium-logger = "0.4.5" +trillium-router = "0.4.1" +unicycle = "0.10.1" +env_logger = "0.11.3" moka = { version = "0.12.5", features = ["future"] } jemallocator = {version="0.5.4", optional = true} [dependencies.sea-orm] -version = "0.12.14" +version = "0.12.15" default-features = false features = ["runtime-async-std-native-tls", "sqlx-postgres", "macros"] diff --git a/frameworks/Rust/trillium/src/routes/fortune.rs b/frameworks/Rust/trillium/src/routes/fortune.rs index e9ea757e7bf..c1658a64f69 100644 --- a/frameworks/Rust/trillium/src/routes/fortune.rs +++ b/frameworks/Rust/trillium/src/routes/fortune.rs @@ -34,5 +34,5 @@ pub async fn handler(conn: Conn) -> Conn { conn.render(FortuneTemplate { fortunes: &fortunes, }) - .with_header(ContentType, "text/html; charset=utf-8") + .with_response_header(ContentType, "text/html; charset=utf-8") } diff --git a/frameworks/Rust/trillium/src/routes/plaintext.rs b/frameworks/Rust/trillium/src/routes/plaintext.rs index 3742526a1be..f423ead3780 100644 --- a/frameworks/Rust/trillium/src/routes/plaintext.rs +++ b/frameworks/Rust/trillium/src/routes/plaintext.rs @@ -1,6 +1,6 @@ use trillium::{Conn, KnownHeaderName}; pub async fn handler(conn: Conn) -> Conn { - conn.with_header(KnownHeaderName::ContentType, "text/plain") + conn.with_response_header(KnownHeaderName::ContentType, "text/plain") .ok("Hello, World!") } From 8d5bbc9903d9fe4d36ae0a5e23bcb380ea308dda Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 11 Apr 2024 18:46:31 +0200 Subject: [PATCH 0427/1766] [php] Workerman update to event/3.1.3 (#8859) --- 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 4228e2adf98..4621aaa7c29 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.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.3 > /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 f131163c93c..a84f44e78aa 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.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.3 > /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 194a2e8817d..320a98c9f10 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.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.3 > /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 36abb360fc1..31fe46ce5a7 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.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.3 > /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 61ea1df59b020af412895b65e8072d705e1edf95 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 11 Apr 2024 19:24:46 +0200 Subject: [PATCH 0428/1766] [ruby/roda] Reduce `random_id` calls in update (#8858) Calling `Array#sample` with a size x is faster than calling `rand` x times. --- frameworks/Ruby/roda-sequel/boot.rb | 2 ++ frameworks/Ruby/roda-sequel/hello_world.rb | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index 44e64ce917c..661892b823f 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -3,6 +3,8 @@ require "time" require "oj" MAX_PK = 10_000 +QUERY_RANGE = (1..MAX_PK).freeze +ALL_IDS = QUERY_RANGE.to_a QUERIES_MIN = 1 QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 7d290896112..194357cae2f 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -37,7 +37,9 @@ def rand1 r.is "queries" do worlds = DB.synchronize do - Array.new(bounded_queries) { World.with_pk(rand1).values } + ALL_IDS.sample(bounded_queries).map do |id| + World.with_pk(id).values + end end worlds.to_json end @@ -58,8 +60,8 @@ def rand1 r.is "updates" do worlds = DB.synchronize do - Array.new(bounded_queries) do - world = World.with_pk(rand1) + ALL_IDS.sample(bounded_queries).map do |id| + world = World.with_pk(id) new_value = rand1 new_value = rand1 while new_value == world.randomnumber world.update(randomnumber: new_value) From ae68525fc5829521b065e3983bfa782565df8a80 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 11 Apr 2024 19:24:56 +0200 Subject: [PATCH 0429/1766] [ruby/rack] Reduce `random_id` calls in update (#8857) Calling `Array#sample` with a size x is faster than calling `rand` x times. --- frameworks/Ruby/rack/pg_db.rb | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/frameworks/Ruby/rack/pg_db.rb b/frameworks/Ruby/rack/pg_db.rb index deeb149f0ad..1e083b004c4 100644 --- a/frameworks/Ruby/rack/pg_db.rb +++ b/frameworks/Ruby/rack/pg_db.rb @@ -37,11 +37,11 @@ def prepare_statements end def select_random_world - @world_select.call(id: random_id)[0] + select_world(random_id) end def select_world(id) - @world_select.call(id: id)[0] + @world_select.call(id: id).first end def validate_count(count) @@ -57,40 +57,30 @@ def validate_count(count) def select_promises(count) count = validate_count(count) - promises = [] - count.times do + ALL_IDS.sample(count).map do |id| @connection.synchronize do - promises << @connection['SELECT id, randomNumber FROM World WHERE id = ?', random_id].async.first + @connection['SELECT id, randomNumber FROM World WHERE id = ?', id].async.first end end - promises end def select_random_numbers(count) count = validate_count(count) - results = [] - count.times do - results << @world_random_select.call(randomvalue: random_id, id: random_id)[0] + ALL_IDS.sample(count).map do |id| + @world_random_select.call(randomvalue: random_id, id: id).first end - results end def select_worlds(count) count = validate_count(count) - results = [] - count.times do - results << @world_select.call(id: random_id)[0] + ALL_IDS.sample(count).map do |id| + @world_select.call(id: id).first end - results end def select_worlds_async(count) promises = select_promises(count) - results = [] - promises.each do |p| - results << p.to_hash - end - results + promises.map(&:to_hash) end def update_worlds(count, async = false) @@ -111,6 +101,7 @@ def update_worlds(count, async = false) @connection[sql].update results end + def select_fortunes @fortune_select.call end From 44246856ac3c1a27e2e91fe6be0d5e3bccf30648 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 11 Apr 2024 19:25:07 +0200 Subject: [PATCH 0430/1766] [ruby/grape] Remove deprecated --path option from bundle command (#8855) --- frameworks/Ruby/grape/grape-unicorn.dockerfile | 2 +- frameworks/Ruby/grape/grape.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/grape/grape-unicorn.dockerfile b/frameworks/Ruby/grape/grape-unicorn.dockerfile index 2b0e1ba1dc3..3cc4c7d2d37 100644 --- a/frameworks/Ruby/grape/grape-unicorn.dockerfile +++ b/frameworks/Ruby/grape/grape-unicorn.dockerfile @@ -8,7 +8,7 @@ ADD ./ /grape WORKDIR /grape -RUN bundle install --jobs=4 --gemfile=/grape/Gemfile --path=/grape/grape/bundle +RUN bundle install --jobs=4 --gemfile=/grape/Gemfile EXPOSE 8080 diff --git a/frameworks/Ruby/grape/grape.dockerfile b/frameworks/Ruby/grape/grape.dockerfile index ea90f27d262..5beaf426ddd 100644 --- a/frameworks/Ruby/grape/grape.dockerfile +++ b/frameworks/Ruby/grape/grape.dockerfile @@ -6,7 +6,7 @@ ADD ./ /grape WORKDIR /grape -RUN bundle install --jobs=4 --gemfile=/grape/Gemfile --path=/grape/grape/bundle +RUN bundle install --jobs=4 --gemfile=/grape/Gemfile EXPOSE 8080 From 770ef723f8acb829411e9b3b67a58c06482e3677 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 11 Apr 2024 19:25:20 +0200 Subject: [PATCH 0431/1766] [ruby-padrino] Pin rack version to 2.2 (#8854) Padrino doesn't work yet with rack 3. Also remove deprecated `--path` option from bundle command. --- frameworks/Ruby/padrino/Gemfile | 1 + frameworks/Ruby/padrino/padrino-unicorn.dockerfile | 2 +- frameworks/Ruby/padrino/padrino.dockerfile | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/padrino/Gemfile b/frameworks/Ruby/padrino/Gemfile index 18cff716d85..8dad3c642ea 100644 --- a/frameworks/Ruby/padrino/Gemfile +++ b/frameworks/Ruby/padrino/Gemfile @@ -8,3 +8,4 @@ gem 'slim', '2.0.3' gem 'dm-mysql-adapter', '1.2.0' gem 'dm-core', '1.2.1' gem 'padrino', '0.15.3' +gem 'rack', '~> 2.2' diff --git a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile b/frameworks/Ruby/padrino/padrino-unicorn.dockerfile index 2ca282ab180..77e083211e9 100644 --- a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile +++ b/frameworks/Ruby/padrino/padrino-unicorn.dockerfile @@ -9,7 +9,7 @@ COPY config.ru config.ru COPY Gemfile Gemfile COPY Rakefile Rakefile -RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile --path=/padrino/padrino/bundle +RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile RUN apt-get update -yqq && apt-get install -yqq nginx diff --git a/frameworks/Ruby/padrino/padrino.dockerfile b/frameworks/Ruby/padrino/padrino.dockerfile index 66605e2457d..78fd7774dea 100644 --- a/frameworks/Ruby/padrino/padrino.dockerfile +++ b/frameworks/Ruby/padrino/padrino.dockerfile @@ -9,7 +9,7 @@ COPY config.ru config.ru COPY Gemfile Gemfile COPY Rakefile Rakefile -RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile --path=/padrino/padrino/bundle +RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile EXPOSE 8080 From f1c8109c74b3f903738dfaefb35963643286c339 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 11 Apr 2024 19:25:35 +0200 Subject: [PATCH 0432/1766] [ruby/rails] Reduce `random_id` calls in update (#8856) Calling `Array#sample` with a size x is faster than calling `rand` x times. --- .../Ruby/rails/app/controllers/hello_world_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index cb533d57a37..fb0d2f1ccda 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -33,8 +33,8 @@ def fortune end def update - worlds = Array.new(query_count) do - world = World.find(random_id) + worlds = ALL_IDS.sample(query_count).map do |id| + world = World.find(id) new_value = random_id new_value = random_id until new_value != world.randomNumber world.update_columns(randomNumber: new_value) From 383714a1f83bb60fa6ab60d0943f1e69d60e98f9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 11 Apr 2024 19:25:50 +0200 Subject: [PATCH 0433/1766] [Ruby] Use clamp for queries count (#8853) * [ruby-padrino] Pin rack version to 2.2 Padrino doesn't work yet with rack 3. Also remove deprecated `--path` option from bundle command. * [ruby/grape] Remove deprecated --path option from bundle command * [Ruby] Use clamp for queries count Use Ruby's `clamp` instead of using custom logic to clamp the queries count. This also introduces constants for min/max queries, where missing. --- frameworks/Ruby/agoo/app.rb | 11 +++++----- frameworks/Ruby/grape/config.ru | 4 +--- frameworks/Ruby/padrino/app/controllers.rb | 21 +++++++++---------- frameworks/Ruby/rack-sequel/hello_world.rb | 4 +--- frameworks/Ruby/rack/pg_db.rb | 8 +------ .../app/controllers/hello_world_controller.rb | 5 +---- frameworks/Ruby/roda-sequel/hello_world.rb | 4 +--- frameworks/Ruby/sinatra-sequel/hello_world.rb | 4 +--- frameworks/Ruby/sinatra/hello_world.rb | 4 +--- 9 files changed, 23 insertions(+), 42 deletions(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index f2c2c9f3301..93b2cc62688 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -15,18 +15,19 @@ }) end +MAX_PK = 10_000 +QUERIES_MIN = 1 +QUERIES_MAX = 500 + class BaseHandler def self.extract_queries_param(request = nil) queries = Rack::Utils.parse_query(request['QUERY_STRING'])['queries'].to_i rescue 1 - return 1 if queries < 1 - return 500 if queries > 500 - - queries + queries.clamp(QUERIES_MIN, QUERIES_MAX) end def self.get_one_random_number - 1 + Random.rand(10000) + 1 + Random.rand(MAX_PK) end def self.get_one_record(id = get_one_random_number) diff --git a/frameworks/Ruby/grape/config.ru b/frameworks/Ruby/grape/config.ru index 1bd2494c83f..ac019ea02cd 100644 --- a/frameworks/Ruby/grape/config.ru +++ b/frameworks/Ruby/grape/config.ru @@ -36,9 +36,7 @@ module Acme helpers do def bounded_queries queries = params[:queries].to_i - return QUERIES_MIN if queries < QUERIES_MIN - return QUERIES_MAX if queries > QUERIES_MAX - queries + queries.clamp(QUERIES_MIN, QUERIES_MAX) end # Return a random number between 1 and MAX_PK diff --git a/frameworks/Ruby/padrino/app/controllers.rb b/frameworks/Ruby/padrino/app/controllers.rb index 119d2f45f20..0d899ce97a9 100644 --- a/frameworks/Ruby/padrino/app/controllers.rb +++ b/frameworks/Ruby/padrino/app/controllers.rb @@ -1,3 +1,7 @@ +MAX_PK = 10_000 +QUERIES_MIN = 1 +QUERIES_MAX = 500 + HelloWorld::App.controllers do get '/json', :provides => [:json] do response.headers['Server'] = 'padrino' @@ -8,19 +12,17 @@ get '/db', :provides => [:json] do response.headers['Server'] = 'padrino' response.headers['Date'] = Time.now.httpdate - id = Random.rand(10000) + 1 + id = Random.rand(MAX_PK) + 1 World.get(id).attributes.to_json end get '/queries', :provides => [:json] do response.headers['Server'] = 'padrino' response.headers['Date'] = Time.now.httpdate - queries = params['queries'].to_i - queries = 1 if queries < 1 - queries = 500 if queries > 500 + queries = params['queries'].to_i.clamp(QUERIES_MIN, QUERIES_MAX) results = (1..queries).map do - World.get(Random.rand(10000) + 1).attributes + World.get(Random.rand(MAX_PK) + 1).attributes end.to_json end @@ -37,15 +39,13 @@ get '/updates', :provides => [:json] do response.headers['Server'] = 'padrino' response.headers['Date'] = Time.now.httpdate - queries = params['queries'].to_i - queries = 1 if queries < 1 - queries = 500 if queries > 500 + queries = params['queries'].to_i.clamp(QUERIES_MIN, QUERIES_MAX) worlds = (1..queries).map do # get a random row from the database, which we know has 10000 # rows with ids 1 - 10000 - world = World.get(Random.rand(10000) + 1) - world.update(:randomNumber => Random.rand(10000) + 1) + world = World.get(Random.rand(MAX_PK) + 1) + world.update(randomNumber: Random.rand(MAX_PK) + 1) world.attributes end @@ -60,4 +60,3 @@ end end - diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 8ecb1c75fca..552cffd0e1c 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -12,9 +12,7 @@ def bounded_queries(env) params = Rack::Utils.parse_query(env['QUERY_STRING']) queries = params['queries'].to_i - return QUERIES_MIN if queries < QUERIES_MIN - return QUERIES_MAX if queries > QUERIES_MAX - queries + queries.clamp(QUERIES_MIN, QUERIES_MAX) end # Return a random number between 1 and MAX_PK diff --git a/frameworks/Ruby/rack/pg_db.rb b/frameworks/Ruby/rack/pg_db.rb index 1e083b004c4..e8c8634c60c 100644 --- a/frameworks/Ruby/rack/pg_db.rb +++ b/frameworks/Ruby/rack/pg_db.rb @@ -46,13 +46,7 @@ def select_world(id) def validate_count(count) count = count.to_i - if count < MIN_QUERIES - MIN_QUERIES - elsif count > MAX_QUERIES - MAX_QUERIES - else - count - end + count.clamp(MIN_QUERIES, MAX_QUERIES) end def select_promises(count) diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index fb0d2f1ccda..17116196eb3 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -48,10 +48,7 @@ def update def query_count queries = params[:queries].to_i - return MIN_QUERIES if queries < MIN_QUERIES - return MAX_QUERIES if queries > MAX_QUERIES - - queries + queries.clamp(MIN_QUERIES, MAX_QUERIES) end def random_id diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 194357cae2f..2ea46ac6583 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -7,9 +7,7 @@ class HelloWorld < Roda def bounded_queries queries = request.params["queries"].to_i - return QUERIES_MIN if queries < QUERIES_MIN - return QUERIES_MAX if queries > QUERIES_MAX - queries + queries.clamp(QUERIES_MIN, QUERIES_MAX) end # Return a random number between 1 and MAX_PK diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index 4008a286b42..7748fef1cf6 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -20,9 +20,7 @@ class HelloWorld < Sinatra::Base helpers do def bounded_queries queries = params[:queries].to_i - return QUERIES_MIN if queries < QUERIES_MIN - return QUERIES_MAX if queries > QUERIES_MAX - queries + queries.clamp(QUERIES_MIN, QUERIES_MAX) end def json(data) diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index 44d6d3af0dd..7b816f8884e 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -17,9 +17,7 @@ class HelloWorld < Sinatra::Base helpers do def bounded_queries queries = params[:queries].to_i - return QUERIES_MIN if queries < QUERIES_MIN - return QUERIES_MAX if queries > QUERIES_MAX - queries + queries.clamp(QUERIES_MIN, QUERIES_MAX) end def json(data) From 74f9403a76cc5be2b4b88b245331cb4d42874221 Mon Sep 17 00:00:00 2001 From: itrofimow Date: Thu, 11 Apr 2024 21:26:44 +0400 Subject: [PATCH 0434/1766] [C++] [userver] Upscale to the new environment (#8852) --- frameworks/C++/userver/userver_configs/static_config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/userver/userver_configs/static_config.yaml b/frameworks/C++/userver/userver_configs/static_config.yaml index b34b772237b..2bdcf1fbce5 100644 --- a/frameworks/C++/userver/userver_configs/static_config.yaml +++ b/frameworks/C++/userver/userver_configs/static_config.yaml @@ -1,7 +1,7 @@ # yaml components_manager: event_thread_pool: - threads: 5 + threads: 9 dedicated_timer_threads: 1 coro_pool: initial_size: 10000 # Preallocate 10000 coroutines at startup. @@ -12,7 +12,7 @@ components_manager: main-task-processor: # Make a task processor for CPU-bound couroutine tasks. thread_name: main-worker # OS will show the threads of this task processor with 'main-worker' prefix. - worker_threads: 23 + worker_threads: 46 guess-cpu-limit: true fs-task-processor: # Make a separate task processor for filesystem bound tasks. From 7c18a8ba0890fe1761f990dde180c0fdacbbebe6 Mon Sep 17 00:00:00 2001 From: Xudong Huang Date: Fri, 12 Apr 2024 02:08:52 +0800 Subject: [PATCH 0435/1766] [Rust] update may_minihttp dependency (#8851) * [Rust] update may_minihttp dependency * [Rust] [may-minihttp] update rust to 1.77 --- frameworks/Rust/may-minihttp/Cargo.toml | 2 +- frameworks/Rust/may-minihttp/may-minihttp.dockerfile | 2 +- frameworks/Rust/may-minihttp/src/main.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Rust/may-minihttp/Cargo.toml b/frameworks/Rust/may-minihttp/Cargo.toml index 17e2b1d92ee..eb03a8e4bc0 100644 --- a/frameworks/Rust/may-minihttp/Cargo.toml +++ b/frameworks/Rust/may-minihttp/Cargo.toml @@ -18,7 +18,7 @@ yarte = { version = "0.15", features = ["bytes-buf", "json"] } buf-min = { version = "0.7", features = ["bytes"] } may = { version = "0.3", default-features = false } -may_minihttp = { git = "https://github.com/Xudong-Huang/may_minihttp.git", rev = "f8241e7", default-features = false } +may_minihttp = { version = "0.1", default-features = false } may_postgres = { git = "https://github.com/Xudong-Huang/may_postgres.git", rev = "bf1d86e", default-features = false } [profile.release] diff --git a/frameworks/Rust/may-minihttp/may-minihttp.dockerfile b/frameworks/Rust/may-minihttp/may-minihttp.dockerfile index bb614e239d5..8f9ec9a1b58 100644 --- a/frameworks/Rust/may-minihttp/may-minihttp.dockerfile +++ b/frameworks/Rust/may-minihttp/may-minihttp.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.77 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/may-minihttp/src/main.rs b/frameworks/Rust/may-minihttp/src/main.rs index 7eab3409ed1..f6a817031c3 100644 --- a/frameworks/Rust/may-minihttp/src/main.rs +++ b/frameworks/Rust/may-minihttp/src/main.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use bytes::BytesMut; use may_minihttp::{HttpService, HttpServiceFactory, Request, Response}; -use may_postgres::{self, types::ToSql, Client, Statement}; +use may_postgres::{types::ToSql, Client, Statement}; use nanorand::{Rng, WyRand}; use smallvec::SmallVec; use yarte::{ywrite_html, Serialize}; From b2589a63350c17a20262e850ace2a2a2d66d2255 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 11 Apr 2024 23:05:23 +0200 Subject: [PATCH 0436/1766] [ruby/agoo] Reduce allocations (#8861) Instantiating an Array with a fixed size and a block is faster than appending to an empty array. Also map only once over the records instead of twice. --- frameworks/Ruby/agoo/app.rb | 39 +++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index 93b2cc62688..1150b8d1cb4 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -15,7 +15,8 @@ }) end -MAX_PK = 10_000 +QUERY_RANGE = (1..10_000).freeze +ALL_IDS = QUERY_RANGE.to_a QUERIES_MIN = 1 QUERIES_MAX = 500 @@ -27,7 +28,7 @@ def self.extract_queries_param(request = nil) end def self.get_one_random_number - 1 + Random.rand(MAX_PK) + Random.rand(QUERY_RANGE) end def self.get_one_record(id = get_one_random_number) @@ -141,12 +142,10 @@ def self.call(_req) class QueriesHandler < BaseHandler def self.call(req) - records = - [].tap do|r| - (extract_queries_param req).times do - r << get_one_record() - end - end + queries = extract_queries_param req + records = ALL_IDS.sample(queries).map do |id| + get_one_record(id) + end json_response(records) end @@ -154,20 +153,18 @@ def self.call(req) class UpdatesHandler < BaseHandler def self.call(req) - records = - [].tap do|r| - (extract_queries_param req).times do - r << get_one_record() - end - end - - updated_records = - records.map { |r| r['randomnumber'] = get_one_random_number; r } + queries = extract_queries_param req + records = ALL_IDS.sample(queries).map do |id| + world = get_one_record(id) + world['randomnumber'] = get_one_random_number + world + end sql_values = - updated_records. - map { |r| "(#{ r['id'] }, #{ r['randomnumber'] })"}. - join(', ') + records. + map { |r| + "(#{ r['id'] }, #{ r['randomnumber'] })" + }.join(', ') $pool.with do |conn| conn.exec(<<-SQL) @@ -180,7 +177,7 @@ def self.call(req) SQL end - json_response(updated_records) + json_response(records) end end From 9f294c665940f7f0e1f5b5115d23ae1f97d2b97d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 00:00:32 +0000 Subject: [PATCH 0437/1766] Bump idna from 3.1 to 3.7 in /frameworks/Python/async-worker Bumps [idna](https://github.com/kjd/idna) from 3.1 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.1...v3.7) --- updated-dependencies: - dependency-name: idna dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Python/async-worker/Pipfile.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frameworks/Python/async-worker/Pipfile.lock b/frameworks/Python/async-worker/Pipfile.lock index aaa9ae7968e..2ecfdb16067 100644 --- a/frameworks/Python/async-worker/Pipfile.lock +++ b/frameworks/Python/async-worker/Pipfile.lock @@ -146,11 +146,12 @@ }, "idna": { "hashes": [ - "sha256:5205d03e7bcbb919cc9c19885f9920d622ca52448306f2377daede5cf3faac16", - "sha256:c5b02147e01ea9920e6b0a3f1f7bb833612d507592c837a6c49552768f4054e1" + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], - "markers": "python_version >= '3.4'", - "version": "==3.1" + "index": "pypi", + "markers": "python_version >= '3.5'", + "version": "==3.7" }, "multidict": { "hashes": [ From 1299dd118ab146be45f9ddc427ed81c4d4d6b9fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 00:55:15 +0000 Subject: [PATCH 0438/1766] Bump idna from 3.3 to 3.7 in /frameworks/Python/quart Bumps [idna](https://github.com/kjd/idna) from 3.3 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.3...v3.7) --- updated-dependencies: - dependency-name: idna dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/quart/requirements-uvicorn.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/quart/requirements-uvicorn.txt b/frameworks/Python/quart/requirements-uvicorn.txt index 8518917c668..765f8011499 100644 --- a/frameworks/Python/quart/requirements-uvicorn.txt +++ b/frameworks/Python/quart/requirements-uvicorn.txt @@ -1,7 +1,7 @@ anyio==3.6.1 gunicorn==20.1.0 httptools==0.4.0 -idna==3.3 +idna==3.7 python-dotenv==0.20.0 PyYAML==6.0 sniffio==1.3.0 From cf829655d3ef9eb69a2f1d497ccff8d01b781bf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 01:02:29 +0000 Subject: [PATCH 0439/1766] Bump idna from 3.3 to 3.7 in /frameworks/Python/starlette Bumps [idna](https://github.com/kjd/idna) from 3.3 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.3...v3.7) --- updated-dependencies: - dependency-name: idna 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 6c1a7f01ed6..ab240e93ab4 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -1,7 +1,7 @@ asyncpg==0.26.0 gunicorn==20.1.0 httptools==0.5.0 -idna==3.3 +idna==3.7 Jinja2==3.1.3 MarkupSafe==2.1.1 python-dotenv==0.20.0 From 80a936ec7e1fe3be96b38bf4c082b3b40a9561ff Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Fri, 12 Apr 2024 14:13:12 +0200 Subject: [PATCH 0440/1766] Upgrade to Inverno 1.9.0 + make app resilient to DB connection loss --- frameworks/Java/inverno/pom.xml | 36 ++++++++----------- .../internal/SqlClientReactorScope.java | 4 ++- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index 40158dba480..c056d047bbc 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.7.0 + 1.9.0 com.techempower inverno-benchmark @@ -71,31 +71,12 @@ io.netty netty-handler-proxy - ${version.netty} io.netty netty-resolver-dns - ${version.netty} - - - - io.netty.incubator - netty-incubator-transport-native-io_uring - linux-x86_64 - - - - io.vertx - vertx-io_uring-incubator - - org.apache.logging.log4j log4j-core @@ -138,6 +119,9 @@
+ + --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64 +
@@ -146,10 +130,15 @@ io.inverno.io_uring - io.netty - netty-transport-native-epoll + io.netty.incubator + netty-incubator-transport-native-io_uring linux-x86_64 + + + io.vertx + vertx-io_uring-incubator + @@ -177,6 +166,9 @@ + + --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64 + diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java index 81b30069ec2..d3b8a463865 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java @@ -59,6 +59,8 @@ public void destroy() { @Override protected Mono create() { - return Mono.fromCompletionStage(PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()).map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn)).cache(); + return Mono.fromCompletionStage(() -> PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()) + .map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn)) + .cacheInvalidateWhen(client -> ((ConnectionSqlClient)client).onClose()); } } From 43eb23eb2e26a22e11376aee3747601196128bc9 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 21:22:13 +0800 Subject: [PATCH 0441/1766] use local file --- frameworks/C++/paozhu/paozhu.dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 4054761398f..2ddd94248a7 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -16,7 +16,10 @@ WORKDIR / RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip RUN unzip benchmark.zip -RUN mv ./benchmark/* ./ +# RUN mv ./benchmark/* ./ + +WORKDIR /benchmark +COPY ./ ./ RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build From 27e69a20642e04d4a1af2f83d35a25d496ffe091 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 21:31:52 +0800 Subject: [PATCH 0442/1766] use git clone --- frameworks/C++/paozhu/paozhu.dockerfile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 2ddd94248a7..8453a6c8f0c 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -14,11 +14,12 @@ ENV LC_ALL en_US.UTF-8 WORKDIR / -RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip -RUN unzip benchmark.zip +# RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip +RUN git clone https://github.com/hggq/paozhu +# RUN unzip benchmark.zip +WORKDIR /paozhu +RUN unzip asio.zip # RUN mv ./benchmark/* ./ - -WORKDIR /benchmark COPY ./ ./ RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release From 4d11acc270371336fef2db827398d64a27dda7f9 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 21:43:39 +0800 Subject: [PATCH 0443/1766] add conf --- .../C++/paozhu/paozhu_benchmark/conf/orm.conf | 20 +++++++ .../paozhu/paozhu_benchmark/conf/server.conf | 55 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf new file mode 100644 index 00000000000..1700d25a66e --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf @@ -0,0 +1,20 @@ +[default] +type=main +host=tfb-database +port=3306 +dbname=hello_world +user=benchmarkdbuser +password=benchmarkdbpass +pretable= +maxpool=5 +dbtype=mysql + +type=second +host=tfb-database +port=3306 +dbname=hello_world +user=benchmarkdbuser +password=benchmarkdbpass +pretable= +maxpool=20 +dbtype=mysql diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf new file mode 100755 index 00000000000..0433beac921 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf @@ -0,0 +1,55 @@ +[default] +threadmax=1024 +threadmin=5 +httpport=8888 +httpsport=4430 +cothreadnum=8 ;Coroutines run on thread num + +http2_enable=0 +debug_enable=1 +deamon_enable=0 +mainhost=www.869869.com +certificate_chain_file=www.869869.com.pem +private_key_file=www.869869.com.key +tmp_dh_file=dh4096.pem +reboot_password=e10adc3949ba59abbe56e057f20f883e ;md5(md5("123456")+"rand_char"+md5("123456")) +session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve +static_file_compress_cache=1 ;1 enable, Cache static file compress(gzip,br) content to cache directory +modelspath=/root/benchmark/models +serverpath=/root/benchmark +viewpath=/root/benchmark/view +viewsopath=/root/benchmark/module/view + +controlpath=/root/benchmark/controller +controlsopath=/root/benchmark/module/controller + +temppath=/root/benchmark/temp +logpath=/root/benchmark/log +wwwpath=/root/benchmark/www/default +pluginspath=/root/benchmark/plugins +libspath=/root/benchmark/libs +directorylist=1 +index=index.html +;usehtmlcache=1 +;usehtmlcachetime=3600 +rewrite_404=0 ;1 file 2 action url path +rewrite_404_action=index.html +method_pre= +method_after= +show_visitinfo=0 +upload_max_size=16777216 +[www.869869.com] +wwwpath=/root/benchmark/www/default +http2_enable=1 +;rewrite_404=1 +;rewrite_404_action=index.html|psy/index.html|exam/index.html +;controlsopath=/root/benchmark/docs/controller +static_pre=downloadfileauth|upload +method_pre= ;api/dev/hostcors +method_after= +isuse_php=0 +rewrite_php=/root/benchmark/www/thinkphp/public|index.php +fastcgi_host=127.0.0.1 +fastcgi_port=9000 +upload_max_size=16777216 + From c31468f05c4ed710864e1ff07965ce77124c8bfa Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 21:58:45 +0800 Subject: [PATCH 0444/1766] add conf --- frameworks/C++/paozhu/paozhu.dockerfile | 2 ++ frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 8453a6c8f0c..1408772fbdf 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -21,6 +21,8 @@ WORKDIR /paozhu RUN unzip asio.zip # RUN mv ./benchmark/* ./ COPY ./ ./ +run cat ./conf/server.conf +run cat ./conf/orm.conf RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf index 0433beac921..d15847751ef 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf @@ -28,7 +28,7 @@ logpath=/root/benchmark/log wwwpath=/root/benchmark/www/default pluginspath=/root/benchmark/plugins libspath=/root/benchmark/libs -directorylist=1 +directorylist=0 index=index.html ;usehtmlcache=1 ;usehtmlcachetime=3600 From cf136c2562c84180f65d3ae485cd236929c73829 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 22:07:16 +0800 Subject: [PATCH 0445/1766] add conf --- frameworks/C++/paozhu/paozhu.dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 1408772fbdf..9680a1eb6ef 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -20,13 +20,16 @@ RUN git clone https://github.com/hggq/paozhu WORKDIR /paozhu RUN unzip asio.zip # RUN mv ./benchmark/* ./ -COPY ./ ./ +COPY ./ / run cat ./conf/server.conf run cat ./conf/orm.conf RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build +RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release +RUN cmake --build build + EXPOSE 8888 CMD ./bin/paozhu From 34cb558924a934a014b5e2a2b3f7c4f6ab3fb32d Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 22:16:39 +0800 Subject: [PATCH 0446/1766] add conf --- frameworks/C++/paozhu/paozhu.dockerfile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 9680a1eb6ef..583a21a2d87 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -12,15 +12,21 @@ ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 +COPY ./ ./ +RUN ls -l WORKDIR / # RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip +RUN ls -l +# RUN mv ./benchmark/* ./ +COPY ./conf/server.conf ./paozhu/conf/server.conf +COPY ./conf/orm.conf ./paozhu/conf/orm.conf + + WORKDIR /paozhu RUN unzip asio.zip -# RUN mv ./benchmark/* ./ -COPY ./ / run cat ./conf/server.conf run cat ./conf/orm.conf From 826dcf9c8d1545068a4d74f0b4a6874ee43f6a4f Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 22:25:41 +0800 Subject: [PATCH 0447/1766] add conf --- frameworks/C++/paozhu/paozhu.dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 583a21a2d87..918313ee1fb 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -21,9 +21,9 @@ RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN ls -l # RUN mv ./benchmark/* ./ -COPY ./conf/server.conf ./paozhu/conf/server.conf -COPY ./conf/orm.conf ./paozhu/conf/orm.conf - +COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf +COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf +COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt WORKDIR /paozhu RUN unzip asio.zip From e235654c0e6ab9b29a7f3fcf09858ea030ebbc80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 14:31:02 +0000 Subject: [PATCH 0448/1766] Bump mysql2 from 2.2.5 to 3.9.4 in /frameworks/JavaScript/spliffy Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 2.2.5 to 3.9.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v2.2.5...v3.9.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../JavaScript/spliffy/package-lock.json | 86 +++++++------------ frameworks/JavaScript/spliffy/package.json | 2 +- 2 files changed, 32 insertions(+), 56 deletions(-) diff --git a/frameworks/JavaScript/spliffy/package-lock.json b/frameworks/JavaScript/spliffy/package-lock.json index f0c6a55ff5b..5eeb84bba2b 100644 --- a/frameworks/JavaScript/spliffy/package-lock.json +++ b/frameworks/JavaScript/spliffy/package-lock.json @@ -1073,9 +1073,9 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "etag": { "version": "1.8.1", @@ -1135,7 +1135,7 @@ "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, "isarray": { "version": "0.0.1", @@ -1152,17 +1152,14 @@ } }, "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==" }, "memory-pager": { "version": "1.5.0", @@ -1192,48 +1189,32 @@ } }, "mysql2": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", - "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.4.tgz", + "integrity": "sha512-OEESQuwxMza803knC1YSt7NMuc1BrK9j7gZhCSs2WAyxr1vfiI7QLaLOKTh5c9SWGz98qVyQUbK8/WckevNQhg==", "requires": { - "denque": "^1.4.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", - "iconv-lite": "^0.6.2", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" - }, - "dependencies": { - "sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" - } } }, "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "requires": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "dependencies": { "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, @@ -1377,11 +1358,6 @@ "xtend": "^4.0.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -1410,7 +1386,7 @@ "seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "smart-buffer": { "version": "4.2.0", @@ -1443,6 +1419,11 @@ "readable-stream": "^3.0.0" } }, + "sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -1503,11 +1484,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/frameworks/JavaScript/spliffy/package.json b/frameworks/JavaScript/spliffy/package.json index 0d1a3d5dbf3..b8eb02388c5 100644 --- a/frameworks/JavaScript/spliffy/package.json +++ b/frameworks/JavaScript/spliffy/package.json @@ -6,7 +6,7 @@ "@srfnstack/spliffy": "0.6.1", "html-escaper": "3.0.3", "mongodb": "^4.17.0", - "mysql2": "^2.2.5", + "mysql2": "^3.9.4", "node-cache": "5.1.2", "pg": "8.6.0", "pg-native": "3.0.1" From b7b6f2989ab58d1f9bb7757a123f78aecb76b025 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 22:41:24 +0800 Subject: [PATCH 0449/1766] use local files --- frameworks/C++/paozhu/paozhu.dockerfile | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 918313ee1fb..5bbe379a33a 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -13,28 +13,25 @@ ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 COPY ./ ./ -RUN ls -l WORKDIR / # RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip -RUN ls -l -# RUN mv ./benchmark/* ./ +RUN rm -Rf ./paozhu/controller +RUN copy ./paozhu_benchmark/controller ./paozhu/ +RUN copy ./paozhu_benchmark/common ./paozhu/ + COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt WORKDIR /paozhu RUN unzip asio.zip -run cat ./conf/server.conf -run cat ./conf/orm.conf RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build -RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release -RUN cmake --build build EXPOSE 8888 From 0779d8919e077b0f15305f4cceca83f7bb00fa34 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 22:46:01 +0800 Subject: [PATCH 0450/1766] use local files --- frameworks/C++/paozhu/paozhu.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 5bbe379a33a..e4a06f4a500 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -19,8 +19,8 @@ WORKDIR / RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller -RUN copy ./paozhu_benchmark/controller ./paozhu/ -RUN copy ./paozhu_benchmark/common ./paozhu/ +COPY ./paozhu_benchmark/controller ./paozhu/ +COPY ./paozhu_benchmark/common ./paozhu/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf From 2f3eb3c8d6711fcff11e770eab84b42bfcf6be07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 14:52:46 +0000 Subject: [PATCH 0451/1766] Bump mysql2 from 1.6.5 to 3.9.4 in /frameworks/JavaScript/sailsjs Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 1.6.5 to 3.9.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v1.6.5...v3.9.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/sailsjs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/sailsjs/package.json b/frameworks/JavaScript/sailsjs/package.json index 90e44e19f8e..7770c764143 100644 --- a/frameworks/JavaScript/sailsjs/package.json +++ b/frameworks/JavaScript/sailsjs/package.json @@ -10,7 +10,7 @@ "ejs": "2.5.7", "handlebars": "4.7.6", "mysql": "2.16.0", - "mysql2": "1.6.5", + "mysql2": "3.9.4", "pg": "6.0.5", "pg-hstore": "2.3.2", "rc": "1.1.6", From 2c98ff2b7677ca378499c787e7dba5e9bc2019f0 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 22:53:48 +0800 Subject: [PATCH 0452/1766] use local files --- frameworks/C++/paozhu/paozhu.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index e4a06f4a500..8902739a00d 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -19,6 +19,7 @@ WORKDIR / RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller +RUN rm -Rf ./paozhu/common COPY ./paozhu_benchmark/controller ./paozhu/ COPY ./paozhu_benchmark/common ./paozhu/ From 05372250c56e36737dad2a3c20791f6dce8428cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 14:54:35 +0000 Subject: [PATCH 0453/1766] Bump mysql2 from 2.2.5 to 3.9.4 in /frameworks/JavaScript/fastify Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 2.2.5 to 3.9.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v2.2.5...v3.9.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/fastify/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/fastify/package.json b/frameworks/JavaScript/fastify/package.json index e0740139501..daed2aad600 100644 --- a/frameworks/JavaScript/fastify/package.json +++ b/frameworks/JavaScript/fastify/package.json @@ -10,7 +10,7 @@ "handlebars": "4.7.6", "knex": "2.4.2", "mongodb": "3.5.9", - "mysql2": "2.2.5", + "mysql2": "3.9.4", "pg": "8.5.1" } } From 0d1f362d4a0548c3bd526170ca0001edf70b9219 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 15:01:23 +0000 Subject: [PATCH 0454/1766] Bump mysql2 from 2.2.5 to 3.9.4 in /frameworks/JavaScript/express Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 2.2.5 to 3.9.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v2.2.5...v3.9.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 60c1f6a6b32..acb57d7c20c 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -8,7 +8,7 @@ "escape-html": "1.0.3", "express": "4.18.2", "mongoose": "5.13.20", - "mysql2": "2.2.5", + "mysql2": "3.9.4", "pg": "8.5.0", "pg-promise": "10.7.3", "pug": "2.0.1", From 6fa9da635c02a8fb232f49b66c55fd0ad3830ab2 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 12 Apr 2024 23:04:43 +0800 Subject: [PATCH 0455/1766] use local files --- frameworks/C++/paozhu/paozhu.dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 8902739a00d..2b3329b664c 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -19,9 +19,11 @@ WORKDIR / RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller -RUN rm -Rf ./paozhu/common + COPY ./paozhu_benchmark/controller ./paozhu/ -COPY ./paozhu_benchmark/common ./paozhu/ +COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf From d49e17b7645e101589a09c3444a82f8dec3ecfe9 Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Fri, 12 Apr 2024 17:40:04 +0200 Subject: [PATCH 0456/1766] Upgrade to Inverno 1.9.0 (#8865) * 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 * Upgrade to Inverno 1.9.0 + make app resilient to DB connection loss --- frameworks/Java/inverno/pom.xml | 36 ++++++++----------- .../internal/SqlClientReactorScope.java | 4 ++- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index 40158dba480..c056d047bbc 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.7.0 + 1.9.0 com.techempower inverno-benchmark @@ -71,31 +71,12 @@ io.netty netty-handler-proxy - ${version.netty} io.netty netty-resolver-dns - ${version.netty} - - - - io.netty.incubator - netty-incubator-transport-native-io_uring - linux-x86_64 - - - - io.vertx - vertx-io_uring-incubator - - org.apache.logging.log4j log4j-core @@ -138,6 +119,9 @@ + + --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64 + @@ -146,10 +130,15 @@ io.inverno.io_uring - io.netty - netty-transport-native-epoll + io.netty.incubator + netty-incubator-transport-native-io_uring linux-x86_64 + + + io.vertx + vertx-io_uring-incubator + @@ -177,6 +166,9 @@ + + --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64 + diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java index 81b30069ec2..d3b8a463865 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java @@ -59,6 +59,8 @@ public void destroy() { @Override protected Mono create() { - return Mono.fromCompletionStage(PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()).map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn)).cache(); + return Mono.fromCompletionStage(() -> PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()) + .map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn)) + .cacheInvalidateWhen(client -> ((ConnectionSqlClient)client).onClose()); } } From 89d83c084a74ff8694c6e1ae739ba8f86f5dc080 Mon Sep 17 00:00:00 2001 From: Harry Yang Date: Fri, 12 Apr 2024 23:52:08 +0800 Subject: [PATCH 0457/1766] Add new framework 'today' (#8815) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add new framework Java/today * change build config * :arrow_up: 升级版本 4.0.0-Draft.6 * 更新 /updates API * 打开日志 * :fire: 删除 /updates API 偶尔会出错,目前尚未找到原因 * :art: 更新 /updates API * :art: 添加 epoll 支持 * :fire: remove all of the files that aren't necessary for the tests --- frameworks/Java/today/.gitignore | 9 ++ frameworks/Java/today/README.md | 26 ++++ frameworks/Java/today/benchmark_config.json | 30 +++++ frameworks/Java/today/build.gradle | 63 +++++++++ frameworks/Java/today/config.toml | 20 +++ frameworks/Java/today/gradle.properties | 7 + frameworks/Java/today/settings.gradle | 15 +++ .../cn/taketoday/benchmark/AppConfig.java | 70 ++++++++++ .../benchmark/BenchmarkApplication.java | 13 ++ .../benchmark/http/BenchmarkHttpHandler.java | 120 ++++++++++++++++++ .../cn/taketoday/benchmark/model/Fortune.java | 54 ++++++++ .../cn/taketoday/benchmark/model/World.java | 55 ++++++++ .../src/main/resources/application-dev.yaml | 9 ++ .../src/main/resources/application-test.yaml | 14 ++ .../today/src/main/resources/application.yaml | 41 ++++++ .../src/main/resources/templates/fortunes.ftl | 21 +++ frameworks/Java/today/today.dockerfile | 11 ++ 17 files changed, 578 insertions(+) create mode 100644 frameworks/Java/today/.gitignore create mode 100644 frameworks/Java/today/README.md create mode 100755 frameworks/Java/today/benchmark_config.json create mode 100644 frameworks/Java/today/build.gradle create mode 100644 frameworks/Java/today/config.toml create mode 100644 frameworks/Java/today/gradle.properties create mode 100644 frameworks/Java/today/settings.gradle create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java create mode 100644 frameworks/Java/today/src/main/resources/application-dev.yaml create mode 100644 frameworks/Java/today/src/main/resources/application-test.yaml create mode 100644 frameworks/Java/today/src/main/resources/application.yaml create mode 100644 frameworks/Java/today/src/main/resources/templates/fortunes.ftl create mode 100644 frameworks/Java/today/today.dockerfile diff --git a/frameworks/Java/today/.gitignore b/frameworks/Java/today/.gitignore new file mode 100644 index 00000000000..ea1cbb085ef --- /dev/null +++ b/frameworks/Java/today/.gitignore @@ -0,0 +1,9 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build + +.idea +today.properties +gradle \ No newline at end of file diff --git a/frameworks/Java/today/README.md b/frameworks/Java/today/README.md new file mode 100644 index 00000000000..a7c42243f25 --- /dev/null +++ b/frameworks/Java/today/README.md @@ -0,0 +1,26 @@ +# [TODAY Infrastructure](https://github.com/TAKETODAY/today-infrastructure) Benchmarking Test + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/queries?queries= + +### UPDATE + +http://localhost:8080/update?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Java/today/benchmark_config.json b/frameworks/Java/today/benchmark_config.json new file mode 100755 index 00000000000..92c3c756ad1 --- /dev/null +++ b/frameworks/Java/today/benchmark_config.json @@ -0,0 +1,30 @@ +{ + "framework": "today", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "mysql", + "framework": "Today", + "language": "Java", + "flavor": "None", + "orm": "micro", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Today", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Java/today/build.gradle b/frameworks/Java/today/build.gradle new file mode 100644 index 00000000000..a95a1982f4e --- /dev/null +++ b/frameworks/Java/today/build.gradle @@ -0,0 +1,63 @@ +description = "benchmark" + +apply plugin: "java" +apply plugin: "application" +apply plugin: 'cn.taketoday.application' +apply plugin: 'io.spring.dependency-management' + +configure(allprojects) { + group = "cn.taketoday.benchmark" + + repositories { + mavenCentral() + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + } +} + +dependencies { + implementation 'cn.taketoday:today-starter-netty' + implementation 'cn.taketoday:today-starter-json' + implementation 'cn.taketoday:today-starter-jdbc' + implementation 'cn.taketoday:today-starter-web' + implementation 'cn.taketoday:today-starter-freemarker' + + implementation 'mysql:mysql-connector-java' + + implementation 'ch.qos.logback:logback-classic' + + implementation('io.netty:netty-transport-native-epoll') { + artifact { + classifier = 'linux-x86_64' + } + } + +// implementation('io.netty:netty-transport-native-kqueue') { +// artifact { +// classifier = 'osx-aarch_64' +// } +// } + +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +application { + mainClass = 'cn.taketoday.benchmark.BenchmarkApplication' + applicationDefaultJvmArgs = [ + "-server", + "-XX:+UseNUMA", + "-XX:+UseG1GC", + "-XX:+DisableExplicitGC", + "-XX:-StackTraceInThrowable", + "-XX:+UseStringDeduplication", + "-Dinfra.profiles.active=test", + "-Dio.netty.buffer.checkBounds=false", + "-Dio.netty.buffer.checkAccessible=false", + "-Dio.netty.leakDetection.level=disabled", + "--add-opens=java.base/java.nio=ALL-UNNAMED", + "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED" + ] +} diff --git a/frameworks/Java/today/config.toml b/frameworks/Java/today/config.toml new file mode 100644 index 00000000000..dc2e84c877d --- /dev/null +++ b/frameworks/Java/today/config.toml @@ -0,0 +1,20 @@ +[framework] +name = "today" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Fullstack" +database = "mysql" +database_os = "Linux" +display_name = "today" +os = "Linux" +orm = "raw" +platform = "Netty" +webserver = "None" +versus = "None" diff --git a/frameworks/Java/today/gradle.properties b/frameworks/Java/today/gradle.properties new file mode 100644 index 00000000000..9379f1c95c9 --- /dev/null +++ b/frameworks/Java/today/gradle.properties @@ -0,0 +1,7 @@ +version=1.0.0 +#infraVersion=4.0.0-Draft.6-SNAPSHOT +infraVersion=4.0.0-Draft.6 + +org.gradle.caching=true +org.gradle.jvmargs=-Xmx2048m +org.gradle.parallel=true diff --git a/frameworks/Java/today/settings.gradle b/frameworks/Java/today/settings.gradle new file mode 100644 index 00000000000..8cb2bee3734 --- /dev/null +++ b/frameworks/Java/today/settings.gradle @@ -0,0 +1,15 @@ +buildscript { + repositories { + mavenLocal() + maven { + url "https://oss.sonatype.org/content/repositories/snapshots/" + } + mavenCentral() + } + + dependencies { + classpath "cn.taketoday:infra-gradle-plugin:$infraVersion" + } +} + +rootProject.name = 'today' diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java new file mode 100644 index 00000000000..1d385a77133 --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java @@ -0,0 +1,70 @@ +package cn.taketoday.benchmark; + +import java.time.ZonedDateTime; + +import javax.sql.DataSource; + +import cn.taketoday.beans.factory.annotation.DisableAllDependencyInjection; +import cn.taketoday.beans.factory.config.BeanDefinition; +import cn.taketoday.context.annotation.Configuration; +import cn.taketoday.context.annotation.Role; +import cn.taketoday.framework.web.netty.NettyRequestConfig; +import cn.taketoday.framework.web.netty.SendErrorHandler; +import cn.taketoday.jdbc.RepositoryManager; +import cn.taketoday.jdbc.persistence.EntityManager; +import cn.taketoday.stereotype.Component; +import io.netty.handler.codec.http.DefaultHttpHeadersFactory; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpHeadersFactory; +import io.netty.handler.codec.http.multipart.DefaultHttpDataFactory; + +import static cn.taketoday.http.HttpHeaders.DATE_FORMATTER; + +/** + * @author
Harry Yang + * @since 1.0 2024/3/19 12:59 + */ +@DisableAllDependencyInjection +@Role(BeanDefinition.ROLE_INFRASTRUCTURE) +@Configuration(proxyBeanMethods = false) +class AppConfig { + + private static final DefaultHttpHeadersFactory headersFactory = DefaultHttpHeadersFactory.headersFactory(); + + @Component + static RepositoryManager repositoryManager(DataSource dataSource) { + return new RepositoryManager(dataSource); + } + + @Component + static EntityManager entityManager(RepositoryManager repositoryManager) { + return repositoryManager.getEntityManager(); + } + + @Component + @Role(BeanDefinition.ROLE_INFRASTRUCTURE) + static NettyRequestConfig nettyRequestConfig(SendErrorHandler sendErrorHandler) { + var factory = new DefaultHttpDataFactory(false); + return NettyRequestConfig.forBuilder() + .httpDataFactory(factory) + .sendErrorHandler(sendErrorHandler) + .headersFactory(new HttpHeadersFactory() { + + @Override + public HttpHeaders newHeaders() { + HttpHeaders headers = headersFactory.newHeaders(); + headers.set("Server", "TODAY"); + headers.set("Date", DATE_FORMATTER.format(ZonedDateTime.now())); + return headers; + } + + @Override + public HttpHeaders newEmptyHeaders() { + return headersFactory.newEmptyHeaders(); + } + }) + .secure(false) + .build(); + } + +} diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java new file mode 100644 index 00000000000..0e2eea0f995 --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java @@ -0,0 +1,13 @@ +package cn.taketoday.benchmark; + +import cn.taketoday.framework.Application; +import cn.taketoday.framework.InfraApplication; + +@InfraApplication +public class BenchmarkApplication { + + public static void main(String[] args) { + Application.run(BenchmarkApplication.class, args); + } + +} diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java new file mode 100644 index 00000000000..d0d240534bd --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java @@ -0,0 +1,120 @@ +package cn.taketoday.benchmark.http; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +import cn.taketoday.benchmark.model.Fortune; +import cn.taketoday.benchmark.model.World; +import cn.taketoday.http.MediaType; +import cn.taketoday.http.ResponseEntity; +import cn.taketoday.jdbc.persistence.EntityManager; +import cn.taketoday.lang.Nullable; +import cn.taketoday.ui.Model; +import cn.taketoday.web.annotation.GET; +import cn.taketoday.web.annotation.RestController; +import cn.taketoday.web.view.ViewRef; + +/** + * @author Harry Yang + * @since 1.0 2024/3/19 12:56 + */ +@RestController +final class BenchmarkHttpHandler { + + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER = 10_000; + + private final EntityManager entityManager; + + BenchmarkHttpHandler(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @GET("/json") + public ResponseEntity> json() { + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(Map.of("message", "Hello, World!")); + } + + @GET("/plaintext") + public String plaintext() { + return "Hello, World!"; + } + + @GET("/db") + public World db() { + return entityManager.findById(World.class, nextInt()); + } + + @GET("/queries") + public List queries(@Nullable String queries) { + return randomNumbers() + .mapToObj(this::findWorldById) + .limit(parseQueryCount(queries)) + .toList(); + } + + @GET("/updates") + public List updates(@Nullable String queries) { + return randomNumbers() + .mapToObj(this::findWorldById) + .filter(Objects::nonNull) + .peek(world -> { + world.setRandomNumber(nextInt()); + entityManager.updateById(world); + }) + .limit(parseQueryCount(queries)) + .toList(); + } + + @GET("/fortunes") + public ViewRef fortunes(Model model) { + List fortunes = entityManager.find(Fortune.class); + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + fortunes.sort(Comparator.comparing(Fortune::getMessage)); + + model.addAttribute("fortunes", fortunes); + return ViewRef.forViewName("fortunes"); + } + + @Nullable + private World findWorldById(int id) { + return entityManager.findById(World.class, boxed[id]); + } + + // + + private static IntStream randomNumbers() { + return ThreadLocalRandom.current() + .ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER) + .distinct(); + } + + private static final Integer[] boxed = IntStream.range(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER + 1) + .boxed() + .toArray(Integer[]::new); + + private static Integer nextInt() { + return boxed[ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER)]; + } + + private static int parseQueryCount(@Nullable String textValue) { + if (textValue == null) { + return 1; + } + int parsedValue; + try { + parsedValue = Integer.parseInt(textValue); + } + catch (NumberFormatException e) { + return 1; + } + return Math.min(500, Math.max(1, parsedValue)); + } + +} diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java new file mode 100644 index 00000000000..a261c1434bd --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java @@ -0,0 +1,54 @@ +package cn.taketoday.benchmark.model; + +import java.util.Objects; + +import cn.taketoday.jdbc.persistence.Id; +import cn.taketoday.jdbc.persistence.Table; + +@Table("fortune") +public class Fortune { + + @Id + private Integer id; + + private String message; + + public Fortune() { } + + public Fortune(Integer id, String message) { + this.id = id; + this.message = message; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getId() { + return id; + } + + public String getMessage() { + return message; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof Fortune fortune)) + return false; + return Objects.equals(id, fortune.id) + && Objects.equals(message, fortune.message); + } + + @Override + public int hashCode() { + return Objects.hash(id, message); + } + +} diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java new file mode 100644 index 00000000000..04c60c8445f --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java @@ -0,0 +1,55 @@ +package cn.taketoday.benchmark.model; + +import java.util.Objects; + +import cn.taketoday.jdbc.persistence.Column; +import cn.taketoday.jdbc.persistence.Id; +import cn.taketoday.jdbc.persistence.Table; + +@Table("world") +public class World { + + @Id + private Integer id; + + @Column("randomNumber") + private Integer randomNumber; + + public World() { } + + public World(Integer id, Integer randomNumber) { + this.id = id; + this.randomNumber = randomNumber; + } + + public Integer getId() { + return id; + } + + public Integer getRandomNumber() { + return randomNumber; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setRandomNumber(Integer randomNumber) { + this.randomNumber = randomNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof World world)) + return false; + return Objects.equals(id, world.id) + && Objects.equals(randomNumber, world.randomNumber); + } + + @Override + public int hashCode() { + return Objects.hash(id, randomNumber); + } +} diff --git a/frameworks/Java/today/src/main/resources/application-dev.yaml b/frameworks/Java/today/src/main/resources/application-dev.yaml new file mode 100644 index 00000000000..07dbdf12fbc --- /dev/null +++ b/frameworks/Java/today/src/main/resources/application-dev.yaml @@ -0,0 +1,9 @@ +datasource: + url: jdbc:mysql://localhost:3306/hello_world?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: 88888888 + +logging: + level: + root: info + sql: debug \ No newline at end of file diff --git a/frameworks/Java/today/src/main/resources/application-test.yaml b/frameworks/Java/today/src/main/resources/application-test.yaml new file mode 100644 index 00000000000..e901f8a0476 --- /dev/null +++ b/frameworks/Java/today/src/main/resources/application-test.yaml @@ -0,0 +1,14 @@ +datasource: + url: jdbc:mysql://tfb-database:3306/hello_world?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: benchmarkdbuser + password: benchmarkdbpass + +logging: + level: + root: info + +server: + netty: + acceptor-threads: 4 + worker-threads: 8 + max-connection: 65535 \ No newline at end of file diff --git a/frameworks/Java/today/src/main/resources/application.yaml b/frameworks/Java/today/src/main/resources/application.yaml new file mode 100644 index 00000000000..650df4454a5 --- /dev/null +++ b/frameworks/Java/today/src/main/resources/application.yaml @@ -0,0 +1,41 @@ +app: + name: benchmark-app + +server: + port: 8080 + +infra: + output: + ansi: + enabled: always + +freemarker: + cache: true + settings: + classic_compatible: true + date_format: yyyy-MM-dd + datetime_format: yyyy-MM-dd HH:mm:ss + default_encoding: UTF-8 + locale: UTF-8 + log_template_exceptions: false + number_format: 0.#### + tag_syntax: auto_detect + template_exception_handler: ignore + template_update_delay: 0 + time_format: HH:mm:ss + url_escaping_charset: UTF-8 + +datasource: + name: 'app-datasource' + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + hikari: + maximum-pool-size: 20 + max-lifetime: 120000 + connection-test-query: 'select 1' + +logging: + level: + root: OFF + pattern: + dateformat: 'yyyy-MM-dd HH:mm:ss.SSS' \ No newline at end of file diff --git a/frameworks/Java/today/src/main/resources/templates/fortunes.ftl b/frameworks/Java/today/src/main/resources/templates/fortunes.ftl new file mode 100644 index 00000000000..0ad737e5dcc --- /dev/null +++ b/frameworks/Java/today/src/main/resources/templates/fortunes.ftl @@ -0,0 +1,21 @@ +<#-- @ftlvariable name="fortunes" type="cn.taketoday.benchmark.model.Fortune[]" --> + + + + Fortunes + + + + + + + + <#list fortunes as fortune> + + + + + +
idmessage
#{fortune.id}${fortune.message?html}
+ + \ No newline at end of file diff --git a/frameworks/Java/today/today.dockerfile b/frameworks/Java/today/today.dockerfile new file mode 100644 index 00000000000..b063749f6b1 --- /dev/null +++ b/frameworks/Java/today/today.dockerfile @@ -0,0 +1,11 @@ +FROM gradle:8.6.0-jdk17 as build +COPY --chown=gradle:gradle . /home/gradle/src +WORKDIR /home/gradle/src +RUN gradle installInfraDist --no-daemon + +FROM openjdk:21 +WORKDIR /today +COPY --from=build /home/gradle/src/build/install/today-infra-app/ ./ + +EXPOSE 8080 +ENTRYPOINT "./bin/today" From 45537e15fe972f112fb227f5dab0490d0e81875e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 20:49:53 +0000 Subject: [PATCH 0458/1766] Bump io.undertow:undertow-core in /frameworks/Java/undertow-jersey Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.5.Final to 2.3.12.Final. - [Commits](https://github.com/undertow-io/undertow/compare/2.3.5.Final...2.3.12.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/undertow-jersey/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/undertow-jersey/pom.xml b/frameworks/Java/undertow-jersey/pom.xml index 2a11ad2b658..5be3dd82456 100644 --- a/frameworks/Java/undertow-jersey/pom.xml +++ b/frameworks/Java/undertow-jersey/pom.xml @@ -174,7 +174,7 @@ io.undertow undertow-core - 2.3.5.Final + 2.3.12.Final From 744a73970a4df9bd442d3b232b1c6d1abbf76cdf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:50:53 +0000 Subject: [PATCH 0459/1766] Bump gunicorn from 19.9.0 to 22.0.0 in /frameworks/Python/api_hour Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 19.9.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/19.9.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn 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 2a65448dcda..b318ab3dbc7 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -4,7 +4,7 @@ aiopg==0.7.0 -e git+https://github.com/Eyepea/API-Hour.git@577abbdcbb8cc2810dad46e260b338b15db4d0e3#egg=api_hour-master asyncio-redis==0.13.4 chardet==2.3.0 -gunicorn==19.9.0 +gunicorn==22.0.0 hiredis==0.2.0 Jinja2==3.1.3 MarkupSafe==0.23 From 91e37eca043bc22e35f97e144dc588a79e17b5ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:52:47 +0000 Subject: [PATCH 0460/1766] Bump gunicorn from 20.1.0 to 22.0.0 in /frameworks/Python/blacksheep Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/blacksheep/requirements-gunicorn.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/blacksheep/requirements-gunicorn.txt b/frameworks/Python/blacksheep/requirements-gunicorn.txt index 9d41f264a67..5389b4df825 100644 --- a/frameworks/Python/blacksheep/requirements-gunicorn.txt +++ b/frameworks/Python/blacksheep/requirements-gunicorn.txt @@ -1 +1 @@ -gunicorn==20.1.0 +gunicorn==22.0.0 From 640158a7d299df2a31cd59f0a3d3dca4285f1e18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 00:48:46 +0000 Subject: [PATCH 0461/1766] Bump gunicorn from 20.0.4 to 22.0.0 in /frameworks/Python/responder Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.0.4 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.0.4...22.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 79f0a4304ce..4b650f546e9 100644 --- a/frameworks/Python/responder/requirements.txt +++ b/frameworks/Python/responder/requirements.txt @@ -1,5 +1,5 @@ asyncpg==0.21.0 -gunicorn==20.0.4 +gunicorn==22.0.0 Jinja2==3.1.3 ujson==2.0.3 uvloop==0.17.0 From ce94b009c3a01a0bddaf6dc37063a944b740017d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 01:03:41 +0000 Subject: [PATCH 0462/1766] Bump gunicorn from 20.1.0 to 22.0.0 in /frameworks/Python/pyramid Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/pyramid/requirements.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frameworks/Python/pyramid/requirements.txt b/frameworks/Python/pyramid/requirements.txt index 73d07efbeb0..d9cd315c6e3 100644 --- a/frameworks/Python/pyramid/requirements.txt +++ b/frameworks/Python/pyramid/requirements.txt @@ -8,12 +8,14 @@ chameleon==3.9.1 # via pyramid-chameleon greenlet==1.1.2 # via sqlalchemy -gunicorn==20.1.0 +gunicorn==22.0.0 # via -r requirements.in hupper==1.10.3 # via pyramid orjson==3.9.15 # via -r requirements.in +packaging==24.0 + # via gunicorn pastedeploy==2.1.1 # via plaster-pastedeploy plaster==1.0 From 2a77ad5b40ac62ca60aa627caa4c3385cae97840 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 01:18:26 +0000 Subject: [PATCH 0463/1766] Bump gunicorn from 20.1.0 to 22.0.0 in /frameworks/Python/routerling Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn 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 4a11df1bc19..70fdeb5d55f 100644 --- a/frameworks/Python/routerling/requirements.txt +++ b/frameworks/Python/routerling/requirements.txt @@ -1,7 +1,7 @@ asgiref==3.4.1 asyncpg==0.24.0 click==8.0.1 -gunicorn==20.1.0 +gunicorn==22.0.0 h11==0.12.0 Jinja2==3.1.3 MarkupSafe==2.0.1 From 2bedc695ec9a86dd99a95ccabdfa5b2cafdd2e83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 01:27:38 +0000 Subject: [PATCH 0464/1766] Bump gunicorn from 20.1.0 to 22.0.0 in /frameworks/Python/quart Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/quart/requirements-uvicorn.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/quart/requirements-uvicorn.txt b/frameworks/Python/quart/requirements-uvicorn.txt index 765f8011499..cb62fac6b78 100644 --- a/frameworks/Python/quart/requirements-uvicorn.txt +++ b/frameworks/Python/quart/requirements-uvicorn.txt @@ -1,5 +1,5 @@ anyio==3.6.1 -gunicorn==20.1.0 +gunicorn==22.0.0 httptools==0.4.0 idna==3.7 python-dotenv==0.20.0 From 1ddb84f625a391318671386b202638923b1e2840 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 01:58:29 +0000 Subject: [PATCH 0465/1766] Bump gunicorn from 20.1.0 to 22.0.0 in /frameworks/Python/uvicorn Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn 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 91523ce5164..1cccc583d37 100644 --- a/frameworks/Python/uvicorn/requirements.txt +++ b/frameworks/Python/uvicorn/requirements.txt @@ -1,5 +1,5 @@ asyncpg==0.28.0 -gunicorn==20.1.0 +gunicorn==22.0.0 httptools==0.6.0 Jinja2==3.1.3 ujson==5.8.0 From 900d38a7ea37fd07f5481b1d7eb59100b1d1de5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 02:17:08 +0000 Subject: [PATCH 0466/1766] Bump gunicorn from 20.1.0 to 22.0.0 in /frameworks/Python/heaven Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn 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 d3a26597539..5546000791d 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.15 -gunicorn==20.1.0 +gunicorn==22.0.0 From 82823d900262c4120ec25001b27cfc4d3f13ec8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 02:42:47 +0000 Subject: [PATCH 0467/1766] Bump gunicorn from 21.2.0 to 22.0.0 in /frameworks/Python/panther Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 21.2.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/21.2.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/panther/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/panther/requirements.txt b/frameworks/Python/panther/requirements.txt index 38124b17faf..a42fe061c9d 100644 --- a/frameworks/Python/panther/requirements.txt +++ b/frameworks/Python/panther/requirements.txt @@ -5,7 +5,7 @@ jinja2==3.1.2 asyncpg==0.29.0 -gunicorn==21.2.0 +gunicorn==22.0.0 uvicorn==0.24.0 uvloop==0.19.0 httptools==0.6.1 From 9a6b8e007fed9a46e5f4dc1f59cb05c3e35de62d Mon Sep 17 00:00:00 2001 From: kanarus Date: Thu, 18 Apr 2024 00:19:27 +0900 Subject: [PATCH 0468/1766] update: ohkami (v0.15 -> v0.16) and other deps (#8877) --- frameworks/Rust/ohkami/Cargo.lock | 348 ++++++++++++------------ frameworks/Rust/ohkami/Cargo.toml | 6 +- frameworks/Rust/ohkami/src/main.rs | 10 +- frameworks/Rust/ohkami/src/models.rs | 7 +- frameworks/Rust/ohkami/src/postgres.rs | 9 +- frameworks/Rust/ohkami/src/templates.rs | 17 +- 6 files changed, 202 insertions(+), 195 deletions(-) diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index 905a89d8a8e..acb16978f40 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -32,18 +32,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "annotate-snippets" @@ -64,27 +64,17 @@ dependencies = [ "num-traits", ] -[[package]] -name = "atomic-write-file" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" -dependencies = [ - "nix", - "rand", -] - [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -115,9 +105,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" dependencies = [ "serde", ] @@ -133,9 +123,9 @@ dependencies = [ [[package]] name = "byte_reader" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087a18fc062e9ae6d8c0fc7d9afc22e373f3eda1244379eefabff7e2b2cad206" +checksum = "0fac67f5455e694831246ed9a2d62c98dbb7586281dcfaba6621888ac9b576df" [[package]] name = "byteorder" @@ -145,18 +135,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" [[package]] name = "cfg-if" @@ -203,9 +190,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.0.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ "crc-catalog", ] @@ -243,9 +230,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -291,9 +278,9 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" dependencies = [ "serde", ] @@ -333,9 +320,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "finl_unicode" @@ -430,7 +417,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.58", ] [[package]] @@ -474,9 +461,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", @@ -519,9 +506,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -568,9 +555,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -587,9 +574,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "lazy_static" @@ -641,9 +628,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "md-5" @@ -657,9 +644,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "minimal-lexical" @@ -678,9 +665,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -705,17 +692,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.4.2", - "cfg-if", - "libc", -] - [[package]] name = "nom" version = "7.1.3" @@ -794,14 +770,15 @@ dependencies = [ [[package]] name = "ohkami" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e19a311d70d741f4a08f54374df6501bc2ebde819b5a69b95763ea2335f5f19" +checksum = "5eabbddbe02f121e8b6bcaa10bebcc5b42eee2b0a749ce0801a1b0d304fa6006" dependencies = [ "byte_reader", "hmac", "ohkami_lib", "ohkami_macros", + "rustc-hash", "serde", "serde_json", "sha2", @@ -822,15 +799,20 @@ dependencies = [ [[package]] name = "ohkami_lib" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf187aa0f73c2b91d9ac5c7eb1437c8d1a015d765d4fc3db8113c90a82ae2a0" +checksum = "7231554f893051d7d645c8c2d07b85e80e96f2f5c39d1a5c8568c63560815d44" +dependencies = [ + "byte_reader", + "percent-encoding", + "serde", +] [[package]] name = "ohkami_macros" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c09a65693c4398af64b085040fe937f7d42d9b164306b5271fc169fa276db7" +checksum = "6cd88e0259e3e0d02df2d44d5419fa1e3d639c4b5117d5fb6b7f281f7fa670c6" dependencies = [ "proc-macro2", "quote", @@ -845,11 +827,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.63" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cfg-if", "foreign-types", "libc", @@ -866,7 +848,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.58", ] [[package]] @@ -877,9 +859,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.99" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -933,9 +915,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -988,18 +970,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1045,9 +1027,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -1057,9 +1039,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -1068,9 +1050,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rsa" @@ -1098,6 +1080,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1109,11 +1097,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -1122,9 +1110,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "schannel" @@ -1143,9 +1131,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -1156,9 +1144,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", @@ -1172,29 +1160,29 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -1253,18 +1241,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1305,9 +1293,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1318,9 +1306,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ "ahash", "atoi", @@ -1328,7 +1316,6 @@ dependencies = [ "bytes", "crc", "crossbeam-queue", - "dotenvy", "either", "event-listener", "futures-channel", @@ -1359,9 +1346,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" dependencies = [ "proc-macro2", "quote", @@ -1372,11 +1359,10 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ - "atomic-write-file", "dotenvy", "either", "heck", @@ -1399,13 +1385,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64", - "bitflags 2.4.2", + "bitflags 2.5.0", "byteorder", "bytes", "crc", @@ -1441,13 +1427,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64", - "bitflags 2.4.2", + "bitflags 2.5.0", "byteorder", "crc", "dotenvy", @@ -1468,7 +1454,6 @@ dependencies = [ "rand", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlx-core", @@ -1480,9 +1465,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" dependencies = [ "atoi", "flume", @@ -1531,9 +1516,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -1542,9 +1527,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", @@ -1554,22 +1539,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.58", ] [[package]] @@ -1589,9 +1574,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -1614,14 +1599,14 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.58", ] [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -1657,7 +1642,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.58", ] [[package]] @@ -1689,9 +1674,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -1771,11 +1756,21 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "whoami" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +dependencies = [ + "redox_syscall", + "wasite", +] [[package]] name = "winapi" @@ -1814,7 +1809,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] @@ -1834,17 +1829,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -1855,9 +1851,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -1867,9 +1863,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -1879,9 +1875,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -1891,9 +1893,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -1903,9 +1905,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -1915,9 +1917,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -1927,9 +1929,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "yansi-term" @@ -2042,7 +2044,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.58", ] [[package]] diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index 15475ee8cd9..251657c808f 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -5,9 +5,9 @@ edition = "2021" authors = ["kanarus "] [dependencies] -ohkami = { version = "=0.15.0", features = ["rt_tokio"] } -tokio = { version = "1.36.0" , features = ["full"] } +ohkami = { version = "=0.16.0", features = ["rt_tokio"] } +tokio = { version = "1.37.0" , features = ["full"] } rand = { version = "0.8.5" , features = ["small_rng"] } -sqlx = { version = "0.7.3" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } +sqlx = { version = "0.7.4" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } yarte = { version = "0.15.7" } futures-util = { version = "0.3.30" } \ No newline at end of file diff --git a/frameworks/Rust/ohkami/src/main.rs b/frameworks/Rust/ohkami/src/main.rs index bcac0f3a2ef..a4f66a80eaa 100644 --- a/frameworks/Rust/ohkami/src/main.rs +++ b/frameworks/Rust/ohkami/src/main.rs @@ -7,18 +7,18 @@ pub use postgres::Postgres; mod templates; pub use templates::FortunesTemplate; -use ohkami::{Ohkami, Route, Memory}; +use ohkami::prelude::*; +use ohkami::Memory; #[tokio::main] async fn main() { + #[derive(Clone)] struct SetServer; - impl ohkami::BackFang for SetServer { - type Error = std::convert::Infallible; + impl FangAction for SetServer { #[inline(always)] - async fn bite(&self, res: &mut ohkami::Response, _req: &ohkami::Request) -> Result<(), Self::Error> { + async fn back<'a>(&'a self, res: &'a mut ohkami::Response) { res.headers.set().Server("ohkami"); - Ok(()) } } diff --git a/frameworks/Rust/ohkami/src/models.rs b/frameworks/Rust/ohkami/src/models.rs index 3896cedc28a..55eb8f8fa6d 100644 --- a/frameworks/Rust/ohkami/src/models.rs +++ b/frameworks/Rust/ohkami/src/models.rs @@ -1,7 +1,8 @@ -use ohkami::typed::{ResponseBody, Query}; +use ohkami::typed::{Payload, Query}; +use ohkami::builtin::payload::JSON; -#[ResponseBody(JSONS)] +#[Payload(JSON/S)] pub struct Message { pub message: &'static str, } @@ -13,7 +14,7 @@ pub struct Fortune { } #[derive(sqlx::FromRow)] -#[ResponseBody(JSONS)] +#[Payload(JSON/S)] pub struct World { pub id: i32, #[serde(rename="randomNumber")] diff --git a/frameworks/Rust/ohkami/src/postgres.rs b/frameworks/Rust/ohkami/src/postgres.rs index 3f5a50a02ea..0de73e2a77b 100644 --- a/frameworks/Rust/ohkami/src/postgres.rs +++ b/frameworks/Rust/ohkami/src/postgres.rs @@ -1,5 +1,6 @@ use futures_util::{stream::FuturesUnordered, TryStreamExt}; use rand::{rngs::SmallRng, SeedableRng, Rng, thread_rng}; +use ohkami::{utils::FangAction, Request, Response}; use crate::models::{World, Fortune}; @@ -7,13 +8,13 @@ use crate::models::{World, Fortune}; pub struct Postgres(sqlx::PgPool); impl Postgres { - pub async fn init() -> impl ohkami::FrontFang { + pub async fn init() -> impl FangAction { + #[derive(Clone)] pub struct UsePostgres(Postgres); - impl ohkami::FrontFang for UsePostgres { - type Error = std::convert::Infallible; + impl FangAction for UsePostgres { #[inline(always)] - async fn bite(&self, req: &mut ohkami::Request) -> Result<(), Self::Error> { + async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { req.memorize(self.0.clone()); Ok(()) } diff --git a/frameworks/Rust/ohkami/src/templates.rs b/frameworks/Rust/ohkami/src/templates.rs index d52ffcb2b3a..d8cc5b96c97 100644 --- a/frameworks/Rust/ohkami/src/templates.rs +++ b/frameworks/Rust/ohkami/src/templates.rs @@ -1,18 +1,21 @@ -use ohkami::{Response, IntoResponse}; +use ohkami::{IntoResponse, Response}; +use yarte::Template; use crate::models::Fortune; -#[derive(yarte::Template)] +#[derive(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() + match self.call() { + Ok(template) => Response::OK().html(template), + Err(error) => { + eprintln!("Failed to render template: {error}"); + Response::InternalServerError() + } + } } } From 48fb5780d94a1d646e44f5705a8b7ba2ee7de81b Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Wed, 17 Apr 2024 18:19:54 +0300 Subject: [PATCH 0469/1766] [mormot] upgrade mORMot to version 2.2.7351 + improved memory allocations for fortunes (#8883) Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/setup_and_build.sh | 4 ++-- frameworks/Pascal/mormot/src/raw.pas | 21 +++++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 81fc5b37ad0..615cd6b302e 100755 --- a/frameworks/Pascal/mormot/setup_and_build.sh +++ b/frameworks/Pascal/mormot/setup_and_build.sh @@ -27,7 +27,7 @@ rm -rf ./libs mkdir -p ./libs/mORMot/static # echo "Getting the latest pre-release URL..." # USED_TAG=$(wget -qO- https://api.github.com/repos/synopse/mORMot2/releases/latest | jq -r '.tag_name') -USED_TAG="2.1.stable" +USED_TAG="2.2.stable" echo "Used release tag $USED_TAG" URL="https://github.com/synopse/mORMot2/releases/download/$USED_TAG/mormot2static.tgz" @@ -35,7 +35,7 @@ echo "Download statics from $URL ..." wget -qO- "$URL" | tar -xz -C ./libs/mORMot/static # uncomment for fixed commit URL -URL=https://github.com/synopse/mORMot2/tarball/c68d24054ffd3e5d63ecb33a2eea49055948e816 +URL=https://github.com/synopse/mORMot2/tarball/7dc50900266f07454fe60b60e4a2755ce445ddeb #URL="https://api.github.com/repos/synopse/mORMot2/tarball/$USED_TAG" echo "Download and unpacking mORMot sources from $URL ..." wget -qO- "$URL" | tar -xz -C ./libs/mORMot --strip-components=1 diff --git a/frameworks/Pascal/mormot/src/raw.pas b/frameworks/Pascal/mormot/src/raw.pas index 82b7d8f872a..93d4fc1091f 100644 --- a/frameworks/Pascal/mormot/src/raw.pas +++ b/frameworks/Pascal/mormot/src/raw.pas @@ -46,7 +46,7 @@ type // data structures TMessageRec = packed record - message: RawUtf8; + message: PUtf8Char; end; TWorldRec = packed record id: integer; @@ -55,7 +55,7 @@ TWorlds = array of TWorldRec; TFortune = packed record id: integer; - message: RawUtf8; + message: PUtf8Char; end; TFortunes = array of TFortune; @@ -277,6 +277,7 @@ function TRawAsyncServer.ComputeRawFortunes( arr: TDynArray; n: integer; f: ^TFortune; + mus: TSynMustacheContextData; begin result := HTTP_BADREQUEST; if stmt = nil then @@ -286,13 +287,16 @@ function TRawAsyncServer.ComputeRawFortunes( begin f := arr.NewPtr; f.id := stmt.ColumnInt(0); - f.message := stmt.ColumnUtf8(1); + f.message := stmt.ColumnPUtf8(1); end; f := arr.NewPtr; f.id := 0; f.message := FORTUNES_MESSAGE; arr.Sort(FortuneCompareByMessage); - ctxt.OutContent := fTemplate.RenderDataArray(arr); + mus := stmt.Connection.GetThreadOwned(TSynMustacheContextData); + if mus = nil then + mus := stmt.Connection.SetThreadOwned(fTemplate.NewMustacheContextData); + ctxt.OutContent := mus.RenderArray(arr); ctxt.OutContentType := HTML_CONTENT_TYPE; result := HTTP_SUCCESS; end; @@ -310,7 +314,7 @@ function TRawAsyncServer.json(ctxt: THttpServerRequest): cardinal; var msgRec: TMessageRec; begin - msgRec.message := HELLO_WORLD; + msgRec.message := pointer(HELLO_WORLD); ctxt.SetOutJson(@msgRec, TypeInfo(TMessageRec)); result := HTTP_SUCCESS; end; @@ -471,7 +475,8 @@ function ComputeUpdateSql(cnt: integer): RawUtf8; W := TTextWriter.CreateOwnedStream(tmp{%H-}); try W.AddShort('UPDATE world SET randomNumber = v.randomNumber FROM (VALUES'); - for i := 1 to cnt do begin + for i := 1 to cnt do + begin W.AddShort('(?::integer, ?::integer)'); W.Add(','); end; @@ -702,9 +707,9 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; // register some RTTI for records JSON serialization Rtti.RegisterFromText([ - TypeInfo(TMessageRec), 'message:RawUtf8', + TypeInfo(TMessageRec), 'message:PUtf8Char', TypeInfo(TWorldRec), 'id,randomNumber:integer', - TypeInfo(TFortune), 'id:integer message:RawUtf8']); + TypeInfo(TFortune), 'id:integer message:PUtf8Char']); // compute default execution context from HW information cpuCount := CurrentCpuSet(cpuMask); // may run from a "taskset" command From 5d8d724e8bd6a5f32bb7d8a7b3b135f075cc7c3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:21:19 -0700 Subject: [PATCH 0470/1766] Bump io.undertow:undertow-core in /frameworks/Java/light-java (#8882) Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.5.Final to 2.3.12.Final. - [Commits](https://github.com/undertow-io/undertow/compare/2.3.5.Final...2.3.12.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- 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 eca4217eec8..0d76eb4e631 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -25,7 +25,7 @@ 11 2.0.1 1.3.12 - 2.3.5.Final + 2.3.12.Final 3.3.1 8.0.28 42.7.2 From 4a02edf0a4d4128dd7e8de5af46d5fe272ed8256 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:21:30 -0700 Subject: [PATCH 0471/1766] Bump io.undertow:undertow-core in /frameworks/Java/undertow (#8881) Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.5.Final to 2.3.12.Final. - [Commits](https://github.com/undertow-io/undertow/compare/2.3.5.Final...2.3.12.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core 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 5ff7009c963..1a0f95afd69 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -20,7 +20,7 @@ 3.2.2 0.9.10 42.7.2 - 2.3.5.Final + 2.3.12.Final From 9f3a5c3a7562a73b2adab7d9e949143b55a8bf99 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Wed, 17 Apr 2024 16:21:40 +0100 Subject: [PATCH 0472/1766] Update the H2O-based implementations to Ubuntu 24.04 (#8879) --- frameworks/C/h2o/h2o.dockerfile | 6 +++--- frameworks/PHP/php/php-h2o.dockerfile | 3 ++- frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 86ae416dd77..cfabc77bb3b 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -1,4 +1,4 @@ -ARG UBUNTU_VERSION=22.04 +ARG UBUNTU_VERSION=24.04 ARG H2O_APP_PREFIX=/opt/h2o_app @@ -25,6 +25,7 @@ RUN apt-get -yqq update && \ libwslay-dev \ libyajl-dev \ libz-dev \ + llvm-dev \ make \ ninja-build \ pkg-config \ @@ -46,8 +47,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ -G Ninja \ -S . && \ cmake --build build -j && \ - cmake --install build && \ - cp -a deps/picotls/include/picotls* deps/quicly/include/quicly* /usr/local/include + cmake --install build ARG MUSTACHE_C_REVISION=7fe52392879d0188c172d94bb4fde7c513d6b929 diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index cd73427a08e..57571b6b3c7 100644 --- a/frameworks/PHP/php/php-h2o.dockerfile +++ b/frameworks/PHP/php/php-h2o.dockerfile @@ -1,4 +1,4 @@ -ARG UBUNTU_VERSION=22.04 +ARG UBUNTU_VERSION=24.04 ARG H2O_PREFIX=/opt/h2o @@ -22,6 +22,7 @@ RUN apt-get -yqq update && \ libuv1-dev \ libwslay-dev \ libz-dev \ + llvm-dev \ ninja-build \ pkg-config \ rsync \ diff --git a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile index 3274f168c87..7cc59cf699f 100644 --- a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile +++ b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile @@ -1,4 +1,4 @@ -ARG UBUNTU_VERSION=22.04 +ARG UBUNTU_VERSION=24.04 ARG H2O_PREFIX=/opt/h2o @@ -22,6 +22,7 @@ RUN apt-get -yqq update && \ libuv1-dev \ libwslay-dev \ libz-dev \ + llvm-dev \ ninja-build \ pkg-config \ rsync \ From 423630c98115c2571fa006ffb1d0d119665131f9 Mon Sep 17 00:00:00 2001 From: An Tao Date: Wed, 17 Apr 2024 23:22:04 +0800 Subject: [PATCH 0473/1766] Update drogon (#8875) * Update drogon * Use std::string_view * Static --- frameworks/C++/drogon/drogon-core.dockerfile | 14 +++++++------- frameworks/C++/drogon/drogon.dockerfile | 14 +++++++------- .../drogon_benchmark/controllers/FortuneCtrlRaw.cc | 4 ++-- .../drogon_benchmark/controllers/FortuneCtrlRaw.h | 7 ++++--- .../drogon_benchmark/controllers/UpdatesCtrlRaw.cc | 2 +- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/frameworks/C++/drogon/drogon-core.dockerfile b/frameworks/C++/drogon/drogon-core.dockerfile index 7d02dc6637f..0149f1fb228 100644 --- a/frameworks/C++/drogon/drogon-core.dockerfile +++ b/frameworks/C++/drogon/drogon-core.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 COPY ./ ./ @@ -11,7 +11,7 @@ RUN apt-get update -yqq && \ zlib1g-dev && \ add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ apt-get update -yqq && \ - apt-get install -yqq gcc-10 g++-10 + apt-get install -yqq gcc g++ RUN locale-gen en_US.UTF-8 @@ -19,10 +19,10 @@ ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 -ENV CC=gcc-10 -ENV CXX=g++-10 -ENV AR=gcc-ar-10 -ENV RANLIB=gcc-ranlib-10 +ENV CC=gcc +ENV CXX=g++ +ENV AR=gcc-ar +ENV RANLIB=gcc-ranlib ENV IROOT=/install ENV DROGON_ROOT=$IROOT/drogon @@ -41,7 +41,7 @@ RUN git clone https://github.com/an-tao/drogon WORKDIR $DROGON_ROOT -RUN git checkout ebf87d69d7bb45dfa478ba364ef9374d9be25092 +RUN git checkout 96919df488e0ebaa0ed304bbd76bba33508df3cc RUN git submodule update --init RUN mkdir build diff --git a/frameworks/C++/drogon/drogon.dockerfile b/frameworks/C++/drogon/drogon.dockerfile index c94d2f43525..104219222f0 100644 --- a/frameworks/C++/drogon/drogon.dockerfile +++ b/frameworks/C++/drogon/drogon.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 COPY ./ ./ @@ -11,7 +11,7 @@ RUN apt-get update -yqq && \ zlib1g-dev && \ add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ apt-get update -yqq && \ - apt-get install -yqq gcc-10 g++-10 + apt-get install -yqq gcc g++ RUN locale-gen en_US.UTF-8 @@ -19,10 +19,10 @@ ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 -ENV CC=gcc-10 -ENV CXX=g++-10 -ENV AR=gcc-ar-10 -ENV RANLIB=gcc-ranlib-10 +ENV CC=gcc +ENV CXX=g++ +ENV AR=gcc-ar +ENV RANLIB=gcc-ranlib ENV IROOT=/install ENV DROGON_ROOT=$IROOT/drogon @@ -41,7 +41,7 @@ RUN git clone https://github.com/an-tao/drogon WORKDIR $DROGON_ROOT -RUN git checkout ebf87d69d7bb45dfa478ba364ef9374d9be25092 +RUN git checkout 96919df488e0ebaa0ed304bbd76bba33508df3cc RUN git submodule update --init RUN mkdir build diff --git a/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc b/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc index 143c7a4ec63..0e21a547ff6 100644 --- a/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc +++ b/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc @@ -22,8 +22,8 @@ void FortuneCtrlRaw::asyncHandleHttpRequest( rows.reserve(r.size() + 1); for (auto const &row : r) { - rows.emplace_back(row[0ul].as(), // id - row[1ul].as()); // message + rows.emplace_back(row[0ul].as(), // id + row[1ul].as()); // message } rows.emplace_back("0", "Additional fortune added at request time."); std::sort(rows.begin(), diff --git a/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h b/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h index ec0217bcd88..82f3c0ebcd1 100644 --- a/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h +++ b/frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h @@ -1,17 +1,18 @@ #pragma once #include #include +#include using namespace drogon; struct Fortune { - Fortune(string_view &&id, string_view &&message) + Fortune(std::string_view &&id, std::string_view &&message) : id_(std::move(id)), message_(std::move(message)) { } Fortune() = default; - string_view id_; - string_view message_; + std::string_view id_; + std::string_view message_; }; class FortuneCtrlRaw : public drogon::HttpSimpleController { diff --git a/frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc b/frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc index 71c19bcf2f7..065362eee85 100644 --- a/frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc +++ b/frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc @@ -43,7 +43,7 @@ void UpdatesCtrlRaw::update( const DbClientPtr &client) { auto const &sql = getSQL(results->size()); - auto sqlBinder = *client << string_view(sql.data(), sql.length()); + auto sqlBinder = *client << std::string_view(sql.data(), sql.length()); Json::Value json; json.resize(0); for (auto const &w : *results) From eda4e5ac4e60d3ef6e05654ed09d5fd8e2de1990 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 17 Apr 2024 17:23:58 +0200 Subject: [PATCH 0474/1766] Update Giraffe to v6.4 (#8878) * Update giraffe to .NET 8.0 # Conflicts: # frameworks/FSharp/giraffe/giraffe-utf8json.dockerfile * Update zebra * No need for utf8json * No need for utf8json * Update Dockerfile for Giraffe and Zebra frameworks --- frameworks/FSharp/giraffe/README.md | 3 +-- frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile | 2 +- frameworks/FSharp/giraffe/giraffe.dockerfile | 2 +- frameworks/FSharp/giraffe/src/App/App.fsproj | 8 ++++---- frameworks/FSharp/zebra/src/App/App.fsproj | 6 +++--- frameworks/FSharp/zebra/zebra-simple.dockerfile | 2 +- frameworks/FSharp/zebra/zebra.dockerfile | 2 +- 7 files changed, 12 insertions(+), 13 deletions(-) diff --git a/frameworks/FSharp/giraffe/README.md b/frameworks/FSharp/giraffe/README.md index fa4751bbda2..bdc107b6bcc 100644 --- a/frameworks/FSharp/giraffe/README.md +++ b/frameworks/FSharp/giraffe/README.md @@ -1,9 +1,8 @@ # Giraffe Benchmarks on Linux -This application tests Giraffe in 3 modes: +This application tests Giraffe in 2 modes: - Default: Using Giraffe's Endpoint Routing APIs with the `System.Text.Json` serializer -- Utf8Json: Testing the JSON endpoint with the `Utf8Json` serializer - Newtonsoft: Testing the JSON endpoint with the `NewtonsoftJson` serializer ## Infrastructure Software Versions diff --git a/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile b/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile index b22de354452..da172b8140e 100644 --- a/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile +++ b/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out diff --git a/frameworks/FSharp/giraffe/giraffe.dockerfile b/frameworks/FSharp/giraffe/giraffe.dockerfile index b63044e65c2..c980686ee14 100644 --- a/frameworks/FSharp/giraffe/giraffe.dockerfile +++ b/frameworks/FSharp/giraffe/giraffe.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out diff --git a/frameworks/FSharp/giraffe/src/App/App.fsproj b/frameworks/FSharp/giraffe/src/App/App.fsproj index bbdd52ee3af..00bda86ff7d 100644 --- a/frameworks/FSharp/giraffe/src/App/App.fsproj +++ b/frameworks/FSharp/giraffe/src/App/App.fsproj @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/frameworks/FSharp/zebra/src/App/App.fsproj b/frameworks/FSharp/zebra/src/App/App.fsproj index 87f9f551340..2acd7ea75e9 100644 --- a/frameworks/FSharp/zebra/src/App/App.fsproj +++ b/frameworks/FSharp/zebra/src/App/App.fsproj @@ -9,10 +9,10 @@ - - + + - + diff --git a/frameworks/FSharp/zebra/zebra-simple.dockerfile b/frameworks/FSharp/zebra/zebra-simple.dockerfile index b02a6c8977f..b36a831dd89 100644 --- a/frameworks/FSharp/zebra/zebra-simple.dockerfile +++ b/frameworks/FSharp/zebra/zebra-simple.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out diff --git a/frameworks/FSharp/zebra/zebra.dockerfile b/frameworks/FSharp/zebra/zebra.dockerfile index a43c8eb1c5c..42fd7f53ee9 100644 --- a/frameworks/FSharp/zebra/zebra.dockerfile +++ b/frameworks/FSharp/zebra/zebra.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out From 477418655f854d055452114210410d4e9670bc2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:24:23 -0700 Subject: [PATCH 0475/1766] Bump mysql2 from 1.6.5 to 3.9.4 in /frameworks/JavaScript/nodejs (#8868) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 1.6.5 to 3.9.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v1.6.5...v3.9.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/nodejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/nodejs/package.json b/frameworks/JavaScript/nodejs/package.json index 3c7a14550af..b3740ce2a91 100644 --- a/frameworks/JavaScript/nodejs/package.json +++ b/frameworks/JavaScript/nodejs/package.json @@ -8,7 +8,7 @@ "mongodb": "3.7.3", "mongoose": "5.13.20", "mysql": "2.16.0", - "mysql2": "1.6.5", + "mysql2": "3.9.4", "parseurl": "1.3.2", "pg": "8.5.0", "pg-hstore": "2.3.2", From 3cdf50eddecb462fe3614fc5f8698ba032f2a1f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:26:33 -0700 Subject: [PATCH 0476/1766] Bump mysql2 from 1.6.5 to 3.9.4 in /frameworks/JavaScript/hapi (#8867) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 1.6.5 to 3.9.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v1.6.5...v3.9.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/hapi/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/hapi/package.json b/frameworks/JavaScript/hapi/package.json index 4aae630d9fa..82f8f4b8ecd 100644 --- a/frameworks/JavaScript/hapi/package.json +++ b/frameworks/JavaScript/hapi/package.json @@ -10,7 +10,7 @@ "handlebars": "4.3.0", "mongoose": "5.13.20", "mysql": "2.16.0", - "mysql2": "1.6.5", + "mysql2": "3.9.4", "pg": "8.5.1", "pg-hstore": "2.3.2", "sequelize": "6.29.0" From 50184be00bc55185068eb91f2cb713af7f0971f3 Mon Sep 17 00:00:00 2001 From: Jacob Rothstein Date: Wed, 17 Apr 2024 08:27:05 -0700 Subject: [PATCH 0477/1766] rust/trillium: add two additional runtime variants (#8873) --- frameworks/Rust/trillium/Cargo.lock | 781 ++++++++++++------ frameworks/Rust/trillium/Cargo.toml | 24 +- .../Rust/trillium/benchmark_config.json | 56 +- frameworks/Rust/trillium/src/main.rs | 15 +- .../trillium/trillium-async-std.dockerfile | 16 + .../Rust/trillium/trillium-tokio.dockerfile | 16 + frameworks/Rust/trillium/trillium.dockerfile | 4 +- 7 files changed, 629 insertions(+), 283 deletions(-) create mode 100644 frameworks/Rust/trillium/trillium-async-std.dockerfile create mode 100644 frameworks/Rust/trillium/trillium-tokio.dockerfile diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 9928cb79e50..6875427cc51 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -2,6 +2,21 @@ # 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.11" @@ -32,9 +47,9 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "anstream" @@ -152,6 +167,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compat" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f68a707c1feb095d8c07f8a65b9f506b117d30af431cab89374357de7c11461b" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.10.0" @@ -197,7 +225,7 @@ dependencies = [ "polling 2.8.0", "rustix 0.37.27", "slab", - "socket2", + "socket2 0.4.10", "waker-fn", ] @@ -307,9 +335,9 @@ checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.79" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", @@ -343,17 +371,38 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "basic-toml" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5" +checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" dependencies = [ "serde", ] @@ -369,6 +418,9 @@ name = "bitflags" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +dependencies = [ + "serde", +] [[package]] name = "block-buffer" @@ -397,15 +449,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" - -[[package]] -name = "bytecount" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byteorder" @@ -419,37 +465,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", -] - [[package]] name = "cc" version = "1.0.92" @@ -488,20 +503,10 @@ dependencies = [ ] [[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" @@ -514,9 +519,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.0.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ "crc-catalog", ] @@ -529,9 +534,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] @@ -570,6 +575,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -597,6 +613,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -618,9 +635,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -664,15 +681,6 @@ dependencies = [ "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" @@ -754,20 +762,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" [[package]] -name = "foreign-types" -version = "0.3.2" +name = "flume" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ - "foreign-types-shared", + "futures-core", + "futures-sink", + "spin 0.9.8", ] -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -807,6 +811,17 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" 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.5.0" @@ -915,10 +930,10 @@ dependencies = [ ] [[package]] -name = "glob" -version = "0.3.1" +name = "gimli" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gloo-timers" @@ -1135,6 +1150,9 @@ 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" @@ -1148,6 +1166,17 @@ 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 = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -1217,23 +1246,43 @@ 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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "moka" -version = "0.12.5" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1911e88d5831f748a4097a43862d129e3c6fca831eecac9b8db6d01d93c9de2" +checksum = "87bfd249f570638bfb0b4f9d258e6b8cddd2a5a7d0ed47e8bb8b176bfc0e7a17" dependencies = [ - "async-lock 2.8.0", + "async-lock 3.3.0", "async-trait", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", + "event-listener 5.3.0", "futures-util", "once_cell", "parking_lot", "quanta", "rustc_version", - "skeptic", "smallvec", "tagptr", "thiserror", @@ -1241,24 +1290,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "nom" version = "7.1.3" @@ -1269,6 +1300,23 @@ dependencies = [ "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-conv" version = "0.1.0" @@ -1276,72 +1324,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "num-traits" -version = "0.2.18" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", + "num-traits", ] [[package]] -name = "num_threads" -version = "0.1.7" +name = "num-iter" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ - "libc", + "autocfg", + "num-integer", + "num-traits", ] [[package]] -name = "once_cell" -version = "1.19.0" +name = "num-traits" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", + "libm", +] [[package]] -name = "openssl" -version = "0.10.64" +name = "num_cpus" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "bitflags 2.5.0", - "cfg-if", - "foreign-types", + "hermit-abi", "libc", - "once_cell", - "openssl-macros", - "openssl-sys", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "num_threads" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.58", + "libc", ] [[package]] -name = "openssl-probe" -version = "0.1.5" +name = "object" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] [[package]] -name = "openssl-sys" -version = "0.9.102" +name = "once_cell" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "ordered-float" @@ -1411,6 +1455,15 @@ 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 = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1440,6 +1493,27 @@ dependencies = [ "futures-io", ] +[[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.30" @@ -1522,22 +1596,11 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - [[package]] name = "quanta" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca0b7bac0b97248c40bb77288fc52029cf1459c0461ea1b05ee32ccf011de2c" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" dependencies = [ "crossbeam-utils", "libc", @@ -1550,9 +1613,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1654,6 +1717,32 @@ dependencies = [ "smartstring", ] +[[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.4.0" @@ -1696,24 +1785,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -1790,37 +1861,11 @@ dependencies = [ "sqlx", ] -[[package]] -name = "security-framework" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" -dependencies = [ - "serde", -] +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" @@ -1865,6 +1910,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1908,26 +1964,33 @@ dependencies = [ ] [[package]] -name = "size" -version = "0.4.1" +name = "signal-hook-tokio" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" +checksum = "213241f76fb1e37e27de3b6aa1b068a2c333233b59cca6634f634b80a27ecf1e" +dependencies = [ + "futures-core", + "libc", + "signal-hook", + "tokio", +] [[package]] -name = "skeptic" -version = "0.13.7" +name = "signature" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "bytecount", - "cargo_metadata", - "error-chain", - "glob", - "pulldown-cmark", - "tempfile", - "walkdir", + "digest", + "rand_core", ] +[[package]] +name = "size" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" + [[package]] name = "slab" version = "0.4.9" @@ -1973,6 +2036,41 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.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.3" @@ -1992,7 +2090,9 @@ checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ "sqlx-core", "sqlx-macros", + "sqlx-mysql", "sqlx-postgres", + "sqlx-sqlite", ] [[package]] @@ -2021,7 +2121,6 @@ dependencies = [ "indexmap", "log", "memchr", - "native-tls", "once_cell", "paste", "percent-encoding", @@ -2031,6 +2130,8 @@ dependencies = [ "smallvec", "sqlformat", "thiserror", + "tokio", + "tokio-stream", "tracing", "url", ] @@ -2066,12 +2167,57 @@ dependencies = [ "serde_json", "sha2", "sqlx-core", + "sqlx-mysql", "sqlx-postgres", + "sqlx-sqlite", "syn 1.0.109", "tempfile", + "tokio", "url", ] +[[package]] +name = "sqlx-mysql" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +dependencies = [ + "atoi", + "base64", + "bitflags 2.5.0", + "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", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + [[package]] name = "sqlx-postgres" version = "0.7.4" @@ -2110,6 +2256,29 @@ dependencies = [ "whoami", ] +[[package]] +name = "sqlx-sqlite" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +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 = "static_assertions" version = "1.1.0" @@ -2212,9 +2381,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -2235,9 +2404,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -2258,6 +2427,33 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2 0.5.6", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tracing" version = "0.1.40" @@ -2325,6 +2521,22 @@ dependencies = [ "trillium", ] +[[package]] +name = "trillium-async-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f753f918df0a52066abc1aeb1a7c09dca60c2edcc1d0fa285a0d4fde1617392" +dependencies = [ + "async-std", + "log", + "signal-hook", + "signal-hook-async-std", + "trillium", + "trillium-http", + "trillium-macros 0.0.5", + "trillium-server-common", +] + [[package]] name = "trillium-http" version = "0.3.16" @@ -2413,9 +2625,9 @@ dependencies = [ [[package]] name = "trillium-smol" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec354b7f2e4b89cf14b9e47dcdb94fd1663ff0ba34d131ddd7082f24253319fa" +checksum = "3a1c196273bd6e41705150834f5771699ad9c2e38ce317aecd3f6e0ec4c2b2e6" dependencies = [ "async-global-executor", "async-io 2.3.2", @@ -2426,7 +2638,7 @@ dependencies = [ "signal-hook-async-std", "trillium", "trillium-http", - "trillium-macros 0.0.5", + "trillium-macros 0.0.6", "trillium-server-common", ] @@ -2443,15 +2655,36 @@ dependencies = [ "sea-orm", "serde", "serde_json", + "sqlx", "trillium", "trillium-api", "trillium-askama", + "trillium-async-std", "trillium-logger", "trillium-router", "trillium-smol", + "trillium-tokio", "unicycle", ] +[[package]] +name = "trillium-tokio" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "160f07d12cc798d7de6a65e2279bb445f0606ecc4a9c594315ffff556ab7968b" +dependencies = [ + "async-compat", + "log", + "signal-hook", + "signal-hook-tokio", + "tokio", + "tokio-stream", + "trillium", + "trillium-http", + "trillium-macros 0.0.5", + "trillium-server-common", +] + [[package]] name = "triomphe" version = "0.1.11" @@ -2535,6 +2768,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8parse" version = "0.2.1" @@ -2543,9 +2782,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom", ] @@ -2574,16 +2813,6 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" -[[package]] -name = "walkdir" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2698,15 +2927,6 @@ 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" @@ -2728,7 +2948,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -2748,17 +2968,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "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", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -2769,9 +2990,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -2781,9 +3002,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -2793,9 +3014,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -2805,9 +3032,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -2817,9 +3044,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -2829,9 +3056,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -2841,9 +3068,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "zerocopy" @@ -2864,3 +3091,9 @@ dependencies = [ "quote", "syn 2.0.58", ] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/frameworks/Rust/trillium/Cargo.toml b/frameworks/Rust/trillium/Cargo.toml index 81ec1e472d3..25eb7edc467 100644 --- a/frameworks/Rust/trillium/Cargo.toml +++ b/frameworks/Rust/trillium/Cargo.toml @@ -5,28 +5,42 @@ edition = "2021" [features] jemallocator = ["dep:jemallocator"] +tokio = ["dep:trillium-tokio", "sea-orm/runtime-tokio", "sqlx/runtime-tokio"] +smol = [ + "dep:trillium-smol", + "sea-orm/runtime-async-std", + "sqlx/runtime-async-std", +] +async-std = [ + "dep:trillium-async-std", + "sea-orm/runtime-async-std", + "sqlx/runtime-async-std", +] [dependencies] askama = "0.12.1" +env_logger = "0.11.3" fastrand = "2.0.2" futures-lite = "2.3.0" +jemallocator = { version = "0.5.4", optional = true } +moka = { version = "0.12.5", features = ["future"] } serde = { version = "1.0.197", features = ["derive"] } serde_json = "1.0.115" +sqlx = "0.7.4" trillium = "0.2.19" trillium-api = "0.1.0" trillium-askama = "0.3.2" -trillium-smol = "0.4.0" +trillium-async-std = { version = "0.4.0", optional = true } trillium-logger = "0.4.5" trillium-router = "0.4.1" +trillium-smol = { version = "0.4.0", optional = true } +trillium-tokio = { version = "0.4.0", optional = true } unicycle = "0.10.1" -env_logger = "0.11.3" -moka = { version = "0.12.5", features = ["future"] } -jemallocator = {version="0.5.4", optional = true} [dependencies.sea-orm] version = "0.12.15" default-features = false -features = ["runtime-async-std-native-tls", "sqlx-postgres", "macros"] +features = ["sqlx-postgres", "macros"] [profile.release] panic = "abort" diff --git a/frameworks/Rust/trillium/benchmark_config.json b/frameworks/Rust/trillium/benchmark_config.json index a781bbabdcc..dbaa70828e2 100755 --- a/frameworks/Rust/trillium/benchmark_config.json +++ b/frameworks/Rust/trillium/benchmark_config.json @@ -23,7 +23,61 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Trillium", + "display_name": "Trillium [smol]", + "notes": "", + "versus": "None", + "tags": ["verified"] + } + }, + { + "async-std": { + "db_url": "/db", + "json_url": "/json", + "query_url": "/queries/", + "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", + "cached_query_url": "/cached-queries/", + "update_url": "/updates/", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Trillium", + "language": "Rust", + "flavor": "None", + "orm": "Full", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Trillium [async-std]", + "notes": "", + "versus": "None", + "tags": ["verified"] + } + }, + { + "tokio": { + "db_url": "/db", + "json_url": "/json", + "query_url": "/queries/", + "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", + "cached_query_url": "/cached-queries/", + "update_url": "/updates/", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Trillium", + "language": "Rust", + "flavor": "None", + "orm": "Full", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Trillium [tokio]", "notes": "", "versus": "None", "tags": ["verified"] diff --git a/frameworks/Rust/trillium/src/main.rs b/frameworks/Rust/trillium/src/main.rs index 879a545e754..af8984ef208 100644 --- a/frameworks/Rust/trillium/src/main.rs +++ b/frameworks/Rust/trillium/src/main.rs @@ -8,6 +8,18 @@ mod routes; use application::application; use trillium::HttpConfig; +#[cfg(all(feature = "smol", not(feature = "tokio"), not(feature = "async-std")))] +use trillium_smol::config; + +#[cfg(all(feature = "tokio", not(feature = "smol"), not(feature = "async-std")))] +use trillium_tokio::config; + +#[cfg(all(feature = "async-std", not(feature = "smol"), not(feature = "tokio")))] +use trillium_async_std::config; + +#[cfg(not(any(feature = "async-std", feature = "smol", feature = "tokio")))] +compile_error! {"please run with one of the following --features `async-std`, `smol`, `tokio`"} + fn main() { #[cfg(debug_assertions)] env_logger::init(); @@ -17,7 +29,8 @@ fn main() { .with_request_buffer_initial_len(256) .with_response_header_initial_capacity(5); - trillium_smol::config() + config() + .with_nodelay() .with_http_config(http_config) .run(application()) } diff --git a/frameworks/Rust/trillium/trillium-async-std.dockerfile b/frameworks/Rust/trillium/trillium-async-std.dockerfile new file mode 100644 index 00000000000..554bb671f5e --- /dev/null +++ b/frameworks/Rust/trillium/trillium-async-std.dockerfile @@ -0,0 +1,16 @@ +FROM rust:1.77 +WORKDIR /trillium +COPY src src +COPY templates templates +COPY Cargo.toml Cargo.toml +COPY Cargo.lock Cargo.lock + +EXPOSE 8080 + +ENV RUSTFLAGS="-C target-cpu=native" +ENV PORT=8080 +ENV HOST=0.0.0.0 +ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world + +RUN cargo build --release --features jemallocator,async-std +CMD ["./target/release/trillium-techempower"] diff --git a/frameworks/Rust/trillium/trillium-tokio.dockerfile b/frameworks/Rust/trillium/trillium-tokio.dockerfile new file mode 100644 index 00000000000..d3bf05bcb7f --- /dev/null +++ b/frameworks/Rust/trillium/trillium-tokio.dockerfile @@ -0,0 +1,16 @@ +FROM rust:1.77 +WORKDIR /trillium +COPY src src +COPY templates templates +COPY Cargo.toml Cargo.toml +COPY Cargo.lock Cargo.lock + +EXPOSE 8080 + +ENV RUSTFLAGS="-C target-cpu=native" +ENV PORT=8080 +ENV HOST=0.0.0.0 +ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world + +RUN cargo build --release --features jemallocator,tokio +CMD ["./target/release/trillium-techempower"] diff --git a/frameworks/Rust/trillium/trillium.dockerfile b/frameworks/Rust/trillium/trillium.dockerfile index e5e3ac910ba..667079dd84b 100644 --- a/frameworks/Rust/trillium/trillium.dockerfile +++ b/frameworks/Rust/trillium/trillium.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.76 +FROM rust:1.77 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 --features jemallocator +RUN cargo build --release --features jemallocator,smol CMD ["./target/release/trillium-techempower"] From d0c3ce6011a5ec523b49931841eea1eeae61bff8 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Wed, 17 Apr 2024 11:28:04 -0400 Subject: [PATCH 0478/1766] Update Ur/Web version (#8794) * Baseline Ur/Web configuration now works building the Ur/Web compiler and runtime from source * Update Ur/Web MySQL baseline * Get current version of Ur/Web cached queries unbroken (and tag myself as maintainer) * For Ur/Web caching tests, switch to building Ur/Web from source --- frameworks/Ur/urweb/bench.ur | 6 ++++++ frameworks/Ur/urweb/bench.urs | 1 + frameworks/Ur/urweb/benchmark_config.json | 11 +++++------ frameworks/Ur/urweb/config.toml | 4 ++-- frameworks/Ur/urweb/urweb-cache.dockerfile | 4 ++-- frameworks/Ur/urweb/urweb-mysql-cache.dockerfile | 4 ++-- frameworks/Ur/urweb/urweb-mysql.dockerfile | 4 ++-- frameworks/Ur/urweb/urweb.dockerfile | 4 ++-- 8 files changed, 22 insertions(+), 16 deletions(-) diff --git a/frameworks/Ur/urweb/bench.ur b/frameworks/Ur/urweb/bench.ur index d181a79c81c..fed47ba1132 100644 --- a/frameworks/Ur/urweb/bench.ur +++ b/frameworks/Ur/urweb/bench.ur @@ -133,3 +133,9 @@ fun updates s = fun plaintext () = returnText "Hello, World!" + +(** * Test type 7: Cached queries *) + +val cached_queries = queries +(* It's really the same code as the uncached queries test! + * We just compile with a different flag to enable caching. *) diff --git a/frameworks/Ur/urweb/bench.urs b/frameworks/Ur/urweb/bench.urs index 83b12c39ae2..a363ac346c3 100644 --- a/frameworks/Ur/urweb/bench.urs +++ b/frameworks/Ur/urweb/bench.urs @@ -4,3 +4,4 @@ val queries : string -> transaction page val fortunes : unit -> transaction page val updates : string -> transaction page val plaintext : unit -> transaction page +val cached_queries : string -> transaction page diff --git a/frameworks/Ur/urweb/benchmark_config.json b/frameworks/Ur/urweb/benchmark_config.json index 389b8517ce2..23aca3bb682 100644 --- a/frameworks/Ur/urweb/benchmark_config.json +++ b/frameworks/Ur/urweb/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "urweb", + "maintainers": ["achlipala"], "tests": [{ "default": { "display_name": "urweb", @@ -42,7 +43,7 @@ }, "cache": { "setup_file": "setup-postgresql", - "cached_query_url": "/queries/", + "cached_query_url": "/cached_queries/", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -53,12 +54,11 @@ "platform": "Ur/Web", "webserver": "None", "os": "Linux", - "database_os": "Linux", - "tags": ["broken"] + "database_os": "Linux" }, "mysql-cache": { "setup_file": "setup-mysql", - "cached_query_url": "/queries/", + "cached_query_url": "/cached_queries/", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -69,8 +69,7 @@ "platform": "Ur/Web", "webserver": "None", "os": "Linux", - "database_os": "Linux", - "tags": ["broken"] + "database_os": "Linux" } }] } diff --git a/frameworks/Ur/urweb/config.toml b/frameworks/Ur/urweb/config.toml index cf30140d712..26827637aa3 100644 --- a/frameworks/Ur/urweb/config.toml +++ b/frameworks/Ur/urweb/config.toml @@ -19,7 +19,7 @@ webserver = "None" versus = "None" [mysql-cache] -urls.cached_query = "/queries/" +urls.cached_query = "/cached_queries/" approach = "Realistic" classification = "Fullstack" database = "MySQL" @@ -31,7 +31,7 @@ webserver = "None" versus = "None" [cache] -urls.cached_query = "/queries/" +urls.cached_query = "/cached_queries/" approach = "Realistic" classification = "Fullstack" database = "Postgres" diff --git a/frameworks/Ur/urweb/urweb-cache.dockerfile b/frameworks/Ur/urweb/urweb-cache.dockerfile index 762f7cb1c36..69bfbafd60e 100644 --- a/frameworks/Ur/urweb/urweb-cache.dockerfile +++ b/frameworks/Ur/urweb/urweb-cache.dockerfile @@ -1,9 +1,9 @@ -FROM ubuntu:18.04 +FROM ubuntu:23.10 ADD ./ /urweb WORKDIR /urweb -RUN apt-get update -yqq && apt-get install -yqq urweb +RUN apt-get update -yqq && apt-get install -yqq sudo git gcc make autoconf automake libtool mlton libpq-dev libssl-dev uthash-dev libicu-dev && git clone https://github.com/urweb/urweb.git && cd urweb && ./autogen.sh && ./configure && make -j && sudo make install RUN urweb -sqlcache -db "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass host=tfb-database" bench diff --git a/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile b/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile index 5655af62e58..4bec91de9d8 100644 --- a/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile +++ b/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile @@ -1,9 +1,9 @@ -FROM ubuntu:18.04 +FROM ubuntu:23.10 ADD ./ /urweb WORKDIR /urweb -RUN apt-get update -yqq && apt-get install -yqq urweb +RUN apt-get update -yqq && apt-get install -yqq sudo git gcc make autoconf automake libtool mlton libmysqlclient-dev libssl-dev uthash-dev libicu-dev && git clone https://github.com/urweb/urweb.git && cd urweb && ./autogen.sh && ./configure && make -j && sudo make install RUN urweb -sqlcache -dbms mysql -db "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass host=tfb-database" bench diff --git a/frameworks/Ur/urweb/urweb-mysql.dockerfile b/frameworks/Ur/urweb/urweb-mysql.dockerfile index cfa770970c0..bee66b290b0 100644 --- a/frameworks/Ur/urweb/urweb-mysql.dockerfile +++ b/frameworks/Ur/urweb/urweb-mysql.dockerfile @@ -1,9 +1,9 @@ -FROM ubuntu:18.04 +FROM ubuntu:23.10 ADD ./ /urweb WORKDIR /urweb -RUN apt-get update -yqq && apt-get install -yqq urweb +RUN apt-get update -yqq && apt-get install -yqq sudo git gcc make autoconf automake libtool mlton libmysqlclient-dev libssl-dev uthash-dev libicu-dev && git clone https://github.com/urweb/urweb.git && cd urweb && ./autogen.sh && ./configure && make -j && sudo make install RUN urweb -dbms mysql -db "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass host=tfb-database" bench diff --git a/frameworks/Ur/urweb/urweb.dockerfile b/frameworks/Ur/urweb/urweb.dockerfile index 998ee242cd1..6bbba474104 100644 --- a/frameworks/Ur/urweb/urweb.dockerfile +++ b/frameworks/Ur/urweb/urweb.dockerfile @@ -1,9 +1,9 @@ -FROM ubuntu:18.04 +FROM ubuntu:23.10 ADD ./ /urweb WORKDIR /urweb -RUN apt-get update -yqq && apt-get install -yqq urweb +RUN apt-get update -yqq && apt-get install -yqq sudo git gcc make autoconf automake libtool mlton libpq-dev libssl-dev uthash-dev libicu-dev && git clone https://github.com/urweb/urweb.git && cd urweb && ./autogen.sh && ./configure && make -j && sudo make install RUN urweb -db "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass host=tfb-database" bench From a0707d746c92f3f1346cfdeea7a89576752028f8 Mon Sep 17 00:00:00 2001 From: Nautilus-1021 <87652044+Nautilus-1021@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:30:16 +0200 Subject: [PATCH 0479/1766] [Rust] Fix the Rocket framework bench (#8742) * Branch rebase * Test version increment * Rust container version fix * Fixed the UPDATE test * Keep alive config fix --------- Co-authored-by: Victor.G --- frameworks/Rust/rocket/.gitignore | 4 +- frameworks/Rust/rocket/Cargo.lock | 2090 +++++++++-------- frameworks/Rust/rocket/Cargo.toml | 32 +- frameworks/Rust/rocket/Rocket.toml | 8 + frameworks/Rust/rocket/benchmark_config.json | 99 +- .../Rust/rocket/rocket-diesel.dockerfile | 2 +- frameworks/Rust/rocket/rocket.dockerfile | 8 +- frameworks/Rust/rocket/rust-toolchain.toml | 2 - frameworks/Rust/rocket/src/main.rs | 171 +- frameworks/Rust/rocket/src/models.rs | 8 +- 10 files changed, 1189 insertions(+), 1235 deletions(-) create mode 100644 frameworks/Rust/rocket/Rocket.toml delete mode 100644 frameworks/Rust/rocket/rust-toolchain.toml diff --git a/frameworks/Rust/rocket/.gitignore b/frameworks/Rust/rocket/.gitignore index 2eea525d885..b153885fd09 100644 --- a/frameworks/Rust/rocket/.gitignore +++ b/frameworks/Rust/rocket/.gitignore @@ -1 +1,3 @@ -.env \ No newline at end of file +.env + +Cargo.lock diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index 29378a41cca..4d2987091e8 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -3,129 +3,113 @@ version = 3 [[package]] -name = "aead" -version = "0.5.1" +name = "addr2line" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" -dependencies = [ - "cfg-if 1.0.0", - "cipher", - "cpufeatures", + "gimli", ] [[package]] -name = "aes-gcm" -version = "0.10.1" +name = "adler" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" 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 = "annotate-snippets" -version = "0.9.1" +name = "allocator-api2" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b9d411ecbaf79885c6df4d75fff75858d5995ff25385657a28af47e82f9c36" -dependencies = [ - "unicode-width", - "yansi-term", -] +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "async-stream" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", + "pin-project-lite", ] [[package]] name = "async-stream-impl" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.50", ] [[package]] name = "async-trait" -version = "0.1.61" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705339e0e4a9690e2908d2b3d049d85682cf19fbd5782494498fbf7003a6a282" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.50", ] [[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" -version = "0.5.1" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + +[[package]] +name = "atomic" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" +checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" dependencies = [ - "autocfg", + "bytemuck", ] [[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 0.1.19", - "libc", - "winapi 0.3.9", + "nix", + "rand", ] [[package]] @@ -135,16 +119,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "base64" -version = "0.13.1" +name = "backtrace" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] [[package]] name = "base64" -version = "0.20.0" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "binascii" @@ -158,44 +157,50 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +dependencies = [ + "serde", +] + [[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 = "bumpalo" -version = "3.11.1" +name = "bytemuck" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" [[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" - -[[package]] -name = "cfg-if" -version = "0.1.10" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -204,82 +209,70 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cipher" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "convert_case" -version = "0.4.0" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cookie" -version = "0.16.2" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" dependencies = [ - "aes-gcm", - "base64 0.20.0", - "hkdf", - "hmac", "percent-encoding", - "rand", - "sha2", - "subtle", "time", "version_check", ] [[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 = "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-queue" -version = "0.3.8" +name = "crossbeam-channel" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] -name = "crossbeam-utils" -version = "0.8.14" +name = "crossbeam-queue" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if 1.0.0", + "crossbeam-utils", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-common" version = "0.1.6" @@ -287,37 +280,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "rand_core", "typenum", ] [[package]] -name = "ctr" -version = "0.9.2" +name = "der" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ - "cipher", + "const-oid", + "pem-rfc7468", + "zeroize", ] [[package]] -name = "derive_more" -version = "0.99.17" +name = "deranged" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn", + "powerfmt", ] [[package]] name = "devise" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" +checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8" dependencies = [ "devise_codegen", "devise_core", @@ -325,9 +315,9 @@ dependencies = [ [[package]] name = "devise_codegen" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" +checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" dependencies = [ "devise_core", "quote", @@ -335,70 +325,62 @@ dependencies = [ [[package]] name = "devise_core" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" +checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" dependencies = [ - "bitflags", + "bitflags 2.4.2", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.50", ] [[package]] name = "diesel" -version = "1.4.8" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b28135ecf6b7d446b43e27e225622a038cc4e2930a1022f51cdb97ada19b8e4d" +checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" dependencies = [ - "bitflags", + "bitflags 2.4.2", "byteorder", "diesel_derives", + "itoa", "pq-sys", "r2d2", ] [[package]] name = "diesel_derives" -version = "1.4.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" +checksum = "ef8337737574f55a468005a83499da720f20c65586241ffea339db9ecdfd2b44" dependencies = [ + "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "digest" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", + "syn 2.0.50", ] [[package]] -name = "dirs" -version = "4.0.0" +name = "diesel_table_macro_syntax" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "dirs-sys", + "syn 2.0.50", ] [[package]] -name = "dirs-sys" -version = "0.3.7" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", + "block-buffer", + "const-oid", + "crypto-common", + "subtle", ] [[package]] @@ -408,24 +390,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] -name = "dtoa" -version = "1.0.5" +name = "dotenvy" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00704156a7de8df8da0911424e30c2049957b0a714542a44e05fe693dd85313" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "either" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +dependencies = [ + "serde", +] [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -434,6 +419,27 @@ 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]] name = "event-listener" version = "2.5.3" @@ -442,20 +448,17 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[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 = "figment" -version = "0.10.8" +version = "0.10.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e56602b469b2201400dec66a66aec5a9b8761ee97cd1b8c96ab2483fcc16cc9" +checksum = "2b6e5bc7bd59d60d0d45a6ccab6cf0f4ce28698fb4e81e750ddf229c9b824026" dependencies = [ - "atomic", + "atomic 0.6.0", "pear", "serde", "toml", @@ -465,75 +468,65 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.19" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "redox_syscall 0.2.16", - "windows-sys", + "redox_syscall", + "windows-sys 0.52.0", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "finl_unicode" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" [[package]] -name = "form_urlencoded" -version = "1.1.0" +name = "flume" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ - "percent-encoding", + "futures-core", + "futures-sink", + "spin 0.9.8", ] [[package]] -name = "fsevent" -version = "0.4.0" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" -dependencies = [ - "bitflags", - "fsevent-sys", -] +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "fsevent-sys" -version = "2.0.1" +name = "form_urlencoded" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "libc", + "percent-encoding", ] [[package]] -name = "fuchsia-zircon" -version = "0.3.3" +name = "fsevent-sys" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" dependencies = [ - "bitflags", - "fuchsia-zircon-sys", + "libc", ] -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - [[package]] name = "futures" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", - "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -542,9 +535,9 @@ dependencies = [ [[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", @@ -552,15 +545,15 @@ 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.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -569,54 +562,42 @@ 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.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" - -[[package]] -name = "futures-macro" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[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-channel", "futures-core", "futures-io", - "futures-macro", "futures-sink", "futures-task", "memchr", @@ -627,9 +608,9 @@ dependencies = [ [[package]] name = "generator" -version = "0.7.2" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266041a359dfa931b370ef684cceb84b166beb14f7f0421f4a6a3d0c446d12e" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" dependencies = [ "cc", "libc", @@ -640,9 +621,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", @@ -650,24 +631,20 @@ 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 1.0.0", + "cfg-if", "libc", "wasi", ] [[package]] -name = "ghash" -version = "0.5.0" +name = "gimli" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug", - "polyval", -] +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" @@ -687,7 +664,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -696,9 +673,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.3.6" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "035ef95d03713f2c347a72547b7cd38cbc9af7cd51e6099fb62d586d4a6dee3a" +checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" dependencies = [ "log", "pest", @@ -710,60 +687,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 = "hashbrown" -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" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.11.2", + "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.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.2.6" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -773,9 +727,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", ] @@ -789,11 +743,20 @@ 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 = "http" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -802,9 +765,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", @@ -819,15 +782,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.23" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -849,9 +812,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", @@ -859,23 +822,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[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 0.14.3", + "hashbrown", + "serde", ] [[package]] @@ -886,11 +839,11 @@ checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] name = "inotify" -version = "0.7.1" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" dependencies = [ - "bitflags", + "bitflags 1.3.2", "inotify-sys", "libc", ] @@ -905,64 +858,49 @@ dependencies = [ ] [[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "iovec" -version = "0.1.4" +name = "is-terminal" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ + "hermit-abi", "libc", + "windows-sys 0.52.0", ] [[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" +name = "kqueue" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" dependencies = [ - "wasm-bindgen", + "kqueue-sys", + "libc", ] [[package]] -name = "kernel32-sys" -version = "0.2.2" +name = "kqueue-sys" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "bitflags 1.3.2", + "libc", ] [[package]] @@ -970,24 +908,44 @@ 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.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] -name = "lazycell" -version = "1.3.0" +name = "libm" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] -name = "libc" -version = "0.2.139" +name = "libsqlite3-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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 = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +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", @@ -995,12 +953,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 1.0.0", -] +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "loom" @@ -1008,7 +963,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "generator", "scoped-tls", "serde", @@ -1023,29 +978,30 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[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 = "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" @@ -1054,65 +1010,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "mio" -version = "0.6.23" +name = "miniz_oxide" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", + "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", - "windows-sys", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio 0.6.23", - "slab", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", + "windows-sys 0.48.0", ] [[package]] name = "multer" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed4198ce7a4cbd2a57af78d28c6fbb57d81ac5f1d6ad79ac6c5587419cbdf22" +checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" dependencies = [ "bytes", "encoding_rs", @@ -1122,28 +1044,28 @@ dependencies = [ "log", "memchr", "mime", - "spin 0.9.4", + "spin 0.9.8", "tokio", "tokio-util", "version_check", ] [[package]] -name = "net2" -version = "0.2.38" +name = "nix" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "cfg-if 0.1.10", + "bitflags 2.4.2", + "cfg-if", "libc", - "winapi 0.3.9", ] [[package]] name = "nom" -version = "7.1.2" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5507769c4919c998e69e49c839d9dc6e693ede4cc4290d6ad8b41d4f09c548c" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", @@ -1151,29 +1073,30 @@ dependencies = [ [[package]] name = "normpath" -version = "0.3.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04aaf5e9cb0fbf883cc0423159eacdf96a9878022084b35c462c428cab73bcaf" +checksum = "5831952a9476f2fed74b77d74182fa5ddc4d21c72ec45a333b250e3ed0272804" dependencies = [ - "winapi 0.3.9", + "windows-sys 0.52.0", ] [[package]] name = "notify" -version = "4.0.17" +version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags", + "bitflags 2.4.2", + "crossbeam-channel", "filetime", - "fsevent", "fsevent-sys", "inotify", + "kqueue", "libc", - "mio 0.6.23", - "mio-extras", + "log", + "mio", "walkdir", - "winapi 0.3.9", + "windows-sys 0.48.0", ] [[package]] @@ -1183,39 +1106,86 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", - "winapi 0.3.9", + "winapi", +] + +[[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-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +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 = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] [[package]] -name = "once_cell" -version = "1.17.0" +name = "object" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] [[package]] -name = "opaque-debug" -version = "0.3.0" +name = "once_cell" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "overload" @@ -1223,17 +1193,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[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.6", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -1241,47 +1200,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.5", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi 0.3.9", + "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall 0.2.16", "smallvec", - "windows-sys", + "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 = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pear" -version = "0.2.3" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702" +checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8" dependencies = [ "inlinable_string", "pear_codegen", @@ -1290,37 +1235,47 @@ dependencies = [ [[package]] name = "pear_codegen" -version = "0.2.3" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" +checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.50", +] + +[[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 = "pest" -version = "2.5.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cbd939b234e95d72bc393d51788aec68aeeb5d51e748ca08ff3aad58cb722f7" +checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.5.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a81186863f3d0a27340815be8f2078dd8050b14cd71913db9fbda795e5f707d7" +checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" dependencies = [ "pest", "pest_generator", @@ -1328,22 +1283,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a1ef20bf3193c15ac345acb32e26b3dc3223aff4d77ae4fc5359567683796b" +checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.50", ] [[package]] name = "pest_meta" -version = "2.5.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e3b284b1f13a20dc5ebc90aff59a51b8d7137c221131b52a7260c08cbc1cc80" +checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" dependencies = [ "once_cell", "pest", @@ -1352,9 +1307,9 @@ dependencies = [ [[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" @@ -1363,17 +1318,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "polyval" -version = "0.6.0" +name = "pkcs1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug", - "universal-hash", + "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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[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" @@ -1382,50 +1358,40 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pq-sys" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b845d6d8ec554f972a2c5298aad68953fd64e7441e846075450b44656a016d1" +checksum = "31c0052426df997c0cbd30789eb44ca097e3541717a7b8fa36b1c464ee7edebd" dependencies = [ "vcpkg", ] -[[package]] -name = "prettyplease" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "proc-macro2-diagnostics" -version = "0.9.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.50", "version_check", "yansi", ] [[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", ] @@ -1437,7 +1403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" dependencies = [ "log", - "parking_lot 0.12.1", + "parking_lot", "scheduled-thread-pool", ] @@ -1471,64 +1437,45 @@ dependencies = [ "getrandom", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - [[package]] name = "redox_syscall" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", + "bitflags 1.3.2", ] [[package]] name = "ref-cast" -version = "1.0.14" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c78fb8c9293bcd48ef6fce7b4ca950ceaf21210de6e105a883ee280c0f7b9ed" +checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.14" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9c0c92af03644e4806106281fe2e068ac5bc0ae74a707266d06ea27bccee5f" +checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.50", ] [[package]] name = "regex" -version = "1.7.0" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-automata 0.4.5", + "regex-syntax 0.8.2", ] [[package]] @@ -1537,60 +1484,67 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax", + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", ] [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "regex-syntax" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "ring" -version = "0.16.20" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", + "getrandom", "libc", - "once_cell", - "spin 0.5.2", + "spin 0.9.8", "untrusted", - "web-sys", - "winapi 0.3.9", + "windows-sys 0.52.0", ] [[package]] name = "rocket" -version = "0.5.0-rc.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ead083fce4a405feb349cf09abdf64471c6077f14e0ce59364aa90d4b99317" +checksum = "9e7bb57ccb26670d73b6a47396c83139447b9e7878cab627fdfe9ea8da489150" dependencies = [ "async-stream", "async-trait", - "atomic", - "atty", + "atomic 0.5.3", "binascii", "bytes", "either", "figment", "futures", - "indexmap 1.9.2", + "indexmap", "log", "memchr", "multer", "num_cpus", - "parking_lot 0.12.1", + "parking_lot", "pin-project-lite", "rand", "ref-cast", @@ -1611,25 +1565,26 @@ dependencies = [ [[package]] name = "rocket_codegen" -version = "0.5.0-rc.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6aeb6bb9c61e9cd2c00d70ea267bf36f76a4cc615e5908b349c2f9d93999b47" +checksum = "a2238066abf75f21be6cd7dc1a09d5414a671f4246e384e49fe3f8a4936bd04c" dependencies = [ "devise", "glob", - "indexmap 1.9.2", + "indexmap", "proc-macro2", "quote", "rocket_http", - "syn", + "syn 2.0.50", "unicode-xid", + "version_check", ] [[package]] name = "rocket_db_pools" -version = "0.1.0-rc.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bc154f4f4985a136e2d59c336474a56da02103993f5e637e3a5424971ee4eff" +checksum = "f0ebde3e24cbe917062b862136fd532d1ace80e0377a2f5fed541fadd764f1e5" dependencies = [ "rocket", "rocket_db_pools_codegen", @@ -1639,9 +1594,9 @@ dependencies = [ [[package]] name = "rocket_db_pools_codegen" -version = "0.1.0-rc.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa8f9b37bb1d4827aa5cca400d74e91d30f4352713cb65d6e7427bafe21336c" +checksum = "184a6f59eed0bf3d1cccb091960a2a1c89efa829b8a41158b269985a9c1bee95" dependencies = [ "devise", "quote", @@ -1649,29 +1604,29 @@ dependencies = [ [[package]] name = "rocket_dyn_templates" -version = "0.1.0-rc.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab13df598440527c200f46fb944dc55d8d67a1818b617eb5a3981dcd8b63fd2" +checksum = "04bfc006e547e4f72b760ab861f5943b688aed8a82c4977b5500c98f5d17dbfa" dependencies = [ - "glob", "handlebars", "normpath", "notify", "rocket", + "walkdir", ] [[package]] name = "rocket_http" -version = "0.5.0-rc.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ded65d127954de3c12471630bf4b81a2792f065984461e65b91d0fdaafc17a2" +checksum = "37a1663694d059fe5f943ea5481363e48050acedd241d46deb2e27f71110389e" dependencies = [ "cookie", "either", "futures", "http", "hyper", - "indexmap 1.9.2", + "indexmap", "log", "memchr", "pear", @@ -1689,9 +1644,9 @@ dependencies = [ [[package]] name = "rocket_sync_db_pools" -version = "0.1.0-rc.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa48b6ab25013e9812f1b0c592741900b3a2a83c0936292e0565c0ac842f558" +checksum = "d83f32721ed79509adac4328e97f817a8f55a47c4b64799f6fd6cc3adb6e42ff" dependencies = [ "diesel", "r2d2", @@ -1699,13 +1654,14 @@ dependencies = [ "rocket_sync_db_pools_codegen", "serde", "tokio", + "version_check", ] [[package]] name = "rocket_sync_db_pools_codegen" -version = "0.1.0-rc.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280ef2d232923e69cb93da156972eb5476a7cce5ba44843f6608f46a4abf7aab" +checksum = "5cc890925dc79370c28eb15c9957677093fdb7e8c44966d189f38cedb995ee68" dependencies = [ "devise", "quote", @@ -1715,59 +1671,95 @@ dependencies = [ name = "rocket_techempower" version = "0.4.0" dependencies = [ - "async-stream", - "async-trait", - "diesel", "dotenv", - "figment", - "futures", - "futures-util", - "proc-macro2", "rand", "rocket", "rocket_db_pools", "rocket_dyn_templates", "rocket_sync_db_pools", - "serde", - "serde_derive", - "serde_json", "sqlx", - "yarte", ] [[package]] -name = "rustc_version" -version = "0.4.0" +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 = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "semver", + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.19.1" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ - "base64 0.13.1", - "log", "ring", + "rustls-webpki", "sct", - "webpki", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[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.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -1784,7 +1776,7 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" dependencies = [ - "parking_lot 0.12.1", + "parking_lot", ] [[package]] @@ -1795,51 +1787,45 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", ] -[[package]] -name = "semver" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" - [[package]] name = "serde" -version = "1.0.152" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.50", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -1847,68 +1833,87 @@ dependencies = [ ] [[package]] -name = "sha-1" -version = "0.10.1" +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest", ] [[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 1.0.0", + "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[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 = "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 0.3.9", + "windows-sys 0.48.0", ] [[package]] @@ -1919,15 +1924,28 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spin" -version = "0.9.4" +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 = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] [[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", @@ -1936,94 +1954,202 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.5.13" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" dependencies = [ "sqlx-core", "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", ] [[package]] name = "sqlx-core" -version = "0.5.13" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ "ahash", "atoi", - "base64 0.13.1", - "bitflags", "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 1.9.2", - "itoa", - "libc", + "indexmap", "log", - "md-5", "memchr", "once_cell", "paste", "percent-encoding", - "rand", "rustls", + "rustls-pemfile", "serde", "serde_json", - "sha-1", "sha2", "smallvec", "sqlformat", - "sqlx-rt", - "stringprep", "thiserror", + "tokio", "tokio-stream", + "tracing", "url", - "webpki", "webpki-roots", - "whoami", ] [[package]] name = "sqlx-macros" -version = "0.5.13" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" dependencies = [ - "dotenv", + "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-rt", - "syn", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", "url", ] [[package]] -name = "sqlx-rt" -version = "0.5.13" +name = "sqlx-mysql" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" +checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ - "once_cell", - "tokio", - "tokio-rustls", + "atoi", + "base64", + "bitflags 2.4.2", + "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", + "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", + "bitflags 2.4.2", + "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]] @@ -2037,34 +2163,46 @@ dependencies = [ [[package]] name = "state" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" dependencies = [ "loom", ] [[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", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -2073,54 +2211,56 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.3.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "fastrand", - "libc", - "redox_syscall 0.2.16", - "remove_dir_all", - "winapi 0.3.9", + "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.50", ] [[package]] name = "thread_local" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ + "cfg-if", "once_cell", ] [[package]] name = "time" -version = "0.3.17" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ + "deranged", "itoa", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -2128,16 +2268,17 @@ 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.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -2152,56 +2293,44 @@ 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.24.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9f76183f91ecfb55e1d7d5602bd1d979e38a3a522fe900241cf195624d67ae" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", - "mio 0.8.5", + "mio", "num_cpus", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "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", -] - -[[package]] -name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls", - "tokio", - "webpki", + "syn 2.0.50", ] [[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", @@ -2210,9 +2339,9 @@ 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", @@ -2224,11 +2353,36 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.10" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -2239,11 +2393,11 @@ 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 1.0.0", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2251,20 +2405,20 @@ 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.50", ] [[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", @@ -2272,20 +2426,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.16" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -2301,36 +2455,36 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[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 = "ubyte" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6" +checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" dependencies = [ "serde", ] [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uncased" -version = "0.9.7" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" dependencies = [ "serde", "version_check", @@ -2338,36 +2492,30 @@ dependencies = [ [[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" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-xid" @@ -2381,27 +2529,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" -[[package]] -name = "universal-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" -dependencies = [ - "crypto-common", - "subtle", -] - [[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", @@ -2409,20 +2547,10 @@ dependencies = [ ] [[package]] -name = "v_eval" -version = "0.6.0" +name = "urlencoding" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" -dependencies = [ - "regex", - "syn", -] - -[[package]] -name = "v_htmlescape" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "valuable" @@ -2444,9 +2572,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -2454,11 +2582,10 @@ dependencies = [ [[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", ] @@ -2469,354 +2596,229 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasite" -version = "0.1.0" +name = "webpki-roots" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if 1.0.0", - "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-macro" -version = "0.2.83" +name = "whoami" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] +checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" [[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" +name = "winapi" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] -name = "web-sys" -version = "0.3.60" +name = "winapi-util" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ - "js-sys", - "wasm-bindgen", + "winapi", ] [[package]] -name = "webpki" -version = "0.21.4" +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "webpki-roots" -version = "0.21.1" +name = "windows" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "webpki", + "windows-targets 0.48.5", ] [[package]] -name = "whoami" -version = "1.5.1" +name = "windows-sys" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "redox_syscall 0.4.1", - "wasite", - "web-sys", + "windows-targets 0.48.5", ] [[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "windows-targets 0.52.0", ] [[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "windows-targets" +version = "0.48.5" 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" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "winapi 0.3.9", + "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 = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-targets" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_msvc 0.39.0", - "windows_i686_gnu 0.39.0", - "windows_i686_msvc 0.39.0", - "windows_x86_64_gnu 0.39.0", - "windows_x86_64_msvc 0.39.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-sys" -version = "0.42.0" +name = "windows_aarch64_gnullvm" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -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", -] +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +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.39.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" +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.39.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" +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.39.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" +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.39.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" +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_msvc" -version = "0.39.0" +name = "windows_x86_64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - -[[package]] -name = "yansi-term" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "yarte" -version = "0.15.7" +name = "windows_x86_64_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfce1df93f3b16e5272221a559e60bbbaaa71dbc042a43996d223e51a690aab2" -dependencies = [ - "yarte_derive", - "yarte_helpers", -] +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] -name = "yarte_codegen" -version = "0.15.6" +name = "winnow" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cf72076dbf4d39fe4779b58380d7213dcb3995d00666dd2d109f1b45879ea4" +checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" dependencies = [ - "proc-macro2", - "quote", - "syn", - "yarte_helpers", - "yarte_hir", + "memchr", ] [[package]] -name = "yarte_derive" -version = "0.15.6" +name = "yansi" +version = "1.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" +checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377" dependencies = [ - "proc-macro2", - "quote", - "syn", - "yarte_codegen", - "yarte_helpers", - "yarte_hir", - "yarte_parser", + "is-terminal", ] [[package]] -name = "yarte_helpers" -version = "0.15.7" +name = "zerocopy" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfe1ef3558dde14b4be5387bdd41e3bd45746570743521470ec3e9cd0826679" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ - "dtoa", - "itoa", - "prettyplease", - "serde", - "syn", - "toml", - "v_htmlescape", + "zerocopy-derive", ] [[package]] -name = "yarte_hir" -version = "0.15.6" +name = "zerocopy-derive" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee42d2f704a3b1d8bc111d47a705d1302a0943d85e4c230f4e8300ee0dde4a6" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ - "derive_more", "proc-macro2", "quote", - "syn", - "v_eval", - "v_htmlescape", - "yarte_helpers", - "yarte_parser", + "syn 2.0.50", ] [[package]] -name = "yarte_parser" -version = "0.15.2" +name = "zeroize" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538f72049cf7104e12d5c444048d112cb8fc788a31308afd912442a381ba860c" -dependencies = [ - "annotate-snippets", - "derive_more", - "proc-macro2", - "quote", - "serde", - "syn", - "unicode-xid", - "yarte_helpers", -] +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/frameworks/Rust/rocket/Cargo.toml b/frameworks/Rust/rocket/Cargo.toml index 1863cbf4f12..9fc55725ba2 100644 --- a/frameworks/Rust/rocket/Cargo.toml +++ b/frameworks/Rust/rocket/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rocket_techempower" -version = "0.4.0" +version = "0.5.0" authors = [ "Marcelo Barbosa ", "Brendan Hansknecht ", @@ -17,27 +17,15 @@ opt-level = 3 name = "rocket" path = "src/main.rs" -[[bin]] -name = "rocket-diesel" -path = "rocket-diesel/main.rs" +# The Diesel version is broken +#[[bin]] +#name = "rocket-diesel" +#path = "rocket-diesel/main.rs" [dependencies] -diesel = { version = "1.4", features = ["postgres"] } -rocket_sync_db_pools = { version = "0.1.0-rc.2", default-features = false, features = ["diesel_postgres_pool"] } -rocket_dyn_templates = { version = "0.1.0-rc.2", features = ["handlebars"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -serde_derive = "1.0" -dotenv = "0.15.0" -figment = "0.10.6" +#rocket_sync_db_pools = { version = "0.1.0", default-features = false, features = ["diesel_postgres_pool"] } rand = { version = "0.8", features = ["small_rng"] } -rocket = { version = "0.5.0-rc.2", features = [ "json" ] } -rocket_db_pools = { version = "0.1.0-rc.2", features = [ "sqlx_postgres" ] } -sqlx = { version = "0.5.13", features = [ "postgres", "macros" ] } -yarte = "0.15.6" -# temp issue https://github.com/SergioBenitez/Rocket/issues/2491 -proc-macro2 = "= 1.0.51" -async-stream = "0.3.3" -async-trait = "0.1.53" -futures = "0.3.21" -futures-util = "0.3.21" +rocket = { version = "0.5.0", features = [ "json" ] } +rocket_db_pools = { version = "0.1.0", features = [ "sqlx_postgres" ] } +rocket_dyn_templates = { version = "0.1.0", features = ["handlebars"] } +sqlx = { version = "0.7", features = ["macros"] } diff --git a/frameworks/Rust/rocket/Rocket.toml b/frameworks/Rust/rocket/Rocket.toml new file mode 100644 index 00000000000..cc0ff76b043 --- /dev/null +++ b/frameworks/Rust/rocket/Rocket.toml @@ -0,0 +1,8 @@ +[default] +address = "0.0.0.0" +port = 8000 +log_level = "off" + +[default.databases.hello_world] +url = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world" +connect_timeout = 5 diff --git a/frameworks/Rust/rocket/benchmark_config.json b/frameworks/Rust/rocket/benchmark_config.json index e4643fe6c08..2569f14f9ef 100755 --- a/frameworks/Rust/rocket/benchmark_config.json +++ b/frameworks/Rust/rocket/benchmark_config.json @@ -1,53 +1,54 @@ { "framework": "rocket", "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "port": 8000, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Rocket", - "language": "Rust", - "flavor": "None", - "orm": "Full", - "platform": "Rust", - "webserver": "Hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Rocket", - "notes": "", - "versus": "None", - "tags": ["broken"] - }, - "diesel": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "port": 8000, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Rocket", - "language": "Rust", - "flavor": "None", - "orm": "Full", - "platform": "Rust", - "webserver": "Hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Rocket (Diesel)", - "notes": "", - "versus": "None", - "tags": ["broken"] - } - }] + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "Rocket", + "language": "Rust", + "flavor": "None", + "orm": "Full", + "platform": "Rust", + "webserver": "Hyper", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rocket", + "notes": "", + "versus": "None" + }, + "diesel": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "Rocket", + "language": "Rust", + "flavor": "None", + "orm": "Full", + "platform": "Rust", + "webserver": "Hyper", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rocket (Diesel)", + "notes": "", + "versus": "None", + "tags": [ + "broken" + ] + } + }] } diff --git a/frameworks/Rust/rocket/rocket-diesel.dockerfile b/frameworks/Rust/rocket/rocket-diesel.dockerfile index a64eeb4fd37..e7cb90c8a3a 100644 --- a/frameworks/Rust/rocket/rocket-diesel.dockerfile +++ b/frameworks/Rust/rocket/rocket-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.63 +FROM rust:1.76-slim ENV ROCKET_BENCHMARK_DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world diff --git a/frameworks/Rust/rocket/rocket.dockerfile b/frameworks/Rust/rocket/rocket.dockerfile index 1d5cba3cd5a..c351f586c26 100644 --- a/frameworks/Rust/rocket/rocket.dockerfile +++ b/frameworks/Rust/rocket/rocket.dockerfile @@ -1,10 +1,4 @@ -FROM rust:1.60-slim - -ENV ROCKET_BENCHMARK_DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world - -RUN apt-get update && apt-get install -y --no-install-recommends \ - libpq-dev \ -&& rm -rf /var/lib/apt/lists/* +FROM rust:1.76 ADD ./ /rocket WORKDIR /rocket diff --git a/frameworks/Rust/rocket/rust-toolchain.toml b/frameworks/Rust/rocket/rust-toolchain.toml deleted file mode 100644 index 292fe499e3b..00000000000 --- a/frameworks/Rust/rocket/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "stable" diff --git a/frameworks/Rust/rocket/src/main.rs b/frameworks/Rust/rocket/src/main.rs index 6bcbb9e8bfe..017bf8bc026 100644 --- a/frameworks/Rust/rocket/src/main.rs +++ b/frameworks/Rust/rocket/src/main.rs @@ -1,24 +1,14 @@ -#[macro_use] -extern crate rocket; -extern crate dotenv; -extern crate serde_derive; - mod database; mod models; -use std::env; -use std::net::{IpAddr, Ipv4Addr}; +use std::fmt::Write; -use dotenv::dotenv; -use figment::Figment; use rand::{self, Rng}; -use rocket::{Build, Rocket}; -use rocket::config::{Config, LogLevel}; -use rocket::response::content::RawHtml; +use rocket::{launch, get, routes}; use rocket::serde::json::Json; -use rocket_db_pools::{sqlx, Connection, Database}; -use sqlx::Acquire; -use yarte::Template; +use rocket_db_pools::{Connection, Database}; +use rocket_db_pools::sqlx; +use rocket_dyn_templates::{Template, context}; use database::HelloWorld; use models::{Fortune, Message, World}; @@ -28,12 +18,11 @@ fn plaintext() -> &'static str { "Hello, World!" } +const MESSAGE: Message = Message { message: "Hello, World!" }; + #[get("/json")] fn json() -> Json { - let message = Message { - message: "Hello, World!".into(), - }; - Json(message) + Json(MESSAGE) } fn random_id() -> i32 { @@ -42,16 +31,18 @@ fn random_id() -> i32 { rng.gen_range(1..=10_000) } +async fn query_random_world(db: &mut Connection) -> World { + let world_id = random_id(); + sqlx::query_as("SELECT id, randomnumber FROM World WHERE id = $1") + .bind(world_id) + .fetch_one(db.as_mut()) + .await + .expect("Error querying world") +} + #[get("/db")] async fn db(mut db: Connection) -> Json { - let number = random_id(); - let result: World = sqlx::query_as("SELECT id, randomnumber FROM World WHERE id = $1") - .bind(number) - .fetch_one(&mut *db) - .await - .ok() - .expect("error loading world"); - Json(result) + Json(query_random_world(&mut db).await) } #[get("/queries")] @@ -65,31 +56,19 @@ async fn queries(mut db: Connection, q: u16) -> Json> { let mut results = Vec::with_capacity(q.into()); for _ in 0..q { - let query_id = random_id(); - let result: World = sqlx::query_as("SELECT * FROM World WHERE id = $1") - .bind(query_id) - .fetch_one(&mut *db) - .await - .ok() - .expect("error loading world"); - results.push(result); + let world = query_random_world(&mut db).await; + + results.push(world); } Json(results) } -#[derive(Template)] -#[template(path = "fortunes.html.hbs")] -pub struct FortunesTemplate<'a> { - pub fortunes: &'a Vec, -} - #[get("/fortunes")] -async fn fortunes(mut db: Connection) -> RawHtml { +async fn fortunes(mut db: Connection) -> Template { let mut fortunes: Vec = sqlx::query_as("SELECT * FROM Fortune") - .fetch_all(&mut *db) + .fetch_all(db.as_mut()) .await - .ok() .expect("Could not load Fortunes"); fortunes.push(Fortune { @@ -99,13 +78,9 @@ async fn fortunes(mut db: Connection) -> RawHtml { fortunes.sort_by(|a, b| a.message.cmp(&b.message)); - RawHtml( - FortunesTemplate { - fortunes: &fortunes, - } - .call() - .expect("error rendering template"), - ) + Template::render("fortunes", context! { + fortunes: fortunes + }) } #[get("/updates")] @@ -119,70 +94,57 @@ async fn updates(mut db: Connection, q: u16) -> Json> { let mut results = Vec::with_capacity(q.into()); for _ in 0..q { - let query_id = random_id(); - let mut result: World = sqlx::query_as("SELECT * FROM World WHERE id = $1") - .bind(query_id) - .fetch_one(&mut *db) - .await - .ok() - .expect("World was not found"); - - result.random_number = random_id(); - results.push(result); + let mut world = query_random_world(&mut db).await; + + world.random_number = random_id(); + results.push(world); } - let mut pool = db.into_inner(); - let mut tx = pool - .begin() - .await - .ok() - .expect("could not start transaction"); + let query_string = { + let mut query = String::new(); + + query.push_str("UPDATE World SET randomnumber = CASE id "); + + let mut pl = 1; + + for _ in 1..=q { + let _ = write!(query, "when ${pl} then ${} ", pl + 1); + pl += 2; + } + + query.push_str("ELSE randomnumber END WHERE id IN ("); + + for _ in 1..=q { + let _ = write!(query, "${pl},"); + pl += 1; + } + + query.pop(); + query.push(')'); + + query + }; + + let mut query = sqlx::query(&query_string); for w in &results { - sqlx::query("UPDATE World SET randomnumber = $1 WHERE id = $2") - .bind(w.random_number) - .bind(w.id) - .execute(&mut tx) - .await - .ok() - .expect("Could not update World"); + query = query.bind(w.id).bind(w.random_number); } - tx.commit().await.ok().expect("could not update worlds"); + for w in &results { + query = query.bind(w.id); + } + + query.execute(db.as_mut()) + .await + .expect("Could not update worlds"); Json(results) } #[launch] -pub fn launch() -> Rocket { - if cfg!(not(test)) { - dotenv().ok(); - } - - let config = Config { - address: IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), - port: 8000, - keep_alive: 0, - log_level: LogLevel::Off, - ..Default::default() - }; - - let database_url = env::var("ROCKET_BENCHMARK_DATABASE_URL") - .ok() - .expect("ROCKET_BENCHMARK_DATABASE_URL environment variable was not set"); - - let figment = Figment::from(config).merge(( - "databases.hello_world", - rocket_db_pools::Config { - url: database_url, - min_connections: None, - max_connections: 100, - connect_timeout: 3, - idle_timeout: None, - }, - )); - - rocket::custom(figment) +pub fn launch() -> _ { + rocket::build() .mount( "/", routes![ @@ -197,4 +159,5 @@ pub fn launch() -> Rocket { ], ) .attach(HelloWorld::init()) + .attach(Template::fairing()) } diff --git a/frameworks/Rust/rocket/src/models.rs b/frameworks/Rust/rocket/src/models.rs index 2e9f5b3f3bf..9f4184985ba 100644 --- a/frameworks/Rust/rocket/src/models.rs +++ b/frameworks/Rust/rocket/src/models.rs @@ -1,13 +1,12 @@ use rocket::serde::{Deserialize, Serialize}; -use sqlx::FromRow; -use std::borrow::Cow; +use rocket_db_pools::sqlx::FromRow; #[derive(Serialize)] +#[serde(crate = "rocket::serde")] pub struct Message { - pub message: Cow<'static, str>, + pub message: &'static str, } -#[allow(non_snake_case)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)] #[serde(crate = "rocket::serde")] pub struct Fortune { @@ -15,7 +14,6 @@ pub struct Fortune { pub message: String, } -#[allow(non_snake_case)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)] #[serde(crate = "rocket::serde")] pub struct World { From 8678e0b9af767e03c6a893ff5c7bfcd1a283a363 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 17 Apr 2024 23:45:19 +0800 Subject: [PATCH 0480/1766] Remove files --- .../common/autorestfulpaths.hpp | 28 - .../paozhu_benchmark/common/cost_define.h | 9 - .../paozhu_benchmark/common/httphook.cpp | 39 - .../common/json_reflect_headers.h | 32 - .../common/websockets_method_reg.hpp | 19 - .../libs/types/techempower_json.h | 15 - .../types/techempower_json_jsonreflect.cpp | 290 -- .../orm/_rawsqlfile/default_Fortune.sql | 5 - .../orm/_rawsqlfile/default_World.sql | 5 - .../orm/include/fortunebase.h | 2556 ----------------- .../paozhu_benchmark/orm/include/worldbase.h | 2370 --------------- .../C++/paozhu/paozhu_benchmark/orm/orm.h | 4 - .../paozhu_benchmark/test/testbenchmark.cpp | 126 - 13 files changed, 5498 deletions(-) delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp delete mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql delete mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql delete mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h delete mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h delete mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h delete mode 100755 frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp deleted file mode 100755 index d7a1d639822..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp +++ /dev/null @@ -1,28 +0,0 @@ - -#ifndef __HTTP_AUTO_REG_CONTROL_HTTPRESTFUL_HPP -#define __HTTP_AUTO_REG_CONTROL_HTTPRESTFUL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -#pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "httppeer.h" - - - -namespace http -{ - void _initauto_control_httprestful_paths(std::map> &restfulmethod) - { - - - if(restfulmethod.size()) - {} - - - } -} - -#endif - - \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h deleted file mode 100755 index 47fb182f0e0..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#ifndef _CONST_DEFINE_FUNC_H -#define _CONST_DEFINE_FUNC_H - -#define CONST_MONEY_PART 1000000 -#define CONST_HTTP_HEADER_BODY_SIZE 16384 -#define CONST_PHP_BODY_POST_SIZE 16777216 - -#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp deleted file mode 100755 index 3440c23f84b..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "httppeer.h" -namespace http -{ -std::map _block_ip_tables; -std::map _block_host_tables; -bool check_blockip(const std::string &client_ip) -{ - if (client_ip.size() > 0) - { - return false; - } - return false; -} -bool hook_host_http1(std::shared_ptr peer) -{ - if (peer->host.size() > 0) - { - return false; - } - return false; -} -bool hook_host_http2(std::shared_ptr peer) -{ - if (peer->host.size() > 0) - { - return false; - } - return false; -} -}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h deleted file mode 100755 index 176500bf383..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include -#include -#include -#include - -#include "types/techempower_json.h" -#include "unicode.h" - -template -std::string json_encode([[maybe_unused]] const JSON_REF_OBJ_TEMP &json_reflectobj) { return ""; } - -template -std::string json_encode([[maybe_unused]] const std::vector &json_reflectobj) { return ""; } - -template -unsigned int json_decode([[maybe_unused]] JSON_REF_OBJ_TEMP &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } - -template -unsigned int json_decode([[maybe_unused]] std::vector &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } - -namespace http -{ - -std::string json_encode(const techempower_outjson_t &json_reflectobj); - -std::string json_encode(const std::vector &json_reflectobj); - -unsigned int json_decode(techempower_outjson_t &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); - -unsigned int json_decode(std::vector &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); -}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp deleted file mode 100755 index b8e9c718ea9..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include -#include "httppeer.h" -#include "websockets.h" -#include "mywebsockets.hpp" -#include "websockets_callback.h" -namespace http -{ -void _initwebsocketmethodregto(WEBSOCKET_REG &methodcallback) -{ - - methodcallback.emplace("wstest", [](std::weak_ptr p) -> std::shared_ptr - { return http::mywebsockets::create(p); }); - // methodcallback.emplace("looptest",[](std::weak_ptr p)->std::shared_ptr{ - // return http::loopwebsockets::create(p); - // }); -} - -}// namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h deleted file mode 100755 index 364c06bb2cf..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef LIBS_TYPES_TECHEMPOWER_TYPE_H -#define LIBS_TYPES_TECHEMPOWER_TYPE_H -#include -#include - -namespace http -{ -//@reflect json to_json from_json -struct techempower_outjson_t -{ - std::string message; -}; - -}// namespace http -#endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp deleted file mode 100755 index b5088efcdf9..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp +++ /dev/null @@ -1,290 +0,0 @@ -#include -#include -#include -#include -#include "types/techempower_json.h" -#include "json_reflect_headers.h" -#include "unicode.h" -#include "func.h" - -namespace http -{ - - -std::string json_encode(const techempower_outjson_t &json_reflectobj) - { - - std::stringstream _stream; - _stream << "{"; - _stream << "\"message\":\"" << http::utf8_to_jsonstring(json_reflectobj.message)<< "\""; - - _stream << "}"; - - return _stream.str(); - - } - - -std::string json_encode(const std::vector &json_reflectobj) - { - std::stringstream _stream; - _stream << "["; - - for(unsigned int i=0;i0) - { - _stream <<","; - } - _stream < - //递归代码 - - _offset++; - for ( ; _offset < _json_data.size(); _offset++) - { - if (_json_data[_offset] == '}') - { - //offset++; - break; - } - if (_json_data[_offset] == '"') - { - _offset++; - for ( ; _offset < _json_data.size(); _offset++) - { - if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) - { - break; - } - } - } - } - - - if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) - { - _offset-=1; - } - //直接下一个,不用处理键值 - continue; - } - else if(_json_data[_offset]=='[') - { //表示有数组 - ////////////////////////////////////////////////////////////////////// - //begin level1 [] - //vector vector> vector> - //如果是非内置类型 直接使用json_decode<> - - //递归代码 - - - _offset++; - for ( ; _offset < _json_data.size(); _offset++) - { - if (_json_data[_offset] == ']') - { - //offset++; - break; - } - if (_json_data[_offset] == '"') - { - _offset++; - for ( ; _offset < _json_data.size(); _offset++) - { - if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) - { - break; - } - } - } - } - - //直接下一个,不用处理键值 - if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) - { - _offset-=1; - } - continue; - //end level1[] - //////////////////////////////////////////////////////////////////// - } - else if(_json_data[_offset]==0x22) - { - //如果键值也是字符串 - temp_offset=_offset; - _json_value_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset); - _offset=temp_offset; - if(_json_data[_offset]==0x22) - { - if((_offset+1)<_json_data.size()) - { - if(_json_data[_offset+1]!=']'&&_json_data[_offset+1]!='}') - { - _offset+=1; - } - } - } - } - else - { - //表示是数字 bool NULL - for(;_offset<_json_data.size();_offset++) - { - //结束条件 - if(_json_data[_offset]==','||_json_data[_offset]==']'||_json_data[_offset]=='}'||_json_data[_offset]==0x20||_json_data[_offset]==0x0A||_json_data[_offset]==0x0D||_json_data[_offset]=='\t') - { - break; - } - _json_value_name.push_back(_json_data[_offset]); - } - //让前面循环退出或返回 - if(_offset < _json_data.size() && _json_data[_offset]=='}') - { - _offset-=1; - } - } - //////////////////////////////////////////////////////// - // level1 - //处理对象赋值 - if (http::str_casecmp(_json_key_name, "message")) - { - - json_reflectobj.message=_json_value_name; - } - - //////////////////////////////////////////////////////// - //继续循环下一个键值 - continue; - } - } - } - return _offset; - } - -unsigned int json_decode(std::vector &json_reflectobj,const std::string &_json_data,unsigned int _offset) - { - bool _isarray=false; - for(;_offset<_json_data.size();_offset++) - { - if(_json_data[_offset]=='{') - { - break; - } - if(_json_data[_offset]=='[') - { - _isarray=true; - break; - } - } - - if(_isarray) - { - if(_json_data[_offset]=='[') - { - _offset+=1; - } - for(;_offset<_json_data.size();_offset++) - { - _offset=http::json_string_trim(_json_data,_offset); - //直接返回,这样可以防插入空的对象 - if(_json_data[_offset]==0x5D) - { - return _offset; - }else if(_json_data[_offset]=='{') - { - techempower_outjson_t temp; - _offset=json_decode(temp,_json_data,_offset); - json_reflectobj.push_back(temp); - } - - } - - } - else - { - techempower_outjson_t temp; - _offset=json_decode(temp,_json_data,_offset); - json_reflectobj.push_back(temp); - - } - - return _offset; - } - -} diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql b/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql deleted file mode 100644 index ea350640341..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_Fortune.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TABLE `fortune` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `message` varchar(2048) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql b/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql deleted file mode 100644 index d454446535d..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/_rawsqlfile/default_World.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TABLE `world` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `randomNumber` int NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h deleted file mode 100644 index 390c6cb8f46..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ /dev/null @@ -1,2556 +0,0 @@ -#ifndef ORM_DEFAULT_FORTUNEBASEMATA_H -#define ORM_DEFAULT_FORTUNEBASEMATA_H -/* -*This file is auto create from cli -*本文件为自动生成 Sun, 21 Jan 2024 08:50:49 GMT -***/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mysql.h" -namespace orm { - - -struct fortunebase -{ - struct meta{ - unsigned int id= 0; // - std::string message=""; // - } data; - std::vector record; -std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . -std::vector _keypos{0x00}; -MYSQL_ROW _row; -std::vector::iterator begin(){ return record.begin(); } -std::vector::iterator end(){ return record.end(); } -std::vector::const_iterator begin() const{ return record.begin(); } -std::vector::const_iterator end() const{ return record.end(); } -const std::array colnames={"id","message"}; -const std::array colnamestype= {3,253}; -std::string tablename="fortune"; -std::string modelname="Fortune"; - - unsigned char findcolpos(const std::string &coln){ - if(coln.size()==0) - { - return 255; - } - unsigned char bi=coln[0]; - - - if(bi<91&&bi>64){ - bi+=32; - } - switch(coln[0]){ - - - case 'i': - return 0; -break; -case 'm': - return 1; -break; - - } - return 255; - } - - int size(){ return record.size(); } - - std::string getPKname(){ - return "id"; -} - - void record_reset() - { - record.clear(); - } - void data_reset(){ - fortunebase::meta metatemp; - data = metatemp; - } - - std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ - std::string temp; - - return temp; - } - void _setColnamevalue() - { - for(unsigned char i=0;i<_keypos.size();i++) - { - switch(_keypos[i]){ - case 0: - try{ - data.id=std::stoul(_row[i]); - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.message.append((_row[i]==NULL?"":_row[i])); - }catch (...) { - data.message.clear(); - } - break; - default: - { } - - - } - - if(i>210){ - break; - } - } - } - void _addnewrowvalue(){ - fortunebase::meta metatemp; - - for(unsigned char i=0;i<_keypos.size();i++){ - - switch(_keypos[i]){ - - case 0: - try{ - metatemp.id=std::stoul(_row[i]); - }catch (...) { - metatemp.id=0; - } - break; - case 1: - try{ - metatemp.message.append((_row[i]==NULL?"":_row[i])); - }catch (...) { - metatemp.message.clear(); - } - break; - default: - { } - - - } - if(i>210){ - break; - } - } - record.emplace_back(std::move(metatemp)); - } - - inline std::string stringaddslash(std::string &content){ - std::string temp; - for(unsigned int i=0;i0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(data.id==0){ -tempsql<<"null"; - }else{ - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(insert_data.id==0){ -tempsql<<"null"; - }else{ - tempsql< &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES "; - - for(unsigned int i=0;i0) - { - tempsql<<","; - } - tempsql<<"("; - - - if(insert_data[i].id==0){ - tempsql<<"null"; - }else{ - tempsql< keypos; - for(;jj0){ - unsigned char bpos_i=findcolpos(keyname); - #ifdef DEBUG - if (bpos_i == 254) - { - std::cout << "\033[1m\033[31m-----------\n" - << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" - << std::endl; - } -#endif - keypos.emplace_back(bpos_i); - keyname.clear(); - } - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"`id`=0"; - }else{ - tempsql<<"`id`="<0){ tempsql<<","; } -tempsql<<"`message`='"< data_toarray(std::string fileld=""){ - std::vector temparray; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj data_tomap(std::string fileld=""){ - std::map tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -tempsql<<"\"message\":\""< list_content; - for(;json_offset0) - { - data=metatemp; - } - if(json_offset>=json_content.size()) - { - break; - } - for(;json_offset=json_content.size()) - { - break; - } - json_value_name.clear(); - if(json_content[json_offset]==0x22) - { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - } - else - { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') - { - for(;json_offset1) - { - data=record[0]; - } - } - else - { - if(json_content[json_offset]=='{') - { - json_offset+=1; - std::string json_key_name,json_value_name; - - - for(;json_offset=json_content.size()) - { - break; - } - json_value_name.clear(); - if(json_content[json_offset]==0x22) - { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - } - else - { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') - { - for(;json_offset keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - - for(jj=0;jj0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -tempsql<<"\"message\":\""< func,std::string fileld=""){ - std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - tempsql<0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -tempsql<<"\"message\":\""< getRecord(){ - return record; -} - - - template::value,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - if(key_name=="message") - { - return data.message; - } - return nullptr; - } - - - template,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - if(key_name=="id") - { - return data.id; - } - return nullptr; - } - - - template,bool>::type = true > - T& ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - case 0: - a.emplace_back(iter.id); - break; - - } - } - - return a; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - return a; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - - case 0: - return data.id; - break; - } - return 0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] fortunebase::meta & iter,[[maybe_unused]] std::string keyname) - { - - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - case 0: - return iter.id; - break; - - } - - return 0; - } - - template,bool>::type = true > - T getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { - - - } - - - return 0.0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - - } - - - - return 0.0; - } - - template::value,bool>::type = true > - std::string getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { - - case 1: - return data.message; - break; - - } - return ""; - } - - template::value,bool>::type = true > - std::string getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { - - case 1: - return iter.message; - break; - - } - - - - return ""; - } - - template::value,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - a.emplace_back(iter.message); - break; - } - } - - return a; - } - - std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) - { - std::ostringstream a; - - unsigned char kpos; - kpos=findcolpos(keyname); - int j=0; - if(isyinhao&&record.size()>0) - { - a<<'"'; - } - for(auto &iter:record) - { - if(j>0) - { - if(isyinhao) - { - a<<"\",\""; - }else{ - a<<','; - } - } - switch(kpos) - { - - case 0: - a<0){ - a<<'"'; - } - - return a.str(); - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp,vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 1: - vtemp=iter.message; - break; - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - - return a; - } - - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - std::string vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 1: - vtemp=iter.message; - break; - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - a.emplace(iter.id,iter); - break; - - } - } - - return a; - } - - template::value,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - a.emplace(iter.message,iter); - break; - - } - //a.emplace(ktemp,iter); - } - - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - - } - - a.emplace_back(ktemp,vtemp); - } - - - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - - } - - a.emplace_back(ktemp,vtemp); - } - - - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 1: - vtemp=iter.message; - break; - - } - - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ -case 1: - vtemp=iter.message; - break; - - } - - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - a.emplace_back(iter.id,iter); - break; - - } - } - - return a; - } - template::value,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - a.emplace_back(iter.message,iter); - break; - - } - } - - - return a; - } - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } - - switch(dpos){ - - } - } - - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } - - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } - - switch(dpos){ - - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - - } - } - - return a; - } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } - - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } - - switch(dpos){ - - } - } - - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } - - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } - - switch(dpos){ - - } - } - - - return a; - } - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } - - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 1: - a[ktemp].emplace_back(iter.message); - break; - - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - - } - } - - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; - - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 1: - a[ktemp].emplace_back(iter.message); - break; - - } - } - - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; - - } - } - - return a; - } - - template,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - a[iter.id].emplace_back(iter); - break; - - } - } - - return a; - } - - template::value,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - a[iter.message].emplace_back(iter); - break; - - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 1: - a[ktemp][iter.message].emplace_back(iter); - break; - - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - - } - } - - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 1: - a[ktemp][iter.message].emplace_back(iter); - break; - - } - } - - return a; - } - - }; - - -} -#endif - \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h deleted file mode 100644 index 312571481d7..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ /dev/null @@ -1,2370 +0,0 @@ -#ifndef ORM_DEFAULT_WORLDBASEMATA_H -#define ORM_DEFAULT_WORLDBASEMATA_H -/* -*This file is auto create from cli -*本文件为自动生成 Sun, 21 Jan 2024 08:50:49 GMT -***/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mysql.h" -namespace orm { - - -struct worldbase -{ - struct meta{ - unsigned int id= 0; // - int randomnumber= 0; // - } data; - std::vector record; -std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . -std::vector _keypos{0x00}; -MYSQL_ROW _row; -std::vector::iterator begin(){ return record.begin(); } -std::vector::iterator end(){ return record.end(); } -std::vector::const_iterator begin() const{ return record.begin(); } -std::vector::const_iterator end() const{ return record.end(); } -const std::array colnames={"id","randomnumber"}; -const std::array colnamestype= {3,3}; -std::string tablename="world"; -std::string modelname="World"; - - unsigned char findcolpos(const std::string &coln){ - if(coln.size()==0) - { - return 255; - } - unsigned char bi=coln[0]; - - - if(bi<91&&bi>64){ - bi+=32; - } - switch(coln[0]){ - - - case 'i': - return 0; -break; -case 'r': - return 1; -break; - - } - return 255; - } - - int size(){ return record.size(); } - - std::string getPKname(){ - return "id"; -} - - void record_reset() - { - record.clear(); - } - void data_reset(){ - worldbase::meta metatemp; - data = metatemp; - } - - std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ - std::string temp; - - return temp; - } - void _setColnamevalue() - { - for(unsigned char i=0;i<_keypos.size();i++) - { - switch(_keypos[i]){ - case 0: - try{ - data.id=std::stoul(_row[i]); - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.randomnumber=std::stoi(_row[i]); - }catch (...) { - data.randomnumber=0; - } - break; - default: - { } - - - } - - if(i>210){ - break; - } - } - } - void _addnewrowvalue(){ - worldbase::meta metatemp; - - for(unsigned char i=0;i<_keypos.size();i++){ - - switch(_keypos[i]){ - - case 0: - try{ - metatemp.id=std::stoul(_row[i]); - }catch (...) { - metatemp.id=0; - } - break; - case 1: - try{ - metatemp.randomnumber=std::stoi(_row[i]); - }catch (...) { - metatemp.randomnumber=0; - } - break; - default: - { } - - - } - if(i>210){ - break; - } - } - record.emplace_back(std::move(metatemp)); - } - - inline std::string stringaddslash(std::string &content){ - std::string temp; - for(unsigned int i=0;i0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(data.id==0){ -tempsql<<"null"; - }else{ - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(insert_data.id==0){ -tempsql<<"null"; - }else{ - tempsql< &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES "; - - for(unsigned int i=0;i0) - { - tempsql<<","; - } - tempsql<<"("; - - - if(insert_data[i].id==0){ - tempsql<<"null"; - }else{ - tempsql<0){ - unsigned char bpos_i=findcolpos(keyname); - #ifdef DEBUG - if (bpos_i == 254) - { - std::cout << "\033[1m\033[31m-----------\n" - << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" - << std::endl; - } -#endif - keypos.emplace_back(bpos_i); - keyname.clear(); - } - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"`id`=0"; - }else{ - tempsql<<"`id`="<0){ tempsql<<","; } -if(data.randomnumber==0){ - tempsql<<"`randomnumber`=0"; - }else{ - tempsql<<"`randomnumber`="< data_toarray(std::string fileld=""){ - std::vector temparray; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj data_tomap(std::string fileld=""){ - std::map tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -if(data.randomnumber==0){ - tempsql<<"\"randomnumber\":0"; - }else{ - tempsql<<"\"randomnumber\":"< list_content; - for(;json_offset0) - { - data=metatemp; - } - if(json_offset>=json_content.size()) - { - break; - } - for(;json_offset=json_content.size()) - { - break; - } - json_value_name.clear(); - if(json_content[json_offset]==0x22) - { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - } - else - { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') - { - for(;json_offset1) - { - data=record[0]; - } - } - else - { - if(json_content[json_offset]=='{') - { - json_offset+=1; - std::string json_key_name,json_value_name; - - - for(;json_offset=json_content.size()) - { - break; - } - json_value_name.clear(); - if(json_content[json_offset]==0x22) - { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - } - else - { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') - { - for(;json_offset keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - - for(jj=0;jj0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -if(record[n].randomnumber==0){ - tempsql<<"\"randomnumber\":0"; - }else{ - tempsql<<"\"randomnumber\":"< func,std::string fileld=""){ - std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - tempsql<0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -if(record[n].randomnumber==0){ - tempsql<<"\"randomnumber\":0"; - }else{ - tempsql<<"\"randomnumber\":"< getRecord(){ - return record; -} - - - template::value,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - - template,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - if(key_name=="id") - { - return data.id; - } - if(key_name=="randomnumber") - { - return data.randomnumber; - } - return nullptr; - } - - - template,bool>::type = true > - T& ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - case 0: - a.emplace_back(iter.id); - break; - case 1: - a.emplace_back(iter.randomnumber); - break; - - } - } - - return a; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - return a; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - - case 0: - return data.id; - break; - case 1: - return data.randomnumber; - break; - } - return 0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] worldbase::meta & iter,[[maybe_unused]] std::string keyname) - { - - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - case 0: - return iter.id; - break; - case 1: - return iter.randomnumber; - break; - - } - - return 0; - } - - template,bool>::type = true > - T getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { - - - } - - - return 0.0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - - } - - - - return 0.0; - } - - template::value,bool>::type = true > - std::string getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { - - - } - return ""; - } - - template::value,bool>::type = true > - std::string getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { - - - } - - - - return ""; - } - - template::value,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - - return a; - } - - std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) - { - std::ostringstream a; - - unsigned char kpos; - kpos=findcolpos(keyname); - int j=0; - if(isyinhao&&record.size()>0) - { - a<<'"'; - } - for(auto &iter:record) - { - if(j>0) - { - if(isyinhao) - { - a<<"\",\""; - }else{ - a<<','; - } - } - switch(kpos) - { - - case 0: - a<0){ - a<<'"'; - } - - return a.str(); - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - return a; - } - - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; -case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - std::string vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - a.emplace(iter.id,iter); - break; - case 1: - a.emplace(iter.randomnumber,iter); - break; - - } - } - - return a; - } - - template::value,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - - } - - a.emplace_back(ktemp,vtemp); - } - - - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - - } - - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - - switch(kpos) - { - - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - return a; - } - - template,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - a.emplace_back(iter.id,iter); - break; -case 1: - a.emplace_back(iter.randomnumber,iter); - break; - - } - } - - return a; - } - template::value,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - - return a; - } - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - - } - } - - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - } - - switch(dpos){ - - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - - } - } - - return a; - } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - } - - switch(dpos){ - - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - - } - } - - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - return a; - } - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - } - - switch(vpos){ - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - } - - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; - case 1: - a[ktemp].emplace_back(iter.randomnumber); - break; - - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - - } - } - - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; - case 1: - a[ktemp].emplace_back(iter.randomnumber); - break; - - } - } - - return a; - } - - template,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - a[iter.id].emplace_back(iter); - break; - case 1: - a[iter.randomnumber].emplace_back(iter); - break; - - } - } - - return a; - } - - template::value,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - } - - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - case 1: - a[ktemp][iter.randomnumber].emplace_back(iter); - break; - - } - } - - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - case 1: - a[ktemp][iter.randomnumber].emplace_back(iter); - break; - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - - } - } - - return a; - } - - }; - - -} -#endif - \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h deleted file mode 100644 index 816b9ae4dc9..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h +++ /dev/null @@ -1,4 +0,0 @@ -/*build this file time Tue, 20 Dec 2022 11:40:56 GMT*/ - -#include "Fortune.h" -#include "World.h" diff --git a/frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp b/frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp deleted file mode 100755 index 194c06e772a..00000000000 --- a/frameworks/C++/paozhu/paozhu_benchmark/test/testbenchmark.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include -#include -#include -#include -#include -#include "server.h" - -static sigjmp_buf env_startacs; -static void sig_child(int signo); -namespace fs = std::filesystem; -int main(int argc, char *argv[]) -{ - std::string argv_str; - if (argc > 1) - { - // server.conf filepath or confpath - argv_str.append(argv[1]); - fs::path conf_path = argv_str; - if (fs::is_regular_file(conf_path)) - { - } - else - { - if (argv_str.back() == '/') - { - argv_str = argv_str + "server.conf"; - } - else - { - argv_str = argv_str + "/server.conf"; - } - conf_path = argv_str; - if (fs::is_regular_file(conf_path)) - { - } - else - { - std::cout << "Not found server.conf file."; - return 0; - } - } - } - else - { - - fs::path conf_path = fs::current_path(); - argv_str = conf_path.string() + "/conf/server.conf"; - conf_path = argv_str; - if (fs::is_regular_file(conf_path)) - { - } - else - { - argv_str = "/usr/local/etc/paozhu/server.conf"; - conf_path = argv_str; - if (fs::is_regular_file(conf_path)) - { - } - else - { - std::cout << "Not found server.conf file. Please copy conf Directory rename to /usr/local/etc/paozhu\n"; - return 0; - } - } - } - - pid_t pid;//, subpid = 0; - signal(SIGCHLD, sig_child); - if (sigsetjmp(env_startacs, 1) == 0)// 设置记号 - { - printf("setjmp ok.....\n"); - } - else - { - printf("longjmp ok.....\n"); - } - - pid = fork(); - printf("fork id %d \n", pid); - if (pid < 0) - { - perror("fork error:"); - exit(1); - } - else if (pid == 0) - { - - try - { - http::httpserver &httpmy = http::get_server_app(); - httpmy.run(argv_str); - } - catch (std::exception &e) - { - std::printf("Exception: %s\n", e.what()); - } - exit(0); - } - else - { - - while (1) - { - std::this_thread::sleep_for(std::chrono::seconds(10)); - //Future features are added here - } - return 0; - } -} -static void sig_child(int signo) -{ - /*pid_t */ int pid; - int stat; - // 处理僵尸进程 - - switch (signo) - { - case SIGCHLD: - - pid = wait(&stat); - printf("SIGCHLD...farter id %d..%d\n", getpid(), pid); - siglongjmp(env_startacs, 1);// jump setjmp begin - break; - } - exit(0); -} From ae4234f98a4a1cf33b96a77f63659d260114d502 Mon Sep 17 00:00:00 2001 From: Nate Date: Wed, 17 Apr 2024 09:55:51 -0700 Subject: [PATCH 0481/1766] Add --reverse-order option and switch order after each run on citrine (#8860) --- toolset/benchmark/benchmarker.py | 3 ++- toolset/continuous/tfb-shutdown.sh | 6 ++++++ toolset/continuous/tfb-startup.sh | 1 + toolset/run-tests.py | 7 +++++++ toolset/utils/benchmark_config.py | 1 + 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/toolset/benchmark/benchmarker.py b/toolset/benchmark/benchmarker.py index 3d6f1533ced..84e6be29912 100644 --- a/toolset/benchmark/benchmarker.py +++ b/toolset/benchmark/benchmarker.py @@ -29,7 +29,8 @@ def __init__(self, config): # a list of all tests for this run self.tests = self.metadata.tests_to_run() - + if self.config.reverse_order: + self.tests.reverse() self.results = Results(self) self.docker_helper = DockerHelper(self) diff --git a/toolset/continuous/tfb-shutdown.sh b/toolset/continuous/tfb-shutdown.sh index d257182b623..db96b07941b 100644 --- a/toolset/continuous/tfb-shutdown.sh +++ b/toolset/continuous/tfb-shutdown.sh @@ -30,4 +30,10 @@ ssh techempower@$TFB_DATABASE_HOST "$(typeset -f docker_clean); docker_clean" echo "running docker_clean on client host" ssh techempower@$TFB_CLIENT_HOST "$(typeset -f docker_clean); docker_clean" +if [ -z "$TFB_RUN_ORDER" ]; then + export TFB_RUN_ORDER="reverse" +else + unset TFB_RUN_ORDER +fi + echo "done with tfb-shutdown script" diff --git a/toolset/continuous/tfb-startup.sh b/toolset/continuous/tfb-startup.sh index 6a92e506f97..b0be7622bf5 100644 --- a/toolset/continuous/tfb-startup.sh +++ b/toolset/continuous/tfb-startup.sh @@ -38,6 +38,7 @@ docker run \ --results-name "$TFB_RUN_NAME" \ --results-environment "$TFB_ENVIRONMENT" \ --results-upload-uri "$TFB_UPLOAD_URI" \ + $(if [ "$TFB_RUN_ORDER" = "reverse" ]; then echo "--reverse-order"; fi) \ --quiet echo "zipping the results" diff --git a/toolset/run-tests.py b/toolset/run-tests.py index 153a2b029bd..413ba37379c 100644 --- a/toolset/run-tests.py +++ b/toolset/run-tests.py @@ -84,6 +84,13 @@ def main(argv=None): help= 'Only print a limited set of messages to stdout, keep the bulk of messages in log files only' ) + parser.add_argument( + '--reverse-order', + action='store_true', + default=False, + help= + 'Run the tests in reverse order, starting with the last test in the list' + ) parser.add_argument( '--results-name', help='Gives a name to this set of results, formatted as a date', diff --git a/toolset/utils/benchmark_config.py b/toolset/utils/benchmark_config.py index a64ca87af4f..0a580586420 100755 --- a/toolset/utils/benchmark_config.py +++ b/toolset/utils/benchmark_config.py @@ -25,6 +25,7 @@ def __init__(self, args): self.duration = args.duration self.exclude = args.exclude self.quiet = args.quiet + self.reverse_order = args.reverse_order self.server_host = args.server_host self.database_host = args.database_host self.client_host = args.client_host From 0cf80494265f15ee90eaa87aa122e755eaeca27b Mon Sep 17 00:00:00 2001 From: hzq Date: Thu, 18 Apr 2024 14:17:05 +0800 Subject: [PATCH 0482/1766] Fix files --- .../common/json_reflect_headers.h | 32 ++ .../paozhu/paozhu_benchmark/conf/server.conf | 21 +- .../libs/types/techempower_json.h | 15 + .../types/techempower_json_jsonreflect.cpp | 290 ++++++++++++++++++ 4 files changed, 341 insertions(+), 17 deletions(-) create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h new file mode 100644 index 00000000000..176500bf383 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h @@ -0,0 +1,32 @@ +#pragma once +#include +#include +#include +#include + +#include "types/techempower_json.h" +#include "unicode.h" + +template +std::string json_encode([[maybe_unused]] const JSON_REF_OBJ_TEMP &json_reflectobj) { return ""; } + +template +std::string json_encode([[maybe_unused]] const std::vector &json_reflectobj) { return ""; } + +template +unsigned int json_decode([[maybe_unused]] JSON_REF_OBJ_TEMP &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } + +template +unsigned int json_decode([[maybe_unused]] std::vector &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } + +namespace http +{ + +std::string json_encode(const techempower_outjson_t &json_reflectobj); + +std::string json_encode(const std::vector &json_reflectobj); + +unsigned int json_decode(techempower_outjson_t &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); + +unsigned int json_decode(std::vector &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); +}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf index d15847751ef..e76a18093e9 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf @@ -8,9 +8,9 @@ cothreadnum=8 ;Coroutines run on thread num http2_enable=0 debug_enable=1 deamon_enable=0 -mainhost=www.869869.com -certificate_chain_file=www.869869.com.pem -private_key_file=www.869869.com.key +mainhost=localhost +certificate_chain_file=localhost.pem +private_key_file=localhost.key tmp_dh_file=dh4096.pem reboot_password=e10adc3949ba59abbe56e057f20f883e ;md5(md5("123456")+"rand_char"+md5("123456")) session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve @@ -38,18 +38,5 @@ method_pre= method_after= show_visitinfo=0 upload_max_size=16777216 -[www.869869.com] -wwwpath=/root/benchmark/www/default -http2_enable=1 -;rewrite_404=1 -;rewrite_404_action=index.html|psy/index.html|exam/index.html -;controlsopath=/root/benchmark/docs/controller -static_pre=downloadfileauth|upload -method_pre= ;api/dev/hostcors -method_after= -isuse_php=0 -rewrite_php=/root/benchmark/www/thinkphp/public|index.php -fastcgi_host=127.0.0.1 -fastcgi_port=9000 -upload_max_size=16777216 + diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h new file mode 100644 index 00000000000..364c06bb2cf --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h @@ -0,0 +1,15 @@ +#ifndef LIBS_TYPES_TECHEMPOWER_TYPE_H +#define LIBS_TYPES_TECHEMPOWER_TYPE_H +#include +#include + +namespace http +{ +//@reflect json to_json from_json +struct techempower_outjson_t +{ + std::string message; +}; + +}// namespace http +#endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp new file mode 100644 index 00000000000..b5088efcdf9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp @@ -0,0 +1,290 @@ +#include +#include +#include +#include +#include "types/techempower_json.h" +#include "json_reflect_headers.h" +#include "unicode.h" +#include "func.h" + +namespace http +{ + + +std::string json_encode(const techempower_outjson_t &json_reflectobj) + { + + std::stringstream _stream; + _stream << "{"; + _stream << "\"message\":\"" << http::utf8_to_jsonstring(json_reflectobj.message)<< "\""; + + _stream << "}"; + + return _stream.str(); + + } + + +std::string json_encode(const std::vector &json_reflectobj) + { + std::stringstream _stream; + _stream << "["; + + for(unsigned int i=0;i0) + { + _stream <<","; + } + _stream < + //递归代码 + + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '}') + { + //offset++; + break; + } + if (_json_data[_offset] == '"') + { + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) + { + break; + } + } + } + } + + + if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) + { + _offset-=1; + } + //直接下一个,不用处理键值 + continue; + } + else if(_json_data[_offset]=='[') + { //表示有数组 + ////////////////////////////////////////////////////////////////////// + //begin level1 [] + //vector vector> vector> + //如果是非内置类型 直接使用json_decode<> + + //递归代码 + + + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == ']') + { + //offset++; + break; + } + if (_json_data[_offset] == '"') + { + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) + { + break; + } + } + } + } + + //直接下一个,不用处理键值 + if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) + { + _offset-=1; + } + continue; + //end level1[] + //////////////////////////////////////////////////////////////////// + } + else if(_json_data[_offset]==0x22) + { + //如果键值也是字符串 + temp_offset=_offset; + _json_value_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset); + _offset=temp_offset; + if(_json_data[_offset]==0x22) + { + if((_offset+1)<_json_data.size()) + { + if(_json_data[_offset+1]!=']'&&_json_data[_offset+1]!='}') + { + _offset+=1; + } + } + } + } + else + { + //表示是数字 bool NULL + for(;_offset<_json_data.size();_offset++) + { + //结束条件 + if(_json_data[_offset]==','||_json_data[_offset]==']'||_json_data[_offset]=='}'||_json_data[_offset]==0x20||_json_data[_offset]==0x0A||_json_data[_offset]==0x0D||_json_data[_offset]=='\t') + { + break; + } + _json_value_name.push_back(_json_data[_offset]); + } + //让前面循环退出或返回 + if(_offset < _json_data.size() && _json_data[_offset]=='}') + { + _offset-=1; + } + } + //////////////////////////////////////////////////////// + // level1 + //处理对象赋值 + if (http::str_casecmp(_json_key_name, "message")) + { + + json_reflectobj.message=_json_value_name; + } + + //////////////////////////////////////////////////////// + //继续循环下一个键值 + continue; + } + } + } + return _offset; + } + +unsigned int json_decode(std::vector &json_reflectobj,const std::string &_json_data,unsigned int _offset) + { + bool _isarray=false; + for(;_offset<_json_data.size();_offset++) + { + if(_json_data[_offset]=='{') + { + break; + } + if(_json_data[_offset]=='[') + { + _isarray=true; + break; + } + } + + if(_isarray) + { + if(_json_data[_offset]=='[') + { + _offset+=1; + } + for(;_offset<_json_data.size();_offset++) + { + _offset=http::json_string_trim(_json_data,_offset); + //直接返回,这样可以防插入空的对象 + if(_json_data[_offset]==0x5D) + { + return _offset; + }else if(_json_data[_offset]=='{') + { + techempower_outjson_t temp; + _offset=json_decode(temp,_json_data,_offset); + json_reflectobj.push_back(temp); + } + + } + + } + else + { + techempower_outjson_t temp; + _offset=json_decode(temp,_json_data,_offset); + json_reflectobj.push_back(temp); + + } + + return _offset; + } + +} From fda35b9e580946fb81d6a1b2a0f1f00f14ffec6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:47:46 +0000 Subject: [PATCH 0483/1766] Bump aiohttp from 3.9.2 to 3.9.4 in /frameworks/Python/api_hour Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.2 to 3.9.4. - [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.2...v3.9.4) --- 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 b318ab3dbc7..1e962aed9e9 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.9.2 +aiohttp==3.9.4 -e git+https://github.com/Eyepea/aiohttp_jinja2.git@c9675e5c1e1ee7741b30aea8d8fbffcde016c7a0#egg=aiohttp_jinja2-master aiopg==0.7.0 -e git+https://github.com/Eyepea/API-Hour.git@577abbdcbb8cc2810dad46e260b338b15db4d0e3#egg=api_hour-master From 5d2b0c633653430a513497dd6f327cd33f58c117 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:54:43 +0000 Subject: [PATCH 0484/1766] Bump aiohttp from 3.9.2 to 3.9.4 in /frameworks/Python/aiohttp Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.2 to 3.9.4. - [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.2...v3.9.4) --- updated-dependencies: - dependency-name: aiohttp dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 d833896a168..4dc384f0d9d 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.9.2 +aiohttp==3.9.4 asyncpg==0.25.0 cchardet==2.1.7 gunicorn==20.1 From 604d715c6671a6912b067c04aacc740206fc0585 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 12:13:16 +0000 Subject: [PATCH 0485/1766] Bump golang.org/x/net from 0.17.0 to 0.23.0 in /frameworks/Go/echo/src Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net 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 35307bb0fec..63fe7fd1cef 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.17.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/echo/src/go.sum b/frameworks/Go/echo/src/go.sum index c7d3f25fbcf..8732c64400d 100644 --- a/frameworks/Go/echo/src/go.sum +++ b/frameworks/Go/echo/src/go.sum @@ -22,16 +22,16 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 472afa434cb61da1ce5a82f60682382179dd1143 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:14:15 +0000 Subject: [PATCH 0486/1766] Bump golang.org/x/net in /frameworks/Go/goframe/src Bumps [golang.org/x/net](https://github.com/golang/net) from 0.21.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.21.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] --- 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 81cd961b3a6..6a931c78b4c 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.20.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/goframe/src/go.sum b/frameworks/Go/goframe/src/go.sum index 3b2bb947b83..12dd4e52b19 100644 --- a/frameworks/Go/goframe/src/go.sum +++ b/frameworks/Go/goframe/src/go.sum @@ -248,8 +248,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -267,8 +267,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -300,8 +300,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 202d316915b13622f3abb05de026f8b6ccad764c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 19:53:05 +0000 Subject: [PATCH 0487/1766] Bump @hono/node-server in /frameworks/JavaScript/hono Bumps [@hono/node-server](https://github.com/honojs/node-server) from 1.4.1 to 1.10.1. - [Release notes](https://github.com/honojs/node-server/releases) - [Commits](https://github.com/honojs/node-server/compare/v1.4.1...v1.10.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 173cf4dc47e..f5b449c20e4 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.4.1", + "@hono/node-server": "^1.10.1", "hono": "^3.10.4", "postgres": "^3.4.3" } }, "node_modules/@hono/node-server": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.4.1.tgz", - "integrity": "sha512-7jB8iMs6T2FhREs4Ugk+7rzn7d5aC6wEX3FAy67ZafzcQqqBVggcLkFPCMauaFJJyjc+bFvMOdFxJXKYsBM6MQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.10.1.tgz", + "integrity": "sha512-5BKW25JH5PQKPDkTcIgv3yNUPtOAbnnjFFgWvIxxAY/B/ZNeYjjWoAeDmqhIiCgOAJ3Tauuw+0G+VainhuZRYQ==", "engines": { "node": ">=18.14.1" } diff --git a/frameworks/JavaScript/hono/package.json b/frameworks/JavaScript/hono/package.json index 62b18bb58bf..39a6184c2c5 100644 --- a/frameworks/JavaScript/hono/package.json +++ b/frameworks/JavaScript/hono/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "@hono/node-server": "^1.4.1", + "@hono/node-server": "^1.10.1", "hono": "^3.10.4", "postgres": "^3.4.3" }, From 9a5ad0ad9f68ded090b6342feee2fe9bf871158a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 19:57:58 +0000 Subject: [PATCH 0488/1766] Bump rustls from 0.21.10 to 0.21.11 in /frameworks/Rust/rocket Bumps [rustls](https://github.com/rustls/rustls) from 0.21.10 to 0.21.11. - [Release notes](https://github.com/rustls/rustls/releases) - [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md) - [Commits](https://github.com/rustls/rustls/compare/v/0.21.10...v/0.21.11) --- updated-dependencies: - dependency-name: rustls dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/rocket/Cargo.lock | 105 ++---------------------------- 1 file changed, 4 insertions(+), 101 deletions(-) diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index 4d2987091e8..99bf76ca11b 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -336,41 +336,6 @@ dependencies = [ "syn 2.0.50", ] -[[package]] -name = "diesel" -version = "2.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" -dependencies = [ - "bitflags 2.4.2", - "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 2.0.50", -] - -[[package]] -name = "diesel_table_macro_syntax" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" -dependencies = [ - "syn 2.0.50", -] - [[package]] name = "digest" version = "0.10.7" @@ -383,12 +348,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "dotenvy" version = "0.15.7" @@ -1211,7 +1170,7 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", "windows-targets 0.48.5", ] @@ -1356,15 +1315,6 @@ 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.78" @@ -1396,17 +1346,6 @@ 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" @@ -1642,41 +1581,14 @@ dependencies = [ "uncased", ] -[[package]] -name = "rocket_sync_db_pools" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f32721ed79509adac4328e97f817a8f55a47c4b64799f6fd6cc3adb6e42ff" -dependencies = [ - "diesel", - "r2d2", - "rocket", - "rocket_sync_db_pools_codegen", - "serde", - "tokio", - "version_check", -] - -[[package]] -name = "rocket_sync_db_pools_codegen" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc890925dc79370c28eb15c9957677093fdb7e8c44966d189f38cedb995ee68" -dependencies = [ - "devise", - "quote", -] - [[package]] name = "rocket_techempower" -version = "0.4.0" +version = "0.5.0" dependencies = [ - "dotenv", "rand", "rocket", "rocket_db_pools", "rocket_dyn_templates", - "rocket_sync_db_pools", "sqlx", ] @@ -1721,9 +1633,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" dependencies = [ "ring", "rustls-webpki", @@ -1770,15 +1682,6 @@ dependencies = [ "winapi-util", ] -[[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" From 232d60f365d37fa92479f13bba0971bceced15e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:58:46 -0700 Subject: [PATCH 0489/1766] Bump golang.org/x/net in /frameworks/Go/gin/gin-src (#8911) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net 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 46b9a94832b..1ab84a0a5b2 100644 --- a/frameworks/Go/gin/gin-src/go.mod +++ b/frameworks/Go/gin/gin-src/go.mod @@ -26,9 +26,9 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/frameworks/Go/gin/gin-src/go.sum b/frameworks/Go/gin/gin-src/go.sum index 7b727e54dc3..8c28f90b980 100644 --- a/frameworks/Go/gin/gin-src/go.sum +++ b/frameworks/Go/gin/gin-src/go.sum @@ -62,14 +62,14 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= From c9bea6a43734097f0b4ca5a041b74dbad6e08981 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:58:57 -0700 Subject: [PATCH 0490/1766] Bump golang.org/x/net in /frameworks/Go/gin/gin-std (#8912) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net 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 9c0fbb13ce8..06097ea951c 100644 --- a/frameworks/Go/gin/gin-std/go.mod +++ b/frameworks/Go/gin/gin-std/go.mod @@ -27,9 +27,9 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/frameworks/Go/gin/gin-std/go.sum b/frameworks/Go/gin/gin-std/go.sum index 4a4e2132598..0549623560d 100644 --- a/frameworks/Go/gin/gin-std/go.sum +++ b/frameworks/Go/gin/gin-std/go.sum @@ -63,14 +63,14 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= From df8a40bd969c4026dd23eccb160da11916441e38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:59:06 -0700 Subject: [PATCH 0491/1766] Bump golang.org/x/net from 0.17.0 to 0.23.0 in /frameworks/Go/kami/src (#8913) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/kami/src/go.mod | 2 +- frameworks/Go/kami/src/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/kami/src/go.mod b/frameworks/Go/kami/src/go.mod index 70f73076e82..3297e41f3f6 100644 --- a/frameworks/Go/kami/src/go.mod +++ b/frameworks/Go/kami/src/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/go-sql-driver/mysql v1.6.0 github.com/guregu/kami v2.2.1+incompatible - golang.org/x/net v0.17.0 + golang.org/x/net v0.23.0 ) require ( diff --git a/frameworks/Go/kami/src/go.sum b/frameworks/Go/kami/src/go.sum index 90b928c95f5..e49331ae883 100644 --- a/frameworks/Go/kami/src/go.sum +++ b/frameworks/Go/kami/src/go.sum @@ -10,8 +10,8 @@ github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= From b767afecac5543fb3f2135ccf899ef01aac5e160 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:59:21 -0700 Subject: [PATCH 0492/1766] Bump rustls from 0.21.10 to 0.21.11 in /frameworks/Rust/axum (#8920) Bumps [rustls](https://github.com/rustls/rustls) from 0.21.10 to 0.21.11. - [Release notes](https://github.com/rustls/rustls/releases) - [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md) - [Commits](https://github.com/rustls/rustls/compare/v/0.21.10...v/0.21.11) --- updated-dependencies: - dependency-name: rustls 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 46c408fc73e..3d63ad71fb7 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -1793,9 +1793,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" dependencies = [ "log", "ring", From 76a29fbbf377fe4f3ba6e1e6697166ccaa4d3b95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:59:32 -0700 Subject: [PATCH 0493/1766] Bump golang.org/x/net in /frameworks/Go/gin/gin-gorm (#8918) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.21.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.21.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- 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 cb57b57d80a..f2e364dcfef 100644 --- a/frameworks/Go/gin/gin-gorm/go.mod +++ b/frameworks/Go/gin/gin-gorm/go.mod @@ -42,9 +42,9 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.20.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/frameworks/Go/gin/gin-gorm/go.sum b/frameworks/Go/gin/gin-gorm/go.sum index a347b479b9d..dd864315456 100644 --- a/frameworks/Go/gin/gin-gorm/go.sum +++ b/frameworks/Go/gin/gin-gorm/go.sum @@ -194,8 +194,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -205,8 +205,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -223,8 +223,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From db86dadff047b83553f59bc377d5697a0afc1a05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:59:40 -0700 Subject: [PATCH 0494/1766] Bump golang.org/x/net in /frameworks/Go/aah/src/benchmark (#8916) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net 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 99e5799799d..09e57fa883b 100644 --- a/frameworks/Go/aah/src/benchmark/go.mod +++ b/frameworks/Go/aah/src/benchmark/go.mod @@ -22,10 +22,10 @@ require ( github.com/satori/go.uuid v1.2.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/urfave/cli v1.20.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect diff --git a/frameworks/Go/aah/src/benchmark/go.sum b/frameworks/Go/aah/src/benchmark/go.sum index 060b93b6321..b946b8eccff 100644 --- a/frameworks/Go/aah/src/benchmark/go.sum +++ b/frameworks/Go/aah/src/benchmark/go.sum @@ -42,17 +42,17 @@ github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= golang.org/x/crypto v0.0.0-20181012144002-a92615f3c490/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced h1:4oqSq7eft7MdPKBGQK11X9WYUxmj6ZLgGTqYIbY1kyw= golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= From 0d9cafaf117983038975329ec5b75332d1d63075 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:59:50 -0700 Subject: [PATCH 0495/1766] Bump golang.org/x/net in /frameworks/Go/ronykit/src (#8915) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/ronykit/src/go.mod | 4 ++-- frameworks/Go/ronykit/src/go.sum | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Go/ronykit/src/go.mod b/frameworks/Go/ronykit/src/go.mod index 85b07b234d8..068e9493033 100644 --- a/frameworks/Go/ronykit/src/go.mod +++ b/frameworks/Go/ronykit/src/go.mod @@ -27,7 +27,7 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.50.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/sys v0.18.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/ronykit/src/go.sum b/frameworks/Go/ronykit/src/go.sum index a63639eebcd..95adb04bb84 100644 --- a/frameworks/Go/ronykit/src/go.sum +++ b/frameworks/Go/ronykit/src/go.sum @@ -62,13 +62,13 @@ github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From e70d2a3af0e7803da91127cc2090341b8879d183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Mon, 22 Apr 2024 18:00:04 +0200 Subject: [PATCH 0496/1766] Update GenHTTP to 8.2 (#8922) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andreas Nägeli --- frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index 4df8fb3e39a..268648c98d9 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -28,12 +28,12 @@ - - - + + + - - + + From f463ace223524ce56161d5b4ffa7e5f4964b7e9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 22:37:39 +0000 Subject: [PATCH 0497/1766] Bump meinheld from 0.6.1 to 1.0.2 in /frameworks/Python/wsgi Bumps [meinheld](https://github.com/mopemope/meinheld) from 0.6.1 to 1.0.2. - [Changelog](https://github.com/mopemope/meinheld/blob/master/CHANGES.rst) - [Commits](https://github.com/mopemope/meinheld/compare/v0.6.1...v1.0.2) --- updated-dependencies: - dependency-name: meinheld dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/wsgi/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/wsgi/requirements.txt b/frameworks/Python/wsgi/requirements.txt index 8c35857d83b..9ba0b97b7b6 100644 --- a/frameworks/Python/wsgi/requirements.txt +++ b/frameworks/Python/wsgi/requirements.txt @@ -1,4 +1,4 @@ ujson==1.35 gunicorn==19.9.0 -meinheld==0.6.1 +meinheld==1.0.2 greenlet==0.4.14 From a84e4447a6b2315feaf6b9d861f27c5393e6881e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:22:25 +0000 Subject: [PATCH 0498/1766] Bump hono from 3.11.7 to 4.2.7 in /frameworks/JavaScript/hono Bumps [hono](https://github.com/honojs/hono) from 3.11.7 to 4.2.7. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v3.11.7...v4.2.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 f5b449c20e4..ee69cbea0c1 100644 --- a/frameworks/JavaScript/hono/package-lock.json +++ b/frameworks/JavaScript/hono/package-lock.json @@ -23,9 +23,9 @@ } }, "node_modules/hono": { - "version": "3.11.7", - "resolved": "https://registry.npmjs.org/hono/-/hono-3.11.7.tgz", - "integrity": "sha512-TcfAq7IdipF+9coxnuzYlSSBXbm9mTyWjjagLCv/2ampboNcKJdi+XCK5G48mHQtpI5+9Rj3J4FfcGgw9vzIww==", + "version": "3.12.12", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.12.tgz", + "integrity": "sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==", "engines": { "node": ">=16.0.0" } From 52609102c32f1c0db5f6338a855ff2a6019ecd4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 23:10:26 +0000 Subject: [PATCH 0499/1766] Bump mysql2 from 3.9.4 to 3.9.7 in /frameworks/JavaScript/sailsjs Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.4 to 3.9.7. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.4...v3.9.7) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/sailsjs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/sailsjs/package.json b/frameworks/JavaScript/sailsjs/package.json index 7770c764143..fe26ccb7961 100644 --- a/frameworks/JavaScript/sailsjs/package.json +++ b/frameworks/JavaScript/sailsjs/package.json @@ -10,7 +10,7 @@ "ejs": "2.5.7", "handlebars": "4.7.6", "mysql": "2.16.0", - "mysql2": "3.9.4", + "mysql2": "3.9.7", "pg": "6.0.5", "pg-hstore": "2.3.2", "rc": "1.1.6", From 08a5be4f6c7b30da9a5086d69988323e5a3089b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 23:12:27 +0000 Subject: [PATCH 0500/1766] Bump mysql2 from 3.9.4 to 3.9.7 in /frameworks/JavaScript/nodejs Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.4 to 3.9.7. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.4...v3.9.7) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/nodejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/nodejs/package.json b/frameworks/JavaScript/nodejs/package.json index b3740ce2a91..8af5fedae2b 100644 --- a/frameworks/JavaScript/nodejs/package.json +++ b/frameworks/JavaScript/nodejs/package.json @@ -8,7 +8,7 @@ "mongodb": "3.7.3", "mongoose": "5.13.20", "mysql": "2.16.0", - "mysql2": "3.9.4", + "mysql2": "3.9.7", "parseurl": "1.3.2", "pg": "8.5.0", "pg-hstore": "2.3.2", From d8d779ed0d7e86541dfa4fd3a712136f78376cd4 Mon Sep 17 00:00:00 2001 From: kanarus Date: Fri, 26 Apr 2024 00:46:16 +0900 Subject: [PATCH 0501/1766] update ohkami to v0.17 (#8942) * update ohkami v0.16 -> v0.17 & refactor some * Fix: dockerfile --- frameworks/Rust/ohkami/Cargo.lock | 72 +++++++------- frameworks/Rust/ohkami/Cargo.toml | 6 +- frameworks/Rust/ohkami/README.md | 2 +- frameworks/Rust/ohkami/ohkami.dockerfile | 5 +- frameworks/Rust/ohkami/src/fangs.rs | 96 +++++++++++++++++++ frameworks/Rust/ohkami/src/main.rs | 20 ++-- frameworks/Rust/ohkami/src/postgres.rs | 43 +-------- frameworks/Rust/ohkami/src/templates.rs | 14 +-- frameworks/Rust/ohkami/templates/fortunes.hbs | 5 - 9 files changed, 156 insertions(+), 107 deletions(-) create mode 100644 frameworks/Rust/ohkami/src/fangs.rs delete mode 100644 frameworks/Rust/ohkami/templates/fortunes.hbs diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index acb16978f40..824e6c2622d 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -141,9 +141,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" [[package]] name = "cfg-if" @@ -417,7 +417,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "ohkami" -version = "0.16.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eabbddbe02f121e8b6bcaa10bebcc5b42eee2b0a749ce0801a1b0d304fa6006" +checksum = "ffca2ddf66df3484fd9dfa7f88f923e2082b9934dc7e247616002f8bf71ec81c" dependencies = [ "byte_reader", "hmac", @@ -787,7 +787,7 @@ dependencies = [ [[package]] name = "ohkami_framework_benchmarks" -version = "0.15.0" +version = "0.17.1" dependencies = [ "futures-util", "ohkami", @@ -799,9 +799,9 @@ dependencies = [ [[package]] name = "ohkami_lib" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7231554f893051d7d645c8c2d07b85e80e96f2f5c39d1a5c8568c63560815d44" +checksum = "a306cca964938b3e37157c716b4423f09026ceb4439ec5f9353265d03d217b72" dependencies = [ "byte_reader", "percent-encoding", @@ -810,9 +810,9 @@ dependencies = [ [[package]] name = "ohkami_macros" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cd88e0259e3e0d02df2d44d5419fa1e3d639c4b5117d5fb6b7f281f7fa670c6" +checksum = "1cdb435788e84e7262f0ee3fb1d206a4c1830ec17856eb0924b9d8c5f75c7519" dependencies = [ "proc-macro2", "quote", @@ -848,7 +848,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -970,9 +970,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -1097,9 +1097,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", @@ -1160,29 +1160,29 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -1213,9 +1213,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -1516,9 +1516,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -1539,22 +1539,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1599,7 +1599,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1642,7 +1642,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2044,11 +2044,11 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index 251657c808f..17c0e679f5f 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "ohkami_framework_benchmarks" -version = "0.15.0" +version = "0.17.1" edition = "2021" authors = ["kanarus "] [dependencies] -ohkami = { version = "=0.16.0", features = ["rt_tokio"] } +ohkami = { version = "=0.17.1", features = ["rt_tokio"] } tokio = { version = "1.37.0" , features = ["full"] } rand = { version = "0.8.5" , features = ["small_rng"] } sqlx = { version = "0.7.4" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } yarte = { version = "0.15.7" } -futures-util = { version = "0.3.30" } \ No newline at end of file +futures-util = { version = "0.3.30" } diff --git a/frameworks/Rust/ohkami/README.md b/frameworks/Rust/ohkami/README.md index 2d61eb2ee76..21b85f2cc50 100644 --- a/frameworks/Rust/ohkami/README.md +++ b/frameworks/Rust/ohkami/README.md @@ -4,7 +4,7 @@ > Build web app in intuitive and declarative code > - *macro-less and type-safe* APIs for intuitive and declarative code -> - *multi runtime* support:`tokio`, `async-std` +> - *multi runtime* support:`tokio`, `async-std`, `worker` (Cloudflare Workers) - [User Guide](https://docs.rs/ohkami/latest/ohkami/) - [API Documentation](https://docs.rs/ohkami/latest/ohkami/) diff --git a/frameworks/Rust/ohkami/ohkami.dockerfile b/frameworks/Rust/ohkami/ohkami.dockerfile index e528d58373e..4b228eca830 100644 --- a/frameworks/Rust/ohkami/ohkami.dockerfile +++ b/frameworks/Rust/ohkami/ohkami.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.76-slim-buster +FROM rust:1.77-slim-buster WORKDIR /ohkami_framework_benchmarks ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world @@ -6,7 +6,6 @@ ENV MAX_CONNECTIONS=56 ENV MIN_CONNECTIONS=56 COPY ./src ./src -COPY ./templates ./templates COPY ./Cargo.toml ./Cargo.toml COPY ./Cargo.lock ./Cargo.lock @@ -16,4 +15,4 @@ RUN apt update && apt install -y --no-install-recommends \ RUN RUSTFLAGS="-C target-cpu=native" cargo build --release EXPOSE 8000 -CMD ./target/release/ohkami_framework_benchmarks \ No newline at end of file +CMD ./target/release/ohkami_framework_benchmarks diff --git a/frameworks/Rust/ohkami/src/fangs.rs b/frameworks/Rust/ohkami/src/fangs.rs new file mode 100644 index 00000000000..b81a682e3fc --- /dev/null +++ b/frameworks/Rust/ohkami/src/fangs.rs @@ -0,0 +1,96 @@ +use ohkami::prelude::*; +use crate::Postgres; + + +#[derive(Clone)] +pub struct SetServer; +impl FangAction for SetServer { + #[inline(always)] + async fn back<'a>(&'a self, res: &'a mut ohkami::Response) { + res.headers.set().Server("ohkami"); + } +} + +#[derive(Clone)] +pub struct UsePostgres( + Postgres +); +impl UsePostgres { + pub async fn init() -> Self { + 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 + } + + let pool = sqlx::postgres::PgPoolOptions::new() + .max_connections(MAX_CONNECTIONS) + .min_connections(MIN_CONNECTIONS) + .connect(&DATABASE_URL).await + .unwrap(); + + Self(pool.into()) + } +} +impl FangAction for UsePostgres { + #[inline(always)] + async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { + Ok(req.memorize(self.0.clone())) + } +} + + +/* +impl Postgres { + pub async fn init() -> impl FangAction { + #[derive(Clone)] + pub struct UsePostgres(Postgres); + + impl FangAction for UsePostgres { + #[inline(always)] + async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { + 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() + )) + } +} +*/ diff --git a/frameworks/Rust/ohkami/src/main.rs b/frameworks/Rust/ohkami/src/main.rs index a4f66a80eaa..0fff7ec51e4 100644 --- a/frameworks/Rust/ohkami/src/main.rs +++ b/frameworks/Rust/ohkami/src/main.rs @@ -1,11 +1,14 @@ +mod fangs; +use fangs::{SetServer, UsePostgres}; + mod models; -pub use models::{Fortune, Message, World, WorldsQuery}; +use models::{Fortune, Message, World, WorldsQuery}; mod postgres; -pub use postgres::Postgres; +use postgres::Postgres; mod templates; -pub use templates::FortunesTemplate; +use templates::FortunesTemplate; use ohkami::prelude::*; use ohkami::Memory; @@ -13,16 +16,7 @@ use ohkami::Memory; #[tokio::main] async fn main() { - #[derive(Clone)] - struct SetServer; - impl FangAction for SetServer { - #[inline(always)] - async fn back<'a>(&'a self, res: &'a mut ohkami::Response) { - res.headers.set().Server("ohkami"); - } - } - - Ohkami::with((SetServer, Postgres::init().await), ( + Ohkami::with((SetServer, UsePostgres::init().await), ( "/json" .GET(json_serialization), "/db" .GET(single_database_query), "/queries" .GET(multiple_database_query), diff --git a/frameworks/Rust/ohkami/src/postgres.rs b/frameworks/Rust/ohkami/src/postgres.rs index 0de73e2a77b..7f29317d1ba 100644 --- a/frameworks/Rust/ohkami/src/postgres.rs +++ b/frameworks/Rust/ohkami/src/postgres.rs @@ -1,51 +1,14 @@ use futures_util::{stream::FuturesUnordered, TryStreamExt}; use rand::{rngs::SmallRng, SeedableRng, Rng, thread_rng}; -use ohkami::{utils::FangAction, Request, Response}; use crate::models::{World, Fortune}; #[derive(Clone)] pub struct Postgres(sqlx::PgPool); -impl Postgres { - pub async fn init() -> impl FangAction { - #[derive(Clone)] - pub struct UsePostgres(Postgres); - - impl FangAction for UsePostgres { - #[inline(always)] - async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { - 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 From for Postgres { + fn from(pgpool: sqlx::PgPool) -> Self { + Self(pgpool) } } diff --git a/frameworks/Rust/ohkami/src/templates.rs b/frameworks/Rust/ohkami/src/templates.rs index d8cc5b96c97..4b7f8e06e92 100644 --- a/frameworks/Rust/ohkami/src/templates.rs +++ b/frameworks/Rust/ohkami/src/templates.rs @@ -4,18 +4,20 @@ use crate::models::Fortune; #[derive(Template)] -#[template(path="fortunes")] +#[template(src = r#"Fortunes + {{~# each fortunes ~}} + + {{~/each ~}} +
idmessage
{{id}}{{message}}
"#)] pub struct FortunesTemplate { pub fortunes: Vec, } + impl IntoResponse for FortunesTemplate { fn into_response(self) -> Response { match self.call() { - Ok(template) => Response::OK().html(template), - Err(error) => { - eprintln!("Failed to render template: {error}"); - Response::InternalServerError() - } + Ok(template) => Response::OK().with_html(template), + Err(_) => Response::InternalServerError(), } } } diff --git a/frameworks/Rust/ohkami/templates/fortunes.hbs b/frameworks/Rust/ohkami/templates/fortunes.hbs deleted file mode 100644 index 988cf4fbe93..00000000000 --- a/frameworks/Rust/ohkami/templates/fortunes.hbs +++ /dev/null @@ -1,5 +0,0 @@ -Fortunes - {{~# each fortunes ~}} - - {{~/each ~}} -
idmessage
{{id}}{{message}}
\ No newline at end of file From e20121e518b974fe740470add8f71e703ff9a08d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:46:29 -0700 Subject: [PATCH 0502/1766] Bump mysql2 from 3.9.4 to 3.9.7 in /frameworks/JavaScript/hapi (#8939) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.4 to 3.9.7. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.4...v3.9.7) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/hapi/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/hapi/package.json b/frameworks/JavaScript/hapi/package.json index 82f8f4b8ecd..5d6070a266a 100644 --- a/frameworks/JavaScript/hapi/package.json +++ b/frameworks/JavaScript/hapi/package.json @@ -10,7 +10,7 @@ "handlebars": "4.3.0", "mongoose": "5.13.20", "mysql": "2.16.0", - "mysql2": "3.9.4", + "mysql2": "3.9.7", "pg": "8.5.1", "pg-hstore": "2.3.2", "sequelize": "6.29.0" From b55ae823b26f6bf0c36051d683093a21b29a10be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:46:38 -0700 Subject: [PATCH 0503/1766] Bump mysql2 from 3.9.4 to 3.9.7 in /frameworks/JavaScript/fastify (#8938) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.4 to 3.9.7. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.4...v3.9.7) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/fastify/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/fastify/package.json b/frameworks/JavaScript/fastify/package.json index daed2aad600..c30f31ed8cc 100644 --- a/frameworks/JavaScript/fastify/package.json +++ b/frameworks/JavaScript/fastify/package.json @@ -10,7 +10,7 @@ "handlebars": "4.7.6", "knex": "2.4.2", "mongodb": "3.5.9", - "mysql2": "3.9.4", + "mysql2": "3.9.7", "pg": "8.5.1" } } From d23cbc2e9a6504e395e98cc225fab4d32999c07b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:46:50 -0700 Subject: [PATCH 0504/1766] Bump mysql2 from 3.9.4 to 3.9.7 in /frameworks/JavaScript/express (#8937) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.4 to 3.9.7. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.4...v3.9.7) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index acb57d7c20c..da0b4b9f4a7 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -8,7 +8,7 @@ "escape-html": "1.0.3", "express": "4.18.2", "mongoose": "5.13.20", - "mysql2": "3.9.4", + "mysql2": "3.9.7", "pg": "8.5.0", "pg-promise": "10.7.3", "pug": "2.0.1", From 5234877e1e98eb43d6395cf7e7e348e120652eae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:47:01 -0700 Subject: [PATCH 0505/1766] Bump mysql2 from 3.9.4 to 3.9.7 in /frameworks/JavaScript/spliffy (#8936) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.4 to 3.9.7. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.4...v3.9.7) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/spliffy/package-lock.json | 6 +++--- frameworks/JavaScript/spliffy/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/JavaScript/spliffy/package-lock.json b/frameworks/JavaScript/spliffy/package-lock.json index 5eeb84bba2b..db22f966f30 100644 --- a/frameworks/JavaScript/spliffy/package-lock.json +++ b/frameworks/JavaScript/spliffy/package-lock.json @@ -1189,9 +1189,9 @@ } }, "mysql2": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.4.tgz", - "integrity": "sha512-OEESQuwxMza803knC1YSt7NMuc1BrK9j7gZhCSs2WAyxr1vfiI7QLaLOKTh5c9SWGz98qVyQUbK8/WckevNQhg==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz", + "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", diff --git a/frameworks/JavaScript/spliffy/package.json b/frameworks/JavaScript/spliffy/package.json index b8eb02388c5..bdb6b49aa45 100644 --- a/frameworks/JavaScript/spliffy/package.json +++ b/frameworks/JavaScript/spliffy/package.json @@ -6,7 +6,7 @@ "@srfnstack/spliffy": "0.6.1", "html-escaper": "3.0.3", "mongodb": "^4.17.0", - "mysql2": "^3.9.4", + "mysql2": "^3.9.7", "node-cache": "5.1.2", "pg": "8.6.0", "pg-native": "3.0.1" From 08c64adadfd6879d7285e1fc3032cd28c90a5fb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:47:36 -0700 Subject: [PATCH 0506/1766] Bump mysql2 from 1.5.3 to 3.9.7 in /frameworks/JavaScript/koa (#8933) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 1.5.3 to 3.9.7. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v1.5.3...v3.9.7) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/koa/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/koa/package.json b/frameworks/JavaScript/koa/package.json index 2931b364147..2e0fb45a363 100644 --- a/frameworks/JavaScript/koa/package.json +++ b/frameworks/JavaScript/koa/package.json @@ -12,7 +12,7 @@ "koa-hbs": "1.0.0", "koa-router": "7.4.0", "mongoose": "5.13.20", - "mysql2": "1.5.3", + "mysql2": "3.9.7", "pg": "8.5.1", "pg-hstore": "2.3.2", "sequelize": "6.29.0" From b2e4d55bdd0b9de143d1d68487fa31d8e3f9c608 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:47:54 -0700 Subject: [PATCH 0507/1766] Bump meinheld from 0.6.1 to 1.0.2 in /frameworks/Python/turbogears (#8926) Bumps [meinheld](https://github.com/mopemope/meinheld) from 0.6.1 to 1.0.2. - [Changelog](https://github.com/mopemope/meinheld/blob/master/CHANGES.rst) - [Commits](https://github.com/mopemope/meinheld/compare/v0.6.1...v1.0.2) --- updated-dependencies: - dependency-name: meinheld dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/turbogears/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/turbogears/requirements.txt b/frameworks/Python/turbogears/requirements.txt index c3d5ccc9d7d..0ad8a126c99 100644 --- a/frameworks/Python/turbogears/requirements.txt +++ b/frameworks/Python/turbogears/requirements.txt @@ -6,5 +6,5 @@ mysqlclient==1.3.7 jinja2==2.11.3 gunicorn==19.9.0 -meinheld==0.6.1 +meinheld==1.0.2 greenlet==0.4.14 From 61b1acbcfdb873da18d4a310c9d6cecd14f24538 Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Thu, 25 Apr 2024 23:48:39 +0800 Subject: [PATCH 0508/1766] [C++] Add new paozhu (#8705) * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * update benchmark to v1.5.8 * update benchmark to v1.5.8 * Add benchmark files * Add benchmark files * use local file * use git clone * add conf * add conf * add conf * add conf * add conf * use local files * use local files * use local files * use local files * Remove files * Fix files --- frameworks/C++/paozhu/README.md | 40 ++ frameworks/C++/paozhu/benchmark_config.json | 31 ++ frameworks/C++/paozhu/config.toml | 22 + frameworks/C++/paozhu/paozhu.dockerfile | 41 ++ .../paozhu/paozhu_benchmark/CMakeLists.txt | 508 ++++++++++++++++++ .../common/autocontrolmethod.hpp | 51 ++ .../common/json_reflect_headers.h | 32 ++ .../paozhu_benchmark/common/reghttpmethod.hpp | 16 + .../common/reghttpmethod_pre.hpp | 20 + .../C++/paozhu/paozhu_benchmark/conf/orm.conf | 20 + .../paozhu/paozhu_benchmark/conf/server.conf | 42 ++ .../controller/include/techempower.h | 19 + .../controller/src/techempower.cpp | 241 +++++++++ .../libs/types/techempower_json.h | 15 + .../types/techempower_json_jsonreflect.cpp | 290 ++++++++++ 15 files changed, 1388 insertions(+) create mode 100755 frameworks/C++/paozhu/README.md create mode 100755 frameworks/C++/paozhu/benchmark_config.json create mode 100644 frameworks/C++/paozhu/config.toml create mode 100644 frameworks/C++/paozhu/paozhu.dockerfile create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp diff --git a/frameworks/C++/paozhu/README.md b/frameworks/C++/paozhu/README.md new file mode 100755 index 00000000000..089e3030ca3 --- /dev/null +++ b/frameworks/C++/paozhu/README.md @@ -0,0 +1,40 @@ +# paozhu Benchmarking Test + +This is the [Paozhu](https://github.com/hggq/paozhu) + +This Benchmarking Test code from https://github.com/hggq/paozhu/releases/tag/v1.5.8 + +### Test Type Implementation Source Code + +* [Benchmark code](controller/src/techempower.cpp) +* [ORM config](conf/orm.conf) +* [Server config](conf/server.conf) + +## Test URLs +### JSON + +http://localhost:8888/json + +### PLAINTEXT + +http://localhost:8888/plaintext + + +### Single Database Query + +http://localhost:8888/db + +### Fortune + +http://localhost:8888/fortunes + +### Multiple Database Queries + +http://localhost:8888/queries?queries=10 + +### Database Updates + +http://localhost:8888/updates?queries=10 + +### Cache +http://localhost:8888/cached-queries?count=20 \ No newline at end of file diff --git a/frameworks/C++/paozhu/benchmark_config.json b/frameworks/C++/paozhu/benchmark_config.json new file mode 100755 index 00000000000..e50ee5ece64 --- /dev/null +++ b/frameworks/C++/paozhu/benchmark_config.json @@ -0,0 +1,31 @@ +{ + "framework": "paozhu", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "cached_query_url": "/cached-queries?count=", + "port": 8888, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "paozhu", + "language": "C++", + "flavor": "None", + "orm": "Micro", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "paozhu", + "notes": "", + "versus": "None" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/C++/paozhu/config.toml b/frameworks/C++/paozhu/config.toml new file mode 100644 index 00000000000..dab3170664a --- /dev/null +++ b/frameworks/C++/paozhu/config.toml @@ -0,0 +1,22 @@ +[framework] +name = "paozhu" +authors = ["Huang ziquan "] +github = "https://github.com/hggq/paozhu" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" +approach = "Realistic" +classification = "Fullstack" +database = "MySQL" +database_os = "Linux" +os = "Linux" +orm = "Micro" +platform = "None" +webserver = "None" +versus = "None" diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile new file mode 100644 index 00000000000..2b3329b664c --- /dev/null +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -0,0 +1,41 @@ +FROM ubuntu:22.04 +RUN apt-get update -yqq && apt-get install -yqq apt-utils software-properties-common wget unzip cmake git +RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales + +RUN apt-get -y install brotli libbrotli-dev +RUN apt-get -y install libreadline-dev +RUN apt-get -y install mysql-client +RUN apt-get -y install libmysqlclient-dev + +RUN locale-gen en_US.UTF-8 +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +COPY ./ ./ +WORKDIR / + +# RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip +RUN git clone https://github.com/hggq/paozhu +# RUN unzip benchmark.zip +RUN rm -Rf ./paozhu/controller + +COPY ./paozhu_benchmark/controller ./paozhu/ +COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ + +COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf +COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf +COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt + +WORKDIR /paozhu +RUN unzip asio.zip + +RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release +RUN cmake --build build + + +EXPOSE 8888 + +CMD ./bin/paozhu diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt new file mode 100755 index 00000000000..b8bf972dbc2 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -0,0 +1,508 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.20) + +cmake_policy(SET CMP0048 NEW) + +set(ENABLE_VCPKG OFF CACHE BOOL "choose ON to enable") +set(ENABLE_BOOST OFF CACHE BOOL "choose ON to enable") +set(ENABLE_GD OFF CACHE BOOL "choose ON to enable") +set(ENABLE_WIN_VCPKG OFF CACHE BOOL "choose ON to enable") + +if (ENABLE_GD STREQUAL "ON") + list(FIND VCPKG_MANIFEST_FEATURES "gd" index) + if (index EQUAL -1) + message(STATUS "Auto append features: gd") + list(APPEND VCPKG_MANIFEST_FEATURES "gd") + endif () +endif () + +if (ENABLE_BOOST STREQUAL "ON") + list(FIND VCPKG_MANIFEST_FEATURES "boost" index) + if (index EQUAL -1) + message(STATUS "Auto append features: boost") + list(APPEND VCPKG_MANIFEST_FEATURES "boost") + endif () +endif () + +PROJECT(Paozhu_web_framework) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(mode "CMAKE_BUILD_TYPE") + +set(BOOST_OPEN " ") +set(GD_OPEN " ") + +if(ENABLE_BOOST STREQUAL "ON") + message("ENABLE_BOOST") + set(BOOST_OPEN " -DENABLE_BOOST ") +endif() + +if(ENABLE_GD STREQUAL "ON") + message("ENABLE_GD") + set(GD_OPEN " -DENABLE_GD ") +endif() + +set(sys_so_path "/usr/lib64") + +if (IS_DIRECTORY "/usr/lib/x86_64-linux-gnu") + set(sys_so_path "/usr/lib/x86_64-linux-gnu") +endif() + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0601") +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /EHsc") +endif () + +if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) + + if(CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN}") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g") + endif () + else() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + endif () + message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") + +elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) + + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -O3") + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread") + endif () + else () + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + file(MAKE_DIRECTORY /usr/local/etc/paozhu) + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/) + endif () + message("Release mode:${CMAKE_CXX_FLAGS_RELEASE}") + +else() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") + message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + + if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") + endif () +endif() + + + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/temp) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/log) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) +set(USE_STANDALONE_ASIO ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +message(STATUS "SOURCE dir ${CMAKE_CURRENT_SOURCE_DIR}") + + +set(CMAKE_BUILD_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build) +set(CMAKE_CACHEFILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) +set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/controller) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) + file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) +endif () +#EXECUTE_PROCESS(COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) +set(PAOZHU_PRE paozhu_pre) +add_executable(${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autopickmethod.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/md5.cpp) +add_executable(paozhu_empty ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autoemptymethod.cpp) + + + +file(GLOB_RECURSE orm_list ${CMAKE_CURRENT_SOURCE_DIR}/orm/*.cpp) +file(GLOB_RECURSE source_list ${CMAKE_CURRENT_SOURCE_DIR}/models/*.cpp) +file(GLOB_RECURSE FRAMEWORK_CPP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/*.cpp) +file(GLOB_RECURSE common_list ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cpp) +file(GLOB_RECURSE controller_list ${CMAKE_CURRENT_SOURCE_DIR}/controller/src/*.cpp) +file(GLOB_RECURSE viewsrc_list ${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/view/*.cpp) +file(GLOB_RECURSE reflect_list ${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cpp) +file(GLOB_RECURSE src_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) + +foreach(cppfile IN LISTS controller_list) + string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/controller/src/" "" cppfilename ${cppfile}) + string(REGEX REPLACE ".cpp" "" cppbasename ${cppfilename}) +# message(${cppbasename}) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") + else() + file(TOUCH "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") + endif() +endforeach() + +function(include_sub_directories_recursively root_dir) + if (IS_DIRECTORY ${root_dir}) # 当前路径是一个目录吗,是的话就加入到包含目录 + # if (${root_dir} MATCHES "include") + message("include dir: " ${root_dir}) + include_directories(${root_dir}) + # endif() + endif() + + file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中 + + foreach(sub ${ALL_SUB}) + if (IS_DIRECTORY ${root_dir}/${sub}) + include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含 + endif() + endforeach() +endfunction() + +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/orm) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/models) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/controller/include) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include) + +add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) + + +if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testbenchmark.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) +else() + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) +endif() + +if (ENABLE_WIN_VCPKG STREQUAL "ON") +else () +add_custom_command( + TARGET paozhu_empty paozhu + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ + COMMAND echo "-- controls method --" + COMMAND ${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/ + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty + ) +endif() + +if (ENABLE_VCPKG) + add_compile_definitions(ENABLE_VCPKG) + find_package(asio CONFIG REQUIRED) + target_link_libraries(paozhu asio::asio) + + if (ENABLE_BOOST) + add_compile_definitions(ENABLE_BOOST) + set(Boost_NO_WARN_NEW_VERSIONS ON) + find_package(Boost REQUIRED COMPONENTS filesystem coroutine) + target_link_libraries(paozhu Boost::boost Boost::filesystem Boost::coroutine) + endif () + + find_package(OpenSSL REQUIRED) + target_link_libraries(paozhu OpenSSL::Crypto OpenSSL::SSL) + + find_package(ZLIB REQUIRED) + target_link_libraries(paozhu ZLIB::ZLIB) + + # find_package(libmysql REQUIRED) + find_package(unofficial-libmariadb CONFIG REQUIRED) + find_path(MYSQL_ROOT_DIR mysql) + # target_link_libraries(paozhu ${MYSQL_LIBRARIES}) + # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES}) + target_link_libraries(paozhu unofficial::libmariadb) + target_link_libraries(paozhu_cli unofficial::libmariadb) + target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) + target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) + + if (ENABLE_GD STREQUAL "ON") + find_package(PkgConfig) + pkg_check_modules(LIBGD REQUIRED IMPORTED_TARGET gdlib) + target_link_libraries(paozhu PkgConfig::LIBGD) + + find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h) + find_library(QRENCODE_LIBRARY_RELEASE qrencode) + # find_library(QRENCODE_LIBRARY_DEBUG qrencoded) + # set(QRENCODE_LIBRARIES optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG}) + target_include_directories(paozhu PRIVATE ${QRENCODE_INCLUDE_DIR}) + target_link_libraries(paozhu ${QRENCODE_LIBRARY_RELEASE}) + # MESSAGE(STATUS ${QRENCODE_LIBRARY_RELEASE}) + + # warning: Fixed an issue where ports/libqrencode would not automatically + # copy dll files to the bin directory + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(PATH_TO_QRENCODE_DLL "") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/qrencode.dll") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/libqrencode.dll") + endif () + message(STATUS "Selected libqrencode.dll: ${PATH_TO_QRENCODE_DLL}") + + add_custom_command( + TARGET paozhu POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${PATH_TO_QRENCODE_DLL} ${CMAKE_CURRENT_SOURCE_DIR}/bin/ + ) + endif () + + find_package(PNG REQUIRED) + target_link_libraries(paozhu PNG::PNG) + + find_package(Freetype REQUIRED) + target_link_libraries(paozhu Freetype::Freetype) + endif () + + find_package(unofficial-brotli CONFIG REQUIRED) + target_link_libraries(paozhu unofficial::brotli::brotlidec unofficial::brotli::brotlienc) +else () + +if(USE_STANDALONE_ASIO) +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include") +else() +set(ASIO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/asio "/usr/include") +endif() + + target_compile_definitions(paozhu INTERFACE ASIO_STANDALONE) + find_path(ASIO_PATH asio.hpp) + message(state " Standalone Asio found: " ${ASIO_PATH}) + if(NOT ASIO_PATH) + message(FATAL_ERROR "Standalone Asio not found") + else() + target_include_directories(paozhu INTERFACE ${ASIO_PATH}) + endif() + + include_directories(${ASIO_PATH}) + +endif() + + +if(ENABLE_BOOST STREQUAL "ON") +message("---ENABLE_BOOST-----") +find_package(Boost REQUIRED + COMPONENTS system filesystem) +if(Boost_FOUND) + add_compile_definitions(ENABLE_BOOST) + include_directories("${Boost_INCLUDE_DIRS}/boost") + + MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}") + MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARY_DIRS}") + MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}") + link_directories(${Boost_LIBRARY_DIRS}) + target_link_libraries (paozhu ${Boost_LIBRARIES}) +endif() + +endif() + + +find_package(OpenSSL REQUIRED) + +if(OPENSSL_FOUND) + + message(STATUS "OPENSSL_VERSION = ${OPENSSL_VERSION}") + message(STATUS "OPENSSL_SSL_LIBRARY = ${OPENSSL_SSL_LIBRARY}") + message(STATUS "OPENSSL_CRYPTO_LIBRARY = ${OPENSSL_CRYPTO_LIBRARY}") + message(STATUS "OPENSSL_INCLUDE_DIR = ${OPENSSL_INCLUDE_DIR}") + INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}") + target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY}) + target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY}) +endif() + + +find_package(ZLIB REQUIRED) +if(ZLIB_FOUND) + message(STATUS "Zlib Found! ${ZLIB_LIBRARIES}") + include_directories(${ZLIB_INCLUDE_DIR}) + set(zlib_library ${ZLIB_LIBRARIES}) + target_link_libraries(paozhu z) +endif() + +find_path(MYSQL_ROOT_DIR mysql) +MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) + +FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + /usr/local/include/mysql + /usr/include/mysql + /usr/local/mysql/include +) +SET(MYSQL_NAMES mysqlclient) +FIND_LIBRARY(MYSQL_LIBRARY + NAMES ${MYSQL_NAMES} + PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib + PATH_SUFFIXES mysql +) + +IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND TRUE) + SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) +ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND FALSE) + SET( MYSQL_LIBRARIES ) +ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + +IF (MYSQL_FOUND) + IF (NOT MYSQL_FIND_QUIETLY) + MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") + ENDIF (NOT MYSQL_FIND_QUIETLY) +ELSE (MYSQL_FOUND) + IF (MYSQL_FIND_REQUIRED) + MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") + MESSAGE(FATAL_ERROR "Could NOT find MySQL library") + ENDIF (MYSQL_FIND_REQUIRED) +ENDIF (MYSQL_FOUND) + +target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) +target_link_libraries(paozhu ${MYSQL_LIBRARY}) + +target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) +target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) + + + +if(ENABLE_GD STREQUAL "ON") +message("---ENABLE_GD-----") + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(GD_ROOT_DIR "/usr/local/opt/gd/lib") +else() + set(GD_ROOT_DIR "${sys_so_path}") +endif() + +set(find_gdname gd) + +find_library(GD_LIB_DIR + NAMES ${find_gdname} + PATHS "${GD_ROOT_DIR}" + NO_DEFAULT_PATH +) + +if(NOT GD_LIB_DIR) +message(FATAL_ERROR +"GD Graphics Library NOT FOUND! please install . " +) +endif() + +message(STATUS "GD Graphics Library at: ${GD_LIB_DIR}") + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib") +else() +set(QR_ROOT_DIR "${sys_so_path}") +endif() + +set(find_qrname qrencode) + +find_library(QR_LIB_DIR + NAMES ${find_qrname} + PATHS "${QR_ROOT_DIR}" + NO_DEFAULT_PATH +) + +if(NOT QR_LIB_DIR) +message(FATAL_ERROR +"qrencode Library NOT FOUND! please install . " +) +endif() + +message(STATUS "qrencode at: ${QR_LIB_DIR}") + +INCLUDE_DIRECTORIES("${GD_ROOT_DIR}/include") +INCLUDE_DIRECTORIES("${QR_ROOT_DIR}/include") +link_directories("${QR_ROOT_DIR}/lib") +link_directories("${GD_ROOT_DIR}/lib") +target_link_libraries(paozhu ${GD_LIB_DIR}) +target_link_libraries(paozhu ${QR_LIB_DIR}) + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib") +else() +set(PNG_ROOT_DIR "${sys_so_path}") +endif() + +find_library(PNG_LIB_DIR + NAMES png + PATHS "${PNG_ROOT_DIR}" + NO_DEFAULT_PATH +) +target_link_libraries(paozhu ${PNG_LIB_DIR}) + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib") +else() + set(FREETYPE_ROOT_DIR "${sys_so_path}") +endif() + +find_library(FREETYPE_LIB_DIR + NAMES freetype + PATHS "${FREETYPE_ROOT_DIR}" + NO_DEFAULT_PATH +) +target_link_libraries(paozhu ${FREETYPE_LIB_DIR}) +#end ENABLE_GD +endif() + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(BROTLI_ROOT_DIR "/usr/local/opt/brotli/lib") +else() + set(BROTLI_ROOT_DIR "${sys_so_path}") +endif() + + + +#find_package(Brotli COMPONENTS encoder decoder common REQUIRED) + +message(STATUS "Brotli at: ${BROTLI_ROOT_DIR}") + +set(find_brname brotlienc) +set(find_brdename brotlidec) +find_library(BR_LIB_DIR + NAMES ${find_brname} + PATHS "${BROTLI_ROOT_DIR}" + NO_DEFAULT_PATH +) +find_library(BRDEC_LIB_DIR + NAMES ${find_brdename} + PATHS "${BROTLI_ROOT_DIR}" + NO_DEFAULT_PATH +) +INCLUDE_DIRECTORIES("${BROTLI_ROOT_DIR}/include") +link_directories("${BROTLI_ROOT_DIR}/lib") + +if(NOT BR_LIB_DIR) +message(FATAL_ERROR +"Brotli Library NOT FOUND! please install . " +) +endif() + +message(STATUS "Brotli at: ${BR_LIB_DIR}") +target_link_libraries(paozhu ${BR_LIB_DIR}) + + +if(NOT BRDEC_LIB_DIR) +message(FATAL_ERROR +"Brotli Library NOT FOUND! please install . " +) +endif() + +message(STATUS "Brotli at: ${BRDEC_LIB_DIR}") +target_link_libraries(paozhu ${BRDEC_LIB_DIR}) + + +message("Compile framework mode") + +target_link_libraries(paozhu m dl) + +endif () + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + target_link_libraries(paozhu ws2_32) + target_link_libraries(paozhu_cli ws2_32) +endif () \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp new file mode 100755 index 00000000000..faddf242daa --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp @@ -0,0 +1,51 @@ + +#ifndef __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP +#define __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" + +#include "techempower.h" + + +namespace http +{ + void _initauto_control_httpmethodregto(std::map &methodcallback) + { + struct regmethold_t temp; + + temp.pre = nullptr; + temp.regfun = techempowerplaintext; + methodcallback.emplace("plaintext",temp); + temp.pre = nullptr; + temp.regfun = techempowerjson; + methodcallback.emplace("json",temp); + temp.pre = nullptr; + temp.regfun = techempowerdb; + methodcallback.emplace("db",temp); + temp.pre = nullptr; + temp.regfun = techempowerqueries; + methodcallback.emplace("queries",temp); + temp.pre = nullptr; + temp.regfun = techempowerfortunes; + methodcallback.emplace("fortunes",temp); + temp.pre = nullptr; + temp.regfun = techempowerupdates; + methodcallback.emplace("updates",temp); + temp.pre = nullptr; + temp.regfun = techempowercached_queries; + methodcallback.emplace("cached-queries",temp); + temp.pre = nullptr; + temp.regfun = techempowercached_db; + methodcallback.emplace("cached-db",temp); + + + } +} + +#endif + + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h new file mode 100644 index 00000000000..176500bf383 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h @@ -0,0 +1,32 @@ +#pragma once +#include +#include +#include +#include + +#include "types/techempower_json.h" +#include "unicode.h" + +template +std::string json_encode([[maybe_unused]] const JSON_REF_OBJ_TEMP &json_reflectobj) { return ""; } + +template +std::string json_encode([[maybe_unused]] const std::vector &json_reflectobj) { return ""; } + +template +unsigned int json_decode([[maybe_unused]] JSON_REF_OBJ_TEMP &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } + +template +unsigned int json_decode([[maybe_unused]] std::vector &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; } + +namespace http +{ + +std::string json_encode(const techempower_outjson_t &json_reflectobj); + +std::string json_encode(const std::vector &json_reflectobj); + +unsigned int json_decode(techempower_outjson_t &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); + +unsigned int json_decode(std::vector &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0); +}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp new file mode 100755 index 00000000000..3333ed08bf0 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp @@ -0,0 +1,16 @@ +#ifndef __HTTP_REGHTTPMETHOD_HPP +#define __HTTP_REGHTTPMETHOD_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif// defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" +namespace http +{ +void _inithttpmethodregto(std::map &methodcallback) +{ +} + +}// namespace http +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp new file mode 100755 index 00000000000..bf2d5407381 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp @@ -0,0 +1,20 @@ +#ifndef __HTTP_REGHTTPMETHOD_PRE_HPP +#define __HTTP_REGHTTPMETHOD_PRE_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif// defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" +namespace http +{ +void _inithttpmethodregto_pre(std::map &methodcallback) +{ + struct regmethold_t temp; + //temp.pre = adminlogin; + //temp.regfun = adminmar; + //methodcallback.emplace("adminmar", temp); +} + +}// namespace http +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf new file mode 100644 index 00000000000..1700d25a66e --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf @@ -0,0 +1,20 @@ +[default] +type=main +host=tfb-database +port=3306 +dbname=hello_world +user=benchmarkdbuser +password=benchmarkdbpass +pretable= +maxpool=5 +dbtype=mysql + +type=second +host=tfb-database +port=3306 +dbname=hello_world +user=benchmarkdbuser +password=benchmarkdbpass +pretable= +maxpool=20 +dbtype=mysql diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf new file mode 100755 index 00000000000..e76a18093e9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf @@ -0,0 +1,42 @@ +[default] +threadmax=1024 +threadmin=5 +httpport=8888 +httpsport=4430 +cothreadnum=8 ;Coroutines run on thread num + +http2_enable=0 +debug_enable=1 +deamon_enable=0 +mainhost=localhost +certificate_chain_file=localhost.pem +private_key_file=localhost.key +tmp_dh_file=dh4096.pem +reboot_password=e10adc3949ba59abbe56e057f20f883e ;md5(md5("123456")+"rand_char"+md5("123456")) +session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve +static_file_compress_cache=1 ;1 enable, Cache static file compress(gzip,br) content to cache directory +modelspath=/root/benchmark/models +serverpath=/root/benchmark +viewpath=/root/benchmark/view +viewsopath=/root/benchmark/module/view + +controlpath=/root/benchmark/controller +controlsopath=/root/benchmark/module/controller + +temppath=/root/benchmark/temp +logpath=/root/benchmark/log +wwwpath=/root/benchmark/www/default +pluginspath=/root/benchmark/plugins +libspath=/root/benchmark/libs +directorylist=0 +index=index.html +;usehtmlcache=1 +;usehtmlcachetime=3600 +rewrite_404=0 ;1 file 2 action url path +rewrite_404_action=index.html +method_pre= +method_after= +show_visitinfo=0 +upload_max_size=16777216 + + diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h new file mode 100755 index 00000000000..f1697f616b9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h @@ -0,0 +1,19 @@ + +#pragma once +#include +#include +#include "httppeer.h" + +namespace http +{ + + + std::string techempowerplaintext(std::shared_ptr peer); + std::string techempowerjson(std::shared_ptr peer); + std::string techempowerdb(std::shared_ptr peer); + std::string techempowerqueries(std::shared_ptr peer); + std::string techempowerfortunes(std::shared_ptr peer); + std::string techempowerupdates(std::shared_ptr peer); + std::string techempowercached_queries(std::shared_ptr peer); + std::string techempowercached_db(std::shared_ptr peer); +} diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp new file mode 100755 index 00000000000..43906f42156 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -0,0 +1,241 @@ +#include "orm.h" +#include +#include +#include +#include +#include +#include "httppeer.h" +#include "techempower.h" +#include "techempower_json.h" +#include "datetime.h" +#include "func.h" +#include "pzcache.h" +#include "json_reflect_headers.h" +namespace http +{ +//@urlpath(null,plaintext) +std::string techempowerplaintext(std::shared_ptr peer) +{ + peer->type("text/plain; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + peer->output = "Hello, World!"; + return ""; +} + +//@urlpath(null,json) +std::string techempowerjson(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + struct techempower_outjson_t a; + a.message = "Hello, World!"; + peer->output = json_encode(a); + return ""; +} + +//@urlpath(null,db) +std::string techempowerdb(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + auto myworld = orm::World(); + unsigned int rd_num = rand_range(1, 10000); + myworld.get_one(rd_num); + + peer->output = myworld.data_tojson(); + return ""; +} + +//@urlpath(null,queries) +std::string techempowerqueries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + unsigned int get_num = peer->get["queries"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + unsigned int rd_num = rand_range(1, 10000); + myworld.where("id", rd_num).fetch_append(); + } + + peer->output = myworld.to_json(); + return ""; +} + +//@urlpath(null,fortunes) +std::string techempowerfortunes(std::shared_ptr peer) +{ + peer->type("text/html; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + auto myfortune = orm::Fortune(); + myfortune.fetch(); + myfortune.data.id = 0; + myfortune.data.message = "Additional fortune added at request time."; + myfortune.record.push_back(myfortune.data); + + std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) + { return lhs.message < rhs.message; }); + peer->val["list"].set_array(); + OBJ_ARRAY item; + for (unsigned int i = 0; i < myfortune.record.size(); i++) + { + item["id"] = myfortune.record[i].id; + item["message"] = html_encode(myfortune.record[i].message); + peer->val["list"].push(item); + } + + peer->view("techempower/fortunes"); + return ""; +} + +//@urlpath(null,updates) +std::string techempowerupdates(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + unsigned int get_num = peer->get["queries"].to_int(); + + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.clear(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + myworld.where("id", rand_range(1, 10000)).fetch_append(); + if (myworld.effect() > 0) + { + unsigned int j = myworld.record.size() - 1; + myworld.data.randomnumber = rand_range(1, 10000); + myworld.record[j].randomnumber = myworld.data.randomnumber; + myworld.update("randomnumber"); + } + } + peer->output = myworld.to_json(); + return ""; +} + +//@urlpath(null,cached-queries) +std::string techempowercached_queries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "alldatacache"; + + pzcache> &temp_cache = pzcache>::conn(); + + std::vector allcachedata_array; + allcachedata_array.reserve(10000); + //create rand data to cache + if (temp_cache.check(mycacheid) > -1) + { + allcachedata_array = temp_cache.get(mycacheid); + } + else + { + allcachedata_array.resize(10000); + for (unsigned int i = 0; i < 10000; i++) + { + allcachedata_array[i].id = i + 1; + allcachedata_array[i].randomnumber = rand_range(1, 10000); + } + temp_cache.save(mycacheid, allcachedata_array, 120); + } + //get rand data from cache + mycacheid = "my" + std::to_string(get_num); + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + if (allcachedata_array.size() == 10000) + { + for (unsigned int i = 0; i < get_num; i++) + { + unsigned int temp_rid = rand_range(0, 9999); + myworld.record.push_back(allcachedata_array[temp_rid]); + } + } + temp_cache.save(mycacheid, myworld.record, 120); + } + + peer->output = myworld.to_json(); + return ""; +} + +//@urlpath(null,cached-db) +std::string techempowercached_db(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + //this test from database to cache + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "my" + std::to_string(get_num); + + pzcache> &temp_cache = pzcache>::conn(); + + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + std::vector cacheid; + for (unsigned int i = 0; i < get_num; i++) + { + cacheid.push_back(rand_range(1, 10000)); + } + + std::string sqlstr = array_to_sql(cacheid); + myworld.whereIn("id", sqlstr).fetch(); + temp_cache.save(mycacheid, myworld.record, 120); + } + + peer->output = myworld.to_json(); + return ""; +} + +}// namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h new file mode 100644 index 00000000000..364c06bb2cf --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h @@ -0,0 +1,15 @@ +#ifndef LIBS_TYPES_TECHEMPOWER_TYPE_H +#define LIBS_TYPES_TECHEMPOWER_TYPE_H +#include +#include + +namespace http +{ +//@reflect json to_json from_json +struct techempower_outjson_t +{ + std::string message; +}; + +}// namespace http +#endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp new file mode 100644 index 00000000000..b5088efcdf9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp @@ -0,0 +1,290 @@ +#include +#include +#include +#include +#include "types/techempower_json.h" +#include "json_reflect_headers.h" +#include "unicode.h" +#include "func.h" + +namespace http +{ + + +std::string json_encode(const techempower_outjson_t &json_reflectobj) + { + + std::stringstream _stream; + _stream << "{"; + _stream << "\"message\":\"" << http::utf8_to_jsonstring(json_reflectobj.message)<< "\""; + + _stream << "}"; + + return _stream.str(); + + } + + +std::string json_encode(const std::vector &json_reflectobj) + { + std::stringstream _stream; + _stream << "["; + + for(unsigned int i=0;i0) + { + _stream <<","; + } + _stream < + //递归代码 + + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '}') + { + //offset++; + break; + } + if (_json_data[_offset] == '"') + { + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) + { + break; + } + } + } + } + + + if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) + { + _offset-=1; + } + //直接下一个,不用处理键值 + continue; + } + else if(_json_data[_offset]=='[') + { //表示有数组 + ////////////////////////////////////////////////////////////////////// + //begin level1 [] + //vector vector> vector> + //如果是非内置类型 直接使用json_decode<> + + //递归代码 + + + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == ']') + { + //offset++; + break; + } + if (_json_data[_offset] == '"') + { + _offset++; + for ( ; _offset < _json_data.size(); _offset++) + { + if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C) + { + break; + } + } + } + } + + //直接下一个,不用处理键值 + if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}')) + { + _offset-=1; + } + continue; + //end level1[] + //////////////////////////////////////////////////////////////////// + } + else if(_json_data[_offset]==0x22) + { + //如果键值也是字符串 + temp_offset=_offset; + _json_value_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset); + _offset=temp_offset; + if(_json_data[_offset]==0x22) + { + if((_offset+1)<_json_data.size()) + { + if(_json_data[_offset+1]!=']'&&_json_data[_offset+1]!='}') + { + _offset+=1; + } + } + } + } + else + { + //表示是数字 bool NULL + for(;_offset<_json_data.size();_offset++) + { + //结束条件 + if(_json_data[_offset]==','||_json_data[_offset]==']'||_json_data[_offset]=='}'||_json_data[_offset]==0x20||_json_data[_offset]==0x0A||_json_data[_offset]==0x0D||_json_data[_offset]=='\t') + { + break; + } + _json_value_name.push_back(_json_data[_offset]); + } + //让前面循环退出或返回 + if(_offset < _json_data.size() && _json_data[_offset]=='}') + { + _offset-=1; + } + } + //////////////////////////////////////////////////////// + // level1 + //处理对象赋值 + if (http::str_casecmp(_json_key_name, "message")) + { + + json_reflectobj.message=_json_value_name; + } + + //////////////////////////////////////////////////////// + //继续循环下一个键值 + continue; + } + } + } + return _offset; + } + +unsigned int json_decode(std::vector &json_reflectobj,const std::string &_json_data,unsigned int _offset) + { + bool _isarray=false; + for(;_offset<_json_data.size();_offset++) + { + if(_json_data[_offset]=='{') + { + break; + } + if(_json_data[_offset]=='[') + { + _isarray=true; + break; + } + } + + if(_isarray) + { + if(_json_data[_offset]=='[') + { + _offset+=1; + } + for(;_offset<_json_data.size();_offset++) + { + _offset=http::json_string_trim(_json_data,_offset); + //直接返回,这样可以防插入空的对象 + if(_json_data[_offset]==0x5D) + { + return _offset; + }else if(_json_data[_offset]=='{') + { + techempower_outjson_t temp; + _offset=json_decode(temp,_json_data,_offset); + json_reflectobj.push_back(temp); + } + + } + + } + else + { + techempower_outjson_t temp; + _offset=json_decode(temp,_json_data,_offset); + json_reflectobj.push_back(temp); + + } + + return _offset; + } + +} From b8d38d2c9c80eb9a458e2b8606f0ea638983f080 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:49:03 -0700 Subject: [PATCH 0509/1766] Bump meinheld from 0.6.1 to 1.0.2 in /frameworks/Python/bottle (#8925) Bumps [meinheld](https://github.com/mopemope/meinheld) from 0.6.1 to 1.0.2. - [Changelog](https://github.com/mopemope/meinheld/blob/master/CHANGES.rst) - [Commits](https://github.com/mopemope/meinheld/compare/v0.6.1...v1.0.2) --- updated-dependencies: - dependency-name: meinheld dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/bottle/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/bottle/requirements.txt b/frameworks/Python/bottle/requirements.txt index 75f9c033488..25c2d97e91a 100644 --- a/frameworks/Python/bottle/requirements.txt +++ b/frameworks/Python/bottle/requirements.txt @@ -2,7 +2,7 @@ bottle==0.12.19 bottle-sqlalchemy==0.4.3 greenlet==0.4.14 gunicorn==19.9.0 -meinheld==0.6.1 +meinheld==1.0.2 mysqlclient==1.3.12 SQLAlchemy==1.3.0 ujson==1.35 From 40efdb9e74ae0e0b8ca041620e165c74c783eaa2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:49:16 -0700 Subject: [PATCH 0510/1766] Bump meinheld from 0.6.1 to 1.0.2 in /frameworks/Python/web2py (#8923) Bumps [meinheld](https://github.com/mopemope/meinheld) from 0.6.1 to 1.0.2. - [Changelog](https://github.com/mopemope/meinheld/blob/master/CHANGES.rst) - [Commits](https://github.com/mopemope/meinheld/compare/v0.6.1...v1.0.2) --- updated-dependencies: - dependency-name: meinheld dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/web2py/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/web2py/requirements.txt b/frameworks/Python/web2py/requirements.txt index ffff87771f6..968f12b799f 100644 --- a/frameworks/Python/web2py/requirements.txt +++ b/frameworks/Python/web2py/requirements.txt @@ -1,4 +1,4 @@ mysqlclient==1.3.12 gunicorn==19.7.1 -meinheld==0.6.1 +meinheld==1.0.2 greenlet==0.4.14 From fe67957cb4294fb9f2dbf5d5d26ea29c7ccdf759 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:49:33 -0700 Subject: [PATCH 0511/1766] Bump meinheld from 0.6.1 to 1.0.2 in /frameworks/Python/morepath (#8929) Bumps [meinheld](https://github.com/mopemope/meinheld) from 0.6.1 to 1.0.2. - [Changelog](https://github.com/mopemope/meinheld/blob/master/CHANGES.rst) - [Commits](https://github.com/mopemope/meinheld/compare/v0.6.1...v1.0.2) --- updated-dependencies: - dependency-name: meinheld dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/morepath/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/morepath/requirements.txt b/frameworks/Python/morepath/requirements.txt index 68dc3474f06..b1ff4b72a3a 100644 --- a/frameworks/Python/morepath/requirements.txt +++ b/frameworks/Python/morepath/requirements.txt @@ -4,7 +4,7 @@ gunicorn==19.9.0 importscan==0.1 Jinja2==2.11.3 MarkupSafe==1.0 -meinheld==0.6.1 +meinheld==1.0.2 more.jinja2==0.2 more.pony==0.1 morepath==0.18.1 From 0982c97a9c20096f55fcb7fad8ba627170583b0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:49:42 -0700 Subject: [PATCH 0512/1766] Bump meinheld from 0.6.1 to 1.0.2 in /frameworks/Python/weppy (#8927) Bumps [meinheld](https://github.com/mopemope/meinheld) from 0.6.1 to 1.0.2. - [Changelog](https://github.com/mopemope/meinheld/blob/master/CHANGES.rst) - [Commits](https://github.com/mopemope/meinheld/compare/v0.6.1...v1.0.2) --- updated-dependencies: - dependency-name: meinheld dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/weppy/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/weppy/requirements.txt b/frameworks/Python/weppy/requirements.txt index 9e0c789e3ba..078948040eb 100644 --- a/frameworks/Python/weppy/requirements.txt +++ b/frameworks/Python/weppy/requirements.txt @@ -1,6 +1,6 @@ psycopg2==2.7.5 weppy==1.3 gunicorn==19.9.0 -meinheld==0.6.1 +meinheld==1.0.2 uwsgi==2.0.22 greenlet==0.4.14 From 39e29cb04e7d78074ee363aea1e8e2e3d738cbc9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:49:53 -0700 Subject: [PATCH 0513/1766] Bump meinheld from 0.6.1 to 1.0.2 in /frameworks/Python/eve (#8928) Bumps [meinheld](https://github.com/mopemope/meinheld) from 0.6.1 to 1.0.2. - [Changelog](https://github.com/mopemope/meinheld/blob/master/CHANGES.rst) - [Commits](https://github.com/mopemope/meinheld/compare/v0.6.1...v1.0.2) --- updated-dependencies: - dependency-name: meinheld dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/eve/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/eve/requirements.txt b/frameworks/Python/eve/requirements.txt index 7e89c0bc0b4..f054d6baf97 100644 --- a/frameworks/Python/eve/requirements.txt +++ b/frameworks/Python/eve/requirements.txt @@ -3,6 +3,6 @@ Flask==1.0 greenlet==0.4.14 gunicorn==19.9.0 itsdangerous==0.24 -meinheld==0.6.1 +meinheld==1.0.2 uWSGI==2.0.22 Werkzeug==0.15.5 From d1c9ebae42fc945deee9956014a6af911eec2a9a Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Fri, 26 Apr 2024 14:20:04 +0200 Subject: [PATCH 0514/1766] Upgrade to Inverno 1.10.0 + minor changes --- .../Java/inverno/inverno-postgres.dockerfile | 5 ++-- frameworks/Java/inverno/pom.xml | 8 ++--- .../benchmark/internal/Controller.java | 30 +++++++++---------- .../src/main/resources/configuration.cprops | 4 ++- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile index 6a3fcd9070f..737cb434013 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -7,6 +7,7 @@ RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 -# 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/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" + target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark \ + --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" \ + --com.techempower.inverno.benchmark.appConfiguration.boot.reactor_event_loop_group_size=$((`grep --count ^processor /proc/cpuinfo`)) diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index c056d047bbc..c91b31c2d37 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.9.0 + 1.10.0 com.techempower inverno-benchmark @@ -47,7 +47,7 @@ io.inverno.mod inverno-sql-vertx
- + org.unbescape unbescape @@ -110,7 +110,7 @@ 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 + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 @@ -157,7 +157,7 @@ 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 + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java index 639ec561159..33c94a5c7b4 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java @@ -1,20 +1,11 @@ package com.techempower.inverno.benchmark.internal; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.techempower.inverno.benchmark.model.Fortune; import com.techempower.inverno.benchmark.model.Message; import com.techempower.inverno.benchmark.model.World; import com.techempower.inverno.benchmark.templates.FortunesTemplate; - import io.inverno.core.annotation.Bean; import io.inverno.core.annotation.Bean.Visibility; import io.inverno.core.annotation.Destroy; @@ -39,6 +30,13 @@ import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpHeaderValues; import io.netty.util.AsciiString; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -81,6 +79,8 @@ public void init() { this.dateEventLoopGroup.scheduleAtFixedRate(() -> { this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); }, 0, 1000, TimeUnit.MILLISECONDS); + + } @Destroy @@ -133,7 +133,7 @@ public void handle(Exchange exchange) throws HttpException { private static final ByteBuf STATIC_PLAINTEXT_BYTEBUF; static { - ByteBuf tmpBuf = Unpooled.directBuffer(STATIC_PLAINTEXT_LEN); + ByteBuf tmpBuf = Unpooled.buffer(STATIC_PLAINTEXT_LEN); tmpBuf.writeBytes(STATIC_PLAINTEXT); STATIC_PLAINTEXT_BYTEBUF = Unpooled.unreleasableBuffer(tmpBuf); } @@ -172,7 +172,7 @@ public void handle_json(Exchange exchange) throws HttpException ) .body() .raw() - .value(Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!"))))); + .value(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!")))); } catch (JsonProcessingException | IllegalStateException e) { throw new InternalServerErrorException("Error serializing message as JSON", e); @@ -196,7 +196,7 @@ public void handle_db(Exchange exchange) throws HttpException { DB_SELECT_WORLD, row -> { try { - return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1))))); + return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1)))); } catch (JsonProcessingException e) { throw new InternalServerErrorException(e); @@ -241,7 +241,7 @@ public void handle_queries(Exchange exchange) throws HttpExcept .collectList() .map(worlds -> { try { - return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); + return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)); } catch (JsonProcessingException e) { throw new InternalServerErrorException(e); @@ -278,7 +278,7 @@ public void handle_updates(Exchange exchange) throws HttpExcept ) .map(worlds -> { try { - return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); + return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)); } catch (JsonProcessingException e) { throw new InternalServerErrorException(e); @@ -290,7 +290,7 @@ public void handle_updates(Exchange exchange) throws HttpExcept private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8"); - private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer())); + private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.buffer()); public void handle_fortunes(Exchange exchange) throws HttpException { exchange.response() diff --git a/frameworks/Java/inverno/src/main/resources/configuration.cprops b/frameworks/Java/inverno/src/main/resources/configuration.cprops index df4680e124b..9fc9d6fddd0 100644 --- a/frameworks/Java/inverno/src/main/resources/configuration.cprops +++ b/frameworks/Java/inverno/src/main/resources/configuration.cprops @@ -6,7 +6,9 @@ com.techempower.inverno.benchmark.appConfiguration { http_server { tls_enabled = false server_port = 8080 - h2c_enabled = false + h2_enabled = false + http1x_validate_headers = false + ws_enabled = false } db_database = "hello_world" db_host = "tfb-database" From b030977a747c01addde55d4c51fc6d7c5ca0bd9c Mon Sep 17 00:00:00 2001 From: CypherPotato Date: Sat, 27 Apr 2024 22:03:00 -0300 Subject: [PATCH 0515/1766] update sisk version --- frameworks/CSharp/sisk/sisk/sisk.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/sisk/sisk/sisk.csproj b/frameworks/CSharp/sisk/sisk/sisk.csproj index 7aa39fc67ee..1b95479eb01 100644 --- a/frameworks/CSharp/sisk/sisk/sisk.csproj +++ b/frameworks/CSharp/sisk/sisk/sisk.csproj @@ -9,7 +9,7 @@ - + From c18bddea99a494e9110c3cee5d596b22b0db7381 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 08:55:57 +0000 Subject: [PATCH 0516/1766] Bump ejs from 2.5.7 to 3.1.10 in /frameworks/JavaScript/sailsjs Bumps [ejs](https://github.com/mde/ejs) from 2.5.7 to 3.1.10. - [Release notes](https://github.com/mde/ejs/releases) - [Commits](https://github.com/mde/ejs/compare/v2.5.7...v3.1.10) --- updated-dependencies: - dependency-name: ejs dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/sailsjs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/sailsjs/package.json b/frameworks/JavaScript/sailsjs/package.json index fe26ccb7961..9be38df56ad 100644 --- a/frameworks/JavaScript/sailsjs/package.json +++ b/frameworks/JavaScript/sailsjs/package.json @@ -7,7 +7,7 @@ "dependencies": { "async": "1.5.2", "bluebird": "3.4.1", - "ejs": "2.5.7", + "ejs": "3.1.10", "handlebars": "4.7.6", "mysql": "2.16.0", "mysql2": "3.9.7", From 80a7c362ff6671f38b6ba182f7d4880f9cd46d62 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 6 May 2024 20:15:02 +0200 Subject: [PATCH 0517/1766] [ruby/sinatra] Use Jemalloc for better memory performance (#8968) --- frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile | 5 +++++ .../Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile | 5 +++++ .../Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile | 5 +++++ frameworks/Ruby/sinatra/sinatra-postgres.dockerfile | 5 +++++ frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile | 5 +++++ frameworks/Ruby/sinatra/sinatra.dockerfile | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile index ccab0a6feac..bb1492ba284 100644 --- a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile index c74cf454967..46ca6c1145f 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile index ec3e0d2f8ff..aa91ffe74b7 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 89784eed670..2eb9060f59a 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile index 71871552328..763b9c82c46 100644 --- a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 729eba869be..67c4152a66f 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + ADD ./ /sinatra WORKDIR /sinatra From 820953f0a22cf0298f29559f935021e52118af72 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 6 May 2024 20:15:15 +0200 Subject: [PATCH 0518/1766] [ruby/agoo] Use a connection pool of size 1 (#8959) As Agoo is currently configured to not use threads, we can use a connection pool of size 1. --- frameworks/Ruby/agoo/app.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index 1150b8d1cb4..46ea06948aa 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -6,7 +6,7 @@ require 'pg' require 'rack' -$pool = ConnectionPool.new(size: 256, timeout: 5) do +$pool = ConnectionPool.new(size: 1, timeout: 5) do PG::Connection.new({ dbname: 'hello_world', host: 'tfb-database', From 157b5307c16f595dc272624ae763e524f460907c Mon Sep 17 00:00:00 2001 From: Xudong Huang Date: Tue, 7 May 2024 02:16:35 +0800 Subject: [PATCH 0519/1766] [Rust][may_minihttp] update may_postgres commit (#8961) --- frameworks/Rust/may-minihttp/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/may-minihttp/Cargo.toml b/frameworks/Rust/may-minihttp/Cargo.toml index eb03a8e4bc0..0409bd62752 100644 --- a/frameworks/Rust/may-minihttp/Cargo.toml +++ b/frameworks/Rust/may-minihttp/Cargo.toml @@ -19,7 +19,7 @@ buf-min = { version = "0.7", features = ["bytes"] } may = { version = "0.3", default-features = false } may_minihttp = { version = "0.1", default-features = false } -may_postgres = { git = "https://github.com/Xudong-Huang/may_postgres.git", rev = "bf1d86e", default-features = false } +may_postgres = { git = "https://github.com/Xudong-Huang/may_postgres.git", rev = "4c18791", default-features = false } [profile.release] opt-level = 3 From a2aaf20956fbd93aa2f67bdd1111af8864ec47a7 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 6 May 2024 20:16:42 +0200 Subject: [PATCH 0520/1766] [ruby/agoo] Use constants for HTTP headers (#8958) Constants improve performance as these string don't need to be allocated again after each request. Also replace `Time.now.utc.httpdate` with `Time.now.httpdate` as is used by other Ruby frameworks. --- frameworks/Ruby/agoo/app.rb | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index 46ea06948aa..498c0ece93b 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -20,6 +20,17 @@ QUERIES_MIN = 1 QUERIES_MAX = 500 +CONTENT_TYPE = 'Content-Type' +CONTENT_LENGTH = 'Content-Length' +DATE = 'Date' +SERVER = 'Server' +SERVER_STRING = 'Agoo' + +JSON_TYPE = 'application/json' +HTML_TYPE = 'text/html; charset=utf-8' +PLAINTEXT_TYPE = 'text/plain' + + class BaseHandler def self.extract_queries_param(request = nil) queries = Rack::Utils.parse_query(request['QUERY_STRING'])['queries'].to_i rescue 1 @@ -45,9 +56,9 @@ def self.html_response(str = '') [ 200, { - 'Content-Type' => 'text/html; charset=utf-8', - 'Date' => Time.now.utc.httpdate, - 'Server' => 'Agoo' + CONTENT_TYPE => HTML_TYPE, + DATE => Time.now.httpdate, + SERVER => SERVER_STRING }, [str] ] @@ -57,9 +68,9 @@ def self.json_response(obj = {}) [ 200, { - 'Content-Type' => 'application/json', - 'Date' => Time.now.utc.httpdate, - 'Server' => 'Agoo' + CONTENT_TYPE => JSON_TYPE, + DATE => Time.now.httpdate, + SERVER => SERVER_STRING }, [Oj.dump(obj, { :mode => :strict })] ] @@ -69,9 +80,9 @@ def self.plain_response(str = '') [ 200, { - 'Content-Type' => 'text/plain', - 'Date' => Time.now.utc.httpdate, - 'Server' => 'Agoo' + CONTENT_TYPE => PLAINTEXT_TYPE, + DATE => Time.now.httpdate, + SERVER => SERVER_STRING }, [str] ] From 444fb65a2d2a9bc0cbef28252800567d412bb2e6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 6 May 2024 20:16:49 +0200 Subject: [PATCH 0521/1766] [ruby/rack-sequel] Use constants for HTTP headers (#8957) Constants improve performance as these string don't need to be allocated again after each request. --- frameworks/Ruby/rack-sequel/boot.rb | 6 ++++++ frameworks/Ruby/rack-sequel/hello_world.rb | 18 +++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index e012694c06a..1670420c0b6 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -6,6 +6,12 @@ QUERIES_MIN = 1 QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true +CONTENT_TYPE = 'Content-Type' +JSON_TYPE = 'application/json' +HTML_TYPE = 'text/html; charset=utf-8' +PLAINTEXT_TYPE = 'text/plain' +DATE_HEADER = 'Date' +SERVER_HEADER = 'Server' SERVER_STRING = if defined?(PhusionPassenger) diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 552cffd0e1c..a031125d9ef 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -3,7 +3,7 @@ # Our Rack application to be executed by rackup class HelloWorld DEFAULT_HEADERS = {}.tap do |h| - h['Server'] = SERVER_STRING if SERVER_STRING + h[SERVER_HEADER] = SERVER_STRING if SERVER_STRING h.freeze end @@ -91,29 +91,29 @@ def call(env) case env['PATH_INFO'] when '/json' # Test type 1: JSON serialization - ['application/json', JSON.fast_generate(:message=>'Hello, World!')] + [JSON_TYPE, JSON.fast_generate(:message=>'Hello, World!')] when '/db' # Test type 2: Single database query - ['application/json', JSON.fast_generate(db)] + [JSON_TYPE, JSON.fast_generate(db)] when '/queries' # Test type 3: Multiple database queries - ['application/json', JSON.fast_generate(queries(env))] + [JSON_TYPE, JSON.fast_generate(queries(env))] when '/fortunes' # Test type 4: Fortunes - ['text/html; charset=utf-8', fortunes] + [HTML_TYPE, fortunes] when '/updates' # Test type 5: Database updates - ['application/json', JSON.fast_generate(updates(env))] + [JSON_TYPE, JSON.fast_generate(updates(env))] when '/plaintext' # Test type 6: Plaintext - ['text/plain', 'Hello, World!'] + [PLAINTEXT_TYPE, 'Hello, World!'] end [ 200, DEFAULT_HEADERS.merge( - 'Content-Type'=>content_type, - 'Date'=>Time.now.httpdate + CONTENT_TYPE => content_type, + DATE_HEADER => Time.now.httpdate ), body ] From 0c76d281ff37b4b8fdf7178497cfe48c30789a50 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 6 May 2024 20:16:55 +0200 Subject: [PATCH 0522/1766] [ruby/roda] Use constants for HTTP headers (#8956) Constants improve performance as these string don't need to be allocated again after each request. --- frameworks/Ruby/roda-sequel/boot.rb | 7 +++++++ frameworks/Ruby/roda-sequel/hello_world.rb | 14 ++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index 661892b823f..eafc7bd7932 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -26,6 +26,13 @@ Bundler.require(:default) # Load core modules +CONTENT_TYPE = 'Content-Type' +JSON_TYPE = 'application/json' +HTML_TYPE = 'text/html; charset=utf-8' +PLAINTEXT_TYPE = 'text/plain' +DATE_HEADER = 'Date' +SERVER_HEADER = 'Server' + def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 2ea46ac6583..abd0d5b1487 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -16,23 +16,24 @@ def rand1 end route do |r| - response["Date"] = Time.now.httpdate - response["Server"] = SERVER_STRING if SERVER_STRING - #default content type - response["Content-Type"] = "application/json" + response[DATE_HEADER] = Time.now.httpdate + response[SERVER_HEADER] = SERVER_STRING if SERVER_STRING # Test type 1: JSON serialization r.is "json" do + response[CONTENT_TYPE] = JSON_TYPE { message: "Hello, World!" }.to_json end # Test type 2: Single database query r.is "db" do + response[CONTENT_TYPE] = JSON_TYPE World.with_pk(rand1).values.to_json end # Test type 3: Multiple database queries r.is "queries" do + response[CONTENT_TYPE] = JSON_TYPE worlds = DB.synchronize do ALL_IDS.sample(bounded_queries).map do |id| @@ -44,7 +45,7 @@ def rand1 # Test type 4: Fortunes r.is "fortunes" do - response["Content-Type"] = "text/html; charset=utf-8" + response[CONTENT_TYPE] = HTML_TYPE @fortunes = Fortune.all @fortunes << Fortune.new( id: 0, @@ -56,6 +57,7 @@ def rand1 # Test type 5: Database updates r.is "updates" do + response[CONTENT_TYPE] = JSON_TYPE worlds = DB.synchronize do ALL_IDS.sample(bounded_queries).map do |id| @@ -71,7 +73,7 @@ def rand1 # Test type 6: Plaintext r.is "plaintext" do - response["Content-Type"] = "text/plain" + response[CONTENT_TYPE] = PLAINTEXT_TYPE "Hello, World!" end end From 87badce8acc2a5c822b6dc0521b16a7d9763c163 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Mon, 6 May 2024 20:18:24 +0200 Subject: [PATCH 0523/1766] [Python] Bump Granian to 1.3 (#8954) --- frameworks/Python/granian/requirements.txt | 6 +++--- frameworks/Python/granian/run.py | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index 68519dc8ae7..c56773f21ab 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 +asyncpg==0.29.0 +granian>=1.3.1,<1.4.0 jinja2==3.1.3 -orjson==3.9.10 +orjson==3.10.2 diff --git a/frameworks/Python/granian/run.py b/frameworks/Python/granian/run.py index a81600ef9cd..82e785e5406 100644 --- a/frameworks/Python/granian/run.py +++ b/frameworks/Python/granian/run.py @@ -8,7 +8,9 @@ interface = sys.argv[1] threading_mode = sys.argv[2] workers = multiprocessing.cpu_count() - threads = 2 if threading_mode == "runtime" else 1 + if threading_mode == "workers": + workers = round(workers / 2) + threads = 1 Granian( f"app_{interface}:main", From a7846fedd4b139438d37e3f31f6787822959234e Mon Sep 17 00:00:00 2001 From: Imam Fahrur Rofi Date: Tue, 7 May 2024 01:19:07 +0700 Subject: [PATCH 0524/1766] =?UTF-8?q?[=C2=B5WebSockets.js]=20Add=20databas?= =?UTF-8?q?e=20MySQL=20(#8952)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [µWebSockets.js] add mariadb * [µWebSockets.js] update dependencies and add mysql * [µWebSockets.js] update README.md --- .../JavaScript/uwebsockets.js/README.md | 5 +- .../uwebsockets.js/benchmark_config.json | 21 +++++ .../uwebsockets.js/package-lock.json | 79 +++++++++++++++++-- .../JavaScript/uwebsockets.js/package.json | 7 +- .../uwebsockets.js/src/database/mysql.js | 16 ++++ .../uwebsockets.js-mysql.dockerfile | 12 +++ 6 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 frameworks/JavaScript/uwebsockets.js/src/database/mysql.js create mode 100644 frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile diff --git a/frameworks/JavaScript/uwebsockets.js/README.md b/frameworks/JavaScript/uwebsockets.js/README.md index e8f8ad1162a..73fc530d673 100644 --- a/frameworks/JavaScript/uwebsockets.js/README.md +++ b/frameworks/JavaScript/uwebsockets.js/README.md @@ -10,12 +10,14 @@ The tests were run with: - [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/) - [postgres](https://github.com/porsager/postgres/) +- [mariadb](https://github.com/mariadb-corporation/mariadb-connector-nodejs/) ## Database There are individual handlers for each DB approach. The logic for each of them are found here: -- [PostgreSQL](database/postgres.js) +- [PostgreSQL](src/database/postgres.js) +- [MySQL](src/database/mysql.js) There are **no database endpoints** or drivers attached by default. @@ -23,6 +25,7 @@ To initialize the application with one of these, run any _one_ of the following ```sh $ DATABASE=postgres npm start +$ DATABASE=mysql npm start ``` ## Test Endpoints diff --git a/frameworks/JavaScript/uwebsockets.js/benchmark_config.json b/frameworks/JavaScript/uwebsockets.js/benchmark_config.json index 9c45b755447..c19862c849e 100644 --- a/frameworks/JavaScript/uwebsockets.js/benchmark_config.json +++ b/frameworks/JavaScript/uwebsockets.js/benchmark_config.json @@ -41,6 +41,27 @@ "update_url": "/updates?queries=", "versus": "nodejs", "webserver": "None" + }, + "mysql": { + "approach": "Realistic", + "classification": "Platform", + "database": "MySQL", + "database_os": "Linux", + "db_url": "/db", + "display_name": "uWebSockets.js", + "flavor": "NodeJS", + "fortune_url": "/fortunes", + "framework": "uWebSockets.js", + "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/uwebsockets.js/package-lock.json b/frameworks/JavaScript/uwebsockets.js/package-lock.json index 6e9b94da9da..275f2f63b2e 100644 --- a/frameworks/JavaScript/uwebsockets.js/package-lock.json +++ b/frameworks/JavaScript/uwebsockets.js/package-lock.json @@ -9,25 +9,94 @@ "version": "0.0.1", "license": "MIT", "dependencies": { - "postgres": "^3.4.0", + "mariadb": "^3.3.0", + "postgres": "^3.4.4", "slow-json-stringify": "^2.0.1", - "uWebSockets.js": "uNetworking/uWebSockets.js#v20.32.0" + "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/mariadb": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.0.tgz", + "integrity": "sha512-sAL4bJgbfCAtXcE8bXI+NAMzVaPNkIU8hRZUXYfgNFoWB9U57G3XQiMeCx/A6IrS6y7kGwBLylrwgsZQ8kUYlw==", + "dependencies": { + "@types/geojson": "^7946.0.14", + "@types/node": "^20.11.17", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.2.0" + }, + "engines": { + "node": ">= 14" } }, "node_modules/postgres": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.0.tgz", - "integrity": "sha512-d7UtSoCg4hUtzxM9aRi3J8BrM6t0h4bQmgAHG96cDCNpP9CnnWQRdRl7WWNvKs0oOaQU2InGoOi1jETmdZK02g==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.4.tgz", + "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==", + "engines": { + "node": ">=12" + }, "funding": { "type": "individual", "url": "https://github.com/sponsors/porsager" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/slow-json-stringify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/slow-json-stringify/-/slow-json-stringify-2.0.1.tgz", "integrity": "sha512-jqyzIqTaSkRGcWdWqjmOLKHZgOGUT71ZCTsvQu1xGu9Mqaod7O26y5FJJEmaUQhaTWh0bkXv2qqN0i+EQsD1jQ==" }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/uWebSockets.js": { "version": "20.31.0", "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#809b99d2d7d12e2cbf89b7135041e9b41ff84084" diff --git a/frameworks/JavaScript/uwebsockets.js/package.json b/frameworks/JavaScript/uwebsockets.js/package.json index 05ac667ab57..c64742e442d 100644 --- a/frameworks/JavaScript/uwebsockets.js/package.json +++ b/frameworks/JavaScript/uwebsockets.js/package.json @@ -1,8 +1,9 @@ { "dependencies": { - "postgres": "^3.4.0", - "uWebSockets.js": "uNetworking/uWebSockets.js#v20.32.0", - "slow-json-stringify": "^2.0.1" + "mariadb": "^3.3.0", + "postgres": "^3.4.4", + "slow-json-stringify": "^2.0.1", + "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0" }, "license": "MIT", "main": "src/server.js", diff --git a/frameworks/JavaScript/uwebsockets.js/src/database/mysql.js b/frameworks/JavaScript/uwebsockets.js/src/database/mysql.js new file mode 100644 index 00000000000..a627a74d132 --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/src/database/mysql.js @@ -0,0 +1,16 @@ +import { createPool } from "mariadb"; +import os from "node:os"; + +const pool = createPool({ + host: "tfb-database", + user: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", + connectionLimit: os.availableParallelism() +}); + +export const fortunes = async () => await pool.execute("SELECT id, message FROM fortune"); + +export const find = async (id) => await pool.execute("SELECT id, randomnumber FROM world WHERE id = ?", [id]).then((arr) => arr[0]); + +export const bulkUpdate = async (worlds) => await Promise.all(worlds.map(world => pool.execute("UPDATE world SET randomnumber = ? WHERE id = ?", [world.randomNumber, world.id]))); diff --git a/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile new file mode 100644 index 00000000000..8533d8b9a61 --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile @@ -0,0 +1,12 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production +ENV DATABASE mysql + +EXPOSE 8080 + +CMD ["npm", "start"] From c954e784438f94a3088c87e3a1b878a3c7cdde0a Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Mon, 6 May 2024 21:20:07 +0300 Subject: [PATCH 0525/1766] [mORMot] - upgrade to 2.2.7414 (#8949) - added /cached_query implementation for raw server - increased threads count for async server cpuCount * 2 -> cpuCount * 4 Co-authored-by: pavel.mash --- .../Pascal/mormot/benchmark_config.json | 1 + frameworks/Pascal/mormot/setup_and_build.sh | 2 +- frameworks/Pascal/mormot/src/raw.pas | 129 +++++++++++------- 3 files changed, 80 insertions(+), 52 deletions(-) diff --git a/frameworks/Pascal/mormot/benchmark_config.json b/frameworks/Pascal/mormot/benchmark_config.json index 10bbf278270..4a7322cac5f 100644 --- a/frameworks/Pascal/mormot/benchmark_config.json +++ b/frameworks/Pascal/mormot/benchmark_config.json @@ -31,6 +31,7 @@ "dockerfile": "mormot.dockerfile", "db_url": "/rawdb", "query_url": "/rawqueries?queries=", + "cached_query_url": "/rawcached?count=", "fortune_url": "/rawfortunes", "update_url": "/rawupdates?queries=", "port": 8080, diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 615cd6b302e..7494c84747a 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/7dc50900266f07454fe60b60e4a2755ce445ddeb +URL=https://github.com/synopse/mORMot2/tarball/527b3fb11cb4dad5f2c03ace293b550f85504420 #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 93d4fc1091f..27ec81b92f7 100644 --- a/frameworks/Pascal/mormot/src/raw.pas +++ b/frameworks/Pascal/mormot/src/raw.pas @@ -54,7 +54,7 @@ end; TWorlds = array of TWorldRec; TFortune = packed record - id: integer; + id: PtrUInt; message: PUtf8Char; end; TFortunes = array of TFortune; @@ -86,6 +86,7 @@ TRawAsyncServer = class(TSynPersistent) fStore: TRestServerDB; fTemplate: TSynMustache; fCachedWorldsTable: POrmCacheTable; + fRawCache: TOrmWorlds; fDbPool: TSqlDBPostgresConnectionProperties; procedure OnAsyncDb(Statement: TSqlDBPostgresAsyncStatement; Context: TObject); procedure OnAsyncFortunes(Statement: TSqlDBPostgresAsyncStatement; Context: TObject); @@ -107,6 +108,7 @@ TRawAsyncServer = class(TSynPersistent) function updates(ctxt: THttpServerRequest): cardinal; function rawdb(ctxt: THttpServerRequest): cardinal; function rawqueries(ctxt: THttpServerRequest): cardinal; + function rawcached(ctxt: THttpServerRequest): cardinal; function rawfortunes(ctxt: THttpServerRequest): cardinal; function rawupdates(ctxt: THttpServerRequest): cardinal; // asynchronous PostgreSQL pipelined DB access @@ -144,13 +146,13 @@ TRawAsyncServer = class(TSynPersistent) ''; -function ComputeRandomWorld: integer; inline; +function ComputeRandomWorld(gen: PLecuyer): integer; inline; begin - result := Random32(WORLD_COUNT) + 1; + result := gen^.Next(WORLD_COUNT) + 1; end; function GetQueriesParamValue(ctxt: THttpServerRequest; - const search: RawUtf8 = 'QUERIES='): cardinal; + const search: RawUtf8 = 'QUERIES='): cardinal; inline; begin if not ctxt.UrlParam(search, result) or (result = 0) then @@ -190,6 +192,7 @@ constructor TRawAsyncServer.Create( if fStore.Server.Cache.SetCache(TOrmCachedWorld) then fStore.Server.Cache.FillFromQuery(TOrmCachedWorld, '', []); fCachedWorldsTable := fStore.Orm.Cache.Table(TOrmCachedWorld); + fStore.Orm.RetrieveListObjArray(fRawCache, TOrmCachedWorld, 'order by id', []); // initialize the mustache template for /fortunes fTemplate := TSynMustache.Parse(FORTUNES_TPL); // setup the HTTP server @@ -222,22 +225,26 @@ destructor TRawAsyncServer.Destroy; fHttpServer.Free; fStore.Free; fModel.Free; - fDBPool.free; + fDBPool.Free; + ObjArrayClear(fRawCache); inherited Destroy; end; // query DB world table for /rawqueries and /rawupdates endpoints -function TRawAsyncServer.GetRawRandomWorlds(cnt: PtrInt; out res: TWorlds): boolean; +function TRawAsyncServer.GetRawRandomWorlds(cnt: PtrInt; + out res: TWorlds): boolean; var conn: TSqlDBConnection; stmt: ISqlDBStatement; pConn: TSqlDBPostgresConnection absolute conn; pStmt: TSqlDBPostgresStatement; + gen: PLecuyer; i: PtrInt; begin result := false; SetLength(res{%H-}, cnt); + gen := Lecuyer; conn := fDbPool.ThreadSafeConnection; // specific code to use PostgresSQL pipelining mode // see test_nosync in @@ -247,7 +254,7 @@ function TRawAsyncServer.GetRawRandomWorlds(cnt: PtrInt; out res: TWorlds): bool pStmt := TSqlDBPostgresStatement(stmt.Instance); for i := 0 to cnt - 1 do begin - pStmt.Bind(1, ComputeRandomWorld); + pStmt.Bind(1, ComputeRandomWorld(gen)); pStmt.SendPipelinePrepared; pConn.PipelineSync; end; @@ -323,7 +330,7 @@ function TRawAsyncServer.db(ctxt: THttpServerRequest): cardinal; var w: TOrmWorld; begin - w := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld); + w := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld(Lecuyer)); try ctxt.SetOutJson(w); result := HTTP_SUCCESS; @@ -336,10 +343,12 @@ function TRawAsyncServer.queries(ctxt: THttpServerRequest): cardinal; var i: PtrInt; res: TOrmWorlds; + gen: PLecuyer; begin SetLength(res, GetQueriesParamValue(ctxt, 'QUERIES=')); + gen := Lecuyer; for i := 0 to length(res) - 1 do - res[i] := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld); + res[i] := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld(gen)); ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); ObjArrayClear(res); result := HTTP_SUCCESS; @@ -349,10 +358,12 @@ function TRawAsyncServer.cached_queries(ctxt: THttpServerRequest): cardinal; var i: PtrInt; res: TOrmWorlds; + gen: PLecuyer; begin SetLength(res, GetQueriesParamValue(ctxt, 'COUNT=')); + gen := Lecuyer; for i := 0 to length(res) - 1 do - res[i] := fCachedWorldsTable.Get(ComputeRandomWorld); + res[i] := fCachedWorldsTable.Get(ComputeRandomWorld(gen)); ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); result := HTTP_SUCCESS; end; @@ -390,19 +401,21 @@ function TRawAsyncServer.updates(ctxt: THttpServerRequest): cardinal; res: TOrmWorlds; w: TOrmWorld; b: TRestBatch; + gen: PLecuyer; begin result := HTTP_SERVERERROR; SetLength(res, GetQueriesParamValue(ctxt)); b := TRestBatch.Create(fStore.ORM, TOrmWorld, {transrows=}0, [boExtendedJson, boNoModelEncoding, boPutNoCacheFlush]); try + gen := Lecuyer; for i := 0 to length(res) - 1 do begin w := TOrmWorld.Create; res[i] := w; - if not fStore.Orm.Retrieve(ComputeRandomWorld, w) then + if not fStore.Orm.Retrieve(ComputeRandomWorld(gen), w) then exit; - w.RandomNumber := ComputeRandomWorld; + w.RandomNumber := ComputeRandomWorld(gen); b.Update(w); end; result := b.Send; @@ -422,7 +435,7 @@ function TRawAsyncServer.rawdb(ctxt: THttpServerRequest): cardinal; result := HTTP_SERVERERROR; conn := fDbPool.ThreadSafeConnection; stmt := conn.NewStatementPrepared(WORLD_READ_SQL, true, true); - stmt.Bind(1, ComputeRandomWorld); + stmt.Bind(1, ComputeRandomWorld(Lecuyer)); stmt.ExecutePrepared; if stmt.Step then begin @@ -444,6 +457,20 @@ function TRawAsyncServer.rawqueries(ctxt: THttpServerRequest): cardinal; result := HTTP_SUCCESS; end; +function TRawAsyncServer.rawcached(ctxt: THttpServerRequest): cardinal; +var + i: PtrInt; + res: TOrmWorlds; + gen: PLecuyer; +begin + SetLength(res, GetQueriesParamValue(ctxt, 'COUNT=')); + gen := Lecuyer; + for i := 0 to length(res) - 1 do + res[i] := fRawCache[ComputeRandomWorld(gen) - 1]; + ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); + result := HTTP_SUCCESS; +end; + function TRawAsyncServer.rawfortunes(ctxt: THttpServerRequest): cardinal; var conn: TSqlDBConnection; @@ -476,10 +503,7 @@ function ComputeUpdateSql(cnt: integer): RawUtf8; try W.AddShort('UPDATE world SET randomNumber = v.randomNumber FROM (VALUES'); for i := 1 to cnt do - begin - W.AddShort('(?::integer, ?::integer)'); - W.Add(','); - end; + W.AddShort('(?::integer, ?::integer),'); W.CancelLastComma; W.AddShort(' order by 1) AS v (id, randomNumber) WHERE world.id = v.id'); W.SetText(LastComputeUpdateSql); @@ -496,6 +520,7 @@ function TRawAsyncServer.rawupdates(ctxt: THttpServerRequest): cardinal; cnt, i: PtrInt; res: TWorlds; ids, nums: TInt64DynArray; + gen: PLecuyer; conn: TSqlDBConnection; stmt: ISqlDBStatement; begin @@ -505,8 +530,9 @@ function TRawAsyncServer.rawupdates(ctxt: THttpServerRequest): cardinal; if not getRawRandomWorlds(cnt, res) then exit; // generate new randoms + gen := Lecuyer; for i := 0 to cnt - 1 do - res[i].randomNumber := ComputeRandomWorld; + res[i].randomNumber := ComputeRandomWorld(gen); if cnt > 20 then begin // fill parameters arrays for update with nested select (PostgreSQL only) @@ -546,7 +572,7 @@ function TRawAsyncServer.asyncdb(ctxt: THttpServerRequest): cardinal; begin with fDbPool.Async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT) do try - Bind(1, ComputeRandomWorld); + Bind(1, ComputeRandomWorld(Lecuyer)); ExecuteAsync(ctxt, OnAsyncDb); finally UnLock; @@ -591,8 +617,9 @@ TAsyncWorld = class res: TWorlds; count, current: integer; update: TSqlDBPostgresAsyncStatement; // prepared before any callback - function Queries(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal; - function Updates(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal; + async: TSqlDBPostgresAsync; + function Queries(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal; + function Updates(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal; procedure DoUpdates; procedure OnQueries(Statement: TSqlDBPostgresAsyncStatement; Context: TObject); procedure OnRes({%H-}Statement: TSqlDBPostgresAsyncStatement; Context: TObject); @@ -600,48 +627,51 @@ TAsyncWorld = class function TRawAsyncServer.asyncqueries(ctxt: THttpServerRequest): cardinal; begin - result := TAsyncWorld.Create.Queries(fDBPool.Async, ctxt); + result := TAsyncWorld.Create.Queries(self, ctxt); end; function TRawAsyncServer.asyncupdates(ctxt: THttpServerRequest): cardinal; begin - result := TAsyncWorld.Create.Updates(fDBPool.Async, ctxt); + result := TAsyncWorld.Create.Updates(self, ctxt); end; { TAsyncWorld } -function TAsyncWorld.Queries(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal; +function TAsyncWorld.Queries(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal; var n: integer; - opt: TSqlDBPostgresAsyncStatementOptions; // for modified libpq + opt: TSqlDBPostgresAsyncStatementOptions; // forced options for modified libpq + gen: PLecuyer; + select: TSqlDBPostgresAsyncStatement; begin request := ctxt; + if async = nil then + async := server.fDbPool.Async; if count = 0 then count := getQueriesParamValue(ctxt); SetLength(res, count); // count is > 0 - with async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT) do - try - opt := AsyncOptions - [asoForceConnectionFlush]; - n := count; - repeat - dec(n); - Bind(1, ComputeRandomWorld); - if n = 0 then // last item should include asoForceConnectionFlush (if set) - opt := AsyncOptions; - ExecuteAsync(ctxt, OnQueries, @opt); - until n = 0; - finally - UnLock; - end; + select := async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT); + opt := ASYNC_OPT - [asoForceConnectionFlush]; + n := count; + gen := Lecuyer; + repeat + dec(n); + select.Bind(1, ComputeRandomWorld(gen)); + if n = 0 then // last item should include asoForceConnectionFlush (if set) + opt := ASYNC_OPT; + select.ExecuteAsync(ctxt, OnQueries, @opt); + until n = 0; + select.UnLock; result := ctxt.SetAsyncResponse; end; -function TAsyncWorld.Updates(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal; +function TAsyncWorld.Updates(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal; begin + async := server.fDbPool.Async; count := getQueriesParamValue(ctxt); update := async.Prepare(WORLD_UPDATE_SQLN, false, ASYNC_OPT); - result := Queries(async, ctxt); + result := Queries(server, ctxt); end; procedure TAsyncWorld.OnQueries(Statement: TSqlDBPostgresAsyncStatement; @@ -666,9 +696,11 @@ procedure TAsyncWorld.DoUpdates; var i: PtrInt; params: TIntegerDynArray; + gen: PLecuyer; begin + gen := Lecuyer; for i := 0 to count - 1 do - res[i].randomNumber := ComputeRandomWorld; + res[i].randomNumber := ComputeRandomWorld(gen); SetLength(params, count); for i := 0 to count - 1 do params[i] := res[i].id; @@ -708,8 +740,8 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; // register some RTTI for records JSON serialization Rtti.RegisterFromText([ TypeInfo(TMessageRec), 'message:PUtf8Char', - TypeInfo(TWorldRec), 'id,randomNumber:integer', - TypeInfo(TFortune), 'id:integer message:PUtf8Char']); + TypeInfo(TWorldRec), 'id,randomNumber:cardinal', + TypeInfo(TFortune), 'id:PtrUInt message:PUtf8Char']); // compute default execution context from HW information cpuCount := CurrentCpuSet(cpuMask); // may run from a "taskset" command @@ -731,7 +763,7 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; begin // asynchronus test with single listener socket and no CPU pinning servers := 1; - threads := cpuCount * 2; + threads := cpuCount * 4; pinServers2Cores := false; end; end @@ -753,12 +785,7 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; pinServers2Cores := false; // no option would keep the default boolean Get(['s', 'servers'], servers, '#count of servers (listener sockets)', servers); Get(['t', 'threads'], threads, 'per-server thread pool #size', threads); - if Option(['?', 'help'], 'display this message') then - begin - ConsoleWrite(FullDescription); - exit; - end; - if ConsoleWriteUnknown then + if ConsoleHelpFailed('TFB Server using mORMot 2') then exit; end; From a473c9a4a83c0b5c660bd6af953777c08dce904f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=ED=98=81?= Date: Tue, 7 May 2024 03:20:19 +0900 Subject: [PATCH 0526/1766] Upgrade to Node.js 20.12.2 for NestJS (#8947) * Upgrade to Node.js 20.12.2 for NestJS * Fix typeorm for NestJS --- frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile | 4 ++-- frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile | 4 ++-- frameworks/TypeScript/nest/nestjs-fastify.dockerfile | 4 ++-- frameworks/TypeScript/nest/nestjs-mongo.dockerfile | 4 ++-- frameworks/TypeScript/nest/nestjs-mysql.dockerfile | 4 ++-- frameworks/TypeScript/nest/nestjs.dockerfile | 4 ++-- frameworks/TypeScript/nest/package.json | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile b/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile index 687e3662d7d..c7d40f6c6ab 100644 --- a/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ @@ -10,4 +10,4 @@ ENV DATABASE_CONFIGURATION_PROFILE mongodb ENV FRAMEWORK fastify EXPOSE 8080 -CMD ["node", "dist/main"] \ No newline at end of file +CMD ["node", "dist/main"] diff --git a/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile b/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile index 55f3872b71d..d5e7f4a0165 100644 --- a/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ @@ -10,4 +10,4 @@ ENV DATABASE_CONFIGURATION_PROFILE mysql ENV FRAMEWORK fastify EXPOSE 8080 -CMD ["node", "dist/main"] \ No newline at end of file +CMD ["node", "dist/main"] diff --git a/frameworks/TypeScript/nest/nestjs-fastify.dockerfile b/frameworks/TypeScript/nest/nestjs-fastify.dockerfile index 6eb139b3d2c..1b3dc806754 100644 --- a/frameworks/TypeScript/nest/nestjs-fastify.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-fastify.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ @@ -10,4 +10,4 @@ ENV DATABASE_CONFIGURATION_PROFILE postgres ENV FRAMEWORK fastify EXPOSE 8080 -CMD ["node", "dist/main"] \ No newline at end of file +CMD ["node", "dist/main"] diff --git a/frameworks/TypeScript/nest/nestjs-mongo.dockerfile b/frameworks/TypeScript/nest/nestjs-mongo.dockerfile index 7b2e842f411..09fab943ed3 100644 --- a/frameworks/TypeScript/nest/nestjs-mongo.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ @@ -10,4 +10,4 @@ ENV DATABASE_CONFIGURATION_PROFILE mongodb ENV FRAMEWORK express EXPOSE 8080 -CMD ["node", "dist/main"] \ No newline at end of file +CMD ["node", "dist/main"] diff --git a/frameworks/TypeScript/nest/nestjs-mysql.dockerfile b/frameworks/TypeScript/nest/nestjs-mysql.dockerfile index 42865fe49c9..80147df547d 100644 --- a/frameworks/TypeScript/nest/nestjs-mysql.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ @@ -10,4 +10,4 @@ ENV DATABASE_CONFIGURATION_PROFILE mysql ENV FRAMEWORK express EXPOSE 8080 -CMD ["node", "dist/main"] \ No newline at end of file +CMD ["node", "dist/main"] diff --git a/frameworks/TypeScript/nest/nestjs.dockerfile b/frameworks/TypeScript/nest/nestjs.dockerfile index 8c97367cc10..d2382bf8999 100644 --- a/frameworks/TypeScript/nest/nestjs.dockerfile +++ b/frameworks/TypeScript/nest/nestjs.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ @@ -10,4 +10,4 @@ ENV DATABASE_CONFIGURATION_PROFILE postgres ENV FRAMEWORK express EXPOSE 8080 -CMD ["node", "dist/main"] \ No newline at end of file +CMD ["node", "dist/main"] diff --git a/frameworks/TypeScript/nest/package.json b/frameworks/TypeScript/nest/package.json index 09416024d1b..219569e19e4 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.3.0" + "typeorm": "0.2.29" }, "devDependencies": { "@nestjs/cli": "7.5.3", From 928006ddcfc0ca80539db0ec52f4ac87f9069089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=ED=98=81?= Date: Tue, 7 May 2024 03:20:24 +0900 Subject: [PATCH 0527/1766] Upgrade to Node.js 20.12.2 for Express (#8946) * Upgrade to Node.js 20.12.2 for Express * Upgrade to Mongoose 8.3.2 for Express --- frameworks/JavaScript/express/express-mongodb.dockerfile | 2 +- frameworks/JavaScript/express/express-mysql.dockerfile | 2 +- frameworks/JavaScript/express/express-postgres.dockerfile | 2 +- frameworks/JavaScript/express/express.dockerfile | 2 +- frameworks/JavaScript/express/mongodb-app.js | 6 +----- frameworks/JavaScript/express/package.json | 2 +- 6 files changed, 6 insertions(+), 10 deletions(-) diff --git a/frameworks/JavaScript/express/express-mongodb.dockerfile b/frameworks/JavaScript/express/express-mongodb.dockerfile index 6eea6502e96..b9f22ed1162 100644 --- a/frameworks/JavaScript/express/express-mongodb.dockerfile +++ b/frameworks/JavaScript/express/express-mongodb.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express-mysql.dockerfile b/frameworks/JavaScript/express/express-mysql.dockerfile index c0c727e57f2..c34740fb009 100644 --- a/frameworks/JavaScript/express/express-mysql.dockerfile +++ b/frameworks/JavaScript/express/express-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express-postgres.dockerfile b/frameworks/JavaScript/express/express-postgres.dockerfile index 3450df4395e..7f6367401fc 100644 --- a/frameworks/JavaScript/express/express-postgres.dockerfile +++ b/frameworks/JavaScript/express/express-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express.dockerfile b/frameworks/JavaScript/express/express.dockerfile index 6e463a2efd6..c78d8648283 100644 --- a/frameworks/JavaScript/express/express.dockerfile +++ b/frameworks/JavaScript/express/express.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.12.2-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/mongodb-app.js b/frameworks/JavaScript/express/mongodb-app.js index ad8bb0bfac4..534fddc63f5 100644 --- a/frameworks/JavaScript/express/mongodb-app.js +++ b/frameworks/JavaScript/express/mongodb-app.js @@ -6,11 +6,7 @@ const cluster = require('cluster'); const numCPUs = require('os').cpus().length; const express = require('express'); const mongoose = require('mongoose'); -const connection = mongoose.createConnection('mongodb://tfb-database/hello_world',{ - useNewUrlParser: true, - useUnifiedTopology: true, - useFindAndModify: false, -}); +const connection = mongoose.createConnection('mongodb://tfb-database/hello_world'); // Middleware const bodyParser = require('body-parser'); diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index da0b4b9f4a7..0fe00038a27 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -7,7 +7,7 @@ "dateformat": "3.0.3", "escape-html": "1.0.3", "express": "4.18.2", - "mongoose": "5.13.20", + "mongoose": "8.3.2", "mysql2": "3.9.7", "pg": "8.5.0", "pg-promise": "10.7.3", From 3f1ea365058643c0170435af15e5aeae76a5b231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=ED=98=81?= Date: Tue, 7 May 2024 03:20:29 +0900 Subject: [PATCH 0528/1766] Upgrade to Node.js 20.12.2 for Fastify (#8945) * Upgrade to Node.js 20.12.2 for Fastify * Fix mongodb for Fastify --- frameworks/JavaScript/fastify/db/mongo.js | 8 +------- frameworks/JavaScript/fastify/fastify-mysql.dockerfile | 2 +- frameworks/JavaScript/fastify/fastify-postgres.dockerfile | 2 +- frameworks/JavaScript/fastify/fastify.dockerfile | 2 +- frameworks/JavaScript/fastify/package.json | 2 +- 5 files changed, 5 insertions(+), 11 deletions(-) diff --git a/frameworks/JavaScript/fastify/db/mongo.js b/frameworks/JavaScript/fastify/db/mongo.js index ca4200ad550..666dd49d412 100644 --- a/frameworks/JavaScript/fastify/db/mongo.js +++ b/frameworks/JavaScript/fastify/db/mongo.js @@ -7,13 +7,7 @@ let client; async function getCollection(name) { if (!client) { - client = await new MongoClient( - mongoUrl, - { - useNewUrlParser: true, - useUnifiedTopology: true - } - ).connect(); + client = await new MongoClient(mongoUrl).connect(); } const db = client.db(dbName); diff --git a/frameworks/JavaScript/fastify/fastify-mysql.dockerfile b/frameworks/JavaScript/fastify/fastify-mysql.dockerfile index dce82ff1a90..a77917aceb0 100644 --- a/frameworks/JavaScript/fastify/fastify-mysql.dockerfile +++ b/frameworks/JavaScript/fastify/fastify-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-alpine +FROM node:20.12.2-alpine COPY ./ ./ diff --git a/frameworks/JavaScript/fastify/fastify-postgres.dockerfile b/frameworks/JavaScript/fastify/fastify-postgres.dockerfile index 65bf195566d..069b66c250a 100644 --- a/frameworks/JavaScript/fastify/fastify-postgres.dockerfile +++ b/frameworks/JavaScript/fastify/fastify-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-alpine +FROM node:20.12.2-alpine COPY ./ ./ diff --git a/frameworks/JavaScript/fastify/fastify.dockerfile b/frameworks/JavaScript/fastify/fastify.dockerfile index fdd8dcf4946..48a7611a848 100644 --- a/frameworks/JavaScript/fastify/fastify.dockerfile +++ b/frameworks/JavaScript/fastify/fastify.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-alpine +FROM node:20.12.2-alpine COPY ./ ./ diff --git a/frameworks/JavaScript/fastify/package.json b/frameworks/JavaScript/fastify/package.json index c30f31ed8cc..c1a261a4328 100644 --- a/frameworks/JavaScript/fastify/package.json +++ b/frameworks/JavaScript/fastify/package.json @@ -9,7 +9,7 @@ "fastify": "4.13.0", "handlebars": "4.7.6", "knex": "2.4.2", - "mongodb": "3.5.9", + "mongodb": "6.5.0", "mysql2": "3.9.7", "pg": "8.5.1" } From a565bcb2c2e6fb63462b606657bade5841af041d Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 6 May 2024 20:20:41 +0200 Subject: [PATCH 0529/1766] [php] Add Laravel Octane with Frankenphp (#8944) * [php] Add Laravel Octnae with Frankenphp * Disable php extensions build output * Disable X-powered-by header and use optimized php.ini --- frameworks/PHP/laravel/benchmark_config.json | 23 +++++++++++++++ frameworks/PHP/laravel/config/app.php | 2 +- .../laravel-octane-frankenphp.dockerfile | 29 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile diff --git a/frameworks/PHP/laravel/benchmark_config.json b/frameworks/PHP/laravel/benchmark_config.json index 63c99532f2a..588dab1e17f 100644 --- a/frameworks/PHP/laravel/benchmark_config.json +++ b/frameworks/PHP/laravel/benchmark_config.json @@ -115,6 +115,29 @@ "display_name": "laravel-workerman", "notes": "", "versus": "php" + }, + "octane-frankenphp": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "fortune_url": "/fortunes", + "update_url": "/updates/", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "laravel", + "language": "PHP", + "flavor": "None", + "orm": "Full", + "platform": "Frankenphp", + "webserver": "caddy", + "os": "Linux", + "database_os": "Linux", + "display_name": "laravel-octane [frankenphp]", + "notes": "", + "versus": "php" } }] } \ No newline at end of file diff --git a/frameworks/PHP/laravel/config/app.php b/frameworks/PHP/laravel/config/app.php index eed03bfef75..de8547f82e1 100644 --- a/frameworks/PHP/laravel/config/app.php +++ b/frameworks/PHP/laravel/config/app.php @@ -142,7 +142,7 @@ // Illuminate\Redis\RedisServiceProvider::class, // Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, // Illuminate\Session\SessionServiceProvider::class, - // Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, // Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, diff --git a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile new file mode 100644 index 00000000000..1829a4292f4 --- /dev/null +++ b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile @@ -0,0 +1,29 @@ +FROM dunglas/frankenphp + +RUN install-php-extensions \ + pcntl \ + pdo_mysql \ + intl \ + zip \ + opcache > /dev/null + +COPY . /app + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +RUN mkdir -p /app/bootstrap/cache /app/storage/logs /app/storage/framework/sessions /app/storage/framework/views /app/storage/framework/cache +RUN chmod -R 777 /app + +COPY deploy/conf/php.ini /usr/local/etc/php + +RUN composer require laravel/octane guzzlehttp/guzzle + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet + +RUN php artisan optimize + +RUN frankenphp -v + +EXPOSE 8080 + +ENTRYPOINT ["php", "artisan", "octane:frankenphp", "--port=8080"] From e68f504e27f8cf410dd9853da15c1f42f5a10c73 Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Mon, 6 May 2024 20:21:23 +0200 Subject: [PATCH 0530/1766] Upgrade to Inverno 1.10.0 (#8943) * 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 * Upgrade to Inverno 1.9.0 + make app resilient to DB connection loss * Upgrade to Inverno 1.10.0 + minor changes --- .../Java/inverno/inverno-postgres.dockerfile | 5 ++-- frameworks/Java/inverno/pom.xml | 8 ++--- .../benchmark/internal/Controller.java | 30 +++++++++---------- .../src/main/resources/configuration.cprops | 4 ++- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile index 6a3fcd9070f..737cb434013 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -7,6 +7,7 @@ RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 -# 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/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" + target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark \ + --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" \ + --com.techempower.inverno.benchmark.appConfiguration.boot.reactor_event_loop_group_size=$((`grep --count ^processor /proc/cpuinfo`)) diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index c056d047bbc..c91b31c2d37 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.9.0 + 1.10.0 com.techempower inverno-benchmark @@ -47,7 +47,7 @@ io.inverno.mod inverno-sql-vertx - + org.unbescape unbescape @@ -110,7 +110,7 @@ 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 + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 @@ -157,7 +157,7 @@ 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 + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java index 639ec561159..33c94a5c7b4 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java @@ -1,20 +1,11 @@ package com.techempower.inverno.benchmark.internal; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.techempower.inverno.benchmark.model.Fortune; import com.techempower.inverno.benchmark.model.Message; import com.techempower.inverno.benchmark.model.World; import com.techempower.inverno.benchmark.templates.FortunesTemplate; - import io.inverno.core.annotation.Bean; import io.inverno.core.annotation.Bean.Visibility; import io.inverno.core.annotation.Destroy; @@ -39,6 +30,13 @@ import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpHeaderValues; import io.netty.util.AsciiString; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -81,6 +79,8 @@ public void init() { this.dateEventLoopGroup.scheduleAtFixedRate(() -> { this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); }, 0, 1000, TimeUnit.MILLISECONDS); + + } @Destroy @@ -133,7 +133,7 @@ public void handle(Exchange exchange) throws HttpException { private static final ByteBuf STATIC_PLAINTEXT_BYTEBUF; static { - ByteBuf tmpBuf = Unpooled.directBuffer(STATIC_PLAINTEXT_LEN); + ByteBuf tmpBuf = Unpooled.buffer(STATIC_PLAINTEXT_LEN); tmpBuf.writeBytes(STATIC_PLAINTEXT); STATIC_PLAINTEXT_BYTEBUF = Unpooled.unreleasableBuffer(tmpBuf); } @@ -172,7 +172,7 @@ public void handle_json(Exchange exchange) throws HttpException ) .body() .raw() - .value(Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!"))))); + .value(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!")))); } catch (JsonProcessingException | IllegalStateException e) { throw new InternalServerErrorException("Error serializing message as JSON", e); @@ -196,7 +196,7 @@ public void handle_db(Exchange exchange) throws HttpException { DB_SELECT_WORLD, row -> { try { - return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1))))); + return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1)))); } catch (JsonProcessingException e) { throw new InternalServerErrorException(e); @@ -241,7 +241,7 @@ public void handle_queries(Exchange exchange) throws HttpExcept .collectList() .map(worlds -> { try { - return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); + return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)); } catch (JsonProcessingException e) { throw new InternalServerErrorException(e); @@ -278,7 +278,7 @@ public void handle_updates(Exchange exchange) throws HttpExcept ) .map(worlds -> { try { - return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds))); + return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)); } catch (JsonProcessingException e) { throw new InternalServerErrorException(e); @@ -290,7 +290,7 @@ public void handle_updates(Exchange exchange) throws HttpExcept private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8"); - private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer())); + private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.buffer()); public void handle_fortunes(Exchange exchange) throws HttpException { exchange.response() diff --git a/frameworks/Java/inverno/src/main/resources/configuration.cprops b/frameworks/Java/inverno/src/main/resources/configuration.cprops index df4680e124b..9fc9d6fddd0 100644 --- a/frameworks/Java/inverno/src/main/resources/configuration.cprops +++ b/frameworks/Java/inverno/src/main/resources/configuration.cprops @@ -6,7 +6,9 @@ com.techempower.inverno.benchmark.appConfiguration { http_server { tls_enabled = false server_port = 8080 - h2c_enabled = false + h2_enabled = false + http1x_validate_headers = false + ws_enabled = false } db_database = "hello_world" db_host = "tfb-database" From 29d5c7df2cd5792ef11edbc653095fcaf56b5c7e Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 6 May 2024 20:23:00 +0200 Subject: [PATCH 0531/1766] [php] Update all frameworks using event to v3.1.3 (#8941) * [php] Update all frameworks using event to v3.1.3 * Small change to rerun tests --- frameworks/PHP/amp/amp.dockerfile | 2 +- frameworks/PHP/comet/comet-mysql.dockerfile | 2 +- frameworks/PHP/comet/comet.dockerfile | 2 +- frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile | 2 +- frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile | 2 +- frameworks/PHP/kumbiaphp/server.php | 2 +- frameworks/PHP/laravel/laravel-workerman.dockerfile | 2 +- frameworks/PHP/leaf/leaf-workerman.dockerfile | 2 +- frameworks/PHP/lumen/lumen-workerman.dockerfile | 2 +- frameworks/PHP/mark/mark.dockerfile | 2 +- frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile | 2 +- frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile | 2 +- frameworks/PHP/php/php-workerman.dockerfile | 2 +- frameworks/PHP/slim/slim-workerman-pgsql.dockerfile | 2 +- frameworks/PHP/slim/slim-workerman.dockerfile | 2 +- frameworks/PHP/symfony/symfony-workerman.dockerfile | 2 +- frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile | 2 +- frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile | 2 +- frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile | 2 +- frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile | 2 +- frameworks/PHP/webman/webman.dockerfile | 2 +- frameworks/PHP/yii2/yii2-workerman.dockerfile | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/frameworks/PHP/amp/amp.dockerfile b/frameworks/PHP/amp/amp.dockerfile index 1c164b024cf..066337e6302 100644 --- a/frameworks/PHP/amp/amp.dockerfile +++ b/frameworks/PHP/amp/amp.dockerfile @@ -14,7 +14,7 @@ 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.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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini ADD ./ /amp WORKDIR /amp diff --git a/frameworks/PHP/comet/comet-mysql.dockerfile b/frameworks/PHP/comet/comet-mysql.dockerfile index 9d694c24d99..2adc4d70f81 100644 --- a/frameworks/PHP/comet/comet-mysql.dockerfile +++ b/frameworks/PHP/comet/comet-mysql.dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-xml php8.3-mysql php8.3-mbstring > /d 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.3 > /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/comet/comet.dockerfile b/frameworks/PHP/comet/comet.dockerfile index 545a4abcaba..b210108832e 100644 --- a/frameworks/PHP/comet/comet.dockerfile +++ b/frameworks/PHP/comet/comet.dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /d 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.3 > /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/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile index 47bb53f8086..6c17e29857b 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile @@ -11,7 +11,7 @@ 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.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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile index d5a8ffe7aac..541ff1fb00d 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -yqq > /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 > /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/kumbiaphp/server.php b/frameworks/PHP/kumbiaphp/server.php index 3ec60d615fa..2b3123173da 100644 --- a/frameworks/PHP/kumbiaphp/server.php +++ b/frameworks/PHP/kumbiaphp/server.php @@ -5,7 +5,7 @@ use Adapterman\Adapterman; use Workerman\Worker; -Adapterman::init(); +Adapterman::init(); $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; diff --git a/frameworks/PHP/laravel/laravel-workerman.dockerfile b/frameworks/PHP/laravel/laravel-workerman.dockerfile index 016c3d0d9a7..48cf4ee5e42 100644 --- a/frameworks/PHP/laravel/laravel-workerman.dockerfile +++ b/frameworks/PHP/laravel/laravel-workerman.dockerfile @@ -12,7 +12,7 @@ RUN apt-get install -yqq git unzip \ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer 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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini ADD ./ /laravel WORKDIR /laravel diff --git a/frameworks/PHP/leaf/leaf-workerman.dockerfile b/frameworks/PHP/leaf/leaf-workerman.dockerfile index 80f9248d07a..eaa11589d3a 100644 --- a/frameworks/PHP/leaf/leaf-workerman.dockerfile +++ b/frameworks/PHP/leaf/leaf-workerman.dockerfile @@ -12,7 +12,7 @@ RUN apt-get update -yqq > /dev/null && apt-get install -yqq git \ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer 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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/lumen/lumen-workerman.dockerfile b/frameworks/PHP/lumen/lumen-workerman.dockerfile index bc0f416c759..aabe520cdc8 100644 --- a/frameworks/PHP/lumen/lumen-workerman.dockerfile +++ b/frameworks/PHP/lumen/lumen-workerman.dockerfile @@ -12,7 +12,7 @@ RUN apt-get install -yqq nginx git unzip \ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer 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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini ADD ./ /lumen WORKDIR /lumen diff --git a/frameworks/PHP/mark/mark.dockerfile b/frameworks/PHP/mark/mark.dockerfile index 3b39a27ef56..1785231f315 100644 --- a/frameworks/PHP/mark/mark.dockerfile +++ b/frameworks/PHP/mark/mark.dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -yqq > /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.3 > /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/mixphp/mixphp-workerman-mysql.dockerfile b/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile index 0861a10948d..9ac2ffaf0a2 100644 --- a/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile @@ -8,7 +8,7 @@ RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essent 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.3/cli/conf.d/event.ini +RUN pecl install event-3.1.3 > /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/mixphp/mixphp-workerman-pgsql.dockerfile b/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile index f469165bf97..1f63e1fd91f 100644 --- a/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile @@ -8,7 +8,7 @@ RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essent 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.3/cli/conf.d/event.ini +RUN pecl install event-3.1.3 > /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/php/php-workerman.dockerfile b/frameworks/PHP/php/php-workerman.dockerfile index 6f392702778..bd257c3883c 100644 --- a/frameworks/PHP/php/php-workerman.dockerfile +++ b/frameworks/PHP/php/php-workerman.dockerfile @@ -10,7 +10,7 @@ RUN apt-get install -yqq git unzip \ php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null 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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/workerman/cli-php.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile index 4a40505c701..b1326f40cac 100644 --- a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile +++ b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile @@ -13,7 +13,7 @@ RUN apt-get install -yqq git \ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer 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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/slim/slim-workerman.dockerfile b/frameworks/PHP/slim/slim-workerman.dockerfile index fefb80f8106..c7029637156 100644 --- a/frameworks/PHP/slim/slim-workerman.dockerfile +++ b/frameworks/PHP/slim/slim-workerman.dockerfile @@ -12,7 +12,7 @@ RUN apt-get update -yqq > /dev/null && apt-get install -yqq git \ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer 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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/symfony/symfony-workerman.dockerfile b/frameworks/PHP/symfony/symfony-workerman.dockerfile index b306f90710d..136f9fcdb2d 100644 --- a/frameworks/PHP/symfony/symfony-workerman.dockerfile +++ b/frameworks/PHP/symfony/symfony-workerman.dockerfile @@ -12,7 +12,7 @@ RUN apt-get install -yqq git unzip \ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer 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 +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile index b8ed0a2df5c..f4834e90eb5 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -yqq > /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 > /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile index 12568a07af3..f27f630c898 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -yqq > /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 > /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile index 75b757a748d..da49301a7e2 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -yqq > /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 > /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile index 4b92ddc6f4a..d98b0f46ae4 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -yqq > /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 > /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/webman/webman.dockerfile b/frameworks/PHP/webman/webman.dockerfile index 512b164d99c..5b64cd4aa16 100644 --- a/frameworks/PHP/webman/webman.dockerfile +++ b/frameworks/PHP/webman/webman.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 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 +RUN pecl install event-3.1.3 > /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/yii2/yii2-workerman.dockerfile b/frameworks/PHP/yii2/yii2-workerman.dockerfile index e5502f5b455..48c840c6f69 100644 --- a/frameworks/PHP/yii2/yii2-workerman.dockerfile +++ b/frameworks/PHP/yii2/yii2-workerman.dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -yqq > /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 > /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini From 791b654db1665d1d1b7e028b281d0d6a9761d0c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Mon, 6 May 2024 20:23:12 +0200 Subject: [PATCH 0532/1766] Update GenHTTP to 8.3 (#8931) * Update GenHTTP to 8.3 * Update GenHTTP to 8.3.1 --- frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index 268648c98d9..b00a3994898 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -28,9 +28,9 @@ - - - + + + From 5bd90af83accacb3916129e8639b47eba10fb3fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 11:23:42 -0700 Subject: [PATCH 0533/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/apidaora (#8974) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 65f2f5c9b50..c1247103499 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.1.3 +jinja2==3.1.4 uvloop==0.14.0 uvicorn==0.11.7 apidaora==0.26.0 From bed407c1744bf6f6b384744fcac1ef382208e5ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 11:23:48 -0700 Subject: [PATCH 0534/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/bareasgi (#8973) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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/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 18330880fea..fb7559bce4a 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.3 +Jinja2==3.1.4 MarkupSafe==2.1.1 orjson==3.8.0 priority==2.0.0 From ffde6bd937984c3e4dc8e6bc1782656fa82eadd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 11:23:55 -0700 Subject: [PATCH 0535/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/aioworkers (#8972) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 4a399de7759..4735f269313 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.3 +Jinja2==3.1.4 From 0c0e5663112d789a2b830f440cacf795306a3540 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 11:24:06 -0700 Subject: [PATCH 0536/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/aiohttp (#8970) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 4dc384f0d9d..d0caf5f25e7 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -2,7 +2,7 @@ aiohttp==3.9.4 asyncpg==0.25.0 cchardet==2.1.7 gunicorn==20.1 -jinja2==3.1.3 +jinja2==3.1.4 psycopg2==2.9.2 SQLAlchemy==1.4.29 ujson==5.4.0 From d897e5aaa4e55550c36fbf3ccc2125246c6374b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 11:24:13 -0700 Subject: [PATCH 0537/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/api_hour (#8969) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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/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 1e962aed9e9..a998bb5e791 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==22.0.0 hiredis==0.2.0 -Jinja2==3.1.3 +Jinja2==3.1.4 MarkupSafe==0.23 piprot==0.9.1 psycopg2==2.7.5 From 97acf13bc40fe555a0814855dd8e3e2ec5fd3ccc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 11:24:28 -0700 Subject: [PATCH 0538/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/blacksheep (#8971) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 2965fca87aa..a93cbff6efa 100644 --- a/frameworks/Python/blacksheep/requirements.txt +++ b/frameworks/Python/blacksheep/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 -Jinja2==3.1.3 +Jinja2==3.1.4 blacksheep==1.2.13 ujson==5.7.0 From bda05af93948b95871f9f68e1a54c2fbb90eefd1 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Mon, 6 May 2024 19:25:07 +0100 Subject: [PATCH 0539/1766] Various toolset fixes and updates (#8951) * Fix the MongoDB Docker image * Update the toolset Docker images to Ubuntu 24.04 * Update Dool to version 1.3.1 * Fix any warnings that are printed by the toolset scripts --- Dockerfile | 25 ++++----- .../Rust/trillium/benchmark_config.json | 8 +-- toolset/databases/__init__.py | 10 ++-- toolset/databases/abstract_database.py | 6 +- toolset/databases/mongodb/create.js | 1 - toolset/databases/mongodb/mongodb.py | 2 +- toolset/test_types/__init__.py | 6 +- toolset/utils/scaffolding.py | 56 +++++++++---------- toolset/wrk/wrk.dockerfile | 2 +- 9 files changed, 57 insertions(+), 59 deletions(-) diff --git a/Dockerfile b/Dockerfile index b0a94b7b504..b6d9c268f48 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive # WARNING: DON'T PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK @@ -20,22 +20,21 @@ RUN apt-get -yqq update && \ python3 \ python3-dev \ python3-pip \ + python3-psutil \ + python3-psycopg2 \ + python3-requests \ siege \ - software-properties-common - -RUN pip3 install \ + software-properties-common && \ + # Ubuntu's equivalent packages are too old and/or broken. + pip3 install \ + --break-system-packages \ colorama==0.3.1 \ - docker==4.0.2 \ - mysqlclient \ - psutil \ - psycopg2-binary \ - pymongo==3.13.0 \ - # urllib3 incompatibility: - # https://github.com/docker/docker-py/issues/3113#issuecomment-1525500104 - requests==2.28.1 + docker==7.0.0 \ + mysqlclient==2.2.4 \ + pymongo==3.13.0 # Collect resource usage statistics -ARG DOOL_VERSION=v1.2.0 +ARG DOOL_VERSION=v1.3.1 WORKDIR /tmp RUN curl -LSs "https://github.com/scottchiefbaker/dool/archive/${DOOL_VERSION}.tar.gz" | \ diff --git a/frameworks/Rust/trillium/benchmark_config.json b/frameworks/Rust/trillium/benchmark_config.json index dbaa70828e2..f12fc4ea218 100755 --- a/frameworks/Rust/trillium/benchmark_config.json +++ b/frameworks/Rust/trillium/benchmark_config.json @@ -27,9 +27,7 @@ "notes": "", "versus": "None", "tags": ["verified"] - } - }, - { + }, "async-std": { "db_url": "/db", "json_url": "/json", @@ -54,9 +52,7 @@ "notes": "", "versus": "None", "tags": ["verified"] - } - }, - { + }, "tokio": { "db_url": "/db", "json_url": "/json", diff --git a/toolset/databases/__init__.py b/toolset/databases/__init__.py index c70a972bf9e..e474436b3ec 100644 --- a/toolset/databases/__init__.py +++ b/toolset/databases/__init__.py @@ -1,4 +1,4 @@ -import imp +import importlib import re from colorama import Fore @@ -14,14 +14,16 @@ # regex that grabs the characters between "toolset/database/" # and the final "/" in the db folder string to get the db name db_name = re.findall(r'.+\/(.+)\/$', folder, re.M)[0] - # ignore generate __pycache__ folder + # ignore generated __pycache__ folder if db_name == '__pycache__': continue - db = imp.load_source("Database", "%s%s.py" % (folder, db_name)) + spec = importlib.util.spec_from_file_location("Database", "%s%s.py" % (folder, db_name)) + db = importlib.util.module_from_spec(spec) + spec.loader.exec_module(db) if not hasattr(db.Database, "get_current_world_table")\ or not hasattr(db.Database, "test_connection"): - log("Database %s does not implement the required methods" + db_name, + log("Database %s does not implement the required methods" % (db_name), color=Fore.RED) databases[db_name] = db.Database diff --git a/toolset/databases/abstract_database.py b/toolset/databases/abstract_database.py index 8f7b4d83e2c..27be6107edb 100644 --- a/toolset/databases/abstract_database.py +++ b/toolset/databases/abstract_database.py @@ -11,7 +11,7 @@ class AbstractDatabase: ''' #margin of tolerance on the results (rows read or updated only) margin = 1.011 - + @classmethod @abc.abstractmethod def get_connection(cls, config): @@ -94,13 +94,13 @@ def verify_queries(cls, config, table_name, url, concurrency=512, count=2, check process = subprocess.run(shlex.split( "siege -c %s -r %s %s -R %s/.siegerc" % (concurrency, count, url, path)), stdout = subprocess.PIPE, stderr = subprocess.STDOUT, timeout=20, text=True - ) + ) except subprocess.TimeoutExpired as e: print("Verification failed: %s" % (e)) else: output = process.stdout #Search for failed transactions - match = re.search('Failed transactions:.*?(\d+)\n', output, re.MULTILINE) + match = re.search(r'Failed transactions:.*?(\d+)\n', output, re.MULTILINE) if match: trans_failures = int(match.group(1)) print(output) diff --git a/toolset/databases/mongodb/create.js b/toolset/databases/mongodb/create.js index c34e2530232..2ef4f9f589a 100644 --- a/toolset/databases/mongodb/create.js +++ b/toolset/databases/mongodb/create.js @@ -1,4 +1,3 @@ -disableTelemetry() db = db.getSiblingDB('hello_world') db.world.drop() for (var i = 1; i <= 10000; i++) { diff --git a/toolset/databases/mongodb/mongodb.py b/toolset/databases/mongodb/mongodb.py index 0fdc005bbf5..e57ca317ccc 100644 --- a/toolset/databases/mongodb/mongodb.py +++ b/toolset/databases/mongodb/mongodb.py @@ -44,7 +44,7 @@ def test_connection(cls, config): connection = cls.get_connection(config) db = connection.hello_world db.world.find() - db.close() + connection.close() return True except: return False diff --git a/toolset/test_types/__init__.py b/toolset/test_types/__init__.py index 604df6682f7..9b5ea627fd0 100644 --- a/toolset/test_types/__init__.py +++ b/toolset/test_types/__init__.py @@ -1,4 +1,4 @@ -import imp +import importlib import re from glob import glob @@ -14,5 +14,7 @@ # ignore generated __pycache__ folder if test_type_name == '__pycache__': continue - test_type = imp.load_source("TestType", "%s%s.py" % (folder, test_type_name)) + spec = importlib.util.spec_from_file_location("TestType", "%s%s.py" % (folder, test_type_name)) + test_type = importlib.util.module_from_spec(spec) + spec.loader.exec_module(test_type) test_types[test_type_name] = test_type.TestType diff --git a/toolset/utils/scaffolding.py b/toolset/utils/scaffolding.py index 9eceb57e122..ec866e5bc76 100755 --- a/toolset/utils/scaffolding.py +++ b/toolset/utils/scaffolding.py @@ -8,7 +8,7 @@ class Scaffolding: def __init__(self, benchmarker): print(""" ------------------------------------------------------------------------------- - This wizard is intended to help build the scaffolding required for a new + This wizard is intended to help build the scaffolding required for a new test to be benchmarked. From here, you will be prompted for values related to the test you @@ -87,12 +87,12 @@ def __prompt_language(self): print(""" That language is not currently in our list of known languages. - + Here is a list of similar languages present in our benchmark suite that you may have meant: %s - + Did you mean to add the new language, '%s', to the benchmark suite? """ % (similar, self.language)) valid = self.__prompt_confirm_new_language() @@ -115,8 +115,8 @@ def __gather_approach(self): print(""" The approach of your test implementation. - 1) Realistic: Uses the framework with most out-of-the-box functionality - enabled. We consider this realistic because most applications + 1) Realistic: Uses the framework with most out-of-the-box functionality + enabled. We consider this realistic because most applications built with the framework will leave these features enabled. 2) Stripped: Removes or outright avoids implementing features that are unnecessary for the particulars of the benchmark exercise. This @@ -143,14 +143,14 @@ def __gather_classification(self): print(""" The classification of your test implementation. - 1) Fullstack: Robust framework expected to provide high-level functionality - for serving as a web application; for example, ability to - compose views, provide functions for responding with several - data types (json, html, etc), connecting to a database, form + 1) Fullstack: Robust framework expected to provide high-level functionality + for serving as a web application; for example, ability to + compose views, provide functions for responding with several + data types (json, html, etc), connecting to a database, form processing, etc. 2) Micro: Simple framework expected to provide enough middleware to build - a robust web application such as request routing and some - simple plumbing, but may not include built-in functionality + a robust web application such as request routing and some + simple plumbing, but may not include built-in functionality such as, for example, server-composed views. 3) Platform: Barebones infrastructure for servicing HTTP requests, but does not include a framework at all. @@ -181,7 +181,7 @@ def __gather_platform(self): print(""" The platform of your test implementation. - The platform is the low-level software or API used to host web applications + The platform is the low-level software or API used to host web applications for the framework; the platform provides an implementation of the HTTP fundamentals. @@ -233,11 +233,11 @@ def __gather_orm(self): print(""" How you would classify the ORM (object relational mapper) of your test? - 1) Full: A feature-rich ORM which provides functionality for interacting - with a database without writing a query in all but the most edge + 1) Full: A feature-rich ORM which provides functionality for interacting + with a database without writing a query in all but the most edge cases. 2) Micro: An ORM which provides functionality for interacting with a database - for many trivial operations (querying, updating), but not more + for many trivial operations (querying, updating), but not more robust cases (for example, gathering relations). 3) Raw: No ORM; raw database access. """) @@ -277,9 +277,9 @@ def __gather_versus(self): print(""" The name of another test (elsewhere in this project) that is a subset of this framework. - This allows for the generation of the framework efficiency chart in the + This allows for the generation of the framework efficiency chart in the results web site. - For example, Compojure is compared to "servlet" since Compojure is built on + For example, Compojure is compared to "servlet" since Compojure is built on the Servlet platform. Example: Servlet, Wai, Undertow @@ -344,31 +344,31 @@ def __copy_scaffold_files(self): def __edit_scaffold_files(self): for file in os.listdir(os.path.join(self.test_dir)): self.__replace_text( - os.path.join(self.test_dir, file), "\$NAME", self.name) + os.path.join(self.test_dir, file), r'\$NAME', self.name) self.__replace_text( - os.path.join(self.test_dir, file), "\$DISPLAY_NAME", + os.path.join(self.test_dir, file), r'\$DISPLAY_NAME', self.display_name) self.__replace_text( - os.path.join(self.test_dir, file), "\$APPROACH", self.approach) + os.path.join(self.test_dir, file), r'\$APPROACH', self.approach) self.__replace_text( - os.path.join(self.test_dir, file), "\$CLASSIFICATION", + os.path.join(self.test_dir, file), r'\$CLASSIFICATION', self.classification) self.__replace_text( - os.path.join(self.test_dir, file), "\$FRAMEWORK", + os.path.join(self.test_dir, file), r'\$FRAMEWORK', self.framework) self.__replace_text( - os.path.join(self.test_dir, file), "\$LANGUAGE", self.language) + os.path.join(self.test_dir, file), r'\$LANGUAGE', self.language) self.__replace_text( - os.path.join(self.test_dir, file), "\$DATABASE", self.database) + os.path.join(self.test_dir, file), r'\$DATABASE', self.database) self.__replace_text( - os.path.join(self.test_dir, file), "\$ORM", self.orm) + os.path.join(self.test_dir, file), r'\$ORM', self.orm) self.__replace_text( - os.path.join(self.test_dir, file), "\$PLATFORM", self.platform) + os.path.join(self.test_dir, file), r'\$PLATFORM', self.platform) self.__replace_text( - os.path.join(self.test_dir, file), "\$WEBSERVER", + os.path.join(self.test_dir, file), r'\$WEBSERVER', self.webserver) self.__replace_text( - os.path.join(self.test_dir, file), "\$VERSUS", self.versus) + os.path.join(self.test_dir, file), r'\$VERSUS', self.versus) def __print_success(self): print(""" diff --git a/toolset/wrk/wrk.dockerfile b/toolset/wrk/wrk.dockerfile index 01d7d4ae579..9bcf42f7b38 100644 --- a/toolset/wrk/wrk.dockerfile +++ b/toolset/wrk/wrk.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 # Required scripts for benchmarking COPY concurrency.sh pipeline.lua pipeline.sh query.sh ./ From 0ddbb87df5357c35266b03d9669427d42204b573 Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Mon, 6 May 2024 19:29:29 +0100 Subject: [PATCH 0540/1766] Updates for Swift 5.10, Remove Kitura and Perfect (#8960) * Swift 5.10 * Add versus entry for Swift frameworks * Add Swift level .gitignore, update Swift level README * Remove Kitura and Perfect * Remove package level .gitignore now we have one in Swift folder * Remove vapor-mongo-fluent. --- .../Swift/{hummingbird-core => }/.gitignore | 1 + frameworks/Swift/README.md | 3 +- .../hummingbird-core/benchmark_config.json | 2 +- .../hummingbird-core.dockerfile | 4 +- frameworks/Swift/hummingbird/.gitignore | 7 - .../Swift/hummingbird/benchmark_config.json | 2 +- .../hummingbird-postgres.dockerfile | 4 +- .../Swift/hummingbird/hummingbird.dockerfile | 4 +- frameworks/Swift/kitura/.gitignore | 6 - frameworks/Swift/kitura/.swift-version | 1 - frameworks/Swift/kitura/Package.swift | 51 --- frameworks/Swift/kitura/README.md | 56 ---- .../Sources/KueryPostgres/Postgres.swift | 42 --- .../KueryPostgresORM/PostgresORM.swift | 223 ------------ .../KueryPostgresRaw/PostgresRaw.swift | 285 ---------------- .../kitura/Sources/TechEmpower/main.swift | 44 --- .../Sources/TechEmpowerCommon/Error.swift | 35 -- .../Sources/TechEmpowerCommon/Fortune.swift | 90 ----- .../Sources/TechEmpowerCommon/RandomRow.swift | 70 ---- .../TechEmpowerMongoKitten/Mongo.swift | 123 ------- .../Sources/TechEmpowerMongoKitten/main.swift | 118 ------- .../Sources/TechEmpowerPostgres/main.swift | 210 ------------ .../Fortune+Mustache.swift | 24 -- .../TechEmpowerPostgresMustache/main.swift | 57 ---- .../Sources/TechEmpowerPostgresORM/main.swift | 166 --------- .../TechEmpowerPostgresORMCodable/main.swift | 136 -------- .../Swift/kitura/Views/fortunes.mustache | 12 - .../Swift/kitura/Views/fortunes.stencil | 10 - frameworks/Swift/kitura/benchmark_config.json | 246 -------------- frameworks/Swift/kitura/config.json | 16 - frameworks/Swift/kitura/config.toml | 178 ---------- ...kitura-gcd-postgres-orm-codable.dockerfile | 10 - .../kitura/kitura-gcd-postgres-orm.dockerfile | 10 - .../kitura/kitura-gcd-postgres.dockerfile | 10 - frameworks/Swift/kitura/kitura-gcd.dockerfile | 10 - .../Swift/kitura/kitura-mongodb.dockerfile | 10 - ...kitura-nio-postgres-orm-codable.dockerfile | 11 - .../kitura/kitura-nio-postgres-orm.dockerfile | 11 - .../kitura/kitura-nio-postgres.dockerfile | 11 - frameworks/Swift/kitura/kitura-nio.dockerfile | 11 - .../kitura-postgres-orm-codable.dockerfile | 10 - .../kitura/kitura-postgres-orm.dockerfile | 10 - .../Swift/kitura/kitura-postgres.dockerfile | 10 - frameworks/Swift/kitura/kitura.dockerfile | 10 - frameworks/Swift/perfect/.gitignore | 6 - frameworks/Swift/perfect/Package.swift | 25 -- frameworks/Swift/perfect/README.md | 43 --- .../Sources/Perfect-MongoDB/main.swift | 316 ------------------ .../perfect/Sources/Perfect-MySQL/main.swift | 313 ----------------- .../Sources/Perfect-PostgreSQL/main.swift | 224 ------------- .../Swift/perfect/Sources/Perfect/main.swift | 78 ----- .../Swift/perfect/benchmark_config.json | 80 ----- frameworks/Swift/perfect/config.toml | 57 ---- .../Swift/perfect/perfect-mongodb.dockerfile | 10 - .../Swift/perfect/perfect-mysql.dockerfile | 10 - .../perfect/perfect-postgresql.dockerfile | 10 - frameworks/Swift/perfect/perfect.dockerfile | 10 - frameworks/Swift/swift-nio/.gitignore | 8 - frameworks/Swift/swift-nio/config.toml | 15 - .../Swift/swift-nio/swift-nio.dockerfile | 4 +- frameworks/Swift/vapor/.gitignore | 7 - frameworks/Swift/vapor/benchmark_config.json | 2 +- .../Swift/vapor/vapor-fluent.dockerfile | 4 +- .../Swift/vapor/vapor-mongo-fluent.dockerfile | 29 -- .../vapor/vapor-mongo-fluent/Package.swift | 29 -- .../Sources/Utilities.swift | 25 -- .../vapor-mongo-fluent/Sources/World.swift | 14 - .../vapor-mongo-fluent/Sources/main.swift | 52 --- frameworks/Swift/vapor/vapor-mongo.dockerfile | 4 +- .../Swift/vapor/vapor-postgres.dockerfile | 4 +- .../Swift/vapor/vapor-sql-kit.dockerfile | 4 +- frameworks/Swift/vapor/vapor.dockerfile | 4 +- 72 files changed, 24 insertions(+), 3723 deletions(-) rename frameworks/Swift/{hummingbird-core => }/.gitignore (91%) delete mode 100644 frameworks/Swift/hummingbird/.gitignore delete mode 100644 frameworks/Swift/kitura/.gitignore delete mode 100644 frameworks/Swift/kitura/.swift-version delete mode 100644 frameworks/Swift/kitura/Package.swift delete mode 100644 frameworks/Swift/kitura/README.md delete mode 100644 frameworks/Swift/kitura/Sources/KueryPostgres/Postgres.swift delete mode 100644 frameworks/Swift/kitura/Sources/KueryPostgresORM/PostgresORM.swift delete mode 100644 frameworks/Swift/kitura/Sources/KueryPostgresRaw/PostgresRaw.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpower/main.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerCommon/Error.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerCommon/Fortune.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerCommon/RandomRow.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/Mongo.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/main.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerPostgres/main.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/Fortune+Mustache.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/main.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerPostgresORM/main.swift delete mode 100644 frameworks/Swift/kitura/Sources/TechEmpowerPostgresORMCodable/main.swift delete mode 100644 frameworks/Swift/kitura/Views/fortunes.mustache delete mode 100644 frameworks/Swift/kitura/Views/fortunes.stencil delete mode 100644 frameworks/Swift/kitura/benchmark_config.json delete mode 100644 frameworks/Swift/kitura/config.json delete mode 100644 frameworks/Swift/kitura/config.toml delete mode 100644 frameworks/Swift/kitura/kitura-gcd-postgres-orm-codable.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-gcd-postgres-orm.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-gcd-postgres.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-gcd.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-mongodb.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-nio-postgres-orm-codable.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-nio-postgres-orm.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-nio-postgres.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-nio.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-postgres-orm-codable.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-postgres-orm.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura-postgres.dockerfile delete mode 100644 frameworks/Swift/kitura/kitura.dockerfile delete mode 100644 frameworks/Swift/perfect/.gitignore delete mode 100644 frameworks/Swift/perfect/Package.swift delete mode 100644 frameworks/Swift/perfect/README.md delete mode 100644 frameworks/Swift/perfect/Sources/Perfect-MongoDB/main.swift delete mode 100644 frameworks/Swift/perfect/Sources/Perfect-MySQL/main.swift delete mode 100644 frameworks/Swift/perfect/Sources/Perfect-PostgreSQL/main.swift delete mode 100644 frameworks/Swift/perfect/Sources/Perfect/main.swift delete mode 100644 frameworks/Swift/perfect/benchmark_config.json delete mode 100644 frameworks/Swift/perfect/config.toml delete mode 100644 frameworks/Swift/perfect/perfect-mongodb.dockerfile delete mode 100644 frameworks/Swift/perfect/perfect-mysql.dockerfile delete mode 100644 frameworks/Swift/perfect/perfect-postgresql.dockerfile delete mode 100644 frameworks/Swift/perfect/perfect.dockerfile delete mode 100644 frameworks/Swift/swift-nio/.gitignore delete mode 100644 frameworks/Swift/swift-nio/config.toml delete mode 100644 frameworks/Swift/vapor/.gitignore delete mode 100644 frameworks/Swift/vapor/vapor-mongo-fluent.dockerfile delete mode 100644 frameworks/Swift/vapor/vapor-mongo-fluent/Package.swift delete mode 100644 frameworks/Swift/vapor/vapor-mongo-fluent/Sources/Utilities.swift delete mode 100644 frameworks/Swift/vapor/vapor-mongo-fluent/Sources/World.swift delete mode 100644 frameworks/Swift/vapor/vapor-mongo-fluent/Sources/main.swift diff --git a/frameworks/Swift/hummingbird-core/.gitignore b/frameworks/Swift/.gitignore similarity index 91% rename from frameworks/Swift/hummingbird-core/.gitignore rename to frameworks/Swift/.gitignore index 1d982c0de86..07c7b08b3c1 100644 --- a/frameworks/Swift/hummingbird-core/.gitignore +++ b/frameworks/Swift/.gitignore @@ -5,3 +5,4 @@ xcuserdata/ .swiftpm/ DerivedData/ Package.resolved +.vscode/ \ No newline at end of file diff --git a/frameworks/Swift/README.md b/frameworks/Swift/README.md index 367e5b6b0c0..878251045c8 100644 --- a/frameworks/Swift/README.md +++ b/frameworks/Swift/README.md @@ -8,4 +8,5 @@ For further guidance, review the [documentation](https://frameworkbenchmarks.rea ### Swift Experts -[tanner0101](https://github.com/tanner0101) +[Adam Fowler](https://github.com/adam-fowler) +[Tim Condon](https://github.com/0xTim) diff --git a/frameworks/Swift/hummingbird-core/benchmark_config.json b/frameworks/Swift/hummingbird-core/benchmark_config.json index 8a78cb1a141..8b811b8656c 100755 --- a/frameworks/Swift/hummingbird-core/benchmark_config.json +++ b/frameworks/Swift/hummingbird-core/benchmark_config.json @@ -18,7 +18,7 @@ "database_os": "Linux", "display_name": "HummingbirdCore", "notes": "", - "versus": "None" + "versus": "swift-nio" } }] } diff --git a/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile b/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile index c384cc96fd0..eb6fccc321b 100644 --- a/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile +++ b/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.9 as build +FROM swift:5.10 as build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.9-slim +FROM swift:5.10-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird/.gitignore b/frameworks/Swift/hummingbird/.gitignore deleted file mode 100644 index 1d982c0de86..00000000000 --- a/frameworks/Swift/hummingbird/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.DS_Store -.build/ -/*.xcodeproj -xcuserdata/ -.swiftpm/ -DerivedData/ -Package.resolved diff --git a/frameworks/Swift/hummingbird/benchmark_config.json b/frameworks/Swift/hummingbird/benchmark_config.json index 7b60aa6ec1b..91bff409efe 100755 --- a/frameworks/Swift/hummingbird/benchmark_config.json +++ b/frameworks/Swift/hummingbird/benchmark_config.json @@ -18,7 +18,7 @@ "database_os": "Linux", "display_name": "Hummingbird", "notes": "", - "versus": "None" + "versus": "swift-nio" }, "postgres": { "db_url": "/db", diff --git a/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile b/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile index 27e0d6aad07..952c3c47dbf 100644 --- a/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile +++ b/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.9 as build +FROM swift:5.10 as build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.9-slim +FROM swift:5.10-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird/hummingbird.dockerfile b/frameworks/Swift/hummingbird/hummingbird.dockerfile index c384cc96fd0..eb6fccc321b 100644 --- a/frameworks/Swift/hummingbird/hummingbird.dockerfile +++ b/frameworks/Swift/hummingbird/hummingbird.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.9 as build +FROM swift:5.10 as build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.9-slim +FROM swift:5.10-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/kitura/.gitignore b/frameworks/Swift/kitura/.gitignore deleted file mode 100644 index 94822102415..00000000000 --- a/frameworks/Swift/kitura/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.DS_Store -.build -build_gcd -.swiftenv -Packages -*.xcodeproj diff --git a/frameworks/Swift/kitura/.swift-version b/frameworks/Swift/kitura/.swift-version deleted file mode 100644 index 4d0dcda01c4..00000000000 --- a/frameworks/Swift/kitura/.swift-version +++ /dev/null @@ -1 +0,0 @@ -4.1.2 diff --git a/frameworks/Swift/kitura/Package.swift b/frameworks/Swift/kitura/Package.swift deleted file mode 100644 index 89164e6e02d..00000000000 --- a/frameworks/Swift/kitura/Package.swift +++ /dev/null @@ -1,51 +0,0 @@ -// swift-tools-version:4.0 -// The swift-tools-version declares the minimum version of Swift required to build this package. - -import PackageDescription - -let package = Package( - name: "Kitura-TechEmpower", - dependencies: [ - .package(url: "https://github.com/IBM-Swift/Kitura.git", .upToNextMinor(from: "2.6.0")), - .package(url: "https://github.com/IBM-Swift/LoggerAPI.git", from: "1.8.0"), - .package(url: "https://github.com/IBM-Swift/HeliumLogger.git", from: "1.8.0"), - .package(url: "https://github.com/IBM-Swift/Configuration.git", from: "3.0.0"), - .package(url: "https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL.git", from: "2.0.0"), - .package(url: "https://github.com/IBM-Swift/Swift-Kuery-ORM.git", from: "0.4.0"), - .package(url: "https://github.com/IBM-Swift/Kitura-StencilTemplateEngine.git", from: "1.9.0"), - .package(url: "https://github.com/IBM-Swift/Kitura-MustacheTemplateEngine.git", from: "1.7.2"), - .package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "4.1.3"), - ], - targets: [ - .target( - name: "TechEmpowerCommon", - dependencies: []), - .target( - name: "KueryPostgres", - dependencies: [.target(name: "TechEmpowerCommon"), "Configuration", "SwiftKueryPostgreSQL"]), - .target( - name: "KueryPostgresRaw", - dependencies: [.target(name: "KueryPostgres"), "LoggerAPI"]), - .target( - name: "KueryPostgresORM", - dependencies: [.target(name: "KueryPostgres"), "LoggerAPI", "SwiftKueryORM"]), - .target( - name: "TechEmpower", - dependencies: ["Kitura"]), - .target( - name: "TechEmpowerPostgres", - dependencies: [.target(name: "KueryPostgresRaw"), "Kitura", "HeliumLogger", "KituraStencil"]), - .target( - name: "TechEmpowerPostgresORM", - dependencies: [.target(name: "KueryPostgresORM"), "Kitura", "HeliumLogger", "KituraStencil"]), - .target( - name: "TechEmpowerPostgresORMCodable", - dependencies: [.target(name: "KueryPostgresORM"), "Kitura", "HeliumLogger", "KituraStencil"]), - .target( - name: "TechEmpowerPostgresMustache", - dependencies: [.target(name: "KueryPostgresRaw"), "Kitura", "HeliumLogger", "KituraMustache"]), - .target( - name: "TechEmpowerMongoKitten", - dependencies: [.target(name: "TechEmpowerCommon"), "Kitura", "HeliumLogger", "Configuration", "MongoKitten", "KituraStencil"]), - ] -) diff --git a/frameworks/Swift/kitura/README.md b/frameworks/Swift/kitura/README.md deleted file mode 100644 index aacadafd94b..00000000000 --- a/frameworks/Swift/kitura/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# [Kitura](https://kitura.io) Benchmark Test - -This is the [Kitura](https://kitura.io) portion of a [benchmarking test suite](https://www.techempower.com/benchmarks/) comparing a variety of web development platforms. - -## Variants - -The benchmark is split up into multiple executable targets, demonstrating different database backends and uses of the Kitura routing APIs: -- `kitura`: Implementations of Plaintext and JSON using 'raw' (Express-style) routing -- `kitura-postgres`: Implementation of database tests, using Postgres with Swift-Kuery (no ORM) -- `kitura-postgres-orm`: Equivalent implementation with Postgres and Swift-Kuery-ORM -- `kitura-postgres-orm-codable`: Equivalent implementation with Postgres, using [Codable Routing together with Swift-Kuery-ORM](https://developer.ibm.com/swift/2018/03/01/introducing-swift-kuery-orm/) -- `kitura-mongodb`: Implementation of database tests, using MongoDB with MongoKitten (no ORM) -- `kitura-nio`: `kitura` implementations of Plaintext and JSON run on [Kitura-NIO](https://github.com/IBM-Swift/Kitura-NIO) -- `kitura-nio-postgres`: Testing `kitura` implementations of database tests using Postgres on [Kitura-NIO](https://github.com/IBM-Swift/Kitura-NIO) - -There are additional variants for each of the above implementations, with the '-gcd' suffix: These are compiled from the same source, but use the Grand Central Dispatch threading model (used by default on macOS) instead of a direct epoll implementation (the default on Linux). - -Each listens on port 8080, and uses the common URLs described below. - -## Versions and Dependencies - -This version of the benchmark requires Swift 4.0.3 or higher, and uses the following versions of Kitura and dependencies: - -- [Kitura 2.5](https://github.com/IBM-Swift/Kitura) -- [HeliumLogger 1.x](https://github.com/IBM-Swift/HeliumLogger) -- [Configuration 3.x](https://github.com/IBM-Swift/Configuration) -- [SwiftKueryPostgreSQL 1.x](https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL) -- [SwiftKueryORM 0.x](https://github.com/IBM-Swift/Swift-Kuery-ORM) -- [KituraStencil 1.x](https://github.com/IBM-Swift/Kitura-StencilTemplateEngine) -- [KituraMustache 1.x](https://github.com/IBM-Swift/Kitura-MustacheTemplateEngine) -- [MongoKitten 4.x](https://github.com/OpenKitten/MongoKitten) - -## Test URLs -### JSON serialization - -http://localhost:8080/json - -### Single database query - -http://localhost:8080/db - -### Multiple database queries - -http://localhost:8080/queries?queries=n - -### Fortunes - -http://localhost:8080/fortunes - -### Database updates - -http://localhost:8080/updates?queries=n - -### Plaintext - -http://localhost:8080/plaintext diff --git a/frameworks/Swift/kitura/Sources/KueryPostgres/Postgres.swift b/frameworks/Swift/kitura/Sources/KueryPostgres/Postgres.swift deleted file mode 100644 index a1c35e631df..00000000000 --- a/frameworks/Swift/kitura/Sources/KueryPostgres/Postgres.swift +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import SwiftKuery -import SwiftKueryPostgreSQL -import Configuration - -#if os(Linux) - import Glibc -#else - import Darwin -#endif - -// We will load our database configuration from config.json, but this can be -// overridden with the TFB_DB_CONFIG environment variable. -let configurationFilename: String = ProcessInfo.processInfo.environment["TFB_DB_CONFIG"] ?? "config.json" -let manager = ConfigurationManager().load(file: configurationFilename, relativeFrom: .pwd).load(.environmentVariables) - -let dbHost = manager["DB_HOST"] as? String ?? manager["db:host"] as? String ?? "localhost" -let dbPort = Int32(manager["DB_PORT"] as? String != nil ? Int(manager["DB_PORT"] as! String) ?? 5432 : manager["db:port"] as? Int ?? 5432) -let dbName = manager["db:name"] as? String ?? "hello_world" -let dbUser = manager["db:user"] as? String ?? "benchmarkdbuser" -let dbPass = manager["db:password"] as? String ?? "benchmarkdbpass" - -let dbConnPoolOpts = ConnectionPoolOptions(initialCapacity: 20, maxCapacity: 50) - -public let dbConnPool = PostgreSQLConnection.createPool(host: dbHost, port: dbPort, options: [.databaseName(dbName), .userName(dbUser), .password(dbPass)], poolOptions: dbConnPoolOpts) - diff --git a/frameworks/Swift/kitura/Sources/KueryPostgresORM/PostgresORM.swift b/frameworks/Swift/kitura/Sources/KueryPostgresORM/PostgresORM.swift deleted file mode 100644 index a267e9d4121..00000000000 --- a/frameworks/Swift/kitura/Sources/KueryPostgresORM/PostgresORM.swift +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import Dispatch -import LoggerAPI -import SwiftKuery -import SwiftKueryORM -import KueryPostgres -import TechEmpowerCommon - -// ORM conformance -extension RandomRow: Model { - public static var tableName: String { return "world" } -} - -// ORM conformance -extension Fortune: Model { - public static var tableName: String { return "fortune" } -} - -// Configure our ORM Database connection pool as dbConnPool created by KueryPostgres -public func setupORM() { - Database.default = Database(dbConnPool) -} - -/// Get a list of Fortunes from the database. -/// -/// - Parameter callback: The callback that will be invoked once the DB query -/// has completed and results are available, passing an -/// optional [Fortune] (on success) or RequestError on -/// failure. -/// -public func getFortunes(callback: @escaping ([Fortune]?, RequestError?) -> Void) -> Void { - Fortune.findAll { (fortunes, err) in - if let err = err { - return callback(nil, err) - } else { - callback(fortunes, nil) - } - } -} - -/// Get a random row (range 1 to 10,000) from the database. -/// -/// - Parameter callback: The callback that will be invoked once the DB query -/// has completed and results are available, passing an -/// optional RandomRow (on success) or RequestError on -/// failure. -/// -public func getRandomRow(callback: @escaping (RandomRow?, RequestError?) -> Void) -> Void { - // Select random row from database range - let rnd = RandomRow.randomId - RandomRow.find(id: rnd, callback) -} - -/// Updates a row of World to a new value. -/// -/// - Parameter callback: The callback that will be invoked once the DB update -/// has completed, passing an optional RequestError if the -/// update failed. -/// -public func updateRow(id: Int, callback: @escaping (RequestError?) -> Void) -> Void { - // Generate a random number for this row - let row = RandomRow(id: id, randomNumber: RandomRow.randomValue) - row.update(id: id) { (resultRow, err) in - if let err = err { - return callback(err) - } else { - callback(nil) - } - } -} - -/// Get `count` random rows from the database, and pass the resulting array -/// to a completion handler (or a RequestError, in the event that a row could -/// not be retrieved). -/// -/// - Parameter count: The number of rows to retrieve -/// - Parameter result: The intermediate result array being built -/// - Parameter completion: The closure to invoke with the result array, or error -/// -public func getRandomRows(count: Int, result: [RandomRow] = [], completion: @escaping ([RandomRow]?, RequestError?) -> Void) { - if count > 0 { - // Select random row from database range - RandomRow.find(id: RandomRow.randomId) { (resultRow, err) in - if let resultRow = resultRow { - var result = result - result.append(resultRow) - getRandomRows(count: count-1, result: result, completion: completion) - } else { - if let err = err { - completion(nil, err) - } else { - fatalError("Unexpected: result and error both nil") - } - } - } - } else { - completion(result, nil) - } -} - -/// A parallel version of `getRandomRows` that invokes each get in parallel, builds an -/// array of results and waits for each get to complete before returning. -/// -/// - Parameter count: The number of rows to retrieve -/// - Parameter completion: The closure to invoke with the result array, or error -/// -public func getRandomRowsParallel(count: Int, completion: @escaping ([RandomRow]?, RequestError?) -> Void) { - var results: [RandomRow] = [] - guard count > 0 else { - return completion(results, nil) - } - // Used to protect result array from concurrent modification - let updateLock = DispatchSemaphore(value: 1) - // Execute each query. Each callback will append its result to `results` - for _ in 1...count { - RandomRow.find(id: RandomRow.randomId) { (resultRow, err) in - guard let resultRow = resultRow else { - Log.error("\(err ?? .internalServerError)") - completion(nil, err ?? .internalServerError) - return - } - updateLock.wait() - results.append(resultRow) - if results.count == count { - completion(results, nil) - } - updateLock.signal() - } - } -} - -/// Update and retrieve `count` random rows from the database, and pass the -/// resulting array to a completion handler (or a RequestError, in the event -/// that a row could not be retrieved or updated). -/// -/// - Parameter count: The number of rows to retrieve -/// - Parameter result: The intermediate result array being built -/// - Parameter completion: The closure to invoke with the result array, or error -/// -public func updateRandomRows(count: Int, result: [RandomRow] = [], completion: @escaping ([RandomRow]?, RequestError?) -> Void) { - if count > 0 { - // Select random row from database range - RandomRow.find(id: RandomRow.randomId) { (resultRow, err) in - if let resultRow = resultRow { - var result = result - let row = RandomRow(id: resultRow.id, randomNumber: RandomRow.randomValue) - row.update(id: row.id) { (resultRow, err) in - if let resultRow = resultRow { - result.append(resultRow) - updateRandomRows(count: count-1, result: result, completion: completion) - } else { - completion(nil, err) - } - } - } else { - if let err = err { - completion(nil, err) - } else { - fatalError("Unexpected: result and error both nil") - } - } - } - } else { - completion(result, nil) - } -} - -/// A parallel version of `updateRandomRows` that invokes each get/update operation -/// in parallel, builds an array of results and waits for each get to complete before -/// returning. -/// -/// - Parameter count: The number of rows to retrieve -/// - Parameter completion: The closure to invoke with the result array, or error -/// -public func updateRandomRowsParallel(count: Int, completion: @escaping ([RandomRow]?, RequestError?) -> Void) { - var results: [RandomRow] = [] - guard count > 0 else { - return completion(results, nil) - } - // Used to protect result array from concurrent modification - let updateLock = DispatchSemaphore(value: 1) - // Execute each query. Each callback will append its result to `results` - for _ in 1...count { - RandomRow.find(id: RandomRow.randomId) { (resultRow, err) in - guard let resultRow = resultRow else { - Log.error("\(err ?? .internalServerError)") - completion(nil, err ?? .internalServerError) - return - } - let row = RandomRow(id: resultRow.id, randomNumber: RandomRow.randomValue) - row.update(id: row.id) { (resultRow, err) in - if let resultRow = resultRow { - updateLock.wait() - results.append(resultRow) - if results.count == count { - completion(results, nil) - } - updateLock.signal() - } else { - Log.error("\(err ?? .internalServerError)") - completion(nil, err ?? .internalServerError) - return - } - } - } - } -} diff --git a/frameworks/Swift/kitura/Sources/KueryPostgresRaw/PostgresRaw.swift b/frameworks/Swift/kitura/Sources/KueryPostgresRaw/PostgresRaw.swift deleted file mode 100644 index c32d6784933..00000000000 --- a/frameworks/Swift/kitura/Sources/KueryPostgresRaw/PostgresRaw.swift +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import LoggerAPI -import SwiftKuery -import KueryPostgres -import TechEmpowerCommon - -let dbRows = 10000 -let maxValue = 10000 - -// Kuery table definition for World -class World: Table { - let tableName = "world" - - let id = Column("id") - let randomNumber = Column("randomnumber") -} - -// Kuery table definition for Fortune -class Fortunes: Table { - let tableName = "fortune" - - let id = Column("id") - let message = Column("message") -} - -let world = World() -let fortunes = Fortunes() - -// Kuery update statement for Updates -var update = Update(world, set: [(world.randomNumber, RandomRow.randomValue)]) - .where(world.id == RandomRow.randomId) - -/// Get a list of Fortunes from the database. -/// -/// - Parameter callback: The callback that will be invoked once the DB query -/// has completed and results are available, passing an -/// optional [Fortune] (on success) or AppError on -/// failure. -/// -public func getFortunes(callback: @escaping ([Fortune]?, AppError?) -> Void) -> Void { - // Get a dedicated connection object for this transaction from the pool - dbConnPool.getConnection { (dbConn, dbConnErr) in - guard let dbConn = dbConn else { - guard let err = dbConnErr else { - return callback(nil, AppError.OtherError("Unknown error getting connection from pool")) - } - return callback(nil, AppError.OtherError("Error getting connection from pool: \(err)")) - } - // Initiate database query - let query = Select(from: fortunes) - dbConn.execute(query: query) { result in - var resultFortunes: [Fortune] = [] - // Retrieve all rows from the query result - result.asRows { - results, err in - guard let results = results else { - guard let err = err else { - return callback(nil, AppError.DBKueryError("Query failed, and no error was returned")) - } - return callback(nil, AppError.DBKueryError("Query failed: \(err)")) - } - do { - // Transform the result rows into an array of Fortune objects - resultFortunes = try results.map { try Fortune.init(row: $0) } - } catch { - return callback(nil, AppError.DataFormatError("\(error)")) - } - // Invoke callback with results - callback(resultFortunes, nil) - } - } - } -} - -/// Alternate implementation of getFortunes that uses ResultSet.forEach to fetch each -/// database row sequentially, rather than QueryResult.asRows (which produces an array -/// of rows). The benefit of forEach is that we do not need to hold two copies of the -/// entire result set in memory. -/// -/// - Parameter callback: The callback that will be invoked once the DB query -/// has completed and results are available, passing an -/// optional [Fortune] (on success) or AppError on -/// failure. -/// -public func getFortunes_forEach(callback: @escaping ([Fortune]?, AppError?) -> Void) -> Void { - // Get a dedicated connection object for this transaction from the pool - dbConnPool.getConnection { (dbConn, dbConnErr) in - guard let dbConn = dbConn else { - guard let err = dbConnErr else { - return callback(nil, AppError.OtherError("Unknown error getting connection from pool")) - } - return callback(nil, AppError.OtherError("Error getting connection from pool: \(err)")) - } - // Initiate database query - let query = Select(from: fortunes) - dbConn.execute(query: query) { result in - var resultFortunes: [Fortune] = [] - guard let results = result.asResultSet else { - guard let queryErr = result.asError else { - return callback(nil, AppError.DBKueryError("Expected a result set, but result was \(result)")) - } - return callback(nil, AppError.DBKueryError("Query failed: \(queryErr)")) - } - // Build an array of Fortune objects - results.forEach { (values, rowErr, next) in - guard let values = values else { - // Reached the final row - call back with the results - return callback(resultFortunes, nil) - } - // Append this Fortune to the list - do { - resultFortunes.append(try Fortune(values: values)) - // Process the next column - next() - } catch { - return callback(nil, AppError.DataFormatError("\(error)")) - } - } - } - } -} - -/// Get a random row (range 1 to 10,000) from the database. -/// -/// - Parameter callback: The callback that will be invoked once the DB query -/// has completed and results are available, passing an -/// optional RandomRow (on success) or AppError on -/// failure. -/// -public func getRandomRow_Raw(callback: @escaping (RandomRow?, AppError?) -> Void) -> Void { - // Get a dedicated connection object for this transaction from the pool - dbConnPool.getConnection { (dbConn, dbConnErr) in - guard let dbConn = dbConn else { - guard let dbConnErr = dbConnErr else { - return callback(nil, AppError.OtherError("Unknown error getting connection from pool")) - } - return callback(nil, AppError.OtherError("Error getting connection from pool: \(dbConnErr)")) - } - // Select random row from database range - let rnd = RandomRow.randomId - let query = Select(world.randomNumber, from: world) - .where(world.id == rnd) - // Initiate database query - dbConn.execute(query: query) { result in - guard let resultSet = result.asResultSet else { - guard let queryErr = result.asError else { - return callback(nil, AppError.DBKueryError("Expected a result set, but result was \(result)")) - } - return callback(nil, AppError.DBKueryError("Query failed: \(queryErr)")) - } - resultSet.nextRow { - values, nextErr in - guard let values = values else { - guard let nextErr = nextErr else { - return callback(nil, AppError.DBKueryError("Query failed, and no error was returned")) - } - return callback(nil, AppError.DBKueryError("Query failed: \(nextErr)")) - } - // There should be exactly one value - guard values.count == 1 else { - return callback(nil, AppError.DBKueryError("\(values.count) values returned, expected 1, for query '\(query)'")) - } - // The value should be an Int32 - guard let randomNumber = values[0] as? Int32 else { - return callback(nil, AppError.DBKueryError("Could not convert \(String(describing: values[0])) to Int32")) - } - let resultRow = RandomRow(id: rnd, randomNumber: Int(randomNumber)) - // Invoke callback with results - callback(resultRow, nil) - } - } - } -} - -/// Updates a row of World to a new value. -/// -/// - Parameter callback: The callback that will be invoked once the DB update -/// has completed, passing an optional AppError if the -/// update failed. -/// -public func updateRow_Raw(id: Int, callback: @escaping (AppError?) -> Void) -> Void { - // Get a dedicated connection object for this transaction from the pool - dbConnPool.getConnection { (dbConn, err) in - guard let dbConn = dbConn else { - guard let err = err else { - return callback(AppError.OtherError("Unknown error getting connection from pool")) - } - return callback(AppError.OtherError("Error getting connection from pool: \(err)")) - } - // Generate a random number for this row - let rndValue = RandomRow.randomValue - let query = Update(world, set: [(world.randomNumber, rndValue)]) - .where(world.id == id) - // Initiate database query - dbConn.execute(query: query) { result in - guard result.success else { - return callback(AppError.DBKueryError("Update failed: \(String(describing: result.asError))")) - } - // Invoke callback once done - callback(nil) - } - } -} - -/// Get `count` random rows from the database, and pass the resulting array -/// to a completion handler (or an AppError, in the event that a row could -/// not be retrieved). -/// -/// - Parameter count: The number of rows to retrieve -/// - Parameter result: The intermediate result array being built -/// - Parameter completion: The closure to invoke with the result array, or error -/// -public func getRandomRows_Raw(count: Int, result: [RandomRow] = [], completion: @escaping ([RandomRow]?, AppError?) -> Void) { - if count > 0 { - // Select random row from database range - getRandomRow_Raw { (resultRow, err) in - if let resultRow = resultRow { - var result = result - result.append(resultRow) - // Call recursively to get remaining rows - getRandomRows_Raw(count: count-1, result: result, completion: completion) - } else { - if let err = err { - completion(nil, err) - } else { - fatalError("Unexpected: result and error both nil") - } - } - } - } else { - completion(result, nil) - } -} - -/// Update and retrieve `count` random rows from the database, and pass the -/// resulting array to a completion handler (or an AppError, in the event -/// that a row could not be retrieved or updated). -/// -/// - Parameter count: The number of rows to retrieve -/// - Parameter result: The intermediate result array being built -/// - Parameter completion: The closure to invoke with the result array, or error -/// -public func updateRandomRows_Raw(count: Int, result: [RandomRow] = [], completion: @escaping ([RandomRow]?, AppError?) -> Void) { - if count > 0 { - // Select random row from database range - getRandomRow_Raw { (resultRow, err) in - if let resultRow = resultRow { - var result = result - // Execute inner callback for updating the row - updateRow_Raw(id: resultRow.id) { (err) in - if let err = err { - return completion(nil, err) - } - result.append(resultRow) - // Call recursively to update remaining rows - updateRandomRows_Raw(count: count-1, result: result, completion: completion) - } - } else { - if let err = err { - completion(nil, err) - } else { - fatalError("Unexpected: result and error both nil") - } - } - } - } else { - completion(result, nil) - } -} diff --git a/frameworks/Swift/kitura/Sources/TechEmpower/main.swift b/frameworks/Swift/kitura/Sources/TechEmpower/main.swift deleted file mode 100644 index 83a9f083fc5..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpower/main.swift +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import Kitura -import TechEmpowerCommon - -let router = Router() - -// -// TechEmpower test 6: plaintext -// -router.get("/plaintext") { - request, response, next in - response.headers["Server"] = "Kitura" - response.headers["Content-Type"] = "text/plain" - try response.status(.OK).send("Hello, world!").end() -} - -// -// TechEmpower test 1: JSON serialization -// -router.get("/json") { - request, response, next in - response.headers["Server"] = "Kitura" - let result = ["message":"Hello, World!"] - try response.status(.OK).send(json: result).end() -} - -Kitura.addHTTPServer(onPort: 8080, with: router) -Kitura.run() diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerCommon/Error.swift b/frameworks/Swift/kitura/Sources/TechEmpowerCommon/Error.swift deleted file mode 100644 index d8b1b78614f..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerCommon/Error.swift +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/// Represents various errors that can occur with the Kitura TechEmpower benchmark. -public enum AppError: Error { - - /// An error occurring when executing a raw SQL query against a database. - case DBError(String, query: String) - - /// An error occurring when executing a Kuery operation against a database. - case DBKueryError(String) - - /// An error occurring when the format of the data retrieved by a database - /// operation was not as expected. - case DataFormatError(String) - - /// An error occurring when a connection to the database cannot be established. - case ConnectionError(String) - - /// Any other type of error - case OtherError(String) -} diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerCommon/Fortune.swift b/frameworks/Swift/kitura/Sources/TechEmpowerCommon/Fortune.swift deleted file mode 100644 index 182c3a95d61..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerCommon/Fortune.swift +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation - -public struct Fortune: Codable { - - /// The id of this Fortune - public let id: Int - - /// The message contained within this Fortune - public let message: String - - public init(id: Int, message: String) { - self.id = id - self.message = message - } - - /// Create a Fortune instance from a [String: Any?] dictionary, - /// such as that retrieved by Kuery using `QueryResult.asRows()`. - /// - /// - Parameter row: A dictionary representing the fields of a - /// Fortune database row. - /// - throws: if the fields and types contained in the dictionary - /// do not match those expected. - public init(row: [String:Any?]) throws { - guard let idField = row["id"] else { - throw AppError.DataFormatError("Missing 'id' field") - } - guard let msgField = row["message"] else { - throw AppError.DataFormatError("Missing 'message' field") - } - guard let message = msgField as? String else { - throw AppError.DataFormatError("'message' field not a String") - } - guard let id = idField as? Int32 else { - throw AppError.DataFormatError("'id' field not an Int32") - } - self.init(id: Int(id), message: message) - } - - /// Create a Fortune instance from an [Any?] array, such as that retrieved - /// by Kuery using `ResultSet.forEach()`. - /// - /// - Parameter row: An array representing the fields of a Fortune - /// database row. - /// - throws: if the fields and types contained in the array do not match - /// those expected. - public init(values: [Any?]) throws { - // There should be two columns - guard values.count == 2 else { - throw AppError.DBKueryError("Expected 2 values but found \(values.count)") - } - // First should be an Int32 - guard let id = values[0] as? Int32 else { - throw AppError.DataFormatError("Fortune id '\(String(describing: values[0]))' is not an Int") - } - // Second should be a String - guard let msg = values[1] as? String else { - throw AppError.DataFormatError("Fortune message '\(String(describing: values[1]))' is not a String") - } - self.init(id: Int(id), message: msg) - } - -} - -extension Fortune: Comparable { - - public static func == (lhs: Fortune, rhs: Fortune) -> Bool { - return lhs.id == rhs.id && lhs.message == rhs.message - } - - public static func < (lhs: Fortune, rhs: Fortune) -> Bool { - return lhs.message < rhs.message || (lhs.message == rhs.message && lhs.id < rhs.id) - } - -} diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerCommon/RandomRow.swift b/frameworks/Swift/kitura/Sources/TechEmpowerCommon/RandomRow.swift deleted file mode 100644 index 053dc6cba11..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerCommon/RandomRow.swift +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation - -// Return a random number within the range of rows in the database -private func randomNumberGenerator(_ maxVal: Int) -> Int { - #if os(Linux) - return Int(random() % maxVal) + 1 - #else - return Int(arc4random_uniform(UInt32(maxVal))) + 1 - #endif -} - -public struct RandomRow: Codable { - - /// The number of rows in the World table - public static let dbRows = 10000 - - /// The maximum value for randomNumber - public static let maxValue = 10000 - - /// A generated random row id suitable for retrieving - /// or creating a RandomRow instance. - public static var randomId: Int { - return randomNumberGenerator(dbRows) - } - - /// A generated random value suitable for assigning as the - /// `randomNumber` for a RandomRow instance. - public static var randomValue: Int { - return randomNumberGenerator(maxValue) - } - - /// The id for this RandomRow, ranging from 1 to dbRows - public let id: Int - - /// A random number ranging from 1 to maxValue - public let randomNumber: Int - - public init(id: Int, randomNumber: Int) { - self.id = id - self.randomNumber = randomNumber - } - - /// Map the properties of this type to their corresponding database - /// column names (required by the ORM). - enum CodingKeys: String, CodingKey { - case id - case randomNumber = "randomnumber" - } - - /// Returns a JSON-convertible dictionary representation of this RandomRow. - public func asDictionary() -> [String: Int] { - return ["id": self.id, "randomNumber": self.randomNumber] - } -} diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/Mongo.swift b/frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/Mongo.swift deleted file mode 100644 index b4398d0523b..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/Mongo.swift +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import LoggerAPI -import Configuration -import MongoKitten -import TechEmpowerCommon - -#if os(Linux) - import Glibc -#else - import Darwin -#endif - -public enum MongoAppError: Error { - case MongoError(String) -} - -// We will load our database configuration from config.json, but this can be -// overridden with the TFB_DB_CONFIG environment variable. -let configurationFilename: String = ProcessInfo.processInfo.environment["TFB_DB_CONFIG"] ?? "config.json" -let manager = ConfigurationManager().load(file: configurationFilename, relativeFrom: .pwd).load(.environmentVariables) - -let dbHost = manager["DB_HOST"] as? String ?? manager["mongodb:host"] as? String ?? "localhost" -let dbPort = Int32(manager["DB_PORT"] as? String != nil ? Int(manager["DB_PORT"] as! String) ?? 27017 : manager["mongodb:port"] as? Int ?? 27017) -let dbName = manager["mongodb:name"] as? String ?? "hello_world" -let dbUser = manager["mongodb:user"] as? String ?? "benchmarkdbuser" -let dbPass = manager["mongodb:password"] as? String ?? "benchmarkdbpass" - -let dbRows = 10000 -let maxValue = 10000 - -var myDatabase: MongoKitten.Database? -var world: MongoKitten.Collection? -var fortune: MongoKitten.Collection? - -func connectToDB() throws { - let connectString = "mongodb://\(dbHost):\(dbPort)/\(dbName)" - Log.info("Connect string = \(connectString)") - //myDatabase = try MongoKitten.Database("mongodb://\(dbUser):\(dbPass)@\(dbHost):\(dbPort)/\(dbName)") - myDatabase = try MongoKitten.Database(connectString) - guard let myDatabase = myDatabase else { - throw AppError.ConnectionError("Nil MongoDB connection to \(connectString)") - } - guard myDatabase.server.isConnected else { - throw AppError.ConnectionError("Not connected to \(connectString)") - } - world = myDatabase["world"] - fortune = myDatabase["fortune"] -} - -// Allow construction of a Fortune from a MongoKitten Document -extension Fortune { - init(document: Document) throws { - if let id = Int(document["_id"]), let message = String(document["message"]) { - self.init(id: id, message: message) - } else { - throw AppError.DataFormatError("Expected fields of Fortune document could not be retreived") - } - } -} - -func getFortunes() throws -> [Fortune] { - guard let fortune = fortune else { - throw MongoAppError.MongoError("Fortune collection not initialized") - } - -// let allFortunes: [Document] = Array(try fortune.find()) - let allFortunes = try fortune.find() - let resultFortunes: [Fortune] = try allFortunes.map { try Fortune.init(document: $0) } - return resultFortunes -} - -// Get a random row (range 1 to 10,000) from DB: id(int),randomNumber(int) -// Convert to object using object-relational mapping (ORM) tool -// Serialize object to JSON - example: {"id":3217,"randomNumber":2149} -func getRandomRow() throws -> [String:Int] { - guard let world = world else { - throw MongoAppError.MongoError("World collection not initialized") - } - - let rnd = RandomRow.randomId - let result = try world.findOne("_id" == rnd) - guard let document = result else { - throw AppError.DataFormatError("World entry id=\(rnd) not found") - } - guard let id = Int(document["_id"]), let randomNumber = Int(document["randomNumber"]) else { - throw AppError.DataFormatError("Expected fields of World document could not be retreived") - } - return ["id":id, "randomNumber":Int(randomNumber)] -} - -// Updates a row of World to a new value. -func updateRandomRow() throws -> [String:Int] { - guard let world = world else { - throw MongoAppError.MongoError("World collection not initialized") - } - - let rnd = RandomRow.randomId - let rndValue = RandomRow.randomValue - let document = try world.findAndUpdate("_id" == rnd, with: ["randomNumber": rndValue]) - guard let id = Int(document["_id"]), let randomNumber = Int(document["randomNumber"]) else { - throw AppError.DataFormatError("Expected fields of World document could not be retreived") - } - return ["id":id, "randomNumber":Int(randomNumber)] -} - - - diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/main.swift b/frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/main.swift deleted file mode 100644 index d57d3a7937f..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerMongoKitten/main.swift +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Kitura -import LoggerAPI -import HeliumLogger -import MongoKitten -import KituraStencil -import Stencil -//import KituraMustache -import TechEmpowerCommon - -Log.logger = HeliumLogger(.info) - -// Stencil stuff -let ext = Extension() - -// Stencil does not yet support automatic HTML escaping: -// https://github.com/kylef/Stencil/pull/80 -// -ext.registerFilter("htmlencode") { (value: Any?) in - if let value = value as? String { - return value - .replacingOccurrences(of: "&", with: "&") - .replacingOccurrences(of: "<", with: "<") - .replacingOccurrences(of: ">", with: ">") - .replacingOccurrences(of: "'", with: "'") - .replacingOccurrences(of: "\"", with: """) - } - return value -} - -let router = Router() -router.add(templateEngine: StencilTemplateEngine(extension: ext)) -//router.add(templateEngine: MustacheTemplateEngine()) - -// -// TechEmpower test 2: Single database query (raw, no ORM) -// -router.get("/db") { - request, response, next in - response.headers["Server"] = "Kitura" - let dict = try getRandomRow() - try response.status(.OK).send(json: dict).end() -} - -// -// TechEmpower test 3: Multiple database queries (raw, no ORM) -// Get param provides number of queries: /queries?queries=N -// -router.get("/queries") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - var results: [[String:Int]] = [] - for _ in 1...numQueries { - let dict = try getRandomRow() - results.append(dict) - } - // Return JSON representation of array of results - try response.status(.OK).send(json: results).end() -} - -// -// TechEmpower test 4: fortunes (raw, no ORM) -// -router.get("/fortunes") { - request, response, next in - response.headers["Server"] = "Kitura" - response.headers["Content-Type"] = "text/html; charset=UTF-8" - var fortunes = try getFortunes() - fortunes.append(Fortune(id: 0, message: "Additional fortune added at request time.")) - - try response.render("fortunes.stencil", context: ["fortunes": fortunes.sorted()]).end() - //try response.render("fortunes.mustache", context: ["fortunes": fortunes.sorted()]).end() -} - -// -// TechEmpower test 5: updates (raw, no ORM) -// -router.get("/updates") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - var results: [[String:Int]] = [] - for _ in 1...numQueries { - let dict = try updateRandomRow() - results.append(dict) - } - - // Return JSON representation of array of results - try response.status(.OK).send(json: results).end() -} - -// Initialize MongoDB connection -do { - try connectToDB() -} catch { - print("Error connecting to database: \(error)") -} - -Kitura.addHTTPServer(onPort: 8080, with: router) -Kitura.run() diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerPostgres/main.swift b/frameworks/Swift/kitura/Sources/TechEmpowerPostgres/main.swift deleted file mode 100644 index e6bfed0b8b7..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerPostgres/main.swift +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import Kitura -import LoggerAPI -import HeliumLogger -import KituraStencil -import Stencil -import TechEmpowerCommon -import KueryPostgresRaw - -Log.logger = HeliumLogger(.info) - -// Stencil stuff -let ext = Extension() - -// Stencil does not yet support automatic HTML escaping: -// https://github.com/kylef/Stencil/pull/80 -// -ext.registerFilter("htmlencode") { (value: Any?) in - if let value = value as? String { - return value - .replacingOccurrences(of: "&", with: "&") - .replacingOccurrences(of: "<", with: "<") - .replacingOccurrences(of: ">", with: ">") - .replacingOccurrences(of: "'", with: "'") - .replacingOccurrences(of: "\"", with: """) - } - return value -} - -let router = Router() -router.add(templateEngine: StencilTemplateEngine(extension: ext)) - -// -// TechEmpower test 2: Single database query (raw, no ORM) -// -router.get("/db") { - request, response, next in - response.headers["Server"] = "Kitura" - getRandomRow_Raw { (row, err) in - guard let row = row else { - guard let err = err else { - Log.error("Unknown Error") - try? response.status(.badRequest).send("Unknown error").end() - return - } - Log.error("\(err)") - try? response.status(.badRequest).send("Error: \(err)").end() - return - } - try? response.status(.OK).send(json: row.asDictionary()).end() - } -} - -// -// TechEmpower test 3: Multiple database queries (raw, no ORM) -// Get param provides number of queries: /queries?queries=N -// -router.get("/queries") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - getRandomRows_Raw(count: numQueries) { (rows, err) in - if let rows = rows { - try? response.status(.OK).send(json: rows).end() - } else if let err = err { - try? response.status(.badRequest).send("Error: \(err)").end() - } else { - fatalError("Unexpected: rows and err both nil") - } - } -} - -router.get("/queriesParallel") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - var results: [[String:Int]] = [] - // Used to protect result array from concurrent modification - let updateLock = DispatchSemaphore(value: 1) - // Execute each query. Each callback will append its result to `results` - for _ in 1...numQueries { - getRandomRow_Raw { (row, err) in - guard let row = row else { - guard let err = err else { - Log.error("Unknown Error") - try? response.status(.badRequest).send("Unknown error").end() - return - } - Log.error("\(err)") - try? response.status(.badRequest).send("Error: \(err)").end() - return - } - updateLock.wait() - results.append(row.asDictionary()) - if results.count == numQueries { - // Return JSON representation of array of results - try? response.status(.OK).send(json: results).end() - } - updateLock.signal() - } - } -} - -// -// TechEmpower test 4: fortunes (raw, no ORM) -// -router.get("/fortunes") { - request, response, next in - response.headers["Server"] = "Kitura" - response.headers["Content-Type"] = "text/html; charset=UTF-8" - getFortunes { (fortunes, err) in - guard var fortunes = fortunes else { - guard let err = err else { - Log.error("Unknown Error") - try? response.status(.badRequest).send("Unknown error").end() - return - } - Log.error("\(err)") - try? response.status(.badRequest).send("Error: \(err)").end() - return - } - fortunes.append(Fortune(id: 0, message: "Additional fortune added at request time.")) - do { - try response.render("fortunes.stencil", context: ["fortunes": fortunes.sorted()]).end() - } catch { - print("Error: \(error)") - } - } -} - -// -// TechEmpower test 5: updates (raw, no ORM) -// -router.get("/updates") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - updateRandomRows_Raw(count: numQueries) { (rows, err) in - if let rows = rows { - try? response.status(.OK).send(json: rows).end() - } else if let err = err { - try? response.status(.badRequest).send("Error: \(err)").end() - } else { - fatalError("Unexpected: rows and err both nil") - } - } -} - - -router.get("/updatesParallel") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - var results: [[String:Int]] = [] - // Used to protect result array from concurrent modification - let updateLock = DispatchSemaphore(value: 1) - // Execute each query. Each callback will append its result to `results` - for _ in 1...numQueries { - getRandomRow_Raw { (row, err) in - guard let row = row else { - guard let err = err else { - Log.error("Unknown Error") - try? response.status(.badRequest).send("Unknown error").end() - return - } - Log.error("\(err)") - try? response.status(.badRequest).send("Error: \(err)").end() - return - } - // Execute inner callback for updating the row - updateRow_Raw(id: row.id) { (err) in - if let err = err { - try? response.status(.badRequest).send("Error: \(err)").end() - return - } - updateLock.wait() - results.append(row.asDictionary()) - if results.count == numQueries { - // Return JSON representation of array of results - try? response.status(.OK).send(json: results).end() - } - updateLock.signal() - } - } - } -} - - -Kitura.addHTTPServer(onPort: 8080, with: router) -Kitura.run() diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/Fortune+Mustache.swift b/frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/Fortune+Mustache.swift deleted file mode 100644 index ba747436c06..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/Fortune+Mustache.swift +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Mustache -import TechEmpowerCommon - -extension Fortune: MustacheBoxable { - public var mustacheBox: MustacheBox { - return Box(["id": self.id, "message": self.message]) - } -} diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/main.swift b/frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/main.swift deleted file mode 100644 index 6fa6531c56d..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresMustache/main.swift +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Kitura -import LoggerAPI -import HeliumLogger -import KituraMustache -import TechEmpowerCommon -import KueryPostgresRaw - -Log.logger = HeliumLogger(.info) - -let router = Router() -router.add(templateEngine: MustacheTemplateEngine()) - -// -// TechEmpower test 4: fortunes (raw, no ORM) -// -router.get("/fortunes") { - request, response, next in - response.headers["Server"] = "Kitura" - response.headers["Content-Type"] = "text/html; charset=UTF-8" - getFortunes { (fortunes, err) in - guard var fortunes = fortunes else { - guard let err = err else { - Log.error("Unknown Error") - try? response.status(.badRequest).send("Unknown error").end() - return - } - Log.error("\(err)") - try? response.status(.badRequest).send("Error: \(err)").end() - return - } - fortunes.append(Fortune(id: 0, message: "Additional fortune added at request time.")) - do { - try response.render("fortunes.mustache", context: ["fortunes": fortunes.sorted()]).end() - } catch { - print("Error: \(error)") - } - } -} - -Kitura.addHTTPServer(onPort: 8080, with: router) -Kitura.run() diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresORM/main.swift b/frameworks/Swift/kitura/Sources/TechEmpowerPostgresORM/main.swift deleted file mode 100644 index 56c1cdd9cb6..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresORM/main.swift +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import Kitura -import LoggerAPI -import HeliumLogger -import KituraStencil -import Stencil -import TechEmpowerCommon -import KueryPostgresORM - -Log.logger = HeliumLogger(.info) - -// Stencil stuff -let ext = Extension() - -// Stencil does not yet support automatic HTML escaping: -// https://github.com/kylef/Stencil/pull/80 -// -ext.registerFilter("htmlencode") { (value: Any?) in - if let value = value as? String { - return value - .replacingOccurrences(of: "&", with: "&") - .replacingOccurrences(of: "<", with: "<") - .replacingOccurrences(of: ">", with: ">") - .replacingOccurrences(of: "'", with: "'") - .replacingOccurrences(of: "\"", with: """) - } - return value -} - -let router = Router() -router.add(templateEngine: StencilTemplateEngine(extension: ext)) - -setupORM() - -// -// TechEmpower test 2: Single database query (full ORM) -// -router.get("/db") { - request, response, next in - response.headers["Server"] = "Kitura" - getRandomRow { (row, err) in - guard let row = row else { - guard let err = err else { - Log.error("Unknown Error") - try? response.status(.badRequest).send("Unknown error").end() - return - } - Log.error("\(err)") - try? response.status(.badRequest).send("Error: \(err)").end() - return - } - try? response.status(.OK).send(json: row.asDictionary()).end() - } -} - -// -// TechEmpower test 3: Multiple database queries (full ORM) -// Get param provides number of queries: /queries?queries=N -// -router.get("/queries") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - getRandomRows(count: numQueries) { (rows, err) in - if let rows = rows { - try? response.status(.OK).send(json: rows).end() - } else if let err = err { - try? response.status(.badRequest).send("Error: \(err)").end() - } else { - fatalError("Unexpected: rows and err both nil") - } - } -} - -router.get("/queriesParallel") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - getRandomRowsParallel(count: numQueries) { (rows, err) in - if let rows = rows { - try? response.status(.OK).send(json: rows).end() - } else if let err = err { - try? response.status(.badRequest).send("Error: \(err)").end() - } else { - fatalError("Unexpected: rows and err both nil") - } - } -} - -// -// TechEmpower test 4: fortunes (full ORM) -// -router.get("/fortunes") { - request, response, next in - response.headers["Server"] = "Kitura" - response.headers["Content-Type"] = "text/html; charset=UTF-8" - Fortune.findAll { (fortunes, err) in - if var fortunes = fortunes { - fortunes.append(Fortune(id: 0, message: "Additional fortune added at request time.")) - do { - try response.render("fortunes.stencil", context: ["fortunes": fortunes.sorted()]).end() - } catch { - try? response.status(.internalServerError).send("Error: \(error)").end() - } - } else { - try? response.status(.internalServerError).send("Error: \(err ?? .internalServerError)").end() - } - } -} - -// -// TechEmpower test 5: updates (full ORM) -// -router.get("/updates") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - updateRandomRows(count: numQueries) { (rows, err) in - if let rows = rows { - try? response.status(.OK).send(json: rows).end() - } else if let err = err { - try? response.status(.badRequest).send("Error: \(err)").end() - } else { - fatalError("Unexpected: rows and err both nil") - } - } -} - -router.get("/updatesParallel") { - request, response, next in - response.headers["Server"] = "Kitura" - let queriesParam = request.queryParameters["queries"] ?? "1" - let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec - updateRandomRowsParallel(count: numQueries) { (rows, err) in - if let rows = rows { - try? response.status(.OK).send(json: rows).end() - } else if let err = err { - try? response.status(.badRequest).send("Error: \(err)").end() - } else { - fatalError("Unexpected: rows and err both nil") - } - } -} - - -Kitura.addHTTPServer(onPort: 8080, with: router) -Kitura.run() diff --git a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresORMCodable/main.swift b/frameworks/Swift/kitura/Sources/TechEmpowerPostgresORMCodable/main.swift deleted file mode 100644 index 1e3cd6b05cd..00000000000 --- a/frameworks/Swift/kitura/Sources/TechEmpowerPostgresORMCodable/main.swift +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright IBM Corporation 2018 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Foundation -import Kitura -import LoggerAPI -import HeliumLogger -import KituraStencil -import Stencil -import TechEmpowerCommon -import KueryPostgres -import SwiftKueryORM -import KueryPostgresORM - -Log.logger = HeliumLogger(.info) - -// Stencil stuff -let ext = Extension() - -// Stencil does not yet support automatic HTML escaping: -// https://github.com/kylef/Stencil/pull/80 -// -ext.registerFilter("htmlencode") { (value: Any?) in - if let value = value as? String { - return value - .replacingOccurrences(of: "&", with: "&") - .replacingOccurrences(of: "<", with: "<") - .replacingOccurrences(of: ">", with: ">") - .replacingOccurrences(of: "'", with: "'") - .replacingOccurrences(of: "\"", with: """) - } - return value -} - -let router = Router() -router.add(templateEngine: StencilTemplateEngine(extension: ext)) - -// Configure our ORM Database connection pool as dbConnPool created by KueryPostgres -Database.default = Database(dbConnPool) - -// Define the query parameters we can receive -struct TFBParams: QueryParams { - let queries: Int - - // Override default decode to cater for the query parameter specification: - // If the parameter is missing, is not an integer, or is an integer less - // than 1, the value should be interpreted as 1. - // This means that rather than failing to decode on a non-integer value, we - // should fall back to a value of 1. - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - if let value = try? container.decode(Int.self, forKey: CodingKeys.queries) { - self.queries = value - } else { - self.queries = 1 - } - } -} - -// Set Server header on all responses as per TechEmpower spec -router.all("/*") { - _, response, next in - response.headers["Server"] = "Kitura" - next() -} - -// -// TechEmpower test 2: Single database query (full ORM) -// -router.get("/db") { (respondWith: @escaping (RandomRow?, RequestError?) -> Void) in - // Select random row from database range - RandomRow.find(id: RandomRow.randomId, respondWith) -} - -// -// TechEmpower test 3: Multiple database queries (full ORM) -// Get param provides number of queries: /queries?queries=N -// -router.get("/queries") { (params: TFBParams, respondWith: @escaping ([RandomRow]?, RequestError?) -> Void) in - let numQueries = max(1, min(params.queries, 500)) // Snap to range of 1-500 as per test spec - getRandomRows(count: numQueries, completion: respondWith) -} -router.get("/queriesParallel") { (params: TFBParams, respondWith: @escaping ([RandomRow]?, RequestError?) -> Void) in - let numQueries = max(1, min(params.queries, 500)) // Snap to range of 1-500 as per test spec - getRandomRowsParallel(count: numQueries, completion: respondWith) -} - -// -// TechEmpower test 4: fortunes (full ORM) -// TODO: convert to Codable once templating support is available -// -router.get("/fortunes") { - request, response, next in - response.headers["Content-Type"] = "text/html; charset=UTF-8" - Fortune.findAll { (fortunes, err) in - if var fortunes = fortunes { - fortunes.append(Fortune(id: 0, message: "Additional fortune added at request time.")) - do { - try response.render("fortunes.stencil", context: ["fortunes": fortunes.sorted()]).end() - } catch { - try? response.status(.internalServerError).send("Error: \(error)").end() - } - } else { - try? response.status(.internalServerError).send("Error: \(err ?? .internalServerError)").end() - } - } -} - -// -// TechEmpower test 5: updates (full ORM) -// -router.get("/updates") { (params: TFBParams, respondWith: @escaping ([RandomRow]?, RequestError?) -> Void) in - let numQueries = max(1, min(params.queries, 500)) // Snap to range of 1-500 as per test spec - updateRandomRows(count: numQueries, completion: respondWith) -} -router.get("/updatesParallel") { (params: TFBParams, respondWith: @escaping ([RandomRow]?, RequestError?) -> Void) in - let numQueries = max(1, min(params.queries, 500)) // Snap to range of 1-500 as per test spec - updateRandomRowsParallel(count: numQueries, completion: respondWith) -} - - -Kitura.addHTTPServer(onPort: 8080, with: router) -Kitura.run() diff --git a/frameworks/Swift/kitura/Views/fortunes.mustache b/frameworks/Swift/kitura/Views/fortunes.mustache deleted file mode 100644 index b0b428ad908..00000000000 --- a/frameworks/Swift/kitura/Views/fortunes.mustache +++ /dev/null @@ -1,12 +0,0 @@ - - -Fortunes - - - -{{#fortunes}} - -{{/fortunes}} -
idmessage
{{id}}{{message}}
- - diff --git a/frameworks/Swift/kitura/Views/fortunes.stencil b/frameworks/Swift/kitura/Views/fortunes.stencil deleted file mode 100644 index 8076e082f24..00000000000 --- a/frameworks/Swift/kitura/Views/fortunes.stencil +++ /dev/null @@ -1,10 +0,0 @@ - - -Fortunes - - -{% for fortune in fortunes %} -{% endfor %} -
idmessage
{{ fortune.id }}{{ fortune.message | htmlencode }}
- - diff --git a/frameworks/Swift/kitura/benchmark_config.json b/frameworks/Swift/kitura/benchmark_config.json deleted file mode 100644 index e623175df5d..00000000000 --- a/frameworks/Swift/kitura/benchmark_config.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "framework": "kitura", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "none", - "framework": "Kitura", - "language": "Swift", - "orm": "none", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "postgres": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Raw", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "postgres-orm": { - "db_url": "/db", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Full", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "postgres-orm-codable": { - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Full", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "mongodb": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "MongoDB", - "framework": "Kitura", - "language": "Swift", - "orm": "Raw", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "gcd": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "none", - "framework": "Kitura", - "language": "Swift", - "orm": "none", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "nio": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "none", - "framework": "Kitura", - "language": "Swift", - "orm": "none", - "platform": "KituraNIO", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "gcd-postgres": { - "db_url": "/db", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Raw", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "nio-postgres": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Raw", - "platform": "KituraNIO", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "gcd-postgres-orm": { - "db_url": "/db", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Full", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "nio-postgres-orm": { - "db_url": "/db", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Full", - "platform": "KituraNIO", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "gcd-postgres-orm-codable": { - "db_url": "/db", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Full", - "platform": "KituraNet", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - }, - "nio-postgres-orm-codable": { - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Kitura", - "language": "Swift", - "orm": "Full", - "platform": "KituraNIO", - "webserver": "Kitura", - "os": "Linux", - "database_os": "Linux", - "display_name": "Kitura", - "notes": "", - "tags": ["broken"] - } - }] -} diff --git a/frameworks/Swift/kitura/config.json b/frameworks/Swift/kitura/config.json deleted file mode 100644 index 1c8e7fe38c3..00000000000 --- a/frameworks/Swift/kitura/config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db": { - "host": "tfb-database", - "port": 5432, - "name": "hello_world", - "user": "benchmarkdbuser", - "password": "benchmarkdbpass" - }, - "mongodb": { - "host": "tfb-database", - "port": 27017, - "name": "hello_world", - "user": "benchmarkdbuser", - "password": "benchmarkdbpass" - } -} diff --git a/frameworks/Swift/kitura/config.toml b/frameworks/Swift/kitura/config.toml deleted file mode 100644 index 774e2f69587..00000000000 --- a/frameworks/Swift/kitura/config.toml +++ /dev/null @@ -1,178 +0,0 @@ -[framework] -name = "kitura" - -[postgres-orm] -urls.db = "/db" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[gcd-postgres-orm-codable] -urls.db = "/db" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[gcd] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Fullstack" -database = "none" -database_os = "Linux" -os = "Linux" -orm = "none" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Fullstack" -database = "none" -database_os = "Linux" -os = "Linux" -orm = "none" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[mongodb] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "MongoDB" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[nio] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Fullstack" -database = "none" -database_os = "Linux" -os = "Linux" -orm = "none" -platform = "KituraNIO" -webserver = "Kitura" -versus = "None" - -[gcd-postgres-orm] -urls.db = "/db" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[nio-postgres-orm] -urls.db = "/db" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "KituraNIO" -webserver = "Kitura" -versus = "None" - -[nio-postgres] -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 = "KituraNIO" -webserver = "Kitura" -versus = "None" - -[postgres-orm-codable] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[nio-postgres-orm-codable] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "KituraNIO" -webserver = "Kitura" -versus = "None" - -[gcd-postgres] -urls.db = "/db" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "KituraNet" -webserver = "Kitura" -versus = "None" - -[postgres] -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 = "KituraNet" -webserver = "Kitura" -versus = "None" diff --git a/frameworks/Swift/kitura/kitura-gcd-postgres-orm-codable.dockerfile b/frameworks/Swift/kitura/kitura-gcd-postgres-orm-codable.dockerfile deleted file mode 100644 index 2947f1ac419..00000000000 --- a/frameworks/Swift/kitura/kitura-gcd-postgres-orm-codable.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release -Xswiftc -DGCD_ASYNCH - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgresORMCodable diff --git a/frameworks/Swift/kitura/kitura-gcd-postgres-orm.dockerfile b/frameworks/Swift/kitura/kitura-gcd-postgres-orm.dockerfile deleted file mode 100644 index 8a76a84f73c..00000000000 --- a/frameworks/Swift/kitura/kitura-gcd-postgres-orm.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release -Xswiftc -DGCD_ASYNCH - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgresORM diff --git a/frameworks/Swift/kitura/kitura-gcd-postgres.dockerfile b/frameworks/Swift/kitura/kitura-gcd-postgres.dockerfile deleted file mode 100644 index 8f0a3f598dd..00000000000 --- a/frameworks/Swift/kitura/kitura-gcd-postgres.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release -Xswiftc -DGCD_ASYNCH - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgres diff --git a/frameworks/Swift/kitura/kitura-gcd.dockerfile b/frameworks/Swift/kitura/kitura-gcd.dockerfile deleted file mode 100644 index 11f0c6a8674..00000000000 --- a/frameworks/Swift/kitura/kitura-gcd.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release -Xswiftc -DGCD_ASYNCH - -EXPOSE 8080 - -CMD .build/release/TechEmpower diff --git a/frameworks/Swift/kitura/kitura-mongodb.dockerfile b/frameworks/Swift/kitura/kitura-mongodb.dockerfile deleted file mode 100644 index 8c8a7943d9b..00000000000 --- a/frameworks/Swift/kitura/kitura-mongodb.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpowerMongoKitten diff --git a/frameworks/Swift/kitura/kitura-nio-postgres-orm-codable.dockerfile b/frameworks/Swift/kitura/kitura-nio-postgres-orm-codable.dockerfile deleted file mode 100644 index dca3f44804e..00000000000 --- a/frameworks/Swift/kitura/kitura-nio-postgres-orm-codable.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -ENV KITURA_NIO=1 -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgresORMCodable diff --git a/frameworks/Swift/kitura/kitura-nio-postgres-orm.dockerfile b/frameworks/Swift/kitura/kitura-nio-postgres-orm.dockerfile deleted file mode 100644 index 37808bba760..00000000000 --- a/frameworks/Swift/kitura/kitura-nio-postgres-orm.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -ENV KITURA_NIO=1 -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgresORM diff --git a/frameworks/Swift/kitura/kitura-nio-postgres.dockerfile b/frameworks/Swift/kitura/kitura-nio-postgres.dockerfile deleted file mode 100644 index 0254fda2bdc..00000000000 --- a/frameworks/Swift/kitura/kitura-nio-postgres.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -ENV KITURA_NIO=1 -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgres diff --git a/frameworks/Swift/kitura/kitura-nio.dockerfile b/frameworks/Swift/kitura/kitura-nio.dockerfile deleted file mode 100644 index c19a4d71cf4..00000000000 --- a/frameworks/Swift/kitura/kitura-nio.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -ENV KITURA_NIO=1 -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpower diff --git a/frameworks/Swift/kitura/kitura-postgres-orm-codable.dockerfile b/frameworks/Swift/kitura/kitura-postgres-orm-codable.dockerfile deleted file mode 100644 index 39f69975b95..00000000000 --- a/frameworks/Swift/kitura/kitura-postgres-orm-codable.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgresORMCodable diff --git a/frameworks/Swift/kitura/kitura-postgres-orm.dockerfile b/frameworks/Swift/kitura/kitura-postgres-orm.dockerfile deleted file mode 100644 index 628a987c72f..00000000000 --- a/frameworks/Swift/kitura/kitura-postgres-orm.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgresORM diff --git a/frameworks/Swift/kitura/kitura-postgres.dockerfile b/frameworks/Swift/kitura/kitura-postgres.dockerfile deleted file mode 100644 index b7075dce6a2..00000000000 --- a/frameworks/Swift/kitura/kitura-postgres.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpowerPostgres diff --git a/frameworks/Swift/kitura/kitura.dockerfile b/frameworks/Swift/kitura/kitura.dockerfile deleted file mode 100644 index b720d4aa1b6..00000000000 --- a/frameworks/Swift/kitura/kitura.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD ./ /kitura -WORKDIR /kitura -RUN apt-get update -yqq && apt-get install -yqq libpq-dev -RUN swift build -c release - -EXPOSE 8080 - -CMD .build/release/TechEmpower diff --git a/frameworks/Swift/perfect/.gitignore b/frameworks/Swift/perfect/.gitignore deleted file mode 100644 index 94822102415..00000000000 --- a/frameworks/Swift/perfect/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.DS_Store -.build -build_gcd -.swiftenv -Packages -*.xcodeproj diff --git a/frameworks/Swift/perfect/Package.swift b/frameworks/Swift/perfect/Package.swift deleted file mode 100644 index 1735285d618..00000000000 --- a/frameworks/Swift/perfect/Package.swift +++ /dev/null @@ -1,25 +0,0 @@ -// swift-tools-version:4.0 - -import PackageDescription - -let package = Package( - name: "Perfect-TechEmpower", - products: [ - .executable(name: "Perfect", targets: ["Perfect"]), - .executable(name: "Perfect-MySQL", targets: ["Perfect-MySQL"]), - .executable(name: "Perfect-PostgreSQL", targets: ["Perfect-PostgreSQL"]), - .executable(name: "Perfect-MongoDB", targets: ["Perfect-MongoDB"]) - ], - dependencies: [ - .package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", from: "3.0.0"), - .package(url:"https://github.com/PerfectlySoft/Perfect-MySQL.git", from: "3.0.0"), - .package(url: "https://github.com/PerfectlySoft/Perfect-PostgreSQL.git", from: "3.0.0"), - .package(url:"https://github.com/PerfectlySoft/Perfect-MongoDB.git", from: "3.0.0") - ], - targets: [ - .target(name: "Perfect", dependencies: ["PerfectHTTPServer"]), - .target(name: "Perfect-MySQL", dependencies: ["PerfectHTTPServer", "PerfectMySQL"]), - .target(name: "Perfect-PostgreSQL", dependencies: ["PerfectHTTPServer", "PerfectPostgreSQL"]), - .target(name: "Perfect-MongoDB", dependencies: ["PerfectHTTPServer", "PerfectMongoDB"]) - ] -) diff --git a/frameworks/Swift/perfect/README.md b/frameworks/Swift/perfect/README.md deleted file mode 100644 index ee78448860f..00000000000 --- a/frameworks/Swift/perfect/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# [Perfect](https://www.perfect.org) Benchmark Test - -This is the [Perfect](https://www.perfect.org) portion of a [benchmarking test suite](https://www.techempower.com/benchmarks/) comparing a variety of web development platforms. - -## Variants - -There is are four versions of the benchmark, three of which use databases: -- `Perfect`: No DB -- `Perfect-MySQL`: Using MySQL -- `Perfect-PostgreSQL`: Using PostgreSQL -- `Perfect-MongoDB`: Using MongoDB - -Each listens on port 8080, and use common URLs described below. - -## Versions and Dependencies - -This version of the benchmark requires Swift 4.1, and uses the following versions of Perfect and dependencies: - -- [Perfect 3.0](https://github.com/PerfectlySoft/Perfect-HTTPServer.git) -- [Perfect-MySQL 3.0](https://github.com/PerfectlySoft/Perfect-MySQL.git) -- [Perfect-PostgreSQL 3.0](https://github.com/PerfectlySoft/Perfect-PostgreSQL.git) -- [Perfect-MongoDB 3.0](https://github.com/PerfectlySoft/Perfect-MongoDB.git) - -## Test URLs -### JSON serialization - -http://localhost:8080/json - -### Plaintext - -http://localhost:8080/plaintext - -### DB Store - on all configurations - -http://localhost:8080/db - -### Queries - on all configurations - -http://localhost:8080/queries/queries=2 - -### Updates - on all configurations - -http://localhost:8080/updates/queries=2 \ No newline at end of file diff --git a/frameworks/Swift/perfect/Sources/Perfect-MongoDB/main.swift b/frameworks/Swift/perfect/Sources/Perfect-MongoDB/main.swift deleted file mode 100644 index 73c8460a17e..00000000000 --- a/frameworks/Swift/perfect/Sources/Perfect-MongoDB/main.swift +++ /dev/null @@ -1,316 +0,0 @@ -import PerfectHTTP -import PerfectHTTPServer -import PerfectLib -import PerfectMongoDB -import Foundation - -let tfbHost = "tfb-database" -let database = "hello_world" -let username = "benchmarkdbuser" -let password = "benchmarkdbpass" - -let client = try! MongoClient(uri: "mongodb://\(tfbHost)") -let db = client.getDatabase(name: database) -let World = db.getCollection(name: "world") -let Fortune = db.getCollection(name: "fortune") - -class LinearCongruntialGenerator { - - var state = 0 //seed of 0 by default - let a, c, m, shift: Int - - init() { - self.a = 214013 - self.c = 2531011 - self.m = Int(pow(2.0, 31.0)) //2^31 or 2147483648 - self.shift = 16 - } - - func random() -> Int { - state = (a * state + c) % m - return state >> shift - } -} - -let numGenerator = LinearCongruntialGenerator() - -func fetchFromWorld(id: String?) -> [String: Any] { - - var rand:Int = 0 - - if id == nil { - rand = numGenerator.random() % 10000 + 1 - } else { - rand = Int(id!)! - } - - if let world = World { - - var json = [String:Any]() - json["id"] = rand - - var fields = [String: Any]() - fields["id"] = 1 - fields["randomNumber"] = 1 - fields["_id"] = 0 - - var fieldString: String = "" - - do { - fieldString = try fields.jsonEncodedString() - } catch { - fieldString = String(describing: fields) - } - - do { - let jsonString = try json.jsonEncodedString() - do { - let results = try world.find(query: BSON( json: jsonString ), fields: BSON( json: fieldString )) - - if let res = results { - for item in res { - let itemString = String(describing: item) - return convertStringToDictionary(str: itemString) - } - } else { - print("results couldn't be unwrapped: ", rand) - } - } catch { - // - } - } catch { - // empty on purpose - } - } else { - // - } - - let emptyObj = [String: Any]() - return emptyObj -} - -func updateOneFromWorld() -> [String: Any] { - - let worldToUpdate = fetchFromWorld(id: nil) - var id = Int() - if worldToUpdate["id"] != nil { - id = worldToUpdate["id"] as! Int - } else { - id = 1 - print("Error trying to fetch a world to update") - } - let newRandom = numGenerator.random() % 10000 - var errorObj = [String: Any]() - - if let world = World { - - var json = [String: Any]() - json["id"] = id - - var fields = [String: Any]() - fields["id"] = 1 - fields["randomNumber"] = 1 - fields["_id"] = 0 - - var update = [String: Any]() - update["randomNumber"] = newRandom - - var fieldString: String = "" - - do { - fieldString = try fields.jsonEncodedString() - } catch { - fieldString = String(describing: fields) - } - - var updateString: String = "" - var jsonString: String = "" - - do { - updateString = try update.jsonEncodedString() - } catch { - updateString = String(describing: update) - } - - do { - jsonString = try json.jsonEncodedString() - } catch { - jsonString = String(describing: json) - } - - do { - let results = try world.findAndModify(query: BSON( json: jsonString ), sort: nil, update: BSON( json: updateString ), fields: BSON( json: fieldString ), remove: false, upsert: false, new: true) - let resultsStr = String(describing: results) - return convertUpdateStringToDictionary(str: resultsStr, id: id) - } catch { - errorObj["id"] = "Error running query findAndModify" - return errorObj - } - } else { - errorObj["id"] = "world is empty" - return errorObj - } -} - -func updatesHandler(request: HTTPRequest, response: HTTPResponse) { - - let queryStr = returnCorrectTuple(queryArr: request.queryParams) - var totalQueries = sanitizeQueryValue(queryString: queryStr) - - var updateArr: Array = [[String: Any]]() - - while 0 < totalQueries { - updateArr.append(updateOneFromWorld()) - totalQueries -= 1 - } - - do { - - response.appendBody(string: try updateArr.jsonEncodedString()) - } catch { - - response.appendBody(string: String(describing: updateArr)) - } - - setHeaders(response: response, contentType: "application/json") - - response.completed() -} - -func multipleDatabaseQueriesHandler(request: HTTPRequest, response: HTTPResponse) { - - let queryStr = returnCorrectTuple(queryArr: request.queryParams) - var totalQueries = sanitizeQueryValue(queryString: queryStr) - - var queryArr = [[String: Any]]() - - while 0 < totalQueries { - - queryArr.append(fetchFromWorld(id: nil)) - totalQueries -= 1 - } - - do { - response.appendBody(string: try queryArr.jsonEncodedString()) - } catch { - response.appendBody(string: String(describing: queryArr)) - } - - setHeaders(response: response, contentType: "application/json") - - response.completed() -} - -func singleDatabaseQueryHandler(request: HTTPRequest, response: HTTPResponse) { - - let res = fetchFromWorld(id: nil) - - do { - response.appendBody(string: try res.jsonEncodedString()) - } catch { - response.appendBody(string: String(describing: res)) - } - - setHeaders(response: response, contentType: "application/json") - response.completed() -} - -// Helpers - -func setHeaders(response: HTTPResponse, contentType: String) { - - response.setHeader(.contentType, value: contentType) - response.setHeader(.custom(name: "Server"), value: "Perfect") - - let currDate: String = getCurrDate() - - response.setHeader(.custom(name: "Date"), value: currDate) -} - -func getCurrDate() -> String { - - let now = getNow() - - do { - let formatted = try formatDate(now, format: "%a, %d %b %Y %H:%M:%S %Z", timezone: nil, locale: nil) - return formatted - } catch { - return "error formatting date string" - } -} - -func returnCorrectTuple(queryArr: [(String, String)]) -> String { - - for tup in queryArr { - if String(describing: tup.0) == "queries" { - return String(describing: tup.1) - } - } - - return "nil" -} - -func sanitizeQueryValue(queryString: String) -> Int { - - if let queryNum = Int(queryString) { - - if queryNum > 0 && queryNum < 500 { - return queryNum - } else if queryNum > 500 { - return 500 - } else { - return 1 - } - } else { - return 1 - } -} - -func spoofHTML(fortunesArr: [[String: Any]]) -> String { - - var htmlToRet = "Fortunes" - - for fortune in fortunesArr { - - htmlToRet += "" - } - - htmlToRet += "
idmessage
\(fortune["id"]!)\(fortune["message"]!)
"; - - return htmlToRet -} - -func convertStringToDictionary(str: String) -> [String: Any] { - - let strOfWordsArray = str.components(separatedBy: " ") - - var returnObj = [String: Any]() - - returnObj["id"] = Int(strOfWordsArray[3].dropLast()) - returnObj["randomNumber"] = Int(strOfWordsArray[6]) - - return returnObj -} - -func convertUpdateStringToDictionary(str: String, id: Int) -> [String: Any] { - - let strOfWordsArray = str.components(separatedBy: " ") - - var returnObj = [String: Any]() - returnObj["id"] = id - returnObj["randomNumber"] = Int(strOfWordsArray[16]) - - return returnObj -} - -var routes = Routes() -routes.add(method: .get, uri: "/updates", handler: updatesHandler) -routes.add(method: .get, uri: "/queries", handler: multipleDatabaseQueriesHandler) -routes.add(method: .get, uri: "/db", handler: singleDatabaseQueryHandler) -routes.add(method: .get, uri: "/**", - handler: StaticFileHandler(documentRoot: "./webroot", allowResponseFilters: true).handleRequest) -try HTTPServer.launch(name: "localhost", - port: 8080, - routes: routes, - responseFilters: [ - (PerfectHTTPServer.HTTPFilter.contentCompression(data: [:]), HTTPFilterPriority.high)]) diff --git a/frameworks/Swift/perfect/Sources/Perfect-MySQL/main.swift b/frameworks/Swift/perfect/Sources/Perfect-MySQL/main.swift deleted file mode 100644 index 0fc5d5cdc92..00000000000 --- a/frameworks/Swift/perfect/Sources/Perfect-MySQL/main.swift +++ /dev/null @@ -1,313 +0,0 @@ -import PerfectHTTP -import PerfectHTTPServer -import PerfectLib -import PerfectMySQL -import Foundation - -let tfbHost = "tfb-database" -let database = "hello_world" -let username = "benchmarkdbuser" -let password = "benchmarkdbpass" - -let mysql = MySQL() -let connected = mysql.connect(host: tfbHost, user: username, password: password) -let _ = mysql.selectDatabase(named: database) - -class LinearCongruntialGenerator { - - var state = 0 - let a, c, m, shift: Int - - init() { - self.a = 214013 - self.c = 2531011 - self.m = Int(pow(2.0, 31.0)) - self.shift = 16 - } - - func random() -> Int { - state = (a * state + c) % m - return state >> shift - } -} - -let numGenerator = LinearCongruntialGenerator() - -func fetchFromFortune() -> [[String: String]] { - - var arrOfFortunes = [[String: String]]() - let querySuccess = mysql.query(statement: "SELECT id, message FROM fortune") - - guard querySuccess else { - - let errorObject = ["id": "Failed to execute query"] - arrOfFortunes.append(errorObject) - - return arrOfFortunes - } - - let results = mysql.storeResults()! - - results.forEachRow { row in - if let id = row[0], let message = row[1] { - - let resObj = ["id": String(describing: id), "message": message] - arrOfFortunes.append(resObj) - } else { - print("not correct values returned: ", row) - } - } - - return arrOfFortunes -} - -func fetchFromWorld(id: String?) -> [String:Any] { - - var returnObj = [String: Any]() - var errorObject = [String: Any]() - var rand:Int = 0 - - if id == nil { - rand = numGenerator.random() % 10000 + 1 - } else { - rand = Int(id!)! - } - - let querySuccess = mysql.query(statement: "SELECT id, randomNumber FROM World WHERE id = \(rand)") - - guard querySuccess else { - - errorObject["id"] = "Failed to execute query" - - return errorObject - } - - let results = mysql.storeResults()! - - results.forEachRow { row in - - if let id = row[0], let randomNumber = row[1] { - - returnObj["id"] = id - returnObj["randomNumber"] = randomNumber - } else { - - returnObj["id"] = "No return value" - returnObj["randomNumber"] = "what happened?" - } - } - - return returnObj -} - -func updateOneFromWorld() -> [String: Any] { - - var returnObj = [String: Any]() - var errorObject = [String: Any]() - let worldToUpdate = fetchFromWorld(id: nil) - let id: String = worldToUpdate["id"] as! String - let newRandom = numGenerator.random() % 10000 - - let querySuccess = mysql.query(statement: "UPDATE World SET randomNumber = \(newRandom) WHERE id = \(id)") - - guard querySuccess else { - errorObject["id"] = "Failed to execute query" - return errorObject - } - - if let results = mysql.storeResults() { - - results.forEachRow { row in - if let id = row[0], let randomNumber = row[1] { - returnObj["id"] = id - returnObj["randomNumber"] = randomNumber - } else { - returnObj["id"] = "No return value" - returnObj["randomNumber"] = "what happened?" - } - } - return returnObj - } else { - returnObj["id"] = id - returnObj["randomNumber"] = newRandom - return returnObj - } -} - -func fortunesHandler(request: HTTPRequest, response: HTTPResponse) { - - var arrOfFortunes = fetchFromFortune() - - let newObj: [String: String] = ["id": "0", "message": "Additional fortune added at request time."] - - arrOfFortunes.append(newObj) - - let sortedArr = arrOfFortunes.sorted(by: ({ $0["message"]! < $1["message"]! })) - - let htmlToRet = spoofHTML(fortunesArr: sortedArr) - - response.appendBody(string: htmlToRet) - - setHeaders(response: response, contentType: "text/html") - response.setHeader(.custom(name: "CustomLength"), value: String(describing: htmlToRet.count + 32)) - - response.completed() -} - -func updatesHandler(request: HTTPRequest, response: HTTPResponse) { - - let queryStr = returnCorrectTuple(queryArr: request.queryParams) - var totalQueries = sanitizeQueryValue(queryString: queryStr) - - var updateArr: Array = [[String: Any]]() - - while 0 < totalQueries { - updateArr.append(updateOneFromWorld()) - totalQueries -= 1 - } - - do { - - response.appendBody(string: try updateArr.jsonEncodedString()) - } catch { - - response.appendBody(string: String(describing: updateArr)) - } - - setHeaders(response: response, contentType: "application/json") - - response.completed() -} - -func multipleDatabaseQueriesHandler(request: HTTPRequest, response: HTTPResponse) { - - let queryStr = returnCorrectTuple(queryArr: request.queryParams) - var totalQueries = sanitizeQueryValue(queryString: queryStr) - - var queryArr: Array = [[String: Any]]() - - while 0 < totalQueries { - - queryArr.append(fetchFromWorld(id: nil)) - totalQueries -= 1 - } - - do { - - response.appendBody(string: try queryArr.jsonEncodedString()) - } catch { - - response.appendBody(string: String(describing: queryArr)) - } - - setHeaders(response: response, contentType: "application/json") - - response.completed() -} - -func singleDatabaseQueryHandler(request: HTTPRequest, response: HTTPResponse) { - - let res = fetchFromWorld(id: nil) - - let errorPayload: [String: Any] = [ - "error": "Could not set body!" - ] - - var responseString: String = "" - var errorString: String = "" - do { - errorString = try errorPayload.jsonEncodedString() - } catch { - // Nothing to do here - we already have an empty value - } - - do { - responseString = try res.jsonEncodedString() - response.appendBody(string: responseString) - } catch { - response.status = HTTPResponseStatus.internalServerError - response.appendBody(string: errorString) - } - - - setHeaders(response: response, contentType: "application/json") - response.completed() -} - -// Helpers - -func setHeaders(response: HTTPResponse, contentType: String) { - - response.setHeader(.contentType, value: contentType) - response.setHeader(.custom(name: "Server"), value: "Perfect") - - let currDate: String = getCurrDate() - - response.setHeader(.custom(name: "Date"), value: currDate) -} - -func getCurrDate() -> String { - - let now = getNow() - - do { - let formatted = try formatDate(now, format: "%a, %d %b %Y %H:%M:%S %Z", timezone: nil, locale: nil) - return formatted - } catch { - return "error formatting date string" - } -} - -func returnCorrectTuple(queryArr: [(String, String)]) -> String { - - for tup in queryArr { - if String(describing: tup.0) == "queries" { - return String(describing: tup.1) - } - } - - return "nil" -} - -func sanitizeQueryValue(queryString: String) -> Int { - - if let queryNum = Int(queryString) { - - if queryNum > 0 && queryNum < 500 { - return queryNum - } else if queryNum > 500 { - return 500 - } else { - return 1 - } - } else { - return 1 - } -} - -func spoofHTML(fortunesArr: [[String: Any]]) -> String { - - var htmlToRet = "Fortunes" - - for fortune in fortunesArr { - - htmlToRet += "" - } - - htmlToRet += "
idmessage
\(fortune["id"]!)\(fortune["message"]!)
"; - - return htmlToRet -} - -var routes = Routes() -routes.add(method: .get, uri: "/fortunes", handler: fortunesHandler) -routes.add(method: .get, uri: "/updates", handler: updatesHandler) -routes.add(method: .get, uri: "/queries", handler: multipleDatabaseQueriesHandler) -routes.add(method: .get, uri: "/db", handler: singleDatabaseQueryHandler) -routes.add(method: .get, uri: "/**", - handler: StaticFileHandler(documentRoot: "./webroot", allowResponseFilters: true).handleRequest) -try HTTPServer.launch(name: "localhost", - port: 8080, - routes: routes, - responseFilters: [ - (PerfectHTTPServer.HTTPFilter.contentCompression(data: [:]), HTTPFilterPriority.high)]) diff --git a/frameworks/Swift/perfect/Sources/Perfect-PostgreSQL/main.swift b/frameworks/Swift/perfect/Sources/Perfect-PostgreSQL/main.swift deleted file mode 100644 index bbb10b19b26..00000000000 --- a/frameworks/Swift/perfect/Sources/Perfect-PostgreSQL/main.swift +++ /dev/null @@ -1,224 +0,0 @@ -import PerfectHTTP -import PerfectHTTPServer -import PerfectLib -import PerfectPostgreSQL -import Foundation - -let tfbHost = "tfb-database" -let database = "hello_world" -let username = "benchmarkdbuser" -let password = "benchmarkdbpass" - -let p = PGConnection() -let status = p.connectdb("postgresql://\(username):\(password)@\(tfbHost):5432/\(database)") - -class LinearCongruntialGenerator { - - var state = 0 //seed of 0 by default - let a, c, m, shift: Int - - init() { - self.a = 214013 - self.c = 2531011 - self.m = Int(pow(2.0, 31.0)) //2^31 or 2147483648 - self.shift = 16 - } - - func random() -> Int { - state = (a * state + c) % m - return state >> shift - } -} - -let numGenerator = LinearCongruntialGenerator() - -func fetchFromWorld(id: String?) -> [String:Any] { - - var returnObj = [String: Any]() - var rand:Int = 0 - - if id == nil { - rand = numGenerator.random() % 10000 - } else { - rand = Int(id!)! - } - - let results = p.exec(statement: "select id, randomNumber from world where id = \(rand)") - - returnObj["id"] = results.getFieldString(tupleIndex: 0, fieldIndex: 0)! - returnObj["randomNumber"] = results.getFieldString(tupleIndex: 0, fieldIndex: 1)! - - return returnObj -} - -func updateOneFromWorld() -> [String: Any] { - - var returnObj = [String: Any]() - let worldToUpdate = fetchFromWorld(id: nil) - let rand = numGenerator.random() % 10000 + 1 - let id: String = worldToUpdate["id"] as! String - - let _ = p.exec(statement: "UPDATE world SET randomNumber = \(rand) WHERE id = \(id)") - - returnObj["id"] = id - returnObj["randomNumber"] = rand - - return returnObj -} - -func updatesHandler(request: HTTPRequest, response: HTTPResponse) { - - let queryStr = returnCorrectTuple(queryArr: request.queryParams) - var totalQueries = sanitizeQueryValue(queryString: queryStr) - - var updateArr: Array = [[String: Any]]() - - while 0 < totalQueries { - updateArr.append(updateOneFromWorld()) - totalQueries -= 1 - } - - do { - - response.appendBody(string: try updateArr.jsonEncodedString()) - } catch { - - response.appendBody(string: String(describing: updateArr)) - } - - setHeaders(response: response, contentType: "application/json") - - response.completed() -} - -func multipleDatabaseQueriesHandler(request: HTTPRequest, response: HTTPResponse) { - - let queryStr = returnCorrectTuple(queryArr: request.queryParams) - var totalQueries = sanitizeQueryValue(queryString: queryStr) - - var queryArr: Array = [[String: Any]]() - - while 0 < totalQueries { - - queryArr.append(fetchFromWorld(id: nil)) - totalQueries -= 1 - } - - do { - - response.appendBody(string: try queryArr.jsonEncodedString()) - } catch { - - response.appendBody(string: String(describing: queryArr)) - } - - setHeaders(response: response, contentType: "application/json") - - response.completed() -} - -func singleDatabaseQueryHandler(request: HTTPRequest, response: HTTPResponse) { - - let res = fetchFromWorld(id: nil) - - let errorPayload: [String: Any] = [ - "error": "Could not set body!" - ] - - var responseString: String = "" - var errorString: String = "" - do { - errorString = try errorPayload.jsonEncodedString() - } catch { - // Nothing to do here - we already have an empty value - } - - do { - responseString = try res.jsonEncodedString() - response.appendBody(string: responseString) - } catch { - response.status = HTTPResponseStatus.internalServerError - response.appendBody(string: errorString) - } - - - setHeaders(response: response, contentType: "application/json") - response.completed() -} - -// Helpers - -func setHeaders(response: HTTPResponse, contentType: String) { - - response.setHeader(.contentType, value: contentType) - response.setHeader(.custom(name: "Server"), value: "Perfect") - - let currDate: String = getCurrDate() - - response.setHeader(.custom(name: "Date"), value: currDate) -} - -func getCurrDate() -> String { - - let now = getNow() - - do { - let formatted = try formatDate(now, format: "%a, %d %b %Y %H:%M:%S %Z", timezone: nil, locale: nil) - return formatted - } catch { - return "error formatting date string" - } -} - -func returnCorrectTuple(queryArr: [(String, String)]) -> String { - - for tup in queryArr { - if String(describing: tup.0) == "queries" { - return String(describing: tup.1) - } - } - - return "nil" -} - -func sanitizeQueryValue(queryString: String) -> Int { - - if let queryNum = Int(queryString) { - - if queryNum > 0 && queryNum < 500 { - return queryNum - } else if queryNum > 500 { - return 500 - } else { - return 1 - } - } else { - return 1 - } -} - -func spoofHTML(fortunesArr: [[String: Any]]) -> String { - - var htmlToRet = "Fortunes" - - for fortune in fortunesArr { - - htmlToRet += "" - } - - htmlToRet += "
idmessage
\(fortune["id"]!)\(fortune["message"]!)
"; - - return htmlToRet -} - -var routes = Routes() -routes.add(method: .get, uri: "/updates", handler: updatesHandler) -routes.add(method: .get, uri: "/queries", handler: multipleDatabaseQueriesHandler) -routes.add(method: .get, uri: "/db", handler: singleDatabaseQueryHandler) -routes.add(method: .get, uri: "/**", - handler: StaticFileHandler(documentRoot: "./webroot", allowResponseFilters: true).handleRequest) -try HTTPServer.launch(name: "localhost", - port: 8080, - routes: routes, - responseFilters: [ - (PerfectHTTPServer.HTTPFilter.contentCompression(data: [:]), HTTPFilterPriority.high)]) diff --git a/frameworks/Swift/perfect/Sources/Perfect/main.swift b/frameworks/Swift/perfect/Sources/Perfect/main.swift deleted file mode 100644 index 2df4bb928e5..00000000000 --- a/frameworks/Swift/perfect/Sources/Perfect/main.swift +++ /dev/null @@ -1,78 +0,0 @@ -import PerfectHTTP -import PerfectHTTPServer -import PerfectLib -import Foundation - -func plaintextHandler(request: HTTPRequest, response: HTTPResponse) { - - response.appendBody(string: "Hello, World!") - - setHeaders(response: response, contentType: "text/plain") - - response.completed() -} - -func jsonHandler(request: HTTPRequest, response: HTTPResponse) { - - var helloDictionary: [String: String] = [:] - helloDictionary["message"] = "Hello, World!" - - let errorPayload: [String: Any] = [ - "error": "Could not set body!" - ] - - var responseString: String = "" - var errorString: String = "" - do { - errorString = try errorPayload.jsonEncodedString() - } catch { - // Nothing to do here - we already have an empty value - } - - do { - responseString = try helloDictionary.jsonEncodedString() - response.appendBody(string: responseString) - } catch { - response.status = HTTPResponseStatus.internalServerError - response.appendBody(string: errorString) - } - - - setHeaders(response: response, contentType: "application/json") - response.completed() -} - -// Helpers - -func setHeaders(response: HTTPResponse, contentType: String) { - - response.setHeader(.contentType, value: contentType) - response.setHeader(.custom(name: "Server"), value: "Perfect") - - let currDate: String = getCurrDate() - - response.setHeader(.custom(name: "Date"), value: currDate) -} - -func getCurrDate() -> String { - - let now = getNow() - - do { - let formatted = try formatDate(now, format: "%a, %d %b %Y %H:%M:%S %Z", timezone: nil, locale: nil) - return formatted - } catch { - return "error formatting date string" - } -} - -var routes = Routes() -routes.add(method: .get, uri: "/json", handler: jsonHandler) -routes.add(method: .get, uri: "/plaintext", handler: plaintextHandler) -routes.add(method: .get, uri: "/**", - handler: StaticFileHandler(documentRoot: "./webroot", allowResponseFilters: true).handleRequest) -try HTTPServer.launch(name: "localhost", - port: 8080, - routes: routes, - responseFilters: [ - (PerfectHTTPServer.HTTPFilter.contentCompression(data: [:]), HTTPFilterPriority.high)]) diff --git a/frameworks/Swift/perfect/benchmark_config.json b/frameworks/Swift/perfect/benchmark_config.json deleted file mode 100644 index 28fdd30639e..00000000000 --- a/frameworks/Swift/perfect/benchmark_config.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "framework": "perfect", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "Perfect", - "language": "Swift", - "orm": "Raw", - "platform": "Perfect", - "webserver": "Perfect", - "os": "Linux", - "database_os": "Linux", - "display_name": "Perfect", - "notes": "", - "tags": ["broken"] - }, - "mysql": { - "update_url": "/updates?queries=", - "query_url": "/queries?queries=", - "db_url": "/db", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "Perfect", - "language": "Swift", - "orm": "Raw", - "platform": "Perfect", - "webserver": "Perfect", - "os": "Linux", - "database_os": "Linux", - "display_name": "Perfect", - "notes": "", - "tags": ["broken"] - }, - "postgresql": { - "update_url": "/updates?queries=", - "query_url": "/queries?queries=", - "db_url": "/db", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "Perfect", - "language": "Swift", - "orm": "Raw", - "platform": "Perfect", - "webserver": "Perfect", - "os": "Linux", - "database_os": "Linux", - "display_name": "Perfect", - "notes": "", - "tags": ["broken"] - }, - "mongodb": { - "update_url": "/updates?queries=", - "query_url": "/queries?queries=", - "db_url": "/db", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MongoDB", - "framework": "Perfect", - "language": "Swift", - "orm": "Raw", - "platform": "Perfect", - "webserver": "Perfect", - "os": "Linux", - "database_os": "Linux", - "display_name": "Perfect", - "notes": "", - "tags": ["broken"] - } - }] -} diff --git a/frameworks/Swift/perfect/config.toml b/frameworks/Swift/perfect/config.toml deleted file mode 100644 index ca5f8416743..00000000000 --- a/frameworks/Swift/perfect/config.toml +++ /dev/null @@ -1,57 +0,0 @@ -[framework] -name = "perfect" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Perfect" -webserver = "Perfect" -versus = "None" - -[mongodb] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -approach = "Realistic" -classification = "Micro" -database = "MongoDB" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Perfect" -webserver = "Perfect" -versus = "None" - -[postgresql] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Perfect" -webserver = "Perfect" -versus = "None" - -[mysql] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -approach = "Realistic" -classification = "Micro" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Perfect" -webserver = "Perfect" -versus = "None" diff --git a/frameworks/Swift/perfect/perfect-mongodb.dockerfile b/frameworks/Swift/perfect/perfect-mongodb.dockerfile deleted file mode 100644 index c56325691a6..00000000000 --- a/frameworks/Swift/perfect/perfect-mongodb.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD . /perfect -WORKDIR /perfect -RUN apt-get update -yqq && apt-get install -yqq libpq-dev && apt-get install -y xsltproc docbook-xsl uuid-dev clang pkg-config libicu-dev libpython2.7 libxml2-dev wget git libssl-dev uuid-dev libsqlite3-dev libpq-dev libmysqlclient-dev libbson-dev libmongoc-dev libcurl4-openssl-dev && apt-get -y install libmysqlclient-dev libmongoc-1.0-0 libbson-1.0 -RUN swift build - -EXPOSE 8080 - -CMD .build/debug/Perfect-MongoDB diff --git a/frameworks/Swift/perfect/perfect-mysql.dockerfile b/frameworks/Swift/perfect/perfect-mysql.dockerfile deleted file mode 100644 index dfc23b3745b..00000000000 --- a/frameworks/Swift/perfect/perfect-mysql.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD . /perfect -WORKDIR /perfect -RUN apt-get update -yqq && apt-get install -yqq libpq-dev && apt-get install -y xsltproc docbook-xsl uuid-dev clang pkg-config libicu-dev libpython2.7 libxml2-dev wget git libssl-dev uuid-dev libsqlite3-dev libpq-dev libmysqlclient-dev libbson-dev libmongoc-dev libcurl4-openssl-dev && apt-get -y install libmysqlclient-dev libmongoc-1.0-0 libbson-1.0 -RUN swift build - -EXPOSE 8080 - -CMD .build/debug/Perfect-MySQL diff --git a/frameworks/Swift/perfect/perfect-postgresql.dockerfile b/frameworks/Swift/perfect/perfect-postgresql.dockerfile deleted file mode 100644 index 11c863eac8a..00000000000 --- a/frameworks/Swift/perfect/perfect-postgresql.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD . /perfect -WORKDIR /perfect -RUN apt-get update -yqq && apt-get install -yqq libpq-dev && apt-get install -y xsltproc docbook-xsl uuid-dev clang pkg-config libicu-dev libpython2.7 libxml2-dev wget git libssl-dev uuid-dev libsqlite3-dev libpq-dev libmysqlclient-dev libbson-dev libmongoc-dev libcurl4-openssl-dev && apt-get -y install libmysqlclient-dev libmongoc-1.0-0 libbson-1.0 -RUN swift build - -EXPOSE 8080 - -CMD .build/debug/Perfect-PostgreSQL diff --git a/frameworks/Swift/perfect/perfect.dockerfile b/frameworks/Swift/perfect/perfect.dockerfile deleted file mode 100644 index f597873a513..00000000000 --- a/frameworks/Swift/perfect/perfect.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM swift:4.1 - -ADD . /perfect -WORKDIR /perfect -RUN apt-get update -yqq && apt-get install -yqq libpq-dev && apt-get install -y xsltproc docbook-xsl uuid-dev clang pkg-config libicu-dev libpython2.7 libxml2-dev wget git libssl-dev uuid-dev libsqlite3-dev libpq-dev libmysqlclient-dev libbson-dev libmongoc-dev libcurl4-openssl-dev && apt-get -y install libmysqlclient-dev libmongoc-1.0-0 libbson-1.0 -RUN swift build - -EXPOSE 8080 - -CMD .build/debug/Perfect diff --git a/frameworks/Swift/swift-nio/.gitignore b/frameworks/Swift/swift-nio/.gitignore deleted file mode 100644 index 1f4e5903663..00000000000 --- a/frameworks/Swift/swift-nio/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.DS_Store -.build/ -.vscode/ -/*.xcodeproj -xcuserdata/ -.swiftpm/ -DerivedData/ -Package.resolved diff --git a/frameworks/Swift/swift-nio/config.toml b/frameworks/Swift/swift-nio/config.toml deleted file mode 100644 index 495bb4f6d2f..00000000000 --- a/frameworks/Swift/swift-nio/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "swift-nio" - -[main] -urls.plaintext = "/p" -urls.json = "/j" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "" diff --git a/frameworks/Swift/swift-nio/swift-nio.dockerfile b/frameworks/Swift/swift-nio/swift-nio.dockerfile index 5b54a7a210f..54a2050f09e 100644 --- a/frameworks/Swift/swift-nio/swift-nio.dockerfile +++ b/frameworks/Swift/swift-nio/swift-nio.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.9 as build +FROM swift:5.10 as build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.9-slim +FROM swift:5.10-slim WORKDIR /run # Install Swift dependencies diff --git a/frameworks/Swift/vapor/.gitignore b/frameworks/Swift/vapor/.gitignore deleted file mode 100644 index 1d982c0de86..00000000000 --- a/frameworks/Swift/vapor/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.DS_Store -.build/ -/*.xcodeproj -xcuserdata/ -.swiftpm/ -DerivedData/ -Package.resolved diff --git a/frameworks/Swift/vapor/benchmark_config.json b/frameworks/Swift/vapor/benchmark_config.json index 65ea06b8726..1bd0d8e2242 100755 --- a/frameworks/Swift/vapor/benchmark_config.json +++ b/frameworks/Swift/vapor/benchmark_config.json @@ -16,7 +16,7 @@ "database_os": "Linux", "display_name": "Vapor", "notes": "", - "versus": "None" + "versus": "swift-nio" }, "fluent": { "db_url": "/db", diff --git a/frameworks/Swift/vapor/vapor-fluent.dockerfile b/frameworks/Swift/vapor/vapor-fluent.dockerfile index 5b883e65713..4a9d3782f6a 100644 --- a/frameworks/Swift/vapor/vapor-fluent.dockerfile +++ b/frameworks/Swift/vapor/vapor-fluent.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.9 as build +FROM swift:5.10 as build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.9-slim +FROM swift:5.10-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/vapor/vapor-mongo-fluent.dockerfile b/frameworks/Swift/vapor/vapor-mongo-fluent.dockerfile deleted file mode 100644 index 792a810d8f4..00000000000 --- a/frameworks/Swift/vapor/vapor-mongo-fluent.dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -# ================================ -# Build image -# ================================ -FROM swift:5.9 as build -WORKDIR /build - -# Copy entire repo into container -COPY ./vapor-mongo-fluent . - -# Compile with optimizations -RUN swift build \ - -c release \ - -Xswiftc -enforce-exclusivity=unchecked - -# ================================ -# Run image -# ================================ -FROM swift:5.9-slim -WORKDIR /run - -# Copy build artifacts -COPY --from=build /build/.build/release /run - -# Copy Swift runtime libraries -COPY --from=build /usr/lib/swift/ /usr/lib/swift/ - -EXPOSE 8080 - -ENTRYPOINT ["./app", "serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"] diff --git a/frameworks/Swift/vapor/vapor-mongo-fluent/Package.swift b/frameworks/Swift/vapor/vapor-mongo-fluent/Package.swift deleted file mode 100644 index 88ae0f29ed9..00000000000 --- a/frameworks/Swift/vapor/vapor-mongo-fluent/Package.swift +++ /dev/null @@ -1,29 +0,0 @@ -// swift-tools-version:5.5 -import PackageDescription - -let package = Package( - name: "vapor-fluent", - platforms: [ - .macOS(.v12) - ], - products: [ - .executable(name: "app", targets: ["App"]) - ], - dependencies: [ - .package(url: "https://github.com/vapor/vapor.git", from: "4.52.2"), - .package(url: "https://github.com/vapor/fluent.git", from: "4.4.0"), - .package(url: "https://github.com/vapor/fluent-mongo-driver.git", from: "1.0.2"), - .package(url: "https://github.com/orlandos-nl/MongoKitten.git", from: "6.7.1") - ], - targets: [ - .executableTarget( - name: "App", - dependencies: [ - .product(name: "Fluent", package: "fluent"), - .product(name: "FluentMongoDriver", package: "fluent-mongo-driver"), - .product(name: "Vapor", package: "vapor"), - .product(name: "MongoKitten", package: "MongoKitten"), - ], - path: "Sources"), - ] -) \ No newline at end of file diff --git a/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/Utilities.swift b/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/Utilities.swift deleted file mode 100644 index 7b5bb1c2878..00000000000 --- a/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/Utilities.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Vapor - -extension Int { - func bounded(to range: ClosedRange) -> Int { - switch self { - case ...range.lowerBound: - return range.lowerBound - case range.upperBound...: - return range.upperBound - default: - return self - } - } -} - -extension System { - // tfb-server (aka, citrine) uses 28 hyper-threaded cores - // postgresql.conf specifies max_connections = 2000 - // - // 2000 / (28 * 2) = 35.7 (theoretical max) - // - // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Environment#citrine-self-hosted - // https://github.com/TechEmpower/FrameworkBenchmarks/blob/master/toolset/databases/postgres/postgresql.conf#L64 - static var maxConnectionsPerEventLoop: Int { 32 } -} diff --git a/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/World.swift b/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/World.swift deleted file mode 100644 index ef7f1314013..00000000000 --- a/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/World.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Fluent -import Vapor - -final class World: Model, Content { - static let schema = "world" - - @ID(custom: "id") - var id: Float? - - @Field(key: "randomNumber") - var randomNumber: Float - - init() { } -} diff --git a/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/main.swift b/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/main.swift deleted file mode 100644 index a7beb273bce..00000000000 --- a/frameworks/Swift/vapor/vapor-mongo-fluent/Sources/main.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Fluent -import FluentMongoDriver -import Vapor - -var env = try Environment.detect() -try LoggingSystem.bootstrap(from: &env) - -let connectionString = "mongodb://tfb-database:27017/hello_world" - -let app = Application(env) - -app.http.server.configuration.serverName = "Vapor" - -app.logger.notice("💧 VAPOR") -app.logger.notice("System.coreCount: \(System.coreCount)") -app.logger.notice("System.maxConnectionsPerEventLoop: \(System.maxConnectionsPerEventLoop)") - -try app.databases.use(.mongo( - connectionString: connectionString), - as: .mongo) - -app.get("db") { req async throws -> World in - guard let world = try await World.find(Float(.random(in: 1...10_000)), on: req.db) else { - throw Abort(.notFound) - } - - return world -} - -app.get("queries") { req async throws -> [World] in - let queries = (req.query["queries"] ?? 1).bounded(to: 1...500) - - var worlds: [World] = [] - - for _ in queries { - guard let world = try await World.find(Float(.random(in: 1...10_000)), on: req.db) else { - throw Abort(.notFound) - } - - worlds.append(world) - } - - return worlds -} - -extension Int: Sequence { - public func makeIterator() -> CountableRange.Iterator { - return (0.. Date: Tue, 7 May 2024 03:34:09 +0900 Subject: [PATCH 0541/1766] Update ohkami & Refactor some (#8955) --- frameworks/Rust/ohkami/Cargo.lock | 14 ++--- frameworks/Rust/ohkami/Cargo.toml | 4 +- frameworks/Rust/ohkami/ohkami.dockerfile | 2 +- frameworks/Rust/ohkami/src/fangs.rs | 74 +++++------------------- frameworks/Rust/ohkami/src/main.rs | 5 +- 5 files changed, 26 insertions(+), 73 deletions(-) diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index 824e6c2622d..b0bc7617d71 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "ohkami" -version = "0.17.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffca2ddf66df3484fd9dfa7f88f923e2082b9934dc7e247616002f8bf71ec81c" +checksum = "d810447a32af4750a45183a4915db5ca4183bb6d44b8e7731e63f627c581d93e" dependencies = [ "byte_reader", "hmac", @@ -787,7 +787,7 @@ dependencies = [ [[package]] name = "ohkami_framework_benchmarks" -version = "0.17.1" +version = "0.18.2" dependencies = [ "futures-util", "ohkami", @@ -799,9 +799,9 @@ dependencies = [ [[package]] name = "ohkami_lib" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a306cca964938b3e37157c716b4423f09026ceb4439ec5f9353265d03d217b72" +checksum = "4433e6c4c6c67a72afc306783ca8c641e69c9d171279fcab51f1f0c2d875e121" dependencies = [ "byte_reader", "percent-encoding", @@ -810,9 +810,9 @@ dependencies = [ [[package]] name = "ohkami_macros" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb435788e84e7262f0ee3fb1d206a4c1830ec17856eb0924b9d8c5f75c7519" +checksum = "ffed4cd7e8c12a62c077273cb0f0fedf67ca3912488e5de1b325be85ca86bb06" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index 17c0e679f5f..8a168f5c413 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "ohkami_framework_benchmarks" -version = "0.17.1" +version = "0.18.2" edition = "2021" authors = ["kanarus "] [dependencies] -ohkami = { version = "=0.17.1", features = ["rt_tokio"] } +ohkami = { version = "=0.18.2", features = ["rt_tokio"] } tokio = { version = "1.37.0" , features = ["full"] } rand = { version = "0.8.5" , features = ["small_rng"] } sqlx = { version = "0.7.4" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } diff --git a/frameworks/Rust/ohkami/ohkami.dockerfile b/frameworks/Rust/ohkami/ohkami.dockerfile index 4b228eca830..97a69dd07ae 100644 --- a/frameworks/Rust/ohkami/ohkami.dockerfile +++ b/frameworks/Rust/ohkami/ohkami.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77-slim-buster +FROM rust:1.78-slim-buster WORKDIR /ohkami_framework_benchmarks ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world diff --git a/frameworks/Rust/ohkami/src/fangs.rs b/frameworks/Rust/ohkami/src/fangs.rs index b81a682e3fc..46a19808f46 100644 --- a/frameworks/Rust/ohkami/src/fangs.rs +++ b/frameworks/Rust/ohkami/src/fangs.rs @@ -11,12 +11,17 @@ impl FangAction for SetServer { } } -#[derive(Clone)] -pub struct UsePostgres( - Postgres -); -impl UsePostgres { - pub async fn init() -> Self { +impl Postgres { + pub async fn init() -> impl FangAction { + #[derive(Clone)] + pub struct UsePostgres(Postgres); + impl FangAction for UsePostgres { + #[inline(always)] + async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { + Ok(req.memorize(self.0.clone())) + } + } + macro_rules! load_env { ($($name:ident as $t:ty)*) => {$( #[allow(non_snake_case)] @@ -33,64 +38,13 @@ impl UsePostgres { MIN_CONNECTIONS as u32 DATABASE_URL as String } - + let pool = sqlx::postgres::PgPoolOptions::new() .max_connections(MAX_CONNECTIONS) .min_connections(MIN_CONNECTIONS) .connect(&DATABASE_URL).await .unwrap(); - - Self(pool.into()) - } -} -impl FangAction for UsePostgres { - #[inline(always)] - async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { - Ok(req.memorize(self.0.clone())) - } -} - - -/* -impl Postgres { - pub async fn init() -> impl FangAction { - #[derive(Clone)] - pub struct UsePostgres(Postgres); - - impl FangAction for UsePostgres { - #[inline(always)] - async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { - 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() - )) + + UsePostgres(pool.into()) } } -*/ diff --git a/frameworks/Rust/ohkami/src/main.rs b/frameworks/Rust/ohkami/src/main.rs index 0fff7ec51e4..7473338dc5b 100644 --- a/frameworks/Rust/ohkami/src/main.rs +++ b/frameworks/Rust/ohkami/src/main.rs @@ -1,5 +1,5 @@ mod fangs; -use fangs::{SetServer, UsePostgres}; +use fangs::SetServer; mod models; use models::{Fortune, Message, World, WorldsQuery}; @@ -16,7 +16,7 @@ use ohkami::Memory; #[tokio::main] async fn main() { - Ohkami::with((SetServer, UsePostgres::init().await), ( + Ohkami::with((SetServer, Postgres::init().await), ( "/json" .GET(json_serialization), "/db" .GET(single_database_query), "/queries" .GET(multiple_database_query), @@ -48,7 +48,6 @@ async fn fortunes(p: Memory<'_, Postgres>) -> FortunesTemplate { id: 0, message: String::from("Additional fortune added at request time."), }); - fortunes.sort_unstable_by(|a, b| str::cmp(&a.message, &b.message)); FortunesTemplate { fortunes } From d36ec58cae4181a0e975865a086bd7412d55fd45 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 6 May 2024 21:31:49 +0200 Subject: [PATCH 0542/1766] [ruby/sinatra] Fix clear_active_connections! deprecation (#8975) Fixes the following warning: DEPRECATION WARNING: Calling `ActiveRecord::Base.clear_active_connections! is deprecated. Please call the method directly on the connection handler; for example: `ActiveRecord::Base.connection_handler.clear_active_connections!`. (called from block in at /sinatra/hello_world.rb:43) --- frameworks/Ruby/sinatra/boot.rb | 2 +- frameworks/Ruby/sinatra/hello_world.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index 3b6c615f85e..bcaf9e0a3d2 100755 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -61,4 +61,4 @@ class Fortune < ActiveRecord::Base self.table_name = name end -ActiveRecord::Base.clear_active_connections! +ActiveRecord::Base.connection_handler.clear_active_connections! diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index 7b816f8884e..e09b6588453 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -40,7 +40,7 @@ def rand1 end if SERVER_STRING after do - ActiveRecord::Base.clear_active_connections! + ActiveRecord::Base.connection_handler.clear_active_connections! end # Test type 1: JSON serialization From b5b5e121b25f9cca8d2196ab2607bb8fab8d86c7 Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Mon, 6 May 2024 22:09:01 +0200 Subject: [PATCH 0543/1766] Upgrade latest 3.9.4 after BIG RENAME (#8950) --- frameworks/Java/quarkus/pom.xml | 15 ++------------- .../resteasy-reactive-hibernate-reactive/pom.xml | 4 ++-- .../quarkus/resteasy-reactive-hibernate/pom.xml | 4 ++-- frameworks/Java/quarkus/vertx/pom.xml | 1 - 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/frameworks/Java/quarkus/pom.xml b/frameworks/Java/quarkus/pom.xml index 0739e3171f7..3782b479cb3 100644 --- a/frameworks/Java/quarkus/pom.xml +++ b/frameworks/Java/quarkus/pom.xml @@ -14,14 +14,11 @@ UTF-8 quarkus-bom io.quarkus - 3.2.0.Final + 3.9.4 true 3.0.0 - 0.0.21.Final - 4.4.4 + 0.0.25.Final 1.3.0 - 6.2.6.Final - 2.0.2.Final @@ -42,17 +39,10 @@ org.hibernate.orm hibernate-core - ${hibernate-orm.version} org.hibernate.reactive hibernate-reactive-core - ${hibernate-reactive.version} - - - io.vertx - vertx-core - ${vertx.version} ${quarkus.platform.group-id} @@ -151,7 +141,6 @@ io.vertx vertx-io_uring-incubator - ${vertx.version} io.netty.incubator diff --git a/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml b/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml index c036d06258d..8948c5ffb06 100644 --- a/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml +++ b/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml @@ -30,11 +30,11 @@ io.quarkus - quarkus-resteasy-reactive + quarkus-rest io.quarkus - quarkus-resteasy-reactive-jackson + quarkus-rest-jackson io.vertx diff --git a/frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml b/frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml index 3f75ad69d45..5cd634dbea5 100644 --- a/frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml +++ b/frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml @@ -26,11 +26,11 @@ io.quarkus - quarkus-resteasy-reactive + quarkus-rest io.quarkus - quarkus-resteasy-reactive-jackson + quarkus-rest-jackson io.quarkus diff --git a/frameworks/Java/quarkus/vertx/pom.xml b/frameworks/Java/quarkus/vertx/pom.xml index e751ed6aa51..1414a21df4a 100644 --- a/frameworks/Java/quarkus/vertx/pom.xml +++ b/frameworks/Java/quarkus/vertx/pom.xml @@ -23,7 +23,6 @@ io.vertx vertx-pg-client - ${vertx.version} io.quarkus From dc05a5d6e179c89531bfdc4b83a287ee4c8de329 Mon Sep 17 00:00:00 2001 From: Gabriel Scatolin <17441745+CypherPotato@users.noreply.github.com> Date: Mon, 6 May 2024 17:09:49 -0300 Subject: [PATCH 0544/1766] update sisk (#8848) * update sisk to v0.16.2-beta1 * fix prev commit * update sisk version --- frameworks/CSharp/sisk/sisk/sisk.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/sisk/sisk/sisk.csproj b/frameworks/CSharp/sisk/sisk/sisk.csproj index 624dd50d4a3..1b95479eb01 100644 --- a/frameworks/CSharp/sisk/sisk/sisk.csproj +++ b/frameworks/CSharp/sisk/sisk/sisk.csproj @@ -9,7 +9,7 @@ - + From b6fe6e3218cd05516fafa996b311b6d05fe96155 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 20:26:50 +0000 Subject: [PATCH 0545/1766] Bump jinja2 from 3.1.2 to 3.1.4 in /frameworks/Python/panther Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.4. - [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.4) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/panther/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/panther/requirements.txt b/frameworks/Python/panther/requirements.txt index a42fe061c9d..4a494ed3f7a 100644 --- a/frameworks/Python/panther/requirements.txt +++ b/frameworks/Python/panther/requirements.txt @@ -1,7 +1,7 @@ panther==3.2.1 cython==3.0.6 -jinja2==3.1.2 +jinja2==3.1.4 asyncpg==0.29.0 From e9ee6f910a33c2f4e549909bf867aeef0ddd97db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 20:40:50 +0000 Subject: [PATCH 0546/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/sanic Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 e118a108cc7..5b4738e167d 100644 --- a/frameworks/Python/sanic/requirements.txt +++ b/frameworks/Python/sanic/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.25.0 -Jinja2==3.1.3 +Jinja2==3.1.4 sanic==22.6.1 uvloop==0.16.0 From f7b22a35fe815cce7275f81033c6a9ea2f5ba138 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 20:47:22 +0000 Subject: [PATCH 0547/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/starlette Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- updated-dependencies: - dependency-name: jinja2 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 ab240e93ab4..ef5a1748ca4 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.7 -Jinja2==3.1.3 +Jinja2==3.1.4 MarkupSafe==2.1.1 python-dotenv==0.20.0 PyYAML==6.0 From a9fec782ae5abe0edcb2a81caede6807c3a36094 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 20:51:05 +0000 Subject: [PATCH 0548/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/responder Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 4b650f546e9..a16d601e4a8 100644 --- a/frameworks/Python/responder/requirements.txt +++ b/frameworks/Python/responder/requirements.txt @@ -1,6 +1,6 @@ asyncpg==0.21.0 gunicorn==22.0.0 -Jinja2==3.1.3 +Jinja2==3.1.4 ujson==2.0.3 uvloop==0.17.0 httptools==0.5.0 From 898495562bd8d2d6c33b2481a1aad4c38e3dab0f Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Wed, 8 May 2024 18:12:22 +0100 Subject: [PATCH 0549/1766] Add Hummingbird 2 (#8995) * Hummingbird2 benchmarks * Update connection count --- frameworks/Swift/.gitignore | 2 +- frameworks/Swift/hummingbird2/README.md | 44 ++++++++++ .../Swift/hummingbird2/benchmark_config.json | 47 +++++++++++ .../hummingbird2-postgres.dockerfile | 29 +++++++ .../hummingbird2/hummingbird2.dockerfile | 29 +++++++ .../hummingbird2/src-postgres/Package.swift | 32 +++++++ .../Controllers/FortunesController.swift | 49 +++++++++++ .../server/Controllers/WorldController.swift | 83 +++++++++++++++++++ .../Sources/server/Models/Fortune.swift | 21 +++++ .../Sources/server/Models/World.swift | 7 ++ .../src-postgres/Sources/server/main.swift | 62 ++++++++++++++ .../Swift/hummingbird2/src/Package.swift | 28 +++++++ .../src/Sources/server/main.swift | 48 +++++++++++ 13 files changed, 480 insertions(+), 1 deletion(-) create mode 100755 frameworks/Swift/hummingbird2/README.md create mode 100755 frameworks/Swift/hummingbird2/benchmark_config.json create mode 100644 frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile create mode 100644 frameworks/Swift/hummingbird2/hummingbird2.dockerfile create mode 100644 frameworks/Swift/hummingbird2/src-postgres/Package.swift create mode 100644 frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift create mode 100644 frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift create mode 100644 frameworks/Swift/hummingbird2/src-postgres/Sources/server/Models/Fortune.swift create mode 100644 frameworks/Swift/hummingbird2/src-postgres/Sources/server/Models/World.swift create mode 100644 frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift create mode 100644 frameworks/Swift/hummingbird2/src/Package.swift create mode 100644 frameworks/Swift/hummingbird2/src/Sources/server/main.swift diff --git a/frameworks/Swift/.gitignore b/frameworks/Swift/.gitignore index 07c7b08b3c1..e638150e387 100644 --- a/frameworks/Swift/.gitignore +++ b/frameworks/Swift/.gitignore @@ -5,4 +5,4 @@ xcuserdata/ .swiftpm/ DerivedData/ Package.resolved -.vscode/ \ No newline at end of file +.vscode/ diff --git a/frameworks/Swift/hummingbird2/README.md b/frameworks/Swift/hummingbird2/README.md new file mode 100755 index 00000000000..06f66d168c8 --- /dev/null +++ b/frameworks/Swift/hummingbird2/README.md @@ -0,0 +1,44 @@ +# Hummingbird 2 Benchmarking Test + +Hummingbird 2 is a lightweight, flexible HTTP server framework written in Swift. HUmmingbird 2 is a complete rewrite using Swift concurrency. + +### Test Type Implementation Source Code + +* [JSON](src/Sources/server/main.swift) +* [PLAINTEXT](src/Sources/server/main.swift) +* [DB](src-postgres/Sources/server/Controllers/WorldController.swift) +* [Query](src-postgres/Sources/server/Controllers/WorldController.swift) +* [Updates](src-postgres/Sources/server/Controllers/WorldController.swift) +* [Fortunes](src-postgres/Sources/server/Controllers/FortunesController.swift) + +## Important Libraries +This version of Hummingbird requires +* [Swift 5.10](https://swift.org) +* [SwiftNIO 2.x](https://github.com/apple/swift-nio/) +In these tests for database access it uses +* [PostgresKit 2.21](https://github.com/vapor/postgres-nio/) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### Query + +http://localhost:8080/queries?queries= + +### Updates + +http://localhost:8080/updates?queries= + +### Fortunes + +http://localhost:8080/fortunes diff --git a/frameworks/Swift/hummingbird2/benchmark_config.json b/frameworks/Swift/hummingbird2/benchmark_config.json new file mode 100755 index 00000000000..c6001e41811 --- /dev/null +++ b/frameworks/Swift/hummingbird2/benchmark_config.json @@ -0,0 +1,47 @@ +{ + "framework": "hummingbird2", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Hummingbird2", + "language": "Swift", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hummingbird 2", + "notes": "", + "versus": "swift-nio" + }, + "postgres": { + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Hummingbird2", + "language": "Swift", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Hummingbird 2", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile b/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile new file mode 100644 index 00000000000..952c3c47dbf --- /dev/null +++ b/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile @@ -0,0 +1,29 @@ +# ================================ +# Build image +# ================================ +FROM swift:5.10 as build +WORKDIR /build + +# Copy entire repo into container +COPY ./src-postgres . + +# Compile with optimizations +RUN swift build \ + -c release \ + -Xswiftc -enforce-exclusivity=unchecked + +# ================================ +# Run image +# ================================ +FROM swift:5.10-slim +WORKDIR /run + +# Copy build artifacts +COPY --from=build /build/.build/release /run + +ENV SERVER_PORT=8080 +ENV SERVER_HOSTNAME=0.0.0.0 + +EXPOSE 8080 + +CMD ["./server"] diff --git a/frameworks/Swift/hummingbird2/hummingbird2.dockerfile b/frameworks/Swift/hummingbird2/hummingbird2.dockerfile new file mode 100644 index 00000000000..eb6fccc321b --- /dev/null +++ b/frameworks/Swift/hummingbird2/hummingbird2.dockerfile @@ -0,0 +1,29 @@ +# ================================ +# Build image +# ================================ +FROM swift:5.10 as build +WORKDIR /build + +# Copy entire repo into container +COPY ./src . + +# Compile with optimizations +RUN swift build \ + -c release \ + -Xswiftc -enforce-exclusivity=unchecked + +# ================================ +# Run image +# ================================ +FROM swift:5.10-slim +WORKDIR /run + +# Copy build artifacts +COPY --from=build /build/.build/release /run + +ENV SERVER_PORT=8080 +ENV SERVER_HOSTNAME=0.0.0.0 + +EXPOSE 8080 + +CMD ["./server"] diff --git a/frameworks/Swift/hummingbird2/src-postgres/Package.swift b/frameworks/Swift/hummingbird2/src-postgres/Package.swift new file mode 100644 index 00000000000..b8028ce6372 --- /dev/null +++ b/frameworks/Swift/hummingbird2/src-postgres/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version:5.10 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "server", + platforms: [.macOS(.v14)], + products: [ + .executable(name: "server", targets: ["server"]) + ], + dependencies: [ + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0-beta.4"), + .package(url: "https://github.com/hummingbird-project/swift-mustache.git", from: "2.0.0-beta"), + .package(url: "https://github.com/vapor/postgres-nio.git", from: "1.21.0"), + ], + targets: [ + .executableTarget(name: "server", + dependencies: [ + .product(name: "Hummingbird", package: "hummingbird"), + .product(name: "Mustache", package: "swift-mustache"), + .product(name: "PostgresNIO", package: "postgres-nio"), + ], + swiftSettings: [ + // Enable better optimizations when building in Release configuration. Despite the use of + // the `.unsafeFlags` construct required by SwiftPM, this flag is recommended for Release + // builds. See for details. + .unsafeFlags(["-cross-module-optimization"], .when(configuration: .release)) + ] + ), + ] +) diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift new file mode 100644 index 00000000000..1338b6f2280 --- /dev/null +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift @@ -0,0 +1,49 @@ +import Hummingbird +import Mustache +import PostgresNIO + +struct HTML: ResponseGenerator, Sendable { + let html: String + public func response(from request: Request, context: some BaseRequestContext) -> Response { + let buffer = context.allocator.buffer(string: html) + return Response(status: .ok, headers: [.contentType: "text/html; charset=utf-8"], body: .init(byteBuffer: buffer)) + } +} + +final class FortunesController: Sendable { + typealias Context = TechFrameworkRequestContext + let template: MustacheTemplate + let postgresClient: PostgresClient + + init(postgresClient: PostgresClient) { + self.postgresClient = postgresClient + self.template = try! MustacheTemplate(string: """ + Fortunes{{#.}}{{/.}}
idmessage
{{id}}{{message}}
+ """) + } + + var routes: RouteCollection { + RouteCollection(context: Context.self) + .get("fortunes", use: fortunes) + } + + /// In this test, the framework's ORM is used to fetch all rows from a database + /// table containing an unknown number of Unix fortune cookie messages (the + /// table has 12 rows, but the code cannot have foreknowledge of the table's + /// size). An additional fortune cookie message is inserted into the list at + /// runtime and then the list is sorted by the message text. Finally, the list + /// is delivered to the client using a server-side HTML template. The message + /// text must be considered untrusted and properly escaped and the UTF-8 fortune messages must be rendered properly. + @Sendable func fortunes(request: Request, context: Context) async throws -> HTML { + let rows = try await self.postgresClient.query("SELECT id, message FROM Fortune") + var fortunes: [Fortune] = [] + for try await (id, message) in rows.decode((Int32, String).self, context: .default) { + fortunes.append(.init(id: id, message: message)) + } + + fortunes.append(.init(id: 0, message: "Additional fortune added at request time.")) + let sortedFortunes = fortunes.sorted { $0.message < $1.message } + return HTML(html: self.template.render(sortedFortunes) ) + + } +} diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift new file mode 100644 index 00000000000..57fcca0cf46 --- /dev/null +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift @@ -0,0 +1,83 @@ +import Hummingbird +import PostgresNIO + +struct WorldController { + typealias Context = TechFrameworkRequestContext + let postgresClient: PostgresClient + + var routes: RouteCollection { + RouteCollection(context: Context.self) + .get("db", use: single) + .get("queries", use: multiple) + .get("updates", use: updates) + } + + /// In this test, each request is processed by fetching a single row from a + /// simple database table. That row is then serialized as a JSON response. + @Sendable func single(request: Request, context: Context) async throws -> World { + let id = Int32.random(in: 1...10_000) + let rows = try await self.postgresClient.query("SELECT id, randomnumber FROM World WHERE id = \(id)") + for try await (id, randomNumber) in rows.decode((Int32, Int32).self, context: .default) { + return World(id: id, randomNumber: randomNumber) + } + throw HTTPError(.notFound) + } + + /// In this test, each request is processed by fetching multiple rows from a + /// simple database table and serializing these rows as a JSON response. The + /// test is run multiple times: testing 1, 5, 10, 15, and 20 queries per request. + /// All tests are run at 512 concurrency. + @Sendable func multiple(request: Request, context: Context) async throws -> [World] { + let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500) + return try await withThrowingTaskGroup(of: World.self) { group in + for _ in 0.. [World] { + let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500) + return try await withThrowingTaskGroup(of: World.self) { group in + for _ in 0.. Any? { + switch named { + case "id": + return id + case "message": + return message + default: + return nil + } + } +} diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Models/World.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Models/World.swift new file mode 100644 index 00000000000..03077e0aadf --- /dev/null +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Models/World.swift @@ -0,0 +1,7 @@ +import Hummingbird + +struct World: ResponseEncodable { + var id: Int32 + var randomNumber: Int32 +} + diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift new file mode 100644 index 00000000000..f095961572a --- /dev/null +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift @@ -0,0 +1,62 @@ +import Hummingbird +import PostgresNIO + +// postgresql.conf specifies max_connections = 2000 +// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Environment#citrine-self-hosted +// https://github.com/TechEmpower/FrameworkBenchmarks/blob/master/toolset/databases/postgres/postgresql.conf#L64 + +extension Int { + func bound(_ minValue: Int, _ maxValue: Int) -> Int { + return Swift.min(maxValue, Swift.max(minValue, self)) + } +} + +struct TechFrameworkRequestContext: RequestContext { + static let jsonEncoder = JSONEncoder() + static let jsonDecoder = JSONDecoder() + + var coreContext: Hummingbird.CoreRequestContext + + // Use a global JSON Encoder + var responseEncoder: JSONEncoder { Self.jsonEncoder } + // Use a global JSON Decoder + var requestDecoder: JSONDecoder { Self.jsonDecoder } + + init(channel: any Channel, logger: Logger) { + self.coreContext = .init(allocator: channel.allocator, logger: logger) + } +} + +func runApp() async throws { + let env = Environment() + let serverHostName = env.get("SERVER_HOSTNAME") ?? "127.0.0.1" + let serverPort = env.get("SERVER_PORT", as: Int.self) ?? 8080 + + var postgresConfiguration = PostgresClient.Configuration( + host: "tfb-database", + username: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", + tls: .disable + ) + postgresConfiguration.options.maximumConnections = 1900 + let postgresClient = PostgresClient( + configuration: postgresConfiguration, + eventLoopGroup: MultiThreadedEventLoopGroup.singleton + ) + let router = Router(context: TechFrameworkRequestContext.self) + router.addRoutes(WorldController(postgresClient: postgresClient).routes) + router.addRoutes(FortunesController(postgresClient: postgresClient).routes) + var app = Application( + router: router, + configuration: .init( + address: .hostname(serverHostName, port: serverPort), + serverName: "HB2", + backlog: 8192 + ) + ) + app.addServices(postgresClient) + try await app.runService() +} + +try await runApp() diff --git a/frameworks/Swift/hummingbird2/src/Package.swift b/frameworks/Swift/hummingbird2/src/Package.swift new file mode 100644 index 00000000000..a033651a2c3 --- /dev/null +++ b/frameworks/Swift/hummingbird2/src/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version:5.10 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "server", + platforms: [.macOS(.v14)], + products: [ + .executable(name: "server", targets: ["server"]) + ], + dependencies: [ + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0-beta"), + ], + targets: [ + .target(name: "server", + dependencies: [ + .product(name: "Hummingbird", package: "hummingbird"), + ], + swiftSettings: [ + // Enable better optimizations when building in Release configuration. Despite the use of + // the `.unsafeFlags` construct required by SwiftPM, this flag is recommended for Release + // builds. See for details. + .unsafeFlags(["-cross-module-optimization"], .when(configuration: .release)) + ] + ), + ] +) diff --git a/frameworks/Swift/hummingbird2/src/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src/Sources/server/main.swift new file mode 100644 index 00000000000..f652046a166 --- /dev/null +++ b/frameworks/Swift/hummingbird2/src/Sources/server/main.swift @@ -0,0 +1,48 @@ +import Hummingbird +import Logging +import NIOCore + +struct Object: ResponseEncodable { + let message: String +} + +struct TechFrameworkRequestContext: RequestContext { + static let jsonEncoder = JSONEncoder() + static let jsonDecoder = JSONDecoder() + + var coreContext: Hummingbird.CoreRequestContext + + // Use a global JSON Encoder + var responseEncoder: JSONEncoder { Self.jsonEncoder } + // Use a global JSON Decoder + var requestDecoder: JSONDecoder { Self.jsonDecoder } + + init(channel: any Channel, logger: Logger) { + self.coreContext = .init(allocator: channel.allocator, logger: logger) + } +} + +func runApp() async throws { + let env = Environment() + let serverHostName = env.get("SERVER_HOSTNAME") ?? "127.0.0.1" + let serverPort = env.get("SERVER_PORT", as: Int.self) ?? 8080 + + let router = Router(context: TechFrameworkRequestContext.self) + router.get("plaintext") { _,_ in + "Hello, world!" + } + router.get("json") { _,_ in + Object(message: "Hello, world!") + } + let app = Application( + router: router, + configuration: .init( + address: .hostname(serverHostName, port: serverPort), + serverName: "HB", + backlog: 8192 + ) + ) + try await app.runService() +} + +try await runApp() From 861c7757df1283a69d6115f5be14b6f1cf194bed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:12:38 -0700 Subject: [PATCH 0550/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/flask (#8987) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 a563bd2770b..eb63cf6086d 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.1.3 +Jinja2==3.1.4 MarkupSafe==2.1.2 ujson==5.4.0 orjson==3.8.7; implementation_name=='cpython' From dc235e3032f7ed5608b331c4fa0d19a184619cff Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 May 2024 19:14:37 +0200 Subject: [PATCH 0551/1766] [ruby/grape] Use `update_columns` instead of `update` (#8994) Unlike `update_columns`, `update` runs in a transaction and runs callbacks. Transactions aren't a requirement, so we can just call `update_columns` for improved performance. --- frameworks/Ruby/grape/config.ru | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/grape/config.ru b/frameworks/Ruby/grape/config.ru index ac019ea02cd..4f194cec0e5 100644 --- a/frameworks/Ruby/grape/config.ru +++ b/frameworks/Ruby/grape/config.ru @@ -66,7 +66,7 @@ module Acme world = World.find(rand1) new_value = rand1 new_value = rand1 while new_value == world.randomNumber - world.update(randomNumber: new_value) + world.update_columns(randomNumber: new_value) world end end From cd1bf44d6b9d55d1d854a05de64ac5d9fdf1a179 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 May 2024 19:14:44 +0200 Subject: [PATCH 0552/1766] [ruby/sinatra] Use `update_columns` instead of `update` (#8992) Unlike `update_columns`, `update` runs in a transaction and runs callbacks. Transactions aren't a requirement, so we can just call `update_columns` for improved performance. --- frameworks/Ruby/sinatra/hello_world.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index e09b6588453..a28e3ff13b3 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -92,7 +92,7 @@ def rand1 world = World.find(rand1) new_value = rand1 new_value = rand1 while new_value == world.randomnumber - world.update(randomnumber: new_value) + world.update_columns(randomnumber: new_value) world end end From 98cef463b8e10da771fb2fa651c272549d5bd90e Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 May 2024 19:14:50 +0200 Subject: [PATCH 0553/1766] [ruby/sinatra-sequel] Update Sinatra to v3 (#8991) This also updates some other gems to make it similar to the Ruby/sinatra. Unused jruby code is removed. --- frameworks/Ruby/sinatra-sequel/Gemfile | 10 ++++------ frameworks/Ruby/sinatra-sequel/README.md | 2 +- .../sinatra-sequel-jruby-base.dockerfile | 8 -------- 3 files changed, 5 insertions(+), 15 deletions(-) delete mode 100644 frameworks/Ruby/sinatra-sequel/sinatra-sequel-jruby-base.dockerfile diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 8320982e7df..b93a3da14da 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -1,20 +1,18 @@ source 'https://rubygems.org' gem 'json', '~> 2.0' -gem 'passenger', '~> 5.1', :platforms=>[:ruby, :mswin], :require=>false +gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' -gem 'sinatra', '~> 2.0', :require=>'sinatra/base' +gem 'sinatra', '~> 3.0', :require=>'sinatra/base' gem 'slim', '~> 3.0' -gem 'unicorn', '~> 5.2', :platforms=>[:ruby, :mswin], :require=>false +gem 'unicorn', '~> 6.1', :platforms=>[:ruby, :mswin], :require=>false group :mysql do - gem 'jdbc-mysql', '~> 5.1', :platforms=>:jruby, :require=>'jdbc/mysql' - gem 'mysql2', '~> 0.4', :platforms=>[:ruby, :mswin] + gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] end group :postgresql do - gem 'jdbc-postgres', '~> 9.4', :platforms=>:jruby, :require=>'jdbc/postgres' gem 'pg', '~> 1.5', :platforms=>[:ruby, :mswin] gem 'sequel_pg', '~> 1.6', :platforms=>:ruby, :require=>false end diff --git a/frameworks/Ruby/sinatra-sequel/README.md b/frameworks/Ruby/sinatra-sequel/README.md index a9e8e72728b..147e20cb2ed 100644 --- a/frameworks/Ruby/sinatra-sequel/README.md +++ b/frameworks/Ruby/sinatra-sequel/README.md @@ -17,7 +17,7 @@ The tests will be run with: * [Puma 6](http://puma.io) * [Passenger 5](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) -* [Sinatra 2](http://www.sinatrarb.com) +* [Sinatra 3](http://www.sinatrarb.com) * [Sequel 5](http://sequel.jeremyevans.net) * [Slim 3](http://slim-lang.com) * [MySQL 5.5](https://www.mysql.com) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-jruby-base.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-jruby-base.dockerfile deleted file mode 100644 index ff858dc6388..00000000000 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-jruby-base.dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM jruby:9.4-jdk17 - -ADD ./ /sinatra-sequel -WORKDIR /sinatra-sequel - -ENV THREAD_FACTOR=2 - -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle From 47dcfdb2d4b3d6b8ccc26a39b197869d2ad534e3 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 May 2024 19:15:03 +0200 Subject: [PATCH 0554/1766] [ruby/padrino] Use https for Gemfile source (#8989) https is the recommended default for Gemfiles to avoid mitm attacks. --- frameworks/Ruby/padrino/Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/padrino/Gemfile b/frameworks/Ruby/padrino/Gemfile index 8dad3c642ea..792046310c6 100644 --- a/frameworks/Ruby/padrino/Gemfile +++ b/frameworks/Ruby/padrino/Gemfile @@ -1,4 +1,4 @@ -source 'http://rubygems.org' +source 'https://rubygems.org' gem 'mysql2', '~> 0.4' gem "unicorn", '~> 6.1' From adf0f45e184f3940445d45aa8e03f41293fbba9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:15:15 -0700 Subject: [PATCH 0555/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/falcon (#8986) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 81c0d6ee5de..c5da990116d 100644 --- a/frameworks/Python/falcon/requirements.txt +++ b/frameworks/Python/falcon/requirements.txt @@ -1,2 +1,2 @@ falcon==3.1.1 -jinja2==3.1.3 +jinja2==3.1.4 From b10531ddbcf63213164c6073215535684fa63e8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:15:24 -0700 Subject: [PATCH 0556/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/quart (#8984) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 9e99d39a225..6ffa1093e10 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.3 +Jinja2==3.1.4 MarkupSafe==2.1.1 priority==2.0.0 quart==0.18.0 From ab8bf65ad01bc0746d5d59c8281f8da0f1316083 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:15:33 -0700 Subject: [PATCH 0557/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/fastapi (#8983) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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 02ea2224c34..478fdc103e4 100644 --- a/frameworks/Python/fastapi/requirements.txt +++ b/frameworks/Python/fastapi/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 fastapi==0.109.1 -Jinja2==3.1.3 +Jinja2==3.1.4 ujson==5.7.0 From 3a2839e54379f537bc99e74a9a0d99779d386922 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:15:47 -0700 Subject: [PATCH 0558/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/uvicorn (#8982) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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/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 1cccc583d37..8b3843c6cb6 100644 --- a/frameworks/Python/uvicorn/requirements.txt +++ b/frameworks/Python/uvicorn/requirements.txt @@ -1,7 +1,7 @@ asyncpg==0.28.0 gunicorn==22.0.0 httptools==0.6.0 -Jinja2==3.1.3 +Jinja2==3.1.4 ujson==5.8.0 uvloop==0.17.0 uvicorn==0.22.0 From db1477ad6557cdf0602137f2a8fc8b5b446c4540 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:16:11 -0700 Subject: [PATCH 0559/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/granian (#8979) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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/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 c56773f21ab..75e49987e80 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.29.0 granian>=1.3.1,<1.4.0 -jinja2==3.1.3 +jinja2==3.1.4 orjson==3.10.2 From 39f0e9b0cb8c17a9ee841e4b78d56ddfe960a362 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:16:16 -0700 Subject: [PATCH 0560/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/routerling (#8978) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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/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 70fdeb5d55f..276a30a5894 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==22.0.0 h11==0.12.0 -Jinja2==3.1.3 +Jinja2==3.1.4 MarkupSafe==2.0.1 routerling==0.3.1 ujson==5.4.0 From ad1007f49f8a0f1a57623e75b8ad758695a765ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:16:22 -0700 Subject: [PATCH 0561/1766] Bump werkzeug from 2.2.3 to 3.0.3 in /frameworks/Python/quart (#8976) Bumps [werkzeug](https://github.com/pallets/werkzeug) from 2.2.3 to 3.0.3. - [Release notes](https://github.com/pallets/werkzeug/releases) - [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/werkzeug/compare/2.2.3...3.0.3) --- updated-dependencies: - dependency-name: werkzeug 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 6ffa1093e10..fb1f1a1e0be 100644 --- a/frameworks/Python/quart/requirements.txt +++ b/frameworks/Python/quart/requirements.txt @@ -14,5 +14,5 @@ priority==2.0.0 quart==0.18.0 toml==0.10.2 uvloop==0.16.0 -Werkzeug==2.2.3 +Werkzeug==3.0.3 wsproto==1.2.0 From a6dacd3ddef6649e7650b188b2ee5eb91275759c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 May 2024 19:16:32 +0200 Subject: [PATCH 0562/1766] [ruby/grape] Use https for Gemfile source (#8962) https is the recommended default for Gemfiles to avoid mitm attacks. --- frameworks/Ruby/grape/Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/grape/Gemfile b/frameworks/Ruby/grape/Gemfile index 846757d6607..11003918d94 100644 --- a/frameworks/Ruby/grape/Gemfile +++ b/frameworks/Ruby/grape/Gemfile @@ -1,4 +1,4 @@ -source 'http://rubygems.org' +source 'https://rubygems.org' gem 'mysql2', '0.5.4' gem 'unicorn', '6.1.0' From 109127a1d8b91b603beb1749faf4a2366d0ff4f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 10:41:21 -0700 Subject: [PATCH 0563/1766] Bump jinja2 from 3.1.3 to 3.1.4 in /frameworks/Python/fastwsgi (#8981) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [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.3...3.1.4) --- 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/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 6fb55802cfd..6ffecb787c6 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.3 +Jinja2==3.1.4 cachetools==5.3.0 asyncache==0.3.1 From f2b0b607acb50c71890f00693bc2f467d217ba4f Mon Sep 17 00:00:00 2001 From: Tim Yates Date: Wed, 8 May 2024 18:52:06 +0100 Subject: [PATCH 0564/1766] Micronaut to 4.4.2 and Upgrades (#8778) * Micronaut Upgrades - Micronaut to 4.3.4 - Micronaut Gradle plugin to latest - Unpin micronaut-data-mongodb - Update Gradle to 8.6 * Update frameworks/Java/micronaut/gradle.properties Co-authored-by: Sergio del Amo * Apply suggestions from code review Co-authored-by: Sergio del Amo * Tie Graal docker images to 21 I don't think the Gradle we're using uses 22 yet * Micronaut 4.4.1, Gradle 8.7, update dockerfiles for graal * Gradle 8.7 * Update gradle plugin * Try and trigger pipelines on my fork * Update frameworks/Java/micronaut/gradle.properties Co-authored-by: Sergio del Amo --------- Co-authored-by: Sergio del Amo --- .../Java/micronaut/buildSrc/build.gradle | 4 ++-- frameworks/Java/micronaut/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Java/micronaut/gradlew.bat | 20 +++++++++--------- .../micronaut-data-jdbc-graalvm.dockerfile | 9 ++++---- .../micronaut/micronaut-data-jdbc.dockerfile | 2 +- .../micronaut-data-mongodb-graalvm.dockerfile | 9 ++++---- .../micronaut-data-mongodb.dockerfile | 2 +- .../micronaut-data-mongodb/build.gradle | 2 +- .../micronaut-data-r2dbc-graalvm.dockerfile | 9 ++++---- .../micronaut/micronaut-data-r2dbc.dockerfile | 2 +- .../micronaut/micronaut-graalvm.dockerfile | 8 +++---- .../micronaut-jdbc-graalvm.dockerfile | 9 ++++---- .../Java/micronaut/micronaut-jdbc.dockerfile | 2 +- .../micronaut-r2dbc-graalvm.dockerfile | 9 ++++---- .../Java/micronaut/micronaut-r2dbc.dockerfile | 2 +- .../Java/micronaut/micronaut.dockerfile | 2 +- 18 files changed, 45 insertions(+), 50 deletions(-) diff --git a/frameworks/Java/micronaut/buildSrc/build.gradle b/frameworks/Java/micronaut/buildSrc/build.gradle index e15932b65d0..7f10f90ed59 100644 --- a/frameworks/Java/micronaut/buildSrc/build.gradle +++ b/frameworks/Java/micronaut/buildSrc/build.gradle @@ -8,6 +8,6 @@ repositories { } dependencies { - implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.0.1" - implementation "gradle.plugin.com.github.johnrengelman:shadow:7.1.2" + implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.3.7" + implementation "com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1" } \ No newline at end of file diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index a52f36963cb..7c1acd121c6 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion = 4.2.2 +micronautVersion=4.4.2 diff --git a/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.jar b/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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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/Java/micronaut/gradle/wrapper/gradle-wrapper.properties b/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties index 3fa8f862f75..b82aa23a4f0 100644 --- a/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Java/micronaut/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.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Java/micronaut/gradlew.bat b/frameworks/Java/micronaut/gradlew.bat index 6689b85beec..7101f8e4676 100644 --- a/frameworks/Java/micronaut/gradlew.bat +++ b/frameworks/Java/micronaut/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/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile index 2057d6d9487..c93c4012437 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile @@ -1,11 +1,10 @@ -FROM ghcr.io/graalvm/graalvm-community:latest as build +FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew --no-daemon -RUN ./gradlew micronaut-data-jdbc:nativeBuild -x test --no-daemon +RUN ./gradlew micronaut-data-jdbc:nativeCompile -x test --no-daemon -FROM frolvlad/alpine-glibc:glibc-2.34 -RUN apk --no-cache update && apk add libstdc++ +FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/native/nativeCompile/micronaut-data-jdbc micronaut diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile index a15705ff470..490d61c7eca 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.1.0-jdk17 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-jdbc:build -x test --no-daemon diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile index 1f090fc4deb..162ab11cb31 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile @@ -1,11 +1,10 @@ -FROM ghcr.io/graalvm/graalvm-community:latest as build +FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew --no-daemon -RUN ./gradlew micronaut-data-mongodb:nativeBuild -x test --no-daemon +RUN ./gradlew micronaut-data-mongodb:nativeCompile -x test --no-daemon -FROM frolvlad/alpine-glibc:glibc-2.34 -RUN apk --no-cache update && apk add libstdc++ +FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/native/nativeCompile/micronaut-data-mongodb micronaut diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile index 3b009baa929..38dfebc28bb 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.1.0-jdk17 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-mongodb:build -x test --no-daemon diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb/build.gradle b/frameworks/Java/micronaut/micronaut-data-mongodb/build.gradle index a80c5797d38..07cc244708a 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb/build.gradle +++ b/frameworks/Java/micronaut/micronaut-data-mongodb/build.gradle @@ -4,6 +4,6 @@ plugins { dependencies { annotationProcessor("io.micronaut.data:micronaut-data-document-processor") - implementation("io.micronaut.data:micronaut-data-mongodb:3.8.1") + implementation("io.micronaut.data:micronaut-data-mongodb") runtimeOnly("io.micronaut.mongodb:micronaut-mongo-sync") } \ No newline at end of file diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile index ad20f4f403d..14004898dc1 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile @@ -1,11 +1,10 @@ -FROM ghcr.io/graalvm/graalvm-community:latest as build +FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew --no-daemon -RUN ./gradlew micronaut-data-r2dbc:nativeBuild -x test --no-daemon +RUN ./gradlew micronaut-data-r2dbc:nativeCompile -x test --no-daemon -FROM frolvlad/alpine-glibc:glibc-2.34 -RUN apk --no-cache update && apk add libstdc++ +FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/native/nativeCompile/micronaut-data-r2dbc micronaut diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile index efb48dd3fb1..354616d4e94 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.1.0-jdk17 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-r2dbc:build -x test --no-daemon diff --git a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile index 3f364c05edd..f4cbb033460 100644 --- a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile @@ -1,10 +1,10 @@ -FROM ghcr.io/graalvm/graalvm-community:latest as build +FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew --no-daemon -RUN ./gradlew micronaut-vertx-pg-client:nativeBuild -x test --no-daemon +RUN ./gradlew micronaut-vertx-pg-client:nativeCompile -x test --no-daemon -FROM frolvlad/alpine-glibc:glibc-2.34 +FROM cgr.dev/chainguard/wolfi-base:latest RUN apk --no-cache update && apk add libstdc++ WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/native/nativeCompile/micronaut-vertx-pg-client micronaut diff --git a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile index 3a35839970c..a64b60773ad 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile @@ -1,11 +1,10 @@ -FROM ghcr.io/graalvm/graalvm-community:latest as build +FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew --no-daemon -RUN ./gradlew micronaut-jdbc:nativeBuild -x test --no-daemon +RUN ./gradlew micronaut-jdbc:nativeCompile -x test --no-daemon -FROM frolvlad/alpine-glibc:glibc-2.34 -RUN apk --no-cache update && apk add libstdc++ +FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-jdbc/build/native/nativeCompile/micronaut-jdbc micronaut diff --git a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile index 6113f396683..775229a0f14 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.1.0-jdk17 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-jdbc:build -x test --no-daemon diff --git a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile index 627fd21aba2..ff10709dae7 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile @@ -1,11 +1,10 @@ -FROM ghcr.io/graalvm/graalvm-community:latest as build +FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew --no-daemon -RUN ./gradlew micronaut-r2dbc:nativeBuild -x test --no-daemon +RUN ./gradlew micronaut-r2dbc:nativeCompile -x test --no-daemon -FROM frolvlad/alpine-glibc:glibc-2.34 -RUN apk --no-cache update && apk add libstdc++ +FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-r2dbc/build/native/nativeCompile/micronaut-r2dbc micronaut diff --git a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile index cad08e08d3b..e7c2e227ac5 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.1.0-jdk17 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-r2dbc:build -x test --no-daemon diff --git a/frameworks/Java/micronaut/micronaut.dockerfile b/frameworks/Java/micronaut/micronaut.dockerfile index 72376d86588..1ca142d8266 100644 --- a/frameworks/Java/micronaut/micronaut.dockerfile +++ b/frameworks/Java/micronaut/micronaut.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.1.0-jdk17 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-vertx-pg-client:build -x test --no-daemon From 77513b8d34ce60860d47d9f95e9c5035d605dca9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 May 2024 20:14:44 +0200 Subject: [PATCH 0565/1766] [ruby] Use Jemalloc for better memory performance (#8998) --- frameworks/Ruby/agoo/agoo.dockerfile | 8 +++++++- frameworks/Ruby/hanami/hanami.dockerfile | 7 ++++++- .../rack-sequel/rack-sequel-passenger-mri.dockerfile | 8 +++++++- .../rack-sequel-postgres-passenger-mri.dockerfile | 8 +++++++- .../rack-sequel-postgres-unicorn-mri.dockerfile | 8 +++++++- .../Ruby/rack-sequel/rack-sequel-postgres.dockerfile | 8 +++++++- .../Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile | 8 +++++++- frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 8 +++++++- frameworks/Ruby/rack/rack-falcon.dockerfile | 7 ++++++- frameworks/Ruby/rack/rack-unicorn.dockerfile | 9 ++++++--- frameworks/Ruby/rails/rails-mysql.dockerfile | 8 +++++++- frameworks/Ruby/rails/rails.dockerfile | 7 ++++++- .../roda-sequel/roda-sequel-passenger-mri.dockerfile | 7 ++++++- .../roda-sequel-postgres-passenger-mri.dockerfile | 7 ++++++- .../roda-sequel-postgres-unicorn-mri.dockerfile | 7 ++++++- .../Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 7 ++++++- .../Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile | 7 ++++++- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 7 ++++++- 18 files changed, 116 insertions(+), 20 deletions(-) diff --git a/frameworks/Ruby/agoo/agoo.dockerfile b/frameworks/Ruby/agoo/agoo.dockerfile index b423b2b4f4d..964e91aa5a5 100644 --- a/frameworks/Ruby/agoo/agoo.dockerfile +++ b/frameworks/Ruby/agoo/agoo.dockerfile @@ -6,6 +6,13 @@ RUN apt-get update -q \ libpq-dev \ && rm -rf /var/lib/apt/lists/* +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + WORKDIR /rack COPY Gemfile app.rb ./ @@ -14,6 +21,5 @@ RUN bundle install --jobs=4 EXPOSE 8080 -ENV RUBY_YJIT_ENABLE=1 CMD AGOO_WORKER_COUNT=$(nproc) ruby app.rb diff --git a/frameworks/Ruby/hanami/hanami.dockerfile b/frameworks/Ruby/hanami/hanami.dockerfile index 4fb8b4523f7..01972160167 100644 --- a/frameworks/Ruby/hanami/hanami.dockerfile +++ b/frameworks/Ruby/hanami/hanami.dockerfile @@ -1,12 +1,17 @@ FROM ruby:3.3 -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + WORKDIR /hanami COPY Gemfile ./ +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 COPY . . diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index 381ea34a10b..e3358a97a54 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile @@ -4,12 +4,18 @@ ADD ./ /rack-sequel WORKDIR /rack-sequel +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true ENV DBTYPE=mysql -ENV RUBY_YJIT_ENABLE=1 RUN ruby -r /rack-sequel/config/auto_tune -e 'puts auto_tune.first' > instances 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 d157b710c31..886db283700 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile @@ -4,12 +4,18 @@ ADD ./ /rack-sequel WORKDIR /rack-sequel +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true ENV DBTYPE=postgresql -ENV RUBY_YJIT_ENABLE=1 RUN ruby -r /rack-sequel/config/auto_tune -e 'puts auto_tune.first' > instances 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 68f6665bf74..9188db23a17 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile @@ -4,10 +4,16 @@ ADD ./ /rack-sequel WORKDIR /rack-sequel +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle ENV DBTYPE=postgresql -ENV RUBY_YJIT_ENABLE=1 EXPOSE 8080 diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index 3737c034cda..bdbb0474064 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile @@ -4,10 +4,16 @@ ADD ./ /rack-sequel WORKDIR /rack-sequel +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle ENV DBTYPE=postgresql -ENV RUBY_YJIT_ENABLE=1 EXPOSE 8080 diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile index 846d25d0532..303a687561d 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile @@ -4,10 +4,16 @@ ADD ./ /rack-sequel WORKDIR /rack-sequel +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle ENV DBTYPE=mysql -ENV RUBY_YJIT_ENABLE=1 EXPOSE 8080 diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index 796978d6d52..056e29e13ab 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -4,10 +4,16 @@ ADD ./ /rack-sequel WORKDIR /rack-sequel +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle ENV DBTYPE=mysql -ENV RUBY_YJIT_ENABLE=1 EXPOSE 8080 diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index a8975a65038..9e624e43fa8 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -1,12 +1,17 @@ FROM ruby:3.3 -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + WORKDIR /rack COPY Gemfile ./ +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set without 'development test' RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index 11c017d61f2..b5bb2ffbbd6 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -1,14 +1,17 @@ FROM ruby:3.3 -#RUN apt-get update -yqq && apt-get install -yqq nginx - -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + WORKDIR /rack COPY Gemfile ./ +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set without 'development test' RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index 7129e9bd6d6..370b08ba493 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -5,6 +5,13 @@ RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-se EXPOSE 8080 WORKDIR /rails +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true @@ -13,7 +20,6 @@ RUN bundle install --jobs=8 COPY . /rails/ -ENV RUBY_YJIT_ENABLE=1 ENV RAILS_ENV=production_mysql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index d49a378e9bf..3e02770b190 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -5,6 +5,12 @@ RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-se EXPOSE 8080 WORKDIR /rails +ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true @@ -13,7 +19,6 @@ RUN bundle install --jobs=8 COPY . /rails/ -ENV RUBY_YJIT_ENABLE=1 ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile index 2aad19e21e1..0af00a72d36 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile @@ -3,9 +3,14 @@ FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 # TODO: https://github.com/phusion/passenger/issues/1916 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 74aaf520136..a24b9881d00 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile @@ -3,9 +3,14 @@ FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 # TODO: https://github.com/phusion/passenger/issues/1916 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 2a7da65809e..1cd10beab1e 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile @@ -3,9 +3,14 @@ FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile index d0f073132ca..a6fa24be8e6 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile @@ -3,9 +3,14 @@ FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile index 0595393d903..223d23a8d75 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile @@ -3,9 +3,14 @@ FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 ENV DBTYPE=mysql diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index 0988d366a1e..ad4283ec2e6 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -3,9 +3,14 @@ FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 ENV DBTYPE=mysql From e5d2b6e6fecfed14de6cab487c6e34387d92a07d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 15:21:55 +0000 Subject: [PATCH 0566/1766] Bump Npgsql in /frameworks/CSharp/aspnetcore-mono/Benchmarks Bumps Npgsql from 4.1.4 to 8.0.3. --- updated-dependencies: - dependency-name: Npgsql dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj index 3ccea1c3707..1a1e7ee6d9a 100644 --- a/frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj @@ -25,6 +25,7 @@ + From 1edc6fbd95e8e6fe0430813fd061d305f735797d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 15:40:20 +0000 Subject: [PATCH 0567/1766] Bump Npgsql from 7.0.0 to 8.0.3 in /frameworks/FSharp/falco/src/App Bumps [Npgsql](https://github.com/npgsql/npgsql) from 7.0.0 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v7.0.0...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/FSharp/falco/src/App/App.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/FSharp/falco/src/App/App.fsproj b/frameworks/FSharp/falco/src/App/App.fsproj index 00e8bf8f22c..437c5ae6329 100644 --- a/frameworks/FSharp/falco/src/App/App.fsproj +++ b/frameworks/FSharp/falco/src/App/App.fsproj @@ -21,7 +21,7 @@ - + From e7161df20eafd2cff15fd49c0bf6ddeddc61e70f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 15:47:34 +0000 Subject: [PATCH 0568/1766] Bump Npgsql from 8.0.2 to 8.0.3 in /frameworks/FSharp/giraffe/src/App Bumps [Npgsql](https://github.com/npgsql/npgsql) from 8.0.2 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v8.0.2...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/FSharp/giraffe/src/App/App.fsproj | 38 ++++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/frameworks/FSharp/giraffe/src/App/App.fsproj b/frameworks/FSharp/giraffe/src/App/App.fsproj index 00bda86ff7d..9faae3fe0a1 100644 --- a/frameworks/FSharp/giraffe/src/App/App.fsproj +++ b/frameworks/FSharp/giraffe/src/App/App.fsproj @@ -1,19 +1,19 @@ - - - - net8.0 - false - - - - - - - - - - - - - - + + + + net8.0 + false + + + + + + + + + + + + + + From e903d15a63eed946e2c18ed61774f78ca2af834e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:05:32 -0700 Subject: [PATCH 0569/1766] Bump Npgsql from 8.0.2 to 8.0.3 in /frameworks/FSharp/zebra/src/App (#9008) Bumps [Npgsql](https://github.com/npgsql/npgsql) from 8.0.2 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v8.0.2...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/FSharp/zebra/src/App/App.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/FSharp/zebra/src/App/App.fsproj b/frameworks/FSharp/zebra/src/App/App.fsproj index 2acd7ea75e9..84fb27f39d0 100644 --- a/frameworks/FSharp/zebra/src/App/App.fsproj +++ b/frameworks/FSharp/zebra/src/App/App.fsproj @@ -10,7 +10,7 @@ - + From e669cb263eba9f1de225c603f2d335598dddd5c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:05:40 -0700 Subject: [PATCH 0570/1766] Bump Npgsql in /frameworks/CSharp/aspnetcore/src/Platform (#9006) Bumps [Npgsql](https://github.com/npgsql/npgsql) from 8.0.1 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v8.0.1...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj index fb4d0bf7014..548e446ee0a 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj +++ b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj @@ -19,7 +19,7 @@ - + From 76c6b1eb3c24e80e580eb2190a7405a24ce10798 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:06:06 -0700 Subject: [PATCH 0571/1766] Bump Npgsql in /frameworks/CSharp/aspnetcore/src/Minimal (#9005) Bumps [Npgsql](https://github.com/npgsql/npgsql) from 8.0.1 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v8.0.1...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj index 5ee139c7d58..783ec88ff32 100644 --- a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj +++ b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj @@ -9,7 +9,7 @@ - + From bad99943926375fd9decccafbf5881754af591ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:06:19 -0700 Subject: [PATCH 0572/1766] Bump Npgsql in /frameworks/CSharp/aspnetcore/src/Mvc (#9004) Bumps [Npgsql](https://github.com/npgsql/npgsql) from 8.0.0-rc.2 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v8.0.0-rc.2...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj b/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj index 8da7f631b80..5bffd479c0f 100644 --- a/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj +++ b/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj @@ -9,7 +9,7 @@ - + From 977b72cd3a3b63830b168432e4ba2f76ad387950 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:06:26 -0700 Subject: [PATCH 0573/1766] Bump Npgsql from 7.0.0 to 8.0.3 in /frameworks/VB/aspnetcore/Benchmarks (#9003) Bumps [Npgsql](https://github.com/npgsql/npgsql) from 7.0.0 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v7.0.0...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/VB/aspnetcore/Benchmarks/Benchmarks.vbproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/VB/aspnetcore/Benchmarks/Benchmarks.vbproj b/frameworks/VB/aspnetcore/Benchmarks/Benchmarks.vbproj index fe9d3cbf5b6..59613d54879 100644 --- a/frameworks/VB/aspnetcore/Benchmarks/Benchmarks.vbproj +++ b/frameworks/VB/aspnetcore/Benchmarks/Benchmarks.vbproj @@ -11,7 +11,7 @@ - + From ac99b62c68c3bcd77c5e30962dae20757c6b0db4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:06:34 -0700 Subject: [PATCH 0574/1766] Bump Npgsql from 7.0.0 to 8.0.3 in /frameworks/FSharp/frank/src/App (#9002) Bumps [Npgsql](https://github.com/npgsql/npgsql) from 7.0.0 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v7.0.0...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/FSharp/frank/src/App/App.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/FSharp/frank/src/App/App.fsproj b/frameworks/FSharp/frank/src/App/App.fsproj index ac861c86488..6d5658a653d 100644 --- a/frameworks/FSharp/frank/src/App/App.fsproj +++ b/frameworks/FSharp/frank/src/App/App.fsproj @@ -16,7 +16,7 @@ - + From 4c7cb9debaab4cd7c9752c92665c6457748c5570 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:07:11 -0700 Subject: [PATCH 0575/1766] Bump Npgsql in /frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks (#8999) Bumps [Npgsql](https://github.com/npgsql/npgsql) from 5.0.0-alpha1 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v5.0.0-alpha1...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../PlatformBenchmarks/PlatformBenchmarks.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj b/frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj index db72cd753ec..325b9acb8cc 100644 --- a/frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj +++ b/frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj @@ -23,7 +23,7 @@ - + From c84fa047b70de9860c9d89795ac0acc0c471000a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 9 May 2024 19:07:22 +0200 Subject: [PATCH 0576/1766] [ruby] Combine *-sequel frameworks with their main frameworks (#8997) `rack-sequel` and `sinatra-sequel` only use a different ORM (sequel) than `rack` and `sinatra`. There is no need to test `/json` and `/plaintext` for `rack-sequel` and `sinatra-sequel`, as they don't use the ORM. For `sinatra-sequel` the `/json` and `/plaintext` calls were already removed from the benchmark config in 1f94f389dcc30f1795b23953ad152560d5433f9f. This change does the same for `rack-sequel`. To still see these results in the combined table the framework should be set to `rack` and `sinatra`. --- .../Ruby/rack-sequel/benchmark_config.json | 18 ++--- .../Ruby/rack-sequel/benchmark_config.rb | 8 --- .../Ruby/rack-sequel/benchmark_config.yaml | 69 ------------------- .../Ruby/sinatra-sequel/benchmark_config.json | 12 ++-- 4 files changed, 12 insertions(+), 95 deletions(-) delete mode 100644 frameworks/Ruby/rack-sequel/benchmark_config.rb delete mode 100644 frameworks/Ruby/rack-sequel/benchmark_config.yaml diff --git a/frameworks/Ruby/rack-sequel/benchmark_config.json b/frameworks/Ruby/rack-sequel/benchmark_config.json index a298e84d371..30ba62a6223 100644 --- a/frameworks/Ruby/rack-sequel/benchmark_config.json +++ b/frameworks/Ruby/rack-sequel/benchmark_config.json @@ -3,17 +3,15 @@ "tests": [ { "default": { - "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", "port": 8080, "approach": "Stripped", "classification": "Micro", "database": "MySQL", - "framework": "rack-sequel", + "framework": "rack", "language": "Ruby", "orm": "Micro", "platform": "Rack", @@ -33,7 +31,7 @@ "approach": "Stripped", "classification": "Micro", "database": "Postgres", - "framework": "rack-sequel", + "framework": "rack", "language": "Ruby", "orm": "Micro", "platform": "Rack", @@ -45,8 +43,6 @@ "notes": "" }, "passenger-mri": { - "json_url": "/json", - "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", @@ -55,7 +51,7 @@ "approach": "Stripped", "classification": "Micro", "database": "MySQL", - "framework": "rack-sequel", + "framework": "rack", "language": "Ruby", "orm": "Micro", "platform": "Rack", @@ -75,7 +71,7 @@ "approach": "Stripped", "classification": "Micro", "database": "Postgres", - "framework": "rack-sequel", + "framework": "rack", "language": "Ruby", "orm": "Micro", "platform": "Rack", @@ -87,17 +83,15 @@ "notes": "" }, "unicorn-mri": { - "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", "port": 8080, "approach": "Stripped", "classification": "Micro", "database": "MySQL", - "framework": "rack-sequel", + "framework": "rack", "language": "Ruby", "orm": "Micro", "platform": "Rack", @@ -117,7 +111,7 @@ "approach": "Stripped", "classification": "Micro", "database": "Postgres", - "framework": "rack-sequel", + "framework": "rack", "language": "Ruby", "orm": "Micro", "platform": "Rack", diff --git a/frameworks/Ruby/rack-sequel/benchmark_config.rb b/frameworks/Ruby/rack-sequel/benchmark_config.rb deleted file mode 100644 index 5aa58997825..00000000000 --- a/frameworks/Ruby/rack-sequel/benchmark_config.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -require 'json' -require 'yaml' - -yaml = YAML.load(ARGF.read) -yaml["tests"][0].delete_if { |_, v| v["disabled"] } -puts JSON.pretty_generate(yaml) diff --git a/frameworks/Ruby/rack-sequel/benchmark_config.yaml b/frameworks/Ruby/rack-sequel/benchmark_config.yaml deleted file mode 100644 index 16ae74080e5..00000000000 --- a/frameworks/Ruby/rack-sequel/benchmark_config.yaml +++ /dev/null @@ -1,69 +0,0 @@ ---- -framework: rack-sequel -tests: - - default: &default - setup_file: run_mri_puma - json_url: /json - db_url: /db - query_url: /queries?queries= - fortune_url: /fortunes - update_url: /updates?queries= - plaintext_url: /plaintext - port: 8080 - approach: Stripped - classification: Micro - database: MySQL - framework: rack-sequel - language: Ruby - orm: Micro - platform: Rack - webserver: Puma - os: Linux - database_os: Linux - display_name: rack-sequel-puma-mri - versus: rack-puma-mri - notes: "" - postgres: - <<: *default - database: Postgres - display_name: rack-sequel-postgres-puma-mri - versus: ~ - puma-jruby: - <<: *default - setup_file: run_jruby_puma - display_name: rack-sequel-puma-jruby - versus: rack-puma-jruby - disabled: true - postgres-puma-jruby: - <<: *default - setup_file: run_jruby_puma - database: Postgres - display_name: rack-sequel-postgres-puma-jruby - versus: ~ - disabled: true - passenger-mri: - <<: *default - setup_file: run_mri_passenger - webserver: Passenger - display_name: rack-sequel-passenger-mri - versus: ~ - postgres-passenger-mri: - <<: *default - setup_file: run_mri_passenger - database: Postgres - webserver: Passenger - display_name: rack-sequel-postgres-passenger-mri - versus: ~ - unicorn-mri: - <<: *default - setup_file: run_mri_unicorn - webserver: Unicorn - display_name: rack-sequel-unicorn-mri - versus: rack-unicorn - postgres-unicorn-mri: - <<: *default - setup_file: run_mri_unicorn - database: Postgres - webserver: Unicorn - display_name: rack-sequel-postgres-unicorn-mri - versus: ~ diff --git a/frameworks/Ruby/sinatra-sequel/benchmark_config.json b/frameworks/Ruby/sinatra-sequel/benchmark_config.json index 906e08a6611..c16da1e0e26 100644 --- a/frameworks/Ruby/sinatra-sequel/benchmark_config.json +++ b/frameworks/Ruby/sinatra-sequel/benchmark_config.json @@ -11,7 +11,7 @@ "approach": "Realistic", "classification": "Micro", "database": "MySQL", - "framework": "sinatra-sequel", + "framework": "sinatra", "language": "Ruby", "orm": "Full", "platform": "Rack", @@ -31,7 +31,7 @@ "approach": "Realistic", "classification": "Micro", "database": "Postgres", - "framework": "sinatra-sequel", + "framework": "sinatra", "language": "Ruby", "orm": "Full", "platform": "Rack", @@ -51,7 +51,7 @@ "approach": "Realistic", "classification": "Micro", "database": "MySQL", - "framework": "sinatra-sequel", + "framework": "sinatra", "language": "Ruby", "orm": "Full", "platform": "Rack", @@ -71,7 +71,7 @@ "approach": "Realistic", "classification": "Micro", "database": "Postgres", - "framework": "sinatra-sequel", + "framework": "sinatra", "language": "Ruby", "orm": "Full", "platform": "Rack", @@ -91,7 +91,7 @@ "approach": "Realistic", "classification": "Micro", "database": "MySQL", - "framework": "sinatra-sequel", + "framework": "sinatra", "language": "Ruby", "orm": "Full", "platform": "Rack", @@ -111,7 +111,7 @@ "approach": "Realistic", "classification": "Micro", "database": "Postgres", - "framework": "sinatra-sequel", + "framework": "sinatra", "language": "Ruby", "orm": "Full", "platform": "Rack", From 5c4c3e13e0378b530132c4660c1c2d63df89460a Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Thu, 9 May 2024 10:09:45 -0700 Subject: [PATCH 0577/1766] F# Oxpecker framework (#8996) * Oxpecker framework * Updated Oxpecker version * Converted json to jsonChunked --- frameworks/FSharp/oxpecker/.gitignore | 360 ++++++++++++++++++ frameworks/FSharp/oxpecker/README.md | 26 ++ .../FSharp/oxpecker/benchmark_config.json | 27 ++ frameworks/FSharp/oxpecker/config.toml | 16 + .../FSharp/oxpecker/oxpecker.dockerfile | 14 + frameworks/FSharp/oxpecker/src/App/App.fsproj | 22 ++ frameworks/FSharp/oxpecker/src/App/Program.fs | 112 ++++++ .../src/App/runtimeconfig.template.json | 7 + 8 files changed, 584 insertions(+) create mode 100644 frameworks/FSharp/oxpecker/.gitignore create mode 100644 frameworks/FSharp/oxpecker/README.md create mode 100644 frameworks/FSharp/oxpecker/benchmark_config.json create mode 100644 frameworks/FSharp/oxpecker/config.toml create mode 100644 frameworks/FSharp/oxpecker/oxpecker.dockerfile create mode 100644 frameworks/FSharp/oxpecker/src/App/App.fsproj create mode 100644 frameworks/FSharp/oxpecker/src/App/Program.fs create mode 100644 frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json diff --git a/frameworks/FSharp/oxpecker/.gitignore b/frameworks/FSharp/oxpecker/.gitignore new file mode 100644 index 00000000000..2ad42ca00cf --- /dev/null +++ b/frameworks/FSharp/oxpecker/.gitignore @@ -0,0 +1,360 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*[.json, .xml, .info] + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/README.md b/frameworks/FSharp/oxpecker/README.md new file mode 100644 index 00000000000..ecd2284661d --- /dev/null +++ b/frameworks/FSharp/oxpecker/README.md @@ -0,0 +1,26 @@ +# Oxpecker Tests on Linux +This includes tests for plaintext, json, and fortunes HTML serialization. + +## Infrastructure Software Versions + +**Language** + +* F# 8.0 + +**Platforms** + +* .NET Core (Windows and Linux) + +**Web Servers** + +* [Kestrel](https://github.com/dotnet/aspnetcore/tree/main/src/Servers/Kestrel) + +**Web Stack** + +* [Oxpecker](https://github.com/Lanayx/Oxpecker) +* [Dapper](https://github.com/DapperLib/Dapper) +* ASP.NET Core + +## Paths & Source for Tests + +All source code is inside `Program.fs`. diff --git a/frameworks/FSharp/oxpecker/benchmark_config.json b/frameworks/FSharp/oxpecker/benchmark_config.json new file mode 100644 index 00000000000..56a862ac012 --- /dev/null +++ b/frameworks/FSharp/oxpecker/benchmark_config.json @@ -0,0 +1,27 @@ +{ + "framework": "oxpecker", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Oxpecker", + "language": "F#", + "orm": "Micro", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "Kestrel", + "os": "Linux", + "database_os": "Linux", + "display_name": "Oxpecker, Dapper", + "notes": "", + "versus": "aspcore" + } + } + ] +} diff --git a/frameworks/FSharp/oxpecker/config.toml b/frameworks/FSharp/oxpecker/config.toml new file mode 100644 index 00000000000..a3ca01bddc4 --- /dev/null +++ b/frameworks/FSharp/oxpecker/config.toml @@ -0,0 +1,16 @@ +[framework] +name = "oxpecker" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "micro" +platform = ".NET" +webserver = "Kestrel" +versus = "aspcore" \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/oxpecker.dockerfile b/frameworks/FSharp/oxpecker/oxpecker.dockerfile new file mode 100644 index 00000000000..c65349e32cd --- /dev/null +++ b/frameworks/FSharp/oxpecker/oxpecker.dockerfile @@ -0,0 +1,14 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /app +COPY src/App . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +ENV URLS http://+:8080 + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "App.dll"] \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj new file mode 100644 index 00000000000..d842ca29be1 --- /dev/null +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -0,0 +1,22 @@ + + + + net8.0 + Exe + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs new file mode 100644 index 00000000000..786581dee9e --- /dev/null +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -0,0 +1,112 @@ +namespace App + +[] +module Common = + open System + + [] + type Fortune = + { + id : int + message : string + } + + [] + let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" + + let fortuneComparer a b = + String.CompareOrdinal(a.message, b.message) + +[] +module HtmlViews = + open Oxpecker.ViewEngine + + let private fortunesHead = + head() { + title() { raw "Fortunes" } + } + + let private layout (content: HtmlElement) = + html() { + fortunesHead + body() { content } + } + + let private fortunesTableHeader = + tr() { + th() { raw "id" } + th() { raw "message" } + } + + let fortunes (fortunes: Fortune[]) = + table() { + fortunesTableHeader + for f in fortunes do + tr() { + td() { raw <| string f.id } + td() { f.message } + } + } |> layout + +[] +module HttpHandlers = + open Oxpecker + open Dapper + open Npgsql + + let private extra = + { + id = 0 + message = "Additional fortune added at request time." + } + + let private fortunes : EndpointHandler = + fun ctx -> + task { + use conn = new NpgsqlConnection(ConnectionString) + let! data = conn.QueryAsync("SELECT id, message FROM fortune") + let augmentedData = [| + yield! data + extra + |] + augmentedData |> Array.sortInPlaceWith fortuneComparer + let view = HtmlViews.fortunes augmentedData + return! ctx.WriteHtmlView view + } + + let endpoints : Endpoint[] = + [| + route "/plaintext" <| text "Hello, World!" + route "/json"<| jsonChunked {| message = "Hello, World!" |} + route "/fortunes" fortunes + |] + + +module Main = + open Microsoft.AspNetCore.Builder + open Microsoft.AspNetCore.Hosting + open Microsoft.Extensions.DependencyInjection + open Oxpecker + open Microsoft.Extensions.Hosting + open Microsoft.Extensions.Logging + + [] + let main args = + + let builder = WebApplication.CreateBuilder(args) + + builder.Services + .AddRouting() + .AddOxpecker() |> ignore + + builder.Logging.ClearProviders() |> ignore + builder.WebHost.ConfigureKestrel(fun options -> options.AllowSynchronousIO <- true) |> ignore + + let app = builder.Build() + + app.UseRouting() + .UseOxpecker HttpHandlers.endpoints |> ignore + + app.Run() + + 0 \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json b/frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json new file mode 100644 index 00000000000..79721130fd5 --- /dev/null +++ b/frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json @@ -0,0 +1,7 @@ +{ + "configProperties": { + "System.GC.Server": true, + "System.GC.NoAffinitize": true, + "System.GC.HeapCount": 2 + } + } \ No newline at end of file From 74d493fbe92c69bd38428b053dd79b1a9bec09f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 May 2024 17:06:41 +0000 Subject: [PATCH 0578/1766] Bump Npgsql from 8.0.2 to 8.0.3 in /frameworks/FSharp/oxpecker/src/App Bumps [Npgsql](https://github.com/npgsql/npgsql) from 8.0.2 to 8.0.3. - [Release notes](https://github.com/npgsql/npgsql/releases) - [Commits](https://github.com/npgsql/npgsql/compare/v8.0.2...v8.0.3) --- updated-dependencies: - dependency-name: Npgsql dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/FSharp/oxpecker/src/App/App.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index d842ca29be1..fcf2d0ccb3c 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -13,7 +13,7 @@ - + From 2a5c99b65ac7c877bd5320218072897d3e95bb18 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 13 May 2024 17:27:21 +0200 Subject: [PATCH 0579/1766] Update to Mysql 8.4 LTS (#9009) * Update to MySQL 8.4 LTS * Enable mysql_native_password * Fix my.cnf --- toolset/databases/mysql/my.cnf | 3 ++- toolset/databases/mysql/mysql.dockerfile | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/toolset/databases/mysql/my.cnf b/toolset/databases/mysql/my.cnf index 9cf0b18c5e1..40ffa8dd9eb 100644 --- a/toolset/databases/mysql/my.cnf +++ b/toolset/databases/mysql/my.cnf @@ -16,7 +16,8 @@ default-character-set=utf8 # * Basic Settings # default-storage-engine = innodb -default_authentication_plugin = mysql_native_password +mysql_native_password = ON +#default_authentication_plugin = mysql_native_password user = mysql pid-file = /var/run/mysqld/mysqld.pid diff --git a/toolset/databases/mysql/mysql.dockerfile b/toolset/databases/mysql/mysql.dockerfile index 196085811a1..1aae5eb7d38 100644 --- a/toolset/databases/mysql/mysql.dockerfile +++ b/toolset/databases/mysql/mysql.dockerfile @@ -1,4 +1,4 @@ -FROM mysql:8.3 +FROM mysql:8.4 ENV MYSQL_ROOT_PASSWORD=root ENV MYSQL_USER=benchmarkdbuser From 648f3968c829d8455847df54309cc725a07cb974 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 10:26:48 +0800 Subject: [PATCH 0580/1766] Clear libs directory --- frameworks/C++/paozhu/paozhu.dockerfile | 5 ++++- .../paozhu/paozhu_benchmark/libs/types/techempower_json.h | 0 .../libs/types/techempower_json_jsonreflect.cpp | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h mode change 100644 => 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 2b3329b664c..fe486d1995e 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -19,11 +19,14 @@ WORKDIR / RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller - +RUN rm -Rf ./paozhu/libs + COPY ./paozhu_benchmark/controller ./paozhu/ +COPY ./paozhu_benchmark/libs ./paozhu/ COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h old mode 100644 new mode 100755 diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp old mode 100644 new mode 100755 index b5088efcdf9..8ff68cdbae2 --- a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp @@ -6,6 +6,7 @@ #include "json_reflect_headers.h" #include "unicode.h" #include "func.h" +//This file is automatically created, do not edit it namespace http { From 572b7f9c9560e8cece6c9fa132b38060b82fef0b Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 11:07:35 +0800 Subject: [PATCH 0581/1766] Clear libs directory --- frameworks/C++/paozhu/paozhu.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index fe486d1995e..2eac4d14319 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -23,6 +23,7 @@ RUN rm -Rf ./paozhu/libs COPY ./paozhu_benchmark/controller ./paozhu/ COPY ./paozhu_benchmark/libs ./paozhu/ +RUN ls -l ./paozhu/libs COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ From 057bcc7605fd570e469209ee62b033c747a28cea Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 11:11:46 +0800 Subject: [PATCH 0582/1766] Clear libs directory --- frameworks/C++/paozhu/paozhu.dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 2eac4d14319..fa8f873263d 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -22,8 +22,7 @@ RUN rm -Rf ./paozhu/controller RUN rm -Rf ./paozhu/libs COPY ./paozhu_benchmark/controller ./paozhu/ -COPY ./paozhu_benchmark/libs ./paozhu/ -RUN ls -l ./paozhu/libs + COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ From 9e7aea588bf7abb4c97fabc886e0a84ae1c21194 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 11:24:27 +0800 Subject: [PATCH 0583/1766] Clear libs directory --- frameworks/C++/paozhu/paozhu.dockerfile | 6 +- .../controller/src/techempower.cpp | 378 +++++++++--------- 2 files changed, 194 insertions(+), 190 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index fa8f873263d..f7b19d96614 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -20,9 +20,13 @@ RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller RUN rm -Rf ./paozhu/libs +RUN mkdir ./paozhu/libs +RUN mkdir ./paozhu/libs/types COPY ./paozhu_benchmark/controller ./paozhu/ - +COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ + COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index 43906f42156..f8dfe230acd 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -6,236 +6,236 @@ #include #include "httppeer.h" #include "techempower.h" -#include "techempower_json.h" #include "datetime.h" #include "func.h" #include "pzcache.h" #include "json_reflect_headers.h" +#include "techempower_json.h" namespace http { -//@urlpath(null,plaintext) -std::string techempowerplaintext(std::shared_ptr peer) -{ - peer->type("text/plain; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - peer->output = "Hello, World!"; - return ""; -} - -//@urlpath(null,json) -std::string techempowerjson(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - struct techempower_outjson_t a; - a.message = "Hello, World!"; - peer->output = json_encode(a); - return ""; -} - -//@urlpath(null,db) -std::string techempowerdb(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - auto myworld = orm::World(); - unsigned int rd_num = rand_range(1, 10000); - myworld.get_one(rd_num); - - peer->output = myworld.data_tojson(); - return ""; -} - -//@urlpath(null,queries) -std::string techempowerqueries(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - - unsigned int get_num = peer->get["queries"].to_int(); - if (get_num == 0) + //@urlpath(null,plaintext) + std::string techempowerplaintext(std::shared_ptr peer) { - get_num = 1; + peer->type("text/plain; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + peer->output = "Hello, World!"; + return ""; } - else if (get_num > 500) + + //@urlpath(null,json) + std::string techempowerjson(std::shared_ptr peer) { - get_num = 500; + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + struct techempower_outjson_t a; + a.message = "Hello, World!"; + peer->output = json_encode(a); + return ""; } - auto myworld = orm::World(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) + + //@urlpath(null,db) + std::string techempowerdb(std::shared_ptr peer) { - myworld.wheresql.clear(); + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + auto myworld = orm::World(); unsigned int rd_num = rand_range(1, 10000); - myworld.where("id", rd_num).fetch_append(); - } - - peer->output = myworld.to_json(); - return ""; -} + myworld.get_one(rd_num); -//@urlpath(null,fortunes) -std::string techempowerfortunes(std::shared_ptr peer) -{ - peer->type("text/html; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - - auto myfortune = orm::Fortune(); - myfortune.fetch(); - myfortune.data.id = 0; - myfortune.data.message = "Additional fortune added at request time."; - myfortune.record.push_back(myfortune.data); - - std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) - { return lhs.message < rhs.message; }); - peer->val["list"].set_array(); - OBJ_ARRAY item; - for (unsigned int i = 0; i < myfortune.record.size(); i++) - { - item["id"] = myfortune.record[i].id; - item["message"] = html_encode(myfortune.record[i].message); - peer->val["list"].push(item); + peer->output = myworld.data_tojson(); + return ""; } - peer->view("techempower/fortunes"); - return ""; -} + //@urlpath(null,queries) + std::string techempowerqueries(std::shared_ptr peer) + { + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); -//@urlpath(null,updates) -std::string techempowerupdates(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - unsigned int get_num = peer->get["queries"].to_int(); + unsigned int get_num = peer->get["queries"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + unsigned int rd_num = rand_range(1, 10000); + myworld.where("id", rd_num).fetch_append(); + } - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; + peer->output = myworld.to_json(); + return ""; } - auto myworld = orm::World(); - myworld.record.clear(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) + + //@urlpath(null,fortunes) + std::string techempowerfortunes(std::shared_ptr peer) { - myworld.wheresql.clear(); - myworld.where("id", rand_range(1, 10000)).fetch_append(); - if (myworld.effect() > 0) + peer->type("text/html; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + auto myfortune = orm::Fortune(); + myfortune.fetch(); + myfortune.data.id = 0; + myfortune.data.message = "Additional fortune added at request time."; + myfortune.record.push_back(myfortune.data); + + std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) + { return lhs.message < rhs.message; }); + peer->val["list"].set_array(); + OBJ_ARRAY item; + for (unsigned int i = 0; i < myfortune.record.size(); i++) { - unsigned int j = myworld.record.size() - 1; - myworld.data.randomnumber = rand_range(1, 10000); - myworld.record[j].randomnumber = myworld.data.randomnumber; - myworld.update("randomnumber"); + item["id"] = myfortune.record[i].id; + item["message"] = html_encode(myfortune.record[i].message); + peer->val["list"].push(item); } - } - peer->output = myworld.to_json(); - return ""; -} -//@urlpath(null,cached-queries) -std::string techempowercached_queries(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); + peer->view("techempower/fortunes"); + return ""; + } - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) + //@urlpath(null,updates) + std::string techempowerupdates(std::shared_ptr peer) { - get_num = 1; + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + unsigned int get_num = peer->get["queries"].to_int(); + + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.clear(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + myworld.where("id", rand_range(1, 10000)).fetch_append(); + if (myworld.effect() > 0) + { + unsigned int j = myworld.record.size() - 1; + myworld.data.randomnumber = rand_range(1, 10000); + myworld.record[j].randomnumber = myworld.data.randomnumber; + myworld.update("randomnumber"); + } + } + peer->output = myworld.to_json(); + return ""; } - else if (get_num > 500) + + //@urlpath(null,cached-queries) + std::string techempowercached_queries(std::shared_ptr peer) { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "alldatacache"; + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); - pzcache> &temp_cache = pzcache>::conn(); + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "alldatacache"; - std::vector allcachedata_array; - allcachedata_array.reserve(10000); - //create rand data to cache - if (temp_cache.check(mycacheid) > -1) - { - allcachedata_array = temp_cache.get(mycacheid); - } - else - { - allcachedata_array.resize(10000); - for (unsigned int i = 0; i < 10000; i++) + pzcache> &temp_cache = pzcache>::conn(); + + std::vector allcachedata_array; + allcachedata_array.reserve(10000); + // create rand data to cache + if (temp_cache.check(mycacheid) > -1) { - allcachedata_array[i].id = i + 1; - allcachedata_array[i].randomnumber = rand_range(1, 10000); + allcachedata_array = temp_cache.get(mycacheid); } - temp_cache.save(mycacheid, allcachedata_array, 120); - } - //get rand data from cache - mycacheid = "my" + std::to_string(get_num); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) - { - myworld.record = temp_cache.get(mycacheid); - } - else - { - if (allcachedata_array.size() == 10000) + else { - for (unsigned int i = 0; i < get_num; i++) + allcachedata_array.resize(10000); + for (unsigned int i = 0; i < 10000; i++) { - unsigned int temp_rid = rand_range(0, 9999); - myworld.record.push_back(allcachedata_array[temp_rid]); + allcachedata_array[i].id = i + 1; + allcachedata_array[i].randomnumber = rand_range(1, 10000); } + temp_cache.save(mycacheid, allcachedata_array, 120); + } + // get rand data from cache + mycacheid = "my" + std::to_string(get_num); + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + if (allcachedata_array.size() == 10000) + { + for (unsigned int i = 0; i < get_num; i++) + { + unsigned int temp_rid = rand_range(0, 9999); + myworld.record.push_back(allcachedata_array[temp_rid]); + } + } + temp_cache.save(mycacheid, myworld.record, 120); } - temp_cache.save(mycacheid, myworld.record, 120); - } - - peer->output = myworld.to_json(); - return ""; -} -//@urlpath(null,cached-db) -std::string techempowercached_db(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - //this test from database to cache - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) - { - get_num = 1; + peer->output = myworld.to_json(); + return ""; } - else if (get_num > 500) + + //@urlpath(null,cached-db) + std::string techempowercached_db(std::shared_ptr peer) { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "my" + std::to_string(get_num); + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + // this test from database to cache + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "my" + std::to_string(get_num); - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) - { - myworld.record = temp_cache.get(mycacheid); - } - else - { - std::vector cacheid; - for (unsigned int i = 0; i < get_num; i++) + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else { - cacheid.push_back(rand_range(1, 10000)); + std::vector cacheid; + for (unsigned int i = 0; i < get_num; i++) + { + cacheid.push_back(rand_range(1, 10000)); + } + + std::string sqlstr = array_to_sql(cacheid); + myworld.whereIn("id", sqlstr).fetch(); + temp_cache.save(mycacheid, myworld.record, 120); } - std::string sqlstr = array_to_sql(cacheid); - myworld.whereIn("id", sqlstr).fetch(); - temp_cache.save(mycacheid, myworld.record, 120); + peer->output = myworld.to_json(); + return ""; } - peer->output = myworld.to_json(); - return ""; -} - -}// namespace http \ No newline at end of file +} // namespace http \ No newline at end of file From ecc850119b59835dfd8e05267f1c5402d714d909 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 11:34:58 +0800 Subject: [PATCH 0584/1766] Clear libs and controller directory --- frameworks/C++/paozhu/paozhu.dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index f7b19d96614..8086f6eafe6 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -23,7 +23,13 @@ RUN rm -Rf ./paozhu/libs RUN mkdir ./paozhu/libs RUN mkdir ./paozhu/libs/types -COPY ./paozhu_benchmark/controller ./paozhu/ +RUN mkdir ./paozhu/controller +RUN mkdir ./paozhu/controller/include +RUN mkdir ./paozhu/controller/src + +COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ + COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ From 2f9419d12fe54169493efe2be541dff991f6dc03 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 21:57:47 +0800 Subject: [PATCH 0585/1766] Fix copy file --- frameworks/C++/paozhu/paozhu.dockerfile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 8086f6eafe6..fa8379b0797 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -27,20 +27,20 @@ RUN mkdir ./paozhu/controller RUN mkdir ./paozhu/controller/include RUN mkdir ./paozhu/controller/src -COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ -COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ +COPY /controller/include/techempower.h ./paozhu/controller/include/ +COPY /controller/src/techempower.cpp ./paozhu/controller/src/ -COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ -COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ +COPY /libs/types/techempower_json.h ./paozhu/libs/types/ +COPY /libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ +COPY /common/autocontrolmethod.hpp ./paozhu/common/ +COPY /common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY /common/reghttpmethod.hpp ./paozhu/common/ +COPY /common/json_reflect_headers.h ./paozhu/common/ -COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf -COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf -COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt +COPY /conf/server.conf ./paozhu/conf/server.conf +COPY /conf/orm.conf ./paozhu/conf/orm.conf +COPY /CMakeLists.txt ./paozhu/CMakeLists.txt WORKDIR /paozhu RUN unzip asio.zip From 308fd19bb4e2831a8f81ce3c844f529b5a8a736b Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 22:01:47 +0800 Subject: [PATCH 0586/1766] Fix copy file --- frameworks/C++/paozhu/paozhu.dockerfile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index fa8379b0797..3b9bf07e693 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -27,20 +27,20 @@ RUN mkdir ./paozhu/controller RUN mkdir ./paozhu/controller/include RUN mkdir ./paozhu/controller/src -COPY /controller/include/techempower.h ./paozhu/controller/include/ -COPY /controller/src/techempower.cpp ./paozhu/controller/src/ +COPY ./controller/include/techempower.h ./paozhu/controller/include/ +COPY ./controller/src/techempower.cpp ./paozhu/controller/src/ -COPY /libs/types/techempower_json.h ./paozhu/libs/types/ -COPY /libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ +COPY ./libs/types/techempower_json.h ./paozhu/libs/types/ +COPY ./libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -COPY /common/autocontrolmethod.hpp ./paozhu/common/ -COPY /common/reghttpmethod_pre.hpp ./paozhu/common/ -COPY /common/reghttpmethod.hpp ./paozhu/common/ -COPY /common/json_reflect_headers.h ./paozhu/common/ +COPY ./common/autocontrolmethod.hpp ./paozhu/common/ +COPY ./common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY ./common/reghttpmethod.hpp ./paozhu/common/ +COPY ./common/json_reflect_headers.h ./paozhu/common/ -COPY /conf/server.conf ./paozhu/conf/server.conf -COPY /conf/orm.conf ./paozhu/conf/orm.conf -COPY /CMakeLists.txt ./paozhu/CMakeLists.txt +COPY ./conf/server.conf ./paozhu/conf/server.conf +COPY ./conf/orm.conf ./paozhu/conf/orm.conf +COPY ./CMakeLists.txt ./paozhu/CMakeLists.txt WORKDIR /paozhu RUN unzip asio.zip From 39183691431a421fcb79ea2a9344798a2cd40efb Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 22:06:20 +0800 Subject: [PATCH 0587/1766] Fix copy file --- frameworks/C++/paozhu/paozhu.dockerfile | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 3b9bf07e693..c23a13161cc 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -26,21 +26,22 @@ RUN mkdir ./paozhu/libs/types RUN mkdir ./paozhu/controller RUN mkdir ./paozhu/controller/include RUN mkdir ./paozhu/controller/src +RUN ls -l -COPY ./controller/include/techempower.h ./paozhu/controller/include/ -COPY ./controller/src/techempower.cpp ./paozhu/controller/src/ +COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ -COPY ./libs/types/techempower_json.h ./paozhu/libs/types/ -COPY ./libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ +COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -COPY ./common/autocontrolmethod.hpp ./paozhu/common/ -COPY ./common/reghttpmethod_pre.hpp ./paozhu/common/ -COPY ./common/reghttpmethod.hpp ./paozhu/common/ -COPY ./common/json_reflect_headers.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ -COPY ./conf/server.conf ./paozhu/conf/server.conf -COPY ./conf/orm.conf ./paozhu/conf/orm.conf -COPY ./CMakeLists.txt ./paozhu/CMakeLists.txt +COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf +COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf +COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt WORKDIR /paozhu RUN unzip asio.zip From 591a08da4ac1fa259852073d1eee7b58651efb6a Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 15 May 2024 22:19:48 +0800 Subject: [PATCH 0588/1766] Fix copy file --- frameworks/C++/paozhu/paozhu.dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index c23a13161cc..8086f6eafe6 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -26,7 +26,6 @@ RUN mkdir ./paozhu/libs/types RUN mkdir ./paozhu/controller RUN mkdir ./paozhu/controller/include RUN mkdir ./paozhu/controller/src -RUN ls -l COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ From 7b74765a842509ff1ad25511c2bc643487d4d07a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 16 May 2024 20:01:35 +0200 Subject: [PATCH 0589/1766] [ruby/rails] Update trilogy to 2.8.1 and use ssl for connection (#9027) This fixes connection errors: /usr/local/bundle/gems/activerecord-7.1.3.1/lib/active_record/connection_adapters/trilogy_adapter.rb:61:in `rescue in new_client': trilogy_auth_recv: caching_sha2_password requires either TCP with TLS or a unix socket: TRILOGY_UNSUPPORTED (ActiveRecord::ConnectionNotEstablished) --- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 4 ++-- frameworks/Ruby/rails/config/database.yml | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index eb36722fcfa..359f1cb6c6f 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -2,10 +2,10 @@ ruby '~> 3.2' source 'https://rubygems.org' -gem 'trilogy', group: :mysql gem 'oj', '~> 3.16' gem 'pg', '1.5.4', group: :postgresql gem 'puma', '~> 6.4' gem 'rails', '~> 7.1.3' gem 'redis', '~> 5.0' +gem 'trilogy', '~> 2.8.1', group: :mysql gem 'tzinfo-data' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 334455e2ac5..74d7e3646a4 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -180,7 +180,7 @@ GEM stringio (3.1.0) thor (1.3.1) timeout (0.4.1) - trilogy (2.6.0) + trilogy (2.8.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2021.5) @@ -202,7 +202,7 @@ DEPENDENCIES puma (~> 6.4) rails (~> 7.1.3) redis (~> 5.0) - trilogy + trilogy (~> 2.8.1) tzinfo-data RUBY VERSION diff --git a/frameworks/Ruby/rails/config/database.yml b/frameworks/Ruby/rails/config/database.yml index 87c1e85a2ac..e4f159e0f72 100644 --- a/frameworks/Ruby/rails/config/database.yml +++ b/frameworks/Ruby/rails/config/database.yml @@ -16,6 +16,9 @@ test: production_mysql: <<: *default adapter: trilogy + ssl: true + ssl_mode: 4 <%# Trilogy::SSL_PREFERRED_NOVERIFY %> + tls_min_version: 3 <%# Trilogy::TLS_VERSION_12 %> production_postgresql: <<: *default From 05655dd0b76917eec4ef2600c178bcfa29218871 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 16 May 2024 20:01:44 +0200 Subject: [PATCH 0590/1766] Update to Kumbiaphp/1.2.1 (#9026) --- frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile | 7 +++---- frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile index 3bcf358c18b..b30a5ad25fe 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile @@ -9,12 +9,11 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ 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 +COPY --link deploy/conf/* /etc/php/8.3/fpm/ WORKDIR /kumbiaphp +COPY --link . . -RUN git clone -b v1.1.4 --single-branch --depth 1 -q https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia +RUN git clone -b v1.2.1 --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.3/fpm/php-fpm.conf ; fi; diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile index fc54d6192a5..3f8edde3e2f 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile @@ -9,12 +9,11 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ 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 +COPY --link deploy/conf/* /etc/php/8.3/fpm/ WORKDIR /kumbiaphp +COPY --link . . -RUN git clone -b v1.1.4 --single-branch --depth 1 https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia +RUN git clone -b v1.2.1 --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.3/fpm/php-fpm.conf ; fi; From 4cbacd5f003838ff2502021f30b05ac9d23f8e5b Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 16 May 2024 20:02:28 +0200 Subject: [PATCH 0591/1766] [php] Update Laravel with RoadRunner v2023.3 (#9025) * Update Laravel RoadRunner * Use composer/composer bin --- .../PHP/laravel/deploy/roadrunner/.rr.yaml | 9 +++++---- .../PHP/laravel/laravel-roadrunner.dockerfile | 19 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml b/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml index e1eecad8f04..bd19a378b20 100644 --- a/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml +++ b/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml @@ -1,4 +1,7 @@ # see https://roadrunner.dev/docs/intro-config +version: "3" +#https://github.com/roadrunner-server/roadrunner/blob/master/.rr.yaml + server: command: "php ./vendor/bin/rr-worker start --relay-dsn unix:///usr/local/var/run/rr-rpc.sock" relay: "unix:///usr/local/var/run/rr-rpc.sock" @@ -7,7 +10,7 @@ logs: level: error http: address: 0.0.0.0:8080 - middleware: ["headers", "static", "gzip"] + middleware: ["headers"] pool: #max_jobs: 64 # feel free to change this supervisor: @@ -15,8 +18,6 @@ http: headers: response: Server: "RoadRunner" - static: - dir: "public" - forbid: [".php"] + diff --git a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile index 8aa87522504..d5d42d62879 100644 --- a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile +++ b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile @@ -6,30 +6,29 @@ RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opca #RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini #RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -ADD ./ /laravel WORKDIR /laravel +COPY --link . . 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 RUN apt-get update > /dev/null && \ - apt-get install -yqq git unzip > /dev/null -RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php && php -r "unlink('composer-setup.php');" -RUN mv composer.phar /usr/local/bin/composer + apt-get install -yqq curl unzip > /dev/null -COPY deploy/roadrunner/composer.json ./ -COPY deploy/roadrunner/.rr.yaml ./ +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +COPY --link deploy/roadrunner/composer.json . +COPY --link deploy/roadrunner/.rr.yaml . RUN composer install -a --no-dev --quiet RUN php artisan optimize # install roadrunner -COPY --from=ghcr.io/roadrunner-server/roadrunner:2.12.1 /usr/bin/rr ./rr +COPY --from=ghcr.io/roadrunner-server/roadrunner:2023.3 --link /usr/bin/rr /usr/local/bin/rr RUN php artisan vendor:publish --provider='Spiral\RoadRunnerLaravel\ServiceProvider' --tag=config +RUN rr -v EXPOSE 8080 # CMD bash -CMD ./rr serve -c ./.rr.yaml - +CMD rr serve -c .rr.yaml From a32ba57945b35a0d1053a229662dc4f8e985d6fc Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 16 May 2024 20:02:38 +0200 Subject: [PATCH 0592/1766] [php] Symfony add RoadRunner (#9024) * Add Symfony with Roadrunner * Clean symfony docker files * Fix rr using v2023.3 * Clean dockerfiles again * Change Caddyfile * Use composer/composer bin image Only use 2.99Mb vs the composer than use 199Mb --- frameworks/PHP/symfony/.rr.yaml | 25 +++++++++++++++ frameworks/PHP/symfony/benchmark_config.json | 24 ++++++++++++++ frameworks/PHP/symfony/deploy/Caddyfile | 4 +-- frameworks/PHP/symfony/deploy/conf/php.ini | 2 +- .../public/{worker.php => runtime.php} | 2 +- .../PHP/symfony/symfony-franken.dockerfile | 31 ++++++++----------- .../PHP/symfony/symfony-mysql.dockerfile | 14 +++------ frameworks/PHP/symfony/symfony-raw.dockerfile | 12 +++---- .../PHP/symfony/symfony-roadrunner.dockerfile | 25 +++++++++++++++ .../PHP/symfony/symfony-swoole.dockerfile | 22 +++++-------- .../PHP/symfony/symfony-workerman.dockerfile | 23 ++++++-------- frameworks/PHP/symfony/symfony.dockerfile | 11 +++---- 12 files changed, 120 insertions(+), 75 deletions(-) create mode 100644 frameworks/PHP/symfony/.rr.yaml rename frameworks/PHP/symfony/public/{worker.php => runtime.php} (79%) create mode 100644 frameworks/PHP/symfony/symfony-roadrunner.dockerfile diff --git a/frameworks/PHP/symfony/.rr.yaml b/frameworks/PHP/symfony/.rr.yaml new file mode 100644 index 00000000000..88aeb945668 --- /dev/null +++ b/frameworks/PHP/symfony/.rr.yaml @@ -0,0 +1,25 @@ +version: "3" +#https://github.com/roadrunner-server/roadrunner/blob/master/.rr.yaml + +server: + command: "php /symfony/public/runtime.php" + env: + - APP_RUNTIME: Runtime\RoadRunnerSymfonyNyholm\Runtime + +http: + address: "0.0.0.0:8080" + + middleware: ["headers"] + headers: + response: + Server: "RoadRunner" + #pool: + #num_workers: 0 + #max_jobs: 500 + +logs: + mode: production + level: error +#rpc: +# listen: tcp://127.0.0.1:6001 + diff --git a/frameworks/PHP/symfony/benchmark_config.json b/frameworks/PHP/symfony/benchmark_config.json index 2c202dbfdf1..d5f97f06800 100644 --- a/frameworks/PHP/symfony/benchmark_config.json +++ b/frameworks/PHP/symfony/benchmark_config.json @@ -116,6 +116,30 @@ "versus": "php", "tags": [] }, + "roadrunner": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "update_url": "/updates?queries=", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "symfony", + "language": "PHP", + "flavor": "PHP8", + "orm": "Full", + "platform": "roadrunner", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "symfony-roadrunner", + "notes": "", + "versus": "php", + "tags": [] + }, "franken": { "plaintext_url": "/plaintext", "json_url": "/json", diff --git a/frameworks/PHP/symfony/deploy/Caddyfile b/frameworks/PHP/symfony/deploy/Caddyfile index 56f20d882a2..f794fd3d647 100644 --- a/frameworks/PHP/symfony/deploy/Caddyfile +++ b/frameworks/PHP/symfony/deploy/Caddyfile @@ -3,7 +3,7 @@ {$CADDY_DEBUG} frankenphp { - #worker /path/to/your/worker.php + #worker /path/to/your/runtime.php {$FRANKENPHP_CONFIG} } } @@ -15,7 +15,7 @@ route { # If the requested file does not exist, try index files @indexFiles file { - try_files {path} {path}/worker.php worker.php + try_files {path} {path}/runtime.php runtime.php split_path .php } rewrite @indexFiles {http.matchers.file.relative} diff --git a/frameworks/PHP/symfony/deploy/conf/php.ini b/frameworks/PHP/symfony/deploy/conf/php.ini index 0e87f1d8855..e0f3a8a6e41 100644 --- a/frameworks/PHP/symfony/deploy/conf/php.ini +++ b/frameworks/PHP/symfony/deploy/conf/php.ini @@ -1767,7 +1767,7 @@ ldap.max_links = -1 opcache.enable=1 ; Determines if Zend OPCache is enabled for the CLI version of PHP -;opcache.enable_cli=0 +opcache.enable_cli=1 ; The OPcache shared memory storage size. opcache.memory_consumption=256 diff --git a/frameworks/PHP/symfony/public/worker.php b/frameworks/PHP/symfony/public/runtime.php similarity index 79% rename from frameworks/PHP/symfony/public/worker.php rename to frameworks/PHP/symfony/public/runtime.php index 9982c218d69..c99b79378ef 100644 --- a/frameworks/PHP/symfony/public/worker.php +++ b/frameworks/PHP/symfony/public/runtime.php @@ -4,6 +4,6 @@ require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -return function (array $context) { +return function (array $context): Kernel { return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); }; diff --git a/frameworks/PHP/symfony/symfony-franken.dockerfile b/frameworks/PHP/symfony/symfony-franken.dockerfile index 3bf0b7e3fd9..967b9370514 100644 --- a/frameworks/PHP/symfony/symfony-franken.dockerfile +++ b/frameworks/PHP/symfony/symfony-franken.dockerfile @@ -2,30 +2,25 @@ FROM dunglas/frankenphp # add additional extensions here: RUN install-php-extensions \ - pdo_pgsql \ intl \ - opcache - -RUN apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null && \ - apt-get install unzip > /dev/null - -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + opcache \ + pdo_pgsql \ + zip > /dev/null -EXPOSE 8080 +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY deploy/Caddyfile /etc/caddy/Caddyfile +COPY --link deploy/Caddyfile /etc/caddy/Caddyfile +COPY --link deploy/conf/php.ini /usr/local/etc/php/ -ADD . /symfony WORKDIR /symfony +COPY --link . . -RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log - -ENV COMPOSER_ALLOW_SUPERUSER=1 -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts +ENV FRANKENPHP_CONFIG="worker /symfony/public/runtime.php" +ENV APP_RUNTIME="Runtime\FrankenPhpSymfony\Runtime" +#ENV CADDY_DEBUG=debug +RUN composer require runtime/frankenphp-symfony --update-no-dev --no-scripts --quiet RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear -RUN composer require runtime/frankenphp-symfony -ENV FRANKENPHP_CONFIG="worker ./public/worker.php" -ENV APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime +EXPOSE 8080 -#ENV CADDY_DEBUG=debug +RUN frankenphp -v diff --git a/frameworks/PHP/symfony/symfony-mysql.dockerfile b/frameworks/PHP/symfony/symfony-mysql.dockerfile index c6361bcacd8..a394aea7152 100644 --- a/frameworks/PHP/symfony/symfony-mysql.dockerfile +++ b/frameworks/PHP/symfony/symfony-mysql.dockerfile @@ -1,4 +1,3 @@ -FROM composer/composer:2-bin AS composer FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive @@ -11,24 +10,19 @@ RUN apt-get install -yqq nginx git unzip curl \ 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 --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ - -ADD . /symfony +COPY --link deploy/conf/* /etc/php/8.3/fpm/ WORKDIR /symfony +COPY --link . . 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 - -ENV COMPOSER_ALLOW_SUPERUSER=1 -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet 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.3/fpm/php.ini - EXPOSE 8080 # Uncomment next line for Laravel console error logging to be viewable in docker logs diff --git a/frameworks/PHP/symfony/symfony-raw.dockerfile b/frameworks/PHP/symfony/symfony-raw.dockerfile index 2957d6246c2..7af272bbef1 100644 --- a/frameworks/PHP/symfony/symfony-raw.dockerfile +++ b/frameworks/PHP/symfony/symfony-raw.dockerfile @@ -10,19 +10,15 @@ RUN apt-get install -yqq nginx git unzip curl \ 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 --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ - -ADD . /symfony +COPY --link deploy/conf/* /etc/php/8.3/fpm/ WORKDIR /symfony +COPY --link . . 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 - -ENV COMPOSER_ALLOW_SUPERUSER=1 -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet 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.3/fpm/php.ini diff --git a/frameworks/PHP/symfony/symfony-roadrunner.dockerfile b/frameworks/PHP/symfony/symfony-roadrunner.dockerfile new file mode 100644 index 00000000000..1fc48dadcdc --- /dev/null +++ b/frameworks/PHP/symfony/symfony-roadrunner.dockerfile @@ -0,0 +1,25 @@ +FROM php:8.3-cli + +COPY --from=ghcr.io/roadrunner-server/roadrunner:2023.3 --link /usr/bin/rr /usr/local/bin/rr +COPY --from=mlocati/php-extension-installer --link /usr/bin/install-php-extensions /usr/local/bin/ +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +RUN install-php-extensions \ + intl \ + opcache \ + pdo_pgsql \ + sockets \ + zip > /dev/null + +COPY --link deploy/conf/php.ini /usr/local/etc/php/ +WORKDIR /symfony +COPY --link . . + +ENV APP_RUNTIME="Runtime\RoadRunnerSymfonyNyholm\Runtime" +RUN composer require runtime/roadrunner-symfony-nyholm --update-no-dev --no-scripts --quiet +RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear + +EXPOSE 8080 + +RUN rr -v +ENTRYPOINT ["rr", "serve"] diff --git a/frameworks/PHP/symfony/symfony-swoole.dockerfile b/frameworks/PHP/symfony/symfony-swoole.dockerfile index b23c0e67b02..37403a24c97 100644 --- a/frameworks/PHP/symfony/symfony-swoole.dockerfile +++ b/frameworks/PHP/symfony/symfony-swoole.dockerfile @@ -10,25 +10,17 @@ RUN apt-get update -yqq && \ apt-get install -yqq libpq-dev libicu-dev git unzip > /dev/null && \ docker-php-ext-install pdo_pgsql opcache intl > /dev/null -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY deploy/swoole/php.ini /usr/local/etc/php/ - -ADD . /symfony +COPY --link deploy/swoole/php.ini /usr/local/etc/php/ WORKDIR /symfony -RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log -#RUN mkdir -m 777 -p /symfony/var/cache/swoole /symfony/var/log -RUN COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --no-scripts --quiet -RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear - -ENV APP_RUNTIME=Runtime\\Swoole\\Runtime -RUN composer require runtime/swoole - -RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload --no-dev --classmap-authoritative -RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-env prod +COPY --link . . #ENV APP_DEBUG=1 +ENV APP_RUNTIME="Runtime\Swoole\Runtime" +RUN composer require runtime/swoole --update-no-dev --no-scripts --quiet +RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear EXPOSE 8080 -CMD php /symfony/public/swoole.php +ENTRYPOINT [ "php", "/symfony/public/swoole.php" ] diff --git a/frameworks/PHP/symfony/symfony-workerman.dockerfile b/frameworks/PHP/symfony/symfony-workerman.dockerfile index 136f9fcdb2d..fec8e3bdd5e 100644 --- a/frameworks/PHP/symfony/symfony-workerman.dockerfile +++ b/frameworks/PHP/symfony/symfony-workerman.dockerfile @@ -6,25 +6,22 @@ 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 git unzip \ +RUN apt-get install -yqq unzip \ 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 +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null && \ + pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -EXPOSE 8080 - -ADD . /symfony WORKDIR /symfony +COPY --link . . -RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log - -ENV COMPOSER_ALLOW_SUPERUSER=1 -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear -COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini + +EXPOSE 8080 -CMD php server.php start +ENTRYPOINT [ "php", "server.php", "start" ] diff --git a/frameworks/PHP/symfony/symfony.dockerfile b/frameworks/PHP/symfony/symfony.dockerfile index 392f19e91b6..8c3606087e6 100644 --- a/frameworks/PHP/symfony/symfony.dockerfile +++ b/frameworks/PHP/symfony/symfony.dockerfile @@ -10,19 +10,16 @@ RUN apt-get install -yqq nginx git unzip curl \ 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 --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.3/fpm/ -ADD . /symfony WORKDIR /symfony +COPY --link . . 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 - -ENV COMPOSER_ALLOW_SUPERUSER=1 -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet 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.3/fpm/php.ini From da80af131e88e983c741b35d307821a452f295cd Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 16 May 2024 20:02:45 +0200 Subject: [PATCH 0593/1766] [ruby/rack] Upgrade dependencies (#9023) --- frameworks/Ruby/rack-sequel/Gemfile | 10 +-- frameworks/Ruby/rack/Gemfile | 8 +- frameworks/Ruby/rack/Gemfile.lock | 129 ++++++++++++++++------------ 3 files changed, 81 insertions(+), 66 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 83d341118d0..fb4b4ad65d8 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -1,19 +1,19 @@ source 'https://rubygems.org' gem 'json', '~> 2.0' -gem 'passenger', '~> 5.1', :platforms=>[:ruby, :mswin], :require=>false +gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' -gem 'rack', '2.0.8' -gem 'unicorn', '~> 5.2', :platforms=>[:ruby, :mswin], :require=>false +gem 'rack', '~> 3.0' +gem 'unicorn', '~> 6.1', :platforms=>[:ruby, :mswin], :require=>false group :mysql do gem 'jdbc-mysql', '~> 5.1', :platforms=>:jruby, :require=>'jdbc/mysql' - gem 'mysql2', '~> 0.4', :platforms=>[:ruby, :mswin] + gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] end group :postgresql do gem 'jdbc-postgres', '~> 9.4', :platforms=>:jruby, :require=>'jdbc/postgres' - gem 'pg', '~> 0.19', :platforms=>[:ruby, :mswin] + gem 'pg', '~> 1.5', :platforms=>[:ruby, :mswin] gem 'sequel_pg', '~> 1.6', :platforms=>:ruby, :require=>false end diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index 137e71e099c..af0fc5b1d04 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -2,13 +2,13 @@ source 'https://rubygems.org' -gem 'rack', '~>3.0' -gem 'connection_pool', '~>2.4' -gem 'falcon', '~>0.42', platforms: %i[ruby mswin] +gem 'rack', '~> 3.0' +gem 'connection_pool', '~> 2.4' +gem 'falcon', '~> 0.47', platforms: %i[ruby mswin] 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 'pg', '~> 1.5', platforms: %i[ruby mswin] gem 'puma', '~> 6.4' gem 'sequel' gem 'sequel_pg', platforms: %i[ruby mswin] diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index d8bc4105c68..fb62d99f2bc 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -2,118 +2,133 @@ GEM remote: https://rubygems.org/ specs: ast (2.4.2) - async (2.5.0) - console (~> 1.10) - io-event (~> 1.1) + async (2.11.0) + console (~> 1.25, >= 1.25.2) + fiber-annotation + io-event (~> 1.5, >= 1.5.1) timers (~> 4.1) - async-container (0.16.12) - async - async-io - async-http (0.60.1) - async (>= 1.25) - async-io (>= 1.28) - async-pool (>= 0.2) - protocol-http (~> 0.24.0) - protocol-http1 (~> 0.15.0) - protocol-http2 (~> 0.15.0) - traces (>= 0.8.0) + async-container (0.18.2) + async (~> 2.10) + async-http (0.66.3) + async (>= 2.10.2) + async-pool (>= 0.6.1) + io-endpoint (~> 0.10, >= 0.10.3) + io-stream (~> 0.4) + protocol-http (~> 0.26.0) + protocol-http1 (~> 0.19.0) + protocol-http2 (~> 0.17.0) + traces (>= 0.10.0) async-http-cache (0.4.3) async-http (~> 0.56) - async-io (1.34.3) - async - async-pool (0.4.0) + async-pool (0.6.1) async (>= 1.25) - build-environment (1.13.0) - concurrent-ruby (1.2.2) - connection_pool (2.4.0) - console (1.16.2) - fiber-local - falcon (0.42.3) + async-service (0.12.0) async - async-container (~> 0.16.0) - async-http (~> 0.57) + async-container (~> 0.16) + bigdecimal (3.1.8) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + console (1.25.2) + fiber-annotation + fiber-local (~> 1.1) + json + falcon (0.47.6) + async + async-container (~> 0.18) + async-http (~> 0.66, >= 0.66.3) async-http-cache (~> 0.4.0) - async-io (~> 1.22) - build-environment (~> 1.13) + async-service (~> 0.10) bundler localhost (~> 1.1) openssl (~> 3.0) process-metrics (~> 0.2.0) - protocol-rack (~> 0.1) - samovar (~> 2.1) - fiber-local (1.0.0) - io-event (1.1.7) - json (2.6.3) + protocol-rack (~> 0.5) + samovar (~> 2.3) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (0.1.0) + io-endpoint (0.10.3) + io-event (1.5.1) + io-stream (0.4.0) + json (2.7.2) kgio (2.11.4) - localhost (1.1.10) + language_server-protocol (3.17.0.3) + localhost (1.3.1) mapping (1.1.1) - nio4r (2.7.0) - oj (3.14.2) - openssl (3.1.0) - parallel (1.23.0) - parser (3.2.2.1) + nio4r (2.7.3) + oj (3.16.3) + bigdecimal (>= 3.0) + openssl (3.2.0) + parallel (1.24.0) + parser (3.3.1.0) ast (~> 2.4.1) - pg (1.5.3) + racc + pg (1.5.6) process-metrics (0.2.1) console (~> 1.8) samovar (~> 2.1) - protocol-hpack (1.4.2) - protocol-http (0.24.7) - protocol-http1 (0.15.1) + protocol-hpack (1.4.3) + protocol-http (0.26.5) + protocol-http1 (0.19.1) protocol-http (~> 0.22) - protocol-http2 (0.15.1) + protocol-http2 (0.17.0) protocol-hpack (~> 1.4) protocol-http (~> 0.18) - protocol-rack (0.2.4) + protocol-rack (0.5.1) protocol-http (~> 0.23) rack (>= 1.0) puma (6.4.2) nio4r (~> 2.0) - rack (3.0.9.1) + racc (1.7.3) + rack (3.0.11) rack-test (2.1.0) rack (>= 1.3) rainbow (3.1.1) raindrops (0.20.1) - regexp_parser (2.8.0) - rexml (3.2.5) - rubocop (1.51.0) + regexp_parser (2.9.1) + rexml (3.2.6) + rubocop (1.63.5) json (~> 2.3) + language_server-protocol (>= 3.17.0) parallel (~> 1.10) - parser (>= 3.2.0.0) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.28.0, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.28.1) - parser (>= 3.2.1.0) + rubocop-ast (1.31.3) + parser (>= 3.3.1.0) ruby-progressbar (1.13.0) - samovar (2.1.4) + samovar (2.3.0) console (~> 1.0) mapping (~> 1.0) - sequel (5.68.0) + sequel (5.80.0) + bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) timers (4.3.5) - traces (0.9.1) + traces (0.11.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2023.3) tzinfo (>= 1.0.0) - unicode-display_width (2.4.2) + unicode-display_width (2.5.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) PLATFORMS x86_64-darwin-20 + x86_64-darwin-22 x86_64-linux DEPENDENCIES connection_pool (~> 2.4) - falcon (~> 0.42) + falcon (~> 0.47) jdbc-postgres (~> 42.2) json (~> 2.6) oj (~> 3.14) From ada420f08684095442b821074c4e980aacdf3fbd Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Fri, 17 May 2024 02:03:25 +0800 Subject: [PATCH 0594/1766] [C++/Paozhu]Clear libs directory (#9022) * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * [C++] add new paozhu * update benchmark to v1.5.8 * update benchmark to v1.5.8 * Add benchmark files * Add benchmark files * use local file * use git clone * add conf * add conf * add conf * add conf * add conf * use local files * use local files * use local files * use local files * Remove files * Fix files * Clear libs directory * Clear libs directory * Clear libs directory * Clear libs directory * Clear libs and controller directory * Fix copy file * Fix copy file * Fix copy file * Fix copy file --- frameworks/C++/paozhu/paozhu.dockerfile | 17 +- .../controller/src/techempower.cpp | 378 +++++++++--------- .../libs/types/techempower_json.h | 0 .../types/techempower_json_jsonreflect.cpp | 1 + 4 files changed, 205 insertions(+), 191 deletions(-) mode change 100644 => 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h mode change 100644 => 100755 frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 2b3329b664c..8086f6eafe6 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -19,11 +19,24 @@ WORKDIR / RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller - -COPY ./paozhu_benchmark/controller ./paozhu/ +RUN rm -Rf ./paozhu/libs +RUN mkdir ./paozhu/libs +RUN mkdir ./paozhu/libs/types + +RUN mkdir ./paozhu/controller +RUN mkdir ./paozhu/controller/include +RUN mkdir ./paozhu/controller/src + +COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ + +COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ + COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index 43906f42156..f8dfe230acd 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -6,236 +6,236 @@ #include #include "httppeer.h" #include "techempower.h" -#include "techempower_json.h" #include "datetime.h" #include "func.h" #include "pzcache.h" #include "json_reflect_headers.h" +#include "techempower_json.h" namespace http { -//@urlpath(null,plaintext) -std::string techempowerplaintext(std::shared_ptr peer) -{ - peer->type("text/plain; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - peer->output = "Hello, World!"; - return ""; -} - -//@urlpath(null,json) -std::string techempowerjson(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - struct techempower_outjson_t a; - a.message = "Hello, World!"; - peer->output = json_encode(a); - return ""; -} - -//@urlpath(null,db) -std::string techempowerdb(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - auto myworld = orm::World(); - unsigned int rd_num = rand_range(1, 10000); - myworld.get_one(rd_num); - - peer->output = myworld.data_tojson(); - return ""; -} - -//@urlpath(null,queries) -std::string techempowerqueries(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - - unsigned int get_num = peer->get["queries"].to_int(); - if (get_num == 0) + //@urlpath(null,plaintext) + std::string techempowerplaintext(std::shared_ptr peer) { - get_num = 1; + peer->type("text/plain; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + peer->output = "Hello, World!"; + return ""; } - else if (get_num > 500) + + //@urlpath(null,json) + std::string techempowerjson(std::shared_ptr peer) { - get_num = 500; + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + struct techempower_outjson_t a; + a.message = "Hello, World!"; + peer->output = json_encode(a); + return ""; } - auto myworld = orm::World(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) + + //@urlpath(null,db) + std::string techempowerdb(std::shared_ptr peer) { - myworld.wheresql.clear(); + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + auto myworld = orm::World(); unsigned int rd_num = rand_range(1, 10000); - myworld.where("id", rd_num).fetch_append(); - } - - peer->output = myworld.to_json(); - return ""; -} + myworld.get_one(rd_num); -//@urlpath(null,fortunes) -std::string techempowerfortunes(std::shared_ptr peer) -{ - peer->type("text/html; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - - auto myfortune = orm::Fortune(); - myfortune.fetch(); - myfortune.data.id = 0; - myfortune.data.message = "Additional fortune added at request time."; - myfortune.record.push_back(myfortune.data); - - std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) - { return lhs.message < rhs.message; }); - peer->val["list"].set_array(); - OBJ_ARRAY item; - for (unsigned int i = 0; i < myfortune.record.size(); i++) - { - item["id"] = myfortune.record[i].id; - item["message"] = html_encode(myfortune.record[i].message); - peer->val["list"].push(item); + peer->output = myworld.data_tojson(); + return ""; } - peer->view("techempower/fortunes"); - return ""; -} + //@urlpath(null,queries) + std::string techempowerqueries(std::shared_ptr peer) + { + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); -//@urlpath(null,updates) -std::string techempowerupdates(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - unsigned int get_num = peer->get["queries"].to_int(); + unsigned int get_num = peer->get["queries"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + unsigned int rd_num = rand_range(1, 10000); + myworld.where("id", rd_num).fetch_append(); + } - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; + peer->output = myworld.to_json(); + return ""; } - auto myworld = orm::World(); - myworld.record.clear(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) + + //@urlpath(null,fortunes) + std::string techempowerfortunes(std::shared_ptr peer) { - myworld.wheresql.clear(); - myworld.where("id", rand_range(1, 10000)).fetch_append(); - if (myworld.effect() > 0) + peer->type("text/html; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + auto myfortune = orm::Fortune(); + myfortune.fetch(); + myfortune.data.id = 0; + myfortune.data.message = "Additional fortune added at request time."; + myfortune.record.push_back(myfortune.data); + + std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) + { return lhs.message < rhs.message; }); + peer->val["list"].set_array(); + OBJ_ARRAY item; + for (unsigned int i = 0; i < myfortune.record.size(); i++) { - unsigned int j = myworld.record.size() - 1; - myworld.data.randomnumber = rand_range(1, 10000); - myworld.record[j].randomnumber = myworld.data.randomnumber; - myworld.update("randomnumber"); + item["id"] = myfortune.record[i].id; + item["message"] = html_encode(myfortune.record[i].message); + peer->val["list"].push(item); } - } - peer->output = myworld.to_json(); - return ""; -} -//@urlpath(null,cached-queries) -std::string techempowercached_queries(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); + peer->view("techempower/fortunes"); + return ""; + } - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) + //@urlpath(null,updates) + std::string techempowerupdates(std::shared_ptr peer) { - get_num = 1; + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + unsigned int get_num = peer->get["queries"].to_int(); + + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.clear(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + myworld.where("id", rand_range(1, 10000)).fetch_append(); + if (myworld.effect() > 0) + { + unsigned int j = myworld.record.size() - 1; + myworld.data.randomnumber = rand_range(1, 10000); + myworld.record[j].randomnumber = myworld.data.randomnumber; + myworld.update("randomnumber"); + } + } + peer->output = myworld.to_json(); + return ""; } - else if (get_num > 500) + + //@urlpath(null,cached-queries) + std::string techempowercached_queries(std::shared_ptr peer) { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "alldatacache"; + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); - pzcache> &temp_cache = pzcache>::conn(); + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "alldatacache"; - std::vector allcachedata_array; - allcachedata_array.reserve(10000); - //create rand data to cache - if (temp_cache.check(mycacheid) > -1) - { - allcachedata_array = temp_cache.get(mycacheid); - } - else - { - allcachedata_array.resize(10000); - for (unsigned int i = 0; i < 10000; i++) + pzcache> &temp_cache = pzcache>::conn(); + + std::vector allcachedata_array; + allcachedata_array.reserve(10000); + // create rand data to cache + if (temp_cache.check(mycacheid) > -1) { - allcachedata_array[i].id = i + 1; - allcachedata_array[i].randomnumber = rand_range(1, 10000); + allcachedata_array = temp_cache.get(mycacheid); } - temp_cache.save(mycacheid, allcachedata_array, 120); - } - //get rand data from cache - mycacheid = "my" + std::to_string(get_num); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) - { - myworld.record = temp_cache.get(mycacheid); - } - else - { - if (allcachedata_array.size() == 10000) + else { - for (unsigned int i = 0; i < get_num; i++) + allcachedata_array.resize(10000); + for (unsigned int i = 0; i < 10000; i++) { - unsigned int temp_rid = rand_range(0, 9999); - myworld.record.push_back(allcachedata_array[temp_rid]); + allcachedata_array[i].id = i + 1; + allcachedata_array[i].randomnumber = rand_range(1, 10000); } + temp_cache.save(mycacheid, allcachedata_array, 120); + } + // get rand data from cache + mycacheid = "my" + std::to_string(get_num); + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + if (allcachedata_array.size() == 10000) + { + for (unsigned int i = 0; i < get_num; i++) + { + unsigned int temp_rid = rand_range(0, 9999); + myworld.record.push_back(allcachedata_array[temp_rid]); + } + } + temp_cache.save(mycacheid, myworld.record, 120); } - temp_cache.save(mycacheid, myworld.record, 120); - } - - peer->output = myworld.to_json(); - return ""; -} -//@urlpath(null,cached-db) -std::string techempowercached_db(std::shared_ptr peer) -{ - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - //this test from database to cache - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) - { - get_num = 1; + peer->output = myworld.to_json(); + return ""; } - else if (get_num > 500) + + //@urlpath(null,cached-db) + std::string techempowercached_db(std::shared_ptr peer) { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "my" + std::to_string(get_num); + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + // this test from database to cache + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "my" + std::to_string(get_num); - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) - { - myworld.record = temp_cache.get(mycacheid); - } - else - { - std::vector cacheid; - for (unsigned int i = 0; i < get_num; i++) + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else { - cacheid.push_back(rand_range(1, 10000)); + std::vector cacheid; + for (unsigned int i = 0; i < get_num; i++) + { + cacheid.push_back(rand_range(1, 10000)); + } + + std::string sqlstr = array_to_sql(cacheid); + myworld.whereIn("id", sqlstr).fetch(); + temp_cache.save(mycacheid, myworld.record, 120); } - std::string sqlstr = array_to_sql(cacheid); - myworld.whereIn("id", sqlstr).fetch(); - temp_cache.save(mycacheid, myworld.record, 120); + peer->output = myworld.to_json(); + return ""; } - peer->output = myworld.to_json(); - return ""; -} - -}// namespace http \ No newline at end of file +} // namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h old mode 100644 new mode 100755 diff --git a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp old mode 100644 new mode 100755 index b5088efcdf9..8ff68cdbae2 --- a/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp @@ -6,6 +6,7 @@ #include "json_reflect_headers.h" #include "unicode.h" #include "func.h" +//This file is automatically created, do not edit it namespace http { From b2f23c521e42d54ab8c555253130a53a8bd3a767 Mon Sep 17 00:00:00 2001 From: Valery Piashchynski Date: Thu, 16 May 2024 20:03:33 +0200 Subject: [PATCH 0595/1766] chore: update spiral dockerfile (#9021) Signed-off-by: Valery Piashchynski --- frameworks/PHP/spiral/spiral.dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frameworks/PHP/spiral/spiral.dockerfile b/frameworks/PHP/spiral/spiral.dockerfile index ca9d98d9612..046fb33d280 100644 --- a/frameworks/PHP/spiral/spiral.dockerfile +++ b/frameworks/PHP/spiral/spiral.dockerfile @@ -17,6 +17,11 @@ RUN chmod +x /usr/local/etc/php/install-composer.sh && /usr/local/etc/php/instal RUN apt-get update -yqq > /dev/null && apt-get install -yqq git unzip > /dev/null RUN php composer.phar install --optimize-autoloader --classmap-authoritative --no-dev +# RoadRunner >= 2024.x.x requires protobuf and grpc extensions to be installed +ARG PROTOBUF_VERSION="4.26.1" +RUN pecl channel-update pecl.php.net +RUN MAKEFLAGS="-j $(nproc)" pecl install protobuf-${PROTOBUF_VERSION} grpc + # pre-configure RUN ./vendor/bin/rr get-binary > /dev/null 2>&1 RUN php app.php configure > /dev/null 2>&1 From 09f2ac70a75805e24f1413b525e8ebe0616006b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 11:03:51 -0700 Subject: [PATCH 0596/1766] Bump nokogiri from 1.16.2 to 1.16.5 in /frameworks/Ruby/rails (#9018) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.16.2 to 1.16.5. - [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.16.2...v1.16.5) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Ruby/rails/Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 74d7e3646a4..f3182051a65 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -103,7 +103,7 @@ GEM net-smtp marcel (1.0.2) mini_mime (1.1.5) - mini_portile2 (2.8.5) + mini_portile2 (2.8.6) minitest (5.22.2) mutex_m (0.2.0) net-imap (0.4.10) @@ -116,12 +116,12 @@ GEM net-smtp (0.4.0.1) net-protocol nio4r (2.7.0) - nokogiri (1.16.2) + nokogiri (1.16.5) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.2-arm64-darwin) + nokogiri (1.16.5-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.2-x86_64-linux) + nokogiri (1.16.5-x86_64-linux) racc (~> 1.4) oj (3.16.1) pg (1.5.4) From 1ed28bf3a2a9c44c014bd7e5ee72896d4fb08b1f Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 16 May 2024 20:03:58 +0200 Subject: [PATCH 0597/1766] [ruby/rails] Use batch update for /update (#9017) * [ruby/rails] Update trilogy to 2.8.1 and use ssl for connection This fixes connection errors: /usr/local/bundle/gems/activerecord-7.1.3.1/lib/active_record/connection_adapters/trilogy_adapter.rb:61:in `rescue in new_client': trilogy_auth_recv: caching_sha2_password requires either TCP with TLS or a unix socket: TRILOGY_UNSUPPORTED (ActiveRecord::ConnectionNotEstablished) * [ruby/rails] Use batch update for /update Use a single query for updating the world records. --- .../Ruby/rails/app/controllers/hello_world_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index 17116196eb3..05f14f4b3ec 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -37,9 +37,9 @@ def update world = World.find(id) new_value = random_id new_value = random_id until new_value != world.randomNumber - world.update_columns(randomNumber: new_value) - world + { id: id, randomNumber: new_value } end + World.upsert_all(worlds.sort_by!{_1[:id]}) render json: worlds end From 2bbfa559d5c9f4a008677ef659158f6f68990c4d Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 16 May 2024 20:14:57 +0200 Subject: [PATCH 0598/1766] [ruby] Reduce `random_id` calls in queries and update (#9016) * [ruby/rails] Update trilogy to 2.8.1 and use ssl for connection This fixes connection errors: /usr/local/bundle/gems/activerecord-7.1.3.1/lib/active_record/connection_adapters/trilogy_adapter.rb:61:in `rescue in new_client': trilogy_auth_recv: caching_sha2_password requires either TCP with TLS or a unix socket: TRILOGY_UNSUPPORTED (ActiveRecord::ConnectionNotEstablished) * [ruby] Reduce `random_id` calls in queries and update Calling `Array#sample` with a size x is faster than calling `rand` x times. --- frameworks/Ruby/grape/config.ru | 10 ++++++---- frameworks/Ruby/rack-sequel/boot.rb | 2 ++ frameworks/Ruby/rack-sequel/hello_world.rb | 10 +++++----- .../app/controllers/hello_world_controller.rb | 2 +- frameworks/Ruby/sinatra-sequel/boot.rb | 2 ++ frameworks/Ruby/sinatra-sequel/hello_world.rb | 8 ++++---- frameworks/Ruby/sinatra/boot.rb | 2 ++ frameworks/Ruby/sinatra/hello_world.rb | 14 +++++++------- 8 files changed, 29 insertions(+), 21 deletions(-) diff --git a/frameworks/Ruby/grape/config.ru b/frameworks/Ruby/grape/config.ru index 4f194cec0e5..22142a30c72 100644 --- a/frameworks/Ruby/grape/config.ru +++ b/frameworks/Ruby/grape/config.ru @@ -4,6 +4,8 @@ require 'yaml' require_relative 'config/auto_tune' MAX_PK = 10_000 +ID_RANGE = (1..MAX_PK).freeze +ALL_IDS = ID_RANGE.to_a QUERIES_MIN = 1 QUERIES_MAX = 500 @@ -53,8 +55,8 @@ module Acme get '/query' do ActiveRecord::Base.connection_pool.with_connection do - Array.new(bounded_queries) do - World.find(rand1) + ALL_IDS.sample(bounded_queries).map do |id| + World.find(id) end end end @@ -62,8 +64,8 @@ module Acme get '/updates' do worlds = ActiveRecord::Base.connection_pool.with_connection do - Array.new(bounded_queries) do - world = World.find(rand1) + ALL_IDS.sample(bounded_queries).map do |id| + world = World.find(id) new_value = rand1 new_value = rand1 while new_value == world.randomNumber world.update_columns(randomNumber: new_value) diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index 1670420c0b6..e4de89199e9 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -3,6 +3,8 @@ require 'time' MAX_PK = 10_000 +ID_RANGE = (1..10_000).freeze +ALL_IDS = ID_RANGE.to_a QUERIES_MIN = 1 QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index a031125d9ef..77525d99e45 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -29,8 +29,8 @@ def db def queries(env) DB.synchronize do - Array.new(bounded_queries(env)) do - WORLD_BY_ID.(:id=>rand1) + ALL_IDS.sample(bounded_queries(env)).map do |id| + WORLD_BY_ID.(id: id) end end end @@ -78,9 +78,9 @@ def fortunes def updates(env) DB.synchronize do - Array.new(bounded_queries(env)) do - world = WORLD_BY_ID.(:id=>rand1) - WORLD_UPDATE.(:id=>world[:id], :randomnumber=>(world[:randomnumber] = rand1)) + ALL_IDS.sample(bounded_queries(env)).map do |id| + world = WORLD_BY_ID.(id: id) + WORLD_UPDATE.(id: world[:id], randomnumber: (world[:randomnumber] = rand1)) world end end diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index 05f14f4b3ec..bdd96953ce8 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -7,7 +7,7 @@ class HelloWorldController < ApplicationController MAX_QUERIES = 500 # max number of records that can be retrieved def db - render json: World.find(random_id) + render json: World.find(random_id).attributes end def query diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index e012694c06a..7e621c7a964 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -3,6 +3,8 @@ require 'time' MAX_PK = 10_000 +ID_RANGE = (1..MAX_PK).freeze +ALL_IDS = ID_RANGE.to_a QUERIES_MIN = 1 QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index 7748fef1cf6..ccad94b8303 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -56,8 +56,8 @@ def rand1 get '/queries' do worlds = DB.synchronize do - Array.new(bounded_queries) do - World.with_pk(rand1) + ALL_IDS.sample(bounded_queries).map do |id| + World.with_pk(id) end end @@ -80,8 +80,8 @@ def rand1 get '/updates' do worlds = DB.synchronize do - Array.new(bounded_queries) do - world = World.with_pk(rand1) + ALL_IDS.sample(bounded_queries).map do |id| + world = World.with_pk(id) new_value = rand1 new_value = rand1 while new_value == world.randomnumber world.update(randomnumber: new_value) diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index bcaf9e0a3d2..b8bb082f629 100755 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -3,6 +3,8 @@ require 'time' MAX_PK = 10_000 +ID_RANGE = (1..MAX_PK).freeze +ALL_IDS = ID_RANGE.to_a QUERIES_MIN = 1 QUERIES_MAX = 500 diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index a28e3ff13b3..90238498ed2 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -62,12 +62,12 @@ def rand1 get '/queries' do worlds = ActiveRecord::Base.connection_pool.with_connection do - Array.new(bounded_queries) do - World.find(rand1) + ALL_IDS.sample(bounded_queries).map do |id| + World.find(id).attributes end end - json worlds.map!(&:attributes) + json worlds end # Test type 4: Fortunes @@ -88,16 +88,16 @@ def rand1 get '/updates' do worlds = ActiveRecord::Base.connection_pool.with_connection do - Array.new(bounded_queries) do - world = World.find(rand1) + ALL_IDS.sample(bounded_queries).map do |id| + world = World.find(id) new_value = rand1 new_value = rand1 while new_value == world.randomnumber world.update_columns(randomnumber: new_value) - world + world.attributes end end - json worlds.map!(&:attributes) + json worlds end # Test type 6: Plaintext From 7d81f9c2474f75bde043fd3b2dd63d62164103d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=81=D1=82=D1=8F=20=D0=A2=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8F=D0=BA?= Date: Thu, 16 May 2024 21:15:16 +0300 Subject: [PATCH 0599/1766] fix(nestjs): added platform to benchmark_config.json. (#9013) --- frameworks/TypeScript/nest/benchmark_config.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frameworks/TypeScript/nest/benchmark_config.json b/frameworks/TypeScript/nest/benchmark_config.json index bf98c12c49e..bb13940c076 100644 --- a/frameworks/TypeScript/nest/benchmark_config.json +++ b/frameworks/TypeScript/nest/benchmark_config.json @@ -20,6 +20,7 @@ "database": "Postgres", "database_os": "Linux", "display_name": "nestjs", + "platform": "nodejs", "versus": "nodejs" }, "mysql": { @@ -38,6 +39,7 @@ "database": "MySQL", "database_os": "Linux", "display_name": "nestjs mysql", + "platform": "nodejs", "versus": "nodejs" }, "mongo": { @@ -56,6 +58,7 @@ "database": "MongoDB", "database_os": "Linux", "display_name": "nestjs", + "platform": "nodejs", "versus": "nodejs" }, "fastify": { @@ -76,6 +79,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "nestjs fastify", + "platform": "nodejs", "versus": "nodejs" }, "fastify-mysql": { @@ -94,6 +98,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "nestjs fastify mysql", + "platform": "nodejs", "versus": "nodejs" }, "fastify-mongo": { @@ -112,6 +117,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "nestjs fastify mongo", + "platform": "nodejs", "versus": "nodejs" } } From 03d64315cf27a21c38dfed33ad93f137caa0eaca Mon Sep 17 00:00:00 2001 From: Xudong Huang Date: Fri, 17 May 2024 02:15:42 +0800 Subject: [PATCH 0600/1766] [Rust/may_minihttp] update may_postgres and rust toolchain (#9012) --- frameworks/Rust/may-minihttp/Cargo.toml | 2 +- frameworks/Rust/may-minihttp/may-minihttp.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/may-minihttp/Cargo.toml b/frameworks/Rust/may-minihttp/Cargo.toml index 0409bd62752..019aaf898a2 100644 --- a/frameworks/Rust/may-minihttp/Cargo.toml +++ b/frameworks/Rust/may-minihttp/Cargo.toml @@ -19,7 +19,7 @@ buf-min = { version = "0.7", features = ["bytes"] } may = { version = "0.3", default-features = false } may_minihttp = { version = "0.1", default-features = false } -may_postgres = { git = "https://github.com/Xudong-Huang/may_postgres.git", rev = "4c18791", default-features = false } +may_postgres = { git = "https://github.com/Xudong-Huang/may_postgres.git", rev = "5ea3fb9", default-features = false } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/may-minihttp/may-minihttp.dockerfile b/frameworks/Rust/may-minihttp/may-minihttp.dockerfile index 8f9ec9a1b58..0ddda28e3eb 100644 --- a/frameworks/Rust/may-minihttp/may-minihttp.dockerfile +++ b/frameworks/Rust/may-minihttp/may-minihttp.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78 RUN apt-get update -yqq && apt-get install -yqq cmake g++ From be267fd96a3d03a033d0813b8b06b917f2f3e363 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 22:02:50 +0000 Subject: [PATCH 0601/1766] Bump rexml from 3.2.6 to 3.2.8 in /frameworks/Ruby/rack Bumps [rexml](https://github.com/ruby/rexml) from 3.2.6 to 3.2.8. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.6...v3.2.8) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rack/Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index fb62d99f2bc..75e57b3ea0e 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -87,7 +87,8 @@ GEM rainbow (3.1.1) raindrops (0.20.1) regexp_parser (2.9.1) - rexml (3.2.6) + rexml (3.2.8) + strscan (>= 3.0.9) rubocop (1.63.5) json (~> 2.3) language_server-protocol (>= 3.17.0) @@ -110,6 +111,7 @@ GEM sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) + strscan (3.1.0) timers (4.3.5) traces (0.11.1) tzinfo (2.0.6) From 1f328449fdf9ea4b62c0d6c53f28ea65de8de226 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 05:39:02 +0000 Subject: [PATCH 0602/1766] --- updated-dependencies: - dependency-name: requests 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 a998bb5e791..7d6da6fcc3f 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -11,7 +11,7 @@ MarkupSafe==0.23 piprot==0.9.1 psycopg2==2.7.5 PyYAML==5.4 -requests==2.31.0 +requests==2.32.0 requests-futures==0.9.5 setproctitle==1.1.8 ujson==1.33 From 2c95508f778310b4329af0182a71dd8420543921 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 19:26:40 +0000 Subject: [PATCH 0603/1766] --- updated-dependencies: - dependency-name: pymysql 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 7d6da6fcc3f..81b923f4005 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -16,4 +16,4 @@ requests-futures==0.9.5 setproctitle==1.1.8 ujson==1.33 aiomysql==0.0.7 -PyMySQL==0.6.7 +PyMySQL==1.1.1 From b283599b18e74937f7bb3ef6d618f6353db34646 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 23 May 2024 16:41:34 +0200 Subject: [PATCH 0604/1766] [php] Fix #9021 fail to build grpc (#9032) * Fix #9021 fail to build grpc * Add OPCache, JIT, clean dockerfile * Move Pecl build up for faster local builds when only change the code --- frameworks/PHP/spiral/php/install-composer.sh | 17 ----------- frameworks/PHP/spiral/php/php.ini | 5 ++++ frameworks/PHP/spiral/spiral.dockerfile | 30 +++++++++---------- 3 files changed, 19 insertions(+), 33 deletions(-) delete mode 100644 frameworks/PHP/spiral/php/install-composer.sh diff --git a/frameworks/PHP/spiral/php/install-composer.sh b/frameworks/PHP/spiral/php/install-composer.sh deleted file mode 100644 index f8e743d6a13..00000000000 --- a/frameworks/PHP/spiral/php/install-composer.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -EXPECTED_SIGNATURE="$(curl -s https://composer.github.io/installer.sig)" -php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" -ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")" - -if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] -then - >&2 echo 'ERROR: Invalid installer signature' - rm composer-setup.php - exit 1 -fi - -php composer-setup.php --quiet -RESULT=$? -rm composer-setup.php -exit $RESULT \ No newline at end of file diff --git a/frameworks/PHP/spiral/php/php.ini b/frameworks/PHP/spiral/php/php.ini index 11fcf3af36e..6270be627e7 100644 --- a/frameworks/PHP/spiral/php/php.ini +++ b/frameworks/PHP/spiral/php/php.ini @@ -1909,6 +1909,11 @@ 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/spiral/spiral.dockerfile b/frameworks/PHP/spiral/spiral.dockerfile index 046fb33d280..1f5d3440a48 100644 --- a/frameworks/PHP/spiral/spiral.dockerfile +++ b/frameworks/PHP/spiral/spiral.dockerfile @@ -1,26 +1,24 @@ FROM php:8.3-cli -RUN docker-php-ext-install pdo_mysql > /dev/null +RUN apt-get update -yqq > /dev/null && apt-get install -yqq git unzip > /dev/null +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -# Workaround solution for installing ext-sockets for PHP 8.0 -# See https://github.com/docker-library/php/issues/1245 -RUN CFLAGS="$CFLAGS -D_GNU_SOURCE" docker-php-ext-install sockets > /dev/null +RUN docker-php-ext-install \ + opcache \ + pdo_mysql \ + sockets > /dev/null + +# RoadRunner >= 2024.x.x requires protobuf extensions to be installed +ARG PROTOBUF_VERSION="4.26.1" +RUN pecl channel-update pecl.php.net +RUN MAKEFLAGS="-j $(nproc)" pecl install protobuf-${PROTOBUF_VERSION} > /dev/null -ADD ./ /spiral WORKDIR /spiral +COPY --link . . # composer and opcache settings -COPY php/* /usr/local/etc/php/ -RUN chmod +x /usr/local/etc/php/install-composer.sh && /usr/local/etc/php/install-composer.sh - -# install dependencies -RUN apt-get update -yqq > /dev/null && apt-get install -yqq git unzip > /dev/null -RUN php composer.phar install --optimize-autoloader --classmap-authoritative --no-dev - -# RoadRunner >= 2024.x.x requires protobuf and grpc extensions to be installed -ARG PROTOBUF_VERSION="4.26.1" -RUN pecl channel-update pecl.php.net -RUN MAKEFLAGS="-j $(nproc)" pecl install protobuf-${PROTOBUF_VERSION} grpc +COPY --link php/php.ini /usr/local/etc/php/ +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet # pre-configure RUN ./vendor/bin/rr get-binary > /dev/null 2>&1 From 89a139c6e4a079d95ca55951f7e839f5e0c0de45 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 23 May 2024 16:41:46 +0200 Subject: [PATCH 0605/1766] [ruby] Remove deprecated --path option from bundle command (#9031) This fixes the following warnings: [DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions... --- .../Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile | 2 +- .../rack-sequel/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 +- frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile | 2 +- .../Ruby/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 +- .../Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile | 2 +- .../Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile | 2 +- frameworks/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 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index e3358a97a54..7b82353185d 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true 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 886db283700..78053b6f376 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true 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 9188db23a17..e89d397e9db 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index bdbb0474064..f58460afba4 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile index 303a687561d..0f7325a523f 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index 056e29e13ab..b52fbfc93bb 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile --path=/rack-sequel/rack-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile index ff757c613a3..ce6cd9b6316 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile @@ -5,4 +5,4 @@ ENV RUBY_YJIT_ENABLE=1 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile index 6aa9e5c3cb8..fe497718534 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true 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 f2c31645934..74defc8326e 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true 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 4a5a7d7bb68..9ac570ebfb9 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index 3094fc88cc6..ab54544763d 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile index fea0aff40c0..9ab1e96bd1d 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index 944d8fff20c..4ea3de0b7ad 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile --path=/sinatra-sequel/sinatra-sequel/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile index bb1492ba284..df0ddd1fa46 100644 --- a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile --path=/sinatra/sinatra/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile index 46ca6c1145f..0ad6b16252b 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile --path=/sinatra/sinatra/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 ENV _PASSENGER_FORCE_HTTP_SESSION=true diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile index aa91ffe74b7..36b1c1a4625 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile --path=/sinatra/sinatra/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 2eb9060f59a..14025dafb3b 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile --path=/sinatra/sinatra/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile index 763b9c82c46..a767ce78bb4 100644 --- a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile --path=/sinatra/sinatra/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 67c4152a66f..3ff4f1f813e 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile --path=/sinatra/sinatra/bundle +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=mysql From 912ab8b306307c3f44a5e35ea17a027ebede7eca Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Thu, 23 May 2024 16:43:34 +0200 Subject: [PATCH 0606/1766] Adding --cpuset-cpus tfb argument to set it on the server container (#9035) --- toolset/run-tests.py | 5 +++++ toolset/utils/benchmark_config.py | 1 + toolset/utils/docker_helper.py | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/toolset/run-tests.py b/toolset/run-tests.py index 413ba37379c..c226edece26 100644 --- a/toolset/run-tests.py +++ b/toolset/run-tests.py @@ -67,6 +67,11 @@ def main(argv=None): ''') # Suite options + # CPU set options + parser.add_argument( + '--cpuset-cpus', + default=None, + help='The cpu set to run framework container on') parser.add_argument( '--audit', action='store_true', diff --git a/toolset/utils/benchmark_config.py b/toolset/utils/benchmark_config.py index 0a580586420..48755e9f460 100755 --- a/toolset/utils/benchmark_config.py +++ b/toolset/utils/benchmark_config.py @@ -52,6 +52,7 @@ def __init__(self, args): self.database_docker_host = None self.client_docker_host = None self.network = None + self.cpuset_cpus = args.cpuset_cpus self.test_container_memory = args.test_container_memory self.extra_docker_runtime_args = args.extra_docker_runtime_args diff --git a/toolset/utils/docker_helper.py b/toolset/utils/docker_helper.py index c58bb71d6a2..1f3ea692ee1 100644 --- a/toolset/utils/docker_helper.py +++ b/toolset/utils/docker_helper.py @@ -189,6 +189,13 @@ def watch_container(docker_container, docker_file): 'soft': 99 }] + cpuset_cpus = '' + + if self.benchmarker.config.cpuset_cpus is not None: + cpuset_cpus = self.benchmarker.config.cpuset_cpus + + log("Running docker container with cpu set: %s" %cpuset_cpus) + docker_cmd = '' if hasattr(test, 'docker_cmd'): docker_cmd = test.docker_cmd @@ -235,6 +242,7 @@ def watch_container(docker_container, docker_file): sysctls=sysctl, remove=True, log_config={'type': None}, + cpuset_cpus=cpuset_cpus, **extra_docker_args ) From 843bc576f0aa6af6c0f3b4498780d484e325b5ae Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Thu, 23 May 2024 17:43:46 +0300 Subject: [PATCH 0607/1766] [mormot] mimalloc is used instead of glibc MM (#9036) * [mormot] mimalloc is used instead of glibc MM * fix mimalloc lib path --------- Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/mormot.dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/Pascal/mormot/mormot.dockerfile b/frameworks/Pascal/mormot/mormot.dockerfile index 831fa50b48f..ab276d4cf51 100644 --- a/frameworks/Pascal/mormot/mormot.dockerfile +++ b/frameworks/Pascal/mormot/mormot.dockerfile @@ -10,6 +10,7 @@ COPY setup_and_build.sh . RUN /bin/bash -c ./setup_and_build.sh FROM ubuntu:22.04 +RUN apt-get update -yqq && apt-get install -yqq libmimalloc2.0 ARG TFB_TEST_NAME @@ -17,6 +18,7 @@ COPY --from=builder /build/bin/fpc-x86_64-linux/raw /usr/local/bin/raw COPY --from=builder /build/libpq.so.5.16 /usr/lib/x86_64-linux-gnu/libpq.so.5 ENV TFB_TEST_NAME=$TFB_TEST_NAME +ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libmimalloc.so.2.0 EXPOSE 8080 CMD ["raw"] From ee9039bd03e06cbf546f0a5e5290ae338a6192ea Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 23 May 2024 16:44:00 +0200 Subject: [PATCH 0608/1766] [php] Fix Nginx Unit (#9037) * Fix Nginx Unit with PHP * Clean FrankenPHP Dockerfile * Clean Unit Dockerfile --- frameworks/PHP/php/deploy/nginx-unit.json | 11 ++++++++++- frameworks/PHP/php/php-franken.dockerfile | 7 ++++--- frameworks/PHP/php/php-unit.dockerfile | 17 ++++++++++++----- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/frameworks/PHP/php/deploy/nginx-unit.json b/frameworks/PHP/php/deploy/nginx-unit.json index b5bc980d07b..51fcc77c5bb 100644 --- a/frameworks/PHP/php/deploy/nginx-unit.json +++ b/frameworks/PHP/php/deploy/nginx-unit.json @@ -8,7 +8,11 @@ "applications": { "benchmark": { "type": "php", - "processes": 84, + "processes": { + "max": 224, + "spare": 168, + "idle_timeout": 20 + }, "user": "www-data", "group": "www-data", "root": "/php/", @@ -19,5 +23,10 @@ "requests": 10000000 } } + }, + "settings": { + "http": { + "server_version": false + } } } \ No newline at end of file diff --git a/frameworks/PHP/php/php-franken.dockerfile b/frameworks/PHP/php/php-franken.dockerfile index 56748c15fab..70d28b7a1ba 100644 --- a/frameworks/PHP/php/php-franken.dockerfile +++ b/frameworks/PHP/php/php-franken.dockerfile @@ -4,12 +4,13 @@ FROM dunglas/frankenphp RUN install-php-extensions \ pdo_mysql \ zip \ - opcache + opcache > /dev/null -COPY deploy/franken/Caddyfile /etc/caddy/Caddyfile +COPY --link deploy/franken/Caddyfile /etc/caddy/Caddyfile +COPY --link deploy/conf/php.ini /usr/local/etc/php/ -ADD . /php +COPY --link . /php # Worker mode #ENV FRANKENPHP_CONFIG="worker ./public/index.php" diff --git a/frameworks/PHP/php/php-unit.dockerfile b/frameworks/PHP/php/php-unit.dockerfile index bddd4e15b4f..1fa2d5bbe9d 100644 --- a/frameworks/PHP/php/php-unit.dockerfile +++ b/frameworks/PHP/php/php-unit.dockerfile @@ -1,13 +1,20 @@ FROM unit:php8.3 -ADD . /php +RUN docker-php-ext-install pdo_mysql opcache > /dev/null + WORKDIR /php +COPY --link . . -RUN docker-php-ext-install pdo_mysql opcache > /dev/null -RUN if [ $(nproc) = 2 ]; then sed -i "s|\"processes\": 84,|\"processes\": 64,|g" /php/deploy/nginx-unit.json ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|\"spare\": 168,|\"spare\": 64,|g" /php/deploy/nginx-unit.json ; fi; -EXPOSE 8080 +#RUN more /php/deploy/nginx-unit.json -COPY deploy/nginx-unit.json /docker-entrypoint.d/nginx-unit.json +RUN unitd && \ + curl -X PUT --data-binary @/php/deploy/nginx-unit.json --unix-socket \ + /var/run/control.unit.sock http://localhost/config + +ENTRYPOINT [ ] + +EXPOSE 8080 CMD ["unitd", "--no-daemon", "--control", "unix:/var/run/control.unit.sock"] From 5f8717924d92748c74273320f618432f0cd4e7cb Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Thu, 23 May 2024 15:44:19 +0100 Subject: [PATCH 0609/1766] toolset: Update pymongo to version 4.7.2 (#9038) --- Dockerfile | 2 +- toolset/databases/mongodb/mongodb.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index b6d9c268f48..e5df65ea716 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,7 @@ RUN apt-get -yqq update && \ colorama==0.3.1 \ docker==7.0.0 \ mysqlclient==2.2.4 \ - pymongo==3.13.0 + pymongo==4.7.2 # Collect resource usage statistics ARG DOOL_VERSION=v1.3.1 diff --git a/toolset/databases/mongodb/mongodb.py b/toolset/databases/mongodb/mongodb.py index e57ca317ccc..f6ddcad3b29 100644 --- a/toolset/databases/mongodb/mongodb.py +++ b/toolset/databases/mongodb/mongodb.py @@ -1,3 +1,4 @@ +import bson import pymongo import traceback @@ -52,19 +53,19 @@ def test_connection(cls, config): @classmethod def get_queries(cls, config): co = cls.get_connection(config) - status = co.admin.command(pymongo.son_manipulator.SON([('serverStatus', 1)])) + status = co.admin.command(bson.son.SON([('serverStatus', 1)])) return int(status["opcounters"]["query"]) + int(status["opcounters"]["update"]) #get_queries returns all the queries @classmethod def get_rows(cls, config): co = cls.get_connection(config) - status = co.admin.command(pymongo.son_manipulator.SON([('serverStatus', 1)])) + status = co.admin.command(bson.son.SON([('serverStatus', 1)])) return int(status["opcounters"]["query"]) * cls.get_rows_per_query(co) @classmethod def get_rows_updated(cls, config): co = cls.get_connection(config) - status = co.admin.command(pymongo.son_manipulator.SON([('serverStatus', 1)])) + status = co.admin.command(bson.son.SON([('serverStatus', 1)])) return int(status["opcounters"]["update"]) * cls.get_rows_per_query(co) @classmethod From 68046132817b0028aabaac0f237eafe86b40152b Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Thu, 23 May 2024 15:44:28 +0100 Subject: [PATCH 0610/1766] H2O: Improve the load balancing across database connections (#9039) Also, decrease the memory consumption of the cached queries test. --- frameworks/C/h2o/src/database.c | 199 ++++++++++++++++---------- frameworks/C/h2o/src/database.h | 2 +- frameworks/C/h2o/src/handlers/world.c | 7 +- 3 files changed, 125 insertions(+), 83 deletions(-) diff --git a/frameworks/C/h2o/src/database.c b/frameworks/C/h2o/src/database.c index 59042b1dec3..9736cb9f2f0 100644 --- a/frameworks/C/h2o/src/database.c +++ b/frameworks/C/h2o/src/database.c @@ -75,7 +75,7 @@ static void on_database_write_ready(h2o_socket_t *sock, const char *err); static void on_process_queries(void *arg); static void poll_database_connection(h2o_socket_t *sock, const char *err); static void prepare_statements(db_conn_t *conn); -static void process_queries(db_conn_t *conn, bool removed); +static void process_queries(db_conn_pool_t *pool); static void remove_connection(db_conn_t *conn); static void start_database_connect(db_conn_pool_t *pool, db_conn_t *conn); @@ -237,7 +237,10 @@ static void on_database_connect_read_ready(h2o_socket_t *sock, const char *err) h2o_timer_unlink(&conn->timer); h2o_socket_read_stop(conn->sock); h2o_socket_read_start(conn->sock, on_database_read_ready); - process_queries(conn, true); + *conn->pool->conn.tail = &conn->l; + conn->pool->conn.tail = &conn->l.next; + conn->l.next = NULL; + process_queries(conn->pool); return; default: LIBRARY_ERROR("PQresultStatus", PQresultErrorMessage(result)); @@ -370,7 +373,13 @@ static void on_database_read_ready(h2o_socket_t *sock, const char *err) for (PGnotify *notify = PQnotifies(conn->conn); notify; notify = PQnotifies(conn->conn)) PQfreemem(notify); - process_queries(conn, removed); + if (removed && conn->query_num) { + *conn->pool->conn.tail = &conn->l; + conn->pool->conn.tail = &conn->l.next; + conn->l.next = NULL; + } + + process_queries(conn->pool); } static void on_database_timeout(h2o_timer_t *timer) @@ -405,20 +414,83 @@ static void on_database_write_ready(h2o_socket_t *sock, const char *err) static void on_process_queries(void *arg) { + list_t *iter = NULL; db_conn_pool_t * const pool = arg; + size_t query_num = 0; - while (pool->queries.head && pool->conn) { - db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn); + while (pool->queries.head && pool->conn.head) { + db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn.head); + db_query_param_t * const param = H2O_STRUCT_FROM_MEMBER(db_query_param_t, + l, + conn->pool->queries.head); - pool->conn = conn->l.next; assert(conn->query_num); - process_queries(conn, true); + assert(pool->query_num < pool->config->max_query_num); + pool->conn.head = conn->l.next; + pool->queries.head = param->l.next; + + if (!pool->conn.head) { + assert(pool->conn.tail == &conn->l.next); + pool->conn.tail = &pool->conn.head; + } + + if (++pool->query_num == pool->config->max_query_num) { + assert(!pool->queries.head); + assert(pool->queries.tail == ¶m->l.next); + pool->queries.tail = &pool->queries.head; + } + + if (do_execute_query(conn, param)) { + param->on_error(param, DB_ERROR); + on_database_error(conn, DB_ERROR); + } + else { + query_num++; + + if (conn->query_num) { + *pool->conn.tail = &conn->l; + pool->conn.tail = &conn->l.next; + conn->l.next = NULL; + } + else { + conn->l.next = iter; + iter = &conn->l; + } + } } - if (pool->queries.head && pool->conn_num) - start_database_connect(pool, NULL); + if (iter) + do { + db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, iter); + + iter = conn->l.next; + + if (flush_connection(on_database_write_ready, conn)) + on_database_error(conn, DB_ERROR); + } while (iter); + pool->conn.tail = &pool->conn.head; pool->process_queries = false; + query_num += pool->config->max_query_num - pool->query_num; + + for (iter = pool->conn.head; iter;) { + db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, iter); + + iter = conn->l.next; + + if (flush_connection(on_database_write_ready, conn)) { + *pool->conn.tail = iter; + on_database_error(conn, DB_ERROR); + } + else + pool->conn.tail = &conn->l.next; + } + + const size_t conn_num = pool->config->max_db_conn_num - pool->conn_num; + + if (query_num > conn_num) + for (query_num -= conn_num; pool->conn_num && query_num; query_num--) + start_database_connect(pool, NULL); } static void poll_database_connection(h2o_socket_t *sock, const char *err) @@ -536,54 +608,44 @@ static void prepare_statements(db_conn_t *conn) } else { h2o_socket_read_start(conn->sock, on_database_read_ready); - process_queries(conn, true); + *conn->pool->conn.tail = &conn->l; + conn->pool->conn.tail = &conn->l.next; + conn->l.next = NULL; + process_queries(conn->pool); } } -static void process_queries(db_conn_t *conn, bool removed) +static void process_queries(db_conn_pool_t *pool) { - const bool flush = conn->query_num && conn->pool->queries.head; - - while (conn->query_num && conn->pool->queries.head) { - db_query_param_t * const param = H2O_STRUCT_FROM_MEMBER(db_query_param_t, - l, - conn->pool->queries.head); - - if (++conn->pool->query_num == conn->pool->config->max_query_num) { - assert(conn->pool->queries.tail == ¶m->l.next); - conn->pool->queries.tail = &conn->pool->queries.head; - } - - conn->pool->queries.head = param->l.next; - - if (do_execute_query(conn, param)) { - param->on_error(param, DB_ERROR); - on_database_error(conn, DB_ERROR); - return; - } - } - - if (flush && flush_connection(on_database_write_ready, conn)) - on_database_error(conn, DB_ERROR); - else if (conn->query_num && removed) { - conn->l.next = conn->pool->conn; - conn->pool->conn = &conn->l; + if (!pool->process_queries && pool->queries.head) { + task_message_t * const msg = h2o_mem_alloc(sizeof(*msg)); + + assert(pool->query_num < pool->config->max_query_num); + memset(msg, 0, sizeof(*msg)); + msg->arg = pool; + msg->super.type = TASK; + msg->task = on_process_queries; + pool->process_queries = true; + send_local_message(&msg->super, pool->local_messages); } - else if (!conn->query_num && !removed) - // This call should not be problematic, assuming a relatively low number of connections. - remove_connection(conn); } static void remove_connection(db_conn_t *conn) { - list_t *iter = conn->pool->conn; - list_t **prev = &conn->pool->conn; + list_t *iter = conn->pool->conn.head; + list_t **prev = &conn->pool->conn.head; for (; iter && iter != &conn->l; iter = iter->next) prev = &iter->next; - if (iter) + if (iter) { *prev = iter->next; + + if (!conn->pool->conn.head) { + assert(conn->pool->conn.tail == &iter->next); + conn->pool->conn.tail = &conn->pool->conn.head; + } + } } static void start_database_connect(db_conn_pool_t *pool, db_conn_t *conn) @@ -661,37 +723,15 @@ int execute_database_query(db_conn_pool_t *pool, db_query_param_t *param) int ret = 1; if (pool->query_num) { - if (pool->conn) { - // Delay sending the database queries to the server, so that if there is a rapid - // succession of calls to this function, all resultant queries would be inserted - // into a command pipeline with a smaller number of system calls. - if (!pool->process_queries) { - task_message_t * const msg = h2o_mem_alloc(sizeof(*msg)); - - memset(msg, 0, sizeof(*msg)); - msg->arg = pool; - msg->super.type = TASK; - msg->task = on_process_queries; - send_local_message(&msg->super, pool->local_messages); - pool->process_queries = true; - } - - ret = 0; - } - else { - if (pool->conn_num) - start_database_connect(pool, NULL); - - if (pool->conn_num < pool->config->max_db_conn_num && pool->query_num) - ret = 0; - } - - if (!ret) { - param->l.next = NULL; - *pool->queries.tail = ¶m->l; - pool->queries.tail = ¶m->l.next; - pool->query_num--; - } + // Delay sending the database queries to the server, so that if there is a rapid + // succession of calls to this function, all resultant queries would be inserted + // into a command pipeline with a smaller number of system calls. + param->l.next = NULL; + *pool->queries.tail = ¶m->l; + pool->queries.tail = ¶m->l.next; + pool->query_num--; + process_queries(pool); + ret = 0; } return ret; @@ -704,9 +744,9 @@ void free_database_connection_pool(db_conn_pool_t *pool) size_t num = 0; - if (pool->conn) + if (pool->conn.head) do { - db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn); + db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn.head); assert(!conn->queries.head); assert(conn->query_num == pool->config->max_pipeline_query_num); @@ -715,10 +755,10 @@ void free_database_connection_pool(db_conn_pool_t *pool) h2o_socket_read_stop(conn->sock); h2o_socket_close(conn->sock); PQfinish(conn->conn); - pool->conn = pool->conn->next; - free(conn); + pool->conn.head = conn->l.next; num++; - } while (pool->conn); + free(conn); + } while (pool->conn.head); assert(num + pool->conn_num == pool->config->max_db_conn_num); } @@ -732,6 +772,7 @@ void initialize_database_connection_pool(const char *conninfo, { memset(pool, 0, sizeof(*pool)); pool->config = config; + pool->conn.tail = &pool->conn.head; pool->conninfo = conninfo ? conninfo : ""; pool->local_messages = local_messages; pool->loop = loop; diff --git a/frameworks/C/h2o/src/database.h b/frameworks/C/h2o/src/database.h index b35d3805c3f..c0c0ca05eda 100644 --- a/frameworks/C/h2o/src/database.h +++ b/frameworks/C/h2o/src/database.h @@ -60,7 +60,7 @@ typedef struct db_query_param_t { typedef struct { const struct config_t *config; - list_t *conn; + queue_t conn; const char *conninfo; h2o_linklist_t *local_messages; h2o_loop_t *loop; diff --git a/frameworks/C/h2o/src/handlers/world.c b/frameworks/C/h2o/src/handlers/world.c index 5528ddb75c4..0ee0b29d497 100644 --- a/frameworks/C/h2o/src/handlers/world.c +++ b/frameworks/C/h2o/src/handlers/world.c @@ -416,7 +416,7 @@ static void fetch_from_cache(uint64_t now, h2o_cache_ref_t * const r = h2o_cache_fetch(data->world_cache, now, key, 0); if (r) { - const uint32_t * const table = (const uint32_t *) r->value.base; + const uint16_t * const table = (const uint16_t *) r->value.base; for (size_t i = 0; i < query_ctx->num_query; i++) { const uint32_t id = query_ctx->res[i].id; @@ -440,7 +440,7 @@ static void fetch_from_cache(uint64_t now, memset(ctx, 0, sizeof(*ctx)); ctx->data = data; ctx->loop = query_ctx->ctx->event_loop.h2o_ctx.loop; - ctx->table.len = (MAX_ID + 1) * sizeof(uint32_t); + ctx->table.len = (MAX_ID + 1) * sizeof(uint16_t); ctx->table.base = h2o_mem_alloc(ctx->table.len); memset(ctx->table.base, 0, ctx->table.len); ctx->param.command = POPULATE_CACHE_QUERY; @@ -605,10 +605,11 @@ static result_return_t on_populate_cache_result(db_query_param_t *param, PGresul param, param); query_result_t r = {.id = 0}; - uint32_t * const table = (uint32_t *) query_ctx->table.base; + uint16_t * const table = (uint16_t *) query_ctx->table.base; for (size_t i = 0; i < num_rows; i++) { process_result(result, i, &r); + assert(r.random_number <= UINT16_MAX); table[r.id] = r.random_number; } From 6affc5917d67236ac705a904b930b71c8dfb56cd Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 23 May 2024 16:44:41 +0200 Subject: [PATCH 0611/1766] [php] Ngx-php update to Nginx/1.26.0 (#9040) * Ngx-php update to Nginx/1.26.0 * Mark async as broken til we fix it * Move COPY at bottom in Dockerfile for faster local builds, where only change the code. * Fix sed position in dockerfile --- frameworks/PHP/php-ngx/benchmark_config.json | 3 ++- frameworks/PHP/php-ngx/php-ngx-async.dockerfile | 11 ++++++----- frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile | 11 +++++++---- frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile | 13 ++++++++----- frameworks/PHP/php-ngx/php-ngx.dockerfile | 10 ++++++---- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/frameworks/PHP/php-ngx/benchmark_config.json b/frameworks/PHP/php-ngx/benchmark_config.json index ab370278e0e..d96e89c0e7f 100644 --- a/frameworks/PHP/php-ngx/benchmark_config.json +++ b/frameworks/PHP/php-ngx/benchmark_config.json @@ -81,7 +81,8 @@ "database_os": "Linux", "display_name": "ngx-php async", "notes": "ngx_php async", - "versus": "php" + "versus": "php", + "tags": ["broken"] } }] } diff --git a/frameworks/PHP/php-ngx/php-ngx-async.dockerfile b/frameworks/PHP/php-ngx/php-ngx-async.dockerfile index 56acecf97ee..37f36d08671 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:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -9,12 +9,10 @@ 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 libkrb5-dev \ + zlib1g-dev libpcre3-dev libargon2-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.4 +ENV NGINX_VERSION 1.26.0 RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null @@ -28,8 +26,11 @@ 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.3/embed/conf.d/10-opcache.ini +COPY --link . . + EXPOSE 8080 CMD /nginx/sbin/nginx -c /deploy/nginx_async.conf diff --git a/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile index 90d87b8523d..8c93d9d3fd1 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:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -9,11 +9,10 @@ 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 libkrb5-dev \ + zlib1g-dev libpcre3-dev libargon2-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.4 +ENV NGINX_VERSION 1.26.0 RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null @@ -28,6 +27,10 @@ RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ --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 + +COPY --link . . + RUN export WORKERS=$(( 4 * $(nproc) )) && \ sed -i "s/worker_processes auto/worker_processes $WORKERS/g" /deploy/nginx.conf diff --git a/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile index b7a157833fd..ab6d1e4f5df 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:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -9,11 +9,10 @@ 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 libkrb5-dev \ + zlib1g-dev libpcre3-dev libargon2-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.4 +ENV NGINX_VERSION 1.26.0 RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null @@ -28,11 +27,15 @@ RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ --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 + +COPY --link . . + 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.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 671a6312aef..60d488d6649 100644 --- a/frameworks/PHP/php-ngx/php-ngx.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -9,11 +9,10 @@ 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 libkrb5-dev \ + zlib1g-dev libpcre3-dev libargon2-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.4 +ENV NGINX_VERSION 1.26.0 RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null @@ -27,8 +26,11 @@ 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.3/embed/conf.d/10-opcache.ini +COPY --link . . + EXPOSE 8080 CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf From 2a6d458c7329ee3f2811e9520725f44ced34b8d6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 23 May 2024 16:44:55 +0200 Subject: [PATCH 0612/1766] [rails] Route rack response for plaintext (#9041) Rails allows short circuiting responses in the router. --- .../Ruby/rails/app/controllers/plaintext_controller.rb | 9 --------- frameworks/Ruby/rails/config/routes.rb | 10 +++++++++- 2 files changed, 9 insertions(+), 10 deletions(-) delete mode 100644 frameworks/Ruby/rails/app/controllers/plaintext_controller.rb diff --git a/frameworks/Ruby/rails/app/controllers/plaintext_controller.rb b/frameworks/Ruby/rails/app/controllers/plaintext_controller.rb deleted file mode 100644 index 1afe3639c4d..00000000000 --- a/frameworks/Ruby/rails/app/controllers/plaintext_controller.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -class PlaintextController < ApplicationControllerMetal - def index - add_headers - self.content_type = 'text/plain' - self.response_body = 'Hello, World!' - end -end diff --git a/frameworks/Ruby/rails/config/routes.rb b/frameworks/Ruby/rails/config/routes.rb index 5556bc3ed17..70b58d84bfc 100644 --- a/frameworks/Ruby/rails/config/routes.rb +++ b/frameworks/Ruby/rails/config/routes.rb @@ -6,6 +6,14 @@ get "queries", to: "hello_world#query" get "fortunes", to: "hello_world#fortune" get "updates", to: "hello_world#update" - get "plaintext", to: PlaintextController.action(:index) + get "plaintext", to: ->(env) do + [200, + { + 'Content-Type' => 'text/plain', + 'Date' => Time.now.httpdate, + 'Server' => 'Rails' + }, + ['Hello, World!']] + end get "cached", to: "hello_world#cached_query" end From 48b96fd745284e688218d32c173286f9274019a7 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 23 May 2024 16:45:03 +0200 Subject: [PATCH 0613/1766] Workerman use Ubuntu 24.04 (#9042) --- frameworks/PHP/workerman/app-pg.php | 12 ++++++++---- frameworks/PHP/workerman/server.php | 2 +- frameworks/PHP/workerman/workerman-async.dockerfile | 12 ++++++------ frameworks/PHP/workerman/workerman-pgsql.dockerfile | 13 +++++++------ .../PHP/workerman/workerman-php8-jit.dockerfile | 12 ++++++------ frameworks/PHP/workerman/workerman.dockerfile | 12 ++++++------ 6 files changed, 34 insertions(+), 29 deletions(-) diff --git a/frameworks/PHP/workerman/app-pg.php b/frameworks/PHP/workerman/app-pg.php index 471c71b2186..b92809d2787 100644 --- a/frameworks/PHP/workerman/app-pg.php +++ b/frameworks/PHP/workerman/app-pg.php @@ -47,6 +47,8 @@ function db() function query($request) { + $random = DbRaw::$random; + $query_count = 1; $q = (int) $request->get('q'); if ($q > 1) { @@ -54,8 +56,8 @@ function query($request) } while ($query_count--) { - DbRaw::$random->execute([mt_rand(1, 10000)]); - $arr[] = DbRaw::$random->fetch(); + $random->execute([mt_rand(1, 10000)]); + $arr[] = $random->fetch(); } return new Response(200, [ @@ -66,6 +68,8 @@ function query($request) function updateraw($request) { + $random = DbRaw::$random; + $query_count = 1; $q = (int) $request->get('q'); if ($q > 1) { @@ -74,8 +78,8 @@ function updateraw($request) while ($query_count--) { - DbRaw::$random->execute([mt_rand(1, 10000)]); - $row = DbRaw::$random->fetch(); + $random->execute([mt_rand(1, 10000)]); + $row = $random->fetch(); $row['randomNumber'] = mt_rand(1, 10000); $worlds[] = $row; diff --git a/frameworks/PHP/workerman/server.php b/frameworks/PHP/workerman/server.php index 2822b170ff0..5a38cf1e0fc 100644 --- a/frameworks/PHP/workerman/server.php +++ b/frameworks/PHP/workerman/server.php @@ -7,7 +7,7 @@ $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; -$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/workerman/workerman-async.dockerfile b/frameworks/PHP/workerman/workerman-async.dockerfile index 4621aaa7c29..3730d43e58e 100644 --- a/frameworks/PHP/workerman/workerman-async.dockerfile +++ b/frameworks/PHP/workerman/workerman-async.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -8,15 +8,15 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /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 +COPY --from=composer/composer:latest-bin --link /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.3 > /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 +COPY --link php.ini /etc/php/8.3/cli/php.ini -ADD ./ /workerman WORKDIR /workerman +COPY --link . . RUN composer require react/mysql "^0.6" --quiet RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet diff --git a/frameworks/PHP/workerman/workerman-pgsql.dockerfile b/frameworks/PHP/workerman/workerman-pgsql.dockerfile index a84f44e78aa..826a6a39383 100644 --- a/frameworks/PHP/workerman/workerman-pgsql.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql.dockerfile @@ -1,4 +1,5 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 + ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null @@ -7,15 +8,15 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /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 +COPY --from=composer/composer:latest-bin --link /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.3 > /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 +COPY --link php.ini /etc/php/8.3/cli/php.ini -ADD ./ /workerman WORKDIR /workerman +COPY --link . . RUN sed -i "s|'/app.php|'/app-pg.php|g" server.php RUN sed -i "s|init()|DbRaw::init()|g" server.php diff --git a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile index 320a98c9f10..528a5c312f6 100644 --- a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -8,15 +8,15 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /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 +COPY --from=composer/composer:latest-bin --link /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.3 > /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 +COPY --link php-jit.ini /etc/php/8.3/cli/php.ini -ADD ./ /workerman WORKDIR /workerman +COPY --link . . RUN sed -i "s|'/app.php|'/app-pg.php|g" server.php RUN sed -i "s|init()|DbRaw::init()|g" server.php diff --git a/frameworks/PHP/workerman/workerman.dockerfile b/frameworks/PHP/workerman/workerman.dockerfile index 31fe46ce5a7..5d09ee6362a 100644 --- a/frameworks/PHP/workerman/workerman.dockerfile +++ b/frameworks/PHP/workerman/workerman.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -8,15 +8,15 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /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 +COPY --from=composer/composer:latest-bin --link /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.3 > /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 +COPY --link php-jit.ini /etc/php/8.3/cli/php.ini -ADD ./ /workerman WORKDIR /workerman +COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet From ceaeb3087c560a3f4429e3cdbfd9411d05bd572b Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Thu, 23 May 2024 15:45:13 +0100 Subject: [PATCH 0614/1766] Hummingbird2 updates (#9043) * Use one connection for mulitple queries * Use prepared statements * Reduce connection amount to 100 --- .../Controllers/FortunesController.swift | 18 +++- .../server/Controllers/WorldController.swift | 84 ++++++++++++------- .../src-postgres/Sources/server/main.swift | 2 +- 3 files changed, 70 insertions(+), 34 deletions(-) diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift index 1338b6f2280..159901dda40 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift @@ -35,10 +35,10 @@ final class FortunesController: Sendable { /// is delivered to the client using a server-side HTML template. The message /// text must be considered untrusted and properly escaped and the UTF-8 fortune messages must be rendered properly. @Sendable func fortunes(request: Request, context: Context) async throws -> HTML { - let rows = try await self.postgresClient.query("SELECT id, message FROM Fortune") + let rows = try await self.postgresClient.execute(SelectFortuneStatement()) var fortunes: [Fortune] = [] - for try await (id, message) in rows.decode((Int32, String).self, context: .default) { - fortunes.append(.init(id: id, message: message)) + for try await fortune in rows { + fortunes.append(.init(id: fortune.0, message: fortune.1)) } fortunes.append(.init(id: 0, message: "Additional fortune added at request time.")) @@ -46,4 +46,16 @@ final class FortunesController: Sendable { return HTML(html: self.template.render(sortedFortunes) ) } + + struct SelectFortuneStatement: PostgresPreparedStatement { + typealias Row = (Int32, String) + + static var sql = "SELECT id, message FROM Fortune" + + func makeBindings() throws -> PostgresNIO.PostgresBindings { + return .init() + } + + func decodeRow(_ row: PostgresNIO.PostgresRow) throws -> Row { try row.decode(Row.self) } + } } diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift index 57fcca0cf46..df3a74d4ac8 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift @@ -16,11 +16,11 @@ struct WorldController { /// simple database table. That row is then serialized as a JSON response. @Sendable func single(request: Request, context: Context) async throws -> World { let id = Int32.random(in: 1...10_000) - let rows = try await self.postgresClient.query("SELECT id, randomnumber FROM World WHERE id = \(id)") - for try await (id, randomNumber) in rows.decode((Int32, Int32).self, context: .default) { - return World(id: id, randomNumber: randomNumber) + let rows = try await self.postgresClient.execute(SelectWorldStatement(id: id)) + guard let row = try await rows.first(where: {_ in true }) else { + throw HTTPError(.notFound) } - throw HTTPError(.notFound) + return World(id: row.0, randomNumber: row.1) } /// In this test, each request is processed by fetching multiple rows from a @@ -29,21 +29,16 @@ struct WorldController { /// All tests are run at 512 concurrency. @Sendable func multiple(request: Request, context: Context) async throws -> [World] { let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500) - return try await withThrowingTaskGroup(of: World.self) { group in + return try await self.postgresClient.withConnection { conn in + var result: [World] = .init() + result.reserveCapacity(queries) for _ in 0.. [World] { let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500) - return try await withThrowingTaskGroup(of: World.self) { group in + return try await self.postgresClient.withConnection { conn in + var result: [World] = .init() + result.reserveCapacity(queries) for _ in 0.. PostgresNIO.PostgresBindings { + var bindings = PostgresNIO.PostgresBindings(capacity: 1) + bindings.append(.init(int32: self.id)) + return bindings + } + + func decodeRow(_ row: PostgresNIO.PostgresRow) throws -> Row { try row.decode(Row.self) } + } + + struct UpdateWorldStatement: PostgresPreparedStatement { + typealias Row = Int32 + + let id: Int32 + let randomNumber: Int32 + + static var sql = "UPDATE World SET randomnumber = $2 WHERE id = $1" + + func makeBindings() throws -> PostgresNIO.PostgresBindings { + var bindings = PostgresNIO.PostgresBindings(capacity: 2) + bindings.append(.init(int32: self.id)) + bindings.append(.init(int32: self.randomNumber)) + return bindings + } + + func decodeRow(_ row: PostgresNIO.PostgresRow) throws -> Row { try row.decode(Row.self) } + } } diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift index f095961572a..65e360bfab3 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift @@ -39,7 +39,7 @@ func runApp() async throws { database: "hello_world", tls: .disable ) - postgresConfiguration.options.maximumConnections = 1900 + postgresConfiguration.options.maximumConnections = 100 let postgresClient = PostgresClient( configuration: postgresConfiguration, eventLoopGroup: MultiThreadedEventLoopGroup.singleton From 7228260ff133697e0b95ffcd89385ce8730a6302 Mon Sep 17 00:00:00 2001 From: Edgar Espina Date: Thu, 23 May 2024 10:45:30 -0400 Subject: [PATCH 0615/1766] jooby: upgrade 3.1 (#9044) --- frameworks/Java/jooby/pom.xml | 31 +++++++++++++++++-- .../src/main/java/com/techempower/App.java | 2 +- .../src/main/java/com/techempower/Json.java | 12 +++---- .../main/java/com/techempower/ReactivePg.java | 11 +++---- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index 90b9758b991..467b52f6259 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,7 +11,8 @@ jooby - 3.0.8 + 3.1.1 + 4.1.109.Final 2.0.2 42.7.2 UTF-8 @@ -44,7 +45,6 @@ 8.3.0 - org.postgresql @@ -166,6 +166,25 @@ + + mac + + + mac + + + + + com.ongres.scram + client + 2.1 + + + io.netty + netty-resolver-dns-native-macos + + + undertow @@ -202,6 +221,14 @@ + + io.netty + netty-bom + ${netty.version} + pom + import + + io.jooby jooby-bom diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/App.java b/frameworks/Java/jooby/src/main/java/com/techempower/App.java index 01c3665a76b..f7cf3373b4a 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/App.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/App.java @@ -40,7 +40,7 @@ public class App extends Jooby { DataSource ds = require(DataSource.class); /** Template engine: */ - install(new RockerModule().reuseBuffer(true)); + install(new RockerModule()); get("/plaintext", ctx -> ctx.send(MESSAGE_BUFFER.duplicate()) diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/Json.java b/frameworks/Java/jooby/src/main/java/com/techempower/Json.java index 87543caec1f..2fa2af86ba1 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/Json.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/Json.java @@ -19,8 +19,7 @@ public class Json { public static ByteBuffer encode(Message data) { JsonWriter writer = pool.get(); writer.reset(); - _Message_DslJsonConverter.ObjectFormatConverter converter = new _Message_DslJsonConverter.ObjectFormatConverter( - dslJson); + var converter = new _Message_DslJsonConverter.ObjectFormatConverter(dslJson); converter.write(writer, data); return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); } @@ -28,8 +27,7 @@ public static ByteBuffer encode(Message data) { public static ByteBuffer encode(World data) { JsonWriter writer = pool.get(); writer.reset(); - _World_DslJsonConverter.ObjectFormatConverter converter = new _World_DslJsonConverter.ObjectFormatConverter( - dslJson); + var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson); converter.write(writer, data); return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); } @@ -37,8 +35,7 @@ public static ByteBuffer encode(World data) { public static ByteBuffer encode(World[] data) { JsonWriter writer = pool.get(); writer.reset(); - _World_DslJsonConverter.ObjectFormatConverter converter = new _World_DslJsonConverter.ObjectFormatConverter( - dslJson); + var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson); writer.serialize(data, converter); return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); } @@ -46,8 +43,7 @@ public static ByteBuffer encode(World[] data) { public static ByteBuffer encode(List data) { JsonWriter writer = pool.get(); writer.reset(); - _World_DslJsonConverter.ObjectFormatConverter converter = new _World_DslJsonConverter.ObjectFormatConverter( - dslJson); + var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson); writer.serialize(data, converter); return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); } diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java index bd456dc2824..6a674c5e8df 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java @@ -4,17 +4,14 @@ import static io.jooby.ExecutionMode.EVENT_LOOP; import static io.jooby.MediaType.JSON; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import com.fizzed.rocker.RockerOutputFactory; import io.jooby.Context; import io.jooby.Jooby; import io.jooby.MediaType; import io.jooby.ServerOptions; -import io.jooby.rocker.ByteBufferOutput; +import io.jooby.rocker.DataBufferOutput; import io.jooby.rocker.RockerModule; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowIterator; @@ -34,7 +31,7 @@ public class ReactivePg extends Jooby { PgClient client = new PgClient(getConfig().getConfig("db")); /** Template engine: */ - install(new RockerModule().reuseBuffer(true)); + install(new RockerModule()); /** Single query: */ get("/db", ctx -> { @@ -109,7 +106,7 @@ public class ReactivePg extends Jooby { }).setNonBlocking(true); /** Fortunes: */ - RockerOutputFactory factory = require(RockerOutputFactory.class); + RockerOutputFactory factory = require(RockerOutputFactory.class); get("/fortunes", ctx -> { client.fortunes(rsp -> { if (rsp.succeeded()) { From ff1ddcee72af883fe5468dcc8b29981d945ab71b Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 23 May 2024 16:45:38 +0200 Subject: [PATCH 0616/1766] Laravel APP_ENV = production (#9047) --- frameworks/PHP/laravel/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/laravel/.env b/frameworks/PHP/laravel/.env index 3bed03b2b6d..e29e1170f97 100644 --- a/frameworks/PHP/laravel/.env +++ b/frameworks/PHP/laravel/.env @@ -1,5 +1,5 @@ APP_NAME=Laravel -APP_ENV=local +APP_ENV=production APP_KEY=base64:JRW3D/imCqern1eNGYaRTmP8wixsi3gWRXTSIT1LGTQ= APP_DEBUG=false APP_URL=http://localhost From b22ef920ea4b1c390f34b18583f3965e8815c54e Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 23 May 2024 16:45:58 +0200 Subject: [PATCH 0617/1766] [ruby|sinatra] Use OJ for JSON serialization (#9050) `oj` is faster than the `json` gem. --- frameworks/Ruby/sinatra-sequel/Gemfile | 2 +- frameworks/Ruby/sinatra-sequel/boot.rb | 3 +++ frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/boot.rb | 3 +++ 4 files changed, 8 insertions(+), 2 deletions(-) mode change 100755 => 100644 frameworks/Ruby/sinatra/boot.rb diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index b93a3da14da..649fbcfe6bf 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'json', '~> 2.0' +gem 'oj' gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index 7e621c7a964..44843e48341 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'bundler/setup' require 'time' +require 'oj' MAX_PK = 10_000 ID_RANGE = (1..MAX_PK).freeze @@ -23,6 +24,8 @@ Bundler.require(:default) # Load core modules +Oj.mimic_JSON + def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index e606bd250d8..22752eec379 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' gem 'activerecord', '~> 7.0', :require=>'active_record' -gem 'json', '~> 2.0' +gem 'oj' gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sinatra', '~> 3.0', :require=>'sinatra/base' diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb old mode 100755 new mode 100644 index b8bb082f629..355fc53df74 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'bundler/setup' require 'time' +require 'oj' MAX_PK = 10_000 ID_RANGE = (1..MAX_PK).freeze @@ -22,6 +23,8 @@ Bundler.require(:default) # Load core modules +Oj.mimic_JSON + def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules From 2e25c01f3022d6128a8d50b8d11bff45c1f2a52d Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Thu, 23 May 2024 22:46:22 +0800 Subject: [PATCH 0618/1766] [xitca-web] update dep (#9051) --- frameworks/Rust/xitca-web/Cargo.lock | 220 ++++++++++-------- frameworks/Rust/xitca-web/Cargo.toml | 20 +- .../Rust/xitca-web/benchmark_config.json | 3 +- frameworks/Rust/xitca-web/src/main_axum.rs | 3 + frameworks/Rust/xitca-web/src/main_iou.rs | 3 + .../Rust/xitca-web/xitca-web-axum.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-iou.dockerfile | 2 +- 7 files changed, 148 insertions(+), 105 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index c26187480b2..0bce6f973f8 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.79" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", @@ -39,9 +39,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" @@ -67,7 +67,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.0", + "sync_wrapper 1.0.1", "tower", "tower-layer", "tower-service", @@ -149,9 +149,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.90" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" [[package]] name = "cfg-if" @@ -180,9 +180,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.1.5" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" +checksum = "ff236accb9a5069572099f0b350a92e9560e8e63a9b8d546162f4a5e03026bb2" dependencies = [ "bitflags 2.5.0", "byteorder", @@ -194,9 +194,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.1.3" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" +checksum = "14701062d6bed917b5c7103bdffaee1e4609279e240488ad24e7bd979ca6866c" dependencies = [ "diesel_table_macro_syntax", "proc-macro2", @@ -238,7 +238,7 @@ checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "windows-sys 0.52.0", ] @@ -299,9 +299,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -408,15 +408,25 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "0e7bb23d733dfcc8af652a78b7bf232f0e967710d044732185e561e47c0336b6" +dependencies = [ + "cc", + "libc", +] [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -450,6 +460,15 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +[[package]] +name = "mimalloc" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9186d86b79b52f4a77af65604b51225e8db1d6ee7e3f41aec1e40829c71a176" +dependencies = [ + "libmimalloc-sys", +] + [[package]] name = "mime" version = "0.3.17" @@ -458,9 +477,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", ] @@ -484,9 +503,9 @@ checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -518,9 +537,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", "parking_lot_core", @@ -528,15 +547,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.1", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -623,18 +642,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -689,23 +708,32 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sailfish" @@ -766,18 +794,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", @@ -786,9 +814,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -830,9 +858,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -864,9 +892,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -891,9 +919,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.57" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a6ae1e52eb25aab8f3fb9fca13be982a373b8f1157ca14b897a825ba4a2d35" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -908,9 +936,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384595c11a4e2969895cad5a8c4029115f5ab956a9e5ef4de79d11a426e5f20c" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "tinyvec" @@ -937,9 +965,10 @@ dependencies = [ "libc", "mio", "num_cpus", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.6", + "socket2 0.5.7", "windows-sys 0.48.0", ] @@ -1103,7 +1132,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -1123,17 +1152,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "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", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -1144,9 +1174,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -1156,9 +1186,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -1168,9 +1198,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -1180,9 +1216,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -1192,9 +1228,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -1204,9 +1240,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -1216,9 +1252,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "xitca-codegen" @@ -1232,9 +1268,9 @@ dependencies = [ [[package]] name = "xitca-http" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1982607f88759de96dec5b234e9cf835d6a4995e395b65a201e656d0641974" +checksum = "6d5fd258cd6cd9d677cb94273da69fafee7460bbbd001c92a73c167149856e46" dependencies = [ "futures-core", "http", @@ -1242,7 +1278,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tokio-uring", "tracing", @@ -1254,9 +1290,9 @@ dependencies = [ [[package]] name = "xitca-io" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3340548aec525e517557432502238ed86ae69b6fc1eed851693773516b399" +checksum = "da690dc253320dae7ffbb70e7fa9c5e52ef79476dd41f5d52b9114c8b58d7126" dependencies = [ "bytes", "tokio", @@ -1267,7 +1303,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=d76b2e188edcbdd801ecb4a7359b4d56070d6dc4#d76b2e188edcbdd801ecb4a7359b4d56070d6dc4" +source = "git+https://github.com/HFQR/xitca-web.git?rev=ea1f5a2447e0969a6dff84eac9ff9ff90dbc7ed1#ea1f5a2447e0969a6dff84eac9ff9ff90dbc7ed1" dependencies = [ "fallible-iterator", "percent-encoding", @@ -1291,11 +1327,11 @@ dependencies = [ [[package]] name = "xitca-server" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f48656d81909cb34fcf01288cdaf2bd77848d0f0dcbdc0c429b6ed376f78f4d5" +checksum = "4e144aca50286d05f7450045d6b6eebe2157ed11bc5821d926fc276280113c94" dependencies = [ - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tokio-uring", "tracing", @@ -1328,6 +1364,7 @@ dependencies = [ "diesel", "futures-core", "http-body", + "mimalloc", "nanorand", "sailfish", "serde", @@ -1341,14 +1378,14 @@ dependencies = [ "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.4.0", + "xitca-web 0.5.0", ] [[package]] name = "xitca-web" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfae98470b0f55b978ebdccd1317a658590aa6fecec4db61522adaa8e6943747" +checksum = "bd23a9146a753f4f9e10bf4cc99b53d040a5459c32f043965d75f0c2b4a78af6" dependencies = [ "futures-core", "http-body", @@ -1365,8 +1402,3 @@ dependencies = [ "xitca-service", "xitca-unsafe-collection", ] - -[[patch.unused]] -name = "mio" -version = "1.0.0" -source = "git+https://github.com/fakeshadow/mio.git?rev=dcc85ea7a3af3159efdf7e3a17b3a8b58131a15f#dcc85ea7a3af3159efdf7e3a17b3a8b58131a15f" diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 9911115fb58..b9447c3e7ea 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -11,7 +11,7 @@ required-features = ["io-uring", "pg", "router", "template"] [[bin]] name = "xitca-web-iou" path = "./src/main_iou.rs" -required-features = ["io-uring", "pg-iou", "template"] +required-features = ["io-uring", "perf", "pg-iou", "template"] [[bin]] name = "xitca-web-wasm" @@ -21,7 +21,7 @@ required-features = ["web"] [[bin]] name = "xitca-web-axum" path = "./src/main_axum.rs" -required-features = ["axum", "io-uring", "pg-sync", "template"] +required-features = ["axum", "io-uring", "perf", "pg-sync", "template"] [[bin]] name = "xitca-web-sync" @@ -49,11 +49,13 @@ template = ["sailfish"] io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"] # axum optional axum = ["dep:axum", "http-body", "tower", "tower-http", "xitca-web/tower-http-compat" ] +# unrealistic performance optimization +perf = ["mimalloc", "tokio/parking_lot"] [dependencies] -xitca-http = "0.4" -xitca-io = "0.2" -xitca-server = "0.2" +xitca-http = "0.5" +xitca-io = "0.3" +xitca-server = "0.3" xitca-service = "0.1" xitca-unsafe-collection = "0.1.1" @@ -62,7 +64,7 @@ serde = { version = "1" } serde_json = { version = "1" } # web optional -xitca-web = { version = "0.4", features = ["json"], optional = true } +xitca-web = { version = "0.5", features = ["json"], optional = true } # raw-pg optional xitca-postgres = { version = "0.1", optional = true } @@ -79,6 +81,9 @@ http-body = { version = "1", optional = true } tower = { version = "0.4", optional = true } tower-http = { version = "0.5", features = ["set-header"], optional = true } +# perf optional +mimalloc = { version = "0.1", default-features = false, 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 } @@ -92,5 +97,4 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "d76b2e188edcbdd801ecb4a7359b4d56070d6dc4" } -mio = { git = "https://github.com/fakeshadow/mio.git", rev = "dcc85ea7a3af3159efdf7e3a17b3a8b58131a15f" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "ea1f5a2447e0969a6dff84eac9ff9ff90dbc7ed1" } diff --git a/frameworks/Rust/xitca-web/benchmark_config.json b/frameworks/Rust/xitca-web/benchmark_config.json index f4c152eb729..5371bcd2551 100755 --- a/frameworks/Rust/xitca-web/benchmark_config.json +++ b/frameworks/Rust/xitca-web/benchmark_config.json @@ -62,7 +62,8 @@ "database_os": "linux", "display_name": "xitca-web [wasm]", "notes": "", - "versus": "" + "versus": "", + "tags": ["broken"] }, "axum": { "json_url": "/json", diff --git a/frameworks/Rust/xitca-web/src/main_axum.rs b/frameworks/Rust/xitca-web/src/main_axum.rs index 571732a897c..d15aaefdc6e 100644 --- a/frameworks/Rust/xitca-web/src/main_axum.rs +++ b/frameworks/Rust/xitca-web/src/main_axum.rs @@ -1,5 +1,8 @@ //! 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; diff --git a/frameworks/Rust/xitca-web/src/main_iou.rs b/frameworks/Rust/xitca-web/src/main_iou.rs index 789f71cf81b..83dfbc0eaab 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_iou.rs @@ -1,6 +1,9 @@ // 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; diff --git a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile index 84a8606c1bc..2d29f5e2ffb 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.77 ADD ./ /xitca-web WORKDIR /xitca-web -RUN cargo build --release --bin xitca-web-axum --features axum,io-uring,pg-sync,template +RUN cargo build --release --bin xitca-web-axum --features axum,io-uring,perf,pg-sync,template EXPOSE 8080 diff --git a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile index 913fbfc075c..43bf2b23fc5 100644 --- a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile @@ -3,7 +3,7 @@ FROM rust:1.77 ADD ./ /xitca-web WORKDIR /xitca-web -RUN cargo build --release --bin xitca-web-iou --features io-uring,pg-iou,template +RUN cargo build --release --bin xitca-web-iou --features io-uring,perf,pg-iou,template EXPOSE 8080 From 01e4e47494c64477bc542d071c053614d952c8d1 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 23 May 2024 16:46:32 +0200 Subject: [PATCH 0619/1766] [ruby] Remove hardcoded Ruby versions from Gemfile and version file (#9052) Versions are already defined in the dockerfiles. --- frameworks/Ruby/agoo/.ruby-gemset | 1 - frameworks/Ruby/agoo/.ruby-version | 1 - frameworks/Ruby/rails/Gemfile | 4 +- frameworks/Ruby/rails/Gemfile.lock | 156 ++++++++++++++--------------- 4 files changed, 77 insertions(+), 85 deletions(-) delete mode 100644 frameworks/Ruby/agoo/.ruby-gemset delete mode 100644 frameworks/Ruby/agoo/.ruby-version diff --git a/frameworks/Ruby/agoo/.ruby-gemset b/frameworks/Ruby/agoo/.ruby-gemset deleted file mode 100644 index 92fc86eb583..00000000000 --- a/frameworks/Ruby/agoo/.ruby-gemset +++ /dev/null @@ -1 +0,0 @@ -agoo diff --git a/frameworks/Ruby/agoo/.ruby-version b/frameworks/Ruby/agoo/.ruby-version deleted file mode 100644 index 4560fb912c0..00000000000 --- a/frameworks/Ruby/agoo/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -ruby-2.6.3 diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 359f1cb6c6f..39eb973e700 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -1,9 +1,7 @@ -ruby '~> 3.2' - source 'https://rubygems.org' gem 'oj', '~> 3.16' -gem 'pg', '1.5.4', group: :postgresql +gem 'pg', '~> 1.5', group: :postgresql gem 'puma', '~> 6.4' gem 'rails', '~> 7.1.3' gem 'redis', '~> 5.0' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index f3182051a65..9d15aecbab6 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,35 +1,35 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3.1) - actionpack (= 7.1.3.1) - activesupport (= 7.1.3.1) + actioncable (7.1.3.3) + actionpack (= 7.1.3.3) + activesupport (= 7.1.3.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - 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) + actionmailbox (7.1.3.3) + actionpack (= 7.1.3.3) + activejob (= 7.1.3.3) + activerecord (= 7.1.3.3) + activestorage (= 7.1.3.3) + activesupport (= 7.1.3.3) mail (>= 2.7.1) net-imap net-pop net-smtp - 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) + actionmailer (7.1.3.3) + actionpack (= 7.1.3.3) + actionview (= 7.1.3.3) + activejob (= 7.1.3.3) + activesupport (= 7.1.3.3) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3.1) - actionview (= 7.1.3.1) - activesupport (= 7.1.3.1) + actionpack (7.1.3.3) + actionview (= 7.1.3.3) + activesupport (= 7.1.3.3) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -37,35 +37,35 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - 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) + actiontext (7.1.3.3) + actionpack (= 7.1.3.3) + activerecord (= 7.1.3.3) + activestorage (= 7.1.3.3) + activesupport (= 7.1.3.3) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3.1) - activesupport (= 7.1.3.1) + actionview (7.1.3.3) + activesupport (= 7.1.3.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3.1) - activesupport (= 7.1.3.1) + activejob (7.1.3.3) + activesupport (= 7.1.3.3) globalid (>= 0.3.6) - 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) + activemodel (7.1.3.3) + activesupport (= 7.1.3.3) + activerecord (7.1.3.3) + activemodel (= 7.1.3.3) + activesupport (= 7.1.3.3) timeout (>= 0.4.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) + activestorage (7.1.3.3) + actionpack (= 7.1.3.3) + activejob (= 7.1.3.3) + activerecord (= 7.1.3.3) + activesupport (= 7.1.3.3) marcel (~> 1.0) - activesupport (7.1.3.1) + activesupport (7.1.3.3) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -76,22 +76,21 @@ GEM mutex_m tzinfo (~> 2.0) base64 (0.2.0) - bigdecimal (3.1.6) + bigdecimal (3.1.8) builder (3.2.4) concurrent-ruby (1.2.3) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) - drb (2.2.0) - ruby2_keywords + drb (2.2.1) erubi (1.12.0) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) io-console (0.7.2) - irb (1.11.2) - rdoc + irb (1.13.1) + rdoc (>= 4.0.0) reline (>= 0.4.2) loofah (2.22.0) crass (~> 1.0.2) @@ -101,21 +100,21 @@ GEM net-imap net-pop net-smtp - marcel (1.0.2) + marcel (1.0.4) mini_mime (1.1.5) mini_portile2 (2.8.6) - minitest (5.22.2) + minitest (5.23.1) mutex_m (0.2.0) - net-imap (0.4.10) + net-imap (0.4.11) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.4.0.1) + net-smtp (0.5.0) net-protocol - nio4r (2.7.0) + nio4r (2.7.3) nokogiri (1.16.5) mini_portile2 (~> 2.8.2) racc (~> 1.4) @@ -123,14 +122,15 @@ GEM racc (~> 1.4) nokogiri (1.16.5-x86_64-linux) racc (~> 1.4) - oj (3.16.1) - pg (1.5.4) + oj (3.16.3) + bigdecimal (>= 3.0) + pg (1.5.6) psych (5.1.2) stringio puma (6.4.2) nio4r (~> 2.0) - racc (1.7.3) - rack (3.0.9.1) + racc (1.8.0) + rack (3.0.11) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -138,20 +138,20 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) - 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) + rails (7.1.3.3) + actioncable (= 7.1.3.3) + actionmailbox (= 7.1.3.3) + actionmailer (= 7.1.3.3) + actionpack (= 7.1.3.3) + actiontext (= 7.1.3.3) + actionview (= 7.1.3.3) + activejob (= 7.1.3.3) + activemodel (= 7.1.3.3) + activerecord (= 7.1.3.3) + activestorage (= 7.1.3.3) + activesupport (= 7.1.3.3) bundler (>= 1.15.0) - railties (= 7.1.3.1) + railties (= 7.1.3.3) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -159,37 +159,36 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.1) - actionpack (= 7.1.3.1) - activesupport (= 7.1.3.1) + railties (7.1.3.3) + actionpack (= 7.1.3.3) + activesupport (= 7.1.3.3) irb rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) - rake (13.1.0) + rake (13.2.1) rdoc (6.6.3.1) psych (>= 4.0.0) - redis (5.0.7) - redis-client (>= 0.9.0) - redis-client (0.17.0) + redis (5.2.0) + redis-client (>= 0.22.0) + redis-client (0.22.2) connection_pool - reline (0.4.3) + reline (0.5.7) io-console (~> 0.5) - ruby2_keywords (0.0.5) stringio (3.1.0) thor (1.3.1) timeout (0.4.1) trilogy (2.8.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2021.5) + tzinfo-data (1.2024.1) tzinfo (>= 1.0.0) webrick (1.8.1) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.6.13) + zeitwerk (2.6.14) PLATFORMS arm64-darwin-20 @@ -198,15 +197,12 @@ PLATFORMS DEPENDENCIES oj (~> 3.16) - pg (= 1.5.4) + pg (~> 1.5) puma (~> 6.4) rails (~> 7.1.3) redis (~> 5.0) trilogy (~> 2.8.1) tzinfo-data -RUBY VERSION - ruby 3.2.2p53 - BUNDLED WITH 2.3.3 From 78cd8a7505a8d9a629ca279ad11ef4ebd058679f Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Thu, 23 May 2024 16:49:38 +0200 Subject: [PATCH 0620/1766] Micronaut performance improvements (#9049) * Performance improvements * CR * Correct benchmark_config.json --- .../Java/micronaut/benchmark_config.json | 48 +++--- .../controller/AsyncBenchmarkController.java | 18 +-- .../controller/BenchmarkController.java | 3 - .../benchmark/filter/ServerHeaderFilter.java | 5 +- .../main/resources/application-benchmark.yml | 1 + .../src/main/resources/application-common.yml | 5 +- .../micronaut/micronaut-data-jdbc.dockerfile | 4 +- .../micronaut-data-mongodb.dockerfile | 4 +- .../micronaut/micronaut-data-r2dbc.dockerfile | 4 +- .../Java/micronaut/micronaut-jdbc.dockerfile | 4 +- .../Java/micronaut/micronaut-r2dbc.dockerfile | 4 +- .../AbstractVertxSqlClientRepository.java | 16 +- .../main/java/benchmark/ConnectionHolder.java | 140 ++++++++++++++++++ .../main/java/benchmark/PgClientFactory.java | 58 -------- .../benchmark/VertxPgFortuneRepository.java | 5 - .../benchmark/VertxPgWorldRepository.java | 7 +- .../Java/micronaut/micronaut.dockerfile | 4 +- frameworks/Java/micronaut/run_benchmark.sh | 1 - 18 files changed, 198 insertions(+), 133 deletions(-) create mode 100644 frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java delete mode 100644 frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/PgClientFactory.java diff --git a/frameworks/Java/micronaut/benchmark_config.json b/frameworks/Java/micronaut/benchmark_config.json index 215f6a90565..a72758e6862 100755 --- a/frameworks/Java/micronaut/benchmark_config.json +++ b/frameworks/Java/micronaut/benchmark_config.json @@ -16,9 +16,9 @@ "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Raw", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut Vertx PG Client", @@ -39,9 +39,9 @@ "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Raw", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut Vertx PG Client GraalVM", @@ -60,9 +60,9 @@ "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Raw", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut JDBC", @@ -81,9 +81,9 @@ "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Raw", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut JDBC GraalVM", @@ -102,9 +102,9 @@ "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Raw", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut R2DBC", @@ -123,9 +123,9 @@ "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Raw", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut R2DBC GraalVM", @@ -139,14 +139,14 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "fullstack", "database": "Postgres", "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Micro", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut Data JDBC", @@ -160,14 +160,14 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "fullstack", "database": "Postgres", "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Micro", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut Data JDBC GraalVM", @@ -181,14 +181,14 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "fullstack", "database": "MongoDB", "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Micro", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut Data MongoDB", @@ -202,14 +202,14 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "fullstack", "database": "MongoDB", "framework": "Micronaut", "language": "Java", "flavor": "None", - "orm": "raw", + "orm": "Micro", "platform": "Netty", - "webserver": "None", + "webserver": "Netty", "os": "Linux", "database_os": "Linux", "display_name": "Micronaut Data MongoDB GraalVM", 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 df8824142a8..7e40c36a204 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,15 +9,12 @@ 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; @@ -27,14 +24,11 @@ public class AsyncBenchmarkController extends AbstractBenchmarkController { private final AsyncWorldRepository worldRepository; private final AsyncFortuneRepository fortuneRepository; - private final Executor executor; public AsyncBenchmarkController(AsyncWorldRepository worldRepository, - AsyncFortuneRepository fortuneRepository, - @Named(TaskExecutors.BLOCKING) Executor executor) { + AsyncFortuneRepository fortuneRepository) { this.worldRepository = worldRepository; this.fortuneRepository = fortuneRepository; - this.executor = executor; } @Get("/prepare-data-for-test") @@ -45,7 +39,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()).thenApplyAsync(world -> world, executor); + return worldRepository.findById(randomId()); } // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#multiple-database-queries @@ -56,20 +50,20 @@ public CompletionStage> queries(@QueryValue String queries) { for (int i = 0; i < count; i++) { ids.add(randomId()); } - return worldRepository.findByIds(ids).thenApplyAsync(worlds -> worlds, executor); + return worldRepository.findByIds(ids); } // 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().thenApplyAsync(fortuneList -> { + return fortuneRepository.findAll().thenApply(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 @@ -80,7 +74,7 @@ public CompletionStage> updates(@QueryValue String queries) { world.setRandomNumber(randomWorldNumber()); } worlds.sort(Comparator.comparingInt(World::getId)); // Avoid deadlock - return worldRepository.updateAll(worlds).thenApplyAsync(ignore -> worlds, executor); + return worldRepository.updateAll(worlds).thenApply(ignore -> worlds); }); } diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java index 5f23b1ee017..c00eed41fb4 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java @@ -9,8 +9,6 @@ import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.QueryValue; -import io.micronaut.scheduling.TaskExecutors; -import io.micronaut.scheduling.annotation.ExecuteOn; import views.fortunes; import java.util.ArrayList; @@ -20,7 +18,6 @@ import static java.util.Comparator.comparing; -@ExecuteOn(TaskExecutors.IO) @Requires(beans = {WorldRepository.class, FortuneRepository.class}) @Controller public class BenchmarkController extends AbstractBenchmarkController { diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/filter/ServerHeaderFilter.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/filter/ServerHeaderFilter.java index 8a20f9c765c..0a89778bfef 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/filter/ServerHeaderFilter.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/filter/ServerHeaderFilter.java @@ -4,7 +4,9 @@ import io.micronaut.http.annotation.Filter; import io.micronaut.http.annotation.ResponseFilter; import io.micronaut.http.annotation.ServerFilter; +import io.micronaut.http.netty.NettyHttpHeaders; import io.micronaut.scheduling.annotation.Scheduled; +import io.netty.handler.codec.http.HttpHeaderNames; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -25,7 +27,8 @@ public void setDateHeader() { @ResponseFilter public void addDateHeader(MutableHttpResponse mutableHttpResponse) { - mutableHttpResponse.header("Date", dateHeader); + NettyHttpHeaders nettyHttpHeaders = (NettyHttpHeaders) mutableHttpResponse.getHeaders(); + nettyHttpHeaders.setUnsafe(HttpHeaderNames.DATE, dateHeader); } } \ No newline at end of file diff --git a/frameworks/Java/micronaut/common/src/main/resources/application-benchmark.yml b/frameworks/Java/micronaut/common/src/main/resources/application-benchmark.yml index efff28fbc46..4a1882287dc 100644 --- a/frameworks/Java/micronaut/common/src/main/resources/application-benchmark.yml +++ b/frameworks/Java/micronaut/common/src/main/resources/application-benchmark.yml @@ -5,6 +5,7 @@ micronaut: port: 8080 server-header: Micronaut date-header: false + validate-url: false http: client: read-timeout: 60s diff --git a/frameworks/Java/micronaut/common/src/main/resources/application-common.yml b/frameworks/Java/micronaut/common/src/main/resources/application-common.yml index ab67403287e..0e7745c6b29 100644 --- a/frameworks/Java/micronaut/common/src/main/resources/application-common.yml +++ b/frameworks/Java/micronaut/common/src/main/resources/application-common.yml @@ -5,6 +5,7 @@ micronaut: port: 8080 server-header: Micronaut date-header: false + validate-url: false netty: resource-leak-detector-level: DISABLED @@ -17,7 +18,7 @@ datasources: driverClassName: org.postgresql.Driver db-type: postgresql dialect: POSTGRES - maximum-pool-size: 48 + maximum-pool-size: 512 transaction-per-operation: false allow-connection-per-operation: true @@ -29,7 +30,7 @@ r2dbc: options: protocol: postgres initialSize: 0 # https://github.com/micronaut-projects/micronaut-data/issues/2136 - maxSize: 48 + maxSize: 512 mongodb: package-names: diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile index 490d61c7eca..53b8546389f 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.7.0-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-jdbc:build -x test --no-daemon -FROM openjdk:21 +FROM openjdk:22 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/libs/micronaut-data-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile index 38dfebc28bb..4e8c3f928f7 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.7.0-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-mongodb:build -x test --no-daemon -FROM openjdk:21 +FROM openjdk:22 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/libs/micronaut-data-mongodb-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile index 354616d4e94..04f065d8288 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.7.0-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-r2dbc:build -x test --no-daemon -FROM openjdk:21 +FROM openjdk:22 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/libs/micronaut-data-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile index 775229a0f14..1d56f8a5a8a 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.7.0-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-jdbc:build -x test --no-daemon -FROM openjdk:21 +FROM openjdk:22 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-jdbc/build/libs/micronaut-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile index e7c2e227ac5..7bc182aa09c 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.7.0-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-r2dbc:build -x test --no-daemon -FROM openjdk:21 +FROM openjdk:22 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-r2dbc/build/libs/micronaut-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/AbstractVertxSqlClientRepository.java b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/AbstractVertxSqlClientRepository.java index 8f76190eaa4..26e993fe9e6 100644 --- a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/AbstractVertxSqlClientRepository.java +++ b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/AbstractVertxSqlClientRepository.java @@ -7,6 +7,7 @@ import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.SqlClient; import io.vertx.sqlclient.Tuple; +import jakarta.inject.Inject; import java.util.ArrayList; import java.util.List; @@ -15,23 +16,20 @@ public class AbstractVertxSqlClientRepository { - protected final Pool client; - - public AbstractVertxSqlClientRepository(Pool client) { - this.client = client; - } + @Inject + protected ConnectionHolder holder; protected CompletionStage execute(String sql) { - return client.preparedQuery(sql).execute().toCompletionStage(); + return holder.get().flatMap(conn->conn.preparedQuery(sql).execute()).toCompletionStage(); } protected CompletionStage executeAndCollectOne(String sql, Tuple tuple, Function mapper) { - return client.preparedQuery(sql).execute(tuple).map(rows -> mapper.apply(rows.iterator().next())) + return holder.get().flatMap(conn->conn.preparedQuery(sql).execute(tuple).map(rows -> mapper.apply(rows.iterator().next()))) .toCompletionStage(); } protected CompletionStage> executeAndCollectList(String sql, Function mapper) { - return client.preparedQuery(sql).execute().map(rows -> { + return holder.get().flatMap(conn->conn.preparedQuery(sql).execute()).map(rows -> { List result = new ArrayList<>(rows.size()); for (Row row : rows) { result.add(mapper.apply(row)); @@ -52,7 +50,7 @@ protected Future> executeMany(SqlClient sqlClient, String sql, List< } protected CompletionStage executeBatch(String sql, List data) { - return client.preparedQuery(sql).executeBatch(data).toCompletionStage(); + return holder.get().flatMap(conn->conn.preparedQuery(sql).executeBatch(data)).toCompletionStage(); } } diff --git a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java new file mode 100644 index 00000000000..d471adc91c3 --- /dev/null +++ b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java @@ -0,0 +1,140 @@ +package benchmark; + +import io.micronaut.context.annotation.Property; +import io.netty.bootstrap.Bootstrap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFactory; +import io.netty.channel.EventLoop; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.ServerChannel; +import io.netty.channel.socket.DatagramChannel; +import io.netty.channel.socket.InternetProtocolFamily; +import io.netty.util.concurrent.FastThreadLocal; +import io.netty.util.internal.ThreadExecutorMap; +import io.vertx.core.Future; +import io.vertx.core.Vertx; +import io.vertx.core.datagram.DatagramSocketOptions; +import io.vertx.core.impl.VertxBuilder; +import io.vertx.core.net.ClientOptionsBase; +import io.vertx.core.net.NetServerOptions; +import io.vertx.core.spi.transport.Transport; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgConnection; +import io.vertx.sqlclient.PoolOptions; +import jakarta.inject.Singleton; + +import java.net.SocketAddress; +import java.util.concurrent.ThreadFactory; + +@Singleton +public class ConnectionHolder { + private final FastThreadLocal> conn = new FastThreadLocal<>(); + + @Property(name = "datasources.default.url") String url; + @Property(name = "datasources.default.username") String user; + @Property(name = "datasources.default.password") String password; + @Property(name = "datasources.default.maximum-pool-size") int maxPoolSize; + + public Future get() { + Future c = conn.get(); + if (c == null) { + + PgConnectOptions connectOptions = PgConnectOptions.fromUri(url.substring(5)) + .setUser(user) + .setPassword(password) + .setCachePreparedStatements(true) + .setTcpNoDelay(true) + .setTcpQuickAck(true) + .setPipeliningLimit(1024); + PoolOptions poolOptions = new PoolOptions(); + poolOptions.setMaxSize(maxPoolSize); + + VertxBuilder builder = new VertxBuilder() + .init(); + + EventLoop loop = (EventLoop) ThreadExecutorMap.currentExecutor(); + + Vertx vertx = builder + .findTransport(new ExistingTransport(builder.findTransport(), loop)) + .vertx(); + + c = PgConnection.connect(vertx, connectOptions); + conn.set(c); + } + return c; + } + + private record ExistingTransport(Transport transport, EventLoop loop) implements Transport { + + @Override + public boolean supportsDomainSockets() { + return transport.supportsDomainSockets(); + } + + @Override + public boolean supportFileRegion() { + return transport.supportFileRegion(); + } + + @Override + public boolean isAvailable() { + return transport.isAvailable(); + } + + @Override + public Throwable unavailabilityCause() { + return transport.unavailabilityCause(); + } + + @Override + public SocketAddress convert(io.vertx.core.net.SocketAddress address) { + return transport.convert(address); + } + + @Override + public io.vertx.core.net.SocketAddress convert(SocketAddress address) { + return transport.convert(address); + } + + @Override + public EventLoopGroup eventLoopGroup(int type, int nThreads, ThreadFactory threadFactory, int ignoredIoRatio) { + return loop; + } + + @Override + public DatagramChannel datagramChannel() { + return transport.datagramChannel(); + } + + @Override + public DatagramChannel datagramChannel(InternetProtocolFamily family) { + return transport.datagramChannel(family); + } + + @Override + public ChannelFactory channelFactory(boolean domainSocket) { + return transport.channelFactory(domainSocket); + } + + @Override + public ChannelFactory serverChannelFactory(boolean domainSocket) { + return transport.serverChannelFactory(domainSocket); + } + + @Override + public void configure(DatagramChannel channel, DatagramSocketOptions options) { + transport.configure(channel, options); + } + + @Override + public void configure(ClientOptionsBase options, boolean domainSocket, Bootstrap bootstrap) { + transport.configure(options, domainSocket, bootstrap); + } + + @Override + public void configure(NetServerOptions options, boolean domainSocket, ServerBootstrap bootstrap) { + transport.configure(options, domainSocket, bootstrap); + } + } +} diff --git a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/PgClientFactory.java b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/PgClientFactory.java deleted file mode 100644 index 3b10b483c42..00000000000 --- a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/PgClientFactory.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2017-2020 original authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package benchmark; - -import io.micronaut.context.annotation.Bean; -import io.micronaut.context.annotation.Factory; -import io.micronaut.context.annotation.Property; -import io.vertx.core.Vertx; -import io.vertx.core.VertxOptions; -import io.vertx.core.impl.VertxBuilder; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.pgclient.PgPool; -import io.vertx.sqlclient.PoolOptions; -import jakarta.inject.Singleton; - -/** - * The Factory for creating Vertx PG client. - */ -@Factory -public class PgClientFactory { - - @Singleton - @Bean(preDestroy = "close") - public PgPool client(@Property(name = "datasources.default.url") String url, - @Property(name = "datasources.default.username") String user, - @Property(name = "datasources.default.password") String password, - @Property(name = "datasources.default.maximum-pool-size") int maxPoolSize) { - - VertxOptions vertxOptions = new VertxOptions() - .setPreferNativeTransport(true); - - PgConnectOptions connectOptions = PgConnectOptions.fromUri(url.substring(5)) - .setUser(user) - .setPassword(password) - .setCachePreparedStatements(true) - .setTcpNoDelay(true) - .setTcpQuickAck(true) - .setPipeliningLimit(1024); - PoolOptions poolOptions = new PoolOptions(); - poolOptions.setMaxSize(maxPoolSize); - - Vertx vertx = new VertxBuilder(vertxOptions).init().vertx(); - return PgPool.pool(vertx, connectOptions, poolOptions); - } -} diff --git a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgFortuneRepository.java b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgFortuneRepository.java index 3515f9fc118..1c25569cd0f 100644 --- a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgFortuneRepository.java +++ b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgFortuneRepository.java @@ -2,7 +2,6 @@ import benchmark.model.Fortune; import benchmark.repository.AsyncFortuneRepository; -import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Tuple; import jakarta.inject.Singleton; @@ -14,10 +13,6 @@ @Singleton public class VertxPgFortuneRepository extends AbstractVertxSqlClientRepository implements AsyncFortuneRepository { - public VertxPgFortuneRepository(Pool client) { - super(client); - } - private CompletionStage createTable() { return execute("DROP TABLE IF EXISTS Fortune;") .thenCompose(ignore -> execute("CREATE TABLE Fortune (id INTEGER NOT NULL,message VARCHAR(255) NOT NULL);")); diff --git a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgWorldRepository.java b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgWorldRepository.java index c584b69d095..b1929d8833c 100644 --- a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgWorldRepository.java +++ b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/VertxPgWorldRepository.java @@ -2,7 +2,6 @@ import benchmark.model.World; import benchmark.repository.AsyncWorldRepository; -import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.Tuple; import jakarta.inject.Singleton; @@ -19,10 +18,6 @@ public class VertxPgWorldRepository extends AbstractVertxSqlClientRepository imp private static final Function ROW_TO_WORLD_MAPPER = row -> new World(row.getInteger(0), row.getInteger(1)); - public VertxPgWorldRepository(Pool client) { - super(client); - } - private CompletionStage createTable() { return execute("DROP TABLE IF EXISTS World;").thenCompose(ignore -> execute("CREATE TABLE World (id INTEGER NOT NULL,randomNumber INTEGER NOT NULL);")); } @@ -44,7 +39,7 @@ public CompletionStage> findByIds(List ids) { for (Integer id : ids) { data.add(Tuple.of(id)); } - return client.withConnection(sqlConnection -> + return holder.get().flatMap(sqlConnection -> executeMany(sqlConnection, "SELECT * FROM world WHERE id = $1", data, ROW_TO_WORLD_MAPPER)) .toCompletionStage(); } diff --git a/frameworks/Java/micronaut/micronaut.dockerfile b/frameworks/Java/micronaut/micronaut.dockerfile index 1ca142d8266..ce7ff654f4b 100644 --- a/frameworks/Java/micronaut/micronaut.dockerfile +++ b/frameworks/Java/micronaut/micronaut.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.7.0-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-vertx-pg-client:build -x test --no-daemon -FROM openjdk:21 +FROM openjdk:22 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/libs/micronaut-vertx-pg-client-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/run_benchmark.sh b/frameworks/Java/micronaut/run_benchmark.sh index 4f8fccf3ba4..40e9572de48 100755 --- a/frameworks/Java/micronaut/run_benchmark.sh +++ b/frameworks/Java/micronaut/run_benchmark.sh @@ -3,7 +3,6 @@ JAVA_OPTIONS="-server \ -XX:+UseParallelGC \ -XX:+UseNUMA \ - -XX:+UseStringDeduplication \ -XX:-StackTraceInThrowable \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ From 4b22962d28fcd44be1e72fd779647ae6ad42296e Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Thu, 23 May 2024 13:40:10 -0700 Subject: [PATCH 0621/1766] [fsharp/oxpecker] Added db, queries and updates benchmarks (#9029) * Oxpecker framework * Updated Oxpecker version * Converted json to jsonChunked * [F#] Oxpecker, changed seralization to SpanJson, pre-saved text to utf8 * [F#] Oxpecker, fixed build * [F#] Oxpecker, added single row benchmark * [F#] Oxpecker, added single row benchmark configuration * [F#] Oxpecker, added multiple queries * [F#] Oxpecker, fixed build * [F#] Oxpecker, added multiple updates * [F#] Oxpecker, fixed build * Temp remove updates * Fix warnings * Fix warnings * Fix build * Fix warnings * Fix warnings * Uncommented updates * Fix build * Removed logs * Simplified display name * Small refactoring * Simplified configuration --- frameworks/FSharp/oxpecker/README.md | 1 + .../FSharp/oxpecker/benchmark_config.json | 5 +- frameworks/FSharp/oxpecker/config.toml | 3 + frameworks/FSharp/oxpecker/src/App/App.fsproj | 11 +- frameworks/FSharp/oxpecker/src/App/Program.fs | 164 +++++++++++++++--- .../src/App/runtimeconfig.template.json | 7 - 6 files changed, 152 insertions(+), 39 deletions(-) delete mode 100644 frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json diff --git a/frameworks/FSharp/oxpecker/README.md b/frameworks/FSharp/oxpecker/README.md index ecd2284661d..4f686292d12 100644 --- a/frameworks/FSharp/oxpecker/README.md +++ b/frameworks/FSharp/oxpecker/README.md @@ -19,6 +19,7 @@ This includes tests for plaintext, json, and fortunes HTML serialization. * [Oxpecker](https://github.com/Lanayx/Oxpecker) * [Dapper](https://github.com/DapperLib/Dapper) +* [SpanJson](https://github.com/Tornhoof/SpanJson) * ASP.NET Core ## Paths & Source for Tests diff --git a/frameworks/FSharp/oxpecker/benchmark_config.json b/frameworks/FSharp/oxpecker/benchmark_config.json index 56a862ac012..c0df28d86a3 100644 --- a/frameworks/FSharp/oxpecker/benchmark_config.json +++ b/frameworks/FSharp/oxpecker/benchmark_config.json @@ -6,6 +6,9 @@ "plaintext_url": "/plaintext", "json_url": "/json", "fortune_url": "/fortunes", + "db_url": "/db", + "query_url": "/queries/", + "update_url": "/updates/", "port": 8080, "approach": "Realistic", "classification": "Micro", @@ -18,7 +21,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "Oxpecker, Dapper", + "display_name": "Oxpecker", "notes": "", "versus": "aspcore" } diff --git a/frameworks/FSharp/oxpecker/config.toml b/frameworks/FSharp/oxpecker/config.toml index a3ca01bddc4..dd5e34c8b96 100644 --- a/frameworks/FSharp/oxpecker/config.toml +++ b/frameworks/FSharp/oxpecker/config.toml @@ -5,6 +5,9 @@ name = "oxpecker" urls.plaintext = "/plaintext" urls.json = "/json" urls.fortune = "/fortunes" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" approach = "Realistic" classification = "fullstack" database = "Postgres" diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index fcf2d0ccb3c..8dca02be01a 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -1,8 +1,8 @@ - + net8.0 - Exe + false @@ -10,13 +10,10 @@ - + - - - - + \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index 786581dee9e..e0c3f361286 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -1,8 +1,12 @@ namespace App +open System +open System.Collections.Generic +open System.Threading.Tasks +open Oxpecker + [] module Common = - open System [] type Fortune = @@ -14,8 +18,10 @@ module Common = [] let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" - let fortuneComparer a b = - String.CompareOrdinal(a.message, b.message) + let FortuneComparer = { + new IComparer with + member self.Compare(a,b) = String.CompareOrdinal(a.message, b.message) + } [] module HtmlViews = @@ -50,9 +56,10 @@ module HtmlViews = [] module HttpHandlers = - open Oxpecker open Dapper open Npgsql + open System.Text + open Microsoft.AspNetCore.Http let private extra = { @@ -60,53 +67,162 @@ module HttpHandlers = message = "Additional fortune added at request time." } + let private renderFortunes (ctx: HttpContext) dbFortunes = + let augmentedData = [| + yield! dbFortunes + extra + |] + Array.Sort(augmentedData, FortuneComparer) + augmentedData |> HtmlViews.fortunes |> ctx.WriteHtmlView + let private fortunes : EndpointHandler = fun ctx -> task { use conn = new NpgsqlConnection(ConnectionString) - let! data = conn.QueryAsync("SELECT id, message FROM fortune") - let augmentedData = [| - yield! data - extra - |] - augmentedData |> Array.sortInPlaceWith fortuneComparer - let view = HtmlViews.fortunes augmentedData - return! ctx.WriteHtmlView view + let! dbFortunes = conn.QueryAsync("SELECT id, message FROM fortune") + return! renderFortunes ctx dbFortunes + } + + [] + [] + type World = + { + id: int + randomnumber: int + } + + let private readSingleRow (conn: NpgsqlConnection) = + conn.QueryFirstOrDefaultAsync( + "SELECT id, randomnumber FROM world WHERE id = @Id", + {| Id = Random.Shared.Next(1, 10001) |} + ) + + let private parseQueries (ctx: HttpContext) = + match ctx.TryGetRouteValue("count") with + | Some q -> + match Int32.TryParse q with + | true, q when q > 1 -> if q < 500 then q else 500 + | _, _ -> 1 + | _ -> 1 + + let private singleQuery : EndpointHandler = + fun ctx -> + task { + use conn = new NpgsqlConnection(ConnectionString) + let! result = readSingleRow conn + return! ctx.WriteJsonChunked result } - let endpoints : Endpoint[] = + let private multipleQueries : EndpointHandler = + fun ctx -> + let count = parseQueries ctx + let results = Array.zeroCreate count + task { + use conn = new NpgsqlConnection(ConnectionString) + do! conn.OpenAsync() + for i in 0..results.Length-1 do + let! result = readSingleRow conn + results[i] <- result + return! ctx.WriteJsonChunked results + } + + let private maxBatch = 500 + let mutable private queries = Array.zeroCreate (maxBatch + 1) + + let private batchUpdateString batchSize = + match queries[batchSize] with + | null -> + let lastIndex = batchSize - 1 + let sb = StringBuilder() + sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ") |> ignore + for i in 0..lastIndex-1 do + sb.AppendFormat("(@Id_{0}, @Rn_{0}), ", i) |> ignore + sb.AppendFormat("(@Id_{0}, @Rn_{0}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id", lastIndex) |> ignore + let result = sb.ToString() + queries[batchSize] <- result + result + | q -> q + + let private multipleUpdates : EndpointHandler = + fun ctx -> + let count = parseQueries ctx + let results = Array.zeroCreate count + task { + use conn = new NpgsqlConnection(ConnectionString) + do! conn.OpenAsync() + for i in 0..results.Length-1 do + let! result = readSingleRow conn + results[i] <- result + let parameters = Dictionary() + for i in 0..results.Length-1 do + let randomNumber = Random.Shared.Next(1, 10001) + parameters[$"@Rn_{i}"] <- randomNumber + parameters[$"@Id_{i}"] <- results[i].id + results[i] <- { results[i] with randomnumber = randomNumber } + let! _ = conn.ExecuteAsync(batchUpdateString count, parameters) + return! ctx.WriteJsonChunked results + } + + let utf8Const (s: string): EndpointHandler = + let result = s |> Encoding.UTF8.GetBytes + fun ctx -> + ctx.SetContentType("text/plain") + ctx.WriteBytes(result) + + let endpoints = [| - route "/plaintext" <| text "Hello, World!" + route "/plaintext" <| utf8Const "Hello, World!" route "/json"<| jsonChunked {| message = "Hello, World!" |} route "/fortunes" fortunes + route "/db" singleQuery + route "/queries/{count?}" multipleQueries + route "/updates/{count?}" multipleUpdates |] module Main = + open SpanJson + open Microsoft.AspNetCore.Http open Microsoft.AspNetCore.Builder open Microsoft.AspNetCore.Hosting open Microsoft.Extensions.DependencyInjection - open Oxpecker open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging + open System.Buffers + + type SpanJsonSerializer() = + interface Serializers.IJsonSerializer with + member this.Serialize(value, ctx, chunked) = + ctx.Response.ContentType <- "application/json" + if chunked then + if ctx.Request.Method <> HttpMethods.Head then + JsonSerializer.Generic.Utf8.SerializeAsync<_>(value, stream = ctx.Response.Body).AsTask() + else + Task.CompletedTask + else + task { + let buffer = JsonSerializer.Generic.Utf8.SerializeToArrayPool<_>(value) + ctx.Response.Headers.ContentLength <- buffer.Count + if ctx.Request.Method <> HttpMethods.Head then + do! ctx.Response.Body.WriteAsync(buffer) + ArrayPool.Shared.Return(buffer.Array) + else + return () + } + member this.Deserialize _ = + failwith "Not implemented" [] let main args = - let builder = WebApplication.CreateBuilder(args) - builder.Services .AddRouting() - .AddOxpecker() |> ignore - + .AddOxpecker() + .AddSingleton(SpanJsonSerializer()) + |> ignore builder.Logging.ClearProviders() |> ignore - builder.WebHost.ConfigureKestrel(fun options -> options.AllowSynchronousIO <- true) |> ignore - let app = builder.Build() - app.UseRouting() .UseOxpecker HttpHandlers.endpoints |> ignore - app.Run() - 0 \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json b/frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json deleted file mode 100644 index 79721130fd5..00000000000 --- a/frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "configProperties": { - "System.GC.Server": true, - "System.GC.NoAffinitize": true, - "System.GC.HeapCount": 2 - } - } \ No newline at end of file From 53940a9f2b225e467ca33fa05a55b285e5b8c463 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 May 2024 15:12:30 +0000 Subject: [PATCH 0622/1766] Bump pug from 2.0.1 to 3.0.2 in /frameworks/JavaScript/express Bumps [pug](https://github.com/pugjs/pug) from 2.0.1 to 3.0.2. - [Release notes](https://github.com/pugjs/pug/releases) - [Commits](https://github.com/pugjs/pug/compare/pug@2.0.1...pug@3.0.2) --- updated-dependencies: - dependency-name: pug dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 0fe00038a27..942aff2904c 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -11,7 +11,7 @@ "mysql2": "3.9.7", "pg": "8.5.0", "pg-promise": "10.7.3", - "pug": "2.0.1", + "pug": "3.0.2", "postgres": "^3.4.3", "slow-json-stringify": "^2.0.1", "sequelize": "6.29.0" From dc49040f96011a2fcd651edfe5c7795392dd9c1a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 May 2024 17:58:20 +0200 Subject: [PATCH 0623/1766] [crystal|toro] Upgrade dependencies (#9062) --- frameworks/Crystal/toro/shard.yml | 6 +++--- frameworks/Crystal/toro/toro.cr | 2 +- frameworks/Crystal/toro/toro.dockerfile | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Crystal/toro/shard.yml b/frameworks/Crystal/toro/shard.yml index 1c84495533e..9a8953d4d04 100644 --- a/frameworks/Crystal/toro/shard.yml +++ b/frameworks/Crystal/toro/shard.yml @@ -4,13 +4,13 @@ version: 0.1.0 dependencies: toro: github: soveran/toro - version: 0.4.1 + version: 0.5.1 pg: github: will/crystal-pg - version: 0.20.0 + version: 0.28.0 targets: toro: main: toro.cr -crystal: 0.34.0 \ No newline at end of file +crystal: 1.12.1 diff --git a/frameworks/Crystal/toro/toro.cr b/frameworks/Crystal/toro/toro.cr index db1c3cef3ba..7ff01b5a7c7 100644 --- a/frameworks/Crystal/toro/toro.cr +++ b/frameworks/Crystal/toro/toro.cr @@ -129,6 +129,6 @@ class App < Toro::Router end # Start the app on port 8080. -App.run(8080) do |server| +App.run do |server| server.listen("0.0.0.0", 8080, reuse_port: true) end diff --git a/frameworks/Crystal/toro/toro.dockerfile b/frameworks/Crystal/toro/toro.dockerfile index b4f0677f11c..ce47dad0746 100644 --- a/frameworks/Crystal/toro/toro.dockerfile +++ b/frameworks/Crystal/toro/toro.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:0.34.0 +FROM crystallang/crystal:1.12.1 WORKDIR /toro COPY views views From 553705c4b25ebb4f026640539fa65ca65c232f5f Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 May 2024 17:58:30 +0200 Subject: [PATCH 0624/1766] [crystal] Upgrade dependencies (#9059) --- frameworks/Crystal/crystal/crystal-radix.dockerfile | 2 +- frameworks/Crystal/crystal/crystal.dockerfile | 2 +- frameworks/Crystal/crystal/shard.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Crystal/crystal/crystal-radix.dockerfile b/frameworks/Crystal/crystal/crystal-radix.dockerfile index aaef65c87d9..deda5e21148 100644 --- a/frameworks/Crystal/crystal/crystal-radix.dockerfile +++ b/frameworks/Crystal/crystal/crystal-radix.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.0.0 +FROM crystallang/crystal:1.12.1 WORKDIR /crystal COPY shard.yml shard.yml diff --git a/frameworks/Crystal/crystal/crystal.dockerfile b/frameworks/Crystal/crystal/crystal.dockerfile index ab51249b129..678dd214cd4 100644 --- a/frameworks/Crystal/crystal/crystal.dockerfile +++ b/frameworks/Crystal/crystal/crystal.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.0.0 +FROM crystallang/crystal:1.12.1 WORKDIR /crystal COPY shard.yml shard.yml diff --git a/frameworks/Crystal/crystal/shard.yml b/frameworks/Crystal/crystal/shard.yml index 6bea5905b84..dc20f8e0679 100644 --- a/frameworks/Crystal/crystal/shard.yml +++ b/frameworks/Crystal/crystal/shard.yml @@ -7,7 +7,7 @@ crystal: "~> 1.0" dependencies: pg: github: will/crystal-pg - version: ~> 0.23.2 + version: ~> 0.28.0 radix: github: luislavena/radix version: ~> 0.4.1 From 3b6fc02eab1500353b0cef0c162b367d14965187 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 May 2024 18:41:42 +0200 Subject: [PATCH 0625/1766] [ruby/roda] Use Ruby 3.4-rc (#9067) | name| branch_name|plaintext|update| json| db|query|fortune|weighted_score| |-----------|-------------------------|---------|------|------|-----|-----|-------|--------------| |roda-sequel| master| 112094| 10588|111179|33741|18274| 23871| 1406| |roda-sequel| roda/ruby-3.4-rc| 124965| 10745|108288|46846|21523| 27565| 1524| --- .../roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 1cd10beab1e..3cde40eaa97 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 +FROM ruby:3.4-rc 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 a6fa24be8e6..c74c9b9f0d3 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 +FROM ruby:3.4-rc 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 223d23a8d75..cda64c5c29b 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 +FROM ruby:3.4-rc 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 ad4283ec2e6..efa9d35597e 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 +FROM ruby:3.4-rc ADD ./ /roda-sequel WORKDIR /roda-sequel From 1e36e378f5a49226f4212d61055d96f27fa59795 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 May 2024 18:41:52 +0200 Subject: [PATCH 0626/1766] [ruby/rack] Use Ruby 3.4-rc (#9066) Passenger doesn't seem to support Ruby 3.4 yet. +-----+-------------------------+---------+------+------+-----+-----+-------+--------------+ | name| branch_name|plaintext|update| json| db|query|fortune|weighted_score| +-----+-------------------------+---------+------+------+-----+-----+-------+--------------+ | rack| master| 122790| 12419|114056|31397|17953| 22416| 1519| | rack| rack/ruby-3.4-rc| 129116| 16564|134504|44139|23214| 30169| 1992| +-----+-------------------------+---------+------+------+-----+-----+-------+--------------+ --- .../rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 2 +- frameworks/Ruby/rack/rack-falcon.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 2 +- frameworks/Ruby/rack/rack.dockerfile | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) 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 e89d397e9db..a3aca7b79bc 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 +FROM ruby:3.4-rc ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index f58460afba4..8033d74c31a 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 +FROM ruby:3.4-rc 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 0f7325a523f..6df05c0c2b6 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 +FROM ruby:3.4-rc ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index b52fbfc93bb..470d92aa4b3 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 +FROM ruby:3.4-rc ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index 9e624e43fa8..ef5a63a10e7 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index b5bb2ffbbd6..bc4807e5427 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 4ddda8e02c5..5b51b2ef1e0 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 From e4c47156023267bbf724dcfd33c6443642814d50 Mon Sep 17 00:00:00 2001 From: lospejos Date: Tue, 28 May 2024 19:42:06 +0300 Subject: [PATCH 0627/1766] Bump deps versions (#9064) * Bumped version for Java, Jooby, Maven and other libraries/dependencies * Bumped dependencies versions * Bumped dependencies versions --- frameworks/Java/jooby/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index 467b52f6259..338f8ca065d 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,10 +11,10 @@ jooby - 3.1.1 - 4.1.109.Final + 3.1.2 + 4.1.110.Final 2.0.2 - 42.7.2 + 42.7.3 UTF-8 21 21 @@ -42,7 +42,7 @@ com.mysql mysql-connector-j - 8.3.0 + 8.4.0 @@ -55,7 +55,7 @@ io.vertx vertx-pg-client - 4.5.4 + 4.5.7 From da919d93e4be4396fc9c4426c5f7d48e4ec34e28 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 May 2024 18:42:18 +0200 Subject: [PATCH 0628/1766] [crystal|lucky] Fix build (#9060) --- frameworks/Crystal/lucky/lucky.dockerfile | 2 +- frameworks/Crystal/lucky/shard.lock | 48 +++++++++++-------- frameworks/Crystal/lucky/shard.yml | 6 ++- .../actions/mixins/add_required_headers.cr | 1 - 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/frameworks/Crystal/lucky/lucky.dockerfile b/frameworks/Crystal/lucky/lucky.dockerfile index 6e849625ca8..8309958ace4 100644 --- a/frameworks/Crystal/lucky/lucky.dockerfile +++ b/frameworks/Crystal/lucky/lucky.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.1.0 +FROM crystallang/crystal:1.12.1 WORKDIR /lucky COPY shard.lock shard.lock diff --git a/frameworks/Crystal/lucky/shard.lock b/frameworks/Crystal/lucky/shard.lock index ec0cee06660..86720033909 100644 --- a/frameworks/Crystal/lucky/shard.lock +++ b/frameworks/Crystal/lucky/shard.lock @@ -2,11 +2,15 @@ version: 2.0 shards: avram: git: https://github.com/luckyframework/avram.git - version: 0.21.0 + version: 1.2.0 backtracer: git: https://github.com/sija/backtracer.cr.git - version: 1.2.1 + version: 1.2.2 + + cadmium_transliterator: + git: https://github.com/cadmiumcr/transliterator.git + version: 0.1.0+git.commit.46c4c14594057dbcfaf27e7e7c8c164d3f0ce3f1 cry: git: https://github.com/luckyframework/cry.git @@ -14,53 +18,57 @@ shards: db: git: https://github.com/crystal-lang/crystal-db.git - version: 0.10.1 + version: 0.13.1 dexter: git: https://github.com/luckyframework/dexter.git - version: 0.3.3 + version: 0.3.4 exception_page: git: https://github.com/crystal-loot/exception_page.git - version: 0.2.0 - - future: - git: https://github.com/crystal-community/future.cr.git - version: 1.0.0+git.commit.9fe168418c6884cb3552c13b004763eb4815ceb9 + version: 0.4.1 habitat: git: https://github.com/luckyframework/habitat.git - version: 0.4.7 + version: 0.4.8 lucky: git: https://github.com/luckyframework/lucky.git - version: 0.28.0 + version: 1.2.0 + + lucky_cache: + git: https://github.com/luckyframework/lucky_cache.git + version: 0.1.1 lucky_router: git: https://github.com/luckyframework/lucky_router.git - version: 0.5.0 + version: 0.5.2 lucky_task: git: https://github.com/luckyframework/lucky_task.git - version: 0.1.0 + version: 0.3.0 + + lucky_template: + git: https://github.com/luckyframework/lucky_template.git + version: 0.2.0 pg: git: https://github.com/will/crystal-pg.git - version: 0.24.0 + version: 0.28.0 pulsar: git: https://github.com/luckyframework/pulsar.git - version: 0.2.2 + version: 0.2.3 shell-table: git: https://github.com/luckyframework/shell-table.cr.git - version: 0.9.3+git.commit.fefbc8b19d18630660b2653de755217597808b1b + version: 0.9.3 - teeplate: - git: https://github.com/luckyframework/teeplate.git - version: 0.8.3 + splay_tree_map: + git: https://github.com/wyhaines/splay_tree_map.cr.git + version: 0.2.2 wordsmith: git: https://github.com/luckyframework/wordsmith.git - version: 0.3.0 + version: 0.4.0 diff --git a/frameworks/Crystal/lucky/shard.yml b/frameworks/Crystal/lucky/shard.yml index dd33a9517fe..c5afbdd49fd 100644 --- a/frameworks/Crystal/lucky/shard.yml +++ b/frameworks/Crystal/lucky/shard.yml @@ -8,9 +8,11 @@ targets: bench: main: src/bench.cr -crystal: ">= 1.0.0" +crystal: ">= 1.12.1" dependencies: + avram: + github: luckyframework/avram lucky: github: luckyframework/lucky - version: ~> 0.28.0 + version: ~> 1.2.0 diff --git a/frameworks/Crystal/lucky/src/actions/mixins/add_required_headers.cr b/frameworks/Crystal/lucky/src/actions/mixins/add_required_headers.cr index 32d0d957f2c..8c076dcb84e 100644 --- a/frameworks/Crystal/lucky/src/actions/mixins/add_required_headers.cr +++ b/frameworks/Crystal/lucky/src/actions/mixins/add_required_headers.cr @@ -5,7 +5,6 @@ module AddRequiredHeaders def add_required_headers response.headers["Server"] = "Lucky" - response.headers["Date"] = HTTP.format_time(Time.local) continue end end From 7624406e0628754641d0a0a71b3b5bf9865da8d5 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 May 2024 18:42:52 +0200 Subject: [PATCH 0629/1766] [ruby/rack] Use autotune for Puma database connections (#8536) Alos decrease the KB_PER_WORKER as this is a small application. +--------+---------+------+------+-----+-----+-------+--------------+ |threads |plaintext|update| json| db|query|fortune|weighted_score| +--------+---------+------+------+-----+-----+-------+--------------+ | 32| 145031| 11936|122017|27001|18156| 23712| 1500| | 2| 126527| 11878|141483|33525|20515| 27725| 1591| | 1| 126701| 12923|133573|31402|19468| 24894| 1617| | 5| 34445| 15098|103356|29189|23860| 22518| 1802| | 5| 34440| 16363|114751|29820|20933| 24349| 1845| +--------+---------+------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/rack/config/auto_tune.rb | 2 +- frameworks/Ruby/rack/config/puma.rb | 2 +- frameworks/Ruby/rack/hello_world.rb | 9 +++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/rack/config/auto_tune.rb b/frameworks/Ruby/rack/config/auto_tune.rb index 476ed1a45bd..1e075f56911 100755 --- a/frameworks/Ruby/rack/config/auto_tune.rb +++ b/frameworks/Ruby/rack/config/auto_tune.rb @@ -7,7 +7,7 @@ # MAX_THREADS, add threads per process to reach MAX_THREADS. require 'etc' -KB_PER_WORKER = 128 * 1_024 # average of peak PSS of single-threaded processes (watch smem -k) +KB_PER_WORKER = 64 * 1_024 # average of peak PSS of single-threaded processes (watch smem -k) MIN_WORKERS = 2 MAX_WORKERS_PER_VCPU = 1.25 # virtual/logical MIN_THREADS_PER_WORKER = 1 diff --git a/frameworks/Ruby/rack/config/puma.rb b/frameworks/Ruby/rack/config/puma.rb index 83118c34761..4b5a210d689 100644 --- a/frameworks/Ruby/rack/config/puma.rb +++ b/frameworks/Ruby/rack/config/puma.rb @@ -6,7 +6,7 @@ # FWBM only... use the puma_auto_tune gem in production! num_workers, num_threads = auto_tune - +num_threads = [num_threads, 32].min before_fork do Sequel::DATABASES.each(&:disconnect) diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index d6886797fc0..be1cfe31a3e 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -54,8 +54,13 @@ class HelloWorld ' def initialize - # auto_tune - max_connections = 512 + if defined?(Puma) + num_workers, num_threads = auto_tune + num_threads = [num_threads, 32].min + max_connections = num_workers * num_threads + else + max_connections = 512 + end @db = PgDb.new(DEFAULT_DATABASE_URL, max_connections) end From 85f1341bacc0c68811f84340ab8d5b26d36fffcb Mon Sep 17 00:00:00 2001 From: Sergio del Amo Date: Tue, 28 May 2024 18:43:21 +0200 Subject: [PATCH 0630/1766] Micronaut Framework 4.4.3 (#9061) --- 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 7c1acd121c6..6d8a8be3f5c 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion=4.4.2 +micronautVersion=4.4.3 From 09cca5aa451458440e183f7e51751cd3b9469ec7 Mon Sep 17 00:00:00 2001 From: Nate Date: Tue, 28 May 2024 10:37:30 -0700 Subject: [PATCH 0631/1766] Fix Reverse order (#9069) * Add --reverse-order option and switch order after each run on citrine * Move reverse ordering to startup script since we run shutdown script twice --- toolset/continuous/tfb-startup.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/toolset/continuous/tfb-startup.sh b/toolset/continuous/tfb-startup.sh index b0be7622bf5..866d68135cc 100644 --- a/toolset/continuous/tfb-startup.sh +++ b/toolset/continuous/tfb-startup.sh @@ -25,6 +25,12 @@ docker build -t techempower/tfb \ --build-arg USER_ID=$(id -u) \ --build-arg GROUP_ID=$(id -g) . +if [ -z "$TFB_RUN_ORDER" ]; then + export TFB_RUN_ORDER="reverse" +else + unset TFB_RUN_ORDER +fi + echo "running tfb docker image" docker run \ -e USER_ID=$(id -u) \ From e865dc4a51120500ec9d61104e6afe88755eac6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 13:31:35 -0700 Subject: [PATCH 0632/1766] Bump pug from 3.0.2 to 3.0.3 in /frameworks/JavaScript/express (#9068) Bumps [pug](https://github.com/pugjs/pug) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/pugjs/pug/releases) - [Commits](https://github.com/pugjs/pug/compare/pug@3.0.2...pug@3.0.3) --- updated-dependencies: - dependency-name: pug dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 942aff2904c..f898dd3cece 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -11,7 +11,7 @@ "mysql2": "3.9.7", "pg": "8.5.0", "pg-promise": "10.7.3", - "pug": "3.0.2", + "pug": "3.0.3", "postgres": "^3.4.3", "slow-json-stringify": "^2.0.1", "sequelize": "6.29.0" From 00242c7b9943c0b7a1409dacb94765786a65c95f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 May 2024 18:56:11 +0000 Subject: [PATCH 0633/1766] Bump mysql2 from 2.1.0 to 3.9.8 in /frameworks/TypeScript/nest Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 2.1.0 to 3.9.8. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v2.1.0...v3.9.8) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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..fe27e6fc40b 100644 --- a/frameworks/TypeScript/nest/package.json +++ b/frameworks/TypeScript/nest/package.json @@ -26,7 +26,7 @@ "handlebars": "4.7.3", "hbs": "4.1.0", "mongodb": "3.5.4", - "mysql2": "2.1.0", + "mysql2": "3.9.8", "pg": "8.5.1", "point-of-view": "3.7.2", "reflect-metadata": "0.1.13", From c5235ce9d72aa9f3fb84e2462ff2408224d89b1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 May 2024 19:08:24 +0000 Subject: [PATCH 0634/1766] Bump mysql2 from 3.9.7 to 3.9.8 in /frameworks/JavaScript/express Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.7 to 3.9.8. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.7...v3.9.8) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index f898dd3cece..32ea58ae528 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -8,7 +8,7 @@ "escape-html": "1.0.3", "express": "4.18.2", "mongoose": "8.3.2", - "mysql2": "3.9.7", + "mysql2": "3.9.8", "pg": "8.5.0", "pg-promise": "10.7.3", "pug": "3.0.3", From 176adc514bc44655697ce92c1676ab20b95b7287 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sat, 1 Jun 2024 22:37:40 +0800 Subject: [PATCH 0635/1766] upgrade smart-servlet to 1.4 --- frameworks/Java/smart-socket/pom.xml | 2 +- .../src/main/java/org/smartboot/http/Bootstrap.java | 1 + .../src/main/java/org/smartboot/servlet/Bootstrap.java | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 376f82878f7..8904208b91e 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 17 17 2.17.1 - 1.0-SNAPSHOT + 1.4 5.0.0 0.9.23 diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 3d26a672e59..06753113440 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -51,6 +51,7 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio HttpBootstrap bootstrap = new HttpBootstrap(); bootstrap.configuration() .threadNum(cpuNum) + .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) 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 681ad1a7593..e92979fed49 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 @@ -17,7 +17,7 @@ public class Bootstrap { public static void main(String[] args) throws Throwable { ContainerRuntime containerRuntime = new ContainerRuntime(); // plaintext - ServletContextRuntime applicationRuntime = new ServletContextRuntime("/"); + ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); @@ -38,6 +38,7 @@ public static void main(String[] args) throws Throwable { bootstrap.configuration() .threadNum(cpuNum) .bannerEnabled(false) + .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) From 36ad58b0ae3736ec3cde46b87dbd216df97fe41e Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sun, 2 Jun 2024 07:50:05 +0800 Subject: [PATCH 0636/1766] upgrade smart-servlet to 1.5-SNAPSHOT --- 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 8904208b91e..508c0fa1481 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 17 17 2.17.1 - 1.4 + 1.5-SNAPSHOT 5.0.0 0.9.23 From 41012e209497950883e1abfbd410a52dd956c4c1 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sun, 2 Jun 2024 18:07:52 +0800 Subject: [PATCH 0637/1766] =?UTF-8?q?=E5=90=AF=E7=94=A8=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/MultipleQueriesHandler.java | 48 +++++++++++-------- .../smartboot/http/SingleQueryHandler.java | 35 ++++++++------ .../java/org/smartboot/servlet/Bootstrap.java | 3 ++ 3 files changed, 52 insertions(+), 34 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index d623f3bf1de..61b9f66b344 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -11,6 +11,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadLocalRandom; /** @@ -25,28 +26,35 @@ public MultipleQueriesHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); - World[] worlds = new World[queries]; - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - - for (int i = 0; i < queries; i++) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - World world = new World(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - worlds[i] = world; - preparedStatement.clearParameters(); + public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { + Thread.startVirtualThread(() -> { + try { + int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); + World[] worlds = new World[queries]; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + + for (int i = 0; i < queries; i++) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + World world = new World(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + worlds[i] = world; + preparedStatement.clearParameters(); + } + + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, worlds); + } finally { + completableFuture.complete(null); } + }); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, worlds); } protected int getRandomNumber() { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index e72f4b06433..b69495d1a5e 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -10,6 +10,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadLocalRandom; /** @@ -24,20 +25,26 @@ public SingleQueryHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - World world = new World(); - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, world); + public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { + Thread.startVirtualThread(() -> { + try { + World world = new World(); + try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, world); + } finally { + completableFuture.complete(null); + } + }); + } protected int getRandomNumber() { 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 e92979fed49..b6691bfd359 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 @@ -18,6 +18,9 @@ public static void main(String[] args) throws Throwable { ContainerRuntime containerRuntime = new ContainerRuntime(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); + applicationRuntime.setVendorProvider(response -> { + + }); ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); From 289be6b618dfef02ff9b4453dc947fb0584c185f Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sun, 2 Jun 2024 18:19:15 +0800 Subject: [PATCH 0638/1766] =?UTF-8?q?=E5=90=AF=E7=94=A8=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 4 ++-- .../Java/smart-socket/smart-socket-smart-servlet.dockerfile | 2 +- frameworks/Java/smart-socket/smart-socket.dockerfile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 508c0fa1481..239721f8cba 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -8,8 +8,8 @@ jar UTF-8 - 17 - 17 + 21 + 21 2.17.1 1.5-SNAPSHOT 5.0.0 diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile index 8b1cbe79930..bb0b9258ec4 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/smart-socket/smart-socket.dockerfile b/frameworks/Java/smart-socket/smart-socket.dockerfile index b40ad2c8d43..4890bd04a06 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src From b959963bff739da0818a8869e1f1bb8d689cf5b8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Jun 2024 22:27:40 +0200 Subject: [PATCH 0639/1766] [crystal/h2o.cr] Remove as no longer maintained (#9083) The h2o.cr bindings haven't been updated in 6 years and don't work with Crystal v1. https://github.com/S-YOU/h2o.cr These are currently failing in the test runs, as well. --- frameworks/Crystal/h2o.cr/README.md | 7 -- .../Crystal/h2o.cr/benchmark_config.json | 26 ---- frameworks/Crystal/h2o.cr/config.toml | 15 --- frameworks/Crystal/h2o.cr/h2o.cr.dockerfile | 24 ---- frameworks/Crystal/h2o.cr/h2o_evloop_hello.cr | 114 ------------------ frameworks/Crystal/h2o.cr/run.sh | 7 -- frameworks/Crystal/h2o.cr/shard.yml | 15 --- 7 files changed, 208 deletions(-) delete mode 100644 frameworks/Crystal/h2o.cr/README.md delete mode 100644 frameworks/Crystal/h2o.cr/benchmark_config.json delete mode 100644 frameworks/Crystal/h2o.cr/config.toml delete mode 100644 frameworks/Crystal/h2o.cr/h2o.cr.dockerfile delete mode 100644 frameworks/Crystal/h2o.cr/h2o_evloop_hello.cr delete mode 100644 frameworks/Crystal/h2o.cr/run.sh delete mode 100755 frameworks/Crystal/h2o.cr/shard.yml diff --git a/frameworks/Crystal/h2o.cr/README.md b/frameworks/Crystal/h2o.cr/README.md deleted file mode 100644 index 72d68953ed5..00000000000 --- a/frameworks/Crystal/h2o.cr/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# h2o.cr - -Crystal bindings to h2o - -### notes - -h2o.cr currently only support plaintext and json requests diff --git a/frameworks/Crystal/h2o.cr/benchmark_config.json b/frameworks/Crystal/h2o.cr/benchmark_config.json deleted file mode 100644 index f2446c191b8..00000000000 --- a/frameworks/Crystal/h2o.cr/benchmark_config.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "framework": "h2o.cr", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 7890, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "h2o.cr", - "language": "Crystal", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "h2o", - "os": "Linux", - "database_os": "Linux", - "display_name": "crystal-h2o", - "notes": "", - "versus": "None" - } - } - ] -} diff --git a/frameworks/Crystal/h2o.cr/config.toml b/frameworks/Crystal/h2o.cr/config.toml deleted file mode 100644 index 2905fb412bb..00000000000 --- a/frameworks/Crystal/h2o.cr/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "h2o.cr" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "h2o" -versus = "None" diff --git a/frameworks/Crystal/h2o.cr/h2o.cr.dockerfile b/frameworks/Crystal/h2o.cr/h2o.cr.dockerfile deleted file mode 100644 index 690ca6fe783..00000000000 --- a/frameworks/Crystal/h2o.cr/h2o.cr.dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM debian:sid - -RUN apt-get update \ - && apt-get install -yqq libh2o-evloop-dev libwslay-dev libyaml-0-2 libevent-dev libpcre3-dev \ - gcc wget git libssl-dev libuv1-dev ca-certificates --no-install-recommends - -RUN wget -q https://github.com/crystal-lang/crystal/releases/download/0.26.1/crystal-0.26.1-1-linux-x86_64.tar.gz \ - && tar --strip-components=1 -xzf crystal-0.26.1-1-linux-x86_64.tar.gz -C /usr/ \ - && rm -f *.tar.gz - -WORKDIR /crystal - -ENV GC_MARKERS 1 - -COPY ./ ./ - -RUN shards install -RUN gcc -shared -O3 lib/h2o/src/ext/h2o.c -I/usr/include -fPIC -o h2o.o -ENV CRYSTAL_PATH=lib:/usr/share/crystal/src -RUN crystal build --prelude=empty --no-debug --release -Dgc_none -Dfiber_none -Dexcept_none -Dhash_none -Dtime_none -Dregex_none -Dextreme h2o_evloop_hello.cr --link-flags="-Wl,-s $PWD/h2o.o -DH2O_USE_LIBUV=0" -o server.out - -EXPOSE 7890 - -CMD sh run.sh diff --git a/frameworks/Crystal/h2o.cr/h2o_evloop_hello.cr b/frameworks/Crystal/h2o.cr/h2o_evloop_hello.cr deleted file mode 100644 index 558a1ec0ac3..00000000000 --- a/frameworks/Crystal/h2o.cr/h2o_evloop_hello.cr +++ /dev/null @@ -1,114 +0,0 @@ -require "reset/prelude" -require "reset/patches" -require "reset/json" -require "h2o/h2o_evloop" - -class H2oHello < H2o - @config = LibH2o::H2oGlobalconfT.new - @ctx = LibH2o::H2oContextT.new - @accept_ctx = LibH2o::H2oAcceptCtxT.new - @loop : LibH2o::H2oLoopT* - - macro hello - Handler.new do |handler, req| - generator = uninitialized LibH2o::H2oGeneratorT[2] - body = h2o_iovec_init("Hello, World!") - req.value.res.status = 200 - req.value.res.reason = "OK" - req.value.res.content_length = body.len - - # require h2o.c extension - h2o_add_header(req, H2O_TOKEN_CONTENT_TYPE, "text/plain") - h2o_start_response(req, generator) - h2o_send(req, pointerof(body), 1, LibH2o::H2oSendState::H2OSendStateFinal) - 0 - end - end - - macro json - Handler.new do |handler, req| - generator = uninitialized LibH2o::H2oGeneratorT[2] - alloc = uninitialized UInt8[32] - buf = StackBuffer.new(alloc.to_unsafe) - - len = {message: "Hello, World!"}.to_json(buf) - body = LibH2o::H2oIovecT.new(base: buf, len: len) - - req.value.res.status = 200 - req.value.res.reason = "OK" - req.value.res.content_length = body.len - - h2o_add_header(req, H2O_TOKEN_CONTENT_TYPE, "application/json") - h2o_start_response(req, generator) - h2o_send(req, pointerof(body), 1, LibH2o::H2oSendState::H2OSendStateFinal) - 0 - end - end - - def on_accept(listener : LibH2o::H2oSocketT*, err : LibC::Char*) : Void - return if err - return unless s = h2o_evloop_socket_accept(listener) - h2o_accept(pointerof(@accept_ctx), s) - end - - def create_listener : Int32 - addr = uninitialized LibC::SockaddrIn - - pointerof(addr).clear - addr.sin_family = LibC::AF_INET - addr.sin_addr.s_addr = 0 # 0x100007f # b32(0x7f000001) - addr.sin_port = 0xd21e # b16(7890) - - option = 1 - if (fd = socket(LibC::AF_INET, LibC::SOCK_STREAM | LibC::O_NONBLOCK | LibC::O_CLOEXEC, 0)) == -1 || - setsockopt(fd, LibC::SOL_SOCKET, LibC::SO_REUSEADDR, pointerof(option), 4) != 0 || - setsockopt(fd, LibC::SOL_SOCKET, LibC::SO_REUSEPORT, pointerof(option), 4) != 0 || - setsockopt(fd, LibC::IPPROTO_TCP, LibC::TCP_QUICKACK, pointerof(option), 4) != 0 || - ((option = H2O_DEFAULT_HANDSHAKE_TIMEOUT_IN_SECS) && - setsockopt(fd, LibC::IPPROTO_TCP, LibC::TCP_DEFER_ACCEPT, pointerof(option), 4) != 0) || - ((option = DEFAULT_TCP_FASTOPEN_QUEUE_LEN) && - setsockopt(fd, LibC::IPPROTO_TCP, LibC::TCP_FASTOPEN, pointerof(option), 4) != 0) || - bind(fd, pointerof(addr).as(LibC::Sockaddr*), sizeof(LibC::SockaddrIn)) != 0 || - listen(fd, LibC::SOMAXCONN) != 0 - return -1 - end - - sock = h2o_evloop_socket_create(@ctx.loop, fd, H2O_SOCKET_FLAG_DONT_READ) - h2o_socket_read_start(sock, LibH2o::H2oSocketCb.new { |listener, err| - {{@type}}.instance.on_accept(listener, err) - }) - 0 - end - - def register_handler(hostconf : LibH2o::H2oHostconfT*, path : String, on_req : Handler) : Void - pathconf = h2o_config_register_path(hostconf, path, 0) - handler = h2o_create_handler(pathconf, sizeof(LibH2o::H2oHandlerT)) - handler.value.on_req = on_req - end - - def initialize - @loop = h2o_evloop_create() - end - - def run : Void - h2o_config_init(pointerof(@config)) - @config.server_name = h2o_iovec_init("h2o") - - hostconf = h2o_config_register_host(pointerof(@config), h2o_iovec_init("default"), 65535) - register_handler(hostconf, "/plaintext", hello) - register_handler(hostconf, "/json", json) - - h2o_context_init(pointerof(@ctx), @loop, pointerof(@config)) - - @accept_ctx.ctx = pointerof(@ctx) - @accept_ctx.hosts = @config.hosts - - if create_listener != 0 - return 1 - end - - while h2o_evloop_run(@ctx.loop, Int32::MAX) == 0; end - end -end - -H2oHello.run diff --git a/frameworks/Crystal/h2o.cr/run.sh b/frameworks/Crystal/h2o.cr/run.sh deleted file mode 100644 index 44f9c8a4db9..00000000000 --- a/frameworks/Crystal/h2o.cr/run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -for i in $(seq 1 $(nproc --all)); do - ./server.out & -done - -wait diff --git a/frameworks/Crystal/h2o.cr/shard.yml b/frameworks/Crystal/h2o.cr/shard.yml deleted file mode 100755 index e203604b6cd..00000000000 --- a/frameworks/Crystal/h2o.cr/shard.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: crystal-h2o -version: 0.0.1 - -license: MIT - -crystal: 0.26.1 - -dependencies: - h2o: - github: s-you/h2o.cr - uv: - github: s-you/uv.cr - reset: - github: s-you/reset.cr - branch: h2o From 368c1f93b94d1d0027b1ed7fd0807cd0d7365caf Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Mon, 3 Jun 2024 21:28:36 +0100 Subject: [PATCH 0640/1766] Another PostgreSQL configuration file clean-up (#9078) This change makes it easier to check how exactly we deviate from the default settings. --- .../databases/postgres/postgres.dockerfile | 6 +- toolset/databases/postgres/postgresql.conf | 145 +++--------------- 2 files changed, 20 insertions(+), 131 deletions(-) diff --git a/toolset/databases/postgres/postgres.dockerfile b/toolset/databases/postgres/postgres.dockerfile index 4a23b39ee70..757d3ba79e8 100644 --- a/toolset/databases/postgres/postgres.dockerfile +++ b/toolset/databases/postgres/postgres.dockerfile @@ -7,8 +7,6 @@ ENV PGDATA=/ssd/postgresql \ POSTGRES_PASSWORD=benchmarkdbpass \ POSTGRES_USER=benchmarkdbuser -COPY postgresql.conf /tmp/ - +COPY 60-postgresql-shm.conf /etc/sysctl.d/ COPY config.sh create-postgres.sql /docker-entrypoint-initdb.d/ - -COPY 60-postgresql-shm.conf /etc/sysctl.d/60-postgresql-shm.conf +COPY postgresql.conf /tmp/ diff --git a/toolset/databases/postgres/postgresql.conf b/toolset/databases/postgres/postgresql.conf index c241696206d..72c94956692 100644 --- a/toolset/databases/postgres/postgresql.conf +++ b/toolset/databases/postgres/postgresql.conf @@ -1,144 +1,35 @@ # 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; -max_connections = 2000 # (change requires restart) +listen_addresses = '*' +max_connections = 2000 +ssl = false -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 +shared_buffers = 256MB +work_mem = 64MB +maintenance_work_mem = 512MB +wal_level = minimal # 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 -#------------------------------------------------------------------------------ +checkpoint_completion_target = 0.9 +max_wal_senders = 0 -#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) +# when executed on the SSD (otherwise 4) +random_page_cost = 2 +effective_cache_size = 8GB +log_line_prefix = '%t ' +track_activity_query_size = 2048 +shared_preload_libraries = 'pg_stat_statements' +pg_stat_statements.track = all +pg_stat_statements.max = 500000 +max_pred_locks_per_transaction = 256 From ebff4c456bcf936ddd47c83cc1313d9fd2e5df31 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 3 Jun 2024 22:28:48 +0200 Subject: [PATCH 0641/1766] [php] Fix codeigniter 4.4 (#9086) * Fix codeigniter 4.4 * Update index.php * Update index.php --- frameworks/PHP/codeigniter/public/index.php | 66 +++++---------------- 1 file changed, 15 insertions(+), 51 deletions(-) diff --git a/frameworks/PHP/codeigniter/public/index.php b/frameworks/PHP/codeigniter/public/index.php index 81e10b96dfc..df2853effed 100644 --- a/frameworks/PHP/codeigniter/public/index.php +++ b/frameworks/PHP/codeigniter/public/index.php @@ -1,9 +1,17 @@ systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php'; - -// Load environment settings from .env files into $_SERVER and $_ENV -require_once SYSTEMPATH . 'Config/DotEnv.php'; -(new CodeIgniter\Config\DotEnv(ROOTPATH))->load(); - -// Define ENVIRONMENT -if (! defined('ENVIRONMENT')) { - define('ENVIRONMENT', env('CI_ENVIRONMENT', 'production')); -} - -// Load Config Cache -// $factoriesCache = new \CodeIgniter\Cache\FactoriesCache(); -// $factoriesCache->load('config'); -// ^^^ Uncomment these lines if you want to use Config Caching. - -/* - * --------------------------------------------------------------- - * GRAB OUR CODEIGNITER INSTANCE - * --------------------------------------------------------------- - * - * The CodeIgniter class contains the core functionality to make - * the application run, and does all the dirty work to get - * the pieces all working together. - */ - -$app = Config\Services::codeigniter(); -$app->initialize(); -//$context = is_cli() ? 'php-cli' : 'web'; -$app->setContext('web'); - -/* - *--------------------------------------------------------------- - * LAUNCH THE APPLICATION - *--------------------------------------------------------------- - * Now that everything is set up, it's time to actually fire - * up the engines and make this app do its thang. - */ - -$app->run(); - -// Save Config Cache -// $factoriesCache->save('config'); -// ^^^ Uncomment this line if you want to use Config Caching. +// LOAD THE FRAMEWORK BOOTSTRAP FILE +require $paths->systemDirectory . '/Boot.php'; -// Exits the application, setting the exit code for CLI-based applications -// that might be watching. -exit(EXIT_SUCCESS); +exit(CodeIgniter\Boot::bootWeb($paths)); From 0a1689868a5c20a8e2f411925ef2156be2d3d54c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Jun 2024 22:28:59 +0200 Subject: [PATCH 0642/1766] [crystal/raze] Remove Raze as it is unmaintained (#9075) Raze hasn't been updated in 4 years and the project is archived: https://github.com/samueleaton/raze --- frameworks/Crystal/raze/README.md | 5 - frameworks/Crystal/raze/benchmark_config.json | 28 ----- frameworks/Crystal/raze/config.toml | 19 ---- frameworks/Crystal/raze/raze.cr | 107 ------------------ frameworks/Crystal/raze/raze.dockerfile | 17 --- frameworks/Crystal/raze/run.sh | 7 -- frameworks/Crystal/raze/shard.lock | 22 ---- frameworks/Crystal/raze/shard.yml | 18 --- frameworks/Crystal/raze/views/fortunes.ecr | 20 ---- 9 files changed, 243 deletions(-) delete mode 100644 frameworks/Crystal/raze/README.md delete mode 100644 frameworks/Crystal/raze/benchmark_config.json delete mode 100644 frameworks/Crystal/raze/config.toml delete mode 100644 frameworks/Crystal/raze/raze.cr delete mode 100644 frameworks/Crystal/raze/raze.dockerfile delete mode 100644 frameworks/Crystal/raze/run.sh delete mode 100644 frameworks/Crystal/raze/shard.lock delete mode 100644 frameworks/Crystal/raze/shard.yml delete mode 100644 frameworks/Crystal/raze/views/fortunes.ecr diff --git a/frameworks/Crystal/raze/README.md b/frameworks/Crystal/raze/README.md deleted file mode 100644 index b419b54e543..00000000000 --- a/frameworks/Crystal/raze/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Crystal-Raze - -This is the [Raze](https://github.com/samueleaton/raze) test of the Framework Benchmarks. Crystal is a new language that closely resembles Ruby with a goal of removing typed variables and parameters (instead inferencing), whilst maintaining top speed through bindings into C. - -Raze is a Modular, light web framework for Crystal https://razecr.com/ diff --git a/frameworks/Crystal/raze/benchmark_config.json b/frameworks/Crystal/raze/benchmark_config.json deleted file mode 100644 index e167df98c2d..00000000000 --- a/frameworks/Crystal/raze/benchmark_config.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "framework": "raze", - "tests": [{ - "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "raze", - "language": "Crystal", - "flavor": "None", - "orm": "micro", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Raze (PostgreSQL)", - "notes": "", - "versus": "crystal" - } - }] -} diff --git a/frameworks/Crystal/raze/config.toml b/frameworks/Crystal/raze/config.toml deleted file mode 100644 index c1db97a8713..00000000000 --- a/frameworks/Crystal/raze/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "raze" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "micro" -platform = "None" -webserver = "None" -versus = "crystal" diff --git a/frameworks/Crystal/raze/raze.cr b/frameworks/Crystal/raze/raze.cr deleted file mode 100644 index d27fbfb390d..00000000000 --- a/frameworks/Crystal/raze/raze.cr +++ /dev/null @@ -1,107 +0,0 @@ -require "raze" -require "pg" - -BENCH_DB = DB.open(ENV["DATABASE_URL"]) - -class CONTENT - ID_MAX = 10_000 - JSON = "application/json" - PLAIN = "text/plain" - HTML = "text/html; charset=UTF-8" -end - -private def get_world - id = Random.rand(CONTENT::ID_MAX).succ - random_number = BENCH_DB.query_one("SELECT id, randomNumber FROM world WHERE id = $1", id, as: Int32) - { id: id, randomNumber: random_number } -end - -private def set_world(world) - BENCH_DB.exec("UPDATE world SET randomNumber = $1 WHERE id = $2", world[:randomNumber], world[:id]) - world -end - -private def fortunes - data = Array(NamedTuple(id: Int32, message: String)).new - - BENCH_DB.query_each("SELECT id, message FROM Fortune") do |rs| - data.push({id: rs.read(Int32), message: rs.read(String)}) - end - - data -end - -private def sanitized_query_count(ctx) - queries = ctx.query["queries"].as(String) - queries = queries.to_i? || 1 - queries.clamp(1..500) -end - -# Test 1: JSON Serialization -get "/json" do |ctx| - ctx.response.headers["Server"] = "Raze" - ctx.response.headers["Date"] = HTTP.format_time(Time.now) - ctx.response.content_type = CONTENT::JSON - { message: "Hello, World!" }.to_json -end - -# Postgres Test 2: Single database query -get "/db" do |ctx| - ctx.response.headers["Server"] = "Raze" - ctx.response.headers["Date"] = HTTP.format_time(Time.now) - ctx.response.content_type = CONTENT::JSON - get_world.to_json -end - -# Postgres Test 3: Multiple database query -get "/queries" do |ctx| - results = (1..sanitized_query_count(ctx)).map do - get_world - end - ctx.response.headers["Server"] = "Raze" - ctx.response.headers["Date"] = HTTP.format_time(Time.now) - ctx.response.content_type = CONTENT::JSON - results.to_json -end - -# Postgres Test 4: Fortunes -get "/fortunes" do |ctx| - ctx.response.headers["Server"] = "Raze" - ctx.response.headers["Date"] = HTTP.format_time(Time.now) - ctx.response.content_type = CONTENT::HTML - data = fortunes - additional_fortune = { - id: 0, - message: "Additional fortune added at request time.", - } - data.push(additional_fortune) - - data.sort_by! { |fortune| fortune[:message] } - - render "views/fortunes.ecr" -end - -# Postgres Test 5: Database Updates -get "/updates" do |ctx| - updated = (1..sanitized_query_count(ctx)).map do - set_world({id: get_world[:id], randomNumber: Random.rand(CONTENT::ID_MAX).succ}) - end - ctx.response.headers["Server"] = "Raze" - ctx.response.headers["Date"] = HTTP.format_time(Time.now) - ctx.response.content_type = CONTENT::JSON - updated.to_json -end - -# Test 6: Plaintext -get "/plaintext" do |ctx| - ctx.response.headers["Server"] = "Raze" - ctx.response.headers["Date"] = HTTP.format_time(Time.now) - ctx.response.content_type = CONTENT::PLAIN - "Hello, World!" -end - -Raze.config.logging = false -Raze.config.port = 8080 -Raze.config.env = "production" -Raze.config.reuse_port = true -Raze.run diff --git a/frameworks/Crystal/raze/raze.dockerfile b/frameworks/Crystal/raze/raze.dockerfile deleted file mode 100644 index c83de74401d..00000000000 --- a/frameworks/Crystal/raze/raze.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM crystallang/crystal:0.26.1 - -WORKDIR /raze -COPY views views -COPY run.sh run.sh -COPY raze.cr raze.cr -COPY shard.lock shard.lock -COPY shard.yml shard.yml - -ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=56&max_pool_size=56&max_idle_pool_size=56 - -RUN shards install -RUN crystal build --release --no-debug raze.cr - -EXPOSE 8080 - -CMD bash run.sh diff --git a/frameworks/Crystal/raze/run.sh b/frameworks/Crystal/raze/run.sh deleted file mode 100644 index a9e373e6683..00000000000 --- a/frameworks/Crystal/raze/run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -for i in $(seq 1 $(nproc --all)); do - ./raze -p 8080 & -done - -wait diff --git a/frameworks/Crystal/raze/shard.lock b/frameworks/Crystal/raze/shard.lock deleted file mode 100644 index c2aa6f2798d..00000000000 --- a/frameworks/Crystal/raze/shard.lock +++ /dev/null @@ -1,22 +0,0 @@ -version: 1.0 -shards: - db: - github: crystal-lang/crystal-db - version: 0.5.0 - - kilt: - github: jeromegn/kilt - version: 0.4.0 - - pg: - github: will/crystal-pg - version: 0.15.0 - - radix: - github: luislavena/radix - version: 0.3.8 - - raze: - github: samueleaton/raze - version: 0.3.0 - diff --git a/frameworks/Crystal/raze/shard.yml b/frameworks/Crystal/raze/shard.yml deleted file mode 100644 index a18ffe5e277..00000000000 --- a/frameworks/Crystal/raze/shard.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: raze -version: 0.1.0 - -targets: - raze: - main: src/raze.cr - -crystal: 0.26.1 - -license: MIT - -dependencies: - raze: - github: samueleaton/raze - version: 0.3.0 - pg: - github: will/crystal-pg - version: 0.15.0 diff --git a/frameworks/Crystal/raze/views/fortunes.ecr b/frameworks/Crystal/raze/views/fortunes.ecr deleted file mode 100644 index d2842b8bf4b..00000000000 --- a/frameworks/Crystal/raze/views/fortunes.ecr +++ /dev/null @@ -1,20 +0,0 @@ - - - - Fortunes - - - - - - - - <% data.each do |fortune| %> - - - - - <% end %> -
idmessage
<%= fortune[:id] %><%= HTML.escape(fortune[:message]) %>
- - From d69a35f42d164dc06390a6a2f7be3612687317cf Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Jun 2024 22:29:33 +0200 Subject: [PATCH 0643/1766] [ruby/sinatra] Use Ruby 3.4-rc (#9088) --- frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile | 2 +- .../sinatra-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 2 +- frameworks/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 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile index ce6cd9b6316..4fe264d4cb6 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 +FROM ruby:3.4-rc 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 9ac570ebfb9..939eb97fce5 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 +FROM ruby:3.4-rc 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 9ab1e96bd1d..78e45656c51 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 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index 4ea3de0b7ad..e36c111221c 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 +FROM ruby:3.4-rc 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 36b1c1a4625..a38a0456218 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 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 14025dafb3b..69ec07037dd 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile index a767ce78bb4..76ca52267f1 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 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 3ff4f1f813e..85fe69e9b73 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 From 97f85505292f5d4cd37a914fae51787a3851bffc Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Mon, 3 Jun 2024 21:29:49 +0100 Subject: [PATCH 0644/1766] toolset: Update colorama to version 0.4.6 (#9082) --- Dockerfile | 4 +++- frameworks/C/h2o/benchmark_config.json | 1 + toolset/run-tests.py | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index e5df65ea716..4325f036734 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,10 @@ RUN apt-get -yqq update && \ libpq-dev \ pkg-config \ python3 \ + python3-colorama \ python3-dev \ + python3-dnspython \ + python3-packaging \ python3-pip \ python3-psutil \ python3-psycopg2 \ @@ -28,7 +31,6 @@ RUN apt-get -yqq update && \ # Ubuntu's equivalent packages are too old and/or broken. pip3 install \ --break-system-packages \ - colorama==0.3.1 \ docker==7.0.0 \ mysqlclient==2.2.4 \ pymongo==4.7.2 diff --git a/frameworks/C/h2o/benchmark_config.json b/frameworks/C/h2o/benchmark_config.json index 1e222e90ce8..4fc6065316e 100644 --- a/frameworks/C/h2o/benchmark_config.json +++ b/frameworks/C/h2o/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "h2o", + "maintainers": ["volyrique"], "tests": [{ "default": { "json_url": "/json", diff --git a/toolset/run-tests.py b/toolset/run-tests.py index c226edece26..a70fff3a490 100644 --- a/toolset/run-tests.py +++ b/toolset/run-tests.py @@ -10,8 +10,8 @@ from toolset.utils.output_helper import log # Enable cross-platform colored output -from colorama import init, Fore -init() +from colorama import Fore, just_fix_windows_console +just_fix_windows_console() class StoreSeqAction(argparse.Action): From 3670cf1211a93d55c5a13fde606f03dcaf720b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Tue, 4 Jun 2024 04:30:02 +0800 Subject: [PATCH 0645/1766] update smart-servlet to 1.4 (#9081) 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 * upgrade smart-servlet to 1.0-SNAPSHOT * upgrade smart-servlet to 1.4 * upgrade smart-servlet to 1.5-SNAPSHOT * 启用虚拟线程 * 启用虚拟线程 --- frameworks/Java/smart-socket/pom.xml | 6 +-- .../smart-socket-smart-servlet.dockerfile | 2 +- .../Java/smart-socket/smart-socket.dockerfile | 2 +- .../java/org/smartboot/http/Bootstrap.java | 1 + .../http/MultipleQueriesHandler.java | 48 +++++++++++-------- .../smartboot/http/SingleQueryHandler.java | 35 ++++++++------ .../java/org/smartboot/servlet/Bootstrap.java | 6 ++- 7 files changed, 60 insertions(+), 40 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 376f82878f7..239721f8cba 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -8,10 +8,10 @@ jar UTF-8 - 17 - 17 + 21 + 21 2.17.1 - 1.0-SNAPSHOT + 1.5-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 8b1cbe79930..bb0b9258ec4 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/smart-socket/smart-socket.dockerfile b/frameworks/Java/smart-socket/smart-socket.dockerfile index b40ad2c8d43..4890bd04a06 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 3d26a672e59..06753113440 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -51,6 +51,7 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio HttpBootstrap bootstrap = new HttpBootstrap(); bootstrap.configuration() .threadNum(cpuNum) + .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index d623f3bf1de..61b9f66b344 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -11,6 +11,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadLocalRandom; /** @@ -25,28 +26,35 @@ public MultipleQueriesHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); - World[] worlds = new World[queries]; - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - - for (int i = 0; i < queries; i++) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - World world = new World(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - worlds[i] = world; - preparedStatement.clearParameters(); + public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { + Thread.startVirtualThread(() -> { + try { + int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); + World[] worlds = new World[queries]; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + + for (int i = 0; i < queries; i++) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + World world = new World(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + worlds[i] = world; + preparedStatement.clearParameters(); + } + + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, worlds); + } finally { + completableFuture.complete(null); } + }); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, worlds); } protected int getRandomNumber() { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index e72f4b06433..b69495d1a5e 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -10,6 +10,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadLocalRandom; /** @@ -24,20 +25,26 @@ public SingleQueryHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - World world = new World(); - try (Connection connection = dataSource.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { - preparedStatement.setInt(1, getRandomNumber()); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - world.setId(resultSet.getInt(1)); - world.setRandomNumber(resultSet.getInt(2)); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, world); + public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { + Thread.startVirtualThread(() -> { + try { + World world = new World(); + try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { + preparedStatement.setInt(1, getRandomNumber()); + ResultSet resultSet = preparedStatement.executeQuery(); + resultSet.next(); + world.setId(resultSet.getInt(1)); + world.setRandomNumber(resultSet.getInt(2)); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, world); + } finally { + completableFuture.complete(null); + } + }); + } protected int getRandomNumber() { 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 681ad1a7593..b6691bfd359 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 @@ -17,7 +17,10 @@ public class Bootstrap { public static void main(String[] args) throws Throwable { ContainerRuntime containerRuntime = new ContainerRuntime(); // plaintext - ServletContextRuntime applicationRuntime = new ServletContextRuntime("/"); + ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); + applicationRuntime.setVendorProvider(response -> { + + }); ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); @@ -38,6 +41,7 @@ public static void main(String[] args) throws Throwable { bootstrap.configuration() .threadNum(cpuNum) .bannerEnabled(false) + .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4) .readMemoryPool(16384 * 1024 * 4) From 9e7b65a5078dd8b8e6514a41196d65f1a81125d9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Jun 2024 22:30:46 +0200 Subject: [PATCH 0646/1766] [crystal|grip] Update dependencies (#9076) --- frameworks/Crystal/grip/grip.cr | 2 +- frameworks/Crystal/grip/grip.dockerfile | 2 +- frameworks/Crystal/grip/shard.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Crystal/grip/grip.cr b/frameworks/Crystal/grip/grip.cr index 3a910eebdd3..1b8a64b6667 100644 --- a/frameworks/Crystal/grip/grip.cr +++ b/frameworks/Crystal/grip/grip.cr @@ -121,7 +121,7 @@ end class Application < Grip::Application def initialize - super(environment: "production", serve_static: false) + super(environment: "production") get "/json", Json get "/plaintext", Plaintext diff --git a/frameworks/Crystal/grip/grip.dockerfile b/frameworks/Crystal/grip/grip.dockerfile index 244aa5dbf70..4d98926effb 100644 --- a/frameworks/Crystal/grip/grip.dockerfile +++ b/frameworks/Crystal/grip/grip.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.0.0 +FROM crystallang/crystal:1.12.1 WORKDIR /grip COPY views views diff --git a/frameworks/Crystal/grip/shard.yml b/frameworks/Crystal/grip/shard.yml index e5500bfe11f..ed1f5ab0a2e 100644 --- a/frameworks/Crystal/grip/shard.yml +++ b/frameworks/Crystal/grip/shard.yml @@ -4,11 +4,11 @@ version: 0.2.0 dependencies: grip: github: grip-framework/grip - version: 2.0.0 + version: 3.0.0 pg: github: will/crystal-pg - version: 0.26.0 + version: 0.28.0 targets: grip: main: grip.cr From 251d2e86b1ad31aa32b62dba87cb17bd20445219 Mon Sep 17 00:00:00 2001 From: itrofimow Date: Tue, 4 Jun 2024 00:31:00 +0400 Subject: [PATCH 0647/1766] [C++] [userver] bump userver commit (#9080) --- frameworks/C++/userver/userver-bare.dockerfile | 2 +- frameworks/C++/userver/userver.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/userver/userver-bare.dockerfile b/frameworks/C++/userver/userver-bare.dockerfile index 59704d05f25..4605e6bb582 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 c2ca5454f0b0e93dd0a2e082904dedda5cda3052 + cd userver && git checkout ec1a3b07793f8d4cd0968cd61d8e6079d667a1e7 COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ diff --git a/frameworks/C++/userver/userver.dockerfile b/frameworks/C++/userver/userver.dockerfile index 667d7ebd96b..cbdceea1862 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 c2ca5454f0b0e93dd0a2e082904dedda5cda3052 + cd userver && git checkout ec1a3b07793f8d4cd0968cd61d8e6079d667a1e7 COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ From 4f74e649a44ab79950214b6340263413395f45ea Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Jun 2024 22:31:12 +0200 Subject: [PATCH 0648/1766] [ruby/agoo] Update dependencies (#9070) * [ruby/agoo] Update dependencies Also fix flakiness by sorting worlds on id in batch update. * [agoo] Upgrade to Ruby 3.4-rc --- frameworks/Ruby/agoo/Gemfile.lock | 14 ++++++++------ frameworks/Ruby/agoo/agoo.dockerfile | 2 +- frameworks/Ruby/agoo/app.rb | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/agoo/Gemfile.lock b/frameworks/Ruby/agoo/Gemfile.lock index daf0ea3b35d..8df20e4179a 100644 --- a/frameworks/Ruby/agoo/Gemfile.lock +++ b/frameworks/Ruby/agoo/Gemfile.lock @@ -1,11 +1,13 @@ GEM remote: https://rubygems.org/ specs: - agoo (2.8.3) - connection_pool (2.2.2) - oj (3.7.12) - pg (1.1.4) - rack (2.0.7) + agoo (2.15.10) + bigdecimal (3.1.8) + connection_pool (2.4.1) + oj (3.16.3) + bigdecimal (>= 3.0) + pg (1.5.6) + rack (3.0.11) PLATFORMS ruby @@ -18,4 +20,4 @@ DEPENDENCIES rack BUNDLED WITH - 1.17.2 + 2.5.10 diff --git a/frameworks/Ruby/agoo/agoo.dockerfile b/frameworks/Ruby/agoo/agoo.dockerfile index 964e91aa5a5..bb4e363b687 100644 --- a/frameworks/Ruby/agoo/agoo.dockerfile +++ b/frameworks/Ruby/agoo/agoo.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc RUN apt-get update -q \ && apt-get install --no-install-recommends -q -y \ diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index 498c0ece93b..cd4f7165a31 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -165,7 +165,7 @@ def self.call(req) class UpdatesHandler < BaseHandler def self.call(req) queries = extract_queries_param req - records = ALL_IDS.sample(queries).map do |id| + records = ALL_IDS.sample(queries).sort.map do |id| world = get_one_record(id) world['randomnumber'] = get_one_random_number world From 7e65c3ca7b88210b3c6cd6716c90a253bb305f04 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 7 Jun 2024 23:52:25 +0200 Subject: [PATCH 0649/1766] Remove unmaintained Polkadot framework (#9099) Polkadot currently fails and hasn't been updated in 4 years. https://github.com/lukeed/polkadot --- frameworks/JavaScript/polkadot/.npmrc | 1 - frameworks/JavaScript/polkadot/README.md | 49 ---------- frameworks/JavaScript/polkadot/app.js | 18 ---- .../JavaScript/polkadot/benchmark_config.json | 90 ------------------- frameworks/JavaScript/polkadot/config.toml | 61 ------------- .../JavaScript/polkadot/drivers/mongodb.js | 16 ---- .../JavaScript/polkadot/drivers/mysql.js | 24 ----- .../JavaScript/polkadot/drivers/postgres.js | 20 ----- frameworks/JavaScript/polkadot/helper.js | 8 -- frameworks/JavaScript/polkadot/init.js | 66 -------------- frameworks/JavaScript/polkadot/package.json | 13 --- .../polkadot/polkadot-mongodb.dockerfile | 12 --- .../polkadot/polkadot-mysql.dockerfile | 12 --- .../polkadot/polkadot-postgres.dockerfile | 12 --- .../JavaScript/polkadot/polkadot.dockerfile | 11 --- 15 files changed, 413 deletions(-) delete mode 100644 frameworks/JavaScript/polkadot/.npmrc delete mode 100644 frameworks/JavaScript/polkadot/README.md delete mode 100755 frameworks/JavaScript/polkadot/app.js delete mode 100644 frameworks/JavaScript/polkadot/benchmark_config.json delete mode 100644 frameworks/JavaScript/polkadot/config.toml delete mode 100644 frameworks/JavaScript/polkadot/drivers/mongodb.js delete mode 100644 frameworks/JavaScript/polkadot/drivers/mysql.js delete mode 100644 frameworks/JavaScript/polkadot/drivers/postgres.js delete mode 100644 frameworks/JavaScript/polkadot/helper.js delete mode 100644 frameworks/JavaScript/polkadot/init.js delete mode 100644 frameworks/JavaScript/polkadot/package.json delete mode 100644 frameworks/JavaScript/polkadot/polkadot-mongodb.dockerfile delete mode 100644 frameworks/JavaScript/polkadot/polkadot-mysql.dockerfile delete mode 100644 frameworks/JavaScript/polkadot/polkadot-postgres.dockerfile delete mode 100644 frameworks/JavaScript/polkadot/polkadot.dockerfile diff --git a/frameworks/JavaScript/polkadot/.npmrc b/frameworks/JavaScript/polkadot/.npmrc deleted file mode 100644 index 43c97e719a5..00000000000 --- a/frameworks/JavaScript/polkadot/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/frameworks/JavaScript/polkadot/README.md b/frameworks/JavaScript/polkadot/README.md deleted file mode 100644 index 275cf83227d..00000000000 --- a/frameworks/JavaScript/polkadot/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Polkadot Benchmarking Test - -This is the [`polkadot`](https://github.com/lukeed/polkadot) portion of a [benchmarking test suite](../) comparing a variety of web development platforms. - -Information about Polkadot can be found at https://github.com/lukeed/polkadot - -## 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/polkadot/app.js b/frameworks/JavaScript/polkadot/app.js deleted file mode 100755 index 0b34b676af4..00000000000 --- a/frameworks/JavaScript/polkadot/app.js +++ /dev/null @@ -1,18 +0,0 @@ -const cluster = require('cluster'); -const numCPUs = require('os').cpus().length; - -if (cluster.isMaster) { - // Fork workers. - for (let i = 0; i < numCPUs; i++) { - cluster.fork(); - } - - console.log('Master starting ' + new Date().toISOString()); - - cluster.on('exit', () => { - process.exit(1); - }); -} else { - // worker task - require('./init'); -} diff --git a/frameworks/JavaScript/polkadot/benchmark_config.json b/frameworks/JavaScript/polkadot/benchmark_config.json deleted file mode 100644 index 614c55d27ba..00000000000 --- a/frameworks/JavaScript/polkadot/benchmark_config.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "framework": "polkadot", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "polkadot", - "language": "JavaScript", - "flavor": "NodeJS", - "orm": "Raw", - "platform": "nodejs", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "polkadot", - "notes": "", - "versus": "nodejs" - }, - "mysql": { - "dockerfile": "polkadot-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": "polkadot", - "language": "JavaScript", - "flavor": "NodeJS", - "orm": "Raw", - "platform": "nodejs", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "polkadot", - "notes": "", - "versus": "nodejs" - }, - "postgres": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "polkadot", - "language": "JavaScript", - "flavor": "NodeJS", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "polkadot", - "notes": "", - "versus": "nodejs" - }, - "mongodb": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "MongoDB", - "framework": "polkadot", - "language": "JavaScript", - "flavor": "NodeJS", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "polkadot", - "notes": "", - "versus": "nodejs" - } - } - ] -} diff --git a/frameworks/JavaScript/polkadot/config.toml b/frameworks/JavaScript/polkadot/config.toml deleted file mode 100644 index 571a537149f..00000000000 --- a/frameworks/JavaScript/polkadot/config.toml +++ /dev/null @@ -1,61 +0,0 @@ -[framework] -name = "polkadot" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "nodejs" -webserver = "None" -versus = "nodejs" - -[mongodb] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Platform" -database = "MongoDB" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "nodejs" - -[postgres] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "nodejs" - -[mysql] -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Platform" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "nodejs" -webserver = "None" -versus = "nodejs" -dockerfile = "polkadot-mysql.dockerfile" diff --git a/frameworks/JavaScript/polkadot/drivers/mongodb.js b/frameworks/JavaScript/polkadot/drivers/mongodb.js deleted file mode 100644 index 6d12fabc90e..00000000000 --- a/frameworks/JavaScript/polkadot/drivers/mongodb.js +++ /dev/null @@ -1,16 +0,0 @@ -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/polkadot/drivers/mysql.js b/frameworks/JavaScript/polkadot/drivers/mysql.js deleted file mode 100644 index 24ce23bf247..00000000000 --- a/frameworks/JavaScript/polkadot/drivers/mysql.js +++ /dev/null @@ -1,24 +0,0 @@ -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/polkadot/drivers/postgres.js b/frameworks/JavaScript/polkadot/drivers/postgres.js deleted file mode 100644 index 2c8388823a6..00000000000 --- a/frameworks/JavaScript/polkadot/drivers/postgres.js +++ /dev/null @@ -1,20 +0,0 @@ -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/polkadot/helper.js b/frameworks/JavaScript/polkadot/helper.js deleted file mode 100644 index abdec861082..00000000000 --- a/frameworks/JavaScript/polkadot/helper.js +++ /dev/null @@ -1,8 +0,0 @@ -exports.random = () => Math.floor(Math.random() * 1e4) + 1; - -exports.parse = queries => Math.min(Math.max(parseInt(queries, 10) || 1, 1), 500); - -exports.fortune = { - id: 0, - message: 'Additional fortune added at request time.' -}; diff --git a/frameworks/JavaScript/polkadot/init.js b/frameworks/JavaScript/polkadot/init.js deleted file mode 100644 index 544a3ce92fc..00000000000 --- a/frameworks/JavaScript/polkadot/init.js +++ /dev/null @@ -1,66 +0,0 @@ -const polkadot = require('polkadot'); -const XSS = require('html-escaper'); -const helper = require('./helper'); - -const { DATABASE } = process.env; -const DRIVER = DATABASE && require(`./drivers/${DATABASE}`); - -polkadot(async (req, res) => { - res.setHeader('Server', 'Polkadot'); - - if (req.path === '/json') { - res.setHeader('Content-Type', 'application/json'); - return { message: 'Hello, World!' }; - } - - if (req.path === '/plaintext') { - return 'Hello, World!'; - } - - if (DRIVER) { - if (req.path === '/db') { - res.setHeader('Content-Type', 'application/json'); - return DRIVER.find(helper.random()); - } - - if (req.path === '/queries') { - let arr=[], num=helper.parse(req.query.queries); - while (num-- > 0) arr.push(DRIVER.find(helper.random())); - res.setHeader('Content-Type', 'application/json'); - return Promise.all(arr); - } - - if (req.path === '/fortunes') { - const items = await DRIVER.fortunes(); - items.push(helper.fortune); - - items.sort((a, b) => a.message.localeCompare(b.message)); - - let i=0, html='Fortunes'; - for (; i < items.length; i++) html += ``; - html += '
idmessage
${items[i].id}${XSS.escape(items[i].message)}
'; - - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - return html; - } - - if (req.path === '/updates') { - let reads=[], num=helper.parse(req.query.queries); - while (num-- > 0) reads.push(DRIVER.find(helper.random())); - const rows = await Promise.all(reads); - - let i=0, writes=[]; - for (; i < rows.length; i++) { - rows[i].randomNumber = helper.random(); - writes.push(DRIVER.update(rows[i])); - } - - await Promise.all(writes); - res.setHeader('Content-Type', 'application/json'); - return rows; - } - } -}).listen(8080, '0.0.0.0', err => { - if (err) throw err; - console.log(`Worker started and listening on http://0.0.0.0:8080 ${new Date().toISOString()}`); -}); diff --git a/frameworks/JavaScript/polkadot/package.json b/frameworks/JavaScript/polkadot/package.json deleted file mode 100644 index 6f595e761db..00000000000 --- a/frameworks/JavaScript/polkadot/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "private": true, - "name": "polkadot-tfb", - "version": "0.0.0", - "main": "app.js", - "dependencies": { - "html-escaper": "1.0.1", - "mongodb": "3.2.2", - "mysql": "2.16.0", - "pg": "7.9.0", - "polkadot": "1.0.0" - } -} diff --git a/frameworks/JavaScript/polkadot/polkadot-mongodb.dockerfile b/frameworks/JavaScript/polkadot/polkadot-mongodb.dockerfile deleted file mode 100644 index be4249701f9..00000000000 --- a/frameworks/JavaScript/polkadot/polkadot-mongodb.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM node:12.3.1-slim - -COPY ./ ./ - -RUN npm install - -ENV NODE_ENV production -ENV DATABASE mongodb - -EXPOSE 8080 - -CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/polkadot/polkadot-mysql.dockerfile b/frameworks/JavaScript/polkadot/polkadot-mysql.dockerfile deleted file mode 100644 index 51208eb47db..00000000000 --- a/frameworks/JavaScript/polkadot/polkadot-mysql.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM node:12.3.1-slim - -COPY ./ ./ - -RUN npm install - -ENV NODE_ENV production -ENV DATABASE mysql - -EXPOSE 8080 - -CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/polkadot/polkadot-postgres.dockerfile b/frameworks/JavaScript/polkadot/polkadot-postgres.dockerfile deleted file mode 100644 index 1a078246bcc..00000000000 --- a/frameworks/JavaScript/polkadot/polkadot-postgres.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM node:12.3.1-slim - -COPY ./ ./ - -RUN npm install - -ENV NODE_ENV production -ENV DATABASE postgres - -EXPOSE 8080 - -CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/polkadot/polkadot.dockerfile b/frameworks/JavaScript/polkadot/polkadot.dockerfile deleted file mode 100644 index c3337439882..00000000000 --- a/frameworks/JavaScript/polkadot/polkadot.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM node:12.3.1-slim - -COPY ./ ./ - -RUN npm install - -ENV NODE_ENV production - -EXPOSE 8080 - -CMD ["node", "app.js"] From 5156f6efca39481e444d5149c25db30f30ae1df0 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 7 Jun 2024 14:52:55 -0700 Subject: [PATCH 0650/1766] Fix Reverse order (#9102) * Add --reverse-order option and switch order after each run on citrine * Move reverse ordering to startup script since we run shutdown script twice * Fix reverse order --- toolset/continuous/tfb-startup.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/toolset/continuous/tfb-startup.sh b/toolset/continuous/tfb-startup.sh index 866d68135cc..b0be7622bf5 100644 --- a/toolset/continuous/tfb-startup.sh +++ b/toolset/continuous/tfb-startup.sh @@ -25,12 +25,6 @@ docker build -t techempower/tfb \ --build-arg USER_ID=$(id -u) \ --build-arg GROUP_ID=$(id -g) . -if [ -z "$TFB_RUN_ORDER" ]; then - export TFB_RUN_ORDER="reverse" -else - unset TFB_RUN_ORDER -fi - echo "running tfb docker image" docker run \ -e USER_ID=$(id -u) \ From 4f780c0f0a9e85790ed0ebf3743210af7f2da137 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 7 Jun 2024 23:53:06 +0200 Subject: [PATCH 0651/1766] Remove unmaintained Duda framework (#9101) Duda is currently failing and hasn't been updated for 8 years. https://github.com/monkey/duda --- frameworks/C/duda/README.md | 29 --------- frameworks/C/duda/benchmark_config.json | 24 ------- frameworks/C/duda/config.toml | 15 ----- frameworks/C/duda/duda.dockerfile | 13 ---- frameworks/C/duda/webservice/Makefile.in | 7 -- frameworks/C/duda/webservice/main.c | 81 ------------------------ 6 files changed, 169 deletions(-) delete mode 100644 frameworks/C/duda/README.md delete mode 100644 frameworks/C/duda/benchmark_config.json delete mode 100644 frameworks/C/duda/config.toml delete mode 100644 frameworks/C/duda/duda.dockerfile delete mode 100644 frameworks/C/duda/webservice/Makefile.in delete mode 100644 frameworks/C/duda/webservice/main.c diff --git a/frameworks/C/duda/README.md b/frameworks/C/duda/README.md deleted file mode 100644 index 7ced12ed71a..00000000000 --- a/frameworks/C/duda/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Duda I/O Benchmarking Test - -This is the web service used to benchmark Duda I/O web services framework. - -http://duda.io - -## Requirements - -Just the GNU C Compiler and a Linux system running Kernel version >= 2.6.32 - -## Tests available - -### 1. JSON - -URL: /json - -### 6. Plain text - -URL: /plaintext - -## About pending tests - -Most of tests that are related to database query are pending and will be available for the next Round. - -## Contact - -Eduardo Silva - - diff --git a/frameworks/C/duda/benchmark_config.json b/frameworks/C/duda/benchmark_config.json deleted file mode 100644 index e8885751e0a..00000000000 --- a/frameworks/C/duda/benchmark_config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "framework": "duda", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 2001, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "C", - "flavor": "None", - "orm": "Raw", - "platform": "duda", - "webserver": "Monkey", - "os": "Linux", - "database_os": "Linux", - "display_name": "Duda I/O", - "notes": "", - "versus": "duda" - } - }] -} diff --git a/frameworks/C/duda/config.toml b/frameworks/C/duda/config.toml deleted file mode 100644 index 58b23cba9a5..00000000000 --- a/frameworks/C/duda/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "duda" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "duda" -webserver = "Monkey" -versus = "duda" diff --git a/frameworks/C/duda/duda.dockerfile b/frameworks/C/duda/duda.dockerfile deleted file mode 100644 index 9b969a75bbe..00000000000 --- a/frameworks/C/duda/duda.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM python:2.7 - -COPY ./ ./ -# Get v0.31 (no official releases that work 2015-06-25) - -RUN git clone https://github.com/monkey/dudac.git -RUN cd dudac && git checkout 7c3d5b03b09fb4cb5f5e338fff72df2e25e95ef0 && \ - ./dudac -r && \ - ./dudac -s - -EXPOSE 2001 - -CMD ["./dudac/dudac", "-w", "webservice", "-p", "2001"] diff --git a/frameworks/C/duda/webservice/Makefile.in b/frameworks/C/duda/webservice/Makefile.in deleted file mode 100644 index 34e55a2c8b8..00000000000 --- a/frameworks/C/duda/webservice/Makefile.in +++ /dev/null @@ -1,7 +0,0 @@ -NAME = ws -CC = gcc -CFLAGS = -g -Wall -O2 -LDFLAGS = -DEFS = -INCDIR = -OBJECTS = main.o diff --git a/frameworks/C/duda/webservice/main.c b/frameworks/C/duda/webservice/main.c deleted file mode 100644 index 512f0ef8f6d..00000000000 --- a/frameworks/C/duda/webservice/main.c +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ - -/* - * Duda I/O Benchmark Tests - * ======================== - * This web service is made for the performance contest made by - * TechEmpower, mode details here: - * - * http://www.techempower.com/benchmarks - * - * At the moment only Tests 1 & 6 are implemented. - */ - -#include "webservice.h" -#include "packages/json/json.h" - -/* Test Macros (Tn) */ -#define JSON_CONTENT_TYPE "Content-Type: application/json" -#define PLAIN_CONTENT_TYPE "Content-Type: text/plain" -#define T6_BODY "Hello, World!" - -DUDA_REGISTER("Duda I/O Benchmark Test", "WS Bench"); - -/* - * Test type 1: JSON serialization - * =============================== - * This test use the JSON API object to compose the JSON response - */ -void cb_json(duda_request_t *dr) -{ - char *body; - int body_len; - json_t *j_root; - - /* Instance the JSON object and compose the content */ - j_root = json->create_object(); - json->add_to_object(j_root, - "message", - json->create_string("Hello, World!")); - - /* Format output to string */ - body = json->print_unformatted_gc(dr, j_root); - body_len = strlen(body); - - /* Delete the JSON tree */ - json->delete(j_root); - - /* Compose the response */ - response->http_status(dr, 200); - response->http_header_n(dr, JSON_CONTENT_TYPE, sizeof(JSON_CONTENT_TYPE) - 1); - response->print(dr, body, body_len); - response->end(dr, NULL); -} - - -/* - * Test type 6: Plaintext - * ====================== - */ -void cb_plaintext(duda_request_t *dr) -{ - response->http_status(dr, 200); - response->http_header_n(dr, PLAIN_CONTENT_TYPE, sizeof(PLAIN_CONTENT_TYPE) - 1); - response->print(dr, T6_BODY, sizeof(T6_BODY) - 1); - response->end(dr, NULL); -} - -int duda_main() -{ - /* load packages */ - duda_load_package(json, "json"); - - /* let this web service own the virtual host */ - conf->service_root(); - - /* set callbacks */ - map->static_add("/json", "cb_json"); /* Test #1 */ - map->static_add("/plaintext", "cb_plaintext"); /* Test #6 */ - - return 0; -} From eab0c1749044945f2108e6cab051808d6953fa6c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 7 Jun 2024 23:53:34 +0200 Subject: [PATCH 0652/1766] Remove unmaintained silicon framework (#9100) Silicon hasn't been updated in 4 years and is currently failing. https://github.com/matt-42/silicon --- frameworks/C++/silicon/CMakeLists.txt | 19 ---- frameworks/C++/silicon/README.md | 8 -- frameworks/C++/silicon/benchmark_config.json | 28 ----- frameworks/C++/silicon/build/symbols.hh | 47 -------- frameworks/C++/silicon/build/techempower.hh | 102 ------------------ .../C++/silicon/build/techempower_lwan.cc | 41 ------- .../silicon/build/techempower_microhttpd.cc | 48 --------- frameworks/C++/silicon/config.toml | 19 ---- frameworks/C++/silicon/silicon.dockerfile | 39 ------- 9 files changed, 351 deletions(-) delete mode 100644 frameworks/C++/silicon/CMakeLists.txt delete mode 100644 frameworks/C++/silicon/README.md delete mode 100644 frameworks/C++/silicon/benchmark_config.json delete mode 100644 frameworks/C++/silicon/build/symbols.hh delete mode 100644 frameworks/C++/silicon/build/techempower.hh delete mode 100644 frameworks/C++/silicon/build/techempower_lwan.cc delete mode 100644 frameworks/C++/silicon/build/techempower_microhttpd.cc delete mode 100644 frameworks/C++/silicon/config.toml delete mode 100644 frameworks/C++/silicon/silicon.dockerfile diff --git a/frameworks/C++/silicon/CMakeLists.txt b/frameworks/C++/silicon/CMakeLists.txt deleted file mode 100644 index 54ea5b6ee8e..00000000000 --- a/frameworks/C++/silicon/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -project(silicon) - -include_directories(/include $ENV{MICROHTTPD_HOME}/include) - -link_directories(/lib $ENV{MICROHTTPD_HOME}/lib) - -add_definitions(-std=c++14 -ftemplate-depth=1024 -DNDEBUG -O3) - -add_executable(silicon_tpc_mysql techempower_microhttpd.cc) -target_link_libraries(silicon_tpc_mysql microhttpd mysqlclient) - -add_executable(silicon_epoll_mysql techempower_microhttpd.cc) -set_target_properties(silicon_epoll_mysql PROPERTIES COMPILE_FLAGS "-DTFB_USE_EPOLL") -target_link_libraries(silicon_epoll_mysql microhttpd mysqlclient) - -add_executable(silicon_lwan_mysql techempower_lwan.cc) -target_link_libraries(silicon_lwan_mysql mysqlclient lwan ubsan curl z pthread dl luajit-5.1) diff --git a/frameworks/C++/silicon/README.md b/frameworks/C++/silicon/README.md deleted file mode 100644 index 9c4e3badcfa..00000000000 --- a/frameworks/C++/silicon/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# C++/silicon Benchmarking test - -Silicon is a C++ web framework located at https://github.com/matt-42/silicon - -### Note - -The `silicon-epoll-mysql` and `silicon-lwan-mysql` tests are currently not working. They have been removed from the `benchmark_config.json` file but the implementations still exist. You can see the old `benchmark_config.json` [here](https://github.com/TechEmpower/FrameworkBenchmarks/blob/5d44d57cbb5cbc209a2d6aeb23010b466c055200/frameworks/C%2B%2B/silicon/benchmark_config.json). - diff --git a/frameworks/C++/silicon/benchmark_config.json b/frameworks/C++/silicon/benchmark_config.json deleted file mode 100644 index 408a7483ba3..00000000000 --- a/frameworks/C++/silicon/benchmark_config.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "framework": "silicon", - "tests": [{ - "default": { - "json_url" : "/json", - "db_url" : "/db", - "query_url" : "/queries?queries=", - "fortune_url" : "/fortunes", - "update_url" : "/updates?queries=", - "plaintext_url" : "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "silicon", - "language": "C++", - "flavor": "None", - "orm": "Full", - "platform": "None", - "webserver": "microhttpd", - "os": "Linux", - "database_os": "Linux", - "display_name": "silicon-tpc-mysql", - "notes": "", - "versus": "silicon" - } - }] -} diff --git a/frameworks/C++/silicon/build/symbols.hh b/frameworks/C++/silicon/build/symbols.hh deleted file mode 100644 index 9d973373ac5..00000000000 --- a/frameworks/C++/silicon/build/symbols.hh +++ /dev/null @@ -1,47 +0,0 @@ -// Generated by iod_generate_symbols. -#include -#ifndef IOD_SYMBOL_db -#define IOD_SYMBOL_db - iod_define_symbol(db) -#endif - -#ifndef IOD_SYMBOL_fortunes -#define IOD_SYMBOL_fortunes - iod_define_symbol(fortunes) -#endif - -#ifndef IOD_SYMBOL_id -#define IOD_SYMBOL_id - iod_define_symbol(id) -#endif - -#ifndef IOD_SYMBOL_json -#define IOD_SYMBOL_json - iod_define_symbol(json) -#endif - -#ifndef IOD_SYMBOL_message -#define IOD_SYMBOL_message - iod_define_symbol(message) -#endif - -#ifndef IOD_SYMBOL_plaintext -#define IOD_SYMBOL_plaintext - iod_define_symbol(plaintext) -#endif - -#ifndef IOD_SYMBOL_queries -#define IOD_SYMBOL_queries - iod_define_symbol(queries) -#endif - -#ifndef IOD_SYMBOL_randomNumber -#define IOD_SYMBOL_randomNumber - iod_define_symbol(randomNumber) -#endif - -#ifndef IOD_SYMBOL_updates -#define IOD_SYMBOL_updates - iod_define_symbol(updates) -#endif - diff --git a/frameworks/C++/silicon/build/techempower.hh b/frameworks/C++/silicon/build/techempower.hh deleted file mode 100644 index 3ecbfa1834f..00000000000 --- a/frameworks/C++/silicon/build/techempower.hh +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "symbols.hh" - -using namespace s; -using namespace sl; - -typedef decltype(D(_id(_auto_increment, _primary_key) = int(), - _randomNumber = int())) random_number; - -typedef decltype(D(_id(_auto_increment, _primary_key) = int(), - _message = std::string())) fortune; - -typedef mysql_orm_factory rn_orm_factory; -typedef mysql_orm rn_orm; - -typedef mysql_orm_factory fortune_orm_factory; -typedef mysql_orm fortune_orm; - - -std::string escape_html_entities(std::string& data) -{ - std::string buffer; - buffer.reserve(data.size()); - for(size_t pos = 0; pos != data.size(); ++pos) { - switch(data[pos]) { - case '&': buffer.append("&"); break; - case '\"': buffer.append("""); break; - case '\'': buffer.append("'"); break; - case '<': buffer.append("<"); break; - case '>': buffer.append(">"); break; - default: buffer.append(&data[pos], 1); break; - } - } - return std::move(buffer); -} - -auto techempower_api = http_api( - - GET / _plaintext = [] () { return response(_content_type = string_ref("text/plain"), - _body = string_ref("Hello, World!")); }, - - GET / _json = [] () { return response(_content_type = string_ref("application/json"), - _body = D(_message = "Hello, World!")); }, - - GET / _db = [] (rn_orm& orm) { - random_number r; - orm.find_by_id(1245, r); - return response(_content_type = "application/json", - _body = r); - }, - - GET / _queries * get_parameters(_queries = optional(std::string("1"))) = [] (auto param, rn_orm& orm) { - int N = atoi(param.queries.c_str()); - N = std::max(1, std::min(N, 500)); - - std::vector qs(N); - for (int i = 0; i < N; i++) - orm.find_by_id(1 + rand() % 9999, qs[i]); - return response(_content_type = "application/json", - _body = std::move(qs)); - }, - - GET / _updates * get_parameters(_queries = optional(std::string("1"))) = [] (auto param, rn_orm& orm) { - int N = atoi(param.queries.c_str()); - N = std::max(1, std::min(N, 500)); - - std::vector qs(N); - for (int i = 0; i < N; i++) - { - orm.find_by_id(1 + rand() % 9999, qs[i]); - qs[i].randomNumber = 1 + rand() % 9999; - orm.update(qs[i]); - } - return response(_content_type = "application/json", - _body = std::move(qs)); - }, - - GET / _fortunes = [] (fortune_orm& orm) { - std::vector table; - orm.forall([&] (fortune& f) { table.push_back(f); }); - table.push_back(fortune(0, "Additional fortune added at request time.")); - - std::sort(table.begin(), table.end(), - [] (const fortune& a, const fortune& b) { return a.message < b.message; }); - - std::stringstream ss; - - ss << "Fortunes"; - for(auto& f : table) - ss << ""; - ss << "
idmessage
" << f.id << "" << escape_html_entities(f.message) << "
"; - - return response(_content_type = "text/html; charset=utf-8", - _body = ss.str()); - } - - ); diff --git a/frameworks/C++/silicon/build/techempower_lwan.cc b/frameworks/C++/silicon/build/techempower_lwan.cc deleted file mode 100644 index 12be2db22f4..00000000000 --- a/frameworks/C++/silicon/build/techempower_lwan.cc +++ /dev/null @@ -1,41 +0,0 @@ -#include - -#include "techempower.hh" - -using namespace s; -using namespace sl; - -int main(int argc, char* argv[]) -{ - if (argc != 3) - { - std::cerr << "Usage: " << argv[0] << " mysql_host port" << std::endl; - return 1; - } - - auto techempower_middlewares = middleware_factories( - mysql_connection_factory(argv[1], "benchmarkdbuser", "benchmarkdbpass", "hello_world"), - fortune_orm_factory("Fortune"), - rn_orm_factory("World") - ); - - try - { - - // Write the pid. - std::ofstream pidfile(argv[3]); - pidfile << getpid() << std::endl; - pidfile.close(); - - // Start the server. - sl::lwan_json_serve(techempower_api, techempower_middlewares, atoi(argv[2])); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - catch (sl::error::error& e) - { - std::cerr << e.what() << std::endl; - } -} diff --git a/frameworks/C++/silicon/build/techempower_microhttpd.cc b/frameworks/C++/silicon/build/techempower_microhttpd.cc deleted file mode 100644 index 984af647f03..00000000000 --- a/frameworks/C++/silicon/build/techempower_microhttpd.cc +++ /dev/null @@ -1,48 +0,0 @@ -#include - -#include "techempower.hh" - -using namespace s; -using namespace sl; - -int main(int argc, char* argv[]) -{ - - if (argc != 4) - { - std::cerr << "Usage: " << argv[0] << " mysql_host port nthreads" << std::endl; - return 1; - } - - auto techempower_middlewares = middleware_factories( - mysql_connection_factory(argv[1], "benchmarkdbuser", "benchmarkdbpass", "hello_world"), - fortune_orm_factory("Fortune"), - rn_orm_factory("World") - ); - - try - { - // Write the pid. - std::ofstream pidfile(argv[3]); - pidfile << getpid() << std::endl; - pidfile.close(); - - // Start the server. - sl::mhd_json_serve(techempower_api, techempower_middlewares, atoi(argv[2]), _blocking -#ifdef TFB_USE_EPOLL - , _linux_epoll, _nthreads = atoi(argv[3]) -#else - , _one_thread_per_connection -#endif - ); - - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - catch (sl::error::error& e) - { - std::cerr << e.what() << std::endl; - } -} diff --git a/frameworks/C++/silicon/config.toml b/frameworks/C++/silicon/config.toml deleted file mode 100644 index 745d5778ea8..00000000000 --- a/frameworks/C++/silicon/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "silicon" - -[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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "None" -webserver = "microhttpd" -versus = "silicon" diff --git a/frameworks/C++/silicon/silicon.dockerfile b/frameworks/C++/silicon/silicon.dockerfile deleted file mode 100644 index b7abb7e57c9..00000000000 --- a/frameworks/C++/silicon/silicon.dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM buildpack-deps:xenial - -RUN apt-get update -yqq && apt-get install -yqq software-properties-common cmake apt-transport-https - -RUN add-apt-repository -s "deb http://apt.llvm.org/`lsb_release -cs`/ llvm-toolchain-`lsb_release -cs`-3.9 main" -RUN wget -O - http://apt.llvm.org/llvm-snapshot.gpg.key| apt-key add - -RUN apt-get update -yqq -RUN apt-get install -yqq clang-3.9 lldb-3.9 - -ENV MICROHTTPD_VERSION=0.9.39 -ENV MICROHTTPD=/libmicrohttpd -ENV MICROHTTPD_HOME=$MICROHTTPD-$VERSION - -RUN wget http://mirror.ibcp.fr/pub/gnu/libmicrohttpd/libmicrohttpd-$MICROHTTPD_VERSION.tar.gz -RUN tar xf libmicrohttpd-$MICROHTTPD_VERSION.tar.gz -RUN cd libmicrohttpd-$MICROHTTPD_VERSION && \ - ./configure --prefix=$MICROHTTPD_HOME && \ - make install - -ENV PATH=${MICROHTTPD_HOME}/bin:${PATH} - -RUN apt-get install -yqq libboost-dev cmake - -ENV SILICON=/silicon - -COPY ./ ./ - -RUN git clone https://github.com/matt-42/silicon.git && \ - cd silicon && \ - git checkout ecaf04887c9dbbf0f457afab1f487268f6aeffab && \ - CC=clang-3.9 CXX=clang++-3.9 ./install.sh / - -RUN cd build && \ - cmake .. -DCMAKE_CXX_COMPILER=clang++-3.9 && \ - make silicon_tpc_mysql - -EXPOSE 8080 - -CMD /build/silicon_tpc_mysql tfb-database 8080 $(nproc) From de5eec3bb59bde2e713460006dc940bd24726d45 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 7 Jun 2024 23:53:47 +0200 Subject: [PATCH 0653/1766] [ruby/grape] Update dependencies (#9094) --- frameworks/Ruby/grape/Gemfile | 10 ++++------ frameworks/Ruby/grape/README.md | 5 ++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/grape/Gemfile b/frameworks/Ruby/grape/Gemfile index 11003918d94..185a55f68e2 100644 --- a/frameworks/Ruby/grape/Gemfile +++ b/frameworks/Ruby/grape/Gemfile @@ -1,11 +1,9 @@ source 'https://rubygems.org' -gem 'mysql2', '0.5.4' +gem 'mysql2', '0.5.6' gem 'unicorn', '6.1.0' -gem 'puma', '5.6.4' -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 'puma', '~> 6.4' +gem 'activerecord', '~> 7.1.0', :require => 'active_record' +gem 'grape', '2.0.0' gem 'multi_json', require: 'multi_json' gem 'oj', '~> 3.16' diff --git a/frameworks/Ruby/grape/README.md b/frameworks/Ruby/grape/README.md index 80bb63763a4..6e35abfae04 100644 --- a/frameworks/Ruby/grape/README.md +++ b/frameworks/Ruby/grape/README.md @@ -12,10 +12,9 @@ comparing a variety of web servers. The tests were run with: * [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/) +* [Grape 2.0.0](http://www.ruby-grape.org/) * [Unicorn 6.1.0](https://yhbt.net/unicorn/) -* [Puma 5.6.4](https://puma.io/) +* [Puma 6.4](https://puma.io/) ## Paths & Source for Tests From c0a0aa9562e115d054abde0634e256ea90005bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Fri, 7 Jun 2024 23:54:20 +0200 Subject: [PATCH 0654/1766] Update GenHTTP to version 8.5 (#9090) * Update GenHTTP to version 8.5 * Update server to 8.5.2 --- .../CSharp/genhttp/Benchmarks/Benchmarks.csproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index b00a3994898..9b49099c3bb 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -28,13 +28,13 @@ - - - + + + - - + + - \ No newline at end of file + From e50dde3cddd740c5e04c6e9bb1ec8685bfb865d0 Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Sat, 8 Jun 2024 00:02:11 +0200 Subject: [PATCH 0655/1766] Disable testresources and downgrade docker images (#9084) This is an attempt to fix the JIT-only regression introduced by f2b0b607acb50c71890f00693bc2f467d217ba4f . --- .../Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile | 6 +++--- .../micronaut/micronaut-data-mongodb-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile | 6 +++--- .../Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile | 6 +++--- frameworks/Java/micronaut/micronaut-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-jdbc.dockerfile | 6 +++--- frameworks/Java/micronaut/micronaut-r2dbc.dockerfile | 6 +++--- frameworks/Java/micronaut/micronaut.dockerfile | 6 +++--- 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile index c93c4012437..63eb26907b0 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile @@ -2,7 +2,7 @@ FROM ghcr.io/graalvm/native-image-community:21-ol9 as build RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew micronaut-data-jdbc:nativeCompile -x test --no-daemon +RUN ./gradlew micronaut-data-jdbc:nativeCompile -x test -x internalStartTestResourcesService --no-daemon FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile index 53b8546389f..60c935c6d25 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk21 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src -RUN gradle micronaut-data-jdbc:build -x test --no-daemon +RUN gradle micronaut-data-jdbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:22 +FROM openjdk:21 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/libs/micronaut-data-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile index 162ab11cb31..85472860d78 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile @@ -2,7 +2,7 @@ FROM ghcr.io/graalvm/native-image-community:21-ol9 as build RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew micronaut-data-mongodb:nativeCompile -x test --no-daemon +RUN ./gradlew micronaut-data-mongodb:nativeCompile -x test -x internalStartTestResourcesService --no-daemon FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile index 4e8c3f928f7..f098cf335eb 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk21 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src -RUN gradle micronaut-data-mongodb:build -x test --no-daemon +RUN gradle micronaut-data-mongodb:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:22 +FROM openjdk:21 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/libs/micronaut-data-mongodb-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile index 14004898dc1..6ada77518a5 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile @@ -2,7 +2,7 @@ FROM ghcr.io/graalvm/native-image-community:21-ol9 as build RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew micronaut-data-r2dbc:nativeCompile -x test --no-daemon +RUN ./gradlew micronaut-data-r2dbc:nativeCompile -x test -x internalStartTestResourcesService --no-daemon FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile index 04f065d8288..0fe88905ef3 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk21 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src -RUN gradle micronaut-data-r2dbc:build -x test --no-daemon +RUN gradle micronaut-data-r2dbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:22 +FROM openjdk:21 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/libs/micronaut-data-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile index f4cbb033460..6a9208967cc 100644 --- a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile @@ -2,7 +2,7 @@ FROM ghcr.io/graalvm/native-image-community:21-ol9 as build RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew micronaut-vertx-pg-client:nativeCompile -x test --no-daemon +RUN ./gradlew micronaut-vertx-pg-client:nativeCompile -x test -x internalStartTestResourcesService --no-daemon FROM cgr.dev/chainguard/wolfi-base:latest RUN apk --no-cache update && apk add libstdc++ diff --git a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile index a64b60773ad..27cb088bb04 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile @@ -2,7 +2,7 @@ FROM ghcr.io/graalvm/native-image-community:21-ol9 as build RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src -RUN ./gradlew micronaut-jdbc:nativeCompile -x test --no-daemon +RUN ./gradlew micronaut-jdbc:nativeCompile -x test -x internalStartTestResourcesService --no-daemon FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut diff --git a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile index 1d56f8a5a8a..63b613d4e61 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk21 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src -RUN gradle micronaut-jdbc:build -x test --no-daemon +RUN gradle micronaut-jdbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:22 +FROM openjdk:21 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-jdbc/build/libs/micronaut-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile index 7bc182aa09c..480b47cffa2 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk21 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src -RUN gradle micronaut-r2dbc:build -x test --no-daemon +RUN gradle micronaut-r2dbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:22 +FROM openjdk:21 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-r2dbc/build/libs/micronaut-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut.dockerfile b/frameworks/Java/micronaut/micronaut.dockerfile index ce7ff654f4b..5672b1c6ff4 100644 --- a/frameworks/Java/micronaut/micronaut.dockerfile +++ b/frameworks/Java/micronaut/micronaut.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk21 as build +FROM gradle:8.7.0-jdk17 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src -RUN gradle micronaut-vertx-pg-client:build -x test --no-daemon +RUN gradle micronaut-vertx-pg-client:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:22 +FROM openjdk:21 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/libs/micronaut-vertx-pg-client-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh From 84b9953abc68e1b689cc4632e61145c08e8cc266 Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:02:27 +0300 Subject: [PATCH 0656/1766] [mORMot] - migrate to Ubuntu24.04; mORMot@2.2.7579; return to glibc MM (#9072) * [mORMot] - migrate to Ubuntu24.04; mORMot@2.2.7565; return to glibc MM * [mORMot] - mORmot@2.2.7579 + Define FPC_LIBCMM_NOMSIZE to disable the malloc_usable_size() call on Linux + O3 optimization level --------- Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/benchmark_config.json | 2 +- frameworks/Pascal/mormot/mormot.dockerfile | 4 +--- frameworks/Pascal/mormot/setup_and_build.sh | 6 +++--- frameworks/Pascal/mormot/src/raw.pas | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/frameworks/Pascal/mormot/benchmark_config.json b/frameworks/Pascal/mormot/benchmark_config.json index 4a7322cac5f..def2b2c2b17 100644 --- a/frameworks/Pascal/mormot/benchmark_config.json +++ b/frameworks/Pascal/mormot/benchmark_config.json @@ -9,8 +9,8 @@ "query_url": "/queries?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", "cached_query_url": "/cached-queries?count=", + "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", "classification": "Fullstack", diff --git a/frameworks/Pascal/mormot/mormot.dockerfile b/frameworks/Pascal/mormot/mormot.dockerfile index ab276d4cf51..cdb55defb26 100644 --- a/frameworks/Pascal/mormot/mormot.dockerfile +++ b/frameworks/Pascal/mormot/mormot.dockerfile @@ -9,8 +9,7 @@ COPY setup_and_build.sh . RUN /bin/bash -c ./setup_and_build.sh -FROM ubuntu:22.04 -RUN apt-get update -yqq && apt-get install -yqq libmimalloc2.0 +FROM ubuntu:24.04 ARG TFB_TEST_NAME @@ -18,7 +17,6 @@ COPY --from=builder /build/bin/fpc-x86_64-linux/raw /usr/local/bin/raw COPY --from=builder /build/libpq.so.5.16 /usr/lib/x86_64-linux-gnu/libpq.so.5 ENV TFB_TEST_NAME=$TFB_TEST_NAME -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libmimalloc.so.2.0 EXPOSE 8080 CMD ["raw"] diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 7494c84747a..85863798754 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/527b3fb11cb4dad5f2c03ace293b550f85504420 +URL=https://github.com/synopse/mORMot2/tarball/f0fc66c954cd45f5c581e52c21170923805a683b #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 @@ -72,7 +72,7 @@ fi # Warning: (5090) Variable XXX of a managed type does not seem to be initialized SUPRESS_WARN=-vm11047,6058,5092,5091,5060,5058,5057,5028,5024,5023,4081,4079,4055,3187,3124,3123,5059,5036,5089,5090 echo "Start compiling..." -fpc -MDelphi -Sci -Ci -O4 -g -gl -gw2 -Xg -k'-rpath=$ORIGIN' -k-L$BIN \ +fpc -MDelphi -Sci -Ci -O3 -g -gl -gw2 -Xg -k'-rpath=$ORIGIN' -k-L$BIN \ -T$TARGET -P$ARCH \ -veiq -v-n-h- $SUPRESS_WARN \ -Fi"$BIN/fpc-$ARCH_TG/.dcu" -Fi"$MSRC" \ @@ -80,7 +80,7 @@ fpc -MDelphi -Sci -Ci -O4 -g -gl -gw2 -Xg -k'-rpath=$ORIGIN' -k-L$BIN \ -Fu"$MSRC/core" -Fu"$MSRC/db" -Fu"$MSRC/rest" -Fu"$MSRC/crypt" \ -Fu"$MSRC/app" -Fu"$MSRC/net" -Fu"$MSRC/lib" -Fu"$MSRC/orm" -Fu"$MSRC/soa" \ -FU"$BIN/fpc-$ARCH_TG/.dcu" -FE"$BIN/fpc-$ARCH_TG" -o"$BIN/fpc-$ARCH_TG/$dest_fn" \ - -dFPC_LIBCMM \ + -dFPC_LIBCMM -dFPC_LIBCMM_NOMSIZE \ -B -Se1 "./src/raw.pas" | grep "[Warning|Error|Fatal]:" script_successful \ No newline at end of file diff --git a/frameworks/Pascal/mormot/src/raw.pas b/frameworks/Pascal/mormot/src/raw.pas index 27ec81b92f7..fa53c7fd038 100644 --- a/frameworks/Pascal/mormot/src/raw.pas +++ b/frameworks/Pascal/mormot/src/raw.pas @@ -831,8 +831,7 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; ConsoleWaitForEnterKey; //TSynLog.Family.Level := LOG_VERBOSE; // enable shutdown logs for debug if servers = 1 then - writeln(ObjectToJsonDebug(rawServers[0].fHttpServer, - [woDontStoreVoid, woHumanReadable])) + writeln(ObjectToJsonDebug(rawServers[0].fHttpServer)) else begin writeln('Per-server accepted connections:'); From 3f72bd5545f2451ddf85f0abcacfbaad0a73d121 Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Fri, 7 Jun 2024 15:02:43 -0700 Subject: [PATCH 0657/1766] [F#/Oxpecker] Got rid of SpanJson as bringning no benefit. Disabled ReadyToRun (#9071) --- frameworks/FSharp/oxpecker/README.md | 1 - .../FSharp/oxpecker/oxpecker.dockerfile | 3 ++ frameworks/FSharp/oxpecker/src/App/App.fsproj | 1 - frameworks/FSharp/oxpecker/src/App/Program.fs | 37 ++++--------------- 4 files changed, 10 insertions(+), 32 deletions(-) diff --git a/frameworks/FSharp/oxpecker/README.md b/frameworks/FSharp/oxpecker/README.md index 4f686292d12..ecd2284661d 100644 --- a/frameworks/FSharp/oxpecker/README.md +++ b/frameworks/FSharp/oxpecker/README.md @@ -19,7 +19,6 @@ This includes tests for plaintext, json, and fortunes HTML serialization. * [Oxpecker](https://github.com/Lanayx/Oxpecker) * [Dapper](https://github.com/DapperLib/Dapper) -* [SpanJson](https://github.com/Tornhoof/SpanJson) * ASP.NET Core ## Paths & Source for Tests diff --git a/frameworks/FSharp/oxpecker/oxpecker.dockerfile b/frameworks/FSharp/oxpecker/oxpecker.dockerfile index c65349e32cd..35a8c509c96 100644 --- a/frameworks/FSharp/oxpecker/oxpecker.dockerfile +++ b/frameworks/FSharp/oxpecker/oxpecker.dockerfile @@ -4,6 +4,9 @@ COPY src/App . RUN dotnet publish -c Release -o out FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime + +ENV DOTNET_ReadyToRun 0 + ENV URLS http://+:8080 WORKDIR /app diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index 8dca02be01a..a9e0ad2c0ba 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -14,6 +14,5 @@ - \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index e0c3f361286..944e0518155 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -2,7 +2,6 @@ namespace App open System open System.Collections.Generic -open System.Threading.Tasks open Oxpecker [] @@ -60,6 +59,7 @@ module HttpHandlers = open Npgsql open System.Text open Microsoft.AspNetCore.Http + open System.Text.Json let private extra = { @@ -169,48 +169,26 @@ module HttpHandlers = ctx.SetContentType("text/plain") ctx.WriteBytes(result) + let jsonSimple value : EndpointHandler = + let options = JsonSerializerOptions(JsonSerializerDefaults.Web) + fun ctx -> + ctx.Response.WriteAsJsonAsync(value, options) + let endpoints = [| route "/plaintext" <| utf8Const "Hello, World!" - route "/json"<| jsonChunked {| message = "Hello, World!" |} + route "/json"<| jsonSimple {| message = "Hello, World!" |} route "/fortunes" fortunes route "/db" singleQuery route "/queries/{count?}" multipleQueries route "/updates/{count?}" multipleUpdates |] - module Main = - open SpanJson - open Microsoft.AspNetCore.Http open Microsoft.AspNetCore.Builder - open Microsoft.AspNetCore.Hosting open Microsoft.Extensions.DependencyInjection open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging - open System.Buffers - - type SpanJsonSerializer() = - interface Serializers.IJsonSerializer with - member this.Serialize(value, ctx, chunked) = - ctx.Response.ContentType <- "application/json" - if chunked then - if ctx.Request.Method <> HttpMethods.Head then - JsonSerializer.Generic.Utf8.SerializeAsync<_>(value, stream = ctx.Response.Body).AsTask() - else - Task.CompletedTask - else - task { - let buffer = JsonSerializer.Generic.Utf8.SerializeToArrayPool<_>(value) - ctx.Response.Headers.ContentLength <- buffer.Count - if ctx.Request.Method <> HttpMethods.Head then - do! ctx.Response.Body.WriteAsync(buffer) - ArrayPool.Shared.Return(buffer.Array) - else - return () - } - member this.Deserialize _ = - failwith "Not implemented" [] let main args = @@ -218,7 +196,6 @@ module Main = builder.Services .AddRouting() .AddOxpecker() - .AddSingleton(SpanJsonSerializer()) |> ignore builder.Logging.ClearProviders() |> ignore let app = builder.Build() From 1e7c4e86e3d670a71975052af5d06d746edcc75e Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 8 Jun 2024 06:02:57 +0800 Subject: [PATCH 0658/1766] update beetlex to beetlex.light (#9095) * update beetleX to BeetleX.Light * update beetlex to beetlex.light * fix fortunes error * fix error * remove beetlex-core-updb * update * update benchmark_config * update * update * update --- frameworks/CSharp/beetlex/Benchmarks.sln | 6 +- .../beetlex/Benchmarks/Benchmarks.csproj | 5 +- .../CSharp/beetlex/Benchmarks/Program.cs | 9 +- .../beetlex/PlatformBenchmarks/DBRaw.cs | 5 +- .../beetlex/PlatformBenchmarks/GMTDate.cs | 5 +- .../PlatformBenchmarks/HttpHandler.Caching.cs | 41 +- .../beetlex/PlatformBenchmarks/HttpHandler.cs | 352 ++++++++++-------- .../PlatformBenchmarks/HttpHandler.db.cs | 34 +- .../PlatformBenchmarks/HttpHandler.default.cs | 24 +- .../HttpHandler.fortunes.cs | 85 ++--- .../PlatformBenchmarks/HttpHandler.json.cs | 34 +- .../HttpHandler.plaintext.cs | 8 +- .../PlatformBenchmarks/HttpHandler.queries.cs | 45 ++- .../PlatformBenchmarks/HttpHandler.updates.cs | 25 +- .../beetlex/PlatformBenchmarks/HttpServer.cs | 40 +- .../beetlex/PlatformBenchmarks/HttpToken.cs | 114 +++--- .../PlatformBenchmarks/NetApplication.cs | 19 + .../PlatformBenchmarks.csproj | 12 +- .../beetlex/PlatformBenchmarks/Program.cs | 6 + .../beetlex/PlatformBenchmarks/RequestData.cs | 17 +- .../beetlex/beetlex-core-updb.dockerfile | 12 - .../CSharp/beetlex/beetlex-core.dockerfile | 4 +- frameworks/CSharp/beetlex/beetlex.dockerfile | 4 +- .../CSharp/beetlex/benchmark_config.json | 19 - frameworks/CSharp/beetlex/config.toml | 12 - 25 files changed, 491 insertions(+), 446 deletions(-) create mode 100644 frameworks/CSharp/beetlex/PlatformBenchmarks/NetApplication.cs delete mode 100644 frameworks/CSharp/beetlex/beetlex-core-updb.dockerfile diff --git a/frameworks/CSharp/beetlex/Benchmarks.sln b/frameworks/CSharp/beetlex/Benchmarks.sln index 07298d57325..3922903f0b2 100644 --- a/frameworks/CSharp/beetlex/Benchmarks.sln +++ b/frameworks/CSharp/beetlex/Benchmarks.sln @@ -1,11 +1,11 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28010.2036 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34728.123 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Benchmarks", "Benchmarks\Benchmarks.csproj", "{12CA0190-5EA2-460F-ABC4-FAD454148EBF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlatformBenchmarks", "PlatformBenchmarks\PlatformBenchmarks.csproj", "{8ACF83AD-E861-4642-BEF3-A6211F99389D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlatformBenchmarks", "PlatformBenchmarks\PlatformBenchmarks.csproj", "{8ACF83AD-E861-4642-BEF3-A6211F99389D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/frameworks/CSharp/beetlex/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/beetlex/Benchmarks/Benchmarks.csproj index 01cb00297fd..2ae062718ff 100644 --- a/frameworks/CSharp/beetlex/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/beetlex/Benchmarks/Benchmarks.csproj @@ -2,13 +2,12 @@ Exe - net5.0 + net8.0 true - - + diff --git a/frameworks/CSharp/beetlex/Benchmarks/Program.cs b/frameworks/CSharp/beetlex/Benchmarks/Program.cs index 05ba5ed2db8..30f02f76908 100644 --- a/frameworks/CSharp/beetlex/Benchmarks/Program.cs +++ b/frameworks/CSharp/beetlex/Benchmarks/Program.cs @@ -6,9 +6,9 @@ using System.Threading; using System.Text; using BeetleX.Buffers; -using SpanJson; using System.Collections.Generic; using BeetleX.EventArgs; +using System.Text.Json; namespace Benchmarks { @@ -109,8 +109,8 @@ public async virtual Task StartAsync(CancellationToken cancellationToken) mComplete.TrySetResult(new object()); }; mApiServer.Open(); - RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Delay Us=500;Write Coalescing Buffer Threshold Bytes=1000"; - //RawDb._connectionString = "Server=192.168.2.19;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; + RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; + //RawDb._connectionString = "Server=localhost;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; await mComplete.Task; } @@ -140,7 +140,8 @@ public SpanJsonResult(object data) public override void Write(PipeStream stream, HttpResponse response) { - JsonSerializer.NonGeneric.Utf8.SerializeAsync(Data, stream); + + JsonSerializer.Serialize(stream, Data); ; } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs index c1ef0fa4722..ca668243fe7 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs @@ -7,11 +7,11 @@ using System.Runtime.Versioning; using System.Text; using System.Threading.Tasks; -using System.Runtime.InteropServices.ComTypes; -using BeetleX.EventArgs; + using Microsoft.Extensions.Caching.Memory; using Npgsql; + namespace PlatformBenchmarks { public class RawDb @@ -342,7 +342,6 @@ public static void Init() } } mInited = true; - HttpServer.ApiServer.Log(LogType.Info, null, $"Init update commands cached"); return; } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs index ac9266097ba..76e15ce9f7f 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs @@ -1,4 +1,5 @@ -using BeetleX.Buffers; + +using BeetleX.Light.Memory; using System; using System.Collections.Generic; using System.Text; @@ -99,7 +100,7 @@ private ArraySegment GetData() return GetData(DateTime.Now); } - public void Write(PipeStream stream) + public void Write(IStreamWriter stream) { var data = DATE; stream.Write(data.Array, 0, data.Count); diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs index 13d89c6fc97..2b2264ea60a 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs @@ -1,18 +1,18 @@ -using BeetleX; -using BeetleX.Buffers; -using SpanJson; +using BeetleX.Light.Memory; using System; using System.Collections.Generic; +using System.IO; using System.Text; +using System.Text.Json; using System.Threading.Tasks; namespace PlatformBenchmarks { public partial class HttpHandler { - - public async Task caching(string queryString, PipeStream stream, HttpToken token, ISession session) + + public async Task caching(string queryString, IStreamWriter stream) { int count = 1; if (!string.IsNullOrEmpty(queryString)) @@ -30,20 +30,39 @@ public async Task caching(string queryString, PipeStream stream, HttpToken token count = 500; if (count < 1) count = 1; + ContentLengthMemory content = new ContentLengthMemory(); try { - var data = await token.Db.LoadCachedQueries(count); + var data = await _db.LoadCachedQueries(count); stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); - token.ContentLength = stream.Allocate(HttpHandler._LengthSize); + content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); - token.ContentPostion = stream.CacheLength; - await JsonSerializer.NonGeneric.Utf8.SerializeAsync(data, stream); + stream.WriteSequenceNetStream.StartWriteLength(); + + var jsonWriter = GetJsonWriter(stream); + using (var unflush = stream.UnFlush()) + { + jsonWriter.WriteStartArray(); + foreach (var item in data) + { + jsonWriter.WriteStartObject(); + jsonWriter.WriteNumber("Id", item.Id); + jsonWriter.WriteNumber("RandomNumber", item.RandomNumber); + jsonWriter.WriteEndObject(); + } + jsonWriter.WriteEndArray(); + jsonWriter.Flush(); + + } } catch (Exception e_) { - stream.Write(e_.Message); + Context.GetLoger(BeetleX.Light.Logs.LogLevel.Error)?.WriteException(Context, "PlatformBenchmarks", "caching", e_); + stream.WriteString(e_.Message); } - OnCompleted(stream, session, token); + var len = stream.WriteSequenceNetStream.EndWriteLength(); + content.Full(len); + } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs index 8e5b65d9c79..e623afdd72b 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs @@ -1,15 +1,21 @@ -using BeetleX; -using BeetleX.Buffers; -using BeetleX.EventArgs; -using SpanJson; +using BeetleX.Light; +using BeetleX.Light.Memory; using System; +using System.Buffers; using System.Collections.Generic; +using System.IO; +using System.IO.Pipelines; using System.Text; +using System.Text.Json; using System.Threading.Tasks; namespace PlatformBenchmarks { - public partial class HttpHandler : ServerHandlerBase + + + + + public partial class HttpHandler : SesionBase { private static readonly AsciiString _line = new AsciiString("\r\n"); @@ -45,7 +51,7 @@ public partial class HttpHandler : ServerHandlerBase private static readonly AsciiString _cached_worlds = "/cached-worlds"; - private readonly static uint _jsonPayloadSize = (uint)System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(new JsonMessage { message = "Hello, World!" }, SerializerOptions).Length; + private readonly static uint _jsonPayloadSize = (uint)System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(new JsonMessage { message = "Hello, World!" }).Length; @@ -65,14 +71,12 @@ public partial class HttpHandler : ServerHandlerBase private readonly static AsciiString _jsonResultPreamble = _httpsuccess + _headerContentTypeJson - + _headerServer - + _headerContentLength; + + _headerServer; private readonly static AsciiString _HtmlResultPreamble = _httpsuccess + _headerContentTypeHtml - + _headerServer - + _headerContentLength; + + _headerServer; @@ -83,24 +87,49 @@ public partial class HttpHandler : ServerHandlerBase private static byte _question = 63; - public HttpHandler() + struct ContentLengthMemory + { + public Memory Data { get; set; } + + public void Full(int length) + { + _headerContentLength.Data.CopyTo(Data); + var span = Data.Slice(_headerContentLength.Length).Span; + var len = span.Write(length.ToString(), Encoding.ASCII); + for (int i = len; i < span.Length - 2; i++) + { + span[i] = 32; + } + span[^2] = 13; + span[^1] = 10; + } + } + + + protected Memory GetContentLengthMemory(IStreamWriter writer) { - RequestDispatchs = new BeetleX.Dispatchs.DispatchCenter(OnRequest, Math.Min(Environment.ProcessorCount, 16)); + var result = writer.WriteSequenceNetStream.GetWriteMemory(28); + writer.WriteSequenceNetStream.WriteAdvance(28); + return result; } - private BeetleX.Dispatchs.DispatchCenter RequestDispatchs; + public NetContext Context { get; set; } + + public HttpHandler() + { + } + private Queue _Requests = new Queue(); - public override void Connected(IServer server, ConnectedEventArgs e) + private RawDb _db; + + private RequestData _ReadRequest = null; + public override void Connected(NetContext context) { - base.Connected(server, e); - e.Session.Socket.NoDelay = true; - var token = new HttpToken(); - token.ThreadDispatcher = RequestDispatchs.Next(); - token.Session = e.Session; - token.Db = new RawDb(new ConcurrentRandom(), Npgsql.NpgsqlFactory.Instance); - e.Session.Tag = token; + base.Connected(context); + this.Context = context; + _db = new RawDb(new ConcurrentRandom(), Npgsql.NpgsqlFactory.Instance); ; } private int AnalysisUrl(ReadOnlySpan url) @@ -114,195 +143,216 @@ private int AnalysisUrl(ReadOnlySpan url) } - private void OnRequest(HttpToken token) + public override void Receive(NetContext context, object message) { - if (token.Requests.TryDequeue(out RequestData result)) + var stream = context.Reader.ReadSequenceNetStream; + var reader = stream.GetReadOnlySequence(); + var len = reader.IndexOf(_line); + while (len != null) { - OnStartRequest(result, token.Session, token, token.Session.Stream.ToPipeStream()); - } - } - - public override void SessionReceive(IServer server, SessionReceiveEventArgs e) - { - base.SessionReceive(server, e); - PipeStream pipeStream = e.Session.Stream.ToPipeStream(); - HttpToken token = (HttpToken)e.Session.Tag; - var result = pipeStream.IndexOfLine(); - while (result.End != null) - { - if (result.Length == 2) + var lendata = len.Value; + stream.ReadAdvance(lendata.Length); + if (lendata.Length == 2) { - pipeStream.ReadFree(result.Length); - OnStartRequest(token.CurrentRequest, e.Session, token, pipeStream); + _Requests.Enqueue(_ReadRequest); + _ReadRequest = null; } else { - if (token.CurrentRequest == null) + if (_ReadRequest == null) + { + _ReadRequest = new RequestData(); + } + if (_ReadRequest.Action == null) { - var request = new RequestData(); - byte[] buffer = null; - buffer = new byte[result.Length]; - pipeStream.Read(buffer, 0, result.Length); - request.Data = new ArraySegment(buffer, 0, result.Length); - AnalysisAction(request); - if (request.Action == ActionType.Plaintext) - { - token.CurrentRequest = request; - } - else - { - token.CurrentRequest = request; - pipeStream.ReadFree((int)pipeStream.Length); - OnStartRequest(request, e.Session, token, pipeStream); - return; - } + AnalysisAction(lendata, out var type, out var querystring); + _ReadRequest.Action = type; + _ReadRequest.QueryString = querystring; + } else { - pipeStream.ReadFree(result.Length); + } } - if (pipeStream.Length > 0) - result = pipeStream.IndexOfLine(); - else - break; + reader = stream.GetReadOnlySequence(); + len = reader.IndexOf(_line); + } + if (_Requests.Count > 0) + { + OnStartRequest(context.Writer); } } - private void AnalysisAction(RequestData requestData) + //public override void SessionReceive(IServer server, SessionReceiveEventArgs e) + //{ + // base.SessionReceive(server, e); + // PipeStream pipeStream = e.Session.Stream.ToPipeStream(); + // HttpToken token = (HttpToken)e.Session.Tag; + // var result = pipeStream.IndexOfLine(); + // while (result.End != null) + // { + // if (result.Length == 2) + // { + // pipeStream.ReadFree(result.Length); + // OnStartRequest(token.CurrentRequest, e.Session, token, pipeStream); + // } + // else + // { + // if (token.CurrentRequest == null) + // { + // var request = new RequestData(); + // byte[] buffer = null; + // buffer = new byte[result.Length]; + // pipeStream.Read(buffer, 0, result.Length); + // request.Data = new ArraySegment(buffer, 0, result.Length); + // AnalysisAction(request); + // if (request.Action == ActionType.Plaintext) + // { + // token.CurrentRequest = request; + // } + // else + // { + // token.CurrentRequest = request; + // pipeStream.ReadFree((int)pipeStream.Length); + // OnStartRequest(request, e.Session, token, pipeStream); + // return; + // } + // } + // else + // { + // pipeStream.ReadFree(result.Length); + // } + // } + // if (pipeStream.Length > 0) + // result = pipeStream.IndexOfLine(); + // else + // break; + // } + //} + + private void AnalysisAction(ReadOnlySequence line, out ActionType type, out string queryString) { - var line = _line.AsSpan(); - int len = requestData.Data.Count; - var receiveData = requestData.GetSpan(); - ReadOnlySpan http = line; - ReadOnlySpan method = line; - ReadOnlySpan url = line; - int offset2 = 0; - int count = 0; - for (int i = 0; i < len; i++) - { - if (receiveData[i] == line[0]) - { - http = receiveData.Slice(offset2, i - offset2); - break; - } - else - { - if (receiveData[i] == _Space) - { - if (count != 0) - { - url = receiveData.Slice(offset2, i - offset2); - offset2 = i + 1; - } - else - { - method = receiveData.Slice(offset2, i - offset2); - offset2 = i + 1; - count++; - } - } - } - } - int queryIndex = AnalysisUrl(url); - ReadOnlySpan baseUrl = default; - ReadOnlySpan queryString = default; - if (queryIndex > 0) + type = ActionType.Plaintext; + queryString = default; + var spanIndex = line.PositionOf((byte)32); + var postion = line.GetPosition(1, spanIndex.Value); + line = line.Slice(postion); + spanIndex = line.PositionOf((byte)32); + var url = line.Slice(0, spanIndex.Value); + int baseurlLen = 0; + spanIndex = url.PositionOf((byte)63); + if (spanIndex != null) { - baseUrl = url.Slice(0, queryIndex); - queryString = url.Slice(queryIndex + 1, url.Length - queryIndex - 1); - requestData.QueryString = Encoding.ASCII.GetString(queryString); + baseurlLen = (int)url.Slice(0, spanIndex.Value).Length; + queryString = url.Slice(baseurlLen + 1).ReadString(Encoding.ASCII); } else { - baseUrl = url; + baseurlLen = (int)url.Length; } + + Span baseUrl = stackalloc byte[baseurlLen]; + url.Slice(0, baseurlLen).CopyTo(baseUrl); + if (baseUrl.Length == _path_Plaintext.Length && baseUrl.StartsWith(_path_Plaintext)) { - requestData.Action = ActionType.Plaintext; + type = ActionType.Plaintext; } else if (baseUrl.Length == _path_Json.Length && baseUrl.StartsWith(_path_Json)) { - requestData.Action = ActionType.Json; + type = ActionType.Json; } else if (baseUrl.Length == _path_Db.Length && baseUrl.StartsWith(_path_Db)) { - requestData.Action = ActionType.Db; + type = ActionType.Db; } else if (baseUrl.Length == _path_Queries.Length && baseUrl.StartsWith(_path_Queries)) { - requestData.Action = ActionType.Queries; + type = ActionType.Queries; } else if (baseUrl.Length == _cached_worlds.Length && baseUrl.StartsWith(_cached_worlds)) { - requestData.Action = ActionType.Caching; + type = ActionType.Caching; } else if (baseUrl.Length == _path_Updates.Length && baseUrl.StartsWith(_path_Updates)) { - requestData.Action = ActionType.Updates; + type = ActionType.Updates; } else if (baseUrl.Length == _path_Fortunes.Length && baseUrl.StartsWith(_path_Fortunes)) { - requestData.Action = ActionType.Fortunes; + type = ActionType.Fortunes; } else { - requestData.Action = ActionType.Other; + type = ActionType.Other; } } - public virtual async Task OnStartRequest(RequestData data, ISession session, HttpToken token, PipeStream stream) + public async Task OnStartRequest(IStreamWriter stream) { - ActionType type = data.Action; - if (type == ActionType.Plaintext) - { - await Plaintext(stream, token, session); - } - else if (type == ActionType.Json) - { - await Json(stream, token, session); - } - else if (type == ActionType.Db) - { - await db(stream, token, session); - } - else if (type == ActionType.Queries) - { - await queries(data.QueryString, stream, token, session); - } - else if (type == ActionType.Caching) - { - await caching(data.QueryString, stream, token, session); - } - else if (type == ActionType.Updates) - { - await updates(data.QueryString, stream, token, session); - } - else if (type == ActionType.Fortunes) + bool haveData = false; + while (_Requests.Count > 0) { - await fortunes(stream, token, session); + haveData = true; + var data = _Requests.Dequeue(); + ActionType type = data.Action.Value; + if (type == ActionType.Plaintext) + { + Plaintext(stream); + } + else if (type == ActionType.Json) + { + Json(stream); + } + else if (type == ActionType.Db) + { + await db(stream); + } + else if (type == ActionType.Queries) + { + await queries(data.QueryString, stream); + } + else if (type == ActionType.Caching) + { + await caching(data.QueryString, stream); + } + else if (type == ActionType.Updates) + { + await updates(data.QueryString, stream); + } + else if (type == ActionType.Fortunes) + { + await fortunes(stream); + } + else + { + await Default(stream); + } } - else + if (haveData) { - await Default(stream, token, session); + stream.Flush(); } - } - private void OnCompleted(PipeStream stream, ISession session, HttpToken token) + + + private Utf8JsonWriter GetJsonWriter(IStreamWriter stream) { - var type = token.CurrentRequest.Action; - if (type != ActionType.Plaintext && type != ActionType.Json) - { - token.FullLength((stream.CacheLength - token.ContentPostion).ToString()); - } - if (token.Requests.IsEmpty && stream.Length == 0) - session.Stream.Flush(); - token.CurrentRequest = null; + Utf8JsonWriter utf8JsonWriter = _utf8JsonWriter ??= new Utf8JsonWriter((Stream)stream.WriteSequenceNetStream, new JsonWriterOptions { SkipValidation = true }); + utf8JsonWriter.Reset((Stream)stream.WriteSequenceNetStream); + return utf8JsonWriter; } + [ThreadStatic] + private static Utf8JsonWriter _utf8JsonWriter; + public static JsonWriterOptions _jsonWriterOptions = new JsonWriterOptions + { + SkipValidation = true + }; } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs index a6f6c8f2291..27c71d43f13 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs @@ -1,8 +1,7 @@ -using BeetleX; -using BeetleX.Buffers; -using SpanJson; +using BeetleX.Light.Memory; using System; using System.Collections.Generic; +using System.IO; using System.Text; using System.Threading.Tasks; @@ -12,23 +11,36 @@ public partial class HttpHandler { - public async ValueTask db(PipeStream stream, HttpToken token, ISession session) + public async Task db(IStreamWriter stream) { + ContentLengthMemory content = new ContentLengthMemory(); + try { - var data = await token.Db.LoadSingleQueryRow(); + var data = await _db.LoadSingleQueryRow(); stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); - token.ContentLength = stream.Allocate(HttpHandler._LengthSize); + content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); - token.ContentPostion = stream.CacheLength; - System.Text.Json.JsonSerializer.Serialize(GetUtf8JsonWriter(stream, token), data, SerializerOptions); + stream.WriteSequenceNetStream.StartWriteLength(); + var jsonWriter = GetJsonWriter(stream); + using (var unflush = stream.UnFlush()) + { + jsonWriter.WriteStartObject(); + jsonWriter.WriteNumber("Id", data.Id); + jsonWriter.WriteNumber("RandomNumber", data.RandomNumber); + jsonWriter.WriteEndObject(); + System.Text.Json.JsonSerializer.Serialize((Stream)stream.WriteSequenceNetStream, data); + } + } catch (Exception e_) { - HttpServer.ApiServer.Log(BeetleX.EventArgs.LogType.Error, null, $"db error {e_.Message}@{e_.StackTrace}"); - stream.Write(e_.Message); + Context.GetLoger(BeetleX.Light.Logs.LogLevel.Error)?.WriteException(Context, "PlatformBenchmarks", "db", e_); + stream.WriteString(e_.Message); } - OnCompleted(stream, session, token); + var len = stream.WriteSequenceNetStream.EndWriteLength(); + content.Full(len); + } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.default.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.default.cs index acbaff5b164..2300e16a4b2 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.default.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.default.cs @@ -1,6 +1,7 @@ -using BeetleX; -using BeetleX.Buffers; + +using BeetleX.Light.Memory; using System; +using System.Buffers; using System.Collections.Generic; using System.Linq; using System.Text; @@ -15,16 +16,19 @@ public partial class HttpHandler + _headerContentTypeJson.ToString() + _headerServer.ToString(); - public Task Default(PipeStream stream, HttpToken token, ISession session) - { + public ValueTask Default(IStreamWriter stream) + { + stream.Write(_defaultPreamble.Data, 0, _defaultPreamble.Length); - token.ContentLength = stream.Allocate(HttpHandler._LengthSize); + ContentLengthMemory contentLength = new ContentLengthMemory(); + contentLength.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); - token.ContentPostion = stream.CacheLength; - stream.Write(" beetlex server
"); - stream.Write("path not found!"); - OnCompleted(stream, session, token); - return Task.CompletedTask; + stream.WriteSequenceNetStream.StartWriteLength(); + stream.WriteString(" beetlex server
"); + stream.WriteString("path not found!"); + var length = stream.WriteSequenceNetStream.EndWriteLength(); + contentLength.Full(length); + return ValueTask.CompletedTask; } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs index 55250710b35..829c18bd68a 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs @@ -1,5 +1,5 @@ -using BeetleX; -using BeetleX.Buffers; + +using BeetleX.Light.Memory; using System; using System.Collections.Generic; using System.Globalization; @@ -13,87 +13,56 @@ namespace PlatformBenchmarks public partial class HttpHandler { + static readonly HtmlEncoder htmlEncoder = CreateHtmlEncoder(); + static HtmlEncoder CreateHtmlEncoder() + { + var settings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Katakana, UnicodeRanges.Hiragana); + settings.AllowCharacter('\u2014'); // allow EM DASH through + return HtmlEncoder.Create(settings); + } + private readonly static AsciiString _fortunesTableStart = "Fortunes"; private readonly static AsciiString _fortunesRowStart = ""; private readonly static AsciiString _fortunesTableEnd = "
idmessage
"; private readonly static AsciiString _fortunesColumn = ""; private readonly static AsciiString _fortunesRowEnd = "
"; - protected HtmlEncoder HtmlEncoder { get; } = CreateHtmlEncoder(); - - private static HtmlEncoder CreateHtmlEncoder() - { - var settings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Katakana, UnicodeRanges.Hiragana); - settings.AllowCharacter('\u2014'); // allow EM DASH through - return HtmlEncoder.Create(settings); - } - public async Task fortunes(PipeStream stream, HttpToken token, ISession session) + public async Task fortunes(IStreamWriter stream) { + ContentLengthMemory content = new ContentLengthMemory(); try { - var data = await token.Db.LoadFortunesRows(); + var data = await this._db.LoadFortunesRows(); stream.Write(_HtmlResultPreamble.Data, 0, _HtmlResultPreamble.Length); - token.ContentLength = stream.Allocate(HttpHandler._LengthSize); + content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); - token.ContentPostion = stream.CacheLength; - var html = token.GetHtmlBufferWriter(); - html.Reset(); - html.Write(_fortunesTableStart.Data, 0, _fortunesTableStart.Length); + stream.WriteSequenceNetStream.StartWriteLength(); + stream.Write(_fortunesTableStart.Data, 0, _fortunesTableStart.Length); foreach (var item in data) { - html.Write(_fortunesRowStart.Data, 0, _fortunesRowStart.Length); - WriteNumeric(html, (uint)item.Id); - html.Write(_fortunesColumn.Data, 0, _fortunesColumn.Length); - html.Write(HtmlEncoder.Encode(item.Message)); - html.Write(_fortunesRowEnd.Data, 0, _fortunesRowEnd.Length); + stream.Write(_fortunesRowStart.Data, 0, _fortunesRowStart.Length); + stream.WriteString(item.Id.ToString(CultureInfo.InvariantCulture)); + stream.Write(_fortunesColumn.Data, 0, _fortunesColumn.Length); + stream.WriteString(htmlEncoder.Encode(item.Message)); + stream.Write(_fortunesRowEnd.Data, 0, _fortunesRowEnd.Length); } - html.Write(_fortunesTableEnd.Data, 0, _fortunesTableEnd.Length); - stream.Write(html.Data, 0, html.Length); - + stream.Write(_fortunesTableEnd.Data, 0, _fortunesTableEnd.Length); } catch (Exception e_) { - HttpServer.ApiServer.Log(BeetleX.EventArgs.LogType.Error, null, $"fortunes error {e_.Message}@{e_.StackTrace}"); - stream.Write(e_.Message); - } - OnCompleted(stream, session, token); - } - - internal void WriteNumeric(HtmlBufferWriter writer, uint number) - { - const byte AsciiDigitStart = (byte)'0'; - - if (number < 10) - { - writer.Write((byte)(number + AsciiDigitStart)); - + Context.GetLoger(BeetleX.Light.Logs.LogLevel.Error)?.WriteException(Context, "PlatformBenchmarks", "fortunes", e_); + stream.WriteString(e_.Message); } - else if (number < 100) - { - var tens = (byte)((number * 205u) >> 11); // div10, valid to 1028 - var span = new byte[2]; - span[0] = (byte)(tens + AsciiDigitStart); - span[1] = (byte)(number - (tens * 10) + AsciiDigitStart); - writer.Write(span, 0, 2); + var len = stream.WriteSequenceNetStream.EndWriteLength(); + content.Full(len); - } - else if (number < 1000) - { - var digit0 = (byte)((number * 41u) >> 12); // div100, valid to 1098 - var digits01 = (byte)((number * 205u) >> 11); // div10, valid to 1028 - var span = new byte[3]; - span[0] = (byte)(digit0 + AsciiDigitStart); - span[1] = (byte)(digits01 - (digit0 * 10) + AsciiDigitStart); - span[2] = (byte)(number - (digits01 * 10) + AsciiDigitStart); - writer.Write(span, 0, 3); - } } - internal void WriteNumeric(PipeStream stream, uint number) + internal void WriteNumeric(IStreamWriter stream, uint number) { const byte AsciiDigitStart = (byte)'0'; diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs index 1577248fa81..1bfa2d8863f 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs @@ -1,8 +1,10 @@ using BeetleX; -using BeetleX.Buffers; -using SpanJson; + +using BeetleX.Light.Memory; + using System; using System.Collections.Generic; +using System.IO; using System.Text; using System.Text.Json; using System.Threading.Tasks; @@ -11,29 +13,21 @@ namespace PlatformBenchmarks { public partial class HttpHandler { - - private static readonly JsonSerializerOptions SerializerOptions = new JsonSerializerOptions(); - private static Utf8JsonWriter GetUtf8JsonWriter(PipeStream stream, HttpToken token) - { - var buffer = stream.CreateBufferWriter(); - if (token.Utf8JsonWriter == null) - { - token.Utf8JsonWriter = new Utf8JsonWriter(buffer, new JsonWriterOptions { SkipValidation = true }); - } - var writer = token.Utf8JsonWriter; - writer.Reset(buffer); - return writer; - } - - public ValueTask Json(PipeStream stream, HttpToken token, ISession session) + public void Json(IStreamWriter stream) { stream.Write(_jsonPreamble.Data, 0, _jsonPreamble.Length); GMTDate.Default.Write(stream); - System.Text.Json.JsonSerializer.Serialize(GetUtf8JsonWriter(stream, token), new JsonMessage { message = "Hello, World!" }, SerializerOptions); - OnCompleted(stream, session, token); - return ValueTask.CompletedTask; + var jsonWriter = GetJsonWriter(stream); + using (var unflush = stream.UnFlush()) + { + jsonWriter.WriteStartObject(); + jsonWriter.WriteString("message", "Hello, World!"); + jsonWriter.WriteEndObject(); + jsonWriter.Flush(); + } + } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs index 83741829b84..a011d52f7f4 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs @@ -1,5 +1,5 @@ -using BeetleX; -using BeetleX.Buffers; + +using BeetleX.Light.Memory; using System; using System.Collections.Generic; using System.Text; @@ -11,13 +11,11 @@ public partial class HttpHandler { - public ValueTask Plaintext(PipeStream stream, HttpToken token, ISession session) + public void Plaintext(IStreamWriter stream) { stream.Write(_plaintextPreamble.Data, 0, _plaintextPreamble.Length); GMTDate.Default.Write(stream); stream.Write(_result_plaintext.Data, 0, _result_plaintext.Length); - OnCompleted(stream, session, token); - return ValueTask.CompletedTask; } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs index 8027191667c..53eef8a31fb 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs @@ -1,24 +1,24 @@ -using BeetleX; -using BeetleX.Buffers; -using SpanJson; +using BeetleX.Light.Memory; using System; using System.Collections.Generic; +using System.IO; using System.Text; +using System.Text.Json; using System.Threading.Tasks; namespace PlatformBenchmarks { public partial class HttpHandler { - public async ValueTask queries(string queryString, PipeStream stream, HttpToken token, ISession session) + public async ValueTask queries(string queryString, IStreamWriter stream) { int count = 1; - if(!string.IsNullOrEmpty(queryString)) + if (!string.IsNullOrEmpty(queryString)) { var values = queryString.Split('='); - if(values.Length>1) + if (values.Length > 1) { - if(int.TryParse(values[1],out int size)) + if (int.TryParse(values[1], out int size)) { count = size; } @@ -28,20 +28,39 @@ public async ValueTask queries(string queryString, PipeStream stream, HttpToken count = 500; if (count < 1) count = 1; + ContentLengthMemory content = new ContentLengthMemory(); try { - var data = await token.Db.LoadMultipleQueriesRows(count); + var data = await _db.LoadMultipleQueriesRows(count); stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); - token.ContentLength = stream.Allocate(HttpHandler._LengthSize); + content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); - token.ContentPostion = stream.CacheLength; - System.Text.Json.JsonSerializer.Serialize(GetUtf8JsonWriter(stream, token), data, SerializerOptions); + + stream.WriteSequenceNetStream.StartWriteLength(); + + var jsonWriter = GetJsonWriter(stream); + using (var unflush = stream.UnFlush()) + { + jsonWriter.WriteStartArray(); + foreach (var item in data) + { + jsonWriter.WriteStartObject(); + jsonWriter.WriteNumber("Id", item.Id); + jsonWriter.WriteNumber("RandomNumber", item.RandomNumber); + jsonWriter.WriteEndObject(); + } + jsonWriter.WriteEndArray(); + jsonWriter.Flush(); + + } } catch (Exception e_) { - stream.Write(e_.Message); + Context.GetLoger(BeetleX.Light.Logs.LogLevel.Error)?.WriteException(Context, "PlatformBenchmarks", "queries", e_); + stream.WriteString(e_.Message); } - OnCompleted(stream, session, token); + var len = stream.WriteSequenceNetStream.EndWriteLength(); + content.Full(len); } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs index 8f3e6d84815..255a430c070 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs @@ -1,16 +1,17 @@ -using BeetleX; -using BeetleX.Buffers; -using SpanJson; + +using BeetleX.Light.Memory; using System; using System.Collections.Generic; +using System.IO; using System.Text; +using System.Text.Json; using System.Threading.Tasks; namespace PlatformBenchmarks { public partial class HttpHandler { - public async ValueTask updates(string queryString, PipeStream stream, HttpToken token, ISession session) + public async ValueTask updates(string queryString, IStreamWriter stream) { int count = 1; if (!string.IsNullOrEmpty(queryString)) @@ -28,22 +29,24 @@ public async ValueTask updates(string queryString, PipeStream stream, HttpToken count = 500; if (count < 1) count = 1; + ContentLengthMemory content = new ContentLengthMemory(); try { - var data = await token.Db.LoadMultipleUpdatesRows(count); + var data = await _db.LoadMultipleUpdatesRows(count); stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); - token.ContentLength = stream.Allocate(HttpHandler._LengthSize); + content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); - token.ContentPostion = stream.CacheLength; - System.Text.Json.JsonSerializer.Serialize(GetUtf8JsonWriter(stream, token), data, SerializerOptions); + stream.WriteSequenceNetStream.StartWriteLength(); + JsonSerializer.Serialize((Stream)stream.WriteSequenceNetStream, data); } catch (Exception e_) { - HttpServer.ApiServer.Log(BeetleX.EventArgs.LogType.Error, null, $"updates error {e_.Message}@{e_.StackTrace}"); - stream.Write(e_.Message); + Context.GetLoger(BeetleX.Light.Logs.LogLevel.Error)?.WriteException(Context, "PlatformBenchmarks", "updates", e_); + stream.WriteString(e_.Message); } - OnCompleted(stream, session, token); + var len = stream.WriteSequenceNetStream.EndWriteLength(); + content.Full(len); } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs index 422da242a7a..b8ee7c5f495 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs @@ -1,5 +1,5 @@ -using BeetleX; -using BeetleX.EventArgs; +using BeetleX.Light; +using BeetleX.Light.Logs; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; @@ -11,38 +11,44 @@ namespace PlatformBenchmarks { public class HttpServer : IHostedService { - public static IServer ApiServer; + private static NetServer _apiServer; public virtual Task StartAsync(CancellationToken cancellationToken) { + ThreadPool.SetMinThreads(Environment.ProcessorCount * 2, Environment.ProcessorCount * 2); + Constants.MemorySegmentMinSize = 1024 * 8; + Constants.MemorySegmentMaxSize = 1024 * 8; + Constants.InitMemoryBlock(); ArraySegment date = GMTDate.Default.DATE; - ServerOptions serverOptions = new ServerOptions(); - serverOptions.LogLevel = LogType.Error; - serverOptions.DefaultListen.Port = 8080; - serverOptions.Statistical = false; - serverOptions.BufferPoolMaxMemory = 1000; - serverOptions.BufferPoolSize = 1024 * 24; - ApiServer = SocketFactory.CreateTcpServer(serverOptions); - ApiServer.Open(); + _apiServer = new NetServer(); + _apiServer.Options.LogLevel = BeetleX.Light.Logs.LogLevel.Error; + _apiServer.Options.AddLogOutputHandler(); + _apiServer.Options.SetDefaultListen(o => + { + o.Port = 8080; + }); + _apiServer.Start(); + + if (!Program.UpDB) { - RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Delay Us=500;Write Coalescing Buffer Threshold Bytes=1000"; - // RawDb._connectionString = "Server=192.168.2.19;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; + RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; + //RawDb._connectionString = "Server=127.0.0.1;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; } else { - RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3;Multiplexing=true;Write Coalescing Delay Us=500;Write Coalescing Buffer Threshold Bytes=1000"; - // RawDb._connectionString = "Server=192.168.2.19;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; + RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; + //RawDb._connectionString = "Server=127.0.0.1;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; } - // ApiServer.Log(LogType.Info, null, $"Debug mode [{Program.Debug}]"); + // ApiServer.Log(LogType.Info, null, $"Debug mode [{Program.Debug}]"); return Task.CompletedTask; } public virtual Task StopAsync(CancellationToken cancellationToken) { - ApiServer.Dispose(); + return Task.CompletedTask; } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpToken.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpToken.cs index 3d85f8426e5..09d845f6b7e 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpToken.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpToken.cs @@ -1,76 +1,76 @@ -using BeetleX; -using BeetleX.Buffers; -using BeetleX.Dispatchs; -using System; -using System.Collections.Concurrent; -using System.Text; -using System.Text.Json; +//using BeetleX; +//using BeetleX.Buffers; +//using BeetleX.Dispatchs; +//using System; +//using System.Collections.Concurrent; +//using System.Text; +//using System.Text.Json; -namespace PlatformBenchmarks -{ - public class HttpToken - { - private byte[] mLengthBuffer = new byte[10]; +//namespace PlatformBenchmarks +//{ +// public class HttpToken +// { +// private byte[] mLengthBuffer = new byte[10]; - public RawDb Db { get; set; } +// public RawDb Db { get; set; } - public HttpToken() - { +// public HttpToken() +// { - } +// } - public SingleThreadDispatcher ThreadDispatcher { get; set; } +// public SingleThreadDispatcher ThreadDispatcher { get; set; } - public ConcurrentQueue Requests { get; set; } = new ConcurrentQueue(); +// public ConcurrentQueue Requests { get; set; } = new ConcurrentQueue(); - public Utf8JsonWriter Utf8JsonWriter { get; set; } +// public Utf8JsonWriter Utf8JsonWriter { get; set; } - public ISession Session { get; set; } +// public ISession Session { get; set; } - public RequestData CurrentRequest { get; set; } +// public RequestData CurrentRequest { get; set; } - private HtmlBufferWriter mHtmlBufferWriter = null; +// private HtmlBufferWriter mHtmlBufferWriter = null; - public HtmlBufferWriter GetHtmlBufferWriter() - { - if (mHtmlBufferWriter == null) - mHtmlBufferWriter = new HtmlBufferWriter(2048); - return mHtmlBufferWriter; - } +// public HtmlBufferWriter GetHtmlBufferWriter() +// { +// if (mHtmlBufferWriter == null) +// mHtmlBufferWriter = new HtmlBufferWriter(2048); +// return mHtmlBufferWriter; +// } - public byte[] GetLengthBuffer(string length) - { - Encoding.ASCII.GetBytes(length, 0, length.Length, mLengthBuffer, 0); - for (int i = length.Length; i < mLengthBuffer.Length; i++) - { - mLengthBuffer[i] = 32; - } - mLengthBuffer[6] = (byte)'\r'; - mLengthBuffer[7] = (byte)'\n'; - return mLengthBuffer; - } +// public byte[] GetLengthBuffer(string length) +// { +// Encoding.ASCII.GetBytes(length, 0, length.Length, mLengthBuffer, 0); +// for (int i = length.Length; i < mLengthBuffer.Length; i++) +// { +// mLengthBuffer[i] = 32; +// } +// mLengthBuffer[6] = (byte)'\r'; +// mLengthBuffer[7] = (byte)'\n'; +// return mLengthBuffer; +// } - public int ContentPostion { get; set; } +// public int ContentPostion { get; set; } - public MemoryBlockCollection ContentLength { get; set; } +// public MemoryBlockCollection ContentLength { get; set; } - public void FullLength(string length) - { - var item = GetLengthBuffer(length); - ContentLength.Full(item); - } +// public void FullLength(string length) +// { +// var item = GetLengthBuffer(length); +// ContentLength.Full(item); +// } - private int mProcessStatus = 0; +// private int mProcessStatus = 0; - public void CompletedProcess() - { - System.Threading.Interlocked.Exchange(ref mProcessStatus, 0); - } +// public void CompletedProcess() +// { +// System.Threading.Interlocked.Exchange(ref mProcessStatus, 0); +// } - public bool EnterProcess() - { - return System.Threading.Interlocked.CompareExchange(ref mProcessStatus, 1, 0) == 0; - } +// public bool EnterProcess() +// { +// return System.Threading.Interlocked.CompareExchange(ref mProcessStatus, 1, 0) == 0; +// } - } -} +// } +//} diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/NetApplication.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/NetApplication.cs new file mode 100644 index 00000000000..da5b14f5b96 --- /dev/null +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/NetApplication.cs @@ -0,0 +1,19 @@ +using BeetleX.Light; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace PlatformBenchmarks +{ + public class HttpNetApplication : ApplicationBase + { + public override bool Connecting(Socket socket, ListenHandler handler) + { + socket.NoDelay = true; + return true; + } + } +} diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj index d3c07772725..10202a882be 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj @@ -2,17 +2,17 @@ Exe - net5.0 + net8.0 true - - - - - + + + + + diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs index 774acc842ee..3819a6c7e1d 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; +using System.IO; namespace PlatformBenchmarks { @@ -14,7 +15,12 @@ class Program public static void Main(string[] args) { //Debug = (args != null && args.Length > 0 && args[0] == "debug"); + var data = GMTDate.Default.DATE; UpDB = (args != null && args.Length > 0 && args[0] == "updb"); + UpdateCommandsCached.Init(); + //HttpServer server = new HttpServer(); + //server.StartAsync(default); + //Console.ReadLine(); new HostBuilder().ConfigureServices(delegate (HostBuilderContext hostContext, IServiceCollection services) { services.AddHostedService(); diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/RequestData.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/RequestData.cs index ab5b8080aee..f4d45c9174e 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/RequestData.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/RequestData.cs @@ -1,4 +1,5 @@ using System; +using System.Buffers; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,24 +7,12 @@ namespace PlatformBenchmarks { - public class RequestData : IDisposable + public class RequestData { - public ArraySegment Data { get; set; } - - public ReadOnlySpan GetSpan() - { - return new ReadOnlySpan(Data.Array, Data.Offset, Data.Count); - } - - public void Dispose() - { - - //System.Buffers.ArrayPool.Shared.Return(Data.Array); - } public string QueryString { get; set; } - public ActionType Action { get; set; } + public ActionType? Action { get; set; } } diff --git a/frameworks/CSharp/beetlex/beetlex-core-updb.dockerfile b/frameworks/CSharp/beetlex/beetlex-core-updb.dockerfile deleted file mode 100644 index b813173db92..00000000000 --- a/frameworks/CSharp/beetlex/beetlex-core-updb.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build -WORKDIR /app -COPY PlatformBenchmarks . -RUN dotnet publish -c Release -o out - -FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime -WORKDIR /app -COPY --from=build /app/out ./ - -EXPOSE 8080 - -ENTRYPOINT ["dotnet", "PlatformBenchmarks.dll","updb"] diff --git a/frameworks/CSharp/beetlex/beetlex-core.dockerfile b/frameworks/CSharp/beetlex/beetlex-core.dockerfile index 84f4b69a3ff..cd9b870469a 100644 --- a/frameworks/CSharp/beetlex/beetlex-core.dockerfile +++ b/frameworks/CSharp/beetlex/beetlex-core.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY PlatformBenchmarks . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/beetlex/beetlex.dockerfile b/frameworks/CSharp/beetlex/beetlex.dockerfile index 8540e376359..78deeac145e 100644 --- a/frameworks/CSharp/beetlex/beetlex.dockerfile +++ b/frameworks/CSharp/beetlex/beetlex.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine 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:5.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/beetlex/benchmark_config.json b/frameworks/CSharp/beetlex/benchmark_config.json index b5e85bfbf49..67f3a560196 100644 --- a/frameworks/CSharp/beetlex/benchmark_config.json +++ b/frameworks/CSharp/beetlex/benchmark_config.json @@ -48,25 +48,6 @@ "display_name": "beetlex-core", "notes": "", "versus": "aspcore" - }, - "core-updb": { - "update_url": "/updates?queries=", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "beetlex", - "language": "C#", - "orm": "Raw", - "platform": ".NET", - "flavor": "CoreCLR", - "webserver": "beetlex", - "os": "Linux", - "database_os": "Linux", - "display_name": "beetlex-core-updb", - "notes": "", - "versus": "aspcore" } } ] diff --git a/frameworks/CSharp/beetlex/config.toml b/frameworks/CSharp/beetlex/config.toml index 3e389ec3a67..ec807d12eb2 100644 --- a/frameworks/CSharp/beetlex/config.toml +++ b/frameworks/CSharp/beetlex/config.toml @@ -36,15 +36,3 @@ platform = ".NET" webserver = "beetlex" versus = "aspcore" -[core-updb] -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = ".NET" -webserver = "beetlex" -versus = "aspcore" From 24acdc5e625bb464157e0d379f28043fd6751f15 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Sat, 8 Jun 2024 00:03:15 +0200 Subject: [PATCH 0659/1766] [crystal|kemal] Update dependencies (#9063) --- .../kemal/kemal-concurrent-queries.dockerfile | 2 +- frameworks/Crystal/kemal/kemal.dockerfile | 2 +- frameworks/Crystal/kemal/shard.lock | 42 +++++++++---------- frameworks/Crystal/kemal/shard.yml | 6 +-- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/frameworks/Crystal/kemal/kemal-concurrent-queries.dockerfile b/frameworks/Crystal/kemal/kemal-concurrent-queries.dockerfile index 549ca8e3cb6..0f4f2b39231 100644 --- a/frameworks/Crystal/kemal/kemal-concurrent-queries.dockerfile +++ b/frameworks/Crystal/kemal/kemal-concurrent-queries.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:0.32.1 +FROM crystallang/crystal:1.12.1 WORKDIR /kemal COPY views views diff --git a/frameworks/Crystal/kemal/kemal.dockerfile b/frameworks/Crystal/kemal/kemal.dockerfile index 03bdf0c4ef3..baafb59538e 100644 --- a/frameworks/Crystal/kemal/kemal.dockerfile +++ b/frameworks/Crystal/kemal/kemal.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:0.32.1 +FROM crystallang/crystal:1.12.1 WORKDIR /kemal COPY views views diff --git a/frameworks/Crystal/kemal/shard.lock b/frameworks/Crystal/kemal/shard.lock index 8d4253e5645..c7bf83e3078 100644 --- a/frameworks/Crystal/kemal/shard.lock +++ b/frameworks/Crystal/kemal/shard.lock @@ -1,38 +1,38 @@ -version: 1.0 +version: 2.0 shards: + backtracer: + git: https://github.com/sija/backtracer.cr.git + version: 1.2.2 + commander: - github: snluu/commander - commit: 9396efd427f06f0f6de5206f6e81d54fcd254abe + git: https://github.com/snluu/commander.git + version: 0.1.0+git.commit.9396efd427f06f0f6de5206f6e81d54fcd254abe db: - github: crystal-lang/crystal-db - version: 0.8.0 + git: https://github.com/crystal-lang/crystal-db.git + version: 0.13.1 exception_page: - github: crystal-loot/exception_page - version: 0.1.2 + git: https://github.com/crystal-loot/exception_page.git + version: 0.4.1 kemal: - github: kemalcr/kemal - version: 0.26.1 - - kilt: - github: jeromegn/kilt - version: 0.4.0 + git: https://github.com/kemalcr/kemal.git + version: 1.5.0 pg: - github: will/crystal-pg - version: 0.20.0 + git: https://github.com/will/crystal-pg.git + version: 0.28.0 pool: - github: ysbaddaden/pool - version: 0.2.3 + git: https://github.com/ysbaddaden/pool.git + version: 0.3.0 radix: - github: luislavena/radix - version: 0.3.9 + git: https://github.com/luislavena/radix.git + version: 0.4.1 redis: - github: stefanwille/crystal-redis - version: 2.5.3 + git: https://github.com/stefanwille/crystal-redis.git + version: 2.8.0 diff --git a/frameworks/Crystal/kemal/shard.yml b/frameworks/Crystal/kemal/shard.yml index 1a9a88e8e8a..2277be2b8b7 100644 --- a/frameworks/Crystal/kemal/shard.yml +++ b/frameworks/Crystal/kemal/shard.yml @@ -6,12 +6,12 @@ license: MIT dependencies: pg: github: will/crystal-pg - version: 0.20.0 + version: 0.28.0 kemal: github: kemalcr/kemal - version: 0.26.1 + version: 1.5.0 redis: github: stefanwille/crystal-redis - version: 2.5.3 + version: 2.8.0 commander: github: snluu/commander From cea238462d45373dceeb2eead62e88630fe27c43 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 7 Jun 2024 15:15:44 -0700 Subject: [PATCH 0660/1766] fix for real (#9103) --- toolset/continuous/tfb-shutdown.sh | 6 ------ toolset/continuous/tfb-startup.sh | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/toolset/continuous/tfb-shutdown.sh b/toolset/continuous/tfb-shutdown.sh index db96b07941b..d257182b623 100644 --- a/toolset/continuous/tfb-shutdown.sh +++ b/toolset/continuous/tfb-shutdown.sh @@ -30,10 +30,4 @@ ssh techempower@$TFB_DATABASE_HOST "$(typeset -f docker_clean); docker_clean" echo "running docker_clean on client host" ssh techempower@$TFB_CLIENT_HOST "$(typeset -f docker_clean); docker_clean" -if [ -z "$TFB_RUN_ORDER" ]; then - export TFB_RUN_ORDER="reverse" -else - unset TFB_RUN_ORDER -fi - echo "done with tfb-shutdown script" diff --git a/toolset/continuous/tfb-startup.sh b/toolset/continuous/tfb-startup.sh index b0be7622bf5..c008df0d07f 100644 --- a/toolset/continuous/tfb-startup.sh +++ b/toolset/continuous/tfb-startup.sh @@ -20,6 +20,12 @@ git clone \ echo "moving to tfb directory" cd $TFB_REPOPARENT/$TFB_REPONAME +if [ -z "$TFB_RUN_ORDER" ]; then + export TFB_RUN_ORDER="reverse" +else + unset TFB_RUN_ORDER +fi + echo "building tfb docker image" docker build -t techempower/tfb \ --build-arg USER_ID=$(id -u) \ From ca97cdeda8dd11e43083ab8b147ecdad3483787a Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Tue, 11 Jun 2024 22:11:45 +0200 Subject: [PATCH 0661/1766] [micronaut] Update to micronaut-platform 4.5.0 (#9114) * Disable testresources and downgrade docker images This is an attempt to fix the JIT-only regression introduced by f2b0b607acb50c71890f00693bc2f467d217ba4f . * Update to micronaut-platform 4.5.0 --- 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 6d8a8be3f5c..ba63eab22c9 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion=4.4.3 +micronautVersion=4.5.0 From d4d455765458927e8ee42346a45ee46a3c72e136 Mon Sep 17 00:00:00 2001 From: itrofimow Date: Wed, 12 Jun 2024 00:12:29 +0400 Subject: [PATCH 0662/1766] [C++] [userver] fix docker images (#9113) --- frameworks/C++/userver/userver-bare.dockerfile | 2 +- frameworks/C++/userver/userver.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/userver/userver-bare.dockerfile b/frameworks/C++/userver/userver-bare.dockerfile index 4605e6bb582..a318a9601b7 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:v2 AS builder +FROM ghcr.io/userver-framework/ubuntu-22.04-userver-pg AS builder RUN apt update && \ apt install -y lsb-release wget software-properties-common gnupg && \ diff --git a/frameworks/C++/userver/userver.dockerfile b/frameworks/C++/userver/userver.dockerfile index cbdceea1862..9b45edd2418 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:v2 AS builder +FROM ghcr.io/userver-framework/ubuntu-22.04-userver-pg AS builder RUN apt update && \ apt install -y lsb-release wget software-properties-common gnupg && \ From d5d45b16e3bc1c7b4d7c34caeca9903bcac9ff62 Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Tue, 11 Jun 2024 13:12:54 -0700 Subject: [PATCH 0663/1766] [F#/Oxpecker] Improved json, fortunes and updates benchmarks (#9112) * [F#/Oxpecker] Improved json and fortunes bencmarks * [F#/Oxpecker] Improved multi-update benchmark * [F#/Oxpecker] Refactoring --- frameworks/FSharp/oxpecker/src/App/Program.fs | 78 ++++++++++--------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index 944e0518155..bdb95afa593 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -7,12 +7,17 @@ open Oxpecker [] module Common = + [] [] - type Fortune = - { - id : int - message : string - } + type JsonMessage = { + message : string + } + + [] + type Fortune = { + id: int + message: string + } [] let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" @@ -43,13 +48,13 @@ module HtmlViews = th() { raw "message" } } - let fortunes (fortunes: Fortune[]) = + let fortunes fortunesData = table() { fortunesTableHeader - for f in fortunes do + for fortune in fortunesData do tr() { - td() { raw <| string f.id } - td() { f.message } + td() { raw <| string fortune.id } + td() { fortune.message } } } |> layout @@ -67,13 +72,11 @@ module HttpHandlers = message = "Additional fortune added at request time." } - let private renderFortunes (ctx: HttpContext) dbFortunes = - let augmentedData = [| - yield! dbFortunes - extra - |] - Array.Sort(augmentedData, FortuneComparer) - augmentedData |> HtmlViews.fortunes |> ctx.WriteHtmlView + let rec private renderFortunes (ctx: HttpContext) (dbFortunes: Fortune seq) = + let data = dbFortunes.AsList() + data.Add extra + data.Sort FortuneComparer + data |> HtmlViews.fortunes |> ctx.WriteHtmlView let private fortunes : EndpointHandler = fun ctx -> @@ -85,11 +88,10 @@ module HttpHandlers = [] [] - type World = - { - id: int - randomnumber: int - } + type World = { + id: int + randomnumber: int + } let private readSingleRow (conn: NpgsqlConnection) = conn.QueryFirstOrDefaultAsync( @@ -127,7 +129,7 @@ module HttpHandlers = } let private maxBatch = 500 - let mutable private queries = Array.zeroCreate (maxBatch + 1) + let private queries = Array.zeroCreate (maxBatch + 1) let private batchUpdateString batchSize = match queries[batchSize] with @@ -141,7 +143,17 @@ module HttpHandlers = let result = sb.ToString() queries[batchSize] <- result result - | q -> q + | q -> + q + + let private generateParameters (results: World[]) = + let parameters = Dictionary() + for i in 0..results.Length-1 do + let randomNumber = Random.Shared.Next(1, 10001) + parameters[$"@Rn_{i}"] <- randomNumber + parameters[$"@Id_{i}"] <- results[i].id + results[i] <- { results[i] with randomnumber = randomNumber } + parameters let private multipleUpdates : EndpointHandler = fun ctx -> @@ -153,12 +165,7 @@ module HttpHandlers = for i in 0..results.Length-1 do let! result = readSingleRow conn results[i] <- result - let parameters = Dictionary() - for i in 0..results.Length-1 do - let randomNumber = Random.Shared.Next(1, 10001) - parameters[$"@Rn_{i}"] <- randomNumber - parameters[$"@Id_{i}"] <- results[i].id - results[i] <- { results[i] with randomnumber = randomNumber } + let parameters = generateParameters results let! _ = conn.ExecuteAsync(batchUpdateString count, parameters) return! ctx.WriteJsonChunked results } @@ -177,7 +184,7 @@ module HttpHandlers = let endpoints = [| route "/plaintext" <| utf8Const "Hello, World!" - route "/json"<| jsonSimple {| message = "Hello, World!" |} + route "/json" <| jsonSimple { message = "Hello, World!" } route "/fortunes" fortunes route "/db" singleQuery route "/queries/{count?}" multipleQueries @@ -195,11 +202,12 @@ module Main = let builder = WebApplication.CreateBuilder(args) builder.Services .AddRouting() - .AddOxpecker() - |> ignore - builder.Logging.ClearProviders() |> ignore + .AddOxpecker() |> ignore + builder.Logging + .ClearProviders() |> ignore let app = builder.Build() - app.UseRouting() - .UseOxpecker HttpHandlers.endpoints |> ignore + app + .UseRouting() + .UseOxpecker(HttpHandlers.endpoints) |> ignore app.Run() 0 \ No newline at end of file From 31ef34b4e929103fd31493716eeaf9cb30a28715 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Tue, 11 Jun 2024 22:13:13 +0200 Subject: [PATCH 0664/1766] [Python] Bump granian to 1.4 (#9111) * [Python] Bump granian to 1.4 * [Python] Update Emmett server params --- frameworks/Python/emmett/run.py | 3 +-- frameworks/Python/granian/requirements.txt | 2 +- frameworks/Python/granian/run.py | 5 ++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frameworks/Python/emmett/run.py b/frameworks/Python/emmett/run.py index 658eadb7d5f..42679101ea0 100644 --- a/frameworks/Python/emmett/run.py +++ b/frameworks/Python/emmett/run.py @@ -12,8 +12,7 @@ host="0.0.0.0", port=8080, workers=cpus, - threads=2, - backlog=2048, + backlog=16384, threading_mode='runtime', enable_websockets=False, log_level="warn" diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index 75e49987e80..e1b7c479119 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.29.0 -granian>=1.3.1,<1.4.0 +granian>=1.4.2,<1.5.0 jinja2==3.1.4 orjson==3.10.2 diff --git a/frameworks/Python/granian/run.py b/frameworks/Python/granian/run.py index 82e785e5406..acdad59a542 100644 --- a/frameworks/Python/granian/run.py +++ b/frameworks/Python/granian/run.py @@ -10,7 +10,6 @@ workers = multiprocessing.cpu_count() if threading_mode == "workers": workers = round(workers / 2) - threads = 1 Granian( f"app_{interface}:main", @@ -18,8 +17,8 @@ port=8080, workers=workers, threading_mode=threading_mode, - threads=threads, - backlog=2048, + blocking_threads=1, + backlog=16384, interface=interface, http="1", websockets=False From 48316c28bbd582e6eed10b39f74b743f3b2d00cf Mon Sep 17 00:00:00 2001 From: Chrislearn Young Date: Wed, 12 Jun 2024 04:14:33 +0800 Subject: [PATCH 0665/1766] [salvo] Update to version 0.68 (#9110) * [salvo] Update to version 0.68 * cargo fmt * ok --- frameworks/Rust/salvo/Cargo.toml | 9 ++--- frameworks/Rust/salvo/salvo-diesel.dockerfile | 2 +- frameworks/Rust/salvo/salvo-lru.dockerfile | 2 +- .../Rust/salvo/salvo-mongo-raw.dockerfile | 2 +- frameworks/Rust/salvo/salvo-mongo.dockerfile | 2 +- .../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 +- frameworks/Rust/salvo/src/db_pg_pool.rs | 3 +- frameworks/Rust/salvo/src/db_sqlx.rs | 2 +- frameworks/Rust/salvo/src/main.rs | 25 +++++++++++-- frameworks/Rust/salvo/src/main_diesel.rs | 14 +++---- frameworks/Rust/salvo/src/main_mongo.rs | 5 ++- frameworks/Rust/salvo/src/main_pg.rs | 37 ++++--------------- frameworks/Rust/salvo/src/main_pg_pool.rs | 9 +++-- frameworks/Rust/salvo/src/main_sqlx.rs | 7 +++- 17 files changed, 64 insertions(+), 63 deletions(-) diff --git a/frameworks/Rust/salvo/Cargo.toml b/frameworks/Rust/salvo/Cargo.toml index 0ac4ec76ee3..a7795fc6636 100644 --- a/frameworks/Rust/salvo/Cargo.toml +++ b/frameworks/Rust/salvo/Cargo.toml @@ -40,8 +40,8 @@ anyhow = "1" async-trait = "0.1" bytes = "1" diesel = { version = "2", features = ["postgres", "r2d2"] } -deadpool = { version = "0.11", features = ["rt_tokio_1", "serde", "managed"] } -deadpool-postgres = "0.13" +deadpool = { version = "0.12", features = ["rt_tokio_1", "serde", "managed"] } +deadpool-postgres = "0.14" futures-util = "0.3" lru = "0.12.0" markup = "0.15" @@ -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.67", default-features = false, features = ["anyhow", "server", "http1", "affix"] } +salvo = { version = "0.68", default-features = false, features = ["anyhow", "server", "http1", "affix"] } serde = { version = "1", features = ["derive"] } serde_json = "1" # smallvec = "1" @@ -64,7 +64,4 @@ dotenv = "0.15.0" [profile.release] lto = true -opt-level = 3 codegen-units = 1 -panic = "abort" - diff --git a/frameworks/Rust/salvo/salvo-diesel.dockerfile b/frameworks/Rust/salvo/salvo-diesel.dockerfile index a0bb3a12d8d..1577e454443 100644 --- a/frameworks/Rust/salvo/salvo-diesel.dockerfile +++ b/frameworks/Rust/salvo/salvo-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster 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 f209991e939..5f668adaf76 100644 --- a/frameworks/Rust/salvo/salvo-lru.dockerfile +++ b/frameworks/Rust/salvo/salvo-lru.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster 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 4219a6534c6..2fb904eb558 100644 --- a/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster 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 caac03db963..e8a454910c1 100644 --- a/frameworks/Rust/salvo/salvo-mongo.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster 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 13628c45050..8ef7fc1eeda 100644 --- a/frameworks/Rust/salvo/salvo-pg-pool.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg-pool.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster 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 0b5c075fb63..70deda13cd6 100644 --- a/frameworks/Rust/salvo/salvo-pg.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster 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 5866030195a..7d88a5d20d9 100644 --- a/frameworks/Rust/salvo/salvo-sqlx.dockerfile +++ b/frameworks/Rust/salvo/salvo-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster 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 b0d748a60ab..8f0d750dcee 100644 --- a/frameworks/Rust/salvo/salvo.dockerfile +++ b/frameworks/Rust/salvo/salvo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.78-buster ADD ./ /salvo WORKDIR /salvo diff --git a/frameworks/Rust/salvo/src/db_pg_pool.rs b/frameworks/Rust/salvo/src/db_pg_pool.rs index bc1f546e922..064dc34cdae 100644 --- a/frameworks/Rust/salvo/src/db_pg_pool.rs +++ b/frameworks/Rust/salvo/src/db_pg_pool.rs @@ -1,10 +1,9 @@ use deadpool_postgres::{Client, Manager, ManagerConfig, RecyclingMethod}; use tokio_pg_mapper::FromTokioPostgresRow; -use tokio_postgres::{NoTls, Row, Error, Statement}; +use tokio_postgres::{Error, NoTls, Row, Statement}; use crate::{Fortune, World}; - pub async fn create_pool(database_url: String, max_pool_size: u32) -> deadpool_postgres::Pool { let pg_config: tokio_postgres::Config = database_url.parse().expect("invalid database url"); diff --git a/frameworks/Rust/salvo/src/db_sqlx.rs b/frameworks/Rust/salvo/src/db_sqlx.rs index 64ab3696da8..73e5f82afe3 100644 --- a/frameworks/Rust/salvo/src/db_sqlx.rs +++ b/frameworks/Rust/salvo/src/db_sqlx.rs @@ -1,7 +1,7 @@ use sqlx::{ pool::PoolConnection, postgres::{PgArguments, PgPoolOptions}, - Arguments, PgPool, Postgres, Error + Arguments, Error, PgPool, Postgres, }; use crate::{Fortune, World}; diff --git a/frameworks/Rust/salvo/src/main.rs b/frameworks/Rust/salvo/src/main.rs index 1326a09b57c..63e2ca12cd2 100644 --- a/frameworks/Rust/salvo/src/main.rs +++ b/frameworks/Rust/salvo/src/main.rs @@ -2,8 +2,10 @@ // static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; use std::sync::Arc; +use std::thread::available_parallelism; use bytes::Bytes; +use salvo::conn::tcp::TcpAcceptor; use salvo::http::body::ResBody; use salvo::http::header::{self, HeaderValue}; use salvo::prelude::*; @@ -11,6 +13,7 @@ use serde::Serialize; mod utils; + #[derive(Serialize)] pub struct Message { pub message: &'static str, @@ -35,8 +38,7 @@ fn plaintext(res: &mut Response) { headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/plain")); res.body(ResBody::Once(Bytes::from_static(b"Hello, world!"))); } -#[tokio::main] -async + fn main() { let router = Arc::new( Router::new() @@ -44,13 +46,28 @@ fn main() { .push(Router::with_path("json").get(json)), ); + let thread_count = available_parallelism().map(|n| n.get()).unwrap_or(16); + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + for _ in 1..thread_count { + let router = router.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + rt.block_on(serve(router)); + }); + } println!("Started http server: 127.0.0.1:8080"); - serve(router).await; + rt.block_on(serve(router)); } async fn serve(router: Arc) { // let acceptor: TcpAcceptor = utils::reuse_listener().unwrap().try_into().unwrap(); - let acceptor = TcpListener::new("0.0.0.0:8080").bind().await; + let acceptor: TcpAcceptor = utils::reuse_listener().unwrap().try_into().unwrap(); let mut server = Server::new(acceptor); let http1 = server.http1_mut(); http1.pipeline_flush(true); diff --git a/frameworks/Rust/salvo/src/main_diesel.rs b/frameworks/Rust/salvo/src/main_diesel.rs index 063b814e191..7e2e9f8b36a 100644 --- a/frameworks/Rust/salvo/src/main_diesel.rs +++ b/frameworks/Rust/salvo/src/main_diesel.rs @@ -15,6 +15,7 @@ use std::thread::available_parallelism; use anyhow::Error; use diesel::prelude::*; use diesel::r2d2::{ConnectionManager, Pool, PoolError, PooledConnection}; +use dotenv::dotenv; use once_cell::sync::OnceCell; use rand::rngs::SmallRng; use rand::{Rng, SeedableRng}; @@ -22,7 +23,6 @@ use salvo::conn::tcp::TcpAcceptor; use salvo::http::header::{self, HeaderValue}; use salvo::http::ResBody; use salvo::prelude::*; -use dotenv::dotenv; mod models_diesel; mod schema; @@ -135,7 +135,10 @@ async fn fortunes(res: &mut Response) -> Result<(), Error> { let headers = res.headers_mut(); headers.insert(header::SERVER, HeaderValue::from_static("salvo")); - headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/html; charset=utf-8")); + headers.insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=utf-8"), + ); res.body(ResBody::Once(Bytes::from(data))); Ok(()) } @@ -164,14 +167,11 @@ markup::define! { fn main() { dotenv().ok(); - + let db_url: String = utils::get_env_var("TECHEMPOWER_POSTGRES_URL"); let max_pool_size: u32 = utils::get_env_var("TECHEMPOWER_MAX_POOL_SIZE"); DB_POOL - .set( - create_pool(&db_url, max_pool_size) - .unwrap_or_else(|_| panic!("Error connecting to {}", &db_url)), - ) + .set(create_pool(&db_url, max_pool_size).unwrap_or_else(|_| panic!("Error connecting to {}", &db_url))) .ok(); let router = Arc::new( diff --git a/frameworks/Rust/salvo/src/main_mongo.rs b/frameworks/Rust/salvo/src/main_mongo.rs index 46db9bf847c..372fc5bd7b8 100644 --- a/frameworks/Rust/salvo/src/main_mongo.rs +++ b/frameworks/Rust/salvo/src/main_mongo.rs @@ -102,7 +102,10 @@ async fn fortunes(res: &mut Response, depot: &mut Depot) -> Result<(), Error> { let headers = res.headers_mut(); headers.insert(header::SERVER, HeaderValue::from_static("salvo")); - headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/html; charset=utf-8")); + headers.insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=utf-8"), + ); res.body(ResBody::Once(Bytes::from(data))); Ok(()) } diff --git a/frameworks/Rust/salvo/src/main_pg.rs b/frameworks/Rust/salvo/src/main_pg.rs index 0d54a192004..dfa6be4ef9f 100644 --- a/frameworks/Rust/salvo/src/main_pg.rs +++ b/frameworks/Rust/salvo/src/main_pg.rs @@ -36,13 +36,7 @@ impl WorldHandler { } #[async_trait] impl Handler for WorldHandler { - async fn handle( - &self, - _req: &mut Request, - _depot: &mut Depot, - res: &mut Response, - _ctrl: &mut FlowCtrl, - ) { + async fn handle(&self, _req: &mut Request, _depot: &mut Depot, res: &mut Response, _ctrl: &mut FlowCtrl) { let world = self.conn.get_world().await.unwrap(); let data = serde_json::to_vec(&world).unwrap(); let headers = res.headers_mut(); @@ -66,13 +60,7 @@ impl WorldsHandler { } #[async_trait] impl Handler for WorldsHandler { - async fn handle( - &self, - req: &mut Request, - _depot: &mut Depot, - res: &mut Response, - _ctrl: &mut FlowCtrl, - ) { + async fn handle(&self, req: &mut Request, _depot: &mut Depot, res: &mut Response, _ctrl: &mut FlowCtrl) { let count = req.query::("q").unwrap_or(1); let count = cmp::min(500, cmp::max(1, count)); let worlds = self.conn.get_worlds(count).await.unwrap(); @@ -99,13 +87,7 @@ impl UpdatesHandler { } #[async_trait] impl Handler for UpdatesHandler { - async fn handle( - &self, - req: &mut Request, - _depot: &mut Depot, - res: &mut Response, - _ctrl: &mut FlowCtrl, - ) { + async fn handle(&self, req: &mut Request, _depot: &mut Depot, res: &mut Response, _ctrl: &mut FlowCtrl) { let count = req.query::("q").unwrap_or(1); let count = cmp::min(500, cmp::max(1, count)); let worlds = self.conn.update(count).await.unwrap(); @@ -132,19 +114,16 @@ impl FortunesHandler { } #[async_trait] impl Handler for FortunesHandler { - async fn handle( - &self, - _req: &mut Request, - _depot: &mut Depot, - res: &mut Response, - _ctrl: &mut FlowCtrl, - ) { + async fn handle(&self, _req: &mut Request, _depot: &mut Depot, res: &mut Response, _ctrl: &mut FlowCtrl) { let mut data = String::new(); write!(&mut data, "{}", self.conn.tell_fortune().await.unwrap()).unwrap(); let headers = res.headers_mut(); headers.insert(header::SERVER, HeaderValue::from_static("salvo")); - headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/html; charset=utf-8")); + headers.insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=utf-8"), + ); res.body(ResBody::Once(Bytes::from(data))); } } diff --git a/frameworks/Rust/salvo/src/main_pg_pool.rs b/frameworks/Rust/salvo/src/main_pg_pool.rs index 75078c42ff1..f72f1c64a09 100644 --- a/frameworks/Rust/salvo/src/main_pg_pool.rs +++ b/frameworks/Rust/salvo/src/main_pg_pool.rs @@ -11,6 +11,7 @@ use std::thread::available_parallelism; use anyhow::Error; use bytes::Bytes; use deadpool_postgres::Pool; +use dotenv::dotenv; use futures_util::{stream::FuturesUnordered, TryStreamExt}; use once_cell::sync::OnceCell; use rand::rngs::SmallRng; @@ -19,7 +20,6 @@ use salvo::conn::tcp::TcpAcceptor; use salvo::http::header::{self, HeaderValue}; use salvo::http::ResBody; use salvo::prelude::*; -use dotenv::dotenv; mod db_pg_pool; mod models_pg_pool; @@ -129,7 +129,10 @@ async fn fortunes(res: &mut Response) -> Result<(), Error> { let headers = res.headers_mut(); headers.insert(header::SERVER, HeaderValue::from_static("salvo")); - headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/html; charset=utf-8")); + headers.insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=utf-8"), + ); res.body(ResBody::Once(Bytes::from(data))); Ok(()) } @@ -158,7 +161,7 @@ markup::define! { fn main() { dotenv().ok(); - + let db_url: String = utils::get_env_var("TECHEMPOWER_POSTGRES_URL"); let max_pool_size: u32 = utils::get_env_var("TECHEMPOWER_MAX_POOL_SIZE"); let rt = tokio::runtime::Builder::new_current_thread() diff --git a/frameworks/Rust/salvo/src/main_sqlx.rs b/frameworks/Rust/salvo/src/main_sqlx.rs index 2dca03f4e31..6fc8f72c922 100644 --- a/frameworks/Rust/salvo/src/main_sqlx.rs +++ b/frameworks/Rust/salvo/src/main_sqlx.rs @@ -9,6 +9,7 @@ use std::thread::available_parallelism; use anyhow::Error; use bytes::Bytes; +use dotenv::dotenv; use once_cell::sync::OnceCell; use rand::rngs::SmallRng; use rand::{Rng, SeedableRng}; @@ -17,7 +18,6 @@ use salvo::http::header::{self, HeaderValue}; use salvo::http::ResBody; use salvo::prelude::*; use sqlx::PgPool; -use dotenv::dotenv; mod db_sqlx; mod models_sqlx; @@ -62,7 +62,10 @@ async fn fortunes(res: &mut Response) -> Result<(), Error> { let headers = res.headers_mut(); headers.insert(header::SERVER, HeaderValue::from_static("salvo")); - headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/html; charset=utf-8")); + headers.insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=utf-8"), + ); res.body(ResBody::Once(Bytes::from(data))); Ok(()) } From a4ac3866e45f3a290b90187a49fc713223fefe80 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Jun 2024 22:14:52 +0200 Subject: [PATCH 0666/1766] Remove unmaintained Octopus framework (#9109) The last commit was 6 years ago and according to the about "..this project is no longer actively maintained". https://github.com/LuaMobile/octopus --- frameworks/Lua/octopus/README.md | 35 ------------ frameworks/Lua/octopus/app/config.lua | 16 ------ .../octopus/app/src/FortunesController.lua | 34 ----------- .../app/src/JsonSerializationController.lua | 4 -- .../app/src/MultipleQueriesController.lua | 36 ------------ .../octopus/app/src/PlaintextController.lua | 2 - .../octopus/app/src/SingleQueryController.lua | 24 -------- .../Lua/octopus/app/src/UpdateController.lua | 39 ------------- frameworks/Lua/octopus/app/src/types.lua | 12 ---- frameworks/Lua/octopus/benchmark_config.json | 28 ---------- frameworks/Lua/octopus/config.lua | 39 ------------- frameworks/Lua/octopus/config.toml | 19 ------- frameworks/Lua/octopus/octopus.dockerfile | 56 ------------------- 13 files changed, 344 deletions(-) delete mode 100644 frameworks/Lua/octopus/README.md delete mode 100644 frameworks/Lua/octopus/app/config.lua delete mode 100644 frameworks/Lua/octopus/app/src/FortunesController.lua delete mode 100644 frameworks/Lua/octopus/app/src/JsonSerializationController.lua delete mode 100644 frameworks/Lua/octopus/app/src/MultipleQueriesController.lua delete mode 100644 frameworks/Lua/octopus/app/src/PlaintextController.lua delete mode 100644 frameworks/Lua/octopus/app/src/SingleQueryController.lua delete mode 100644 frameworks/Lua/octopus/app/src/UpdateController.lua delete mode 100644 frameworks/Lua/octopus/app/src/types.lua delete mode 100644 frameworks/Lua/octopus/benchmark_config.json delete mode 100644 frameworks/Lua/octopus/config.lua delete mode 100644 frameworks/Lua/octopus/config.toml delete mode 100644 frameworks/Lua/octopus/octopus.dockerfile diff --git a/frameworks/Lua/octopus/README.md b/frameworks/Lua/octopus/README.md deleted file mode 100644 index 64df0adbd75..00000000000 --- a/frameworks/Lua/octopus/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Octopus (Nginx + LuaJIT) Benchmark Test - -The test lua app is inside [app](app) directory. -The configuration is in [config.lua](config.lua). -Clones, compiles and runs nginx with ngx_lua module, see [openresty.org](http://openresty.org). -Prerequisites: ```libssl-dev gcc g++ build-essential```. -Requires [git](https://git-scm.com). -Requires postgresql hostname specified as IP address, if not possible then add resolver conf to [config.lua](config.lua). -The Octopus benchmark is using its ORM, and no raw queries. - - -## Test URLs -### Plaintext URL - -http://localhost:8080/plaintext - -### JSON Encoding - -http://localhost:8080/json - -### Single Row Random Query - -http://localhost:8080/db - -### Multiple Row Query Test - -http://localhost:8080/queries?queries=2 - -### Fortune URL - -http://localhost:8080/fortunes - -### DB Updates URL - -http://localhost:8080/update?queries=2 diff --git a/frameworks/Lua/octopus/app/config.lua b/frameworks/Lua/octopus/app/config.lua deleted file mode 100644 index d230c3fafeb..00000000000 --- a/frameworks/Lua/octopus/app/config.lua +++ /dev/null @@ -1,16 +0,0 @@ -local config = {} -- extension configuration - -config.locations = { - {name = "/plaintext", script = "PlaintextController.lua"}, - {name = "/json", script = "JsonSerializationController.lua"}, - {name = "/db", script = "SingleQueryController.lua"}, - {name = "/queries", script = "MultipleQueriesController.lua"}, - {name = "/fortunes", script = "FortunesController.lua"}, - {name = "/update", script = "UpdateController.lua"}, -} - -config.types = { - "types.lua" -} - -return config -- return extension configuration \ No newline at end of file diff --git a/frameworks/Lua/octopus/app/src/FortunesController.lua b/frameworks/Lua/octopus/app/src/FortunesController.lua deleted file mode 100644 index ed3dfd4bfac..00000000000 --- a/frameworks/Lua/octopus/app/src/FortunesController.lua +++ /dev/null @@ -1,34 +0,0 @@ -local json = require "json" -local database = require "database" -local exit = require "exit" - -local template = require'template' -template.caching(false) --- Compile template, disable cache, enable plain text view to skip filesystem loading -local view = template.compile([[Fortunes{% for _,f in ipairs(fortunes) do %}{% end %}
idmessage
{{ f.id }}{{ f.message }}
]], nil, true) - - -local function process (db) - local fortunes = db:find({Fortune = {}}) - table.insert(fortunes, {id = 0, message = "Additional fortune added at request time."}) - table.sort(fortunes, function(a, b) - return a.message < b.message - end) - return fortunes -end - - -local status, db = pcall(database.connect) -if not status then exit(db) end - -local status, res = pcall(process, db) -db:close() - -if status then - local html = view({fortunes = res}) - ngx.header.content_type = 'text/html; charset=utf-8' - ngx.header.content_length = #html - ngx.print(html) -else - exit(res) -end \ No newline at end of file diff --git a/frameworks/Lua/octopus/app/src/JsonSerializationController.lua b/frameworks/Lua/octopus/app/src/JsonSerializationController.lua deleted file mode 100644 index 258a95265e9..00000000000 --- a/frameworks/Lua/octopus/app/src/JsonSerializationController.lua +++ /dev/null @@ -1,4 +0,0 @@ -local json = require "json" - -ngx.header.content_type = 'application/json' -ngx.print(json.encode({message = "Hello, World!"})) \ No newline at end of file diff --git a/frameworks/Lua/octopus/app/src/MultipleQueriesController.lua b/frameworks/Lua/octopus/app/src/MultipleQueriesController.lua deleted file mode 100644 index 0afa4af7640..00000000000 --- a/frameworks/Lua/octopus/app/src/MultipleQueriesController.lua +++ /dev/null @@ -1,36 +0,0 @@ -local json = require "json" -local database = require "database" -local param = require "param" -local exit = require "exit" - - -local function process (db) - local op = db:operators() - - local num_queries = tonumber(param.queries) or 1 - if num_queries < 1 then - num_queries = 1 - elseif num_queries > 500 then - num_queries = 500 - end - - local worlds = {} - for i=1, num_queries do - worlds[#worlds + 1] = db:findOne({World = {id = op.equal(math.random(1,10000))}}) - end - return worlds -end - - -local status, db = pcall(database.connect) -if not status then exit(db) end - -local status, res = pcall(process, db) -db:close() - -if status then - ngx.header.content_type = 'application/json' - ngx.print(json.encode(res)) -else - exit(res) -end \ No newline at end of file diff --git a/frameworks/Lua/octopus/app/src/PlaintextController.lua b/frameworks/Lua/octopus/app/src/PlaintextController.lua deleted file mode 100644 index a5f6fadf29d..00000000000 --- a/frameworks/Lua/octopus/app/src/PlaintextController.lua +++ /dev/null @@ -1,2 +0,0 @@ -ngx.header.content_type = 'text/plain' -ngx.print("Hello, World!") \ No newline at end of file diff --git a/frameworks/Lua/octopus/app/src/SingleQueryController.lua b/frameworks/Lua/octopus/app/src/SingleQueryController.lua deleted file mode 100644 index 1e93e998010..00000000000 --- a/frameworks/Lua/octopus/app/src/SingleQueryController.lua +++ /dev/null @@ -1,24 +0,0 @@ -local json = require "json" -local database = require "database" -local exit = require "exit" - - -local function process (db) - local op = db:operators() - - return db:findOne({World = {id = op.equal(math.random(1,10000))}}) -end - - -local status, db = pcall(database.connect) -if not status then exit(db) end - -local status, res = pcall(process, db) -db:close() - -if status then - ngx.header.content_type = 'application/json' - ngx.print(json.encode(res)) -else - exit(res) -end \ No newline at end of file diff --git a/frameworks/Lua/octopus/app/src/UpdateController.lua b/frameworks/Lua/octopus/app/src/UpdateController.lua deleted file mode 100644 index 8e7c2f9017c..00000000000 --- a/frameworks/Lua/octopus/app/src/UpdateController.lua +++ /dev/null @@ -1,39 +0,0 @@ -local json = require "json" -local database = require "database" -local param = require "param" -local exit = require "exit" - - -local function process (db) - local op = db:operators() - - local num_queries = tonumber(param.queries) or 1 - if num_queries < 1 then - num_queries = 1 - elseif num_queries > 500 then - num_queries = 500 - end - - local worlds = {} - for i=1, num_queries do - local world = db:findOne({World = {id = op.equal(math.random(1,10000))}}) - world.randomNumber = math.random(1,10000) - db:update({World = world}) - worlds[#worlds + 1] = world - end - return worlds -end - - -local status, db = pcall(database.connect) -if not status then exit(db) end - -local status, res = pcall(process, db) -db:close() - -if status then - ngx.header.content_type = 'application/json' - ngx.print(json.encode(res)) -else - exit(res) -end \ No newline at end of file diff --git a/frameworks/Lua/octopus/app/src/types.lua b/frameworks/Lua/octopus/app/src/types.lua deleted file mode 100644 index be7cf95f0d8..00000000000 --- a/frameworks/Lua/octopus/app/src/types.lua +++ /dev/null @@ -1,12 +0,0 @@ -return { - - World = { - -- id field is implicitly defined by the ORM - randomNumber = "integer", - }, - - Fortune = { - -- id field is implicitly defined by the ORM - message = "string", - }, -} \ No newline at end of file diff --git a/frameworks/Lua/octopus/benchmark_config.json b/frameworks/Lua/octopus/benchmark_config.json deleted file mode 100644 index 2f31b882350..00000000000 --- a/frameworks/Lua/octopus/benchmark_config.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "framework": "octopus", - "tests": [{ - "default": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "MySQL", - "framework": "Octopus", - "language": "Lua", - "orm": "Full", - "platform": "OpenResty", - "webserver": "nginx", - "os": "Linux", - "database_os": "Linux", - "display_name": "Octopus", - "notes": "", - "versus": "openresty", - "tags": ["broken"] - } - }] -} diff --git a/frameworks/Lua/octopus/config.lua b/frameworks/Lua/octopus/config.lua deleted file mode 100644 index 80276c4b277..00000000000 --- a/frameworks/Lua/octopus/config.lua +++ /dev/null @@ -1,39 +0,0 @@ -return { - extensions = { - {octopusExtensionsDir, "core"}, - {octopusExtensionsDir, "baseline"}, - {octopusExtensionsDir, "orm"}, - {octopusExtensionsDir, "app"}, - }, - - octopusExtensionsDir = octopusExtensionsDir, - octopusHostDir = octopusHostDir, - port = 8080, - securePort = 38080, - luaCodeCache = "on", - serverName = "tfb-server", - errorLog = "error_log logs/error.log;", - accessLog = "access_log logs/access.log;", - includeDrop = [[#include drop.conf;]], - maxBodySize = "50k", - minifyJavaScript = false, - minifyCommand = [[java -jar ../yuicompressor-2.4.8.jar %s -o %s]], - - databaseConnection = { - rdbms = "mysql", - host = "DBHOSTNAME", - port = 3306, - database = "hello_world", - user = "benchmarkdbuser", - password = "benchmarkdbpass", - compact = false - }, - - globalParameters = { - octopusHostDir = octopusHostDir, - sourceCtxPath = "", - requireSecurity = false, - sessionTimeout = 3600, - usePreparedStatement = false, - }, -} diff --git a/frameworks/Lua/octopus/config.toml b/frameworks/Lua/octopus/config.toml deleted file mode 100644 index 30b1d7f6cfb..00000000000 --- a/frameworks/Lua/octopus/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "octopus" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "OpenResty" -webserver = "nginx" -versus = "openresty" diff --git a/frameworks/Lua/octopus/octopus.dockerfile b/frameworks/Lua/octopus/octopus.dockerfile deleted file mode 100644 index b2c13b02473..00000000000 --- a/frameworks/Lua/octopus/octopus.dockerfile +++ /dev/null @@ -1,56 +0,0 @@ -FROM buildpack-deps:xenial - -ENV LUA_VERSION="5.1" -ENV LUA_MICRO="5" - -RUN apt-get update -yqq && apt-get install -yqq unzip - -RUN wget https://github.com/LuaDist/lua/archive/$LUA_VERSION.$LUA_MICRO.tar.gz -RUN tar xf $LUA_VERSION.$LUA_MICRO.tar.gz - -ENV LUA_HOME=/lua-$LUA_VERSION.$LUA_MICRO - -RUN cd $LUA_HOME && \ - cp src/luaconf.h.orig src/luaconf.h && \ - make linux && \ - cd src && \ - mkdir ../bin ../include ../lib && \ - install -p -m 0755 lua luac ../bin && \ - install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h ../include && \ - install -p -m 0644 liblua.a ../lib - -ENV LUA=/lua${LUA_VERSION}.${LUA_MICRO} -ENV PATH=${LUA_HOME}/bin:${PATH} -ENV LUA_PATH="./?.lua;./?.lc;$LUA_HOME/share/lua/5.1/?/init.lua;$LUA_HOME/share/lua/5.1/?.lua;$LUA_HOME/lib/lua/5.1/?/init.lua;$LUA_HOME/lib/lua/5.1/?.lua" -ENV LUA_CPATH="./?.lua;./?.lc;$LUA_HOME/share/lua/5.1/?/init.so;$LUA_HOME/share/lua/5.1/?.so;$LUA_HOME/lib/lua/5.1/?/init.so;$LUA_HOME/lib/lua/5.1/?.so" - -WORKDIR /octo - -RUN git clone https://github.com/cyberz-eu/octopus.git - -WORKDIR /octo/octopus -# Dec 8th, 2017 -RUN git checkout 44c7e7ecdfd9e95703e73df85815c0cca4b441e8 - -WORKDIR /octo - -ADD ./ /octo - -RUN cp -avr app octopus/extensions -RUN cp -vf config.lua octopus/extensions - -WORKDIR /octo/octopus/bin/unix - -RUN chmod +x *.sh - -RUN sed -i 's|wget|wget -q|g' server.sh -RUN sed -i 's|-c nginx.conf|-c nginx.conf -g "daemon off;"|g' server.sh - -RUN ./server.sh install -RUN ./server.sh build - -EXPOSE 8080 - -CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ - sed -i "s|DBHOSTNAME|$DBIP|g" /octo/octopus/extensions/build/src/types.lua && \ - ./server.sh start From 8cb1e7641e4ca4da605d3569f961a1ca6b3fe154 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Jun 2024 22:15:04 +0200 Subject: [PATCH 0667/1766] Remove unmaintained Colossus framework (#9108) Colossus hasn't been updated for 6 years. A pull request to make it run on Scala 12.3 has been open for 5 years: https://github.com/tumblr/colossus/pull/681 Scala 12.2 is end-of-life: https://endoflife.date/scala --- frameworks/Scala/colossus/README.md | 30 ------------ .../Scala/colossus/benchmark_config.json | 22 --------- frameworks/Scala/colossus/build.sbt | 10 ---- frameworks/Scala/colossus/colossus.dockerfile | 10 ---- frameworks/Scala/colossus/config.toml | 15 ------ .../Scala/colossus/project/build.properties | 1 - frameworks/Scala/colossus/project/plugins.sbt | 1 - .../src/main/scala/example/Main.scala | 49 ------------------- 8 files changed, 138 deletions(-) delete mode 100644 frameworks/Scala/colossus/README.md delete mode 100644 frameworks/Scala/colossus/benchmark_config.json delete mode 100644 frameworks/Scala/colossus/build.sbt delete mode 100644 frameworks/Scala/colossus/colossus.dockerfile delete mode 100644 frameworks/Scala/colossus/config.toml delete mode 100644 frameworks/Scala/colossus/project/build.properties delete mode 100644 frameworks/Scala/colossus/project/plugins.sbt delete mode 100644 frameworks/Scala/colossus/src/main/scala/example/Main.scala diff --git a/frameworks/Scala/colossus/README.md b/frameworks/Scala/colossus/README.md deleted file mode 100644 index 3938b6bedd6..00000000000 --- a/frameworks/Scala/colossus/README.md +++ /dev/null @@ -1,30 +0,0 @@ -#colossus Benchmarking Test - -### JSON Encoding Test - -* [JSON test source](src/main/scala/example/Main.scala) - -### Plaintext Test - -* [JSON test source](src/main/scala/example/Main.scala) - -## Infrastructure Software Versions -The tests were run with: - -* [Java Oracle 1.8.0_25](http://www.oracle.com/technetwork/java/javase) -* [colossus 0.6.1](http://tumblr.github.io/colossus/) - -## Test URLs -### JSON Encoding Test - -http://localhost:9007/json - -### Plaintext Test - -http://localhost:9007/plaintext - -## How to run -sbt 'oneJar' - -java -jar target/scala-2.11/colossus*one-jar.jar - diff --git a/frameworks/Scala/colossus/benchmark_config.json b/frameworks/Scala/colossus/benchmark_config.json deleted file mode 100644 index 3d31adfe363..00000000000 --- a/frameworks/Scala/colossus/benchmark_config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "framework": "colossus", - "tests": [{ - "default": { - "orm": "Raw", - "database_os": "Linux", - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 9007, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "colossus", - "language": "Scala", - "platform": "Akka", - "webserver": "None", - "os": "Linux", - "display_name": "colossus", - "notes": "" - } - }] -} diff --git a/frameworks/Scala/colossus/build.sbt b/frameworks/Scala/colossus/build.sbt deleted file mode 100644 index 7c435c9b623..00000000000 --- a/frameworks/Scala/colossus/build.sbt +++ /dev/null @@ -1,10 +0,0 @@ -name := """colossus-example""" - -version := "1.0" - -scalaVersion := "2.12.5" - -libraryDependencies ++= Seq( - "com.tumblr" %% "colossus" % "0.11.0", - "com.github.plokhotnyuk.jsoniter-scala" %% "macros" % "0.21.6" -) diff --git a/frameworks/Scala/colossus/colossus.dockerfile b/frameworks/Scala/colossus/colossus.dockerfile deleted file mode 100644 index a8b2a0402b8..00000000000 --- a/frameworks/Scala/colossus/colossus.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM hseeberger/scala-sbt:8u151-2.12.5-1.1.2 -WORKDIR /colossus -COPY project project -COPY src src -COPY build.sbt build.sbt -RUN sbt assembly -batch - -EXPOSE 9007 - -CMD ["java", "-server", "-Xms1g", "-Xmx1g", "-XX:NewSize=512m", "-XX:MaxNewSize=512m", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-XX:+UseNUMA", "-XX:-UseBiasedLocking", "-XX:+AlwaysPreTouch", "-XX:+UseCondCardMark", "-jar", "target/scala-2.12/colossus-example-assembly-1.0.jar"] diff --git a/frameworks/Scala/colossus/config.toml b/frameworks/Scala/colossus/config.toml deleted file mode 100644 index b992b310825..00000000000 --- a/frameworks/Scala/colossus/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "colossus" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Akka" -webserver = "None" -versus = "None" diff --git a/frameworks/Scala/colossus/project/build.properties b/frameworks/Scala/colossus/project/build.properties deleted file mode 100644 index 05313438a19..00000000000 --- a/frameworks/Scala/colossus/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=1.1.2 diff --git a/frameworks/Scala/colossus/project/plugins.sbt b/frameworks/Scala/colossus/project/plugins.sbt deleted file mode 100644 index 652a3b93be3..00000000000 --- a/frameworks/Scala/colossus/project/plugins.sbt +++ /dev/null @@ -1 +0,0 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") diff --git a/frameworks/Scala/colossus/src/main/scala/example/Main.scala b/frameworks/Scala/colossus/src/main/scala/example/Main.scala deleted file mode 100644 index b0ef60b026b..00000000000 --- a/frameworks/Scala/colossus/src/main/scala/example/Main.scala +++ /dev/null @@ -1,49 +0,0 @@ -package example - -import akka.actor.ActorSystem -import colossus.core._ -import colossus.protocols.http._ -import colossus.service._ -import colossus.service.Callback.Implicits._ -import colossus.service.GenRequestHandler.PartialHandler -import colossus.util.DataSize -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ - -import scala.concurrent.duration.Duration - -case class Message(message: String) - -object Main extends App { - - val serverConfig = ServerSettings( - port = 9007, - maxConnections = 16384, - tcpBacklogSize = Some(1024)) - - val serviceConfig = ServiceConfig( - logErrors = false, - requestMetrics = false, - requestTimeout = Duration("1s"), - requestBufferSize = 65536, - maxRequestSize = DataSize(1024 * 1024)) - - implicit val actorSystem: ActorSystem = ActorSystem() - implicit val ioSystem: IOSystem = IOSystem() - - implicit val codec: JsonValueCodec[Message] = JsonCodecMaker.make[Message](CodecMakerConfig()) - - implicit val messageEncoder: HttpBodyEncoder[Message] = new HttpBodyEncoder[Message] { - override def encode(data: Message): HttpBody = new HttpBody(writeToArray(data)) - override def contentType: String = "application/json" - } - - HttpServer.start("Colossus", serverConfig)(initContext => new Initializer(initContext) { - override def onConnect: RequestHandlerFactory = serverContext => new RequestHandler(serverContext, serviceConfig) { - override def handle: PartialHandler[Http] = { - case req if req.head.url == "/plaintext" => req.ok("Hello, World!") - case req if req.head.url == "/json" => req.ok(Message("Hello, World!")) - } - } - }) -} From f52bb8df8ff8db795b9d97690d3dd2163124f616 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Jun 2024 22:15:17 +0200 Subject: [PATCH 0668/1766] Fix link in to Baratine (#9107) baratine.io no longer hosts the framework. --- frameworks/Java/baratine/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/baratine/README.md b/frameworks/Java/baratine/README.md index ac2a02a2563..6f1616520ce 100644 --- a/frameworks/Java/baratine/README.md +++ b/frameworks/Java/baratine/README.md @@ -13,7 +13,7 @@ This is the Baratine portion of a [benchmarking test suite](../) comparing a var ## Software Versions * [Java OpenJDK 1.8](http://openjdk.java.net/) -* [Baratine 0.11.0](http://baratine.io/) +* [Baratine 0.11.0](https://github.com/baratine/baratine) ## Test URLs From 31a977d345efbed8624978fb521bdb2cdc4acfc0 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Jun 2024 22:15:25 +0200 Subject: [PATCH 0669/1766] Remove unmaintained fintrospect framework (#9106) Fintrospect is currently failing and hasn't been updated in 4 years: https://github.com/daviddenton/fintrospect --- frameworks/Scala/fintrospect/.gitignore | 3 - frameworks/Scala/fintrospect/README.md | 22 ------ .../Scala/fintrospect/benchmark_config.json | 29 ------- frameworks/Scala/fintrospect/build.sbt | 25 ------ frameworks/Scala/fintrospect/config.toml | 19 ----- .../Scala/fintrospect/fintrospect.dockerfile | 10 --- .../fintrospect/project/build.properties | 1 - .../Scala/fintrospect/project/plugins.sbt | 1 - .../src/main/resources/FortunesList.mustache | 1 - .../fintrospect/src/main/scala/Database.scala | 22 ------ .../src/main/scala/DatabaseRoutes.scala | 77 ------------------- .../scala/FintrospectBenchmarkServer.scala | 36 --------- .../src/main/scala/FortunesRoute.scala | 41 ---------- .../src/main/scala/JsonRoute.scala | 13 ---- .../src/main/scala/PlainTextRoute.scala | 15 ---- 15 files changed, 315 deletions(-) delete mode 100644 frameworks/Scala/fintrospect/.gitignore delete mode 100644 frameworks/Scala/fintrospect/README.md delete mode 100644 frameworks/Scala/fintrospect/benchmark_config.json delete mode 100644 frameworks/Scala/fintrospect/build.sbt delete mode 100644 frameworks/Scala/fintrospect/config.toml delete mode 100644 frameworks/Scala/fintrospect/fintrospect.dockerfile delete mode 100644 frameworks/Scala/fintrospect/project/build.properties delete mode 100644 frameworks/Scala/fintrospect/project/plugins.sbt delete mode 100644 frameworks/Scala/fintrospect/src/main/resources/FortunesList.mustache delete mode 100644 frameworks/Scala/fintrospect/src/main/scala/Database.scala delete mode 100644 frameworks/Scala/fintrospect/src/main/scala/DatabaseRoutes.scala delete mode 100644 frameworks/Scala/fintrospect/src/main/scala/FintrospectBenchmarkServer.scala delete mode 100644 frameworks/Scala/fintrospect/src/main/scala/FortunesRoute.scala delete mode 100644 frameworks/Scala/fintrospect/src/main/scala/JsonRoute.scala delete mode 100644 frameworks/Scala/fintrospect/src/main/scala/PlainTextRoute.scala diff --git a/frameworks/Scala/fintrospect/.gitignore b/frameworks/Scala/fintrospect/.gitignore deleted file mode 100644 index f6a61f70454..00000000000 --- a/frameworks/Scala/fintrospect/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -sbt -target/ - diff --git a/frameworks/Scala/fintrospect/README.md b/frameworks/Scala/fintrospect/README.md deleted file mode 100644 index 02810a411ce..00000000000 --- a/frameworks/Scala/fintrospect/README.md +++ /dev/null @@ -1,22 +0,0 @@ -#fintrospect Benchmarking Test - -## Infrastructure Software Versions -The tests were run with: - -* [Java Oracle 1.8.0_25](http://www.oracle.com/technetwork/java/javase) -* [fintrospect 14.15.0](https://github.com/daviddenton/fintrospect) - -## Test URLs - -- JSON Encoding: http://localhost:9000/json -- Plaintext: http://localhost:9000/plaintext -- Fortunes: http://localhost:9000/fortunes -- Single Query: http://localhost:9000/db -- Multi Query: http://localhost:9000/queries?queries=1 -- Update Query: http://localhost:9000/updates?queries=1 - -## How to run -sbt 'oneJar' - -`java -jar target/scala-2.12/*fintrospect*one-jar.jar` - diff --git a/frameworks/Scala/fintrospect/benchmark_config.json b/frameworks/Scala/fintrospect/benchmark_config.json deleted file mode 100644 index 9a5b941d7bf..00000000000 --- a/frameworks/Scala/fintrospect/benchmark_config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "framework": "fintrospect", - "tests": [ - { - "default": { - "orm": "Raw", - "database_os": "Linux", - "db_url": "/db", - "fortune_url": "/fortunes", - "json_url": "/json", - "query_url": "/queries?queries=", - "plaintext_url": "/plaintext", - "update_url": "/updates?queries=", - "port": 9000, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "fintrospect", - "language": "Scala", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "display_name": "fintrospect", - "notes": "", - "versus": "finagle" - } - } - ] -} \ No newline at end of file diff --git a/frameworks/Scala/fintrospect/build.sbt b/frameworks/Scala/fintrospect/build.sbt deleted file mode 100644 index a7c09556d6d..00000000000 --- a/frameworks/Scala/fintrospect/build.sbt +++ /dev/null @@ -1,25 +0,0 @@ -name := """techempower-benchmarks-fintrospect""" - -version := "1.0" - -scalaVersion := "2.13.3" - -scalacOptions += "-deprecation" - -scalacOptions += "-feature" - -resolvers += "JCenter" at "https://jcenter.bintray.com" - -resolvers += Resolver.sonatypeRepo("snapshots") - -libraryDependencies ++= Seq( - "io.fintrospect" %% "fintrospect-core" % "17.0.0", - "io.fintrospect" %% "fintrospect-jackson" % "17.0.0", - "io.fintrospect" %% "fintrospect-mustache" % "17.0.0", - "com.twitter" %% "finagle-mysql" % "20.8.0" -) - -assemblyMergeStrategy in assembly := { - case PathList("META-INF", xs @ _*) => MergeStrategy.discard - case x => MergeStrategy.first -} diff --git a/frameworks/Scala/fintrospect/config.toml b/frameworks/Scala/fintrospect/config.toml deleted file mode 100644 index 80a2f984dab..00000000000 --- a/frameworks/Scala/fintrospect/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "fintrospect" - -[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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Netty" -webserver = "None" -versus = "finagle" diff --git a/frameworks/Scala/fintrospect/fintrospect.dockerfile b/frameworks/Scala/fintrospect/fintrospect.dockerfile deleted file mode 100644 index 26d2f15fca0..00000000000 --- a/frameworks/Scala/fintrospect/fintrospect.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM hseeberger/scala-sbt:8u222_1.3.5_2.13.1 -WORKDIR /fintrospect -COPY project project -COPY src src -COPY build.sbt build.sbt -RUN sbt assembly -batch - -EXPOSE 9000 - -CMD ["java", "-Dcom.twitter.finagle.toggle.flag.overrides=com.twitter.http.UseNetty4=1.0", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-XX:+AlwaysPreTouch", "-jar", "target/scala-2.13/techempower-benchmarks-fintrospect-assembly-1.0.jar"] diff --git a/frameworks/Scala/fintrospect/project/build.properties b/frameworks/Scala/fintrospect/project/build.properties deleted file mode 100644 index 0837f7a132d..00000000000 --- a/frameworks/Scala/fintrospect/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=1.3.13 diff --git a/frameworks/Scala/fintrospect/project/plugins.sbt b/frameworks/Scala/fintrospect/project/plugins.sbt deleted file mode 100644 index 652a3b93be3..00000000000 --- a/frameworks/Scala/fintrospect/project/plugins.sbt +++ /dev/null @@ -1 +0,0 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") diff --git a/frameworks/Scala/fintrospect/src/main/resources/FortunesList.mustache b/frameworks/Scala/fintrospect/src/main/resources/FortunesList.mustache deleted file mode 100644 index cce4d7b0393..00000000000 --- a/frameworks/Scala/fintrospect/src/main/resources/FortunesList.mustache +++ /dev/null @@ -1 +0,0 @@ -Fortunes{{#items}}{{/items}}
idmessage
{{id}}{{message}}
\ No newline at end of file diff --git a/frameworks/Scala/fintrospect/src/main/scala/Database.scala b/frameworks/Scala/fintrospect/src/main/scala/Database.scala deleted file mode 100644 index 8075fe44e31..00000000000 --- a/frameworks/Scala/fintrospect/src/main/scala/Database.scala +++ /dev/null @@ -1,22 +0,0 @@ -import com.twitter.finagle.Mysql -import com.twitter.finagle.client.DefaultPool.Param -import com.twitter.finagle.mysql.Client -import com.twitter.finagle.stats.NullStatsReceiver -import com.twitter.finagle.tracing.NullTracer -import com.twitter.util.Duration.fromSeconds -import com.twitter.util.NullMonitor -import io.fintrospect.configuration.Host - -object Database { - def apply(): Client = { - Mysql.client - .withCredentials("benchmarkdbuser", "benchmarkdbpass") - .withDatabase("hello_world") - .configured(Param(low = 256, high = 256, idleTime = fromSeconds(5 * 60), bufferSize = 0, maxWaiters = Int.MaxValue)) - .withStatsReceiver(NullStatsReceiver) - .withMonitor(NullMonitor) - .withTracer(NullTracer) - .withMaxConcurrentPrepareStatements(256) - .newRichClient("tfb-database:3306") - } -} diff --git a/frameworks/Scala/fintrospect/src/main/scala/DatabaseRoutes.scala b/frameworks/Scala/fintrospect/src/main/scala/DatabaseRoutes.scala deleted file mode 100644 index 1ba864a14ef..00000000000 --- a/frameworks/Scala/fintrospect/src/main/scala/DatabaseRoutes.scala +++ /dev/null @@ -1,77 +0,0 @@ -import com.fasterxml.jackson.databind.JsonNode -import com.twitter.finagle.Service -import com.twitter.finagle.http.Method.Get -import com.twitter.finagle.http.{Request, Response} -import com.twitter.finagle.mysql.Parameter.wrap -import com.twitter.finagle.mysql.{Client, IntValue, Result, ResultSet} -import com.twitter.util.Future.collect -import io.fintrospect.formats.Jackson.JsonFormat.{array, number, obj} -import io.fintrospect.formats.Jackson.ResponseBuilder._ -import io.fintrospect.parameters.{ParameterSpec, Query, StringValidations} -import io.fintrospect.{RouteSpec, ServerRoutes} - -import scala.language.reflectiveCalls -import scala.util.{Random, Try} - -object DatabaseRoutes { - - private val toJson: PartialFunction[Result, Option[JsonNode]] = { - case rs: ResultSet => rs.rows.headOption - .map(row => { - val IntValue(id) = row("id").get - val IntValue(random) = row("randomNumber").get - obj("id" -> number(id), "randomNumber" -> number(random)) - }) - case _ => None - } - - private def generateRandomNumber = Random.nextInt(9999) + 1 - - def apply(database: Client) = { - val getStatement = database.prepare("SELECT id, randomNumber FROM world WHERE id = ?") - val updateStatement = database.prepare("UPDATE world SET randomNumber = ? WHERE id = ?") - - val queryRoute = RouteSpec().at(Get) / "db" bindTo Service.mk { - _: Request => getStatement(generateRandomNumber) - .map(toJson) - .map(_.map(Ok(_)).getOrElse(NotFound("")).build()) - } - - val numberOfQueries = Query.optional(ParameterSpec.string(StringValidations.EmptyIsValid).map { - i => Try(i.toInt).getOrElse(1).max(1).min(500) - }, "queries") - - val multipleRoute = RouteSpec() - .taking(numberOfQueries) - .at(Get) / "queries" bindTo Service.mk { - r: Request => { - collect(1.to((numberOfQueries <-- r).getOrElse(1)) - .map(i => getStatement(generateRandomNumber).map(toJson))) - .map(f => f.flatMap(_.toSeq)) - .flatMap(c => Ok(array(c))) - } - } - - val updateRoute = RouteSpec() - .taking(numberOfQueries) - .at(Get) / "updates" bindTo Service.mk { - r: Request => { - collect(1.to((numberOfQueries <-- r).getOrElse(1)) - .map(i => { - val id = generateRandomNumber - updateStatement(generateRandomNumber, id) - .flatMap(_ => getStatement(id)) - .map(toJson) - })) - .map(f => f.flatMap(_.toSeq)) - .flatMap(c => Ok(array(c))) - } - } - - new ServerRoutes[Request, Response] { - add(queryRoute) - add(multipleRoute) - add(updateRoute) - } - } -} diff --git a/frameworks/Scala/fintrospect/src/main/scala/FintrospectBenchmarkServer.scala b/frameworks/Scala/fintrospect/src/main/scala/FintrospectBenchmarkServer.scala deleted file mode 100644 index bf08266724b..00000000000 --- a/frameworks/Scala/fintrospect/src/main/scala/FintrospectBenchmarkServer.scala +++ /dev/null @@ -1,36 +0,0 @@ -import java.util.TimeZone.getTimeZone - -import com.twitter.finagle.http.path.Root -import com.twitter.finagle.http.{Request, Response} -import com.twitter.finagle.{Filter, Http} -import com.twitter.util.Await -import io.fintrospect.RouteModule -import io.fintrospect.filters.ResponseFilters -import org.apache.commons.lang3.time.FastDateFormat.getInstance - -object FintrospectBenchmarkServer extends App { - - val dateFormat = getInstance("EEE, d MMM yyyy HH:mm:ss 'GMT'", getTimeZone("GMT")) - - val addServerAndDate = Filter.mk[Request, Response, Request, Response] { (req, svc) => - svc(req).map(resp => { - resp.headerMap("Server") = "Example" - resp.headerMap("Date") = dateFormat.format(System.currentTimeMillis()) - resp - }) - } - - val database = Database() - - val module = RouteModule(Root) - .withRoute(JsonRoute()) - .withRoute(PlainTextRoute()) - .withRoute(FortunesRoute(database)) - .withRoutes(DatabaseRoutes(database)) - - Await.ready( - Http.server - .withCompressionLevel(0) - .serve(":9000", ResponseFilters.CatchAll().andThen(addServerAndDate).andThen(module.toService)) - ) -} diff --git a/frameworks/Scala/fintrospect/src/main/scala/FortunesRoute.scala b/frameworks/Scala/fintrospect/src/main/scala/FortunesRoute.scala deleted file mode 100644 index e7d0b858dd6..00000000000 --- a/frameworks/Scala/fintrospect/src/main/scala/FortunesRoute.scala +++ /dev/null @@ -1,41 +0,0 @@ -import com.twitter.finagle.Service -import com.twitter.finagle.http.Method.Get -import com.twitter.finagle.http.Request -import com.twitter.finagle.mysql._ -import io.fintrospect.RouteSpec -import io.fintrospect.formats.Html -import io.fintrospect.templating.MustacheTemplates.CachingClasspath -import io.fintrospect.templating.{RenderView, View} - -case class Fortune(id: Int, message: String) - -case class FortunesList(items: Seq[Fortune]) extends View - -object FortunesRoute { - - private val toFortunes: PartialFunction[Result, Seq[Fortune]] = { - case rs: ResultSet => rs.rows - .map(row => { - val IntValue(id) = row("id").get - val StringValue(message) = row("message").get - Fortune(id, message) - }) - case _ => Seq.empty - } - - def apply(database: Client) = { - - val statement = database.prepare("SELECT * FROM fortune") - - val service = new RenderView(Html.ResponseBuilder, CachingClasspath()).andThen( - Service.mk { - _: Request => - statement().map(toFortunes).map(f => { - val sortedFortunes = (Fortune(0, "Additional fortune added at request time.") +: f).sortBy(_.message) - FortunesList(sortedFortunes) - }) - }) - - RouteSpec().at(Get) / "fortunes" bindTo service - } -} diff --git a/frameworks/Scala/fintrospect/src/main/scala/JsonRoute.scala b/frameworks/Scala/fintrospect/src/main/scala/JsonRoute.scala deleted file mode 100644 index e3bb2311891..00000000000 --- a/frameworks/Scala/fintrospect/src/main/scala/JsonRoute.scala +++ /dev/null @@ -1,13 +0,0 @@ -import com.twitter.finagle.Service -import com.twitter.finagle.http.Method.Get -import com.twitter.finagle.http.Request -import io.fintrospect.RouteSpec -import io.fintrospect.formats.Jackson.JsonFormat.{encodeToBuf, obj, string} -import io.fintrospect.formats.Jackson.ResponseBuilder._ - -object JsonRoute { - - private val service = Service.mk { _: Request => Ok(encodeToBuf(obj("message" -> string("Hello, World!")))) } - - def apply() = RouteSpec().at(Get) / "json" bindTo service -} diff --git a/frameworks/Scala/fintrospect/src/main/scala/PlainTextRoute.scala b/frameworks/Scala/fintrospect/src/main/scala/PlainTextRoute.scala deleted file mode 100644 index a2c5b6198d1..00000000000 --- a/frameworks/Scala/fintrospect/src/main/scala/PlainTextRoute.scala +++ /dev/null @@ -1,15 +0,0 @@ -import com.twitter.finagle.Service -import com.twitter.finagle.http.Method.Get -import com.twitter.finagle.http.Request -import com.twitter.io.Buf -import io.fintrospect.RouteSpec -import io.fintrospect.formats.PlainText.ResponseBuilder._ - -object PlainTextRoute { - - private val preallocatedMsgForPlainText = Buf.Utf8("Hello, World!") - - private val service = Service.mk { _: Request => Ok(preallocatedMsgForPlainText) } - - def apply() = RouteSpec().at(Get) / "plaintext" bindTo service -} From 5dbaa7ef536357326c356641ec8ecfaddde7b62e Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Jun 2024 22:15:40 +0200 Subject: [PATCH 0670/1766] Remove unmaintained comsat framework (#9105) Comsat is currently failing and hasn't been updated for 8 years: https://github.com/puniverse/comsat --- frameworks/Java/comsat/README.md | 39 ------- frameworks/Java/comsat/benchmark_config.json | 83 -------------- frameworks/Java/comsat/build.gradle | 100 ----------------- .../comsat/comsat-servlet-undertow.dockerfile | 14 --- .../comsat/comsat-webactors-netty.dockerfile | 14 --- .../comsat-webactors-undertow.dockerfile | 14 --- frameworks/Java/comsat/comsat.dockerfile | 14 --- frameworks/Java/comsat/config.toml | 54 ---------- .../comsat/src/main/java/hello/Server.java | 6 -- .../comsat/src/main/java/hello/World.java | 10 -- .../main/java/hello/servlet/JettyServer.java | 46 -------- .../main/java/hello/servlet/JsonServlet.java | 30 ------ .../java/hello/servlet/PlaintextServlet.java | 24 ----- .../java/hello/servlet/UndertowServer.java | 101 ------------------ .../java/hello/webactors/NettyServer.java | 68 ------------ .../java/hello/webactors/UndertowServer.java | 57 ---------- .../main/java/hello/webactors/WebActor.java | 57 ---------- 17 files changed, 731 deletions(-) delete mode 100644 frameworks/Java/comsat/README.md delete mode 100644 frameworks/Java/comsat/benchmark_config.json delete mode 100644 frameworks/Java/comsat/build.gradle delete mode 100644 frameworks/Java/comsat/comsat-servlet-undertow.dockerfile delete mode 100644 frameworks/Java/comsat/comsat-webactors-netty.dockerfile delete mode 100644 frameworks/Java/comsat/comsat-webactors-undertow.dockerfile delete mode 100644 frameworks/Java/comsat/comsat.dockerfile delete mode 100644 frameworks/Java/comsat/config.toml delete mode 100644 frameworks/Java/comsat/src/main/java/hello/Server.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/World.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/servlet/JettyServer.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/servlet/JsonServlet.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/servlet/PlaintextServlet.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/servlet/UndertowServer.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/webactors/NettyServer.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/webactors/UndertowServer.java delete mode 100644 frameworks/Java/comsat/src/main/java/hello/webactors/WebActor.java diff --git a/frameworks/Java/comsat/README.md b/frameworks/Java/comsat/README.md deleted file mode 100644 index d30c5cdd7d4..00000000000 --- a/frameworks/Java/comsat/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Parallel Universe Comsat Benchmarking Test - -This is the [Parallel Universe Comsat](http://docs.paralleluniverse.co/comsat/#overview) version of a [benchmarking test suite](../) comparing a variety of web development platforms. It serves requests in lightweight [Quasar fibers](http://docs.paralleluniverse.co/quasar/#fibers) rather than heavyweight Java threads. There are two main flavors: Comsat Servlet and Comsat Web Actors. - -## Comsat Servlet - -[Parallel Universe Comsat Servlet](http://docs.paralleluniverse.co/comsat/#servlets) works with any servlet containers (tests are run against embedded Undertow and Jetty). - -### JSON Encoding and Plaintext Tests - -* [JSON test source](src/main/java/hello/servlet/JsonServlet.java) -* [Plaintext test source](src/main/java/hello/servlet/PlaintextServlet.java) - -## Comsat Web Actors - -[Parallel Universe Comsat Web Actors](http://docs.paralleluniverse.co/comsat/#web-actors) runs as an Undertow or Netty handler. - -### JSON and Plaintest Encoding Tests - -* [JSON test source](src/main/java/hello/webactors/HelloWebActor.java) - -## Versions - -* Jackson JSON 2.7.4 (https://github.com/FasterXML/jackson) -* Quasar 0.7.5 (http://docs.paralleluniverse.co/quasar) -* Comsat 0.7.0 (http://docs.paralleluniverse.co/comsat) -* Jetty 9.3.9.v20160517 (https://www.eclipse.org/jetty/) -* Netty 4.0.36.Final (http://netty.io/) -* Undertow 1.3.22-final (http://undertow.io) - -## Test URLs - -### JSON Encoding Test - - http://localhost:8080/json - -### Plaintest - - http://localhost:8080/plaintest diff --git a/frameworks/Java/comsat/benchmark_config.json b/frameworks/Java/comsat/benchmark_config.json deleted file mode 100644 index e6c79e87238..00000000000 --- a/frameworks/Java/comsat/benchmark_config.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "framework": "comsat", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "Java", - "flavor": "None", - "orm": "Raw", - "platform": "Servlet", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "comsat-servlet-jetty", - "notes": "Comsat servlet on embedded Jetty", - "versus": "" - }, - "servlet-undertow": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "Java", - "flavor": "None", - "orm": "Raw", - "platform": "Servlet", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Comsat", - "notes": "Comsat servlet on embedded Undertow", - "versus": "comsat" - }, - "webactors-netty": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "Java", - "flavor": "None", - "orm": "Raw", - "platform": "Comsat", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Comsat", - "notes": "Comsat Web Actors run as Netty handler", - "versus": "" - }, - "webactors-undertow": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "Java", - "flavor": "None", - "orm": "Raw", - "platform": "Comsat", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Comsat", - "notes": "Comsat Web Actors run as Undertow handler", - "versus": "comsat-webactors-netty" - } - } - ] -} diff --git a/frameworks/Java/comsat/build.gradle b/frameworks/Java/comsat/build.gradle deleted file mode 100644 index 89bc28d3dc5..00000000000 --- a/frameworks/Java/comsat/build.gradle +++ /dev/null @@ -1,100 +0,0 @@ -// Capsule plugin -plugins { - id "us.kirchmeier.capsule" version "1.0.2" -} - -apply plugin: 'java' - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -version = '0.3' - -ext.jacksonVer = '2.9.9' -ext.quasarVer = '0.7.5' -ext.comsatVer = '0.7.0' -ext.capsuleVer = '1.0.2' - -ext.jettyVer = '9.3.9.v20160517' -ext.undertowVer = '1.3.22.Final' -ext.nettyVer = '4.0.37.Final' - -ext.slf4jVer = '1.7.21' - -[compileJava, compileTestJava]*.options*.encoding = "UTF-8" - -repositories { - mavenCentral() - maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } - // mavenLocal() -} - -configurations { - quasar -} - -configurations.all { - resolutionStrategy { - failOnVersionConflict() - force "org.eclipse.jetty:jetty-util:$jettyVer" - force "org.eclipse.jetty:jetty-io:$jettyVer" - force "org.eclipse.jetty:jetty-http:$jettyVer" - force "org.eclipse.jetty:jetty-server:$jettyVer" - force "org.eclipse.jetty:jetty-servlet:$jettyVer" - force "org.eclipse.jetty:jetty-webapp:$jettyVer" - force "org.eclipse.jetty:jetty-xml:$jettyVer" - force "org.eclipse.jetty.websocket:websocket-server:$jettyVer" - force "org.eclipse.jetty.websocket:websocket-servlet:$jettyVer" - force "org.eclipse.jetty.websocket:websocket-client:$jettyVer" - force "io.undertow:undertow-core:$undertowVer" - force "io.undertow:undertow-servlet:$undertowVer" - force "io.netty:netty-all:$nettyVer" - force "org.slf4j:slf4j-api:$slf4jVer" - force "co.paralleluniverse:quasar-actors:$quasarVer" - } -} - -configurations.capsule.dependencies.clear() - -dependencies { - compile "co.paralleluniverse:quasar-core:$quasarVer:jdk8" - compile "com.fasterxml.jackson.core:jackson-databind:$jacksonVer" - compile "co.paralleluniverse:comsat-servlet:$comsatVer" - compile "co.paralleluniverse:comsat-test-utils:$comsatVer" - compile "co.paralleluniverse:comsat-actors-api:$comsatVer" - compile "co.paralleluniverse:comsat-actors-netty:$comsatVer" - compile "co.paralleluniverse:comsat-actors-undertow:$comsatVer" - compile "co.paralleluniverse:comsat-test-utils:$comsatVer" - - capsule "co.paralleluniverse:capsule:$capsuleVer" - - quasar "co.paralleluniverse:quasar-core:$quasarVer:jdk8" -} - -task capsule(type: FatCapsule) { - applicationClass "hello.World" - - capsuleManifest { - javaAgents = [configurations.quasar.iterator().next().getName()] - - mode('servlet-undertow') { - systemProperties['serverClass'] = 'hello.servlet.UndertowServer' - } - - mode('servlet-jetty') { - systemProperties['serverClass'] = 'hello.servlet.JettyServer' - } - - mode('webactors-netty') { - systemProperties['serverClass'] = 'hello.webactors.NettyServer' - } - - mode('webactors-undertow') { - systemProperties['serverClass'] = 'hello.webactors.UndertowServer' - } - } -} - -task wrapper(type: Wrapper) { - gradleVersion = '2.14' -} diff --git a/frameworks/Java/comsat/comsat-servlet-undertow.dockerfile b/frameworks/Java/comsat/comsat-servlet-undertow.dockerfile deleted file mode 100644 index 75468d15b33..00000000000 --- a/frameworks/Java/comsat/comsat-servlet-undertow.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM gradle:4.7.0-jdk8 as gradle -USER root -WORKDIR /comsat -COPY build.gradle build.gradle -COPY src src -RUN gradle capsule -q - -FROM openjdk:8-jre-slim -WORKDIR /comsat -COPY --from=gradle /comsat/build/libs/comsat-0.3-capsule.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-Dcapsule.mode=servlet-undertow", "-jar", "app.jar"] diff --git a/frameworks/Java/comsat/comsat-webactors-netty.dockerfile b/frameworks/Java/comsat/comsat-webactors-netty.dockerfile deleted file mode 100644 index 35868380185..00000000000 --- a/frameworks/Java/comsat/comsat-webactors-netty.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM gradle:4.7.0-jdk8 as gradle -USER root -WORKDIR /comsat -COPY build.gradle build.gradle -COPY src src -RUN gradle capsule -q - -FROM openjdk:8-jre-slim -WORKDIR /comsat -COPY --from=gradle /comsat/build/libs/comsat-0.3-capsule.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-Dcapsule.mode=webactors-netty", "-jar", "app.jar"] diff --git a/frameworks/Java/comsat/comsat-webactors-undertow.dockerfile b/frameworks/Java/comsat/comsat-webactors-undertow.dockerfile deleted file mode 100644 index 482244a4415..00000000000 --- a/frameworks/Java/comsat/comsat-webactors-undertow.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM gradle:4.7.0-jdk8 as gradle -USER root -WORKDIR /comsat -COPY build.gradle build.gradle -COPY src src -RUN gradle capsule -q - -FROM openjdk:8-jre-slim -WORKDIR /comsat -COPY --from=gradle /comsat/build/libs/comsat-0.3-capsule.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-Dcapsule.mode=webactors-undertow", "-jar", "app.jar"] diff --git a/frameworks/Java/comsat/comsat.dockerfile b/frameworks/Java/comsat/comsat.dockerfile deleted file mode 100644 index d3b4d40cc6b..00000000000 --- a/frameworks/Java/comsat/comsat.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM gradle:4.7.0-jdk8 as gradle -USER root -WORKDIR /comsat -COPY build.gradle build.gradle -COPY src src -RUN gradle capsule -q - -FROM openjdk:8-jre-slim -WORKDIR /comsat -COPY --from=gradle /comsat/build/libs/comsat-0.3-capsule.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-Dcapsule.mode=servlet-jetty", "-jar", "app.jar"] diff --git a/frameworks/Java/comsat/config.toml b/frameworks/Java/comsat/config.toml deleted file mode 100644 index ab16ef16e3b..00000000000 --- a/frameworks/Java/comsat/config.toml +++ /dev/null @@ -1,54 +0,0 @@ -[framework] -name = "comsat" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Servlet" -webserver = "None" -versus = "" - -[servlet-undertow] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Servlet" -webserver = "None" -versus = "comsat" - -[webactors-netty] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Comsat" -webserver = "None" -versus = "" - -[webactors-undertow] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Comsat" -webserver = "None" -versus = "comsat-webactors-netty" diff --git a/frameworks/Java/comsat/src/main/java/hello/Server.java b/frameworks/Java/comsat/src/main/java/hello/Server.java deleted file mode 100644 index 9b7c04de733..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/Server.java +++ /dev/null @@ -1,6 +0,0 @@ -package hello; - -@FunctionalInterface -public interface Server { - void run() throws Exception; -} diff --git a/frameworks/Java/comsat/src/main/java/hello/World.java b/frameworks/Java/comsat/src/main/java/hello/World.java deleted file mode 100644 index 22f147b0470..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/World.java +++ /dev/null @@ -1,10 +0,0 @@ -package hello; - -public final class World { - public static void main(String[] args) throws Exception { - final Server s = (Server) Class.forName(System.getProperty("serverClass", "hello.JettyServer")).newInstance(); - s.run(); - } - - private World() {} -} diff --git a/frameworks/Java/comsat/src/main/java/hello/servlet/JettyServer.java b/frameworks/Java/comsat/src/main/java/hello/servlet/JettyServer.java deleted file mode 100644 index a55985bd8b3..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/servlet/JettyServer.java +++ /dev/null @@ -1,46 +0,0 @@ -package hello.servlet; - -import hello.Server; -import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer; - -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.thread.QueuedThreadPool; - -/** - * An implementation of the TechEmpower benchmark tests using Comsat servlets and the Jetty servlet container. - */ -public final class JettyServer implements Server { - @Override - public final void run() throws Exception { - final org.eclipse.jetty.server.Server s = new org.eclipse.jetty.server.Server(new QueuedThreadPool(200, Runtime.getRuntime().availableProcessors())); - - final ServerConnector http = new ServerConnector(s); - http.setReuseAddress(true); - http.setAcceptQueueSize(100000); - http.setPort(8080); - s.addConnector(http); - - final ServletContextHandler context = new ServletContextHandler(); - context.setContextPath("/"); - - final ServletHolder holder1 = new ServletHolder(new PlaintextServlet()); - context.addServlet(holder1, "/plaintext"); - holder1.setAsyncSupported(true); - final ServletHolder holder2 = new ServletHolder(new JsonServlet()); - context.addServlet(holder2, "/json"); - holder2.setAsyncSupported(true); - - s.setHandler(context); - - s.start(); - System.err.println("Server is up."); - - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/plaintext"); - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/json"); - System.err.println("Server test cases are instrumented and bootstrapped."); - - s.join(); - } -} diff --git a/frameworks/Java/comsat/src/main/java/hello/servlet/JsonServlet.java b/frameworks/Java/comsat/src/main/java/hello/servlet/JsonServlet.java deleted file mode 100644 index 86cb5957058..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/servlet/JsonServlet.java +++ /dev/null @@ -1,30 +0,0 @@ -package hello.servlet; - -import co.paralleluniverse.fibers.Suspendable; -import co.paralleluniverse.fibers.servlet.FiberHttpServlet; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import java.io.IOException; - -@SuppressWarnings("serial") -public final class JsonServlet extends FiberHttpServlet { - private static final class HelloWorldData { - @SuppressWarnings("unused") - public final String message = "Hello, World!"; - } - - private static final ObjectMapper mapper = new ObjectMapper(); - - @Override - @Suspendable - protected final void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { - resp.setContentType("application/json"); - resp.setHeader("Server", "comsat-servlet-undertow"); - mapper.writeValue(resp.getOutputStream(), new HelloWorldData()); - } -} diff --git a/frameworks/Java/comsat/src/main/java/hello/servlet/PlaintextServlet.java b/frameworks/Java/comsat/src/main/java/hello/servlet/PlaintextServlet.java deleted file mode 100644 index d42d4749f03..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/servlet/PlaintextServlet.java +++ /dev/null @@ -1,24 +0,0 @@ -package hello.servlet; - -import co.paralleluniverse.fibers.Suspendable; -import co.paralleluniverse.fibers.servlet.FiberHttpServlet; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -@SuppressWarnings("serial") -public final class PlaintextServlet extends FiberHttpServlet { - private static final byte[] helloWorld = "Hello, World!".getBytes(StandardCharsets.ISO_8859_1); - - @Override - @Suspendable - protected final void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { - resp.setContentType("text/plain"); - resp.setHeader("Server", "comsat-servlet-undertow"); - resp.getOutputStream().write(helloWorld); - } -} diff --git a/frameworks/Java/comsat/src/main/java/hello/servlet/UndertowServer.java b/frameworks/Java/comsat/src/main/java/hello/servlet/UndertowServer.java deleted file mode 100644 index 3b14f754015..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/servlet/UndertowServer.java +++ /dev/null @@ -1,101 +0,0 @@ -package hello.servlet; - -import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer; -import hello.Server; -import io.undertow.Undertow; -import io.undertow.UndertowOptions; -import io.undertow.server.HttpHandler; -import io.undertow.servlet.Servlets; -import io.undertow.servlet.api.DeploymentInfo; -import io.undertow.servlet.api.DeploymentManager; - -import org.xnio.Options; - -import java.io.IOException; - -/** - * An implementation of the TechEmpower benchmark tests using Comsat servlets and the Undertow servlet container. - */ -public final class UndertowServer implements Server { - @Override - public final void run() throws Exception { - final DeploymentInfo deployment = Servlets.deployment().setDeploymentName("") - .setClassLoader(ClassLoader.getSystemClassLoader()) - .setContextPath("/"); - - deployment.addServlet(Servlets.servlet("plaintext", PlaintextServlet.class).addMapping("/plaintext").setAsyncSupported(true)); - deployment.addServlet(Servlets.servlet("json", JsonServlet.class).addMapping("/json").setAsyncSupported(true)); - - final DeploymentManager servletsContainer = Servlets.defaultContainer().addDeployment(deployment); - - servletsContainer.deploy(); - - final HttpHandler handler = servletsContainer.start(); - - //noinspection deprecation - final Undertow server = Undertow.builder() - .setHandler(handler) - .setDirectBuffers(true) - - .setIoThreads(100) - .setWorkerThreads(100) - - .setServerOption(Options.CONNECTION_HIGH_WATER, 100_000) - .setServerOption(Options.CONNECTION_LOW_WATER, 100_000) - - .setBufferSize(1024) - .setBuffersPerRegion(100) - - // .setSocketOption(Options.ALLOW_BLOCKING, true) - .setSocketOption(Options.REUSE_ADDRESSES, true) - // .setSocketOption(Options.CORK, true) - // .setSocketOption(Options.USE_DIRECT_BUFFERS, true) - .setSocketOption(Options.BACKLOG, 100000) - .setSocketOption(Options.TCP_NODELAY, true) - // .setSocketOption(Options.RECEIVE_BUFFER, 2048) - // .setSocketOption(Options.SEND_BUFFER, 2048) - // .setSocketOption(Options.CONNECTION_HIGH_WATER, Integer.MAX_VALUE) - // .setSocketOption(Options.CONNECTION_LOW_WATER, Integer.MAX_VALUE) - // .setSocketOption(Options.READ_TIMEOUT, Integer.MAX_VALUE) - // .setSocketOption(Options.WRITE_TIMEOUT, Integer.MAX_VALUE) - // .setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false) //don't send a keep-alive header for HTTP/1.1 requests, as it is not required - - // .setServerOption(UndertowOptions.ALWAYS_SET_DATE, true) - .setServerOption(UndertowOptions.ENABLE_CONNECTOR_STATISTICS, false) - .setServerOption(UndertowOptions.RECORD_REQUEST_START_TIME, false) - - .addHttpListener(8080, "0.0.0.0") - .build(); - - server.start(); - - System.err.println("Server is up."); - - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public final void run() { - try { - server.stop(); - - System.err.println("Server is down."); - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - }); - - new Thread() { - @Override - public final void run() { - try { - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/plaintext"); - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/json"); - - System.err.println("Server test cases are instrumented and bootstrapped."); - } catch (final InterruptedException | IOException e) { - throw new RuntimeException(e); - } - } - }.start(); - } -} diff --git a/frameworks/Java/comsat/src/main/java/hello/webactors/NettyServer.java b/frameworks/Java/comsat/src/main/java/hello/webactors/NettyServer.java deleted file mode 100644 index 46ceca57efd..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/webactors/NettyServer.java +++ /dev/null @@ -1,68 +0,0 @@ -package hello.webactors; - -import co.paralleluniverse.comsat.webactors.netty.AutoWebActorHandler; -import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer; -import hello.Server; -import io.netty.bootstrap.ServerBootstrap; -import io.netty.buffer.PooledByteBufAllocator; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.http.HttpObjectAggregator; -import io.netty.handler.codec.http.HttpRequestDecoder; -import io.netty.handler.codec.http.HttpResponseEncoder; - -import java.util.Map; -import java.util.concurrent.Callable; - -public final class NettyServer implements Server { - @Override - public final void run() throws Exception { - WebActor.SERVER = "comsat-webactors-netty"; - final ServerBootstrap b = new ServerBootstrap(); - - b.option(ChannelOption.SO_BACKLOG, 100000); - b.childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 0); - b.childOption(ChannelOption.TCP_NODELAY, true); - b.childOption(ChannelOption.SO_REUSEADDR, true); - b.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); - - final ChannelInitializer childHandler = new SocketChannelChannelInitializer(() -> new AutoWebActorHandler() { - @Override - protected AutoContextProvider newContextProvider(ClassLoader userClassLoader, Map, Object[]> actorParams) { - return new AutoContextProvider(userClassLoader, actorParams, 1_000_000L /* ms */); - } - }); - final NioEventLoopGroup group = new NioEventLoopGroup(200); - b.group(group) - .channel(NioServerSocketChannel.class) - .childHandler(childHandler); - - final ChannelFuture cf = b.bind(8080); - cf.sync(); - - System.err.println("Server is up."); - - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/plaintext"); - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/json"); - System.err.println("Server test cases are instrumented and bootstrapped."); - } - - private static final class SocketChannelChannelInitializer extends ChannelInitializer { - private final Callable> handlerProvider; - - public SocketChannelChannelInitializer(Callable> handlerProvider) { - this.handlerProvider = handlerProvider; - } - - @Override - public final void initChannel(SocketChannel ch) throws Exception { - final ChannelPipeline pipeline = ch.pipeline(); - pipeline.addLast(new HttpRequestDecoder()); - pipeline.addLast(new HttpResponseEncoder()); - pipeline.addLast(new HttpObjectAggregator(65536)); - pipeline.addLast(handlerProvider.call()); - } - } -} diff --git a/frameworks/Java/comsat/src/main/java/hello/webactors/UndertowServer.java b/frameworks/Java/comsat/src/main/java/hello/webactors/UndertowServer.java deleted file mode 100644 index cb86911ebd3..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/webactors/UndertowServer.java +++ /dev/null @@ -1,57 +0,0 @@ -package hello.webactors; - -import co.paralleluniverse.comsat.webactors.undertow.AutoWebActorHandler; -import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer; -import hello.Server; -import io.undertow.Undertow; -import io.undertow.UndertowOptions; - -import org.xnio.Options; - -public final class UndertowServer implements Server { - @Override - public final void run() throws Exception { - WebActor.SERVER = "comsat-webactors-undertow"; - //noinspection deprecation - final Undertow u = io.undertow.Undertow.builder() - .setHandler(new AutoWebActorHandler()) - - .setIoThreads(100) - .setWorkerThreads(100) - .setServerOption(Options.CONNECTION_HIGH_WATER, 100_000) - .setServerOption(Options.CONNECTION_LOW_WATER, 100_000) - - .setDirectBuffers(true) - .setBufferSize(1024) - .setBuffersPerRegion(100) - - // .setSocketOption(Options.ALLOW_BLOCKING, true) - .setSocketOption(Options.REUSE_ADDRESSES, true) - // .setSocketOption(Options.CORK, true) - // .setSocketOption(Options.USE_DIRECT_BUFFERS, true) - .setSocketOption(Options.BACKLOG, 100000) - .setSocketOption(Options.TCP_NODELAY, true) - // .setSocketOption(Options.RECEIVE_BUFFER, 2048) - // .setSocketOption(Options.SEND_BUFFER, 2048) - // .setSocketOption(Options.CONNECTION_HIGH_WATER, Integer.MAX_VALUE) - // .setSocketOption(Options.CONNECTION_LOW_WATER, Integer.MAX_VALUE) - // .setSocketOption(Options.READ_TIMEOUT, Integer.MAX_VALUE) - // .setSocketOption(Options.WRITE_TIMEOUT, Integer.MAX_VALUE) - // .setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false) //don't send a keep-alive header for HTTP/1.1 requests, as it is not required - - // .setServerOption(UndertowOptions.ALWAYS_SET_DATE, true) - .setServerOption(UndertowOptions.ENABLE_CONNECTOR_STATISTICS, false) - .setServerOption(UndertowOptions.RECORD_REQUEST_START_TIME, false) - - .addHttpListener(8080, "0.0.0.0") - .build(); - - new Thread(u::start).start(); - - System.err.println("Server is up."); - - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/plaintext"); - AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/json"); - System.err.println("Server test cases are instrumented and bootstrapped."); - } -} diff --git a/frameworks/Java/comsat/src/main/java/hello/webactors/WebActor.java b/frameworks/Java/comsat/src/main/java/hello/webactors/WebActor.java deleted file mode 100644 index 8fb559ff3a6..00000000000 --- a/frameworks/Java/comsat/src/main/java/hello/webactors/WebActor.java +++ /dev/null @@ -1,57 +0,0 @@ -package hello.webactors; - -import co.paralleluniverse.actors.BasicActor; -import co.paralleluniverse.comsat.webactors.HttpRequest; -import co.paralleluniverse.comsat.webactors.HttpResponse; - -import co.paralleluniverse.fibers.SuspendExecution; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.nio.ByteBuffer; - -import static co.paralleluniverse.comsat.webactors.HttpResponse.error; -import static co.paralleluniverse.comsat.webactors.HttpResponse.ok; - -@co.paralleluniverse.comsat.webactors.WebActor(httpUrlPatterns = {"/*"}) -public final class WebActor extends BasicActor { - static String SERVER = "comsat-webactors"; - - private static final String HELLO_WORLD = "Hello, World!"; - private static final byte[] HELLO_WORLD_A = HELLO_WORLD.getBytes(); - - private static final class HelloWorldData { - @SuppressWarnings("unused") - public final String message = HELLO_WORLD; - } - - private static final ObjectMapper mapper = new ObjectMapper(); - - @Override - protected final Void doRun() throws InterruptedException, SuspendExecution { - final Object message = receive(); - if (message instanceof HttpRequest) { - final HttpRequest req = (HttpRequest) message; - HttpResponse.Builder res; - final String s = req.getRequestURI(); - if ("/plaintext".equals(s)) { - final ByteBuffer b = ByteBuffer.wrap(HELLO_WORLD_A); - res = ok(self(), req, b).setContentType("text/plain"); - } else if ("/json".equals(s)) { - try { - res = ok(self(), req, mapper.writeValueAsString(new HelloWorldData())).setContentType("application/json"); - } catch (final JsonProcessingException e) { - throw new RuntimeException(e); - } - } else { - res = error(self(), req, 404, "Not found"); - } - req.getFrom().send ( - res - .addHeader("Server", SERVER) - .build() - ); - } - return null; - } -} From da0744cb2554713b54eeff2d6d9db19c1c86f9dc Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Jun 2024 22:15:48 +0200 Subject: [PATCH 0671/1766] Remove old Weppy framework (#9104) Weppy was renamed to Emmett which already is tested. See: - https://github.com/emmett-framework/emmett/commit/11fe3cac4838c6f1b79339b50a0bcf3557a17069 - https://github.com/gi0baro/weppy (weppy redirects to emmett) --- frameworks/Python/weppy/README.md | 33 ----- frameworks/Python/weppy/app.py | 128 ------------------ frameworks/Python/weppy/benchmark_config.json | 97 ------------- frameworks/Python/weppy/config.toml | 70 ---------- frameworks/Python/weppy/gunicorn_conf.py | 26 ---- frameworks/Python/weppy/nginx.conf | 48 ------- frameworks/Python/weppy/requirements-pypy.txt | 4 - frameworks/Python/weppy/requirements.txt | 6 - .../Python/weppy/templates/fortunes.html | 20 --- frameworks/Python/weppy/uwsgi.ini | 19 --- .../Python/weppy/weppy-nginx-uwsgi.dockerfile | 19 --- frameworks/Python/weppy/weppy-py3.dockerfile | 11 -- .../Python/weppy/weppy-pypy2.dockerfile | 11 -- frameworks/Python/weppy/weppy.dockerfile | 11 -- 14 files changed, 503 deletions(-) delete mode 100644 frameworks/Python/weppy/README.md delete mode 100644 frameworks/Python/weppy/app.py delete mode 100644 frameworks/Python/weppy/benchmark_config.json delete mode 100644 frameworks/Python/weppy/config.toml delete mode 100644 frameworks/Python/weppy/gunicorn_conf.py delete mode 100644 frameworks/Python/weppy/nginx.conf delete mode 100644 frameworks/Python/weppy/requirements-pypy.txt delete mode 100644 frameworks/Python/weppy/requirements.txt delete mode 100644 frameworks/Python/weppy/templates/fortunes.html delete mode 100644 frameworks/Python/weppy/uwsgi.ini delete mode 100644 frameworks/Python/weppy/weppy-nginx-uwsgi.dockerfile delete mode 100644 frameworks/Python/weppy/weppy-py3.dockerfile delete mode 100644 frameworks/Python/weppy/weppy-pypy2.dockerfile delete mode 100644 frameworks/Python/weppy/weppy.dockerfile diff --git a/frameworks/Python/weppy/README.md b/frameworks/Python/weppy/README.md deleted file mode 100644 index 9292402d79f..00000000000 --- a/frameworks/Python/weppy/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# weppy Benchmark Test (ported from Flask example) - -This is the weppy portion of a [benchmarking tests suite](../../) -comparing a variety of web development platforms. - -The information below is specific to weppy. For further guidance, -review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki). -Also note that there is additional information provided in -the [Python README](../). - -[weppy](http://weppy.org/) is a fullstack Python 2/3 web framework. -This test uses the included ORM and templating system, and gunicorn+meinheld for the application server on CPtyhon and Tornado on pypy. - -## Test Paths & Source - -* [JSON Serialization](app.py): "/json" -* [Single Database Query](app.py): "/db" -* [Multiple Database Queries](app.py): "queries?queries=#" -* [Fortunes](app.py): "/fortunes" -* [Database Updates](app.py): "updates?queries=#" -* [Plaintext](app.py): "/plaintext" - -*Replace # with an actual number. - -### Resources - -* [weppy Source Code](https://github.com/gi0baro/weppy) -* [weppy Documentation](http://weppy.org/docs) - -### Community - -* [weppy (weppy-talk) Google Group](https://groups.google.com/forum/#!forum/weppy-talk) - diff --git a/frameworks/Python/weppy/app.py b/frameworks/Python/weppy/app.py deleted file mode 100644 index 23a461d8340..00000000000 --- a/frameworks/Python/weppy/app.py +++ /dev/null @@ -1,128 +0,0 @@ -import sys -from functools import partial -from random import randint -from weppy import App, Pipe, request, response -from weppy.orm import Database, Model, Field, rowmethod -from weppy.tools import service -from email.utils import formatdate - -_is_pypy = hasattr(sys, 'pypy_version_info') -if sys.version_info[0] == 3: - xrange = range - -DBHOSTNAME = 'tfb-database' - -app = App(__name__) - - -class World(Model): - tablename = "world" - randomnumber = Field.int() - - @rowmethod('serialize') - def _serialize(self, row): - return {'id': row.id, 'randomNumber': row.randomnumber} - - -class Fortune(Model): - tablename = "fortune" - message = Field.string() - - @rowmethod('serialize') - def _serialize(self, row): - return {'id': row.id, 'message': row.message} - - -class DateHeaderPipe(Pipe): - def open(self): - response.headers["Date"] = formatdate(timeval=None, localtime=False, usegmt=True) - - -app.config.handle_static = False -app.config.db.adapter = 'postgres:psycopg2' \ - if not _is_pypy else 'postgres:pg8000' -app.config.db.host = DBHOSTNAME -app.config.db.user = 'benchmarkdbuser' -app.config.db.password = 'benchmarkdbpass' -app.config.db.database = 'hello_world' -app.config.db.pool_size = 100 - -app.pipeline = [DateHeaderPipe()] - -db = Database(app, auto_migrate=False) -db.define_models(World, Fortune) - - -@app.route() -@service.json -def json(): - return {'message': 'Hello, World!'} - - -@app.route("/db", pipeline=[db.pipe]) -@service.json -def get_random_world(): - return World.get(randint(1, 10000)).serialize() - - -def get_qparam(): - try: - rv = int(request.query_params.queries) - if rv < 1: - rv = 1 - if rv > 500: - rv = 500 - except: - rv = 1 - return rv - - -@app.route("/queries", pipeline=[db.pipe]) -@service.json -def get_random_worlds(): - num_queries = get_qparam() - worlds = [ - World.get(randint(1, 10000)).serialize() for _ in xrange(num_queries)] - return worlds - - -@app.route(pipeline=[db.pipe]) -def fortunes(): - fortunes = Fortune.all().select() - fortunes.append( - Fortune.new(id=0, message="Additional fortune added at request time.")) - fortunes.sort(lambda m: m.message) - return {'fortunes': fortunes} - - -@app.route(pipeline=[db.pipe]) -@service.json -def updates(): - num_queries = get_qparam() - worlds = [] - rp = partial(randint, 1, 10000) - ids = [rp() for _ in xrange(num_queries)] - ids.sort() # To avoid deadlock - for id in ids: - world = World.get(id) - world.update_record(randomnumber=rp()) - worlds.append(world.serialize()) - return worlds - - -@app.route() -def plaintext(): - response.headers["Content-Type"] = "text/plain" - return 'Hello, World!' - - -try: - import meinheld - meinheld.server.set_access_logger(None) - meinheld.set_keepalive(120) -except ImportError: - pass - -# entry point for debugging -if __name__ == "__main__": - app.run(debug=True) diff --git a/frameworks/Python/weppy/benchmark_config.json b/frameworks/Python/weppy/benchmark_config.json deleted file mode 100644 index 3b989c719dc..00000000000 --- a/frameworks/Python/weppy/benchmark_config.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "framework": "weppy", - "tests": [{ - "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "weppy", - "language": "Python", - "orm": "Full", - "platform": "Meinheld", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "weppy-Py2", - "notes": "CPython 2.7", - "versus": "wsgi", - "tags": ["broken"] - }, - "py3": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "weppy", - "language": "Python", - "orm": "Full", - "platform": "Meinheld", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "weppy-Py3", - "notes": "CPython 3.6", - "versus": "wsgi" - }, - "pypy2": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "weppy", - "language": "Python", - "flavor": "PyPy2", - "orm": "Full", - "platform": "Tornado", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "weppy-PyPy2", - "notes": "PyPy2", - "versus": "wsgi", - "tags": ["broken"] - }, - "nginx-uwsgi": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "weppy", - "language": "Python", - "orm": "Full", - "platform": "uWSGI", - "webserver": "nginx", - "os": "Linux", - "database_os": "Linux", - "display_name": "weppy-nginx-uWSGI", - "notes": "CPython 3.6", - "versus": "wsgi", - "tags": ["broken"] - } - }] -} diff --git a/frameworks/Python/weppy/config.toml b/frameworks/Python/weppy/config.toml deleted file mode 100644 index baceb6e8747..00000000000 --- a/frameworks/Python/weppy/config.toml +++ /dev/null @@ -1,70 +0,0 @@ -[framework] -name = "weppy" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Meinheld" -webserver = "None" -versus = "wsgi" - -[py3] -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 = "Full" -platform = "Meinheld" -webserver = "None" -versus = "wsgi" - -[nginx-uwsgi] -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 = "Full" -platform = "uWSGI" -webserver = "nginx" -versus = "wsgi" - -[pypy2] -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 = "Full" -platform = "Tornado" -webserver = "None" -versus = "wsgi" diff --git a/frameworks/Python/weppy/gunicorn_conf.py b/frameworks/Python/weppy/gunicorn_conf.py deleted file mode 100644 index 817008b6d65..00000000000 --- a/frameworks/Python/weppy/gunicorn_conf.py +++ /dev/null @@ -1,26 +0,0 @@ -import multiprocessing -import os -import sys - -_is_pypy = hasattr(sys, 'pypy_version_info') -_is_travis = os.environ.get('TRAVIS') == 'true' - -workers = multiprocessing.cpu_count() * 3 -if _is_travis: - workers = 2 - -bind = "0.0.0.0:8080" -keepalive = 120 -errorlog = '-' -pidfile = 'gunicorn.pid' - -if _is_pypy: - worker_class = "tornado" -else: - worker_class = "meinheld.gmeinheld.MeinheldWorker" - - def post_fork(server, worker): - # Disable access log. - # (Until https://github.com/mopemope/meinheld/pull/42 is released) - import meinheld.server - meinheld.server.set_access_logger(None) diff --git a/frameworks/Python/weppy/nginx.conf b/frameworks/Python/weppy/nginx.conf deleted file mode 100644 index 38c0c61341c..00000000000 --- a/frameworks/Python/weppy/nginx.conf +++ /dev/null @@ -1,48 +0,0 @@ -# This file is based on /usr/local/nginx/conf/nginx.conf.default. - -# One worker process per core -error_log stderr error; - -events { - # This needed to be increased because the nginx error log said so. - # http://nginx.org/en/docs/ngx_core_module.html#worker_connections - worker_connections 65535; - multi_accept on; -} - -http { - default_type application/octet-stream; - client_body_temp_path /tmp; - - # turn off request logging for performance - access_log off; - - # I think these only options affect static file serving - sendfile on; - tcp_nopush on; - - # Allow many HTTP Keep-Alive requests in a single TCP connection before - # closing it (the default is 100). This will minimize the total number - # of TCP connections opened/closed. The problem is that this may cause - # some worker processes to be handling too connections relative to the - # other workers based on an initial imbalance, so this is disabled for - # now. -# keepalive_requests 1000; - - #keepalive_timeout 0; - keepalive_timeout 65; - - server { - # For information on deferred, see: - # http://nginx.org/en/docs/http/ngx_http_core_module.html#listen - # http://www.techrepublic.com/article/take-advantage-of-tcp-ip-options-to-optimize-data-transmission/ - # The backlog argument to listen() is set to match net.ipv4.tcp_max_syn_backlog and net.core.somaxconn - listen 8080 default_server deferred reuseport backlog=65535; - server_name localhost; - - location / { - uwsgi_pass unix:/var/tmp/uwsgi.sock; - include /usr/local/nginx/conf/uwsgi_params; - } - } -} diff --git a/frameworks/Python/weppy/requirements-pypy.txt b/frameworks/Python/weppy/requirements-pypy.txt deleted file mode 100644 index e56b1b00d5f..00000000000 --- a/frameworks/Python/weppy/requirements-pypy.txt +++ /dev/null @@ -1,4 +0,0 @@ -pg8000==1.10.6 -weppy==1.3 -gunicorn==19.9.0 -tornado==6.3.3 diff --git a/frameworks/Python/weppy/requirements.txt b/frameworks/Python/weppy/requirements.txt deleted file mode 100644 index 078948040eb..00000000000 --- a/frameworks/Python/weppy/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -psycopg2==2.7.5 -weppy==1.3 -gunicorn==19.9.0 -meinheld==1.0.2 -uwsgi==2.0.22 -greenlet==0.4.14 diff --git a/frameworks/Python/weppy/templates/fortunes.html b/frameworks/Python/weppy/templates/fortunes.html deleted file mode 100644 index 07d84854bcc..00000000000 --- a/frameworks/Python/weppy/templates/fortunes.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - Fortunes - - - - - - - - {{for fortune in fortunes:}} - - - - - {{pass}} -
idmessage
{{=fortune.id}}{{=fortune.message}}
- - diff --git a/frameworks/Python/weppy/uwsgi.ini b/frameworks/Python/weppy/uwsgi.ini deleted file mode 100644 index 5c9f5b80227..00000000000 --- a/frameworks/Python/weppy/uwsgi.ini +++ /dev/null @@ -1,19 +0,0 @@ -[uwsgi] -master -; Increase listen queue used for nginx connecting to uWSGI. This matches -; net.ipv4.tcp_max_syn_backlog and net.core.somaxconn. -listen = 16384 -; for performance -disable-logging -; use UNIX sockets instead of TCP loopback for performance -socket = /var/tmp/uwsgi.sock -; allow nginx to access the UNIX socket -chmod-socket = 666 -; Avoid thundering herd problem http://uwsgi-docs.readthedocs.org/en/latest/articles/SerializingAccept.html . -; This is currently disabled because when I tried it with flask, it caused a -; 20% performance hit. The CPU cores could not be saturated with thunder-lock. -; I'm not yet sure the full story, so this is presently disabled. Also, -; disabling this caused bottle to get ~13% faster. -;thunder-lock -; used by uwsgi_stop.ini -pidfile = /var/tmp/uwsgi.pid diff --git a/frameworks/Python/weppy/weppy-nginx-uwsgi.dockerfile b/frameworks/Python/weppy/weppy-nginx-uwsgi.dockerfile deleted file mode 100644 index e29f5447c0d..00000000000 --- a/frameworks/Python/weppy/weppy-nginx-uwsgi.dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM python:3.6.6-stretch - -RUN curl -s http://nginx.org/keys/nginx_signing.key | apt-key add - -RUN echo "deb http://nginx.org/packages/debian/ stretch nginx" >> /etc/apt/sources.list -RUN echo "deb-src http://nginx.org/packages/debian/ stretch nginx" >> /etc/apt/sources.list - -RUN apt-get update -yqq && apt-get install -yqq nginx - -ADD ./ /weppy - -WORKDIR /weppy - -RUN pip install -r /weppy/requirements.txt - -RUN sed -i 's|include .*/conf/uwsgi_params;|include /etc/nginx/uwsgi_params;|g' /weppy/nginx.conf - -EXPOSE 8080 - -CMD nginx -c /weppy/nginx.conf && uwsgi --ini /weppy/uwsgi.ini --processes $(nproc) --wsgi app:app diff --git a/frameworks/Python/weppy/weppy-py3.dockerfile b/frameworks/Python/weppy/weppy-py3.dockerfile deleted file mode 100644 index 4591004350d..00000000000 --- a/frameworks/Python/weppy/weppy-py3.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.6.6-stretch - -ADD ./ /weppy - -WORKDIR /weppy - -RUN pip3 install -r /weppy/requirements.txt - -EXPOSE 8080 - -CMD gunicorn app:app -c gunicorn_conf.py diff --git a/frameworks/Python/weppy/weppy-pypy2.dockerfile b/frameworks/Python/weppy/weppy-pypy2.dockerfile deleted file mode 100644 index 7c5a6a14abf..00000000000 --- a/frameworks/Python/weppy/weppy-pypy2.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM pypy:2-5.10 - -ADD ./ /weppy - -WORKDIR /weppy - -RUN pip install -r /weppy/requirements-pypy.txt - -EXPOSE 8080 - -CMD gunicorn app:app -c gunicorn_conf.py diff --git a/frameworks/Python/weppy/weppy.dockerfile b/frameworks/Python/weppy/weppy.dockerfile deleted file mode 100644 index 5f840729f96..00000000000 --- a/frameworks/Python/weppy/weppy.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:2.7.15-stretch - -ADD ./ /weppy - -WORKDIR /weppy - -RUN pip install -r /weppy/requirements.txt - -EXPOSE 8080 - -CMD gunicorn app:app -c gunicorn_conf.py From 565ab137763380757035658e6da600b08d1f8dbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:18:18 -0700 Subject: [PATCH 0672/1766] Bump actiontext from 7.1.3.3 to 7.1.3.4 in /frameworks/Ruby/rails (#9091) Bumps [actiontext](https://github.com/rails/rails) from 7.1.3.3 to 7.1.3.4. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.1.3.4/actiontext/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.1.3.3...v7.1.3.4) --- updated-dependencies: - dependency-name: actiontext dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Ruby/rails/Gemfile.lock | 110 ++++++++++++++--------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 9d15aecbab6..5c25771e659 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,35 +1,35 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3.3) - actionpack (= 7.1.3.3) - activesupport (= 7.1.3.3) + actioncable (7.1.3.4) + actionpack (= 7.1.3.4) + activesupport (= 7.1.3.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.3.3) - actionpack (= 7.1.3.3) - activejob (= 7.1.3.3) - activerecord (= 7.1.3.3) - activestorage (= 7.1.3.3) - activesupport (= 7.1.3.3) + actionmailbox (7.1.3.4) + actionpack (= 7.1.3.4) + activejob (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.3.3) - actionpack (= 7.1.3.3) - actionview (= 7.1.3.3) - activejob (= 7.1.3.3) - activesupport (= 7.1.3.3) + actionmailer (7.1.3.4) + actionpack (= 7.1.3.4) + actionview (= 7.1.3.4) + activejob (= 7.1.3.4) + activesupport (= 7.1.3.4) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3.3) - actionview (= 7.1.3.3) - activesupport (= 7.1.3.3) + actionpack (7.1.3.4) + actionview (= 7.1.3.4) + activesupport (= 7.1.3.4) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -37,35 +37,35 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.3.3) - actionpack (= 7.1.3.3) - activerecord (= 7.1.3.3) - activestorage (= 7.1.3.3) - activesupport (= 7.1.3.3) + actiontext (7.1.3.4) + actionpack (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3.3) - activesupport (= 7.1.3.3) + actionview (7.1.3.4) + activesupport (= 7.1.3.4) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3.3) - activesupport (= 7.1.3.3) + activejob (7.1.3.4) + activesupport (= 7.1.3.4) globalid (>= 0.3.6) - activemodel (7.1.3.3) - activesupport (= 7.1.3.3) - activerecord (7.1.3.3) - activemodel (= 7.1.3.3) - activesupport (= 7.1.3.3) + activemodel (7.1.3.4) + activesupport (= 7.1.3.4) + activerecord (7.1.3.4) + activemodel (= 7.1.3.4) + activesupport (= 7.1.3.4) timeout (>= 0.4.0) - activestorage (7.1.3.3) - actionpack (= 7.1.3.3) - activejob (= 7.1.3.3) - activerecord (= 7.1.3.3) - activesupport (= 7.1.3.3) + activestorage (7.1.3.4) + actionpack (= 7.1.3.4) + activejob (= 7.1.3.4) + activerecord (= 7.1.3.4) + activesupport (= 7.1.3.4) marcel (~> 1.0) - activesupport (7.1.3.3) + activesupport (7.1.3.4) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -78,7 +78,7 @@ GEM base64 (0.2.0) bigdecimal (3.1.8) builder (3.2.4) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.1) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) @@ -102,7 +102,7 @@ GEM net-smtp marcel (1.0.4) mini_mime (1.1.5) - mini_portile2 (2.8.6) + mini_portile2 (2.8.7) minitest (5.23.1) mutex_m (0.2.0) net-imap (0.4.11) @@ -138,20 +138,20 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) - rails (7.1.3.3) - actioncable (= 7.1.3.3) - actionmailbox (= 7.1.3.3) - actionmailer (= 7.1.3.3) - actionpack (= 7.1.3.3) - actiontext (= 7.1.3.3) - actionview (= 7.1.3.3) - activejob (= 7.1.3.3) - activemodel (= 7.1.3.3) - activerecord (= 7.1.3.3) - activestorage (= 7.1.3.3) - activesupport (= 7.1.3.3) + rails (7.1.3.4) + actioncable (= 7.1.3.4) + actionmailbox (= 7.1.3.4) + actionmailer (= 7.1.3.4) + actionpack (= 7.1.3.4) + actiontext (= 7.1.3.4) + actionview (= 7.1.3.4) + activejob (= 7.1.3.4) + activemodel (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) bundler (>= 1.15.0) - railties (= 7.1.3.3) + railties (= 7.1.3.4) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -159,9 +159,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.3) - actionpack (= 7.1.3.3) - activesupport (= 7.1.3.3) + railties (7.1.3.4) + actionpack (= 7.1.3.4) + activesupport (= 7.1.3.4) irb rackup (>= 1.0.0) rake (>= 12.2) From 4a164f7c414a532c7e237448d32761add393de72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:18:38 -0700 Subject: [PATCH 0673/1766] Bump mysql2 from 3.9.7 to 3.9.8 in /frameworks/JavaScript/koa (#9089) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.7 to 3.9.8. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.7...v3.9.8) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/koa/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/koa/package.json b/frameworks/JavaScript/koa/package.json index 2e0fb45a363..52cbf5ca886 100644 --- a/frameworks/JavaScript/koa/package.json +++ b/frameworks/JavaScript/koa/package.json @@ -12,7 +12,7 @@ "koa-hbs": "1.0.0", "koa-router": "7.4.0", "mongoose": "5.13.20", - "mysql2": "3.9.7", + "mysql2": "3.9.8", "pg": "8.5.1", "pg-hstore": "2.3.2", "sequelize": "6.29.0" From dcbfae85be12b83db587f2b7d021b3d16095a945 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Jun 2024 17:50:02 +0200 Subject: [PATCH 0674/1766] [ruby/rack] Don't set redundant Content-Length header (#9015) This header already gets set by all servers except Unicorn. --- frameworks/Ruby/rack/hello_world.rb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index be1cfe31a3e..2fcacec605b 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -65,14 +65,15 @@ def initialize end def respond(content_type, body = '') + headers = { + CONTENT_TYPE => content_type, + DATE => Time.now.utc.httpdate, + SERVER => SERVER_STRING + } + headers[CONTENT_LENGTH] = body.bytesize.to_s if defined?(Unicorn) [ 200, - { - CONTENT_TYPE => content_type, - DATE => Time.now.utc.httpdate, - SERVER => SERVER_STRING, - CONTENT_LENGTH => body.bytesize.to_s - }, + headers, [body] ] end From 09f932a7bb0907ffadc03f9bc2569e04f0caa879 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 13 Jun 2024 09:03:22 -0700 Subject: [PATCH 0675/1766] [Elide] add elide runtime (#9097) Adds Elide, a new polyglot runtime built on top of GraalVM. For now, JavaScript server benchmarking is added; Python and Ruby will follow later (Elide runs all three). Signed-off-by: Sam Gammon --- frameworks/JavaScript/elide/README.md | 49 +++++++++++++++++++ .../JavaScript/elide/benchmark_config.json | 20 ++++++++ frameworks/JavaScript/elide/config.toml | 15 ++++++ frameworks/JavaScript/elide/elide.dockerfile | 11 +++++ frameworks/JavaScript/elide/src/server.js | 26 ++++++++++ 5 files changed, 121 insertions(+) create mode 100644 frameworks/JavaScript/elide/README.md create mode 100644 frameworks/JavaScript/elide/benchmark_config.json create mode 100644 frameworks/JavaScript/elide/config.toml create mode 100644 frameworks/JavaScript/elide/elide.dockerfile create mode 100644 frameworks/JavaScript/elide/src/server.js diff --git a/frameworks/JavaScript/elide/README.md b/frameworks/JavaScript/elide/README.md new file mode 100644 index 00000000000..7efbabcb033 --- /dev/null +++ b/frameworks/JavaScript/elide/README.md @@ -0,0 +1,49 @@ +# [Elide](https://github.com/elide-dev/elide) - A fast polyglot runtime + +## Description + +Elide is a runtime which can execute **JavaScript**, **Ruby**, **Python**, and others, all in one package. + +Elide is powered by [GraalVM](https://graalvm.org), which enables polyglot software design. Code units can interoperate from any supported language. + +The test script embedded for this benchmark uses Elide's built-in HTTP intrinsic from JavaScript: + +```javascript +// access the built-in HTTP server engine +const app = Elide.http; + +// register basic handler +app.router.handle("GET", "/plaintext", (request, response) => { + // respond using the captured path variables + response.send(200, "Hello, world!"); +}); + +// register a route handler +app.router.handle("GET", "/json", (request, response, context) => { + // respond using the captured path variables + response.send(200, JSON.stringify({ message: "Hello, world!" })); +}); + +// configure the server binding options +app.config.port = 3000; + +// receive a callback when the server starts +app.config.onBind(() => { + console.log(`Server listening at "http://localhost:${app.config.port}"! 🚀`); +}); + +// start the server +app.start(); +``` + +- [Elide Docs](https://docs.elide.dev) + +## Test URLs + +### Test 1: JSON Encoding + + http://localhost:3000/json + +### Test 2: Plaintext + + http://localhost:3000/plaintext diff --git a/frameworks/JavaScript/elide/benchmark_config.json b/frameworks/JavaScript/elide/benchmark_config.json new file mode 100644 index 00000000000..32c9d7e82aa --- /dev/null +++ b/frameworks/JavaScript/elide/benchmark_config.json @@ -0,0 +1,20 @@ +{ + "framework": "elide", + "tests": [{ + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 3000, + "approach": "Realistic", + "classification": "Platform", + "language": "JavaScript", + "flavor": "elide", + "platform": "elide", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "elide", + "versus": "nodejs" + } + }] +} diff --git a/frameworks/JavaScript/elide/config.toml b/frameworks/JavaScript/elide/config.toml new file mode 100644 index 00000000000..542f38180fd --- /dev/null +++ b/frameworks/JavaScript/elide/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "elide" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database_os = "Linux" +database = "None" +os = "Linux" +orm = "Raw" +platform = "elide" +webserver = "None" +versus = "nodejs" diff --git a/frameworks/JavaScript/elide/elide.dockerfile b/frameworks/JavaScript/elide/elide.dockerfile new file mode 100644 index 00000000000..f780fec96eb --- /dev/null +++ b/frameworks/JavaScript/elide/elide.dockerfile @@ -0,0 +1,11 @@ +FROM --platform=linux/amd64 ghcr.io/elide-dev/bench:1.0-alpha10-bench1-compat@sha256:1e679d95e18f9826c24a74d1709856849f53d3ca20c9bb25b548a8ec62424ad9 AS runtime + +EXPOSE 3000 + +WORKDIR /app + +COPY ./src . + +ENV NODE_ENV=production + +CMD ["elide", "serve", "server.js"] diff --git a/frameworks/JavaScript/elide/src/server.js b/frameworks/JavaScript/elide/src/server.js new file mode 100644 index 00000000000..1d564fe50d7 --- /dev/null +++ b/frameworks/JavaScript/elide/src/server.js @@ -0,0 +1,26 @@ +// access the built-in HTTP server engine +const app = Elide.http; + +// register basic handler +app.router.handle("GET", "/plaintext", (request, response) => { + // respond using the captured path variables + response.send(200, "Hello, world!"); +}); + +// register a route handler +app.router.handle("GET", "/json", (request, response, context) => { + // respond using the captured path variables + response.header("Content-Type", "application/json"); + response.send(200, JSON.stringify({ message: "Hello, world!" })); +}); + +// configure the server binding options +app.config.port = 3000; + +// receive a callback when the server starts +app.config.onBind(() => { + console.log(`Server listening at "http://localhost:${app.config.port}"! 🚀`); +}); + +// start the server +app.start(); From 20381d43125bf13610f8b1a095b05cb2d5937fb0 Mon Sep 17 00:00:00 2001 From: Vitaliy Busko Date: Fri, 14 Jun 2024 03:36:30 +0700 Subject: [PATCH 0676/1766] docs (rust/actix): update links in readme.md (#9116) --- frameworks/Rust/actix/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/actix/README.md b/frameworks/Rust/actix/README.md index def975cde32..78e6fd0306b 100644 --- a/frameworks/Rust/actix/README.md +++ b/frameworks/Rust/actix/README.md @@ -4,7 +4,7 @@ Actix web is a small, fast, pragmatic, open source rust web framework. -* [User Guide](https://actix.rs/book/actix-web/) +* [User Guide](https://actix.rs/docs/getting-started) * [API Documentation](https://docs.rs/actix-web/) * [Chat on gitter](https://gitter.im/actix/actix) * Cargo package: [actix-web](https://crates.io/crates/actix-web) From 6837c8099720623044db1f5000bc9ac05638ebc7 Mon Sep 17 00:00:00 2001 From: Roman Samoilov <2270393+rsamoilov@users.noreply.github.com> Date: Thu, 13 Jun 2024 21:37:23 +0100 Subject: [PATCH 0677/1766] [Ruby] Add rage-rb (#8908) --- frameworks/Ruby/rage/Gemfile | 13 ++++ frameworks/Ruby/rage/README.md | 47 +++++++++++ frameworks/Ruby/rage/Rakefile | 1 + .../app/controllers/application_controller.rb | 2 + .../app/controllers/benchmarks_controller.rb | 77 +++++++++++++++++++ .../rage/app/models/application_record.rb | 3 + frameworks/Ruby/rage/app/models/fortune.rb | 7 ++ frameworks/Ruby/rage/app/models/world.rb | 9 +++ .../Ruby/rage/app/views/fortunes.html.erb | 12 +++ frameworks/Ruby/rage/benchmark_config.json | 30 ++++++++ frameworks/Ruby/rage/config.ru | 4 + frameworks/Ruby/rage/config/application.rb | 14 ++++ .../rage/config/environments/development.rb | 4 + .../rage/config/environments/production.rb | 3 + .../rage/config/initializers/activerecord.rb | 17 ++++ frameworks/Ruby/rage/config/routes.rb | 10 +++ frameworks/Ruby/rage/lib/.keep | 0 frameworks/Ruby/rage/rage.dockerfile | 14 ++++ 18 files changed, 267 insertions(+) create mode 100644 frameworks/Ruby/rage/Gemfile create mode 100755 frameworks/Ruby/rage/README.md create mode 100644 frameworks/Ruby/rage/Rakefile create mode 100644 frameworks/Ruby/rage/app/controllers/application_controller.rb create mode 100644 frameworks/Ruby/rage/app/controllers/benchmarks_controller.rb create mode 100644 frameworks/Ruby/rage/app/models/application_record.rb create mode 100644 frameworks/Ruby/rage/app/models/fortune.rb create mode 100644 frameworks/Ruby/rage/app/models/world.rb create mode 100644 frameworks/Ruby/rage/app/views/fortunes.html.erb create mode 100755 frameworks/Ruby/rage/benchmark_config.json create mode 100644 frameworks/Ruby/rage/config.ru create mode 100644 frameworks/Ruby/rage/config/application.rb create mode 100644 frameworks/Ruby/rage/config/environments/development.rb create mode 100644 frameworks/Ruby/rage/config/environments/production.rb create mode 100644 frameworks/Ruby/rage/config/initializers/activerecord.rb create mode 100644 frameworks/Ruby/rage/config/routes.rb create mode 100644 frameworks/Ruby/rage/lib/.keep create mode 100644 frameworks/Ruby/rage/rage.dockerfile diff --git a/frameworks/Ruby/rage/Gemfile b/frameworks/Ruby/rage/Gemfile new file mode 100644 index 00000000000..a7f090d01f9 --- /dev/null +++ b/frameworks/Ruby/rage/Gemfile @@ -0,0 +1,13 @@ +source "https://rubygems.org" + +gem "rage-rb", "~> 1.3" + +gem "pg", "~> 1.0" +gem "activerecord", "~> 7.0.0", require: "active_record" + +# Build JSON APIs with ease +# gem "alba" + +# Get 50% to 150% boost when parsing JSON. +# Rage will automatically use FastJsonparser if it is available. +# gem "fast_jsonparser" diff --git a/frameworks/Ruby/rage/README.md b/frameworks/Ruby/rage/README.md new file mode 100755 index 00000000000..05e005bd363 --- /dev/null +++ b/frameworks/Ruby/rage/README.md @@ -0,0 +1,47 @@ +# Rage Benchmarking Test + +Rage is a fast web framework compatible with Rails. It uses an event-driven architecture and implements a lightweight, cooperative concurrency model based on Ruby Fibers. + +https://github.com/rage-rb/rage + +### Test Type Implementation Source Code + +* [JSON](app/controllers/benchmarks_controller.rb) +* [PLAINTEXT](app/controllers/benchmarks_controller.rb) +* [DB](app/controllers/benchmarks_controller.rb) +* [QUERY](app/controllers/benchmarks_controller.rb) +* [UPDATE](app/controllers/benchmarks_controller.rb) +* [FORTUNES](app/controllers/benchmarks_controller.rb) + +## Important Libraries + +The tests were run with: + +* [ActiveRecord](https://rubygems.org/gems/activerecord) +* [PG](https://rubygems.org/gems/pg) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/queries?queries= + +### UPDATE + +http://localhost:8080/updates?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Ruby/rage/Rakefile b/frameworks/Ruby/rage/Rakefile new file mode 100644 index 00000000000..046f1fcbd8d --- /dev/null +++ b/frameworks/Ruby/rage/Rakefile @@ -0,0 +1 @@ +require_relative "config/application" diff --git a/frameworks/Ruby/rage/app/controllers/application_controller.rb b/frameworks/Ruby/rage/app/controllers/application_controller.rb new file mode 100644 index 00000000000..c3238c52392 --- /dev/null +++ b/frameworks/Ruby/rage/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < RageController::API +end diff --git a/frameworks/Ruby/rage/app/controllers/benchmarks_controller.rb b/frameworks/Ruby/rage/app/controllers/benchmarks_controller.rb new file mode 100644 index 00000000000..884356e58c1 --- /dev/null +++ b/frameworks/Ruby/rage/app/controllers/benchmarks_controller.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +class BenchmarksController < ApplicationController + ALL_DB_IDS = (1..10_000).to_a + FORTUNES_TEMPLATE = ERB.new(Rage.root.join("app/views/fortunes.html.erb").read) + + before_action do + headers["server"] = "rage" + end + + def json + render json: { message: "Hello, World!" } + end + + def plaintext + render plain: "Hello, World!" + end + + def db + render json: World.find(random_id) + end + + def queries + records = requested_ids.map do |id| + World.find(id) + end + + render json: records + end + + def fortunes + records = Fortune.pluck(:id, :message).map! { |id, message| { id:, message: } } + + records << Fortune.new(id: 0, message: "Additional fortune added at request time.") + records.sort_by! { |record| record[:message] } + + render plain: FORTUNES_TEMPLATE.result(binding) + headers["content-type"] = "text/html; charset=utf-8" + end + + def updates + records = requested_ids.map do |id| + World.find(id) + end + + updates = records.map do |record| + new_value = random_id + new_value = random_id until new_value != record.randomNumber + + record.randomNumber = new_value + + { id: record.id, randomnumber: new_value } + end + + World.upsert_all(updates.sort_by! { |u| u[:id] }) + + render json: records + end + + private + + def requested_ids + num = params[:queries].to_i + + if num > 500 + num = 500 + elsif num < 1 + num = 1 + end + + ALL_DB_IDS.sample(num) + end + + def random_id + Random.rand(9_999) + 1 + end +end diff --git a/frameworks/Ruby/rage/app/models/application_record.rb b/frameworks/Ruby/rage/app/models/application_record.rb new file mode 100644 index 00000000000..b63caeb8a5c --- /dev/null +++ b/frameworks/Ruby/rage/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + primary_abstract_class +end diff --git a/frameworks/Ruby/rage/app/models/fortune.rb b/frameworks/Ruby/rage/app/models/fortune.rb new file mode 100644 index 00000000000..6b7ad122f80 --- /dev/null +++ b/frameworks/Ruby/rage/app/models/fortune.rb @@ -0,0 +1,7 @@ +class Fortune < ApplicationRecord + self.table_name = "Fortune" + + def as_json(*) + attributes + end +end diff --git a/frameworks/Ruby/rage/app/models/world.rb b/frameworks/Ruby/rage/app/models/world.rb new file mode 100644 index 00000000000..951aab55b64 --- /dev/null +++ b/frameworks/Ruby/rage/app/models/world.rb @@ -0,0 +1,9 @@ +class World < ApplicationRecord + self.table_name = "World" + + def as_json(*) + attributes + end + + alias_attribute(:randomNumber, :randomnumber) +end diff --git a/frameworks/Ruby/rage/app/views/fortunes.html.erb b/frameworks/Ruby/rage/app/views/fortunes.html.erb new file mode 100644 index 00000000000..1aa63f3772a --- /dev/null +++ b/frameworks/Ruby/rage/app/views/fortunes.html.erb @@ -0,0 +1,12 @@ + + + Fortunes + + + + <% records.each do |record| %> + + <% end %> +
idmessage
<%= record[:id] %><%= CGI.escape_html(record[:message]) %>
+ + diff --git a/frameworks/Ruby/rage/benchmark_config.json b/frameworks/Ruby/rage/benchmark_config.json new file mode 100755 index 00000000000..04d51d3ca3b --- /dev/null +++ b/frameworks/Ruby/rage/benchmark_config.json @@ -0,0 +1,30 @@ +{ + "framework": "rage", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Rage", + "language": "Ruby", + "flavor": "None", + "orm": "Full", + "platform": "Rack", + "webserver": "Rage-Iodine", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rage", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Ruby/rage/config.ru b/frameworks/Ruby/rage/config.ru new file mode 100644 index 00000000000..52de8a40479 --- /dev/null +++ b/frameworks/Ruby/rage/config.ru @@ -0,0 +1,4 @@ +require_relative "config/application" + +run Rage.application +Rage.load_middlewares(self) diff --git a/frameworks/Ruby/rage/config/application.rb b/frameworks/Ruby/rage/config/application.rb new file mode 100644 index 00000000000..9af142340b3 --- /dev/null +++ b/frameworks/Ruby/rage/config/application.rb @@ -0,0 +1,14 @@ +require "bundler/setup" +require "rage" +Bundler.require(*Rage.groups) + +require "rage/all" + +Rage.configure do + # use this to add settings that are constant across all environments +end + +require "erb" +require "cgi" + +require "rage/setup" diff --git a/frameworks/Ruby/rage/config/environments/development.rb b/frameworks/Ruby/rage/config/environments/development.rb new file mode 100644 index 00000000000..ba6e1d01423 --- /dev/null +++ b/frameworks/Ruby/rage/config/environments/development.rb @@ -0,0 +1,4 @@ +Rage.configure do + config.server.workers_count = -1 + config.logger = ActiveRecord::Base.logger = Rage::Logger.new(STDOUT) +end diff --git a/frameworks/Ruby/rage/config/environments/production.rb b/frameworks/Ruby/rage/config/environments/production.rb new file mode 100644 index 00000000000..0189c7742fa --- /dev/null +++ b/frameworks/Ruby/rage/config/environments/production.rb @@ -0,0 +1,3 @@ +Rage.configure do + config.logger = nil +end diff --git a/frameworks/Ruby/rage/config/initializers/activerecord.rb b/frameworks/Ruby/rage/config/initializers/activerecord.rb new file mode 100644 index 00000000000..c0e3eb08d44 --- /dev/null +++ b/frameworks/Ruby/rage/config/initializers/activerecord.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "etc" + +connection = { + adapter: "postgresql", + host: "tfb-database", + username: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", + reaping_frequency: 0, + pool: (2 * Math.log(256 / Etc.nprocessors)).floor +} + +puts "ActiveRecord connection options: #{connection.inspect}" + +ActiveRecord::Base.establish_connection(connection) diff --git a/frameworks/Ruby/rage/config/routes.rb b/frameworks/Ruby/rage/config/routes.rb new file mode 100644 index 00000000000..98def92a7e7 --- /dev/null +++ b/frameworks/Ruby/rage/config/routes.rb @@ -0,0 +1,10 @@ +Rage.routes.draw do + root to: ->(env) { [200, {}, "It works!"] } + + get "json", to: "benchmarks#json" + get "plaintext", to: "benchmarks#plaintext" + get "db", to: "benchmarks#db" + get "queries", to: "benchmarks#queries" + get "fortunes", to: "benchmarks#fortunes" + get "updates", to: "benchmarks#updates" +end diff --git a/frameworks/Ruby/rage/lib/.keep b/frameworks/Ruby/rage/lib/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/Ruby/rage/rage.dockerfile b/frameworks/Ruby/rage/rage.dockerfile new file mode 100644 index 00000000000..a1e80a095f3 --- /dev/null +++ b/frameworks/Ruby/rage/rage.dockerfile @@ -0,0 +1,14 @@ +FROM ruby:3.3 + +EXPOSE 8080 +WORKDIR /rage + +COPY Gemfile* /rage/ +RUN bundle install --jobs=8 +COPY . /rage + +ENV RUBY_YJIT_ENABLE=1 +ENV RAGE_PATCH_AR_POOL=1 +ENV BUNDLE_FORCE_RUBY_PLATFORM=true + +CMD bundle exec rage s -b 0.0.0.0 -p 8080 -e production From 79d4e7909d4868033d5246c25ded0278be20ee07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:24:10 +0000 Subject: [PATCH 0678/1766] Bump io.undertow:undertow-core in /frameworks/Java/undertow-jersey Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.12.Final to 2.3.14.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.12.Final...2.3.14.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/undertow-jersey/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/undertow-jersey/pom.xml b/frameworks/Java/undertow-jersey/pom.xml index 5be3dd82456..bf4603735ca 100644 --- a/frameworks/Java/undertow-jersey/pom.xml +++ b/frameworks/Java/undertow-jersey/pom.xml @@ -174,7 +174,7 @@ io.undertow undertow-core - 2.3.12.Final + 2.3.14.Final From 57fa858b659f254acad570464374ed92a9a3c787 Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Sat, 29 Jun 2024 00:21:46 +0800 Subject: [PATCH 0679/1766] [rust/viz] rust v1.79 (#9131) --- frameworks/Rust/viz/Cargo.toml | 4 ++-- 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 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index 9832cb58fdb..f28595febb5 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -42,10 +42,10 @@ sqlx = { version = "0.7", features = [ "runtime-tokio", "tls-native-tls" ], optional = true } -diesel = { version = "2.0", default-features = false, features = [ +diesel = { version = "2.2", default-features = false, features = [ "i-implement-a-third-party-backend-and-opt-into-breaking-changes", ], optional = true } -diesel-async = { version = "0.4", default-features = false, features = [ +diesel-async = { git = "https://github.com/weiznich/diesel_async.git", rev = "74867bd", version = "0.4", default-features = false, features = [ "postgres", "bb8", ], optional = true } diff --git a/frameworks/Rust/viz/viz-diesel.dockerfile b/frameworks/Rust/viz/viz-diesel.dockerfile index c1ddd42ddd5..d37e0af9130 100644 --- a/frameworks/Rust/viz/viz-diesel.dockerfile +++ b/frameworks/Rust/viz/viz-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.79 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 69238ff1c62..326f10a3bc6 100644 --- a/frameworks/Rust/viz/viz-pg.dockerfile +++ b/frameworks/Rust/viz/viz-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.79 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 087feee3c8e..76104544be0 100644 --- a/frameworks/Rust/viz/viz-sqlx.dockerfile +++ b/frameworks/Rust/viz/viz-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.79 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 bf54a7076c9..d6fd457b66e 100644 --- a/frameworks/Rust/viz/viz.dockerfile +++ b/frameworks/Rust/viz/viz.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.79 RUN apt-get update -yqq && apt-get install -yqq cmake g++ From 4398d2cad63279a794bb6ce35449b08ce8cf3208 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 28 Jun 2024 18:21:56 +0200 Subject: [PATCH 0680/1766] [ruby|rack-sequel] Batch update for Postgres (#9130) Also remove Rack::Chunked middleware as it is no longer supported. --- frameworks/Ruby/rack-sequel/boot.rb | 34 +++++++++++++++++----- frameworks/Ruby/rack-sequel/config.ru | 1 - frameworks/Ruby/rack-sequel/hello_world.rb | 26 ++++++++--------- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index e4de89199e9..609e3dacceb 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -33,8 +33,8 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules adapters = { - :mysql=>{ :jruby=>'jdbc:mysql', :mri=>'mysql2' }, - :postgresql=>{ :jruby=>'jdbc:postgresql', :mri=>'postgres' } + mysql: { jruby: 'jdbc:mysql', mri: 'mysql2' }, + postgresql: { jruby: 'jdbc:postgresql', mri: 'postgres' } } opts = {} @@ -52,11 +52,11 @@ def connect(dbtype) Sequel.connect \ '%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}' % { - :adapter=>adapters.fetch(dbtype).fetch(defined?(JRUBY_VERSION) ? :jruby : :mri), - :host=>'tfb-database', - :database=>'hello_world', - :user=>'benchmarkdbuser', - :password=>'benchmarkdbpass' + adapter: adapters.fetch(dbtype).fetch(defined?(JRUBY_VERSION) ? :jruby : :mri), + host: 'tfb-database', + database: 'hello_world', + user: 'benchmarkdbuser', + password: 'benchmarkdbpass' }, opts end @@ -64,7 +64,27 @@ def connect(dbtype) # Define ORM models class World < Sequel::Model(:World) + BY_ID = naked.where(id: :$id).prepare(:first, :world_by_id) + UPDATE = where(id: :$id).prepare(:update, :world_update, randomnumber: :$randomnumber) + def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql + + def self.batch_update(worlds) + if DB.database_type == :mysql + worlds.each do |world| + UPDATE.(id: world[:id], randomnumber: world[:randomnumber]) + end + else + ids = [] + sql = String.new("UPDATE world SET randomnumber = CASE id ") + worlds.each do |world| + sql << "when #{world[:id]} then #{world[:randomnumber]} " + ids << world[:id] + end + sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})" + DB.run(sql) + end + end end class Fortune < Sequel::Model(:Fortune) diff --git a/frameworks/Ruby/rack-sequel/config.ru b/frameworks/Ruby/rack-sequel/config.ru index ff84c719d0f..8fceb7c06fc 100644 --- a/frameworks/Ruby/rack-sequel/config.ru +++ b/frameworks/Ruby/rack-sequel/config.ru @@ -1,5 +1,4 @@ require_relative 'boot' require_relative 'hello_world' use Rack::ContentLength -use Rack::Chunked run HelloWorld.new diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 77525d99e45..d68de1f48d7 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -20,17 +20,14 @@ def rand1 rand(MAX_PK).succ end - WORLD_BY_ID = World.naked.where(:id=>:$id).prepare(:first, :world_by_id) - WORLD_UPDATE = World.where(:id=>:$id).prepare(:update, :world_update, :randomnumber=>:$randomnumber) - def db - WORLD_BY_ID.(:id=>rand1) + World::BY_ID.(id: rand1) end def queries(env) DB.synchronize do ALL_IDS.sample(bounded_queries(env)).map do |id| - WORLD_BY_ID.(id: id) + World::BY_ID.(id: id) end end end @@ -38,8 +35,8 @@ def queries(env) def fortunes fortunes = Fortune.all fortunes << Fortune.new( - :id=>0, - :message=>'Additional fortune added at request time.' + id: 0, + message: 'Additional fortune added at request time.' ) fortunes.sort_by!(&:message) @@ -78,11 +75,14 @@ def fortunes def updates(env) DB.synchronize do - ALL_IDS.sample(bounded_queries(env)).map do |id| - world = WORLD_BY_ID.(id: id) - WORLD_UPDATE.(id: world[:id], randomnumber: (world[:randomnumber] = rand1)) - world - end + worlds = + ALL_IDS.sample(bounded_queries(env)).map do |id| + world = World::BY_ID.(id: id) + world[:randomnumber] = rand1 + world + end + World.batch_update(worlds) + worlds end end @@ -91,7 +91,7 @@ def call(env) case env['PATH_INFO'] when '/json' # Test type 1: JSON serialization - [JSON_TYPE, JSON.fast_generate(:message=>'Hello, World!')] + [JSON_TYPE, JSON.fast_generate(message: 'Hello, World!')] when '/db' # Test type 2: Single database query [JSON_TYPE, JSON.fast_generate(db)] From 25862b317e175f95f964d38717fd20fb0434f8e0 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 28 Jun 2024 18:22:07 +0200 Subject: [PATCH 0681/1766] [ruby/sinatra-sequel] Use batch update for postgres (#9127) --- frameworks/Ruby/sinatra-sequel/boot.rb | 15 +++++++++++++++ frameworks/Ruby/sinatra-sequel/hello_world.rb | 10 ++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index 44843e48341..b91ea6e1317 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -62,6 +62,21 @@ def connect(dbtype) # Define ORM models class World < Sequel::Model(:World) def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql + + def self.batch_update(worlds) + if DB.database_type == :mysql + worlds.map(&:save_changes) + else + ids = [] + sql = String.new("UPDATE world SET randomnumber = CASE id ") + worlds.each do |world| + sql << "when #{world.id} then #{world.randomnumber} " + ids << world.id + end + sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})" + DB.run(sql) + end + end end class Fortune < Sequel::Model(:Fortune) diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index ccad94b8303..e04d76a077b 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -78,16 +78,18 @@ def rand1 # Test type 5: Database updates get '/updates' do - worlds = - DB.synchronize do + worlds = nil + DB.synchronize do + worlds = ALL_IDS.sample(bounded_queries).map do |id| world = World.with_pk(id) new_value = rand1 new_value = rand1 while new_value == world.randomnumber - world.update(randomnumber: new_value) + world.randomnumber = new_value world end - end + World.batch_update(worlds) + end json worlds.map!(&:values) end From 635f0686cc2a8a1bf549c3b5aeadadb2ac3ac193 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 28 Jun 2024 18:22:17 +0200 Subject: [PATCH 0682/1766] [ruby/roda] Use batch update for Roda on postgres (#9126) --- frameworks/Ruby/roda-sequel/boot.rb | 15 +++++++++++++++ frameworks/Ruby/roda-sequel/hello_world.rb | 14 ++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index eafc7bd7932..ebeb5a584c4 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -73,6 +73,21 @@ def connect(dbtype) # Define ORM models class World < Sequel.Model(:World) def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql + + def self.batch_update(worlds) + if DB.database_type == :mysql + worlds.map(&:save_changes) + else + ids = [] + sql = String.new("UPDATE world SET randomnumber = CASE id ") + worlds.each do |world| + sql << "when #{world.id} then #{world.randomnumber} " + ids << world.id + end + sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})" + DB.run(sql) + end + end end class Fortune < Sequel.Model(:Fortune) diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index abd0d5b1487..6a0a43efccb 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -58,17 +58,19 @@ def rand1 # Test type 5: Database updates r.is "updates" do response[CONTENT_TYPE] = JSON_TYPE - worlds = - DB.synchronize do + worlds = [] + DB.synchronize do + worlds = ALL_IDS.sample(bounded_queries).map do |id| world = World.with_pk(id) new_value = rand1 new_value = rand1 while new_value == world.randomnumber - world.update(randomnumber: new_value) - world.values + world.randomnumber = new_value + world end - end - worlds.to_json + World.batch_update(worlds) + end + worlds.map(&:values).to_json end # Test type 6: Plaintext From a8f72550a805a22865cd39e725c4241db65b695f Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Fri, 28 Jun 2024 17:22:42 +0100 Subject: [PATCH 0683/1766] H2O: Use prepared statements for the database updates test (#9124) --- frameworks/C/h2o/src/database.c | 10 +- frameworks/C/h2o/src/database.h | 4 +- frameworks/C/h2o/src/handlers/world.c | 175 +++++++++++++++++--------- 3 files changed, 123 insertions(+), 66 deletions(-) diff --git a/frameworks/C/h2o/src/database.c b/frameworks/C/h2o/src/database.c index 9736cb9f2f0..9c5c843150f 100644 --- a/frameworks/C/h2o/src/database.c +++ b/frameworks/C/h2o/src/database.c @@ -56,8 +56,8 @@ typedef struct { typedef struct { list_t l; - const char *name; - const char *query; + char *name; + char *query; } prepared_statement_t; static h2o_socket_t *create_socket(int sd, h2o_loop_t *loop); @@ -713,8 +713,8 @@ void add_prepared_statement(const char *name, const char *query, list_t **prepar memset(p, 0, sizeof(*p)); p->l.next = *prepared_statements; - p->name = name; - p->query = query; + p->name = h2o_strdup(NULL, name, SIZE_MAX).base; + p->query = h2o_strdup(NULL, query, SIZE_MAX).base; *prepared_statements = &p->l; } @@ -791,6 +791,8 @@ void remove_prepared_statements(list_t *prepared_statements) prepared_statements); prepared_statements = prepared_statements->next; + free(p->name); + free(p->query); free(p); } while (prepared_statements); } diff --git a/frameworks/C/h2o/src/database.h b/frameworks/C/h2o/src/database.h index c0c0ca05eda..160e2ea9abc 100644 --- a/frameworks/C/h2o/src/database.h +++ b/frameworks/C/h2o/src/database.h @@ -49,10 +49,10 @@ typedef struct db_query_param_t { on_result_t on_result; void (*on_timeout)(struct db_query_param_t *); const char *command; - const char * const *paramValues; - const int *paramLengths; const int *paramFormats; + const int *paramLengths; const Oid *paramTypes; + const char * const *paramValues; size_t nParams; uint_fast32_t flags; int resultFormat; diff --git a/frameworks/C/h2o/src/handlers/world.c b/frameworks/C/h2o/src/handlers/world.c index 0ee0b29d497..a87ee4c4282 100644 --- a/frameworks/C/h2o/src/handlers/world.c +++ b/frameworks/C/h2o/src/handlers/world.c @@ -57,17 +57,18 @@ // MAX_UPDATE_QUERY_LEN must be updated whenever UPDATE_QUERY_BEGIN, UPDATE_QUERY_ELEM, // UPDATE_QUERY_MIDDLE, UPDATE_QUERY_ELEM2, and UPDATE_QUERY_END are changed. #define UPDATE_QUERY_BEGIN "UPDATE " WORLD_TABLE_NAME " SET randomNumber = CASE id " -#define UPDATE_QUERY_ELEM "WHEN %" PRIu32 " THEN %" PRIu32 " " -#define UPDATE_QUERY_MIDDLE "ELSE randomNumber END WHERE id IN (%" PRIu32 -#define UPDATE_QUERY_ELEM2 ",%" PRIu32 +#define UPDATE_QUERY_ELEM "WHEN $%zu::integer THEN $%zu::integer " +#define UPDATE_QUERY_MIDDLE "ELSE randomNumber END WHERE id IN ($1::integer" +#define UPDATE_QUERY_ELEM2 ",$%zu::integer" #define UPDATE_QUERY_END ");" #define MAX_UPDATE_QUERY_LEN(n) \ (sizeof(UPDATE_QUERY_BEGIN) + sizeof(UPDATE_QUERY_MIDDLE) + \ sizeof(UPDATE_QUERY_END) - 1 - sizeof(UPDATE_QUERY_ELEM2) + \ (n) * (sizeof(UPDATE_QUERY_ELEM) - 1 + sizeof(UPDATE_QUERY_ELEM2) - 1 + \ - 3 * (sizeof(MKSTR(MAX_ID)) - 1) - 3 * (sizeof(PRIu32) - 1) - 3)) + 3 * sizeof(MKSTR(MAX_QUERIES)) - 3 * (sizeof("%zu") - 1))) +#define UPDATE_QUERY_NAME_PREFIX WORLD_TABLE_NAME "Update" #define USE_CACHE 2 #define WORLD_QUERY "SELECT * FROM " WORLD_TABLE_NAME " WHERE id = $1::integer;" @@ -259,11 +260,16 @@ static int do_multiple_queries(bool do_update, bool use_cache, h2o_req_t *req) size_t sz = base_size + num_query_in_progress * sizeof(query_param_t); if (do_update) { - const size_t reuse_size = (num_query_in_progress - 1) * sizeof(query_param_t); - const size_t update_query_len = MAX_UPDATE_QUERY_LEN(num_query); + size_t s = base_size + sizeof(query_param_t); - if (update_query_len > reuse_size) - sz += update_query_len - reuse_size; + s = (s + _Alignof(const char *) - 1) / _Alignof(const char *); + s = s * _Alignof(const char *) + 2 * num_query * sizeof(const char *); + s = (s + _Alignof(int) - 1) / _Alignof(int); + s = s * _Alignof(int) + 4 * num_query * sizeof(int); + s += sizeof(UPDATE_QUERY_NAME_PREFIX MKSTR(MAX_QUERIES)); + + if (s > sz) + sz = s; } multiple_query_ctx_t * const query_ctx = h2o_mem_alloc(sz); @@ -332,65 +338,57 @@ static int do_multiple_queries(bool do_update, bool use_cache, h2o_req_t *req) static void do_updates(multiple_query_ctx_t *query_ctx) { - char *iter = (char *) (query_ctx->query_param + 1); - size_t sz = MAX_UPDATE_QUERY_LEN(query_ctx->num_result); - - // Sort the results to avoid database deadlock. - qsort(query_ctx->res, query_ctx->num_result, sizeof(*query_ctx->res), compare_items); - query_ctx->query_param->param.command = iter; - query_ctx->query_param->param.nParams = 0; - query_ctx->query_param->param.on_result = on_update_result; - query_ctx->query_param->param.paramFormats = NULL; - query_ctx->query_param->param.paramLengths = NULL; - query_ctx->query_param->param.paramValues = NULL; - query_ctx->query_param->param.flags = 0; + size_t offset = + offsetof(multiple_query_ctx_t, res) + query_ctx->num_result * sizeof(*query_ctx->res); - int c = snprintf(iter, sz, UPDATE_QUERY_BEGIN); - - if ((size_t) c >= sz) - goto error; - - iter += c; - sz -= c; - - for (size_t i = 0; i < query_ctx->num_result; i++) { - query_ctx->res[i].random_number = 1 + get_random_number(MAX_ID, - &query_ctx->ctx->random_seed); - c = snprintf(iter, - sz, - UPDATE_QUERY_ELEM, - query_ctx->res[i].id, - query_ctx->res[i].random_number); + offset = ((offset + _Alignof(query_param_t) - 1) / _Alignof(query_param_t)); + offset = offset * _Alignof(query_param_t) + sizeof(query_param_t); + offset = (offset + _Alignof(const char *) - 1) / _Alignof(const char *); + offset *= _Alignof(const char *); - if ((size_t) c >= sz) - goto error; + const char ** const paramValues = (const char **) ((char *) query_ctx + offset); + const size_t nParams = query_ctx->num_result * 2; - iter += c; - sz -= c; - } + offset += nParams * sizeof(*paramValues); + offset = (offset + _Alignof(int) - 1) / _Alignof(int); + offset *= _Alignof(int); - c = snprintf(iter, sz, UPDATE_QUERY_MIDDLE, query_ctx->res->id); + int * const paramFormats = (int *) ((char *) query_ctx + offset); + int * const paramLengths = paramFormats + nParams; + char * const command = (char *) (paramLengths + nParams); + const size_t command_size = + sizeof(UPDATE_QUERY_NAME_PREFIX MKSTR(MAX_QUERIES)) - sizeof(UPDATE_QUERY_NAME_PREFIX) + 1; + const int c = snprintf(command + sizeof(UPDATE_QUERY_NAME_PREFIX) - 1, + command_size, + "%zu", + query_ctx->num_result); - if ((size_t) c >= sz) + if ((size_t) c >= command_size) goto error; - iter += c; - sz -= c; - - for (size_t i = 1; i < query_ctx->num_result; i++) { - c = snprintf(iter, sz, UPDATE_QUERY_ELEM2, query_ctx->res[i].id); - - if ((size_t) c >= sz) - goto error; - - iter += c; - sz -= c; - } - - c = snprintf(iter, sz, UPDATE_QUERY_END); + memcpy(command, UPDATE_QUERY_NAME_PREFIX, sizeof(UPDATE_QUERY_NAME_PREFIX) - 1); + // Sort the results to avoid database deadlock. + qsort(query_ctx->res, query_ctx->num_result, sizeof(*query_ctx->res), compare_items); - if ((size_t) c >= sz) - goto error; + for (size_t i = 0; i < query_ctx->num_result; i++) { + query_ctx->res[i].id = htonl(query_ctx->res[i].id); + query_ctx->res[i].random_number = + htonl(1 + get_random_number(MAX_ID, &query_ctx->ctx->random_seed)); + paramFormats[2 * i] = 1; + paramFormats[2 * i + 1] = 1; + paramLengths[2 * i] = sizeof(query_ctx->res[i].id); + paramLengths[2 * i + 1] = sizeof(query_ctx->res[i].random_number); + paramValues[2 * i] = (const char *) &query_ctx->res[i].id; + paramValues[2 * i + 1] = (const char *) &query_ctx->res[i].random_number; + } + + query_ctx->query_param->param.command = command; + query_ctx->query_param->param.flags = IS_PREPARED; + query_ctx->query_param->param.nParams = nParams; + query_ctx->query_param->param.on_result = on_update_result; + query_ctx->query_param->param.paramFormats = paramFormats; + query_ctx->query_param->param.paramLengths = paramLengths; + query_ctx->query_param->param.paramValues = paramValues; if (execute_database_query(&query_ctx->ctx->request_handler_data.hello_world_db, &query_ctx->query_param->param)) { @@ -726,8 +724,14 @@ static result_return_t on_update_result(db_query_param_t *param, PGresult *resul query_ctx->gen = get_json_generator(&query_ctx->ctx->json_generator, &query_ctx->ctx->json_generator_num); - if (query_ctx->gen) + if (query_ctx->gen) { + for (size_t i = 0; i < query_ctx->num_result; i++) { + query_ctx->res[i].id = ntohl(query_ctx->res[i].id); + query_ctx->res[i].random_number = ntohl(query_ctx->res[i].random_number); + } + serialize_items(query_ctx->res, query_ctx->num_result, &query_ctx->gen, query_ctx->req); + } else send_error(INTERNAL_SERVER_ERROR, REQ_ERROR, query_ctx->req); } @@ -887,6 +891,57 @@ void initialize_world_handlers(h2o_hostconf_t *hostconf, h2o_access_log_filehandle_t *log_handle, request_handler_data_t *data) { + char name[sizeof(UPDATE_QUERY_NAME_PREFIX MKSTR(MAX_QUERIES))]; + char query[MAX_UPDATE_QUERY_LEN(MAX_QUERIES)]; + const size_t name_size = sizeof(name) - sizeof(UPDATE_QUERY_NAME_PREFIX) + 1; + + assert(sizeof(name) >= sizeof(UPDATE_QUERY_NAME_PREFIX)); + memcpy(name, UPDATE_QUERY_NAME_PREFIX, sizeof(UPDATE_QUERY_NAME_PREFIX) - 1); + assert(sizeof(query) >= sizeof(UPDATE_QUERY_BEGIN)); + memcpy(query, UPDATE_QUERY_BEGIN, sizeof(UPDATE_QUERY_BEGIN) - 1); + + for (size_t i = 0; i < MAX_QUERIES; i++) { + char *iter = query + sizeof(UPDATE_QUERY_BEGIN) - 1; + size_t sz = sizeof(query) - sizeof(UPDATE_QUERY_BEGIN) + 1; + int c = snprintf(name + sizeof(UPDATE_QUERY_NAME_PREFIX) - 1, name_size, "%zu", i + 1); + + if ((size_t) c >= name_size) + continue; + + for (size_t j = 0; j <= i; j++) { + c = snprintf(iter, + sz, + UPDATE_QUERY_ELEM, + 2 * j + 1, + 2 * j + 2); + + if ((size_t) c >= sz) + continue; + + iter += c; + sz -= c; + } + + assert(sz >= sizeof(UPDATE_QUERY_MIDDLE)); + memcpy(iter, UPDATE_QUERY_MIDDLE, sizeof(UPDATE_QUERY_MIDDLE) - 1); + iter += sizeof(UPDATE_QUERY_MIDDLE) - 1; + sz -= sizeof(UPDATE_QUERY_MIDDLE) - 1; + + for (size_t j = 1; j <= i; j++) { + c = snprintf(iter, sz, UPDATE_QUERY_ELEM2, 2 * j + 1); + + if ((size_t) c >= sz) + continue; + + iter += c; + sz -= c; + } + + assert(sz >= sizeof(UPDATE_QUERY_END)); + memcpy(iter, UPDATE_QUERY_END, sizeof(UPDATE_QUERY_END)); + add_prepared_statement(name, query, &data->prepared_statements); + } + add_prepared_statement(WORLD_TABLE_NAME, WORLD_QUERY, &data->prepared_statements); register_request_handler("/cached-worlds", cached_queries, hostconf, log_handle); register_request_handler("/db", single_query, hostconf, log_handle); From d1b194430c9d523f034428531d0f0b08ea427d55 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 1 Jul 2024 19:49:42 +0200 Subject: [PATCH 0684/1766] [rails] Don't bulk update on MySQL (#9122) The benchmarks currently don't take into account batch updates in MySQL. This fixes the flaky MySQL updates verification. --- frameworks/Ruby/rails/app/models/world.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frameworks/Ruby/rails/app/models/world.rb b/frameworks/Ruby/rails/app/models/world.rb index 278501c05f4..bc1c8e9311b 100644 --- a/frameworks/Ruby/rails/app/models/world.rb +++ b/frameworks/Ruby/rails/app/models/world.rb @@ -3,4 +3,14 @@ class World < ApplicationRecord alias_attribute(:randomNumber, :randomnumber) \ if connection.adapter_name.downcase.start_with?('postgres') + + if connection.adapter_name.downcase.start_with?('trilogy') + def self.upsert_all(attributes, on_duplicate: :update, update_only: nil, returning: nil, unique_by: nil, record_timestamps: nil) + # On MySQL Batch updates verification isn't supported yet by TechEmpower. + # https://github.com/TechEmpower/FrameworkBenchmarks/issues/5983 + attributes.each do |attrs| + where(id: attrs[:id]).update_all(randomNumber: attrs[:randomNumber]) + end + end + end end From 7388a89641eeddebcb9aff6a4f8c079fa64ef139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Tue, 2 Jul 2024 01:49:52 +0800 Subject: [PATCH 0685/1766] [New Framework]: Goravel (#9125) * feat: add goravel test case * feat: optimize code * fix: query with pool --- frameworks/Go/goravel/README.md | 44 + frameworks/Go/goravel/benchmark_config.json | 55 + .../Go/goravel/goravel-fiber.dockerfile | 21 + frameworks/Go/goravel/goravel.dockerfile | 19 + frameworks/Go/goravel/src/fiber/.env | 1 + .../app/http/controllers/test_controller.go | 126 ++ .../src/fiber/app/http/controllers/utils.go | 107 ++ .../Go/goravel/src/fiber/app/models/world.go | 10 + .../app/providers/route_service_provider.go | 16 + frameworks/Go/goravel/src/fiber/config/app.go | 40 + .../Go/goravel/src/fiber/config/cache.go | 18 + .../Go/goravel/src/fiber/config/database.go | 32 + .../Go/goravel/src/fiber/config/http.go | 26 + .../Go/goravel/src/fiber/config/json.go | 31 + frameworks/Go/goravel/src/fiber/go.mod | 191 +++ frameworks/Go/goravel/src/fiber/go.sum | 1170 +++++++++++++++++ frameworks/Go/goravel/src/fiber/main.go | 27 + frameworks/Go/goravel/src/fiber/routes/web.go | 19 + .../Go/goravel/src/fiber/templates/fortune.go | 53 + .../goravel/src/fiber/templates/fortune.qtpl | 15 + .../src/fiber/templates/fortune.qtpl.go | 81 ++ frameworks/Go/goravel/src/gin/.env | 1 + .../app/http/controllers/test_controller.go | 129 ++ .../src/gin/app/http/controllers/utils.go | 101 ++ .../Go/goravel/src/gin/app/models/fortune.go | 10 + .../Go/goravel/src/gin/app/models/world.go | 10 + .../app/providers/route_service_provider.go | 16 + frameworks/Go/goravel/src/gin/config/app.go | 40 + frameworks/Go/goravel/src/gin/config/cache.go | 18 + .../Go/goravel/src/gin/config/database.go | 32 + frameworks/Go/goravel/src/gin/config/http.go | 30 + frameworks/Go/goravel/src/gin/config/json.go | 31 + frameworks/Go/goravel/src/gin/go.mod | 194 +++ frameworks/Go/goravel/src/gin/go.sum | 1170 +++++++++++++++++ frameworks/Go/goravel/src/gin/main.go | 27 + .../src/gin/resources/views/fortunes.tmpl | 22 + frameworks/Go/goravel/src/gin/routes/web.go | 19 + 37 files changed, 3952 insertions(+) create mode 100644 frameworks/Go/goravel/README.md create mode 100644 frameworks/Go/goravel/benchmark_config.json create mode 100644 frameworks/Go/goravel/goravel-fiber.dockerfile create mode 100644 frameworks/Go/goravel/goravel.dockerfile create mode 100644 frameworks/Go/goravel/src/fiber/.env create mode 100644 frameworks/Go/goravel/src/fiber/app/http/controllers/test_controller.go create mode 100644 frameworks/Go/goravel/src/fiber/app/http/controllers/utils.go create mode 100644 frameworks/Go/goravel/src/fiber/app/models/world.go create mode 100644 frameworks/Go/goravel/src/fiber/app/providers/route_service_provider.go create mode 100644 frameworks/Go/goravel/src/fiber/config/app.go create mode 100644 frameworks/Go/goravel/src/fiber/config/cache.go create mode 100644 frameworks/Go/goravel/src/fiber/config/database.go create mode 100644 frameworks/Go/goravel/src/fiber/config/http.go create mode 100644 frameworks/Go/goravel/src/fiber/config/json.go create mode 100644 frameworks/Go/goravel/src/fiber/go.mod create mode 100644 frameworks/Go/goravel/src/fiber/go.sum create mode 100644 frameworks/Go/goravel/src/fiber/main.go create mode 100644 frameworks/Go/goravel/src/fiber/routes/web.go create mode 100644 frameworks/Go/goravel/src/fiber/templates/fortune.go create mode 100644 frameworks/Go/goravel/src/fiber/templates/fortune.qtpl create mode 100644 frameworks/Go/goravel/src/fiber/templates/fortune.qtpl.go create mode 100644 frameworks/Go/goravel/src/gin/.env create mode 100644 frameworks/Go/goravel/src/gin/app/http/controllers/test_controller.go create mode 100644 frameworks/Go/goravel/src/gin/app/http/controllers/utils.go create mode 100644 frameworks/Go/goravel/src/gin/app/models/fortune.go create mode 100644 frameworks/Go/goravel/src/gin/app/models/world.go create mode 100644 frameworks/Go/goravel/src/gin/app/providers/route_service_provider.go create mode 100644 frameworks/Go/goravel/src/gin/config/app.go create mode 100644 frameworks/Go/goravel/src/gin/config/cache.go create mode 100644 frameworks/Go/goravel/src/gin/config/database.go create mode 100644 frameworks/Go/goravel/src/gin/config/http.go create mode 100644 frameworks/Go/goravel/src/gin/config/json.go create mode 100644 frameworks/Go/goravel/src/gin/go.mod create mode 100644 frameworks/Go/goravel/src/gin/go.sum create mode 100644 frameworks/Go/goravel/src/gin/main.go create mode 100644 frameworks/Go/goravel/src/gin/resources/views/fortunes.tmpl create mode 100644 frameworks/Go/goravel/src/gin/routes/web.go diff --git a/frameworks/Go/goravel/README.md b/frameworks/Go/goravel/README.md new file mode 100644 index 00000000000..f9b0d413503 --- /dev/null +++ b/frameworks/Go/goravel/README.md @@ -0,0 +1,44 @@ +# Goravel Benchmarking Test + +[Goravel](https://www.goravel.dev/) is a web application framework with complete functions and excellent scalability. As a starting scaffolding to help Gopher quickly build their own applications. + +The framework's design is consistent with [Laravel](https://github.com/laravel/laravel), simplifying the learning curve for PHPers. Kudos to Laravel! + +### Test Type Implementation Source Code + +* [JSON](src/gin/app/http/controllers/test_controller.go) +* [PLAINTEXT](src/gin/app/http/controllers/test_controller.go) +* [DB](src/gin/app/http/controllers/test_controller.go) +* [QUERY](src/gin/app/http/controllers/test_controller.go) +* [CACHED QUERY](src/gin/app/http/controllers/test_controller.go) +* [UPDATE](src/gin/app/http/controllers/test_controller.go) +* [FORTUNES](src/gin/app/http/controllers/test_controller.go) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/query?q= + +### CACHED QUERY + +http://localhost:8080/cached_query?q= + +### UPDATE + +http://localhost:8080/update?q= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Go/goravel/benchmark_config.json b/frameworks/Go/goravel/benchmark_config.json new file mode 100644 index 00000000000..bcb01875139 --- /dev/null +++ b/frameworks/Go/goravel/benchmark_config.json @@ -0,0 +1,55 @@ +{ + "framework": "goravel", + "tests": [ + { + "default": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "cached_query_url": "/cached-worlds?q=", + "update_url": "/update?q=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "goravel", + "language": "Go", + "flavor": "None", + "orm": "Full", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Goravel Gin", + "notes": "", + "versus": "go" + }, + "fiber": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "cached_query_url": "/cached-worlds?q=", + "update_url": "/update?q=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "goravel", + "language": "Go", + "flavor": "None", + "orm": "Full", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Goravel Fiber", + "notes": "", + "versus": "go" + } + } + ] +} diff --git a/frameworks/Go/goravel/goravel-fiber.dockerfile b/frameworks/Go/goravel/goravel-fiber.dockerfile new file mode 100644 index 00000000000..91d583dface --- /dev/null +++ b/frameworks/Go/goravel/goravel-fiber.dockerfile @@ -0,0 +1,21 @@ +FROM golang:1.22-alpine + +ENV GO111MODULE=on \ + CGO_ENABLED=0 \ + GOAMD64=v3 \ + GOARCH="amd64" \ + GOOS=linux + +WORKDIR /go/goravel + +COPY ./src/fiber /go/goravel + +RUN go mod tidy + +RUN go generate -x ./templates + +RUN go build -ldflags '-s -w --extldflags "-static"' -o /go/goravel/main + +EXPOSE 8080 + +CMD /go/goravel/main diff --git a/frameworks/Go/goravel/goravel.dockerfile b/frameworks/Go/goravel/goravel.dockerfile new file mode 100644 index 00000000000..2000cbbcf35 --- /dev/null +++ b/frameworks/Go/goravel/goravel.dockerfile @@ -0,0 +1,19 @@ +FROM golang:1.22-alpine + +ENV GO111MODULE=on \ + CGO_ENABLED=0 \ + GOAMD64=v3 \ + GOARCH="amd64" \ + GOOS=linux + +WORKDIR /go/goravel + +COPY ./src/gin /go/goravel + +RUN go mod tidy + +RUN go build -tags="sonic avx" -ldflags '-s -w --extldflags "-static"' -o /go/goravel/main + +EXPOSE 8080 + +CMD /go/goravel/main diff --git a/frameworks/Go/goravel/src/fiber/.env b/frameworks/Go/goravel/src/fiber/.env new file mode 100644 index 00000000000..9ceb9e63dc9 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/.env @@ -0,0 +1 @@ +APP_KEY=abcdefghijklmnopqrstuvwxyz123456 \ No newline at end of file diff --git a/frameworks/Go/goravel/src/fiber/app/http/controllers/test_controller.go b/frameworks/Go/goravel/src/fiber/app/http/controllers/test_controller.go new file mode 100644 index 00000000000..c433f221e7b --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/app/http/controllers/test_controller.go @@ -0,0 +1,126 @@ +package controllers + +import ( + "math/rand/v2" + "sort" + + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/facades" + + "goravel/templates" +) + +type TestController struct{} + +func NewTestController() *TestController { + initCache() + return &TestController{} +} + +func (r *TestController) Plaintext(ctx http.Context) http.Response { + Plaintext(ctx, helloworld) + return nil +} + +func (r *TestController) JSON(ctx http.Context) http.Response { + message := acquireMessage() + message.Message = helloworld + + JSON(ctx, &message) + releaseMessage(message) + return nil +} + +func (r *TestController) DB(ctx http.Context) http.Response { + world := acquireWorld() + + world.ID = r.getRand() + _ = facades.Orm().Query().Find(&world) + + JSON(ctx, &world) + releaseWorld(world) + return nil +} + +func (r *TestController) Queries(ctx http.Context) http.Response { + n := r.getN(ctx) + worlds := acquireWorlds()[:n] + + for i := 0; i < n; i++ { + worlds[i].ID = r.getRand() + _ = facades.Orm().Query().Find(&worlds[i]) + } + + JSON(ctx, &worlds) + releaseWorlds(worlds) + return nil +} + +func (r *TestController) Update(ctx http.Context) http.Response { + n := r.getN(ctx) + worlds := acquireWorlds()[:n] + + for i := 0; i < n; i++ { + worlds[i].ID = r.getRand() + _ = facades.Orm().Query().Find(&worlds[i]) + } + + // sorting is required for insert deadlock prevention. + sort.Slice(worlds, func(i, j int) bool { + return worlds[i].ID < worlds[j].ID + }) + + tx, _ := facades.Orm().Query().Begin() + for i := 0; i < n; i++ { + worlds[i].RandomNumber = r.getRand() + _ = tx.Save(&worlds[i]) + } + _ = tx.Commit() + + JSON(ctx, &worlds) + releaseWorlds(worlds) + return nil +} + +func (r *TestController) Fortunes(ctx http.Context) http.Response { + fortunes := make([]templates.Fortune, 0) + _ = facades.Orm().Query().Table("Fortune").Get(&fortunes) + + fortunes = append(fortunes, templates.Fortune{Message: "Additional fortune added at request time."}) + sort.Slice(fortunes, func(i, j int) bool { + return fortunes[i].Message < fortunes[j].Message + }) + + HTML(ctx) + templates.WriteFortunePage(ctx.Response().Writer(), fortunes) + return nil +} + +func (r *TestController) CacheQueries(ctx http.Context) http.Response { + n := r.getN(ctx) + worlds := acquireWorlds()[:n] + cached := facades.Cache().Get("worlds").(Worlds) + + for i := 0; i < n; i++ { + worlds[i] = cached[r.getRand()-1] + } + + JSON(ctx, &worlds) + releaseWorlds(worlds) + return nil +} + +func (r *TestController) getN(ctx http.Context) int { + n := ctx.Request().QueryInt(queryparam) + if n < 1 { + n = 1 + } else if n > 500 { + n = 500 + } + + return n +} + +func (r *TestController) getRand() int32 { + return rand.Int32N(worldcount) + 1 +} diff --git a/frameworks/Go/goravel/src/fiber/app/http/controllers/utils.go b/frameworks/Go/goravel/src/fiber/app/http/controllers/utils.go new file mode 100644 index 00000000000..b125edad3f3 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/app/http/controllers/utils.go @@ -0,0 +1,107 @@ +package controllers + +import ( + "fmt" + "sync" + "unsafe" + + "github.com/bytedance/sonic" + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/facades" + + "goravel/app/models" +) + +const ( + queryparam = "q" + helloworld = "Hello, World!" + worldcount = 10000 + contentTypePlain = "text/plain; charset=utf-8" + contentTypeHtml = "text/html; charset=utf-8" + contentTypeJson = "application/json" +) + +type Message struct { + Message string `json:"message"` +} + +type Worlds []models.World + +var messagePool = sync.Pool{ + New: func() any { + return new(Message) + }, +} + +var worldPool = sync.Pool{ + New: func() any { + return new(models.World) + }, +} + +var worldsPool = sync.Pool{ + New: func() any { + return make(Worlds, 0, 500) + }, +} + +func acquireMessage() *Message { + return messagePool.Get().(*Message) +} + +func releaseMessage(m *Message) { + m.Message = "" + messagePool.Put(m) +} + +func acquireWorld() *models.World { + return worldPool.Get().(*models.World) +} + +func releaseWorld(w *models.World) { + w.ID = 0 + w.RandomNumber = 0 + worldPool.Put(w) +} + +func acquireWorlds() Worlds { + return worldsPool.Get().(Worlds) +} + +func releaseWorlds(w Worlds) { + w = w[:0] + worldsPool.Put(w) +} + +func str2bytes(s string) []byte { + return unsafe.Slice(unsafe.StringData(s), len(s)) +} + +func initCache() { + worlds := acquireWorlds() + defer releaseWorlds(worlds) + + if err := facades.Orm().Query().Get(&worlds); err != nil { + panic(fmt.Sprintf("Failed to init cached Worlds: %v", err)) + } + + facades.Cache().Forever("worlds", worlds) +} + +func JSON(ctx http.Context, data any) { + ctx.Response().Header("Server", "Goravel") + ctx.Response().Header("Content-Type", contentTypeJson) + bytes, _ := sonic.Marshal(data) + _, _ = ctx.Response().Writer().Write(bytes) +} + +func Plaintext(ctx http.Context, data string) { + ctx.Response().Header("Server", "Goravel") + ctx.Response().Header("Content-Type", contentTypePlain) + _, _ = ctx.Response().Writer().Write(str2bytes(data)) +} + +func HTML(ctx http.Context) { + ctx.Response().Header("Server", "Goravel") + ctx.Response().Header("Content-Type", contentTypeHtml) +} diff --git a/frameworks/Go/goravel/src/fiber/app/models/world.go b/frameworks/Go/goravel/src/fiber/app/models/world.go new file mode 100644 index 00000000000..da724366273 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/app/models/world.go @@ -0,0 +1,10 @@ +package models + +type World struct { + ID int32 `gorm:"primaryKey" json:"id"` + RandomNumber int32 `gorm:"column:randomnumber" json:"randomNumber"` +} + +func (r *World) TableName() string { + return "World" +} diff --git a/frameworks/Go/goravel/src/fiber/app/providers/route_service_provider.go b/frameworks/Go/goravel/src/fiber/app/providers/route_service_provider.go new file mode 100644 index 00000000000..2e96015a24f --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/app/providers/route_service_provider.go @@ -0,0 +1,16 @@ +package providers + +import ( + "github.com/goravel/framework/contracts/foundation" + + "goravel/routes" +) + +type RouteServiceProvider struct{} + +func (receiver *RouteServiceProvider) Register(app foundation.Application) { +} + +func (receiver *RouteServiceProvider) Boot(app foundation.Application) { + routes.Web() +} diff --git a/frameworks/Go/goravel/src/fiber/config/app.go b/frameworks/Go/goravel/src/fiber/config/app.go new file mode 100644 index 00000000000..3ab05123159 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/config/app.go @@ -0,0 +1,40 @@ +package config + +import ( + "github.com/goravel/fiber" + "github.com/goravel/framework/cache" + "github.com/goravel/framework/console" + "github.com/goravel/framework/contracts/foundation" + "github.com/goravel/framework/database" + "github.com/goravel/framework/facades" + "github.com/goravel/framework/http" + "github.com/goravel/framework/log" + "github.com/goravel/framework/route" + "github.com/goravel/framework/validation" + + "goravel/app/providers" +) + +// Boot Start all init methods of the current folder to bootstrap all config. +func Boot() {} + +func init() { + config := facades.Config() + config.Add("app", map[string]any{ + "name": "Goravel", + "env": "production", + "debug": false, + "key": config.Env("APP_KEY", ""), + "providers": []foundation.ServiceProvider{ + &log.ServiceProvider{}, + &console.ServiceProvider{}, + &database.ServiceProvider{}, + &cache.ServiceProvider{}, + &http.ServiceProvider{}, + &route.ServiceProvider{}, + &validation.ServiceProvider{}, + &providers.RouteServiceProvider{}, + &fiber.ServiceProvider{}, + }, + }) +} diff --git a/frameworks/Go/goravel/src/fiber/config/cache.go b/frameworks/Go/goravel/src/fiber/config/cache.go new file mode 100644 index 00000000000..3c638243c2c --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/config/cache.go @@ -0,0 +1,18 @@ +package config + +import ( + "github.com/goravel/framework/facades" +) + +func init() { + config := facades.Config() + config.Add("cache", map[string]any{ + "default": "memory", + "stores": map[string]any{ + "memory": map[string]any{ + "driver": "memory", + }, + }, + "prefix": "goravel_cache", + }) +} diff --git a/frameworks/Go/goravel/src/fiber/config/database.go b/frameworks/Go/goravel/src/fiber/config/database.go new file mode 100644 index 00000000000..e1b1eb3272a --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/config/database.go @@ -0,0 +1,32 @@ +package config + +import ( + "github.com/goravel/framework/facades" +) + +func init() { + config := facades.Config() + config.Add("database", map[string]any{ + "default": "postgresql", + "connections": map[string]any{ + "postgresql": map[string]any{ + "driver": "postgresql", + "host": config.Env("DB_HOST", "tfb-database"), + "port": config.Env("DB_PORT", 5432), + "database": config.Env("DB_DATABASE", "hello_world"), + "username": config.Env("DB_USERNAME", "benchmarkdbuser"), + "password": config.Env("DB_PASSWORD", "benchmarkdbpass"), + "sslmode": "disable", + "timezone": "UTC", + "prefix": "", + "singular": true, + }, + }, + "pool": map[string]any{ + "max_idle_conns": 100, + "max_open_conns": 2000, + "conn_max_idletime": 3600, + "conn_max_lifetime": 3600, + }, + }) +} diff --git a/frameworks/Go/goravel/src/fiber/config/http.go b/frameworks/Go/goravel/src/fiber/config/http.go new file mode 100644 index 00000000000..3d48d689691 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/config/http.go @@ -0,0 +1,26 @@ +package config + +import ( + fiberfacades "github.com/goravel/fiber/facades" + "github.com/goravel/framework/contracts/route" + "github.com/goravel/framework/facades" +) + +func init() { + config := facades.Config() + config.Add("http", map[string]any{ + "default": "fiber", + "drivers": map[string]any{ + "fiber": map[string]any{ + "prefork": true, + "body_limit": 4096, + "header_limit": 4096, + "route": func() (route.Route, error) { + return fiberfacades.Route("fiber"), nil + }, + }, + }, + "host": "", + "port": "8080", + }) +} diff --git a/frameworks/Go/goravel/src/fiber/config/json.go b/frameworks/Go/goravel/src/fiber/config/json.go new file mode 100644 index 00000000000..2b2e1af3f80 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/config/json.go @@ -0,0 +1,31 @@ +package config + +import ( + "github.com/bytedance/sonic" + "github.com/goravel/framework/contracts/foundation" + "github.com/goravel/framework/facades" +) + +func init() { + facades.App().SetJson(NewJson()) +} + +type Json struct { + marshal func(any) ([]byte, error) + unmarshal func([]byte, any) error +} + +func NewJson() foundation.Json { + return &Json{ + marshal: sonic.Marshal, + unmarshal: sonic.Unmarshal, + } +} + +func (j *Json) Marshal(v any) ([]byte, error) { + return j.marshal(v) +} + +func (j *Json) Unmarshal(data []byte, v any) error { + return j.unmarshal(data, v) +} diff --git a/frameworks/Go/goravel/src/fiber/go.mod b/frameworks/Go/goravel/src/fiber/go.mod new file mode 100644 index 00000000000..e285c0106e3 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/go.mod @@ -0,0 +1,191 @@ +module goravel + +go 1.22 + +require ( + github.com/bytedance/sonic v1.11.9 + github.com/gofiber/fiber/v2 v2.52.4 + github.com/gofiber/template/html/v2 v2.1.1 + github.com/goravel/fiber v1.2.1 + github.com/goravel/framework v1.14.1 + github.com/valyala/quicktemplate v1.7.0 +) + +require ( + atomicgo.dev/cursor v0.2.0 // indirect + atomicgo.dev/keyboard v0.2.9 // indirect + atomicgo.dev/schedule v0.1.0 // indirect + cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute v1.25.1 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v1.1.6 // indirect + cloud.google.com/go/pubsub v1.36.1 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.16 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae // indirect + github.com/RichardKnop/machinery/v2 v2.0.13 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/atotto/clipboard v0.1.4 // indirect + github.com/aws/aws-sdk-go v1.49.6 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/catppuccin/go v0.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/charmbracelet/bubbles v0.18.0 // indirect + github.com/charmbracelet/bubbletea v0.26.3 // indirect + github.com/charmbracelet/huh v0.4.2 // indirect + github.com/charmbracelet/huh/spinner v0.0.0-20240508140610-13957916abf0 // indirect + github.com/charmbracelet/lipgloss v0.11.0 // indirect + github.com/charmbracelet/x/ansi v0.1.1 // indirect + github.com/charmbracelet/x/exp/strings v0.0.0-20240524151031-ff83003bf67a // indirect + github.com/charmbracelet/x/input v0.1.1 // indirect + github.com/charmbracelet/x/term v0.1.1 // indirect + github.com/charmbracelet/x/windows v0.1.2 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.4 // indirect + github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/glebarez/sqlite v1.11.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-redsync/redsync/v4 v4.8.1 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/gofiber/template v1.8.3 // indirect + github.com/gofiber/utils v1.1.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang-migrate/migrate/v4 v4.17.1 // indirect + github.com/golang-module/carbon/v2 v2.3.12 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gomodule/redigo v2.0.0+incompatible // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/google/wire v0.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.3 // indirect + github.com/gookit/color v1.5.4 // indirect + github.com/gookit/filter v1.2.1 // indirect + github.com/gookit/goutil v0.6.15 // indirect + github.com/gookit/validate v1.5.2 // indirect + github.com/goravel/file-rotatelogs/v2 v2.4.2 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/kelseyhightower/envconfig v1.4.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/microsoft/go-mssqldb v1.6.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/termenv v0.15.2 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/pterm/pterm v0.12.79 // indirect + github.com/rabbitmq/amqp091-go v1.9.0 // indirect + github.com/redis/go-redis/v9 v9.5.3 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rotisserie/eris v0.5.4 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/savioxavier/termlink v1.3.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/urfave/cli/v2 v2.27.2 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.55.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.1 // indirect + github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + go.mongodb.org/mongo-driver v1.7.5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/api v0.171.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.6 // indirect + gorm.io/driver/postgres v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.3 // indirect + gorm.io/gorm v1.25.10 // indirect + gorm.io/plugin/dbresolver v1.5.1 // indirect + modernc.org/libc v1.37.6 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/sqlite v1.28.0 // indirect +) diff --git a/frameworks/Go/goravel/src/fiber/go.sum b/frameworks/Go/goravel/src/fiber/go.sum new file mode 100644 index 00000000000..942ea9c3e7f --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/go.sum @@ -0,0 +1,1170 @@ +atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg= +atomicgo.dev/assert v0.0.2/go.mod h1:ut4NcI3QDdJtlmAxQULOmA13Gz6e2DWbSAS8RUOmNYQ= +atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= +atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= +atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= +atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= +atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= +cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/kms v1.15.7 h1:7caV9K3yIxvlQPAcaFffhlT7d1qpxjB1wHBtjWa13SM= +cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.10.0/go.mod h1:eNpTrkOy7dCpkNyaSNetMa6udbgecJMd0ZsTJS/cuNo= +cloud.google.com/go/pubsub v1.36.1 h1:dfEPuGCHGbWUhaMCTHUFjfroILEkx55iUmKBZTP5f+Y= +cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.16 h1:P8An8Z9rH1ldbOLdFpxYorgOt2sywL9V24dAwWHPuGc= +github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0 h1:HCc0+LpPfpCKs6LGGLAhwBARt9632unrVcI6i8s/8os= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= +github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= +github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= +github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= +github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc4n3EjyIYvEY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae h1:DcFpTQBYQ9Ct2d6sC7ol0/ynxc2pO1cpGUM+f4t5adg= +github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae/go.mod h1:rJJ84PyA/Wlmw1hO+xTzV2wsSUon6J5ktg0g8BF2PuU= +github.com/RichardKnop/machinery/v2 v2.0.13 h1:uo9htg+qNBi7UeUK3jcTBl3vTO/vvLKGaOdCOKePl50= +github.com/RichardKnop/machinery/v2 v2.0.13/go.mod h1:Yc2X/QRm9rRfAjB+93NGR+kSUqtnqqs8kME4L+TKKiw= +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.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go v1.37.16/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.49.6 h1:yNldzF5kzLBRvKlKz1S0bkvc2+04R1kt13KfBWQBfFA= +github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/brianvoe/gofakeit/v6 v6.28.0 h1:Xib46XXuQfmlLS2EXRuJpqcw8St6qSZz75OUo0tgAW4= +github.com/brianvoe/gofakeit/v6 v6.28.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs= +github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.20.0/go.mod h1:JifAceMQ4crZIWYUKrlGcmbN3bqHogVTADMD2ATsbwk= +github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/sonic v1.11.9 h1:LFHENlIY/SLzDWverzdOvgMztTxcfcF+cqNsz9pK5zg= +github.com/bytedance/sonic v1.11.9/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/catppuccin/go v0.2.0 h1:ktBeIrIP42b/8FGiScP9sgrWOss3lw0Z5SktRoithGA= +github.com/catppuccin/go v0.2.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.26.3 h1:iXyGvI+FfOWqkB2V07m1DF3xxQijxjY2j8PqiXYqasg= +github.com/charmbracelet/bubbletea v0.26.3/go.mod h1:bpZHfDHTYJC5g+FBK+ptJRCQotRC+Dhh3AoMxa/2+3Q= +github.com/charmbracelet/huh v0.4.2 h1:5wLkwrA58XDAfEZsJzNQlfJ+K8N9+wYwvR5FOM7jXFM= +github.com/charmbracelet/huh v0.4.2/go.mod h1:g9OXBgtY3zRV4ahnVih9bZE+1yGYN+y2C9Q6L2P+WM0= +github.com/charmbracelet/huh/spinner v0.0.0-20240508140610-13957916abf0 h1:79JTuYRirtyCn9ac6rzPt5AQKtBDFc1gKxpw0wBrI+Y= +github.com/charmbracelet/huh/spinner v0.0.0-20240508140610-13957916abf0/go.mod h1:Zxt9FH6togK9kY71pRJGtmyNkJ1eIWdK1gRaXrS/FKA= +github.com/charmbracelet/lipgloss v0.11.0 h1:UoAcbQ6Qml8hDwSWs0Y1cB5TEQuZkDPH/ZqwWWYTG4g= +github.com/charmbracelet/lipgloss v0.11.0/go.mod h1:1UdRTH9gYgpcdNN5oBtjbu/IzNKtzVtb7sqN1t9LNn8= +github.com/charmbracelet/x/ansi v0.1.1 h1:CGAduulr6egay/YVbGc8Hsu8deMg1xZ/bkaXTPi1JDk= +github.com/charmbracelet/x/ansi v0.1.1/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/exp/strings v0.0.0-20240524151031-ff83003bf67a h1:lOpqe2UvPmlln41DGoii7wlSZ/q8qGIon5JJ8Biu46I= +github.com/charmbracelet/x/exp/strings v0.0.0-20240524151031-ff83003bf67a/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ= +github.com/charmbracelet/x/exp/term v0.0.0-20240524151031-ff83003bf67a h1:k/s6UoOSVynWiw7PlclyGO2VdVs5ZLbMIHiGp4shFZE= +github.com/charmbracelet/x/exp/term v0.0.0-20240524151031-ff83003bf67a/go.mod h1:YBotIGhfoWhHDlnUpJMkjebGV2pdGRCn1Y4/Nk/vVcU= +github.com/charmbracelet/x/input v0.1.1 h1:YDOJaTUKCqtGnq9PHzx3pkkl4pXDOANUHmhH3DqMtM4= +github.com/charmbracelet/x/input v0.1.1/go.mod h1:jvdTVUnNWj/RD6hjC4FsoB0SeZCJ2ZBkiuFP9zXvZI0= +github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= +github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= +github.com/charmbracelet/x/windows v0.1.2 h1:Iumiwq2G+BRmgoayww/qfcvof7W/3uLoelhxojXlRWg= +github.com/charmbracelet/x/windows v0.1.2/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dhui/dktest v0.4.1 h1:/w+IWuDXVymg3IrRJCHHOkMK10m9aNVMOyD0X12YVTg= +github.com/dhui/dktest v0.4.1/go.mod h1:DdOqcUpL7vgyP4GlF3X3w7HbSlz8cEQzwewPveYEQbA= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= +github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +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-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-redsync/redsync/v4 v4.8.1 h1:rq2RvdTI0obznMdxKUWGdmmulo7lS9yCzb8fgDKOlbM= +github.com/go-redsync/redsync/v4 v4.8.1/go.mod h1:LmUAsQuQxhzZAoGY7JS6+dNhNmZyonMZiiEDY9plotM= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= +github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gofiber/template v1.8.3 h1:hzHdvMwMo/T2kouz2pPCA0zGiLCeMnoGsQZBTSYgZxc= +github.com/gofiber/template v1.8.3/go.mod h1:bs/2n0pSNPOkRa5VJ8zTIvedcI/lEYxzV3+YPXdBvq8= +github.com/gofiber/template/html/v2 v2.1.1 h1:QEy3O3EBkvwDthy5bXVGUseOyO6ldJoiDxlF4+MJiV8= +github.com/gofiber/template/html/v2 v2.1.1/go.mod h1:2G0GHHOUx70C1LDncoBpe4T6maQbNa4x1CVNFW0wju0= +github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= +github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4= +github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM= +github.com/golang-module/carbon/v2 v2.3.12 h1:VC1DwN1kBwJkh5MjXmTFryjs5g4CWyoM8HAHffZPX/k= +github.com/golang-module/carbon/v2 v2.3.12/go.mod h1:HNsedGzXGuNciZImYP2OMnpiwq/vhIstR/vn45ib5cI= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/gomodule/redigo v1.9.2/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= +github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/gookit/filter v1.2.1 h1:37XivkBm2E5qe1KaGdJ5ZfF5l9NYdGWfLEeQadJD8O4= +github.com/gookit/filter v1.2.1/go.mod h1:rxynQFr793x+XDwnRmJFEb53zDw0Zqx3OD7TXWoR9mQ= +github.com/gookit/goutil v0.6.15 h1:mMQ0ElojNZoyPD0eVROk5QXJPh2uKR4g06slgPDF5Jo= +github.com/gookit/goutil v0.6.15/go.mod h1:qdKdYEHQdEtyH+4fNdQNZfJHhI0jUZzHxQVAV3DaMDY= +github.com/gookit/validate v1.5.2 h1:i5I2OQ7WYHFRPRATGu9QarR9snnNHydvwSuHXaRWAV0= +github.com/gookit/validate v1.5.2/go.mod h1:yuPy2WwDlwGRa06fFJ5XIO8QEwhRnTC2LmxmBa5SE14= +github.com/goravel/fiber v1.2.1 h1:+hVmrxDzbT1bF/9bIgYytnROTgF1u+xgiVGM3N0S1E4= +github.com/goravel/fiber v1.2.1/go.mod h1:DB4QvgQ/WBqgXGs1cemhqAHFvj7jtI/Irk0RhHBWKoQ= +github.com/goravel/file-rotatelogs/v2 v2.4.2 h1:g68AzbePXcm0V2CpUMc9j4qVzcDn7+7aoWSjZ51C0m4= +github.com/goravel/file-rotatelogs/v2 v2.4.2/go.mod h1:23VuSW8cBS4ax5cmbV+5AaiLpq25b8UJ96IhbAkdo8I= +github.com/goravel/framework v1.14.1 h1:VcJvzn1ItFQh/rQZO1EMkxKmzDrww1S+OGz4hjZi3UY= +github.com/goravel/framework v1.14.1/go.mod h1:rScDXGQZdoVfyxemNPmijlz/2a+lWNOa4jTuak5GGVg= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +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-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/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +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.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +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/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= +github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +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.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= +github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= +github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= +github.com/pterm/pterm v0.12.79 h1:lH3yrYMhdpeqX9y5Ep1u7DejyHy7NSQg9qrBjF9dFT4= +github.com/pterm/pterm v0.12.79/go.mod h1:1v/gzOF1N0FsjbgTHZ1wVycRkKiatFvJSJC4IGaQAAo= +github.com/rabbitmq/amqp091-go v1.9.0 h1:qrQtyzB4H8BQgEuJwhmVQqVHB9O4+MNDJCCAcpc3Aoo= +github.com/rabbitmq/amqp091-go v1.9.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= +github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= +github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/redis/go-redis/v9 v9.5.3 h1:fOAp1/uJG+ZtcITgZOfYFmTKPE7n4Vclj1wZFgRciUU= +github.com/redis/go-redis/v9 v9.5.3/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= +github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rotisserie/eris v0.5.4 h1:Il6IvLdAapsMhvuOahHWiBnl1G++Q0/L5UIkI5mARSk= +github.com/rotisserie/eris v0.5.4/go.mod h1:Z/kgYTJiJtocxCbFfvRmO+QejApzG6zpyky9G1A4g9s= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/savioxavier/termlink v1.3.0 h1:3Gl4FzQjUyiHzmoEDfmWEhgIwDiJY4poOQHP+k8ReA4= +github.com/savioxavier/termlink v1.3.0/go.mod h1:5T5ePUlWbxCHIwyF8/Ez1qufOoGM89RCg9NvG+3G3gc= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= +github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= +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.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= +github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= +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= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.einride.tech/aip v0.66.0 h1:XfV+NQX6L7EOYK11yoHHFtndeaWh3KbD9/cN/6iWEt8= +go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= +go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.7.5 h1:ny3p0reEpgsR2cfA5cjgwFZg3Cv/ofFh/8jbhGtz9VI= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.5/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/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +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/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.39.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.171.0 h1:w174hnBPqut76FzW5Qaupt7zY8Kql6fiVjgys4f58sU= +google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/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/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= +gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= +gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= +gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= +gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= +gorm.io/driver/sqlserver v1.5.3 h1:rjupPS4PVw+rjJkfvr8jn2lJ8BMhT4UW5FwuJY0P3Z0= +gorm.io/driver/sqlserver v1.5.3/go.mod h1:B+CZ0/7oFJ6tAlefsKoyxdgDCXJKSgwS2bMOQZT0I00= +gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= +gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/plugin/dbresolver v1.5.1 h1:s9Dj9f7r+1rE3nx/Ywzc85nXptUEaeOO0pt27xdopM8= +gorm.io/plugin/dbresolver v1.5.1/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/frameworks/Go/goravel/src/fiber/main.go b/frameworks/Go/goravel/src/fiber/main.go new file mode 100644 index 00000000000..ddd89a4e1a1 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "github.com/goravel/framework/facades" + "github.com/goravel/framework/foundation" + + "goravel/config" +) + +func main() { + app := foundation.NewApplication() + + // Bootstrap the application + app.Boot() + + // Bootstrap the config. + config.Boot() + + // Start HTTP server by facades.Route(). + go func() { + if err := facades.Route().Run(); err != nil { + facades.Log().Errorf("Route run error: %v", err) + } + }() + + select {} +} diff --git a/frameworks/Go/goravel/src/fiber/routes/web.go b/frameworks/Go/goravel/src/fiber/routes/web.go new file mode 100644 index 00000000000..86bfbccc2d4 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/routes/web.go @@ -0,0 +1,19 @@ +package routes + +import ( + "github.com/goravel/framework/facades" + + "goravel/app/http/controllers" +) + +func Web() { + testController := controllers.NewTestController() + facades.Route().Get("/plaintext", testController.Plaintext) + facades.Route().Get("/json", testController.JSON) + facades.Route().Get("/db", testController.DB) + facades.Route().Get("/queries", testController.Queries) + facades.Route().Get("/update", testController.Update) + facades.Route().Get("/fortunes", testController.Fortunes) + facades.Route().Get("/cached-worlds", testController.CacheQueries) + +} diff --git a/frameworks/Go/goravel/src/fiber/templates/fortune.go b/frameworks/Go/goravel/src/fiber/templates/fortune.go new file mode 100644 index 00000000000..1d41ca2c80d --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/templates/fortune.go @@ -0,0 +1,53 @@ +package templates + +import ( + "sync" +) + +type Fortune struct { + ID int `json:"id,omitempty"` + Message string `json:"message,omitempty"` +} + +type Fortunes struct { + F []Fortune +} + +//go:generate go run github.com/valyala/quicktemplate/qtc + +var fortunePool = &sync.Pool{ + New: func() interface{} { + return new(Fortune) + }, +} + +var fortunesPool = &sync.Pool{ + New: func() interface{} { + return &Fortunes{ + F: make([]Fortune, 0), + } + }, +} + +// AcquireFortune returns new message from pool. +func AcquireFortune() *Fortune { + return fortunePool.Get().(*Fortune) +} + +// ReleaseFortune resets the message and return it to the pool. +func ReleaseFortune(f *Fortune) { + f.ID = 0 + f.Message = "" + fortunePool.Put(f) +} + +// AcquireFortunes returns new fortunes from pool. +func AcquireFortunes() *Fortunes { + return fortunesPool.Get().(*Fortunes) +} + +// ReleaseFortunes resets the fortunes and return it to the pool. +func ReleaseFortunes(f *Fortunes) { + f.F = f.F[:0] + fortunesPool.Put(f) +} diff --git a/frameworks/Go/goravel/src/fiber/templates/fortune.qtpl b/frameworks/Go/goravel/src/fiber/templates/fortune.qtpl new file mode 100644 index 00000000000..d387990d4ae --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/templates/fortune.qtpl @@ -0,0 +1,15 @@ +{% func FortunePage(rows []Fortune) %} + + +Fortunes + + + + +{% for _, r := range rows %} + +{% endfor %} +
idmessage
{%d int(r.ID) %}{%s r.Message %}
+ + +{% endfunc %} diff --git a/frameworks/Go/goravel/src/fiber/templates/fortune.qtpl.go b/frameworks/Go/goravel/src/fiber/templates/fortune.qtpl.go new file mode 100644 index 00000000000..8af0bbf4f10 --- /dev/null +++ b/frameworks/Go/goravel/src/fiber/templates/fortune.qtpl.go @@ -0,0 +1,81 @@ +// Code generated by qtc from "fortune.qtpl". DO NOT EDIT. +// See https://github.com/valyala/quicktemplate for details. + +//line fortune.qtpl:1 +package templates + +//line fortune.qtpl:1 +import ( + qtio422016 "io" + + qt422016 "github.com/valyala/quicktemplate" +) + +//line fortune.qtpl:1 +var ( + _ = qtio422016.Copy + _ = qt422016.AcquireByteBuffer +) + +//line fortune.qtpl:1 +func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) { +//line fortune.qtpl:1 + qw422016.N().S(` + + +Fortunes + + + + +`) +//line fortune.qtpl:9 + for _, r := range rows { +//line fortune.qtpl:9 + qw422016.N().S(` + +`) +//line fortune.qtpl:11 + } +//line fortune.qtpl:11 + qw422016.N().S(` +
idmessage
`) +//line fortune.qtpl:10 + qw422016.N().D(int(r.ID)) +//line fortune.qtpl:10 + qw422016.N().S(``) +//line fortune.qtpl:10 + qw422016.E().S(r.Message) +//line fortune.qtpl:10 + qw422016.N().S(`
+ + +`) +//line fortune.qtpl:15 +} + +//line fortune.qtpl:15 +func WriteFortunePage(qq422016 qtio422016.Writer, rows []Fortune) { +//line fortune.qtpl:15 + qw422016 := qt422016.AcquireWriter(qq422016) +//line fortune.qtpl:15 + StreamFortunePage(qw422016, rows) +//line fortune.qtpl:15 + qt422016.ReleaseWriter(qw422016) +//line fortune.qtpl:15 +} + +//line fortune.qtpl:15 +func FortunePage(rows []Fortune) string { +//line fortune.qtpl:15 + qb422016 := qt422016.AcquireByteBuffer() +//line fortune.qtpl:15 + WriteFortunePage(qb422016, rows) +//line fortune.qtpl:15 + qs422016 := string(qb422016.B) +//line fortune.qtpl:15 + qt422016.ReleaseByteBuffer(qb422016) +//line fortune.qtpl:15 + return qs422016 +//line fortune.qtpl:15 +} diff --git a/frameworks/Go/goravel/src/gin/.env b/frameworks/Go/goravel/src/gin/.env new file mode 100644 index 00000000000..9ceb9e63dc9 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/.env @@ -0,0 +1 @@ +APP_KEY=abcdefghijklmnopqrstuvwxyz123456 \ No newline at end of file diff --git a/frameworks/Go/goravel/src/gin/app/http/controllers/test_controller.go b/frameworks/Go/goravel/src/gin/app/http/controllers/test_controller.go new file mode 100644 index 00000000000..7b68b61daeb --- /dev/null +++ b/frameworks/Go/goravel/src/gin/app/http/controllers/test_controller.go @@ -0,0 +1,129 @@ +package controllers + +import ( + "math/rand/v2" + "sort" + + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/facades" + + "goravel/app/models" +) + +type TestController struct{} + +func NewTestController() *TestController { + initCache() + return &TestController{} +} + +func (r *TestController) Plaintext(ctx http.Context) http.Response { + Plaintext(ctx, helloworld) + return nil +} + +func (r *TestController) JSON(ctx http.Context) http.Response { + message := acquireMessage() + message.Message = helloworld + + JSON(ctx, &message) + releaseMessage(message) + return nil +} + +func (r *TestController) DB(ctx http.Context) http.Response { + world := acquireWorld() + + world.ID = r.getRand() + _ = facades.Orm().Query().Find(&world) + + JSON(ctx, &world) + releaseWorld(world) + return nil +} + +func (r *TestController) Queries(ctx http.Context) http.Response { + n := r.getN(ctx) + worlds := acquireWorlds()[:n] + + for i := 0; i < n; i++ { + worlds[i].ID = r.getRand() + _ = facades.Orm().Query().Find(&worlds[i]) + } + + JSON(ctx, &worlds) + releaseWorlds(worlds) + return nil +} + +func (r *TestController) Update(ctx http.Context) http.Response { + n := r.getN(ctx) + worlds := acquireWorlds()[:n] + + for i := 0; i < n; i++ { + worlds[i].ID = r.getRand() + _ = facades.Orm().Query().Find(&worlds[i]) + } + + // sorting is required for insert deadlock prevention. + sort.Slice(worlds, func(i, j int) bool { + return worlds[i].ID < worlds[j].ID + }) + + tx, _ := facades.Orm().Query().Begin() + for i := 0; i < n; i++ { + worlds[i].RandomNumber = r.getRand() + _ = tx.Save(&worlds[i]) + } + _ = tx.Commit() + + JSON(ctx, &worlds) + releaseWorlds(worlds) + return nil +} + +func (r *TestController) Fortunes(ctx http.Context) http.Response { + fortunes := make([]models.Fortune, 0) + _ = facades.Orm().Query().Get(&fortunes) + fortunes = append(fortunes, models.Fortune{Message: "Additional fortune added at request time."}) + + sort.Slice(fortunes, func(i, j int) bool { + return fortunes[i].Message < fortunes[j].Message + }) + + return ctx.Response(). + Header("Server", "Goravel"). + View(). + Make("fortunes.tmpl", map[string]any{ + "fortunes": fortunes, + }) +} + +func (r *TestController) CacheQueries(ctx http.Context) http.Response { + n := r.getN(ctx) + worlds := acquireWorlds()[:n] + cached := facades.Cache().Get("worlds").(Worlds) + + for i := 0; i < n; i++ { + worlds[i] = cached[r.getRand()-1] + } + + JSON(ctx, &worlds) + releaseWorlds(worlds) + return nil +} + +func (r *TestController) getN(ctx http.Context) int { + n := ctx.Request().QueryInt(queryparam) + if n < 1 { + n = 1 + } else if n > 500 { + n = 500 + } + + return n +} + +func (r *TestController) getRand() int32 { + return rand.Int32N(worldcount) + 1 +} diff --git a/frameworks/Go/goravel/src/gin/app/http/controllers/utils.go b/frameworks/Go/goravel/src/gin/app/http/controllers/utils.go new file mode 100644 index 00000000000..9cac0d34b48 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/app/http/controllers/utils.go @@ -0,0 +1,101 @@ +package controllers + +import ( + "fmt" + "sync" + "unsafe" + + "github.com/bytedance/sonic" + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/facades" + + "goravel/app/models" +) + +const ( + queryparam = "q" + helloworld = "Hello, World!" + worldcount = 10000 + contentTypePlain = "text/plain; charset=utf-8" + contentTypeJson = "application/json" +) + +type Message struct { + Message string `json:"message"` +} + +type Worlds []models.World + +var messagePool = sync.Pool{ + New: func() any { + return new(Message) + }, +} + +var worldPool = sync.Pool{ + New: func() any { + return new(models.World) + }, +} + +var worldsPool = sync.Pool{ + New: func() any { + return make(Worlds, 0, 500) + }, +} + +func acquireMessage() *Message { + return messagePool.Get().(*Message) +} + +func releaseMessage(m *Message) { + m.Message = "" + messagePool.Put(m) +} + +func acquireWorld() *models.World { + return worldPool.Get().(*models.World) +} + +func releaseWorld(w *models.World) { + w.ID = 0 + w.RandomNumber = 0 + worldPool.Put(w) +} + +func acquireWorlds() Worlds { + return worldsPool.Get().(Worlds) +} + +func releaseWorlds(w Worlds) { + w = w[:0] + worldsPool.Put(w) +} + +func str2bytes(s string) []byte { + return unsafe.Slice(unsafe.StringData(s), len(s)) +} + +func initCache() { + worlds := acquireWorlds() + defer releaseWorlds(worlds) + + if err := facades.Orm().Query().Get(&worlds); err != nil { + panic(fmt.Sprintf("Failed to init cached Worlds: %v", err)) + } + + facades.Cache().Forever("worlds", worlds) +} + +func JSON(ctx http.Context, data any) { + ctx.Response().Header("Server", "Goravel") + ctx.Response().Header("Content-Type", contentTypeJson) + bytes, _ := sonic.Marshal(data) + _, _ = ctx.Response().Writer().Write(bytes) +} + +func Plaintext(ctx http.Context, data string) { + ctx.Response().Header("Server", "Goravel") + ctx.Response().Header("Content-Type", contentTypePlain) + _, _ = ctx.Response().Writer().Write(str2bytes(data)) +} diff --git a/frameworks/Go/goravel/src/gin/app/models/fortune.go b/frameworks/Go/goravel/src/gin/app/models/fortune.go new file mode 100644 index 00000000000..8e8e1dd21a8 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/app/models/fortune.go @@ -0,0 +1,10 @@ +package models + +type Fortune struct { + ID uint `gorm:"primaryKey" json:"id"` + Message string `gorm:"column:message" json:"message"` +} + +func (r *Fortune) TableName() string { + return "Fortune" +} diff --git a/frameworks/Go/goravel/src/gin/app/models/world.go b/frameworks/Go/goravel/src/gin/app/models/world.go new file mode 100644 index 00000000000..da724366273 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/app/models/world.go @@ -0,0 +1,10 @@ +package models + +type World struct { + ID int32 `gorm:"primaryKey" json:"id"` + RandomNumber int32 `gorm:"column:randomnumber" json:"randomNumber"` +} + +func (r *World) TableName() string { + return "World" +} diff --git a/frameworks/Go/goravel/src/gin/app/providers/route_service_provider.go b/frameworks/Go/goravel/src/gin/app/providers/route_service_provider.go new file mode 100644 index 00000000000..2e96015a24f --- /dev/null +++ b/frameworks/Go/goravel/src/gin/app/providers/route_service_provider.go @@ -0,0 +1,16 @@ +package providers + +import ( + "github.com/goravel/framework/contracts/foundation" + + "goravel/routes" +) + +type RouteServiceProvider struct{} + +func (receiver *RouteServiceProvider) Register(app foundation.Application) { +} + +func (receiver *RouteServiceProvider) Boot(app foundation.Application) { + routes.Web() +} diff --git a/frameworks/Go/goravel/src/gin/config/app.go b/frameworks/Go/goravel/src/gin/config/app.go new file mode 100644 index 00000000000..f6f898c90fd --- /dev/null +++ b/frameworks/Go/goravel/src/gin/config/app.go @@ -0,0 +1,40 @@ +package config + +import ( + "github.com/goravel/framework/cache" + "github.com/goravel/framework/console" + "github.com/goravel/framework/contracts/foundation" + "github.com/goravel/framework/database" + "github.com/goravel/framework/facades" + "github.com/goravel/framework/http" + "github.com/goravel/framework/log" + "github.com/goravel/framework/route" + "github.com/goravel/framework/validation" + "github.com/goravel/gin" + + "goravel/app/providers" +) + +// Boot Start all init methods of the current folder to bootstrap all config. +func Boot() {} + +func init() { + config := facades.Config() + config.Add("app", map[string]any{ + "name": "Goravel", + "env": "production", + "debug": false, + "key": config.Env("APP_KEY", ""), + "providers": []foundation.ServiceProvider{ + &log.ServiceProvider{}, + &console.ServiceProvider{}, + &database.ServiceProvider{}, + &cache.ServiceProvider{}, + &http.ServiceProvider{}, + &route.ServiceProvider{}, + &validation.ServiceProvider{}, + &providers.RouteServiceProvider{}, + &gin.ServiceProvider{}, + }, + }) +} diff --git a/frameworks/Go/goravel/src/gin/config/cache.go b/frameworks/Go/goravel/src/gin/config/cache.go new file mode 100644 index 00000000000..3c638243c2c --- /dev/null +++ b/frameworks/Go/goravel/src/gin/config/cache.go @@ -0,0 +1,18 @@ +package config + +import ( + "github.com/goravel/framework/facades" +) + +func init() { + config := facades.Config() + config.Add("cache", map[string]any{ + "default": "memory", + "stores": map[string]any{ + "memory": map[string]any{ + "driver": "memory", + }, + }, + "prefix": "goravel_cache", + }) +} diff --git a/frameworks/Go/goravel/src/gin/config/database.go b/frameworks/Go/goravel/src/gin/config/database.go new file mode 100644 index 00000000000..e1b1eb3272a --- /dev/null +++ b/frameworks/Go/goravel/src/gin/config/database.go @@ -0,0 +1,32 @@ +package config + +import ( + "github.com/goravel/framework/facades" +) + +func init() { + config := facades.Config() + config.Add("database", map[string]any{ + "default": "postgresql", + "connections": map[string]any{ + "postgresql": map[string]any{ + "driver": "postgresql", + "host": config.Env("DB_HOST", "tfb-database"), + "port": config.Env("DB_PORT", 5432), + "database": config.Env("DB_DATABASE", "hello_world"), + "username": config.Env("DB_USERNAME", "benchmarkdbuser"), + "password": config.Env("DB_PASSWORD", "benchmarkdbpass"), + "sslmode": "disable", + "timezone": "UTC", + "prefix": "", + "singular": true, + }, + }, + "pool": map[string]any{ + "max_idle_conns": 100, + "max_open_conns": 2000, + "conn_max_idletime": 3600, + "conn_max_lifetime": 3600, + }, + }) +} diff --git a/frameworks/Go/goravel/src/gin/config/http.go b/frameworks/Go/goravel/src/gin/config/http.go new file mode 100644 index 00000000000..9d8846ee610 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/config/http.go @@ -0,0 +1,30 @@ +package config + +import ( + "github.com/gin-gonic/gin/render" + "github.com/goravel/framework/contracts/route" + "github.com/goravel/framework/facades" + "github.com/goravel/gin" + ginfacades "github.com/goravel/gin/facades" +) + +func init() { + config := facades.Config() + config.Add("http", map[string]any{ + "default": "gin", + "drivers": map[string]any{ + "gin": map[string]any{ + "body_limit": 4096, + "header_limit": 4096, + "route": func() (route.Route, error) { + return ginfacades.Route("gin"), nil + }, + "template": func() (render.HTMLRender, error) { + return gin.DefaultTemplate() + }, + }, + }, + "host": "", + "port": "8080", + }) +} diff --git a/frameworks/Go/goravel/src/gin/config/json.go b/frameworks/Go/goravel/src/gin/config/json.go new file mode 100644 index 00000000000..2b2e1af3f80 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/config/json.go @@ -0,0 +1,31 @@ +package config + +import ( + "github.com/bytedance/sonic" + "github.com/goravel/framework/contracts/foundation" + "github.com/goravel/framework/facades" +) + +func init() { + facades.App().SetJson(NewJson()) +} + +type Json struct { + marshal func(any) ([]byte, error) + unmarshal func([]byte, any) error +} + +func NewJson() foundation.Json { + return &Json{ + marshal: sonic.Marshal, + unmarshal: sonic.Unmarshal, + } +} + +func (j *Json) Marshal(v any) ([]byte, error) { + return j.marshal(v) +} + +func (j *Json) Unmarshal(data []byte, v any) error { + return j.unmarshal(data, v) +} diff --git a/frameworks/Go/goravel/src/gin/go.mod b/frameworks/Go/goravel/src/gin/go.mod new file mode 100644 index 00000000000..93ac7f3ec4e --- /dev/null +++ b/frameworks/Go/goravel/src/gin/go.mod @@ -0,0 +1,194 @@ +module goravel + +go 1.22 + +require ( + github.com/bytedance/sonic v1.11.9 + github.com/gin-gonic/gin v1.10.0 + github.com/goravel/framework v1.14.1 + github.com/goravel/gin v1.2.1 +) + +require ( + atomicgo.dev/cursor v0.2.0 // indirect + atomicgo.dev/keyboard v0.2.9 // indirect + atomicgo.dev/schedule v0.1.0 // indirect + cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute v1.25.1 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v1.1.6 // indirect + cloud.google.com/go/pubsub v1.36.1 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.16 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae // indirect + github.com/RichardKnop/machinery/v2 v2.0.13 // indirect + github.com/atotto/clipboard v0.1.4 // indirect + github.com/aws/aws-sdk-go v1.49.6 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/catppuccin/go v0.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/charmbracelet/bubbles v0.18.0 // indirect + github.com/charmbracelet/bubbletea v0.26.3 // indirect + github.com/charmbracelet/huh v0.4.2 // indirect + github.com/charmbracelet/huh/spinner v0.0.0-20240508140610-13957916abf0 // indirect + github.com/charmbracelet/lipgloss v0.11.0 // indirect + github.com/charmbracelet/x/ansi v0.1.1 // indirect + github.com/charmbracelet/x/exp/strings v0.0.0-20240524151031-ff83003bf67a // indirect + github.com/charmbracelet/x/input v0.1.1 // indirect + github.com/charmbracelet/x/term v0.1.1 // indirect + github.com/charmbracelet/x/windows v0.1.2 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.4 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/glebarez/sqlite v1.11.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/go-redsync/redsync/v4 v4.8.1 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang-migrate/migrate/v4 v4.17.1 // indirect + github.com/golang-module/carbon/v2 v2.3.12 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gomodule/redigo v2.0.0+incompatible // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/google/wire v0.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.3 // indirect + github.com/gookit/color v1.5.4 // indirect + github.com/gookit/filter v1.2.1 // indirect + github.com/gookit/goutil v0.6.15 // indirect + github.com/gookit/validate v1.5.2 // indirect + github.com/goravel/file-rotatelogs/v2 v2.4.2 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kelseyhightower/envconfig v1.4.0 // indirect + github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/microsoft/go-mssqldb v1.6.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/termenv v0.15.2 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/pterm/pterm v0.12.79 // indirect + github.com/rabbitmq/amqp091-go v1.9.0 // indirect + github.com/redis/go-redis/v9 v9.5.3 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rotisserie/eris v0.5.4 // indirect + github.com/rs/cors v1.11.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/savioxavier/termlink v1.3.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/unrolled/secure v1.14.0 // indirect + github.com/urfave/cli/v2 v2.27.2 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.1 // indirect + github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + go.mongodb.org/mongo-driver v1.7.5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/api v0.171.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.6 // indirect + gorm.io/driver/postgres v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.3 // indirect + gorm.io/gorm v1.25.10 // indirect + gorm.io/plugin/dbresolver v1.5.1 // indirect + modernc.org/libc v1.37.6 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/sqlite v1.28.0 // indirect +) diff --git a/frameworks/Go/goravel/src/gin/go.sum b/frameworks/Go/goravel/src/gin/go.sum new file mode 100644 index 00000000000..92b222fbcbb --- /dev/null +++ b/frameworks/Go/goravel/src/gin/go.sum @@ -0,0 +1,1170 @@ +atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg= +atomicgo.dev/assert v0.0.2/go.mod h1:ut4NcI3QDdJtlmAxQULOmA13Gz6e2DWbSAS8RUOmNYQ= +atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= +atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= +atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= +atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= +atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= +cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/kms v1.15.7 h1:7caV9K3yIxvlQPAcaFffhlT7d1qpxjB1wHBtjWa13SM= +cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.10.0/go.mod h1:eNpTrkOy7dCpkNyaSNetMa6udbgecJMd0ZsTJS/cuNo= +cloud.google.com/go/pubsub v1.36.1 h1:dfEPuGCHGbWUhaMCTHUFjfroILEkx55iUmKBZTP5f+Y= +cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.16 h1:P8An8Z9rH1ldbOLdFpxYorgOt2sywL9V24dAwWHPuGc= +github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0 h1:HCc0+LpPfpCKs6LGGLAhwBARt9632unrVcI6i8s/8os= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= +github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= +github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= +github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= +github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc4n3EjyIYvEY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae h1:DcFpTQBYQ9Ct2d6sC7ol0/ynxc2pO1cpGUM+f4t5adg= +github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae/go.mod h1:rJJ84PyA/Wlmw1hO+xTzV2wsSUon6J5ktg0g8BF2PuU= +github.com/RichardKnop/machinery/v2 v2.0.13 h1:uo9htg+qNBi7UeUK3jcTBl3vTO/vvLKGaOdCOKePl50= +github.com/RichardKnop/machinery/v2 v2.0.13/go.mod h1:Yc2X/QRm9rRfAjB+93NGR+kSUqtnqqs8kME4L+TKKiw= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go v1.37.16/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.49.6 h1:yNldzF5kzLBRvKlKz1S0bkvc2+04R1kt13KfBWQBfFA= +github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/brianvoe/gofakeit/v6 v6.28.0 h1:Xib46XXuQfmlLS2EXRuJpqcw8St6qSZz75OUo0tgAW4= +github.com/brianvoe/gofakeit/v6 v6.28.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs= +github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.20.0/go.mod h1:JifAceMQ4crZIWYUKrlGcmbN3bqHogVTADMD2ATsbwk= +github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/sonic v1.11.9 h1:LFHENlIY/SLzDWverzdOvgMztTxcfcF+cqNsz9pK5zg= +github.com/bytedance/sonic v1.11.9/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/catppuccin/go v0.2.0 h1:ktBeIrIP42b/8FGiScP9sgrWOss3lw0Z5SktRoithGA= +github.com/catppuccin/go v0.2.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.26.3 h1:iXyGvI+FfOWqkB2V07m1DF3xxQijxjY2j8PqiXYqasg= +github.com/charmbracelet/bubbletea v0.26.3/go.mod h1:bpZHfDHTYJC5g+FBK+ptJRCQotRC+Dhh3AoMxa/2+3Q= +github.com/charmbracelet/huh v0.4.2 h1:5wLkwrA58XDAfEZsJzNQlfJ+K8N9+wYwvR5FOM7jXFM= +github.com/charmbracelet/huh v0.4.2/go.mod h1:g9OXBgtY3zRV4ahnVih9bZE+1yGYN+y2C9Q6L2P+WM0= +github.com/charmbracelet/huh/spinner v0.0.0-20240508140610-13957916abf0 h1:79JTuYRirtyCn9ac6rzPt5AQKtBDFc1gKxpw0wBrI+Y= +github.com/charmbracelet/huh/spinner v0.0.0-20240508140610-13957916abf0/go.mod h1:Zxt9FH6togK9kY71pRJGtmyNkJ1eIWdK1gRaXrS/FKA= +github.com/charmbracelet/lipgloss v0.11.0 h1:UoAcbQ6Qml8hDwSWs0Y1cB5TEQuZkDPH/ZqwWWYTG4g= +github.com/charmbracelet/lipgloss v0.11.0/go.mod h1:1UdRTH9gYgpcdNN5oBtjbu/IzNKtzVtb7sqN1t9LNn8= +github.com/charmbracelet/x/ansi v0.1.1 h1:CGAduulr6egay/YVbGc8Hsu8deMg1xZ/bkaXTPi1JDk= +github.com/charmbracelet/x/ansi v0.1.1/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/exp/strings v0.0.0-20240524151031-ff83003bf67a h1:lOpqe2UvPmlln41DGoii7wlSZ/q8qGIon5JJ8Biu46I= +github.com/charmbracelet/x/exp/strings v0.0.0-20240524151031-ff83003bf67a/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ= +github.com/charmbracelet/x/exp/term v0.0.0-20240524151031-ff83003bf67a h1:k/s6UoOSVynWiw7PlclyGO2VdVs5ZLbMIHiGp4shFZE= +github.com/charmbracelet/x/exp/term v0.0.0-20240524151031-ff83003bf67a/go.mod h1:YBotIGhfoWhHDlnUpJMkjebGV2pdGRCn1Y4/Nk/vVcU= +github.com/charmbracelet/x/input v0.1.1 h1:YDOJaTUKCqtGnq9PHzx3pkkl4pXDOANUHmhH3DqMtM4= +github.com/charmbracelet/x/input v0.1.1/go.mod h1:jvdTVUnNWj/RD6hjC4FsoB0SeZCJ2ZBkiuFP9zXvZI0= +github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= +github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= +github.com/charmbracelet/x/windows v0.1.2 h1:Iumiwq2G+BRmgoayww/qfcvof7W/3uLoelhxojXlRWg= +github.com/charmbracelet/x/windows v0.1.2/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dhui/dktest v0.4.1 h1:/w+IWuDXVymg3IrRJCHHOkMK10m9aNVMOyD0X12YVTg= +github.com/dhui/dktest v0.4.1/go.mod h1:DdOqcUpL7vgyP4GlF3X3w7HbSlz8cEQzwewPveYEQbA= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= +github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +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-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-redsync/redsync/v4 v4.8.1 h1:rq2RvdTI0obznMdxKUWGdmmulo7lS9yCzb8fgDKOlbM= +github.com/go-redsync/redsync/v4 v4.8.1/go.mod h1:LmUAsQuQxhzZAoGY7JS6+dNhNmZyonMZiiEDY9plotM= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +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/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4= +github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM= +github.com/golang-module/carbon/v2 v2.3.12 h1:VC1DwN1kBwJkh5MjXmTFryjs5g4CWyoM8HAHffZPX/k= +github.com/golang-module/carbon/v2 v2.3.12/go.mod h1:HNsedGzXGuNciZImYP2OMnpiwq/vhIstR/vn45ib5cI= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/gomodule/redigo v1.9.2/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= +github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/gookit/filter v1.2.1 h1:37XivkBm2E5qe1KaGdJ5ZfF5l9NYdGWfLEeQadJD8O4= +github.com/gookit/filter v1.2.1/go.mod h1:rxynQFr793x+XDwnRmJFEb53zDw0Zqx3OD7TXWoR9mQ= +github.com/gookit/goutil v0.6.15 h1:mMQ0ElojNZoyPD0eVROk5QXJPh2uKR4g06slgPDF5Jo= +github.com/gookit/goutil v0.6.15/go.mod h1:qdKdYEHQdEtyH+4fNdQNZfJHhI0jUZzHxQVAV3DaMDY= +github.com/gookit/validate v1.5.2 h1:i5I2OQ7WYHFRPRATGu9QarR9snnNHydvwSuHXaRWAV0= +github.com/gookit/validate v1.5.2/go.mod h1:yuPy2WwDlwGRa06fFJ5XIO8QEwhRnTC2LmxmBa5SE14= +github.com/goravel/file-rotatelogs/v2 v2.4.2 h1:g68AzbePXcm0V2CpUMc9j4qVzcDn7+7aoWSjZ51C0m4= +github.com/goravel/file-rotatelogs/v2 v2.4.2/go.mod h1:23VuSW8cBS4ax5cmbV+5AaiLpq25b8UJ96IhbAkdo8I= +github.com/goravel/framework v1.14.1 h1:VcJvzn1ItFQh/rQZO1EMkxKmzDrww1S+OGz4hjZi3UY= +github.com/goravel/framework v1.14.1/go.mod h1:rScDXGQZdoVfyxemNPmijlz/2a+lWNOa4jTuak5GGVg= +github.com/goravel/gin v1.2.1 h1:lnQX3NKUEaSx8x7AAJpoeVkXgi+MVQ9FXy4QywHQElo= +github.com/goravel/gin v1.2.1/go.mod h1:Qt3NJysg/eoxXL4y/swwFUcfcIT7XG+xb0rWChweZfY= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +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-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/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +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/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= +github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +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-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= +github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= +github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= +github.com/pterm/pterm v0.12.79 h1:lH3yrYMhdpeqX9y5Ep1u7DejyHy7NSQg9qrBjF9dFT4= +github.com/pterm/pterm v0.12.79/go.mod h1:1v/gzOF1N0FsjbgTHZ1wVycRkKiatFvJSJC4IGaQAAo= +github.com/rabbitmq/amqp091-go v1.9.0 h1:qrQtyzB4H8BQgEuJwhmVQqVHB9O4+MNDJCCAcpc3Aoo= +github.com/rabbitmq/amqp091-go v1.9.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= +github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= +github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/redis/go-redis/v9 v9.5.3 h1:fOAp1/uJG+ZtcITgZOfYFmTKPE7n4Vclj1wZFgRciUU= +github.com/redis/go-redis/v9 v9.5.3/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= +github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rotisserie/eris v0.5.4 h1:Il6IvLdAapsMhvuOahHWiBnl1G++Q0/L5UIkI5mARSk= +github.com/rotisserie/eris v0.5.4/go.mod h1:Z/kgYTJiJtocxCbFfvRmO+QejApzG6zpyky9G1A4g9s= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/savioxavier/termlink v1.3.0 h1:3Gl4FzQjUyiHzmoEDfmWEhgIwDiJY4poOQHP+k8ReA4= +github.com/savioxavier/termlink v1.3.0/go.mod h1:5T5ePUlWbxCHIwyF8/Ez1qufOoGM89RCg9NvG+3G3gc= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/unrolled/secure v1.14.0 h1:u9vJTU/pR4Bny0ntLUMxdfLtmIRGvQf2sEFuA0TG9AE= +github.com/unrolled/secure v1.14.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= +github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= +github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.einride.tech/aip v0.66.0 h1:XfV+NQX6L7EOYK11yoHHFtndeaWh3KbD9/cN/6iWEt8= +go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= +go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.7.5 h1:ny3p0reEpgsR2cfA5cjgwFZg3Cv/ofFh/8jbhGtz9VI= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.5/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/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +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/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.39.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.171.0 h1:w174hnBPqut76FzW5Qaupt7zY8Kql6fiVjgys4f58sU= +google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/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/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= +gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= +gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= +gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= +gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= +gorm.io/driver/sqlserver v1.5.3 h1:rjupPS4PVw+rjJkfvr8jn2lJ8BMhT4UW5FwuJY0P3Z0= +gorm.io/driver/sqlserver v1.5.3/go.mod h1:B+CZ0/7oFJ6tAlefsKoyxdgDCXJKSgwS2bMOQZT0I00= +gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= +gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/plugin/dbresolver v1.5.1 h1:s9Dj9f7r+1rE3nx/Ywzc85nXptUEaeOO0pt27xdopM8= +gorm.io/plugin/dbresolver v1.5.1/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/frameworks/Go/goravel/src/gin/main.go b/frameworks/Go/goravel/src/gin/main.go new file mode 100644 index 00000000000..ddd89a4e1a1 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "github.com/goravel/framework/facades" + "github.com/goravel/framework/foundation" + + "goravel/config" +) + +func main() { + app := foundation.NewApplication() + + // Bootstrap the application + app.Boot() + + // Bootstrap the config. + config.Boot() + + // Start HTTP server by facades.Route(). + go func() { + if err := facades.Route().Run(); err != nil { + facades.Log().Errorf("Route run error: %v", err) + } + }() + + select {} +} diff --git a/frameworks/Go/goravel/src/gin/resources/views/fortunes.tmpl b/frameworks/Go/goravel/src/gin/resources/views/fortunes.tmpl new file mode 100644 index 00000000000..4c58fa53da0 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/resources/views/fortunes.tmpl @@ -0,0 +1,22 @@ +{{define "fortunes.tmpl"}} + + + + Fortunes + + + + + + + + {{range .fortunes}} + + + + + {{end}} +
idmessage
{{.ID}}{{.Message}}
+ + +{{end}} diff --git a/frameworks/Go/goravel/src/gin/routes/web.go b/frameworks/Go/goravel/src/gin/routes/web.go new file mode 100644 index 00000000000..86bfbccc2d4 --- /dev/null +++ b/frameworks/Go/goravel/src/gin/routes/web.go @@ -0,0 +1,19 @@ +package routes + +import ( + "github.com/goravel/framework/facades" + + "goravel/app/http/controllers" +) + +func Web() { + testController := controllers.NewTestController() + facades.Route().Get("/plaintext", testController.Plaintext) + facades.Route().Get("/json", testController.JSON) + facades.Route().Get("/db", testController.DB) + facades.Route().Get("/queries", testController.Queries) + facades.Route().Get("/update", testController.Update) + facades.Route().Get("/fortunes", testController.Fortunes) + facades.Route().Get("/cached-worlds", testController.CacheQueries) + +} From c225d2aac662fc647e7a2b85c59c44b0ce52aff5 Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Mon, 1 Jul 2024 20:50:03 +0300 Subject: [PATCH 0686/1766] [mORMot] fixed GPF on plaintext endpoint 2.2.7693 (#9121) Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/setup_and_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 85863798754..ed0c26034e8 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/f0fc66c954cd45f5c581e52c21170923805a683b +URL=https://github.com/synopse/mORMot2/tarball/a0dda41833c3d32531080d1eeb5a1627540d62e9 #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 From 3c91fd5b639be1383bdeef90ed69005a72b87d2a Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 2 Jul 2024 01:50:14 +0800 Subject: [PATCH 0687/1766] beetlex update RawDb (#9117) * update beetleX to BeetleX.Light * update beetlex to beetlex.light * fix fortunes error * fix error * remove beetlex-core-updb * update * update benchmark_config * update * update * update * update RawDb * update * update * update * update * update dbraw --- .../beetlex/PlatformBenchmarks/DBRaw.cs | 425 ++++++++---------- .../beetlex/PlatformBenchmarks/GMTDate.cs | 14 +- .../PlatformBenchmarks/HttpHandler.Caching.cs | 2 +- .../beetlex/PlatformBenchmarks/HttpHandler.cs | 22 +- .../PlatformBenchmarks/HttpHandler.db.cs | 4 +- .../HttpHandler.fortunes.cs | 24 +- .../PlatformBenchmarks/HttpHandler.json.cs | 10 +- .../HttpHandler.plaintext.cs | 23 +- .../PlatformBenchmarks/HttpHandler.queries.cs | 2 +- .../PlatformBenchmarks/HttpHandler.updates.cs | 2 +- .../beetlex/PlatformBenchmarks/HttpServer.cs | 28 +- .../PlatformBenchmarks.csproj | 2 +- .../beetlex/PlatformBenchmarks/Program.cs | 1 - 13 files changed, 243 insertions(+), 316 deletions(-) diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs index ca668243fe7..6aae831fcbb 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/DBRaw.cs @@ -10,110 +10,44 @@ using Microsoft.Extensions.Caching.Memory; using Npgsql; +using System.Runtime.CompilerServices; namespace PlatformBenchmarks { - public class RawDb + public sealed class RawDb { - private readonly ConcurrentRandom _random; + private readonly MemoryCache _cache + = new(new MemoryCacheOptions { ExpirationScanFrequency = TimeSpan.FromMinutes(60) }); - private readonly DbProviderFactory _dbProviderFactory; - - private readonly static MemoryCache _cache = new MemoryCache( - new MemoryCacheOptions() - { - ExpirationScanFrequency = TimeSpan.FromMinutes(60) - }); - - private static readonly object[] _cacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray(); + private static DbProviderFactory _dbProviderFactory => Npgsql.NpgsqlFactory.Instance; + private readonly string _connectionString; - public static string _connectionString = null; - - public RawDb(ConcurrentRandom random, DbProviderFactory dbProviderFactory) + public RawDb(ConcurrentRandom random, string connectionString) { _random = random; - _dbProviderFactory = dbProviderFactory; - OnCreateCommand(); - } - private void OnCreateCommand() - { - SingleCommand = new Npgsql.NpgsqlCommand(); - SingleCommand.CommandText = "SELECT id, randomnumber FROM world WHERE id = @Id"; - mID = new Npgsql.NpgsqlParameter("@Id", _random.Next(1, 10001)); - SingleCommand.Parameters.Add(mID); - FortuneCommand = new Npgsql.NpgsqlCommand(); - FortuneCommand.CommandText = "SELECT id, message FROM fortune"; - } - - private DbCommand SingleCommand; - - private DbCommand FortuneCommand; - - private Npgsql.NpgsqlParameter mID; - - private static int ListDefaultSize = 8; - - private World[] mWorldBuffer = null; - - private World[] GetWorldBuffer() - { - if (mWorldBuffer == null) - mWorldBuffer = new World[512]; - return mWorldBuffer; - } - - private Fortune[] mFortunesBuffer = null; - - private Fortune[] GetFortuneBuffer() - { - if (mFortunesBuffer == null) - mFortunesBuffer = new Fortune[512]; - return mFortunesBuffer; + _connectionString = connectionString; } public async Task LoadSingleQueryRow() { - using (var db = _dbProviderFactory.CreateConnection()) - { - db.ConnectionString = _connectionString; - await db.OpenAsync(); - SingleCommand.Connection = db; - mID.TypedValue = _random.Next(1, 10001); - return await ReadSingleRow(db, SingleCommand); - - } - } - - async Task ReadSingleRow(DbConnection connection, DbCommand cmd) - { - using (var rdr = await cmd.ExecuteReaderAsync(CommandBehavior.SingleRow)) - + using (var connection = (NpgsqlConnection)_dbProviderFactory.CreateConnection()) { - await rdr.ReadAsync(); - return new World + connection.ConnectionString = _connectionString; + await connection.OpenAsync(); + var (cmd, _) = CreateReadCommand(connection); + using (var command = cmd) { - Id = rdr.GetInt32(0), - RandomNumber = rdr.GetInt32(1) - }; - } - } - public async Task> LoadMultipleQueriesRows(int count) - { - using (var db = _dbProviderFactory.CreateConnection()) - { - db.ConnectionString = _connectionString; - await db.OpenAsync(); - return await LoadMultipleRows(count, db); + return await ReadSingleRow(cmd); + } } } - - public Task LoadCachedQueries(int count) + public Task LoadCachedQueries(int count) { - var result = new World[count]; + var result = new CachedWorld[count]; var cacheKeys = _cacheKeys; var cache = _cache; var random = _random; @@ -121,42 +55,40 @@ public Task LoadCachedQueries(int count) { var id = random.Next(1, 10001); var key = cacheKeys[id]; - var data = cache.Get(key); - - if (data != null) + if (cache.TryGetValue(key, out var cached)) { - result[i] = data; + result[i] = (CachedWorld)cached; } else { - return LoadUncachedQueries(id, i, count, this, result); + return LoadUncachedQueries(_connectionString, id, i, count, this, result); } } return Task.FromResult(result); - static async Task LoadUncachedQueries(int id, int i, int count, RawDb rawdb, World[] result) + static async Task LoadUncachedQueries(string conn, int id, int i, int count, RawDb rawdb, CachedWorld[] result) { - using (var db = new NpgsqlConnection(_connectionString)) + using (var connection = (NpgsqlConnection)_dbProviderFactory.CreateConnection()) { - await db.OpenAsync(); - Func> create = async (entry) => - { - return await rawdb.ReadSingleRow(db, rawdb.SingleCommand); - }; + connection.ConnectionString = conn; + await connection.OpenAsync(); + var (cmd, idParameter) = rawdb.CreateReadCommand(connection); + using var command = cmd; + async Task create(ICacheEntry _) => await ReadSingleRow(cmd); + var cacheKeys = _cacheKeys; var key = cacheKeys[id]; - rawdb.SingleCommand.Connection = db; - rawdb.mID.TypedValue = id; + idParameter.TypedValue = id; + for (; i < result.Length; i++) { - var data = await _cache.GetOrCreateAsync(key, create); - result[i] = data; + result[i] = await rawdb._cache.GetOrCreateAsync(key, create); + id = rawdb._random.Next(1, 10001); - rawdb.SingleCommand.Connection = db; - rawdb.mID.TypedValue = id; + idParameter.TypedValue = id; key = cacheKeys[id]; } } @@ -164,215 +96,212 @@ static async Task LoadUncachedQueries(int id, int i, int count, RawDb r } } - - private async Task> LoadMultipleRows(int count, DbConnection db) + public async Task PopulateCache() { - SingleCommand.Connection = db; - SingleCommand.Parameters[0].Value = _random.Next(1, 10001); - var result = GetWorldBuffer(); - for (int i = 0; i < count; i++) + using (var connection = (NpgsqlConnection)_dbProviderFactory.CreateConnection()) { - result[i] = await ReadSingleRow(db, SingleCommand); - SingleCommand.Parameters[0].Value = _random.Next(1, 10001); + connection.ConnectionString = _connectionString; + await connection.OpenAsync(); + var (cmd, idParameter) = CreateReadCommand(connection); + using var command = cmd; + + var cacheKeys = _cacheKeys; + var cache = _cache; + for (var i = 1; i < 10001; i++) + { + idParameter.TypedValue = i; + cache.Set(cacheKeys[i], await ReadSingleRow(cmd)); + } } - return new ArraySegment(result, 0, count); + Console.WriteLine("Caching Populated"); } - public async Task> LoadFortunesRows() + public async Task LoadMultipleQueriesRows(int count) { - int count = 0; - var result = GetFortuneBuffer(); - using (var db = new NpgsqlConnection(_connectionString)) + var results = new World[count]; + + using (var connection = (NpgsqlConnection)_dbProviderFactory.CreateConnection()) { - await db.OpenAsync(); - FortuneCommand.Connection = db; - using (var rdr = await FortuneCommand.ExecuteReaderAsync()) + connection.ConnectionString = _connectionString; + await connection.OpenAsync(); + + using var batch = new NpgsqlBatch(connection) + { + // Inserts a PG Sync message between each statement in the batch, required for compliance with + // TechEmpower general test requirement 7 + // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview + EnableErrorBarriers = true + }; + + for (var i = 0; i < count; i++) { - while (await rdr.ReadAsync()) + batch.BatchCommands.Add(new() { - result[count] = (new Fortune - { - Id = rdr.GetInt32(0), - Message = rdr.GetString(1) - }); - count++; - } + CommandText = "SELECT id, randomnumber FROM world WHERE id = $1", + Parameters = { new NpgsqlParameter { TypedValue = _random.Next(1, 10001) } } + }); + } + + using var reader = await batch.ExecuteReaderAsync(); + + for (var i = 0; i < count; i++) + { + await reader.ReadAsync(); + results[i] = new World { Id = reader.GetInt32(0), RandomNumber = reader.GetInt32(1) }; + await reader.NextResultAsync(); } } - result[count] = (new Fortune { Message = "Additional fortune added at request time." }); - count++; - Array.Sort(result, 0, count); - return new ArraySegment(result, 0, count); + return results; } + public async Task LoadMultipleUpdatesRows(int count) { - using (var db = new NpgsqlConnection(_connectionString)) + var results = new World[count]; + + using (var connection = (NpgsqlConnection)_dbProviderFactory.CreateConnection()) { - await db.OpenAsync(); - var updateCmd = UpdateCommandsCached.PopCommand(count); - try + connection.ConnectionString = _connectionString; + await connection.OpenAsync(); + var (queryCmd, queryParameter) = CreateReadCommand(connection); + using (queryCmd) { - var command = updateCmd.Command; - command.Connection = db; - SingleCommand.Connection = db; - mID.TypedValue = _random.Next(1, int.MaxValue) % 10000 + 1; - var results = new World[count]; - for (int i = 0; i < count; i++) + for (var i = 0; i < results.Length; i++) { - results[i] = await ReadSingleRow(db, SingleCommand); - mID.TypedValue = _random.Next(1, int.MaxValue) % 10000 + 1; + results[i] = await ReadSingleRow(queryCmd); + queryParameter.TypedValue = _random.Next(1, 10001); } + } - for (int i = 0; i < count; i++) + using (var updateCmd = new NpgsqlCommand(BatchUpdateString.Query(count), connection)) + { + for (var i = 0; i < results.Length; i++) { - var randomNumber = _random.Next(1, int.MaxValue) % 10000 + 1; - updateCmd.Parameters[i * 2].TypedValue = results[i].Id; - updateCmd.Parameters[i * 2 + 1].TypedValue = randomNumber; - //updateCmd.Parameters[i * 2].Value = results[i].Id; - //updateCmd.Parameters[i * 2 + 1].Value = randomNumber; + var randomNumber = _random.Next(1, 10001); + + updateCmd.Parameters.Add(new NpgsqlParameter { TypedValue = results[i].Id }); + updateCmd.Parameters.Add(new NpgsqlParameter { TypedValue = randomNumber }); + results[i].RandomNumber = randomNumber; } - await command.ExecuteNonQueryAsync(); - return results; - } - catch (Exception e_) - { - throw e_; - } - finally - { - UpdateCommandsCached.PushCommand(count, updateCmd); + await updateCmd.ExecuteNonQueryAsync(); } } - } - } + return results; + } - public sealed class CacheKey : IEquatable - { - private readonly int _value; + public async Task> LoadFortunesRows() + { + // Benchmark requirements explicitly prohibit pre-initializing the list size + var result = new List(); - public CacheKey(int value) - => _value = value; + using (var connection = (NpgsqlConnection)_dbProviderFactory.CreateConnection()) + { + connection.ConnectionString = _connectionString; + await connection.OpenAsync(); - public bool Equals(CacheKey key) - => key._value == _value; + using (var cmd = new NpgsqlCommand("SELECT id, message FROM fortune", connection)) + { - public override bool Equals(object obj) - => ReferenceEquals(obj, this); + using (var rdr = await cmd.ExecuteReaderAsync()) + { - public override int GetHashCode() - => _value; + while (await rdr.ReadAsync()) + { + result.Add(new Fortune + { + Id = rdr.GetInt32(0), + Message = rdr.GetString(1) + }); + } + } + } + } + result.Add(new Fortune { Message = "Additional fortune added at request time." }); + result.Sort(); - public override string ToString() - => _value.ToString(); - } + return result; + } - internal class UpdateCommandsCached - { - private static System.Collections.Concurrent.ConcurrentStack[] mCacheTable - = new System.Collections.Concurrent.ConcurrentStack[1024]; - public static string[] IDParamereNames = new string[1024]; + private (NpgsqlCommand readCmd, NpgsqlParameter idParameter) CreateReadCommand(NpgsqlConnection connection) + { + var cmd = new NpgsqlCommand("SELECT id, randomnumber FROM world WHERE id = $1", connection); + var parameter = new NpgsqlParameter { TypedValue = _random.Next(1, 10001) }; - public static string[] RandomParamereNames = new string[1024]; + cmd.Parameters.Add(parameter); - static UpdateCommandsCached() - { - for (int i = 0; i < 1024; i++) - { - IDParamereNames[i] = $"@Id_{i}"; - RandomParamereNames[i] = $"@Random_{i}"; - mCacheTable[i] = new System.Collections.Concurrent.ConcurrentStack(); - } + return (cmd, parameter); } - private static CommandCacheItem CreatCommand(int count) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static async Task ReadSingleRow(NpgsqlCommand cmd) { - CommandCacheItem item = new CommandCacheItem(); - NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(); - cmd.CommandText = BatchUpdateString.Query(count); - for (int i = 0; i < count; i++) - { - var id = new NpgsqlParameter(); - id.ParameterName = IDParamereNames[i]; - cmd.Parameters.Add(id); - item.Parameters.Add(id); - - var random = new NpgsqlParameter(); - random.ParameterName = RandomParamereNames[i]; - cmd.Parameters.Add(random); - item.Parameters.Add(random); - } - item.Command = cmd; - return item; + using var rdr = await cmd.ExecuteReaderAsync(System.Data.CommandBehavior.SingleRow); + await rdr.ReadAsync(); + return new World + { + Id = rdr.GetInt32(0), + RandomNumber = rdr.GetInt32(1) + }; } - public static void PushCommand(int count, CommandCacheItem cmd) - { - mCacheTable[count].Push(cmd); - } + private static readonly object[] _cacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray(); - public static CommandCacheItem PopCommand(int count) + public sealed class CacheKey : IEquatable { - if (mCacheTable[count].TryPop(out CommandCacheItem cmd)) - return cmd; - return CreatCommand(count); - } + private readonly int _value; - private static bool mInited = false; + public CacheKey(int value) + => _value = value; - public static void Init() - { - if (mInited) - return; - lock (typeof(UpdateCommandsCached)) - { - if (mInited) - return; - for (int i = 1; i <= 500; i++) - { - for (int k = 0; k < 10; k++) - { - var cmd = CreatCommand(i); - mCacheTable[i].Push(cmd); - } - } - mInited = true; - return; - } - } - } + public bool Equals(CacheKey key) + => key._value == _value; - class CommandCacheItem - { - public Npgsql.NpgsqlCommand Command { get; set; } + public override bool Equals(object obj) + => ReferenceEquals(obj, this); - public List> Parameters { get; private set; } = new List>(1024); + public override int GetHashCode() + => _value; + + public override string ToString() + => _value.ToString(); + } } - internal class BatchUpdateString + internal sealed class BatchUpdateString { private const int MaxBatch = 500; + internal static readonly string[] ParamNames = Enumerable.Range(0, MaxBatch * 2).Select(i => $"@p{i}").ToArray(); + private static string[] _queries = new string[MaxBatch + 1]; public static string Query(int batchSize) + => _queries[batchSize] is null + ? CreateBatch(batchSize) + : _queries[batchSize]; + + private static string CreateBatch(int batchSize) { - if (_queries[batchSize] != null) + var sb = StringBuilderCache.Acquire(); + + + sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES "); + var c = 1; + for (var i = 0; i < batchSize; i++) { - return _queries[batchSize]; + if (i > 0) + sb.Append(", "); + sb.Append($"(${c++}, ${c++})"); } + sb.Append(" ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id"); + - var lastIndex = batchSize - 1; - var sb = StringBuilderCache.Acquire(); - sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES "); - Enumerable.Range(0, lastIndex).ToList().ForEach(i => sb.Append($"(@Id_{i}, @Random_{i}), ")); - sb.Append($"(@Id_{lastIndex}, @Random_{lastIndex}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id"); return _queries[batchSize] = StringBuilderCache.GetStringAndRelease(sb); } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs index 76e15ce9f7f..bfd6b79223a 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/GMTDate.cs @@ -49,7 +49,7 @@ public static GMTDate Default } } - public ArraySegment DATE + public Memory DATE { get; set; @@ -95,18 +95,20 @@ private void Init() }, null, 1000, 1000); } - private ArraySegment GetData() + private Memory GetData() { return GetData(DateTime.Now); } + + public void Write(IStreamWriter stream) { - var data = DATE; - stream.Write(data.Array, 0, data.Count); + + stream.Write(DATE.Span); } - private ArraySegment GetData(DateTime date) + private Memory GetData(DateTime date) { date = date.ToUniversalTime(); int offset13 = 0; @@ -190,7 +192,7 @@ private ArraySegment GetData(DateTime date) buffer[offset13] = _n; offset13++; - return new ArraySegment(GTM_BUFFER, 0, offset13); + return new Memory(GTM_BUFFER, 0, offset13); } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs index 2b2264ea60a..2794fcbdd82 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.Caching.cs @@ -33,7 +33,7 @@ public async Task caching(string queryString, IStreamWriter stream) ContentLengthMemory content = new ContentLengthMemory(); try { - var data = await _db.LoadCachedQueries(count); + var data = await DB.LoadCachedQueries(count); stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs index e623afdd72b..117d19fee9a 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.cs @@ -47,7 +47,6 @@ public partial class HttpHandler : SesionBase private static readonly AsciiString _path_Fortunes = "/fortunes"; - private static readonly AsciiString _result_plaintext = "Hello, World!"; private static readonly AsciiString _cached_worlds = "/cached-worlds"; @@ -55,19 +54,6 @@ public partial class HttpHandler : SesionBase - private readonly static AsciiString _jsonPreamble = - _httpsuccess - + _headerContentTypeJson - + _headerServer - + _headerContentLength + _jsonPayloadSize.ToString() + _line; - - private readonly static AsciiString _plaintextPreamble = - _httpsuccess - + _headerContentTypeText - + _headerServer - + _headerContentLength + _result_plaintext.Length.ToString() + _line; - - private readonly static AsciiString _jsonResultPreamble = _httpsuccess + _headerContentTypeJson @@ -122,14 +108,14 @@ public HttpHandler() private Queue _Requests = new Queue(); - private RawDb _db; + public static RawDb DB; private RequestData _ReadRequest = null; public override void Connected(NetContext context) { base.Connected(context); this.Context = context; - _db = new RawDb(new ConcurrentRandom(), Npgsql.NpgsqlFactory.Instance); ; + } private int AnalysisUrl(ReadOnlySpan url) @@ -255,11 +241,11 @@ private void AnalysisAction(ReadOnlySequence line, out ActionType type, ou Span baseUrl = stackalloc byte[baseurlLen]; url.Slice(0, baseurlLen).CopyTo(baseUrl); - if (baseUrl.Length == _path_Plaintext.Length && baseUrl.StartsWith(_path_Plaintext)) + if (baseUrl.Length == _path_Plaintext.Length && baseUrl[1] == 'p') { type = ActionType.Plaintext; } - else if (baseUrl.Length == _path_Json.Length && baseUrl.StartsWith(_path_Json)) + else if (baseUrl.Length == _path_Json.Length && baseUrl[1] == 'j') { type = ActionType.Json; } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs index 27c71d43f13..1604195625e 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.db.cs @@ -17,8 +17,8 @@ public async Task db(IStreamWriter stream) try { - var data = await _db.LoadSingleQueryRow(); - stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); + var data = await DB.LoadSingleQueryRow(); + stream.Write(_jsonResultPreamble.AsSpan()); content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); stream.WriteSequenceNetStream.StartWriteLength(); diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs index 829c18bd68a..7bb2fc40acb 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.fortunes.cs @@ -21,11 +21,11 @@ static HtmlEncoder CreateHtmlEncoder() return HtmlEncoder.Create(settings); } - private readonly static AsciiString _fortunesTableStart = "Fortunes"; - private readonly static AsciiString _fortunesRowStart = ""; - private readonly static AsciiString _fortunesTableEnd = "
idmessage
"; - private readonly static AsciiString _fortunesColumn = ""; - private readonly static AsciiString _fortunesRowEnd = "
"; + private static ReadOnlySpan _fortunesTableStart => "Fortunes"u8; + private static ReadOnlySpan _fortunesRowStart => ""u8; + private static ReadOnlySpan _fortunesTableEnd => "
idmessage
"u8; + private static ReadOnlySpan _fortunesColumn => ""u8; + private static ReadOnlySpan _fortunesRowEnd => "
"u8; public async Task fortunes(IStreamWriter stream) @@ -34,23 +34,23 @@ public async Task fortunes(IStreamWriter stream) try { - var data = await this._db.LoadFortunesRows(); + var data = await DB.LoadFortunesRows(); - stream.Write(_HtmlResultPreamble.Data, 0, _HtmlResultPreamble.Length); + stream.Write(_HtmlResultPreamble); content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); stream.WriteSequenceNetStream.StartWriteLength(); - stream.Write(_fortunesTableStart.Data, 0, _fortunesTableStart.Length); + stream.Write(_fortunesTableStart); foreach (var item in data) { - stream.Write(_fortunesRowStart.Data, 0, _fortunesRowStart.Length); + stream.Write(_fortunesRowStart); stream.WriteString(item.Id.ToString(CultureInfo.InvariantCulture)); - stream.Write(_fortunesColumn.Data, 0, _fortunesColumn.Length); + stream.Write(_fortunesColumn); stream.WriteString(htmlEncoder.Encode(item.Message)); - stream.Write(_fortunesRowEnd.Data, 0, _fortunesRowEnd.Length); + stream.Write(_fortunesRowEnd); } - stream.Write(_fortunesTableEnd.Data, 0, _fortunesTableEnd.Length); + stream.Write(_fortunesTableEnd); } catch (Exception e_) { diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs index 1bfa2d8863f..4a379e98931 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.json.cs @@ -14,10 +14,14 @@ namespace PlatformBenchmarks public partial class HttpHandler { - + private static ReadOnlySpan _jsonPreamble => + "HTTP/1.1 200 OK\r\n"u8 + + "Server: B\r\n"u8 + + "Content-Type: application/json\r\n"u8 + + "Content-Length: 27\r\n"u8; public void Json(IStreamWriter stream) { - stream.Write(_jsonPreamble.Data, 0, _jsonPreamble.Length); + stream.Write(_jsonPreamble); GMTDate.Default.Write(stream); var jsonWriter = GetJsonWriter(stream); using (var unflush = stream.UnFlush()) @@ -27,7 +31,7 @@ public void Json(IStreamWriter stream) jsonWriter.WriteEndObject(); jsonWriter.Flush(); } - + } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs index a011d52f7f4..fe50d21011d 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.plaintext.cs @@ -2,6 +2,7 @@ using BeetleX.Light.Memory; using System; using System.Collections.Generic; +using System.Data; using System.Text; using System.Threading.Tasks; @@ -9,13 +10,27 @@ namespace PlatformBenchmarks { public partial class HttpHandler { - + private static ReadOnlySpan _plaintextPreamble => + "HTTP/1.1 200 OK\r\n"u8 + + "Server: B\r\n"u8 + + "Content-Type: text/plain\r\n"u8 + + "Content-Length: 13\r\n"u8; + + private static ReadOnlySpan _plainTextBody => "Hello, World!"u8; public void Plaintext(IStreamWriter stream) { - stream.Write(_plaintextPreamble.Data, 0, _plaintextPreamble.Length); - GMTDate.Default.Write(stream); - stream.Write(_result_plaintext.Data, 0, _result_plaintext.Length); + Span data = stream.WriteSequenceNetStream.GetWriteSpan(256); + var timedata = GMTDate.Default.DATE; + _plaintextPreamble.CopyTo(data); + data = data.Slice(_plaintextPreamble.Length); + timedata.Span.CopyTo(data); + data = data.Slice(timedata.Length); + _plainTextBody.CopyTo(data); + //stream.Write(_plaintextPreamble.AsSpan()); + //GMTDate.Default.Write(stream); + //stream.Write(_result_plaintext.Data.AsSpan()); + stream.WriteSequenceNetStream.WriteAdvance(_plaintextPreamble.Length + timedata.Length + _plainTextBody.Length); } } } diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs index 53eef8a31fb..4e7039176dd 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.queries.cs @@ -31,7 +31,7 @@ public async ValueTask queries(string queryString, IStreamWriter stream) ContentLengthMemory content = new ContentLengthMemory(); try { - var data = await _db.LoadMultipleQueriesRows(count); + var data = await DB.LoadMultipleQueriesRows(count); stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); content.Data = GetContentLengthMemory(stream); GMTDate.Default.Write(stream); diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs index 255a430c070..99d938f32a5 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpHandler.updates.cs @@ -32,7 +32,7 @@ public async ValueTask updates(string queryString, IStreamWriter stream) ContentLengthMemory content = new ContentLengthMemory(); try { - var data = await _db.LoadMultipleUpdatesRows(count); + var data = await DB.LoadMultipleUpdatesRows(count); stream.Write(_jsonResultPreamble.Data, 0, _jsonResultPreamble.Length); content.Data = GetContentLengthMemory(stream); diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs index b8ee7c5f495..b6cb8e3a1a0 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/HttpServer.cs @@ -13,13 +13,19 @@ public class HttpServer : IHostedService { private static NetServer _apiServer; - public virtual Task StartAsync(CancellationToken cancellationToken) + public static string _connectionString; + + public virtual async Task StartAsync(CancellationToken cancellationToken) { + _connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=16;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; + //_connectionString = "Server=localhost;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=16;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; ThreadPool.SetMinThreads(Environment.ProcessorCount * 2, Environment.ProcessorCount * 2); - Constants.MemorySegmentMinSize = 1024 * 8; - Constants.MemorySegmentMaxSize = 1024 * 8; + Constants.MemorySegmentMinSize = 1024 * 16; + Constants.MemorySegmentMaxSize = 1024 * 16; Constants.InitMemoryBlock(); - ArraySegment date = GMTDate.Default.DATE; + var date = GMTDate.Default.DATE; + HttpHandler.DB = new RawDb(new ConcurrentRandom(), HttpServer._connectionString); + await HttpHandler.DB.PopulateCache(); _apiServer = new NetServer(); _apiServer.Options.LogLevel = BeetleX.Light.Logs.LogLevel.Error; _apiServer.Options.AddLogOutputHandler(); @@ -30,20 +36,6 @@ public virtual Task StartAsync(CancellationToken cancellationToken) _apiServer.Start(); - if (!Program.UpDB) - { - RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; - //RawDb._connectionString = "Server=127.0.0.1;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; - } - else - { - - RawDb._connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; - //RawDb._connectionString = "Server=127.0.0.1;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=64;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; - } - // ApiServer.Log(LogType.Info, null, $"Debug mode [{Program.Debug}]"); - return Task.CompletedTask; - } public virtual Task StopAsync(CancellationToken cancellationToken) diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj index 10202a882be..ba5b9d4202d 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj @@ -8,7 +8,7 @@ - + diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs b/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs index 3819a6c7e1d..ab262ef92a3 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/Program.cs @@ -17,7 +17,6 @@ public static void Main(string[] args) //Debug = (args != null && args.Length > 0 && args[0] == "debug"); var data = GMTDate.Default.DATE; UpDB = (args != null && args.Length > 0 && args[0] == "updb"); - UpdateCommandsCached.Init(); //HttpServer server = new HttpServer(); //server.StartAsync(default); //Console.ReadLine(); From e33a7759a48caeab2eb51ca8338fe42dcadb4ac6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:50:34 +0000 Subject: [PATCH 0688/1766] Bump io.undertow:undertow-core in /frameworks/Java/undertow Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.12.Final to 2.3.14.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.12.Final...2.3.14.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 1a0f95afd69..da2a6dd086b 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -20,7 +20,7 @@ 3.2.2 0.9.10 42.7.2 - 2.3.12.Final + 2.3.14.Final From eedd5e5c8acb8a1f8110ddc49576a53a513ce63d Mon Sep 17 00:00:00 2001 From: James Burns Date: Mon, 8 Jul 2024 11:23:27 -0400 Subject: [PATCH 0689/1766] [Go/echo] Update to pgx (#9134) --- frameworks/Go/echo/echo.dockerfile | 2 +- frameworks/Go/echo/src/go.mod | 8 +++-- frameworks/Go/echo/src/go.sum | 17 +++++++--- frameworks/Go/echo/src/main.go | 51 ++++++++++++++---------------- 4 files changed, 43 insertions(+), 35 deletions(-) diff --git a/frameworks/Go/echo/echo.dockerfile b/frameworks/Go/echo/echo.dockerfile index ccc8c0186d2..ab6a616d4d9 100644 --- a/frameworks/Go/echo/echo.dockerfile +++ b/frameworks/Go/echo/echo.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.22 ADD ./src /echo WORKDIR /echo diff --git a/frameworks/Go/echo/src/go.mod b/frameworks/Go/echo/src/go.mod index 63fe7fd1cef..04c940547d5 100644 --- a/frameworks/Go/echo/src/go.mod +++ b/frameworks/Go/echo/src/go.mod @@ -1,13 +1,16 @@ module echo/app -go 1.19 +go 1.22 require ( + github.com/jackc/pgx/v5 v5.6.0 github.com/labstack/echo/v4 v4.9.0 - github.com/lib/pq v1.10.7 ) require ( + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/labstack/gommon v0.3.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.16 // indirect @@ -15,6 +18,7 @@ require ( github.com/valyala/fasttemplate v1.2.1 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/net v0.23.0 // indirect + golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.18.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 8732c64400d..e607732cf1b 100644 --- a/frameworks/Go/echo/src/go.sum +++ b/frameworks/Go/echo/src/go.sum @@ -1,12 +1,18 @@ 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/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-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.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +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/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY= github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -16,8 +22,9 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 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/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= @@ -26,6 +33,8 @@ golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/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-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= @@ -36,5 +45,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= 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= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/frameworks/Go/echo/src/main.go b/frameworks/Go/echo/src/main.go index ed999f215c0..4642ee2f5b1 100644 --- a/frameworks/Go/echo/src/main.go +++ b/frameworks/Go/echo/src/main.go @@ -1,9 +1,11 @@ package main import ( - "database/sql" + "context" "encoding/json" "fmt" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgxpool" "html/template" "io" "log" @@ -13,7 +15,6 @@ import ( "strconv" "github.com/labstack/echo/v4" - _ "github.com/lib/pq" ) type ( @@ -79,10 +80,7 @@ const ( var ( // Database - db *sql.DB - worldSelectStmt *sql.Stmt - worldUpdateStmt *sql.Stmt - fortuneSelectStmt *sql.Stmt + db *pgxpool.Pool // Template Template = &StdTemplate{ @@ -120,8 +118,9 @@ func (h *handler) json() echo.HandlerFunc { // Test 2: Single database query func (h *handler) db() echo.HandlerFunc { return func(c echo.Context) error { + ctx := c.Request().Context() world := new(World) - if err := fetchRandomWorld(world); err != nil { + if err := fetchRandomWorld(ctx, world); err != nil { return err } @@ -134,10 +133,11 @@ func (h *handler) db() echo.HandlerFunc { // Test 3: Multiple database queries func (h *handler) queries() echo.HandlerFunc { return func(c echo.Context) error { + ctx := c.Request().Context() n := getQueryCount(c.QueryParam("n")) worlds := make([]World, n) for i := 0; i < n; i++ { - if err := fetchRandomWorld(&worlds[i]); err != nil { + if err := fetchRandomWorld(ctx, &worlds[i]); err != nil { return err } } @@ -151,7 +151,8 @@ func (h *handler) queries() echo.HandlerFunc { // Test 4: Fortunes func (h *handler) fortunes() echo.HandlerFunc { return func(c echo.Context) error { - rows, err := fortuneSelectStmt.Query() + ctx := c.Request().Context() + rows, err := db.Query(ctx, fortuneSelect) if err != nil { return fmt.Errorf("Error preparing statement: %v", err) } @@ -172,18 +173,19 @@ func (h *handler) fortunes() echo.HandlerFunc { // Test 5: Database updates func (h *handler) updates() echo.HandlerFunc { return func(c echo.Context) error { + ctx := c.Request().Context() n := getQueryCount(c.QueryParam("n")) worlds := make([]World, n) for i := 0; i < n; i++ { // Fetch and modify w := &worlds[i] - if err := fetchRandomWorld(&worlds[i]); err != nil { + if err := fetchRandomWorld(ctx, &worlds[i]); err != nil { return err } w.RandomNumber = uint16(randomWorldNum()) // Update - if _, err := worldUpdateStmt.Exec(w.RandomNumber, w.ID); err != nil { + if _, err := db.Exec(ctx, worldUpdate, w.RandomNumber, w.ID); err != nil { return fmt.Errorf("Error updating world row: %v", err) } } @@ -221,9 +223,9 @@ func (h *handler) plaintext() echo.HandlerFunc { } } -func fetchRandomWorld(w *World) error { +func fetchRandomWorld(ctx context.Context, w *World) error { n := randomWorldNum() - return worldSelectStmt.QueryRow(n).Scan(&w.ID, &w.RandomNumber) + return db.QueryRow(ctx, worldSelect, n).Scan(&w.ID, &w.RandomNumber) } func randomWorldNum() int { @@ -241,7 +243,7 @@ func getQueryCount(q string) int { return n } -func fetchFortunes(rows *sql.Rows) (Fortunes, error) { +func fetchFortunes(rows pgx.Rows) (Fortunes, error) { fortunes := make(Fortunes, 0) for rows.Next() { // Fetch rows f := new(Fortune) @@ -267,24 +269,17 @@ func InitPostgres() { host := "tfb-database" var err error - db, err = sql.Open("postgres", fmt.Sprintf(connectionString, host)) - if err != nil { - log.Fatalf("Error opening database: %v", err) - } - db.SetMaxIdleConns(maxConnections) - db.SetMaxOpenConns(maxConnections) - worldSelectStmt, err = db.Prepare(worldSelect) + dbCfg, err := pgxpool.ParseConfig(fmt.Sprintf(connectionString, host)) if err != nil { - log.Fatal(err) + log.Fatalf("Error reading database connection string: %v", err) } - worldUpdateStmt, err = db.Prepare(worldUpdate) - if err != nil { - log.Fatal(err) - } - fortuneSelectStmt, err = db.Prepare(fortuneSelect) + dbCfg.MaxConns = maxConnections + dbCfg.MinConns = maxConnections + + db, err = pgxpool.NewWithConfig(context.Background(), dbCfg) if err != nil { - log.Fatal(err) + log.Fatalf("Error opening database: %v", err) } } From b0c5935e9b518af59d1e02f3110555f9d3770a40 Mon Sep 17 00:00:00 2001 From: Xudong Huang Date: Mon, 8 Jul 2024 23:23:39 +0800 Subject: [PATCH 0690/1766] [Rust|may-minihttp] update may_postgres (#9150) --- frameworks/Rust/may-minihttp/Cargo.toml | 2 +- frameworks/Rust/may-minihttp/may-minihttp.dockerfile | 2 +- frameworks/Rust/may-minihttp/src/main.rs | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frameworks/Rust/may-minihttp/Cargo.toml b/frameworks/Rust/may-minihttp/Cargo.toml index 019aaf898a2..9fc7760ff8e 100644 --- a/frameworks/Rust/may-minihttp/Cargo.toml +++ b/frameworks/Rust/may-minihttp/Cargo.toml @@ -19,7 +19,7 @@ buf-min = { version = "0.7", features = ["bytes"] } may = { version = "0.3", default-features = false } may_minihttp = { version = "0.1", default-features = false } -may_postgres = { git = "https://github.com/Xudong-Huang/may_postgres.git", rev = "5ea3fb9", default-features = false } +may_postgres = { git = "https://github.com/Xudong-Huang/may_postgres.git", rev = "917ed78", default-features = false } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/may-minihttp/may-minihttp.dockerfile b/frameworks/Rust/may-minihttp/may-minihttp.dockerfile index 0ddda28e3eb..160e563ac2c 100644 --- a/frameworks/Rust/may-minihttp/may-minihttp.dockerfile +++ b/frameworks/Rust/may-minihttp/may-minihttp.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78 +FROM rust:1.79 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/may-minihttp/src/main.rs b/frameworks/Rust/may-minihttp/src/main.rs index f6a817031c3..33b410b1c0f 100644 --- a/frameworks/Rust/may-minihttp/src/main.rs +++ b/frameworks/Rust/may-minihttp/src/main.rs @@ -49,7 +49,7 @@ struct PgConnectionPool { impl PgConnectionPool { fn new(db_url: &'static str, size: usize) -> PgConnectionPool { let clients = (0..size) - .map(|_| std::thread::spawn(move || PgConnection::new(db_url))) + .map(|_| may::go!(move || PgConnection::new(db_url))) .collect::>(); let mut clients: Vec<_> = clients.into_iter().map(|t| t.join().unwrap()).collect(); clients.sort_by(|a, b| (a.client.id() % size).cmp(&(b.client.id() % size))); @@ -59,6 +59,7 @@ impl PgConnectionPool { fn get_connection(&self, id: usize) -> PgConnection { let len = self.clients.len(); let connection = &self.clients[id % len]; + // assert_eq!(connection.client.id() % len, id % len); PgConnection { client: connection.client.clone(), statement: connection.statement.clone(), @@ -282,7 +283,7 @@ impl HttpServiceFactory for HttpServer { fn main() { may::config().set_pool_capacity(1000).set_stack_size(0x1000); - println!("Starting http server: 127.0.0.1:8080"); + println!("Starting http server: 0.0.0.1:8080"); let server = HttpServer { db_pool: PgConnectionPool::new( "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world", From 0940648a225b7f988034e980731b23fbf6d652da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 08:25:09 -0700 Subject: [PATCH 0691/1766] Bump mysql2 from 3.9.7 to 3.9.8 in /frameworks/JavaScript/spliffy (#9138) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.7 to 3.9.8. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.7...v3.9.8) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/spliffy/package-lock.json | 6 +++--- frameworks/JavaScript/spliffy/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/JavaScript/spliffy/package-lock.json b/frameworks/JavaScript/spliffy/package-lock.json index db22f966f30..40b146ce31c 100644 --- a/frameworks/JavaScript/spliffy/package-lock.json +++ b/frameworks/JavaScript/spliffy/package-lock.json @@ -1189,9 +1189,9 @@ } }, "mysql2": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz", - "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==", + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.8.tgz", + "integrity": "sha512-+5JKNjPuks1FNMoy9TYpl77f+5frbTklz7eb3XDwbpsERRLEeXiW2PDEkakYF50UuKU2qwfGnyXpKYvukv8mGA==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", diff --git a/frameworks/JavaScript/spliffy/package.json b/frameworks/JavaScript/spliffy/package.json index bdb6b49aa45..62b2240acf3 100644 --- a/frameworks/JavaScript/spliffy/package.json +++ b/frameworks/JavaScript/spliffy/package.json @@ -6,7 +6,7 @@ "@srfnstack/spliffy": "0.6.1", "html-escaper": "3.0.3", "mongodb": "^4.17.0", - "mysql2": "^3.9.7", + "mysql2": "^3.9.8", "node-cache": "5.1.2", "pg": "8.6.0", "pg-native": "3.0.1" From 172e539de92f0d7d27a16c32466ae064d6710ad8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 08:25:32 -0700 Subject: [PATCH 0692/1766] Bump github.com/gofiber/fiber/v2 in /frameworks/Go/fiber/src (#9139) Bumps [github.com/gofiber/fiber/v2](https://github.com/gofiber/fiber) from 2.52.1 to 2.52.5. - [Release notes](https://github.com/gofiber/fiber/releases) - [Commits](https://github.com/gofiber/fiber/compare/v2.52.1...v2.52.5) --- updated-dependencies: - dependency-name: github.com/gofiber/fiber/v2 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 | 2 +- frameworks/Go/fiber/src/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index 2372b8f57f7..bb9b8bc5701 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -4,7 +4,7 @@ go 1.19 require ( github.com/goccy/go-json v0.10.0 - github.com/gofiber/fiber/v2 v2.52.1 + github.com/gofiber/fiber/v2 v2.52.5 github.com/jackc/pgx/v5 v5.5.4 github.com/valyala/quicktemplate v1.7.0 ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 5ae0d5e53e3..1414375d002 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -6,8 +6,8 @@ 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.52.1 h1:1RoU2NS+b98o1L77sdl5mboGPiW+0Ypsi5oLmcYlgHI= -github.com/gofiber/fiber/v2 v2.52.1/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= From 6cb7e7b24f54d4b71c7fc0647be1aa00fd0512d6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 8 Jul 2024 17:25:49 +0200 Subject: [PATCH 0693/1766] [rails] Use Ruby 3.4-rc (#9087) --- frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index 370b08ba493..a93f26b52da 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc 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 3e02770b190..9d75f7d359e 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server From bba72a8b146ad9d772159872f9676818eda12cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kon=C3=B4pka?= Date: Mon, 8 Jul 2024 17:26:18 +0200 Subject: [PATCH 0694/1766] Update spring tests to current release of spring-boot (#8876) * Update spring-boot to 3.2.4 * Disable open-in-view globally for all tests open-in-view is unfortunately enabled by default for historical reasons, see https://github.com/spring-projects/spring-boot/issues/7107 This significantly improves performance for requests where db connection is not needed at all, i.e. json & plaintext db ~3% improvement json ~17% improvement query ~no change update ~no change fortune ~5% improvement plaintext ~29% improvement * Make spring-webflux tests work again Replaces old milestone version of spring boot with current release 3.2.5 Also replaces ParalllelGC with default one, i.e. G1GC * Update spring-boot to v3.3.0 * Update to java 21 * Enable virtual threads * Fix excessive number of queries in JPA tests ... query and follow up update statement must be enclosed in a transaction --- .../Java/spring-webflux/benchmark_config.json | 15 ++-- frameworks/Java/spring-webflux/pom.xml | 88 +++---------------- .../spring-webflux-jdbc.dockerfile | 6 +- .../spring-webflux-mongo.dockerfile | 6 +- .../spring-webflux-pgclient.dockerfile | 6 +- .../spring-webflux-rxjdbc.dockerfile | 6 +- .../spring-webflux/spring-webflux.dockerfile | 6 +- .../src/main/java/benchmark/App.java | 15 ++-- .../java/benchmark/config/JdbcConfig.java | 2 +- .../java/benchmark/config/PgClientConfig.java | 4 +- .../java/benchmark/config/R2dbcConfig.java | 6 +- .../benchmark/config/ReactiveMongoConfig.java | 3 +- .../java/benchmark/config/RxJdbcConfig.java | 8 +- .../repository/R2dbcDbRepository.java | 14 ++- .../java/benchmark/web/WebfluxRouter.java | 2 +- .../src/main/resources/application.yml | 48 ++++++++-- frameworks/Java/spring/pom.xml | 3 +- frameworks/Java/spring/spring-jpa.dockerfile | 23 +---- .../Java/spring/spring-mongo.dockerfile | 23 +---- frameworks/Java/spring/spring.dockerfile | 25 +----- .../Java/spring/src/main/java/hello/App.java | 2 +- .../main/java/hello/UpdateWorldService.java | 9 ++ .../java/hello/UpdateWorldServiceImpl.java | 42 +++++++++ .../hello/controller/HelloController.java | 31 +++---- .../spring/src/main/resources/application.yml | 6 +- 25 files changed, 171 insertions(+), 228 deletions(-) create mode 100644 frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java create mode 100644 frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java diff --git a/frameworks/Java/spring-webflux/benchmark_config.json b/frameworks/Java/spring-webflux/benchmark_config.json index e5c13f8e292..396e9e22a1c 100644 --- a/frameworks/Java/spring-webflux/benchmark_config.json +++ b/frameworks/Java/spring-webflux/benchmark_config.json @@ -20,8 +20,7 @@ "database_os": "Linux", "display_name": "spring-webflux-r2dbc", "notes": "", - "versus": "spring", - "tags": ["broken"] + "versus": "spring" }, "mongo": { "db_url": "/db", @@ -41,8 +40,7 @@ "database_os": "Linux", "display_name": "spring-webflux-mongo", "notes": "", - "versus": "spring", - "tags": ["broken"] + "versus": "spring" }, "pgclient": { "db_url": "/db", @@ -63,8 +61,7 @@ "database_os": "Linux", "display_name": "spring-webflux-pgclient", "notes": "", - "versus": "spring", - "tags": ["broken"] + "versus": "spring" }, "rxjdbc": { "db_url": "/db", @@ -85,8 +82,7 @@ "database_os": "Linux", "display_name": "spring-webflux-rxjdbc", "notes": "", - "versus": "spring", - "tags": ["broken"] + "versus": "spring" }, "jdbc": { "db_url": "/db", @@ -107,8 +103,7 @@ "database_os": "Linux", "display_name": "spring-webflux-jdbc", "notes": "", - "versus": "spring", - "tags": ["broken"] + "versus": "spring" } }] } diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index 01d32c261c0..bec59f53b95 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -13,19 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.2.0.M2 + 3.3.0 - 11 - 11 + 17 UTF-8 - 1.0.0.M2 - 42.7.2 0.11.4 - 0.2.4 - 1.0.0.M7 - 1.0.0.BUILD-SNAPSHOT + 0.2.14 @@ -48,7 +43,6 @@ org.postgresql postgresql - ${postgresql.version} io.reactiverse @@ -61,86 +55,25 @@ ${rxjava2-jdbc.version} - - io.r2dbc - r2dbc-postgresql - ${r2dbc-postgresql.version} - + + org.postgresql + r2dbc-postgresql + io.r2dbc r2dbc-pool - ${r2dbc-pool.version} org.springframework.data spring-data-r2dbc - ${spring-data-r2dbc.version} - - - - org.springframework - spring-tx - - - org.springframework - spring-context - - - org.springframework - spring-core - - - org.springframework - spring-beans - - - - - org.springframework - spring-tx - 5.2.0.M2 - org.springframework - spring-context - 5.2.22.BUILD-SNAPSHOT + org.springframework.boot + spring-boot-configuration-processor + true - - org.springframework - spring-core - 5.2.24.RELEASE - - - org.springframework - spring-beans - 5.2.22.BUILD-SNAPSHOT - - - - - spring-libs-snapshot - Spring Snapshots - https://repo.spring.io/libs-snapshot - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - - - spring-libs-snapshot - Spring Snapshots - https://repo.spring.io/libs-snapshot - - - ${project.artifactId} @@ -151,7 +84,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 false diff --git a/frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile index 89f1ba40f89..7c1daea95f3 100644 --- a/frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.8.5-openjdk-17-slim as maven +FROM maven:3.9.6-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:17.0-jdk-slim +FROM eclipse-temurin:21.0.3_9-jre-jammy WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=jdbc,postgres"] +CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=jdbc,postgres"] diff --git a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile index 95d24ac6003..d26a7bda983 100644 --- a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.8.5-openjdk-17-slim as maven +FROM maven:3.9.6-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:17.0-jdk-slim +FROM eclipse-temurin:21.0.3_9-jre-jammy WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=mongo"] +CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=mongo"] diff --git a/frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile index 0c03140d05a..2bf38ec11e0 100644 --- a/frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.8.5-openjdk-17-slim as maven +FROM maven:3.9.6-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:17.0-jdk-slim +FROM eclipse-temurin:21.0.3_9-jre-jammy WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=pgclient,postgres"] +CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=pgclient,postgres"] diff --git a/frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile index 05aacc1a8f1..0e1edfb74a9 100644 --- a/frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.8.5-openjdk-17-slim as maven +FROM maven:3.9.6-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:17.0-jdk-slim +FROM eclipse-temurin:21.0.3_9-jre-jammy WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=rxjdbc,postgres"] +CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=rxjdbc,postgres"] diff --git a/frameworks/Java/spring-webflux/spring-webflux.dockerfile b/frameworks/Java/spring-webflux/spring-webflux.dockerfile index 3d41fc1ecbe..504fb71cfae 100644 --- a/frameworks/Java/spring-webflux/spring-webflux.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.8.5-openjdk-17-slim as maven +FROM maven:3.9.6-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:17.0-jdk-slim +FROM eclipse-temurin:21.0.3_9-jre-jammy WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=r2dbc,postgres"] +CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=r2dbc,postgres"] diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java index e33025461c6..9fa3f318361 100755 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java @@ -1,10 +1,10 @@ package benchmark; +import java.util.concurrent.Executors; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.reactive.result.view.MustacheViewResolver; import org.springframework.context.annotation.Bean; @@ -12,12 +12,11 @@ import org.springframework.web.reactive.config.EnableWebFlux; import org.springframework.web.reactive.config.ViewResolverRegistry; import org.springframework.web.reactive.config.WebFluxConfigurer; + import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; -import java.util.concurrent.Executors; - -@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class }) +@SpringBootApplication @EnableWebFlux @EnableScheduling @EnableConfigurationProperties @@ -31,17 +30,17 @@ public static void main(String[] args) { } @Bean - public ServerFilter serverFilter() { + ServerFilter serverFilter() { return new ServerFilter(); } @Bean - public DateHandler dateHandler() { + DateHandler dateHandler() { return new DateHandler(); } @Bean - public Scheduler ioScheduler() { + Scheduler ioScheduler() { return Schedulers.fromExecutor(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2)); } diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java index cd97d6e9708..d99729490a4 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java @@ -13,7 +13,7 @@ public class JdbcConfig { @Bean - public DataSource datasource(DataSourceProperties dataSourceProperties) { + DataSource datasource(DataSourceProperties dataSourceProperties) { HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build(); dataSource.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() * 2); diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java index ebcbc732d67..9ebf6db60c9 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java @@ -24,12 +24,12 @@ public class PgClientConfig { private String password; @Bean - public Vertx vertx() { + Vertx vertx() { return Vertx.vertx(); } @Bean - public PgClients pgClients(Vertx vertx) { + PgClients pgClients(Vertx vertx) { List clients = new ArrayList<>(); for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++) { diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java index 60e006cc80f..5a0de452252 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java @@ -9,7 +9,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.data.r2dbc.core.DatabaseClient; +import org.springframework.r2dbc.core.DatabaseClient; import static io.r2dbc.spi.ConnectionFactoryOptions.*; @@ -44,7 +44,7 @@ public void setPassword(String password) { } @Bean - public ConnectionFactory connectionFactory() { + ConnectionFactory connectionFactory() { return ConnectionFactories.get(ConnectionFactoryOptions.builder() .option(DRIVER,"pool") .option(PROTOCOL,"postgresql") @@ -57,7 +57,7 @@ public ConnectionFactory connectionFactory() { } @Bean - public DatabaseClient databaseClient(ConnectionFactory connectionFactory) { + DatabaseClient databaseClient(ConnectionFactory connectionFactory) { return DatabaseClient.create(connectionFactory); } } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java index ee80f0fd87b..e12178be400 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java @@ -19,6 +19,7 @@ public class ReactiveMongoConfig extends AbstractReactiveMongoConfiguration { private String url; private String name; + @Override @Bean public MongoClient reactiveMongoClient() { LoggerFactory.getLogger(getClass()).info("Connecting to mongo url: {}/{}", url, name); @@ -31,7 +32,7 @@ protected String getDatabaseName() { } @Bean - public ReactiveMongoTemplate reactiveMongoTemplate() { + ReactiveMongoTemplate reactiveMongoTemplate() { return new ReactiveMongoTemplate(reactiveMongoClient(), getDatabaseName()); } diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java index 23b7d200cca..f4f5916252d 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java @@ -9,21 +9,17 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import java.sql.SQLException; - @Configuration @Profile("rxjdbc") public class RxJdbcConfig { @Bean - public Database database(DataSourceProperties dsProps) throws SQLException { + Database database(DataSourceProperties dsProps) { NonBlockingConnectionPool pool = Pools.nonBlocking() .maxPoolSize(Runtime.getRuntime().availableProcessors() * 2) .connectionProvider(ConnectionProvider.from(dsProps.getUrl(), dsProps.getUsername(), dsProps.getPassword())) .build(); - Database db = Database.from(pool); - - return db; + return Database.from(pool); } } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java index a6979ffb058..e5915fc05d7 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java @@ -3,7 +3,7 @@ import benchmark.model.Fortune; import benchmark.model.World; import org.springframework.context.annotation.Profile; -import org.springframework.data.r2dbc.core.DatabaseClient; +import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -19,17 +19,16 @@ public R2dbcDbRepository(DatabaseClient databaseClient) { @Override public Mono getWorld(int id) { - return databaseClient.execute() + return databaseClient .sql("SELECT id, randomnumber FROM world WHERE id = $1") .bind("$1", id) - .as(World.class) - .fetch() + .map((row, rowMetaData) -> new World(row.get("id", Integer.class), row.get("randomnumber", Integer.class))) .first(); } public Mono updateWorld(World world) { - return databaseClient.execute() + return databaseClient .sql("UPDATE world SET randomnumber=$2 WHERE id = $1") .bind("$1", world.id) .bind("$2", world.randomnumber) @@ -47,10 +46,9 @@ public Mono findAndUpdateWorld(int id, int randomNumber) { @Override public Flux fortunes() { - return databaseClient.execute() + return databaseClient .sql("SELECT id, message FROM fortune") - .as(Fortune.class) - .fetch() + .map((row, rowMetaData) -> new Fortune(row.get("id", Integer.class), row.get("message", String.class))) .all(); } } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java index b4dfb9be319..7d1ad9c881a 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java @@ -12,7 +12,7 @@ public class WebfluxRouter { @Bean - public RouterFunction route(WebfluxHandler handler) { + RouterFunction route(WebfluxHandler handler) { return RouterFunctions .route( GET("/plaintext"), diff --git a/frameworks/Java/spring-webflux/src/main/resources/application.yml b/frameworks/Java/spring-webflux/src/main/resources/application.yml index d45387cecde..d315f4353ee 100755 --- a/frameworks/Java/spring-webflux/src/main/resources/application.yml +++ b/frameworks/Java/spring-webflux/src/main/resources/application.yml @@ -1,6 +1,12 @@ +spring: + jpa: + open-in-view: false + --- spring: - profiles: postgres + config: + activate: + on-profile: postgres datasource: url: jdbc:postgresql://${database.host}:${database.port}/${database.name} username: ${database.username} @@ -15,23 +21,53 @@ database: --- spring: - profiles: jdbc + config: + activate: + on-profile: jdbc + autoconfigure: + exclude: + - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration + - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration --- spring: - profiles: pgclient + config: + activate: + on-profile: pgclient + autoconfigure: + exclude: + - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration + - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration --- spring: - profiles: rxjdbc + config: + activate: + on-profile: rxjdbc + autoconfigure: + exclude: + - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration + - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration --- spring: - profiles: r2dbc + config: + activate: + on-profile: r2dbc + autoconfigure: + exclude: + - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration + - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration --- spring: - profiles: mongo + config: + activate: + on-profile: mongo + autoconfigure: + exclude: + - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration + - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration database: url: mongodb://tfb-database:27017/?waitQueueMultiple=200 diff --git a/frameworks/Java/spring/pom.xml b/frameworks/Java/spring/pom.xml index b646277a3b0..4e390ebc4f6 100644 --- a/frameworks/Java/spring/pom.xml +++ b/frameworks/Java/spring/pom.xml @@ -11,12 +11,11 @@ org.springframework.boot spring-boot-starter-parent - 3.0.0 + 3.3.0 17 - 42.5.1 diff --git a/frameworks/Java/spring/spring-jpa.dockerfile b/frameworks/Java/spring/spring-jpa.dockerfile index 4c197667a24..4af1b98a73f 100644 --- a/frameworks/Java/spring/spring-jpa.dockerfile +++ b/frameworks/Java/spring/spring-jpa.dockerfile @@ -1,30 +1,11 @@ -FROM eclipse-temurin:17 as jre-build - -# Create a custom Java runtime -RUN $JAVA_HOME/bin/jlink \ - --add-modules ALL-MODULE-PATH \ - --strip-debug \ - --no-man-pages \ - --no-header-files \ - --compress=2 \ - --output /javaruntime - -FROM maven:3.8.5-openjdk-17-slim as maven -ENV JAVA_HOME=/opt/java/openjdk -ENV PATH "${JAVA_HOME}/bin:${PATH}" -COPY --from=jre-build /javaruntime $JAVA_HOME - +FROM maven:3.9.6-eclipse-temurin-21 as maven RUN mvn -version WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM debian:bullseye-slim -ENV JAVA_HOME=/opt/java/openjdk -ENV PATH "${JAVA_HOME}/bin:${PATH}" -COPY --from=jre-build /javaruntime $JAVA_HOME - +FROM eclipse-temurin:21.0.3_9-jre-jammy RUN java -version WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar diff --git a/frameworks/Java/spring/spring-mongo.dockerfile b/frameworks/Java/spring/spring-mongo.dockerfile index 3672481ca61..4fa82a28d5d 100644 --- a/frameworks/Java/spring/spring-mongo.dockerfile +++ b/frameworks/Java/spring/spring-mongo.dockerfile @@ -1,30 +1,11 @@ -FROM eclipse-temurin:17 as jre-build - -# Create a custom Java runtime -RUN $JAVA_HOME/bin/jlink \ - --add-modules ALL-MODULE-PATH \ - --strip-debug \ - --no-man-pages \ - --no-header-files \ - --compress=2 \ - --output /javaruntime - -FROM maven:3.8.5-openjdk-17-slim as maven -ENV JAVA_HOME=/opt/java/openjdk -ENV PATH "${JAVA_HOME}/bin:${PATH}" -COPY --from=jre-build /javaruntime $JAVA_HOME - +FROM maven:3.9.6-eclipse-temurin-21 as maven RUN mvn -version WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM debian:bullseye-slim -ENV JAVA_HOME=/opt/java/openjdk -ENV PATH "${JAVA_HOME}/bin:${PATH}" -COPY --from=jre-build /javaruntime $JAVA_HOME - +FROM eclipse-temurin:21.0.3_9-jre-jammy RUN java -version WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar diff --git a/frameworks/Java/spring/spring.dockerfile b/frameworks/Java/spring/spring.dockerfile index a06133e8c45..f6f5145477f 100644 --- a/frameworks/Java/spring/spring.dockerfile +++ b/frameworks/Java/spring/spring.dockerfile @@ -1,34 +1,15 @@ -FROM eclipse-temurin:17 as jre-build - -# Create a custom Java runtime -RUN $JAVA_HOME/bin/jlink \ - --add-modules ALL-MODULE-PATH \ - --strip-debug \ - --no-man-pages \ - --no-header-files \ - --compress=2 \ - --output /javaruntime - -FROM maven:3.8.5-openjdk-17-slim as maven -ENV JAVA_HOME=/opt/java/openjdk -ENV PATH "${JAVA_HOME}/bin:${PATH}" -COPY --from=jre-build /javaruntime $JAVA_HOME - +FROM maven:3.9.6-eclipse-temurin-21 as maven RUN mvn -version WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM debian:bullseye-slim -ENV JAVA_HOME=/opt/java/openjdk -ENV PATH "${JAVA_HOME}/bin:${PATH}" -COPY --from=jre-build /javaruntime $JAVA_HOME - +FROM eclipse-temurin:21.0.3_9-jre-jammy RUN java -version WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=jdbc"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=jdbc"] diff --git a/frameworks/Java/spring/src/main/java/hello/App.java b/frameworks/Java/spring/src/main/java/hello/App.java index e8e93b65902..0ab1327f8c4 100644 --- a/frameworks/Java/spring/src/main/java/hello/App.java +++ b/frameworks/Java/spring/src/main/java/hello/App.java @@ -28,7 +28,7 @@ public void runAfterStartup() { @Bean @Profile({ "jdbc", "jpa" }) - public DataSource datasource(DataSourceProperties dataSourceProperties) { + DataSource datasource(DataSourceProperties dataSourceProperties) { HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class) .build(); dataSource.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() * 2); diff --git a/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java b/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java new file mode 100644 index 00000000000..11c6568c076 --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java @@ -0,0 +1,9 @@ +package hello; + +import hello.model.World; + +public interface UpdateWorldService { + + World updateWorld(int worldId); + +} diff --git a/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java b/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java new file mode 100644 index 00000000000..b59680aef5c --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java @@ -0,0 +1,42 @@ +package hello; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import hello.controller.HelloController; +import hello.model.World; +import hello.repository.DbRepository; + +@Service +public class UpdateWorldServiceImpl implements UpdateWorldService { + + private DbRepository dbRepository; + + public UpdateWorldServiceImpl(DbRepository dbRepository) { + this.dbRepository = dbRepository; + } + + @Override + @Transactional + public World updateWorld(int worldId) { + var world = dbRepository.getWorld(worldId); + // Ensure that the new random number is not equal to the old one. + // That would cause the JPA-based implementation to avoid sending the + // UPDATE query to the database, which would violate the test + // requirements. + + // Locally the records doesn't exist, maybe in the yours is ok but we need to + // make this check + if (world == null) { + return null; + } + + int newRandomNumber; + do { + newRandomNumber = HelloController.randomWorldNumber(); + } while (newRandomNumber == world.randomnumber); + + return dbRepository.updateWorld(world, newRandomNumber); + } + +} diff --git a/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java b/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java index 6046a2e7426..3c891567942 100644 --- a/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java +++ b/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import hello.UpdateWorldService; import hello.model.Fortune; import hello.model.World; import hello.repository.DbRepository; @@ -21,9 +22,13 @@ public final class HelloController { private DbRepository dbRepository; + private UpdateWorldService updateWorldService; - public HelloController(DbRepository dbRepository) { + public HelloController( + DbRepository dbRepository, + UpdateWorldService updateWorldService) { this.dbRepository = dbRepository; + this.updateWorldService = updateWorldService; } @GetMapping(value = "/plaintext") @@ -54,25 +59,9 @@ World[] queries(HttpServletResponse response, @RequestParam(required = false) St @GetMapping("/updates") World[] updates(HttpServletResponse response, @RequestParam(required = false) String queries) { response.setContentType(MediaType.APPLICATION_JSON_VALUE); - return randomWorldNumbers().mapToObj(dbRepository::getWorld).map(world -> { - // Ensure that the new random number is not equal to the old one. - // That would cause the JPA-based implementation to avoid sending the - // UPDATE query to the database, which would violate the test - // requirements. - - // Locally the records doesn't exist, maybe in the yours is ok but we need to - // make this check - if (world == null) { - return null; - } - - int newRandomNumber; - do { - newRandomNumber = randomWorldNumber(); - } while (newRandomNumber == world.randomnumber); - - return dbRepository.updateWorld(world, newRandomNumber); - }).limit(parseQueryCount(queries)).toArray(World[]::new); + return randomWorldNumbers() + .mapToObj(id -> updateWorldService.updateWorld(id)) + .limit(parseQueryCount(queries)).toArray(World[]::new); } @GetMapping("/fortunes") @@ -89,7 +78,7 @@ List fortunes(HttpServletResponse response) { private static final int MIN_WORLD_NUMBER = 1; private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; - private static int randomWorldNumber() { + public static int randomWorldNumber() { return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); } diff --git a/frameworks/Java/spring/src/main/resources/application.yml b/frameworks/Java/spring/src/main/resources/application.yml index 0f411d6d8e9..42c14602858 100644 --- a/frameworks/Java/spring/src/main/resources/application.yml +++ b/frameworks/Java/spring/src/main/resources/application.yml @@ -1,5 +1,10 @@ --- spring: + threads: + virtual: + enabled: true + jpa: + open-in-view: false config: activate: on-profile: jdbc,jpa @@ -22,7 +27,6 @@ spring: on-profile: jpa jpa: database-platform: org.hibernate.dialect.PostgreSQLDialect - open-in-view: false --- spring: From bd015859fa65e3223c928d397db2c832865ae1bf Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 8 Jul 2024 17:26:41 +0200 Subject: [PATCH 0695/1766] [ruby|rack-sequel] Use OJ for faster json serialization. (#9147) --- frameworks/Ruby/rack-sequel/Gemfile | 1 + frameworks/Ruby/rack-sequel/hello_world.rb | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index fb4b4ad65d8..22e0dd418b8 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -1,6 +1,7 @@ source 'https://rubygems.org' gem 'json', '~> 2.0' +gem 'oj', '~> 3.14', platforms: %i[ruby mswin] gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index d68de1f48d7..6fc3a787975 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'oj' +Oj.mimic_JSON + # Our Rack application to be executed by rackup class HelloWorld DEFAULT_HEADERS = {}.tap do |h| @@ -91,19 +94,19 @@ def call(env) case env['PATH_INFO'] when '/json' # Test type 1: JSON serialization - [JSON_TYPE, JSON.fast_generate(message: 'Hello, World!')] + [JSON_TYPE, { message: 'Hello, World!' }.to_json] when '/db' # Test type 2: Single database query - [JSON_TYPE, JSON.fast_generate(db)] + [JSON_TYPE, db.to_json] when '/queries' # Test type 3: Multiple database queries - [JSON_TYPE, JSON.fast_generate(queries(env))] + [JSON_TYPE, queries(env).to_json] when '/fortunes' # Test type 4: Fortunes [HTML_TYPE, fortunes] when '/updates' # Test type 5: Database updates - [JSON_TYPE, JSON.fast_generate(updates(env))] + [JSON_TYPE, updates(env).to_json] when '/plaintext' # Test type 6: Plaintext [PLAINTEXT_TYPE, 'Hello, World!'] From 14c71fdc30b0da386a6927ff9d98aa083994fdfc Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 8 Jul 2024 17:26:50 +0200 Subject: [PATCH 0696/1766] [ruby|sinatra] Use batch update on postgres (#9143) --- frameworks/Ruby/sinatra/Gemfile | 12 ++++++------ frameworks/Ruby/sinatra/boot.rb | 14 ++++++++++++-- frameworks/Ruby/sinatra/hello_world.rb | 25 +++++++++++++------------ 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 22752eec379..ff34570a2cb 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -1,16 +1,16 @@ source 'https://rubygems.org' -gem 'activerecord', '~> 7.0', :require=>'active_record' +gem 'activerecord', '~> 7.1', require: 'active_record' gem 'oj' -gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false -gem 'puma', '~> 6.4', :require=>false -gem 'sinatra', '~> 3.0', :require=>'sinatra/base' -gem 'unicorn', '~> 6.1', :platforms=>[:ruby, :mswin], :require=>false +gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false +gem 'puma', '~> 6.4', require: false +gem 'sinatra', '~> 3.0', require: 'sinatra/base' +gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false group :mysql do gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] end group :postgresql do - gem 'pg', '~> 1.5', :platforms=>[:ruby, :mswin] + gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] end diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index 355fc53df74..97fa0c40bdb 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -58,8 +58,18 @@ def connect(dbtype) class World < ActiveRecord::Base self.table_name = name - alias_attribute(:randomnumber, :randomNumber) \ - if connection.adapter_name.downcase.start_with?('mysql') + alias_attribute(:randomNumber, :randomnumber) \ + if connection.adapter_name.downcase.start_with?('postgres') + + if connection.adapter_name.downcase.start_with?('mysql') + def self.upsert_all(attributes, on_duplicate: :update, update_only: nil, returning: nil, unique_by: nil, record_timestamps: nil) + # On MySQL Batch updates verification isn't supported yet by TechEmpower. + # https://github.com/TechEmpower/FrameworkBenchmarks/issues/5983 + attributes.each do |attrs| + where(id: attrs[:id]).update_all(randomNumber: attrs[:randomNumber]) + end + end + end end class Fortune < ActiveRecord::Base diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index 90238498ed2..328fa402921 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -45,7 +45,7 @@ def rand1 # Test type 1: JSON serialization get '/json' do - json :message=>'Hello, World!' + json message: 'Hello, World!' end # Test type 2: Single database query @@ -76,27 +76,28 @@ def rand1 Fortune.all end.to_a @fortunes << Fortune.new( - :id=>0, - :message=>'Additional fortune added at request time.' + id: 0, + message: 'Additional fortune added at request time.' ) @fortunes.sort_by!(&:message) - erb :fortunes, :layout=>true + erb :fortunes, layout: true end # Test type 5: Database updates get '/updates' do worlds = - ActiveRecord::Base.connection_pool.with_connection do - ALL_IDS.sample(bounded_queries).map do |id| - world = World.find(id) - new_value = rand1 - new_value = rand1 while new_value == world.randomnumber - world.update_columns(randomnumber: new_value) - world.attributes + ALL_IDS.sample(bounded_queries).map do |id| + world = ActiveRecord::Base.connection_pool.with_connection do + World.find(id) end + new_value = rand1 + new_value = rand1 until new_value != world.randomNumber + { id: id, randomNumber: new_value } end - + ActiveRecord::Base.connection_pool.with_connection do + World.upsert_all(worlds.sort_by!{_1[:id]}) + end json worlds end From 3661938ab43508bde64f90c2491ab5b774ff9b5a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 8 Jul 2024 17:27:01 +0200 Subject: [PATCH 0697/1766] [ruby/rack] Upgrade Rack to latest version (#9140) --- frameworks/Ruby/rack/Gemfile.lock | 60 +++++++++++++++---------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 75e57b3ea0e..0fa04f72580 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -2,37 +2,36 @@ GEM remote: https://rubygems.org/ specs: ast (2.4.2) - async (2.11.0) + async (2.12.1) console (~> 1.25, >= 1.25.2) fiber-annotation - io-event (~> 1.5, >= 1.5.1) - timers (~> 4.1) + io-event (~> 1.6, >= 1.6.5) async-container (0.18.2) async (~> 2.10) - async-http (0.66.3) + async-http (0.69.0) async (>= 2.10.2) - async-pool (>= 0.6.1) - io-endpoint (~> 0.10, >= 0.10.3) + async-pool (~> 0.7) + io-endpoint (~> 0.11) io-stream (~> 0.4) - protocol-http (~> 0.26.0) - protocol-http1 (~> 0.19.0) - protocol-http2 (~> 0.17.0) - traces (>= 0.10.0) + protocol-http (~> 0.26) + protocol-http1 (~> 0.19) + protocol-http2 (~> 0.18) + traces (>= 0.10) async-http-cache (0.4.3) async-http (~> 0.56) - async-pool (0.6.1) + async-pool (0.7.0) async (>= 1.25) async-service (0.12.0) async async-container (~> 0.16) bigdecimal (3.1.8) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.3) connection_pool (2.4.1) console (1.25.2) fiber-annotation fiber-local (~> 1.1) json - falcon (0.47.6) + falcon (0.47.7) async async-container (~> 0.18) async-http (~> 0.66, >= 0.66.3) @@ -47,9 +46,9 @@ GEM fiber-annotation (0.2.0) fiber-local (1.1.0) fiber-storage - fiber-storage (0.1.0) - io-endpoint (0.10.3) - io-event (1.5.1) + fiber-storage (0.1.2) + io-endpoint (0.11.0) + io-event (1.6.5) io-stream (0.4.0) json (2.7.2) kgio (2.11.4) @@ -57,11 +56,11 @@ GEM localhost (1.3.1) mapping (1.1.1) nio4r (2.7.3) - oj (3.16.3) + oj (3.16.4) bigdecimal (>= 3.0) openssl (3.2.0) - parallel (1.24.0) - parser (3.3.1.0) + parallel (1.25.1) + parser (3.3.3.0) ast (~> 2.4.1) racc pg (1.5.6) @@ -69,27 +68,27 @@ GEM console (~> 1.8) samovar (~> 2.1) protocol-hpack (1.4.3) - protocol-http (0.26.5) + protocol-http (0.26.6) protocol-http1 (0.19.1) protocol-http (~> 0.22) - protocol-http2 (0.17.0) + protocol-http2 (0.18.0) protocol-hpack (~> 1.4) protocol-http (~> 0.18) - protocol-rack (0.5.1) + protocol-rack (0.6.0) protocol-http (~> 0.23) rack (>= 1.0) puma (6.4.2) nio4r (~> 2.0) - racc (1.7.3) - rack (3.0.11) + racc (1.8.0) + rack (3.1.6) rack-test (2.1.0) rack (>= 1.3) rainbow (3.1.1) raindrops (0.20.1) - regexp_parser (2.9.1) - rexml (3.2.8) - strscan (>= 3.0.9) - rubocop (1.63.5) + regexp_parser (2.9.2) + rexml (3.3.1) + strscan + rubocop (1.64.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -106,13 +105,12 @@ GEM samovar (2.3.0) console (~> 1.0) mapping (~> 1.0) - sequel (5.80.0) + sequel (5.82.0) bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) strscan (3.1.0) - timers (4.3.5) traces (0.11.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) @@ -145,4 +143,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.4.10 + 2.5.11 From bec7f74cb49b04a8a86d4d46003e9d17205a59fa Mon Sep 17 00:00:00 2001 From: kanarus Date: Tue, 9 Jul 2024 00:27:12 +0900 Subject: [PATCH 0698/1766] update ohkami to v0.19, dependencies & refactor some (#9120) --- frameworks/Rust/ohkami/Cargo.lock | 22 +++++++++++----------- frameworks/Rust/ohkami/Cargo.toml | 6 +++--- frameworks/Rust/ohkami/README.md | 2 +- frameworks/Rust/ohkami/ohkami.dockerfile | 2 +- frameworks/Rust/ohkami/src/postgres.rs | 9 +++------ 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index b0bc7617d71..95d46009a5b 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "ohkami" -version = "0.18.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d810447a32af4750a45183a4915db5ca4183bb6d44b8e7731e63f627c581d93e" +checksum = "e598d3d323527b920e159d55da2754067a5edfbc0678d60b3886fc379f4637f2" dependencies = [ "byte_reader", "hmac", @@ -787,7 +787,7 @@ dependencies = [ [[package]] name = "ohkami_framework_benchmarks" -version = "0.18.2" +version = "0.19.0" dependencies = [ "futures-util", "ohkami", @@ -799,9 +799,9 @@ dependencies = [ [[package]] name = "ohkami_lib" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4433e6c4c6c67a72afc306783ca8c641e69c9d171279fcab51f1f0c2d875e121" +checksum = "05fdeee00f86ee850c63a15068f2c2a3aeb6d707d4936f2261ec0e70ff48704b" dependencies = [ "byte_reader", "percent-encoding", @@ -810,9 +810,9 @@ dependencies = [ [[package]] name = "ohkami_macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffed4cd7e8c12a62c077273cb0f0fedf67ca3912488e5de1b325be85ca86bb06" +checksum = "d5fa46d8805dede76dce71f8725d48d655f74e2c702824f7a785257d1cc4dd1b" dependencies = [ "proc-macro2", "quote", @@ -1574,9 +1574,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -1593,9 +1593,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index 8a168f5c413..b6bf50cf97c 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "ohkami_framework_benchmarks" -version = "0.18.2" +version = "0.19.0" edition = "2021" authors = ["kanarus "] [dependencies] -ohkami = { version = "=0.18.2", features = ["rt_tokio"] } -tokio = { version = "1.37.0" , features = ["full"] } +ohkami = { version = "=0.19.0", features = ["rt_tokio"] } +tokio = { version = "1.38.0" , features = ["full"] } rand = { version = "0.8.5" , features = ["small_rng"] } sqlx = { version = "0.7.4" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } yarte = { version = "0.15.7" } diff --git a/frameworks/Rust/ohkami/README.md b/frameworks/Rust/ohkami/README.md index 21b85f2cc50..d9fda426ed3 100644 --- a/frameworks/Rust/ohkami/README.md +++ b/frameworks/Rust/ohkami/README.md @@ -1,4 +1,4 @@ -# [ohkami](https://github.com/kana-rus/ohkami) - Intuitive and Declarative Web Framework for Rust +# [Ohkami](https://github.com/kana-rus/ohkami) - Intuitive and Declarative Web Framework for Rust ## Description diff --git a/frameworks/Rust/ohkami/ohkami.dockerfile b/frameworks/Rust/ohkami/ohkami.dockerfile index 97a69dd07ae..b993ec905a5 100644 --- a/frameworks/Rust/ohkami/ohkami.dockerfile +++ b/frameworks/Rust/ohkami/ohkami.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-slim-buster +FROM rust:1.79-slim-buster WORKDIR /ohkami_framework_benchmarks ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world diff --git a/frameworks/Rust/ohkami/src/postgres.rs b/frameworks/Rust/ohkami/src/postgres.rs index 7f29317d1ba..e9238d67493 100644 --- a/frameworks/Rust/ohkami/src/postgres.rs +++ b/frameworks/Rust/ohkami/src/postgres.rs @@ -16,16 +16,14 @@ 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") + 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") + sqlx::query_as("SELECT id, message FROM Fortune") .fetch_all(&self.0).await .expect("Failed to fetch fortunes") } @@ -36,8 +34,7 @@ impl Postgres { let selects = FuturesUnordered::new(); for _ in 0..n { selects.push( - sqlx::query_as( - "SELECT id, randomnumber FROM World WHERE id = $1") + sqlx::query_as("SELECT id, randomnumber FROM World WHERE id = $1") .bind((rng.gen::() % 10_000 + 1) as i32) .fetch_one(&self.0) ) From b9ced2e628825736093bc234da171a456c5f88d9 Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Mon, 8 Jul 2024 18:27:45 +0300 Subject: [PATCH 0699/1766] [F#/Oxpecker] Changed db type from micro-ORM to raw + refactoring (#9118) * [F#/Oxpecker] Switched from Dapper to raw ADO (cherry picked from commit 2f386186a28f7dc502a3d3c7da35211e12d395f0) * [F#/Oxpecker] Refactoring * [F#/Oxpecker] Updated Readme * [F#/Oxpecker] Updated Readme * [F#/Oxpecker] Fixed "versus" field --- frameworks/FSharp/oxpecker/README.md | 11 +- .../FSharp/oxpecker/benchmark_config.json | 4 +- frameworks/FSharp/oxpecker/config.toml | 4 +- frameworks/FSharp/oxpecker/src/App/App.fsproj | 3 +- frameworks/FSharp/oxpecker/src/App/Common.fs | 34 ++++++ frameworks/FSharp/oxpecker/src/App/Db.fs | 104 +++++++++++++++++ frameworks/FSharp/oxpecker/src/App/Program.fs | 109 +++--------------- 7 files changed, 162 insertions(+), 107 deletions(-) create mode 100644 frameworks/FSharp/oxpecker/src/App/Common.fs create mode 100644 frameworks/FSharp/oxpecker/src/App/Db.fs diff --git a/frameworks/FSharp/oxpecker/README.md b/frameworks/FSharp/oxpecker/README.md index ecd2284661d..3d8a00a248a 100644 --- a/frameworks/FSharp/oxpecker/README.md +++ b/frameworks/FSharp/oxpecker/README.md @@ -1,5 +1,5 @@ # Oxpecker Tests on Linux -This includes tests for plaintext, json, and fortunes HTML serialization. +This includes tests for plaintext, json, fortunes, single query, mutliple queries and data updates. ## Infrastructure Software Versions @@ -18,9 +18,6 @@ This includes tests for plaintext, json, and fortunes HTML serialization. **Web Stack** * [Oxpecker](https://github.com/Lanayx/Oxpecker) -* [Dapper](https://github.com/DapperLib/Dapper) -* ASP.NET Core - -## Paths & Source for Tests - -All source code is inside `Program.fs`. +* [Npgsql](https://github.com/npgsql/npgsql) +* [System.Text.Json](https://github.com/dotnet/runtime/tree/main/src/libraries/System.Text.Json) +* ASP.NET Core \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/benchmark_config.json b/frameworks/FSharp/oxpecker/benchmark_config.json index c0df28d86a3..562c9514420 100644 --- a/frameworks/FSharp/oxpecker/benchmark_config.json +++ b/frameworks/FSharp/oxpecker/benchmark_config.json @@ -15,7 +15,7 @@ "database": "Postgres", "framework": "Oxpecker", "language": "F#", - "orm": "Micro", + "orm": "Raw", "platform": ".NET", "flavor": "CoreCLR", "webserver": "Kestrel", @@ -23,7 +23,7 @@ "database_os": "Linux", "display_name": "Oxpecker", "notes": "", - "versus": "aspcore" + "versus": "aspnetcore" } } ] diff --git a/frameworks/FSharp/oxpecker/config.toml b/frameworks/FSharp/oxpecker/config.toml index dd5e34c8b96..75e7f904754 100644 --- a/frameworks/FSharp/oxpecker/config.toml +++ b/frameworks/FSharp/oxpecker/config.toml @@ -13,7 +13,7 @@ classification = "fullstack" database = "Postgres" database_os = "Linux" os = "Linux" -orm = "micro" +orm = "Raw" platform = ".NET" webserver = "Kestrel" -versus = "aspcore" \ No newline at end of file +versus = "aspnetcore" \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index a9e0ad2c0ba..f01c367f95f 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -6,12 +6,13 @@ + + - diff --git a/frameworks/FSharp/oxpecker/src/App/Common.fs b/frameworks/FSharp/oxpecker/src/App/Common.fs new file mode 100644 index 00000000000..0b62abdefee --- /dev/null +++ b/frameworks/FSharp/oxpecker/src/App/Common.fs @@ -0,0 +1,34 @@ +namespace App + +open System +open System.Collections.Generic + +[] +module Common = + + [] + [] + type JsonMessage = { + message : string + } + + [] + type Fortune = { + id: int + message: string + } + + [] + [] + type World = { + id: int + randomnumber: int + } + + [] + let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" + + let FortuneComparer = { + new IComparer with + member self.Compare(a,b) = String.CompareOrdinal(a.message, b.message) + } diff --git a/frameworks/FSharp/oxpecker/src/App/Db.fs b/frameworks/FSharp/oxpecker/src/App/Db.fs new file mode 100644 index 00000000000..498721b2b2e --- /dev/null +++ b/frameworks/FSharp/oxpecker/src/App/Db.fs @@ -0,0 +1,104 @@ +namespace App + +open System +open System.Data +open System.Data.Common +open System.Text +open Npgsql + + +[] +module Db = + let loadFortunes () = + let result = ResizeArray() + task { + use db = new NpgsqlConnection(ConnectionString) + use cmd = db.CreateCommand(CommandText = "SELECT id, message FROM fortune") + do! db.OpenAsync() + use! rdr = cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection) + while! rdr.ReadAsync() do + result.Add { id = rdr.GetInt32(0); message = rdr.GetString(1) } + return result + } + + let private createReadCommand (connection: DbConnection) = + let cmd = connection.CreateCommand( + CommandText = "SELECT id, randomnumber FROM world WHERE id = @Id" + ) + let id = cmd.CreateParameter( + ParameterName = "@Id", + DbType = DbType.Int32, + Value = Random.Shared.Next(1, 10001) + ) + cmd.Parameters.Add(id) |> ignore + cmd + + let private readSingleRow (cmd: DbCommand) = + task { + use! rdr = cmd.ExecuteReaderAsync(CommandBehavior.SingleRow) + let! _ = rdr.ReadAsync() + return { id = rdr.GetInt32(0); randomnumber = rdr.GetInt32(1) } + } + + let loadSingleRow () = + task { + use db = new NpgsqlConnection(ConnectionString) + do! db.OpenAsync() + use cmd = createReadCommand db + return! readSingleRow cmd + } + + let private readMultipleRows (count: int) (conn: NpgsqlConnection) = + let result = Array.zeroCreate count + task { + use cmd = createReadCommand conn + for i in 0..result.Length-1 do + cmd.Parameters["@Id"].Value <- Random.Shared.Next(1, 10001) + let! row = readSingleRow cmd + result[i] <- row + return result + } + + let loadMultipleRows (count: int) = + task { + use db = new NpgsqlConnection(ConnectionString) + do! db.OpenAsync() + return! readMultipleRows count db + } + + let private maxBatch = 500 + let private queries = Array.zeroCreate (maxBatch + 1) + let private batchUpdateString batchSize = + match queries[batchSize] with + | null -> + let lastIndex = batchSize - 1 + let sb = StringBuilder() + sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ") |> ignore + for i in 0..lastIndex-1 do + sb.AppendFormat("(@Id_{0}, @Rn_{0}), ", i) |> ignore + sb.AppendFormat("(@Id_{0}, @Rn_{0}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id", lastIndex) |> ignore + let result = sb.ToString() + queries[batchSize] <- result + result + | q -> + q + + let private generateParameters (results: World[]) (command: DbCommand) = + for i in 0..results.Length-1 do + let randomNumber = Random.Shared.Next(1, 10001) + let random = command.CreateParameter(ParameterName = $"@Rn_{i}", DbType = DbType.Int32, Value = randomNumber) + command.Parameters.Add(random) |> ignore + let id = command.CreateParameter(ParameterName = $"@Id_{i}", DbType = DbType.Int32, Value = results[i].id) + command.Parameters.Add(id) |> ignore + results[i] <- { results[i] with randomnumber = randomNumber } + + let doMultipleUpdates (count: int) = + task { + use conn = new NpgsqlConnection(ConnectionString) + do! conn.OpenAsync() + let! results = readMultipleRows count conn + use cmd = conn.CreateCommand(CommandText = batchUpdateString count) + do generateParameters results cmd + let! _ = cmd.ExecuteNonQueryAsync() + return results + } diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index bdb95afa593..dcfd3c53206 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -1,32 +1,8 @@ namespace App open System -open System.Collections.Generic open Oxpecker -[] -module Common = - - [] - [] - type JsonMessage = { - message : string - } - - [] - type Fortune = { - id: int - message: string - } - - [] - let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" - - let FortuneComparer = { - new IComparer with - member self.Compare(a,b) = String.CompareOrdinal(a.message, b.message) - } - [] module HtmlViews = open Oxpecker.ViewEngine @@ -48,7 +24,7 @@ module HtmlViews = th() { raw "message" } } - let fortunes fortunesData = + let fortunes (fortunesData: ResizeArray) = table() { fortunesTableHeader for fortune in fortunesData do @@ -60,8 +36,6 @@ module HtmlViews = [] module HttpHandlers = - open Dapper - open Npgsql open System.Text open Microsoft.AspNetCore.Http open System.Text.Json @@ -72,32 +46,24 @@ module HttpHandlers = message = "Additional fortune added at request time." } - let rec private renderFortunes (ctx: HttpContext) (dbFortunes: Fortune seq) = - let data = dbFortunes.AsList() + let rec private renderFortunes (ctx: HttpContext) (data: ResizeArray) = data.Add extra data.Sort FortuneComparer data |> HtmlViews.fortunes |> ctx.WriteHtmlView - let private fortunes : EndpointHandler = + let fortunes : EndpointHandler = fun ctx -> task { - use conn = new NpgsqlConnection(ConnectionString) - let! dbFortunes = conn.QueryAsync("SELECT id, message FROM fortune") + let! dbFortunes = loadFortunes () return! renderFortunes ctx dbFortunes } - [] - [] - type World = { - id: int - randomnumber: int - } - - let private readSingleRow (conn: NpgsqlConnection) = - conn.QueryFirstOrDefaultAsync( - "SELECT id, randomnumber FROM world WHERE id = @Id", - {| Id = Random.Shared.Next(1, 10001) |} - ) + let singleQuery : EndpointHandler = + fun ctx -> + task { + let! result = loadSingleRow() + return! ctx.WriteJsonChunked result + } let private parseQueries (ctx: HttpContext) = match ctx.TryGetRouteValue("count") with @@ -107,66 +73,19 @@ module HttpHandlers = | _, _ -> 1 | _ -> 1 - let private singleQuery : EndpointHandler = - fun ctx -> - task { - use conn = new NpgsqlConnection(ConnectionString) - let! result = readSingleRow conn - return! ctx.WriteJsonChunked result - } - - let private multipleQueries : EndpointHandler = + let multipleQueries : EndpointHandler = fun ctx -> let count = parseQueries ctx - let results = Array.zeroCreate count task { - use conn = new NpgsqlConnection(ConnectionString) - do! conn.OpenAsync() - for i in 0..results.Length-1 do - let! result = readSingleRow conn - results[i] <- result + let! results = loadMultipleRows count return! ctx.WriteJsonChunked results } - let private maxBatch = 500 - let private queries = Array.zeroCreate (maxBatch + 1) - - let private batchUpdateString batchSize = - match queries[batchSize] with - | null -> - let lastIndex = batchSize - 1 - let sb = StringBuilder() - sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ") |> ignore - for i in 0..lastIndex-1 do - sb.AppendFormat("(@Id_{0}, @Rn_{0}), ", i) |> ignore - sb.AppendFormat("(@Id_{0}, @Rn_{0}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id", lastIndex) |> ignore - let result = sb.ToString() - queries[batchSize] <- result - result - | q -> - q - - let private generateParameters (results: World[]) = - let parameters = Dictionary() - for i in 0..results.Length-1 do - let randomNumber = Random.Shared.Next(1, 10001) - parameters[$"@Rn_{i}"] <- randomNumber - parameters[$"@Id_{i}"] <- results[i].id - results[i] <- { results[i] with randomnumber = randomNumber } - parameters - - let private multipleUpdates : EndpointHandler = + let multipleUpdates : EndpointHandler = fun ctx -> let count = parseQueries ctx - let results = Array.zeroCreate count task { - use conn = new NpgsqlConnection(ConnectionString) - do! conn.OpenAsync() - for i in 0..results.Length-1 do - let! result = readSingleRow conn - results[i] <- result - let parameters = generateParameters results - let! _ = conn.ExecuteAsync(batchUpdateString count, parameters) + let! results = doMultipleUpdates count return! ctx.WriteJsonChunked results } From 67dcfb7764f73439d83c2b9b3e658711fdad5a58 Mon Sep 17 00:00:00 2001 From: Bartosz Jarzyna <44323413+bbrtj@users.noreply.github.com> Date: Mon, 8 Jul 2024 17:28:04 +0200 Subject: [PATCH 0700/1766] Perl Kelp: Fix and modernize (#9115) * Perl Kelp: Fix and modernize * Perl Kelp: benchmark on multiple web servers * Perl Kelp: unfreeze framework version, a couple of fixes --- frameworks/Perl/kelp/README.md | 45 +++-- frameworks/Perl/kelp/app.ini | 3 +- frameworks/Perl/kelp/app.pl | 145 ---------------- frameworks/Perl/kelp/app.psgi | 8 + frameworks/Perl/kelp/benchmark_config.json | 168 +++++++++++++++++-- frameworks/Perl/kelp/conf/config.pl | 12 ++ frameworks/Perl/kelp/conf/test.pl | 23 +++ frameworks/Perl/kelp/config.toml | 32 ---- frameworks/Perl/kelp/kelp-mongodb.dockerfile | 27 --- frameworks/Perl/kelp/kelp.dockerfile | 40 +++-- frameworks/Perl/kelp/lib/KelpBench.pm | 130 ++++++++++++++ frameworks/Perl/kelp/lib/KelpBench/DBI.pm | 47 ++++++ frameworks/Perl/kelp/lib/KelpBench/Mongo.pm | 43 +++++ frameworks/Perl/kelp/run.pl | 78 +++++++++ frameworks/Perl/kelp/t/main.t | 111 ++++++++---- frameworks/Perl/kelp/views/fortunes.tt | 22 +++ 16 files changed, 659 insertions(+), 275 deletions(-) delete mode 100755 frameworks/Perl/kelp/app.pl create mode 100755 frameworks/Perl/kelp/app.psgi create mode 100644 frameworks/Perl/kelp/conf/config.pl create mode 100644 frameworks/Perl/kelp/conf/test.pl delete mode 100644 frameworks/Perl/kelp/config.toml delete mode 100644 frameworks/Perl/kelp/kelp-mongodb.dockerfile create mode 100644 frameworks/Perl/kelp/lib/KelpBench.pm create mode 100644 frameworks/Perl/kelp/lib/KelpBench/DBI.pm create mode 100644 frameworks/Perl/kelp/lib/KelpBench/Mongo.pm create mode 100755 frameworks/Perl/kelp/run.pl create mode 100644 frameworks/Perl/kelp/views/fortunes.tt diff --git a/frameworks/Perl/kelp/README.md b/frameworks/Perl/kelp/README.md index f66a3470d67..8be16d73c02 100644 --- a/frameworks/Perl/kelp/README.md +++ b/frameworks/Perl/kelp/README.md @@ -1,18 +1,17 @@ # Setup -* Perl 5.10+ -* MySQL 5.5 -* MongoDB -* Wrk 2.0 +* Perl 5.36+ +* MariaDB or MongoDB # Requirements * Kelp (install from CPAN) -* Kelp::Module::JSON::XS (install from CPAN) * Kelp::Module::Template::Toolkit (install from CPAN) -* DBD::mysql (install from CPAN) +* DBI + DBD::mysql or MongoDB (install from CPAN) +* Gazelle (install from CPAN) * Starman (install from CPAN) -* MongoDB (install from CPAN) +* Starlet (install from CPAN) +* Twiggy::Prefork (install from CPAN) * nginx (if you want to front with nginx, nginx.conf provided) # Deployment @@ -24,16 +23,38 @@ ./uwsgi --plugins psgi --init app.ini -## Plack + Starman +## Plack + plack handler -1. Deploy via plackup +Recommended handler is `Gazelle`. - plackup -E deployment -s Starman --workers=25 -l /tmp/frameworks-benchmark.sock -a ./app.pl +1. Deploy via `start_server`, if you want to front it with nginx. -2. If you want to front it with nginx, otherwise + start_server --path /tmp/perl-kelp.sock --backlog 16384 -- plackup -E production -s Gazelle --max-workers=25 --max-reqs-per-child=10000 -a ./app.psgi - plackup -E deployment -s Starman --port=8080 --workers=25 -a ./app.pl +2. Otherwise + + plackup -E deployment -s Gazelle --port=8080 --max-workers=25 -a ./app.psgi + +# Code information + +`lib/KelpBench.pm` contains all action-handling and helper code. It is a full +Kelp app with `Template::Toolkit` module and standard Kelp configuration files. +While it could've been coded as a one-file Kelp app, full app style gives us +more control on the behavior of the app. It lazy-loads `DBI.pm` or `Mongo.pm` +from `lib/KelpBench/` directory based on environmental variable `MONGO`, so it +only needs one database driver at a time. + +The app is written in a relaxed style, not trying very hard to achieve the best +possible result. It very much resembles production code. For example, a proper +templating engine is used to produce the HTML document instead of inline HTML +(which is obviously much faster). + +App can be tested using mock database by running `prove -l`. In this case, it +only requires `Kelp` and `Kelp::Module::Template::Toolkit` from CPAN to be +installed. # Expert contact +@bbrtj (contact@bbrtj.eu) @naturalist (minimal@cpan.org) + diff --git a/frameworks/Perl/kelp/app.ini b/frameworks/Perl/kelp/app.ini index 7a53ad301ae..ebeb49abedf 100644 --- a/frameworks/Perl/kelp/app.ini +++ b/frameworks/Perl/kelp/app.ini @@ -1,4 +1,5 @@ [uwsgi] http-socket = :8080 -psgi = app.pl +psgi = app.psgi disable-logging = True + diff --git a/frameworks/Perl/kelp/app.pl b/frameworks/Perl/kelp/app.pl deleted file mode 100755 index 8db36540926..00000000000 --- a/frameworks/Perl/kelp/app.pl +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env perl - -use Kelp::Less; -use HTML::Escape 'escape_html'; -use MongoDB; -use DBI; -use utf8; - -module 'JSON::XS'; - -my $mongo; -my $mdb; -my $world; -my $fortune; -my @sth; -my $dbh; - -if ($ENV{MONGO}) { - $mongo = MongoDB::MongoClient->new( host => 'tfb-database', port => 27017 ); - $mdb = $mongo->get_database('hello_world'); - $world = $mdb->get_collection('world'); - $fortune = $mdb->get_collection('fortune'); -} else { - $dbh = DBI->connect( - "dbi:mysql:database=hello_world;host=tfb-database;port=3306", - 'benchmarkdbuser', - 'benchmarkdbpass', - { RaiseError => 0, PrintError => 0, mysql_enable_utf8 => 1 } - ); - @sth = map { $dbh->prepare($_) } ( - "SELECT * FROM World WHERE id = ?", - "SELECT * FROM Fortune", - "UPDATE World SET randomNumber = ? WHERE id = ?", - ); -} - -get '/json' => sub { - { message => 'Hello, World!' }; -}; - -get '/db/?db' => sub { - my ( $self, $db ) = @_; - my $id = int rand 10000 + 1; - my $row; - if ( $db eq 'mongo' ) { - $row = $world->find_one( { _id => $id } ); - } - else { - $sth[0]->execute($id); - $row = $sth[0]->fetchrow_hashref; - } - return { id => $id, randomNumber => $row->{randomNumber} }; -}; - -get '/queries/?db' => sub { - my ( $self, $db ) = @_; - query( $db // 'mongo', $self->param('queries') ); -}; - -get '/fortunes/?db' => sub { - my ( $self, $db ) = @_; - $db //= 'mongo'; - my @objects; - if ( $db eq 'mongo' ) { - my $cursor = $fortune->query( {} ); - @objects = $cursor->all; - } - else { - $sth[1]->execute(); - @objects = @{ $sth[1]->fetchall_arrayref( {} ) }; - } - push @objects, { id => 0, message => "Additional fortune added at request time." }; - fortunes( \@objects ); -}; - -get '/update/?db' => sub { - my ( $self, $db ) = @_; - $db //= 'mongo'; - - my $arr = query( $db, $self->param('queries') ); - $arr = [$arr] unless ref($arr) eq 'ARRAY'; - for my $row (@$arr) { - $row->{randomNumber} = int( rand(10_000) ) + 1; - if ( $db eq 'mongo' ) { - $world->update( { _id => $row->{id} }, - { randomNumber => $row->{randomNumber} } ); - } - else { - $row->{randomNumber} = int( rand(10_000) ) + 1; - $sth[2]->execute( $row->{randomNumber}, $row->{id} ); - } - } - - return $arr; -}; - -get '/plaintext' => sub { - shift->res->text->render('Hello, World!'); -}; - -run; - -sub query { - my ( $db, $count ) = @_; - $count //= 1; - $count = 1 if ( $count !~ /^\d+$/ || $count < 1 ); - $count = 500 if $count > 500; - my @response; - for ( 1 .. $count ) { - my $id = int rand 10000 + 1; - my $row; - if ( $db eq 'mongo' ) { - $row = $world->find_one( { _id => $id } ); - } - else { - $sth[0]->execute($id); - $row = $sth[0]->fetchrow_hashref; - } - if ($row) { - push @response, - { id => $id, randomNumber => $row->{randomNumber} }; - } - } - return \@response; -} - -sub fortunes { - my ($objects) = @_; - my $res = q[Fortunes]; - $res .= q[]; - - for my $item ( sort { $a->{message} cmp $b->{message} } @$objects ) { - my $id = $item->{id}; - my $message = escape_html( $item->{message} ); - - # HTML::Escape encodes apostrophe as ' because IE8 does not - # support '. We forse an ' here in order to pass the - # test - $message =~ s/'/&apos/g; - $res .= ""; - } - - $res .= q[
idmessage
$id$message
]; - return $res; -} diff --git a/frameworks/Perl/kelp/app.psgi b/frameworks/Perl/kelp/app.psgi new file mode 100755 index 00000000000..5a8182549bd --- /dev/null +++ b/frameworks/Perl/kelp/app.psgi @@ -0,0 +1,8 @@ +#!/usr/bin/env perl + +use Path::Tiny qw(path); +use lib path(__FILE__)->parent->child('lib'); +use KelpBench; + +KelpBench->new->run; + diff --git a/frameworks/Perl/kelp/benchmark_config.json b/frameworks/Perl/kelp/benchmark_config.json index 036f68fd31f..1cd06f51ad0 100644 --- a/frameworks/Perl/kelp/benchmark_config.json +++ b/frameworks/Perl/kelp/benchmark_config.json @@ -1,11 +1,61 @@ { "framework": "kelp", "tests": [{ - "default": { - "db_url": "/db/mysql", - "query_url": "/queries/mysql?queries=", - "fortune_url": "/fortunes/mysql", + "gazelle-mysql": { + "dockerfile": "kelp.dockerfile", "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "kelp", + "language": "Perl", + "orm": "Raw", + "platform": "Plack", + "webserver": "Gazelle", + "os": "Linux", + "database_os": "Linux", + "notes": "", + "versus": "", + "tags": [] + }, + "gazelle-mongodb": { + "dockerfile": "kelp.dockerfile", + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MongoDB", + "framework": "kelp", + "language": "Perl", + "orm": "Raw", + "platform": "Plack", + "webserver": "Gazelle", + "os": "Linux", + "database_os": "Linux", + "notes": "", + "versus": "", + "tags": [] + }, + + "starman-mysql": { + "dockerfile": "kelp.dockerfile", + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -17,16 +67,18 @@ "webserver": "Starman", "os": "Linux", "database_os": "Linux", - "display_name": "kelp", "notes": "", "versus": "", - "tags": ["broken"] + "tags": [] }, - "mongodb": { - "db_url": "/db/mongo", - "query_url": "/queries/mongo?queries=", - "fortune_url": "/fortunes/mongo", + "starman-mongodb": { + "dockerfile": "kelp.dockerfile", "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -38,10 +90,102 @@ "webserver": "Starman", "os": "Linux", "database_os": "Linux", - "display_name": "kelp", "notes": "", "versus": "", - "tags": ["broken"] + "tags": [] + }, + + "starlet-mysql": { + "dockerfile": "kelp.dockerfile", + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "kelp", + "language": "Perl", + "orm": "Raw", + "platform": "Plack", + "webserver": "Starlet", + "os": "Linux", + "database_os": "Linux", + "notes": "", + "versus": "", + "tags": [] + }, + "starlet-mongodb": { + "dockerfile": "kelp.dockerfile", + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MongoDB", + "framework": "kelp", + "language": "Perl", + "orm": "Raw", + "platform": "Plack", + "webserver": "Starlet", + "os": "Linux", + "database_os": "Linux", + "notes": "", + "versus": "", + "tags": [] + }, + + "twiggy-mysql": { + "dockerfile": "kelp.dockerfile", + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "kelp", + "language": "Perl", + "orm": "Raw", + "platform": "Plack", + "webserver": "Twiggy", + "os": "Linux", + "database_os": "Linux", + "notes": "", + "versus": "", + "tags": [] + }, + "twiggy-mongodb": { + "dockerfile": "kelp.dockerfile", + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MongoDB", + "framework": "kelp", + "language": "Perl", + "orm": "Raw", + "platform": "Plack", + "webserver": "Twiggy", + "os": "Linux", + "database_os": "Linux", + "notes": "", + "versus": "", + "tags": [] } }] } + diff --git a/frameworks/Perl/kelp/conf/config.pl b/frameworks/Perl/kelp/conf/config.pl new file mode 100644 index 00000000000..ce7f3527f59 --- /dev/null +++ b/frameworks/Perl/kelp/conf/config.pl @@ -0,0 +1,12 @@ +{ + modules => [qw(JSON Template::Toolkit)], + modules_init => { + 'Template::Toolkit' => { + STRICT => 1, + OUTLINE_TAG => qr{\V*%%}, # https://github.com/abw/Template2/issues/320 + ENCODING => 'utf8', + INCLUDE_PATH => 'views', + }, + }, +} + diff --git a/frameworks/Perl/kelp/conf/test.pl b/frameworks/Perl/kelp/conf/test.pl new file mode 100644 index 00000000000..f480597ed9b --- /dev/null +++ b/frameworks/Perl/kelp/conf/test.pl @@ -0,0 +1,23 @@ +{ + '+modules' => [qw(Logger)], + + modules_init => { + Logger => { + outputs => [ + [ + 'Screen', + name => 'logs', + min_level => 'debug', + stderr => 1, + newline => 1, + utf8 => 1, + ], + ], + }, + + 'Template::Toolkit' => { + DEBUG => 1, + }, + }, +} + diff --git a/frameworks/Perl/kelp/config.toml b/frameworks/Perl/kelp/config.toml deleted file mode 100644 index 7e997486fb2..00000000000 --- a/frameworks/Perl/kelp/config.toml +++ /dev/null @@ -1,32 +0,0 @@ -[framework] -name = "kelp" - -[main] -urls.plaintext = "/plaintext" -urls.db = "/db/mysql" -urls.query = "/queries/mysql?queries=" -urls.fortune = "/fortunes/mysql" -approach = "Realistic" -classification = "Fullstack" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Plack" -webserver = "Starman" -versus = "" - -[mongodb] -urls.plaintext = "/plaintext" -urls.db = "/db/mongo" -urls.query = "/queries/mongo?queries=" -urls.fortune = "/fortunes/mongo" -approach = "Realistic" -classification = "Fullstack" -database = "MongoDB" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Plack" -webserver = "Starman" -versus = "" diff --git a/frameworks/Perl/kelp/kelp-mongodb.dockerfile b/frameworks/Perl/kelp/kelp-mongodb.dockerfile deleted file mode 100644 index 783c7e4d263..00000000000 --- a/frameworks/Perl/kelp/kelp-mongodb.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM perl:5.26 - -RUN apt-get update -yqq && apt-get install -yqq nginx - -WORKDIR /kelp - -RUN cpanm --notest --no-man-page \ - JSON JSON::XS IO::Socket::IP IO::Socket::SSL \ - Kelp@0.9071 \ - DBI@1.636 \ - DBD::mysql@4.033 \ - MongoDB@1.8.1 \ - Kelp::Module::JSON::XS@0.502 \ - HTML::Escape@1.10 \ - HTTP::Parser::XS@0.17 \ - Starman@0.4014 - -ADD ./app.ini /kelp/ -ADD ./app.pl /kelp/ -ADD ./nginx.conf /kelp/ - -ENV MONGO=1 - -EXPOSE 8080 - -CMD nginx -c /kelp/nginx.conf && \ - plackup -E production -s Starman --workers=$(nproc) -l /tmp/perl-kelp.sock -a ./app.pl diff --git a/frameworks/Perl/kelp/kelp.dockerfile b/frameworks/Perl/kelp/kelp.dockerfile index 7bfd6f33521..b8bd3453317 100644 --- a/frameworks/Perl/kelp/kelp.dockerfile +++ b/frameworks/Perl/kelp/kelp.dockerfile @@ -1,25 +1,33 @@ -FROM perl:5.26 +FROM perl:5.40 + +ARG TFB_TEST_NAME +ARG TFB_TEST_DATABASE RUN apt-get update -yqq && apt-get install -yqq nginx WORKDIR /kelp RUN cpanm --notest --no-man-page \ - JSON JSON::XS IO::Socket::IP IO::Socket::SSL \ - Kelp@0.9071 \ - DBI@1.636 \ - DBD::mysql@4.033 \ - MongoDB@1.8.1 \ - Kelp::Module::JSON::XS@0.502 \ - HTML::Escape@1.10 \ - HTTP::Parser::XS@0.17 \ - Starman@0.4014 - -ADD ./app.ini /kelp/ -ADD ./app.pl /kelp/ -ADD ./nginx.conf /kelp/ + Kelp::Module::Template::Toolkit@0.301 \ + Kelp \ + DBI@1.643 \ + DBD::MariaDB@1.23 \ + MongoDB@2.2.2 \ + Cpanel::JSON::XS@4.38 \ + Gazelle@0.49 \ + Starman@0.4017 \ + Starlet@0.31 \ + Twiggy::Prefork@0.08 \ + Net::Server::SS::PreFork@0.05 + +ADD ./ /kelp/ + +ENV TEST_NAME=$TFB_TEST_NAME +ENV DATABASE=$TFB_TEST_DATABASE +ENV MAX_REQS=100000 +ENV SOCKET_FILE=/tmp/perl-kelp.sock EXPOSE 8080 -CMD nginx -c /kelp/nginx.conf && \ - plackup -E production -s Starman --workers=$(nproc) -l /tmp/perl-kelp.sock -a ./app.pl +CMD nginx -c /kelp/nginx.conf && ./run.pl + diff --git a/frameworks/Perl/kelp/lib/KelpBench.pm b/frameworks/Perl/kelp/lib/KelpBench.pm new file mode 100644 index 00000000000..d20a72a31ed --- /dev/null +++ b/frameworks/Perl/kelp/lib/KelpBench.pm @@ -0,0 +1,130 @@ +package KelpBench; + +use v5.36; +use Kelp::Base 'Kelp'; + +## Attributes + +attr database => sub { + if (lc $ENV{DATABASE} eq 'mongodb') { + require KelpBench::Mongo; + return KelpBench::Mongo->new; + } + elsif (lc $ENV{DATABASE} eq 'mysql') { + require KelpBench::DBI; + return KelpBench::DBI->new; + } + else { + die "unknown database chosen: $ENV{DATABASE}"; + } +}; + +## Utilities + +sub validate_number ($self, $num, $min, $max) +{ + return $min unless length($num // '') && $num !~ /\D/; + return $min if $num < $min; + return $max if $num > $max; + return $num; +} + +sub random_number ($self, $max = 10_000) +{ + return int(rand($max) + 1); +} + +sub random_id ($self) +{ + # in case random ids were not the same as random numbers + return $self->random_number(10_000); +} + +sub get_random_entries ($self, $count) +{ + $count = $self->validate_number($count, 1, 500); + + my @result; + for (1 .. $count) { + my $id = $self->random_id; + my $row = $self->database->random_number($id); + next unless $row; + + push @result, { + id => $id, + randomNumber => $row->{randomNumber} + }; + } + + return \@result; +} + +## Framework code + +sub before_dispatch {} # skip trying to log access +sub before_finalize {} # skip adding X-Framework + +sub build ($self) +{ + $self->add_route([GET => '/plaintext'] => 'action_plaintext'); + $self->add_route([GET => '/json'] => 'action_json'); + $self->add_route([GET => '/db'] => 'action_db'); + $self->add_route([GET => '/queries'] => 'action_queries'); + $self->add_route([GET => '/fortunes'] => 'action_fortunes'); + $self->add_route([GET => '/updates'] => 'action_updates'); +} + +## Registered route handlers +## Names prefixed with _action, because we did not separate a controller +## (Controllers would slow this down a bit due to reblessing of app object) + +sub action_plaintext ($self) +{ + $self->res->text; + return 'Hello, World!'; +} + +sub action_json ($self) +{ + return { message => 'Hello, World!' }; +} + +sub action_db ($self) +{ + my $id = $self->random_id; + my $row = $self->database->random_number($id); + + return { id => $id, randomNumber => $row->{randomNumber} }; +} + +sub action_queries ($self) +{ + return $self->get_random_entries($self->req->query_param('queries')); +} + +sub action_fortunes ($self) { + my $objects = $self->database->fortune; + + push $objects->@*, { + id => 0, + message => "Additional fortune added at request time." + }; + + $objects->@* = sort { $a->{message} cmp $b->{message} } $objects->@*; + return $self->template('fortunes', { rows => $objects }); +} + +sub action_updates ($self) +{ + my $arr = $self->get_random_entries($self->req->query_param('queries')); + + foreach my $row ($arr->@*) { + $row->{randomNumber} = $self->random_number; + $self->database->update($row->@{qw(id randomNumber)}); + } + + return $arr; +}; + +1; + diff --git a/frameworks/Perl/kelp/lib/KelpBench/DBI.pm b/frameworks/Perl/kelp/lib/KelpBench/DBI.pm new file mode 100644 index 00000000000..15440bff07e --- /dev/null +++ b/frameworks/Perl/kelp/lib/KelpBench/DBI.pm @@ -0,0 +1,47 @@ +package KelpBench::DBI; + +use v5.36; +use Kelp::Base 'Kelp'; +use DBI; + +attr dbh => sub { + DBI->connect( + "dbi:MariaDB:database=hello_world;host=tfb-database;port=3306", + 'benchmarkdbuser', + 'benchmarkdbpass', + { RaiseError => 1, PrintError => 0 } + ); +}; + +attr _world => sub ($self) { + $self->dbh->prepare("SELECT * FROM World WHERE id = ?"); +}; + +attr _fortune => sub ($self) { + $self->dbh->prepare("SELECT * FROM Fortune"); +}; + +attr _update => sub ($self) { + $self->dbh->prepare("UPDATE World SET randomNumber = ? WHERE id = ?"); +}; + +sub random_number ($self, $id) +{ + $self->_world->execute($id); + return $self->_world->fetchrow_hashref; +} + +sub fortune ($self) +{ + $self->_fortune->execute(); + return $self->_fortune->fetchall_arrayref({}); +} + +sub update ($self, $id, $random_number) +{ + $self->_update->execute($random_number, $id); + return; +} + +1; + diff --git a/frameworks/Perl/kelp/lib/KelpBench/Mongo.pm b/frameworks/Perl/kelp/lib/KelpBench/Mongo.pm new file mode 100644 index 00000000000..3af50e54c12 --- /dev/null +++ b/frameworks/Perl/kelp/lib/KelpBench/Mongo.pm @@ -0,0 +1,43 @@ +package KelpBench::Mongo; + +use v5.36; +use Kelp::Base 'Kelp'; +use MongoDB; + +attr dbh => sub { + MongoDB::MongoClient->new( + host => 'tfb-database', + port => 27017 + )->get_database('hello_world'); +}; + +attr _world => sub ($self) { + $self->dbh->get_collection('world'); +}; + +attr _fortune => sub ($self) { + $self->dbh->get_collection('fortune'); +}; + +sub random_number ($self, $id) +{ + return $self->_world->find_one({ _id => $id }); +} + +sub fortune ($self) +{ + return [$self->_fortune->find->all]; +} + +sub update ($self, $id, $random_number) +{ + $self->_world->update_one( + { _id => $id }, + { '$set' => { randomNumber => $random_number } }, + ); + + return; +} + +1; + diff --git a/frameworks/Perl/kelp/run.pl b/frameworks/Perl/kelp/run.pl new file mode 100755 index 00000000000..b8436498f64 --- /dev/null +++ b/frameworks/Perl/kelp/run.pl @@ -0,0 +1,78 @@ +#!/usr/bin/env perl + +use v5.36; +use Data::Dumper; + +my $max_reqs = $ENV{MAX_REQS}; +my $test_name = $ENV{TEST_NAME}; +my $socket_file = $ENV{SOCKET_FILE}; +my $app_runner = 'app.psgi'; + +my $max_workers = `nproc`; +chomp $max_workers; + +my %runner_map = ( + gazelle => [ + 'start_server', + '--path' => $socket_file, + '--backlog' => 16384, + '--', + 'plackup', + '-E' => 'production', + '-s' => 'Gazelle', + '--max-workers' => $max_workers, + '--max-reqs-per-child' => $max_reqs, + '-a' => $app_runner, + ], + starman => [ + 'start_server', + '--backlog' => 16384, + '--', + 'plackup', + '-E' => 'production', + '-s' => 'Starman', + '-l' => $socket_file, + '--workers' => $max_workers, + '--max-requests' => $max_reqs, + '-a' => $app_runner, + ], + starlet => [ + 'start_server', + '--path' => $socket_file, + '--backlog' => 16384, + '--', + 'plackup', + '-E' => 'production', + '-s' => 'Starlet', + '--max-workers' => $max_workers, + '--max-reqs-per-child' => $max_reqs, + '-a' => $app_runner, + ], + # NOTE: twiggy does not play well with Server::Starter + # NOTE: twiggy couldn't pass update tests, so I disabled them + twiggy => [ + 'plackup', + '-E' => 'production', + '-s' => 'Twiggy::Prefork', + '-l' => $socket_file, + '--backlog' => 16384, + '--max-workers' => $max_workers, + '--max-reqs-per-child' => $max_reqs, + '-a' => $app_runner, + ], +); + +die "invalid test name $test_name" + unless $test_name =~ m{^kelp-(\w+)-(\w+)$}; + +die 'database mismatch' + unless $2 eq $ENV{DATABASE}; + +my $command = $runner_map{$1}; +die "invalid server $1" + unless $command; + +say 'Running command: ' . Dumper($command); + +exec @$command; + diff --git a/frameworks/Perl/kelp/t/main.t b/frameworks/Perl/kelp/t/main.t index 8d816c95324..a682ca112cf 100644 --- a/frameworks/Perl/kelp/t/main.t +++ b/frameworks/Perl/kelp/t/main.t @@ -1,56 +1,107 @@ -use strict; -use warnings; +use v5.36; use utf8; use Kelp::Test; use Test::More; use Test::Deep; use HTTP::Request::Common; +use KelpBench; -my $t = Kelp::Test->new( psgi => 'app.pl'); -my $world = { randomNumber => re(qr{^\d+$}), id => re(qr{^\d+$}) }; +# use mock to avoid the need for DB modules and actual running DB +# (however, we do not test for DB code correctness this way) +package DBMock { + use v5.36; + use utf8; -subtest 'json' => sub { - $t->request( GET '/json' )->json_cmp( { message => 'Hello, World!' } ); + use Kelp::Base; + + sub random_number ($self, $id) + { + return { + id => $id, + randomNumber => int(rand(10_000) + 1), + }; + } + + sub fortune ($self) + { + return [ + { + id => 1, + message => 'フレームワークのベンチマーク', + }, + { + id => 2, + message => '', + }, + { + id => 3, + message => '&&/\\+?', + }, + ]; + } + + sub update ($self, $id, $random_number) + { + return; + } }; +my $app = KelpBench->new(mode => 'test', database => DBMock->new); +my $t = Kelp::Test->new(app => $app); +my $world = { randomNumber => re(qr{^\d+$}), id => re(qr{^\d+$}) }; + subtest plaintext => sub { - $t->request( GET '/plaintext' ) - ->content_type_is('text/plain') - ->content_is('Hello, World!'); + my $uri = '/plaintext'; + + $t->request(GET $uri) + ->content_type_is('text/plain') + ->content_is('Hello, World!'); +}; + +subtest 'json' => sub { + my $uri = '/json'; + + $t->request(GET $uri) + ->json_cmp({ message => 'Hello, World!' }); }; subtest db => sub { - for my $uri (qw{/db /db/mongo}) { - $t->request( GET $uri )->json_cmp($world); - } + my $uri = '/db'; + + $t->request(GET $uri) + ->json_cmp($world); }; subtest queries => sub { - for my $uri (qw{/queries /queries/mongo}) { - $t->request( GET $uri )->json_cmp($world); - $t->request( GET "$uri?queries=3" ) - ->json_cmp( [ $world, $world, $world ] ); - $t->request( GET "$uri?queries=0" )->json_cmp($world); - } + my $uri = '/queries'; + + $t->request(GET $uri) + ->json_cmp([$world]); + $t->request(GET "$uri?queries=3") + ->json_cmp([$world, $world, $world]); + $t->request(GET "$uri?queries=0") + ->json_cmp([$world]); }; subtest update => sub { - for my $uri (qw{/update /update/mongo}) { - $t->request( GET $uri )->json_cmp([$world]); - $t->request( GET "$uri?queries=3" ) - ->json_cmp( [ $world, $world, $world ] ); - } + my $uri = '/updates'; + + $t->request(GET $uri) + ->json_cmp([$world]); + $t->request(GET "$uri?queries=3") + ->json_cmp([ $world, $world, $world ]); }; subtest fortunes => sub { - for my $uri (qw{/fortunes /fortunes/mongo}) { - $t->request( GET $uri ) - ->content_type_is('text/html') - ->content_like(qr{<script>}) - ->content_like(qr{フレームワークのベンチマーク}) - ->content_like(qr{Additional fortune added at request time.}); - } + my $uri = '/fortunes'; + + $t->request(GET $uri) + ->content_type_is('text/html') + ->content_like(qr{<script>}) + ->content_like(qr{フレームワークのベンチマーク}) + ->content_like(qr{Additional fortune added at request time.}); }; done_testing; + diff --git a/frameworks/Perl/kelp/views/fortunes.tt b/frameworks/Perl/kelp/views/fortunes.tt new file mode 100644 index 00000000000..9667485892f --- /dev/null +++ b/frameworks/Perl/kelp/views/fortunes.tt @@ -0,0 +1,22 @@ + + + + Fortunes + + + + + + + + + %% FOREACH row IN rows + + + + + %% END +
idmessage
[% row.id %][% row.message | html %]
+ + + From 33500e87c5e5892a027203d90176e4906816d3c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=B0=8F=E9=A9=AC?= <1417262058@qq.com> Date: Mon, 8 Jul 2024 23:28:23 +0800 Subject: [PATCH 0701/1766] Updating performance issues in the HServer framework. (#9119) 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 * Update pom.xml * Update StartApp.java --------- Co-authored-by: 黑小马 --- frameworks/Java/hserver/pom.xml | 2 +- .../Java/hserver/src/main/java/com/test/hserver/StartApp.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frameworks/Java/hserver/pom.xml b/frameworks/Java/hserver/pom.xml index 4e304e8caf9..b841cbd60ab 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -11,7 +11,7 @@ hserver-parent cn.hserver - 3.4.M2 + 3.5.M2 UTF-8 diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java index 87c5642d0b8..b4e215081da 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java @@ -13,8 +13,6 @@ public class StartApp { public static void main(String[] args) { - ConstConfig.bossPool = Runtime.getRuntime().availableProcessors()/2; - ConstConfig.workerPool = Runtime.getRuntime().availableProcessors(); HServerApplication.run(StartApp.class, 8888, args); } } From 9dffd6a7761897deb17ffb676e3500e4ac2ae4a3 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Mon, 8 Jul 2024 17:28:39 +0200 Subject: [PATCH 0702/1766] [java/vertx] Vert.x 4.5.8 bump + bunch of improvements (#9142) * Other contenders have clearly demonstrated that update benchmark performs better using a prepared statement with a aggregation of tuples instead of a postgres batch with a list of tuple. This change shamelessly borrows the SQL statement uwebsockets (thank you uwebsockets) with a small tweaks for the datatype. In other words UPDATE world SET randomNumber = update_data.randomNumber FROM (VALUES ($1::int,$2::int),...) AS update_data (id, randomNumber) WHERE world.id = update_data.id is superior (in this context) to a batch of UPDATE world SET randomnumber=$1 WHERE id=$2 * Use a single event-loop per CPU instead of the double. * Trim whitespace in rocker templates, shamelessly borrowed from Quarkus/Vertx benchmark. * Use a collecting query for fortunes that maps a row to a fortune instance which allocates a single row instance. This avoids allocating intermedary rows object when we map them to Fortune instances. Xerox tip: TFB Contenders using vertx-pg-client should copy this change to save some cycles. * Allocate a JsonArray of the right size for the query benchmark, avoid un-necessary string conversion in the generated JSON. * Avoid using Jackson databind that is actually not needed * Split reading/writing to the world table in two separate connections for the update benchmark, the hypothesis is that for the update benchmark first read then write to the World table, even though the write depends on the read, each change has a queue (the pipelined statements) and using two connections adds the operation to a queue with a smaller latency. This seems to give better results in my benchmark, let's see how this behaves out there. Xerox tip: TFB Contenders using vertx-pg-client should copy this change to save some cycles. * Bump Vert.x to 4.5.8 and its deps. --- frameworks/Java/vertx/pom.xml | 15 +- .../Java/vertx/src/main/java/vertx/App.java | 167 +++++++++++------- .../main/java/vertx/model/CachedWorld.java | 7 +- .../src/main/java/vertx/model/World.java | 7 +- .../src/main/java/vertx/model/WorldCache.java | 7 +- .../vertx/FortunesTemplate.rocker.html | 20 +-- 6 files changed, 132 insertions(+), 91 deletions(-) diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 12ef914a5c5..cdb3aa09f6a 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -10,10 +10,10 @@ 17 vertx.App - 4.5.3 - 2.15.0 - 4.1.92.Final - 0.0.21.Final + 4.5.8 + 2.16.1 + 4.1.110.Final + 0.0.25.Final @@ -32,11 +32,6 @@ jackson-core ${jackson.version}
- - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - io.netty netty-transport-native-kqueue @@ -91,7 +86,7 @@ 17 ${basedir}/src/main/templates ${basedir}/target/generated-sources/rocker - false + true true true true diff --git a/frameworks/Java/vertx/src/main/java/vertx/App.java b/frameworks/Java/vertx/src/main/java/vertx/App.java index 6d225d77d6c..5e81292d8ed 100755 --- a/frameworks/Java/vertx/src/main/java/vertx/App.java +++ b/frameworks/Java/vertx/src/main/java/vertx/App.java @@ -12,17 +12,11 @@ import io.vertx.core.http.HttpServerOptions; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerResponse; -import io.vertx.core.json.Json; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; -import io.vertx.sqlclient.PreparedQuery; -import io.vertx.sqlclient.PreparedStatement; -import io.vertx.sqlclient.Row; -import io.vertx.sqlclient.RowIterator; -import io.vertx.sqlclient.RowSet; -import io.vertx.sqlclient.Tuple; +import io.vertx.sqlclient.*; import io.vertx.sqlclient.impl.SqlClientInternal; import vertx.model.CachedWorld; import vertx.model.Fortune; @@ -41,7 +35,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; @@ -102,7 +95,8 @@ static int getQueries(HttpServerRequest request) { private static final String SELECT_WORLDS = "SELECT id, randomnumber from WORLD"; private HttpServer server; - private SqlClientInternal client; + private SqlClientInternal client1; + private SqlClientInternal client2; private CharSequence dateString; private CharSequence[] plaintextHeaders; @@ -110,8 +104,10 @@ static int getQueries(HttpServerRequest request) { private Throwable databaseErr; private PreparedQuery> SELECT_WORLD_QUERY; - private PreparedQuery> SELECT_FORTUNE_QUERY; + private PreparedQuery>> SELECT_FORTUNE_QUERY; private PreparedQuery> UPDATE_WORLD_QUERY; + @SuppressWarnings("unchecked") + private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[128]; private WorldCache WORLD_CACHE; public static CharSequence createDateHeader() { @@ -139,28 +135,67 @@ public void start(Promise startPromise) throws Exception { options.setPassword(config.getString("password", "benchmarkdbpass")); options.setCachePreparedStatements(true); options.setPipeliningLimit(100_000); // Large pipelining means less flushing and we use a single connection anyway - PgConnection.connect(vertx, options) + Future clientsInit = initClients(options); + clientsInit + .transform(ar -> { + databaseErr = ar.cause(); + return server.listen(port); + }) + .mapEmpty() + .onComplete(startPromise); + } + + private Future initClients(PgConnectOptions options) { + Future cf1 = PgConnection.connect(vertx, options) .flatMap(conn -> { - client = (SqlClientInternal) conn; + client1 = (SqlClientInternal) conn; + List> list = new ArrayList<>(); Future f1 = conn.prepare(SELECT_WORLD) .andThen(onSuccess(ps -> SELECT_WORLD_QUERY = ps.query())); + list.add(f1); Future f2 = conn.prepare(SELECT_FORTUNE) - .andThen(onSuccess(ps -> SELECT_FORTUNE_QUERY = ps.query())); - Future f3 = conn.prepare(UPDATE_WORLD) - .andThen(onSuccess(ps -> UPDATE_WORLD_QUERY = ps.query())); - Future f4 = conn.preparedQuery(SELECT_WORLDS) + .andThen(onSuccess(ps -> { + SELECT_FORTUNE_QUERY = ps.query(). + collecting(Collectors.mapping(row -> new Fortune(row.getInteger(0), row.getString(1)), Collectors.toList())); + })); + list.add(f2); + Future f3 = conn.preparedQuery(SELECT_WORLDS) .collecting(Collectors.mapping(row -> new CachedWorld(row.getInteger(0), row.getInteger(1)), Collectors.toList())) .execute() .map(worlds -> new WorldCache(worlds.value())) .andThen(onSuccess(wc -> WORLD_CACHE = wc)); - return CompositeFuture.join(f1, f2, f3, f4); - }) - .transform(ar -> { - databaseErr = ar.cause(); - return server.listen(port); - }) - .mapEmpty() - .onComplete(startPromise); + list.add(f3); + return Future.join(list); + }); + Future cf2 = PgConnection.connect(vertx, options) + .flatMap(conn -> { + client2 = (SqlClientInternal) conn; + List> list = new ArrayList<>(); + Future f1 = conn.prepare(UPDATE_WORLD) + .andThen(onSuccess(ps -> UPDATE_WORLD_QUERY = ps.query())); + list.add(f1); + for (int i = 0; i < AGGREGATED_UPDATE_WORLD_QUERY.length; i++) { + int idx = i; + Future fut = conn + .prepare(buildAggregatedUpdateQuery(1 + idx)) + .andThen(onSuccess(ps -> AGGREGATED_UPDATE_WORLD_QUERY[idx] = ps.query())); + list.add(fut); + } + return Future.join(list); + }); + return Future.join(cf1, cf2); + } + + private static String buildAggregatedUpdateQuery(int len) { + StringBuilder sb = new StringBuilder(); + sb.append("UPDATE world SET randomNumber = update_data.randomNumber FROM (VALUES"); + char sep = ' '; + for (int i = 1;i <= len;i++) { + sb.append(sep).append("($").append(2 * i - 1).append("::int,$").append(2 * i).append("::int)"); + sep = ','; + } + sb.append(") AS update_data (id, randomNumber) WHERE world.id = update_data.id"); + return sb.toString(); } private static Handler> onSuccess(Handler handler) { @@ -259,7 +294,7 @@ private void handleDb(HttpServerRequest req) { .putHeader(HttpHeaders.SERVER, SERVER) .putHeader(HttpHeaders.DATE, dateString) .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON) - .end(Json.encode(new World(row.getInteger(0), row.getInteger(1))), NULL_HANDLER); + .end(new World(row.getInteger(0), row.getInteger(1)).toBuffer(), NULL_HANDLER); } else { sendError(req, res.cause()); } @@ -269,19 +304,22 @@ private void handleDb(HttpServerRequest req) { class Queries implements Handler>> { boolean failed; - JsonArray worlds = new JsonArray(); + final JsonArray worlds; final HttpServerRequest req; final HttpServerResponse resp; final int queries; public Queries(HttpServerRequest req) { + int queries = getQueries(req); + this.req = req; this.resp = req.response(); - this.queries = getQueries(req); + this.queries = queries; + this.worlds = new JsonArray(new ArrayList<>(queries)); } private void handle() { - client.group(c -> { + client1.group(c -> { for (int i = 0; i < queries; i++) { c.preparedQuery(SELECT_WORLD).execute(Tuple.of(randomWorld()), this); } @@ -299,7 +337,7 @@ public void handle(AsyncResult> ar) { // we need a final reference final Tuple row = ar.result().iterator().next(); - worlds.add(new JsonObject().put("id", "" + row.getInteger(0)).put("randomNumber", "" + row.getInteger(1))); + worlds.add(new JsonObject().put("id", row.getInteger(0)).put("randomNumber", row.getInteger(1))); // stop condition if (worlds.size() == queries) { @@ -307,7 +345,7 @@ public void handle(AsyncResult> ar) { .putHeader(HttpHeaders.SERVER, SERVER) .putHeader(HttpHeaders.DATE, dateString) .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON) - .end(worlds.encode(), NULL_HANDLER); + .end(worlds.toBuffer(), NULL_HANDLER); } } } @@ -328,7 +366,7 @@ public Update(HttpServerRequest req) { private void handle() { - client.group(c -> { + client1.group(c -> { PreparedQuery> preparedQuery = c.preparedQuery(SELECT_WORLD); for (int i = 0; i < worlds.length; i++) { int id = randomWorld(); @@ -352,42 +390,53 @@ private void handle() { void handleUpdates() { Arrays.sort(worlds); - List batch = new ArrayList<>(); - for (World world : worlds) { - batch.add(Tuple.of(world.getRandomNumber(), world.getId())); - } - UPDATE_WORLD_QUERY.executeBatch(batch, ar2 -> { - if (ar2.failed()) { - sendError(req, ar2.cause()); - return; + int len = worlds.length; + if (0 < len && len <= AGGREGATED_UPDATE_WORLD_QUERY.length) { + List arguments = new ArrayList<>(); + for (World world : worlds) { + arguments.add(world.getId()); + arguments.add(world.getRandomNumber()); } - JsonArray json = new JsonArray(); + Tuple tuple = Tuple.tuple(arguments); + PreparedQuery> query = AGGREGATED_UPDATE_WORLD_QUERY[len - 1]; + query.execute(tuple, this::sendResponse); + } else { + List batch = new ArrayList<>(); for (World world : worlds) { - json.add(new JsonObject().put("id", "" + world.getId()).put("randomNumber", "" + world.getRandomNumber())); + batch.add(Tuple.of(world.getRandomNumber(), world.getId())); } - req.response() - .putHeader(HttpHeaders.SERVER, SERVER) - .putHeader(HttpHeaders.DATE, dateString) - .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON) - .end(json.toBuffer(), NULL_HANDLER); - }); + UPDATE_WORLD_QUERY.executeBatch(batch, this::sendResponse); + } } + + private void sendResponse(AsyncResult res) { + if (res.failed()) { + sendError(req, res.cause()); + return; + } + JsonArray json = new JsonArray(); + for (World world : worlds) { + json.add(world); + } + req.response() + .putHeader(HttpHeaders.SERVER, SERVER) + .putHeader(HttpHeaders.DATE, dateString) + .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON) + .end(json.toBuffer(), NULL_HANDLER); + } + } private void handleFortunes(HttpServerRequest req) { SELECT_FORTUNE_QUERY.execute(ar -> { HttpServerResponse response = req.response(); if (ar.succeeded()) { - List fortunes = new ArrayList<>(); - RowIterator resultSet = ar.result().iterator(); - if (!resultSet.hasNext()) { + SqlResult> result = ar.result(); + if (result.size() == 0) { response.setStatusCode(404).end("No results"); return; } - while (resultSet.hasNext()) { - Row row = resultSet.next(); - fortunes.add(new Fortune(row.getInteger(0), row.getString(1))); - } + List fortunes = result.value(); fortunes.add(new Fortune(0, "Additional fortune added at request time.")); Collections.sort(fortunes); response @@ -412,12 +461,8 @@ private void handleCaching(HttpServerRequest req) { } count = Math.max(1, count); count = Math.min(500, count); - CachedWorld[] worlds = WORLD_CACHE.getCachedWorld(count); - JsonArray json = new JsonArray(new ArrayList<>(count)); - for (int i = 0;i < count;i++) { - CachedWorld world = worlds[i]; - json.add(JsonObject.of("id", world.getId(), "randomNumber", world.getRandomNumber())); - } + List worlds = WORLD_CACHE.getCachedWorld(count); + JsonArray json = new JsonArray(worlds); HttpServerResponse response = req.response(); MultiMap headers = response.headers(); headers @@ -429,7 +474,7 @@ private void handleCaching(HttpServerRequest req) { public static void main(String[] args) throws Exception { - int eventLoopPoolSize = VertxOptions.DEFAULT_EVENT_LOOP_POOL_SIZE; + int eventLoopPoolSize = Runtime.getRuntime().availableProcessors(); String sizeProp = System.getProperty("vertx.eventLoopPoolSize"); if (sizeProp != null) { try { diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java b/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java index b369cc824da..f27e8805f33 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java @@ -1,9 +1,13 @@ package vertx.model; +import io.vertx.core.json.JsonObject; + +import java.util.Map; + /** * The model for the "world" database table. */ -public final class CachedWorld implements Comparable { +public final class CachedWorld extends JsonObject implements Comparable { private final int id; private final int randomNumber; @@ -15,6 +19,7 @@ public final class CachedWorld implements Comparable { * @param randomNumber the random number of the world */ public CachedWorld(int id, int randomNumber) { + super(Map.of("id", id, "randomNumber", randomNumber)); this.id = id; this.randomNumber = randomNumber; } diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/World.java b/frameworks/Java/vertx/src/main/java/vertx/model/World.java index e733b265d65..86f4d29e99b 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/World.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/World.java @@ -1,9 +1,13 @@ package vertx.model; +import io.vertx.core.json.JsonObject; + +import java.util.Map; + /** * The model for the "world" database table. */ -public final class World implements Comparable { +public final class World extends JsonObject implements Comparable { private final int id; private final int randomNumber; @@ -15,6 +19,7 @@ public final class World implements Comparable { * @param randomNumber the random number of the world */ public World(int id, int randomNumber) { + super(Map.of("id", id, "randomNumber", randomNumber)); this.id = id; this.randomNumber = randomNumber; } diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/WorldCache.java b/frameworks/Java/vertx/src/main/java/vertx/model/WorldCache.java index c4d4b150283..2b0d4ae869c 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/WorldCache.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/WorldCache.java @@ -3,6 +3,7 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.ThreadLocalRandom; @@ -19,12 +20,12 @@ public WorldCache(List worlds) { this.cache = cache; } - public CachedWorld[] getCachedWorld(int count) { - CachedWorld[] ret = new CachedWorld[count]; + public List getCachedWorld(int count) { + List ret = new ArrayList<>(count); ThreadLocalRandom current = ThreadLocalRandom.current(); for (int i = 0;i < count;i++) { Integer key = Integer.valueOf(current.nextInt(1000)); - ret[i] = cache.getIfPresent(key); + ret.add(cache.getIfPresent(key)); } return ret; } diff --git a/frameworks/Java/vertx/src/main/templates/vertx/FortunesTemplate.rocker.html b/frameworks/Java/vertx/src/main/templates/vertx/FortunesTemplate.rocker.html index 4a76266c344..8ceb4d68c7e 100644 --- a/frameworks/Java/vertx/src/main/templates/vertx/FortunesTemplate.rocker.html +++ b/frameworks/Java/vertx/src/main/templates/vertx/FortunesTemplate.rocker.html @@ -1,18 +1,8 @@ @import vertx.model.Fortune @import java.util.List @args(List fortunes) - - -Fortunes - - - - - - @for ((ForIterator i, Fortune fortune) : fortunes) { - - - - }
idmessage
@fortune.getId()@fortune.getMessage()
- - +Fortunes +@for ((ForIterator i, Fortune fortune) : fortunes) { + +} +
idmessage
@fortune.getId()@fortune.getMessage()
\ No newline at end of file From 82a228956c3aeebaa029b5464146330c0cab09c4 Mon Sep 17 00:00:00 2001 From: robert engels Date: Mon, 8 Jul 2024 10:29:46 -0500 Subject: [PATCH 0703/1766] optimized Java framework based on JDK supplied HTTP server (#9148) * dev environment * production * update README * update for latest httpserver --- frameworks/C++/libsniper/libs/core | 1 + frameworks/Java/httpserver-robaho/README.md | 32 ++++ .../httpserver-robaho/benchmark_config.json | 44 ++++++ frameworks/Java/httpserver-robaho/config.toml | 27 ++++ .../httpserver-robaho-postgres.dockerfile | 13 ++ .../httpserver-robaho.dockerfile | 13 ++ frameworks/Java/httpserver-robaho/pom.xml | 83 +++++++++++ .../src/main/java/benchmarks/Fortune.java | 25 ++++ .../src/main/java/benchmarks/Message.java | 26 ++++ .../src/main/java/benchmarks/Server.java | 139 ++++++++++++++++++ .../src/main/resources/fortunes.template.httl | 13 ++ 11 files changed, 416 insertions(+) create mode 160000 frameworks/C++/libsniper/libs/core create mode 100755 frameworks/Java/httpserver-robaho/README.md create mode 100755 frameworks/Java/httpserver-robaho/benchmark_config.json create mode 100644 frameworks/Java/httpserver-robaho/config.toml create mode 100644 frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile create mode 100644 frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile create mode 100644 frameworks/Java/httpserver-robaho/pom.xml create mode 100644 frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java create mode 100755 frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java create mode 100755 frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java create mode 100644 frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl diff --git a/frameworks/C++/libsniper/libs/core b/frameworks/C++/libsniper/libs/core new file mode 160000 index 00000000000..a792ecfebb0 --- /dev/null +++ b/frameworks/C++/libsniper/libs/core @@ -0,0 +1 @@ +Subproject commit a792ecfebb02f98bbdd8db232fba69f3f92907b3 diff --git a/frameworks/Java/httpserver-robaho/README.md b/frameworks/Java/httpserver-robaho/README.md new file mode 100755 index 00000000000..9317e30ce2d --- /dev/null +++ b/frameworks/Java/httpserver-robaho/README.md @@ -0,0 +1,32 @@ +# httpserver Benchmarking Test + +This is an alternative version of the [httpserver benchmarking test suite](../httpserver) + +Package [robaho.net.httpserver](https://github.com/robaho/httpserver) provides an implementation of `com.sun.net.httpserver` designed for virtual threads, thus requiring JDK21+. + +It can be used with platform threads using a `cached thread pool` which configures a thread per task, which is more efficient for a small number of clients (embedded systems). + +### Test Type Implementation Source Code + +* [JSON](src/main/java/benchmarks/Server.java) +* [Plaintext](src/main/java/benchmarks/Server.java) +* [Fortunes](src/main/java/benchmarks/Server.java) + +## Important Libraries +The tests were run with: +* [Jackson](https://github.com/FasterXML/jackson) +* [HikariCP](https://github.com/brettwooldridge/HikariCP) +* [HTTL](https://httl.github.io/en/) + +## Test URLs +### JSON + +http://localhost:8080/json + +### Plaintext + +http://localhost:8080/plaintext + +### Fortunes + +http://localhost:8080/fortunes diff --git a/frameworks/Java/httpserver-robaho/benchmark_config.json b/frameworks/Java/httpserver-robaho/benchmark_config.json new file mode 100755 index 00000000000..e3a66134723 --- /dev/null +++ b/frameworks/Java/httpserver-robaho/benchmark_config.json @@ -0,0 +1,44 @@ +{ + "framework": "httpserver-robaho", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "httpserver", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "httpserver-robaho", + "notes": "", + "versus": "" + }, + "postgres": { + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "None", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "httpserver", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "httpserver-robaho-postgres", + "notes": "", + "versus": "" + } + } + ] +} diff --git a/frameworks/Java/httpserver-robaho/config.toml b/frameworks/Java/httpserver-robaho/config.toml new file mode 100644 index 00000000000..e69305d162c --- /dev/null +++ b/frameworks/Java/httpserver-robaho/config.toml @@ -0,0 +1,27 @@ +[framework] +name = "httpserver-robaho" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "" + +[postgres] +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "" diff --git a/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile b/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile new file mode 100644 index 00000000000..858df742cc8 --- /dev/null +++ b/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile @@ -0,0 +1,13 @@ +FROM jelastic/maven:3.9.5-openjdk-21 as maven +WORKDIR /httpserver-robaho +COPY pom.xml pom.xml +COPY src src +RUN mvn compile assembly:single -q + +FROM openjdk:21-jdk-slim +WORKDIR /httpserver-robaho +COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-jar", "app.jar", "postgres"] diff --git a/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile b/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile new file mode 100644 index 00000000000..d02bada7709 --- /dev/null +++ b/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile @@ -0,0 +1,13 @@ +FROM jelastic/maven:3.9.5-openjdk-21 as maven +WORKDIR /httpserver-robaho +COPY pom.xml pom.xml +COPY src src +RUN mvn compile assembly:single -q + +FROM openjdk:21-jdk-slim +WORKDIR /httpserver-robaho +COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-jar", "app.jar"] diff --git a/frameworks/Java/httpserver-robaho/pom.xml b/frameworks/Java/httpserver-robaho/pom.xml new file mode 100644 index 00000000000..ce9dc2cd27e --- /dev/null +++ b/frameworks/Java/httpserver-robaho/pom.xml @@ -0,0 +1,83 @@ + + 4.0.0 + com.techempower + httpserver-robaho + 1.0 + jar + + UTF-8 + 21 + 21 + 21 + + + + com.googlecode.json-simple + json-simple + 1.1.1 + + + org.postgresql + postgresql + 42.7.2 + + + com.zaxxer + HikariCP + 3.3.1 + + + com.github.httl + httl + 1.0.11 + + + org.slf4j + slf4j-simple + 1.7.25 + + + io.github.robaho + httpserver + 1.0.6 + compile + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + false + + + + maven-assembly-plugin + 3.1.0 + + + + benchmarks.Server + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + diff --git a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java new file mode 100644 index 00000000000..2b420fb4764 --- /dev/null +++ b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java @@ -0,0 +1,25 @@ +package benchmarks; + +public class Fortune implements Comparable { + + private final int id; + private final String message; + + public Fortune(int id, String message) { + this.id = id; + this.message = message; + } + + public int getId() { + return id; + } + + public String getMessage() { + return message; + } + + @Override + public int compareTo(Fortune other) { + return message.compareTo(other.message); + } +} diff --git a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java new file mode 100755 index 00000000000..4c1ad6dc031 --- /dev/null +++ b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java @@ -0,0 +1,26 @@ +package benchmarks; + +import java.io.IOException; +import java.io.Writer; +import java.util.Map; + +import org.json.simple.JSONStreamAware; +import org.json.simple.JSONValue; + +public class Message implements JSONStreamAware { + + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + @Override + public void writeJSONString(Writer out) throws IOException { + JSONValue.writeJSONString(Map.of("message",message), out); + } +} diff --git a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java new file mode 100755 index 00000000000..338200488d0 --- /dev/null +++ b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java @@ -0,0 +1,139 @@ +package benchmarks; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.net.InetSocketAddress; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executors; + +import javax.sql.DataSource; + +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import httl.Engine; +import httl.Template; + +public class Server { + + private static final String HELLO_TEXT = "Hello, World!"; + private static final byte[] HELLO_BYTES = HELLO_TEXT.getBytes(); + private static final int HELLO_LENGTH = HELLO_BYTES.length; + private static final String SERVER_NAME = "httpserver-robaho"; + + private static List queryFortunes(DataSource ds) throws SQLException { + List fortunes = new ArrayList<>(); + try (Connection conn = ds.getConnection(); + PreparedStatement statement = conn.prepareStatement("SELECT id, message FROM fortune"); + ResultSet resultSet = statement.executeQuery()) { + while (resultSet.next()) + fortunes.add(new Fortune(resultSet.getInt(1), resultSet.getString(2))); + } + return fortunes; + } + + private static DataSource createPostgresDataSource() throws ClassNotFoundException { + Class.forName("org.postgresql.Driver"); + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world"); + config.setUsername("benchmarkdbuser"); + config.setPassword("benchmarkdbpass"); + config.setMaximumPoolSize(512); + return new HikariDataSource(config); + } + + private static Template loadTemplate(String filename) throws IOException, ParseException { + Properties props = new Properties(); + props.put("import.packages", "java.util," + Fortune.class.getPackage().getName()); + props.put("input.encoding", "UTF-8"); + props.put("output.encoding", "UTF-8"); + props.put("precompiled", "false"); + Engine engine = Engine.getEngine(props); + return engine.getTemplate(filename); + } + + private static HttpHandler createPlaintextHandler() { + return t -> { + t.getResponseHeaders().add("Content-Type", "text/plain"); + t.getResponseHeaders().add("Server", SERVER_NAME); + t.sendResponseHeaders(200, HELLO_LENGTH); + t.getResponseBody().write(HELLO_BYTES); + t.getResponseBody().close(); + }; + } + + private static HttpHandler createJSONHandler() { + return t -> { + Message m = new Message(HELLO_TEXT); + t.getResponseHeaders().add("Content-Type", "application/json"); + t.getResponseHeaders().add("Server", SERVER_NAME); + var bos = new ByteArrayOutputStream(); + OutputStreamWriter w = new OutputStreamWriter(bos); + m.writeJSONString(w); + w.flush(); + t.sendResponseHeaders(200, bos.size()); + bos.writeTo(t.getResponseBody()); + t.getResponseBody().close(); + }; + } + + private static HttpHandler createFortunesHandler(DataSource ds) throws IOException, ParseException { + Template template = loadTemplate("/fortunes.template.httl"); + return t -> { + try { + // query db + List fortunes = queryFortunes(ds); + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + Collections.sort(fortunes); + // render template + Map context = new HashMap<>(1); + context.put("fortunes", fortunes); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + template.render(context, out); + byte[] bytes = out.toByteArray(); + // send response + t.getResponseHeaders().add("Content-Type", "text/html; charset=utf-8"); + t.getResponseHeaders().add("Server", SERVER_NAME); + t.sendResponseHeaders(200, bytes.length); + t.getResponseBody().write(bytes); + t.getResponseBody().close(); + } catch (SQLException | ParseException e) { + throw new IOException(e); + } + }; + } + + public static void main(String[] args) throws Exception { + // parse arguments + String settings = args.length > 0 ? args[0] : ""; + int port = args.length > 1 ? Integer.parseInt(args[1]) : 8080; + if (settings.contains("debug")) + System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "DEBUG"); + // create server + HttpServer server = HttpServer.create(new InetSocketAddress(port), 1024 * 8); + server.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); + // server.setExecutor(Executors.newCachedThreadPool()); + // add context handlers + server.createContext("/plaintext", createPlaintextHandler()); + server.createContext("/json", createJSONHandler()); + if (settings.contains("postgres")) { + DataSource ds = createPostgresDataSource(); + server.createContext("/fortunes", createFortunesHandler(ds)); + } + // start server + server.start(); + } +} diff --git a/frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl b/frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl new file mode 100644 index 00000000000..4d87b47658a --- /dev/null +++ b/frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl @@ -0,0 +1,13 @@ + + + +Fortunes + + + + + + +
idmessage
${fortune.id}${fortune.message}
+ + From e9e401d678462395e1788a704e240d36279a0a08 Mon Sep 17 00:00:00 2001 From: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> Date: Mon, 8 Jul 2024 17:37:25 +0200 Subject: [PATCH 0704/1766] uWS.js is Platform (#9058) --- frameworks/JavaScript/uwebsockets.js/benchmark_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/uwebsockets.js/benchmark_config.json b/frameworks/JavaScript/uwebsockets.js/benchmark_config.json index c19862c849e..fee055f341a 100644 --- a/frameworks/JavaScript/uwebsockets.js/benchmark_config.json +++ b/frameworks/JavaScript/uwebsockets.js/benchmark_config.json @@ -4,7 +4,7 @@ { "default": { "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "database": "None", "database_os": "Linux", "display_name": "uWebSockets.js", From 8cad8194b9937da46411e3f7a67b18201cccd867 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 8 Jul 2024 17:40:29 +0200 Subject: [PATCH 0705/1766] [ruby] Use relative path to jemalloc (#9030) This makes sure it works on m1/m2 architecture as well. Linux is capable of resolving the path to the library. --- frameworks/Ruby/agoo/agoo.dockerfile | 2 +- frameworks/Ruby/grape/grape-unicorn.dockerfile | 5 +++++ frameworks/Ruby/grape/grape.dockerfile | 5 +++++ frameworks/Ruby/hanami/hanami.dockerfile | 2 +- .../Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile | 2 +- .../rack-sequel-postgres-passenger-mri.dockerfile | 2 +- .../rack-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../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/rack-falcon.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 2 +- frameworks/Ruby/rack/rack.dockerfile | 7 ++++++- frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 2 +- .../Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile | 2 +- .../roda-sequel-postgres-passenger-mri.dockerfile | 2 +- .../roda-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../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 +- .../Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile | 5 +++++ .../sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile | 5 +++++ .../sinatra-sequel-postgres-passenger-mri.dockerfile | 5 +++++ .../sinatra-sequel-postgres-unicorn-mri.dockerfile | 5 +++++ .../Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile | 5 +++++ .../sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile | 5 +++++ frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 5 +++++ 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 +- 34 files changed, 75 insertions(+), 25 deletions(-) diff --git a/frameworks/Ruby/agoo/agoo.dockerfile b/frameworks/Ruby/agoo/agoo.dockerfile index bb4e363b687..c8c08141281 100644 --- a/frameworks/Ruby/agoo/agoo.dockerfile +++ b/frameworks/Ruby/agoo/agoo.dockerfile @@ -11,7 +11,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack diff --git a/frameworks/Ruby/grape/grape-unicorn.dockerfile b/frameworks/Ruby/grape/grape-unicorn.dockerfile index 3cc4c7d2d37..f805021f71e 100644 --- a/frameworks/Ruby/grape/grape-unicorn.dockerfile +++ b/frameworks/Ruby/grape/grape-unicorn.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + RUN apt-get update -yqq && apt-get install -yqq nginx ADD ./ /grape diff --git a/frameworks/Ruby/grape/grape.dockerfile b/frameworks/Ruby/grape/grape.dockerfile index 5beaf426ddd..99898d43e65 100644 --- a/frameworks/Ruby/grape/grape.dockerfile +++ b/frameworks/Ruby/grape/grape.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /grape WORKDIR /grape diff --git a/frameworks/Ruby/hanami/hanami.dockerfile b/frameworks/Ruby/hanami/hanami.dockerfile index 01972160167..6ba8e69f3e6 100644 --- a/frameworks/Ruby/hanami/hanami.dockerfile +++ b/frameworks/Ruby/hanami/hanami.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /hanami diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index 7b82353185d..9482a004540 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile @@ -9,7 +9,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile 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 78053b6f376..2765c0c4f89 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile @@ -9,7 +9,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile 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 a3aca7b79bc..37ce2662e7b 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile @@ -9,7 +9,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index 8033d74c31a..37634239c37 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile @@ -9,7 +9,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile index 6df05c0c2b6..67ef3768e71 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile @@ -9,7 +9,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index 470d92aa4b3..2c7ee155a56 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -9,7 +9,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index ef5a63a10e7..f6ba1a106a2 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index bc4807e5427..8609febfd7b 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 5b51b2ef1e0..e40bfced37a 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -1,12 +1,17 @@ FROM ruby:3.4-rc -ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + WORKDIR /rack COPY Gemfile ./ +ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set without 'development test' RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index a93f26b52da..ae512cbdafd 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -10,7 +10,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 9d75f7d359e..99c16e935bb 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -9,7 +9,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile index 0af00a72d36..e25f21e20d9 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile @@ -8,7 +8,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 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 a24b9881d00..b3f87e9c742 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile @@ -8,7 +8,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 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 3cde40eaa97..4865d5feebd 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile @@ -8,7 +8,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile index c74c9b9f0d3..d71a4b28a78 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile @@ -8,7 +8,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile index cda64c5c29b..d0cd81077bb 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile @@ -8,7 +8,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index efa9d35597e..382f31291a1 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -8,7 +8,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile index 4fe264d4cb6..942d363b75c 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile index fe497718534..39bd11758da 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel 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 74defc8326e..5651c491808 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel 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 939eb97fce5..4d03257046a 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index ab54544763d..77a2801d16d 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile index 78e45656c51..c3e2bc7de13 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index e36c111221c..80198c299ab 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -2,6 +2,11 @@ FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel diff --git a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile index df0ddd1fa46..eb07d7b5ba7 100644 --- a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile index 0ad6b16252b..2a09b22aeba 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile index a38a0456218..027a5593040 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 69ec07037dd..6258ac08c7d 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile index 76ca52267f1..f0dede838aa 100644 --- a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 85fe69e9b73..8e204def810 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -5,7 +5,7 @@ ENV RUBY_YJIT_ENABLE=1 # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 +ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra From 158bd471ded84bb53c0b258601d32d7b4b4cd9fe Mon Sep 17 00:00:00 2001 From: Nathan Ortega Date: Mon, 8 Jul 2024 11:49:32 -0400 Subject: [PATCH 0706/1766] [New Framework]: Oxygen.jl (#8789) * added Oxygen.jl example with /plaintext and /json tests * renamed framework from oxygen-jl to oxygen * renamed top level directory to match framework name * updated readme --- frameworks/Julia/oxygen/README.md | 21 +++++++++++++++ frameworks/Julia/oxygen/benchmark_config.json | 26 +++++++++++++++++++ frameworks/Julia/oxygen/oxygen.dockerfile | 8 ++++++ frameworks/Julia/oxygen/src/Project.toml | 4 +++ frameworks/Julia/oxygen/src/server.jl | 23 ++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100755 frameworks/Julia/oxygen/README.md create mode 100755 frameworks/Julia/oxygen/benchmark_config.json create mode 100644 frameworks/Julia/oxygen/oxygen.dockerfile create mode 100644 frameworks/Julia/oxygen/src/Project.toml create mode 100644 frameworks/Julia/oxygen/src/server.jl diff --git a/frameworks/Julia/oxygen/README.md b/frameworks/Julia/oxygen/README.md new file mode 100755 index 00000000000..5b7ac109195 --- /dev/null +++ b/frameworks/Julia/oxygen/README.md @@ -0,0 +1,21 @@ +# Oxygen.jl Benchmarking Test + +Oxygen is a micro-framework built on top of the HTTP.jl library and comes with helpful utilities to quickly setup and run web applications in Julia. + +### Test Type Implementation Source Code + +* [JSON](Relative/Path/To/Your/Source/File) +* [PLAINTEXT](Relative/Path/To/Your/Source/File) + +## Important Libraries +The tests were run with: +* [Oxygen.jl](https://github.com/OxygenFramework/Oxygen.jl) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Julia/oxygen/benchmark_config.json b/frameworks/Julia/oxygen/benchmark_config.json new file mode 100755 index 00000000000..e998bb13773 --- /dev/null +++ b/frameworks/Julia/oxygen/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "oxygen", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "None", + "database": "None", + "framework": "Oxygen.jl", + "language": "Julia", + "orm": "None", + "platform": "None", + "webserver": "Oxygen.jl", + "os": "Linux", + "database_os": "Linux", + "display_name": "Oxygen.jl", + "notes": "", + "versus": "", + "tags": [] + } + } + ] +} \ No newline at end of file diff --git a/frameworks/Julia/oxygen/oxygen.dockerfile b/frameworks/Julia/oxygen/oxygen.dockerfile new file mode 100644 index 00000000000..df34f0a4b38 --- /dev/null +++ b/frameworks/Julia/oxygen/oxygen.dockerfile @@ -0,0 +1,8 @@ +FROM julia:latest + +WORKDIR /app +COPY ./src ./ +RUN julia --project -e 'using Pkg; Pkg.instantiate()' + +EXPOSE 8080 +CMD julia -t 2 --project server.jl \ No newline at end of file diff --git a/frameworks/Julia/oxygen/src/Project.toml b/frameworks/Julia/oxygen/src/Project.toml new file mode 100644 index 00000000000..dbe190679c2 --- /dev/null +++ b/frameworks/Julia/oxygen/src/Project.toml @@ -0,0 +1,4 @@ +[deps] +Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +Oxygen = "df9a0d86-3283-4920-82dc-4555fc0d1d8b" diff --git a/frameworks/Julia/oxygen/src/server.jl b/frameworks/Julia/oxygen/src/server.jl new file mode 100644 index 00000000000..e88c1669472 --- /dev/null +++ b/frameworks/Julia/oxygen/src/server.jl @@ -0,0 +1,23 @@ + +using Oxygen +using Dates +using HTTP + +@get "/json" function() + return json(("message" => "Hello, World!")) +end + +@get "/plaintext" function() + return text("Hello, World!") +end + +function HeaderMiddleware(handle::Function) + function(req::HTTP.Request) + response = handle(req) + HTTP.setheader(response, "Server" => "Julia-Oxygen") + HTTP.setheader(response, "Date" => Dates.format(Dates.now(), Dates.RFC1123Format) * " GMT") + return response + end +end + +serveparallel(host="0.0.0.0", port=8080, middleware=[HeaderMiddleware], access_log=nothing, metrics=false, docs=false) \ No newline at end of file From 31ca740439ca9ebe3e80d72818421e0cffea647f Mon Sep 17 00:00:00 2001 From: Shagit Ziganshin <3687591+theLastOfCats@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:28:30 +0300 Subject: [PATCH 0707/1766] [swift|vapor] Added Vapor+Swifql+Ikiga (#9146) * Added Vapor+Swifql+Ikiga (cherry picked from commit cf1fc17c508024927d35ca5da15aab1fa85d20ad) * Fixes so everything compiles * Another attempt at fixes * Removed unsupported @retroactive * Added db benchmark * FoundationEssentials JSON Coders support * Added everything else * Remove ikiga * remove FoundationPreview due to bug https://github.com/apple/swift-foundation/issues/715 * fix db hostname * fix fortune template * last fixes * fixed resources * hb2 compiles successfully * hb2-postgres compiles --------- Co-authored-by: Shagit Ziganshin Co-authored-by: Yakov Shapovalov --- .../Controllers/FortunesController.swift | 2 +- .../src-postgres/Sources/server/main.swift | 11 +- .../src/Sources/server/main.swift | 11 +- frameworks/Swift/vapor/benchmark_config.json | 23 ++++ frameworks/Swift/vapor/config.toml | 17 +++ .../Swift/vapor/vapor-swifql.dockerfile | 30 ++++ .../Swift/vapor/vapor-swifql/.dockerignore | 2 + .../Swift/vapor/vapor-swifql/.gitignore | 14 ++ .../Swift/vapor/vapor-swifql/Package.swift | 46 +++++++ .../vapor-swifql/Resources/Views/fortune.leaf | 10 ++ .../IkigaJSONCoders+ContentCoders.swift | 56 ++++++++ .../Sources/Extensions/Models+Content.swift | 11 ++ .../Sources/Extensions/Utils.swift | 18 +++ .../vapor-swifql/Sources/Models/Fortune.swift | 17 +++ .../vapor-swifql/Sources/Models/World.swift | 11 ++ .../vapor-swifql/Sources/configure.swift | 128 ++++++++++++++++++ .../vapor/vapor-swifql/Sources/main.swift | 16 +++ 17 files changed, 418 insertions(+), 5 deletions(-) create mode 100644 frameworks/Swift/vapor/vapor-swifql.dockerfile create mode 100644 frameworks/Swift/vapor/vapor-swifql/.dockerignore create mode 100644 frameworks/Swift/vapor/vapor-swifql/.gitignore create mode 100644 frameworks/Swift/vapor/vapor-swifql/Package.swift create mode 100644 frameworks/Swift/vapor/vapor-swifql/Resources/Views/fortune.leaf create mode 100644 frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/IkigaJSONCoders+ContentCoders.swift create mode 100644 frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Models+Content.swift create mode 100644 frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Utils.swift create mode 100644 frameworks/Swift/vapor/vapor-swifql/Sources/Models/Fortune.swift create mode 100644 frameworks/Swift/vapor/vapor-swifql/Sources/Models/World.swift create mode 100644 frameworks/Swift/vapor/vapor-swifql/Sources/configure.swift create mode 100644 frameworks/Swift/vapor/vapor-swifql/Sources/main.swift diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift index 159901dda40..cd8012c6d26 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift @@ -4,7 +4,7 @@ import PostgresNIO struct HTML: ResponseGenerator, Sendable { let html: String - public func response(from request: Request, context: some BaseRequestContext) -> Response { + public func response(from request: Request, context: some RequestContext) -> Response { let buffer = context.allocator.buffer(string: html) return Response(status: .ok, headers: [.contentType: "text/html; charset=utf-8"], body: .init(byteBuffer: buffer)) } diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift index 65e360bfab3..772a52a5430 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift @@ -1,3 +1,4 @@ +import Foundation import Hummingbird import PostgresNIO @@ -15,15 +16,21 @@ struct TechFrameworkRequestContext: RequestContext { static let jsonEncoder = JSONEncoder() static let jsonDecoder = JSONDecoder() - var coreContext: Hummingbird.CoreRequestContext + var coreContext: Hummingbird.CoreRequestContextStorage // Use a global JSON Encoder var responseEncoder: JSONEncoder { Self.jsonEncoder } // Use a global JSON Decoder var requestDecoder: JSONDecoder { Self.jsonDecoder } + init(source: ApplicationRequestContextSource) { + self.init(channel: source.channel, logger: source.logger) + } + init(channel: any Channel, logger: Logger) { - self.coreContext = .init(allocator: channel.allocator, logger: logger) + self.coreContext = CoreRequestContextStorage( + source: ApplicationRequestContextSource(channel: channel, logger: logger) + ) } } diff --git a/frameworks/Swift/hummingbird2/src/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src/Sources/server/main.swift index f652046a166..365b9a6a58f 100644 --- a/frameworks/Swift/hummingbird2/src/Sources/server/main.swift +++ b/frameworks/Swift/hummingbird2/src/Sources/server/main.swift @@ -1,4 +1,6 @@ +import Foundation import Hummingbird +import HummingbirdCore import Logging import NIOCore @@ -7,18 +9,23 @@ struct Object: ResponseEncodable { } struct TechFrameworkRequestContext: RequestContext { + static let jsonEncoder = JSONEncoder() static let jsonDecoder = JSONDecoder() - var coreContext: Hummingbird.CoreRequestContext + var coreContext: Hummingbird.CoreRequestContextStorage // Use a global JSON Encoder var responseEncoder: JSONEncoder { Self.jsonEncoder } // Use a global JSON Decoder var requestDecoder: JSONDecoder { Self.jsonDecoder } + init(source: Hummingbird.ApplicationRequestContextSource) { + self.coreContext = CoreRequestContextStorage(source: ApplicationRequestContextSource(channel: source.channel, logger: source.logger)) + } + init(channel: any Channel, logger: Logger) { - self.coreContext = .init(allocator: channel.allocator, logger: logger) + self.coreContext = CoreRequestContextStorage(source: ApplicationRequestContextSource(channel: channel, logger: logger)) } } diff --git a/frameworks/Swift/vapor/benchmark_config.json b/frameworks/Swift/vapor/benchmark_config.json index 1bd0d8e2242..00b6bb943dc 100755 --- a/frameworks/Swift/vapor/benchmark_config.json +++ b/frameworks/Swift/vapor/benchmark_config.json @@ -93,6 +93,29 @@ "display_name": "Vapor", "notes": "", "versus": "None" + }, + "swifql": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "database": "Postgres", + "orm": "Micro", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "framework": "Vapor", + "language": "Swift", + "flavor": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Vapor", + "notes": "", + "versus": "None" } }] } diff --git a/frameworks/Swift/vapor/config.toml b/frameworks/Swift/vapor/config.toml index e629702ef66..24db8e89c90 100644 --- a/frameworks/Swift/vapor/config.toml +++ b/frameworks/Swift/vapor/config.toml @@ -51,3 +51,20 @@ orm = "Micro" platform = "None" webserver = "None" versus = "None" + +[swifql] +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 = "Micro" +platform = "None" +webserver = "None" +versus = "None" \ No newline at end of file diff --git a/frameworks/Swift/vapor/vapor-swifql.dockerfile b/frameworks/Swift/vapor/vapor-swifql.dockerfile new file mode 100644 index 00000000000..d39373d63a6 --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql.dockerfile @@ -0,0 +1,30 @@ +# ================================ +# Build image +# ================================ +FROM swift:5.10 as build +WORKDIR /build + +# Copy entire repo into container +COPY ./vapor-swifql . + +# Compile with optimizations +RUN swift build \ + -c release \ + -Xswiftc -enforce-exclusivity=unchecked + +# ================================ +# Run image +# ================================ +FROM swift:5.10-slim +WORKDIR /run + +# Copy build artifacts +COPY --from=build /build/.build/release /run +COPY ./vapor-swifql/Resources/Views/fortune.leaf /run/Resources/Views/fortune.leaf + +# Copy Swift runtime libraries +COPY --from=build /usr/lib/swift/ /usr/lib/swift/ + +EXPOSE 8080 + +ENTRYPOINT ["./app", "serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"] diff --git a/frameworks/Swift/vapor/vapor-swifql/.dockerignore b/frameworks/Swift/vapor/vapor-swifql/.dockerignore new file mode 100644 index 00000000000..2d9f16e2d27 --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/.dockerignore @@ -0,0 +1,2 @@ +.build/ +.swiftpm/ diff --git a/frameworks/Swift/vapor/vapor-swifql/.gitignore b/frameworks/Swift/vapor/vapor-swifql/.gitignore new file mode 100644 index 00000000000..1f4d514fd4c --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/.gitignore @@ -0,0 +1,14 @@ +Packages +.build +xcuserdata +*.xcodeproj +DerivedData/ +.DS_Store +db.sqlite +.swiftpm +.env +.env.* +! .env.example +.vscode +docker-compose.yml +Dockerfile \ No newline at end of file diff --git a/frameworks/Swift/vapor/vapor-swifql/Package.swift b/frameworks/Swift/vapor/vapor-swifql/Package.swift new file mode 100644 index 00000000000..43d9104cecd --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/Package.swift @@ -0,0 +1,46 @@ +// swift-tools-version:5.10 + +import PackageDescription + +let package = Package( + name: "vapor-swifql-ikiga", + platforms: [ + .macOS(.v12) + ], + products: [ + .executable(name: "app", targets: ["App"]) + ], + dependencies: [ + // 💧 A server-side Swift web framework. + .package(url: "https://github.com/vapor/vapor.git", from: "4.99.3"), + .package(url: "https://github.com/vapor/leaf.git", from: "4.0.0"), + // 🔵 Non-blocking, event-driven networking for Swift. Used for custom executors + .package(url: "https://github.com/apple/swift-nio.git", from: "2.65.0"), + // json encoder/decoder + .package(url: "https://github.com/orlandos-nl/IkigaJSON.git", from: "2.0.0"), + // sql builder + .package(url: "https://github.com/SwifQL/VaporBridges.git", from: "1.0.0-rc"), + .package(url: "https://github.com/SwifQL/PostgresBridge.git", from: "1.0.0-rc"), + ], + targets: [ + .executableTarget( + name: "App", + dependencies: [ + .product(name: "Vapor", package: "vapor"), + .product(name: "Leaf", package: "leaf"), + .product(name: "NIOCore", package: "swift-nio"), + .product(name: "NIOPosix", package: "swift-nio"), + .product(name: "VaporBridges", package: "VaporBridges"), + .product(name: "PostgresBridge", package: "PostgresBridge"), + .product(name: "IkigaJSON", package: "IkigaJSON"), + ], + swiftSettings: swiftSettings + ) + ] +) + +var swiftSettings: [SwiftSetting] { [ + .enableUpcomingFeature("DisableOutwardActorInference"), + .enableExperimentalFeature("StrictConcurrency"), + .unsafeFlags(["-parse-as-library"]), +] } diff --git a/frameworks/Swift/vapor/vapor-swifql/Resources/Views/fortune.leaf b/frameworks/Swift/vapor/vapor-swifql/Resources/Views/fortune.leaf new file mode 100644 index 00000000000..020d76adc92 --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/Resources/Views/fortune.leaf @@ -0,0 +1,10 @@ + + +Fortunes + + + +#for(fortune in fortunes): +#endfor
idmessage
#(fortune.id)#(fortune.message)
+ + \ No newline at end of file diff --git a/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/IkigaJSONCoders+ContentCoders.swift b/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/IkigaJSONCoders+ContentCoders.swift new file mode 100644 index 00000000000..676ff7285b6 --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/IkigaJSONCoders+ContentCoders.swift @@ -0,0 +1,56 @@ +// +// IkigaJSONCoders+ContentCoders.swift +// +// +// Created by Yakov Shapovalov on 04.07.2024. +// + +import IkigaJSON +import Vapor + +extension IkigaJSONEncoder: ContentEncoder { + public func encode( + _ encodable: E, + to body: inout ByteBuffer, + headers: inout HTTPHeaders + ) throws { + headers.contentType = .json + try self.encodeAndWrite(encodable, into: &body) + } + + public func encode(_ encodable: E, to body: inout ByteBuffer, headers: inout HTTPHeaders, userInfo: [CodingUserInfoKey : Sendable]) throws where E : Encodable { + var encoder = self + encoder.userInfo = userInfo + headers.contentType = .json + try encoder.encodeAndWrite(encodable, into: &body) + } + + public func encode(_ encodable: E, to body: inout ByteBuffer, headers: inout HTTPHeaders, userInfo: [CodingUserInfoKey : Any]) throws where E : Encodable { + var encoder = self + encoder.userInfo = userInfo + headers.contentType = .json + try encoder.encodeAndWrite(encodable, into: &body) + } +} + +extension IkigaJSONDecoder: ContentDecoder { + public func decode( + _ decodable: D.Type, + from body: ByteBuffer, + headers: HTTPHeaders + ) throws -> D { + return try self.decode(D.self, from: body) + } + + public func decode(_ decodable: D.Type, from body: ByteBuffer, headers: HTTPHeaders, userInfo: [CodingUserInfoKey : Sendable]) throws -> D where D : Decodable { + let decoder = IkigaJSONDecoder(settings: settings) + decoder.settings.userInfo = userInfo + return try decoder.decode(D.self, from: body) + } + + public func decode(_ decodable: D.Type, from body: ByteBuffer, headers: HTTPHeaders, userInfo: [CodingUserInfoKey : Any]) throws -> D where D : Decodable { + let decoder = IkigaJSONDecoder(settings: settings) + decoder.settings.userInfo = userInfo + return try decoder.decode(D.self, from: body) + } +} diff --git a/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Models+Content.swift b/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Models+Content.swift new file mode 100644 index 00000000000..8fdae4b378f --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Models+Content.swift @@ -0,0 +1,11 @@ +// +// Models+Content.swift +// +// +// Created by Yakov Shapovalov on 04.07.2024. +// + +import Vapor + +extension World: Content {} +extension Fortune: Content {} diff --git a/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Utils.swift b/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Utils.swift new file mode 100644 index 00000000000..d370b15e291 --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/Sources/Extensions/Utils.swift @@ -0,0 +1,18 @@ +extension Int { + func bounded(to range: ClosedRange) -> Int { + switch self { + case ...range.lowerBound: + return range.lowerBound + case range.upperBound...: + return range.upperBound + default: + return self + } + } +} + +extension Int: Sequence { + public func makeIterator() -> CountableRange.Iterator { + return (0.. World in + guard let world: World = try await req.postgres.connection(to: .Db, { conn in + World.select + .where(\World.$id == Int.random(in: 1...10_000)) + .execute(on: conn) + .first(decoding: World.self) + }).get() else { + throw Abort(.notFound) + } + return world + } + + app.get("queries") { req async throws -> [World] in + let queries: Int = (req.query["queries"] ?? 1).bounded(to: 1...500) + + var worlds: [World] = [] + + for _ in queries { + guard let world: World = try await req.postgres.connection(to: .Db, { conn in + World.select + .where(\World.$id == Int.random(in: 1...10_000)) + .execute(on: conn) + .first(decoding: World.self) + }).get() else { + throw Abort(.notFound) + } + + worlds.append(world) + } + return worlds + } + + app.get("updates") { req async throws -> [World] in + let queries = (req.query["queries"] ?? 1).bounded(to: 1...500) + + var worlds: [World] = [] + + for _ in queries { + let world = try await req.postgres.connection(to: .Db, { conn in + World.select.where(\World.$id == Int.random(in: 1...10_000)).execute(on: conn).first(decoding: World.self).flatMap { world in + world!.randomnumber = .random(in: 1...10_000) + return world!.update(on: \.$id, on: conn) + } + }).get() + + worlds.append(world) + } + + return worlds + + } + + app.get("fortunes") { req async throws -> View in + var fortunes: [Fortune] = try await req.postgres.connection(to: .Db, {conn in + Fortune.select.execute(on: conn).all(decoding: Fortune.self) + }) + .get() + + fortunes.append(Fortune(id: 0, message: "Additional fortune added at request time.")) + + fortunes.sort(by: { + $0.message < $1.message + }) + + return try await req.view.render("fortune", ["fortunes": fortunes]) + } +} + diff --git a/frameworks/Swift/vapor/vapor-swifql/Sources/main.swift b/frameworks/Swift/vapor/vapor-swifql/Sources/main.swift new file mode 100644 index 00000000000..81feddfbc02 --- /dev/null +++ b/frameworks/Swift/vapor/vapor-swifql/Sources/main.swift @@ -0,0 +1,16 @@ +import Vapor +import PostgresBridge +import Logging + +@main +enum App { + static func main() throws { + var env = try Environment.detect() + try LoggingSystem.bootstrap(from: &env) + + let app = Application(env) + defer { app.shutdown() } + + try configure(app) + } +} From 3a6fcdbbb38025e59c16e5a92b1b4e3c49647413 Mon Sep 17 00:00:00 2001 From: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:33:49 +0200 Subject: [PATCH 0708/1766] [uwebsockets.js] Use faster plaintext response, update version (#9056) --- frameworks/JavaScript/uwebsockets.js/package-lock.json | 6 +++--- frameworks/JavaScript/uwebsockets.js/package.json | 2 +- frameworks/JavaScript/uwebsockets.js/src/server.js | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/JavaScript/uwebsockets.js/package-lock.json b/frameworks/JavaScript/uwebsockets.js/package-lock.json index 275f2f63b2e..910703e95b8 100644 --- a/frameworks/JavaScript/uwebsockets.js/package-lock.json +++ b/frameworks/JavaScript/uwebsockets.js/package-lock.json @@ -12,7 +12,7 @@ "mariadb": "^3.3.0", "postgres": "^3.4.4", "slow-json-stringify": "^2.0.1", - "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0" + "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0" } }, "node_modules/@types/geojson": { @@ -98,8 +98,8 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/uWebSockets.js": { - "version": "20.31.0", - "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#809b99d2d7d12e2cbf89b7135041e9b41ff84084" + "version": "20.44.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#8fa05571bf6ea95be8966ad313d9d39453e381ae" } } } diff --git a/frameworks/JavaScript/uwebsockets.js/package.json b/frameworks/JavaScript/uwebsockets.js/package.json index c64742e442d..ec5bc0c1d73 100644 --- a/frameworks/JavaScript/uwebsockets.js/package.json +++ b/frameworks/JavaScript/uwebsockets.js/package.json @@ -3,7 +3,7 @@ "mariadb": "^3.3.0", "postgres": "^3.4.4", "slow-json-stringify": "^2.0.1", - "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0" + "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0" }, "license": "MIT", "main": "src/server.js", diff --git a/frameworks/JavaScript/uwebsockets.js/src/server.js b/frameworks/JavaScript/uwebsockets.js/src/server.js index f67f33e874b..1db7d391f2a 100644 --- a/frameworks/JavaScript/uwebsockets.js/src/server.js +++ b/frameworks/JavaScript/uwebsockets.js/src/server.js @@ -16,11 +16,11 @@ if (DATABASE) db = await import(`./database/${DATABASE}.js`); const webserver = uWebSockets.App(); -webserver.get("/plaintext", (response) => { - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "text/plain"); - response.end("Hello, World!"); -}); +webserver.get("/plaintext", new uWebSockets.DeclarativeResponse() + .writeHeader("Server", "uWebSockets.js") + .writeHeader("Content-Type", "text/plain") + .end("Hello, World!") +); webserver.get("/json", (response) => { addBenchmarkHeaders(response); From 63f467e295b3f722dd850d2e064a1211447e3580 Mon Sep 17 00:00:00 2001 From: Bartosz Jarzyna <44323413+bbrtj@users.noreply.github.com> Date: Tue, 9 Jul 2024 20:01:54 +0200 Subject: [PATCH 0709/1766] Perl: Fix non-functional benchmarks (#9151) * Perl: unify the maximum requests per child value * Fix Perl Dancer * Fix Perl Web::Simple * Fix Perl Plack * Fix Perl Mojolicious * Perl Kelp: provide a default benchmark to silence the warning * Perl Mojolicious: minor adjustments --- frameworks/Perl/dancer/README.md | 3 +- frameworks/Perl/dancer/app.pl | 7 +- frameworks/Perl/dancer/benchmark_config.json | 3 +- frameworks/Perl/dancer/dancer.dockerfile | 7 +- frameworks/Perl/kelp/benchmark_config.json | 2 +- frameworks/Perl/kelp/run.pl | 4 + frameworks/Perl/mojolicious/app.pl | 116 +++---- frameworks/Perl/mojolicious/cpanfile | 3 +- frameworks/Perl/mojolicious/cpanfile.snapshot | 319 +++++++++--------- .../Perl/mojolicious/mojolicious.dockerfile | 3 +- frameworks/Perl/plack/README.md | 3 +- frameworks/Perl/plack/app-async.psgi | 3 +- frameworks/Perl/plack/app.pl | 4 +- frameworks/Perl/plack/app.psgi | 5 +- frameworks/Perl/plack/plack-async.dockerfile | 3 +- frameworks/Perl/plack/plack.dockerfile | 3 +- frameworks/Perl/web-simple/README.md | 3 +- frameworks/Perl/web-simple/app.pl | 3 +- .../Perl/web-simple/benchmark_config.json | 3 +- .../Perl/web-simple/web-simple.dockerfile | 6 +- 20 files changed, 256 insertions(+), 247 deletions(-) diff --git a/frameworks/Perl/dancer/README.md b/frameworks/Perl/dancer/README.md index c2afcf7639c..56b1d27d773 100644 --- a/frameworks/Perl/dancer/README.md +++ b/frameworks/Perl/dancer/README.md @@ -8,7 +8,7 @@ * Dancer * Dancer::Plugin::Database -* DBD::mysql +* DBD::MariaDB * Starman (if using Starman as web server) * Plack (for plackup) * nginx (if you want to front Dancer with nginx, nginx.conf provided) @@ -22,3 +22,4 @@ Something along the lines of if you want to front it with nginx, otherwise plackup -E production -s Starman --port=8080 --workers=2 -a ./app.pl + diff --git a/frameworks/Perl/dancer/app.pl b/frameworks/Perl/dancer/app.pl index dd58de39896..65ab9d2a6a3 100755 --- a/frameworks/Perl/dancer/app.pl +++ b/frameworks/Perl/dancer/app.pl @@ -8,8 +8,8 @@ set serializer => 'JSON'; -my $dsn = "dbi:mysql:database=hello_world;host=tfb-database;port=3306"; -my $dbh = DBI->connect( $dsn, 'benchmarkdbuser', 'benchmarkdbpass', { mysql_auto_reconnect=>1 } ); +my $dsn = "dbi:MariaDB:database=hello_world;host=tfb-database;port=3306"; +my $dbh = DBI->connect( $dsn, 'benchmarkdbuser', 'benchmarkdbpass' ); my $sth = $dbh->prepare("SELECT * FROM World where id = ?"); get '/json' => sub { @@ -20,7 +20,7 @@ my $queries = params->{queries} || 1; $queries = 1 if ( $queries !~ /^\d+$/ || $queries < 1 ); $queries = 500 if $queries > 500; - + my @response; for ( 1 .. $queries ) { my $id = int rand 10000 + 1; @@ -42,3 +42,4 @@ }; Dancer->dance; + diff --git a/frameworks/Perl/dancer/benchmark_config.json b/frameworks/Perl/dancer/benchmark_config.json index 94408b910f7..306909555ae 100644 --- a/frameworks/Perl/dancer/benchmark_config.json +++ b/frameworks/Perl/dancer/benchmark_config.json @@ -19,7 +19,8 @@ "display_name": "dancer", "notes": "", "versus": "", - "tags": ["broken"] + "tags": [] } }] } + diff --git a/frameworks/Perl/dancer/dancer.dockerfile b/frameworks/Perl/dancer/dancer.dockerfile index 687c3825ae9..0094ff8fca8 100644 --- a/frameworks/Perl/dancer/dancer.dockerfile +++ b/frameworks/Perl/dancer/dancer.dockerfile @@ -1,4 +1,4 @@ -FROM perl:5.26 +FROM perl:5.40 RUN apt-get update -yqq && apt-get install -yqq nginx @@ -10,7 +10,7 @@ RUN cpanm --notest --no-man-page \ Dancer@1.3134 \ Dancer::Plugin::Database@2.10 \ DBI@1.633 \ - DBD::mysql@4.033 \ + DBD::MariaDB@1.23 \ JSON::XS@3.01 \ Plack@1.0034 \ Starman@0.4011 @@ -18,4 +18,5 @@ RUN cpanm --notest --no-man-page \ EXPOSE 8080 CMD nginx -c /dancer/nginx.conf && \ - plackup -E production -s Starman --workers=$(nproc) -l /tmp/perl-dancer.sock -a ./app.pl + plackup -E production -s Starman --workers=$(nproc) --max-requests=100000 -l /tmp/perl-dancer.sock -a ./app.pl + diff --git a/frameworks/Perl/kelp/benchmark_config.json b/frameworks/Perl/kelp/benchmark_config.json index 1cd06f51ad0..dc164a11576 100644 --- a/frameworks/Perl/kelp/benchmark_config.json +++ b/frameworks/Perl/kelp/benchmark_config.json @@ -1,7 +1,7 @@ { "framework": "kelp", "tests": [{ - "gazelle-mysql": { + "default": { "dockerfile": "kelp.dockerfile", "plaintext_url": "/plaintext", "json_url": "/json", diff --git a/frameworks/Perl/kelp/run.pl b/frameworks/Perl/kelp/run.pl index b8436498f64..3aaed8d4cf7 100755 --- a/frameworks/Perl/kelp/run.pl +++ b/frameworks/Perl/kelp/run.pl @@ -62,6 +62,10 @@ ], ); +# default is gazelle-mysql (techempower will warn if there is no default) +$test_name = 'kelp-gazelle-mysql' + if $test_name eq 'kelp'; + die "invalid test name $test_name" unless $test_name =~ m{^kelp-(\w+)-(\w+)$}; diff --git a/frameworks/Perl/mojolicious/app.pl b/frameworks/Perl/mojolicious/app.pl index a1e38dd48f6..465c2c7381c 100644 --- a/frameworks/Perl/mojolicious/app.pl +++ b/frameworks/Perl/mojolicious/app.pl @@ -1,18 +1,19 @@ +use v5.36; use Mojolicious::Lite; use Mojo::Pg; use Mojo::Promise; -use Cpanel::JSON::XS 'encode_json'; use Scalar::Util 'looks_like_number'; -use Data::Dumper; # configuration +use constant MAX_DB_CONCURRENCY => 50; + { my $nproc = `nproc`; app->config(hypnotoad => { - accepts => 0, - clients => int( 256 / $nproc ) + 1, + accepts => 100000, + clients => MAX_DB_CONCURRENCY, graceful_timeout => 1, requests => 10000, workers => $nproc, @@ -20,41 +21,33 @@ }); } -{ - my $db_host = 'tfb-database'; - helper pg => sub { state $pg = Mojo::Pg->new('postgresql://benchmarkdbuser:benchmarkdbpass@' . $db_host . '/hello_world')->max_connections(50) }; -} - -helper render_json => sub { - my $c = shift; - $c->res->headers->content_type('application/json'); - $c->render( data => encode_json(shift) ); -}; - # Routes -get '/json' => sub { shift->helpers->render_json({message => 'Hello, World!'}) }; +get '/json' => sub ($c) { + $c->render(json => {message => 'Hello, World!'}); +}; -get '/db' => sub { shift->helpers->render_query(1, {single => 1}) }; +get '/db' => sub ($c) { + $c->helpers->render_query(1, {single => 1}); +}; -get '/queries' => sub { - my $c = shift; +get '/queries' => sub ($c) { $c->helpers->render_query(scalar $c->param('queries')); }; -get '/fortunes' => sub { - my $c = shift; +get '/fortunes' => sub ($c) { $c->render_later; - my $docs = $c->helpers->pg->db->query_p('SELECT id, message FROM Fortune') - ->then(sub{ - my $docs = $_[0]->arrays; - push @$docs, [0, 'Additional fortune added at request time.']; - $c->render(fortunes => docs => $docs->sort(sub{ $a->[1] cmp $b->[1] }) ) - }); + + $c->helpers->pg->db->query_p('SELECT id, message FROM Fortune') + ->then(sub ($query) { + my $docs = $query->arrays; + push @$docs, [0, 'Additional fortune added at request time.']; + + $c->render(fortunes => docs => $docs->sort(sub { $a->[1] cmp $b->[1] })); + }); }; -get '/updates' => sub { - my $c = shift; +get '/updates' => sub ($c) { $c->helpers->render_query(scalar $c->param('queries'), {update => 1}); }; @@ -62,55 +55,47 @@ # Additional helpers (shared code) -helper 'render_query' => sub { - my ($self, $q, $args) = @_; +helper pg => sub { + state $pg = Mojo::Pg + ->new('postgresql://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world') + ->max_connections(MAX_DB_CONCURRENCY + 1); +}; + +helper 'render_query' => sub ($self, $q, $args = {}) { $self->render_later; - $args ||= {}; - my $update = $args->{update}; $q = 1 unless looks_like_number($q); $q = 1 if $q < 1; $q = 500 if $q > 500; - my $r = []; - my $tx = $self->tx; + Mojo::Promise->map({concurrency => MAX_DB_CONCURRENCY}, sub { + my $db = $self->helpers->pg->db; + my $id = 1 + int rand 10_000; + my $query = $db->query('SELECT id, randomnumber FROM World WHERE id=?', $id); + my $number = $query->array->[1]; - my @queries; - foreach (1 .. $q) { - my $id = 1 + int rand 10_000; + if ($args->{update}) { + $number = 1 + int rand 10_000; + $db->query('UPDATE World SET randomnumber=? WHERE id=?', $number, $id); + } - push @queries, $self->helpers->pg->db->query_p('SELECT id,randomnumber FROM World WHERE id=?', $id) - ->then(sub{ - my $randomNumber = $_[0]->array->[0]; - - return Mojo::Promise->new->resolve($id, $randomNumber) - ->then(sub{ - if($update) { - $randomNumber = 1 + int rand 10_000; - return Mojo::Promise->all( - Mojo::Promise->new->resolve($_[0], $randomNumber), - $self->helpers->pg->db->query_p('UPDATE World SET randomnumber=? WHERE id=?', $randomNumber, $id) - ) - ->then(sub { - return $_[0]; - }) - } - return [shift, shift]; - }) - }); - } + return Mojo::Promise->resolve([$id, $number]); + }, 1 .. $q) + ->then(sub (@responses) { + my @results; - Mojo::Promise->all(@queries) - ->then(sub{ - my @responses = @_; foreach my $resp (@responses) { - push @$r, { id => $resp->[0][0], randomNumber => $resp->[0][1] }; + push @results, { id => $resp->[0][0], randomNumber => $resp->[0][1] }; } - $r = $r->[0] if $args->{single}; - $self->helpers->render_json($r); - }) + if ($args->{single}) { + $self->render(json => $results[0]); + } + else { + $self->render(json => \@results); + } + }); }; app->start; @@ -133,3 +118,4 @@ + diff --git a/frameworks/Perl/mojolicious/cpanfile b/frameworks/Perl/mojolicious/cpanfile index 12f340c183e..68299a759ce 100644 --- a/frameworks/Perl/mojolicious/cpanfile +++ b/frameworks/Perl/mojolicious/cpanfile @@ -1,7 +1,8 @@ requires 'Mojolicious', '7.84'; requires 'Mojo::Pg', '4.08'; -requires 'Cpanel::JSON::XS', '4.02'; +requires 'Cpanel::JSON::XS', '4.38'; requires 'EV', '4.22'; recommends 'IO::Socket::IP', '0.36'; recommends 'IO::Socket::SSL'; + diff --git a/frameworks/Perl/mojolicious/cpanfile.snapshot b/frameworks/Perl/mojolicious/cpanfile.snapshot index a43dcb6688e..c3f7c9e074b 100644 --- a/frameworks/Perl/mojolicious/cpanfile.snapshot +++ b/frameworks/Perl/mojolicious/cpanfile.snapshot @@ -1,15 +1,15 @@ # carton snapshot format: version 1.0 DISTRIBUTIONS - Canary-Stability-2012 - pathname: M/ML/MLEHMANN/Canary-Stability-2012.tar.gz + Canary-Stability-2013 + pathname: M/ML/MLEHMANN/Canary-Stability-2013.tar.gz provides: - Canary::Stability 2012 + Canary::Stability 2013 requirements: ExtUtils::MakeMaker 0 - Class-Method-Modifiers-2.12 - pathname: E/ET/ETHER/Class-Method-Modifiers-2.12.tar.gz + Class-Method-Modifiers-2.15 + pathname: E/ET/ETHER/Class-Method-Modifiers-2.15.tar.gz provides: - Class::Method::Modifiers 2.12 + Class::Method::Modifiers 2.15 requirements: B 0 Carp 0 @@ -27,27 +27,36 @@ DISTRIBUTIONS ExtUtils::MakeMaker 0 Storable 0 perl 5.008001 - Cpanel-JSON-XS-4.02 - pathname: R/RU/RURBAN/Cpanel-JSON-XS-4.02.tar.gz + Cpanel-JSON-XS-4.38 + pathname: R/RU/RURBAN/Cpanel-JSON-XS-4.38.tar.gz provides: - Cpanel::JSON::XS 4.02 + Cpanel::JSON::XS 4.38 Cpanel::JSON::XS::Type undef requirements: + Carp 0 + Config 0 + Encode 1.9801 + Exporter 0 ExtUtils::MakeMaker 0 Pod::Text 2.08 - DBD-Pg-3.7.4 - pathname: T/TU/TURNSTEP/DBD-Pg-3.7.4.tar.gz + XSLoader 0 + overload 0 + strict 0 + warnings 0 + DBD-Pg-3.18.0 + pathname: T/TU/TURNSTEP/DBD-Pg-3.18.0.tar.gz provides: - Bundle::DBD::Pg v3.7.4 - DBD::Pg v3.7.4 + Bundle::DBD::Pg v3.18.0 + DBD::Pg v3.18.0 requirements: DBI 1.614 - ExtUtils::MakeMaker 6.11 + ExtUtils::MakeMaker 6.58 + File::Temp 0 Test::More 0.88 Time::HiRes 0 version 0 - DBI-1.641 - pathname: T/TI/TIMB/DBI-1.641.tar.gz + DBI-1.643 + pathname: T/TI/TIMB/DBI-1.643.tar.gz provides: Bundle::DBI 12.008696 DBD::DBM 0.08 @@ -103,7 +112,7 @@ DISTRIBUTIONS DBD::Sponge::dr 12.010003 DBD::Sponge::st 12.010003 DBDI 12.015129 - DBI 1.641 + DBI 1.643 DBI::Const::GetInfo::ANSI 2.008697 DBI::Const::GetInfo::ODBC 2.011374 DBI::Const::GetInfoReturn 2.008697 @@ -143,128 +152,60 @@ DISTRIBUTIONS DBI::SQL::Nano::Table_ 1.015544 DBI::Util::CacheMemory 0.010315 DBI::Util::_accessor 0.009479 - DBI::common 1.641 + DBI::common 1.643 requirements: ExtUtils::MakeMaker 6.48 Test::Simple 0.90 - perl 5.008 - Devel-GlobalDestruction-0.14 - pathname: H/HA/HAARG/Devel-GlobalDestruction-0.14.tar.gz - provides: - Devel::GlobalDestruction 0.14 - requirements: - ExtUtils::MakeMaker 0 - Sub::Exporter::Progressive 0.001011 - perl 5.006 - EV-4.22 - pathname: M/ML/MLEHMANN/EV-4.22.tar.gz + perl 5.008001 + EV-4.34 + pathname: M/ML/MLEHMANN/EV-4.34.tar.gz provides: - EV 4.22 + EV 4.34 EV::MakeMaker undef requirements: Canary::Stability 0 ExtUtils::MakeMaker 6.52 common::sense 0 - Hash-Merge-0.300 - pathname: R/RE/REHSACK/Hash-Merge-0.300.tar.gz + Hash-Merge-0.302 + pathname: H/HE/HERMES/Hash-Merge-0.302.tar.gz provides: - Hash::Merge 0.300 + Hash::Merge 0.302 requirements: Clone::Choose 0.008 ExtUtils::MakeMaker 6.64 Scalar::Util 0 perl 5.008001 - MRO-Compat-0.13 - pathname: H/HA/HAARG/MRO-Compat-0.13.tar.gz + MRO-Compat-0.15 + pathname: H/HA/HAARG/MRO-Compat-0.15.tar.gz provides: - MRO::Compat 0.13 + MRO::Compat 0.15 requirements: ExtUtils::MakeMaker 0 perl 5.006 - Module-Build-0.4224 - pathname: L/LE/LEONT/Module-Build-0.4224.tar.gz - provides: - Module::Build 0.4224 - Module::Build::Base 0.4224 - Module::Build::Compat 0.4224 - Module::Build::Config 0.4224 - Module::Build::Cookbook 0.4224 - Module::Build::Dumper 0.4224 - Module::Build::Notes 0.4224 - Module::Build::PPMMaker 0.4224 - Module::Build::Platform::Default 0.4224 - Module::Build::Platform::MacOS 0.4224 - Module::Build::Platform::Unix 0.4224 - Module::Build::Platform::VMS 0.4224 - Module::Build::Platform::VOS 0.4224 - Module::Build::Platform::Windows 0.4224 - Module::Build::Platform::aix 0.4224 - Module::Build::Platform::cygwin 0.4224 - Module::Build::Platform::darwin 0.4224 - Module::Build::Platform::os2 0.4224 - Module::Build::PodParser 0.4224 - requirements: - CPAN::Meta 2.142060 - CPAN::Meta::YAML 0.003 - Cwd 0 - Data::Dumper 0 - ExtUtils::CBuilder 0.27 - ExtUtils::Install 0 - ExtUtils::Manifest 0 - ExtUtils::Mkbootstrap 0 - ExtUtils::ParseXS 2.21 - File::Basename 0 - File::Compare 0 - File::Copy 0 - File::Find 0 - File::Path 0 - File::Spec 0.82 - File::Temp 0.15 - Getopt::Long 0 - Module::Metadata 1.000002 - Parse::CPAN::Meta 1.4401 - Perl::OSType 1 - Pod::Man 2.17 - TAP::Harness 3.29 - Test::More 0.49 - Text::Abbrev 0 - Text::ParseWords 0 - perl 5.006001 - version 0.87 - Module-Runtime-0.016 - pathname: Z/ZE/ZEFRAM/Module-Runtime-0.016.tar.gz - provides: - Module::Runtime 0.016 - requirements: - Module::Build 0 - Test::More 0.41 - perl 5.006 - strict 0 - warnings 0 - Mojo-Pg-4.08 - pathname: S/SR/SRI/Mojo-Pg-4.08.tar.gz + Mojo-Pg-4.27 + pathname: S/SR/SRI/Mojo-Pg-4.27.tar.gz provides: - Mojo::Pg 4.08 + Mojo::Pg 4.27 Mojo::Pg::Database undef Mojo::Pg::Migrations undef Mojo::Pg::PubSub undef Mojo::Pg::Results undef Mojo::Pg::Transaction undef - SQL::Abstract::Pg undef requirements: - DBD::Pg 3.005001 + DBD::Pg 3.007004 ExtUtils::MakeMaker 0 - Mojolicious 7.53 - SQL::Abstract 1.85 - perl 5.010001 - Mojolicious-7.84 - pathname: S/SR/SRI/Mojolicious-7.84.tar.gz + Mojolicious 8.50 + SQL::Abstract::Pg 1.0 + perl 5.016 + Mojolicious-9.37 + pathname: S/SR/SRI/Mojolicious-9.37.tar.gz provides: Mojo undef Mojo::Asset undef Mojo::Asset::File undef Mojo::Asset::Memory undef Mojo::Base undef + Mojo::BaseUtil undef Mojo::ByteStream undef Mojo::Cache undef Mojo::Collection undef @@ -278,6 +219,7 @@ DISTRIBUTIONS Mojo::DOM::CSS undef Mojo::DOM::HTML undef Mojo::Date undef + Mojo::DynamicMethods undef Mojo::EventEmitter undef Mojo::Exception undef Mojo::File undef @@ -286,13 +228,8 @@ DISTRIBUTIONS Mojo::Home undef Mojo::IOLoop undef Mojo::IOLoop::Client undef - Mojo::IOLoop::Delay undef Mojo::IOLoop::Server undef Mojo::IOLoop::Stream undef - Mojo::IOLoop::Stream::HTTPClient undef - Mojo::IOLoop::Stream::HTTPServer undef - Mojo::IOLoop::Stream::WebSocketClient undef - Mojo::IOLoop::Stream::WebSocketServer undef Mojo::IOLoop::Subprocess undef Mojo::IOLoop::TLS undef Mojo::JSON undef @@ -316,7 +253,6 @@ DISTRIBUTIONS Mojo::Server::Morbo::Backend undef Mojo::Server::Morbo::Backend::Poll undef Mojo::Server::PSGI undef - Mojo::Server::PSGI::_IO undef Mojo::Server::Prefork undef Mojo::Template undef Mojo::Transaction undef @@ -331,37 +267,36 @@ DISTRIBUTIONS Mojo::UserAgent::Transactor undef Mojo::Util undef Mojo::WebSocket undef - Mojolicious 7.84 + Mojolicious 9.37 Mojolicious::Command undef + Mojolicious::Command::Author::cpanify undef + Mojolicious::Command::Author::generate undef + Mojolicious::Command::Author::generate::app undef + Mojolicious::Command::Author::generate::dockerfile undef + Mojolicious::Command::Author::generate::lite_app undef + Mojolicious::Command::Author::generate::makefile undef + Mojolicious::Command::Author::generate::plugin undef + Mojolicious::Command::Author::inflate undef Mojolicious::Command::cgi undef - Mojolicious::Command::cpanify undef Mojolicious::Command::daemon undef Mojolicious::Command::eval undef - Mojolicious::Command::generate undef - Mojolicious::Command::generate::app undef - Mojolicious::Command::generate::lite_app undef - Mojolicious::Command::generate::makefile undef - Mojolicious::Command::generate::plugin undef Mojolicious::Command::get undef - Mojolicious::Command::inflate undef Mojolicious::Command::prefork undef Mojolicious::Command::psgi undef Mojolicious::Command::routes undef - Mojolicious::Command::test undef Mojolicious::Command::version undef Mojolicious::Commands undef Mojolicious::Controller undef Mojolicious::Lite undef Mojolicious::Plugin undef Mojolicious::Plugin::Config undef - Mojolicious::Plugin::Config::Sandbox undef Mojolicious::Plugin::DefaultHelpers undef Mojolicious::Plugin::EPLRenderer undef Mojolicious::Plugin::EPRenderer undef Mojolicious::Plugin::HeaderCondition undef Mojolicious::Plugin::JSONConfig undef Mojolicious::Plugin::Mount undef - Mojolicious::Plugin::PODRenderer undef + Mojolicious::Plugin::NotYAMLConfig undef Mojolicious::Plugin::TagHelpers undef Mojolicious::Plugins undef Mojolicious::Renderer undef @@ -379,52 +314,55 @@ DISTRIBUTIONS requirements: ExtUtils::MakeMaker 0 IO::Socket::IP 0.37 - JSON::PP 2.27103 - Pod::Simple 3.09 - Time::Local 1.2 - perl 5.010001 - Moo-2.003004 - pathname: H/HA/HAARG/Moo-2.003004.tar.gz + Sub::Util 1.41 + perl 5.016 + Moo-2.005005 + pathname: H/HA/HAARG/Moo-2.005005.tar.gz provides: Method::Generate::Accessor undef Method::Generate::BuildAll undef Method::Generate::Constructor undef Method::Generate::DemolishAll undef - Moo 2.003004 + Moo 2.005005 Moo::HandleMoose undef Moo::HandleMoose::FakeConstructor undef Moo::HandleMoose::FakeMetaClass undef Moo::HandleMoose::_TypeMap undef Moo::Object undef - Moo::Role 2.003004 + Moo::Role 2.005005 Moo::_Utils undef - Moo::_mro undef - Moo::_strictures undef Moo::sification undef oo undef requirements: - Class::Method::Modifiers 1.1 - Devel::GlobalDestruction 0.11 - Exporter 5.57 + Carp 0 + Class::Method::Modifiers 1.10 + Exporter 0 ExtUtils::MakeMaker 0 - Module::Runtime 0.014 - Role::Tiny 2.000004 - Scalar::Util 0 - Sub::Defer 2.003001 - Sub::Quote 2.003001 + Role::Tiny 2.002003 + Scalar::Util 1.00 + Sub::Defer 2.006006 + Sub::Quote 2.006006 perl 5.006 - Role-Tiny-2.000006 - pathname: H/HA/HAARG/Role-Tiny-2.000006.tar.gz + Role-Tiny-2.002004 + pathname: H/HA/HAARG/Role-Tiny-2.002004.tar.gz provides: - Role::Tiny 2.000006 - Role::Tiny::With 2.000006 + Role::Tiny 2.002004 + Role::Tiny::With 2.002004 requirements: Exporter 5.57 perl 5.006 - SQL-Abstract-1.85 - pathname: I/IL/ILMARI/SQL-Abstract-1.85.tar.gz + SQL-Abstract-2.000001 + pathname: M/MS/MSTROUT/SQL-Abstract-2.000001.tar.gz provides: - SQL::Abstract 1.85 + Chunkstrumenter undef + DBIx::Class::SQLMaker::Role::SQLA2Passthrough undef + SQL::Abstract 2.000001 + SQL::Abstract::Formatter undef + SQL::Abstract::Parts undef + SQL::Abstract::Plugin::BangOverrides undef + SQL::Abstract::Plugin::ExtraClauses undef + SQL::Abstract::Reference undef + SQL::Abstract::Role::Plugin undef SQL::Abstract::Test undef SQL::Abstract::Tree undef requirements: @@ -436,26 +374,91 @@ DISTRIBUTIONS Moo 2.000001 Scalar::Util 0 Sub::Quote 2.000001 + Test::Builder::Module 0.84 + Test::Deep 0.101 Text::Balanced 2.00 perl 5.006 - Sub-Exporter-Progressive-0.001013 - pathname: F/FR/FREW/Sub-Exporter-Progressive-0.001013.tar.gz + SQL-Abstract-Pg-1.0 + pathname: S/SR/SRI/SQL-Abstract-Pg-1.0.tar.gz provides: - Sub::Exporter::Progressive 0.001013 + SQL::Abstract::Pg 1.0 requirements: ExtUtils::MakeMaker 0 - Sub-Quote-2.005001 - pathname: H/HA/HAARG/Sub-Quote-2.005001.tar.gz + SQL::Abstract 2.0 + perl 5.016 + Sub-Quote-2.006008 + pathname: H/HA/HAARG/Sub-Quote-2.006008.tar.gz provides: - Sub::Defer 2.005001 - Sub::Quote 2.005001 + Sub::Defer 2.006008 + Sub::Quote 2.006008 requirements: ExtUtils::MakeMaker 0 Scalar::Util 0 perl 5.006 - common-sense-3.74 - pathname: M/ML/MLEHMANN/common-sense-3.74.tar.gz + Test-Deep-1.204 + pathname: R/RJ/RJBS/Test-Deep-1.204.tar.gz + provides: + Test::Deep 1.204 + Test::Deep::All 1.204 + Test::Deep::Any 1.204 + Test::Deep::Array 1.204 + Test::Deep::ArrayEach 1.204 + Test::Deep::ArrayElementsOnly 1.204 + Test::Deep::ArrayLength 1.204 + Test::Deep::ArrayLengthOnly 1.204 + Test::Deep::Blessed 1.204 + Test::Deep::Boolean 1.204 + Test::Deep::Cache 1.204 + Test::Deep::Cache::Simple 1.204 + Test::Deep::Class 1.204 + Test::Deep::Cmp 1.204 + Test::Deep::Code 1.204 + Test::Deep::Hash 1.204 + Test::Deep::HashEach 1.204 + Test::Deep::HashElements 1.204 + Test::Deep::HashKeys 1.204 + Test::Deep::HashKeysOnly 1.204 + Test::Deep::Ignore 1.204 + Test::Deep::Isa 1.204 + Test::Deep::ListMethods 1.204 + Test::Deep::MM 1.204 + Test::Deep::Methods 1.204 + Test::Deep::NoTest 1.204 + Test::Deep::None 1.204 + Test::Deep::Number 1.204 + Test::Deep::Obj 1.204 + Test::Deep::Ref 1.204 + Test::Deep::RefType 1.204 + Test::Deep::Regexp 1.204 + Test::Deep::RegexpMatches 1.204 + Test::Deep::RegexpOnly 1.204 + Test::Deep::RegexpRef 1.204 + Test::Deep::RegexpRefOnly 1.204 + Test::Deep::RegexpVersion 1.204 + Test::Deep::ScalarRef 1.204 + Test::Deep::ScalarRefOnly 1.204 + Test::Deep::Set 1.204 + Test::Deep::Shallow 1.204 + Test::Deep::Stack 1.204 + Test::Deep::String 1.204 + Test::Deep::SubHash 1.204 + Test::Deep::SubHashElements 1.204 + Test::Deep::SubHashKeys 1.204 + Test::Deep::SubHashKeysOnly 1.204 + Test::Deep::SuperHash 1.204 + Test::Deep::SuperHashElements 1.204 + Test::Deep::SuperHashKeys 1.204 + Test::Deep::SuperHashKeysOnly 1.204 + requirements: + ExtUtils::MakeMaker 6.78 + List::Util 1.09 + Scalar::Util 1.09 + Test::Builder 0 + Test::More 0.96 + perl 5.012 + common-sense-3.75 + pathname: M/ML/MLEHMANN/common-sense-3.75.tar.gz provides: - common::sense 3.74 + common::sense 3.75 requirements: ExtUtils::MakeMaker 0 diff --git a/frameworks/Perl/mojolicious/mojolicious.dockerfile b/frameworks/Perl/mojolicious/mojolicious.dockerfile index fe9197e6233..1fec0cc3952 100644 --- a/frameworks/Perl/mojolicious/mojolicious.dockerfile +++ b/frameworks/Perl/mojolicious/mojolicious.dockerfile @@ -1,4 +1,4 @@ -FROM perl:5.26 +FROM perl:5.40 WORKDIR /mojo @@ -19,3 +19,4 @@ ADD ./app.pl ./ EXPOSE 8080 CMD hypnotoad -f /mojo/app.pl + diff --git a/frameworks/Perl/plack/README.md b/frameworks/Perl/plack/README.md index f8172775ec1..d08e9a91a20 100644 --- a/frameworks/Perl/plack/README.md +++ b/frameworks/Perl/plack/README.md @@ -9,4 +9,5 @@ Plack * Twiggy::Prefork * JSON::XS * AnyEvent::DBI -* DBD::mysql +* DBD::MariaDB + diff --git a/frameworks/Perl/plack/app-async.psgi b/frameworks/Perl/plack/app-async.psgi index 93df1c50b2d..b5397d1ca5e 100644 --- a/frameworks/Perl/plack/app-async.psgi +++ b/frameworks/Perl/plack/app-async.psgi @@ -5,7 +5,7 @@ use AnyEvent::DBI; use Unix::Processors; use List::Util qw'min max'; -my @dsn = ('dbi:mysql:database=hello_world;host=tfb-database;port=3306', 'benchmarkdbuser', 'benchmarkdbpass'); +my @dsn = ('dbi:MariaDB:database=hello_world;host=tfb-database;port=3306', 'benchmarkdbuser', 'benchmarkdbpass'); my $query = 'select randomNumber, id from World where id = ?'; sub { @@ -37,3 +37,4 @@ sub { } [404, [qw(Content-Type application/json)], ['not found']] } + diff --git a/frameworks/Perl/plack/app.pl b/frameworks/Perl/plack/app.pl index c1a1172b277..b62eaa6acdc 100644 --- a/frameworks/Perl/plack/app.pl +++ b/frameworks/Perl/plack/app.pl @@ -7,10 +7,10 @@ my @cmd = ( ($opts->{a} # async server - ? [qw'plackup -s Twiggy::Prefork -E production --max-reqs-per-child=0 --backlog 16384 + ? [qw'plackup -s Twiggy::Prefork -E production --max-reqs-per-child=100000 --backlog 16384 --max-workers', $cpus, qw'-l /dev/shm/app.sock -a app-async.psgi'] : [qw'start_server --backlog 16384 --path /dev/shm/app.sock -- - plackup -s Gazelle -E production --max-reqs-per-child 10000000 + plackup -s Gazelle -E production --max-reqs-per-child 100000 --max-workers', $cpus, qw'-a app.psgi']), [qw'nginx -c nginx.conf -p', getcwd] ); diff --git a/frameworks/Perl/plack/app.psgi b/frameworks/Perl/plack/app.psgi index 4f5d8579d38..dc625076660 100644 --- a/frameworks/Perl/plack/app.psgi +++ b/frameworks/Perl/plack/app.psgi @@ -5,9 +5,9 @@ use List::Util qw'min max'; sub { state $dbh = DBI->connect( - 'dbi:mysql:database=hello_world;host=tfb-database;port=3306', + 'dbi:MariaDB:database=hello_world;host=tfb-database;port=3306', 'benchmarkdbuser', 'benchmarkdbpass', - +{ qw'RaiseError 0 PrintError 0 mysql_enable_utf8 1' } + +{ qw'RaiseError 0 PrintError 0' } ) || die $!; state $sth = $dbh->prepare('select id,randomnumber from world where id = ?'); my $env = shift; @@ -25,3 +25,4 @@ sub { } [ 404, [], ['not found']]; } + diff --git a/frameworks/Perl/plack/plack-async.dockerfile b/frameworks/Perl/plack/plack-async.dockerfile index 4af66083005..8ef1ac76b04 100644 --- a/frameworks/Perl/plack/plack-async.dockerfile +++ b/frameworks/Perl/plack/plack-async.dockerfile @@ -1,7 +1,7 @@ FROM perl:latest RUN apt-get update -yqq && apt-get install -yqq nginx -RUN cpanm --notest --no-man-page Plack JSON::XS Unix::Processors DBI DBD::mysql +RUN cpanm --notest --no-man-page Plack JSON::XS Unix::Processors DBI DBD::MariaDB RUN cpanm --notest --no-man-page Cookie::Baker::XS Twiggy::Prefork HTTP::Parser::XS EV AnyEvent::DBI ADD nginx.conf ./ @@ -11,3 +11,4 @@ ADD app-async.psgi ./ EXPOSE 8080 CMD perl app.pl -a + diff --git a/frameworks/Perl/plack/plack.dockerfile b/frameworks/Perl/plack/plack.dockerfile index f2a14dd5b4c..a0391f2f4ca 100644 --- a/frameworks/Perl/plack/plack.dockerfile +++ b/frameworks/Perl/plack/plack.dockerfile @@ -1,7 +1,7 @@ FROM perl:latest RUN apt-get update -yqq && apt-get install -yqq nginx -RUN cpanm --notest --no-man-page Plack JSON::XS Unix::Processors DBI DBD::mysql +RUN cpanm --notest --no-man-page Plack JSON::XS Unix::Processors DBI DBD::MariaDB RUN cpanm --notest --no-man-page Gazelle Cookie::Baker::XS ADD nginx.conf ./ @@ -11,3 +11,4 @@ ADD app.psgi ./ EXPOSE 8080 CMD perl app.pl + diff --git a/frameworks/Perl/web-simple/README.md b/frameworks/Perl/web-simple/README.md index d169c515914..98e8d6a836e 100644 --- a/frameworks/Perl/web-simple/README.md +++ b/frameworks/Perl/web-simple/README.md @@ -7,7 +7,7 @@ # Requirements * Web::Simple -* DBD::mysql +* DBD::MariaDB * Starman (if using Starman as web server) * Plack (for plackup) * nginx (if you want to front Dancer with nginx, nginx.conf provided) @@ -21,3 +21,4 @@ Something along the lines of if you want to front it with nginx, otherwise plackup -E production -s Starman --port=8080 --workers=8 -a ./app.pl + diff --git a/frameworks/Perl/web-simple/app.pl b/frameworks/Perl/web-simple/app.pl index d2db3e11299..2447c765c01 100755 --- a/frameworks/Perl/web-simple/app.pl +++ b/frameworks/Perl/web-simple/app.pl @@ -4,7 +4,7 @@ use DBI; sub get_database_handle { - DBI->connect_cached('dbi:mysql:database=hello_world;host=tfb-database', 'benchmarkdbuser', 'benchmarkdbpass', { RaiseError => 1 }); + DBI->connect_cached('dbi:MariaDB:database=hello_world;host=tfb-database', 'benchmarkdbuser', 'benchmarkdbpass', { RaiseError => 1 }); } sub dispatch_request { @@ -54,3 +54,4 @@ sub dispatch_request { } __PACKAGE__->run_if_script; + diff --git a/frameworks/Perl/web-simple/benchmark_config.json b/frameworks/Perl/web-simple/benchmark_config.json index 629b19df0c1..6725005d211 100644 --- a/frameworks/Perl/web-simple/benchmark_config.json +++ b/frameworks/Perl/web-simple/benchmark_config.json @@ -19,7 +19,8 @@ "display_name": "web-simple", "notes": "", "versus": "", - "tags": ["broken"] + "tags": [] } }] } + diff --git a/frameworks/Perl/web-simple/web-simple.dockerfile b/frameworks/Perl/web-simple/web-simple.dockerfile index f3b83b7a7c0..5a2678bfe1b 100644 --- a/frameworks/Perl/web-simple/web-simple.dockerfile +++ b/frameworks/Perl/web-simple/web-simple.dockerfile @@ -1,4 +1,4 @@ -FROM perl:5.26 +FROM perl:5.40 RUN apt-get update -yqq && apt-get install -yqq nginx @@ -8,7 +8,7 @@ RUN cpanm --notest --no-man-page \ JSON JSON::XS IO::Socket::IP IO::Socket::SSL \ Web::Simple@0.033 \ DBI@1.637 \ - DBD::mysql@4.043 \ + DBD::MariaDB@1.23 \ Plack@1.0044 \ Starman@0.4014 \ JSON::XS@3.04 @@ -21,4 +21,6 @@ EXPOSE 8080 CMD nginx -c /simple/nginx.conf && \ plackup -E production -s Starman --workers=$(nproc) \ + --max-requests=100000 \ -l /tmp/perl-simple.sock -a /simple/app.pl + From 411a25b56a646df27a8b4d583b2fb866875308ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 22:00:04 +0000 Subject: [PATCH 0710/1766] Bump google.golang.org/grpc in /frameworks/Go/goravel/src/fiber Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.64.0 to 1.64.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.64.0...v1.64.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/goravel/src/fiber/go.mod | 6 +++--- frameworks/Go/goravel/src/fiber/go.sum | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Go/goravel/src/fiber/go.mod b/frameworks/Go/goravel/src/fiber/go.mod index e285c0106e3..b31a4b9ba88 100644 --- a/frameworks/Go/goravel/src/fiber/go.mod +++ b/frameworks/Go/goravel/src/fiber/go.mod @@ -4,8 +4,6 @@ go 1.22 require ( github.com/bytedance/sonic v1.11.9 - github.com/gofiber/fiber/v2 v2.52.4 - github.com/gofiber/template/html/v2 v2.1.1 github.com/goravel/fiber v1.2.1 github.com/goravel/framework v1.14.1 github.com/valyala/quicktemplate v1.7.0 @@ -63,7 +61,9 @@ require ( github.com/go-redsync/redsync/v4 v4.8.1 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-stack/stack v1.8.0 // indirect + github.com/gofiber/fiber/v2 v2.52.4 // indirect github.com/gofiber/template v1.8.3 // indirect + github.com/gofiber/template/html/v2 v2.1.1 // indirect github.com/gofiber/utils v1.1.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect @@ -174,7 +174,7 @@ require ( google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect + google.golang.org/grpc v1.64.1 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/frameworks/Go/goravel/src/fiber/go.sum b/frameworks/Go/goravel/src/fiber/go.sum index 942ea9c3e7f..e036eea01cf 100644 --- a/frameworks/Go/goravel/src/fiber/go.sum +++ b/frameworks/Go/goravel/src/fiber/go.sum @@ -1096,8 +1096,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 14e4e09f660c92be1ca1fd557415950e7bbeaec7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 22:08:43 +0000 Subject: [PATCH 0711/1766] Bump mysql2 from 3.9.7 to 3.9.8 in /frameworks/JavaScript/sailsjs Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.7 to 3.9.8. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.7...v3.9.8) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/sailsjs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/sailsjs/package.json b/frameworks/JavaScript/sailsjs/package.json index 9be38df56ad..b2886f07639 100644 --- a/frameworks/JavaScript/sailsjs/package.json +++ b/frameworks/JavaScript/sailsjs/package.json @@ -10,7 +10,7 @@ "ejs": "3.1.10", "handlebars": "4.7.6", "mysql": "2.16.0", - "mysql2": "3.9.7", + "mysql2": "3.9.8", "pg": "6.0.5", "pg-hstore": "2.3.2", "rc": "1.1.6", From 11376ea45ca3b9067b24690cc0acc5b7c9fe88cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:42:44 -0700 Subject: [PATCH 0712/1766] Bump mysql2 from 3.9.7 to 3.9.8 in /frameworks/JavaScript/nodejs (#9154) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.7 to 3.9.8. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.7...v3.9.8) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/nodejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/nodejs/package.json b/frameworks/JavaScript/nodejs/package.json index 8af5fedae2b..28dc35a011c 100644 --- a/frameworks/JavaScript/nodejs/package.json +++ b/frameworks/JavaScript/nodejs/package.json @@ -8,7 +8,7 @@ "mongodb": "3.7.3", "mongoose": "5.13.20", "mysql": "2.16.0", - "mysql2": "3.9.7", + "mysql2": "3.9.8", "parseurl": "1.3.2", "pg": "8.5.0", "pg-hstore": "2.3.2", From d54303b8cdcd145d074925573c9e914f1ab0fbf9 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Thu, 11 Jul 2024 19:01:41 +0200 Subject: [PATCH 0713/1766] [Python] Bump Granian to 1.5.x (#9157) --- frameworks/Python/emmett/requirements.txt | 2 +- frameworks/Python/emmett/run.py | 7 ++++--- frameworks/Python/granian/requirements.txt | 2 +- frameworks/Python/granian/run.py | 13 +++++++++---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/frameworks/Python/emmett/requirements.txt b/frameworks/Python/emmett/requirements.txt index 2c329705017..627a2187091 100644 --- a/frameworks/Python/emmett/requirements.txt +++ b/frameworks/Python/emmett/requirements.txt @@ -1,2 +1,2 @@ -emmett[orjson]>=2.5.3,<2.6.0 +emmett[orjson]>=2.5.12,<2.6.0 psycopg2-binary==2.9.5 diff --git a/frameworks/Python/emmett/run.py b/frameworks/Python/emmett/run.py index 42679101ea0..02a21e458f9 100644 --- a/frameworks/Python/emmett/run.py +++ b/frameworks/Python/emmett/run.py @@ -4,16 +4,17 @@ if __name__ == "__main__": - cpus = multiprocessing.cpu_count() + workers = round(multiprocessing.cpu_count() / 2) run( "rsgi", ("app", "app"), host="0.0.0.0", port=8080, - workers=cpus, + workers=workers, backlog=16384, - threading_mode='runtime', + threading_mode="runtime", + http="1", enable_websockets=False, log_level="warn" ) diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index e1b7c479119..1a22a3ddfc2 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.29.0 -granian>=1.4.2,<1.5.0 +granian>=1.5.1,<1.6.0 jinja2==3.1.4 orjson==3.10.2 diff --git a/frameworks/Python/granian/run.py b/frameworks/Python/granian/run.py index acdad59a542..910b248422b 100644 --- a/frameworks/Python/granian/run.py +++ b/frameworks/Python/granian/run.py @@ -7,9 +7,14 @@ if __name__ == '__main__': interface = sys.argv[1] threading_mode = sys.argv[2] - workers = multiprocessing.cpu_count() - if threading_mode == "workers": - workers = round(workers / 2) + + #: split cores between the two loops + workers = round(multiprocessing.cpu_count() / 2) + + blocking_threads = None + if interface == "wsgi": + #: we don't run any I/O in WSGI benches + blocking_threads = 1 Granian( f"app_{interface}:main", @@ -17,7 +22,7 @@ port=8080, workers=workers, threading_mode=threading_mode, - blocking_threads=1, + blocking_threads=blocking_threads, backlog=16384, interface=interface, http="1", From 0ef534b6fce72f197333d70a3f60362e798bb8e7 Mon Sep 17 00:00:00 2001 From: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> Date: Thu, 11 Jul 2024 19:04:23 +0200 Subject: [PATCH 0714/1766] Gnet is unrealistic (#9159) * [gnet] is unrealistic * Update benchmark_config.json --- frameworks/Go/gnet/benchmark_config.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/gnet/benchmark_config.json b/frameworks/Go/gnet/benchmark_config.json index 484ec41b8ff..3999bd74f97 100644 --- a/frameworks/Go/gnet/benchmark_config.json +++ b/frameworks/Go/gnet/benchmark_config.json @@ -4,8 +4,8 @@ "default": { "plaintext_url": "/plaintext", "port": 8080, - "approach": "Realistic", - "classification": "Platform", + "approach": "stripped", + "classification": "Micro", "database": "None", "framework": "gnet", "language": "Go", @@ -20,4 +20,4 @@ "versus": "go" } }] -} \ No newline at end of file +} From 4b0a91f07147386c8f11b36b1410f00b34c7611c Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 11 Jul 2024 10:22:13 -0700 Subject: [PATCH 0715/1766] Remove uwebsockets (#9160) --- .../JavaScript/uwebsockets.js/README.md | 55 ----- .../uwebsockets.js/benchmark_config.json | 68 ------ .../uwebsockets.js/package-lock.json | 105 ---------- .../JavaScript/uwebsockets.js/package.json | 18 -- .../uwebsockets.js/src/clustered.js | 23 --- .../uwebsockets.js/src/database/mysql.js | 16 -- .../uwebsockets.js/src/database/postgres.js | 17 -- .../JavaScript/uwebsockets.js/src/server.js | 194 ------------------ .../JavaScript/uwebsockets.js/src/utils.js | 86 -------- .../uwebsockets.js-mysql.dockerfile | 12 -- .../uwebsockets.js-postgres.dockerfile | 12 -- .../uwebsockets.js/uwebsockets.js.dockerfile | 11 - 12 files changed, 617 deletions(-) delete mode 100644 frameworks/JavaScript/uwebsockets.js/README.md delete mode 100644 frameworks/JavaScript/uwebsockets.js/benchmark_config.json delete mode 100644 frameworks/JavaScript/uwebsockets.js/package-lock.json delete mode 100644 frameworks/JavaScript/uwebsockets.js/package.json delete mode 100644 frameworks/JavaScript/uwebsockets.js/src/clustered.js delete mode 100644 frameworks/JavaScript/uwebsockets.js/src/database/mysql.js delete mode 100644 frameworks/JavaScript/uwebsockets.js/src/database/postgres.js delete mode 100644 frameworks/JavaScript/uwebsockets.js/src/server.js delete mode 100644 frameworks/JavaScript/uwebsockets.js/src/utils.js delete mode 100644 frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile delete mode 100644 frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile delete mode 100644 frameworks/JavaScript/uwebsockets.js/uwebsockets.js.dockerfile diff --git a/frameworks/JavaScript/uwebsockets.js/README.md b/frameworks/JavaScript/uwebsockets.js/README.md deleted file mode 100644 index 73fc530d673..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# uWebSockets.js Benchmarking Test - -uWebSockets is a web server written in C/C++ (https://github.com/uNetworking/uWebSockets) - -µWebSockets.js is a web server bypass for Node.js (https://github.com/uNetworking/uWebSockets.js) - -## Important Libraries - -The tests were run with: - -- [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/) -- [postgres](https://github.com/porsager/postgres/) -- [mariadb](https://github.com/mariadb-corporation/mariadb-connector-nodejs/) - -## Database - -There are individual handlers for each DB approach. The logic for each of them are found here: - -- [PostgreSQL](src/database/postgres.js) -- [MySQL](src/database/mysql.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 -$ DATABASE=mysql 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/uwebsockets.js/benchmark_config.json b/frameworks/JavaScript/uwebsockets.js/benchmark_config.json deleted file mode 100644 index fee055f341a..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/benchmark_config.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "framework": "uwebsockets.js", - "tests": [ - { - "default": { - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "database_os": "Linux", - "display_name": "uWebSockets.js", - "flavor": "NodeJS", - "framework": "uWebSockets.js", - "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": "uWebSockets.js", - "flavor": "NodeJS", - "fortune_url": "/fortunes", - "framework": "uWebSockets.js", - "language": "JavaScript", - "notes": "", - "orm": "Raw", - "os": "Linux", - "platform": "None", - "port": 8080, - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "versus": "nodejs", - "webserver": "None" - }, - "mysql": { - "approach": "Realistic", - "classification": "Platform", - "database": "MySQL", - "database_os": "Linux", - "db_url": "/db", - "display_name": "uWebSockets.js", - "flavor": "NodeJS", - "fortune_url": "/fortunes", - "framework": "uWebSockets.js", - "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/uwebsockets.js/package-lock.json b/frameworks/JavaScript/uwebsockets.js/package-lock.json deleted file mode 100644 index 910703e95b8..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/package-lock.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "name": "uwebsockets.js", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "uwebsockets.js", - "version": "0.0.1", - "license": "MIT", - "dependencies": { - "mariadb": "^3.3.0", - "postgres": "^3.4.4", - "slow-json-stringify": "^2.0.1", - "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" - }, - "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/mariadb": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.0.tgz", - "integrity": "sha512-sAL4bJgbfCAtXcE8bXI+NAMzVaPNkIU8hRZUXYfgNFoWB9U57G3XQiMeCx/A6IrS6y7kGwBLylrwgsZQ8kUYlw==", - "dependencies": { - "@types/geojson": "^7946.0.14", - "@types/node": "^20.11.17", - "denque": "^2.1.0", - "iconv-lite": "^0.6.3", - "lru-cache": "^10.2.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/postgres": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.4.tgz", - "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/porsager" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/slow-json-stringify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/slow-json-stringify/-/slow-json-stringify-2.0.1.tgz", - "integrity": "sha512-jqyzIqTaSkRGcWdWqjmOLKHZgOGUT71ZCTsvQu1xGu9Mqaod7O26y5FJJEmaUQhaTWh0bkXv2qqN0i+EQsD1jQ==" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/uWebSockets.js": { - "version": "20.44.0", - "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#8fa05571bf6ea95be8966ad313d9d39453e381ae" - } - } -} diff --git a/frameworks/JavaScript/uwebsockets.js/package.json b/frameworks/JavaScript/uwebsockets.js/package.json deleted file mode 100644 index ec5bc0c1d73..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "dependencies": { - "mariadb": "^3.3.0", - "postgres": "^3.4.4", - "slow-json-stringify": "^2.0.1", - "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0" - }, - "license": "MIT", - "main": "src/server.js", - "name": "uwebsockets.js", - "private": true, - "scripts": { - "dev": "node src/server.js", - "start": "node src/clustered.js" - }, - "type": "module", - "version": "0.0.1" -} diff --git a/frameworks/JavaScript/uwebsockets.js/src/clustered.js b/frameworks/JavaScript/uwebsockets.js/src/clustered.js deleted file mode 100644 index 95a57ec77f3..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/src/clustered.js +++ /dev/null @@ -1,23 +0,0 @@ -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/uwebsockets.js/src/database/mysql.js b/frameworks/JavaScript/uwebsockets.js/src/database/mysql.js deleted file mode 100644 index a627a74d132..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/src/database/mysql.js +++ /dev/null @@ -1,16 +0,0 @@ -import { createPool } from "mariadb"; -import os from "node:os"; - -const pool = createPool({ - host: "tfb-database", - user: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world", - connectionLimit: os.availableParallelism() -}); - -export const fortunes = async () => await pool.execute("SELECT id, message FROM fortune"); - -export const find = async (id) => await pool.execute("SELECT id, randomnumber FROM world WHERE id = ?", [id]).then((arr) => arr[0]); - -export const bulkUpdate = async (worlds) => await Promise.all(worlds.map(world => pool.execute("UPDATE world SET randomnumber = ? WHERE id = ?", [world.randomNumber, world.id]))); diff --git a/frameworks/JavaScript/uwebsockets.js/src/database/postgres.js b/frameworks/JavaScript/uwebsockets.js/src/database/postgres.js deleted file mode 100644 index 105eeef99e5..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/src/database/postgres.js +++ /dev/null @@ -1,17 +0,0 @@ -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/uwebsockets.js/src/server.js b/frameworks/JavaScript/uwebsockets.js/src/server.js deleted file mode 100644 index 1db7d391f2a..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/src/server.js +++ /dev/null @@ -1,194 +0,0 @@ -import uWebSockets from "uWebSockets.js"; -import { - addBenchmarkHeaders, - generateRandomNumber, - getQueriesCount, - handleError, - escape, - jsonSerializer, - worldObjectSerializer, - sortByMessage -} from "./utils.js"; - -let db; -const { DATABASE } = process.env; -if (DATABASE) db = await import(`./database/${DATABASE}.js`); - -const webserver = uWebSockets.App(); - -webserver.get("/plaintext", new uWebSockets.DeclarativeResponse() - .writeHeader("Server", "uWebSockets.js") - .writeHeader("Content-Type", "text/plain") - .end("Hello, World!") -); - -webserver.get("/json", (response) => { - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "application/json"); - // response.end(JSON.stringify({ message: "Hello, World!" })); - response.end(jsonSerializer({ message: "Hello, World!" })); -}); - -if (db) { - webserver.get("/db", async (response) => { - response.onAborted(() => { - response.aborted = true; - }); - - try { - const row = await db.find(generateRandomNumber()); - - if (response.aborted) { - return; - } - - response.cork(() => { - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "application/json"); - // response.end(JSON.stringify(rows)); - response.end(worldObjectSerializer(row)); - }); - } catch (error) { - if (response.aborted) { - return; - } - - handleError(error, response); - } - }); - - webserver.get("/queries", async (response, request) => { - response.onAborted(() => { - response.aborted = true; - }); - - try { - const queriesCount = getQueriesCount(request); - - const databaseJobs = new Array(queriesCount); - - for (let i = 0; i < queriesCount; i++) { - databaseJobs[i] = db.find(generateRandomNumber()); - } - - const worldObjects = await Promise.all(databaseJobs); - - if (response.aborted) { - return; - } - - response.cork(() => { - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "application/json"); - response.end(JSON.stringify(worldObjects)); - }); - } catch (error) { - if (response.aborted) { - return; - } - - handleError(error, response); - } - }); - - const extra = { id: 0, message: "Additional fortune added at request time." }; - - webserver.get("/fortunes", async (response) => { - response.onAborted(() => { - response.aborted = true; - }); - - try { - const rows = [extra, ...await db.fortunes()]; - - if (response.aborted) { - return; - } - - // rows.push({ - // id: 0, - // message: "Additional fortune added at request time.", - // }); - - // rows.sort((a, b) => (a.message < b.message) ? -1 : 1); - sortByMessage(rows) - - const n = rows.length - - let html = "", i = 0; - for (; i < n; i++) { - html += `${rows[i].id}${escape(rows[i].message)}`; - } - - response.cork(() => { - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "text/html; charset=utf-8"); - response.end(`Fortunes${html}
idmessage
`); - }); - } catch (error) { - if (response.aborted) { - return; - } - - handleError(error, response); - } - }); - - webserver.get("/updates", async (response, request) => { - response.onAborted(() => { - response.aborted = true; - }); - - try { - const queriesCount = getQueriesCount(request); - - 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); - - if (response.aborted) { - return; - } - - response.cork(() => { - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "application/json"); - response.end(JSON.stringify(worldObjects)); - }); - } catch (error) { - if (response.aborted) { - return; - } - - handleError(error, response); - } - }); -} - -webserver.any("/*", (response) => { - response.writeStatus("404 Not Found"); - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "text/plain"); - response.end("Not Found"); -}); - -const host = process.env.HOST || "0.0.0.0"; -const port = parseInt(process.env.PORT || "8080"); -webserver.listen(host, port, (socket) => { - if (!socket) { - console.error(`Couldn't bind to http://${host}:${port}!`); - process.exit(1); - } - - console.log(`Successfully bound to http://${host}:${port}.`); -}); diff --git a/frameworks/JavaScript/uwebsockets.js/src/utils.js b/frameworks/JavaScript/uwebsockets.js/src/utils.js deleted file mode 100644 index b3d46e7e11c..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/src/utils.js +++ /dev/null @@ -1,86 +0,0 @@ -import { sjs, attr } from 'slow-json-stringify' - -/** - * Add Benchmark HTTP response headers. - * - * Add HTTP response headers `Server` which is required by the test suite. - * Header `Date` is automatically added by uWebsockets - * https://github.com/uNetworking/uWebSockets/blob/master/src/HttpResponse.h#L78 - * - * https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview - * - * @param {import('uWebSockets.js').HttpResponse} response - */ -export function addBenchmarkHeaders(response) { - response.writeHeader("Server", "uWebSockets.js"); -} - -/** - * Handle error for response - * - * @param {Error} error - * @param {import('uWebSockets.js').HttpResponse} response - */ -export function handleError(error, response) { - console.error(error); - response.cork(() => { - addBenchmarkHeaders(response); - response.writeHeader("Content-Type", "text/plain"); - response.end("Internal Server Error"); - }); -} - -/** - * Get queries count - * - * @param {import('uWebSockets.js').HttpRequest} request - */ -export function getQueriesCount(request) { - return Math.min(parseInt(request.getQuery("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 Slow json stringify module to get faster results - */ -export const jsonSerializer = sjs({ message: attr("string")}); -export const worldObjectSerializer = sjs({ id: attr('number'), randomnumber: attr('number') }); -// export const worldObjectsSerializer = sjs({ rows: attr("array", worldObjectSerializer) }); - -/** - * 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 -} \ No newline at end of file diff --git a/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile deleted file mode 100644 index 8533d8b9a61..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM node:20-slim - -COPY ./ ./ - -RUN npm install - -ENV NODE_ENV production -ENV DATABASE mysql - -EXPOSE 8080 - -CMD ["npm", "start"] diff --git a/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile deleted file mode 100644 index ba7d0eee5f6..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -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/uwebsockets.js/uwebsockets.js.dockerfile b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js.dockerfile deleted file mode 100644 index 4262ad19953..00000000000 --- a/frameworks/JavaScript/uwebsockets.js/uwebsockets.js.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM node:20-slim - -COPY ./ ./ - -RUN npm install - -ENV NODE_ENV production - -EXPOSE 8080 - -CMD ["npm", "start"] From 4022ec349164c56929c47d283302ad531cac3d26 Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 11 Jul 2024 10:47:19 -0700 Subject: [PATCH 0716/1766] Code of conduct (#9161) --- CODE_OF_CONDUCT.md | 133 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..38838d563cc --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +tfb@techempower.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations From 562e515c5ce3b956861cd089dd5ac3e9d8e61622 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 21:01:40 +0000 Subject: [PATCH 0717/1766] Bump org.apache.wicket:wicket-core in /frameworks/Java/wicket Bumps org.apache.wicket:wicket-core from 9.6.0 to 9.18.0. --- updated-dependencies: - dependency-name: org.apache.wicket:wicket-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/wicket/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/wicket/pom.xml b/frameworks/Java/wicket/pom.xml index ec30df52f27..c0f0303051d 100644 --- a/frameworks/Java/wicket/pom.xml +++ b/frameworks/Java/wicket/pom.xml @@ -24,7 +24,7 @@ 11 2.13.0 1.7.25 - 9.6.0 + 9.18.0 From d2c0d69d7ba404a04f24808f86a1c6f46ad5720c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 16 Jul 2024 17:48:06 +0200 Subject: [PATCH 0718/1766] [rails] Enable YJIT after boot (#9163) There is no need to run the JIT on code that is only used during boot. This is also the new default in newer Rails applications. --- .../Ruby/rails/config/initializers/enable_yjit.rb | 11 +++++++++++ frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 frameworks/Ruby/rails/config/initializers/enable_yjit.rb diff --git a/frameworks/Ruby/rails/config/initializers/enable_yjit.rb b/frameworks/Ruby/rails/config/initializers/enable_yjit.rb new file mode 100644 index 00000000000..963858ab4c6 --- /dev/null +++ b/frameworks/Ruby/rails/config/initializers/enable_yjit.rb @@ -0,0 +1,11 @@ +# Automatically enable YJIT as of Ruby 3.3, as it bring very +# sizeable performance improvements. + +# If you are deploying to a memory constrained environment +# you may want to delete this file, but otherwise it's free +# performance. +if defined? RubyVM::YJIT.enable + Rails.application.config.after_initialize do + RubyVM::YJIT.enable + end +end diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index ae512cbdafd..b14a3b75af6 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -5,7 +5,7 @@ RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-se EXPOSE 8080 WORKDIR /rails -ENV RUBY_YJIT_ENABLE=1 +# ENV RUBY_YJIT_ENABLE=1 YJIT is enabled in config/initializers/enable_yjit.rb # Use Jemalloc RUN apt-get update && \ diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 99c16e935bb..392920be9c4 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -5,7 +5,8 @@ RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-se EXPOSE 8080 WORKDIR /rails -ENV RUBY_YJIT_ENABLE=1 +# ENV RUBY_YJIT_ENABLE=1 YJIT is enabled in config/initializers/enable_yjit.rb + # Use Jemalloc RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 From 93918507a4b9ce2d35f4e40596acde022dda8498 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 16 Jul 2024 17:48:42 +0200 Subject: [PATCH 0719/1766] [ruby/roda] Use rapidjson for faster JSON serialization (#9164) --- frameworks/Ruby/roda-sequel/Gemfile | 2 +- frameworks/Ruby/roda-sequel/boot.rb | 5 +---- frameworks/Ruby/roda-sequel/hello_world.rb | 8 ++++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index c9c6a48ab89..e511bb3d848 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -7,7 +7,7 @@ gem "sequel", "~> 5.67" gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" gem "unicorn", "~> 6.1", platforms: %i[ruby mswin], require: false -gem "oj", "~> 3.14" +gem "rapidjson" group :mysql do gem "mysql2", "~> 0.5", platforms: %i[ruby mswin] diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index ebeb5a584c4..bc7277e2362 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require "bundler/setup" require "time" -require "oj" +require "rapidjson" MAX_PK = 10_000 QUERY_RANGE = (1..MAX_PK).freeze ALL_IDS = QUERY_RANGE.to_a @@ -9,9 +9,6 @@ QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true -# Use the OJ gem instead of the JSON one -Oj.mimic_JSON() - SERVER_STRING = if defined?(PhusionPassenger) [ diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 6a0a43efccb..458e1a7c687 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -22,13 +22,13 @@ def rand1 # Test type 1: JSON serialization r.is "json" do response[CONTENT_TYPE] = JSON_TYPE - { message: "Hello, World!" }.to_json + RapidJSON.encode({ message: "Hello, World!" }) end # Test type 2: Single database query r.is "db" do response[CONTENT_TYPE] = JSON_TYPE - World.with_pk(rand1).values.to_json + RapidJSON.encode(World.with_pk(rand1).values) end # Test type 3: Multiple database queries @@ -40,7 +40,7 @@ def rand1 World.with_pk(id).values end end - worlds.to_json + RapidJSON.encode(worlds) end # Test type 4: Fortunes @@ -70,7 +70,7 @@ def rand1 end World.batch_update(worlds) end - worlds.map(&:values).to_json + RapidJSON.encode(worlds.map!(&:values)) end # Test type 6: Plaintext From e1dcb73c829d2a7b76d45a436522a4fec3489fde Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 16 Jul 2024 17:48:59 +0200 Subject: [PATCH 0720/1766] [ruby/rack] Enable Rubys M:N thread scheduler for Puma (#8678) With the M:N thread scheduler thread creation and management cost are reduced. --- frameworks/Ruby/rack/rack.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index e40bfced37a..b9b39c43122 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -1,6 +1,7 @@ FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 +ENV RUBY_MN_THREADS=1 # Use Jemalloc RUN apt-get update && \ From 527c38d3dcc3967feca67a93730b1d0780c43e8a Mon Sep 17 00:00:00 2001 From: Edgar Espina Date: Tue, 16 Jul 2024 11:49:14 -0400 Subject: [PATCH 0721/1766] jooby: upgrade 3.2.4 (#9156) - get back threadlocal buffer for fortunes - implements vertx like sql updates --- frameworks/Java/jooby/pom.xml | 4 +- .../src/main/java/com/techempower/App.java | 9 +-- .../main/java/com/techempower/PgClient.java | 75 +++++++++++++++---- .../main/java/com/techempower/ReactivePg.java | 18 +---- .../rocker/BufferRockerOutput.java | 65 ++++++++++++++++ 5 files changed, 134 insertions(+), 37 deletions(-) create mode 100644 frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index 338f8ca065d..bd6ce1a1c68 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,8 +11,8 @@ jooby - 3.1.2 - 4.1.110.Final + 3.2.4 + 4.1.111.Final 2.0.2 42.7.3 UTF-8 diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/App.java b/frameworks/Java/jooby/src/main/java/com/techempower/App.java index f7cf3373b4a..7a75f05d60b 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/App.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/App.java @@ -28,13 +28,8 @@ public class App extends Jooby { private static final byte[] MESSAGE_BYTES = MESSAGE.getBytes(StandardCharsets.US_ASCII); - private static final ByteBuffer MESSAGE_BUFFER = (ByteBuffer) ByteBuffer - .allocateDirect(MESSAGE_BYTES.length) - .put(MESSAGE_BYTES) - .flip(); - { - + var bufferFactory = getBufferFactory(); /** Database: */ install(new HikariModule()); DataSource ds = require(DataSource.class); @@ -43,7 +38,7 @@ public class App extends Jooby { install(new RockerModule()); get("/plaintext", ctx -> - ctx.send(MESSAGE_BUFFER.duplicate()) + ctx.send(bufferFactory.wrap(MESSAGE_BYTES)) ); get("/json", ctx -> ctx diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java b/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java index 4847ddab1de..dd5e9197f01 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java @@ -1,5 +1,7 @@ package com.techempower; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.function.BiConsumer; @@ -32,10 +34,13 @@ public class PgClient { private static final String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; private static class DbConnection { + private SqlClientInternal queries; private PreparedQuery> SELECT_WORLD_QUERY; private PreparedQuery> SELECT_FORTUNE_QUERY; private PreparedQuery> UPDATE_WORLD_QUERY; - private SqlClientInternal connection; + private SqlClientInternal updates; + @SuppressWarnings("unchecked") + private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[128]; } private static class DbConnectionFactory extends ThreadLocal { @@ -64,20 +69,32 @@ private Handler> onSuccess(Handler handler) { .setWorkerPoolSize(1) .setInternalBlockingPoolSize(1) ); - var future = PgConnection.connect(vertx, options) + var client1 = PgConnection.connect(vertx, options) .flatMap(conn -> { - result.connection = (SqlClientInternal) conn; + result.queries = (SqlClientInternal) conn; Future f1 = conn.prepare(SELECT_WORLD) .andThen(onSuccess(ps -> result.SELECT_WORLD_QUERY = ps.query())); Future f2 = conn.prepare(SELECT_FORTUNE) .andThen(onSuccess(ps -> result.SELECT_FORTUNE_QUERY = ps.query())); - Future f3 = conn.prepare(UPDATE_WORLD) - .andThen(onSuccess(ps -> result.UPDATE_WORLD_QUERY = ps.query())); - return Future.join(f1, f2, f3); - }) - .toCompletionStage() - .toCompletableFuture() - .get(); + return Future.join(f1, f2); + }); + + var client2 = PgConnection.connect(vertx, options) + .flatMap(conn -> { + result.updates = (SqlClientInternal) conn; + List> list = new ArrayList<>(); + Future f1 = conn.prepare(UPDATE_WORLD) + .andThen(onSuccess(ps -> result.UPDATE_WORLD_QUERY = ps.query())); + list.add(f1); + for (int i = 0; i < result.AGGREGATED_UPDATE_WORLD_QUERY.length; i++) { + int idx = i; + list.add(conn + .prepare(buildAggregatedUpdateQuery(1 + idx)) + .andThen(onSuccess(ps -> result.AGGREGATED_UPDATE_WORLD_QUERY[idx] = ps.query()))); + } + return Future.join(list); + }); + var future = Future.join(client1, client2).toCompletionStage().toCompletableFuture().get(); Throwable cause = future.cause(); if (cause != null) { @@ -91,6 +108,18 @@ private Handler> onSuccess(Handler handler) { throw SneakyThrows.propagate(ex.getCause()); } } + + private static String buildAggregatedUpdateQuery(int len) { + StringBuilder sb = new StringBuilder(); + sb.append("UPDATE world SET randomNumber = update_data.randomNumber FROM (VALUES"); + char sep = ' '; + for (int i = 1;i <= len;i++) { + sb.append(sep).append("($").append(2 * i - 1).append("::int,$").append(2 * i).append("::int)"); + sep = ','; + } + sb.append(") AS update_data (id, randomNumber) WHERE world.id = update_data.id"); + return sb.toString(); + } } private final ThreadLocal sqlClient; @@ -104,7 +133,7 @@ public void selectWorld(Tuple row, Handler>> handler) { } public void selectWorlds(int queries, Handler>> handler) { - this.sqlClient.get().connection.group(c -> { + this.sqlClient.get().queries.group(c -> { for (int i = 0; i < queries; i++) { c.preparedQuery(SELECT_WORLD).execute(Tuple.of(Util.randomWorld()), handler); } @@ -117,7 +146,7 @@ public void fortunes(Handler>> handler) { public void selectWorldForUpdate(int queries, BiConsumer>> consumer) { - this.sqlClient.get().connection.group(c -> { + this.sqlClient.get().queries.group(c -> { PreparedQuery> statement = c.preparedQuery(SELECT_WORLD); for (int i = 0; i < queries; i++) { consumer.accept(i, statement); @@ -125,8 +154,26 @@ public void selectWorldForUpdate(int queries, }); } - public void updateWorld(List batch, Handler>> handler) { - this.sqlClient.get().UPDATE_WORLD_QUERY.executeBatch(batch, handler); + public void updateWorld(World[] worlds, Handler>> handler) { + Arrays.sort(worlds); + int len = worlds.length; + var connection = this.sqlClient.get(); + if (0 < len && len <= connection.AGGREGATED_UPDATE_WORLD_QUERY.length) { + List arguments = new ArrayList<>(); + for (World world : worlds) { + arguments.add(world.getId()); + arguments.add(world.getRandomNumber()); + } + Tuple tuple = Tuple.tuple(arguments); + PreparedQuery> query = connection.AGGREGATED_UPDATE_WORLD_QUERY[len - 1]; + query.execute(tuple, handler); + } else { + List batch = new ArrayList<>(); + for (World world : worlds) { + batch.add(Tuple.of(world.getRandomNumber(), world.getId())); + } + connection.UPDATE_WORLD_QUERY.executeBatch(batch, handler); + } } private PgConnectOptions pgPoolOptions(Config config) { diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java index 6a674c5e8df..c0eef6fb05a 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java @@ -7,10 +7,8 @@ import java.util.*; import com.fizzed.rocker.RockerOutputFactory; -import io.jooby.Context; -import io.jooby.Jooby; -import io.jooby.MediaType; -import io.jooby.ServerOptions; +import com.techempower.rocker.BufferRockerOutput; +import io.jooby.*; import io.jooby.rocker.DataBufferOutput; import io.jooby.rocker.RockerModule; import io.vertx.sqlclient.Row; @@ -18,7 +16,6 @@ import io.vertx.sqlclient.Tuple; public class ReactivePg extends Jooby { - { /** Reduce the number of resources due we do reactive processing. */ setServerOptions( @@ -84,14 +81,7 @@ public class ReactivePg extends Jooby { selectCallback.result().iterator().next().getInteger(0), randomWorld()); if (index == queries - 1) { - // Sort results... avoid dead locks - Arrays.sort(result); - List batch = new ArrayList<>(queries); - for (World world : result) { - batch.add(Tuple.of(world.getRandomNumber(), world.getId())); - } - - client.updateWorld(batch, updateCallback -> { + client.updateWorld(result, updateCallback -> { if (updateCallback.failed()) { sendError(ctx, updateCallback.cause()); } else { @@ -106,7 +96,7 @@ public class ReactivePg extends Jooby { }).setNonBlocking(true); /** Fortunes: */ - RockerOutputFactory factory = require(RockerOutputFactory.class); + var factory = BufferRockerOutput.factory(); get("/fortunes", ctx -> { client.fortunes(rsp -> { if (rsp.succeeded()) { diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java b/frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java new file mode 100644 index 00000000000..78abf2056e4 --- /dev/null +++ b/frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java @@ -0,0 +1,65 @@ +package com.techempower.rocker; + +import com.fizzed.rocker.ContentType; +import com.fizzed.rocker.RockerOutput; +import com.fizzed.rocker.RockerOutputFactory; + +import java.io.IOException; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class BufferRockerOutput implements RockerOutput { + private final ByteBuffer buffer; + + public BufferRockerOutput(ByteBuffer buffer) { + this.buffer = buffer; + } + + @Override + public ContentType getContentType() { + return ContentType.RAW; + } + + @Override + public Charset getCharset() { + return StandardCharsets.UTF_8; + } + + @Override + public BufferRockerOutput w(String string) throws IOException { + buffer.put(string.getBytes(getCharset())); + return this; + } + + @Override + public BufferRockerOutput w(byte[] bytes) throws IOException { + buffer.put(bytes); + return this; + } + + @Override + public int getByteLength() { + return buffer.remaining(); + } + + public ByteBuffer toBuffer() { + return buffer.flip(); + } + + public static RockerOutputFactory factory() { + var cache = new ThreadLocal() { + @Override + protected BufferRockerOutput initialValue() { + return new BufferRockerOutput(ByteBuffer.allocateDirect(2048)); + } + }; + return (contentType, charsetName) -> cache.get().reset(); + } + + private BufferRockerOutput reset() { + buffer.clear(); + return this; + } +} From 03c1c5c2830aca23f2e29e7f6e46aaaf4ed8b30d Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Tue, 16 Jul 2024 22:49:35 +0700 Subject: [PATCH 0722/1766] [Ktor] Latest Ktor, serializer, html dsl versions (#9128) * latest Ktor, serializer, html dsl versions jvm runtime is now 17 Update README.md modernized all ktor tests to jvm 17 and latest ktor small pgclient memory optimizations big cleanup, removed pg-reactive-client, since it's evolution is already being tested a small memory optimization * fixed obsolete config * cleaned up legacy test --- frameworks/Kotlin/ktor/benchmark_config.json | 23 ---- frameworks/Kotlin/ktor/config.toml | 17 --- .../Kotlin/ktor/ktor-asyncdb/build.gradle | 41 ------ .../Kotlin/ktor/ktor-asyncdb/build.gradle.kts | 36 ++++++ .../ktor/ktor-asyncdb/gradle.properties | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../ktor/ktor-asyncdb/src/main/kotlin/main.kt | 118 ++++++------------ frameworks/Kotlin/ktor/ktor-cio.dockerfile | 4 +- .../Kotlin/ktor/ktor-exposed-dao.dockerfile | 2 +- .../Kotlin/ktor/ktor-exposed-dsl.dockerfile | 2 +- .../ktor/ktor-exposed/app/build.gradle.kts | 10 +- frameworks/Kotlin/ktor/ktor-jasync.dockerfile | 4 +- frameworks/Kotlin/ktor/ktor-jetty.dockerfile | 4 +- .../Kotlin/ktor/ktor-pgclient.dockerfile | 4 +- .../ktor/ktor-pgclient/build.gradle.kts | 25 ++-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../ktor-pgclient/src/main/kotlin/main.kt | 28 +++-- .../Kotlin/ktor/ktor-reactivepg.dockerfile | 13 -- frameworks/Kotlin/ktor/ktor.dockerfile | 6 +- frameworks/Kotlin/ktor/ktor/README.md | 4 +- frameworks/Kotlin/ktor/ktor/pom.xml | 19 ++- .../org/jetbrains/ktor/benchmarks/Hello.kt | 23 ++-- 22 files changed, 156 insertions(+), 235 deletions(-) delete mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle create mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts delete mode 100644 frameworks/Kotlin/ktor/ktor-reactivepg.dockerfile diff --git a/frameworks/Kotlin/ktor/benchmark_config.json b/frameworks/Kotlin/ktor/benchmark_config.json index f675237f4b9..3a213a240ba 100644 --- a/frameworks/Kotlin/ktor/benchmark_config.json +++ b/frameworks/Kotlin/ktor/benchmark_config.json @@ -94,29 +94,6 @@ "notes": "", "versus": "netty" }, - "reactivepg": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/query/?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Ktor", - "language": "Kotlin", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Ktor-reactivepg", - "notes": "", - "versus": "netty" - }, "pgclient": { "plaintext_url": "/plaintext", "json_url": "/json", diff --git a/frameworks/Kotlin/ktor/config.toml b/frameworks/Kotlin/ktor/config.toml index 6077323686d..1c58e63c73f 100644 --- a/frameworks/Kotlin/ktor/config.toml +++ b/frameworks/Kotlin/ktor/config.toml @@ -35,23 +35,6 @@ platform = "None" webserver = "None" versus = "netty" -[reactivepg] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/query/?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "netty" - [cio] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle b/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle deleted file mode 100644 index 9a7b3bf67ee..00000000000 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle +++ /dev/null @@ -1,41 +0,0 @@ -plugins { - id "java" - id "application" - id 'org.jetbrains.kotlin.jvm' - id 'kotlinx-serialization' - id 'com.github.johnrengelman.shadow' version '4.0.3' -} - -group 'org.jetbrains.ktor' -version '1.0-SNAPSHOT' - -mainClassName = "MainKt" - -repositories { - mavenCentral() - jcenter() - maven { url "https://kotlin.bintray.com/kotlinx" } -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1" - compile "io.ktor:ktor-server-netty:$ktor_version" - compile "io.ktor:ktor-html-builder:$ktor_version" - compile "com.github.jasync-sql:jasync-postgresql:0.9.39" - compile "io.reactiverse:reactive-pg-client:0.11.3" - compile 'io.vertx:vertx-lang-kotlin-coroutines:3.7.0' -} - -compileKotlin { - kotlinOptions.jvmTarget = "1.8" -} -compileTestKotlin { - kotlinOptions.jvmTarget = "1.8" -} - -shadowJar { - baseName = "bench" - classifier = null - version = null -} diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts new file mode 100644 index 00000000000..61cedf013ce --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts @@ -0,0 +1,36 @@ +plugins { + application + kotlin("jvm") version "1.9.22" + kotlin("plugin.serialization") version "2.0.0" + id("com.github.johnrengelman.shadow") version "8.1.0" +} + +group = "org.jetbrains.ktor" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +application { + mainClass.set("MainKt") +} + +val ktor_version = "2.3.12" +val kotlinx_serialization_version = "1.6.3" +val vertx_pg_client = "4.5.8" + +dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1") + implementation("io.ktor:ktor-server-netty:$ktor_version") + implementation("io.ktor:ktor-server-default-headers:$ktor_version") + implementation("io.ktor:ktor-server-html-builder:$ktor_version") + implementation("com.github.jasync-sql:jasync-postgresql:2.2.0") +} + +tasks.shadowJar { + archiveBaseName.set("bench") + archiveClassifier.set("") + archiveVersion.set("") +} diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties index f8ca4442eea..5790d58ceda 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties @@ -1,4 +1,4 @@ kotlin.code.style=official -kotlin_version=1.3.31 -ktor_version=1.2.0 +kotlin_version=1.9.22 +ktor_version=2.3.12 diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties index e15293214f9..3d66c176054 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt index ca7d9e5713e..e9f4221d8ed 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt @@ -1,28 +1,21 @@ import com.github.jasync.sql.db.ConnectionPoolConfiguration +import com.github.jasync.sql.db.QueryResult import com.github.jasync.sql.db.SuspendingConnection import com.github.jasync.sql.db.asSuspending import com.github.jasync.sql.db.postgresql.PostgreSQLConnectionBuilder -import io.ktor.application.call -import io.ktor.application.install -import io.ktor.features.DefaultHeaders -import io.ktor.html.Placeholder -import io.ktor.html.Template -import io.ktor.html.insert -import io.ktor.html.respondHtmlTemplate import io.ktor.http.ContentType -import io.ktor.response.respondText -import io.ktor.routing.get -import io.ktor.routing.routing +import io.ktor.server.application.* import io.ktor.server.engine.embeddedServer +import io.ktor.server.html.* import io.ktor.server.netty.Netty -import io.reactiverse.kotlin.pgclient.getConnectionAwait -import io.reactiverse.kotlin.pgclient.preparedBatchAwait -import io.reactiverse.kotlin.pgclient.preparedQueryAwait -import io.reactiverse.pgclient.* +import io.ktor.server.plugins.defaultheaders.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.coroutines.* import kotlinx.html.* import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JSON -import kotlinx.serialization.list +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import java.lang.IllegalArgumentException import kotlin.random.Random import kotlin.random.nextInt @@ -44,73 +37,48 @@ interface Repository { } class JasyncRepository() : Repository { - private val dbConfig: ConnectionPoolConfiguration - private val db: SuspendingConnection - - init { - dbConfig = ConnectionPoolConfiguration( - "tfb-database", - database = "hello_world", - username = "benchmarkdbuser", - password = "benchmarkdbpass", - maxActiveConnections = 64 - ) - db = PostgreSQLConnectionBuilder.createConnectionPool(dbConfig).asSuspending + companion object { + const val WORLD_QUERY = "select id, randomNumber from world where id = ?" + const val FORTUNES_QUERY = "select id, message from fortune" + const val UPDATE_QUERY = "update world set randomNumber = ? where id = ?" } + private val dbConfig: ConnectionPoolConfiguration = ConnectionPoolConfiguration( + "tfb-database", + database = "hello_world", + username = "benchmarkdbuser", + password = "benchmarkdbpass", + maxActiveConnections = 64 + ) + private val db: SuspendingConnection = PostgreSQLConnectionBuilder.createConnectionPool(dbConfig).asSuspending + override suspend fun getWorld(): World { val worldId = rand.nextInt(1, 10000) - val result = db.sendPreparedStatement("select id, randomNumber from world where id = ?", listOf(worldId)) + val result = db.sendPreparedStatement(WORLD_QUERY, listOf(worldId)) val row = result.rows.first() return World(row.getInt(0)!!, row.getInt(1)!!) } override suspend fun getFortunes(): List { - val results = db.sendPreparedStatement("select id, message from fortune") + val results = db.sendPreparedStatement(FORTUNES_QUERY) return results.rows.map { Fortune(it.getInt(0)!!, it.getString(1)!!) } } override suspend fun updateWorlds(worlds: List) { - worlds.forEach { world -> - db.sendPreparedStatement( - "update world set randomNumber = ? where id = ?", - listOf(world.randomNumber, world.id) - ) - } - } -} + coroutineScope { + val jobs = ArrayList>(worlds.size) + worlds.forEach { world -> + val deferred = async(Dispatchers.IO) { + db.sendPreparedStatement( + UPDATE_QUERY, + listOf(world.randomNumber, world.id) + ) + } + jobs.add(deferred) + } -class ReactivePGRepository : Repository { - private val db: PgPool - - init { - val poolOptions = PgPoolOptions() - poolOptions.apply { - host = "tfb-database" - database = "hello_world" - user = "benchmarkdbuser" - password = "benchmarkdbpass" - maxSize = 64 - cachePreparedStatements = true + jobs.awaitAll() } - db = PgClient.pool(poolOptions) - } - - override suspend fun getFortunes(): List { - val results = db.preparedQueryAwait("select id, message from fortune") - return results.map { Fortune(it.getInteger(0), it.getString(1)) } - } - - override suspend fun getWorld(): World { - val worldId = rand.nextInt(1, 10000) - val result = db.preparedQueryAwait("select id, randomNumber from world where id = $1", Tuple.of(worldId)) - val row = result.first() - return World(row.getInteger(0), row.getInteger(1)!!) - } - - override suspend fun updateWorlds(worlds: List) { - val batch = worlds.map { Tuple.of(it.id, it.randomNumber) } - db.preparedBatchAwait("update world set randomNumber = $1 where id = $2", batch) } } @@ -132,7 +100,7 @@ class MainTemplate : Template { } } -class FortuneTemplate(val fortunes: List, val main: MainTemplate = MainTemplate()) : Template { +class FortuneTemplate(private val fortunes: List, private val main: MainTemplate = MainTemplate()) : Template { override fun HTML.apply() { insert(main) { content { @@ -156,13 +124,9 @@ class FortuneTemplate(val fortunes: List, val main: MainTemplate = Main fun main(args: Array) { val db = when(args.firstOrNull()) { "jasync-sql" -> JasyncRepository() - "reactive-pg" -> ReactivePGRepository() else -> throw IllegalArgumentException("Must specify a postgres client") } - val messageSerializer = Message.serializer() - val worldSerializer = World.serializer() - val server = embeddedServer(Netty, 8080, configure = { shareWorkGroup = true }) { @@ -174,19 +138,19 @@ fun main(args: Array) { get("/json") { call.respondText( - JSON.stringify(messageSerializer, Message("Hello, World!")), + Json.encodeToString(Message("Hello, World!")), ContentType.Application.Json ) } get("/db") { - call.respondText(JSON.stringify(worldSerializer, db.getWorld()), ContentType.Application.Json) + call.respondText(Json.encodeToString(db.getWorld()), ContentType.Application.Json) } get("/query/") { val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 val worlds = (1..queries).map { db.getWorld() } - call.respondText(JSON.stringify(worldSerializer.list, worlds), ContentType.Application.Json) + call.respondText(Json.encodeToString(worlds), ContentType.Application.Json) } get("/fortunes") { @@ -204,7 +168,7 @@ fun main(args: Array) { db.updateWorlds(newWorlds) - call.respondText(JSON.stringify(worldSerializer.list, newWorlds), ContentType.Application.Json) + call.respondText(Json.encodeToString(newWorlds), ContentType.Application.Json) } } } diff --git a/frameworks/Kotlin/ktor/ktor-cio.dockerfile b/frameworks/Kotlin/ktor/ktor-cio.dockerfile index 6ba40b6eccc..33059ec9fd4 100644 --- a/frameworks/Kotlin/ktor/ktor-cio.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-cio.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.9.7-amazoncorretto-17-debian as maven WORKDIR /ktor COPY ktor/pom.xml pom.xml COPY ktor/src src RUN mvn clean package -q -FROM openjdk:11.0.3-jdk-stretch +FROM amazoncorretto:17.0.11-al2023-headless WORKDIR /ktor COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-cio-bundle.jar app.jar diff --git a/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile b/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile index 9867cf2931c..e12a664f8dc 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.0.2-jdk11 +FROM gradle:jdk17 WORKDIR /ktor-exposed COPY ktor-exposed/settings.gradle.kts settings.gradle.kts diff --git a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile index 5b7f7fe722a..f65069e6b78 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:8.0.2-jdk11 +FROM gradle:jdk17 WORKDIR /ktor-exposed COPY ktor-exposed/settings.gradle.kts settings.gradle.kts diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts index 4d798b53bcf..60f4dab3b17 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts @@ -1,7 +1,7 @@ plugins { - kotlin("jvm") version "1.8.10" - kotlin("plugin.serialization") version "1.8.10" application + kotlin("jvm") version "1.9.22" + kotlin("plugin.serialization") version "2.0.0" id("com.github.johnrengelman.shadow") version "8.1.0" } @@ -9,9 +9,9 @@ repositories { mavenCentral() } -val ktorVersion = "2.2.3" -val kotlinxSerializationVersion = "1.5.0" -val exposedVersion = "0.41.1" +val ktorVersion = "2.3.12" +val kotlinxSerializationVersion = "1.6.3" +val exposedVersion = "0.52.0" dependencies { implementation("io.ktor:ktor-server-core:$ktorVersion") diff --git a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile index 38649f62693..8c66e81ea4e 100644 --- a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile @@ -1,7 +1,7 @@ -FROM openjdk:11.0.3-jdk-stretch +FROM maven:3.9.7-amazoncorretto-17-debian WORKDIR /app COPY ktor-asyncdb/gradle gradle -COPY ktor-asyncdb/build.gradle build.gradle +COPY ktor-asyncdb/build.gradle.kts build.gradle.kts COPY ktor-asyncdb/gradle.properties gradle.properties COPY ktor-asyncdb/gradlew gradlew COPY ktor-asyncdb/settings.gradle settings.gradle diff --git a/frameworks/Kotlin/ktor/ktor-jetty.dockerfile b/frameworks/Kotlin/ktor/ktor-jetty.dockerfile index 3976e5f2df9..e753d7cc442 100644 --- a/frameworks/Kotlin/ktor/ktor-jetty.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-jetty.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.9.7-amazoncorretto-17-debian as maven WORKDIR /ktor COPY ktor/pom.xml pom.xml COPY ktor/src src RUN mvn clean package -q -FROM openjdk:11.0.3-jdk-stretch +FROM amazoncorretto:17.0.11-al2023-headless WORKDIR /ktor COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-jetty-bundle.jar app.jar diff --git a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile index be123f07e6f..0cf012e7596 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:11.0.3-jdk-stretch as build +FROM maven:3.9.7-amazoncorretto-17-debian as build WORKDIR /app COPY ktor-pgclient/gradle gradle COPY ktor-pgclient/build.gradle.kts build.gradle.kts @@ -6,7 +6,7 @@ COPY ktor-pgclient/gradlew gradlew COPY ktor-pgclient/src src RUN /app/gradlew --no-daemon shadowJar -FROM openjdk:11.0.3-jdk-slim +FROM amazoncorretto:17.0.11-al2023-headless WORKDIR /app COPY --from=build /app/build/libs/ktor-pgclient.jar ktor-pgclient.jar diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts index f57c372b49f..f080b64d69f 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts @@ -1,8 +1,8 @@ plugins { application - kotlin("jvm") version "1.6.10" - id("org.jetbrains.kotlin.plugin.serialization") version "1.6.21" - id("com.github.johnrengelman.shadow") version "7.1.2" + kotlin("jvm") version "1.9.22" + kotlin("plugin.serialization") version "2.0.0" + id("com.github.johnrengelman.shadow") version "8.1.0" } group = "org.jetbrains.ktor" @@ -16,19 +16,20 @@ application { mainClass.set("MainKt") } +val ktor_version = "2.3.12" + dependencies { - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2") - implementation("io.ktor:ktor-server-netty:2.0.1") - implementation("io.ktor:ktor-server-html-builder-jvm:2.0.1") - implementation("io.ktor:ktor-server-default-headers-jvm:2.0.1") - implementation("io.vertx:vertx-pg-client:4.2.3") - implementation("io.vertx:vertx-lang-kotlin:4.2.3") - implementation("io.vertx:vertx-lang-kotlin-coroutines:4.2.3") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") + implementation("io.ktor:ktor-server-netty:$ktor_version") + implementation("io.ktor:ktor-server-html-builder-jvm:$ktor_version") + implementation("io.ktor:ktor-server-default-headers-jvm:$ktor_version") + implementation("io.vertx:vertx-pg-client:4.5.8") + implementation("io.vertx:vertx-lang-kotlin:4.5.8") + implementation("io.vertx:vertx-lang-kotlin-coroutines:4.5.8") } tasks.withType().configureEach { - kotlinOptions.jvmTarget = "11" + kotlinOptions.jvmTarget = "17" } tasks.shadowJar { diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties index aa991fceae6..e1bef7e873c 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt index b4f7dc89615..c8e74244f99 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt +++ b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt @@ -7,6 +7,8 @@ import io.ktor.server.plugins.defaultheaders.* import io.ktor.server.response.* import io.ktor.server.routing.* import io.vertx.kotlin.coroutines.await +import io.vertx.kotlin.coroutines.coAwait +import io.vertx.pgclient.PgBuilder import io.vertx.pgclient.PgConnectOptions import io.vertx.pgclient.PgPool import io.vertx.sqlclient.PoolOptions @@ -35,6 +37,12 @@ interface Repository { } class PgclientRepository : Repository { + companion object { + private const val FORTUNES_QUERY = "select id, message from FORTUNE" + private const val SELECT_WORLD_QUERY = "SELECT id, randomnumber from WORLD where id=$1" + private const val UPDATE_WORLD_QUERY = "UPDATE WORLD SET randomnumber=$1 WHERE id=$2" + } + private val connectOptions = PgConnectOptions().apply { port = 5432 @@ -47,21 +55,23 @@ class PgclientRepository : Repository { } private val poolOptions = PoolOptions() - private val client = ThreadLocal.withInitial { PgPool.client(connectOptions, poolOptions) } - private fun client() = client.get() + private val client = PgBuilder.client() + .with(poolOptions) + .connectingTo(connectOptions) + .build() override suspend fun getFortunes(): List { - val results = client().preparedQuery("select id, message from fortune").execute().await() + val results = client.preparedQuery(FORTUNES_QUERY).execute().coAwait() return results.map { Fortune(it.getInteger(0), it.getString(1)) } } override suspend fun getWorld(): World { val worldId = rand.nextInt(1, 10001) val result = - client() - .preparedQuery("select id, randomNumber from world where id = $1") + client + .preparedQuery(SELECT_WORLD_QUERY) .execute(Tuple.of(worldId)) - .await() + .coAwait() val row = result.first() return World(row.getInteger(0), row.getInteger(1)!!) } @@ -69,10 +79,10 @@ class PgclientRepository : Repository { override suspend fun updateWorlds(worlds: List) { // Worlds should be sorted before being batch-updated with to avoid data race and deadlocks. val batch = worlds.sortedBy { it.id }.map { Tuple.of(it.randomNumber, it.id) } - client() - .preparedQuery("update world set randomNumber = $1 where id = $2") + client + .preparedQuery(UPDATE_WORLD_QUERY) .executeBatch(batch) - .await() + .coAwait() } } diff --git a/frameworks/Kotlin/ktor/ktor-reactivepg.dockerfile b/frameworks/Kotlin/ktor/ktor-reactivepg.dockerfile deleted file mode 100644 index 41476da82ba..00000000000 --- a/frameworks/Kotlin/ktor/ktor-reactivepg.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM openjdk:11.0.3-jdk-stretch -WORKDIR /app -COPY ktor-asyncdb/gradle gradle -COPY ktor-asyncdb/build.gradle build.gradle -COPY ktor-asyncdb/gradle.properties gradle.properties -COPY ktor-asyncdb/gradlew gradlew -COPY ktor-asyncdb/settings.gradle settings.gradle -COPY ktor-asyncdb/src src -RUN /app/gradlew --no-daemon shadowJar - -EXPOSE 9090 - -CMD ["java", "-server", "-XX:+UseParallelGC", "-Xms2G","-Xmx2G", "-jar", "/app/build/libs/bench.jar", "reactive-pg"] diff --git a/frameworks/Kotlin/ktor/ktor.dockerfile b/frameworks/Kotlin/ktor/ktor.dockerfile index 36aa32fd8c2..1558d312736 100644 --- a/frameworks/Kotlin/ktor/ktor.dockerfile +++ b/frameworks/Kotlin/ktor/ktor.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.9.7-amazoncorretto-17-debian as maven WORKDIR /ktor COPY ktor/pom.xml pom.xml COPY ktor/src src RUN mvn clean package -q -FROM openjdk:11.0.3-jdk-stretch +FROM amazoncorretto:17.0.11-al2023-headless WORKDIR /ktor COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-netty-bundle.jar app.jar EXPOSE 9090 -CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] diff --git a/frameworks/Kotlin/ktor/ktor/README.md b/frameworks/Kotlin/ktor/ktor/README.md index 07cb92359c2..e3c141a70e0 100644 --- a/frameworks/Kotlin/ktor/ktor/README.md +++ b/frameworks/Kotlin/ktor/ktor/README.md @@ -5,13 +5,13 @@ More information is available at [ktor.io](http://ktor.io). # Setup -* Java 8 +* Java 17 * MySQL server # Requirements * Maven 3 -* JDK 8 +* JDK 17 * Kotlin * ktor * netty diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 35ad4547a16..a794bb59fe3 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -12,10 +12,10 @@ org.jetbrains.ktor tech-empower-framework-benchmark - 1.6.21 - 2.0.1 - 1.3.2 - 0.7.3 + 1.9.22 + 2.3.11 + 1.6.3 + 0.11.0 UTF-8 5.0.0 1.2.13 @@ -24,11 +24,6 @@ - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - org.jetbrains.kotlin kotlin-reflect @@ -85,17 +80,17 @@ io.ktor ktor-server-netty-jvm - 2.0.0 + ${ktor.version} io.ktor ktor-server-jetty-jvm - 2.0.0 + ${ktor.version} io.ktor ktor-server-cio-jvm - 2.0.0 + ${ktor.version} diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index b767e0605f5..82bdd34bc66 100644 --- a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -9,12 +9,14 @@ import io.ktor.server.html.* import io.ktor.server.plugins.defaultheaders.* import io.ktor.server.response.* import io.ktor.server.routing.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import kotlinx.html.* import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import org.jetbrains.ktor.benchmarks.Constants.FORTUNES_QUERY +import org.jetbrains.ktor.benchmarks.Constants.UPDATE_QUERY +import org.jetbrains.ktor.benchmarks.Constants.WORLD_QUERY import java.sql.Connection import java.util.concurrent.ThreadLocalRandom @@ -30,7 +32,7 @@ data class Fortune(val id: Int, var message: String) fun Application.main() { val dbRows = 10000 val poolSize = 48 - val pool by lazy { HikariDataSource(HikariConfig().apply { configurePostgres(poolSize) }) } + val pool = HikariDataSource(HikariConfig().apply { configurePostgres(poolSize) }) val databaseDispatcher = Dispatchers.IO install(DefaultHeaders) @@ -51,7 +53,7 @@ fun Application.main() { val world = withContext(databaseDispatcher) { pool.connection.use { connection -> - connection.prepareStatement("SELECT id, randomNumber FROM World WHERE id = ?").use { statement -> + connection.prepareStatement(WORLD_QUERY).use { statement -> statement.setInt(1, random.nextInt(dbRows) + 1) statement.executeQuery().use { rs -> @@ -67,7 +69,7 @@ fun Application.main() { fun Connection.selectWorlds(queries: Int, random: ThreadLocalRandom): List { val result = ArrayList(queries) - prepareStatement("SELECT id, randomNumber FROM World WHERE id = ?").use { statement -> + prepareStatement(WORLD_QUERY).use { statement -> repeat(queries) { statement.setInt(1, random.nextInt(dbRows) + 1) @@ -96,7 +98,7 @@ fun Application.main() { val result = mutableListOf() withContext(databaseDispatcher) { pool.connection.use { connection -> - connection.prepareStatement("SELECT id, message FROM fortune").use { statement -> + connection.prepareStatement(FORTUNES_QUERY).use { statement -> statement.executeQuery().use { rs -> while (rs.next()) { result += Fortune(rs.getInt(1), rs.getString(2)) @@ -137,7 +139,7 @@ fun Application.main() { result.forEach { it.randomNumber = random.nextInt(dbRows) + 1 } - connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id = ?") + connection.prepareStatement(UPDATE_QUERY) .use { updateStatement -> for ((id, randomNumber) in result) { updateStatement.setInt(1, randomNumber) @@ -182,3 +184,10 @@ fun HikariConfig.configureMySql(poolSize: Int) { fun ApplicationCall.queries() = request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 + + +object Constants { + const val WORLD_QUERY = "SELECT id, randomNumber FROM World WHERE id = ?" + const val FORTUNES_QUERY = "SELECT id, message FROM fortune" + const val UPDATE_QUERY = "UPDATE World SET randomNumber = ? WHERE id = ?" +} \ No newline at end of file From 9ab75acf9c341630cfeae907f2f3b2c3d70930cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 18:11:29 +0000 Subject: [PATCH 0723/1766] Bump openssl from 0.10.61 to 0.10.66 in /frameworks/Rust/axum Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.61 to 0.10.66. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.61...openssl-v0.10.66) --- updated-dependencies: - dependency-name: openssl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/axum/Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 3d63ad71fb7..3a9dba5fb18 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -1379,9 +1379,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.61" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -1411,9 +1411,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.97" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", From 7e12fbc94fff02c257fd18a824c563cf9e51bd3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 18:41:22 +0000 Subject: [PATCH 0724/1766] Bump io.undertow:undertow-core in /frameworks/Java/light-java Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.12.Final to 2.3.15.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.12.Final...2.3.15.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core 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 0d76eb4e631..787dc1253bb 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -25,7 +25,7 @@ 11 2.0.1 1.3.12 - 2.3.12.Final + 2.3.15.Final 3.3.1 8.0.28 42.7.2 From 8710bc806824912856ece4650e415009b30f91f3 Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Tue, 23 Jul 2024 20:44:30 +0300 Subject: [PATCH 0725/1766] [F#/Oxpecker] Several improvements (#9170) * [F#/Oxpecker] Change fortunes serialization to chunked * [F#/Oxpecker] Database query improvements * [F#/Oxpecker] Disabled config file changes --- .../FSharp/oxpecker/oxpecker.dockerfile | 1 + frameworks/FSharp/oxpecker/src/App/App.fsproj | 2 +- frameworks/FSharp/oxpecker/src/App/Db.fs | 23 +++++++++++++------ frameworks/FSharp/oxpecker/src/App/Program.fs | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/frameworks/FSharp/oxpecker/oxpecker.dockerfile b/frameworks/FSharp/oxpecker/oxpecker.dockerfile index 35a8c509c96..4f6676892c3 100644 --- a/frameworks/FSharp/oxpecker/oxpecker.dockerfile +++ b/frameworks/FSharp/oxpecker/oxpecker.dockerfile @@ -6,6 +6,7 @@ RUN dotnet publish -c Release -o out FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime ENV DOTNET_ReadyToRun 0 +ENV ASPNETCORE_hostBuilder__reloadConfigOnChange false ENV URLS http://+:8080 diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index f01c367f95f..1b6f8b76cd3 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/Db.fs b/frameworks/FSharp/oxpecker/src/App/Db.fs index 498721b2b2e..2c471bada1d 100644 --- a/frameworks/FSharp/oxpecker/src/App/Db.fs +++ b/frameworks/FSharp/oxpecker/src/App/Db.fs @@ -21,19 +21,19 @@ module Db = return result } - let private createReadCommand (connection: DbConnection) = + let private createReadCommand (connection: NpgsqlConnection) = let cmd = connection.CreateCommand( CommandText = "SELECT id, randomnumber FROM world WHERE id = @Id" ) - let id = cmd.CreateParameter( + let id = NpgsqlParameter( ParameterName = "@Id", DbType = DbType.Int32, - Value = Random.Shared.Next(1, 10001) + TypedValue = Random.Shared.Next(1, 10001) ) cmd.Parameters.Add(id) |> ignore cmd - let private readSingleRow (cmd: DbCommand) = + let private readSingleRow (cmd: NpgsqlCommand) = task { use! rdr = cmd.ExecuteReaderAsync(CommandBehavior.SingleRow) let! _ = rdr.ReadAsync() @@ -83,12 +83,21 @@ module Db = | q -> q - let private generateParameters (results: World[]) (command: DbCommand) = + // fill cache + let _ = [| 0..maxBatch |] |> Array.map batchUpdateString + + let private paramNames = + seq { 0..maxBatch*2 } + |> Seq.map (fun i -> struct($"@Rn_{i}", $"@Id_{i}")) + |> Seq.toArray + + let private generateParameters (results: World[]) (command: NpgsqlCommand) = for i in 0..results.Length-1 do let randomNumber = Random.Shared.Next(1, 10001) - let random = command.CreateParameter(ParameterName = $"@Rn_{i}", DbType = DbType.Int32, Value = randomNumber) + let struct(rnParamName, idParamName) = paramNames[i] + let random = NpgsqlParameter(ParameterName = rnParamName, DbType = DbType.Int32, TypedValue = randomNumber) command.Parameters.Add(random) |> ignore - let id = command.CreateParameter(ParameterName = $"@Id_{i}", DbType = DbType.Int32, Value = results[i].id) + let id = NpgsqlParameter(ParameterName = idParamName, DbType = DbType.Int32, TypedValue = results[i].id) command.Parameters.Add(id) |> ignore results[i] <- { results[i] with randomnumber = randomNumber } diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index dcfd3c53206..09ba84b4fae 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -49,7 +49,7 @@ module HttpHandlers = let rec private renderFortunes (ctx: HttpContext) (data: ResizeArray) = data.Add extra data.Sort FortuneComparer - data |> HtmlViews.fortunes |> ctx.WriteHtmlView + data |> HtmlViews.fortunes |> ctx.WriteHtmlViewChunked let fortunes : EndpointHandler = fun ctx -> From 1a62761218245423a85fc42794588de29ad3638e Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Tue, 23 Jul 2024 19:45:09 +0200 Subject: [PATCH 0726/1766] Upgrade to Vert.x 4.5.9 and use the new data object JSON serializer library, in addition perform a few tweaks to the server. (#9171) --- frameworks/Java/vertx/pom.xml | 19 +- .../Java/vertx/src/main/java/vertx/App.java | 252 +++++++++--------- .../main/java/vertx/model/CachedWorld.java | 15 +- .../src/main/java/vertx/model/Fortune.java | 17 +- .../src/main/java/vertx/model/Message.java | 23 +- .../src/main/java/vertx/model/World.java | 19 +- .../main/java/vertx/model/package-info.java | 4 + .../Java/vertx/vertx-postgres.dockerfile | 1 + frameworks/Java/vertx/vertx.dockerfile | 2 +- 9 files changed, 194 insertions(+), 158 deletions(-) create mode 100644 frameworks/Java/vertx/src/main/java/vertx/model/package-info.java diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index cdb3aa09f6a..12eff9d69a5 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -10,9 +10,9 @@ 17 vertx.App - 4.5.8 + 4.5.9 2.16.1 - 4.1.110.Final + 4.1.111.Final 0.0.25.Final @@ -32,6 +32,11 @@ jackson-core ${jackson.version} + + com.julienviet + jsonsergen + 0.0.4 + io.netty netty-transport-native-kqueue @@ -70,6 +75,16 @@ false + + + default-compile + + + io.vertx.codegen.CodeGenProcessor + + + + com.fizzed diff --git a/frameworks/Java/vertx/src/main/java/vertx/App.java b/frameworks/Java/vertx/src/main/java/vertx/App.java index 5e81292d8ed..5afa269ae9e 100755 --- a/frameworks/Java/vertx/src/main/java/vertx/App.java +++ b/frameworks/Java/vertx/src/main/java/vertx/App.java @@ -12,17 +12,12 @@ import io.vertx.core.http.HttpServerOptions; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerResponse; -import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; import io.vertx.sqlclient.*; import io.vertx.sqlclient.impl.SqlClientInternal; -import vertx.model.CachedWorld; -import vertx.model.Fortune; -import vertx.model.Message; -import vertx.model.World; -import vertx.model.WorldCache; +import vertx.model.*; import vertx.rocker.BufferRockerOutput; import java.io.ByteArrayOutputStream; @@ -38,9 +33,13 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class App extends AbstractVerticle implements Handler { + private static final int NUM_PROCESSORS = Runtime.getRuntime().availableProcessors(); + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(App.class); + /** * Returns the value of the "queries" getRequest parameter, which is an integer * bound between 1 and 500 with a default value of 1. @@ -62,7 +61,9 @@ static int getQueries(HttpServerRequest request) { } } - static Logger logger = LoggerFactory.getLogger(App.class.getName()); + private static Logger logger = LoggerFactory.getLogger(App.class.getName()); + + private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new); private static final String PATH_PLAINTEXT = "/plaintext"; private static final String PATH_JSON = "/json"; @@ -76,7 +77,7 @@ static int getQueries(HttpServerRequest request) { private static final CharSequence RESPONSE_TYPE_PLAIN = HttpHeaders.createOptimized("text/plain"); private static final CharSequence RESPONSE_TYPE_HTML = HttpHeaders.createOptimized("text/html; charset=UTF-8"); - private static final CharSequence RESPONSE_TYPE_JSON = HttpHeaders.createOptimized("application/json"); + static final CharSequence RESPONSE_TYPE_JSON = HttpHeaders.createOptimized("application/json"); private static final String HELLO_WORLD = "Hello, world!"; private static final Buffer HELLO_WORLD_BUFFER = Buffer.buffer(HELLO_WORLD, "UTF-8"); @@ -89,14 +90,29 @@ static int getQueries(HttpServerRequest request) { private static final CharSequence HELLO_WORLD_LENGTH = HttpHeaders.createOptimized("" + HELLO_WORLD.length()); private static final CharSequence SERVER = HttpHeaders.createOptimized("vert.x"); - private static final String UPDATE_WORLD = "UPDATE world SET randomnumber=$1 WHERE id=$2"; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; private static final String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; private static final String SELECT_WORLDS = "SELECT id, randomnumber from WORLD"; + public static CharSequence createDateHeader() { + return HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); + } + + /** + * Returns a random integer that is a suitable value for both the {@code id} + * and {@code randomNumber} properties of a world object. + * + * @return a random world number + */ + 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 HttpServer server; - private SqlClientInternal client1; - private SqlClientInternal client2; + private SqlClientInternal client; private CharSequence dateString; private CharSequence[] plaintextHeaders; @@ -105,15 +121,10 @@ static int getQueries(HttpServerRequest request) { private Throwable databaseErr; private PreparedQuery> SELECT_WORLD_QUERY; private PreparedQuery>> SELECT_FORTUNE_QUERY; - private PreparedQuery> UPDATE_WORLD_QUERY; @SuppressWarnings("unchecked") - private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[128]; + private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[500]; private WorldCache WORLD_CACHE; - public static CharSequence createDateHeader() { - return HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); - } - @Override public void start(Promise startPromise) throws Exception { int port = 8080; @@ -134,6 +145,7 @@ public void start(Promise startPromise) throws Exception { options.setUser(config.getString("username", "benchmarkdbuser")); options.setPassword(config.getString("password", "benchmarkdbpass")); options.setCachePreparedStatements(true); + options.setPreparedStatementCacheMaxSize(1024); options.setPipeliningLimit(100_000); // Large pipelining means less flushing and we use a single connection anyway Future clientsInit = initClients(options); clientsInit @@ -146,9 +158,9 @@ public void start(Promise startPromise) throws Exception { } private Future initClients(PgConnectOptions options) { - Future cf1 = PgConnection.connect(vertx, options) + return PgConnection.connect(vertx, options) .flatMap(conn -> { - client1 = (SqlClientInternal) conn; + client = (SqlClientInternal) conn; List> list = new ArrayList<>(); Future f1 = conn.prepare(SELECT_WORLD) .andThen(onSuccess(ps -> SELECT_WORLD_QUERY = ps.query())); @@ -165,15 +177,6 @@ private Future initClients(PgConnectOptions options) { .map(worlds -> new WorldCache(worlds.value())) .andThen(onSuccess(wc -> WORLD_CACHE = wc)); list.add(f3); - return Future.join(list); - }); - Future cf2 = PgConnection.connect(vertx, options) - .flatMap(conn -> { - client2 = (SqlClientInternal) conn; - List> list = new ArrayList<>(); - Future f1 = conn.prepare(UPDATE_WORLD) - .andThen(onSuccess(ps -> UPDATE_WORLD_QUERY = ps.query())); - list.add(f1); for (int i = 0; i < AGGREGATED_UPDATE_WORLD_QUERY.length; i++) { int idx = i; Future fut = conn @@ -183,22 +186,26 @@ private Future initClients(PgConnectOptions options) { } return Future.join(list); }); - return Future.join(cf1, cf2); } private static String buildAggregatedUpdateQuery(int len) { - StringBuilder sb = new StringBuilder(); - sb.append("UPDATE world SET randomNumber = update_data.randomNumber FROM (VALUES"); - char sep = ' '; - for (int i = 1;i <= len;i++) { - sb.append(sep).append("($").append(2 * i - 1).append("::int,$").append(2 * i).append("::int)"); - sep = ','; + StringBuilder sql = new StringBuilder(); + sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); + for (int i = 0; i < len; i++) { + int offset = (i * 2) + 1; + sql.append(" WHEN $").append(offset).append(" THEN $").append(offset + 1); } - sb.append(") AS update_data (id, randomNumber) WHERE world.id = update_data.id"); - return sb.toString(); + sql.append(" ELSE RANDOMNUMBER"); + sql.append(" END WHERE ID IN ($1"); + for (int i = 1; i < len; i++) { + int offset = (i * 2) + 1; + sql.append(",$").append(offset); + } + sql.append(")"); + return sql.toString(); } - private static Handler> onSuccess(Handler handler) { + public static Handler> onSuccess(Handler handler) { return ar -> { if (ar.succeeded()) { handler.handle(ar.result()); @@ -232,8 +239,9 @@ public void handle(HttpServerRequest request) { handleCaching(request); break; default: - request.response().setStatusCode(404); - request.response().end(); + request.response() + .setStatusCode(404) + .end(); break; } } catch (Exception e) { @@ -267,22 +275,12 @@ private void handleJson(HttpServerRequest request) { .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) .add(HEADER_SERVER, SERVER) .add(HEADER_DATE, dateString); - response.end(new Message("Hello, World!").toBuffer(), NULL_HANDLER); - } - - /** - * Returns a random integer that is a suitable value for both the {@code id} - * and {@code randomNumber} properties of a world object. - * - * @return a random world number - */ - private static int randomWorld() { - return 1 + ThreadLocalRandom.current().nextInt(10000); + response.end(new Message("Hello, World!").toJson(), NULL_HANDLER); } private void handleDb(HttpServerRequest req) { HttpServerResponse resp = req.response(); - SELECT_WORLD_QUERY.execute(Tuple.of(randomWorld()), res -> { + SELECT_WORLD_QUERY.execute(Tuple.of(boxedRandomWorldNumber()), res -> { if (res.succeeded()) { RowIterator resultSet = res.result().iterator(); if (!resultSet.hasNext()) { @@ -290,11 +288,12 @@ private void handleDb(HttpServerRequest req) { return; } Row row = resultSet.next(); - resp - .putHeader(HttpHeaders.SERVER, SERVER) - .putHeader(HttpHeaders.DATE, dateString) - .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON) - .end(new World(row.getInteger(0), row.getInteger(1)).toBuffer(), NULL_HANDLER); + World word = new World(row.getInteger(0), row.getInteger(1)); + MultiMap headers = resp.headers(); + headers.add(HttpHeaders.SERVER, SERVER); + headers.add(HttpHeaders.DATE, dateString); + headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); + resp.end(word.toJson(), NULL_HANDLER); } else { sendError(req, res.cause()); } @@ -304,10 +303,11 @@ private void handleDb(HttpServerRequest req) { class Queries implements Handler>> { boolean failed; - final JsonArray worlds; + final World[] worlds; final HttpServerRequest req; final HttpServerResponse resp; final int queries; + int worldsIndex; public Queries(HttpServerRequest req) { int queries = getQueries(req); @@ -315,13 +315,14 @@ public Queries(HttpServerRequest req) { this.req = req; this.resp = req.response(); this.queries = queries; - this.worlds = new JsonArray(new ArrayList<>(queries)); + this.worlds = new World[queries]; + this.worldsIndex = 0; } private void handle() { - client1.group(c -> { + client.group(c -> { for (int i = 0; i < queries; i++) { - c.preparedQuery(SELECT_WORLD).execute(Tuple.of(randomWorld()), this); + c.preparedQuery(SELECT_WORLD).execute(Tuple.of(boxedRandomWorldNumber()), this); } }); } @@ -337,50 +338,48 @@ public void handle(AsyncResult> ar) { // we need a final reference final Tuple row = ar.result().iterator().next(); - worlds.add(new JsonObject().put("id", row.getInteger(0)).put("randomNumber", row.getInteger(1))); + worlds[worldsIndex++] = new World(row.getInteger(0), row.getInteger(1)); // stop condition - if (worlds.size() == queries) { - resp - .putHeader(HttpHeaders.SERVER, SERVER) - .putHeader(HttpHeaders.DATE, dateString) - .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON) - .end(worlds.toBuffer(), NULL_HANDLER); + if (worldsIndex == queries) { + MultiMap headers = resp.headers(); + headers.add(HttpHeaders.SERVER, SERVER); + headers.add(HttpHeaders.DATE, dateString); + headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); + resp.end(World.toJson(worlds), NULL_HANDLER); } } } } - class Update { + private class Update { - final HttpServerRequest req; - boolean failed; - int queryCount; - final World[] worlds; + private final HttpServerRequest request; + private final World[] worldsToUpdate; + private boolean failed; + private int selectWorldCompletedCount; - public Update(HttpServerRequest req) { - final int queries = getQueries(req); - this.req = req; - this.worlds = new World[queries]; + public Update(HttpServerRequest request) { + this.request = request; + this.worldsToUpdate = new World[getQueries(request)]; } - private void handle() { - - client1.group(c -> { - PreparedQuery> preparedQuery = c.preparedQuery(SELECT_WORLD); - for (int i = 0; i < worlds.length; i++) { - int id = randomWorld(); - int index = i; - preparedQuery.execute(Tuple.of(id), ar2 -> { + public void handle() { + client.group(c -> { + final PreparedQuery> preparedQuery = c.preparedQuery(App.SELECT_WORLD); + for (int i = 0; i < worldsToUpdate.length; i++) { + final Integer id = boxedRandomWorldNumber(); + final int index = i; + preparedQuery.execute(Tuple.of(id), res -> { if (!failed) { - if (ar2.failed()) { + if (res.failed()) { failed = true; - sendError(req, ar2.cause()); + sendError(request, res.cause()); return; } - worlds[index] = new World(ar2.result().iterator().next().getInteger(0), randomWorld()); - if (++queryCount == worlds.length) { - handleUpdates(); + worldsToUpdate[index] = new World(res.result().iterator().next().getInteger(0), boxedRandomWorldNumber()); + if (++selectWorldCompletedCount == worldsToUpdate.length) { + randomWorldsQueryCompleted(); } } }); @@ -388,43 +387,32 @@ private void handle() { }); } - void handleUpdates() { - Arrays.sort(worlds); - int len = worlds.length; - if (0 < len && len <= AGGREGATED_UPDATE_WORLD_QUERY.length) { - List arguments = new ArrayList<>(); - for (World world : worlds) { - arguments.add(world.getId()); - arguments.add(world.getRandomNumber()); - } - Tuple tuple = Tuple.tuple(arguments); - PreparedQuery> query = AGGREGATED_UPDATE_WORLD_QUERY[len - 1]; - query.execute(tuple, this::sendResponse); - } else { - List batch = new ArrayList<>(); - for (World world : worlds) { - batch.add(Tuple.of(world.getRandomNumber(), world.getId())); - } - UPDATE_WORLD_QUERY.executeBatch(batch, this::sendResponse); + 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()); } + AGGREGATED_UPDATE_WORLD_QUERY[worldsToUpdate.length - 1].execute(Tuple.wrap(params), updateResult -> { + if (updateResult.failed()) { + sendError(request, updateResult.cause()); + return; + } + sendResponse(); + }); } - private void sendResponse(AsyncResult res) { - if (res.failed()) { - sendError(req, res.cause()); - return; - } - JsonArray json = new JsonArray(); - for (World world : worlds) { - json.add(world); - } - req.response() - .putHeader(HttpHeaders.SERVER, SERVER) - .putHeader(HttpHeaders.DATE, dateString) - .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON) - .end(json.toBuffer(), NULL_HANDLER); + private void sendResponse() { + var res = request.response(); + MultiMap headers = res.headers(); + headers.add(HttpHeaders.SERVER, App.SERVER); + headers.add(HttpHeaders.DATE, dateString); + headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); + Buffer buff = WorldJsonSerializer.toJsonBuffer(worldsToUpdate); + res.end(buff, null); } - } private void handleFortunes(HttpServerRequest req) { @@ -439,11 +427,12 @@ private void handleFortunes(HttpServerRequest req) { List fortunes = result.value(); fortunes.add(new Fortune(0, "Additional fortune added at request time.")); Collections.sort(fortunes); - response - .putHeader(HttpHeaders.SERVER, SERVER) - .putHeader(HttpHeaders.DATE, dateString) - .putHeader(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_HTML) - .end(FortunesTemplate.template(fortunes).render(factory).buffer(), NULL_HANDLER); + MultiMap headers = response.headers(); + headers.add(HttpHeaders.SERVER, SERVER); + headers.add(HttpHeaders.DATE, dateString); + headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_HTML); + FortunesTemplate template = FortunesTemplate.template(fortunes); + response.end(template.render(factory).buffer(), NULL_HANDLER); } else { sendError(req, ar.cause()); } @@ -462,19 +451,17 @@ private void handleCaching(HttpServerRequest req) { count = Math.max(1, count); count = Math.min(500, count); List worlds = WORLD_CACHE.getCachedWorld(count); - JsonArray json = new JsonArray(worlds); HttpServerResponse response = req.response(); MultiMap headers = response.headers(); headers .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) .add(HEADER_SERVER, SERVER) .add(HEADER_DATE, dateString); - response.end(json.toBuffer(), NULL_HANDLER); + response.end(CachedWorld.toJson(worlds), NULL_HANDLER); } public static void main(String[] args) throws Exception { - - int eventLoopPoolSize = Runtime.getRuntime().availableProcessors(); + int eventLoopPoolSize = NUM_PROCESSORS; String sizeProp = System.getProperty("vertx.eventLoopPoolSize"); if (sizeProp != null) { try { @@ -522,6 +509,7 @@ private static void printConfig(Vertx vertx) { logger.error("Could not read Vertx version", e);; } logger.info("Vertx: " + version); + logger.info("Processors: " + NUM_PROCESSORS); logger.info("Event Loop Size: " + ((MultithreadEventExecutorGroup)vertx.nettyEventLoopGroup()).executorCount()); logger.info("Native transport : " + nativeTransport); logger.info("Transport : " + transport); diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java b/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java index f27e8805f33..423d5273f62 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java @@ -1,13 +1,17 @@ package vertx.model; -import io.vertx.core.json.JsonObject; +import com.julienviet.jsonsergen.JsonSerGen; +import io.vertx.codegen.annotations.DataObject; +import io.vertx.core.buffer.Buffer; -import java.util.Map; +import java.util.List; /** * The model for the "world" database table. */ -public final class CachedWorld extends JsonObject implements Comparable { +@DataObject +@JsonSerGen +public final class CachedWorld implements Comparable { private final int id; private final int randomNumber; @@ -19,7 +23,6 @@ public final class CachedWorld extends JsonObject implements Comparable worlds) { + return CachedWorldJsonSerializer.toJsonBuffer(worlds); + } } \ No newline at end of file diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/Fortune.java b/frameworks/Java/vertx/src/main/java/vertx/model/Fortune.java index d1df6fcfa1a..eb21f93feee 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/Fortune.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/Fortune.java @@ -7,11 +7,14 @@ /** * The model for the "fortune" database table. */ -public final class Fortune extends JsonObject implements Comparable { +public final class Fortune implements Comparable { private static final String ID = "id"; private static final String MESSAGE = "message"; + private final int id; + private final String message; + /** * Constructs a new fortune object with the given parameters. * @@ -19,20 +22,16 @@ public final class Fortune extends JsonObject implements Comparable { * @param message the message of the fortune */ public Fortune(int id, String message) { - put(ID, id); - put(MESSAGE, message); - } - - public Fortune(JsonObject doc) { - super(doc == null ? Collections.emptyMap() : doc.getMap()); + this.id = id; + this.message = message; } public int getId() { - return getInteger(ID); + return id; } public String getMessage() { - return getString(MESSAGE); + return message; } @Override diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/Message.java b/frameworks/Java/vertx/src/main/java/vertx/model/Message.java index 0fe3274afe0..ce240bd5ae9 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/Message.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/Message.java @@ -1,16 +1,29 @@ package vertx.model; -import io.vertx.core.json.JsonObject; +import com.julienviet.jsonsergen.JsonSerGen; +import io.vertx.codegen.annotations.DataObject; +import io.vertx.core.buffer.Buffer; -public class Message extends JsonObject { +@DataObject +@JsonSerGen +public class Message { - private static final String MESSAGE = "message"; + private String message; public Message(String message) { - put(MESSAGE, message); + this.message = message; } public String getMessage() { - return getString(MESSAGE); + return message; + } + + public Message setMessage(String message) { + this.message = message; + return this; + } + + public Buffer toJson() { + return MessageJsonSerializer.toJsonBuffer(this); } } diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/World.java b/frameworks/Java/vertx/src/main/java/vertx/model/World.java index 86f4d29e99b..43f7bfc2a61 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/World.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/World.java @@ -1,13 +1,15 @@ package vertx.model; -import io.vertx.core.json.JsonObject; - -import java.util.Map; +import com.julienviet.jsonsergen.JsonSerGen; +import io.vertx.codegen.annotations.DataObject; +import io.vertx.core.buffer.Buffer; /** * The model for the "world" database table. */ -public final class World extends JsonObject implements Comparable { +@DataObject +@JsonSerGen +public final class World implements Comparable { private final int id; private final int randomNumber; @@ -19,7 +21,6 @@ public final class World extends JsonObject implements Comparable { * @param randomNumber the random number of the world */ public World(int id, int randomNumber) { - super(Map.of("id", id, "randomNumber", randomNumber)); this.id = id; this.randomNumber = randomNumber; } @@ -36,4 +37,12 @@ public int getRandomNumber() { public int compareTo(World o) { return Integer.compare(id, o.id); } + + public Buffer toJson() { + return WorldJsonSerializer.toJsonBuffer(this); + } + + public static Buffer toJson(World[] worlds) { + return WorldJsonSerializer.toJsonBuffer(worlds); + } } \ No newline at end of file diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/package-info.java b/frameworks/Java/vertx/src/main/java/vertx/model/package-info.java new file mode 100644 index 00000000000..d0dfa9d492c --- /dev/null +++ b/frameworks/Java/vertx/src/main/java/vertx/model/package-info.java @@ -0,0 +1,4 @@ +@ModuleGen(name = "benchmark", groupPackage = "vertx.model") +package vertx.model; + +import io.vertx.codegen.annotations.ModuleGen; \ No newline at end of file diff --git a/frameworks/Java/vertx/vertx-postgres.dockerfile b/frameworks/Java/vertx/vertx-postgres.dockerfile index 3072a3ad381..dec7fa545a3 100644 --- a/frameworks/Java/vertx/vertx-postgres.dockerfile +++ b/frameworks/Java/vertx/vertx-postgres.dockerfile @@ -14,6 +14,7 @@ CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ -server \ -XX:+UseNUMA \ -XX:+UseParallelGC \ + -Djava.lang.Integer.IntegerCache.high=10000 \ -Dvertx.disableMetrics=true \ -Dvertx.disableH2c=true \ -Dvertx.disableWebsockets=true \ diff --git a/frameworks/Java/vertx/vertx.dockerfile b/frameworks/Java/vertx/vertx.dockerfile index cfd269e37ae..2fe2a27a2c2 100644 --- a/frameworks/Java/vertx/vertx.dockerfile +++ b/frameworks/Java/vertx/vertx.dockerfile @@ -6,4 +6,4 @@ RUN mvn package -q EXPOSE 8080 -CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] From 57f2f117488029a625feea0605f7da76bfb2a0b9 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Fri, 26 Jul 2024 17:50:09 +0100 Subject: [PATCH 0727/1766] H2O: Use 2 database connections per thread again (#9176) --- frameworks/C/h2o/h2o.dockerfile | 2 +- frameworks/C/h2o/src/handlers/world.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index cfabc77bb3b..bca0d12b19e 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -109,4 +109,4 @@ CMD ["taskset", \ "dbname=hello_world host=tfb-database password=benchmarkdbpass sslmode=disable user=benchmarkdbuser", \ "-f", \ "/opt/h2o_app/share/h2o_app/template", \ - "-m1"] + "-m2"] diff --git a/frameworks/C/h2o/src/handlers/world.c b/frameworks/C/h2o/src/handlers/world.c index a87ee4c4282..82d29ce08b8 100644 --- a/frameworks/C/h2o/src/handlers/world.c +++ b/frameworks/C/h2o/src/handlers/world.c @@ -237,9 +237,9 @@ static int do_multiple_queries(bool do_update, bool use_cache, h2o_req_t *req) const size_t num_query = get_query_number(req); - // MAX_QUERIES is a relatively small number, so assume no overflow in the following - // arithmetic operations. - assert(num_query && num_query <= MAX_QUERIES); + // MAX_QUERIES is a relatively small number, say less than or equal to UINT16_MAX, so assume no + // overflow in the following arithmetic operations. + assert(num_query && num_query <= MAX_QUERIES && num_query <= UINT16_MAX); size_t base_size = offsetof(multiple_query_ctx_t, res) + num_query * sizeof(query_result_t); @@ -373,7 +373,7 @@ static void do_updates(multiple_query_ctx_t *query_ctx) for (size_t i = 0; i < query_ctx->num_result; i++) { query_ctx->res[i].id = htonl(query_ctx->res[i].id); query_ctx->res[i].random_number = - htonl(1 + get_random_number(MAX_ID, &query_ctx->ctx->random_seed)); + htonl(1 + get_random_number(MAX_ID, &query_ctx->ctx->random_seed)); paramFormats[2 * i] = 1; paramFormats[2 * i + 1] = 1; paramLengths[2 * i] = sizeof(query_ctx->res[i].id); From f2a87b60800fac06a293cc5e1270a78e8cba05d0 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 29 Jul 2024 23:14:27 +0200 Subject: [PATCH 0728/1766] [php] Fix Swoole and faster docker builds (#9169) * Fix Symfony Swoole * Fix Laravel Swoole * Fix Simps Swoole * Fix Laravel Laravels Swoole variant * Fix Lumen Swoole variants * Fix MixPHP Swoole * Fix Ubiquity Swoole variants --- .../PHP/laravel/laravel-laravel-s.dockerfile | 18 ++++-------- .../PHP/laravel/laravel-swoole.dockerfile | 20 ++++--------- .../PHP/lumen/lumen-laravel-s.dockerfile | 15 +++------- frameworks/PHP/lumen/lumen-swoole.dockerfile | 29 +++++-------------- .../PHP/mixphp/mixphp-swoole-mysql.dockerfile | 18 ++++-------- frameworks/PHP/simps/simps-micro.dockerfile | 17 ++++------- frameworks/PHP/simps/simps.dockerfile | 17 ++++------- frameworks/PHP/symfony/public/swoole.php | 2 +- .../PHP/symfony/symfony-swoole.dockerfile | 13 +++------ .../ubiquity/ubiquity-swoole-mysql.dockerfile | 24 ++++----------- .../PHP/ubiquity/ubiquity-swoole.dockerfile | 22 ++++---------- 11 files changed, 53 insertions(+), 142 deletions(-) diff --git a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile index 4cce4090f3d..a0e946e5097 100644 --- a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile +++ b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile @@ -1,25 +1,17 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole -RUN docker-php-ext-install pdo_mysql pcntl opcache > /dev/null +RUN docker-php-ext-install pcntl opcache curl > /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -ADD ./ /laravel WORKDIR /laravel +COPY --link . . 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 -RUN apt-get update > /dev/null && \ - apt-get install -yqq git unzip > /dev/null -RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php && php -r "unlink('composer-setup.php');" -RUN mv composer.phar /usr/local/bin/composer - -COPY deploy/laravel-s/composer.json ./ +COPY --link deploy/laravel-s/composer.json . RUN echo "LARAVELS_LISTEN_IP=0.0.0.0" >> .env RUN echo "LARAVELS_LISTEN_PORT=8080" >> .env @@ -30,4 +22,4 @@ RUN php artisan laravels publish EXPOSE 8080 -CMD php bin/laravels start +ENTRYPOINT [ "php", "bin/laravels", "start" ] diff --git a/frameworks/PHP/laravel/laravel-swoole.dockerfile b/frameworks/PHP/laravel/laravel-swoole.dockerfile index 77cfef19fe0..3882a7ac4c8 100644 --- a/frameworks/PHP/laravel/laravel-swoole.dockerfile +++ b/frameworks/PHP/laravel/laravel-swoole.dockerfile @@ -1,33 +1,23 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole -RUN docker-php-ext-install pdo_mysql pcntl opcache > /dev/null +RUN docker-php-ext-install pcntl opcache curl > /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -ADD ./ /laravel WORKDIR /laravel +COPY --link . . RUN mkdir -p /laravel/bootstrap/cache /laravel/storage/framework/sessions /laravel/storage/framework/views /laravel/storage/framework/cache -RUN chmod -R 777 /laravel -RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git unzip > /dev/null - -RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php && php -r "unlink('composer-setup.php');" -RUN mv composer.phar /usr/local/bin/composer - -COPY deploy/swoole/composer.json ./ +COPY --link deploy/swoole/composer.json . RUN echo "APP_SWOOLE=true" >> .env RUN composer install -a --no-dev --quiet RUN php artisan optimize - EXPOSE 8080 -CMD php artisan swoole:http start +ENTRYPOINT [ "php", "artisan", "swoole:http", "start" ] diff --git a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile index a8a0aebd68a..a2b4be68310 100644 --- a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile +++ b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile @@ -1,24 +1,17 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole -RUN docker-php-ext-install pdo_mysql pcntl opcache > /dev/null +RUN docker-php-ext-install pcntl opcache curl > /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini #RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini #RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -ADD ./ /lumen WORKDIR /lumen +ADD --link . . RUN mkdir -p /lumen/bootstrap/cache /lumen/storage/logs /lumen/storage/framework/sessions /lumen/storage/framework/views /lumen/storage/framework/cache RUN chmod -R 777 /lumen -RUN apt-get update > /dev/null && \ - apt-get install -yqq git unzip > /dev/null -RUN php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" && php composer-setup.php && php -r "unlink('composer-setup.php');" -RUN mv composer.phar /usr/local/bin/composer - COPY deploy/laravel-s/composer.json ./ RUN echo "LARAVELS_LISTEN_IP=0.0.0.0" >> .env @@ -29,4 +22,4 @@ RUN php artisan laravels publish EXPOSE 8080 -CMD php bin/laravels start +ENTRYPOINT [ "php", "bin/laravels", "start" ] diff --git a/frameworks/PHP/lumen/lumen-swoole.dockerfile b/frameworks/PHP/lumen/lumen-swoole.dockerfile index 3e4c866c031..de3d4294973 100644 --- a/frameworks/PHP/lumen/lumen-swoole.dockerfile +++ b/frameworks/PHP/lumen/lumen-swoole.dockerfile @@ -1,31 +1,16 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole +RUN docker-php-ext-install pcntl opcache curl > /dev/null -RUN docker-php-ext-install pdo_mysql > /dev/null - -ADD ./ /lumen WORKDIR /lumen -COPY deploy/swoole/php.ini /usr/local/etc/php/ - -RUN mkdir -p /lumen/storage/framework/sessions -RUN mkdir -p /lumen/storage/framework/views -RUN mkdir -p /lumen/storage/framework/cache - -RUN chmod -R 777 /lumen +ADD --link . . -# Install composer using the installation method documented at https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md -# This method was chosen because composer is not part of the apt repositories that are in the default PHP 7.2 docker image -# Adding alternate apt php repos can potentially cause problems with extension compatibility between the php build from the docker image and the alternate php build -# An additional benefit of this method is that the correct version of composer will be used for the environment and version of the php system in the docker image -RUN deploy/swoole/install-composer.sh +COPY --link deploy/swoole/php.ini /usr/local/etc/php/ -RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git unzip > /dev/null +RUN mkdir -p /lumen/storage/framework/sessions /lumen/storage/framework/views /lumen/storage/framework/cache COPY deploy/swoole/composer* ./ -RUN php composer.phar install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN echo "APP_SWOOLE=true" >> .env @@ -33,4 +18,4 @@ RUN chmod -R 777 /lumen EXPOSE 8080 -CMD php artisan swoole:http start +ENTRYPOINT [ "php", "artisan", "swoole:http", "start" ] diff --git a/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile b/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile index 2001b9fde1d..846a3b88a87 100644 --- a/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile @@ -1,13 +1,10 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN pecl install swoole > /dev/null && docker-php-ext-enable swoole +RUN docker-php-ext-install pcntl opcache bcmath > /dev/null -RUN docker-php-ext-install opcache pdo_mysql bcmath > /dev/null - -RUN apt -yqq update && apt -yqq install git unzip > /dev/null - -COPY . /mixphp -COPY php.ini /usr/local/etc/php/ +WORKDIR /mixphp +COPY --link . . +COPY --link php.ini /usr/local/etc/php/ RUN echo "opcache.enable=1" >> /usr/local/etc/php/php.ini RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/php.ini RUN echo "pcre.jit=1" >> /usr/local/etc/php/php.ini @@ -16,9 +13,6 @@ RUN echo "opcache.jit_buffer_size=256M" >> /usr/local/etc/php/php.ini RUN php -v && php -i | grep opcache -WORKDIR /mixphp - -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 @@ -27,4 +21,4 @@ RUN chmod -R 777 /mixphp/runtime/logs EXPOSE 9501 -CMD php /mixphp/bin/swoole.php start +ENTRYPOINT [ "php", "/mixphp/bin/swoole.php", "start" ] diff --git a/frameworks/PHP/simps/simps-micro.dockerfile b/frameworks/PHP/simps/simps-micro.dockerfile index baa74e103e1..4e5b9ffd075 100644 --- a/frameworks/PHP/simps/simps-micro.dockerfile +++ b/frameworks/PHP/simps/simps-micro.dockerfile @@ -1,22 +1,15 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole - -RUN docker-php-ext-install opcache pdo_mysql > /dev/null - -RUN apt -yqq update > /dev/null && \ - apt -yqq install git unzip > /dev/null +RUN docker-php-ext-install pcntl opcache curl > /dev/null WORKDIR /simps -COPY . /simps -COPY php.ini /usr/local/etc/php/ +COPY --link . . +COPY --link php.ini /usr/local/etc/php/ -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null RUN composer dumpautoload -o EXPOSE 8080 -CMD php sbin/simps.php http:start +ENTRYPOINT [ "php", "sbin/simps.php", "http:start" ] diff --git a/frameworks/PHP/simps/simps.dockerfile b/frameworks/PHP/simps/simps.dockerfile index baa74e103e1..4e5b9ffd075 100644 --- a/frameworks/PHP/simps/simps.dockerfile +++ b/frameworks/PHP/simps/simps.dockerfile @@ -1,22 +1,15 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole - -RUN docker-php-ext-install opcache pdo_mysql > /dev/null - -RUN apt -yqq update > /dev/null && \ - apt -yqq install git unzip > /dev/null +RUN docker-php-ext-install pcntl opcache curl > /dev/null WORKDIR /simps -COPY . /simps -COPY php.ini /usr/local/etc/php/ +COPY --link . . +COPY --link php.ini /usr/local/etc/php/ -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null RUN composer dumpautoload -o EXPOSE 8080 -CMD php sbin/simps.php http:start +ENTRYPOINT [ "php", "sbin/simps.php", "http:start" ] diff --git a/frameworks/PHP/symfony/public/swoole.php b/frameworks/PHP/symfony/public/swoole.php index 2c0695003f4..a1825fc344e 100644 --- a/frameworks/PHP/symfony/public/swoole.php +++ b/frameworks/PHP/symfony/public/swoole.php @@ -15,6 +15,6 @@ require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -return function (array $context) { +return function (array $context): Kernel { return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); }; diff --git a/frameworks/PHP/symfony/symfony-swoole.dockerfile b/frameworks/PHP/symfony/symfony-swoole.dockerfile index 37403a24c97..e8fda091bb3 100644 --- a/frameworks/PHP/symfony/symfony-swoole.dockerfile +++ b/frameworks/PHP/symfony/symfony-swoole.dockerfile @@ -1,16 +1,11 @@ -FROM php:8.3-cli - -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole - -RUN pecl install apcu > /dev/null && \ - docker-php-ext-enable apcu +FROM phpswoole/swoole:5.1.3-php8.3 RUN apt-get update -yqq && \ - apt-get install -yqq libpq-dev libicu-dev git unzip > /dev/null && \ + apt-get install -yqq libpq-dev libicu-dev > /dev/null && \ docker-php-ext-install pdo_pgsql opcache intl > /dev/null -COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer +RUN pecl install apcu > /dev/null && \ + docker-php-ext-enable apcu COPY --link deploy/swoole/php.ini /usr/local/etc/php/ WORKDIR /symfony diff --git a/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile b/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile index d4195a1d945..7a99706faaf 100644 --- a/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile @@ -1,29 +1,17 @@ -FROM php:8.3-cli +FROM phpswoole/swoole:5.1.3-php8.3 -RUN apt-get update > /dev/null - -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole - -RUN docker-php-ext-install pdo_mysql opcache pcntl > /dev/null +RUN docker-php-ext-install pcntl opcache > /dev/null COPY deploy/conf/php-async.ini /usr/local/etc/php/php.ini -ADD ./ /ubiquity WORKDIR /ubiquity +ADD --link . . RUN chmod -R 777 /ubiquity -RUN ["chmod", "+x", "deploy/run/install-composer.sh"] - -RUN deploy/run/install-composer.sh - -RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git unzip > /dev/null - -RUN php composer.phar require phpmv/ubiquity-devtools:dev-master phpmv/ubiquity-swoole:dev-master --quiet +RUN composer require phpmv/ubiquity-devtools:dev-master phpmv/ubiquity-swoole:dev-master --quiet -RUN php composer.phar install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN chmod 777 -R /ubiquity/.ubiquity/* @@ -36,4 +24,4 @@ COPY deploy/conf/swoole/mysql/swooleServices.php app/config/swooleServices.php EXPOSE 8080 -CMD /ubiquity/vendor/bin/Ubiquity serve -t=swoole -p=8080 -h=0.0.0.0 +ENTRYPOINT [ "/ubiquity/vendor/bin/Ubiquity", "serve", "-t=swoole", "-p=8080", "-h=0.0.0.0" ] diff --git a/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile b/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile index ff57c3c54e1..d4807c4a8ad 100644 --- a/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile @@ -1,9 +1,4 @@ -FROM php:8.3-cli - -RUN apt-get update > /dev/null - -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole +FROM phpswoole/swoole:5.1.3-php8.3 RUN apt-get install -y libpq-dev \ && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ @@ -11,21 +6,14 @@ RUN apt-get install -y libpq-dev \ COPY deploy/conf/php-async.ini /usr/local/etc/php/php.ini -ADD ./ /ubiquity WORKDIR /ubiquity +ADD --link . . RUN chmod -R 777 /ubiquity -RUN ["chmod", "+x", "deploy/run/install-composer.sh"] - -RUN deploy/run/install-composer.sh - -RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git unzip > /dev/null - -RUN php composer.phar require phpmv/ubiquity-devtools:dev-master phpmv/ubiquity-swoole:dev-master --quiet +RUN composer require phpmv/ubiquity-devtools:dev-master phpmv/ubiquity-swoole:dev-master --quiet -RUN php composer.phar install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN chmod 777 -R /ubiquity/.ubiquity/* @@ -38,4 +26,4 @@ COPY deploy/conf/swoole/pgsql/swooleServices.php app/config/swooleServices.php EXPOSE 8080 -CMD /ubiquity/vendor/bin/Ubiquity serve -t=swoole -p=8080 -h=0.0.0.0 +ENTRYPOINT [ "/ubiquity/vendor/bin/Ubiquity", "serve", "-t=swoole", "-p=8080", "-h=0.0.0.0" ] From 723dd6eeb2dc6a8c9e3d8f2f24f0b5c17acb39e6 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 31 Jul 2024 20:19:05 +0200 Subject: [PATCH 0729/1766] Update to MySQL 9.0 (#9183) --- toolset/databases/mysql/create.sql | 6 +++--- toolset/databases/mysql/my.cnf | 2 +- toolset/databases/mysql/mysql.dockerfile | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/toolset/databases/mysql/create.sql b/toolset/databases/mysql/create.sql index 94cb995deb3..d97fb37f490 100644 --- a/toolset/databases/mysql/create.sql +++ b/toolset/databases/mysql/create.sql @@ -2,14 +2,14 @@ # http://stackoverflow.com/questions/37719818/the-server-time-zone-value-aest-is-unrecognized-or-represents-more-than-one-ti SET GLOBAL time_zone = '+00:00'; -CREATE USER IF NOT EXISTS 'benchmarkdbuser'@'%' IDENTIFIED WITH mysql_native_password BY 'benchmarkdbpass'; -CREATE USER IF NOT EXISTS 'benchmarkdbuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'benchmarkdbpass'; +CREATE USER IF NOT EXISTS 'benchmarkdbuser'@'%' IDENTIFIED WITH caching_sha2_password BY 'benchmarkdbpass'; +CREATE USER IF NOT EXISTS 'benchmarkdbuser'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'benchmarkdbpass'; -- GitHub Actions/CI run the database server on the same system as the benchmarks. -- Because we setup MySQL with the skip-name-resolve option, the IP address 127.0.0.1 might not be resolved to localhost -- anymore. This does not seem to matter, as long as Unix sockets are being used (e.g. when setting up the docker image), -- because the host is set to be localhost implicitly, but it matters for local TCP connections. -CREATE USER IF NOT EXISTS 'benchmarkdbuser'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'benchmarkdbpass'; +CREATE USER IF NOT EXISTS 'benchmarkdbuser'@'127.0.0.1' IDENTIFIED WITH caching_sha2_password BY 'benchmarkdbpass'; # modified from SO answer http://stackoverflow.com/questions/5125096/for-loop-in-mysql CREATE DATABASE IF NOT EXISTS hello_world; diff --git a/toolset/databases/mysql/my.cnf b/toolset/databases/mysql/my.cnf index 40ffa8dd9eb..e1a401ae2d9 100644 --- a/toolset/databases/mysql/my.cnf +++ b/toolset/databases/mysql/my.cnf @@ -16,7 +16,7 @@ default-character-set=utf8 # * Basic Settings # default-storage-engine = innodb -mysql_native_password = ON +#mysql_native_password = ON # disabled in v9 #default_authentication_plugin = mysql_native_password user = mysql diff --git a/toolset/databases/mysql/mysql.dockerfile b/toolset/databases/mysql/mysql.dockerfile index 1aae5eb7d38..b5c5b6a67bb 100644 --- a/toolset/databases/mysql/mysql.dockerfile +++ b/toolset/databases/mysql/mysql.dockerfile @@ -1,4 +1,4 @@ -FROM mysql:8.4 +FROM mysql:9.0 ENV MYSQL_ROOT_PASSWORD=root ENV MYSQL_USER=benchmarkdbuser From 31599d26230c61f5d15714fea01447d7926a8529 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 31 Jul 2024 20:19:18 +0200 Subject: [PATCH 0730/1766] Fix Nodejs mysql-raw.js (#9184) --- frameworks/JavaScript/nodejs/handlers/mysql-raw.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/nodejs/handlers/mysql-raw.js b/frameworks/JavaScript/nodejs/handlers/mysql-raw.js index 5fa1ea3c625..6063b4020e4 100644 --- a/frameworks/JavaScript/nodejs/handlers/mysql-raw.js +++ b/frameworks/JavaScript/nodejs/handlers/mysql-raw.js @@ -1,6 +1,6 @@ const h = require('../helper'); const async = require('async'); -const mysql = require('mysql'); +const mysql = require('mysql2'); const connection = mysql.createConnection({ host: 'tfb-database', user: 'benchmarkdbuser', From 536f6cfea5d91808e81276592ba602c477f41f97 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Wed, 31 Jul 2024 20:19:28 +0200 Subject: [PATCH 0731/1766] ntex: Upgrade to ntex-2.0 (#9185) --- frameworks/Rust/ntex/Cargo.toml | 11 +++++----- frameworks/Rust/ntex/src/db.rs | 31 +++++++++++++++------------- frameworks/Rust/ntex/src/main_plt.rs | 2 +- frameworks/Rust/ntex/src/utils.rs | 5 ++--- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index b1aff0f6435..6699c6c0f1d 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ntex" -version = "1.0.0" +version = "2.0.0" edition = "2018" [[bin]] @@ -37,22 +37,23 @@ tokio = ["ntex/tokio"] async-std = ["ntex/async-std"] [dependencies] -ntex = "1.0.0" +ntex = "=2.0.3" 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"] } buf-min = { version = "0.7", features = ["ntex-bytes"] } -env_logger = "0.10" +env_logger = "0.11" nanorand = { version = "0.7", default-features = false, features = ["std", "wyrand", "tls"] } atoi = "2.0" num_cpus = "1.16" -smallvec = "1.11" +smallvec = "1.13" +futures = "0.3" 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", branch="ntex-1.0" } +tokio-postgres = { git="https://github.com/fafhrd91/postgres.git", branch="ntex-2" } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/ntex/src/db.rs b/frameworks/Rust/ntex/src/db.rs index 578465a90e2..5bceed5b73e 100644 --- a/frameworks/Rust/ntex/src/db.rs +++ b/frameworks/Rust/ntex/src/db.rs @@ -1,10 +1,11 @@ use std::{cell::RefCell, fmt::Write as FmtWrite}; +use futures::stream::{futures_unordered::FuturesUnordered, StreamExt}; use nanorand::{Rng, WyRand}; use ntex::util::{BufMut, Bytes, BytesMut}; use smallvec::SmallVec; use tokio_postgres::types::ToSql; -use tokio_postgres::{connect, Client, Statement}; +use tokio_postgres::{connect, Client, Row, Statement}; use yarte::{ywrite_html, Serialize}; use super::utils; @@ -82,7 +83,7 @@ impl PgConnection { let row = self.cl.query_one(&self.world, &[&random_id]).await.unwrap(); let mut body = self.buf.borrow_mut(); - utils::reserve(&mut body); + utils::reserve(&mut body, 256); World { id: row.get(0), randomnumber: row.get(1), @@ -91,17 +92,20 @@ impl PgConnection { body.split().freeze() } + async fn get_one_world(&self, id: i32) -> Row { + self.cl.query_one(&self.world, &[&id]).await.unwrap() + } + pub async fn get_worlds(&self, num: usize) -> Bytes { let mut rng = self.rng.clone(); - let mut queries = SmallVec::<[_; 32]>::new(); + let mut queries = FuturesUnordered::new(); (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; - queries.push(self.cl.query_one(&self.world, &[&w_id])); + queries.push(self.get_one_world(w_id)) }); let mut worlds = SmallVec::<[_; 32]>::new(); - for fut in queries { - let row = fut.await.unwrap(); + while let Some(row) = queries.next().await { worlds.push(World { id: row.get(0), randomnumber: row.get(1), @@ -109,7 +113,7 @@ impl PgConnection { } let mut body = self.buf.borrow_mut(); - utils::reserve(&mut body); + utils::reserve(&mut body, 8 * 1024); body.put_u8(b'['); worlds.iter().for_each(|w| { w.to_bytes_mut(&mut *body); @@ -121,16 +125,15 @@ impl PgConnection { } pub async fn update(&self, num: usize) -> Bytes { - let mut rng = nanorand::tls_rng(); - let mut queries = SmallVec::<[_; 32]>::new(); + let mut rng = self.rng.clone(); + let mut queries = FuturesUnordered::new(); (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; - queries.push(self.cl.query_one(&self.world, &[&w_id])); + queries.push(self.get_one_world(w_id)) }); let mut worlds = SmallVec::<[_; 32]>::new(); - for fut in queries.into_iter() { - let row = fut.await.unwrap(); + while let Some(row) = queries.next().await { worlds.push(World { id: row.get(0), randomnumber: (rng.generate::() % 10_000 + 1) as i32, @@ -148,7 +151,7 @@ impl PgConnection { let _ = self.cl.query(&self.updates[num - 1], ¶ms).await; let mut body = self.buf.borrow_mut(); - utils::reserve(&mut body); + utils::reserve(&mut body, 8 * 1024); body.put_u8(b'['); worlds.iter().for_each(|w| { w.to_bytes_mut(&mut *body); @@ -174,7 +177,7 @@ impl PgConnection { fortunes.sort_by(|it, next| it.message.cmp(next.message)); let mut body = std::mem::replace(&mut *self.buf.borrow_mut(), BytesMut::new()); - utils::reserve(&mut body); + utils::reserve(&mut body, 8 * 1024); ywrite_html!(body, "{{> fortune }}"); let result = body.split().freeze(); let _ = std::mem::replace(&mut *self.buf.borrow_mut(), body); diff --git a/frameworks/Rust/ntex/src/main_plt.rs b/frameworks/Rust/ntex/src/main_plt.rs index 4e9279d4ebf..cda9b69fa15 100644 --- a/frameworks/Rust/ntex/src/main_plt.rs +++ b/frameworks/Rust/ntex/src/main_plt.rs @@ -35,7 +35,7 @@ impl Future for App { Ok((req, _)) => { let _ = this.io.with_write_buf(|buf| { buf.with_bytes_mut(|buf| { - utils::reserve(buf); + utils::reserve(buf, 2 * 1024); match req.path() { "/json" => { buf.extend_from_slice(JSON); diff --git a/frameworks/Rust/ntex/src/utils.rs b/frameworks/Rust/ntex/src/utils.rs index 5792506dd71..719d5962dd4 100644 --- a/frameworks/Rust/ntex/src/utils.rs +++ b/frameworks/Rust/ntex/src/utils.rs @@ -11,7 +11,6 @@ pub const HDR_HTML_CONTENT_TYPE: HeaderValue = HeaderValue::from_static("text/html; charset=utf-8"); pub const BODY_PLAIN_TEXT: Bytes = Bytes::from_static(b"Hello, World!"); -const LW: usize = 1024; const HW: usize = 128 * 1024; pub const SIZE: usize = 27; @@ -25,9 +24,9 @@ pub fn get_query_param(query: Option<&str>) -> usize { cmp::min(500, cmp::max(1, q) as usize) } -pub fn reserve(buf: &mut BytesMut) { +pub fn reserve(buf: &mut BytesMut, lw: usize) { let remaining = buf.remaining_mut(); - if remaining < LW { + if remaining < lw { buf.reserve(HW); } } From 2777f0a10cc787a64d7faedc51191d61426c48e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 18:20:13 +0000 Subject: [PATCH 0732/1766] Bump mysql2 from 3.9.7 to 3.9.8 in /frameworks/JavaScript/hapi Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.9.7 to 3.9.8. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.9.7...v3.9.8) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/hapi/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/hapi/package.json b/frameworks/JavaScript/hapi/package.json index 5d6070a266a..6a6c23a897b 100644 --- a/frameworks/JavaScript/hapi/package.json +++ b/frameworks/JavaScript/hapi/package.json @@ -10,7 +10,7 @@ "handlebars": "4.3.0", "mongoose": "5.13.20", "mysql": "2.16.0", - "mysql2": "3.9.7", + "mysql2": "3.9.8", "pg": "8.5.1", "pg-hstore": "2.3.2", "sequelize": "6.29.0" From 7b0f9539052ca4d7becb9fcf56d2bb06c62c251f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 18:21:20 +0000 Subject: [PATCH 0733/1766] Bump fast-xml-parser and @aws-sdk/credential-providers Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) and [@aws-sdk/credential-providers](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/packages/credential-providers). These dependencies needed to be updated together. Updates `fast-xml-parser` from 4.2.5 to 4.4.1 - [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases) - [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.2.5...v4.4.1) Updates `@aws-sdk/credential-providers` from 3.398.0 to 3.621.0 - [Release notes](https://github.com/aws/aws-sdk-js-v3/releases) - [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/credential-providers/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.621.0/packages/credential-providers) --- updated-dependencies: - dependency-name: fast-xml-parser dependency-type: indirect - dependency-name: "@aws-sdk/credential-providers" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../JavaScript/spliffy/package-lock.json | 3541 ++++++++++++----- 1 file changed, 2581 insertions(+), 960 deletions(-) diff --git a/frameworks/JavaScript/spliffy/package-lock.json b/frameworks/JavaScript/spliffy/package-lock.json index 40b146ce31c..114cddc45d1 100644 --- a/frameworks/JavaScript/spliffy/package-lock.json +++ b/frameworks/JavaScript/spliffy/package-lock.json @@ -4,986 +4,2619 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "optional": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "@aws-sdk/client-sso-oidc": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.621.0.tgz", + "integrity": "sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "requires": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "requires": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "requires": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "requires": { + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/config-resolver": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "requires": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/credential-provider-imds": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", + "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "requires": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "requires": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "requires": { + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "@smithy/invalid-dependency": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-content-length": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", + "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "requires": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "requires": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-retry": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", + "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", + "requires": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + } + }, + "@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "requires": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "requires": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "requires": { + "@smithy/types": "^3.3.0" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/smithy-client": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "requires": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "requires": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-browser": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", + "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-node": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", + "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", + "requires": { + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "requires": { + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "requires": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" } } }, - "@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "optional": true, - "requires": { - "tslib": "^1.11.1" + "@aws-sdk/core": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "requires": { + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" }, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "requires": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "requires": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "requires": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "requires": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/signature-v4": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", + "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/smithy-client": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "requires": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "requires": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "requires": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "requires": { + "strnum": "^1.0.5" + } } } }, - "@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "optional": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@aws-sdk/credential-provider-http": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" }, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "optional": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "optional": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "optional": true, - "requires": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "requires": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "requires": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "requires": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "requires": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/smithy-client": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "requires": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "requires": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "requires": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + } } } }, - "@aws-sdk/client-cognito-identity": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.398.0.tgz", - "integrity": "sha512-Pr/S1f8R2FsJ8DwBC6g0CSdtZNNV5dMHhlIi+t8YAmCJvP4KT+UhzFjbvQRINlBRLFuGUuP7p5vRcGVELD3+wA==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.398.0", - "@aws-sdk/credential-provider-node": "3.398.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-signing": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.398.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.5", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.5", - "@smithy/util-defaults-mode-node": "^2.0.5", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.398.0.tgz", - "integrity": "sha512-CygL0jhfibw4kmWXG/3sfZMFNjcXo66XUuPC4BqZBk8Rj5vFoxp1vZeMkDLzTIk97Nvo5J5Bh+QnXKhub6AckQ==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.398.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.5", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.5", - "@smithy/util-defaults-mode-node": "^2.0.5", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sts": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.398.0.tgz", - "integrity": "sha512-/3Pa9wLMvBZipKraq3AtbmTfXW6q9kyvhwOno64f1Fz7kFb8ijQFMGoATS70B2pGEZTlxkUqJFWDiisT6Q6dFg==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.398.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-sdk-sts": "3.398.0", - "@aws-sdk/middleware-signing": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.398.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.5", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.5", - "@smithy/util-defaults-mode-node": "^2.0.5", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.398.0.tgz", - "integrity": "sha512-MFUhy1YayHg5ypRTk4OTfDumQRP+OJBagaGv14kA8DzhKH1sNrU4HV7A7y2J4SvkN5hG/KnLJqxpakCtB2/O2g==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.398.0.tgz", - "integrity": "sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.398.0.tgz", - "integrity": "sha512-AsK1lStK3nB9Cn6S6ODb1ktGh7SRejsNVQVKX3t5d3tgOaX+aX1Iwy8FzM/ZEN8uCloeRifUGIY9uQFygg5mSw==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.398.0", - "@aws-sdk/credential-provider-process": "3.398.0", - "@aws-sdk/credential-provider-sso": "3.398.0", - "@aws-sdk/credential-provider-web-identity": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.398.0.tgz", - "integrity": "sha512-odmI/DSKfuWUYeDnGTCEHBbC8/MwnF6yEq874zl6+owoVv0ZsYP8qBHfiJkYqrwg7wQ7Pi40sSAPC1rhesGwzg==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.398.0", - "@aws-sdk/credential-provider-ini": "3.398.0", - "@aws-sdk/credential-provider-process": "3.398.0", - "@aws-sdk/credential-provider-sso": "3.398.0", - "@aws-sdk/credential-provider-web-identity": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.398.0.tgz", - "integrity": "sha512-WrkBL1W7TXN508PA9wRXPFtzmGpVSW98gDaHEaa8GolAPHMPa5t2QcC/z/cFpglzrcVv8SA277zu9Z8tELdZhg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.398.0.tgz", - "integrity": "sha512-2Dl35587xbnzR/GGZqA2MnFs8+kS4wbHQO9BioU0okA+8NRueohNMdrdQmQDdSNK4BfIpFspiZmFkXFNyEAfgw==", - "optional": true, - "requires": { - "@aws-sdk/client-sso": "3.398.0", - "@aws-sdk/token-providers": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.398.0.tgz", - "integrity": "sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, "@aws-sdk/credential-providers": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.398.0.tgz", - "integrity": "sha512-355vXmImn2e85mIWSYDVb101AF2lIVHKNCaH6sV1U/8i0ZOXh2cJYNdkRYrxNt1ezDB0k97lSKvuDx7RDvJyRg==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.398.0", - "@aws-sdk/client-sso": "3.398.0", - "@aws-sdk/client-sts": "3.398.0", - "@aws-sdk/credential-provider-cognito-identity": "3.398.0", - "@aws-sdk/credential-provider-env": "3.398.0", - "@aws-sdk/credential-provider-ini": "3.398.0", - "@aws-sdk/credential-provider-node": "3.398.0", - "@aws-sdk/credential-provider-process": "3.398.0", - "@aws-sdk/credential-provider-sso": "3.398.0", - "@aws-sdk/credential-provider-web-identity": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.398.0.tgz", - "integrity": "sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.398.0.tgz", - "integrity": "sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.398.0.tgz", - "integrity": "sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.398.0.tgz", - "integrity": "sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==", - "optional": true, - "requires": { - "@aws-sdk/middleware-signing": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-signing": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.398.0.tgz", - "integrity": "sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.2.2", - "@smithy/util-middleware": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.398.0.tgz", - "integrity": "sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/token-providers": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.398.0.tgz", - "integrity": "sha512-nrYgjzavGCKJL/48Vt0EL+OlIc5UZLfNGpgyUW9cv3XZwl+kXV0QB+HH0rHZZLfpbBgZ2RBIJR9uD5ieu/6hpQ==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.398.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.5", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.5", - "@smithy/util-defaults-mode-node": "^2.0.5", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/types": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", - "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.398.0.tgz", - "integrity": "sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.398.0.tgz", - "integrity": "sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/types": "^2.2.2", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.398.0.tgz", - "integrity": "sha512-RTVQofdj961ej4//fEkppFf4KXqKGMTCqJYghx3G0C/MYXbg7MGl7LjfNGtJcboRE8pfHHQ/TUWBDA7RIAPPlQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.398.0", - "@smithy/node-config-provider": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@mongodb-js/saslprep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "@smithy/abort-controller": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.5.tgz", - "integrity": "sha512-byVZ2KWLMPYAZGKjRpniAzLcygJO4ruClZKdJTuB0eCB76ONFTdptBHlviHpAZXknRz7skYWPfcgO9v30A1SyA==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/config-resolver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.5.tgz", - "integrity": "sha512-n0c2AXz+kjALY2FQr7Zy9zhYigXzboIh1AuUUVCqFBKFtdEvTwnwPXrTDoEehLiRTUHNL+4yzZ3s+D0kKYSLSg==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/credential-provider-imds": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.5.tgz", - "integrity": "sha512-KFcf/e0meFkQNyteJ65f1G19sgUEY1e5zL7hyAEUPz2SEfBmC9B37WyRq87G3MEEsvmAWwCRu7nFFYUKtR3svQ==", - "optional": true, - "requires": { - "@smithy/node-config-provider": "^2.0.5", - "@smithy/property-provider": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.5.tgz", - "integrity": "sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==", - "optional": true, - "requires": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.2.2", - "@smithy/util-hex-encoding": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/fetch-http-handler": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.5.tgz", - "integrity": "sha512-EzFoMowdBNy1VqtvkiXgPFEdosIAt4/4bgZ8uiDiUyfhmNXq/3bV+CagPFFBsgFOR/X2XK4zFZHRsoa7PNHVVg==", - "optional": true, - "requires": { - "@smithy/protocol-http": "^2.0.5", - "@smithy/querystring-builder": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.5.tgz", - "integrity": "sha512-mk551hIywBITT+kXruRNXk7f8Fy7DTzBjZJSr/V6nolYKmUHIG3w5QU6nO9qPYEQGKc/yEPtkpdS28ndeG93lA==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/invalid-dependency": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.5.tgz", - "integrity": "sha512-0wEi+JT0hM+UUwrJVYbqjuGFhy5agY/zXyiN7BNAJ1XoCDjU5uaNSj8ekPWsXd/d4yM6NSe8UbPd8cOc1+3oBQ==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/is-array-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-content-length": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.5.tgz", - "integrity": "sha512-E7VwV5H02fgZIUGRli4GevBCAPvkyEI/fgl9SU47nPPi3DAAX3nEtUb8xfGbXjOcJ5BdSUoWWZn42tEd/blOqA==", - "optional": true, - "requires": { - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-endpoint": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.5.tgz", - "integrity": "sha512-tyzDuoNTbsMQCq5Xkc4QOt6e2GACUllQIV8SQ5fc59FtOIV9/vbf58/GxVjZm2o8+MMbdDBANjTDZe/ijZKfyA==", - "optional": true, - "requires": { - "@smithy/middleware-serde": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", - "@smithy/util-middleware": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-retry": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.5.tgz", - "integrity": "sha512-ulIfbFyzQTVnJbLjUl1CTSi0etg6tej/ekwaLp0Gn8ybUkDkKYa+uB6CF/m2J5B6meRwyJlsryR+DjaOVyiicg==", - "optional": true, - "requires": { - "@smithy/protocol-http": "^2.0.5", - "@smithy/service-error-classification": "^2.0.0", - "@smithy/types": "^2.2.2", - "@smithy/util-middleware": "^2.0.0", - "@smithy/util-retry": "^2.0.0", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.621.0.tgz", + "integrity": "sha512-FQbC7I8ae/72ZekLBa45jWJ+Q3d+YPhc3bW/rCks6RrldM6RgLTGr8pTOPCxHl828ky10RjkBiBmVU818rliyw==", + "requires": { + "@aws-sdk/client-cognito-identity": "3.621.0", + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/credential-provider-cognito-identity": "3.621.0", + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true - } - } - }, - "@smithy/middleware-serde": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.5.tgz", - "integrity": "sha512-in0AA5sous74dOfTGU9rMJBXJ0bDVNxwdXtEt5lh3FVd2sEyjhI+rqpLLRF1E4ixbw3RSEf80hfRpcPdjg4vvQ==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-stack": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", - "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/node-config-provider": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.5.tgz", - "integrity": "sha512-LRtjV9WkhONe2lVy+ipB/l1GX60ybzBmFyeRUoLUXWKdnZ3o81jsnbKzMK8hKq8eFSWPk+Lmyx6ZzCQabGeLxg==", - "optional": true, - "requires": { - "@smithy/property-provider": "^2.0.5", - "@smithy/shared-ini-file-loader": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/node-http-handler": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.5.tgz", - "integrity": "sha512-lZm5DZf4b3V0saUw9WTC4/du887P6cy2fUyQgQQKRRV6OseButyD5yTzeMmXE53CaXJBMBsUvvIQ0hRVxIq56w==", - "optional": true, - "requires": { - "@smithy/abort-controller": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/querystring-builder": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/property-provider": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.5.tgz", - "integrity": "sha512-cAFSUhX6aiHcmpWfrCLKvwBtgN1F6A0N8qY/8yeSi0LRLmhGqsY1/YTxFE185MCVzYbqBGXVr9TBv4RUcIV4rA==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/protocol-http": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", - "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-builder": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.5.tgz", - "integrity": "sha512-4DCX9krxLzATj+HdFPC3i8pb7XTAWzzKqSw8aTZMjXjtQY+vhe4azMAqIvbb6g7JKwIkmkRAjK6EXO3YWSnJVQ==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "@smithy/util-uri-escape": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.5.tgz", - "integrity": "sha512-C2stCULH0r54KBksv3AWcN8CLS3u9+WsEW8nBrvctrJ5rQTNa1waHkffpVaiKvcW2nP0aIMBPCobD/kYf/q9mA==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/service-error-classification": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", - "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==", - "optional": true - }, - "@smithy/shared-ini-file-loader": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.5.tgz", - "integrity": "sha512-Mvtk6FwMtfbKRC4YuSsIqRYp9WTxsSUJVVo2djgyhcacKGMqicHDWSAmgy3sDrKv+G/G6xTZCPwm6pJARtdxVg==", - "optional": true, - "requires": { - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/signature-v4": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.5.tgz", - "integrity": "sha512-ABIzXmUDXK4n2c9cXjQLELgH2RdtABpYKT+U131e2I6RbCypFZmxIHmIBufJzU2kdMCQ3+thBGDWorAITFW04A==", - "optional": true, - "requires": { - "@smithy/eventstream-codec": "^2.0.5", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.2.2", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.0", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/smithy-client": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.5.tgz", - "integrity": "sha512-kCTFr8wfOAWKDzGvfBElc6shHigWtHNhMQ1IbosjC4jOlayFyZMSs2PysKB+Ox/dhQ41KqOzgVjgiQ+PyWqHMQ==", - "optional": true, - "requires": { - "@smithy/middleware-stack": "^2.0.0", - "@smithy/types": "^2.2.2", - "@smithy/util-stream": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@smithy/types": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.2.2.tgz", - "integrity": "sha512-4PS0y1VxDnELGHGgBWlDksB2LJK8TG8lcvlWxIsgR+8vROI7Ms8h1P4FQUx+ftAX2QZv5g1CJCdhdRmQKyonyw==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/url-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.5.tgz", - "integrity": "sha512-OdMBvZhpckQSkugCXNJQCvqJ71wE7Ftxce92UOQLQ9pwF6hoS5PLL7wEfpnuEXtStzBqJYkzu1C1ZfjuFGOXAA==", - "optional": true, - "requires": { - "@smithy/querystring-parser": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" - } - }, - "@smithy/util-base64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", - "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", - "optional": true, - "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-buffer-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", - "optional": true, - "requires": { - "@smithy/is-array-buffer": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-browser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.5.tgz", - "integrity": "sha512-yciP6TPttLsj731aHTvekgyuCGXQrEAJibEwEWAh3kzaDsfGAVCuZSBlyvC2Dl3TZmHKCOQwHV8mIE7KQCTPuQ==", - "optional": true, - "requires": { - "@smithy/property-provider": "^2.0.5", - "@smithy/types": "^2.2.2", - "bowser": "^2.11.0", - "tslib": "^2.5.0" + "@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "requires": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "requires": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.621.0.tgz", + "integrity": "sha512-FpXia5qFf6ijcNDWenVq+mP9r1LbiW/+52i9wrv2+Afi6Nn1ROf8W7St8WvE9TEZ3t78y+vis4CwqfGts+uiKA==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/client-sts": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.621.0.tgz", + "integrity": "sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.621.0.tgz", + "integrity": "sha512-Q+3awvTVJSqIGRjCUQflRwKPKlZ0TfmL3EQHgFLhZZrToeBapEA62+FY+T70aTKAZZZZprlvYeFPtBloNd5ziA==", + "requires": { + "@aws-sdk/client-cognito-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "requires": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "requires": { + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "requires": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/config-resolver": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "requires": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/credential-provider-imds": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", + "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "requires": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "requires": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "requires": { + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "@smithy/invalid-dependency": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-content-length": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", + "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "requires": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "requires": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-retry": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", + "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", + "requires": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + } + }, + "@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "requires": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "requires": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "requires": { + "@smithy/types": "^3.3.0" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/smithy-client": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "requires": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "requires": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-browser": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", + "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-node": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", + "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", + "requires": { + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "requires": { + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "requires": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + } } }, - "@smithy/util-defaults-mode-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.5.tgz", - "integrity": "sha512-M07t99rWasXt+IaDZDyP3BkcoEm/mgIE1RIMASrE49LKSNxaVN7PVcgGc77+4uu2kzBAyqJKy79pgtezuknyjQ==", - "optional": true, + "@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", "requires": { - "@smithy/config-resolver": "^2.0.5", - "@smithy/credential-provider-imds": "^2.0.5", - "@smithy/node-config-provider": "^2.0.5", - "@smithy/property-provider": "^2.0.5", - "@smithy/types": "^2.2.2", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "dependencies": { + "@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + } } }, - "@smithy/util-hex-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", - "optional": true, + "@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", "requires": { "tslib": "^2.5.0" } }, - "@smithy/util-middleware": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", - "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", + "@mongodb-js/saslprep": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", + "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", "optional": true, "requires": { - "tslib": "^2.5.0" + "sparse-bitfield": "^3.0.3" } }, - "@smithy/util-retry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", - "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", - "optional": true, - "requires": { - "@smithy/service-error-classification": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/core": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.1.tgz", + "integrity": "sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==", + "requires": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "requires": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "requires": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-retry": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", + "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", + "requires": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + } + }, + "@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "requires": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "requires": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "requires": { + "@smithy/types": "^3.3.0" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/smithy-client": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "requires": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "requires": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "requires": { + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "requires": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "requires": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + } } }, - "@smithy/util-stream": { + "@smithy/util-endpoints": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.5.tgz", - "integrity": "sha512-ylx27GwI05xLpYQ4hDIfS15vm+wYjNN0Sc2P0FxuzgRe8v0BOLHppGIQ+Bezcynk8C9nUzsUue3TmtRhjut43g==", - "optional": true, - "requires": { - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-uri-escape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", - "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", - "optional": true, + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", + "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "requires": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "requires": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "requires": { + "tslib": "^2.6.2" + } + } } }, "@srfnstack/spliffy": { @@ -1032,8 +2665,7 @@ "bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "optional": true + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, "bson": { "version": "4.7.2", @@ -1082,15 +2714,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "optional": true, - "requires": { - "strnum": "^1.0.5" - } - }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1435,8 +3058,7 @@ "strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, "tr46": { "version": "3.0.0", @@ -1449,8 +3071,7 @@ "tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "optional": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "uWebSockets.js": { "version": "github:uNetworking/uWebSockets.js#7bf0faac5859fef2d113e83d22803f7833774c11", From 64e6ae6f6f4714f9c22632e05408aeef4aeb4b01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 02:09:55 +0000 Subject: [PATCH 0734/1766] Bump rexml from 3.3.1 to 3.3.3 in /frameworks/Ruby/rack Bumps [rexml](https://github.com/ruby/rexml) from 3.3.1 to 3.3.3. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.3.1...v3.3.3) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... 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 0fa04f72580..7a08fdf7195 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -86,7 +86,7 @@ GEM rainbow (3.1.1) raindrops (0.20.1) regexp_parser (2.9.2) - rexml (3.3.1) + rexml (3.3.3) strscan rubocop (1.64.1) json (~> 2.3) From 912fb4827743ca029e8abb128eaf5f5ec1acb3c0 Mon Sep 17 00:00:00 2001 From: Rasmus Porsager Date: Fri, 2 Aug 2024 17:59:01 +0200 Subject: [PATCH 0735/1766] Add uwebsocketsjs (#9189) * Revert "Remove uwebsockets (#9160)" This reverts commit 4b0a91f07147386c8f11b36b1410f00b34c7611c. * Remove mysql * Don't fetch types on connect --- .../JavaScript/uwebsockets.js/README.md | 52 +++++ .../uwebsockets.js/benchmark_config.json | 47 +++++ .../uwebsockets.js/package-lock.json | 39 ++++ .../JavaScript/uwebsockets.js/package.json | 17 ++ .../uwebsockets.js/src/clustered.js | 23 +++ .../uwebsockets.js/src/database/postgres.js | 18 ++ .../JavaScript/uwebsockets.js/src/server.js | 194 ++++++++++++++++++ .../JavaScript/uwebsockets.js/src/utils.js | 86 ++++++++ .../uwebsockets.js-postgres.dockerfile | 12 ++ .../uwebsockets.js/uwebsockets.js.dockerfile | 11 + 10 files changed, 499 insertions(+) create mode 100644 frameworks/JavaScript/uwebsockets.js/README.md create mode 100644 frameworks/JavaScript/uwebsockets.js/benchmark_config.json create mode 100644 frameworks/JavaScript/uwebsockets.js/package-lock.json create mode 100644 frameworks/JavaScript/uwebsockets.js/package.json create mode 100644 frameworks/JavaScript/uwebsockets.js/src/clustered.js create mode 100644 frameworks/JavaScript/uwebsockets.js/src/database/postgres.js create mode 100644 frameworks/JavaScript/uwebsockets.js/src/server.js create mode 100644 frameworks/JavaScript/uwebsockets.js/src/utils.js create mode 100644 frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile create mode 100644 frameworks/JavaScript/uwebsockets.js/uwebsockets.js.dockerfile diff --git a/frameworks/JavaScript/uwebsockets.js/README.md b/frameworks/JavaScript/uwebsockets.js/README.md new file mode 100644 index 00000000000..bc59e8c3026 --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/README.md @@ -0,0 +1,52 @@ +# uWebSockets.js Benchmarking Test + +uWebSockets is a web server written in C/C++ (https://github.com/uNetworking/uWebSockets) + +µWebSockets.js is a web server bypass for Node.js (https://github.com/uNetworking/uWebSockets.js) + +## Important Libraries + +The tests were run with: + +- [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/) +- [postgres](https://github.com/porsager/postgres/) + +## Database + +There are individual handlers for each DB approach. The logic for each of them are found here: + +- [PostgreSQL](src/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/uwebsockets.js/benchmark_config.json b/frameworks/JavaScript/uwebsockets.js/benchmark_config.json new file mode 100644 index 00000000000..a0ac515dcfe --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/benchmark_config.json @@ -0,0 +1,47 @@ +{ + "framework": "uwebsockets.js", + "tests": [ + { + "default": { + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "database_os": "Linux", + "display_name": "uWebSockets.js", + "flavor": "NodeJS", + "framework": "uWebSockets.js", + "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": "uWebSockets.js", + "flavor": "NodeJS", + "fortune_url": "/fortunes", + "framework": "uWebSockets.js", + "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/uwebsockets.js/package-lock.json b/frameworks/JavaScript/uwebsockets.js/package-lock.json new file mode 100644 index 00000000000..13fff11e161 --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/package-lock.json @@ -0,0 +1,39 @@ +{ + "name": "uwebsockets.js", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "uwebsockets.js", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "postgres": "3.4.4", + "slow-json-stringify": "^2.0.1", + "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0" + } + }, + "node_modules/postgres": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.4.tgz", + "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, + "node_modules/slow-json-stringify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/slow-json-stringify/-/slow-json-stringify-2.0.1.tgz", + "integrity": "sha512-jqyzIqTaSkRGcWdWqjmOLKHZgOGUT71ZCTsvQu1xGu9Mqaod7O26y5FJJEmaUQhaTWh0bkXv2qqN0i+EQsD1jQ==" + }, + "node_modules/uWebSockets.js": { + "version": "20.44.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#8fa05571bf6ea95be8966ad313d9d39453e381ae" + } + } +} diff --git a/frameworks/JavaScript/uwebsockets.js/package.json b/frameworks/JavaScript/uwebsockets.js/package.json new file mode 100644 index 00000000000..635c0a2b12a --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/package.json @@ -0,0 +1,17 @@ +{ + "dependencies": { + "postgres": "3.4.4", + "slow-json-stringify": "^2.0.1", + "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0" + }, + "license": "MIT", + "main": "src/server.js", + "name": "uwebsockets.js", + "private": true, + "scripts": { + "dev": "node src/server.js", + "start": "node src/clustered.js" + }, + "type": "module", + "version": "0.0.1" +} diff --git a/frameworks/JavaScript/uwebsockets.js/src/clustered.js b/frameworks/JavaScript/uwebsockets.js/src/clustered.js new file mode 100644 index 00000000000..95a57ec77f3 --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/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/uwebsockets.js/src/database/postgres.js b/frameworks/JavaScript/uwebsockets.js/src/database/postgres.js new file mode 100644 index 00000000000..db262a9757d --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/src/database/postgres.js @@ -0,0 +1,18 @@ +import postgres from "postgres"; + +const sql = postgres({ + host: "tfb-database", + user: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", + fetch_types: false, + 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/uwebsockets.js/src/server.js b/frameworks/JavaScript/uwebsockets.js/src/server.js new file mode 100644 index 00000000000..1db7d391f2a --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/src/server.js @@ -0,0 +1,194 @@ +import uWebSockets from "uWebSockets.js"; +import { + addBenchmarkHeaders, + generateRandomNumber, + getQueriesCount, + handleError, + escape, + jsonSerializer, + worldObjectSerializer, + sortByMessage +} from "./utils.js"; + +let db; +const { DATABASE } = process.env; +if (DATABASE) db = await import(`./database/${DATABASE}.js`); + +const webserver = uWebSockets.App(); + +webserver.get("/plaintext", new uWebSockets.DeclarativeResponse() + .writeHeader("Server", "uWebSockets.js") + .writeHeader("Content-Type", "text/plain") + .end("Hello, World!") +); + +webserver.get("/json", (response) => { + addBenchmarkHeaders(response); + response.writeHeader("Content-Type", "application/json"); + // response.end(JSON.stringify({ message: "Hello, World!" })); + response.end(jsonSerializer({ message: "Hello, World!" })); +}); + +if (db) { + webserver.get("/db", async (response) => { + response.onAborted(() => { + response.aborted = true; + }); + + try { + const row = await db.find(generateRandomNumber()); + + if (response.aborted) { + return; + } + + response.cork(() => { + addBenchmarkHeaders(response); + response.writeHeader("Content-Type", "application/json"); + // response.end(JSON.stringify(rows)); + response.end(worldObjectSerializer(row)); + }); + } catch (error) { + if (response.aborted) { + return; + } + + handleError(error, response); + } + }); + + webserver.get("/queries", async (response, request) => { + response.onAborted(() => { + response.aborted = true; + }); + + try { + const queriesCount = getQueriesCount(request); + + const databaseJobs = new Array(queriesCount); + + for (let i = 0; i < queriesCount; i++) { + databaseJobs[i] = db.find(generateRandomNumber()); + } + + const worldObjects = await Promise.all(databaseJobs); + + if (response.aborted) { + return; + } + + response.cork(() => { + addBenchmarkHeaders(response); + response.writeHeader("Content-Type", "application/json"); + response.end(JSON.stringify(worldObjects)); + }); + } catch (error) { + if (response.aborted) { + return; + } + + handleError(error, response); + } + }); + + const extra = { id: 0, message: "Additional fortune added at request time." }; + + webserver.get("/fortunes", async (response) => { + response.onAborted(() => { + response.aborted = true; + }); + + try { + const rows = [extra, ...await db.fortunes()]; + + if (response.aborted) { + return; + } + + // rows.push({ + // id: 0, + // message: "Additional fortune added at request time.", + // }); + + // rows.sort((a, b) => (a.message < b.message) ? -1 : 1); + sortByMessage(rows) + + const n = rows.length + + let html = "", i = 0; + for (; i < n; i++) { + html += `${rows[i].id}${escape(rows[i].message)}`; + } + + response.cork(() => { + addBenchmarkHeaders(response); + response.writeHeader("Content-Type", "text/html; charset=utf-8"); + response.end(`Fortunes${html}
idmessage
`); + }); + } catch (error) { + if (response.aborted) { + return; + } + + handleError(error, response); + } + }); + + webserver.get("/updates", async (response, request) => { + response.onAborted(() => { + response.aborted = true; + }); + + try { + const queriesCount = getQueriesCount(request); + + 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); + + if (response.aborted) { + return; + } + + response.cork(() => { + addBenchmarkHeaders(response); + response.writeHeader("Content-Type", "application/json"); + response.end(JSON.stringify(worldObjects)); + }); + } catch (error) { + if (response.aborted) { + return; + } + + handleError(error, response); + } + }); +} + +webserver.any("/*", (response) => { + response.writeStatus("404 Not Found"); + addBenchmarkHeaders(response); + response.writeHeader("Content-Type", "text/plain"); + response.end("Not Found"); +}); + +const host = process.env.HOST || "0.0.0.0"; +const port = parseInt(process.env.PORT || "8080"); +webserver.listen(host, port, (socket) => { + if (!socket) { + console.error(`Couldn't bind to http://${host}:${port}!`); + process.exit(1); + } + + console.log(`Successfully bound to http://${host}:${port}.`); +}); diff --git a/frameworks/JavaScript/uwebsockets.js/src/utils.js b/frameworks/JavaScript/uwebsockets.js/src/utils.js new file mode 100644 index 00000000000..b3d46e7e11c --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/src/utils.js @@ -0,0 +1,86 @@ +import { sjs, attr } from 'slow-json-stringify' + +/** + * Add Benchmark HTTP response headers. + * + * Add HTTP response headers `Server` which is required by the test suite. + * Header `Date` is automatically added by uWebsockets + * https://github.com/uNetworking/uWebSockets/blob/master/src/HttpResponse.h#L78 + * + * https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview + * + * @param {import('uWebSockets.js').HttpResponse} response + */ +export function addBenchmarkHeaders(response) { + response.writeHeader("Server", "uWebSockets.js"); +} + +/** + * Handle error for response + * + * @param {Error} error + * @param {import('uWebSockets.js').HttpResponse} response + */ +export function handleError(error, response) { + console.error(error); + response.cork(() => { + addBenchmarkHeaders(response); + response.writeHeader("Content-Type", "text/plain"); + response.end("Internal Server Error"); + }); +} + +/** + * Get queries count + * + * @param {import('uWebSockets.js').HttpRequest} request + */ +export function getQueriesCount(request) { + return Math.min(parseInt(request.getQuery("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 Slow json stringify module to get faster results + */ +export const jsonSerializer = sjs({ message: attr("string")}); +export const worldObjectSerializer = sjs({ id: attr('number'), randomnumber: attr('number') }); +// export const worldObjectsSerializer = sjs({ rows: attr("array", worldObjectSerializer) }); + +/** + * 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 +} \ No newline at end of file diff --git a/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile new file mode 100644 index 00000000000..ba7d0eee5f6 --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js-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/uwebsockets.js/uwebsockets.js.dockerfile b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js.dockerfile new file mode 100644 index 00000000000..4262ad19953 --- /dev/null +++ b/frameworks/JavaScript/uwebsockets.js/uwebsockets.js.dockerfile @@ -0,0 +1,11 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production + +EXPOSE 8080 + +CMD ["npm", "start"] From f496311ba17a4725432703059c0d58317f5b651e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gyula=20Bibern=C3=A1th?= <27079815+b-gyula@users.noreply.github.com> Date: Fri, 2 Aug 2024 17:59:22 +0200 Subject: [PATCH 0736/1766] Java/armeria: /fortunes exposed to test (#9179) Scala/vertx-web-scala-postgres: /json endpoint exposed to test (makes them appear in composite scoring also) --- frameworks/Java/armeria/benchmark_config.json | 1 + .../vertx-web-scala/benchmark_config.json | 1 + .../src/main/scala/vertx/App.scala | 30 ++++++++----------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/frameworks/Java/armeria/benchmark_config.json b/frameworks/Java/armeria/benchmark_config.json index 32cdbd6303f..bdc474dfd9b 100644 --- a/frameworks/Java/armeria/benchmark_config.json +++ b/frameworks/Java/armeria/benchmark_config.json @@ -7,6 +7,7 @@ "db_url": "/db", "query_url": "/queries/", "update_url": "/updates/", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Micro", diff --git a/frameworks/Scala/vertx-web-scala/benchmark_config.json b/frameworks/Scala/vertx-web-scala/benchmark_config.json index d5f73751a49..4a8c4242d34 100755 --- a/frameworks/Scala/vertx-web-scala/benchmark_config.json +++ b/frameworks/Scala/vertx-web-scala/benchmark_config.json @@ -8,6 +8,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "plaintext_url": "/plaintext", + "json_url": "/json", "port": 8080, "approach": "Realistic", "classification": "Micro", diff --git a/frameworks/Scala/vertx-web-scala/src/main/scala/vertx/App.scala b/frameworks/Scala/vertx-web-scala/src/main/scala/vertx/App.scala index 469ba0512d6..0f2991c3b47 100644 --- a/frameworks/Scala/vertx-web-scala/src/main/scala/vertx/App.scala +++ b/frameworks/Scala/vertx-web-scala/src/main/scala/vertx/App.scala @@ -26,7 +26,7 @@ import scala.util.{Failure, Sorting, Success, Try} case class Header(name: CharSequence, value: String) class App extends ScalaVerticle { - + import App._ private val HELLO_WORLD = "Hello, world!" private val HELLO_WORLD_BUFFER = Buffer.buffer(HELLO_WORLD, "UTF-8") private val SERVER = "vert.x" @@ -116,8 +116,7 @@ class App extends ScalaVerticle { .end(World(row.getInteger(0), row.getInteger(1)).encode()) } } else { - App.logger.error("Failed to handle request", ar.cause()) - request.response.setStatusCode(500).end(ar.cause.getMessage) + sendError(request, ar.cause, "Failed to handle Db request") } } ) @@ -136,7 +135,7 @@ class App extends ScalaVerticle { if (!failed) { if (ar.failed) { failed = true - request.response.setStatusCode(500).end(ar.cause.getMessage) + sendError(request, ar.cause, "Failed to handle Queries request") return } // we need a final reference @@ -155,11 +154,6 @@ class App extends ScalaVerticle { } private def handleUpdates(request: HttpServerRequest): Unit = { - def sendError(err: Throwable): Unit = { - App.logger.error("", err) - request.response.setStatusCode(500).end(err.getMessage) - } - def handleUpdates(conn: SqlConnection, worlds: Array[World]): Unit = { Sorting.quickSort(worlds) @@ -170,7 +164,7 @@ class App extends ScalaVerticle { batch, (ar: AsyncResult[RowSet[Row]]) => { if (ar.failed) { - sendError(ar.cause) + sendError(request, ar.cause, "handleUpdates: failed to update DB") return } @@ -197,7 +191,7 @@ class App extends ScalaVerticle { if (!failed) { if (ar2.failed) { failed = true - sendError(ar2.cause) + sendError(request, ar2.cause, "handleUpdates: failed to read DB") return } worlds(index) = World(ar2.result.iterator.next.getInteger(0), App.randomWorld()) @@ -206,7 +200,6 @@ class App extends ScalaVerticle { } } ) - i += 1 } } @@ -230,9 +223,7 @@ class App extends ScalaVerticle { responseWithHeaders(request.response, contentTypeHtml) .end(html.fortune(fortunes).body) } else { - val err = ar.cause - App.logger.error("", err) - response.setStatusCode(500).end(err.getMessage) + sendError(request, ar.cause, "handleFortunes failed to update DB") } } ) @@ -241,9 +232,9 @@ class App extends ScalaVerticle { object App { val logger: Logger = Logger[App] - + val defaultConfigPath = "src/main/conf/config.json" def main(args: Array[String]): Unit = { - val config = new JsonObject(Files.readString(new File(args(0)).toPath)) + val config = new JsonObject(Files.readString(new File(if(args.length < 1) defaultConfigPath else args(0)).toPath)) val vertx = Vertx.vertx(VertxOptions().setPreferNativeTransport(true)) printConfig(vertx) @@ -299,4 +290,9 @@ object App { logger.info("Event Loop Size: {}", JVertxOptions.DEFAULT_EVENT_LOOP_POOL_SIZE) logger.info("Native transport: {}", vertx.isNativeTransportEnabled) } + + def sendError(request: HttpServerRequest, err: Throwable, msg: String = ""): Unit = { + App.logger.error(msg, err) + request.response.setStatusCode(500).end(err.getMessage) + } } From dbaaefa53c929c51cd571cd923c49c2b47213968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Fri, 2 Aug 2024 17:59:44 +0200 Subject: [PATCH 0737/1766] Cleanup and upgrade of the Spring implementations to Spring Boot 3.3 (#9167) * Upgrade spring test to Spring Boot 3.3.1 This commit also introduces several refinements: - Upgrade to Java 21 with Liberica JRE - Make Message a top level class - Properly exclude autoconfigurations based on profiles - Use Spring Boot 3.3 executable JAR unpack feature - Remove java options enabled by default - Keep debug symbol in JVM bytecode for parameter name resolution * Upgrade spring-webflux test to Spring Boot 3.3.1 This commit also introduces several refinements - Reactivate the test - Remove unmaintained variants to keep only r2dbc and mongo - Upgrade to Spring Boot 3.3.1 - Upgrade to Java 21 with Liberica JRE - Dependency cleanup - Various related updates - Add JSON and textplain endpoints - Properly exclude autoconfigurations based on profiles - Use Spring Boot 3.3 executable JAR unpack feature - Add -Dreactor.netty.http.server.lastFlushWhenNoRead=true property - Keep debug symbol in JVM bytecode for parameter name resolution --- frameworks/Java/spring-webflux/README.md | 9 -- .../Java/spring-webflux/benchmark_config.json | 67 +------------ frameworks/Java/spring-webflux/config.toml | 45 --------- frameworks/Java/spring-webflux/pom.xml | 50 ++-------- .../spring-webflux-jdbc.dockerfile | 13 --- .../spring-webflux-mongo.dockerfile | 9 +- .../spring-webflux-pgclient.dockerfile | 13 --- .../spring-webflux-rxjdbc.dockerfile | 13 --- .../spring-webflux/spring-webflux.dockerfile | 8 +- .../src/main/java/benchmark/App.java | 39 +------- .../src/main/java/benchmark/DateHandler.java | 19 ---- .../src/main/java/benchmark/PgClients.java | 19 ---- .../src/main/java/benchmark/ServerFilter.java | 21 ++++- .../java/benchmark/config/JdbcConfig.java | 22 ----- .../java/benchmark/config/PgClientConfig.java | 94 ------------------- .../java/benchmark/config/R2dbcConfig.java | 63 ------------- .../benchmark/config/ReactiveMongoConfig.java | 54 ----------- .../java/benchmark/config/RxJdbcConfig.java | 25 ----- .../main/java/benchmark/model/Message.java | 15 +++ .../repository/MongoDbRepository.java | 17 ++-- .../repository/PgClientDbRepository.java | 79 ---------------- .../repository/R2dbcDbRepository.java | 4 +- .../repository/RxJdbcDbRepository.java | 60 ------------ .../java/benchmark/web/WebfluxHandler.java | 23 +++-- .../java/benchmark/web/WebfluxRouter.java | 32 ++----- .../src/main/resources/application.yml | 63 ++----------- frameworks/Java/spring/pom.xml | 7 +- frameworks/Java/spring/spring-jpa.dockerfile | 10 +- .../Java/spring/spring-mongo.dockerfile | 10 +- frameworks/Java/spring/spring.dockerfile | 10 +- .../Java/spring/src/main/java/hello/App.java | 2 +- .../hello/controller/HelloController.java | 15 +-- .../src/main/java/hello/model/Message.java | 15 +++ .../spring/src/main/resources/application.yml | 17 +++- 34 files changed, 148 insertions(+), 814 deletions(-) delete mode 100644 frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile delete mode 100644 frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile delete mode 100644 frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile mode change 100755 => 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/App.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/DateHandler.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/PgClients.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java create mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/repository/PgClientDbRepository.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/repository/RxJdbcDbRepository.java create mode 100644 frameworks/Java/spring/src/main/java/hello/model/Message.java diff --git a/frameworks/Java/spring-webflux/README.md b/frameworks/Java/spring-webflux/README.md index 91e18bc9ceb..74297391137 100755 --- a/frameworks/Java/spring-webflux/README.md +++ b/frameworks/Java/spring-webflux/README.md @@ -37,15 +37,6 @@ For mongoDB access, spring-data-mongodb with reactive support is used. See [Mong * [Template rendering test source](src/main/java/benchmark/web/WebfluxRouter.java) -## Versions - -* [Java OpenJDK 10](http://openjdk.java.net/) -* [Spring boot 2.1.0.RELEASE](https://spring.io/projects/spring-boot) -* [Spring data mongodb 2.1.0.RELEASE](https://projects.spring.io/spring-data-mongodb/) -* [reactive-pg-client 0.10.6](https://github.com/reactiverse/reactive-pg-client) -* [rxjava2-jdbc 0.2.0](https://github.com/davidmoten/rxjava2-jdbc) -* [r2dbc-postgresql 1.0.0.BUILD-SNAPSHOT](https://github.com/r2dbc/r2dbc-postgresql) - ## Test URLs ### Plaintext Test diff --git a/frameworks/Java/spring-webflux/benchmark_config.json b/frameworks/Java/spring-webflux/benchmark_config.json index 396e9e22a1c..d3d0746d448 100644 --- a/frameworks/Java/spring-webflux/benchmark_config.json +++ b/frameworks/Java/spring-webflux/benchmark_config.json @@ -2,9 +2,11 @@ "framework": "spring-webflux", "tests": [{ "default": { + "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", @@ -23,9 +25,11 @@ "versus": "spring" }, "mongo": { + "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -41,69 +45,6 @@ "display_name": "spring-webflux-mongo", "notes": "", "versus": "spring" - }, - "pgclient": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "spring", - "language": "Java", - "flavor": "None", - "orm": "Micro", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "spring-webflux-pgclient", - "notes": "", - "versus": "spring" - }, - "rxjdbc": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "spring", - "language": "Java", - "flavor": "None", - "orm": "Micro", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "spring-webflux-rxjdbc", - "notes": "", - "versus": "spring" - }, - "jdbc": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "spring", - "language": "Java", - "flavor": "None", - "orm": "Micro", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "spring-webflux-jdbc", - "notes": "", - "versus": "spring" } }] } diff --git a/frameworks/Java/spring-webflux/config.toml b/frameworks/Java/spring-webflux/config.toml index 0cf76705159..806591a8384 100644 --- a/frameworks/Java/spring-webflux/config.toml +++ b/frameworks/Java/spring-webflux/config.toml @@ -16,36 +16,6 @@ platform = "Netty" webserver = "None" versus = "spring" -[pgclient] -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 = "Micro" -platform = "Netty" -webserver = "None" -versus = "spring" - -[jdbc] -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 = "Micro" -platform = "Netty" -webserver = "None" -versus = "spring" - [mongo] urls.db = "/db" urls.query = "/queries?queries=" @@ -59,18 +29,3 @@ orm = "Full" platform = "Netty" webserver = "None" versus = "spring" - -[rxjdbc] -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 = "Micro" -platform = "Netty" -webserver = "None" -versus = "spring" diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index bec59f53b95..4dd5b09698c 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -8,19 +8,18 @@ benchmark spring-webflux-benchmark - 1.1-SNAPSHOT + 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 - 17 + 21 + 21 UTF-8 - 0.11.4 - 0.2.14 @@ -30,7 +29,11 @@ org.springframework.boot - spring-boot-starter-jdbc + spring-boot-starter-data-r2dbc + + + org.postgresql + r2dbc-postgresql org.springframework.boot @@ -40,38 +43,6 @@ org.springframework.boot spring-boot-starter-data-mongodb-reactive - - org.postgresql - postgresql - - - io.reactiverse - reactive-pg-client - ${pgclient.version} - - - com.github.davidmoten - rxjava2-jdbc - ${rxjava2-jdbc.version} - - - - org.postgresql - r2dbc-postgresql - - - io.r2dbc - r2dbc-pool - - - org.springframework.data - spring-data-r2dbc - - - org.springframework.boot - spring-boot-configuration-processor - true - @@ -84,9 +55,6 @@ org.apache.maven.plugins maven-compiler-plugin - - false - diff --git a/frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile deleted file mode 100644 index 7c1daea95f3..00000000000 --- a/frameworks/Java/spring-webflux/spring-webflux-jdbc.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven -WORKDIR /spring -COPY src src -COPY pom.xml pom.xml -RUN mvn package -q - -FROM eclipse-temurin:21.0.3_9-jre-jammy -WORKDIR /spring -COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=jdbc,postgres"] diff --git a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile index d26a7bda983..41eedefa4c6 100644 --- a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile @@ -1,13 +1,16 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven +FROM maven:3.9.5-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM eclipse-temurin:21.0.3_9-jre-jammy +FROM bellsoft/liberica-openjre-debian:21 WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar +# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html +RUN java -Djarmode=tools -jar app.jar extract + EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=mongo"] +CMD ["java", "-Dlogging.level.root=OFF", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=mongo"] \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile deleted file mode 100644 index 2bf38ec11e0..00000000000 --- a/frameworks/Java/spring-webflux/spring-webflux-pgclient.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven -WORKDIR /spring -COPY src src -COPY pom.xml pom.xml -RUN mvn package -q - -FROM eclipse-temurin:21.0.3_9-jre-jammy -WORKDIR /spring -COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=pgclient,postgres"] diff --git a/frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile deleted file mode 100644 index 0e1edfb74a9..00000000000 --- a/frameworks/Java/spring-webflux/spring-webflux-rxjdbc.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven -WORKDIR /spring -COPY src src -COPY pom.xml pom.xml -RUN mvn package -q - -FROM eclipse-temurin:21.0.3_9-jre-jammy -WORKDIR /spring -COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=rxjdbc,postgres"] diff --git a/frameworks/Java/spring-webflux/spring-webflux.dockerfile b/frameworks/Java/spring-webflux/spring-webflux.dockerfile index 504fb71cfae..6ff2ed4e537 100644 --- a/frameworks/Java/spring-webflux/spring-webflux.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux.dockerfile @@ -1,13 +1,15 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven +FROM maven:3.9.5-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM eclipse-temurin:21.0.3_9-jre-jammy +FROM bellsoft/liberica-openjre-debian:21 WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar +# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html +RUN java -Djarmode=tools -jar app.jar extract EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=r2dbc,postgres"] +CMD ["java", "-Dlogging.level.root=OFF", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=r2dbc"] diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java old mode 100755 new mode 100644 index 9fa3f318361..37ff0a80ff0 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java @@ -1,52 +1,15 @@ package benchmark; -import java.util.concurrent.Executors; - -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.web.reactive.result.view.MustacheViewResolver; -import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.web.reactive.config.EnableWebFlux; -import org.springframework.web.reactive.config.ViewResolverRegistry; -import org.springframework.web.reactive.config.WebFluxConfigurer; - -import reactor.core.scheduler.Scheduler; -import reactor.core.scheduler.Schedulers; @SpringBootApplication -@EnableWebFlux @EnableScheduling -@EnableConfigurationProperties -public class App implements WebFluxConfigurer { - - @Autowired - private MustacheViewResolver mustacheViewResolver; +public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } - @Bean - ServerFilter serverFilter() { - return new ServerFilter(); - } - - @Bean - DateHandler dateHandler() { - return new DateHandler(); - } - - @Bean - Scheduler ioScheduler() { - return Schedulers.fromExecutor(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2)); - } - - @Override - public void configureViewResolvers(ViewResolverRegistry registry) { - registry.viewResolver(mustacheViewResolver); - } - } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/DateHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/DateHandler.java deleted file mode 100644 index fdaab4a2209..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/DateHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -package benchmark; - -import org.springframework.scheduling.annotation.Scheduled; - -import java.util.Date; - -public class DateHandler { - - private Date date = new Date(); - - @Scheduled(fixedRate = 1000) - public void update() { - this.date = new Date(); - } - - public Date getDate() { - return date; - } -} diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/PgClients.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/PgClients.java deleted file mode 100644 index 902478447c6..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/PgClients.java +++ /dev/null @@ -1,19 +0,0 @@ -package benchmark; - -import io.reactiverse.pgclient.PgClient; - -import java.util.Collection; -import java.util.Iterator; -import java.util.stream.Stream; - -public class PgClients { - private final Iterator iterator; - - public PgClients(Collection clients) { - iterator = Stream.generate(() -> clients).flatMap(Collection::stream).iterator(); - } - - public synchronized PgClient getOne() { - return iterator.next(); - } -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/ServerFilter.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/ServerFilter.java index 40cc32ff9a7..685ac39e6ad 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/ServerFilter.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/ServerFilter.java @@ -1,20 +1,35 @@ -package benchmark; +package benchmark.web; import io.netty.handler.codec.http.HttpHeaderNames; import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; +@Component public class ServerFilter implements WebFilter { + private static final String SERVER_NAME = "spring-webflux"; + private String date; + + public ServerFilter() { + updateDate(); + } + + @Scheduled(fixedRate = 1000) + public void updateDate() { + this.date = java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(java.time.ZonedDateTime.now()); + } + @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { HttpHeaders headers = exchange.getResponse().getHeaders(); headers.add(HttpHeaderNames.SERVER.toString(), SERVER_NAME); - headers.add(HttpHeaderNames.DATE.toString(), java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(java.time.ZonedDateTime.now())); + headers.add(HttpHeaderNames.DATE.toString(), this.date); return chain.filter(exchange); } -} +} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java deleted file mode 100644 index d99729490a4..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/JdbcConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package benchmark.config; - -import com.zaxxer.hikari.HikariDataSource; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -import javax.sql.DataSource; - -@Configuration -@Profile("jdbc") -public class JdbcConfig { - - @Bean - DataSource datasource(DataSourceProperties dataSourceProperties) { - HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build(); - dataSource.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() * 2); - - return dataSource; - } -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java deleted file mode 100644 index 9ebf6db60c9..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/PgClientConfig.java +++ /dev/null @@ -1,94 +0,0 @@ -package benchmark.config; - -import benchmark.PgClients; -import io.reactiverse.pgclient.PgClient; -import io.reactiverse.pgclient.PgPool; -import io.reactiverse.pgclient.PgPoolOptions; -import io.vertx.core.Vertx; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -import java.util.ArrayList; -import java.util.List; - -@Configuration -@Profile("pgclient") -@ConfigurationProperties(prefix = "database") -public class PgClientConfig { - private String name; - private String host; - private int port; - private String username; - private String password; - - @Bean - Vertx vertx() { - return Vertx.vertx(); - } - - @Bean - PgClients pgClients(Vertx vertx) { - List clients = new ArrayList<>(); - - for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++) { - clients.add(pgClient(vertx)); - } - - return new PgClients(clients); - } - - - public PgPool pgClient(Vertx vertx) { - PgPoolOptions options = new PgPoolOptions(); - options.setDatabase(name); - options.setHost(host); - options.setPort(port); - options.setUser(username); - options.setPassword(password); - options.setCachePreparedStatements(true); - options.setMaxSize(1); - return PgClient.pool(vertx, options); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java deleted file mode 100644 index 5a0de452252..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/R2dbcConfig.java +++ /dev/null @@ -1,63 +0,0 @@ -package benchmark.config; - - -import io.r2dbc.spi.ConnectionFactories; -import io.r2dbc.spi.ConnectionFactory; - -import io.r2dbc.spi.ConnectionFactoryOptions; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.r2dbc.core.DatabaseClient; - -import static io.r2dbc.spi.ConnectionFactoryOptions.*; - -@Configuration -@Profile("r2dbc") -@ConfigurationProperties(prefix = "database") -public class R2dbcConfig { - private String name; - private String host; - private int port; - private String username; - private String password; - - public void setName(String name) { - this.name = name; - } - - public void setHost(String host) { - this.host = host; - } - - public void setPort(int port) { - this.port = port; - } - - public void setUsername(String username) { - this.username = username; - } - - public void setPassword(String password) { - this.password = password; - } - - @Bean - ConnectionFactory connectionFactory() { - return ConnectionFactories.get(ConnectionFactoryOptions.builder() - .option(DRIVER,"pool") - .option(PROTOCOL,"postgresql") - .option(HOST, host) - .option(PORT, port) - .option(USER, username) - .option(PASSWORD, password) - .option(DATABASE, name) - .build()); - } - - @Bean - DatabaseClient databaseClient(ConnectionFactory connectionFactory) { - return DatabaseClient.create(connectionFactory); - } -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java deleted file mode 100644 index e12178be400..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/ReactiveMongoConfig.java +++ /dev/null @@ -1,54 +0,0 @@ -package benchmark.config; - -import com.mongodb.reactivestreams.client.MongoClient; -import com.mongodb.reactivestreams.client.MongoClients; -import org.slf4j.LoggerFactory; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration; -import org.springframework.data.mongodb.core.ReactiveMongoTemplate; -import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; - -@Configuration -@EnableReactiveMongoRepositories -@Profile("mongo") -@ConfigurationProperties(prefix = "database") -public class ReactiveMongoConfig extends AbstractReactiveMongoConfiguration { - private String url; - private String name; - - @Override - @Bean - public MongoClient reactiveMongoClient() { - LoggerFactory.getLogger(getClass()).info("Connecting to mongo url: {}/{}", url, name); - return MongoClients.create(url); - } - - @Override - protected String getDatabaseName() { - return name; - } - - @Bean - ReactiveMongoTemplate reactiveMongoTemplate() { - return new ReactiveMongoTemplate(reactiveMongoClient(), getDatabaseName()); - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java deleted file mode 100644 index f4f5916252d..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/config/RxJdbcConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package benchmark.config; - -import org.davidmoten.rx.jdbc.ConnectionProvider; -import org.davidmoten.rx.jdbc.Database; -import org.davidmoten.rx.jdbc.pool.NonBlockingConnectionPool; -import org.davidmoten.rx.jdbc.pool.Pools; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -@Configuration -@Profile("rxjdbc") -public class RxJdbcConfig { - @Bean - Database database(DataSourceProperties dsProps) { - NonBlockingConnectionPool pool = - Pools.nonBlocking() - .maxPoolSize(Runtime.getRuntime().availableProcessors() * 2) - .connectionProvider(ConnectionProvider.from(dsProps.getUrl(), dsProps.getUsername(), dsProps.getPassword())) - .build(); - - return Database.from(pool); - } -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java new file mode 100644 index 00000000000..8a94c8d3ed1 --- /dev/null +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java @@ -0,0 +1,15 @@ +package benchmark.model; + +public class Message { + + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + +} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java index 7e6b51ff39a..df777dd2d8e 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java @@ -5,7 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Profile; -import org.springframework.data.mongodb.core.ReactiveMongoTemplate; +import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -18,22 +18,21 @@ @Component @Profile("mongo") public class MongoDbRepository implements DbRepository { - private final Logger log = LoggerFactory.getLogger(getClass()); - private final ReactiveMongoTemplate mongoTemplate; - public MongoDbRepository(ReactiveMongoTemplate mongoTemplate) { - this.mongoTemplate = mongoTemplate; + private final ReactiveMongoOperations operations; + + public MongoDbRepository(ReactiveMongoOperations operations) { + this.operations = operations; } @Override public Mono getWorld(int id) { - log.debug("getWorld({})", id); - return mongoTemplate.findById(id, World.class); + return operations.findById(id, World.class); } @Override public Mono findAndUpdateWorld(int id, int randomNumber) { - return mongoTemplate.findAndModify( + return operations.findAndModify( query(where("id").is(id)), update("randomNumber", randomNumber), options().returnNew(true), @@ -42,6 +41,6 @@ public Mono findAndUpdateWorld(int id, int randomNumber) { @Override public Flux fortunes() { - return mongoTemplate.findAll(Fortune.class); + return operations.findAll(Fortune.class); } } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/PgClientDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/PgClientDbRepository.java deleted file mode 100644 index 50dc6286ea1..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/PgClientDbRepository.java +++ /dev/null @@ -1,79 +0,0 @@ -package benchmark.repository; - -import benchmark.PgClients; -import benchmark.model.Fortune; -import benchmark.model.World; -import io.reactiverse.pgclient.PgIterator; -import io.reactiverse.pgclient.Row; -import io.reactiverse.pgclient.Tuple; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@Component -@Profile("pgclient") -public class PgClientDbRepository implements DbRepository { - private final Logger log = LoggerFactory.getLogger(getClass()); - private final PgClients pgClients; - - public PgClientDbRepository(PgClients pgClients) { - this.pgClients = pgClients; - } - - @Override - public Mono getWorld(int id) { - return Mono.create(sink -> - pgClients.getOne().preparedQuery("SELECT * FROM world WHERE id = $1", Tuple.of(id), ar -> { - if (ar.failed()) { - sink.error(ar.cause()); - } else { - - final Row row = ar.result().iterator().next(); - - World world = new World(row.getInteger(0), row.getInteger(1)); - sink.success(world); - } - })); - } - - private Mono updateWorld(World world) { - return Mono.create(sink -> { - pgClients.getOne().preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2", Tuple.of(world.randomnumber, world.id), ar -> { - if (ar.failed()) { - sink.error(ar.cause()); - } else { - sink.success(world); - } - }); - }); - } - - @Override - public Mono findAndUpdateWorld(int id, int randomNumber) { - return getWorld(id).flatMap(world -> { - world.randomnumber = randomNumber; - return updateWorld(world); - }); - } - - @Override - public Flux fortunes() { - return Flux.create(sink -> - pgClients.getOne().preparedQuery("SELECT * FROM fortune", ar -> { - if (ar.failed()) { - sink.error(ar.cause()); - return; - } - - PgIterator resultSet = ar.result().iterator(); - while (resultSet.hasNext()) { - Tuple row = resultSet.next(); - sink.next(new Fortune(row.getInteger(0), row.getString(1))); - } - sink.complete(); - })); - } -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java index e5915fc05d7..c7cfb89dea4 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java @@ -22,7 +22,7 @@ public Mono getWorld(int id) { return databaseClient .sql("SELECT id, randomnumber FROM world WHERE id = $1") .bind("$1", id) - .map((row, rowMetaData) -> new World(row.get("id", Integer.class), row.get("randomnumber", Integer.class))) + .mapProperties(World.class) .first(); } @@ -48,7 +48,7 @@ public Mono findAndUpdateWorld(int id, int randomNumber) { public Flux fortunes() { return databaseClient .sql("SELECT id, message FROM fortune") - .map((row, rowMetaData) -> new Fortune(row.get("id", Integer.class), row.get("message", String.class))) + .mapProperties(Fortune.class) .all(); } } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/RxJdbcDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/RxJdbcDbRepository.java deleted file mode 100644 index 1d07720f391..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/RxJdbcDbRepository.java +++ /dev/null @@ -1,60 +0,0 @@ -package benchmark.repository; - -import benchmark.model.Fortune; -import benchmark.model.World; -import io.reactivex.Flowable; -import org.davidmoten.rx.jdbc.Database; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@Component -@Profile("rxjdbc") -public class RxJdbcDbRepository implements DbRepository { - private final Database db; - - public RxJdbcDbRepository(Database db) { - this.db = db; - } - - @Override - public Mono getWorld(int id) { - String sql = "SELECT * FROM world WHERE id = ?"; - - Flowable worldFlowable = db.select(sql) - .parameters(id) - .get(rs -> { - World world = new World(rs.getInt("id"), rs.getInt("randomnumber")); - return world; - }); - - return Mono.from(worldFlowable); - } - - public Mono updateWorld(World world) { - String sql = "UPDATE world SET randomnumber = ? WHERE id = ?"; - - Flowable worldFlowable = db.update(sql) - .parameters(world.randomnumber, world.id) - .counts().map(cnt -> world); - return Mono.from(worldFlowable); - } - - public Mono findAndUpdateWorld(int id, int randomNumber) { - return getWorld(id).flatMap(world -> { - world.randomnumber = randomNumber; - return updateWorld(world); - }); - } - - @Override - public Flux fortunes() { - String sql = "SELECT * FROM fortune"; - - Flowable fortuneFlowable = db.select(sql) - .get(rs -> new Fortune(rs.getInt("id"), rs.getString("message"))); - - return Flux.from(fortuneFlowable); - } -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxHandler.java index e7fdeafa404..a7516af6636 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxHandler.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxHandler.java @@ -1,8 +1,16 @@ package benchmark.web; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; + import benchmark.model.Fortune; +import benchmark.model.Message; import benchmark.model.World; import benchmark.repository.DbRepository; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.MediaType; @@ -10,16 +18,11 @@ import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - import static java.util.Comparator.comparing; @Component public class WebfluxHandler { + private final DbRepository dbRepository; public WebfluxHandler(DbRepository dbRepository) { @@ -29,13 +32,13 @@ public WebfluxHandler(DbRepository dbRepository) { public Mono plaintext(ServerRequest request) { return ServerResponse.ok() .contentType(MediaType.TEXT_PLAIN) - .body(Mono.just("Hello, World!"), String.class); + .bodyValue("Hello, World!"); } public Mono json(ServerRequest request) { return ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) - .body(Mono.just(Map.of("message", "Hello, World!")), Map.class); + .bodyValue(new Message("Hello, World!")); } public Mono db(ServerRequest request) { @@ -76,7 +79,7 @@ private static int parseQueryCount(Optional maybeTextValue) { public Mono updates(ServerRequest request) { int queries = getQueries(request); - + Mono> worlds = Flux.range(0, queries) .flatMap(i -> dbRepository.findAndUpdateWorld(randomWorldNumber(), randomWorldNumber())) .collectList(); @@ -105,4 +108,4 @@ private static int getQueries(ServerRequest request) { private static int randomWorldNumber() { return 1 + ThreadLocalRandom.current().nextInt(10000); } -} +} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java index 7d1ad9c881a..061797738c2 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java @@ -6,32 +6,18 @@ import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; - @Configuration public class WebfluxRouter { @Bean - RouterFunction route(WebfluxHandler handler) { - return RouterFunctions - .route( - GET("/plaintext"), - handler::plaintext) - .andRoute( - GET("/json"), - handler::json) - .andRoute( - GET("/db"), - handler::db) - .andRoute( - GET("/queries"), - handler::queries) - .andRoute( - GET("/updates"), - handler::updates) - .andRoute( - GET("/fortunes"), - handler::fortunes) - ; + public RouterFunction route(WebfluxHandler handler) { + return RouterFunctions.route() + .GET("/plaintext", handler::plaintext) + .GET("/json", handler::json) + .GET("/db", handler::db) + .GET("/queries", handler::queries) + .GET("/updates", handler::updates) + .GET("/fortunes", handler::fortunes) + .build(); } } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/resources/application.yml b/frameworks/Java/spring-webflux/src/main/resources/application.yml index d315f4353ee..af7743831e3 100755 --- a/frameworks/Java/spring-webflux/src/main/resources/application.yml +++ b/frameworks/Java/spring-webflux/src/main/resources/application.yml @@ -1,17 +1,3 @@ -spring: - jpa: - open-in-view: false - ---- -spring: - config: - activate: - on-profile: postgres - datasource: - url: jdbc:postgresql://${database.host}:${database.port}/${database.name} - username: ${database.username} - password: ${database.password} - database: name: hello_world host: tfb-database @@ -19,45 +5,17 @@ database: username: benchmarkdbuser password: benchmarkdbpass ---- -spring: - config: - activate: - on-profile: jdbc - autoconfigure: - exclude: - - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration - - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration - ---- -spring: - config: - activate: - on-profile: pgclient - autoconfigure: - exclude: - - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration - - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration - ---- -spring: - config: - activate: - on-profile: rxjdbc - autoconfigure: - exclude: - - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration - - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration - --- spring: config: activate: on-profile: r2dbc autoconfigure: - exclude: - - org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration - - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + exclude: org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration + r2dbc: + username: ${database.username} + password: ${database.password} + url: r2dbc:postgresql://${database.host}:${database.port}/${database.name} --- spring: @@ -65,10 +23,9 @@ spring: activate: on-profile: mongo autoconfigure: - exclude: - - org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration - - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration -database: - url: mongodb://tfb-database:27017/?waitQueueMultiple=200 - name: hello_world \ No newline at end of file + data: + mongodb: + uri: mongodb://tfb-database:27017/?waitQueueMultiple=200 + database: hello_world diff --git a/frameworks/Java/spring/pom.xml b/frameworks/Java/spring/pom.xml index 4e390ebc4f6..9f131b9a23f 100644 --- a/frameworks/Java/spring/pom.xml +++ b/frameworks/Java/spring/pom.xml @@ -11,11 +11,11 @@ org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 - 17 + 21 @@ -61,9 +61,6 @@ org.apache.maven.plugins maven-compiler-plugin - - false - diff --git a/frameworks/Java/spring/spring-jpa.dockerfile b/frameworks/Java/spring/spring-jpa.dockerfile index 4af1b98a73f..0598e9c1f28 100644 --- a/frameworks/Java/spring/spring-jpa.dockerfile +++ b/frameworks/Java/spring/spring-jpa.dockerfile @@ -1,15 +1,15 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven -RUN mvn -version +FROM maven:3.9.5-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM eclipse-temurin:21.0.3_9-jre-jammy -RUN java -version +FROM bellsoft/liberica-openjre-debian:21 WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar +# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html +RUN java -Djarmode=tools -jar app.jar extract EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=jpa"] +CMD ["java", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app/app.jar", "--spring.profiles.active=jpa"] \ No newline at end of file diff --git a/frameworks/Java/spring/spring-mongo.dockerfile b/frameworks/Java/spring/spring-mongo.dockerfile index 4fa82a28d5d..e700a21cabd 100644 --- a/frameworks/Java/spring/spring-mongo.dockerfile +++ b/frameworks/Java/spring/spring-mongo.dockerfile @@ -1,15 +1,15 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven -RUN mvn -version +FROM maven:3.9.5-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM eclipse-temurin:21.0.3_9-jre-jammy -RUN java -version +FROM bellsoft/liberica-openjre-debian:21 WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar +# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html +RUN java -Djarmode=tools -jar app.jar extract EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=mongo"] +CMD ["java", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app/app.jar", "--spring.profiles.active=mongo"] \ No newline at end of file diff --git a/frameworks/Java/spring/spring.dockerfile b/frameworks/Java/spring/spring.dockerfile index f6f5145477f..0598e9c1f28 100644 --- a/frameworks/Java/spring/spring.dockerfile +++ b/frameworks/Java/spring/spring.dockerfile @@ -1,15 +1,15 @@ -FROM maven:3.9.6-eclipse-temurin-21 as maven -RUN mvn -version +FROM maven:3.9.5-eclipse-temurin-21 as maven WORKDIR /spring COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM eclipse-temurin:21.0.3_9-jre-jammy -RUN java -version +FROM bellsoft/liberica-openjre-debian:21 WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar +# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html +RUN java -Djarmode=tools -jar app.jar extract EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app.jar", "--spring.profiles.active=jdbc"] +CMD ["java", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app/app.jar", "--spring.profiles.active=jpa"] \ No newline at end of file diff --git a/frameworks/Java/spring/src/main/java/hello/App.java b/frameworks/Java/spring/src/main/java/hello/App.java index 0ab1327f8c4..d0c13e06844 100644 --- a/frameworks/Java/spring/src/main/java/hello/App.java +++ b/frameworks/Java/spring/src/main/java/hello/App.java @@ -14,7 +14,7 @@ import com.zaxxer.hikari.HikariDataSource; -@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class}) +@SpringBootApplication public class App { public static void main(String[] args) { diff --git a/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java b/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java index 3c891567942..5c11b82ac66 100644 --- a/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java +++ b/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java @@ -6,6 +6,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; +import hello.model.Message; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; @@ -31,7 +32,7 @@ public HelloController( this.updateWorldService = updateWorldService; } - @GetMapping(value = "/plaintext") + @GetMapping("/plaintext") String plaintext(HttpServletResponse response) { response.setContentType(MediaType.TEXT_PLAIN_VALUE); return "Hello, World!"; @@ -102,16 +103,4 @@ private static int parseQueryCount(String textValue) { } return Math.min(500, Math.max(1, parsedValue)); } - - static class Message { - private final String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - } } diff --git a/frameworks/Java/spring/src/main/java/hello/model/Message.java b/frameworks/Java/spring/src/main/java/hello/model/Message.java new file mode 100644 index 00000000000..4c675c8a162 --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/model/Message.java @@ -0,0 +1,15 @@ +package hello.model; + +public class Message { + + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + +} \ No newline at end of file diff --git a/frameworks/Java/spring/src/main/resources/application.yml b/frameworks/Java/spring/src/main/resources/application.yml index 42c14602858..4796669a8e5 100644 --- a/frameworks/Java/spring/src/main/resources/application.yml +++ b/frameworks/Java/spring/src/main/resources/application.yml @@ -1,10 +1,15 @@ --- spring: - threads: - virtual: - enabled: true jpa: open-in-view: false + config: + activate: + on-profile: jdbc + autoconfigure: + exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration + +--- +spring: config: activate: on-profile: jdbc,jpa @@ -25,6 +30,8 @@ spring: config: activate: on-profile: jpa + autoconfigure: + exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration jpa: database-platform: org.hibernate.dialect.PostgreSQLDialect @@ -33,6 +40,8 @@ spring: config: activate: on-profile: mongo + autoconfigure: + exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration spring.data.mongodb: host: tfb-database @@ -45,4 +54,4 @@ spring: active: jdbc server.server-header: Spring -server.servlet.encoding.force: true \ No newline at end of file +server.servlet.encoding.force: true From 848d6840769d21e4a39eebc7b902e2d05ea04166 Mon Sep 17 00:00:00 2001 From: Andrew McCloskey Date: Fri, 2 Aug 2024 11:59:56 -0400 Subject: [PATCH 0738/1766] initial commit of vertx-web-kotlin-dsljson benchmark (#9172) * initial commit of vertx-web-kotlin-dsljson benchmark * removed dagger. improved query performance. --- .../vertx-web-kotlin-dsljson/.gitattributes | 9 + .../Kotlin/vertx-web-kotlin-dsljson/README.md | 36 ++ .../benchmark_config.json | 47 +++ .../vertx-web-kotlin-dsljson/build.gradle.kts | 86 +++++ .../configuration/scripts/server.sh | 47 +++ .../gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43504 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../Kotlin/vertx-web-kotlin-dsljson/gradlew | 252 ++++++++++++ .../vertx-web-kotlin-dsljson/gradlew.bat | 94 +++++ .../settings.gradle.kts | 1 + .../main/kotlin/com/example/starter/App.kt | 50 +++ .../com/example/starter/BasicVerticle.kt | 56 +++ .../com/example/starter/PostgresVerticle.kt | 88 +++++ .../example/starter/db/AbstractRepository.kt | 7 + .../example/starter/db/FortuneRepository.kt | 23 ++ .../com/example/starter/db/WorldRepository.kt | 84 ++++ .../starter/handlers/AbstractHandler.kt | 57 +++ .../starter/handlers/DefaultHandler.kt | 15 + .../starter/handlers/FortuneHandler.kt | 57 +++ .../starter/handlers/MessageHandler.kt | 15 + .../example/starter/handlers/WorldHandler.kt | 56 +++ .../example/starter/io/BufferOutputStream.kt | 362 ++++++++++++++++++ .../com/example/starter/io/JsonResource.kt | 15 + .../com/example/starter/models/Fortune.kt | 14 + .../com/example/starter/models/Message.kt | 7 + .../com/example/starter/models/World.kt | 14 + .../example/starter/utils/FutureExtensions.kt | 14 + .../example/starter/utils/JsonExtensions.kt | 19 + .../starter/utils/PeriodicDateResolver.kt | 16 + .../example/starter/utils/RowSetExtensions.kt | 14 + .../starter/utils/ThrowableExtensions.kt | 12 + .../main/resources/http-server-options.json | 6 + .../src/main/resources/log4j2.xml | 13 + .../main/resources/pg-connect-options.json | 15 + ...x-web-kotlin-dsljson-postgresql.dockerfile | 37 ++ .../vertx-web-kotlin-dsljson.dockerfile | 37 ++ 37 files changed, 1683 insertions(+) create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/.gitattributes create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle.properties create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.jar create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/BufferOutputStream.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/log4j2.xml create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/.gitattributes b/frameworks/Kotlin/vertx-web-kotlin-dsljson/.gitattributes new file mode 100644 index 00000000000..097f9f98d9e --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md b/frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md new file mode 100644 index 00000000000..b8ae3f33b30 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md @@ -0,0 +1,36 @@ +# Vert.x-Web Kotlin Dsljson Benchmarking Test + +Vert.x-Web in Kotlin with Dsljson serialization + +The code is written as a realistic server implementation: +- Code is organized logically into packages +- Repositories are created for each database entity to handler all operations pertaining to a specific table +- Handlers map to the logical entities which they serve +- JSON serialization is provided via Dsljson + - Doing this effectively required a custom Vert.x Buffer implementation that also extended OutputStream in order to rely on the efficient Vert.x heap memory pool instead of building a novel implementation. + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/query?queries= + +### UPDATE + +http://localhost:8080/update?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json b/frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json new file mode 100644 index 00000000000..445d7e5f319 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json @@ -0,0 +1,47 @@ +{ + "framework": "vertx-web-kotlin-dsljson", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "vertx-web", + "language": "Kotlin", + "flavor": "None", + "orm": "Raw", + "platform": "Vert.x", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "vertx-web-kotlin-dsljson", + "notes": "", + "versus": "vertx-web" + }, + "postgresql": { + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "vertx-web", + "language": "Kotlin", + "flavor": "None", + "orm": "Raw", + "platform": "Vert.x", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "vertx-web-kotlin-dsljson-postgresql", + "notes": "", + "versus": "vertx-web-postgres" + } + } + ] +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts b/frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts new file mode 100644 index 00000000000..5131d1b9ec7 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts @@ -0,0 +1,86 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + kotlin("jvm") version "1.9.22" + kotlin("kapt") version "1.9.22" + application + id("com.github.johnrengelman.shadow") version "7.1.2" +} + +group = "com.example" +version = "1.0.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(21)) + } +} + +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_21 + } + jvmToolchain(21) +} + +val mainClassName = "com.example.starter.App" + +val vertxVersion = "4.5.9" +val nettyVersion = "4.1.112.Final" +val scramVersion = "2.1" +val dslJsonVersion = "2.0.2" +val htmlFlowVersion = "4.6" +val log4jVersion = "2.23.1" + +application { + mainClass = mainClassName +} + +dependencies { + listOfNotNull( + // Kotlin + kotlin("stdlib-jdk8"), + kotlin("reflect"), + + // Vertx + platform("io.vertx:vertx-stack-depchain:$vertxVersion"), + "io.vertx:vertx-core", + "io.vertx:vertx-web", + "io.vertx:vertx-pg-client", + "io.vertx:vertx-lang-kotlin", + "io.vertx:vertx-lang-kotlin-coroutines", + + // Netty + "io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64", + + // Postgres + "com.ongres.scram:client:$scramVersion", + + // dsljson + "com.dslplatform:dsl-json:$dslJsonVersion", + + // HtmlFlow + "com.github.xmlet:htmlflow:$htmlFlowVersion", + + // Logging + "org.apache.logging.log4j:log4j-core:$log4jVersion", + "org.apache.logging.log4j:log4j-api:$log4jVersion", + "org.apache.logging.log4j:log4j-api-kotlin:1.4.0", + "com.lmax:disruptor:4.0.0", + ).map { implementation(it) } + + listOf( + "com.dslplatform:dsl-json:$dslJsonVersion", + "org.apache.logging.log4j:log4j-core:$log4jVersion", + ).map { kapt(it) } +} + +tasks.withType { + archiveClassifier = "fat" + mergeServiceFiles() +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh b/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh new file mode 100644 index 00000000000..80e05662a59 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +NUM_PROCESSORS=$((`grep --count ^processor /proc/cpuinfo`)) + +JVM_OPTS="-server \ + -Xms2G \ + -Xmx2G \ + -XX:+UseParallelGC \ + -XX:InitialCodeCacheSize=512m \ + -XX:ReservedCodeCacheSize=512m \ + -XX:MaxInlineLevel=20 \ + -XX:+AlwaysPreTouch \ + -XX:+UseNUMA \ + -Dvertx.disableMetrics=true \ + -Dvertx.disableH2c=true \ + -Dvertx.disableWebsockets=true \ + -Dvertx.flashPolicyHandler=false \ + -Dvertx.threadChecks=false \ + -Dvertx.disableContextTimings=true \ + -Dvertx.disableTCCL=true \ + -Dvertx.disableHttpHeadersValidation=true \ + -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + -Dtfb.hasDB=false" + +JAR_PATH="./build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar" + +VERTX_ARGS="-instances 1" + +cleanup() { + echo "Caught SIGINT signal. Stopping the Java program..." + if [ ! -z "$JAVA_PID" ]; then + kill -SIGTERM "$JAVA_PID" + wait "$JAVA_PID" + fi + exit 0 +} + +trap cleanup SIGINT + +java $JVM_OPTS -jar $JAR_PATH $VERTX_ARGS & +JAVA_PID=$! + +echo "Server PID: $JAVA_PID" + +wait "$JAVA_PID" diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle.properties b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle.properties new file mode 100644 index 00000000000..f97ebb7d334 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle.properties @@ -0,0 +1 @@ +org.gradle.parallel=true diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2c3521197d7c4586c843d1d3e9090525f1898cde GIT binary patch literal 43504 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 TZiJi*F`$tkWLn) literal 0 HcmV?d00001 diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..09523c0e549 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew new file mode 100644 index 00000000000..f5feea6d6b1 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat new file mode 100644 index 00000000000..9d21a21834d --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +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 + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +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 + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts b/frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts new file mode 100644 index 00000000000..a5d0428ce6f --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "vertx-web-kotlin-dsljson-benchmark" diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt new file mode 100644 index 00000000000..03fb0ca2c04 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt @@ -0,0 +1,50 @@ +package com.example.starter + +import com.example.starter.utils.PeriodicDateResolver +import com.example.starter.utils.block +import io.vertx.core.Vertx +import io.vertx.core.impl.cpu.CpuCoreSensor +import io.vertx.kotlin.core.deploymentOptionsOf +import io.vertx.kotlin.core.vertxOptionsOf +import kotlin.time.Duration.Companion.seconds +import org.apache.logging.log4j.kotlin.Logging + +object App : Logging { + private const val SERVER_NAME = "Vert.x-Web Benchmark" + + @JvmStatic + fun main(args: Array?) { + val numCores = CpuCoreSensor.availableProcessors() + + val vertx = Vertx.vertx( + vertxOptionsOf( + eventLoopPoolSize = numCores, + preferNativeTransport = true, + ) + ) + vertx.exceptionHandler { + logger.error(it) { "Vertx unexpected exception:" } + vertx.close().block(5.seconds) + } + + // Add the SIGINT handler + Runtime.getRuntime().addShutdownHook(Thread { + vertx.close().block(5.seconds) + }) + + // Initialize the periodic date resolver + PeriodicDateResolver.init(vertx) + + // Check the type of test that is being run + val hasDb = System.getProperty("tfb.hasDB")?.toBoolean() ?: false + + vertx.deployVerticle( + { if (hasDb) PostgresVerticle() else BasicVerticle() }, + deploymentOptionsOf( + instances = numCores, + ) + ) + + logger.info("$SERVER_NAME started.") + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt new file mode 100644 index 00000000000..7870a146c78 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt @@ -0,0 +1,56 @@ +package com.example.starter + +import com.example.starter.handlers.DefaultHandler +import com.example.starter.handlers.MessageHandler +import com.example.starter.io.JsonResource +import com.example.starter.utils.isConnectionReset +import io.vertx.core.AbstractVerticle +import io.vertx.core.Promise +import io.vertx.core.http.HttpServerOptions +import io.vertx.ext.web.Router +import org.apache.logging.log4j.kotlin.Logging + +class BasicVerticle : AbstractVerticle() { + override fun start(startPromise: Promise) { + val defaultHandler = DefaultHandler() + val messageHandler = MessageHandler() + + val router = Router.router(vertx) + + router + .get("/plaintext") + .handler(defaultHandler::plaintext) + + router + .get("/json") + .handler(messageHandler::readDefaultMessage) + + val server = vertx + .createHttpServer(HTTP_SERVER_OPTIONS) + .requestHandler(router) + .exceptionHandler { + if (it.isConnectionReset()) return@exceptionHandler + logger.error(it) { "Exception in HttpServer" } + } + + server + .listen() + .onSuccess { + logger.info { "HTTP server started on port 8080" } + startPromise.complete() + } + .onFailure { + logger.error(it.cause) { "Failed to start" } + startPromise.fail(it.cause) + } + } + + companion object : Logging { + private const val HTTP_SERVER_OPTIONS_RESOURCE = "http-server-options.json" + + private val HTTP_SERVER_OPTIONS: HttpServerOptions by lazy { + val json = JsonResource.of(HTTP_SERVER_OPTIONS_RESOURCE) + HttpServerOptions(json) + } + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt new file mode 100644 index 00000000000..43cba217ec0 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt @@ -0,0 +1,88 @@ +package com.example.starter + +import com.example.starter.db.FortuneRepository +import com.example.starter.db.WorldRepository +import com.example.starter.handlers.FortuneHandler +import com.example.starter.handlers.WorldHandler +import com.example.starter.io.JsonResource +import com.example.starter.utils.array +import com.example.starter.utils.isConnectionReset +import io.vertx.core.AbstractVerticle +import io.vertx.core.Future +import io.vertx.core.Promise +import io.vertx.core.http.HttpServerOptions +import io.vertx.ext.web.Router +import io.vertx.pgclient.PgConnectOptions +import io.vertx.pgclient.PgConnection +import org.apache.logging.log4j.kotlin.Logging + +class PostgresVerticle : AbstractVerticle() { + override fun start(startPromise: Promise) { + Future.all( + PgConnection.connect(vertx, PG_CONNECT_OPTIONS), + PgConnection.connect(vertx, PG_CONNECT_OPTIONS), + ) + .onSuccess { cf -> + val pool = cf.array() + + val fortuneHandler = FortuneHandler(FortuneRepository(pool)) + val worldHandler = WorldHandler(WorldRepository(pool)) + + val router = Router.router(vertx) + + router + .get("/fortunes") + .handler(fortuneHandler::templateFortunes) + + router + .get("/db") + .handler(worldHandler::readRandomWorld) + + router + .get("/queries") + .handler(worldHandler::readRandomWorlds) + + router + .get("/updates") + .handler(worldHandler::updateRandomWorlds) + + val server = vertx + .createHttpServer(HTTP_SERVER_OPTIONS) + .requestHandler(router) + .exceptionHandler { + if (it.isConnectionReset()) return@exceptionHandler + logger.error(it) { "Exception in HttpServer" } + } + + server + .listen() + .onSuccess { + logger.info { "HTTP server started on port 8080" } + startPromise.complete() + } + .onFailure { + logger.error(it) { "Failed to start" } + startPromise.fail(it) + } + } + .onFailure { + logger.error(it) { "Failed to start" } + startPromise.fail(it) + } + } + + companion object : Logging { + private const val HTTP_SERVER_OPTIONS_RESOURCE = "http-server-options.json" + private const val PG_CONNECT_OPTIONS_RESOURCE = "pg-connect-options.json" + + private val HTTP_SERVER_OPTIONS: HttpServerOptions by lazy { + val json = JsonResource.of(HTTP_SERVER_OPTIONS_RESOURCE) + HttpServerOptions(json) + } + + private val PG_CONNECT_OPTIONS: PgConnectOptions by lazy { + val json = JsonResource.of(PG_CONNECT_OPTIONS_RESOURCE) + PgConnectOptions(json) + } + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt new file mode 100644 index 00000000000..df665df0769 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt @@ -0,0 +1,7 @@ +package com.example.starter.db + +import io.vertx.pgclient.PgConnection + +abstract class AbstractRepository( + protected val pool: Array +) \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt new file mode 100644 index 00000000000..3bb95576a4d --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt @@ -0,0 +1,23 @@ +package com.example.starter.db + +import com.example.starter.models.Fortune +import com.example.starter.utils.mapToArray + +import io.vertx.core.Future +import io.vertx.pgclient.PgConnection +import io.vertx.sqlclient.Row + +class FortuneRepository(pool: Array) : AbstractRepository(pool) { + private val selectFortuneQuery = this.pool[0].preparedQuery(SELECT_FORTUNE_SQL) + + fun selectFortunes(): Future> = selectFortuneQuery + .execute() + .map { it.mapToArray(FortuneRepository::map) } + + companion object { + private const val SELECT_FORTUNE_SQL = "SELECT id, message FROM fortune" + + @Suppress("NOTHING_TO_INLINE") + private inline fun map(row: Row): Fortune = Fortune(row.getInteger(0), row.getString(1)) + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt new file mode 100644 index 00000000000..734b486547a --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt @@ -0,0 +1,84 @@ +package com.example.starter.db + +import com.example.starter.models.World +import io.vertx.core.Future +import io.vertx.core.Promise +import io.vertx.pgclient.PgConnection +import io.vertx.sqlclient.PreparedQuery +import io.vertx.sqlclient.Row +import io.vertx.sqlclient.RowSet +import io.vertx.sqlclient.Tuple +import io.vertx.sqlclient.impl.ArrayTuple +import io.vertx.sqlclient.impl.SqlClientInternal +import java.util.concurrent.ThreadLocalRandom +import java.util.concurrent.atomic.AtomicInteger + +@Suppress("NOTHING_TO_INLINE") +class WorldRepository(pool: Array) : AbstractRepository(pool) { + private val selectWorldQuery = this.pool[0].preparedQuery(SELECT_WORLD_SQL) + private val updateWorldQueries = generateQueries(this.pool[1]) + + fun selectRandomWorld(): Future = selectWorldQuery + .execute(Tuple.of(randomWorld())) + .map { map(it.iterator().next()) } + + fun selectRandomWorlds(numWorlds: Int): Future> { + val promise = Promise.promise>() + val arr = arrayOfNulls(numWorlds) + val count = AtomicInteger(0) + (this.pool[0] as SqlClientInternal).group { c -> + repeat(numWorlds) { + c.preparedQuery(SELECT_WORLD_SQL).execute(Tuple.of(randomWorld())) { ar -> + val index = count.getAndIncrement() + arr[index] = map(ar.result().iterator().next()) + if (index == numWorlds - 1) { + promise.complete(arr as Array) + } + } + } + } + return promise.future() + } + + fun updateRandomWorlds(numWorlds: Int): Future> = selectRandomWorlds(numWorlds) + .flatMap { worlds -> + val params = ArrayTuple(worlds.size * 3) + worlds.forEach { + it.randomNumber = randomWorld() + params.addValue(it.id) + params.addValue(it.randomNumber) + } + worlds.forEach { + params.addValue(it.id) + } + updateWorldQueries[numWorlds - 1].execute(params).map { worlds } + } + + companion object { + private const val SELECT_WORLD_SQL = "SELECT id, randomnumber FROM world WHERE id = $1" + + private inline fun randomWorld(): Int = 1 + ThreadLocalRandom.current().nextInt(10000) + private inline fun map(row: Row): World = World(row.getInteger(0), row.getInteger(1)) + + private fun generateQueries(conn: PgConnection): Array>> { + val arr = arrayOfNulls>>(500) + for (num in 1..500) { + var paramIndex = 1 + val sb = StringBuilder() + sb.append("UPDATE world SET randomnumber = CASE id ") + for (i in 1..num) { + sb.append("WHEN \$$paramIndex THEN \$${paramIndex + 1} ") + paramIndex += 2 + } + sb.append("ELSE randomnumber END WHERE id IN (") + for (i in 1..num) { + sb.append("\$$paramIndex,") + paramIndex += 1 + } + sb[sb.length - 1] = ')' + arr[num - 1] = conn.preparedQuery(sb.toString()) + } + return arr as Array>> + } + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt new file mode 100644 index 00000000000..cb29d630167 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt @@ -0,0 +1,57 @@ +package com.example.starter.handlers + +import com.example.starter.utils.PeriodicDateResolver +import io.vertx.core.AsyncResult +import io.vertx.core.Handler +import io.vertx.core.MultiMap +import io.vertx.core.http.HttpHeaders +import io.vertx.core.http.HttpServerResponse +import io.vertx.ext.web.RoutingContext + +@Suppress("NOTHING_TO_INLINE") +abstract class AbstractHandler { + protected companion object { + val NULL_HANDLER: Handler>? = null + + const val SOMETHING_WENT_WRONG = "Something went wrong" + + // Headers + val SERVER: CharSequence = HttpHeaders.createOptimized("Vert.x-Web") + val APPLICATION_JSON: CharSequence = HttpHeaders.createOptimized("application/json") + val TEXT_PLAIN: CharSequence = HttpHeaders.createOptimized("text/plain") + val TEXT_HTML: CharSequence = HttpHeaders.createOptimized("text/html; charset=utf-8") + + inline fun MultiMap.common(): MultiMap = this + .add(HttpHeaders.SERVER, SERVER) + .add(HttpHeaders.DATE, PeriodicDateResolver.current) + + inline fun RoutingContext.json(): HttpServerResponse { + val response = this.response() + val headers = response.headers() + headers + .common() + .add(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON) + return response + } + + inline fun RoutingContext.text(): HttpServerResponse { + val response = this.response() + val headers = response.headers() + headers + .common() + .add(HttpHeaders.CONTENT_TYPE, TEXT_PLAIN) + return response + } + + inline fun RoutingContext.html(): HttpServerResponse { + val response = this.response() + val headers = response.headers() + headers + .common() + .add(HttpHeaders.CONTENT_TYPE, TEXT_HTML) + return response + } + + inline fun RoutingContext.error(): Unit = this.text().end(SOMETHING_WENT_WRONG, NULL_HANDLER) + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt new file mode 100644 index 00000000000..8311474177e --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt @@ -0,0 +1,15 @@ +package com.example.starter.handlers + +import io.vertx.core.buffer.Buffer +import io.vertx.ext.web.RoutingContext + +class DefaultHandler : AbstractHandler() { + fun plaintext(ctx: RoutingContext) { + ctx.text().end(MESSAGE_BUFFER, NULL_HANDLER) + } + + companion object { + private const val MESSAGE = "Hello, World!" + private val MESSAGE_BUFFER = Buffer.buffer(MESSAGE, "UTF-8") + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt new file mode 100644 index 00000000000..5e60c04cfeb --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt @@ -0,0 +1,57 @@ +package com.example.starter.handlers + +import com.example.starter.db.FortuneRepository +import com.example.starter.models.Fortune +import htmlflow.HtmlFlow +import htmlflow.HtmlView +import io.vertx.ext.web.RoutingContext +import org.apache.logging.log4j.kotlin.Logging + +class FortuneHandler(private val repository: FortuneRepository) : AbstractHandler() { + fun templateFortunes(ctx: RoutingContext) { + repository + .selectFortunes() + .onSuccess { + val updatedFortunes = it.plus(Fortune(0, "Additional fortune added at request time.")) + updatedFortunes.sort() + ctx.html().end(TEMPLATE.render(updatedFortunes), NULL_HANDLER) + } + .onFailure { + logger.error(it) { SOMETHING_WENT_WRONG } + ctx.error() + } + } + + companion object : Logging { + private val TEMPLATE: HtmlView = HtmlFlow + .view { page -> + page + .html() + .head() + .title() + .text("Fortunes") + .`__`() // title + .`__`() // head + .body() + .table() + .tr() + .th().text("id").`__`() + .th().text("message").`__`() + .`__`() // tr + .dynamic> { container, fortunes -> + fortunes.forEach { + container + .tr() + .td().text(it.id.toString()).`__`() + .td().text(it.message).`__`() + .`__`() // tr + } + } + .`__`() // table + .`__`() // body + .`__`() // html + } + .setIndented(false) + .threadSafe() + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt new file mode 100644 index 00000000000..1fa432ef313 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt @@ -0,0 +1,15 @@ +package com.example.starter.handlers + +import com.example.starter.models.Message +import com.example.starter.utils.serialize +import io.vertx.ext.web.RoutingContext + +class MessageHandler : AbstractHandler() { + fun readDefaultMessage(ctx: RoutingContext) { + ctx.json().end(DEFAULT_MESSAGE.serialize(), NULL_HANDLER) + } + + companion object { + private val DEFAULT_MESSAGE = Message("Hello, World!") + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt new file mode 100644 index 00000000000..1226361d71b --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt @@ -0,0 +1,56 @@ +package com.example.starter.handlers + +import com.example.starter.db.WorldRepository +import com.example.starter.utils.serialize +import io.vertx.ext.web.RoutingContext +import org.apache.logging.log4j.kotlin.Logging + +class WorldHandler(private val repository: WorldRepository) : AbstractHandler() { + fun readRandomWorld(ctx: RoutingContext) { + repository + .selectRandomWorld() + .onSuccess { + ctx.json().end(it.serialize(), NULL_HANDLER) + } + .onFailure { + logger.error(it) { SOMETHING_WENT_WRONG } + ctx.error() + } + } + + fun readRandomWorlds(ctx: RoutingContext) { + val queries = ctx.queries() + repository + .selectRandomWorlds(queries) + .onSuccess { + ctx.json().end(it.serialize(), NULL_HANDLER) + } + .onFailure { + logger.error(it) { SOMETHING_WENT_WRONG } + ctx.error() + } + } + + fun updateRandomWorlds(ctx: RoutingContext) { + val queries = ctx.queries() + repository + .updateRandomWorlds(queries) + .onSuccess { + ctx.json().end(it.serialize(), NULL_HANDLER) + } + .onFailure { + logger.error(it) { SOMETHING_WENT_WRONG } + ctx.error() + } + } + + companion object : Logging { + private const val QUERIES_PARAM_NAME = "queries" + + @Suppress("NOTHING_TO_INLINE") + private inline fun RoutingContext.queries(): Int { + val queriesParam = this.request().getParam(QUERIES_PARAM_NAME) + return queriesParam?.toIntOrNull()?.coerceIn(1, 500) ?: 1 + } + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/BufferOutputStream.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/BufferOutputStream.kt new file mode 100644 index 00000000000..d82b31fb6ee --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/BufferOutputStream.kt @@ -0,0 +1,362 @@ +package com.example.starter.io + +import io.netty.buffer.ByteBuf +import io.vertx.core.buffer.Buffer +import io.vertx.core.json.JsonArray +import io.vertx.core.json.JsonObject +import java.io.IOException +import java.io.OutputStream +import java.nio.ByteBuffer +import java.nio.charset.Charset + +class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { + private val buffer: Buffer = Buffer.buffer(initialSizeHint) + + @Throws(IOException::class) + override fun write(b: Int) { + buffer.appendByte(b.toByte()) + } + + @Throws(IOException::class) + override fun write(bytes: ByteArray) { + buffer.appendBytes(bytes) + } + + @Throws(IOException::class) + override fun write(bytes: ByteArray, offset: Int, len: Int) { + buffer.appendBytes(bytes, offset, len) + } + + override fun toString(enc: String?): String { + return buffer.toString(enc) + } + + override fun toString(enc: Charset?): String { + return buffer.toString(enc) + } + + override fun writeToBuffer(other: Buffer?) { + buffer.writeToBuffer(other) + } + + override fun readFromBuffer(pos: Int, other: Buffer?): Int { + return buffer.readFromBuffer(pos, other) + } + + override fun copy(): Buffer { + return buffer.copy() + } + + override fun toJsonObject(): JsonObject { + return buffer.toJsonObject() + } + + override fun toJsonArray(): JsonArray { + return buffer.toJsonArray() + } + + override fun getByte(pos: Int): Byte { + return buffer.getByte(pos) + } + + override fun getUnsignedByte(pos: Int): Short { + return buffer.getUnsignedByte(pos) + } + + override fun getInt(pos: Int): Int { + return buffer.getInt(pos) + } + + override fun getIntLE(pos: Int): Int { + return buffer.getIntLE(pos) + } + + override fun getUnsignedInt(pos: Int): Long { + return buffer.getUnsignedInt(pos) + } + + override fun getUnsignedIntLE(pos: Int): Long { + return buffer.getUnsignedIntLE(pos) + } + + override fun getLong(pos: Int): Long { + return buffer.getLong(pos) + } + + override fun getLongLE(pos: Int): Long { + return buffer.getLongLE(pos) + } + + override fun getDouble(pos: Int): Double { + return buffer.getDouble(pos) + } + + override fun getFloat(pos: Int): Float { + return buffer.getFloat(pos) + } + + override fun getShort(pos: Int): Short { + return buffer.getShort(pos) + } + + override fun getShortLE(pos: Int): Short { + return buffer.getShortLE(pos) + } + + override fun getUnsignedShort(pos: Int): Int { + return buffer.getUnsignedShort(pos) + } + + override fun getUnsignedShortLE(pos: Int): Int { + return buffer.getUnsignedShortLE(pos) + } + + override fun getMedium(pos: Int): Int { + return buffer.getMedium(pos) + } + + override fun getMediumLE(pos: Int): Int { + return buffer.getMediumLE(pos) + } + + override fun getUnsignedMedium(pos: Int): Int { + return buffer.getUnsignedMedium(pos) + } + + override fun getUnsignedMediumLE(pos: Int): Int { + return buffer.getUnsignedMediumLE(pos) + } + + override fun getBytes(): ByteArray { + return buffer.bytes + } + + override fun getBytes(start: Int, end: Int): ByteArray { + return buffer.getBytes(start, end) + } + + override fun getBytes(dst: ByteArray?): Buffer { + return buffer.getBytes(dst) + } + + override fun getBytes(dst: ByteArray?, dstIndex: Int): Buffer { + return buffer.getBytes(dst, dstIndex) + } + + override fun getBytes(start: Int, end: Int, dst: ByteArray?): Buffer { + return buffer.getBytes(start, end, dst) + } + + override fun getBytes(start: Int, end: Int, dst: ByteArray?, dstIndex: Int): Buffer { + return buffer.getBytes(start, end, dst, dstIndex) + } + + override fun getBuffer(start: Int, end: Int): Buffer { + return buffer.getBuffer(start, end) + } + + override fun getString(start: Int, end: Int, enc: String?): String { + return buffer.getString(start, end, enc) + } + + override fun getString(start: Int, end: Int): String { + return buffer.getString(start, end) + } + + override fun appendBuffer(buff: Buffer?): Buffer { + return buffer.appendBuffer(buff) + } + + override fun appendBuffer(buff: Buffer?, offset: Int, len: Int): Buffer { + return buffer.appendBuffer(buff, offset, len) + } + + override fun appendBytes(bytes: ByteArray?): Buffer { + return buffer.appendBytes(bytes) + } + + override fun appendBytes(bytes: ByteArray?, offset: Int, len: Int): Buffer { + return buffer.appendBytes(bytes, offset, len) + } + + override fun appendByte(b: Byte): Buffer { + return buffer.appendByte(b) + } + + override fun appendUnsignedByte(b: Short): Buffer { + return buffer.appendUnsignedByte(b) + } + + override fun appendInt(i: Int): Buffer { + return buffer.appendInt(i) + } + + override fun appendIntLE(i: Int): Buffer { + return buffer.appendIntLE(i) + } + + override fun appendUnsignedInt(i: Long): Buffer { + return buffer.appendUnsignedInt(i) + } + + override fun appendUnsignedIntLE(i: Long): Buffer { + return buffer.appendUnsignedIntLE(i) + } + + override fun appendMedium(i: Int): Buffer { + return buffer.appendMedium(i) + } + + override fun appendMediumLE(i: Int): Buffer { + return buffer.appendMediumLE(i) + } + + override fun appendLong(l: Long): Buffer { + return buffer.appendLong(l) + } + + override fun appendLongLE(l: Long): Buffer { + return buffer.appendLongLE(l) + } + + override fun appendShort(s: Short): Buffer { + return buffer.appendShort(s) + } + + override fun appendShortLE(s: Short): Buffer { + return buffer.appendShortLE(s) + } + + override fun appendUnsignedShort(s: Int): Buffer { + return buffer.appendUnsignedShort(s) + } + + override fun appendUnsignedShortLE(s: Int): Buffer { + return buffer.appendUnsignedShortLE(s) + } + + override fun appendFloat(f: Float): Buffer { + return buffer.appendFloat(f) + } + + override fun appendDouble(d: Double): Buffer { + return buffer.appendDouble(d) + } + + override fun appendString(str: String?, enc: String?): Buffer { + return buffer.appendString(str, enc) + } + + override fun appendString(str: String?): Buffer { + return buffer.appendString(str) + } + + override fun setByte(pos: Int, b: Byte): Buffer { + return buffer.setByte(pos, b) + } + + override fun setUnsignedByte(pos: Int, b: Short): Buffer { + return buffer.setUnsignedByte(pos, b) + } + + override fun setInt(pos: Int, i: Int): Buffer { + return buffer.setInt(pos, i) + } + + override fun setIntLE(pos: Int, i: Int): Buffer { + return buffer.setIntLE(pos, i) + } + + override fun setUnsignedInt(pos: Int, i: Long): Buffer { + return buffer.setUnsignedInt(pos, i) + } + + override fun setUnsignedIntLE(pos: Int, i: Long): Buffer { + return buffer.setUnsignedIntLE(pos, i) + } + + override fun setMedium(pos: Int, i: Int): Buffer { + return buffer.setMedium(pos, i) + } + + override fun setMediumLE(pos: Int, i: Int): Buffer { + return buffer.setMediumLE(pos, i) + } + + override fun setLong(pos: Int, l: Long): Buffer { + return buffer.setLong(pos, l) + } + + override fun setLongLE(pos: Int, l: Long): Buffer { + return buffer.setLongLE(pos, l) + } + + override fun setDouble(pos: Int, d: Double): Buffer { + return buffer.setDouble(pos, d) + } + + override fun setFloat(pos: Int, f: Float): Buffer { + return buffer.setFloat(pos, f) + } + + override fun setShort(pos: Int, s: Short): Buffer { + return buffer.setShort(pos, s) + } + + override fun setShortLE(pos: Int, s: Short): Buffer { + return buffer.setShortLE(pos, s) + } + + override fun setUnsignedShort(pos: Int, s: Int): Buffer { + return buffer.setUnsignedShort(pos, s) + } + + override fun setUnsignedShortLE(pos: Int, s: Int): Buffer { + return buffer.setUnsignedShortLE(pos, s) + } + + override fun setBuffer(pos: Int, b: Buffer?): Buffer { + return buffer.setBuffer(pos, b) + } + + override fun setBuffer(pos: Int, b: Buffer?, offset: Int, len: Int): Buffer { + return buffer.setBuffer(pos, b, offset, len) + } + + override fun setBytes(pos: Int, b: ByteBuffer?): Buffer { + return buffer.setBytes(pos, b) + } + + override fun setBytes(pos: Int, b: ByteArray?): Buffer { + return buffer.setBytes(pos, b) + } + + override fun setBytes(pos: Int, b: ByteArray?, offset: Int, len: Int): Buffer { + return buffer.setBytes(pos, b, offset, len) + } + + override fun setString(pos: Int, str: String?): Buffer { + return buffer.setString(pos, str) + } + + override fun setString(pos: Int, str: String?, enc: String?): Buffer { + return buffer.setString(pos, str, enc) + } + + override fun length(): Int { + return buffer.length() + } + + override fun slice(): Buffer { + return buffer.slice() + } + + override fun slice(start: Int, end: Int): Buffer { + return buffer.slice(start, end) + } + + @Deprecated("Deprecated in Java") + override fun getByteBuf(): ByteBuf { + return buffer.byteBuf + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt new file mode 100644 index 00000000000..fbf355e66a9 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt @@ -0,0 +1,15 @@ +package com.example.starter.io + +import io.vertx.core.json.JsonObject + +object JsonResource { + fun of(resource: String): JsonObject { + val classLoader = ClassLoader.getSystemClassLoader() + classLoader.getResourceAsStream(resource)?.use { input -> + val output = BufferOutputStream() + output.write(input.readAllBytes()) + return output.toJsonObject() + } + throw IllegalStateException("$resource not found") + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt new file mode 100644 index 00000000000..4b832526750 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt @@ -0,0 +1,14 @@ +package com.example.starter.models + +import com.dslplatform.json.CompiledJson +import com.dslplatform.json.JsonAttribute + +@CompiledJson +class Fortune( + @JsonAttribute(nullable = false) val id: Int, + @JsonAttribute(nullable = false) val message: String +) : Comparable { + override fun compareTo(other: Fortune): Int { + return message.compareTo(other.message) + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt new file mode 100644 index 00000000000..eb7fc6250a3 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt @@ -0,0 +1,7 @@ +package com.example.starter.models + +import com.dslplatform.json.CompiledJson +import com.dslplatform.json.JsonAttribute + +@CompiledJson +class Message(@JsonAttribute(nullable = false) val message: String) diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt new file mode 100644 index 00000000000..5011a2bb2e0 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt @@ -0,0 +1,14 @@ +package com.example.starter.models + +import com.dslplatform.json.CompiledJson +import com.dslplatform.json.JsonAttribute + +@CompiledJson +class World( + @JsonAttribute(nullable = false) val id: Int, + @JsonAttribute(nullable = false) var randomNumber: Int +) : Comparable { + override fun compareTo(other: World): Int { + return id.compareTo(other.id) + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt new file mode 100644 index 00000000000..03d5a018575 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt @@ -0,0 +1,14 @@ +package com.example.starter.utils + +import io.vertx.core.CompositeFuture +import io.vertx.core.Future +import java.util.concurrent.TimeUnit +import kotlin.time.Duration + +inline fun CompositeFuture.array(): Array = Array(this.size()) { this.resultAt(it) } + +@Suppress("NOTHING_TO_INLINE") +inline fun > T.block(duration: Duration): R = this + .toCompletionStage() + .toCompletableFuture() + .get(duration.inWholeMilliseconds, TimeUnit.MILLISECONDS) \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt new file mode 100644 index 00000000000..87c965ca9b7 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt @@ -0,0 +1,19 @@ +package com.example.starter.utils + +import com.dslplatform.json.DslJson +import com.dslplatform.json.runtime.Settings +import com.example.starter.io.BufferOutputStream +import io.vertx.core.buffer.Buffer + +val DSL_JSON: DslJson = DslJson( + Settings.withRuntime() + .includeServiceLoader() + .useStringValuesCache(DslJson.SimpleStringCache()) +) + +@Suppress("NOTHING_TO_INLINE") +inline fun T.serialize(initialSizeHint: Int = 0): Buffer { + val output = BufferOutputStream(initialSizeHint) + DSL_JSON.serialize(this, output) + return output +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt new file mode 100644 index 00000000000..2e29e784914 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt @@ -0,0 +1,16 @@ +package com.example.starter.utils + +import io.vertx.core.Vertx +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter + +object PeriodicDateResolver { + var current: String = next() + + fun init(vertx: Vertx) { + vertx.setPeriodic(1000L) { current = next() } + } + + @Suppress("NOTHING_TO_INLINE") + private inline fun next(): String = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()) +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt new file mode 100644 index 00000000000..c968777ff77 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt @@ -0,0 +1,14 @@ +package com.example.starter.utils + +import io.vertx.sqlclient.Row +import io.vertx.sqlclient.RowSet + +// This extension relies on the assumption the mapper never returns null, as it is defined. Otherwise, +// we prevent the overhead from having to do another iteration over the loop for a `filterNotNull` check. +inline fun RowSet.mapToArray(mapper: (Row) -> U): Array { + val arr = arrayOfNulls(this.size()) + val iterator = this.iterator() + var index = 0 + while (iterator.hasNext()) arr[index++] = mapper(iterator.next()) + return arr as Array +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt new file mode 100644 index 00000000000..044d24b06ab --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt @@ -0,0 +1,12 @@ +package com.example.starter.utils + +import io.netty.channel.unix.Errors +import io.netty.channel.unix.Errors.NativeIoException +import java.net.SocketException + +const val CONNECTION_RESET_MESSAGE = "Connection reset" + +fun Throwable.isConnectionReset(): Boolean { + return (this is NativeIoException && this.expectedErr() == Errors.ERRNO_ECONNRESET_NEGATIVE) + || (this is SocketException && this.message == CONNECTION_RESET_MESSAGE) +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json new file mode 100644 index 00000000000..a790bc93043 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json @@ -0,0 +1,6 @@ +{ + "port": 8080, + "tcpFastOpen": true, + "receiveBufferSize": 262144, + "sendBufferSize": 262144 +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/log4j2.xml b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/log4j2.xml new file mode 100644 index 00000000000..ebe0ad3cb74 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json new file mode 100644 index 00000000000..a145a0a51c5 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json @@ -0,0 +1,15 @@ +{ + "user": "benchmarkdbuser", + "password": "benchmarkdbpass", + "host": "tfb-database", + "port": 5432, + "database": "hello_world", + "cachePreparedStatements": true, + "preparedStatementCacheMaxSize": 512, + "preparedStatementCacheSqlLimit": 2048, + "tcpKeepAlive": true, + "tcpFastOpen": true, + "pipeliningLimit": 100000, + "receiveBufferSize": 262144, + "sendBufferSize": 262144 +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile new file mode 100644 index 00000000000..0ef28c410d9 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile @@ -0,0 +1,37 @@ +FROM gradle:8.9-jdk21 as gradle + +WORKDIR /vertx-web-kotlin-dsljson + +COPY src src +COPY build.gradle.kts build.gradle.kts +COPY gradle.properties gradle.properties +COPY settings.gradle.kts settings.gradle.kts + +RUN gradle shadowJar + +EXPOSE 8080 + +CMD java \ + -server \ + -Xms2G \ + -Xmx2G \ + -XX:+AlwaysPreTouch \ + -XX:+UseParallelGC \ + -XX:InitialCodeCacheSize=512m \ + -XX:ReservedCodeCacheSize=512m \ + -XX:MaxInlineLevel=20 \ + -XX:+UseNUMA \ + -Dvertx.disableMetrics=true \ + -Dvertx.disableH2c=true \ + -Dvertx.disableWebsockets=true \ + -Dvertx.flashPolicyHandler=false \ + -Dvertx.threadChecks=false \ + -Dvertx.disableContextTimings=true \ + -Dvertx.disableTCCL=true \ + -Dvertx.disableHttpHeadersValidation=true \ + -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + -Dtfb.hasDB=true \ + -jar \ + build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile new file mode 100644 index 00000000000..a4a1c142cf5 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile @@ -0,0 +1,37 @@ +FROM gradle:8.9-jdk21 as gradle + +WORKDIR /vertx-web-kotlin-dsljson + +COPY src src +COPY build.gradle.kts build.gradle.kts +COPY gradle.properties gradle.properties +COPY settings.gradle.kts settings.gradle.kts + +RUN gradle shadowJar + +EXPOSE 8080 + +CMD java \ + -server \ + -Xms2G \ + -Xmx2G \ + -XX:+AlwaysPreTouch \ + -XX:+UseParallelGC \ + -XX:InitialCodeCacheSize=512m \ + -XX:ReservedCodeCacheSize=512m \ + -XX:MaxInlineLevel=20 \ + -XX:+UseNUMA \ + -Dvertx.disableMetrics=true \ + -Dvertx.disableH2c=true \ + -Dvertx.disableWebsockets=true \ + -Dvertx.flashPolicyHandler=false \ + -Dvertx.threadChecks=false \ + -Dvertx.disableContextTimings=true \ + -Dvertx.disableTCCL=true \ + -Dvertx.disableHttpHeadersValidation=true \ + -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + -Dtfb.hasDB=false \ + -jar \ + build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar From 64fd93c0849d6ecb869b7e427533d160cc5165f5 Mon Sep 17 00:00:00 2001 From: Yan Kun Date: Sat, 3 Aug 2024 00:00:17 +0800 Subject: [PATCH 0739/1766] [Scala/otavia] Add new framework otavia: Your shiny new IO & Actor programming model! (#9158) --- frameworks/Scala/otavia/.mill-version | 1 + frameworks/Scala/otavia/.scalafmt.conf | 16 ++ frameworks/Scala/otavia/README.MD | 13 ++ .../src/app/controller/DBController.scala | 106 ++++++++++ .../app/controller/FortuneController.scala | 41 ++++ .../benchmark/src/app/model/Fortune.scala | 7 + .../benchmark/src/app/model/Message.scala | 5 + .../benchmark/src/app/model/World.scala | 8 + .../otavia/benchmark/src/app/startup.scala | 70 +++++++ .../src/app/util/FortunesRender.scala | 64 ++++++ frameworks/Scala/otavia/benchmark_config.json | 53 +++++ frameworks/Scala/otavia/build.sc | 15 ++ frameworks/Scala/otavia/config.toml | 36 ++++ frameworks/Scala/otavia/millw | 194 ++++++++++++++++++ frameworks/Scala/otavia/millw.bat | 173 ++++++++++++++++ .../Scala/otavia/otavia-reserve.dockerfile | 15 ++ frameworks/Scala/otavia/otavia.dockerfile | 15 ++ 17 files changed, 832 insertions(+) create mode 100644 frameworks/Scala/otavia/.mill-version create mode 100644 frameworks/Scala/otavia/.scalafmt.conf create mode 100644 frameworks/Scala/otavia/README.MD create mode 100644 frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala create mode 100644 frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala create mode 100644 frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala create mode 100644 frameworks/Scala/otavia/benchmark/src/app/model/Message.scala create mode 100644 frameworks/Scala/otavia/benchmark/src/app/model/World.scala create mode 100644 frameworks/Scala/otavia/benchmark/src/app/startup.scala create mode 100644 frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala create mode 100644 frameworks/Scala/otavia/benchmark_config.json create mode 100644 frameworks/Scala/otavia/build.sc create mode 100644 frameworks/Scala/otavia/config.toml create mode 100644 frameworks/Scala/otavia/millw create mode 100644 frameworks/Scala/otavia/millw.bat create mode 100644 frameworks/Scala/otavia/otavia-reserve.dockerfile create mode 100644 frameworks/Scala/otavia/otavia.dockerfile diff --git a/frameworks/Scala/otavia/.mill-version b/frameworks/Scala/otavia/.mill-version new file mode 100644 index 00000000000..772c67a500f --- /dev/null +++ b/frameworks/Scala/otavia/.mill-version @@ -0,0 +1 @@ +0.11.8 \ No newline at end of file diff --git a/frameworks/Scala/otavia/.scalafmt.conf b/frameworks/Scala/otavia/.scalafmt.conf new file mode 100644 index 00000000000..ff856188419 --- /dev/null +++ b/frameworks/Scala/otavia/.scalafmt.conf @@ -0,0 +1,16 @@ +version = "3.5.3" + +runner.dialect = scala3 +maxColumn = 120 +docstrings.blankFirstLine = no +docstrings.style = AsteriskSpace +docstrings.removeEmpty = true +docstrings.oneline = fold +docstrings.wrap = yes +docstrings.wrapMaxColumn = 120 +docstrings.forceBlankLineBefore = true +align.preset = more + +indent.main = 4 + +newlines.topLevelBodyIfMinStatements = [before,after] \ No newline at end of file diff --git a/frameworks/Scala/otavia/README.MD b/frameworks/Scala/otavia/README.MD new file mode 100644 index 00000000000..0ea11222811 --- /dev/null +++ b/frameworks/Scala/otavia/README.MD @@ -0,0 +1,13 @@ +## Introduction + +[GitHub - otavia-projects/otavia : Your shiny new IO & Actor programming model!](https://github.com/otavia-projects/otavia) + +`otavia` is an IO and Actor programming model power by Scala 3, it provides a toolkit to make writing high-performance +concurrent programs more easily. + +You can get a quick overview of the basic usage and core design of `otavia` in the following documentation: + +- [Quick Start](https://github.com/otavia-projects/otavia/blob/main/docs/_docs/quick_start.md) +- [Core Concepts and Design](https://github.com/otavia-projects/otavia/blob/main/docs/_docs/core_concept.md) + +More document can be found at [website](https://otavia.cc/home.html) \ No newline at end of file diff --git a/frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala b/frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala new file mode 100644 index 00000000000..6b54504aecc --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala @@ -0,0 +1,106 @@ +package app.controller + +import app.controller.DBController.* +import app.model.World +import cc.otavia.core.actor.{MessageOf, StateActor} +import cc.otavia.core.address.Address +import cc.otavia.core.message.{Ask, Reply} +import cc.otavia.core.stack.helper.{FutureState, FuturesState, StartState} +import cc.otavia.core.stack.{AskStack, StackState, StackYield} +import cc.otavia.http.server.{HttpRequest, HttpResponse} +import cc.otavia.sql.Connection +import cc.otavia.sql.Statement.{ModifyRows, PrepareQuery} + +import java.util.SplittableRandom + +class DBController extends StateActor[REQ] { + + private var connection: Address[MessageOf[Connection]] = _ + + private val random = new SplittableRandom() + + override protected def afterMount(): Unit = connection = autowire[Connection]() + + override protected def resumeAsk(stack: AskStack[REQ & Ask[? <: Reply]]): StackYield = + stack match + case stack: AskStack[SingleQueryRequest] if stack.ask.isInstanceOf[SingleQueryRequest] => + handleSingleQuery(stack) + case stack: AskStack[MultipleQueryRequest] if stack.ask.isInstanceOf[MultipleQueryRequest] => + handleMultipleQuery(stack) + case stack: AskStack[UpdateRequest] if stack.ask.isInstanceOf[UpdateRequest] => + handleUpdateQuery(stack) + + // Test 2: Single database query + private def handleSingleQuery(stack: AskStack[SingleQueryRequest]): StackYield = { + stack.state match + case _: StartState => + val state = FutureState[World]() + connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, Tuple1(randomWorld())), state.future) + stack.suspend(state) + case state: FutureState[World] => + stack.`return`(state.future.getNow) + } + + // Test 3: Multiple database queries + private def handleMultipleQuery(stack: AskStack[MultipleQueryRequest]): StackYield = { + stack.state match + case _: StartState => + stack.suspend(selectWorlds(normalizeQueries(stack.ask.params))) + case state: FuturesState[World] => + val response = HttpResponse.builder.setContent(state.futures.map(_.getNow)).build() + stack.`return`(response) + } + + // Test 5: Database updates + private def handleUpdateQuery(stack: AskStack[UpdateRequest]): StackYield = { + stack.state match + case _: StartState => + stack.suspend(selectWorlds(normalizeQueries(stack.ask.params))) + case state: FuturesState[World] => + val worlds = state.futures.map(_.getNow) + stack.attach(worlds) + val newState = FutureState[ModifyRows]() + val newWorlds = worlds.sortBy(_.id).map(_.copy(randomNumber = randomWorld())) + connection.ask(PrepareQuery.update(UPDATE_WORLD, newWorlds), newState.future) + stack.suspend(newState) + case state: FutureState[ModifyRows] => + if (state.future.isFailed) state.future.causeUnsafe.printStackTrace() + val response = HttpResponse.builder.setContent(stack.attach[Seq[World]]).build() + stack.`return`(response) + } + + private def selectWorlds(queries: Int): StackState = { + val state = FuturesState[World](queries) + for (future <- state.futures) + connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, Tuple1(randomWorld())), future) + state + } + + private def randomWorld(): Int = 1 + random.nextInt(10000) + + private def normalizeQueries(params: Map[String, String]): Int = { + params.get("queries") match + case Some(value) => + try { + val queries = value.toInt + if (queries < 1) 1 else if (queries > 500) 500 else queries + } catch { + case e: Throwable => 1 + } + case None => 1 + } + +} + +object DBController { + + type REQ = SingleQueryRequest | MultipleQueryRequest | UpdateRequest + + class SingleQueryRequest extends HttpRequest[Nothing, World] + class MultipleQueryRequest extends HttpRequest[Nothing, HttpResponse[Seq[World]]] + class UpdateRequest extends HttpRequest[Nothing, HttpResponse[Seq[World]]] + + private val SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1" + private val UPDATE_WORLD = "update world set randomnumber=$2 where id=$1" + +} diff --git a/frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala b/frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala new file mode 100644 index 00000000000..05ff8c468ba --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala @@ -0,0 +1,41 @@ +package app.controller + +import app.controller.FortuneController.* +import app.model.Fortune +import cc.otavia.core.actor.{MessageOf, StateActor} +import cc.otavia.core.address.Address +import cc.otavia.core.stack.helper.{FutureState, StartState} +import cc.otavia.core.stack.{AskStack, StackState, StackYield} +import cc.otavia.http.server.{HttpRequest, HttpResponse} +import cc.otavia.sql.Statement.PrepareQuery +import cc.otavia.sql.{Connection, RowSet} + +class FortuneController extends StateActor[FortuneRequest] { + + private var connection: Address[MessageOf[Connection]] = _ + + override protected def afterMount(): Unit = connection = autowire[Connection]() + + // Test 4: Fortunes + override protected def resumeAsk(stack: AskStack[FortuneRequest]): StackYield = { + stack.state match + case _: StartState => + val state = FutureState[RowSet[Fortune]]() + connection.ask(PrepareQuery.fetchAll[Fortune](SELECT_FORTUNE), state.future) + stack.suspend(state) + case state: FutureState[RowSet[Fortune]] => + val fortunes = (state.future.getNow.rows :+ Fortune(0, "Additional fortune added at request time.")) + .sortBy(_.message) + val response = HttpResponse.builder.setContent(fortunes).build() + stack.`return`(response) + } + +} + +object FortuneController { + + class FortuneRequest extends HttpRequest[Nothing, HttpResponse[Seq[Fortune]]] + + private val SELECT_FORTUNE = "SELECT id, message from FORTUNE" + +} diff --git a/frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala b/frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala new file mode 100644 index 00000000000..edb58d3cdc9 --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala @@ -0,0 +1,7 @@ +package app.model + +import cc.otavia.json.JsonSerde +import cc.otavia.sql.{Row, RowDecoder} + +/** The model for the "fortune" database table. */ +case class Fortune(id: Int, message: String) extends Row derives RowDecoder, JsonSerde diff --git a/frameworks/Scala/otavia/benchmark/src/app/model/Message.scala b/frameworks/Scala/otavia/benchmark/src/app/model/Message.scala new file mode 100644 index 00000000000..a0d389090ae --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/model/Message.scala @@ -0,0 +1,5 @@ +package app.model + +import cc.otavia.json.JsonSerde + +case class Message(message: String) derives JsonSerde diff --git a/frameworks/Scala/otavia/benchmark/src/app/model/World.scala b/frameworks/Scala/otavia/benchmark/src/app/model/World.scala new file mode 100644 index 00000000000..a0e6f6056f8 --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/model/World.scala @@ -0,0 +1,8 @@ +package app.model + +import cc.otavia.json.JsonSerde +import cc.otavia.serde.annotation.rename +import cc.otavia.sql.{Row, RowDecoder} + +/** The model for the "world" database table. */ +case class World(id: Int, @rename("randomnumber") randomNumber: Int) extends Row derives RowDecoder, JsonSerde diff --git a/frameworks/Scala/otavia/benchmark/src/app/startup.scala b/frameworks/Scala/otavia/benchmark/src/app/startup.scala new file mode 100644 index 00000000000..32eb0c2e539 --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/startup.scala @@ -0,0 +1,70 @@ +package app + +import app.controller.DBController.* +import app.controller.FortuneController.* +import app.controller.{DBController, FortuneController} +import app.model.* +import app.util.FortunesRender +import cc.otavia.core.actor.ChannelsActor.{Bind, ChannelEstablished} +import cc.otavia.core.actor.MainActor +import cc.otavia.core.slf4a.LoggerFactory +import cc.otavia.core.stack.helper.{FutureState, StartState} +import cc.otavia.core.stack.{NoticeStack, StackYield} +import cc.otavia.core.system.ActorSystem +import cc.otavia.http.HttpMethod.* +import cc.otavia.http.MediaType +import cc.otavia.http.MediaType.* +import cc.otavia.http.server.* +import cc.otavia.http.server.Router.* +import cc.otavia.json.JsonSerde +import cc.otavia.serde.helper.BytesSerde +import cc.otavia.sql.Connection + +import java.io.File +import java.nio.charset.StandardCharsets.UTF_8 +import java.nio.file.Path + +private class ServerMain(val port: Int = 8080) extends MainActor(Array.empty) { + + override def main0(stack: NoticeStack[MainActor.Args]): StackYield = stack.state match + case _: StartState => + val worldResponseSerde = HttpResponseSerde.json(summon[JsonSerde[World]]) + val worldsResponseSerde = HttpResponseSerde.json(JsonSerde.derived[Seq[World]]) + val fortunesResponseSerde = HttpResponseSerde(new FortunesRender(), MediaType.TEXT_HTML_UTF8) + + val dbController = autowire[DBController]() + val fortuneController = autowire[FortuneController]() + + val routers = Seq( + // Test 6: plaintext + constant[Array[Byte]](GET, "/plaintext", "Hello, World!".getBytes(UTF_8), BytesSerde, TEXT_PLAIN_UTF8), + // Test 1: JSON serialization + constant[Message](GET, "/json", Message("Hello, World!"), summon[JsonSerde[Message]], APP_JSON), + // Test 2: Single database query. + get("/db", dbController, () => new SingleQueryRequest(), worldResponseSerde), + // Test 3: Multiple database queries + get("/queries", dbController, () => new MultipleQueryRequest(), worldsResponseSerde), + // Test 5: Database updates + get("/updates", dbController, () => new UpdateRequest(), worldsResponseSerde), + // Test 4: Fortunes + get("/fortunes", fortuneController, () => new FortuneRequest(), fortunesResponseSerde) + ) + val server = system.buildActor(() => new HttpServer(system.actorWorkerSize, routers)) + val state = FutureState[ChannelEstablished]() + server.ask(Bind(port), state.future) + stack.suspend(state) + case state: FutureState[ChannelEstablished] => + if (state.future.isFailed) state.future.causeUnsafe.printStackTrace() + logger.info(s"http server bind port $port success") + stack.`return`() + +} + +@main def startup(url: String, user: String, password: String, poolSize: Int): Unit = + val system = ActorSystem() + val logger = LoggerFactory.getLogger("startup", system) + logger.info("starting http server") + system.buildActor(() => new Connection(url, user, password), global = true, num = poolSize) + system.buildActor(() => new DBController(), global = true, num = system.actorWorkerSize) + system.buildActor(() => new FortuneController(), global = true, num = system.actorWorkerSize) + system.buildActor(() => new ServerMain()) diff --git a/frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala b/frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala new file mode 100644 index 00000000000..0c0694ee836 --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala @@ -0,0 +1,64 @@ +package app.util + +import app.model.Fortune +import cc.otavia.buffer.{Buffer, BufferUtils} +import cc.otavia.serde.Serde + +import java.nio.charset.StandardCharsets +import scala.annotation.switch + +class FortunesRender extends Serde[Seq[Fortune]] { + + private val text1 = + "Fortunes" + .getBytes(StandardCharsets.UTF_8) + + private val text2 = "".getBytes(StandardCharsets.UTF_8) + + private val text5 = "
idmessage
".getBytes(StandardCharsets.UTF_8) + + private val text3 = "".getBytes(StandardCharsets.UTF_8) + + private val text4 = "
".getBytes(StandardCharsets.UTF_8) + + private val lt = "<".getBytes() + private val gt = ">".getBytes() + private val quot = """.getBytes() + private val squot = "'".getBytes() + private val amp = "&".getBytes() + + override def serialize(fortunes: Seq[Fortune], out: Buffer): Unit = { + out.writeBytes(text1) + for (fortune <- fortunes) { + out.writeBytes(text2) + BufferUtils.writeIntAsString(out, fortune.id) + out.writeBytes(text3) + writeEscapeMessage(out, fortune.message) + out.writeBytes(text4) + } + out.writeBytes(text5) + } + + override def deserialize(in: Buffer): Seq[Fortune] = throw new UnsupportedOperationException() + + private def writeEscapeMessage(buffer: Buffer, message: String): Unit = { + var i = 0 + while (i < message.length) { + val ch = message.charAt(i) + writeChar(buffer, ch) + i += 1 + } + } + + private def writeChar(buffer: Buffer, ch: Char): Unit = (ch: @switch) match + case '<' => buffer.writeBytes(lt) + case '>' => buffer.writeBytes(gt) + case '"' => buffer.writeBytes(quot) + case '\'' => buffer.writeBytes(squot) + case '&' => buffer.writeBytes(amp) + case _ => + if (ch < 0x80) buffer.writeByte(ch.toByte) + else if (ch < 0x800) buffer.writeShortLE((ch >> 6 | (ch << 8 & 0x3f00) | 0x80c0).toShort) + else buffer.writeMediumLE(ch >> 12 | (ch << 2 & 0x3f00) | (ch << 16 & 0x3f0000) | 0x8080e0) + +} diff --git a/frameworks/Scala/otavia/benchmark_config.json b/frameworks/Scala/otavia/benchmark_config.json new file mode 100644 index 00000000000..ae712574778 --- /dev/null +++ b/frameworks/Scala/otavia/benchmark_config.json @@ -0,0 +1,53 @@ +{ + "framework": "otavia", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "otavia", + "language": "Scala", + "flavor": "None", + "orm": "Micro", + "platform": "Otavia", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "otavia", + "notes": "", + "versus": "Otavia" + }, + "reserve": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "otavia", + "language": "Scala", + "flavor": "None", + "orm": "Micro", + "platform": "Otavia", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "otavia", + "notes": "", + "versus": "Otavia" + } + } + ] +} diff --git a/frameworks/Scala/otavia/build.sc b/frameworks/Scala/otavia/build.sc new file mode 100644 index 00000000000..2b7877b7891 --- /dev/null +++ b/frameworks/Scala/otavia/build.sc @@ -0,0 +1,15 @@ +import mill._ +import mill.scalalib._ + +def otaviaVersion = "0.4.0" + +object benchmark extends ScalaModule { + + override def scalaVersion = "3.3.1" + + override def ivyDeps = Agg( + ivy"cc.otavia::otavia-codec-http:$otaviaVersion", + ivy"cc.otavia::otavia-postgres-driver:$otaviaVersion" + ) + +} diff --git a/frameworks/Scala/otavia/config.toml b/frameworks/Scala/otavia/config.toml new file mode 100644 index 00000000000..96613dfd2fd --- /dev/null +++ b/frameworks/Scala/otavia/config.toml @@ -0,0 +1,36 @@ +[framework] +name = "otavia" + +[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 = "Micro" +platform = "Otavia" +webserver = "None" +versus = "Otavia" + +[reserve] +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 = "Micro" +platform = "Otavia" +webserver = "None" +versus = "Otavia" diff --git a/frameworks/Scala/otavia/millw b/frameworks/Scala/otavia/millw new file mode 100644 index 00000000000..73bb4d0e4a0 --- /dev/null +++ b/frameworks/Scala/otavia/millw @@ -0,0 +1,194 @@ +#!/usr/bin/env sh + +# This is a wrapper script, that automatically download mill from GitHub release pages +# You can give the required mill version with --mill-version parameter +# If no version is given, it falls back to the value of DEFAULT_MILL_VERSION +# +# Project page: https://github.com/lefou/millw +# Script Version: 0.4.6 +# +# If you want to improve this script, please also contribute your changes back! +# +# Licensed under the Apache License, Version 2.0 + +set -e + +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then + DEFAULT_MILL_VERSION="0.10.10" +fi + + +if [ -z "${GITHUB_RELEASE_CDN}" ] ; then + GITHUB_RELEASE_CDN="" +fi + + +MILL_REPO_URL="https://github.com/com-lihaoyi/mill" + +if [ -z "${CURL_CMD}" ] ; then + CURL_CMD=curl +fi + +# Explicit commandline argument takes precedence over all other methods +if [ "$1" = "--mill-version" ] ; then + shift + if [ "x$1" != "x" ] ; then + MILL_VERSION="$1" + shift + else + echo "You specified --mill-version without a version." 1>&2 + echo "Please provide a version that matches one provided on" 1>&2 + echo "${MILL_REPO_URL}/releases" 1>&2 + false + fi +fi + +# Please note, that if a MILL_VERSION is already set in the environment, +# We reuse it's value and skip searching for a value. + +# If not already set, read .mill-version file +if [ -z "${MILL_VERSION}" ] ; then + if [ -f ".mill-version" ] ; then + MILL_VERSION="$(head -n 1 .mill-version 2> /dev/null)" + elif [ -f ".config/mill-version" ] ; then + MILL_VERSION="$(head -n 1 .config/mill-version 2> /dev/null)" + fi +fi + +if [ -n "${XDG_CACHE_HOME}" ] ; then + MILL_DOWNLOAD_PATH="${XDG_CACHE_HOME}/mill/download" +else + MILL_DOWNLOAD_PATH="${HOME}/.cache/mill/download" +fi + +# If not already set, try to fetch newest from Github +if [ -z "${MILL_VERSION}" ] ; then + # TODO: try to load latest version from release page + echo "No mill version specified." 1>&2 + echo "You should provide a version via '.mill-version' file or --mill-version option." 1>&2 + + mkdir -p "${MILL_DOWNLOAD_PATH}" + LANG=C touch -d '1 hour ago' "${MILL_DOWNLOAD_PATH}/.expire_latest" 2>/dev/null || ( + # we might be on OSX or BSD which don't have -d option for touch + # but probably a -A [-][[hh]mm]SS + touch "${MILL_DOWNLOAD_PATH}/.expire_latest"; touch -A -010000 "${MILL_DOWNLOAD_PATH}/.expire_latest" + ) || ( + # in case we still failed, we retry the first touch command with the intention + # to show the (previously suppressed) error message + LANG=C touch -d '1 hour ago' "${MILL_DOWNLOAD_PATH}/.expire_latest" + ) + + # POSIX shell variant of bash's -nt operator, see https://unix.stackexchange.com/a/449744/6993 + # if [ "${MILL_DOWNLOAD_PATH}/.latest" -nt "${MILL_DOWNLOAD_PATH}/.expire_latest" ] ; then + if [ -n "$(find -L "${MILL_DOWNLOAD_PATH}/.latest" -prune -newer "${MILL_DOWNLOAD_PATH}/.expire_latest")" ]; then + # we know a current latest version + MILL_VERSION=$(head -n 1 "${MILL_DOWNLOAD_PATH}"/.latest 2> /dev/null) + fi + + if [ -z "${MILL_VERSION}" ] ; then + # we don't know a current latest version + echo "Retrieving latest mill version ..." 1>&2 + LANG=C ${CURL_CMD} -s -i -f -I ${MILL_REPO_URL}/releases/latest 2> /dev/null | grep --ignore-case Location: | sed s'/^.*tag\///' | tr -d '\r\n' > "${MILL_DOWNLOAD_PATH}/.latest" + MILL_VERSION=$(head -n 1 "${MILL_DOWNLOAD_PATH}"/.latest 2> /dev/null) + fi + + if [ -z "${MILL_VERSION}" ] ; then + # Last resort + MILL_VERSION="${DEFAULT_MILL_VERSION}" + echo "Falling back to hardcoded mill version ${MILL_VERSION}" 1>&2 + else + echo "Using mill version ${MILL_VERSION}" 1>&2 + fi +fi + +MILL="${MILL_DOWNLOAD_PATH}/${MILL_VERSION}" + +try_to_use_system_mill() { + MILL_IN_PATH="$(command -v mill || true)" + + if [ -z "${MILL_IN_PATH}" ]; then + return + fi + + UNIVERSAL_SCRIPT_MAGIC="@ 2>/dev/null # 2>nul & echo off & goto BOF" + + if ! head -c 128 "${MILL_IN_PATH}" | grep -qF "${UNIVERSAL_SCRIPT_MAGIC}"; then + if [ -n "${MILLW_VERBOSE}" ]; then + echo "Could not determine mill version of ${MILL_IN_PATH}, as it does not start with the universal script magic2" 1>&2 + fi + return + fi + + # Roughly the size of the universal script. + MILL_VERSION_SEARCH_RANGE="2403" + MILL_IN_PATH_VERSION=$(head -c "${MILL_VERSION_SEARCH_RANGE}" "${MILL_IN_PATH}" |\ + sed -n 's/^.*-DMILL_VERSION=\([^\s]*\) .*$/\1/p' |\ + head -n 1) + + if [ -z "${MILL_IN_PATH_VERSION}" ]; then + echo "Could not determine mill version, even though ${MILL_IN_PATH} has the universal script magic" 1>&2 + return + fi + + if [ "${MILL_IN_PATH_VERSION}" = "${MILL_VERSION}" ]; then + MILL="${MILL_IN_PATH}" + fi +} +try_to_use_system_mill + +# If not already downloaded, download it +if [ ! -s "${MILL}" ] ; then + + # support old non-XDG download dir + MILL_OLD_DOWNLOAD_PATH="${HOME}/.mill/download" + OLD_MILL="${MILL_OLD_DOWNLOAD_PATH}/${MILL_VERSION}" + if [ -x "${OLD_MILL}" ] ; then + MILL="${OLD_MILL}" + else + VERSION_PREFIX="$(echo $MILL_VERSION | cut -b -4)" + case $VERSION_PREFIX in + 0.0. | 0.1. | 0.2. | 0.3. | 0.4. ) + DOWNLOAD_SUFFIX="" + ;; + *) + DOWNLOAD_SUFFIX="-assembly" + ;; + esac + unset VERSION_PREFIX + + DOWNLOAD_FILE=$(mktemp mill.XXXXXX) + MILL_VERSION_TAG=$(echo $MILL_VERSION | sed -E 's/([^-]+)(-M[0-9]+)?(-.*)?/\1\2/') + DOWNLOAD_URL="${GITHUB_RELEASE_CDN}${MILL_REPO_URL}/releases/download/${MILL_VERSION_TAG}/${MILL_VERSION}${DOWNLOAD_SUFFIX}" + # TODO: handle command not found + echo "Downloading mill ${MILL_VERSION} from ${DOWNLOAD_URL} ..." 1>&2 + ${CURL_CMD} -f -L -o "${DOWNLOAD_FILE}" ${DOWNLOAD_URL} + chmod +x "${DOWNLOAD_FILE}" + mkdir -p "${MILL_DOWNLOAD_PATH}" + mv "${DOWNLOAD_FILE}" "${MILL}" + + unset DOWNLOAD_FILE + unset DOWNLOAD_SUFFIX + fi +fi + +if [ -z "$MILL_MAIN_CLI" ] ; then + MILL_MAIN_CLI="${0}" +fi + +MILL_FIRST_ARG="" +if [ "$1" = "--bsp" ] || [ "$1" = "-i" ] || [ "$1" = "--interactive" ] || [ "$1" = "--no-server" ] || [ "$1" = "--repl" ] || [ "$1" = "--help" ] ; then + # Need to preserve the first position of those listed options + MILL_FIRST_ARG=$1 + shift +fi + +unset MILL_DOWNLOAD_PATH +unset MILL_OLD_DOWNLOAD_PATH +unset OLD_MILL +unset MILL_VERSION +unset MILL_VERSION_TAG +unset MILL_REPO_URL + +# We don't quote MILL_FIRST_ARG on purpose, so we can expand the empty value without quotes +# shellcheck disable=SC2086 +exec "${MILL}" $MILL_FIRST_ARG -D "mill.main.cli=${MILL_MAIN_CLI}" "$@" diff --git a/frameworks/Scala/otavia/millw.bat b/frameworks/Scala/otavia/millw.bat new file mode 100644 index 00000000000..6359e35e500 --- /dev/null +++ b/frameworks/Scala/otavia/millw.bat @@ -0,0 +1,173 @@ +@echo off + +rem This is a wrapper script, that automatically download mill from GitHub release pages +rem You can give the required mill version with --mill-version parameter +rem If no version is given, it falls back to the value of DEFAULT_MILL_VERSION +rem +rem Project page: https://github.com/lefou/millw +rem Script Version: 0.4.6 +rem +rem If you want to improve this script, please also contribute your changes back! +rem +rem Licensed under the Apache License, Version 2.0 + +rem setlocal seems to be unavailable on Windows 95/98/ME +rem but I don't think we need to support them in 2019 +setlocal enabledelayedexpansion + +if [!DEFAULT_MILL_VERSION!]==[] ( + set "DEFAULT_MILL_VERSION=0.10.10" +) + +if [!GITHUB_RELEASE_CDN!]==[] ( + set "GITHUB_RELEASE_CDN=" +) + +set "MILL_REPO_URL=https://github.com/com-lihaoyi/mill" + +rem %~1% removes surrounding quotes +if [%~1%]==[--mill-version] ( + if not [%~2%]==[] ( + set MILL_VERSION=%~2% + rem shift command doesn't work within parentheses + set "STRIP_VERSION_PARAMS=true" + ) else ( + echo You specified --mill-version without a version. 1>&2 + echo Please provide a version that matches one provided on 1>&2 + echo %MILL_REPO_URL%/releases 1>&2 + exit /b 1 + ) +) + +if not defined STRIP_VERSION_PARAMS GOTO AfterStripVersionParams +rem strip the: --mill-version {version} +shift +shift +:AfterStripVersionParams + +if [!MILL_VERSION!]==[] ( + if exist .mill-version ( + set /p MILL_VERSION=<.mill-version + ) else ( + if exist .config\mill-version ( + set /p MILL_VERSION=<.config\mill-version + ) + ) +) + +if [!MILL_VERSION!]==[] ( + set MILL_VERSION=%DEFAULT_MILL_VERSION% +) + +set MILL_DOWNLOAD_PATH=%USERPROFILE%\.mill\download + +rem without bat file extension, cmd doesn't seem to be able to run it +set MILL=%MILL_DOWNLOAD_PATH%\!MILL_VERSION!.bat + +if not exist "%MILL%" ( + set VERSION_PREFIX=%MILL_VERSION:~0,4% + set DOWNLOAD_SUFFIX=-assembly + if [!VERSION_PREFIX!]==[0.0.] set DOWNLOAD_SUFFIX= + if [!VERSION_PREFIX!]==[0.1.] set DOWNLOAD_SUFFIX= + if [!VERSION_PREFIX!]==[0.2.] set DOWNLOAD_SUFFIX= + if [!VERSION_PREFIX!]==[0.3.] set DOWNLOAD_SUFFIX= + if [!VERSION_PREFIX!]==[0.4.] set DOWNLOAD_SUFFIX= + set VERSION_PREFIX= + + for /F "delims=- tokens=1" %%A in ("!MILL_VERSION!") do set MILL_VERSION_BASE=%%A + for /F "delims=- tokens=2" %%A in ("!MILL_VERSION!") do set MILL_VERSION_MILESTONE=%%A + set VERSION_MILESTONE_START=!MILL_VERSION_MILESTONE:~0,1! + if [!VERSION_MILESTONE_START!]==[M] ( + set MILL_VERSION_TAG="!MILL_VERSION_BASE!-!MILL_VERSION_MILESTONE!" + ) else ( + set MILL_VERSION_TAG=!MILL_VERSION_BASE! + ) + + rem there seems to be no way to generate a unique temporary file path (on native Windows) + set DOWNLOAD_FILE=%MILL%.tmp + + set DOWNLOAD_URL=!GITHUB_RELEASE_CDN!%MILL_REPO_URL%/releases/download/!MILL_VERSION_TAG!/!MILL_VERSION!!DOWNLOAD_SUFFIX! + + echo Downloading mill %MILL_VERSION% from !DOWNLOAD_URL! ... 1>&2 + + if not exist "%MILL_DOWNLOAD_PATH%" mkdir "%MILL_DOWNLOAD_PATH%" + rem curl is bundled with recent Windows 10 + rem but I don't think we can expect all the users to have it in 2019 + where /Q curl + if %ERRORLEVEL% EQU 0 ( + curl -f -L "!DOWNLOAD_URL!" -o "!DOWNLOAD_FILE!" + ) else ( + rem bitsadmin seems to be available on Windows 7 + rem without /dynamic, github returns 403 + rem bitsadmin is sometimes needlessly slow but it looks better with /priority foreground + bitsadmin /transfer millDownloadJob /dynamic /priority foreground "!DOWNLOAD_URL!" "!DOWNLOAD_FILE!" + ) + if not exist "!DOWNLOAD_FILE!" ( + echo Could not download mill %MILL_VERSION% 1>&2 + exit /b 1 + ) + + move /y "!DOWNLOAD_FILE!" "%MILL%" + + set DOWNLOAD_FILE= + set DOWNLOAD_SUFFIX= +) + +set MILL_DOWNLOAD_PATH= +set MILL_VERSION= +set MILL_REPO_URL= + +if [!MILL_MAIN_CLI!]==[] ( + set "MILL_MAIN_CLI=%0" +) + +rem Need to preserve the first position of those listed options +set MILL_FIRST_ARG= +if [%~1%]==[--bsp] ( + set MILL_FIRST_ARG=%1% +) else ( + if [%~1%]==[-i] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--interactive] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--no-server] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--repl] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--help] ( + set MILL_FIRST_ARG=%1% + ) + ) + ) + ) + ) +) + +set "MILL_PARAMS=%*%" + +if not [!MILL_FIRST_ARG!]==[] ( + if defined STRIP_VERSION_PARAMS ( + for /f "tokens=1-3*" %%a in ("%*") do ( + set "MILL_PARAMS=%%d" + ) + ) else ( + for /f "tokens=1*" %%a in ("%*") do ( + set "MILL_PARAMS=%%b" + ) + ) +) else ( + if defined STRIP_VERSION_PARAMS ( + for /f "tokens=1-2*" %%a in ("%*") do ( + rem strip %%a - It's the "--mill-version" option. + rem strip %%b - it's the version number that comes after the option. + rem keep %%c - It's the remaining options. + set "MILL_PARAMS=%%c" + ) + ) +) + +"%MILL%" %MILL_FIRST_ARG% -D "mill.main.cli=%MILL_MAIN_CLI%" %MILL_PARAMS% diff --git a/frameworks/Scala/otavia/otavia-reserve.dockerfile b/frameworks/Scala/otavia/otavia-reserve.dockerfile new file mode 100644 index 00000000000..5768000706e --- /dev/null +++ b/frameworks/Scala/otavia/otavia-reserve.dockerfile @@ -0,0 +1,15 @@ +FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0 +WORKDIR /otavia +COPY benchmark benchmark +COPY build.sc build.sc +ENV COURSIER_REPOSITORIES=ivy2Local|central +RUN mill benchmark.assembly + +EXPOSE 8080 + +CMD java -server \ + -Dcc.otavia.actor.worker.size=18 -Dcc.otavia.nio.worker.size=36 \ + -jar \ + out/benchmark/assembly.dest/out.jar \ + jdbc:postgresql://tfb-database:5432/hello_world \ + benchmarkdbuser benchmarkdbpass 54 diff --git a/frameworks/Scala/otavia/otavia.dockerfile b/frameworks/Scala/otavia/otavia.dockerfile new file mode 100644 index 00000000000..c1c944d60aa --- /dev/null +++ b/frameworks/Scala/otavia/otavia.dockerfile @@ -0,0 +1,15 @@ +FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0 +WORKDIR /otavia +COPY benchmark benchmark +COPY build.sc build.sc +ENV COURSIER_REPOSITORIES=ivy2Local|central +RUN mill benchmark.assembly + +EXPOSE 8080 + +CMD java -server \ + -Dcc.otavia.actor.worker.size=24 -Dcc.otavia.nio.worker.size=48 \ + -jar \ + out/benchmark/assembly.dest/out.jar \ + jdbc:postgresql://tfb-database:5432/hello_world \ + benchmarkdbuser benchmarkdbpass 72 From b05b4333d3aa9e334bee36d43e009916a7b107fb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Sat, 3 Aug 2024 20:51:35 +0200 Subject: [PATCH 0740/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 14 +++++++------- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../hexagon/hexagon-helidon-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-helidon.dockerfile | 4 ++-- .../hexagon/hexagon-jettyloom-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-jettyloom.dockerfile | 4 ++-- .../hexagon/hexagon-nettyepoll-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 4 ++-- frameworks/Kotlin/hexagon/hexagon.dockerfile | 4 ++-- .../src/main/kotlin/WebListenerServer.kt | 5 +++-- 11 files changed, 27 insertions(+), 26 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 9279d3b38fd..a4d141e5c2a 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.23" apply false - id "org.graalvm.buildtools.native" version "0.10.1" apply false + id "org.jetbrains.kotlin.jvm" version "2.0.20-RC" apply false + id "org.graalvm.buildtools.native" version "0.10.2" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.5.1" - jettyVersion = "12.0.7" - nettyVersion = "4.1.107.Final" + hexagonVersion = "3.6.1" + jettyVersion = "12.0.12" + nettyVersion = "4.1.112.Final" hikariVersion = "5.1.0" postgresqlVersion = "42.7.3" - vertxVersion = "4.5.5" + vertxVersion = "4.5.9" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.6" + gradleVersion = "8.9" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index a80b22ce5cf..09523c0e549 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.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index d87e78307b0..3b3a1602f55 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 913a9459a06..271fa95dbf8 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 90d51b0b30b..d6c37bcd77f 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_jetty_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 93b0e22a963..07bf482b28e 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index ba9b55020b9..972347f053b 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_nettyepoll_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index a7c28730e03..393f73f62a6 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_nettyepoll_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index abd537c0dd3..32e153cbc0a 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test war # # RUNTIME # -FROM docker.io/tomcat:10-jre21-temurin-jammy +FROM docker.io/tomcat:11.0.0-jre21-temurin-noble ARG MODULE=/hexagon/hexagon_tomcat_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index a8eec2e6809..59f89e5cb5c 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt index 69fe6d13ba6..c7d7ea4449c 100644 --- a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt @@ -6,6 +6,7 @@ import com.hexagonkt.http.model.Header import com.hexagonkt.http.model.Headers import com.hexagonkt.http.handlers.HttpHandler import com.hexagonkt.http.handlers.OnHandler +import com.hexagonkt.http.handlers.PathHandler import com.hexagonkt.http.server.servlet.ServletServer import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.templates.jte.JteAdapter @@ -18,7 +19,7 @@ import jakarta.servlet.annotation.WebListener private companion object { val headers = Headers(Header("server", "Tomcat")) - fun createHandlers(settings: Settings): List { + fun createHandlers(settings: Settings): HttpHandler { val store = BenchmarkSqlStore("postgresql") val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") @@ -28,7 +29,7 @@ import jakarta.servlet.annotation.WebListener send(headers = headers) } - return listOf(serverHeaderHandler, controllerPath) + return PathHandler(serverHeaderHandler, controllerPath) } } } From c4443eb4b04a63f6010d51d411dfe286a301dc81 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Thu, 8 Aug 2024 22:04:37 +0200 Subject: [PATCH 0741/1766] Update to jsonsergen 0.0.5 with the JsonDsl backend (#9190) --- frameworks/Java/vertx/pom.xml | 8 ++++---- .../Java/vertx/src/main/java/vertx/model/CachedWorld.java | 3 ++- .../Java/vertx/src/main/java/vertx/model/Message.java | 3 ++- .../Java/vertx/src/main/java/vertx/model/World.java | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 12eff9d69a5..06199d308db 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -28,14 +28,14 @@ ${stack.version} - com.fasterxml.jackson.core - jackson-core - ${jackson.version} + com.dslplatform + dsl-json + 2.0.2 com.julienviet jsonsergen - 0.0.4 + 0.0.5 io.netty diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java b/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java index 423d5273f62..3a55bfc2e89 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/CachedWorld.java @@ -1,5 +1,6 @@ package vertx.model; +import com.julienviet.jsonsergen.Backend; import com.julienviet.jsonsergen.JsonSerGen; import io.vertx.codegen.annotations.DataObject; import io.vertx.core.buffer.Buffer; @@ -10,7 +11,7 @@ * The model for the "world" database table. */ @DataObject -@JsonSerGen +@JsonSerGen(backends = Backend.DSL_JSON) public final class CachedWorld implements Comparable { private final int id; diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/Message.java b/frameworks/Java/vertx/src/main/java/vertx/model/Message.java index ce240bd5ae9..ab9cd2a3d48 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/Message.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/Message.java @@ -1,11 +1,12 @@ package vertx.model; +import com.julienviet.jsonsergen.Backend; import com.julienviet.jsonsergen.JsonSerGen; import io.vertx.codegen.annotations.DataObject; import io.vertx.core.buffer.Buffer; @DataObject -@JsonSerGen +@JsonSerGen(backends = Backend.DSL_JSON) public class Message { private String message; diff --git a/frameworks/Java/vertx/src/main/java/vertx/model/World.java b/frameworks/Java/vertx/src/main/java/vertx/model/World.java index 43f7bfc2a61..610f4371cab 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/model/World.java +++ b/frameworks/Java/vertx/src/main/java/vertx/model/World.java @@ -1,5 +1,6 @@ package vertx.model; +import com.julienviet.jsonsergen.Backend; import com.julienviet.jsonsergen.JsonSerGen; import io.vertx.codegen.annotations.DataObject; import io.vertx.core.buffer.Buffer; @@ -8,7 +9,7 @@ * The model for the "world" database table. */ @DataObject -@JsonSerGen +@JsonSerGen(backends = Backend.DSL_JSON) public final class World implements Comparable { private final int id; From 8d801c857067756c18f7ecec8da58e98ff5e97bd Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Thu, 8 Aug 2024 22:04:53 +0200 Subject: [PATCH 0742/1766] [Kotlin/Hexagon] Update Hexagon and dependencies' versions (#9191) * 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 * 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 +++++++------- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../hexagon/hexagon-helidon-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-helidon.dockerfile | 4 ++-- .../hexagon/hexagon-jettyloom-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-jettyloom.dockerfile | 4 ++-- .../hexagon/hexagon-nettyepoll-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-nettyepoll.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 4 ++-- frameworks/Kotlin/hexagon/hexagon.dockerfile | 4 ++-- .../src/main/kotlin/WebListenerServer.kt | 5 +++-- 11 files changed, 27 insertions(+), 26 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 9279d3b38fd..a4d141e5c2a 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.23" apply false - id "org.graalvm.buildtools.native" version "0.10.1" apply false + id "org.jetbrains.kotlin.jvm" version "2.0.20-RC" apply false + id "org.graalvm.buildtools.native" version "0.10.2" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.5.1" - jettyVersion = "12.0.7" - nettyVersion = "4.1.107.Final" + hexagonVersion = "3.6.1" + jettyVersion = "12.0.12" + nettyVersion = "4.1.112.Final" hikariVersion = "5.1.0" postgresqlVersion = "42.7.3" - vertxVersion = "4.5.5" + vertxVersion = "4.5.9" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.6" + gradleVersion = "8.9" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index a80b22ce5cf..09523c0e549 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.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index d87e78307b0..3b3a1602f55 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 913a9459a06..271fa95dbf8 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 90d51b0b30b..d6c37bcd77f 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_jetty_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 93b0e22a963..07bf482b28e 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index ba9b55020b9..972347f053b 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_nettyepoll_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index a7c28730e03..393f73f62a6 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_nettyepoll_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index abd537c0dd3..32e153cbc0a 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.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test war # # RUNTIME # -FROM docker.io/tomcat:10-jre21-temurin-jammy +FROM docker.io/tomcat:11.0.0-jre21-temurin-noble ARG MODULE=/hexagon/hexagon_tomcat_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index a8eec2e6809..59f89e5cb5c 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.6-jdk21-alpine AS build +FROM docker.io/gradle:8.9-jdk21-alpine AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN gradle --quiet -x test installDist # # RUNTIME # -FROM docker.io/eclipse-temurin:21-jre-alpine +FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt index 69fe6d13ba6..c7d7ea4449c 100644 --- a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt @@ -6,6 +6,7 @@ import com.hexagonkt.http.model.Header import com.hexagonkt.http.model.Headers import com.hexagonkt.http.handlers.HttpHandler import com.hexagonkt.http.handlers.OnHandler +import com.hexagonkt.http.handlers.PathHandler import com.hexagonkt.http.server.servlet.ServletServer import com.hexagonkt.store.BenchmarkSqlStore import com.hexagonkt.templates.jte.JteAdapter @@ -18,7 +19,7 @@ import jakarta.servlet.annotation.WebListener private companion object { val headers = Headers(Header("server", "Tomcat")) - fun createHandlers(settings: Settings): List { + fun createHandlers(settings: Settings): HttpHandler { val store = BenchmarkSqlStore("postgresql") val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") @@ -28,7 +29,7 @@ import jakarta.servlet.annotation.WebListener send(headers = headers) } - return listOf(serverHeaderHandler, controllerPath) + return PathHandler(serverHeaderHandler, controllerPath) } } } From ee5d2b2b8574bbe6c805863d1e09367a8927353d Mon Sep 17 00:00:00 2001 From: Andrew McCloskey Date: Thu, 8 Aug 2024 16:05:05 -0400 Subject: [PATCH 0743/1766] vertx-web-kotlin-dsljson updates (#9192) * minor performance improvements and warning suppression * vertx-web-kotlin-dsljson updates * formatting * update postgres socket connection config --- .../configuration/scripts/server.sh | 12 ++++++------ .../src/main/kotlin/com/example/starter/App.kt | 8 ++++---- .../com/example/starter/PostgresVerticle.kt | 15 ++++----------- .../com/example/starter/db/AbstractRepository.kt | 2 +- .../com/example/starter/db/FortuneRepository.kt | 4 ++-- .../com/example/starter/db/WorldRepository.kt | 10 +++++----- .../com/example/starter/utils/JsonExtensions.kt | 2 +- .../example/starter/utils/PeriodicDateResolver.kt | 7 +++++-- .../com/example/starter/utils/RowSetExtensions.kt | 3 ++- .../example/starter/utils/ThrowableExtensions.kt | 12 ++++++++---- .../src/main/resources/pg-connect-options.json | 5 +---- ...vertx-web-kotlin-dsljson-postgresql.dockerfile | 4 +++- .../vertx-web-kotlin-dsljson.dockerfile | 4 +++- 13 files changed, 45 insertions(+), 43 deletions(-) diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh b/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh index 80e05662a59..a5b03908062 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh @@ -1,16 +1,17 @@ #!/bin/bash -NUM_PROCESSORS=$((`grep --count ^processor /proc/cpuinfo`)) - JVM_OPTS="-server \ -Xms2G \ -Xmx2G \ + -XX:+AlwaysPreTouch \ -XX:+UseParallelGC \ + -XX:+PreserveFramePointer \ + -XX:+EnableDynamicAgentLoading \ -XX:InitialCodeCacheSize=512m \ -XX:ReservedCodeCacheSize=512m \ -XX:MaxInlineLevel=20 \ - -XX:+AlwaysPreTouch \ -XX:+UseNUMA \ + -Djava.lang.Integer.IntegerCache.high=10000 \ -Dvertx.disableMetrics=true \ -Dvertx.disableH2c=true \ -Dvertx.disableWebsockets=true \ @@ -19,6 +20,7 @@ JVM_OPTS="-server \ -Dvertx.disableContextTimings=true \ -Dvertx.disableTCCL=true \ -Dvertx.disableHttpHeadersValidation=true \ + -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ @@ -26,8 +28,6 @@ JVM_OPTS="-server \ JAR_PATH="./build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar" -VERTX_ARGS="-instances 1" - cleanup() { echo "Caught SIGINT signal. Stopping the Java program..." if [ ! -z "$JAVA_PID" ]; then @@ -39,7 +39,7 @@ cleanup() { trap cleanup SIGINT -java $JVM_OPTS -jar $JAR_PATH $VERTX_ARGS & +java $JVM_OPTS -jar $JAR_PATH & JAVA_PID=$! echo "Server PID: $JAVA_PID" diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt index 03fb0ca2c04..ee66a635231 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt @@ -3,7 +3,6 @@ package com.example.starter import com.example.starter.utils.PeriodicDateResolver import com.example.starter.utils.block import io.vertx.core.Vertx -import io.vertx.core.impl.cpu.CpuCoreSensor import io.vertx.kotlin.core.deploymentOptionsOf import io.vertx.kotlin.core.vertxOptionsOf import kotlin.time.Duration.Companion.seconds @@ -14,11 +13,12 @@ object App : Logging { @JvmStatic fun main(args: Array?) { - val numCores = CpuCoreSensor.availableProcessors() + val eventLoopPoolSize = System.getProperty("vertx.eventLoopPoolSize")?.toInt() + ?: Runtime.getRuntime().availableProcessors() val vertx = Vertx.vertx( vertxOptionsOf( - eventLoopPoolSize = numCores, + eventLoopPoolSize = eventLoopPoolSize, preferNativeTransport = true, ) ) @@ -41,7 +41,7 @@ object App : Logging { vertx.deployVerticle( { if (hasDb) PostgresVerticle() else BasicVerticle() }, deploymentOptionsOf( - instances = numCores, + instances = eventLoopPoolSize, ) ) diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt index 43cba217ec0..4caa057b488 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt @@ -5,10 +5,8 @@ import com.example.starter.db.WorldRepository import com.example.starter.handlers.FortuneHandler import com.example.starter.handlers.WorldHandler import com.example.starter.io.JsonResource -import com.example.starter.utils.array import com.example.starter.utils.isConnectionReset import io.vertx.core.AbstractVerticle -import io.vertx.core.Future import io.vertx.core.Promise import io.vertx.core.http.HttpServerOptions import io.vertx.ext.web.Router @@ -18,15 +16,10 @@ import org.apache.logging.log4j.kotlin.Logging class PostgresVerticle : AbstractVerticle() { override fun start(startPromise: Promise) { - Future.all( - PgConnection.connect(vertx, PG_CONNECT_OPTIONS), - PgConnection.connect(vertx, PG_CONNECT_OPTIONS), - ) - .onSuccess { cf -> - val pool = cf.array() - - val fortuneHandler = FortuneHandler(FortuneRepository(pool)) - val worldHandler = WorldHandler(WorldRepository(pool)) + PgConnection.connect(vertx, PG_CONNECT_OPTIONS) + .onSuccess { conn -> + val fortuneHandler = FortuneHandler(FortuneRepository(conn)) + val worldHandler = WorldHandler(WorldRepository(conn)) val router = Router.router(vertx) diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt index df665df0769..f2dec9a5f84 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/AbstractRepository.kt @@ -3,5 +3,5 @@ package com.example.starter.db import io.vertx.pgclient.PgConnection abstract class AbstractRepository( - protected val pool: Array + protected val conn: PgConnection ) \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt index 3bb95576a4d..b9e4b9ab784 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt @@ -7,8 +7,8 @@ import io.vertx.core.Future import io.vertx.pgclient.PgConnection import io.vertx.sqlclient.Row -class FortuneRepository(pool: Array) : AbstractRepository(pool) { - private val selectFortuneQuery = this.pool[0].preparedQuery(SELECT_FORTUNE_SQL) +class FortuneRepository(conn: PgConnection) : AbstractRepository(conn) { + private val selectFortuneQuery = this.conn.preparedQuery(SELECT_FORTUNE_SQL) fun selectFortunes(): Future> = selectFortuneQuery .execute() diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt index 734b486547a..74823141453 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt @@ -13,10 +13,10 @@ import io.vertx.sqlclient.impl.SqlClientInternal import java.util.concurrent.ThreadLocalRandom import java.util.concurrent.atomic.AtomicInteger -@Suppress("NOTHING_TO_INLINE") -class WorldRepository(pool: Array) : AbstractRepository(pool) { - private val selectWorldQuery = this.pool[0].preparedQuery(SELECT_WORLD_SQL) - private val updateWorldQueries = generateQueries(this.pool[1]) +@Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST") +class WorldRepository(conn: PgConnection) : AbstractRepository(conn) { + private val selectWorldQuery = this.conn.preparedQuery(SELECT_WORLD_SQL) + private val updateWorldQueries = generateQueries(this.conn) fun selectRandomWorld(): Future = selectWorldQuery .execute(Tuple.of(randomWorld())) @@ -26,7 +26,7 @@ class WorldRepository(pool: Array) : AbstractRepository(poo val promise = Promise.promise>() val arr = arrayOfNulls(numWorlds) val count = AtomicInteger(0) - (this.pool[0] as SqlClientInternal).group { c -> + (this.conn as SqlClientInternal).group { c -> repeat(numWorlds) { c.preparedQuery(SELECT_WORLD_SQL).execute(Tuple.of(randomWorld())) { ar -> val index = count.getAndIncrement() diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt index 87c965ca9b7..264be5a7323 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt @@ -16,4 +16,4 @@ inline fun T.serialize(initialSizeHint: Int = 0): Buffer { val output = BufferOutputStream(initialSizeHint) DSL_JSON.serialize(this, output) return output -} \ No newline at end of file +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt index 2e29e784914..23786587569 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt @@ -1,16 +1,19 @@ package com.example.starter.utils import io.vertx.core.Vertx +import io.vertx.core.http.HttpHeaders import java.time.ZonedDateTime import java.time.format.DateTimeFormatter object PeriodicDateResolver { - var current: String = next() + var current: CharSequence = next() fun init(vertx: Vertx) { vertx.setPeriodic(1000L) { current = next() } } @Suppress("NOTHING_TO_INLINE") - private inline fun next(): String = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()) + private inline fun next(): CharSequence = HttpHeaders.createOptimized( + DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()) + ) } \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt index c968777ff77..3959ba8d9a0 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt @@ -5,10 +5,11 @@ import io.vertx.sqlclient.RowSet // This extension relies on the assumption the mapper never returns null, as it is defined. Otherwise, // we prevent the overhead from having to do another iteration over the loop for a `filterNotNull` check. +@Suppress("UNCHECKED_CAST") inline fun RowSet.mapToArray(mapper: (Row) -> U): Array { val arr = arrayOfNulls(this.size()) val iterator = this.iterator() var index = 0 while (iterator.hasNext()) arr[index++] = mapper(iterator.next()) return arr as Array -} \ No newline at end of file +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt index 044d24b06ab..00cf1463297 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt @@ -6,7 +6,11 @@ import java.net.SocketException const val CONNECTION_RESET_MESSAGE = "Connection reset" -fun Throwable.isConnectionReset(): Boolean { - return (this is NativeIoException && this.expectedErr() == Errors.ERRNO_ECONNRESET_NEGATIVE) - || (this is SocketException && this.message == CONNECTION_RESET_MESSAGE) -} \ No newline at end of file +@Suppress("NOTHING_TO_INLINE") +inline fun Throwable.isConnectionReset(): Boolean { + return when { + this is NativeIoException && this.expectedErr() == Errors.ERRNO_ECONNRESET_NEGATIVE -> true + this is SocketException && this.message == CONNECTION_RESET_MESSAGE -> true + else -> false + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json index a145a0a51c5..3cf43317687 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json @@ -5,10 +5,7 @@ "port": 5432, "database": "hello_world", "cachePreparedStatements": true, - "preparedStatementCacheMaxSize": 512, - "preparedStatementCacheSqlLimit": 2048, - "tcpKeepAlive": true, - "tcpFastOpen": true, + "preparedStatementCacheMaxSize": 1024, "pipeliningLimit": 100000, "receiveBufferSize": 262144, "sendBufferSize": 262144 diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile index 0ef28c410d9..50152d8df30 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile @@ -17,10 +17,11 @@ CMD java \ -Xmx2G \ -XX:+AlwaysPreTouch \ -XX:+UseParallelGC \ - -XX:InitialCodeCacheSize=512m \ + -XX:InitialCodeCacheSize=512m \ -XX:ReservedCodeCacheSize=512m \ -XX:MaxInlineLevel=20 \ -XX:+UseNUMA \ + -Djava.lang.Integer.IntegerCache.high=10000 \ -Dvertx.disableMetrics=true \ -Dvertx.disableH2c=true \ -Dvertx.disableWebsockets=true \ @@ -29,6 +30,7 @@ CMD java \ -Dvertx.disableContextTimings=true \ -Dvertx.disableTCCL=true \ -Dvertx.disableHttpHeadersValidation=true \ + -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile index a4a1c142cf5..568f19f79dd 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile @@ -17,10 +17,11 @@ CMD java \ -Xmx2G \ -XX:+AlwaysPreTouch \ -XX:+UseParallelGC \ - -XX:InitialCodeCacheSize=512m \ + -XX:InitialCodeCacheSize=512m \ -XX:ReservedCodeCacheSize=512m \ -XX:MaxInlineLevel=20 \ -XX:+UseNUMA \ + -Djava.lang.Integer.IntegerCache.high=10000 \ -Dvertx.disableMetrics=true \ -Dvertx.disableH2c=true \ -Dvertx.disableWebsockets=true \ @@ -29,6 +30,7 @@ CMD java \ -Dvertx.disableContextTimings=true \ -Dvertx.disableTCCL=true \ -Dvertx.disableHttpHeadersValidation=true \ + -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ From 2e05f43beb2bdbf2dffa80b0bfadb584e21793a9 Mon Sep 17 00:00:00 2001 From: Francesco Iapicca Date: Thu, 8 Aug 2024 23:06:20 +0300 Subject: [PATCH 0744/1766] Add Dart 3 example (#9197) * port dart2 implementation * somehow stable version of dart in docker is not 3.5.0 yet, reverting pubspec and dockerfile * general code clean up * update dockerfile * update server binding * change InternetAddress in binging to string * re-bump to dart 3.5 * fix error in server.dart * rename Containerfile as dart3.dockerfile --------- Co-authored-by: Francesco Iapicca --- frameworks/Dart/dart3/.dockerignore | 9 +++ frameworks/Dart/dart3/.gitignore | 5 ++ frameworks/Dart/dart3/README.md | 22 +++++ frameworks/Dart/dart3/analysis_options.yaml | 1 + frameworks/Dart/dart3/benchmark_config.json | 26 ++++++ frameworks/Dart/dart3/bin/server.dart | 89 +++++++++++++++++++++ frameworks/Dart/dart3/dart3.dockerfile | 14 ++++ frameworks/Dart/dart3/pubspec.yaml | 7 ++ 8 files changed, 173 insertions(+) create mode 100644 frameworks/Dart/dart3/.dockerignore create mode 100644 frameworks/Dart/dart3/.gitignore create mode 100644 frameworks/Dart/dart3/README.md create mode 100644 frameworks/Dart/dart3/analysis_options.yaml create mode 100644 frameworks/Dart/dart3/benchmark_config.json create mode 100755 frameworks/Dart/dart3/bin/server.dart create mode 100644 frameworks/Dart/dart3/dart3.dockerfile create mode 100644 frameworks/Dart/dart3/pubspec.yaml diff --git a/frameworks/Dart/dart3/.dockerignore b/frameworks/Dart/dart3/.dockerignore new file mode 100644 index 00000000000..6a6cc8727a7 --- /dev/null +++ b/frameworks/Dart/dart3/.dockerignore @@ -0,0 +1,9 @@ +# From https://hub.docker.com/_/dart +.dockerignore +Dockerfile +build/ +.dart_tool/ +.git/ +.github/ +.gitignore +.packages diff --git a/frameworks/Dart/dart3/.gitignore b/frameworks/Dart/dart3/.gitignore new file mode 100644 index 00000000000..8ac40f21809 --- /dev/null +++ b/frameworks/Dart/dart3/.gitignore @@ -0,0 +1,5 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ +*.lock +!bin \ No newline at end of file diff --git a/frameworks/Dart/dart3/README.md b/frameworks/Dart/dart3/README.md new file mode 100644 index 00000000000..7152e705637 --- /dev/null +++ b/frameworks/Dart/dart3/README.md @@ -0,0 +1,22 @@ +# Dart 3 Benchmarking Test + +### Test Type Implementation Source Code + +- [JSON](server.dart) +- [PLAINTEXT](server.dart) + +## Important Libraries + +The tests were run with: + +- [Dart v3.4.4](https://dart.dev/) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Dart/dart3/analysis_options.yaml b/frameworks/Dart/dart3/analysis_options.yaml new file mode 100644 index 00000000000..572dd239d09 --- /dev/null +++ b/frameworks/Dart/dart3/analysis_options.yaml @@ -0,0 +1 @@ +include: package:lints/recommended.yaml diff --git a/frameworks/Dart/dart3/benchmark_config.json b/frameworks/Dart/dart3/benchmark_config.json new file mode 100644 index 00000000000..059fb368d0e --- /dev/null +++ b/frameworks/Dart/dart3/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "dart3", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Stripped", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Dart", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "dart3", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Dart/dart3/bin/server.dart b/frameworks/Dart/dart3/bin/server.dart new file mode 100755 index 00000000000..f2b98dcd197 --- /dev/null +++ b/frameworks/Dart/dart3/bin/server.dart @@ -0,0 +1,89 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:isolate'; + +final _encoder = JsonUtf8Encoder(); + +void main(List _) async { + /// Create an [Isolate] containinig an [HttpServer] + /// for each processor after the first + for (var i = 1; i < Platform.numberOfProcessors; i++) { + await Isolate.spawn(_startServer, _); + } + + /// Create a [HttpServer] for the first processor + await _startServer(_); +} + +/// Creates and setup a [HttpServer] +Future _startServer(List _) async { + /// Binds the [HttpServer] on `0.0.0.0:8080`. + final server = await HttpServer.bind( + InternetAddress('0.0.0.0', type: InternetAddressType.IPv4), + 8080, + shared: true, + ); + + /// Sets [HttpServer]'s [serverHeader]. + server + ..defaultResponseHeaders.clear() + ..serverHeader = 'dart'; + + /// Handles [HttpRequest]'s from [HttpServer]. + await for (final request in server) { + switch (request.uri.path) { + case '/json': + _jsonTest(request); + break; + case '/plaintext': + _plaintextTest(request); + break; + default: + _sendResponse(request, HttpStatus.notFound); + } + } +} + +/// Completes the given [request] by writing the [bytes] with the given +/// [statusCode] and [type]. +void _sendResponse( + HttpRequest request, + int statusCode, { + ContentType? type, + List bytes = const [], +}) => + request.response + ..statusCode = statusCode + ..headers.contentType = type + ..headers.date = DateTime.now() + ..contentLength = bytes.length + ..add(bytes) + ..close(); + +/// Completes the given [request] by writing the [response] as JSON. +void _sendJson(HttpRequest request, Object response) => _sendResponse( + request, + HttpStatus.ok, + type: ContentType.json, + bytes: _encoder.convert(response), + ); + +/// Completes the given [request] by writing the [response] as plain text. +void _sendText(HttpRequest request, String response) => _sendResponse( + request, + HttpStatus.ok, + type: ContentType.text, + bytes: utf8.encode(response), + ); + +/// Responds with the JSON test to the [request]. +void _jsonTest(HttpRequest request) => _sendJson( + request, + const {'message': 'Hello, World!'}, + ); + +/// Responds with the plaintext test to the [request]. +void _plaintextTest(HttpRequest request) => _sendText( + request, + 'Hello, World!', + ); diff --git a/frameworks/Dart/dart3/dart3.dockerfile b/frameworks/Dart/dart3/dart3.dockerfile new file mode 100644 index 00000000000..7e6e9053968 --- /dev/null +++ b/frameworks/Dart/dart3/dart3.dockerfile @@ -0,0 +1,14 @@ + +FROM dart:3.5 AS builder + +COPY . /app +WORKDIR /app +RUN mkdir build +RUN dart compile exe ./bin/server.dart -o build/server + +FROM scratch +COPY --from=builder /runtime/ / +COPY --from=builder /app/build /bin + +EXPOSE 8080 +CMD ["server"] \ No newline at end of file diff --git a/frameworks/Dart/dart3/pubspec.yaml b/frameworks/Dart/dart3/pubspec.yaml new file mode 100644 index 00000000000..2b351720c9b --- /dev/null +++ b/frameworks/Dart/dart3/pubspec.yaml @@ -0,0 +1,7 @@ +name: dartbenchmark +description: A benchmark of dart +environment: + sdk: '>=3.5.0 <4.0.0' + +dev_dependencies: + lints: ^4.0.0 From 3d5d29ef7d557a2cb5e843a97c610bff0e96b9f2 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 8 Aug 2024 22:06:31 +0200 Subject: [PATCH 0745/1766] [php] Laravel update to v 11 (#9200) * Update Laravel to v 11 * Update and clean dockerfiles * Fix pecl * Update dockerfile and remove extra composer.json * Clean dockerfile --- frameworks/PHP/laravel/composer.json | 2 +- frameworks/PHP/laravel/deploy/conf/php.ini | 2 +- .../laravel/deploy/workerman/composer.json | 58 ------------------- .../PHP/laravel/laravel-laravel-s.dockerfile | 6 +- .../laravel-octane-frankenphp.dockerfile | 26 ++++----- .../PHP/laravel/laravel-roadrunner.dockerfile | 6 +- .../PHP/laravel/laravel-swoole.dockerfile | 6 +- .../PHP/laravel/laravel-workerman.dockerfile | 24 ++++---- frameworks/PHP/laravel/laravel.dockerfile | 21 +++---- 9 files changed, 54 insertions(+), 97 deletions(-) delete mode 100644 frameworks/PHP/laravel/deploy/workerman/composer.json diff --git a/frameworks/PHP/laravel/composer.json b/frameworks/PHP/laravel/composer.json index 094026428e5..f25952eccea 100644 --- a/frameworks/PHP/laravel/composer.json +++ b/frameworks/PHP/laravel/composer.json @@ -8,7 +8,7 @@ ], "license": "MIT", "require": { - "laravel/framework": "^10" + "laravel/framework": "^11" }, "config": { "optimize-autoloader": true, diff --git a/frameworks/PHP/laravel/deploy/conf/php.ini b/frameworks/PHP/laravel/deploy/conf/php.ini index 82133535145..98e34225e0d 100644 --- a/frameworks/PHP/laravel/deploy/conf/php.ini +++ b/frameworks/PHP/laravel/deploy/conf/php.ini @@ -1767,7 +1767,7 @@ ldap.max_links = -1 opcache.enable=1 ; Determines if Zend OPCache is enabled for the CLI version of PHP -;opcache.enable_cli=0 +opcache.enable_cli=1 ; The OPcache shared memory storage size. ;opcache.memory_consumption=128 diff --git a/frameworks/PHP/laravel/deploy/workerman/composer.json b/frameworks/PHP/laravel/deploy/workerman/composer.json deleted file mode 100644 index 343ff8fcf3c..00000000000 --- a/frameworks/PHP/laravel/deploy/workerman/composer.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "laravel/laravel", - "type": "project", - "description": "The Laravel Framework.", - "keywords": [ - "framework", - "laravel" - ], - "license": "MIT", - "require": { - "php": "^8.0", - "laravel/framework": "^8.0", - "joanhey/adapterman": "^0.6" - }, - "require-dev": { - "facade/ignition": "^2.3.6", - "fzaninotto/faker": "^1.9.1", - "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^5.0", - "phpunit/phpunit": "^9.3" - }, - "config": { - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true - }, - "extra": { - "laravel": { - "dont-discover": [] - } - }, - "autoload": { - "psr-4": { - "App\\": "app/" - } - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } - }, - "minimum-stability": "dev", - "prefer-stable": true, - "scripts": { - "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", - "@php artisan package:discover --ansi" - ], - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ], - "post-create-project-cmd": [ - "@php artisan key:generate --ansi" - ] - } -} - - diff --git a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile index a0e946e5097..c353ef28b4f 100644 --- a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile +++ b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile @@ -9,7 +9,11 @@ RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php- WORKDIR /laravel COPY --link . . -RUN mkdir -p /laravel/bootstrap/cache /laravel/storage/logs /laravel/storage/framework/sessions /laravel/storage/framework/views /laravel/storage/framework/cache +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache COPY --link deploy/laravel-s/composer.json . diff --git a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile index 1829a4292f4..2ad30a612e3 100644 --- a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile +++ b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile @@ -1,25 +1,25 @@ FROM dunglas/frankenphp RUN install-php-extensions \ - pcntl \ + intl \ + opcache \ + pcntl \ pdo_mysql \ - intl \ - zip \ - opcache > /dev/null + zip > /dev/null -COPY . /app +COPY --link . /app/ -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer +COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer -RUN mkdir -p /app/bootstrap/cache /app/storage/logs /app/storage/framework/sessions /app/storage/framework/views /app/storage/framework/cache -RUN chmod -R 777 /app +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache -COPY deploy/conf/php.ini /usr/local/etc/php - -RUN composer require laravel/octane guzzlehttp/guzzle - -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY --link deploy/conf/php.ini /usr/local/etc/php +RUN composer require laravel/octane guzzlehttp/guzzle --update-no-dev --no-scripts --quiet RUN php artisan optimize RUN frankenphp -v diff --git a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile index d5d42d62879..33c7067c7b0 100644 --- a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile +++ b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile @@ -9,7 +9,11 @@ RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opca WORKDIR /laravel COPY --link . . -RUN mkdir -p /laravel/bootstrap/cache /laravel/storage/logs /laravel/storage/framework/sessions /laravel/storage/framework/views /laravel/storage/framework/cache +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache RUN apt-get update > /dev/null && \ apt-get install -yqq curl unzip > /dev/null diff --git a/frameworks/PHP/laravel/laravel-swoole.dockerfile b/frameworks/PHP/laravel/laravel-swoole.dockerfile index 3882a7ac4c8..52308a4dd5e 100644 --- a/frameworks/PHP/laravel/laravel-swoole.dockerfile +++ b/frameworks/PHP/laravel/laravel-swoole.dockerfile @@ -9,7 +9,11 @@ RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php- WORKDIR /laravel COPY --link . . -RUN mkdir -p /laravel/bootstrap/cache /laravel/storage/framework/sessions /laravel/storage/framework/views /laravel/storage/framework/cache +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache COPY --link deploy/swoole/composer.json . diff --git a/frameworks/PHP/laravel/laravel-workerman.dockerfile b/frameworks/PHP/laravel/laravel-workerman.dockerfile index 48cf4ee5e42..34ee2de30a5 100644 --- a/frameworks/PHP/laravel/laravel-workerman.dockerfile +++ b/frameworks/PHP/laravel/laravel-workerman.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -9,23 +9,25 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get install -yqq git unzip \ 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 +COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -ADD ./ /laravel WORKDIR /laravel +COPY --link . . -EXPOSE 8080 - -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 +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache -COPY deploy/workerman/composer.json ./ -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer require joanhey/adapterman --update-no-dev --no-scripts --quiet RUN php artisan optimize -COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini + +EXPOSE 8080 -CMD php server-man.php start +ENTRYPOINT [ "php", "server-man.php", "start" ] diff --git a/frameworks/PHP/laravel/laravel.dockerfile b/frameworks/PHP/laravel/laravel.dockerfile index c1858216a66..455d2e6d60f 100644 --- a/frameworks/PHP/laravel/laravel.dockerfile +++ b/frameworks/PHP/laravel/laravel.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,19 +7,21 @@ 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.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-dev > /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 --from=composer --link /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ - -ADD ./ /laravel +COPY --link deploy/conf/* /etc/php/8.3/fpm/ WORKDIR /laravel +COPY --link . . 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 +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN php artisan optimize @@ -29,6 +31,5 @@ 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.3/fpm/php-fpm.conf -RUN mkdir -p /run/php -CMD /usr/sbin/php-fpm8.3 --fpm-config /etc/php/8.3/fpm/php-fpm.conf && \ +CMD service php8.3-fpm start && \ nginx -c /laravel/deploy/nginx.conf From 4408f2eade47d7fee8e00a69544a1b3a35d54251 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 8 Aug 2024 22:06:41 +0200 Subject: [PATCH 0746/1766] [php] Lumen update to v11 (#9199) * Update lumen to v11 * Update and clean dockerfiles --- frameworks/PHP/lumen/composer.json | 2 +- frameworks/PHP/lumen/lumen-laravel-s.dockerfile | 9 +++++++-- frameworks/PHP/lumen/lumen-swoole.dockerfile | 2 +- frameworks/PHP/lumen/lumen-workerman.dockerfile | 13 +++++++------ frameworks/PHP/lumen/lumen.dockerfile | 13 +++++++------ 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/frameworks/PHP/lumen/composer.json b/frameworks/PHP/lumen/composer.json index aaf2e3d44d1..2552d9450e3 100644 --- a/frameworks/PHP/lumen/composer.json +++ b/frameworks/PHP/lumen/composer.json @@ -5,7 +5,7 @@ "license": "MIT", "type": "project", "require": { - "laravel/lumen-framework": "^10" + "laravel/lumen-framework": "^11" }, "autoload": { "psr-4": { diff --git a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile index a2b4be68310..9c2df7afaef 100644 --- a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile +++ b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile @@ -7,9 +7,14 @@ RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opca #RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini WORKDIR /lumen -ADD --link . . +COPY --link . . + +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache -RUN mkdir -p /lumen/bootstrap/cache /lumen/storage/logs /lumen/storage/framework/sessions /lumen/storage/framework/views /lumen/storage/framework/cache RUN chmod -R 777 /lumen COPY deploy/laravel-s/composer.json ./ diff --git a/frameworks/PHP/lumen/lumen-swoole.dockerfile b/frameworks/PHP/lumen/lumen-swoole.dockerfile index de3d4294973..0f4f3434e37 100644 --- a/frameworks/PHP/lumen/lumen-swoole.dockerfile +++ b/frameworks/PHP/lumen/lumen-swoole.dockerfile @@ -3,7 +3,7 @@ FROM phpswoole/swoole:5.1.3-php8.3 RUN docker-php-ext-install pcntl opcache curl > /dev/null WORKDIR /lumen -ADD --link . . +COPY --link . . COPY --link deploy/swoole/php.ini /usr/local/etc/php/ diff --git a/frameworks/PHP/lumen/lumen-workerman.dockerfile b/frameworks/PHP/lumen/lumen-workerman.dockerfile index aabe520cdc8..decfe424411 100644 --- a/frameworks/PHP/lumen/lumen-workerman.dockerfile +++ b/frameworks/PHP/lumen/lumen-workerman.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -14,16 +14,17 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -ADD ./ /lumen WORKDIR /lumen +COPY --link . . + RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN composer require joanhey/adapterman:^0.6 --quiet -RUN mkdir -p /lumen/storage -RUN mkdir -p /lumen/storage/framework/sessions -RUN mkdir -p /lumen/storage/framework/views -RUN mkdir -p /lumen/storage/framework/cache +RUN mkdir -p storage \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache RUN chmod -R 777 /lumen diff --git a/frameworks/PHP/lumen/lumen.dockerfile b/frameworks/PHP/lumen/lumen.dockerfile index 1b5f8a76e62..9d11da427af 100644 --- a/frameworks/PHP/lumen/lumen.dockerfile +++ b/frameworks/PHP/lumen/lumen.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -13,17 +13,18 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer COPY deploy/conf/* /etc/php/8.3/fpm/ -ADD ./ /lumen WORKDIR /lumen +COPY --link . . + 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 mkdir -p /lumen/storage -RUN mkdir -p /lumen/storage/framework/sessions -RUN mkdir -p /lumen/storage/framework/views -RUN mkdir -p /lumen/storage/framework/cache +RUN mkdir -p storage \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache RUN chmod -R 777 /lumen From a74a2d21018caf2683fef8133fc69d4c97e94b16 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 8 Aug 2024 22:06:59 +0200 Subject: [PATCH 0747/1766] [ci skip] Silverlining change display name in prefork (#9195) --- frameworks/Go/silverlining/benchmark_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Go/silverlining/benchmark_config.json b/frameworks/Go/silverlining/benchmark_config.json index 368481b04cf..bd8544f9111 100644 --- a/frameworks/Go/silverlining/benchmark_config.json +++ b/frameworks/Go/silverlining/benchmark_config.json @@ -35,7 +35,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "silverlining", + "display_name": "silverlining [prefork]", "notes": "", "versus": "go" } From 1c0d617f696575caf080d12ed3014cc04b70d58e Mon Sep 17 00:00:00 2001 From: Rasmus Porsager Date: Thu, 8 Aug 2024 22:07:20 +0200 Subject: [PATCH 0748/1766] Send less with uWebSockets.js (#9194) * Send less * Fix method name * And on the right object --- frameworks/JavaScript/uwebsockets.js/src/server.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/JavaScript/uwebsockets.js/src/server.js b/frameworks/JavaScript/uwebsockets.js/src/server.js index 1db7d391f2a..0305347a2cf 100644 --- a/frameworks/JavaScript/uwebsockets.js/src/server.js +++ b/frameworks/JavaScript/uwebsockets.js/src/server.js @@ -16,8 +16,10 @@ if (DATABASE) db = await import(`./database/${DATABASE}.js`); const webserver = uWebSockets.App(); +uWebSockets._cfg('silent'); + webserver.get("/plaintext", new uWebSockets.DeclarativeResponse() - .writeHeader("Server", "uWebSockets.js") + .writeHeader("Server", "uWS") .writeHeader("Content-Type", "text/plain") .end("Hello, World!") ); @@ -90,7 +92,7 @@ if (db) { handleError(error, response); } }); - + const extra = { id: 0, message: "Additional fortune added at request time." }; webserver.get("/fortunes", async (response) => { From 5e66b478e6f10208e10eaead87632d8eb1913f21 Mon Sep 17 00:00:00 2001 From: Redkale Date: Fri, 9 Aug 2024 04:07:45 +0800 Subject: [PATCH 0749/1766] Update Redkale 2.9.0-SNAPSHOT (#9193) * Update Redkale 2.9.0-SNAPSHOT * Update Redkale 2.9.0-SNAPSHOT --- frameworks/Java/redkale/pom-jdbc.xml | 5 +- frameworks/Java/redkale/pom-vertx.xml | 5 +- frameworks/Java/redkale/pom.xml | 5 +- .../java/org/redkalex/benchmark/Message.java | 81 +++++++++---------- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/frameworks/Java/redkale/pom-jdbc.xml b/frameworks/Java/redkale/pom-jdbc.xml index 43ce0fa4e0f..93df4fb9464 100644 --- a/frameworks/Java/redkale/pom-jdbc.xml +++ b/frameworks/Java/redkale/pom-jdbc.xml @@ -7,7 +7,8 @@ org.redkale.boot.Application - 2.8.0-SNAPSHOT + 2.9.0-SNAPSHOT + 1.3.0-SNAPSHOT 42.6.0 UTF-8 18 @@ -85,7 +86,7 @@ org.redkale.maven.plugins redkale-maven-plugin - 1.2.0-SNAPSHOT + ${redkale-maven.version} --no-fallback diff --git a/frameworks/Java/redkale/pom-vertx.xml b/frameworks/Java/redkale/pom-vertx.xml index 9879cff1237..fc371f67798 100644 --- a/frameworks/Java/redkale/pom-vertx.xml +++ b/frameworks/Java/redkale/pom-vertx.xml @@ -7,7 +7,8 @@ org.redkale.boot.Application - 2.8.0-SNAPSHOT + 2.9.0-SNAPSHOT + 1.3.0-SNAPSHOT 4.5.0 2.1 UTF-8 @@ -92,7 +93,7 @@ org.redkale.maven.plugins redkale-maven-plugin - 1.2.0-SNAPSHOT + ${redkale-maven.version} --no-fallback diff --git a/frameworks/Java/redkale/pom.xml b/frameworks/Java/redkale/pom.xml index 8e6fa747ac0..78ffcbdd93b 100644 --- a/frameworks/Java/redkale/pom.xml +++ b/frameworks/Java/redkale/pom.xml @@ -7,7 +7,8 @@ org.redkale.boot.Application - 2.8.0-SNAPSHOT + 2.9.0-SNAPSHOT + 1.3.0-SNAPSHOT UTF-8 11 11 @@ -74,7 +75,7 @@ org.redkale.maven.plugins redkale-maven-plugin - 1.2.0-SNAPSHOT + ${redkale-maven.version} --no-fallback diff --git a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java index 73cbe2c2afd..00c529e9eee 100644 --- a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java +++ b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java @@ -1,41 +1,40 @@ -/* - * 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 org.redkale.annotation.Bean; -import org.redkale.convert.ConvertSmallString; -import org.redkale.convert.json.JsonConvert; - -/** - * - * @author zhangjx - */ -@Bean -public final class Message { - - @ConvertSmallString - private String message; - - public Message() { - } - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public String toString() { - return JsonConvert.root().convertTo(this); - } -} +/* + * 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 org.redkale.annotation.Serial; +import org.redkale.convert.ConvertSmallString; +import org.redkale.convert.json.JsonConvert; + +/** + * + * @author zhangjx + */ +@Serial +public final class Message { + + @ConvertSmallString + private String message; + + public Message() {} + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return JsonConvert.root().convertTo(this); + } +} From 48075478254408c7a210698b2f0953dd79a81253 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 18:17:14 +0000 Subject: [PATCH 0750/1766] Bump aiohttp from 3.9.4 to 3.10.2 in /frameworks/Python/api_hour Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.4 to 3.10.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.4...v3.10.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 81b923f4005..19dcab407ab 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.9.4 +aiohttp==3.10.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 e05436e96c606be703cd75e52b8c5c192e3f0d7b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 13 Aug 2024 21:43:37 +0200 Subject: [PATCH 0751/1766] [rails] Upgrade to Rails 7.2 (#9209) Update to latest release. - Remove YJIT initializer as YJIT is enabled by Rails by default. - Updated config with bin/rails app:update --- frameworks/Ruby/rails/.ruby-version | 2 +- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 170 +++++++++--------- frameworks/Ruby/rails/config/application.rb | 13 +- .../rails/config/environments/development.rb | 19 +- .../rails/config/environments/production.rb | 52 +++--- .../Ruby/rails/config/environments/test.rb | 24 ++- .../rails/config/initializers/enable_yjit.rb | 11 -- frameworks/Ruby/rails/config/puma.rb | 67 +++---- 9 files changed, 167 insertions(+), 193 deletions(-) delete mode 100644 frameworks/Ruby/rails/config/initializers/enable_yjit.rb diff --git a/frameworks/Ruby/rails/.ruby-version b/frameworks/Ruby/rails/.ruby-version index fd2a01863fd..15a27998172 100644 --- a/frameworks/Ruby/rails/.ruby-version +++ b/frameworks/Ruby/rails/.ruby-version @@ -1 +1 @@ -3.1.0 +3.3.0 diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 39eb973e700..8039ed09fd9 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -3,7 +3,7 @@ source 'https://rubygems.org' gem 'oj', '~> 3.16' gem 'pg', '~> 1.5', group: :postgresql gem 'puma', '~> 6.4' -gem 'rails', '~> 7.1.3' +gem 'rails', '~> 7.2.0' gem 'redis', '~> 5.0' gem 'trilogy', '~> 2.8.1', group: :mysql gem 'tzinfo-data' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 5c25771e659..dfa97091616 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,97 +1,94 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) + actioncable (7.2.0) + actionpack (= 7.2.0) + activesupport (= 7.2.0) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) - mail (>= 2.7.1) - net-imap - net-pop - net-smtp - actionmailer (7.1.3.4) - actionpack (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activesupport (= 7.1.3.4) - mail (~> 2.5, >= 2.5.4) - net-imap - net-pop - net-smtp + actionmailbox (7.2.0) + actionpack (= 7.2.0) + activejob (= 7.2.0) + activerecord (= 7.2.0) + activestorage (= 7.2.0) + activesupport (= 7.2.0) + mail (>= 2.8.0) + actionmailer (7.2.0) + actionpack (= 7.2.0) + actionview (= 7.2.0) + activejob (= 7.2.0) + activesupport (= 7.2.0) + mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.1.3.4) - actionview (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionpack (7.2.0) + actionview (= 7.2.0) + activesupport (= 7.2.0) nokogiri (>= 1.8.5) racc - rack (>= 2.2.4) + rack (>= 2.2.4, < 3.2) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.3.4) - actionpack (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + useragent (~> 0.16) + actiontext (7.2.0) + actionpack (= 7.2.0) + activerecord (= 7.2.0) + activestorage (= 7.2.0) + activesupport (= 7.2.0) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3.4) - activesupport (= 7.1.3.4) + actionview (7.2.0) + activesupport (= 7.2.0) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3.4) - activesupport (= 7.1.3.4) + activejob (7.2.0) + activesupport (= 7.2.0) globalid (>= 0.3.6) - activemodel (7.1.3.4) - activesupport (= 7.1.3.4) - activerecord (7.1.3.4) - activemodel (= 7.1.3.4) - activesupport (= 7.1.3.4) + activemodel (7.2.0) + activesupport (= 7.2.0) + activerecord (7.2.0) + activemodel (= 7.2.0) + activesupport (= 7.2.0) timeout (>= 0.4.0) - activestorage (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activesupport (= 7.1.3.4) + activestorage (7.2.0) + actionpack (= 7.2.0) + activejob (= 7.2.0) + activerecord (= 7.2.0) + activesupport (= 7.2.0) marcel (~> 1.0) - activesupport (7.1.3.4) + activesupport (7.2.0) base64 bigdecimal - concurrent-ruby (~> 1.0, >= 1.0.2) + concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + logger (>= 1.4.2) minitest (>= 5.1) - mutex_m - tzinfo (~> 2.0) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) base64 (0.2.0) bigdecimal (3.1.8) - builder (3.2.4) - concurrent-ruby (1.3.1) + builder (3.3.0) + concurrent-ruby (1.3.4) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) drb (2.2.1) - erubi (1.12.0) + erubi (1.13.0) globalid (1.2.1) activesupport (>= 6.1) i18n (1.14.5) concurrent-ruby (~> 1.0) io-console (0.7.2) - irb (1.13.1) + irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) + logger (1.6.0) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -103,9 +100,8 @@ GEM marcel (1.0.4) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.23.1) - mutex_m (0.2.0) - net-imap (0.4.11) + minitest (5.24.1) + net-imap (0.4.14) date net-protocol net-pop (0.1.2) @@ -115,22 +111,24 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.5) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.5-arm64-darwin) + nokogiri (1.16.7-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.5-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) - oj (3.16.3) + oj (3.16.5) bigdecimal (>= 3.0) - pg (1.5.6) + ostruct (>= 0.2) + ostruct (0.6.0) + pg (1.5.7) psych (5.1.2) stringio puma (6.4.2) nio4r (~> 2.0) - racc (1.8.0) - rack (3.0.11) + racc (1.8.1) + rack (3.1.7) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -138,20 +136,20 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) - rails (7.1.3.4) - actioncable (= 7.1.3.4) - actionmailbox (= 7.1.3.4) - actionmailer (= 7.1.3.4) - actionpack (= 7.1.3.4) - actiontext (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activemodel (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + rails (7.2.0) + actioncable (= 7.2.0) + actionmailbox (= 7.2.0) + actionmailer (= 7.2.0) + actionpack (= 7.2.0) + actiontext (= 7.2.0) + actionview (= 7.2.0) + activejob (= 7.2.0) + activemodel (= 7.2.0) + activerecord (= 7.2.0) + activestorage (= 7.2.0) + activesupport (= 7.2.0) bundler (>= 1.15.0) - railties (= 7.1.3.4) + railties (= 7.2.0) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -159,24 +157,25 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) - irb + railties (7.2.0) + actionpack (= 7.2.0) + activesupport (= 7.2.0) + irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.6.3.1) + rdoc (6.7.0) psych (>= 4.0.0) redis (5.2.0) redis-client (>= 0.22.0) redis-client (0.22.2) connection_pool - reline (0.5.7) + reline (0.5.9) io-console (~> 0.5) - stringio (3.1.0) + securerandom (0.3.1) + stringio (3.1.1) thor (1.3.1) timeout (0.4.1) trilogy (2.8.1) @@ -184,11 +183,12 @@ GEM concurrent-ruby (~> 1.0) tzinfo-data (1.2024.1) tzinfo (>= 1.0.0) + useragent (0.16.10) webrick (1.8.1) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.6.14) + zeitwerk (2.6.17) PLATFORMS arm64-darwin-20 @@ -199,7 +199,7 @@ DEPENDENCIES oj (~> 3.16) pg (~> 1.5) puma (~> 6.4) - rails (~> 7.1.3) + rails (~> 7.2.0) redis (~> 5.0) trilogy (~> 2.8.1) tzinfo-data diff --git a/frameworks/Ruby/rails/config/application.rb b/frameworks/Ruby/rails/config/application.rb index 2cca7e95baa..7e3e1d4af56 100644 --- a/frameworks/Ruby/rails/config/application.rb +++ b/frameworks/Ruby/rails/config/application.rb @@ -8,9 +8,10 @@ # require "active_storage/engine" require "action_controller/railtie" # require "action_mailer/railtie" +# require "action_mailbox/engine" +# require "action_text/engine" require "action_view/railtie" # require "action_cable/engine" -# require "sprockets/railtie" # require "rails/test_unit/railtie" # Require the gems listed in Gemfile, including any gems @@ -20,12 +21,12 @@ module Hello class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 7.1 + config.load_defaults 7.2 - # Settings in config/environments/* take precedence over those specified here. - # Application configuration can go into files in config/initializers - # -- all .rb files in that directory are automatically loaded after loading - # the framework and any gems in your application. + # Please, add to the `ignore` list any other `lib` subdirectories that do + # not contain `.rb` files, or that should not be reloaded or eager loaded. + # Common ones are `templates`, `generators`, or `middleware`, for example. + config.autoload_lib(ignore: %w[assets tasks]) config.action_dispatch.default_headers.merge!('Server' => 'WebServer') diff --git a/frameworks/Ruby/rails/config/environments/development.rb b/frameworks/Ruby/rails/config/environments/development.rb index 8620b53db5a..6a2306dbabc 100644 --- a/frameworks/Ruby/rails/config/environments/development.rb +++ b/frameworks/Ruby/rails/config/environments/development.rb @@ -6,7 +6,7 @@ # In the development environment your application's code is reloaded any time # it changes. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. - config.cache_classes = false + config.enable_reloading = true # Do not eager load code on boot. config.eager_load = false @@ -14,7 +14,7 @@ # Show full error reports. config.consider_all_requests_local = true - # Enable server timing + # Enable server timing. config.server_timing = true # Enable/disable caching. By default caching is disabled. @@ -24,9 +24,7 @@ config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store - config.public_file_server.headers = { - "Cache-Control" => "public, max-age=#{2.days.to_i}" - } + config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false @@ -48,16 +46,15 @@ # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true - # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names. - # config.action_view.annotate_rendered_view_with_filenames = true - - # Uncomment if you wish to allow Action Cable access from any origin. - # config.action_cable.disable_request_forgery_protection = true + config.action_view.annotate_rendered_view_with_filenames = true - # Raise error when a before_action's only/except options reference missing actions + # Raise error when a before_action's only/except options reference missing actions. config.action_controller.raise_on_missing_callback_actions = true + + # Apply autocorrection by RuboCop to files generated by `bin/rails generate`. + # config.generators.apply_rubocop_autocorrect_after_generate! end diff --git a/frameworks/Ruby/rails/config/environments/production.rb b/frameworks/Ruby/rails/config/environments/production.rb index 3ad22143e26..f9de0f173d6 100644 --- a/frameworks/Ruby/rails/config/environments/production.rb +++ b/frameworks/Ruby/rails/config/environments/production.rb @@ -4,7 +4,7 @@ # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. - config.cache_classes = true + config.enable_reloading = false # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers @@ -13,16 +13,15 @@ config.eager_load = true # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false + config.consider_all_requests_local = false config.action_controller.perform_caching = true - # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] - # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment + # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files). # config.require_master_key = true - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? + # Disable serving static files from `public/`, relying on NGINX/Apache to do so instead. + # config.public_file_server.enabled = false # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.asset_host = "http://assets.example.com" @@ -31,16 +30,24 @@ # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX + # Assume all access to the app is happening through a SSL-terminating reverse proxy. + # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies. + # config.assume_ssl = true + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # config.force_ssl = true - # Include generic and useful information about system operation, but avoid logging too much - # information to avoid inadvertent exposure of personally identifiable information (PII). - config.log_level = :info + # Skip http-to-https redirect for the default health check endpoint. + # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } } # Prepend all log lines with the following tags. config.log_tags = [ :request_id ] + # "info" includes generic and useful information about system operation, but avoids logging too much + # information to avoid inadvertent exposure of personally identifiable information (PII). If you + # want to log everything, set the level to "debug". + config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") + # Use a different cache store in production. config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], @@ -54,10 +61,6 @@ } } - # Use a real queuing backend for Active Job (and separate queues per environment). - # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "hello_production" - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true @@ -65,19 +68,14 @@ # Don't log any deprecations. config.active_support.report_deprecations = false - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Use a different logger for distributed setups. - # require "syslog/logger" - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name") - - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false + + # Enable DNS rebinding protection and other `Host` header attacks. + # config.hosts = [ + # "example.com", # Allow requests from example.com + # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` + # ] + # Skip DNS rebinding protection for the default health check endpoint. + # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } end diff --git a/frameworks/Ruby/rails/config/environments/test.rb b/frameworks/Ruby/rails/config/environments/test.rb index bfcd30081b1..999db7091ef 100644 --- a/frameworks/Ruby/rails/config/environments/test.rb +++ b/frameworks/Ruby/rails/config/environments/test.rb @@ -8,27 +8,25 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # Turn false under Spring and add config.action_view.cache_template_loading = true. - config.cache_classes = true + # While tests run files are not watched, reloading is not necessary. + config.enable_reloading = false - # Eager loading loads your whole application. When running a single test locally, - # this probably isn't necessary. It's a good idea to do in a continuous integration - # system, or in some way before deploying your code. + # Eager loading loads your entire application. When running a single test locally, + # this is usually not necessary, and can slow down your test suite. However, it's + # recommended that you enable it in continuous integration systems to ensure eager + # loading is working properly before deploying your code. config.eager_load = ENV["CI"].present? # Configure public file server for tests with Cache-Control for performance. - config.public_file_server.enabled = true - config.public_file_server.headers = { - "Cache-Control" => "public, max-age=#{1.hour.to_i}" - } + config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{1.hour.to_i}" } # Show full error reports and disable caching. - config.consider_all_requests_local = true + config.consider_all_requests_local = true config.action_controller.perform_caching = false config.cache_store = :null_store - # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false + # Render exception templates for rescuable exceptions and raise for other exceptions. + config.action_dispatch.show_exceptions = :rescuable # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false @@ -48,6 +46,6 @@ # Annotate rendered view with file names. # config.action_view.annotate_rendered_view_with_filenames = true - # Raise error when a before_action's only/except options reference missing actions + # Raise error when a before_action's only/except options reference missing actions. config.action_controller.raise_on_missing_callback_actions = true end diff --git a/frameworks/Ruby/rails/config/initializers/enable_yjit.rb b/frameworks/Ruby/rails/config/initializers/enable_yjit.rb deleted file mode 100644 index 963858ab4c6..00000000000 --- a/frameworks/Ruby/rails/config/initializers/enable_yjit.rb +++ /dev/null @@ -1,11 +0,0 @@ -# Automatically enable YJIT as of Ruby 3.3, as it bring very -# sizeable performance improvements. - -# If you are deploying to a memory constrained environment -# you may want to delete this file, but otherwise it's free -# performance. -if defined? RubyVM::YJIT.enable - Rails.application.config.after_initialize do - RubyVM::YJIT.enable - end -end diff --git a/frameworks/Ruby/rails/config/puma.rb b/frameworks/Ruby/rails/config/puma.rb index 3089f8334a2..b513db258e6 100644 --- a/frameworks/Ruby/rails/config/puma.rb +++ b/frameworks/Ruby/rails/config/puma.rb @@ -1,49 +1,40 @@ -require_relative 'auto_tune' +# This configuration file will be evaluated by Puma. The top-level methods that +# are invoked here are part of Puma's configuration DSL. For more information +# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html. -# FWBM only... use the puma_auto_tune gem in production! -tuned_num_workers, tuned_num_threads = auto_tune +require_relative 'auto_tune' -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers: a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# 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. +# Puma starts a configurable number of processes (workers) and each process +# serves each request in a thread from an internal thread pool. # -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 - -# Specifies the `worker_timeout` threshold that Puma will use to wait before -# terminating a worker in development environments. +# The ideal number of threads per worker depends both on how much time the +# application spends waiting for IO operations and on how much you wish to +# to prioritize throughput over latency. # -worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" - -# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# As a rule of thumb, increasing the number of threads will increase how much +# traffic a given process can handle (throughput), but due to CRuby's +# Global VM Lock (GVL) it has diminishing returns and will degrade the +# response time (latency) of the application. # -port ENV.fetch("PORT") { 3000 } - -# Specifies the `environment` that Puma will run in. +# The default is set to 3 threads as it's deemed a decent compromise between +# throughput and latency for the average Rails application. # -environment ENV.fetch("RAILS_ENV") { "development" } +# Any libraries that use a connection pool or another resource pool should +# be configured to provide at least as many connections as the number of +# threads. This includes Active Record's `pool` parameter in `database.yml`. +threads_count = ENV.fetch("RAILS_MAX_THREADS", 3) +threads threads_count, threads_count -# Specifies the `pidfile` that Puma will use. -pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } +worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked web server processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). -# -# workers ENV.fetch("WEB_CONCURRENCY") { 2 } -workers tuned_num_workers +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +port ENV.fetch("PORT", 3000) -# 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 -# process behavior so workers use less memory. -# -preload_app! +tuned_num_workers, tuned_num_threads = auto_tune +workers tuned_num_workers -# Allow puma to be restarted by `rails restart` command. +# Allow puma to be restarted by `bin/rails restart` command. plugin :tmp_restart + +# Only use a pidfile when requested +pidfile ENV["PIDFILE"] if ENV["PIDFILE"] From a77b6eb051ce3fe60104161821b348312e7c3806 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Tue, 13 Aug 2024 21:43:46 +0200 Subject: [PATCH 0752/1766] Revert for now native epoll on linux instead of io-uring (#9208) --- frameworks/Java/vertx/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 06199d308db..4230d89326b 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -148,9 +148,6 @@ Linux false - - unix - From 919e13b01eea0470f48f04fc766aa6d724d6ea52 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Wed, 14 Aug 2024 00:43:56 +0500 Subject: [PATCH 0753/1766] ntex: update version, try different allocator (#9206) --- frameworks/Rust/ntex/Cargo.toml | 2 +- frameworks/Rust/ntex/src/db.rs | 59 ++++++++++++++-------------- frameworks/Rust/ntex/src/main.rs | 3 +- frameworks/Rust/ntex/src/main_db.rs | 4 +- frameworks/Rust/ntex/src/main_plt.rs | 1 + 5 files changed, 35 insertions(+), 34 deletions(-) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index 6699c6c0f1d..92c0da890ac 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -37,7 +37,7 @@ tokio = ["ntex/tokio"] async-std = ["ntex/async-std"] [dependencies] -ntex = "=2.0.3" +ntex = "=2.1.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"] } diff --git a/frameworks/Rust/ntex/src/db.rs b/frameworks/Rust/ntex/src/db.rs index 5bceed5b73e..b3adc6e70bf 100644 --- a/frameworks/Rust/ntex/src/db.rs +++ b/frameworks/Rust/ntex/src/db.rs @@ -1,11 +1,11 @@ -use std::{cell::RefCell, fmt::Write as FmtWrite}; +#![allow(clippy::uninit_vec)] +use std::{borrow::Cow, cell::RefCell, fmt::Write as FmtWrite}; -use futures::stream::{futures_unordered::FuturesUnordered, StreamExt}; use nanorand::{Rng, WyRand}; use ntex::util::{BufMut, Bytes, BytesMut}; use smallvec::SmallVec; use tokio_postgres::types::ToSql; -use tokio_postgres::{connect, Client, Row, Statement}; +use tokio_postgres::{connect, Client, Statement}; use yarte::{ywrite_html, Serialize}; use super::utils; @@ -17,9 +17,9 @@ pub struct World { } #[derive(Serialize, Debug)] -pub struct Fortune<'a> { +pub struct Fortune { pub id: i32, - pub message: &'a str, + pub message: Cow<'static, str>, } /// Postgres interface @@ -60,10 +60,7 @@ impl PgConnection { q.push(')'); updates.push(cl.prepare(&q).await.unwrap()); } - let world = cl - .prepare("SELECT id, randomnumber FROM world WHERE id=$1") - .await - .unwrap(); + let world = cl.prepare("SELECT * FROM world WHERE id=$1").await.unwrap(); PgConnection { cl, @@ -83,7 +80,7 @@ impl PgConnection { let row = self.cl.query_one(&self.world, &[&random_id]).await.unwrap(); let mut body = self.buf.borrow_mut(); - utils::reserve(&mut body, 256); + utils::reserve(&mut body, 8 * 1024); World { id: row.get(0), randomnumber: row.get(1), @@ -92,20 +89,17 @@ impl PgConnection { body.split().freeze() } - async fn get_one_world(&self, id: i32) -> Row { - self.cl.query_one(&self.world, &[&id]).await.unwrap() - } - pub async fn get_worlds(&self, num: usize) -> Bytes { let mut rng = self.rng.clone(); - let mut queries = FuturesUnordered::new(); + let mut queries = SmallVec::<[_; 32]>::new(); (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; - queries.push(self.get_one_world(w_id)) + queries.push(self.cl.query_one(&self.world, &[&w_id])); }); let mut worlds = SmallVec::<[_; 32]>::new(); - while let Some(row) = queries.next().await { + for fut in queries { + let row = fut.await.unwrap(); worlds.push(World { id: row.get(0), randomnumber: row.get(1), @@ -126,14 +120,15 @@ impl PgConnection { pub async fn update(&self, num: usize) -> Bytes { let mut rng = self.rng.clone(); - let mut queries = FuturesUnordered::new(); + let mut queries = SmallVec::<[_; 32]>::new(); (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; - queries.push(self.get_one_world(w_id)) + queries.push(self.cl.query_one(&self.world, &[&w_id])); }); let mut worlds = SmallVec::<[_; 32]>::new(); - while let Some(row) = queries.next().await { + for fut in queries.into_iter() { + let row = fut.await.unwrap(); worlds.push(World { id: row.get(0), randomnumber: (rng.generate::() % 10_000 + 1) as i32, @@ -163,18 +158,22 @@ impl PgConnection { } pub async fn tell_fortune(&self) -> Bytes { - let rows = self.cl.query_raw(&self.fortune, &[]).await.unwrap(); + let fut = self.cl.query_raw(&self.fortune, &[]); - let mut fortunes = Vec::with_capacity(rows.len() + 1); - fortunes.push(Fortune { + let rows = fut.await.unwrap(); + let mut fortunes: SmallVec<[_; 32]> = smallvec::smallvec![Fortune { id: 0, - message: "Additional fortune added at request time.", - }); - fortunes.extend(rows.iter().map(|row| Fortune { - id: row.get(0), - message: row.get(1), - })); - fortunes.sort_by(|it, next| it.message.cmp(next.message)); + message: Cow::Borrowed("Additional fortune added at request time."), + }]; + + for row in rows { + fortunes.push(Fortune { + id: row.get(0), + message: Cow::Owned(row.get(1)), + }); + } + + fortunes.sort_by(|it, next| it.message.cmp(&next.message)); let mut body = std::mem::replace(&mut *self.buf.borrow_mut(), BytesMut::new()); utils::reserve(&mut body, 8 * 1024); diff --git a/frameworks/Rust/ntex/src/main.rs b/frameworks/Rust/ntex/src/main.rs index c9fd1e80245..c456fac47e4 100644 --- a/frameworks/Rust/ntex/src/main.rs +++ b/frameworks/Rust/ntex/src/main.rs @@ -1,5 +1,6 @@ #[global_allocator] -static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; +// static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; use ntex::http::header::{CONTENT_TYPE, SERVER}; use ntex::{http, time::Seconds, util::BytesMut, util::PoolId, web}; diff --git a/frameworks/Rust/ntex/src/main_db.rs b/frameworks/Rust/ntex/src/main_db.rs index 437fd70b9e1..78c21fa7132 100644 --- a/frameworks/Rust/ntex/src/main_db.rs +++ b/frameworks/Rust/ntex/src/main_db.rs @@ -1,7 +1,7 @@ #[cfg(not(target_os = "macos"))] #[global_allocator] -static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; -// static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; +// static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; use ntex::http::header::{CONTENT_TYPE, SERVER}; use ntex::http::{HttpService, KeepAlive, Request, Response, StatusCode}; diff --git a/frameworks/Rust/ntex/src/main_plt.rs b/frameworks/Rust/ntex/src/main_plt.rs index cda9b69fa15..2f46ce448e1 100644 --- a/frameworks/Rust/ntex/src/main_plt.rs +++ b/frameworks/Rust/ntex/src/main_plt.rs @@ -1,5 +1,6 @@ #[global_allocator] static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; + use std::{future::Future, io, pin::Pin, task::Context, task::Poll}; use ntex::{fn_service, http::h1, io::Io, io::RecvError, util::ready, util::PoolId}; From 990e3132698841deed4cac1f3d0c637de640ff20 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Tue, 13 Aug 2024 20:44:06 +0100 Subject: [PATCH 0754/1766] Update H2O to revision c54c63285 (#9205) --- frameworks/C/h2o/h2o.dockerfile | 2 +- frameworks/C/h2o/src/handlers/world.c | 6 ++++-- frameworks/PHP/php/php-h2o.dockerfile | 2 +- frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index bca0d12b19e..3b383b7f6df 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -33,7 +33,7 @@ RUN apt-get -yqq update && \ ruby \ systemtap-sdt-dev -ARG H2O_VERSION=18b175f71ede08b50d3e5ae8303dacef3ea510fc +ARG H2O_VERSION=c54c63285b52421da2782f028022647fc2ea3dd1 WORKDIR /tmp/h2o-build RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ diff --git a/frameworks/C/h2o/src/handlers/world.c b/frameworks/C/h2o/src/handlers/world.c index 82d29ce08b8..84088a25d42 100644 --- a/frameworks/C/h2o/src/handlers/world.c +++ b/frameworks/C/h2o/src/handlers/world.c @@ -238,8 +238,10 @@ static int do_multiple_queries(bool do_update, bool use_cache, h2o_req_t *req) const size_t num_query = get_query_number(req); // MAX_QUERIES is a relatively small number, say less than or equal to UINT16_MAX, so assume no - // overflow in the following arithmetic operations. - assert(num_query && num_query <= MAX_QUERIES && num_query <= UINT16_MAX); + // unsigned overflow in the following arithmetic operations. + static_assert(MAX_QUERIES <= UINT16_MAX, + "potential out-of-bounds memory accesses in the following code"); + assert(num_query && num_query <= MAX_QUERIES); size_t base_size = offsetof(multiple_query_ctx_t, res) + num_query * sizeof(query_result_t); diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index 57571b6b3c7..3de194e526b 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=18b175f71ede08b50d3e5ae8303dacef3ea510fc +ARG H2O_VERSION=c54c63285b52421da2782f028022647fc2ea3dd1 ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX diff --git a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile index 7cc59cf699f..cdfbf5811b2 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=18b175f71ede08b50d3e5ae8303dacef3ea510fc +ARG H2O_VERSION=c54c63285b52421da2782f028022647fc2ea3dd1 ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX From 61305905d2f13d1490f86e0fc925237f820fddeb Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 13 Aug 2024 21:44:16 +0200 Subject: [PATCH 0755/1766] Fix bottle (#9203) --- frameworks/Python/bottle/benchmark_config.json | 3 ++- frameworks/Python/bottle/bottle-raw.dockerfile | 2 +- frameworks/Python/bottle/bottle.dockerfile | 2 +- frameworks/Python/bottle/requirements.txt | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/frameworks/Python/bottle/benchmark_config.json b/frameworks/Python/bottle/benchmark_config.json index e37735b8353..c895cf1e4e7 100644 --- a/frameworks/Python/bottle/benchmark_config.json +++ b/frameworks/Python/bottle/benchmark_config.json @@ -45,7 +45,8 @@ "database_os": "Linux", "display_name": "Bottle", "notes": "PyPy2", - "versus": "wsgi" + "versus": "wsgi", + "tags": ["broken"] }, "raw": { "db_url": "/raw-db", diff --git a/frameworks/Python/bottle/bottle-raw.dockerfile b/frameworks/Python/bottle/bottle-raw.dockerfile index 24a59598829..8ba573a7a2b 100644 --- a/frameworks/Python/bottle/bottle-raw.dockerfile +++ b/frameworks/Python/bottle/bottle-raw.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.6.6-stretch +FROM python:3.9-bookworm WORKDIR /bottle COPY views views diff --git a/frameworks/Python/bottle/bottle.dockerfile b/frameworks/Python/bottle/bottle.dockerfile index 24a59598829..8ba573a7a2b 100644 --- a/frameworks/Python/bottle/bottle.dockerfile +++ b/frameworks/Python/bottle/bottle.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.6.6-stretch +FROM python:3.9-bookworm WORKDIR /bottle COPY views views diff --git a/frameworks/Python/bottle/requirements.txt b/frameworks/Python/bottle/requirements.txt index 25c2d97e91a..7f6135dbd5b 100644 --- a/frameworks/Python/bottle/requirements.txt +++ b/frameworks/Python/bottle/requirements.txt @@ -1,6 +1,6 @@ -bottle==0.12.19 +bottle==0.12.25 bottle-sqlalchemy==0.4.3 -greenlet==0.4.14 +greenlet==0.4.17 gunicorn==19.9.0 meinheld==1.0.2 mysqlclient==1.3.12 From 094e02d6e4e3facfbe27fed0370464c63df5cdc0 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Wed, 14 Aug 2024 03:44:26 +0800 Subject: [PATCH 0756/1766] [xitca-web] update dep. (#9201) --- frameworks/Rust/xitca-web/Cargo.lock | 487 ++++++++++-------- frameworks/Rust/xitca-web/Cargo.toml | 18 +- frameworks/Rust/xitca-web/src/main_iou.rs | 2 +- frameworks/Rust/xitca-web/src/util.rs | 4 +- .../Rust/xitca-web/xitca-web-axum.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-iou.dockerfile | 4 +- .../Rust/xitca-web/xitca-web-sync.dockerfile | 2 +- .../Rust/xitca-web/xitca-web.dockerfile | 2 +- 8 files changed, 274 insertions(+), 247 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 0bce6f973f8..e510a6c31dc 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" @@ -122,9 +122,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" @@ -143,15 +143,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.0.98" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" [[package]] name = "cfg-if" @@ -178,13 +178,48 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "diesel" -version = "2.1.6" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff236accb9a5069572099f0b350a92e9560e8e63a9b8d546162f4a5e03026bb2" +checksum = "bf97ee7261bb708fa3402fa9c17a54b70e90e3cb98afb3dc8999d5512cb03f94" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "byteorder", "diesel_derives", "itoa", @@ -194,11 +229,12 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.1.4" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14701062d6bed917b5c7103bdffaee1e4609279e240488ad24e7bd979ca6866c" +checksum = "d6ff2be1e7312c858b2ef974f5c7089833ae57b5311b334b30923af58e5718d8" dependencies = [ "diesel_table_macro_syntax", + "dsl_auto_type", "proc-macro2", "quote", "syn", @@ -206,9 +242,9 @@ dependencies = [ [[package]] name = "diesel_table_macro_syntax" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" +checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ "syn", ] @@ -224,6 +260,26 @@ dependencies = [ "subtle", ] +[[package]] +name = "dsl_auto_type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607" +dependencies = [ + "darling", + "either", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -232,22 +288,16 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "bf401df4a4e3872c4fe8151134cf483738e74b67fc934d6532c882b3d24a4550" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.59.0", ] -[[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" @@ -285,6 +335,7 @@ dependencies = [ "futures-task", "pin-project-lite", "pin-utils", + "slab", ] [[package]] @@ -310,9 +361,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -351,9 +408,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -361,12 +418,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http", "http-body", "pin-project-lite", @@ -374,9 +431,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -384,11 +441,17 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "io-uring" -version = "0.5.13" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd1e1a01cfb924fd8c5c43b6827965db394f5a3a16c599ce03452266e1cf984c" +checksum = "595a0399f411a508feb2ec1e970a4a30c249351e30208960d58298de8660b0e5" dependencies = [ "bitflags 1.3.2", "libc", @@ -414,14 +477,25 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libmimalloc-sys" -version = "0.1.38" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7bb23d733dfcc8af652a78b7bf232f0e967710d044732185e561e47c0336b6" +checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" dependencies = [ "cc", "libc", ] +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall", +] + [[package]] name = "lock_api" version = "0.4.12" @@ -434,9 +508,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchit" @@ -456,15 +530,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mimalloc" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9186d86b79b52f4a77af65604b51225e8db1d6ee7e3f41aec1e40829c71a176" +checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633" dependencies = [ "libmimalloc-sys", ] @@ -477,22 +551,23 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -510,21 +585,11 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "object" -version = "0.32.2" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -537,9 +602,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -553,9 +618,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets", ] [[package]] @@ -598,9 +663,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "postgres-protocol" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520" +checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" dependencies = [ "base64", "byteorder", @@ -616,9 +681,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" +checksum = "02048d9e032fb3cc3413bbf7b83a15d84a5d419778e2628751896d856498eee9" dependencies = [ "bytes", "fallible-iterator", @@ -627,24 +692,27 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "pq-sys" -version = "0.4.8" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0052426df997c0cbd30789eb44ca097e3541717a7b8fa36b1c464ee7edebd" +checksum = "a24ff9e4cf6945c988f0db7005d87747bf72864965c3529d259ad155ac41d584" dependencies = [ "vcpkg", ] [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -701,20 +769,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -780,12 +839,6 @@ 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" @@ -794,18 +847,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", @@ -814,11 +867,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -902,26 +956,32 @@ dependencies = [ [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.65" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -942,9 +1002,9 @@ checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -957,31 +1017,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2 0.5.7", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-uring" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d5e02bb137e030b3a547c65a3bd2f1836d66a97369fdcc69034002b10e155ef" +checksum = "748482e3e13584a34664a710168ad5068e8cb1d968aa4ffa887e83ca6dd27967" dependencies = [ "bytes", + "futures-util", "io-uring", "libc", - "scoped-tls", "slab", "socket2 0.4.10", "tokio", @@ -1008,7 +1067,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "bytes", "http", "http-body", @@ -1077,6 +1136,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" + [[package]] name = "vcpkg" version = "0.2.15" @@ -1085,9 +1150,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" @@ -1117,150 +1182,93 @@ 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.5", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 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", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "xitca-codegen" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866906a5f280481ef022ccdec1640730550304bb86b016815d9982fde2f48e3e" +checksum = "336b646a30e6d44093beaae1bbe5dda664e8466d387663fc9d61c55fb2d78424" dependencies = [ "quote", "syn", @@ -1268,9 +1276,9 @@ dependencies = [ [[package]] name = "xitca-http" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d5fd258cd6cd9d677cb94273da69fafee7460bbbd001c92a73c167149856e46" +checksum = "47b5b036e32261c69d4f0e81bcb28c2e058ed569518959336fd75fc086208d3f" dependencies = [ "futures-core", "http", @@ -1290,9 +1298,9 @@ dependencies = [ [[package]] name = "xitca-io" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da690dc253320dae7ffbb70e7fa9c5e52ef79476dd41f5d52b9114c8b58d7126" +checksum = "376a4849eef1f3475a6b7a5c474dac278c320a28f6e2abc07be57048b35cc5df" dependencies = [ "bytes", "tokio", @@ -1303,7 +1311,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=ea1f5a2447e0969a6dff84eac9ff9ff90dbc7ed1#ea1f5a2447e0969a6dff84eac9ff9ff90dbc7ed1" +source = "git+https://github.com/HFQR/xitca-web.git?rev=0cad5309beb278dc967378a35b733e26be0d4073#0cad5309beb278dc967378a35b733e26be0d4073" dependencies = [ "fallible-iterator", "percent-encoding", @@ -1318,18 +1326,18 @@ dependencies = [ [[package]] name = "xitca-router" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687a3fb0a32b89524fab7d780d4cc66942b8ee6a493a7f2ff78384fe677b8e09" +checksum = "35a771113f381c9a2f5ae1096b70d629ed241a1a473304ea902258c3d528f536" dependencies = [ "xitca-unsafe-collection", ] [[package]] name = "xitca-server" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e144aca50286d05f7450045d6b6eebe2157ed11bc5821d926fc276280113c94" +checksum = "a40a05f18780f1de843c5077583e4650b08d0518fcf9cf7948e28bc92e489736" dependencies = [ "socket2 0.5.7", "tokio", @@ -1342,15 +1350,15 @@ dependencies = [ [[package]] name = "xitca-service" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a4a38548b14925111dd99560f0a10d1eb9e3e117fa5471c35387ed6f77b58c" +checksum = "74b093ca75b264924773d53e445de08a937100bf1cbe4f62d4dc2c0d04a3ba4b" [[package]] name = "xitca-unsafe-collection" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552a6bf21a5d0dc470644cb3b99f98f44bd414cd6fcca74610465d8196b1d23e" +checksum = "467b95b08735dcd7061be626d02aea062bc0b99918bc9de11b8fc15d901158ae" dependencies = [ "bytes", ] @@ -1378,14 +1386,14 @@ dependencies = [ "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.5.0", + "xitca-web 0.6.2", ] [[package]] name = "xitca-web" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd23a9146a753f4f9e10bf4cc99b53d040a5459c32f043965d75f0c2b4a78af6" +checksum = "dd4f8f16791ea2a8845f617f1e87887f917835e0603d01f03a51e638b9613d0c" dependencies = [ "futures-core", "http-body", @@ -1402,3 +1410,24 @@ dependencies = [ "xitca-service", "xitca-unsafe-collection", ] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index b9447c3e7ea..d9606bf2a96 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -11,7 +11,7 @@ required-features = ["io-uring", "pg", "router", "template"] [[bin]] name = "xitca-web-iou" path = "./src/main_iou.rs" -required-features = ["io-uring", "perf", "pg-iou", "template"] +required-features = ["io-uring", "perf", "pg", "template"] [[bin]] name = "xitca-web-wasm" @@ -33,8 +33,6 @@ required-features = ["pg-orm", "template", "web-codegen"] pg = ["xitca-postgres/single-thread"] # pg send/sync optional pg-sync = ["xitca-postgres"] -# pg io_uring optional -pg-iou = ["pg", "xitca-postgres/io-uring"] # pg orm optional pg-orm = ["diesel"] # http router optional @@ -53,18 +51,18 @@ axum = ["dep:axum", "http-body", "tower", "tower-http", "xitca-web/tower-http-co perf = ["mimalloc", "tokio/parking_lot"] [dependencies] -xitca-http = "0.5" -xitca-io = "0.3" -xitca-server = "0.3" -xitca-service = "0.1" -xitca-unsafe-collection = "0.1.1" +xitca-http = "0.6" +xitca-io = "0.4" +xitca-server = "0.4" +xitca-service = "0.2" +xitca-unsafe-collection = "0.2" atoi = "2" serde = { version = "1" } serde_json = { version = "1" } # web optional -xitca-web = { version = "0.5", features = ["json"], optional = true } +xitca-web = { version = "0.6", features = ["json"], optional = true } # raw-pg optional xitca-postgres = { version = "0.1", optional = true } @@ -97,4 +95,4 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "ea1f5a2447e0969a6dff84eac9ff9ff90dbc7ed1" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "0cad5309beb278dc967378a35b733e26be0d4073" } diff --git a/frameworks/Rust/xitca-web/src/main_iou.rs b/frameworks/Rust/xitca-web/src/main_iou.rs index 83dfbc0eaab..67ae6dad4d3 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_iou.rs @@ -24,7 +24,7 @@ use xitca_http::{ }; use xitca_io::{ bytes::{Bytes, BytesMut}, - io_uring::IoBuf, + io_uring::BoundedBuf, net::{io_uring::TcpStream as IOUTcpStream, TcpStream}, }; use xitca_service::{fn_build, fn_service, middleware::UncheckedReady, Service, ServiceExt}; diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index 8c4cee9da98..dc0476a5d15 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -49,7 +49,7 @@ mod non_wasm { } } - #[cfg(any(feature = "pg", feature = "pg-iou"))] + #[cfg(feature = "pg")] mod pg_state { use core::{cell::RefCell, future::Future, pin::Pin}; @@ -79,7 +79,7 @@ mod non_wasm { } } - #[cfg(any(feature = "pg", feature = "pg-iou"))] + #[cfg(feature = "pg")] pub use pg_state::*; } diff --git a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile index 2d29f5e2ffb..f5a87ea8ec5 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.77 +FROM rust:1.79 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 43bf2b23fc5..3b0ef259420 100644 --- a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile @@ -1,9 +1,9 @@ -FROM rust:1.77 +FROM rust:1.79 ADD ./ /xitca-web WORKDIR /xitca-web -RUN cargo build --release --bin xitca-web-iou --features io-uring,perf,pg-iou,template +RUN cargo build --release --bin xitca-web-iou --features io-uring,perf,pg,template EXPOSE 8080 diff --git a/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile b/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile index 5e71fa5d649..21ed93620d3 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.77 +FROM rust:1.79 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web.dockerfile b/frameworks/Rust/xitca-web/xitca-web.dockerfile index bed37320e72..0bbd89946c6 100644 --- a/frameworks/Rust/xitca-web/xitca-web.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.77 +FROM rust:1.79 ADD ./ /xitca-web WORKDIR /xitca-web From db2f34b8eb6a2a87b8f3773f9fabb839db25b234 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:44:35 +0000 Subject: [PATCH 0757/1766] Bump aiohttp from 3.9.4 to 3.10.2 in /frameworks/Python/aiohttp Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.4 to 3.10.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.4...v3.10.2) --- updated-dependencies: - dependency-name: aiohttp dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 d0caf5f25e7..444a284f816 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.9.4 +aiohttp==3.10.2 asyncpg==0.25.0 cchardet==2.1.7 gunicorn==20.1 From 1b2f23aa7c8a9cdd4d3ed1b9b3890b872288e30a Mon Sep 17 00:00:00 2001 From: Aaron Tavistock Date: Tue, 13 Aug 2024 12:50:42 -0700 Subject: [PATCH 0758/1766] [elixir] Version and code updates (#9198) * Updates for Phoenix, Elixir, Erlang, and Docker image * Missed on mix file and template should be heex * Add back fortunes with heex * Update plug libraries * Code based performance improvements --- .../Elixir/phoenix/benchmark_config.json | 29 +---------- frameworks/Elixir/phoenix/config/bandit.exs | 43 ---------------- frameworks/Elixir/phoenix/config/config.exs | 8 +++ frameworks/Elixir/phoenix/config/prod.exs | 9 ++-- .../Elixir/phoenix/lib/hello/application.ex | 2 +- frameworks/Elixir/phoenix/lib/hello/cache.ex | 5 -- .../Elixir/phoenix/lib/hello/world_cache.ex | 31 ++++++++++++ frameworks/Elixir/phoenix/lib/hello_web.ex | 4 +- .../hello_web/controllers/page_controller.ex | 36 ++++++------- .../{fortunes.html.eex => fortunes.html.heex} | 0 frameworks/Elixir/phoenix/mix.exs | 16 +++--- frameworks/Elixir/phoenix/mix.lock | 50 +++++++++---------- .../Elixir/phoenix/phoenix-bandit.dockerfile | 39 --------------- frameworks/Elixir/phoenix/phoenix.dockerfile | 6 +-- .../Elixir/plug/elixir-plug-ecto.dockerfile | 6 +-- frameworks/Elixir/plug/mix.exs | 12 ++--- frameworks/Elixir/plug/mix.lock | 34 ++++++------- 17 files changed, 123 insertions(+), 207 deletions(-) delete mode 100644 frameworks/Elixir/phoenix/config/bandit.exs delete mode 100644 frameworks/Elixir/phoenix/lib/hello/cache.ex create mode 100644 frameworks/Elixir/phoenix/lib/hello/world_cache.ex rename frameworks/Elixir/phoenix/lib/hello_web/controllers/page_html/{fortunes.html.eex => fortunes.html.heex} (100%) delete mode 100644 frameworks/Elixir/phoenix/phoenix-bandit.dockerfile diff --git a/frameworks/Elixir/phoenix/benchmark_config.json b/frameworks/Elixir/phoenix/benchmark_config.json index 9af25b9fbdc..2286bd85fbd 100644 --- a/frameworks/Elixir/phoenix/benchmark_config.json +++ b/frameworks/Elixir/phoenix/benchmark_config.json @@ -2,30 +2,6 @@ "framework": "phoenix", "tests": [{ "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "plaintext_url": "/plaintext", - "update_url": "/updates?queries=", - "cached_query_url": "/cached-queries?count=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "Phoenix", - "language": "Elixir", - "flavor": "None", - "orm": "full", - "platform": "beam", - "webserver": "cowboy", - "os": "Linux", - "database_os": "Linux", - "display_name": "Phoenix", - "notes": "", - "versus": "" - }, - "bandit": { "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", @@ -45,9 +21,8 @@ "webserver": "bandit", "os": "Linux", "database_os": "Linux", - "display_name": "Phoenix-Bandit", - "notes": "", - "versus": "default" + "display_name": "Phoenix", + "notes": "" } }] } diff --git a/frameworks/Elixir/phoenix/config/bandit.exs b/frameworks/Elixir/phoenix/config/bandit.exs deleted file mode 100644 index ccaf648c115..00000000000 --- a/frameworks/Elixir/phoenix/config/bandit.exs +++ /dev/null @@ -1,43 +0,0 @@ -import Config - -config :hello, HelloWeb.Endpoint, - adapter: Bandit.PhoenixAdapter, - http: [port: 8080, ip: {0, 0, 0, 0}], - cache_static_lookup: false, - check_orgin: false, - debug_errors: false, - code_reloader: false, - server: true - - -config :hello, Hello.Repo, - username: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world", - hostname: "tfb-database", - pool_size: 40, - queue_target: 5000, - log: false - -config :phoenix, :logger, false - -config :logger, - compile_time_purge_matching: [ - [level_lower_than: :error] - ], - level: :error, - backends: [] - -# ## SSL Support -# -# To get SSL working, you will need to add the `https` key -# to the previous section: -# -# config:hello, Hello.Endpoint, -# ... -# https: [port: 443, -# keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), -# certfile: System.get_env("SOME_APP_SSL_CERT_PATH")] -# -# Where those two env variables point to a file on -# disk for the key and cert. diff --git a/frameworks/Elixir/phoenix/config/config.exs b/frameworks/Elixir/phoenix/config/config.exs index be5688f535b..e464e49d164 100755 --- a/frameworks/Elixir/phoenix/config/config.exs +++ b/frameworks/Elixir/phoenix/config/config.exs @@ -18,6 +18,14 @@ config :hello, HelloWeb.Endpoint, debug_errors: false, secret_key_base: "Z18ZjzZslFpKd8HB41IljqMavPiOKVF9y1DIQ+S2Ytg7Op0EIauwJgd7mtRStssx" +# Configure cache for world entities +config :hello, Hello.WorldCache, + gc_interval: :timer.hours(1), + max_size: 1_000_000, + allocated_memory: 100_000_000, + gc_cleanup_min_timeout: :timer.seconds(30), + gc_cleanup_max_timeout: :timer.minutes(30) + # Configures Elixir's Logger config :logger, :console, format: "$time $metadata[$level] $message\n", diff --git a/frameworks/Elixir/phoenix/config/prod.exs b/frameworks/Elixir/phoenix/config/prod.exs index 853a5ea247d..48b24364a40 100755 --- a/frameworks/Elixir/phoenix/config/prod.exs +++ b/frameworks/Elixir/phoenix/config/prod.exs @@ -1,9 +1,10 @@ import Config config :hello, HelloWeb.Endpoint, - url: [host: "0.0.0.0"], - http: [port: 8080, protocol_options: [max_keepalive: :infinity], backlog: 8096], - cache_static_lookup: false, + adapter: Bandit.PhoenixAdapter, + http: [port: 8080, ip: {0, 0, 0, 0}], + http_options: [log_protocol_errors: false], + compress: false, check_origin: false, debug_errors: false, code_reloader: false, @@ -14,7 +15,7 @@ config :hello, Hello.Repo, password: "benchmarkdbpass", database: "hello_world", hostname: "tfb-database", - pool_size: 40, + pool_size: 50, queue_target: 5000, log: false diff --git a/frameworks/Elixir/phoenix/lib/hello/application.ex b/frameworks/Elixir/phoenix/lib/hello/application.ex index 58fed15fc63..49f1ef8ba03 100644 --- a/frameworks/Elixir/phoenix/lib/hello/application.ex +++ b/frameworks/Elixir/phoenix/lib/hello/application.ex @@ -6,7 +6,7 @@ defmodule Hello.Application do def start(_type, _args) do children = [ Hello.Repo, - {Hello.Cache, []}, + {Hello.WorldCache, []}, HelloWeb.Endpoint ] diff --git a/frameworks/Elixir/phoenix/lib/hello/cache.ex b/frameworks/Elixir/phoenix/lib/hello/cache.ex deleted file mode 100644 index 0f051a3fb72..00000000000 --- a/frameworks/Elixir/phoenix/lib/hello/cache.ex +++ /dev/null @@ -1,5 +0,0 @@ -defmodule Hello.Cache do - use Nebulex.Cache, - otp_app: :hello, - adapter: Nebulex.Adapters.Local -end diff --git a/frameworks/Elixir/phoenix/lib/hello/world_cache.ex b/frameworks/Elixir/phoenix/lib/hello/world_cache.ex new file mode 100644 index 00000000000..b4943e14a35 --- /dev/null +++ b/frameworks/Elixir/phoenix/lib/hello/world_cache.ex @@ -0,0 +1,31 @@ +defmodule Hello.WorldCache do + use Nebulex.Cache, + otp_app: :hello, + adapter: Nebulex.Adapters.Local + + alias Hello.Models.World + alias Hello.Repo + + def seed do + if not __MODULE__.has_key?(:seeded) do + World + |> Repo.all() + |> Enum.into([], &{&1.id, &1}) + |> __MODULE__.put_all() + + __MODULE__.put(:seeded, true) + end + end + + def fetch(id) do + case __MODULE__.get(id) do + nil -> + world = Repo.get(World, id) + :ok = __MODULE__.put(id, world) + world + world -> + world + end + end + +end diff --git a/frameworks/Elixir/phoenix/lib/hello_web.ex b/frameworks/Elixir/phoenix/lib/hello_web.ex index 78062f969be..1193aab23a5 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web.ex @@ -62,9 +62,7 @@ defmodule HelloWeb do defp html_helpers do quote do # Use all HTML functionality (forms, tags, etc) - use Phoenix.HTML - # Core UI Components and translation - import HelloWeb.Gettext + import Phoenix.HTML # Routes generation with the ~p sigil unquote(verified_routes()) diff --git a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex index a44c5edf099..34c1fc120fd 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex @@ -1,10 +1,11 @@ defmodule HelloWeb.PageController do - alias Hello.Models.{Fortune, World} use HelloWeb, :controller + alias Hello.Models.Fortune + alias Hello.Models.World alias Hello.Repo - alias Hello.Cache + alias Hello.WorldCache @random_max 10_000 @@ -29,7 +30,7 @@ defmodule HelloWeb.PageController do worlds = Stream.repeatedly(&random_id/0) |> Stream.uniq() - |> Stream.map(fn idx -> Repo.get(World, idx) end) + |> Stream.map(&Repo.get(World, &1)) |> Enum.take(size(params["queries"])) json(conn, worlds) @@ -41,11 +42,11 @@ defmodule HelloWeb.PageController do message: "Additional fortune added at request time." } - fortunes = [additional_fortune | Repo.all(Fortune)] + fortunes = + [additional_fortune | Repo.all(Fortune)] + |> Enum.sort_by(& &1.message) - render(conn, :fortunes, - fortunes: Enum.sort(fortunes, fn f1, f2 -> f1.message < f2.message end) - ) + render(conn, :fortunes, fortunes: fortunes) end def updates(conn, params) do @@ -54,9 +55,13 @@ defmodule HelloWeb.PageController do worlds = Stream.repeatedly(&random_id/0) |> Stream.uniq() - |> Stream.map(fn idx -> Repo.get(World, idx) end) + |> Stream.map(&Repo.get(World, &1)) |> Stream.map(fn world -> %{id: world.id, randomnumber: :rand.uniform(@random_max)} end) |> Enum.take(size(params["queries"])) + # If this is not sorted it sometimes generates + # FAIL for http://tfb-server:8080/updates/20 + # Only 20470 executed queries in the database out of roughly 20480 expected. + |> Enum.sort_by(& &1.id) Repo.insert_all( World, @@ -75,28 +80,17 @@ defmodule HelloWeb.PageController do def cached(conn, params) do :rand.seed(:exsp) + WorldCache.seed() worlds = Stream.repeatedly(&random_id/0) |> Stream.uniq() - |> Stream.map(&get_cached_world/1) + |> Stream.map(&WorldCache.fetch(&1)) |> Enum.take(size(params["count"])) json(conn, worlds) end - defp get_cached_world(idx) do - case Cache.get(idx) do - nil -> - world = Repo.get(World, idx) - :ok = Cache.put(idx, world) - world - - world -> - world - end - end - defp random_id() do :rand.uniform(@random_max) end diff --git a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_html/fortunes.html.eex b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_html/fortunes.html.heex similarity index 100% rename from frameworks/Elixir/phoenix/lib/hello_web/controllers/page_html/fortunes.html.eex rename to frameworks/Elixir/phoenix/lib/hello_web/controllers/page_html/fortunes.html.heex diff --git a/frameworks/Elixir/phoenix/mix.exs b/frameworks/Elixir/phoenix/mix.exs index fa48c24784d..a0ecab89cd7 100755 --- a/frameworks/Elixir/phoenix/mix.exs +++ b/frameworks/Elixir/phoenix/mix.exs @@ -4,8 +4,8 @@ defmodule Hello.Mixfile do def project do [ app: :hello, - version: "0.1.0", - elixir: "~> 1.14", + version: "1.1.1", + elixir: "~> 1.17", elixirc_paths: elixirc_paths(Mix.env()), start_permanent: Mix.env() == :prod, deps: deps() @@ -29,17 +29,17 @@ defmodule Hello.Mixfile do # Type `mix help deps` for examples and options defp deps do [ - {:bandit, "~> 1.0.0-pre.5"}, + {:bandit, "~> 1.0.0"}, {:gettext, "~> 0.20"}, - {:ecto_sql, "~> 3.7"}, + {:ecto_sql, "~> 3.10"}, {:jason, "~> 1.2"}, {:phoenix, "~> 1.7"}, - {:phoenix_ecto, "~> 4.4"}, - {:phoenix_html, "~> 3.2"}, {:phoenix_live_view, "~> 0.18"}, + {:phoenix_ecto, "~> 4.4"}, + {:phoenix_html, "~> 4.1"}, {:plug_cowboy, "~> 2.5"}, - {:postgrex, "~> 0.15"}, - {:nebulex, "~> 2.4"} + {:postgrex, ">= 0.0.0"}, + {:nebulex, "~> 2.6"} ] end end diff --git a/frameworks/Elixir/phoenix/mix.lock b/frameworks/Elixir/phoenix/mix.lock index 415edcb0107..f3c8c288625 100644 --- a/frameworks/Elixir/phoenix/mix.lock +++ b/frameworks/Elixir/phoenix/mix.lock @@ -1,32 +1,32 @@ %{ - "bandit": {:hex, :bandit, "1.0.0-pre.5", "94b668f987a3b63f53123d2bdef1aaab73439eb02fcef7eb99032038206cab54", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0-pre", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "686da83f0c2cabd68cc221067ab43bc50af88c3e7fc8ef824a0b7039a978e383"}, - "castore": {:hex, :castore, "1.0.2", "0c6292ecf3e3f20b7c88408f00096337c4bfd99bd46cc2fe63413ddbe45b3573", [:mix], [], "hexpm", "40b2dd2836199203df8500e4a270f10fc006cc95adc8a319e148dc3077391d96"}, - "cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"}, + "bandit": {:hex, :bandit, "1.0.0", "2bd87bbf713d0eed0090f2fa162cd1676198122e6c2b68a201c706e354a6d5e5", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "32acf6ac030fee1f99fd9c3fcf81671911ae8637e0a61c98111861b466efafdb"}, + "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, + "cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, - "cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"}, - "db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"}, + "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "ecto": {:hex, :ecto, "3.10.1", "c6757101880e90acc6125b095853176a02da8f1afe056f91f1f90b80c9389822", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d2ac4255f1601bdf7ac74c0ed971102c6829dc158719b94bd30041bbad77f87a"}, - "ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"}, - "expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"}, - "gettext": {:hex, :gettext, "0.22.2", "6bfca374de34ecc913a28ba391ca184d88d77810a3e427afa8454a71a51341ac", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "8a2d389673aea82d7eae387e6a2ccc12660610080ae7beb19452cfdc1ec30f60"}, + "ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"}, + "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, + "expo": {:hex, :expo, "1.0.0", "647639267e088717232f4d4451526e7a9de31a3402af7fcbda09b27e9a10395a", [:mix], [], "hexpm", "18d2093d344d97678e8a331ca0391e85d29816f9664a25653fd7e6166827827c"}, + "gettext": {:hex, :gettext, "0.25.0", "98a95a862a94e2d55d24520dd79256a15c87ea75b49673a2e2f206e6ebc42e5d", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "38e5d754e66af37980a94fb93bb20dcde1d2361f664b0a19f01e87296634051f"}, "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, - "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, - "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, - "nebulex": {:hex, :nebulex, "2.5.1", "8ffbde30643e76d6cec712281ca68ab05f73170de9e758a39bc7e4e6987f608f", [:mix], [{:decorator, "~> 1.4", [hex: :decorator, repo: "hexpm", optional: true]}, {:shards, "~> 1.1", [hex: :shards, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "8d0d3800d98c68ee19b229b7fe35fac0192ab5963a573612cf74a388e083bccf"}, - "phoenix": {:hex, :phoenix, "1.7.3", "4d8eca2c020c9ed81a28e7a8c60e0a4f6f9f7f6e12eb91dfd01301eac07424c1", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "6b1bc308758f95ecf3e0d795389440a2ca88a903e0fda1f921c780918c16d640"}, - "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.2", "b21bd01fdeffcfe2fab49e4942aa938b6d3e89e93a480d4aee58085560a0bc0d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "70242edd4601d50b69273b057ecf7b684644c19ee750989fd555625ae4ce8f5d"}, - "phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "0.19.0", "de5643d03e3cdf5ff19cd45b5d14543a3b1ad8551d529f6b24246e88a6c6f1b8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a650b6f814c4f386314b98f1aebf92f8652649166612f84ef2e60a20894addfa"}, - "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.2", "a4950b63ace57720b0fc1c6da083c53346b36f99021de89595cc4f026288ff51", [:mix], [], "hexpm", "45741676a94c71f9afdfed9d22d49b6856c026ff504db04e3dc03a1d86f8201c"}, - "phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"}, - "plug": {:hex, :plug, "1.14.2", "cff7d4ec45b4ae176a227acd94a7ab536d9b37b942c8e8fa6dfc0fff98ff4d80", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "842fc50187e13cf4ac3b253d47d9474ed6c296a8732752835ce4a86acdf68d13"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"}, - "postgrex": {:hex, :postgrex, "0.17.1", "01c29fd1205940ee55f7addb8f1dc25618ca63a8817e56fac4f6846fc2cddcbe", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "14b057b488e73be2beee508fb1955d8db90d6485c6466428fe9ccf1d6692a555"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "nebulex": {:hex, :nebulex, "2.6.3", "78af348ed9f8a338871b41e0b6de718c1808e627ce03fbe86598cbda2bdda2f5", [:mix], [{:decorator, "~> 1.4", [hex: :decorator, repo: "hexpm", optional: true]}, {:shards, "~> 1.1", [hex: :shards, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "09cdcbb62f8463ffcec7cae4936425ce91e25d92a6cd37e48b5dda7c851958d5"}, + "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.2", "3b83b24ab5a2eb071a20372f740d7118767c272db386831b2e77638c4dcc606d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "3f94d025f59de86be00f5f8c5dd7b5965a3298458d21ab1c328488be3b5fcd59"}, + "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, + "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, + "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.7.1", "87677ffe3b765bc96a89be7960f81703223fe2e21efa42c125fcd0127dd9d6b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "02dbd5f9ab571b864ae39418db7811618506256f6d13b4a45037e5fe78dc5de3"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, + "postgrex": {:hex, :postgrex, "0.19.0", "f7d50e50cb42e0a185f5b9a6095125a9ab7e4abccfbe2ab820ab9aa92b71dbab", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "dba2d2a0a8637defbf2307e8629cb2526388ba7348f67d04ec77a5d6a72ecfae"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, - "thousand_island": {:hex, :thousand_island, "1.0.0-pre.3", "67b31809769736031b240339fa5096a6e491b7d7ec5e0e37ee80cab10e8712a9", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "75602046418b2510aac3c968b2941778187fe88256010116834903b806d77f53"}, - "websock": {:hex, :websock, "0.5.1", "c496036ce95bc26d08ba086b2a827b212c67e7cabaa1c06473cd26b40ed8cf10", [:mix], [], "hexpm", "b9f785108b81cd457b06e5f5dabe5f65453d86a99118b2c0a515e1e296dc2d2c"}, - "websock_adapter": {:hex, :websock_adapter, "0.5.1", "292e6c56724e3457e808e525af0e9bcfa088cc7b9c798218e78658c7f9b85066", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "8e2e1544bfde5f9d0442f9cec2f5235398b224f75c9e06b60557debf64248ec1"}, + "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, + "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"}, } diff --git a/frameworks/Elixir/phoenix/phoenix-bandit.dockerfile b/frameworks/Elixir/phoenix/phoenix-bandit.dockerfile deleted file mode 100644 index 103350fc6db..00000000000 --- a/frameworks/Elixir/phoenix/phoenix-bandit.dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -ARG ELIXIR="1.14.5" -ARG ERLANG="26.0" -ARG ALPINE="3.17.3" - -ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR}-erlang-${ERLANG}-alpine-${ALPINE}" -ARG RUNNER_IMAGE="alpine:${ALPINE}" - -FROM ${BUILDER_IMAGE} AS builder - -ARG MIX_ENV="bandit" - -RUN mix local.hex --force && \ - mix local.rebar --force - -COPY mix.exs mix.lock ./ -RUN mix deps.get --force --only prod - -COPY config ./config - -RUN mix deps.compile - -COPY priv ./priv -COPY lib ./lib - -COPY rel ./rel -RUN mix release --force --path /export - -# start a new build stage so that the final image will only contain -# the compiled release and other runtime necessities -FROM ${RUNNER_IMAGE} - -RUN apk add --no-cache libstdc++ openssl ncurses-libs - -COPY --from=builder /export /opt - -EXPOSE 8080 - -ENTRYPOINT ["/opt/bin/hello"] -CMD ["start"] diff --git a/frameworks/Elixir/phoenix/phoenix.dockerfile b/frameworks/Elixir/phoenix/phoenix.dockerfile index c9e0d7701b2..dcf8df3dd20 100644 --- a/frameworks/Elixir/phoenix/phoenix.dockerfile +++ b/frameworks/Elixir/phoenix/phoenix.dockerfile @@ -1,6 +1,6 @@ -ARG ELIXIR="1.14.5" -ARG ERLANG="26.0" -ARG ALPINE="3.17.3" +ARG ELIXIR="1.17.2" +ARG ERLANG="27.0.1" +ARG ALPINE="3.19.3" ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR}-erlang-${ERLANG}-alpine-${ALPINE}" ARG RUNNER_IMAGE="alpine:${ALPINE}" diff --git a/frameworks/Elixir/plug/elixir-plug-ecto.dockerfile b/frameworks/Elixir/plug/elixir-plug-ecto.dockerfile index a674dd80178..c943ba48991 100644 --- a/frameworks/Elixir/plug/elixir-plug-ecto.dockerfile +++ b/frameworks/Elixir/plug/elixir-plug-ecto.dockerfile @@ -1,6 +1,6 @@ -ARG ELIXIR="1.14.2" -ARG ERLANG="25.1.2" -ARG ALPINE="3.16.2" +ARG ELIXIR="1.17.2" +ARG ERLANG="27.0.1" +ARG ALPINE="3.19.3" ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR}-erlang-${ERLANG}-alpine-${ALPINE}" ARG RUNNER_IMAGE="alpine:${ALPINE}" diff --git a/frameworks/Elixir/plug/mix.exs b/frameworks/Elixir/plug/mix.exs index 1660a684b65..dcb29917a46 100644 --- a/frameworks/Elixir/plug/mix.exs +++ b/frameworks/Elixir/plug/mix.exs @@ -4,8 +4,8 @@ defmodule FrameworkBenchmarks.MixProject do def project do [ app: :framework_benchmarks, - version: "1.1.0", - elixir: "~> 1.14", + version: "1.1.1", + elixir: "~> 1.17", start_permanent: Mix.env() == :prod, deps: deps() ] @@ -24,10 +24,10 @@ defmodule FrameworkBenchmarks.MixProject do [ {:plug_cowboy, "~> 2.5"}, {:jason, "~> 1.4"}, - {:ecto_sql, "~> 3.8"}, - {:postgrex, "~> 0.16"}, - {:cachex, "~> 3.4"}, - {:phoenix_html, "~> 3.2"} + {:ecto_sql, "~> 3.10"}, + {:postgrex, ">= 0.0.0"}, + {:cachex, "~> 3.6"}, + {:phoenix_html, "~> 4.1"} ] end end diff --git a/frameworks/Elixir/plug/mix.lock b/frameworks/Elixir/plug/mix.lock index 324fedc25f8..fcc35f892b8 100644 --- a/frameworks/Elixir/plug/mix.lock +++ b/frameworks/Elixir/plug/mix.lock @@ -1,27 +1,23 @@ %{ "cachex": {:hex, :cachex, "3.6.0", "14a1bfbeee060dd9bec25a5b6f4e4691e3670ebda28c8ba2884b12fe30b36bf8", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "ebf24e373883bc8e0c8d894a63bbe102ae13d918f790121f5cfe6e485cc8e2e2"}, - "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"}, + "cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, - "cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"}, - "db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"}, + "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "ecto": {:hex, :ecto, "3.10.1", "c6757101880e90acc6125b095853176a02da8f1afe056f91f1f90b80c9389822", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d2ac4255f1601bdf7ac74c0ed971102c6829dc158719b94bd30041bbad77f87a"}, - "ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"}, - "eljiffy": {:hex, :eljiffy, "1.3.0", "7e584be454c5ec3fc3ae472eedb4cb2185e9ed6cd863df383ef601de3f3b27fd", [:mix], [{:jiffy, "~> 1.0", [hex: :jiffy, repo: "hexpm", optional: false]}], "hexpm", "90420512d60fb45bc9c09221b4d89cc539c9bfefc1c62f24cb3e2cb13acf2215"}, + "ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"}, + "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, - "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, - "jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"}, - "jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"}, - "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, - "phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"}, - "plug": {:hex, :plug, "1.14.2", "cff7d4ec45b4ae176a227acd94a7ab536d9b37b942c8e8fa6dfc0fff98ff4d80", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "842fc50187e13cf4ac3b253d47d9474ed6c296a8732752835ce4a86acdf68d13"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"}, - "postgrex": {:hex, :postgrex, "0.17.1", "01c29fd1205940ee55f7addb8f1dc25618ca63a8817e56fac4f6846fc2cddcbe", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "14b057b488e73be2beee508fb1955d8db90d6485c6466428fe9ccf1d6692a555"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "jumper": {:hex, :jumper, "1.0.2", "68cdcd84472a00ac596b4e6459a41b3062d4427cbd4f1e8c8793c5b54f1406a7", [:mix], [], "hexpm", "9b7782409021e01ab3c08270e26f36eb62976a38c1aa64b2eaf6348422f165e1"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, + "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.7.1", "87677ffe3b765bc96a89be7960f81703223fe2e21efa42c125fcd0127dd9d6b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "02dbd5f9ab571b864ae39418db7811618506256f6d13b4a45037e5fe78dc5de3"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, + "postgrex": {:hex, :postgrex, "0.19.0", "f7d50e50cb42e0a185f5b9a6095125a9ab7e4abccfbe2ab820ab9aa92b71dbab", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "dba2d2a0a8637defbf2307e8629cb2526388ba7348f67d04ec77a5d6a72ecfae"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, - "sleeplocks": {:hex, :sleeplocks, "1.1.2", "d45aa1c5513da48c888715e3381211c859af34bee9b8290490e10c90bb6ff0ca", [:rebar3], [], "hexpm", "9fe5d048c5b781d6305c1a3a0f40bb3dfc06f49bf40571f3d2d0c57eaa7f59a5"}, + "sleeplocks": {:hex, :sleeplocks, "1.1.3", "96a86460cc33b435c7310dbd27ec82ca2c1f24ae38e34f8edde97f756503441a", [:rebar3], [], "hexpm", "d3b3958552e6eb16f463921e70ae7c767519ef8f5be46d7696cc1ed649421321"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, - "ucol": {:hex, :ucol, "2.0.0", "64f9589d682dac6ca59252e1222e22697784f74addd0b88c5e34d53d267356bb", [:rebar3], [], "hexpm", "b544b88ce034d1d1ab58e093744cbded9a1e8b05006870b4d3865d6cd5066a21"}, - "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"}, + "unsafe": {:hex, :unsafe, "1.0.2", "23c6be12f6c1605364801f4b47007c0c159497d0446ad378b5cf05f1855c0581", [:mix], [], "hexpm", "b485231683c3ab01a9cd44cb4a79f152c6f3bb87358439c6f68791b85c2df675"}, } From 61ebc1487c02ebff63be9d467151f7b1b919775d Mon Sep 17 00:00:00 2001 From: Daniil Zotov <142039751+zoto-ff@users.noreply.github.com> Date: Wed, 14 Aug 2024 18:05:20 +0300 Subject: [PATCH 0759/1766] Update Bun (#9211) * update bun * use bun build --compile * kill children on parent exit --- frameworks/TypeScript/bun/bun.dockerfile | 8 +++++--- frameworks/TypeScript/bun/src/index.ts | 14 +++++++------- frameworks/TypeScript/bun/src/spawn.ts | 17 +++++++++++++---- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/frameworks/TypeScript/bun/bun.dockerfile b/frameworks/TypeScript/bun/bun.dockerfile index 7692c8c82ae..ecf6ead2bbc 100644 --- a/frameworks/TypeScript/bun/bun.dockerfile +++ b/frameworks/TypeScript/bun/bun.dockerfile @@ -1,13 +1,15 @@ -FROM oven/bun:1.0 +FROM oven/bun:1.1 EXPOSE 8080 WORKDIR /app -USER bun - COPY ./src . ENV NODE_ENV=production +RUN bun build --compile --minify --outfile server . + +USER bun + CMD ["bun", "spawn.ts"] diff --git a/frameworks/TypeScript/bun/src/index.ts b/frameworks/TypeScript/bun/src/index.ts index be72a268363..45c0f303291 100644 --- a/frameworks/TypeScript/bun/src/index.ts +++ b/frameworks/TypeScript/bun/src/index.ts @@ -1,5 +1,5 @@ -const HELLO_WORLD_STR = "Hello, World!"; -const options: ResponseInit = { headers: { "Server": "Bun" } }; +const plainOptions: ResponseInit = { headers: { "Server": "Bun" } }; +const jsonOptions: ResponseInit = { headers: { "Server": "Bun", "Content-Type": "application/json" } }; const server = Bun.serve({ port: 8080, @@ -7,16 +7,16 @@ const server = Bun.serve({ fetch(req: Request) { const pathname = req.url.slice(req.url.indexOf("/", 8)); - if (pathname === "/json") { - return Response.json({ message: HELLO_WORLD_STR }, options); + if (pathname == "/json") { + return new Response(JSON.stringify({ message: "Hello, World!" }), jsonOptions); } - if (pathname === "/plaintext") { - return new Response(HELLO_WORLD_STR, options); + if (pathname == "/plaintext") { + return new Response("Hello, World!", plainOptions); } return new Response("", { status: 404 }) }, }); -console.log(`Listening on localhost:${server.port}`); +console.log(`Listening on ${server.url}\n`); diff --git a/frameworks/TypeScript/bun/src/spawn.ts b/frameworks/TypeScript/bun/src/spawn.ts index b3df7f03253..a6d990c1b67 100644 --- a/frameworks/TypeScript/bun/src/spawn.ts +++ b/frameworks/TypeScript/bun/src/spawn.ts @@ -1,9 +1,18 @@ -import os from "node:os"; +const cpus = navigator.hardwareConcurrency; +const buns = new Array(cpus); -const numCPUs = os.cpus().length; -for (let i = 0; i < numCPUs; i++) { - Bun.spawn(["bun", "index.ts"], { +for (let i = 0; i < cpus; i++) { + buns[i] = Bun.spawn(["./server"], { stdio: ["inherit", "inherit", "inherit"], env: { ...process.env }, }); } + +function kill() { + for (const bun of buns) { + bun.kill(); + } +} + +process.on("SIGINT", kill); +process.on("exit", kill); \ No newline at end of file From a3ff92743d6947417d589fdc1623e977698180a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=81=D1=82=D1=8F=20=D0=A2=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8F=D0=BA?= Date: Wed, 14 Aug 2024 18:06:57 +0300 Subject: [PATCH 0760/1766] feat(ditsmod): upgrade npm packages and added bun integration. (#9213) --- .../TypeScript/ditsmod/benchmark_config.json | 132 ++++++++++++++++++ frameworks/TypeScript/ditsmod/bun.lockb | Bin 0 -> 59387 bytes .../ditsmod/ditsmod-bun-mysql.dockerfile | 17 +++ .../ditsmod/ditsmod-bun-postgres.dockerfile | 17 +++ .../TypeScript/ditsmod/ditsmod-bun.dockerfile | 12 ++ .../ditsmod/ditsmod-mysql.dockerfile | 2 +- .../ditsmod/ditsmod-postgres.dockerfile | 2 +- .../TypeScript/ditsmod/ditsmod.dockerfile | 2 +- frameworks/TypeScript/ditsmod/package.json | 11 +- .../TypeScript/ditsmod/src/app/app.module.ts | 9 +- .../app/bun-integration/bun-application.ts | 17 +++ .../src/app/bun-integration/bun-providers.ts | 21 +++ .../src/app/bun-integration/node-res.ts | 61 ++++++++ .../src/app/bun-integration/pre-router.ts | 26 ++++ .../ditsmod/src/app/bun-integration/spawn.ts | 9 ++ frameworks/TypeScript/ditsmod/src/main.bun.ts | 12 ++ frameworks/TypeScript/ditsmod/tsconfig.json | 15 +- 17 files changed, 349 insertions(+), 16 deletions(-) create mode 100755 frameworks/TypeScript/ditsmod/bun.lockb create mode 100644 frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile create mode 100644 frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile create mode 100644 frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile create mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts create mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts create mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts create mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts create mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts create mode 100644 frameworks/TypeScript/ditsmod/src/main.bun.ts diff --git a/frameworks/TypeScript/ditsmod/benchmark_config.json b/frameworks/TypeScript/ditsmod/benchmark_config.json index 42122a11d69..c16c9419bde 100755 --- a/frameworks/TypeScript/ditsmod/benchmark_config.json +++ b/frameworks/TypeScript/ditsmod/benchmark_config.json @@ -130,6 +130,138 @@ "display_name": "ditsmod [mysql & simplified use of di]", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "nodejs" + }, + "bun": { + "dockerfile": "ditsmod-bun.dockerfile", + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Ditsmod", + "language": "TypeScript", + "flavor": "None", + "orm": "None", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Ditsmod on bun", + "notes": "", + "versus": "bun" + }, + "simplified-di-bun": { + "dockerfile": "ditsmod-bun.dockerfile", + "json_url": "/json2", + "plaintext_url": "/plaintext2", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Ditsmod", + "language": "TypeScript", + "flavor": "None", + "orm": "None", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ditsmod on bun [simplified use of di]", + "notes": "Simplified use of Dependency Injection (no request level injector).", + "versus": "bun" + }, + "postgres-bun": { + "dockerfile": "ditsmod-bun-postgres.dockerfile", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "cached_query_url": "/cached-queries?count=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Ditsmod", + "language": "TypeScript", + "flavor": "None", + "orm": "Raw", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ditsmod on bun [postgres]", + "notes": "", + "versus": "bun" + }, + "mysql-bun": { + "dockerfile": "ditsmod-bun-mysql.dockerfile", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "cached_query_url": "/cached-queries?count=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "MySQL", + "framework": "Ditsmod", + "language": "TypeScript", + "flavor": "None", + "orm": "Raw", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ditsmod on bun [mysql]", + "notes": "", + "versus": "bun" + }, + "postgres2-bun": { + "dockerfile": "ditsmod-bun-postgres.dockerfile", + "db_url": "/db2", + "query_url": "/queries2?queries=", + "update_url": "/updates2?queries=", + "cached_query_url": "/cached-queries2?count=", + "fortune_url": "/fortunes2", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Ditsmod", + "language": "TypeScript", + "flavor": "None", + "orm": "Raw", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ditsmod on bun [postgres & simplified use of di]", + "notes": "Simplified use of Dependency Injection (no request level injector).", + "versus": "bun" + }, + "mysql2-bun": { + "dockerfile": "ditsmod-bun-mysql.dockerfile", + "db_url": "/db2", + "query_url": "/queries2?queries=", + "update_url": "/updates2?queries=", + "cached_query_url": "/cached-queries2?count=", + "fortune_url": "/fortunes2", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "MySQL", + "framework": "Ditsmod", + "language": "TypeScript", + "flavor": "None", + "orm": "Raw", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ditsmod on bun [mysql & simplified use of di]", + "notes": "Simplified use of Dependency Injection (no request level injector).", + "versus": "bun" } } ] diff --git a/frameworks/TypeScript/ditsmod/bun.lockb b/frameworks/TypeScript/ditsmod/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..c15ebbf0d57fa7a70302adedf5ceb815a5c211fa GIT binary patch literal 59387 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 literal 0 HcmV?d00001 diff --git a/frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile new file mode 100644 index 00000000000..c6c56b41443 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile @@ -0,0 +1,17 @@ +FROM oven/bun:1.1 + +COPY ./ ./ + +RUN bun install +RUN bun run build + +ENV NODE_ENV production +ENV IS_BUN true +ENV DATABASE mysql +ENV MYSQL_HOST tfb-database +ENV MYSQL_USER benchmarkdbuser +ENV MYSQL_PSWD benchmarkdbpass +ENV MYSQL_DBNAME hello_world + +EXPOSE 8080 +CMD rm node_modules/@ditsmod/*/tsconfig.json && bun src/app/bun-integration/spawn.ts diff --git a/frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile new file mode 100644 index 00000000000..6d10f0bfc7b --- /dev/null +++ b/frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile @@ -0,0 +1,17 @@ +FROM oven/bun:1.1 + +COPY ./ ./ + +RUN bun install +RUN bun run build + +ENV NODE_ENV production +ENV IS_BUN true +ENV DATABASE postgres +ENV PG_HOST tfb-database +ENV PG_USER benchmarkdbuser +ENV PG_PSWD benchmarkdbpass +ENV PG_DBNAME hello_world + +EXPOSE 8080 +CMD rm node_modules/@ditsmod/*/tsconfig.json && bun src/app/bun-integration/spawn.ts diff --git a/frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile new file mode 100644 index 00000000000..d18c49cab44 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile @@ -0,0 +1,12 @@ +FROM oven/bun:1.1 + +COPY ./ ./ + +RUN bun install +RUN bun run build + +ENV NODE_ENV production +ENV IS_BUN true + +EXPOSE 8080 +CMD rm node_modules/@ditsmod/*/tsconfig.json && bun src/app/bun-integration/spawn.ts diff --git a/frameworks/TypeScript/ditsmod/ditsmod-mysql.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-mysql.dockerfile index 4136e2ae860..95ad40e9ac8 100644 --- a/frameworks/TypeScript/ditsmod/ditsmod-mysql.dockerfile +++ b/frameworks/TypeScript/ditsmod/ditsmod-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.17.1-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/ditsmod/ditsmod-postgres.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-postgres.dockerfile index 5ef79595757..89ecc3e80a8 100644 --- a/frameworks/TypeScript/ditsmod/ditsmod-postgres.dockerfile +++ b/frameworks/TypeScript/ditsmod/ditsmod-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.17.1-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/ditsmod/ditsmod.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod.dockerfile index 882239148ce..0b21155188a 100644 --- a/frameworks/TypeScript/ditsmod/ditsmod.dockerfile +++ b/frameworks/TypeScript/ditsmod/ditsmod.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.17.1-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/ditsmod/package.json b/frameworks/TypeScript/ditsmod/package.json index 962d11cc65f..3d74a7822de 100755 --- a/frameworks/TypeScript/ditsmod/package.json +++ b/frameworks/TypeScript/ditsmod/package.json @@ -19,18 +19,19 @@ "author": "Костя Третяк", "license": "MIT", "dependencies": { - "@ditsmod/core": "~2.51.1", - "@ditsmod/routing": "~2.1.0", + "@ditsmod/core": "~2.54.2", + "@ditsmod/routing": "~2.3.0", "handlebars": "^4.7.8", - "lru-cache": "^10.0.1", - "mariadb": "^3.2.1", - "postgres": "^3.3.5" + "lru-cache": "^11.0.0", + "mariadb": "^3.3.1", + "postgres": "^3.4.4" }, "devDependencies": { "@types/eslint": "^8.44.2", "@types/node": "^20.5.7", "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^6.5.0", + "bun-types": "^1.1.22", "eslint": "^8.48.0", "prettier": "^3.0.2", "typescript": "^5.2.2" diff --git a/frameworks/TypeScript/ditsmod/src/app/app.module.ts b/frameworks/TypeScript/ditsmod/src/app/app.module.ts index 4874719f9cc..e0c1dfedcec 100644 --- a/frameworks/TypeScript/ditsmod/src/app/app.module.ts +++ b/frameworks/TypeScript/ditsmod/src/app/app.module.ts @@ -1,8 +1,13 @@ -import { Providers, rootModule } from '@ditsmod/core'; +import { PreRouter, rootModule } from '@ditsmod/core'; + import { SimpleModule } from '#routed/simple/simple.module.js'; +import { BunPreRouter } from './bun-integration/pre-router.js'; +import { BunProviders } from './bun-integration/bun-providers.js'; @rootModule({ appends: [SimpleModule], - providersPerApp: [...new Providers().useLogConfig({ level: 'off' })], + providersPerApp: [ + ...new BunProviders().useLogConfig({ level: 'off' }).if(process.env.IS_BUN).useClass(PreRouter, BunPreRouter), + ], }) export class AppModule {} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts new file mode 100644 index 00000000000..0b462db87bb --- /dev/null +++ b/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts @@ -0,0 +1,17 @@ +import { AnyFn, AppInitializer, Application } from '@ditsmod/core'; +import { Serve, Server } from 'bun'; + +export class BunApplication extends Application { + protected override createServer(requestListener: any): any { + const serveOptions = this.appOptions.serverOptions as Serve; + serveOptions.fetch ??= (req) => requestListener(req); + return Bun.serve(serveOptions); + } + + protected override async createServerAndBindToListening(appInitializer: AppInitializer, resolve: AnyFn) { + this.flushLogs(); + const server = (await this.createServer(appInitializer.requestListener)) as Server; + this.systemLogMediator.serverListen(this, server.hostname, server.port); + resolve({ server }); + } +} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts new file mode 100644 index 00000000000..0581973f421 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts @@ -0,0 +1,21 @@ +import { Providers, Class } from '@ditsmod/core'; + +export class BunProviders extends Providers { + protected setCondition?: boolean; + protected ifCondition?: boolean; + + if(condition: any) { + this.setCondition = true; + this.ifCondition = condition; + return this; + } + + override useClass(token: A, useClass: B, multi?: boolean): this { + if (!this.setCondition || this.ifCondition) { + this.pushProvider({ token, useClass }, multi); + } + this.setCondition = undefined; + this.ifCondition = undefined; + return this; + } +} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts new file mode 100644 index 00000000000..7dae8de27a6 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts @@ -0,0 +1,61 @@ +import { Writable } from 'node:stream'; + +export class NodeRes extends Writable { + #chunks: Buffer[] = []; + #resolve: (body: string) => void; + status: number = 200; + headers = {} as HeadersInit; + body = new Promise((resolve) => (this.#resolve = resolve)); + headersSent?: boolean; + statusText?: string; + + set statusCode(statusCode: number) { + this.status = statusCode; + } + + getHeader(name: string) { + return this.headers[name as keyof HeadersInit]; + } + + getHeaders() { + return this.headers; + } + + setHeader(name: string, value: number | string | readonly string[]) { + this.headers = { ...this.headers, [name]: value } as HeadersInit; + return this; + } + + writeHead(statusCode: number, headers?: HeadersInit): this; + writeHead(statusCode: number, statusMessage: string, headers?: HeadersInit): this; + writeHead(statusCode: number, statusMsgOrHeaders?: string | HeadersInit, headers?: HeadersInit): this { + this.status = statusCode; + if (typeof statusMsgOrHeaders == 'object') { + this.mergeHeaders(statusMsgOrHeaders); + } else { + this.statusText = statusMsgOrHeaders; + this.mergeHeaders(headers); + } + return this; + } + + override _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void { + this.#chunks.push(Buffer.from(chunk)); + callback(); + } + + override _final(callback: (error?: Error | null) => void): void { + const finalData = Buffer.concat(this.#chunks); + this.headersSent = true; + this.#resolve(finalData.toString()); + callback(); + } + + protected mergeHeaders(headers: HeadersInit = {}) { + if (Array.isArray(headers)) { + headers.forEach(([key, val]) => ((this.headers as any)[key] = val)); + } else { + this.headers = { ...this.headers, ...headers }; + } + } +} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts new file mode 100644 index 00000000000..26a0100e4e0 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts @@ -0,0 +1,26 @@ +import { PreRouter } from '@ditsmod/core'; +import { NodeRes } from './node-res.js'; + +export class BunPreRouter extends PreRouter { + override requestListener: any = async (req: Request) => { + const nodeReq = req as any; + const nodeRes = new NodeRes(); + + const url = new URL(req.url); + const uri = url.pathname; + const queryString = url.search.slice(1); + const { handle, params } = this.router.find(req.method as any, uri); + if (!handle) { + this.sendNotImplemented(nodeRes as any); + const body = await nodeRes.body; + return new Response(body, nodeRes); + } + + await handle(nodeReq, nodeRes as any, params!, queryString).catch((err) => { + this.sendInternalServerError(nodeRes as any, err); + }); + + const body = await nodeRes.body; + return new Response(body, nodeRes); + }; +} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts new file mode 100644 index 00000000000..439451029a4 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts @@ -0,0 +1,9 @@ +import os from 'node:os'; + +const numCPUs = os.cpus().length; +for (let i = 0; i < numCPUs; i++) { + Bun.spawn(['bun', 'dist/main.bun.js'], { + stdio: ['inherit', 'inherit', 'inherit'], + env: { ...process.env }, + }); +} diff --git a/frameworks/TypeScript/ditsmod/src/main.bun.ts b/frameworks/TypeScript/ditsmod/src/main.bun.ts new file mode 100644 index 00000000000..42c0798a066 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/src/main.bun.ts @@ -0,0 +1,12 @@ +import { Serve, Server } from 'bun'; + +import { AppModule } from './app/app.module.js'; +import { BunApplication } from './app/bun-integration/bun-application.js'; + +const reusePort = process.env.NODE_ENV == 'production'; +const serverOptions = { port: 8080, hostname: '0.0.0.0', reusePort } as Serve; +const { server } = await new BunApplication().bootstrap(AppModule, { + serverOptions: serverOptions as any, +}); + +const bunServer = server as unknown as Server; diff --git a/frameworks/TypeScript/ditsmod/tsconfig.json b/frameworks/TypeScript/ditsmod/tsconfig.json index 27c048aa781..ef1b58e6cb3 100644 --- a/frameworks/TypeScript/ditsmod/tsconfig.json +++ b/frameworks/TypeScript/ditsmod/tsconfig.json @@ -16,14 +16,17 @@ "noImplicitAny": true, "strictPropertyInitialization": false, "allowJs": false, - "paths": { - "#routed/*": ["./src/app/modules/routed/*"], - "#service/*": ["./src/app/modules/service/*"], - "#utils/*": ["./src/app/utils/*"], - } + "types": ["bun-types"], + // Bun works with bugs if this code is uncommented. + // "paths": { + // "#routed/*": ["./src/app/modules/routed/*"], + // "#service/*": ["./src/app/modules/service/*"], + // "#utils/*": ["./src/app/utils/*"], + // } }, "include": [ "src", - "test" + "test", + "./spawn.ts" ] } From b976fe8bccb062d06819a6f59440c6427e4d6859 Mon Sep 17 00:00:00 2001 From: Daniil Zotov <142039751+zoto-ff@users.noreply.github.com> Date: Wed, 14 Aug 2024 18:35:52 +0300 Subject: [PATCH 0761/1766] Update Elysia (#9212) * fix spawn.ts, update bun * update elysia, refactor /json and /plaintext * refactor db handlers * use bun build --compile --- frameworks/TypeScript/elysia/bun.lockb | Bin 4971 -> 4963 bytes .../elysia/elysia-postgres.dockerfile | 2 +- .../elysia/elysia-smol-postgres.dockerfile | 2 +- .../TypeScript/elysia/elysia.dockerfile | 2 +- frameworks/TypeScript/elysia/package.json | 11 +- frameworks/TypeScript/elysia/spawn.ts | 18 ++- .../TypeScript/elysia/src/db-handlers.ts | 118 +++++++++--------- frameworks/TypeScript/elysia/src/index.ts | 22 ++-- frameworks/TypeScript/elysia/src/postgres.ts | 12 +- frameworks/TypeScript/elysia/src/types.ts | 16 +-- 10 files changed, 105 insertions(+), 98 deletions(-) diff --git a/frameworks/TypeScript/elysia/bun.lockb b/frameworks/TypeScript/elysia/bun.lockb index a5f94fd2531601ff54fa87839a0663d66f7b3a7e..7e29924798c25d30517bcca2ed92c9934b0540fa 100755 GIT binary patch literal 4963 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 O9!-X(v7P6q@bBNZz1cbd diff --git a/frameworks/TypeScript/elysia/elysia-postgres.dockerfile b/frameworks/TypeScript/elysia/elysia-postgres.dockerfile index e3fda732c79..40ff868c528 100644 --- a/frameworks/TypeScript/elysia/elysia-postgres.dockerfile +++ b/frameworks/TypeScript/elysia/elysia-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.0 +FROM oven/bun:1.1 EXPOSE 8080 diff --git a/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile b/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile index c222841c81a..de7b9d63bb0 100644 --- a/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile +++ b/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.0 +FROM oven/bun:1.1 EXPOSE 8080 diff --git a/frameworks/TypeScript/elysia/elysia.dockerfile b/frameworks/TypeScript/elysia/elysia.dockerfile index c05d3f41878..3ed07652df1 100644 --- a/frameworks/TypeScript/elysia/elysia.dockerfile +++ b/frameworks/TypeScript/elysia/elysia.dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.0 +FROM oven/bun:1.1 EXPOSE 8080 diff --git a/frameworks/TypeScript/elysia/package.json b/frameworks/TypeScript/elysia/package.json index 082042b5f55..ba38bf05ee6 100644 --- a/frameworks/TypeScript/elysia/package.json +++ b/frameworks/TypeScript/elysia/package.json @@ -3,15 +3,16 @@ "version": "0.0.1", "module": "src/index.js", "devDependencies": { - "bun-types": "latest" + "bun-types": "^1.1.23", + "typescript": "^5.5.4" }, "scripts": { "dev": "bun run --watch src/index.ts", "start": "bun run src/index.ts", - "build": "bun build --target=bun --minify src/index.ts --outdir=build" + "build": "bun build --compile --minify --outfile server src/index.ts" }, "dependencies": { - "elysia": "^0.7.17", - "postgres": "^3.4.1" + "elysia": "^1.1.6", + "postgres": "^3.4.4" } -} +} \ No newline at end of file diff --git a/frameworks/TypeScript/elysia/spawn.ts b/frameworks/TypeScript/elysia/spawn.ts index ae02e7169a7..3bf8959c230 100644 --- a/frameworks/TypeScript/elysia/spawn.ts +++ b/frameworks/TypeScript/elysia/spawn.ts @@ -1,10 +1,18 @@ -import os from 'node:os'; +const cpus = navigator.hardwareConcurrency; +const buns = new Array(cpus); -// @ts-ignore -const numCPUs = os.availableParallelism(); -for (let i = 0; i < numCPUs; i++) { - Bun.spawn(['bun', 'build/index.js'], { +for (let i = 0; i < cpus; i++) { + buns[i] = Bun.spawn(['./server'], { stdio: ['inherit', 'inherit', 'inherit'], env: { ...process.env }, }); } + +function kill() { + for (const bun of buns) { + bun.kill(); + } +} + +process.on('SIGINT', kill); +process.on('exit', kill); \ No newline at end of file diff --git a/frameworks/TypeScript/elysia/src/db-handlers.ts b/frameworks/TypeScript/elysia/src/db-handlers.ts index 0e099d6d8b6..d75e91ff1a5 100644 --- a/frameworks/TypeScript/elysia/src/db-handlers.ts +++ b/frameworks/TypeScript/elysia/src/db-handlers.ts @@ -1,83 +1,77 @@ import Elysia from 'elysia'; -import * as postgres from './postgres'; -import { Fortune, World } from './types'; +import * as db from './postgres'; +import { Fortune } from './types'; -const deps = new Elysia({ - name: 'deps', -}) - .decorate('db', postgres) - .decorate('generateRandomNumber', () => Math.ceil(Math.random() * 10000)) - .decorate('html', (fortunes: Fortune[]) => { - const n = fortunes.length; - - let html = ''; - for (let i = 0; i < n; i++) { - html += `${fortunes[i].id}${Bun.escapeHTML( - fortunes[i].message - )}`; - } +function rand () { + return Math.ceil(Math.random() * 10000) +} - return `Fortunes${html}
idmessage
`; - }); +function parseQueriesNumber (q?: string) { + return Math.min(parseInt(q || '1') || 1, 500) +} + +function renderTemplate (fortunes: Fortune[]) { + const n = fortunes.length; + + let html = ''; + for (let i = 0; i < n; i++) { + html += `${fortunes[i].id}${Bun.escapeHTML( + fortunes[i].message + )}`; + } + + return `Fortunes${html}
idmessage
`; +} const dbHandlers = new Elysia({ name: 'db-handlers', }) - .use(deps) - .get( - '/db', - async ({ db, generateRandomNumber }) => - await db.find(generateRandomNumber()) - ) - .get( - '/fortunes', - async ({ db, html }) => { - const fortunes = await db.fortunes(); - - fortunes.push({ - id: 0, - message: 'Additional fortune added at request time.', - }); - - fortunes.sort((a, b) => (a.message < b.message ? -1 : 1)); - - return html(fortunes); - }, - { - afterHandle({ set }) { - set.headers['content-type'] = 'text/html; charset=utf-8'; - }, - } - ) - .derive(({ query }) => ({ - numberOfObjects: Math.min(parseInt(query.queries || '1') || 1, 500), - })) - .get('/queries', async ({ db, generateRandomNumber, numberOfObjects }) => { - const worldPromises = new Array>(numberOfObjects); - - for (let i = 0; i < numberOfObjects; i++) { - worldPromises[i] = db.find(generateRandomNumber()); - } + .onAfterHandle(({ set }) => { + set.headers['server'] = 'Elysia'; + }) - const worlds = await Promise.all(worldPromises); + .get('/db', () => db.find(rand())) - return worlds; + .get('/fortunes', async ({ set }) => { + const fortunes = await db.fortunes(); + + fortunes.push({ + id: 0, + message: 'Additional fortune added at request time.', + }); + + fortunes.sort((a, b) => (a.message < b.message ? -1 : 1)); + + set.headers['content-type'] = 'text/html; charset=utf-8'; + return renderTemplate(fortunes); + }) + + .get('/queries', async ({ query }) => { + const num = parseQueriesNumber(query.queries) + const worldPromises = new Array(num); + + for (let i = 0; i < num; i++) { + worldPromises[i] = db.find(rand()); + } + + return await Promise.all(worldPromises); }) - .get('/updates', async ({ db, generateRandomNumber, numberOfObjects }) => { - const worldPromises = new Array>(numberOfObjects); - for (let i = 0; i < numberOfObjects; i++) { - worldPromises[i] = db.find(generateRandomNumber()); + .get('/updates', async ({ query }) => { + const num = parseQueriesNumber(query.queries) + const worldPromises = new Array(num); + + for (let i = 0; i < num; i++) { + worldPromises[i] = db.find(rand()); } const worlds = await Promise.all(worldPromises); - for (let i = 0; i < numberOfObjects; i++) { - worlds[i].randomNumber = generateRandomNumber(); + for (let i = 0; i < num; i++) { + worlds[i].randomNumber = rand(); } await db.bulkUpdate(worlds); - return worlds; }); diff --git a/frameworks/TypeScript/elysia/src/index.ts b/frameworks/TypeScript/elysia/src/index.ts index dc0f0c8d20f..af24275c128 100644 --- a/frameworks/TypeScript/elysia/src/index.ts +++ b/frameworks/TypeScript/elysia/src/index.ts @@ -3,23 +3,27 @@ import dbHandlers from './db-handlers'; const app = new Elysia({ serve: { - // @ts-ignore reusePort: true, }, }) - .onAfterHandle(({ set }) => { + .get('/plaintext', ({ set }) => { set.headers['server'] = 'Elysia'; + return 'Hello, World!'; }) - .decorate('HELLO_WORLD_STR', 'Hello, World!') - .get('/plaintext', ({ HELLO_WORLD_STR }) => HELLO_WORLD_STR) - .get('/json', ({ HELLO_WORLD_STR }) => ({ message: HELLO_WORLD_STR })); -if (process.env.DATABASE) { + .get('/json', ({ set }) => { + set.headers = { + 'content-type': 'application/json', + 'server': 'Elysia', + }; + + return JSON.stringify({ message: 'Hello, World!' }); + }); + +if (Bun.env.DATABASE) { app.use(dbHandlers); } app.listen(8080); -console.info( - `🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}` -); +console.info(`🦊 Elysia is running at ${app.server!.url}`); diff --git a/frameworks/TypeScript/elysia/src/postgres.ts b/frameworks/TypeScript/elysia/src/postgres.ts index ae101fc0867..5c9ba1dbcbe 100644 --- a/frameworks/TypeScript/elysia/src/postgres.ts +++ b/frameworks/TypeScript/elysia/src/postgres.ts @@ -9,16 +9,16 @@ const sql = postgres({ max: 1, }); -export const fortunes = async () => - await sql`SELECT id, message FROM fortune`; +export const fortunes = () => + sql`SELECT id, message FROM fortune`; -export const find = async (id: number) => - await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( +export const find = (id: number) => + sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( (arr) => arr[0] ); -export const bulkUpdate = async (worlds: World[]) => - await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int +export const bulkUpdate = (worlds: World[]) => + sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int FROM (VALUES ${sql( worlds .map((world) => [world.id, world.randomNumber]) diff --git a/frameworks/TypeScript/elysia/src/types.ts b/frameworks/TypeScript/elysia/src/types.ts index a40a9a0c7b2..6863ea8f4aa 100644 --- a/frameworks/TypeScript/elysia/src/types.ts +++ b/frameworks/TypeScript/elysia/src/types.ts @@ -1,9 +1,9 @@ -export type Fortune = { - id: number; - message: string; -}; +export interface Fortune { + id: number + message: string +} -export type World = { - id: number; - randomNumber: number; -}; +export interface World { + id: number + randomNumber: number +} From b669efdbd0df11fe54e0551294f4fc03e5ea9c96 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 14 Aug 2024 17:36:05 +0200 Subject: [PATCH 0762/1766] [ruby/sinatra-sequel] Use erb for templates (#8990) erb templates have better performance than slim templates. This also makes it more inline with the Ruby/sinatra tests, which also use erb. --- frameworks/Ruby/sinatra-sequel/Gemfile | 1 - frameworks/Ruby/sinatra-sequel/hello_world.rb | 5 +---- frameworks/Ruby/sinatra-sequel/views/fortunes.erb | 12 ++++++++++++ frameworks/Ruby/sinatra-sequel/views/fortunes.slim | 8 -------- frameworks/Ruby/sinatra-sequel/views/layout.erb | 11 +++++++++++ frameworks/Ruby/sinatra-sequel/views/layout.slim | 6 ------ 6 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 frameworks/Ruby/sinatra-sequel/views/fortunes.erb delete mode 100644 frameworks/Ruby/sinatra-sequel/views/fortunes.slim create mode 100644 frameworks/Ruby/sinatra-sequel/views/layout.erb delete mode 100644 frameworks/Ruby/sinatra-sequel/views/layout.slim diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 649fbcfe6bf..f4ac3eb1fe2 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -5,7 +5,6 @@ gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' gem 'sinatra', '~> 3.0', :require=>'sinatra/base' -gem 'slim', '~> 3.0' gem 'unicorn', '~> 6.1', :platforms=>[:ruby, :mswin], :require=>false group :mysql do diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index e04d76a077b..822ceb5979c 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -1,8 +1,5 @@ # frozen_string_literal: true -# Configure Slim templating engine -Slim::Engine.set_options :format=>:html, :sort_attrs=>false - # Our Rack application to be executed by rackup class HelloWorld < Sinatra::Base configure do @@ -73,7 +70,7 @@ def rand1 ) @fortunes.sort_by!(&:message) - slim :fortunes + erb :fortunes, :layout=>true end # Test type 5: Database updates diff --git a/frameworks/Ruby/sinatra-sequel/views/fortunes.erb b/frameworks/Ruby/sinatra-sequel/views/fortunes.erb new file mode 100644 index 00000000000..3d27f4dc50f --- /dev/null +++ b/frameworks/Ruby/sinatra-sequel/views/fortunes.erb @@ -0,0 +1,12 @@ + + + + + +<% @fortunes.each do |fortune| %> + + + + +<% end %> +
idmessage
<%= fortune.id %><%= Rack::Utils.escape_html(fortune.message) %>
diff --git a/frameworks/Ruby/sinatra-sequel/views/fortunes.slim b/frameworks/Ruby/sinatra-sequel/views/fortunes.slim deleted file mode 100644 index 14c18a58bc7..00000000000 --- a/frameworks/Ruby/sinatra-sequel/views/fortunes.slim +++ /dev/null @@ -1,8 +0,0 @@ -table - tr - th id - th message - - for fortune in @fortunes - tr - td =fortune.id - td =fortune.message \ No newline at end of file diff --git a/frameworks/Ruby/sinatra-sequel/views/layout.erb b/frameworks/Ruby/sinatra-sequel/views/layout.erb new file mode 100644 index 00000000000..7d6715a3e98 --- /dev/null +++ b/frameworks/Ruby/sinatra-sequel/views/layout.erb @@ -0,0 +1,11 @@ + + + + Fortunes + + + +<%= yield %> + + + diff --git a/frameworks/Ruby/sinatra-sequel/views/layout.slim b/frameworks/Ruby/sinatra-sequel/views/layout.slim deleted file mode 100644 index 2be47605c04..00000000000 --- a/frameworks/Ruby/sinatra-sequel/views/layout.slim +++ /dev/null @@ -1,6 +0,0 @@ -doctype html -html - head - title Fortunes - body - == yield \ No newline at end of file From 3846a22bae0db2769b9db22d23f1498ca0ad2ddb Mon Sep 17 00:00:00 2001 From: jaguililla Date: Thu, 15 Aug 2024 23:22:33 +0200 Subject: [PATCH 0763/1766] Update dependencies and change settings --- frameworks/Kotlin/hexagon/build.gradle | 6 +++--- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43504 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 7 +++++-- frameworks/Kotlin/hexagon/gradlew.bat | 2 ++ .../hexagon/hexagon-helidon-native.dockerfile | 2 ++ .../hexagon-helidon-pgclient.dockerfile | 9 +++++---- .../Kotlin/hexagon/hexagon-helidon.dockerfile | 9 +++++---- .../hexagon/hexagon-jetty-native.dockerfile | 2 ++ .../hexagon-jettyloom-pgclient.dockerfile | 7 ++++--- .../hexagon/hexagon-jettyloom.dockerfile | 7 ++++--- .../hexagon-nettyepoll-pgclient.dockerfile | 7 ++++--- .../hexagon/hexagon-nettyepoll.dockerfile | 7 ++++--- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 7 ++++--- frameworks/Kotlin/hexagon/hexagon.dockerfile | 7 ++++--- .../src/main/kotlin/BenchmarkPgClientStore.kt | 12 +++++++++--- 16 files changed, 58 insertions(+), 35 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index a4d141e5c2a..5f11a1c40a2 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,6 +1,6 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.0.20-RC" apply false + id "org.jetbrains.kotlin.jvm" version "2.0.10" apply false id "org.graalvm.buildtools.native" version "0.10.2" apply false } @@ -9,7 +9,7 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.6.1" + hexagonVersion = "3.6.2" jettyVersion = "12.0.12" nettyVersion = "4.1.112.Final" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.9" + gradleVersion = "8.10" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 34463 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 SXRcJ{65?fGI57uQ5&!`B?F@7P delta 34554 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 diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 09523c0e549..9355b415575 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.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index 1aa94a42690..f5feea6d6b1 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat index 25da30dbdee..9d21a21834d 100644 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ b/frameworks/Kotlin/hexagon/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index c402f0ee792..25a78904f79 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile @@ -16,6 +16,8 @@ RUN ./gradlew --quiet -x test hexagon_helidon_pgclient:nativeCompile FROM scratch ARG PROJECT=hexagon_helidon_pgclient +ENV maximumPoolSize 300 + COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / ENTRYPOINT [ "/hexagon_helidon_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index 3b3a1602f55..f11c4e7b2bd 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile @@ -1,22 +1,23 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-22-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-22-musl ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 271fa95dbf8..27177de5eb9 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile @@ -1,22 +1,23 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-22-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-22-musl ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile index 2919fdba8b7..b8efc965eb3 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile @@ -16,6 +16,8 @@ RUN ./gradlew --quiet -x test hexagon_jetty_postgresql:nativeCompile FROM scratch ARG PROJECT=hexagon_jetty_postgresql +ENV maximumPoolSize 300 + COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / ENTRYPOINT [ "/hexagon_jetty_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index d6c37bcd77f..21ef3b64c8b 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_jetty_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 07bf482b28e..c51c03bc6db 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index 972347f053b..90c5a0d03c8 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_nettyepoll_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 393f73f62a6..35a0e4729b7 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_nettyepoll_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 32e153cbc0a..42f28071128 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test war +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test war # # RUNTIME @@ -17,5 +17,6 @@ ARG MODULE=/hexagon/hexagon_tomcat_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build $MODULE/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 59f89e5cb5c..2654c706db1 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt index 1fb9547353f..510abda0295 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt +++ b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt @@ -6,8 +6,10 @@ import com.hexagonkt.model.CachedWorld import com.hexagonkt.model.Fortune import com.hexagonkt.model.World import io.vertx.core.Future +import io.vertx.core.Vertx +import io.vertx.core.VertxOptions +import io.vertx.pgclient.PgBuilder import io.vertx.pgclient.PgConnectOptions -import io.vertx.pgclient.PgPool import io.vertx.sqlclient.* import org.cache2k.Cache @@ -35,11 +37,15 @@ class BenchmarkPgClientStore( private val poolOptions: PoolOptions by lazy { PoolOptions().apply { val environment = Jvm.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() - maxSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + maxSize = Jvm.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize } } - private val dataSource: SqlClient by lazy { PgPool.client(connectOptions, poolOptions) } + private val dataSource: SqlClient by lazy { + val vertx = Vertx.vertx(VertxOptions().setPreferNativeTransport(true)) + PgBuilder.client().using(vertx).connectingTo(connectOptions).with(poolOptions).build() + } override fun findAllFortunes(): List = dataSource.preparedQuery(SELECT_ALL_FORTUNES) From 02764ebed3b95d09611908ee3b50c7e6c5881462 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 08:33:58 -0700 Subject: [PATCH 0764/1766] Bump webob from 1.7.2 to 1.8.8 in /frameworks/Python/morepath (#9215) Bumps [webob](https://github.com/Pylons/webob) from 1.7.2 to 1.8.8. - [Changelog](https://github.com/Pylons/webob/blob/main/CHANGES.txt) - [Commits](https://github.com/Pylons/webob/compare/1.7.2...1.8.8) --- updated-dependencies: - dependency-name: webob dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/morepath/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/morepath/requirements.txt b/frameworks/Python/morepath/requirements.txt index b1ff4b72a3a..8f58488b64e 100644 --- a/frameworks/Python/morepath/requirements.txt +++ b/frameworks/Python/morepath/requirements.txt @@ -12,6 +12,6 @@ pony==0.7.1 psycopg2==2.7.5 reg==0.11 repoze.lru==0.6 -WebOb==1.7.2 +WebOb==1.8.8 -e . From 9c9b8678aabb9aa783f8379c8cd0e318771cd0b5 Mon Sep 17 00:00:00 2001 From: LLT21 <43903768+LLT21@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:06:15 +0200 Subject: [PATCH 0765/1766] Appmpowerv8.0.5: using native AOT dll instead of exe (#9214) * New Npgsql security update * Middleware alternative * NativeAOT calls * hellloWorld -> helloWorld * Reduce external calls * JsonMiddleware * JsonMessage built in NativeAOT * mac dylibs * Size and content separate * Small corrections * JsonMessage * JsonMessage struct * Rename nativeAOT -> appMpowerAot * Working single query, but slow * Odbc test * dockerfile changes * Try to get correct capitalization * 2nd part trial for correct capitalization * Dbms and DbProvider parameterization * linux-x64 * NativeMethods * Kestrel header * Header http * Using marshalling and out parameter * Header changes * FreeUnmanagedPointer * Correction single query * JsonMessage pointer handling * Native last methods for JsonMessage and hello world * Sync db read * Create new json message * Rename appMpowerAot -> appMpower.Orm * Fortunes * Synchronous fortunes read * Server settings * Empty line * More correct special characters length * Remove ADO and InternalConnection * Synchronous only * Cleanup * Name changes * Multiple queries * Cleanup * Alternative native methods * MultipleUpdates * odbcCommand dictionary * keyed commands * Refactoring * Remove comments * First MySQL trial * MySQL odbc * zip file mariadb connector * Better download ? * dockerfile cleanup * charset * Cached queries * Improved caching * Improved caching * Removal unnecessary packages * Cleanup project * appMpower cleanup * appMpower.Orm cleanup * Too much cleanup --------- Co-authored-by: LLT21 <> --- .../appmpower/appmpower-ado-pg.dockerfile | 17 - .../appmpower/appmpower-odbc-my.dockerfile | 51 ++ .../appmpower/appmpower-odbc-pg.dockerfile | 8 +- .../CSharp/appmpower/appmpower.dockerfile | 6 + .../CSharp/appmpower/benchmark_config.json | 8 +- frameworks/CSharp/appmpower/config.toml | 4 +- frameworks/CSharp/appmpower/odbcinst.ini | 10 + .../appmpower/src/CachedWorldSerializer.cs | 15 - .../CSharp/appmpower/src/Data/DbConnection.cs | 200 ------- .../appmpower/src/Data/DbConnections.cs | 67 --- .../appmpower/src/Data/DbProviderFactory.cs | 17 - .../appmpower/src/Data/InternalConnection.cs | 16 - .../CSharp/appmpower/src/HttpApplication.cs | 117 ---- .../CSharp/appmpower/src/JsonMessage.cs | 7 - .../CSharp/appmpower/src/Kestrel/Json.cs | 58 -- .../CSharp/appmpower/src/Kestrel/PlainText.cs | 38 -- .../appmpower/src/Kestrel/ServiceProvider.cs | 25 - .../CSharp/appmpower/src/Memory/CacheEntry.cs | 257 --------- .../appmpower/src/Memory/CacheEntryHelper.cs | 32 -- .../appmpower/src/Memory/CacheEntryState.cs | 62 --- .../appmpower/src/Memory/CacheEntryTokens.cs | 140 ----- .../appmpower/src/Memory/MemoryCache.cs | 520 ------------------ .../src/Memory/MemoryCacheOptions.cs | 67 --- .../CSharp/appmpower/src/Microsoft/CachKey.cs | 24 - .../src/Microsoft/StringBuilderCache.cs | 59 -- frameworks/CSharp/appmpower/src/Program.cs | 42 -- frameworks/CSharp/appmpower/src/RawDb.cs | 331 ----------- .../appmpower/src/appMpower.Orm/Constants.cs | 10 + .../src/{ => appMpower.Orm}/Data/DbCommand.cs | 105 ++-- .../src/appMpower.Orm/Data/DbConnection.cs | 153 ++++++ .../src/appMpower.Orm/Data/DbConnections.cs | 61 ++ .../src/appMpower.Orm/Data/DbProvider.cs | 8 + .../appMpower.Orm/Data/DbProviderFactory.cs | 21 + .../appmpower/src/appMpower.Orm/Data/Dbms.cs | 9 + .../src/appMpower.Orm/DotnetMethods.cs | 66 +++ .../src/{ => appMpower.Orm}/FortunesView.cs | 21 +- .../Microsoft/BatchUpdateString.cs | 56 +- .../Microsoft/ConcurrentRandom.cs | 2 - .../Microsoft/StringBuilderCache.cs | 54 ++ .../src/appMpower.Orm/NativeMethods.cs | 144 +++++ .../Objects}/CachedWorld.cs | 2 +- .../{ => appMpower.Orm/Objects}/Fortune.cs | 4 +- .../src/{ => appMpower.Orm/Objects}/World.cs | 2 +- .../appmpower/src/appMpower.Orm/RawDb.cs | 257 +++++++++ .../Serializers/IJsonSerializer.cs | 9 + .../Serializers}/WorldSerializer.cs | 6 +- .../Serializers/WorldsSerizalizer.cs | 24 + .../appMpower.Orm.csproj} | 97 ++-- .../appmpower/src/appMpower/JsonMessage.cs | 7 + .../appMpower/Middleware/CachingMiddelware.cs | 120 ++++ .../Middleware/FortunesMiddleware.cs | 58 ++ .../appMpower/Middleware/JsonMiddleware.cs | 64 +++ .../Middleware/MultipleQueriesMiddleware.cs | 62 +++ .../Middleware/MultipleUpdatesMiddleware.cs | 62 +++ .../Middleware/PlaintextMiddleware.cs | 50 ++ .../Middleware/SingleQueryMiddleware.cs | 57 ++ .../appmpower/src/appMpower/NativeMethods.cs | 62 +++ .../CSharp/appmpower/src/appMpower/Program.cs | 44 ++ .../Serializers}/IJsonSerializer.cs | 2 +- .../Serializers}/JsonMessageSerializer.cs | 6 +- .../CSharp/appmpower/src/appMpower/Startup.cs | 56 ++ .../appmpower/src/appMpower/appMpower.csproj | 35 ++ .../appmpower/src/appMpower/appsettings.json | 9 + .../src/{ => appMpower}/nuget.config | 0 frameworks/CSharp/appmpower/src/src.sln | 28 + 65 files changed, 1728 insertions(+), 2303 deletions(-) delete mode 100644 frameworks/CSharp/appmpower/appmpower-ado-pg.dockerfile create mode 100644 frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile delete mode 100644 frameworks/CSharp/appmpower/src/CachedWorldSerializer.cs delete mode 100644 frameworks/CSharp/appmpower/src/Data/DbConnection.cs delete mode 100644 frameworks/CSharp/appmpower/src/Data/DbConnections.cs delete mode 100644 frameworks/CSharp/appmpower/src/Data/DbProviderFactory.cs delete mode 100644 frameworks/CSharp/appmpower/src/Data/InternalConnection.cs delete mode 100644 frameworks/CSharp/appmpower/src/HttpApplication.cs delete mode 100644 frameworks/CSharp/appmpower/src/JsonMessage.cs delete mode 100644 frameworks/CSharp/appmpower/src/Kestrel/Json.cs delete mode 100644 frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs delete mode 100644 frameworks/CSharp/appmpower/src/Kestrel/ServiceProvider.cs delete mode 100644 frameworks/CSharp/appmpower/src/Memory/CacheEntry.cs delete mode 100644 frameworks/CSharp/appmpower/src/Memory/CacheEntryHelper.cs delete mode 100644 frameworks/CSharp/appmpower/src/Memory/CacheEntryState.cs delete mode 100644 frameworks/CSharp/appmpower/src/Memory/CacheEntryTokens.cs delete mode 100644 frameworks/CSharp/appmpower/src/Memory/MemoryCache.cs delete mode 100644 frameworks/CSharp/appmpower/src/Memory/MemoryCacheOptions.cs delete mode 100644 frameworks/CSharp/appmpower/src/Microsoft/CachKey.cs delete mode 100644 frameworks/CSharp/appmpower/src/Microsoft/StringBuilderCache.cs delete mode 100644 frameworks/CSharp/appmpower/src/Program.cs delete mode 100644 frameworks/CSharp/appmpower/src/RawDb.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Constants.cs rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm}/Data/DbCommand.cs (52%) create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProvider.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProviderFactory.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Data/Dbms.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm}/FortunesView.cs (54%) rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm}/Microsoft/BatchUpdateString.cs (54%) rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm}/Microsoft/ConcurrentRandom.cs (95%) create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/StringBuilderCache.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm/Objects}/CachedWorld.cs (88%) rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm/Objects}/Fortune.cs (93%) rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm/Objects}/World.cs (78%) create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/IJsonSerializer.cs rename frameworks/CSharp/appmpower/src/{ => appMpower.Orm/Serializers}/WorldSerializer.cs (68%) create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/WorldsSerizalizer.cs rename frameworks/CSharp/appmpower/src/{appMpower.csproj => appMpower.Orm/appMpower.Orm.csproj} (52%) create mode 100644 frameworks/CSharp/appmpower/src/appMpower/JsonMessage.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Middleware/JsonMiddleware.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Middleware/PlaintextMiddleware.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Program.cs rename frameworks/CSharp/appmpower/src/{Kestrel => appMpower/Serializers}/IJsonSerializer.cs (81%) rename frameworks/CSharp/appmpower/src/{ => appMpower/Serializers}/JsonMessageSerializer.cs (58%) create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Startup.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj create mode 100644 frameworks/CSharp/appmpower/src/appMpower/appsettings.json rename frameworks/CSharp/appmpower/src/{ => appMpower}/nuget.config (100%) create mode 100644 frameworks/CSharp/appmpower/src/src.sln diff --git a/frameworks/CSharp/appmpower/appmpower-ado-pg.dockerfile b/frameworks/CSharp/appmpower/appmpower-ado-pg.dockerfile deleted file mode 100644 index 2e7234ca98d..00000000000 --- a/frameworks/CSharp/appmpower/appmpower-ado-pg.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build -RUN apt-get update -RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5 - -WORKDIR /app -COPY src . -RUN dotnet publish -c Release -o out /p:Driver=ado - -# Construct the actual image that will run -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime - -WORKDIR /app -COPY --from=build /app/out ./ - -EXPOSE 8080 - -ENTRYPOINT ["./appMpower"] \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile b/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile new file mode 100644 index 00000000000..a5bbf22ae6f --- /dev/null +++ b/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile @@ -0,0 +1,51 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +RUN apt-get update +RUN apt-get -yqq install clang zlib1g-dev +RUN apt-get update + +WORKDIR /app +COPY src . +RUN dotnet publish -c Release -o out /p:Database=mysql + +# Construct the actual image that will run +FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime + +RUN apt-get update +# The following installs standard versions unixodbc and pgsqlodbc +# unixodbc still needs to be installed even if compiled locally +RUN apt-get install -y unixodbc wget curl +RUN apt-get update + +WORKDIR /odbc + +RUN curl -L -o mariadb-connector-odbc-3.1.20-debian-bookworm-amd64.tar.gz https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.20/mariadb-connector-odbc-3.1.20-debian-bookworm-amd64.tar.gz +RUN tar -xvzf mariadb-connector-odbc-3.1.20-debian-bookworm-amd64.tar.gz +RUN cp mariadb-connector-odbc-3.1.20-debian-bookworm-amd64/lib/mariadb/libm* /usr/lib/ +RUN cp -r /odbc/mariadb-connector-odbc-3.1.20-debian-bookworm-amd64/lib/mariadb /usr/local/lib/mariadb +RUN rm mariadb-connector-odbc-3.1.20-debian-bookworm-amd64.tar.gz +#TODOLOCAL +#RUN curl -L -o mariadb-connector-odbc-3.1.20-debian-bookworm-aarch64.tar.gz https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.20/mariadb-connector-odbc-3.1.20-debian-bookworm-aarch64.tar.gz +#RUN tar -xvzf mariadb-connector-odbc-3.1.20-debian-bookworm-aarch64.tar.gz +#RUN cp mariadb-connector-odbc-3.1.20-debian-bookworm-aarch64/lib/mariadb/libm* /usr/lib/ +#RUN cp -r /odbc/mariadb-connector-odbc-3.1.20-debian-bookworm-aarch64/lib/mariadb /usr/local/lib/mariadb +#RUN rm mariadb-connector-odbc-3.1.20-debian-bookworm-aarch64.tar.gz + +ENV PATH=/usr/local/unixODBC/bin:$PATH + +WORKDIR /etc/ +COPY odbcinst.ini . + +# Full PGO +ENV DOTNET_TieredPGO 1 +ENV DOTNET_TC_QuickJitForLoops 1 +ENV DOTNET_ReadyToRun 0 + +ENV ASPNETCORE_URLS http://+:8080 +WORKDIR /app +COPY --from=build /app/out ./ + +RUN cp /usr/lib/libm* /app + +EXPOSE 8080 + +ENTRYPOINT ["./appMpower"] \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile b/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile index c06865cc0b2..4080684bab6 100644 --- a/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile @@ -4,7 +4,7 @@ RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5 WORKDIR /app COPY src . -RUN dotnet publish -c Release -o out /p:Driver=odbc +RUN dotnet publish -c Release -o out /p:Database=postgresql # Construct the actual image that will run FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime @@ -18,6 +18,12 @@ ENV PATH=/usr/local/unixODBC/bin:$PATH WORKDIR /etc/ COPY odbcinst.ini . +# Full PGO +ENV DOTNET_TieredPGO 1 +ENV DOTNET_TC_QuickJitForLoops 1 +ENV DOTNET_ReadyToRun 0 + +ENV ASPNETCORE_URLS http://+:8080 WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/appmpower/appmpower.dockerfile b/frameworks/CSharp/appmpower/appmpower.dockerfile index 7f77873dfaf..3d521c490d8 100644 --- a/frameworks/CSharp/appmpower/appmpower.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower.dockerfile @@ -4,11 +4,17 @@ RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5 WORKDIR /app COPY src . +#RUN dotnet publish appMpower/appMpower.csproj -c Release -o out RUN dotnet publish -c Release -o out # Construct the actual image that will run FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime +# Full PGO +ENV DOTNET_TieredPGO 1 +ENV DOTNET_TC_QuickJitForLoops 1 +ENV DOTNET_ReadyToRun 0 +ENV ASPNETCORE_URLS http://+:8080 WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/appmpower/benchmark_config.json b/frameworks/CSharp/appmpower/benchmark_config.json index 6c22c0c65af..46dc7e7c00f 100644 --- a/frameworks/CSharp/appmpower/benchmark_config.json +++ b/frameworks/CSharp/appmpower/benchmark_config.json @@ -39,11 +39,11 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "appMpower [aot-no-reflection,odbc]", + "display_name": "appMpower [aot-no-reflection,pg,odbc]", "notes": "", "versus": "aspnetcore-minimal" }, - "ado-pg": { + "odbc-my": { "db_url": "/db", "query_url": "/queries?c=", "update_url": "/updates?c=", @@ -52,7 +52,7 @@ "port": 8080, "approach": "Realistic", "classification": "Platform", - "database": "Postgres", + "database": "MySQL", "framework": "appmpower", "language": "C#", "orm": "Raw", @@ -61,7 +61,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "appMpower [aot-no-reflection,ado]", + "display_name": "appMpower [aot-no-reflection,my,odbc]", "notes": "", "versus": "aspnetcore-minimal" } diff --git a/frameworks/CSharp/appmpower/config.toml b/frameworks/CSharp/appmpower/config.toml index d500b2df989..a3747682191 100644 --- a/frameworks/CSharp/appmpower/config.toml +++ b/frameworks/CSharp/appmpower/config.toml @@ -30,7 +30,7 @@ platform = ".NET" webserver = "Kestrel" versus = "aspnetcore-minimal" -[ado-pg] +[odbc-my] urls.db = "/db" urls.query = "/queries?c=" urls.update = "/updates?c=" @@ -38,7 +38,7 @@ urls.fortune = "/fortunes" urls.cached_query = "/cached-worlds?c=" approach = "Realistic" classification = "Micro" -database = "Postgres" +database = "MySQL" database_os = "Linux" os = "Linux" orm = "Raw" diff --git a/frameworks/CSharp/appmpower/odbcinst.ini b/frameworks/CSharp/appmpower/odbcinst.ini index c6260e38b93..544ba2067c1 100644 --- a/frameworks/CSharp/appmpower/odbcinst.ini +++ b/frameworks/CSharp/appmpower/odbcinst.ini @@ -5,6 +5,7 @@ Pooling=0 [ODBC Drivers] PostgreSQL = Installed +MariaDB = Installed ; ; odbcinst.ini @@ -15,7 +16,16 @@ Description=ODBC for PostgreSQL ; in version 08.x. Note that the library can also be installed under an other ; path than /usr/local/lib/ following your installation. ; This is the standard location used by apt-get install -y unixodbc +;ON SERVER Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so +;TODOLOCAL: ON MAC +;Driver =/usr/lib/aarch64-linux-gnu/odbc/psqlodbcw.so + ;Driver =/usr/local/pgsqlodbc/lib/psqlodbcw.so Threading = 0 CPTimeout = 0 + +[MariaDB] +Description=MariaDB ODBC for MySQL +Driver = /usr/lib/libmaodbc.so +Threading = 0 \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/CachedWorldSerializer.cs b/frameworks/CSharp/appmpower/src/CachedWorldSerializer.cs deleted file mode 100644 index f7c78b6dd65..00000000000 --- a/frameworks/CSharp/appmpower/src/CachedWorldSerializer.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Text.Json; - -namespace appMpower -{ - public class CachedWorldSerializer : Kestrel.IJsonSerializer - { - public void Serialize(Utf8JsonWriter utf8JsonWriter, CachedWorld world) - { - utf8JsonWriter.WriteStartObject(); - utf8JsonWriter.WriteNumber("id", world.Id); - utf8JsonWriter.WriteNumber("randomNumber", world.RandomNumber); - utf8JsonWriter.WriteEndObject(); - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Data/DbConnection.cs b/frameworks/CSharp/appmpower/src/Data/DbConnection.cs deleted file mode 100644 index 916e251a9c8..00000000000 --- a/frameworks/CSharp/appmpower/src/Data/DbConnection.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System.Collections.Concurrent; -using System.Data; -using System.Threading.Tasks; - -namespace appMpower.Data -{ - public class DbConnection : IDbConnection - { - private string _connectionString; - internal InternalConnection _internalConnection; - - public DbConnection() - { - _connectionString = DbProviderFactory.ConnectionString; - } - - public DbConnection(string connectionString) - { - _connectionString = connectionString; - } - - internal ConcurrentDictionary DbCommands - { - get - { - return _internalConnection.DbCommands; - } - set - { - _internalConnection.DbCommands = value; - } - } - - public short Number - { - get - { - return _internalConnection.Number; - } - set - { - _internalConnection.Number = value; - } - } - - public IDbConnection Connection - { - get - { - return _internalConnection.DbConnection; - } - set - { - _internalConnection.DbConnection = value; - } - } - - public string ConnectionString - { - get - { - return _internalConnection.DbConnection.ConnectionString; - } - set - { - _internalConnection.DbConnection.ConnectionString = value; - } - } - - public int ConnectionTimeout - { - get - { - return _internalConnection.DbConnection.ConnectionTimeout; - } - } - - public string Database - { - get - { - return _internalConnection.DbConnection.Database; - } - } - - public ConnectionState State - { - get - { - if (_internalConnection is null) return ConnectionState.Closed; - return _internalConnection.DbConnection.State; - } - } - - public IDbTransaction BeginTransaction() - { - return _internalConnection.DbConnection.BeginTransaction(); - } - - public IDbTransaction BeginTransaction(IsolationLevel il) - { - return _internalConnection.DbConnection.BeginTransaction(il); - } - - public void ChangeDatabase(string databaseName) - { - _internalConnection.DbConnection.ChangeDatabase(databaseName); - } - - public void Close() - { - _internalConnection.DbConnection.Close(); - } - - public async Task CloseAsync() - { - await (_internalConnection.DbConnection as System.Data.Common.DbConnection).CloseAsync(); - } - - public IDbCommand CreateCommand() - { - return _internalConnection.DbConnection.CreateCommand(); - } - - public void Open() - { - if (_internalConnection.DbConnection.State == ConnectionState.Closed) - { - _internalConnection.DbConnection.Open(); - } - } - - public void Dispose() - { -#if ADO - _internalConnection.DbConnection.Dispose(); - _internalConnection.Dispose(); -#else - DbConnections.Release(_internalConnection); -#endif - } - - public async Task OpenAsync() - { -#if ADO && POSTGRESQL - _internalConnection = new(); - _internalConnection.DbConnection = new Npgsql.NpgsqlConnection(_connectionString); -#else - if (_internalConnection is null) - { - _internalConnection = await DbConnections.GetConnection(_connectionString); - } -#endif - - if (_internalConnection.DbConnection.State == ConnectionState.Closed) - { - await (_internalConnection.DbConnection as System.Data.Common.DbConnection).OpenAsync(); - } - } - - internal DbCommand GetCommand(string commandText, CommandType commandType, DbCommand dbCommand) - { -#if ADO - dbCommand.Command = _internalConnection.DbConnection.CreateCommand(); - dbCommand.Command.CommandText = commandText; - dbCommand.Command.CommandType = commandType; - dbCommand.DbConnection = this; -#else - DbCommand internalCommand; - - if (_internalConnection.DbCommands.TryRemove(commandText, out internalCommand)) - { - dbCommand.Command = internalCommand.Command; - dbCommand.DbConnection = internalCommand.DbConnection; - } - else - { - dbCommand.Command = _internalConnection.DbConnection.CreateCommand(); - dbCommand.Command.CommandText = commandText; - dbCommand.Command.CommandType = commandType; - dbCommand.DbConnection = this; - - //For non odbc drivers like Npgsql which do not support Prepare - dbCommand.Command.Prepare(); - - //Console.WriteLine("prepare pool connection: " + this._internalConnection.Number + " for command " + _internalConnection.DbCommands.Count); - } -#endif - - return dbCommand; - } - - public void ReleaseCommand(DbCommand dbCommand) - { -#if !ADO - _internalConnection.DbCommands.TryAdd(dbCommand.CommandText, dbCommand); -#endif - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Data/DbConnections.cs b/frameworks/CSharp/appmpower/src/Data/DbConnections.cs deleted file mode 100644 index 0b513a3d47f..00000000000 --- a/frameworks/CSharp/appmpower/src/Data/DbConnections.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.Collections.Concurrent; -using System.Threading.Tasks; - -namespace appMpower.Data -{ - public static class DbConnections - { - private static bool _connectionsCreated = false; - private static short _createdConnections = 0; - private static short _maxConnections = 500; - - private static ConcurrentStack _stack = new(); - private static ConcurrentQueue> _waitingQueue = new(); - - public static async Task GetConnection(string connectionString) - { - InternalConnection internalConnection = null; - - if (_connectionsCreated) - { - if (!_stack.TryPop(out internalConnection)) - { - internalConnection = await GetDbConnectionAsync(); - } - - return internalConnection; - } - else - { - internalConnection = new InternalConnection(); - internalConnection.DbConnection = new System.Data.Odbc.OdbcConnection(connectionString); - - _createdConnections++; - - if (_createdConnections == _maxConnections) _connectionsCreated = true; - - internalConnection.Number = _createdConnections; - internalConnection.DbCommands = new ConcurrentDictionary(); - //Console.WriteLine("opened connection number: " + dbConnection.Number); - - return internalConnection; - } - } - - public static Task GetDbConnectionAsync() - { - var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - - _waitingQueue.Enqueue(taskCompletionSource); - return taskCompletionSource.Task; - } - - public static void Release(InternalConnection internalConnection) - { - TaskCompletionSource taskCompletionSource; - - if (_waitingQueue.TryDequeue(out taskCompletionSource)) - { - taskCompletionSource.SetResult(internalConnection); - } - else - { - _stack.Push(internalConnection); - } - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Data/DbProviderFactory.cs b/frameworks/CSharp/appmpower/src/Data/DbProviderFactory.cs deleted file mode 100644 index 98a4aa67cb6..00000000000 --- a/frameworks/CSharp/appmpower/src/Data/DbProviderFactory.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Data; - -namespace appMpower.Data -{ - public static class DbProviderFactory - { -#if MYSQL - public const string ConnectionString = "Driver={MariaDB};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;Pooling=false;OPTIONS=67108864;FLAG_FORWARD_CURSOR=1"; -#elif ADO - public const string ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=0;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; - //public const string ConnectionString = "Server=localhost;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; -#else - public const string ConnectionString = "Driver={PostgreSQL};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;UseServerSidePrepare=1;Pooling=false"; - //public const string ConnectionString = "Driver={PostgreSQL};Server=localhost;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;UseServerSidePrepare=1;Pooling=false"; -#endif - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Data/InternalConnection.cs b/frameworks/CSharp/appmpower/src/Data/InternalConnection.cs deleted file mode 100644 index 25cecfeb4f8..00000000000 --- a/frameworks/CSharp/appmpower/src/Data/InternalConnection.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Concurrent; -using System.Data; - -namespace appMpower.Data -{ - public class InternalConnection : System.IDisposable - { - public short Number { get; set; } - public IDbConnection DbConnection { get; set; } - public ConcurrentDictionary DbCommands { get; set; } - - public void Dispose() - { - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/HttpApplication.cs b/frameworks/CSharp/appmpower/src/HttpApplication.cs deleted file mode 100644 index 1eac250ede5..00000000000 --- a/frameworks/CSharp/appmpower/src/HttpApplication.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Hosting.Server; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features; -using appMpower.Kestrel; - -namespace appMpower -{ - public class HttpApplication : IHttpApplication - { - public static readonly byte[] _plainText = Encoding.UTF8.GetBytes("Hello, World!"); - private readonly static JsonMessageSerializer _jsonMessageSerializer = new JsonMessageSerializer(); - private readonly static WorldSerializer _worldSerializer = new WorldSerializer(); - private readonly static CachedWorldSerializer _cachedWorldSerializer = new CachedWorldSerializer(); - - public IFeatureCollection CreateContext(IFeatureCollection featureCollection) - { - return featureCollection; - } - - public async Task ProcessRequestAsync(IFeatureCollection featureCollection) - { - var request = featureCollection as IHttpRequestFeature; - var httpResponse = featureCollection as IHttpResponseFeature; - var httpResponseBody = featureCollection as IHttpResponseBodyFeature; - - PathString pathString = request.Path; - - if (pathString.HasValue) - { - int pathStringLength = pathString.Value.Length; - string pathStringStart = pathString.Value.Substring(1, 1); - - if (pathStringLength == 10 && pathStringStart == "p") - { - //await PlainText.RenderAsync(httpResponse.Headers, httpResponseBody.Writer, _plainText); - PlainText.Render(httpResponse.Headers, httpResponseBody, _plainText); - return; - } - else if (pathStringLength == 5 && pathStringStart == "j") - { - Json.RenderOne(httpResponse.Headers, httpResponseBody.Writer, new JsonMessage { message = "Hello, World!" }, _jsonMessageSerializer); - return; - } - else if (pathStringLength == 3 && pathStringStart == "d") - { - Json.RenderOne(httpResponse.Headers, httpResponseBody.Writer, await RawDb.LoadSingleQueryRow(), _worldSerializer); - return; - } - else if (pathStringLength == 8 && pathStringStart == "q") - { - int count = 1; - - if (!Int32.TryParse(request.QueryString.Substring(request.QueryString.LastIndexOf("=") + 1), out count) || count < 1) - { - count = 1; - } - else if (count > 500) - { - count = 500; - } - -#if ADO - Json.RenderMany(httpResponse.Headers, httpResponseBody.Writer, await RawDb.LoadMultipleQueriesRows(count), _worldSerializer); -#else - Json.RenderMany(httpResponse.Headers, httpResponseBody.Writer, await RawDb.ReadMultipleRows(count), _worldSerializer); -#endif - - return; - } - else if (pathStringLength == 9 && pathStringStart == "f") - { - await FortunesView.Render(httpResponse.Headers, httpResponseBody.Writer, await RawDb.LoadFortunesRows()); - return; - } - else if (pathStringLength == 8 && pathStringStart == "u") - { - int count = 1; - - if (!Int32.TryParse(request.QueryString.Substring(request.QueryString.LastIndexOf("=") + 1), out count) || count < 1) - { - count = 1; - } - else if (count > 500) - { - count = 500; - } - - Json.RenderMany(httpResponse.Headers, httpResponseBody.Writer, await RawDb.LoadMultipleUpdatesRows(count), _worldSerializer); - return; - } - else if (pathStringLength == 14 && pathStringStart == "c") - { - int count = 1; - - if (!Int32.TryParse(request.QueryString.Substring(request.QueryString.LastIndexOf("=") + 1), out count) || count < 1) - { - count = 1; - } - else if (count > 500) - { - count = 500; - } - - Json.RenderMany(httpResponse.Headers, httpResponseBody.Writer, await RawDb.LoadCachedQueries(count), _cachedWorldSerializer); - return; - } - } - } - - public void DisposeContext(IFeatureCollection featureCollection, Exception exception) - { - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/JsonMessage.cs b/frameworks/CSharp/appmpower/src/JsonMessage.cs deleted file mode 100644 index 24b78265baa..00000000000 --- a/frameworks/CSharp/appmpower/src/JsonMessage.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace appMpower -{ - public struct JsonMessage - { - public string message { get; set; } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Kestrel/Json.cs b/frameworks/CSharp/appmpower/src/Kestrel/Json.cs deleted file mode 100644 index c81028e2a9b..00000000000 --- a/frameworks/CSharp/appmpower/src/Kestrel/Json.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO.Pipelines; -using System.Text.Json; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Primitives; - -namespace appMpower.Kestrel -{ - public static class Json - { - private readonly static KeyValuePair _headerServer = - new KeyValuePair("Server", "k"); - private readonly static KeyValuePair _headerContentType = - new KeyValuePair("Content-Type", "application/json"); - - [ThreadStatic] - private static Utf8JsonWriter _utf8JsonWriter; - - public static JsonWriterOptions _jsonWriterOptions = new JsonWriterOptions - { - SkipValidation = true - }; - - public static void RenderOne(IHeaderDictionary headerDictionary, PipeWriter pipeWriter, T t, IJsonSerializer jsonSerializer) - { - headerDictionary.Add(_headerServer); - headerDictionary.Add(_headerContentType); - - Utf8JsonWriter utf8JsonWriter = _utf8JsonWriter ??= new Utf8JsonWriter(pipeWriter, new JsonWriterOptions { SkipValidation = true }); - utf8JsonWriter.Reset(pipeWriter); - - jsonSerializer.Serialize(utf8JsonWriter, t); - utf8JsonWriter.Flush(); - headerDictionary.Add(new KeyValuePair("Content-Length", utf8JsonWriter.BytesCommitted.ToString())); - } - - public static void RenderMany(IHeaderDictionary headerDictionary, PipeWriter pipeWriter, T[] tArray, IJsonSerializer jsonSerializer) - { - headerDictionary.Add(_headerServer); - headerDictionary.Add(_headerContentType); - - Utf8JsonWriter utf8JsonWriter = _utf8JsonWriter ??= new Utf8JsonWriter(pipeWriter, new JsonWriterOptions { SkipValidation = true }); - utf8JsonWriter.Reset(pipeWriter); - - utf8JsonWriter.WriteStartArray(); - - foreach (var t in tArray) - { - jsonSerializer.Serialize(utf8JsonWriter, t); - } - - utf8JsonWriter.WriteEndArray(); - utf8JsonWriter.Flush(); - headerDictionary.Add(new KeyValuePair("Content-Length", utf8JsonWriter.BytesCommitted.ToString())); - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs b/frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs deleted file mode 100644 index e7ead33aa2e..00000000000 --- a/frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Threading.Tasks; -using System.Collections.Generic; -using System.IO.Pipelines; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Primitives; -using Microsoft.AspNetCore.Http.Features; - -namespace appMpower.Kestrel -{ - public static class PlainText - { - private readonly static KeyValuePair _headerServer = - new KeyValuePair("Server", new StringValues("k")); - private readonly static KeyValuePair _headerContentType = - new KeyValuePair("Content-Type", new StringValues("text/plain")); - - public static async Task RenderAsync(IHeaderDictionary headerDictionary, PipeWriter pipeWriter, ReadOnlyMemory utf8String) - { - headerDictionary.Add(_headerServer); - headerDictionary.Add(_headerContentType); - headerDictionary.Add(new KeyValuePair("Content-Length", utf8String.Length.ToString())); - - await pipeWriter.WriteAsync(utf8String); - pipeWriter.Complete(); - } - - public static void Render(IHeaderDictionary headerDictionary, IHttpResponseBodyFeature httpResponseBodyFeature, byte[] utf8String) - { - headerDictionary.Add(_headerServer); - headerDictionary.Add(_headerContentType); - int length = utf8String.Length; - headerDictionary.Add(new KeyValuePair("Content-Length", length.ToString())); - - httpResponseBodyFeature.Stream.Write(utf8String, 0, length); - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Kestrel/ServiceProvider.cs b/frameworks/CSharp/appmpower/src/Kestrel/ServiceProvider.cs deleted file mode 100644 index 513174e68b9..00000000000 --- a/frameworks/CSharp/appmpower/src/Kestrel/ServiceProvider.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; - -namespace appMpower.Kestrel -{ - public class ServiceProvider : ISupportRequiredService, IServiceProvider - { - public object GetRequiredService(Type serviceType) - { - return GetService(serviceType); - } - - public object GetService(Type serviceType) - { - if (serviceType == typeof(ILoggerFactory)) - { - return NullLoggerFactory.Instance; - } - - return null; - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Memory/CacheEntry.cs b/frameworks/CSharp/appmpower/src/Memory/CacheEntry.cs deleted file mode 100644 index 55ca29c4984..00000000000 --- a/frameworks/CSharp/appmpower/src/Memory/CacheEntry.cs +++ /dev/null @@ -1,257 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.Caching.Memory; - -namespace appMpower.Memory -{ - internal sealed partial class CacheEntry : ICacheEntry - { - private static readonly Action ExpirationCallback = ExpirationTokensExpired; - - private readonly MemoryCache _cache; - - private CacheEntryTokens _tokens; // might be null if user is not using the tokens or callbacks - private TimeSpan? _absoluteExpirationRelativeToNow; - private TimeSpan? _slidingExpiration; - private long? _size; - private CacheEntry _previous; // this field is not null only before the entry is added to the cache and tracking is enabled - private object _value; - private CacheEntryState _state; - - internal CacheEntry(object key, MemoryCache memoryCache) - { - Key = key ?? throw new ArgumentNullException(nameof(key)); - _cache = memoryCache ?? throw new ArgumentNullException(nameof(memoryCache)); - _previous = memoryCache.TrackLinkedCacheEntries ? CacheEntryHelper.EnterScope(this) : null; - _state = new CacheEntryState(CacheItemPriority.Normal); - } - - /// - /// Gets or sets an absolute expiration date for the cache entry. - /// - public DateTimeOffset? AbsoluteExpiration { get; set; } - - /// - /// Gets or sets an absolute expiration time, relative to now. - /// - public TimeSpan? AbsoluteExpirationRelativeToNow - { - get => _absoluteExpirationRelativeToNow; - set - { - // this method does not set AbsoluteExpiration as it would require calling Clock.UtcNow twice: - // once here and once in MemoryCache.SetEntry - - if (value <= TimeSpan.Zero) - { - throw new ArgumentOutOfRangeException( - nameof(AbsoluteExpirationRelativeToNow), - value, - "The relative expiration value must be positive."); - } - - _absoluteExpirationRelativeToNow = value; - } - } - - /// - /// Gets or sets how long a cache entry can be inactive (e.g. not accessed) before it will be removed. - /// This will not extend the entry lifetime beyond the absolute expiration (if set). - /// - public TimeSpan? SlidingExpiration - { - get => _slidingExpiration; - set - { - if (value <= TimeSpan.Zero) - { - throw new ArgumentOutOfRangeException( - nameof(SlidingExpiration), - value, - "The sliding expiration value must be positive."); - } - - _slidingExpiration = value; - } - } - - /// - /// Gets the instances which cause the cache entry to expire. - /// - public IList ExpirationTokens => GetOrCreateTokens().ExpirationTokens; - - /// - /// Gets or sets the callbacks will be fired after the cache entry is evicted from the cache. - /// - public IList PostEvictionCallbacks => GetOrCreateTokens().PostEvictionCallbacks; - - /// - /// Gets or sets the priority for keeping the cache entry in the cache during a - /// memory pressure triggered cleanup. The default is . - /// - public CacheItemPriority Priority { get => _state.Priority; set => _state.Priority = value; } - - /// - /// Gets or sets the size of the cache entry value. - /// - public long? Size - { - get => _size; - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException(nameof(value), value, $"{nameof(value)} must be non-negative."); - } - - _size = value; - } - } - - public object Key { get; private set; } - - public object Value - { - get => _value; - set - { - _value = value; - _state.IsValueSet = true; - } - } - - internal DateTimeOffset LastAccessed { get; set; } - - internal EvictionReason EvictionReason { get => _state.EvictionReason; private set => _state.EvictionReason = value; } - - public void Dispose() - { - if (!_state.IsDisposed) - { - _state.IsDisposed = true; - - if (_cache.TrackLinkedCacheEntries) - { - CacheEntryHelper.ExitScope(this, _previous); - } - - // Don't commit or propagate options if the CacheEntry Value was never set. - // We assume an exception occurred causing the caller to not set the Value successfully, - // so don't use this entry. - if (_state.IsValueSet) - { - _cache.SetEntry(this); - - if (_previous != null && CanPropagateOptions()) - { - PropagateOptions(_previous); - } - } - - _previous = null; // we don't want to root unnecessary objects - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] // added based on profiling - internal bool CheckExpired(in DateTimeOffset now) - => _state.IsExpired - || CheckForExpiredTime(now) - || (_tokens != null && _tokens.CheckForExpiredTokens(this)); - - internal void SetExpired(EvictionReason reason) - { - if (EvictionReason == EvictionReason.None) - { - EvictionReason = reason; - } - _state.IsExpired = true; - _tokens?.DetachTokens(); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] // added based on profiling - private bool CheckForExpiredTime(in DateTimeOffset now) - { - if (!AbsoluteExpiration.HasValue && !_slidingExpiration.HasValue) - { - return false; - } - - return FullCheck(now); - - bool FullCheck(in DateTimeOffset offset) - { - if (AbsoluteExpiration.HasValue && AbsoluteExpiration.Value <= offset) - { - SetExpired(EvictionReason.Expired); - return true; - } - - if (_slidingExpiration.HasValue - && (offset - LastAccessed) >= _slidingExpiration) - { - SetExpired(EvictionReason.Expired); - return true; - } - - return false; - } - } - - internal void AttachTokens() => _tokens?.AttachTokens(this); - - private static void ExpirationTokensExpired(object obj) - { - // start a new thread to avoid issues with callbacks called from RegisterChangeCallback - Task.Factory.StartNew(state => - { - var entry = (CacheEntry)state; - entry.SetExpired(EvictionReason.TokenExpired); - entry._cache.EntryExpired(entry); - }, obj, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); - } - - internal void InvokeEvictionCallbacks() => _tokens?.InvokeEvictionCallbacks(this); - - // this simple check very often allows us to avoid expensive call to PropagateOptions(CacheEntryHelper.Current) - [MethodImpl(MethodImplOptions.AggressiveInlining)] // added based on profiling - internal bool CanPropagateOptions() => (_tokens != null && _tokens.CanPropagateTokens()) || AbsoluteExpiration.HasValue; - - internal void PropagateOptions(CacheEntry parent) - { - if (parent == null) - { - return; - } - - // Copy expiration tokens and AbsoluteExpiration to the cache entries hierarchy. - // We do this regardless of it gets cached because the tokens are associated with the value we'll return. - _tokens?.PropagateTokens(parent); - - if (AbsoluteExpiration.HasValue) - { - if (!parent.AbsoluteExpiration.HasValue || AbsoluteExpiration < parent.AbsoluteExpiration) - { - parent.AbsoluteExpiration = AbsoluteExpiration; - } - } - } - - private CacheEntryTokens GetOrCreateTokens() - { - if (_tokens != null) - { - return _tokens; - } - - CacheEntryTokens result = new CacheEntryTokens(); - return Interlocked.CompareExchange(ref _tokens, result, null) ?? result; - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Memory/CacheEntryHelper.cs b/frameworks/CSharp/appmpower/src/Memory/CacheEntryHelper.cs deleted file mode 100644 index 71d07fe24c5..00000000000 --- a/frameworks/CSharp/appmpower/src/Memory/CacheEntryHelper.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Diagnostics; -using System.Threading; - -namespace appMpower.Memory -{ - internal static class CacheEntryHelper - { - private static readonly AsyncLocal _current = new AsyncLocal(); - - internal static CacheEntry Current - { - get => _current.Value; - private set => _current.Value = value; - } - - internal static CacheEntry EnterScope(CacheEntry current) - { - CacheEntry previous = Current; - Current = current; - return previous; - } - - internal static void ExitScope(CacheEntry current, CacheEntry previous) - { - Debug.Assert(Current == current, "Entries disposed in invalid order"); - Current = previous; - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Memory/CacheEntryState.cs b/frameworks/CSharp/appmpower/src/Memory/CacheEntryState.cs deleted file mode 100644 index 15d59ead9c1..00000000000 --- a/frameworks/CSharp/appmpower/src/Memory/CacheEntryState.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using Microsoft.Extensions.Caching.Memory; - -namespace appMpower.Memory -{ - internal sealed partial class CacheEntry - { - // this type exists just to reduce CacheEntry size by replacing many enum & boolean fields with one of a size of Int32 - private struct CacheEntryState - { - private byte _flags; - private byte _evictionReason; - private byte _priority; - - internal CacheEntryState(CacheItemPriority priority) : this() => _priority = (byte)priority; - - internal bool IsDisposed - { - get => ((Flags)_flags & Flags.IsDisposed) != 0; - set => SetFlag(Flags.IsDisposed, value); - } - - internal bool IsExpired - { - get => ((Flags)_flags & Flags.IsExpired) != 0; - set => SetFlag(Flags.IsExpired, value); - } - - internal bool IsValueSet - { - get => ((Flags)_flags & Flags.IsValueSet) != 0; - set => SetFlag(Flags.IsValueSet, value); - } - - internal EvictionReason EvictionReason - { - get => (EvictionReason)_evictionReason; - set => _evictionReason = (byte)value; - } - - internal CacheItemPriority Priority - { - get => (CacheItemPriority)_priority; - set => _priority = (byte)value; - } - - private void SetFlag(Flags option, bool value) => _flags = (byte)(value ? (_flags | (byte)option) : (_flags & ~(byte)option)); - - [Flags] - private enum Flags : byte - { - Default = 0, - IsValueSet = 1 << 0, - IsExpired = 1 << 1, - IsDisposed = 1 << 2, - } - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Memory/CacheEntryTokens.cs b/frameworks/CSharp/appmpower/src/Memory/CacheEntryTokens.cs deleted file mode 100644 index 247630639e7..00000000000 --- a/frameworks/CSharp/appmpower/src/Memory/CacheEntryTokens.cs +++ /dev/null @@ -1,140 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.Caching.Memory; - -namespace appMpower.Memory -{ - internal sealed partial class CacheEntry - { - // this type exists just to reduce average CacheEntry size - // which typically is not using expiration tokens or callbacks - private sealed class CacheEntryTokens - { - private List _expirationTokens; - private List _expirationTokenRegistrations; - private List _postEvictionCallbacks; // this is not really related to tokens, but was moved here to shrink typical CacheEntry size - - internal List ExpirationTokens => _expirationTokens ??= new List(); - internal List PostEvictionCallbacks => _postEvictionCallbacks ??= new List(); - - internal void AttachTokens(CacheEntry cacheEntry) - { - if (_expirationTokens != null) - { - lock (this) - { - for (int i = 0; i < _expirationTokens.Count; i++) - { - IChangeToken expirationToken = _expirationTokens[i]; - if (expirationToken.ActiveChangeCallbacks) - { - _expirationTokenRegistrations ??= new List(1); - IDisposable registration = expirationToken.RegisterChangeCallback(ExpirationCallback, cacheEntry); - _expirationTokenRegistrations.Add(registration); - } - } - } - } - } - - internal bool CheckForExpiredTokens(CacheEntry cacheEntry) - { - if (_expirationTokens != null) - { - for (int i = 0; i < _expirationTokens.Count; i++) - { - IChangeToken expiredToken = _expirationTokens[i]; - if (expiredToken.HasChanged) - { - cacheEntry.SetExpired(EvictionReason.TokenExpired); - return true; - } - } - } - return false; - } - - internal bool CanPropagateTokens() => _expirationTokens != null; - - internal void PropagateTokens(CacheEntry parentEntry) - { - if (_expirationTokens != null) - { - lock (this) - { - lock (parentEntry.GetOrCreateTokens()) - { - foreach (IChangeToken expirationToken in _expirationTokens) - { - parentEntry.AddExpirationToken(expirationToken); - } - } - } - } - } - - internal void DetachTokens() - { - // _expirationTokenRegistrations is not checked for null, because AttachTokens might initialize it under lock - // instead we are checking for _expirationTokens, because if they are not null, then _expirationTokenRegistrations might also be not null - if (_expirationTokens != null) - { - lock (this) - { - List registrations = _expirationTokenRegistrations; - if (registrations != null) - { - _expirationTokenRegistrations = null; - for (int i = 0; i < registrations.Count; i++) - { - IDisposable registration = registrations[i]; - registration.Dispose(); - } - } - } - } - } - - internal void InvokeEvictionCallbacks(CacheEntry cacheEntry) - { - if (_postEvictionCallbacks != null) - { - Task.Factory.StartNew(state => InvokeCallbacks((CacheEntry)state), cacheEntry, - CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); - } - } - - private static void InvokeCallbacks(CacheEntry entry) - { - List callbackRegistrations = Interlocked.Exchange(ref entry._tokens._postEvictionCallbacks, null); - - if (callbackRegistrations == null) - { - return; - } - - for (int i = 0; i < callbackRegistrations.Count; i++) - { - PostEvictionCallbackRegistration registration = callbackRegistrations[i]; - - try - { - registration.EvictionCallback?.Invoke(entry.Key, entry.Value, entry.EvictionReason, registration.State); - } - catch (Exception e) - { - // This will be invoked on a background thread, don't let it throw. - entry._cache._logger.LogError(e, "EvictionCallback invoked failed"); - } - } - } - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Memory/MemoryCache.cs b/frameworks/CSharp/appmpower/src/Memory/MemoryCache.cs deleted file mode 100644 index df4f7063cf0..00000000000 --- a/frameworks/CSharp/appmpower/src/Memory/MemoryCache.cs +++ /dev/null @@ -1,520 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Internal; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; -using Microsoft.Extensions.Caching.Memory; - -namespace appMpower.Memory -{ - /// - /// An implementation of using a dictionary to - /// store its entries. - /// - public class MemoryCache : IMemoryCache - { - internal readonly ILogger _logger; - - private readonly MemoryCacheOptions _options; - private readonly ConcurrentDictionary _entries; - - private long _cacheSize; - private bool _disposed; - private DateTimeOffset _lastExpirationScan; - - /// - /// Creates a new instance. - /// - /// The options of the cache. - public MemoryCache(IOptions optionsAccessor) - : this(optionsAccessor, NullLoggerFactory.Instance) { } - - /// - /// Creates a new instance. - /// - /// The options of the cache. - /// The factory used to create loggers. - public MemoryCache(IOptions optionsAccessor, ILoggerFactory loggerFactory) - { - if (optionsAccessor == null) - { - throw new ArgumentNullException(nameof(optionsAccessor)); - } - - if (loggerFactory == null) - { - throw new ArgumentNullException(nameof(loggerFactory)); - } - - _options = optionsAccessor.Value; - //_logger = loggerFactory.CreateLogger(); - _logger = loggerFactory.CreateLogger("MemoryCache"); - - _entries = new ConcurrentDictionary(); - - if (_options.Clock == null) - { - _options.Clock = new SystemClock(); - } - - _lastExpirationScan = _options.Clock.UtcNow; - TrackLinkedCacheEntries = _options.TrackLinkedCacheEntries; // we store the setting now so it's consistent for entire MemoryCache lifetime - } - - /// - /// Cleans up the background collection events. - /// - ~MemoryCache() => Dispose(false); - - /// - /// Gets the count of the current entries for diagnostic purposes. - /// - public int Count => _entries.Count; - - // internal for testing - internal long Size { get => Interlocked.Read(ref _cacheSize); } - - internal bool TrackLinkedCacheEntries { get; } - - private ICollection> EntriesCollection => _entries; - - /// - public ICacheEntry CreateEntry(object key) - { - CheckDisposed(); - ValidateCacheKey(key); - - return new CacheEntry(key, this); - } - - internal void SetEntry(CacheEntry entry) - { - if (_disposed) - { - // No-op instead of throwing since this is called during CacheEntry.Dispose - return; - } - - if (_options.SizeLimit.HasValue && !entry.Size.HasValue) - { - //throw new InvalidOperationException(SR.Format(SR.CacheEntryHasEmptySize, nameof(entry.Size), nameof(_options.SizeLimit))); - throw new InvalidOperationException(); - } - - DateTimeOffset utcNow = _options.Clock.UtcNow; - - DateTimeOffset? absoluteExpiration = null; - if (entry.AbsoluteExpirationRelativeToNow.HasValue) - { - absoluteExpiration = utcNow + entry.AbsoluteExpirationRelativeToNow; - } - else if (entry.AbsoluteExpiration.HasValue) - { - absoluteExpiration = entry.AbsoluteExpiration; - } - - // Applying the option's absolute expiration only if it's not already smaller. - // This can be the case if a dependent cache entry has a smaller value, and - // it was set by cascading it to its parent. - if (absoluteExpiration.HasValue) - { - if (!entry.AbsoluteExpiration.HasValue || absoluteExpiration.Value < entry.AbsoluteExpiration.Value) - { - entry.AbsoluteExpiration = absoluteExpiration; - } - } - - // Initialize the last access timestamp at the time the entry is added - entry.LastAccessed = utcNow; - - if (_entries.TryGetValue(entry.Key, out CacheEntry priorEntry)) - { - priorEntry.SetExpired(EvictionReason.Replaced); - } - - bool exceedsCapacity = UpdateCacheSizeExceedsCapacity(entry); - - if (!entry.CheckExpired(utcNow) && !exceedsCapacity) - { - bool entryAdded = false; - - if (priorEntry == null) - { - // Try to add the new entry if no previous entries exist. - entryAdded = _entries.TryAdd(entry.Key, entry); - } - else - { - // Try to update with the new entry if a previous entries exist. - entryAdded = _entries.TryUpdate(entry.Key, entry, priorEntry); - - if (entryAdded) - { - if (_options.SizeLimit.HasValue) - { - // The prior entry was removed, decrease the by the prior entry's size - Interlocked.Add(ref _cacheSize, -priorEntry.Size.Value); - } - } - else - { - // The update will fail if the previous entry was removed after retrival. - // Adding the new entry will succeed only if no entry has been added since. - // This guarantees removing an old entry does not prevent adding a new entry. - entryAdded = _entries.TryAdd(entry.Key, entry); - } - } - - if (entryAdded) - { - entry.AttachTokens(); - } - else - { - if (_options.SizeLimit.HasValue) - { - // Entry could not be added, reset cache size - Interlocked.Add(ref _cacheSize, -entry.Size.Value); - } - entry.SetExpired(EvictionReason.Replaced); - entry.InvokeEvictionCallbacks(); - } - - if (priorEntry != null) - { - priorEntry.InvokeEvictionCallbacks(); - } - } - else - { - if (exceedsCapacity) - { - // The entry was not added due to overcapacity - entry.SetExpired(EvictionReason.Capacity); - - TriggerOvercapacityCompaction(); - } - else - { - if (_options.SizeLimit.HasValue) - { - // Entry could not be added due to being expired, reset cache size - Interlocked.Add(ref _cacheSize, -entry.Size.Value); - } - } - - entry.InvokeEvictionCallbacks(); - if (priorEntry != null) - { - RemoveEntry(priorEntry); - } - } - - StartScanForExpiredItemsIfNeeded(utcNow); - } - - /// - public bool TryGetValue(object key, out object result) - { - ValidateCacheKey(key); - CheckDisposed(); - - DateTimeOffset utcNow = _options.Clock.UtcNow; - - if (_entries.TryGetValue(key, out CacheEntry entry)) - { - // Check if expired due to expiration tokens, timers, etc. and if so, remove it. - // Allow a stale Replaced value to be returned due to concurrent calls to SetExpired during SetEntry. - if (!entry.CheckExpired(utcNow) || entry.EvictionReason == EvictionReason.Replaced) - { - entry.LastAccessed = utcNow; - result = entry.Value; - - if (TrackLinkedCacheEntries && entry.CanPropagateOptions()) - { - // When this entry is retrieved in the scope of creating another entry, - // that entry needs a copy of these expiration tokens. - entry.PropagateOptions(CacheEntryHelper.Current); - } - - StartScanForExpiredItemsIfNeeded(utcNow); - - return true; - } - else - { - // TODO: For efficiency queue this up for batch removal - RemoveEntry(entry); - } - } - - StartScanForExpiredItemsIfNeeded(utcNow); - - result = null; - return false; - } - - /// - public void Remove(object key) - { - ValidateCacheKey(key); - - CheckDisposed(); - if (_entries.TryRemove(key, out CacheEntry entry)) - { - if (_options.SizeLimit.HasValue) - { - Interlocked.Add(ref _cacheSize, -entry.Size.Value); - } - - entry.SetExpired(EvictionReason.Removed); - entry.InvokeEvictionCallbacks(); - } - - StartScanForExpiredItemsIfNeeded(_options.Clock.UtcNow); - } - - private void RemoveEntry(CacheEntry entry) - { - if (EntriesCollection.Remove(new KeyValuePair(entry.Key, entry))) - { - if (_options.SizeLimit.HasValue) - { - Interlocked.Add(ref _cacheSize, -entry.Size.Value); - } - entry.InvokeEvictionCallbacks(); - } - } - - internal void EntryExpired(CacheEntry entry) - { - // TODO: For efficiency consider processing these expirations in batches. - RemoveEntry(entry); - StartScanForExpiredItemsIfNeeded(_options.Clock.UtcNow); - } - - // Called by multiple actions to see how long it's been since we last checked for expired items. - // If sufficient time has elapsed then a scan is initiated on a background task. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void StartScanForExpiredItemsIfNeeded(DateTimeOffset utcNow) - { - if (_options.ExpirationScanFrequency < utcNow - _lastExpirationScan) - { - ScheduleTask(utcNow); - } - - void ScheduleTask(DateTimeOffset utcNow) - { - _lastExpirationScan = utcNow; - Task.Factory.StartNew(state => ScanForExpiredItems((MemoryCache)state), this, - CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); - } - } - - private static void ScanForExpiredItems(MemoryCache cache) - { - DateTimeOffset now = cache._lastExpirationScan = cache._options.Clock.UtcNow; - - foreach (KeyValuePair item in cache._entries) - { - CacheEntry entry = item.Value; - - if (entry.CheckExpired(now)) - { - cache.RemoveEntry(entry); - } - } - } - - private bool UpdateCacheSizeExceedsCapacity(CacheEntry entry) - { - if (!_options.SizeLimit.HasValue) - { - return false; - } - - long newSize = 0L; - for (int i = 0; i < 100; i++) - { - long sizeRead = Interlocked.Read(ref _cacheSize); - newSize = sizeRead + entry.Size.Value; - - if (newSize < 0 || newSize > _options.SizeLimit) - { - // Overflow occurred, return true without updating the cache size - return true; - } - - if (sizeRead == Interlocked.CompareExchange(ref _cacheSize, newSize, sizeRead)) - { - return false; - } - } - - return true; - } - - private void TriggerOvercapacityCompaction() - { - _logger.LogDebug("Overcapacity compaction triggered"); - - // Spawn background thread for compaction - ThreadPool.QueueUserWorkItem(s => OvercapacityCompaction((MemoryCache)s), this); - } - - private static void OvercapacityCompaction(MemoryCache cache) - { - long currentSize = Interlocked.Read(ref cache._cacheSize); - - cache._logger.LogDebug($"Overcapacity compaction executing. Current size {currentSize}"); - - double? lowWatermark = cache._options.SizeLimit * (1 - cache._options.CompactionPercentage); - if (currentSize > lowWatermark) - { - cache.Compact(currentSize - (long)lowWatermark, entry => entry.Size.Value); - } - - cache._logger.LogDebug($"Overcapacity compaction executed. New size {Interlocked.Read(ref cache._cacheSize)}"); - } - - /// Remove at least the given percentage (0.10 for 10%) of the total entries (or estimated memory?), according to the following policy: - /// 1. Remove all expired items. - /// 2. Bucket by CacheItemPriority. - /// 3. Least recently used objects. - /// ?. Items with the soonest absolute expiration. - /// ?. Items with the soonest sliding expiration. - /// ?. Larger objects - estimated by object graph size, inaccurate. - public void Compact(double percentage) - { - int removalCountTarget = (int)(_entries.Count * percentage); - Compact(removalCountTarget, _ => 1); - } - - private void Compact(long removalSizeTarget, Func computeEntrySize) - { - var entriesToRemove = new List(); - var lowPriEntries = new List(); - var normalPriEntries = new List(); - var highPriEntries = new List(); - long removedSize = 0; - - // Sort items by expired & priority status - DateTimeOffset now = _options.Clock.UtcNow; - foreach (KeyValuePair item in _entries) - { - CacheEntry entry = item.Value; - if (entry.CheckExpired(now)) - { - entriesToRemove.Add(entry); - removedSize += computeEntrySize(entry); - } - else - { - switch (entry.Priority) - { - case CacheItemPriority.Low: - lowPriEntries.Add(entry); - break; - case CacheItemPriority.Normal: - normalPriEntries.Add(entry); - break; - case CacheItemPriority.High: - highPriEntries.Add(entry); - break; - case CacheItemPriority.NeverRemove: - break; - default: - throw new NotSupportedException("Not implemented: " + entry.Priority); - } - } - } - - ExpirePriorityBucket(ref removedSize, removalSizeTarget, computeEntrySize, entriesToRemove, lowPriEntries); - ExpirePriorityBucket(ref removedSize, removalSizeTarget, computeEntrySize, entriesToRemove, normalPriEntries); - ExpirePriorityBucket(ref removedSize, removalSizeTarget, computeEntrySize, entriesToRemove, highPriEntries); - - foreach (CacheEntry entry in entriesToRemove) - { - RemoveEntry(entry); - } - - // Policy: - // 1. Least recently used objects. - // ?. Items with the soonest absolute expiration. - // ?. Items with the soonest sliding expiration. - // ?. Larger objects - estimated by object graph size, inaccurate. - static void ExpirePriorityBucket(ref long removedSize, long removalSizeTarget, Func computeEntrySize, List entriesToRemove, List priorityEntries) - { - // Do we meet our quota by just removing expired entries? - if (removalSizeTarget <= removedSize) - { - // No-op, we've met quota - return; - } - - // Expire enough entries to reach our goal - // TODO: Refine policy - - // LRU - priorityEntries.Sort((e1, e2) => e1.LastAccessed.CompareTo(e2.LastAccessed)); - foreach (CacheEntry entry in priorityEntries) - { - entry.SetExpired(EvictionReason.Capacity); - entriesToRemove.Add(entry); - removedSize += computeEntrySize(entry); - - if (removalSizeTarget <= removedSize) - { - break; - } - } - } - } - - public void Dispose() - { - Dispose(true); - } - - protected virtual void Dispose(bool disposing) - { - if (!_disposed) - { - if (disposing) - { - GC.SuppressFinalize(this); - } - - _disposed = true; - } - } - - private void CheckDisposed() - { - if (_disposed) - { - Throw(); - } - - static void Throw() => throw new ObjectDisposedException(typeof(MemoryCache).FullName); - } - - private static void ValidateCacheKey(object key) - { - if (key == null) - { - Throw(); - } - - static void Throw() => throw new ArgumentNullException(nameof(key)); - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Memory/MemoryCacheOptions.cs b/frameworks/CSharp/appmpower/src/Memory/MemoryCacheOptions.cs deleted file mode 100644 index d714c96df42..00000000000 --- a/frameworks/CSharp/appmpower/src/Memory/MemoryCacheOptions.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using Microsoft.Extensions.Internal; -using Microsoft.Extensions.Options; - -namespace appMpower.Memory -{ - public class MemoryCacheOptions : IOptions - { - private long? _sizeLimit; - private double _compactionPercentage = 0.05; - - public ISystemClock Clock { get; set; } - - /// - /// Gets or sets the minimum length of time between successive scans for expired items. - /// - public TimeSpan ExpirationScanFrequency { get; set; } = TimeSpan.FromMinutes(1); - - /// - /// Gets or sets the maximum size of the cache. - /// - public long? SizeLimit - { - get => _sizeLimit; - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException(nameof(value), value, $"{nameof(value)} must be non-negative."); - } - - _sizeLimit = value; - } - } - - /// - /// Gets or sets the amount to compact the cache by when the maximum size is exceeded. - /// - public double CompactionPercentage - { - get => _compactionPercentage; - set - { - if (value < 0 || value > 1) - { - throw new ArgumentOutOfRangeException(nameof(value), value, $"{nameof(value)} must be between 0 and 1 inclusive."); - } - - _compactionPercentage = value; - } - } - - /// - /// Gets or sets whether to track linked entries. Disabled by default. - /// - /// Prior to .NET 7 this feature was always enabled. - public bool TrackLinkedCacheEntries { get; set; } - - MemoryCacheOptions IOptions.Value - { - get { return this; } - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Microsoft/CachKey.cs b/frameworks/CSharp/appmpower/src/Microsoft/CachKey.cs deleted file mode 100644 index 3bc21736c08..00000000000 --- a/frameworks/CSharp/appmpower/src/Microsoft/CachKey.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace PlatformBenchmarks -{ - public sealed class CacheKey : IEquatable - { - private readonly int _value; - - public CacheKey(int value) - => _value = value; - - public bool Equals(CacheKey key) - => key._value == _value; - - public override bool Equals(object obj) - => ReferenceEquals(obj, this); - - public override int GetHashCode() - => _value; - - public override string ToString() - => _value.ToString(); - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Microsoft/StringBuilderCache.cs b/frameworks/CSharp/appmpower/src/Microsoft/StringBuilderCache.cs deleted file mode 100644 index 6f0b20b7278..00000000000 --- a/frameworks/CSharp/appmpower/src/Microsoft/StringBuilderCache.cs +++ /dev/null @@ -1,59 +0,0 @@ -// 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. - -using System; -using System.Text; - -namespace PlatformBenchmarks -{ - internal static class StringBuilderCache - { - private const int DefaultCapacity = 1386; - private const int MaxBuilderSize = DefaultCapacity * 3; - - [ThreadStatic] - private static StringBuilder t_cachedInstance; - - /// Get a StringBuilder for the specified capacity. - /// If a StringBuilder of an appropriate size is cached, it will be returned and the cache emptied. - public static StringBuilder Acquire(int capacity = DefaultCapacity) - { - if (capacity <= MaxBuilderSize) - { - StringBuilder sb = t_cachedInstance; - if (capacity < DefaultCapacity) - { - capacity = DefaultCapacity; - } - - if (sb != null) - { - // Avoid stringbuilder block fragmentation by getting a new StringBuilder - // when the requested size is larger than the current capacity - if (capacity <= sb.Capacity) - { - t_cachedInstance = null; - sb.Clear(); - return sb; - } - } - } - return new StringBuilder(capacity); - } - - public static void Release(StringBuilder sb) - { - if (sb.Capacity <= MaxBuilderSize) - { - t_cachedInstance = sb; - } - } - - public static string GetStringAndRelease(StringBuilder sb) - { - string result = sb.ToString(); - Release(sb); - return result; - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Program.cs b/frameworks/CSharp/appmpower/src/Program.cs deleted file mode 100644 index 6e748b08497..00000000000 --- a/frameworks/CSharp/appmpower/src/Program.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Net; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Hosting.Server.Features; -using Microsoft.AspNetCore.Server.Kestrel.Core; -using Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; - -namespace appMpower -{ - class Program - { - static async Task Main(string[] args) - { - var socketTransportOptions = new SocketTransportOptions(); - var socketTransportFactory = new SocketTransportFactory(Options.Create(socketTransportOptions), NullLoggerFactory.Instance); - var kestrelServerOptions = new KestrelServerOptions(); - - kestrelServerOptions.Listen(IPAddress.Any, 8080); - kestrelServerOptions.AllowSynchronousIO = true; - kestrelServerOptions.AddServerHeader = false; - - using var kestrelServer = new KestrelServer(Options.Create(kestrelServerOptions), socketTransportFactory, NullLoggerFactory.Instance); - - await kestrelServer.StartAsync(new HttpApplication(), CancellationToken.None); - - Console.WriteLine("Listening on:"); - - foreach (var address in kestrelServer.Features.Get().Addresses) - { - Console.WriteLine(" - " + address); - } - - Console.WriteLine("Process CTRL+C to quit"); - var wh = new ManualResetEventSlim(); - Console.CancelKeyPress += (sender, e) => wh.Set(); - wh.Wait(); - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/RawDb.cs b/frameworks/CSharp/appmpower/src/RawDb.cs deleted file mode 100644 index 8813ce6dfcc..00000000000 --- a/frameworks/CSharp/appmpower/src/RawDb.cs +++ /dev/null @@ -1,331 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.Caching.Memory; -using appMpower.Data; -using PlatformBenchmarks; - -namespace appMpower -{ - public static class RawDb - { - private const int MaxBatch = 500; - -#if ADO - private static ConcurrentRandom _random = new ConcurrentRandom(); -#else - private static Random _random = new Random(); -#endif - - private static string[] _queriesMultipleRows = new string[MaxBatch + 1]; - - private static readonly object[] _cacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray(); - - private static readonly appMpower.Memory.MemoryCache _cache = new appMpower.Memory.MemoryCache( - new appMpower.Memory.MemoryCacheOptions() - { - ExpirationScanFrequency = TimeSpan.FromMinutes(60) - }); - - public static async Task LoadSingleQueryRow() - { - using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); - await pooledConnection.OpenAsync(); - - var (dbCommand, _) = CreateReadCommand(pooledConnection); - - using (dbCommand) - { - var world = await ReadSingleRow(dbCommand); - - return world; - } - } - - public static async Task LoadMultipleQueriesRows(int count) - { - var worlds = new World[count]; - - using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); - await pooledConnection.OpenAsync(); - - var (dbCommand, dbDataParameter) = CreateReadCommand(pooledConnection); - - using (dbCommand) - { - for (int i = 0; i < count; i++) - { - worlds[i] = await ReadSingleRow(dbCommand); - dbDataParameter.Value = _random.Next(1, 10001); - } - } - - return worlds; - } - - public static async Task> LoadFortunesRows() - { - var fortunes = new List(); - - using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); - await pooledConnection.OpenAsync(); - - var dbCommand = new DbCommand("SELECT * FROM fortune", pooledConnection); - - using (dbCommand) - { - var dataReader = await dbCommand.ExecuteReaderAsync(CommandBehavior.SingleResult & CommandBehavior.SequentialAccess); - - while (dataReader.Read()) - { - fortunes.Add(new Fortune - ( - id: dataReader.GetInt32(0), -#if MYSQL - //MariaDB ODBC connector does not correctly support Japanese characters in combination with default ADO.NET; - //as a solution we custom read this string - message: ReadColumn(dataReader, 1) -#else - message: dataReader.GetString(1) -#endif - )); - } - - dataReader.Close(); - } - - fortunes.Add(new Fortune(id: 0, message: "Additional fortune added at request time.")); - fortunes.Sort(); - - return fortunes; - } - - public static async Task LoadMultipleUpdatesRows(int count) - { - var worlds = new World[count]; - - using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); - await pooledConnection.OpenAsync(); - - var (queryCommand, dbDataParameter) = CreateReadCommand(pooledConnection); - - using (queryCommand) - { - for (int i = 0; i < count; i++) - { - worlds[i] = await ReadSingleRow(queryCommand); - dbDataParameter.Value = _random.Next(1, 10001); - } - } - - using var updateCommand = new DbCommand(PlatformBenchmarks.BatchUpdateString.Query(count), pooledConnection); - - var ids = PlatformBenchmarks.BatchUpdateString.Ids; - var randoms = PlatformBenchmarks.BatchUpdateString.Randoms; - -#if !MYSQL - var jds = PlatformBenchmarks.BatchUpdateString.Jds; -#endif - - for (int i = 0; i < count; i++) - { - var randomNumber = _random.Next(1, 10001); - - updateCommand.CreateParameter(ids[i], DbType.Int32, worlds[i].Id); - updateCommand.CreateParameter(randoms[i], DbType.Int32, randomNumber); - - worlds[i].RandomNumber = randomNumber; - } - -#if !MYSQL - for (int i = 0; i < count; i++) - { - updateCommand.CreateParameter(jds[i], DbType.Int32, worlds[i].Id); - } -#endif - - await updateCommand.ExecuteNonQueryAsync(); - - return worlds; - } - - private static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateReadCommand(DbConnection pooledConnection) - { -#if ADO - var dbCommand = new DbCommand("SELECT * FROM world WHERE id=@Id", pooledConnection); -#else - var dbCommand = new DbCommand("SELECT * FROM world WHERE id=?", pooledConnection); -#endif - - return (dbCommand, dbCommand.CreateParameter("Id", DbType.Int32, _random.Next(1, 10001))); - } - - private static async Task ReadSingleRow(DbCommand dbCommand) - { - var dataReader = await dbCommand.ExecuteReaderAsync(CommandBehavior.SingleRow & CommandBehavior.SequentialAccess); - - dataReader.Read(); - - var world = new World - { - Id = dataReader.GetInt32(0), - RandomNumber = dataReader.GetInt32(1) - }; - - dataReader.Close(); - - return world; - } - - public static async Task ReadMultipleRows(int count) - { - int j = 0; - var ids = PlatformBenchmarks.BatchUpdateString.Ids; - var worlds = new World[count]; - string queryString; - - if (_queriesMultipleRows[count] != null) - { - queryString = _queriesMultipleRows[count]; - } - else - { - var stringBuilder = PlatformBenchmarks.StringBuilderCache.Acquire(); - - for (int i = 0; i < count; i++) - { - stringBuilder.Append("SELECT * FROM world WHERE id=?;"); - } - - queryString = _queriesMultipleRows[count] = PlatformBenchmarks.StringBuilderCache.GetStringAndRelease(stringBuilder); - } - - using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); - await pooledConnection.OpenAsync(); - - using var dbCommand = new DbCommand(queryString, pooledConnection); - - for (int i = 0; i < count; i++) - { - dbCommand.CreateParameter(ids[i], DbType.Int32, _random.Next(1, 10001)); - } - - var dataReader = await dbCommand.ExecuteReaderAsync(CommandBehavior.Default & CommandBehavior.SequentialAccess); - - do - { - dataReader.Read(); - - worlds[j] = new World - { - Id = dataReader.GetInt32(0), - RandomNumber = dataReader.GetInt32(1) - }; - - j++; - } while (await dataReader.NextResultAsync()); - - dataReader.Close(); - - return worlds; - } - - public static string ReadColumn(IDataReader dataReader, int column) - { - long size = dataReader.GetBytes(column, 0, null, 0, 0); //get the length of data - byte[] values = new byte[size]; - - int bufferSize = 64; - long bytesRead = 0; - int currentPosition = 0; - - while (bytesRead < size) - { - bytesRead += dataReader.GetBytes(column, currentPosition, values, currentPosition, bufferSize); - currentPosition += bufferSize; - } - - return System.Text.Encoding.Default.GetString(values); - } - - public static async Task PopulateCache() - { - using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); - await pooledConnection.OpenAsync(); - - var (dbCommand, dbDataParameter) = CreateReadCommand(pooledConnection); - - using (dbCommand) - { - var cacheKeys = _cacheKeys; - var cache = _cache; - - for (var i = 1; i < 10001; i++) - { - dbDataParameter.Value = i; - cache.Set(cacheKeys[i], await ReadSingleRow(dbCommand)); - } - } - } - - public static Task LoadCachedQueries(int count) - { - var result = new CachedWorld[count]; - var cacheKeys = _cacheKeys; - var cache = _cache; - var random = _random; - - for (var i = 0; i < result.Length; i++) - { - var id = random.Next(1, 10001); - var key = cacheKeys[id]; - - if (cache.TryGetValue(key, out object cached)) - { - result[i] = (CachedWorld)cached; - } - else - { - //return LoadUncachedQueries(id, i, count, this, result); - return LoadUncachedQueries(id, i, count, result); - } - } - - return Task.FromResult(result); - } - - static async Task LoadUncachedQueries(int id, int i, int count, CachedWorld[] result) - { - using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); - await pooledConnection.OpenAsync(); - - var (dbCommand, dbDataParameter) = CreateReadCommand(pooledConnection); - - using (dbCommand) - { - Func> create = async (entry) => - { - return await ReadSingleRow(dbCommand); - }; - - var cacheKeys = _cacheKeys; - var key = cacheKeys[id]; - - dbDataParameter.Value = id; - - for (; i < result.Length; i++) - { - result[i] = await _cache.GetOrCreateAsync(key, create); - - id = _random.Next(1, 10001); - dbDataParameter.Value = id; - key = cacheKeys[id]; - } - } - - return result; - } - } -} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Constants.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Constants.cs new file mode 100644 index 00000000000..c1678a71a62 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Constants.cs @@ -0,0 +1,10 @@ +using appMpower.Orm.Data; + +namespace appMpower.Orm +{ + public static class Constants + { + public static Dbms Dbms = Dbms.PostgreSQL; + public static DbProvider DbProvider = DbProvider.ODBC; + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Data/DbCommand.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs similarity index 52% rename from frameworks/CSharp/appmpower/src/Data/DbCommand.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs index 2086068c802..a580aa5e110 100644 --- a/frameworks/CSharp/appmpower/src/Data/DbCommand.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs @@ -1,56 +1,46 @@ using System.Data; -using System.Threading.Tasks; +using System.Data.Odbc; -namespace appMpower.Data +namespace appMpower.Orm.Data { public class DbCommand : IDbCommand { - private IDbCommand _dbCommand; + private OdbcCommand _odbcCommand; private DbConnection _dbConnection; public DbCommand(DbConnection dbConnection) { - _dbCommand = dbConnection.CreateCommand(); + _odbcCommand = (OdbcCommand)dbConnection.CreateCommand(); _dbConnection = dbConnection; } public DbCommand(string commandText, DbConnection dbConnection) { - dbConnection.GetCommand(commandText, CommandType.Text, this); - } - - public DbCommand(string commandText, CommandType commandType, DbConnection dbConnection) - { - dbConnection.GetCommand(commandText, commandType, this); + _odbcCommand = dbConnection.GetCommand(commandText, CommandType.Text); + _dbConnection = dbConnection; } - internal DbCommand(IDbCommand dbCommand, DbConnection dbConnection) + public DbCommand(string commandText, DbConnection dbConnection, bool keyed) { - _dbCommand = dbCommand; + _odbcCommand = dbConnection.GetCommand(commandText, CommandType.Text, keyed); _dbConnection = dbConnection; } - internal IDbCommand Command + public DbCommand(string commandText, CommandType commandType, DbConnection dbConnection) { - get - { - return _dbCommand; - } - set - { - _dbCommand = value; - } + _odbcCommand = dbConnection.GetCommand(commandText, commandType); + _dbConnection = dbConnection; } - internal DbConnection DbConnection + internal IDbCommand Command { get { - return _dbConnection; + return _odbcCommand; } set { - _dbConnection = value; + _odbcCommand = (OdbcCommand)value; } } @@ -58,11 +48,11 @@ public string CommandText { get { - return _dbCommand.CommandText; + return _odbcCommand.CommandText; } set { - _dbCommand.CommandText = value; + _odbcCommand.CommandText = value; } } @@ -70,22 +60,22 @@ public int CommandTimeout { get { - return _dbCommand.CommandTimeout; + return _odbcCommand.CommandTimeout; } set { - _dbCommand.CommandTimeout = value; + _odbcCommand.CommandTimeout = value; } } public CommandType CommandType { get { - return _dbCommand.CommandType; + return _odbcCommand.CommandType; } set { - _dbCommand.CommandType = value; + _odbcCommand.CommandType = value; } } @@ -94,11 +84,11 @@ public IDbConnection? Connection { get { - return _dbCommand.Connection; + return _odbcCommand.Connection; } set { - _dbCommand.Connection = (IDbConnection?)value; + _odbcCommand.Connection = (OdbcConnection?)value; } } #nullable disable @@ -107,7 +97,7 @@ public IDataParameterCollection Parameters { get { - return _dbCommand.Parameters; + return _odbcCommand.Parameters; } } @@ -116,11 +106,11 @@ public IDbTransaction? Transaction { get { - return _dbCommand.Transaction; + return _odbcCommand.Transaction; } set { - _dbCommand.Transaction = (IDbTransaction?)value; + _odbcCommand.Transaction = (OdbcTransaction?)value; } } #nullable disable @@ -129,21 +119,21 @@ public UpdateRowSource UpdatedRowSource { get { - return _dbCommand.UpdatedRowSource; + return _odbcCommand.UpdatedRowSource; } set { - _dbCommand.UpdatedRowSource = value; + _odbcCommand.UpdatedRowSource = value; } } public void Cancel() { - _dbCommand.Cancel(); + _odbcCommand.Cancel(); } public IDbDataParameter CreateParameter() { - return _dbCommand.CreateParameter(); + return _odbcCommand.CreateParameter(); } public IDbDataParameter CreateParameter(string name, object value) @@ -153,21 +143,21 @@ public IDbDataParameter CreateParameter(string name, object value) public IDbDataParameter CreateParameter(string name, DbType dbType, object value) { - IDbDataParameter dbDataParameter = null; + IDbDataParameter dbDataParameter; - if (this.Parameters.Contains(name)) + if (_odbcCommand.Parameters.Contains(name)) { - dbDataParameter = this.Parameters[name] as IDbDataParameter; + dbDataParameter = _odbcCommand.Parameters[name]; dbDataParameter.Value = value; } else { - dbDataParameter = _dbCommand.CreateParameter(); + dbDataParameter = _odbcCommand.CreateParameter(); dbDataParameter.ParameterName = name; dbDataParameter.DbType = dbType; dbDataParameter.Value = value; - this.Parameters.Add(dbDataParameter); + _odbcCommand.Parameters.Add(dbDataParameter); } return dbDataParameter; @@ -175,51 +165,40 @@ public IDbDataParameter CreateParameter(string name, DbType dbType, object value public int ExecuteNonQuery() { - return _dbCommand.ExecuteNonQuery(); + return _odbcCommand.ExecuteNonQuery(); } public IDataReader ExecuteReader() { - return _dbCommand.ExecuteReader(); + return _odbcCommand.ExecuteReader(); } public async Task ExecuteNonQueryAsync() { - return await (_dbCommand as System.Data.Common.DbCommand).ExecuteNonQueryAsync(); - } - - public async Task ExecuteReaderAsync(CommandBehavior behavior) - { - return await (_dbCommand as System.Data.Common.DbCommand).ExecuteReaderAsync(behavior); + return await (_odbcCommand as System.Data.Common.DbCommand).ExecuteNonQueryAsync(); } public IDataReader ExecuteReader(CommandBehavior behavior) { - return _dbCommand.ExecuteReader(behavior); + return _odbcCommand.ExecuteReader(behavior); } #nullable enable public object? ExecuteScalar() { - return _dbCommand.ExecuteScalar(); - } -#nullable disable - -#nullable enable - public async Task ExecuteScalarAsync() - { - return await ((System.Data.Common.DbCommand)_dbCommand).ExecuteScalarAsync(); + return _odbcCommand.ExecuteScalar(); } #nullable disable public void Prepare() { - _dbCommand.Prepare(); + _odbcCommand.Prepare(); } public void Dispose() { - _dbConnection.ReleaseCommand(this); + if (_dbConnection._keyed) _dbConnection._keyedOdbcCommands.TryAdd(_odbcCommand.CommandText, _odbcCommand); + else _dbConnection._odbcCommands.Push(_odbcCommand); } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs new file mode 100644 index 00000000000..ba3b6cf85b6 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs @@ -0,0 +1,153 @@ +using System.Collections.Concurrent; +using System.Data; +using System.Data.Odbc; + +namespace appMpower.Orm.Data +{ + public class DbConnection : IDbConnection + { + private string _connectionString; + internal bool _keyed = false; + internal int _number; + internal OdbcConnection _odbcConnection; + internal ConcurrentStack _odbcCommands = new(); + internal Dictionary _keyedOdbcCommands; + + public DbConnection() + { + _connectionString = DbProviderFactory.ConnectionString; + } + + public DbConnection(string connectionString) + { + _connectionString = connectionString; + } + + public IDbConnection Connection + { + get + { + return _odbcConnection; + } + set + { + _odbcConnection = (OdbcConnection)value; + } + } + + public string ConnectionString + { + get + { + return _odbcConnection.ConnectionString; + } + set + { + _odbcConnection.ConnectionString = value; + } + } + + public int ConnectionTimeout + { + get + { + return _odbcConnection.ConnectionTimeout; + } + } + + public string Database + { + get + { + return _odbcConnection.Database; + } + } + + public ConnectionState State + { + get + { + if (_odbcConnection is null) return ConnectionState.Closed; + return _odbcConnection.State; + } + } + + public IDbTransaction BeginTransaction() + { + return _odbcConnection.BeginTransaction(); + } + + public IDbTransaction BeginTransaction(IsolationLevel il) + { + return _odbcConnection.BeginTransaction(il); + } + + public void ChangeDatabase(string databaseName) + { + _odbcConnection.ChangeDatabase(databaseName); + } + + public void Close() + { + _odbcConnection.Close(); + } + + public IDbCommand CreateCommand() + { + return _odbcConnection.CreateCommand(); + } + + public void Open() + { + if (_odbcConnection is null) + { + DbConnections.GetConnection(_connectionString, this); + } + + if (_odbcConnection.State == ConnectionState.Closed) + { + _odbcConnection.Open(); + } + } + + public void Dispose() + { + DbConnections.Release(this); + } + + internal OdbcCommand GetCommand(string commandText, CommandType commandType, bool keyed = false) + { + OdbcCommand odbcCommand; + + if (_odbcCommands.TryPop(out odbcCommand)) + { + if (commandText != odbcCommand.CommandText) + { + odbcCommand.CommandText = commandText; + odbcCommand.Parameters.Clear(); + } + + return odbcCommand; + } + else if (_keyed && _keyedOdbcCommands.TryGetValue(commandText, out odbcCommand)) + { + return odbcCommand; + } + else + { + if (!_keyed && keyed) + { + _keyedOdbcCommands = new(); + _keyed = keyed; + } + + odbcCommand = _odbcConnection.CreateCommand(); + odbcCommand.CommandText = commandText; + odbcCommand.CommandType = commandType; + odbcCommand.Prepare(); + + return odbcCommand; + } + } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs new file mode 100644 index 00000000000..514e2945d38 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs @@ -0,0 +1,61 @@ +using System.Collections.Concurrent; + +namespace appMpower.Orm.Data +{ + public static class DbConnections + { + private static short _createdConnections = 0; + private static ConcurrentStack _connectionsStack = new(); + + public static DbConnection GetConnection(string connectionString) + { + DbConnection popDbConnection; + + if (!_connectionsStack.TryPop(out popDbConnection)) + { + popDbConnection = new DbConnection(); + popDbConnection._odbcConnection = new System.Data.Odbc.OdbcConnection(connectionString); + + _createdConnections++; + popDbConnection._number = _createdConnections; + + if (_createdConnections % 25 == 0) + { + Console.WriteLine("Pooled connections created: " + _createdConnections.ToString()); + } + } + + return popDbConnection; + } + + + public static void GetConnection(string connectionString, DbConnection dbConnection) + { + DbConnection popDbConnection = null; + + if (_connectionsStack.TryPop(out popDbConnection)) + { + dbConnection._odbcConnection = popDbConnection._odbcConnection; + dbConnection._odbcCommands = popDbConnection._odbcCommands; + dbConnection._number = popDbConnection._number; + } + else + { + dbConnection._odbcConnection = new System.Data.Odbc.OdbcConnection(connectionString); + + _createdConnections++; + dbConnection._number = _createdConnections; + + if (_createdConnections % 25 == 0) + { + Console.WriteLine("Pooled connections created: " + _createdConnections.ToString()); + } + } + } + + public static void Release(DbConnection dbConnection) + { + _connectionsStack.Push(dbConnection); + } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProvider.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProvider.cs new file mode 100644 index 00000000000..bf60750b52d --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProvider.cs @@ -0,0 +1,8 @@ +namespace appMpower.Orm.Data +{ + public enum DbProvider + { + ADO = 0, + ODBC = 1, + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProviderFactory.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProviderFactory.cs new file mode 100644 index 00000000000..1e72d164a25 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbProviderFactory.cs @@ -0,0 +1,21 @@ +using System.Data; + +namespace appMpower.Orm.Data +{ + public static class DbProviderFactory + { + public static string ConnectionString; + + public static void SetConnectionString() + { + if (Constants.Dbms == Dbms.MySQL) + { + ConnectionString = "Driver={MariaDB};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;Pooling=false;OPTIONS=67108864;FLAG_FORWARD_CURSOR=1;sslmode=DISABLED;CharSet=utf8;"; + } + else + { + ConnectionString = "Driver={PostgreSQL};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;UseServerSidePrepare=1;Pooling=false;sslmode=disable"; + } + } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/Dbms.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/Dbms.cs new file mode 100644 index 00000000000..8c8bbeb67e6 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/Dbms.cs @@ -0,0 +1,9 @@ +namespace appMpower.Orm.Data +{ + public enum Dbms + { + MySQL = 0, + PostgreSQL = 1, + SQLServer = 2, + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs new file mode 100644 index 00000000000..f6b8b4cad1c --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs @@ -0,0 +1,66 @@ +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json; +using appMpower.Orm.Data; +using appMpower.Orm.Objects; +using appMpower.Orm.Serializers; + +namespace appMpower.Orm; + +//These methods are for test purposes only; not used in actual execution +public static class DotnetMethods +{ + private static JsonWriterOptions _jsonWriterOptions = new JsonWriterOptions + { + Indented = false, + SkipValidation = true + }; + + private readonly static WorldSerializer _worldSerializer = new WorldSerializer(); + private readonly static WorldsSerializer _worldsSerializer = new WorldsSerializer(); + + public static byte[] Db() + { + var world = RawDb.LoadSingleQueryRow(); + + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _worldSerializer.Serialize(utf8JsonWriter, world); + + return memoryStream.ToArray(); + } + + public static byte[] Query(int queries) + { + World[] worlds = RawDb.ReadMultipleRows(queries); + + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _worldsSerializer.Serialize(utf8JsonWriter, worlds); + + return memoryStream.ToArray(); + } + + public static byte[] Updates(int count) + { + World[] worlds = RawDb.LoadMultipleUpdatesRows(count); + + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _worldsSerializer.Serialize(utf8JsonWriter, worlds); + + return memoryStream.ToArray(); + } + + public static byte[] Fortunes() + { + List fortunes = RawDb.LoadFortunesRows(); + string fortunesView = FortunesView.Render(fortunes); + byte[] byteArray = Encoding.UTF8.GetBytes(fortunesView); + + return byteArray.ToArray(); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/FortunesView.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/FortunesView.cs similarity index 54% rename from frameworks/CSharp/appmpower/src/FortunesView.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/FortunesView.cs index 8f56ddde4d5..2c11f6473c6 100644 --- a/frameworks/CSharp/appmpower/src/FortunesView.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/FortunesView.cs @@ -1,33 +1,23 @@ using System.Collections.Generic; -using System.IO.Pipelines; using System.Globalization; using System.Text; using System.Threading.Tasks; using System.Web; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Primitives; using PlatformBenchmarks; +using appMpower.Orm.Objects; -namespace appMpower +namespace appMpower.Orm { public static class FortunesView { - private readonly static KeyValuePair _headerServer = - new KeyValuePair("Server", "k"); - private readonly static KeyValuePair _headerContentType = - new KeyValuePair("Content-Type", "text/html; charset=UTF-8"); - public static char[] _fortunesTableStart = "Fortunes".ToCharArray(); public static char[] _fortunesRowStart = "".ToCharArray(); public static char[] _fortunesTableEnd = "
    idmessage
    ".ToCharArray(); public static char[] _fortunesColumn = "".ToCharArray(); public static char[] _fortunesRowEnd = "
    ".ToCharArray(); - public static async Task Render(IHeaderDictionary headerDictionary, PipeWriter pipeWriter, List fortunes) + public static string Render(List fortunes) { - headerDictionary.Add(_headerServer); - headerDictionary.Add(_headerContentType); - var writer = StringBuilderCache.Acquire(); writer.Append(_fortunesTableStart); @@ -39,10 +29,7 @@ public static async Task Render(IHeaderDictionary headerDictionary, PipeWriter p writer.Append(_fortunesTableEnd); - headerDictionary.Add(new KeyValuePair("Content-Length", (writer.Length + 32).ToString())); - - await pipeWriter.WriteAsync(Encoding.UTF8.GetBytes(StringBuilderCache.GetStringAndRelease(writer))); - pipeWriter.Complete(); + return StringBuilderCache.GetStringAndRelease(writer); } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/Microsoft/BatchUpdateString.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/BatchUpdateString.cs similarity index 54% rename from frameworks/CSharp/appmpower/src/Microsoft/BatchUpdateString.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/BatchUpdateString.cs index 0f3e501c485..a5887f50142 100644 --- a/frameworks/CSharp/appmpower/src/Microsoft/BatchUpdateString.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/BatchUpdateString.cs @@ -1,7 +1,8 @@ // 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. -using System.Linq; +using appMpower.Orm; +using appMpower.Orm.Data; namespace PlatformBenchmarks { @@ -33,51 +34,32 @@ public static string Query(int batchSize) //sb.Append("(?::int,?::int)) AS temp(id, randomNumber) WHERE temp.id = world.id"); */ -#if MYSQL - for (int i = 0; i < batchSize; i++) + if (Constants.Dbms == Dbms.MySQL) { - sb.Append("UPDATE world SET randomNumber=? WHERE id=?;"); + for (int i = 0; i < batchSize; i++) + { + sb.Append("UPDATE world SET randomNumber=? WHERE id=?;"); + } } -#elif ADO - /* - sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES "); - Enumerable.Range(0, lastIndex).ToList().ForEach(i => sb.Append($"(@i{i}, @r{i}), ")); - sb.Append($"(@i{lastIndex}, @r{lastIndex}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id"); - */ - - sb.Append("UPDATE world SET randomNumber=CASE id "); - - for (int i = 0; i < batchSize; i++) - { - sb.Append("WHEN @i" + i + " THEN @r" + i + " "); - } - - sb.Append("ELSE randomnumber END WHERE id IN("); - - for (int i = 0; i < lastIndex; i++) + else { - sb.Append("@j" + i + ","); - } + sb.Append("UPDATE world SET randomNumber=CASE id "); - sb.Append("@j" + lastIndex + ")"); -#else - sb.Append("UPDATE world SET randomNumber=CASE id "); + for (int i = 0; i < batchSize; i++) + { + sb.Append("WHEN ? THEN ? "); + } - for (int i = 0; i < batchSize; i++) - { - sb.Append("WHEN ? THEN ? "); - } + sb.Append("ELSE randomnumber END WHERE id IN("); - sb.Append("ELSE randomnumber END WHERE id IN("); + for (int i = 0; i < lastIndex; i++) + { + sb.Append("?,"); + } - for (int i = 0; i < lastIndex; i++) - { - sb.Append("?,"); + sb.Append("?)"); } - sb.Append("?)"); -#endif - return _queries[batchSize] = StringBuilderCache.GetStringAndRelease(sb); } } diff --git a/frameworks/CSharp/appmpower/src/Microsoft/ConcurrentRandom.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/ConcurrentRandom.cs similarity index 95% rename from frameworks/CSharp/appmpower/src/Microsoft/ConcurrentRandom.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/ConcurrentRandom.cs index b5a74d48884..374c9f4e1bb 100644 --- a/frameworks/CSharp/appmpower/src/Microsoft/ConcurrentRandom.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/ConcurrentRandom.cs @@ -1,9 +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. -using System; using System.Runtime.CompilerServices; -using System.Threading; namespace PlatformBenchmarks { diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/StringBuilderCache.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/StringBuilderCache.cs new file mode 100644 index 00000000000..73b890db750 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Microsoft/StringBuilderCache.cs @@ -0,0 +1,54 @@ +// 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. + +using System.Text; + +namespace PlatformBenchmarks; + +internal static class StringBuilderCache +{ + private const int DefaultCapacity = 1386; + private const int MaxBuilderSize = DefaultCapacity * 3; + [ThreadStatic] + private static StringBuilder t_cachedInstance; + + public static StringBuilder Acquire(int capacity = DefaultCapacity) + { + if (capacity <= MaxBuilderSize) + { + StringBuilder sb = t_cachedInstance; + + if (capacity < DefaultCapacity) + { + capacity = DefaultCapacity; + } + + if (sb != null) + { + if (capacity <= sb.Capacity) + { + t_cachedInstance = null; + sb.Clear(); + return sb; + } + } + } + + return new StringBuilder(capacity); + } + + public static void Release(StringBuilder sb) + { + if (sb.Capacity <= MaxBuilderSize) + { + t_cachedInstance = sb; + } + } + + public static string GetStringAndRelease(StringBuilder sb) + { + string result = sb.ToString(); + Release(sb); + return result; + } +} diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs new file mode 100644 index 00000000000..0f3ee5b59c2 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs @@ -0,0 +1,144 @@ +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json; +using appMpower.Orm.Data; +using appMpower.Orm.Objects; +using appMpower.Orm.Serializers; + +namespace appMpower.Orm; + +public static class NativeMethods +{ + private static JsonWriterOptions _jsonWriterOptions = new JsonWriterOptions + { + Indented = false, + SkipValidation = true + }; + + private readonly static WorldSerializer _worldSerializer = new WorldSerializer(); + private readonly static WorldsSerializer _worldsSerializer = new WorldsSerializer(); + + [UnmanagedCallersOnly(EntryPoint = "Dbms")] + public static void Dbms(int dbms) + { + Constants.Dbms = (Dbms)dbms; + DbProviderFactory.SetConnectionString(); + } + + [UnmanagedCallersOnly(EntryPoint = "DbProvider")] + public static void DbProvider(int dbProvider) + { + Constants.DbProvider = (DbProvider)dbProvider; + DbProviderFactory.SetConnectionString(); + } + + [UnmanagedCallersOnly(EntryPoint = "FreeHandlePointer")] + public static void FreeHandlePointer(IntPtr handlePointer) + { + GCHandle handle = GCHandle.FromIntPtr(handlePointer); + handle.Free(); + } + + [UnmanagedCallersOnly(EntryPoint = "Db")] + public static unsafe IntPtr Db(int* length, IntPtr* handlePointer) + { + var world = RawDb.LoadSingleQueryRow(); + + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _worldSerializer.Serialize(utf8JsonWriter, world); + + *length = (int)utf8JsonWriter.BytesCommitted; + byte[] byteArray = memoryStream.ToArray(); + + GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); + // return the managed and byteArrayPointer pointer + IntPtr byteArrayPointer = handle.AddrOfPinnedObject(); + *handlePointer = GCHandle.ToIntPtr(handle); + + return byteArrayPointer; + /* + fixed(byte* b = memoryStream.ToArray()) + { + return b; + } + */ + } + + [UnmanagedCallersOnly(EntryPoint = "Fortunes")] + public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer) + { + List fortunes = RawDb.LoadFortunesRows(); + string fortunesView = FortunesView.Render(fortunes); + byte[] byteArray = Encoding.UTF8.GetBytes(fortunesView); + + *length = byteArray.Length; + + GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); + IntPtr byteArrayPointer = handle.AddrOfPinnedObject(); + *handlePointer = GCHandle.ToIntPtr(handle); + + return byteArrayPointer; + } + + [UnmanagedCallersOnly(EntryPoint = "Query")] + public static unsafe IntPtr Query(int queries, int* length, IntPtr* handlePointer) + { + World[] worlds = RawDb.ReadMultipleRows(queries); + + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _worldsSerializer.Serialize(utf8JsonWriter, worlds); + + *length = (int)utf8JsonWriter.BytesCommitted; + byte[] byteArray = memoryStream.ToArray(); + + GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); + IntPtr byteArrayPointer = handle.AddrOfPinnedObject(); + *handlePointer = GCHandle.ToIntPtr(handle); + + return byteArrayPointer; + } + + [UnmanagedCallersOnly(EntryPoint = "Updates")] + public static unsafe IntPtr Updates(int count, int* length, IntPtr* handlePointer) + { + World[] worlds = RawDb.LoadMultipleUpdatesRows(count); + + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _worldsSerializer.Serialize(utf8JsonWriter, worlds); + + *length = (int)utf8JsonWriter.BytesCommitted; + byte[] byteArray = memoryStream.ToArray(); + + GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); + IntPtr byteArrayPointer = handle.AddrOfPinnedObject(); + *handlePointer = GCHandle.ToIntPtr(handle); + + return byteArrayPointer; + } + + [UnmanagedCallersOnly(EntryPoint = "DbById")] + public static unsafe IntPtr DbById(int id, int* length, IntPtr* handlePointer) + { + var world = RawDb.LoadSingleQueryRowById(id); + + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _worldSerializer.Serialize(utf8JsonWriter, world); + + *length = (int)utf8JsonWriter.BytesCommitted; + byte[] byteArray = memoryStream.ToArray(); + + GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); + IntPtr byteArrayPointer = handle.AddrOfPinnedObject(); + *handlePointer = GCHandle.ToIntPtr(handle); + + return byteArrayPointer; + } +} diff --git a/frameworks/CSharp/appmpower/src/CachedWorld.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/CachedWorld.cs similarity index 88% rename from frameworks/CSharp/appmpower/src/CachedWorld.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/CachedWorld.cs index 857b8283c73..7ef3f074167 100644 --- a/frameworks/CSharp/appmpower/src/CachedWorld.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/CachedWorld.cs @@ -1,4 +1,4 @@ -namespace appMpower +namespace appMpower.Orm.Objects { public struct CachedWorld { diff --git a/frameworks/CSharp/appmpower/src/Fortune.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/Fortune.cs similarity index 93% rename from frameworks/CSharp/appmpower/src/Fortune.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/Fortune.cs index 4d1b99661ca..c6eb823c9fa 100644 --- a/frameworks/CSharp/appmpower/src/Fortune.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/Fortune.cs @@ -1,6 +1,4 @@ -using System; - -namespace appMpower +namespace appMpower.Orm.Objects { public readonly struct Fortune : IComparable, IComparable { diff --git a/frameworks/CSharp/appmpower/src/World.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/World.cs similarity index 78% rename from frameworks/CSharp/appmpower/src/World.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/World.cs index cfec08b1f9c..4e10e128998 100644 --- a/frameworks/CSharp/appmpower/src/World.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Objects/World.cs @@ -1,4 +1,4 @@ -namespace appMpower +namespace appMpower.Orm.Objects { public struct World { diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs new file mode 100644 index 00000000000..b748d78a251 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs @@ -0,0 +1,257 @@ +using System.Data; +using appMpower.Orm.Data; +using appMpower.Orm.Objects; +using PlatformBenchmarks; + +namespace appMpower.Orm +{ + public static class RawDb + { + private const int MaxBatch = 500; + + private static Random _random = new Random(); + + private static string[] _queriesMultipleRows = new string[MaxBatch + 1]; + + public static World LoadSingleQueryRow() + { + using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); + pooledConnection.Open(); + + var (dbCommand, _) = CreateReadCommand(pooledConnection); + + using (dbCommand) + { + World world = ReadSingleRow(dbCommand); + + return world; + } + } + + public static World LoadSingleQueryRowById(int id) + { + using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); + pooledConnection.Open(); + + var (dbCommand, _) = CreateReadCommandById(pooledConnection, id); + + using (dbCommand) + { + World world = ReadSingleRow(dbCommand); + + return world; + } + } + + public static World[] LoadMultipleQueriesRows(int count) + { + var worlds = new World[count]; + + using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); + pooledConnection.Open(); + + var (dbCommand, dbDataParameter) = CreateReadCommand(pooledConnection); + + using (dbCommand) + { + for (int i = 0; i < count; i++) + { + worlds[i] = ReadSingleRow(dbCommand); + dbDataParameter.Value = _random.Next(1, 10001); + } + } + + return worlds; + } + + public static List LoadFortunesRows() + { + var fortunes = new List(); + + using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); + pooledConnection.Open(); + + var dbCommand = new DbCommand("SELECT * FROM fortune", pooledConnection); + + using (dbCommand) + { + IDataReader dataReader = dbCommand.ExecuteReader(CommandBehavior.SingleResult & CommandBehavior.SequentialAccess); + + while (dataReader.Read()) + { + fortunes.Add(new Fortune + ( + id: dataReader.GetInt32(0), + //MariaDB ODBC connector does not correctly support Japanese characters in combination with default ADO.NET; + //as a solution we custom read this string + message: (Constants.Dbms == Dbms.MySQL ? ReadColumn(dataReader, 1) : dataReader.GetString(1)) + )); + } + + dataReader.Close(); + } + + fortunes.Add(new Fortune(id: 0, message: "Additional fortune added at request time.")); + fortunes.Sort(); + + return fortunes; + } + + public static World[] LoadMultipleUpdatesRows(int count) + { + var worlds = new World[count]; + + using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); + pooledConnection.Open(); + + var (queryCommand, dbDataParameter) = CreateReadCommand(pooledConnection, true); + + using (queryCommand) + { + for (int i = 0; i < count; i++) + { + worlds[i] = ReadSingleRow(queryCommand); + dbDataParameter.Value = _random.Next(1, 10001); + } + } + + using var updateCommand = new DbCommand(BatchUpdateString.Query(count), pooledConnection, true); + + var ids = BatchUpdateString.Ids; + var randoms = BatchUpdateString.Randoms; + + for (int i = 0; i < count; i++) + { + var randomNumber = _random.Next(1, 10001); + + updateCommand.CreateParameter(ids[i], DbType.Int32, worlds[i].Id); + updateCommand.CreateParameter(randoms[i], DbType.Int32, randomNumber); + + worlds[i].RandomNumber = randomNumber; + } + + if (Constants.Dbms != Dbms.MySQL) + { + var jds = BatchUpdateString.Jds; + + for (int i = 0; i < count; i++) + { + updateCommand.CreateParameter(jds[i], DbType.Int32, worlds[i].Id); + } + } + + updateCommand.ExecuteNonQuery(); + + return worlds; + } + + internal static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateReadCommand(DbConnection pooledConnection) + { + DbCommand dbCommand = new DbCommand("SELECT * FROM world WHERE id=?", pooledConnection); + + return (dbCommand, dbCommand.CreateParameter("Id", DbType.Int32, _random.Next(1, 10001))); + } + + internal static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateReadCommand(DbConnection pooledConnection, bool keyed) + { + DbCommand dbCommand = new DbCommand("SELECT * FROM world WHERE id=?", pooledConnection, keyed); + + return (dbCommand, dbCommand.CreateParameter("Id", DbType.Int32, _random.Next(1, 10001))); + } + + internal static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateReadCommandById(DbConnection pooledConnection, int id) + { + DbCommand dbCommand = new DbCommand("SELECT * FROM world WHERE id=?", pooledConnection); + + return (dbCommand, dbCommand.CreateParameter("Id", DbType.Int32, id)); + } + + internal static World ReadSingleRow(DbCommand dbCommand) + { + var dataReader = dbCommand.ExecuteReader(CommandBehavior.SingleRow & CommandBehavior.SequentialAccess); + + dataReader.Read(); + + var world = new World + { + Id = dataReader.GetInt32(0), + RandomNumber = dataReader.GetInt32(1) + }; + + dataReader.Close(); + + return world; + } + + public static World[] ReadMultipleRows(int count) + { + int j = 0; + var ids = BatchUpdateString.Ids; + var worlds = new World[count]; + string queryString; + + if (_queriesMultipleRows[count] != null) + { + queryString = _queriesMultipleRows[count]; + } + else + { + var stringBuilder = StringBuilderCache.Acquire(); + + for (int i = 0; i < count; i++) + { + stringBuilder.Append("SELECT * FROM world WHERE id=?;"); + } + + queryString = _queriesMultipleRows[count] = StringBuilderCache.GetStringAndRelease(stringBuilder); + } + + using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); + pooledConnection.Open(); + + using var dbCommand = new DbCommand(queryString, pooledConnection); + + for (int i = 0; i < count; i++) + { + dbCommand.CreateParameter(ids[i], DbType.Int32, _random.Next(1, 10001)); + } + + var dataReader = dbCommand.ExecuteReader(CommandBehavior.Default & CommandBehavior.SequentialAccess); + + do + { + dataReader.Read(); + + worlds[j] = new World + { + Id = dataReader.GetInt32(0), + RandomNumber = dataReader.GetInt32(1) + }; + + j++; + } while (dataReader.NextResult()); + + dataReader.Close(); + + return worlds; + } + + public static string ReadColumn(IDataReader dataReader, int column) + { + long size = dataReader.GetBytes(column, 0, null, 0, 0); //get the length of data + byte[] values = new byte[size]; + + int bufferSize = 64; + long bytesRead = 0; + int currentPosition = 0; + + while (bytesRead < size) + { + bytesRead += dataReader.GetBytes(column, currentPosition, values, currentPosition, bufferSize); + currentPosition += bufferSize; + } + + return System.Text.Encoding.Default.GetString(values); + } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/IJsonSerializer.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/IJsonSerializer.cs new file mode 100644 index 00000000000..8986ee387ee --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/IJsonSerializer.cs @@ -0,0 +1,9 @@ +using System.Text.Json; + +namespace appMpower.Orm.Serializers +{ + public interface IJsonSerializer + { + public void Serialize(Utf8JsonWriter utf8JsonWriter, T t); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/WorldSerializer.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/WorldSerializer.cs similarity index 68% rename from frameworks/CSharp/appmpower/src/WorldSerializer.cs rename to frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/WorldSerializer.cs index 6150c5560b7..1e078da5957 100644 --- a/frameworks/CSharp/appmpower/src/WorldSerializer.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/WorldSerializer.cs @@ -1,8 +1,9 @@ using System.Text.Json; +using appMpower.Orm.Objects; -namespace appMpower +namespace appMpower.Orm.Serializers { - public class WorldSerializer : Kestrel.IJsonSerializer + public class WorldSerializer : IJsonSerializer { public void Serialize(Utf8JsonWriter utf8JsonWriter, World world) { @@ -10,6 +11,7 @@ public void Serialize(Utf8JsonWriter utf8JsonWriter, World world) utf8JsonWriter.WriteNumber("id", world.Id); utf8JsonWriter.WriteNumber("randomNumber", world.RandomNumber); utf8JsonWriter.WriteEndObject(); + utf8JsonWriter.Flush(); } } } diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/WorldsSerizalizer.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/WorldsSerizalizer.cs new file mode 100644 index 00000000000..223af9bd702 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/WorldsSerizalizer.cs @@ -0,0 +1,24 @@ +using System.Text.Json; +using appMpower.Orm.Objects; + +namespace appMpower.Orm.Serializers +{ + public class WorldsSerializer : IJsonSerializer + { + public void Serialize(Utf8JsonWriter utf8JsonWriter, World[] worlds) + { + utf8JsonWriter.WriteStartArray(); + + foreach (World world in worlds) + { + utf8JsonWriter.WriteStartObject(); + utf8JsonWriter.WriteNumber("id", world.Id); + utf8JsonWriter.WriteNumber("randomNumber", world.RandomNumber); + utf8JsonWriter.WriteEndObject(); + } + + utf8JsonWriter.WriteEndArray(); + utf8JsonWriter.Flush(); + } + } +} diff --git a/frameworks/CSharp/appmpower/src/appMpower.csproj b/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj similarity index 52% rename from frameworks/CSharp/appmpower/src/appMpower.csproj rename to frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj index 579c54883b5..dd9c929f19f 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.csproj +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj @@ -1,55 +1,42 @@ - - - - net8.0 - Exe - true - - - - - true - true - true - false - Speed - none - false - - - true - true - true - false - - - true - - true - - - - - true - - - true - false - false - - - - - - - - - - $(DefineConstants);POSTGRESQL - $(DefineConstants);ODBC - $(DefineConstants);ADO - - - \ No newline at end of file + + + + net8.0 + enable + + true + true + true + + linux-x64 + + + + + true + false + Size + none + false + + true + true + true + false + + true + + true + + true + + true + false + false + + + + + + + diff --git a/frameworks/CSharp/appmpower/src/appMpower/JsonMessage.cs b/frameworks/CSharp/appmpower/src/appMpower/JsonMessage.cs new file mode 100644 index 00000000000..ab1685ab8ad --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/JsonMessage.cs @@ -0,0 +1,7 @@ +namespace appMpower +{ + public struct JsonMessage + { + public string Message { get; set; } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs new file mode 100644 index 00000000000..0719f19c5ad --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; + +namespace appMpower; + +public class CachingMiddleware +{ + private static readonly Dictionary _cache = new(); + private static readonly Random _random = new(); + + private static readonly byte[] _startBytes = Encoding.UTF8.GetBytes("["); + private static readonly byte[] _endBytes = Encoding.UTF8.GetBytes("]"); + private static readonly byte[] _comma = Encoding.UTF8.GetBytes(","); + + + private readonly static KeyValuePair _headerServer = + new KeyValuePair("Server", new StringValues("k")); + private readonly static KeyValuePair _headerContentType = + new KeyValuePair("Content-Type", new StringValues("application/json")); + + private readonly RequestDelegate _next; + + public CachingMiddleware(RequestDelegate next) + { + _next = next; + } + + public unsafe Task Invoke(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments("/cached-worlds", StringComparison.Ordinal)) + { + int payloadLength; + IntPtr handlePointer; + IntPtr bytePointer; + byte[] json; + + if (_cache.Count == 0) + { + for (int i = 1; i < 10001; i++) + { + bytePointer = NativeMethods.DbById(i, out payloadLength, out handlePointer); + json = new byte[payloadLength]; + Marshal.Copy(bytePointer, json, 0, payloadLength); + NativeMethods.FreeHandlePointer(handlePointer); + _cache.Add(i, json); + } + } + + var queryString = httpContext.Request.QueryString.ToString(); + int queries; + Int32.TryParse(queryString.Substring(queryString.LastIndexOf("=") + 1), out queries); + queries = queries > 500 ? 500 : (queries > 0 ? queries : 1); + + var response = httpContext.Response; + response.Headers.Add(_headerServer); + response.Headers.Add(_headerContentType); + + int queriesLength = 0; + int[] keys = new int[queries]; + + for (int i = 0; i < queries; i++) + { + keys[i] = _random.Next(1, 10001); + + if (!_cache.TryGetValue(keys[i], out json)) + { + bytePointer = NativeMethods.DbById(keys[i], out payloadLength, out handlePointer); + json = new byte[payloadLength]; + Marshal.Copy(bytePointer, json, 0, payloadLength); + NativeMethods.FreeHandlePointer(handlePointer); + _cache.Add(keys[i], json); + } + + queriesLength += json.Length; + } + + byte[] result = new byte[_startBytes.Length + _endBytes.Length + (_comma.Length * queries - 1) + queriesLength]; + int position = 0; + + Buffer.BlockCopy(_startBytes, 0, result, position, _startBytes.Length); + position += _startBytes.Length; + + for (int i = 0; i < queries; i++) + { + json = _cache[keys[i]]; + Buffer.BlockCopy(json, 0, result, position, json.Length); + position += json.Length; + + if (i < queries - 1) + { + Buffer.BlockCopy(_comma, 0, result, position, _comma.Length); + position += _comma.Length; + } + } + + Buffer.BlockCopy(_endBytes, 0, result, position, _endBytes.Length); + + response.Headers.Add( + new KeyValuePair("Content-Length", result.Length.ToString())); + + return response.Body.WriteAsync(result, 0, result.Length); + } + + return _next(httpContext); + } +} + +public static class CachingMiddlewareExtensions +{ + public static IApplicationBuilder UseCaching(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs new file mode 100644 index 00000000000..2acf9af1716 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; + +namespace appMpower; + +public class FortunesMiddleware +{ + private readonly static KeyValuePair _headerServer = + new KeyValuePair("Server", new StringValues("k")); + private readonly static KeyValuePair _headerContentType = + new KeyValuePair("Content-Type", new StringValues("text/html; charset=UTF-8")); + + private readonly RequestDelegate _next; + + public FortunesMiddleware(RequestDelegate next) + { + _next = next; + } + + public unsafe Task Invoke(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments("/fortunes", StringComparison.Ordinal)) + { + var response = httpContext.Response; + response.Headers.Add(_headerServer); + response.Headers.Add(_headerContentType); + + int payloadLength; + IntPtr handlePointer; + + IntPtr bytePointer = NativeMethods.Fortunes(out payloadLength, out handlePointer); + byte[] json = new byte[payloadLength]; + Marshal.Copy(bytePointer, json, 0, payloadLength); + NativeMethods.FreeHandlePointer(handlePointer); + + response.Headers.Add( + new KeyValuePair("Content-Length", payloadLength.ToString())); + + return response.Body.WriteAsync(json, 0, payloadLength); + } + + return _next(httpContext); + } +} + +public static class FortunesMiddlewareExtensions +{ + public static IApplicationBuilder UseFortunes(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/JsonMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/JsonMiddleware.cs new file mode 100644 index 00000000000..2e90051ff2f --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/JsonMiddleware.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; +using appMpower.Serializers; + +namespace appMpower; + +public class JsonMiddleware +{ + private readonly static JsonWriterOptions _jsonWriterOptions = new JsonWriterOptions + { + Indented = false, + SkipValidation = true + }; + + private readonly static JsonMessageSerializer _jsonMessageSerializer = new JsonMessageSerializer(); + + private readonly static KeyValuePair _headerServer = + new KeyValuePair("Server", new StringValues("k")); + private readonly static KeyValuePair _headerContentType = + new KeyValuePair("Content-Type", new StringValues("application/json")); + + private readonly RequestDelegate _nextStage; + + public JsonMiddleware(RequestDelegate nextStage) + { + _nextStage = nextStage; + } + + public unsafe Task Invoke(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments("/json", StringComparison.Ordinal)) + { + var response = httpContext.Response; + response.Headers.Add(_headerServer); + response.Headers.Add(_headerContentType); + + using var utf8JsonWriter = new Utf8JsonWriter(httpContext.Response.Body, _jsonWriterOptions); + + _jsonMessageSerializer.Serialize(utf8JsonWriter, new JsonMessage { Message = "Hello, World!" }); + + response.Headers.Add( + new KeyValuePair("Content-Length", utf8JsonWriter.BytesPending.ToString())); + + utf8JsonWriter.Flush(); + + return Task.CompletedTask; + } + + return _nextStage(httpContext); + } +} + +public static class JsonMiddlewareExtensions +{ + public static IApplicationBuilder UseJson(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs new file mode 100644 index 00000000000..63964f0b90c --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; + +namespace appMpower; + +public class MultipleQueriesMiddleware +{ + private readonly static KeyValuePair _headerServer = + new KeyValuePair("Server", new StringValues("k")); + private readonly static KeyValuePair _headerContentType = + new KeyValuePair("Content-Type", new StringValues("application/json")); + + private readonly RequestDelegate _next; + + public MultipleQueriesMiddleware(RequestDelegate next) + { + _next = next; + } + + public unsafe Task Invoke(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments("/queries", StringComparison.Ordinal)) + { + var queryString = httpContext.Request.QueryString.ToString(); + int queries; + Int32.TryParse(queryString.Substring(queryString.LastIndexOf("=") + 1), out queries); + queries = queries > 500 ? 500 : (queries > 0 ? queries : 1); + + var response = httpContext.Response; + response.Headers.Add(_headerServer); + response.Headers.Add(_headerContentType); + + int payloadLength; + IntPtr handlePointer; + + IntPtr bytePointer = NativeMethods.Query(queries, out payloadLength, out handlePointer); + byte[] json = new byte[payloadLength]; + Marshal.Copy(bytePointer, json, 0, payloadLength); + NativeMethods.FreeHandlePointer(handlePointer); + + response.Headers.Add( + new KeyValuePair("Content-Length", payloadLength.ToString())); + + return response.Body.WriteAsync(json, 0, payloadLength); + } + + return _next(httpContext); + } +} + +public static class MultipleQueriesMiddlewareExtensions +{ + public static IApplicationBuilder UseMultipleQueries(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs new file mode 100644 index 00000000000..5308afd3811 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; + +namespace appMpower; + +public class MultipleUpdatesMiddelware +{ + private readonly static KeyValuePair _headerServer = + new KeyValuePair("Server", new StringValues("k")); + private readonly static KeyValuePair _headerContentType = + new KeyValuePair("Content-Type", new StringValues("application/json")); + + private readonly RequestDelegate _next; + + public MultipleUpdatesMiddelware(RequestDelegate next) + { + _next = next; + } + + public unsafe Task Invoke(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments("/updates", StringComparison.Ordinal)) + { + var queryString = httpContext.Request.QueryString.ToString(); + int count; + Int32.TryParse(queryString.Substring(queryString.LastIndexOf("=") + 1), out count); + count = count > 500 ? 500 : (count > 0 ? count : 1); + + var response = httpContext.Response; + response.Headers.Add(_headerServer); + response.Headers.Add(_headerContentType); + + int payloadLength; + IntPtr handlePointer; + + IntPtr bytePointer = NativeMethods.Updates(count, out payloadLength, out handlePointer); + byte[] json = new byte[payloadLength]; + Marshal.Copy(bytePointer, json, 0, payloadLength); + NativeMethods.FreeHandlePointer(handlePointer); + + response.Headers.Add( + new KeyValuePair("Content-Length", payloadLength.ToString())); + + return response.Body.WriteAsync(json, 0, payloadLength); + } + + return _next(httpContext); + } +} + +public static class MultipleUpdatesMiddelwareExtensions +{ + public static IApplicationBuilder UseMultipleUpdates(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/PlaintextMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/PlaintextMiddleware.cs new file mode 100644 index 00000000000..cf7ad20e54a --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/PlaintextMiddleware.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; + +namespace appMpower; + +public unsafe class PlaintextMiddleware +{ + private readonly static KeyValuePair _headerServer = + new KeyValuePair("Server", new StringValues("k")); + private readonly static KeyValuePair _headerContentType = + new KeyValuePair("Content-Type", new StringValues("text/plain")); + private static readonly byte[] _helloWorldPayload = Encoding.UTF8.GetBytes("Hello, World!"); + + private readonly RequestDelegate _nextStage; + + public PlaintextMiddleware(RequestDelegate nextStage) + { + _nextStage = nextStage; + } + + public Task Invoke(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments("/plaintext", StringComparison.Ordinal)) + { + var payloadLength = _helloWorldPayload.Length; + var response = httpContext.Response; + response.Headers.Add(_headerServer); + response.Headers.Add(_headerContentType); + response.Headers.Add( + new KeyValuePair("Content-Length", payloadLength.ToString())); + + return response.Body.WriteAsync(_helloWorldPayload, 0, payloadLength); + } + + return _nextStage(httpContext); + } +} + +public static class PlaintextMiddlewareExtensions +{ + public static IApplicationBuilder UsePlainText(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs new file mode 100644 index 00000000000..d43de484b66 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; + +namespace appMpower; + +public class SingleQueryMiddleware +{ + private readonly static KeyValuePair _headerServer = + new KeyValuePair("Server", new StringValues("k")); + private readonly static KeyValuePair _headerContentType = + new KeyValuePair("Content-Type", new StringValues("application/json")); + + private readonly RequestDelegate _nextStage; + + public SingleQueryMiddleware(RequestDelegate nextStage) + { + _nextStage = nextStage; + } + + public unsafe Task Invoke(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments("/db", StringComparison.Ordinal)) + { + var response = httpContext.Response; + response.Headers.Add(_headerServer); + response.Headers.Add(_headerContentType); + + int payloadLength; + IntPtr handlePointer; + + IntPtr bytePointer = NativeMethods.Db(out payloadLength, out handlePointer); + byte[] json = new byte[payloadLength]; + Marshal.Copy(bytePointer, json, 0, payloadLength); + NativeMethods.FreeHandlePointer(handlePointer); + + response.Headers.Add( + new KeyValuePair("Content-Length", payloadLength.ToString())); + + return response.Body.WriteAsync(json, 0, payloadLength); + } + + return _nextStage(httpContext); + } +} + +public static class SingleQueryMiddlewareExtensions +{ + public static IApplicationBuilder UseSingleQuery(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs b/frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs new file mode 100644 index 00000000000..e24104d47fe --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs @@ -0,0 +1,62 @@ +using System; +using System.Runtime.InteropServices; + +public unsafe partial class NativeMethods +{ +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#endif + public static extern void Dbms(int dbms); + +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#endif + public static extern void DbProvider(int dbProvider); + +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl)] +#endif + public static extern void FreeHandlePointer(IntPtr handlePointer); + +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#endif + //public static extern byte* Db(out int length); + public static extern IntPtr Db(out int length, out IntPtr handlePointer); + +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#endif + public static extern IntPtr Fortunes(out int length, out IntPtr handlePointer); + +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#endif + public static extern IntPtr Query(int queries, out int length, out IntPtr handlePointer); + +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#endif + public static extern IntPtr Updates(int queries, out int length, out IntPtr handlePointer); + +#if DEBUG + [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#else + [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] +#endif + public static extern IntPtr DbById(int id, out int length, out IntPtr handlePointer); +} diff --git a/frameworks/CSharp/appmpower/src/appMpower/Program.cs b/frameworks/CSharp/appmpower/src/appMpower/Program.cs new file mode 100644 index 00000000000..f2f36aa627d --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Program.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; + +namespace appMpower; + +class Program +{ + static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + static IHost BuildWebHost(string[] args) + { + var config = new ConfigurationBuilder() + .AddJsonFile("appsettings.json") + .AddEnvironmentVariables(prefix: "ASPNETCORE_") + .AddCommandLine(args) + .Build(); + + var appSettings = config.GetSection("AppSettings").Get(); + + var host = Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseConfiguration(config) + .UseKestrel(options => + { + options.AddServerHeader = false; + options.AllowSynchronousIO = true; + }) + .UseStartup(); + }) + .Build(); + + return host; + } +} + +public class AppSettings +{ + public string Database { get; set; } +} diff --git a/frameworks/CSharp/appmpower/src/Kestrel/IJsonSerializer.cs b/frameworks/CSharp/appmpower/src/appMpower/Serializers/IJsonSerializer.cs similarity index 81% rename from frameworks/CSharp/appmpower/src/Kestrel/IJsonSerializer.cs rename to frameworks/CSharp/appmpower/src/appMpower/Serializers/IJsonSerializer.cs index 4f28a4cc538..eb59ff827ed 100644 --- a/frameworks/CSharp/appmpower/src/Kestrel/IJsonSerializer.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Serializers/IJsonSerializer.cs @@ -1,6 +1,6 @@ using System.Text.Json; -namespace appMpower.Kestrel +namespace appMpower.Serializers { public interface IJsonSerializer { diff --git a/frameworks/CSharp/appmpower/src/JsonMessageSerializer.cs b/frameworks/CSharp/appmpower/src/appMpower/Serializers/JsonMessageSerializer.cs similarity index 58% rename from frameworks/CSharp/appmpower/src/JsonMessageSerializer.cs rename to frameworks/CSharp/appmpower/src/appMpower/Serializers/JsonMessageSerializer.cs index dca7f673368..c06636f1a31 100644 --- a/frameworks/CSharp/appmpower/src/JsonMessageSerializer.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Serializers/JsonMessageSerializer.cs @@ -1,13 +1,13 @@ using System.Text.Json; -namespace appMpower +namespace appMpower.Serializers { - public class JsonMessageSerializer : Kestrel.IJsonSerializer + public class JsonMessageSerializer : IJsonSerializer { public void Serialize(Utf8JsonWriter utf8JsonWriter, JsonMessage jsonMessage) { utf8JsonWriter.WriteStartObject(); - utf8JsonWriter.WriteString("message", jsonMessage.message); + utf8JsonWriter.WriteString("message", jsonMessage.Message); utf8JsonWriter.WriteEndObject(); } } diff --git a/frameworks/CSharp/appmpower/src/appMpower/Startup.cs b/frameworks/CSharp/appmpower/src/appMpower/Startup.cs new file mode 100644 index 00000000000..4b571cf8286 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Startup.cs @@ -0,0 +1,56 @@ +using System.Text.Encodings.Web; +using System.Text.Unicode; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace appMpower; + +public class Startup +{ + private readonly IConfiguration _configuration; + + public Startup(IConfiguration configuration) + { + _configuration = configuration; + } + + public void ConfigureServices(IServiceCollection services) + { + var appSettings = _configuration.Get(); + services.AddSingleton(appSettings); + +#if !DEBUG + #if ODBC + NativeMethods.DbProvider(1); //ODBC + #else + NativeMethods.DbProvider(0); //ADO + #endif + + #if POSTGRESQL + NativeMethods.Dbms(1); //PostgreSQL + #else + NativeMethods.Dbms(0); //MySQL + #endif +#endif + + var settings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Katakana, UnicodeRanges.Hiragana); + + settings.AllowCharacter('—'); + services.AddWebEncoders(options => + { + options.TextEncoderSettings = settings; + }); + } + + public void Configure(IApplicationBuilder app) + { + app.UsePlainText(); + app.UseJson(); + app.UseSingleQuery(); + app.UseCaching(); + app.UseFortunes(); + app.UseMultipleQueries(); + app.UseMultipleUpdates(); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj b/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj new file mode 100644 index 00000000000..5661d01ce61 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj @@ -0,0 +1,35 @@ + + + + net8.0 + Exe + true + + + + + + + + + + + + + + + + $(DefineConstants);ODBC + $(DefineConstants);POSTGRESQL + $(DefineConstants);MYSQL + + + \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/appsettings.json b/frameworks/CSharp/appmpower/src/appMpower/appsettings.json new file mode 100644 index 00000000000..0b1badf0626 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "None", + "Microsoft": "None", + "Microsoft.Hosting.Lifetime": "None" + } + } +} diff --git a/frameworks/CSharp/appmpower/src/nuget.config b/frameworks/CSharp/appmpower/src/appMpower/nuget.config similarity index 100% rename from frameworks/CSharp/appmpower/src/nuget.config rename to frameworks/CSharp/appmpower/src/appMpower/nuget.config diff --git a/frameworks/CSharp/appmpower/src/src.sln b/frameworks/CSharp/appmpower/src/src.sln new file mode 100644 index 00000000000..bedda48f506 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/src.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "appMpower.Orm", "appMpower.Orm\appMpower.Orm.csproj", "{1EC05247-7299-4F69-887B-3B746DF5F878}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "appMpower", "appMpower\appMpower.csproj", "{EB5D3496-53B9-49A7-A3AD-754078142F81}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1EC05247-7299-4F69-887B-3B746DF5F878}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EC05247-7299-4F69-887B-3B746DF5F878}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EC05247-7299-4F69-887B-3B746DF5F878}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1EC05247-7299-4F69-887B-3B746DF5F878}.Release|Any CPU.Build.0 = Release|Any CPU + {EB5D3496-53B9-49A7-A3AD-754078142F81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB5D3496-53B9-49A7-A3AD-754078142F81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB5D3496-53B9-49A7-A3AD-754078142F81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB5D3496-53B9-49A7-A3AD-754078142F81}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal From 2fa6c6512603b8852703c30a51b2c90e57eeef84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:50:23 +0000 Subject: [PATCH 0766/1766] Bump rexml from 3.3.3 to 3.3.6 in /frameworks/Ruby/rack Bumps [rexml](https://github.com/ruby/rexml) from 3.3.3 to 3.3.6. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.3.3...v3.3.6) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... 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 7a08fdf7195..f3224c850b1 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -86,7 +86,7 @@ GEM rainbow (3.1.1) raindrops (0.20.1) regexp_parser (2.9.2) - rexml (3.3.3) + rexml (3.3.6) strscan rubocop (1.64.1) json (~> 2.3) From 19580460e86ab14aba9f40f65aeede53ff8b159b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 19:07:31 +0000 Subject: [PATCH 0767/1766] Bump diesel from 1.4.6 to 2.2.3 in /frameworks/Rust/tide Bumps [diesel](https://github.com/diesel-rs/diesel) from 1.4.6 to 2.2.3. - [Release notes](https://github.com/diesel-rs/diesel/releases) - [Changelog](https://github.com/diesel-rs/diesel/blob/v2.2.3/CHANGELOG.md) - [Commits](https://github.com/diesel-rs/diesel/compare/v1.4.6...v2.2.3) --- updated-dependencies: - dependency-name: diesel dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Rust/tide/Cargo.lock | 178 ++++++++++++++++++++++++++------ frameworks/Rust/tide/Cargo.toml | 2 +- 2 files changed, 150 insertions(+), 30 deletions(-) diff --git a/frameworks/Rust/tide/Cargo.lock b/frameworks/Rust/tide/Cargo.lock index e9aa1d8598d..7ed70839854 100644 --- a/frameworks/Rust/tide/Cargo.lock +++ b/frameworks/Rust/tide/Cargo.lock @@ -93,7 +93,7 @@ checksum = "ca2925c4c290382f9d2fa3d1c1b6a63fa1427099721ecca4749b154cc9c25522" dependencies = [ "askama_shared", "proc-macro2", - "syn", + "syn 1.0.60", ] [[package]] @@ -116,7 +116,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 1.0.60", "toml", ] @@ -127,7 +127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ "quote", - "syn", + "syn 1.0.60", ] [[package]] @@ -331,7 +331,7 @@ checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.60", ] [[package]] @@ -380,6 +380,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "bitvec" version = "0.19.4" @@ -609,7 +615,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8f45d9ad417bcef4817d614a501ab55cdd96a6fdb24f49aab89a54acfd66b19" dependencies = [ "quote", - "syn", + "syn 1.0.60", ] [[package]] @@ -621,6 +627,41 @@ dependencies = [ "cipher", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.75", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.75", +] + [[package]] name = "dashmap" version = "4.0.2" @@ -639,26 +680,38 @@ checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" [[package]] name = "diesel" -version = "1.4.6" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "047bfc4d5c3bd2ef6ca6f981941046113524b9a9f9a7cbdfdd7ff40f58e6f542" +checksum = "65e13bab2796f412722112327f3e575601a3e9cdcbe426f0d30dbf43f3f5dc71" dependencies = [ - "bitflags", + "bitflags 2.6.0", "byteorder", "diesel_derives", + "itoa 1.0.11", "pq-sys", "r2d2", ] [[package]] name = "diesel_derives" -version = "1.4.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" +checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" dependencies = [ + "diesel_table_macro_syntax", + "dsl_auto_type", "proc-macro2", "quote", - "syn", + "syn 2.0.75", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" +dependencies = [ + "syn 2.0.75", ] [[package]] @@ -676,6 +729,26 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" +[[package]] +name = "dsl_auto_type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607" +dependencies = [ + "darling", + "either", + "heck", + "proc-macro2", + "quote", + "syn 2.0.75", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "event-listener" version = "2.5.1" @@ -707,6 +780,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "form_urlencoded" version = "1.0.1" @@ -768,7 +847,7 @@ dependencies = [ "proc-macro-hack", "proc-macro2", "quote", - "syn", + "syn 1.0.60", ] [[package]] @@ -837,6 +916,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.18" @@ -923,6 +1008,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.2.2" @@ -955,6 +1046,12 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + [[package]] name = "js-sys" version = "0.3.48" @@ -986,7 +1083,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21f866863575d0e1d654fbeeabdc927292fdf862873dc3c96c6f753357e13374" dependencies = [ "arrayvec", - "bitflags", + "bitflags 1.2.1", "cfg-if 1.0.0", "ryu", "static_assertions", @@ -1153,7 +1250,7 @@ checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.60", ] [[package]] @@ -1227,18 +1324,18 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1317,7 +1414,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" dependencies = [ - "bitflags", + "bitflags 1.2.1", ] [[package]] @@ -1388,7 +1485,7 @@ checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.60", ] [[package]] @@ -1397,7 +1494,7 @@ version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43535db9747a4ba938c0ce0a98cc631a46ebf943c9e1d604e091df6007620bf6" dependencies = [ - "itoa", + "itoa 0.4.7", "ryu", "serde", ] @@ -1421,7 +1518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" dependencies = [ "form_urlencoded", - "itoa", + "itoa 0.4.7", "ryu", "serde", ] @@ -1541,7 +1638,7 @@ dependencies = [ "quote", "serde", "serde_derive", - "syn", + "syn 1.0.60", ] [[package]] @@ -1557,7 +1654,7 @@ dependencies = [ "serde_derive", "serde_json", "sha1", - "syn", + "syn 1.0.60", ] [[package]] @@ -1566,6 +1663,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.4.0" @@ -1589,6 +1692,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syn" +version = "2.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tap" version = "1.0.1" @@ -1612,7 +1726,7 @@ checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.60", ] [[package]] @@ -1697,7 +1811,7 @@ dependencies = [ "proc-macro2", "quote", "standback", - "syn", + "syn 1.0.60", ] [[package]] @@ -1739,6 +1853,12 @@ dependencies = [ "matches", ] +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + [[package]] name = "unicode-normalization" version = "0.1.17" @@ -1840,7 +1960,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 1.0.60", "wasm-bindgen-shared", ] @@ -1874,7 +1994,7 @@ checksum = "cc053ec74d454df287b9374ee8abb36ffd5acb95ba87da3ba5b7d3fe20eb401e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/frameworks/Rust/tide/Cargo.toml b/frameworks/Rust/tide/Cargo.toml index 80c05675a77..18b2aeea38c 100644 --- a/frameworks/Rust/tide/Cargo.toml +++ b/frameworks/Rust/tide/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" askama = "0.10.5" async-std = { version = "1.9.0", features = ["attributes"] } async-trait = "0.1.42" -diesel = { version = "1.4.6", features = ["postgres", "r2d2"] } +diesel = { version = "2.2.3", features = ["postgres", "r2d2"] } http-types = "2.10.0" rand = { version = "0.7", features = ["small_rng"] } serde = { version = "1.0.123", features = ["derive"] } From 0ffacd956b5354a9c5848e61e0d2ea85af262c14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=81=D1=82=D1=8F=20=D0=A2=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8F=D0=BA?= Date: Mon, 26 Aug 2024 19:12:32 +0300 Subject: [PATCH 0768/1766] refactor(ditsmod): upgrade Ditsmod, removed bun specific TypeScript code (#9216) * chore(ditsmod): upgrade Ditsmod, removed bun.lockb and bun-providers.ts. * refactor(ditsmod): removed bun specific TypeScript code. * refactor(ditsmod): significantly simplifying the structure of the app and reducing the number of tests. --- frameworks/TypeScript/ditsmod/.gitignore | 1 + .../TypeScript/ditsmod/benchmark_config.json | 149 ++---------------- frameworks/TypeScript/ditsmod/bun.lockb | Bin 59387 -> 0 bytes .../ditsmod/ditsmod-bun-mysql.dockerfile | 3 +- .../ditsmod/ditsmod-bun-postgres.dockerfile | 3 +- .../TypeScript/ditsmod/ditsmod-bun.dockerfile | 3 +- frameworks/TypeScript/ditsmod/package.json | 7 +- .../TypeScript/ditsmod/src/app/app.module.ts | 19 ++- .../app/bun-integration/bun-application.ts | 17 -- .../src/app/bun-integration/bun-providers.ts | 21 --- .../src/app/bun-integration/node-res.ts | 61 ------- .../src/app/bun-integration/pre-router.ts | 26 --- .../ditsmod/src/app/bun-integration/spawn.ts | 9 -- .../{modules/service/db => }/db.service.ts | 2 +- .../ditsmod/src/app/{utils => }/helper.ts | 2 +- .../service/db => }/init.extension.ts | 0 .../modules/routed/simple/db.controller.ts | 39 ----- .../modules/routed/simple/db.controller2.ts | 40 ----- .../routed/simple/fortune.controller.ts | 41 ----- .../routed/simple/fortune.controller2.ts | 43 ----- .../modules/routed/simple/simple.module.ts | 23 --- .../routed/simple/singleton.controller.ts | 18 --- .../routed/simple/without-db.controller.ts | 18 --- .../src/app/modules/service/db/db.module.ts | 13 -- .../{modules/service/db => }/mysql.service.ts | 0 .../ditsmod/src/app/one.controller.ts | 88 +++++++++++ .../service/db => }/postgres.service.ts | 0 .../app/{modules/service/db => }/tokens.ts | 0 .../src/app/{modules/service/db => }/types.ts | 0 frameworks/TypeScript/ditsmod/src/main.bun.ts | 12 -- frameworks/TypeScript/ditsmod/tsconfig.json | 6 - 31 files changed, 116 insertions(+), 548 deletions(-) delete mode 100755 frameworks/TypeScript/ditsmod/bun.lockb delete mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts rename frameworks/TypeScript/ditsmod/src/app/{modules/service/db => }/db.service.ts (96%) rename frameworks/TypeScript/ditsmod/src/app/{utils => }/helper.ts (90%) rename frameworks/TypeScript/ditsmod/src/app/{modules/service/db => }/init.extension.ts (100%) delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller2.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller2.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/simple.module.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/singleton.controller.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/without-db.controller.ts delete mode 100644 frameworks/TypeScript/ditsmod/src/app/modules/service/db/db.module.ts rename frameworks/TypeScript/ditsmod/src/app/{modules/service/db => }/mysql.service.ts (100%) create mode 100644 frameworks/TypeScript/ditsmod/src/app/one.controller.ts rename frameworks/TypeScript/ditsmod/src/app/{modules/service/db => }/postgres.service.ts (100%) rename frameworks/TypeScript/ditsmod/src/app/{modules/service/db => }/tokens.ts (100%) rename frameworks/TypeScript/ditsmod/src/app/{modules/service/db => }/types.ts (100%) delete mode 100644 frameworks/TypeScript/ditsmod/src/main.bun.ts diff --git a/frameworks/TypeScript/ditsmod/.gitignore b/frameworks/TypeScript/ditsmod/.gitignore index b7c122d83c3..d525fa34c07 100644 --- a/frameworks/TypeScript/ditsmod/.gitignore +++ b/frameworks/TypeScript/ditsmod/.gitignore @@ -5,3 +5,4 @@ dist* .pnp* nodemon.json package-lock.json +bun.lockb diff --git a/frameworks/TypeScript/ditsmod/benchmark_config.json b/frameworks/TypeScript/ditsmod/benchmark_config.json index c16c9419bde..11704b96a53 100755 --- a/frameworks/TypeScript/ditsmod/benchmark_config.json +++ b/frameworks/TypeScript/ditsmod/benchmark_config.json @@ -3,6 +3,7 @@ "tests": [ { "default": { + "dockerfile": "ditsmod.dockerfile", "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -17,31 +18,12 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Ditsmod", - "notes": "", - "versus": "nodejs" - }, - "simplified-di": { - "dockerfile": "ditsmod.dockerfile", - "json_url": "/json2", - "plaintext_url": "/plaintext2", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "Ditsmod", - "language": "TypeScript", - "flavor": "None", - "orm": "None", - "platform": "nodejs", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "ditsmod [simplified use of di]", + "display_name": "ditsmod", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "nodejs" }, "postgres": { + "dockerfile": "ditsmod-postgres.dockerfile", "db_url": "/db", "query_url": "/queries?queries=", "update_url": "/updates?queries=", @@ -60,10 +42,11 @@ "os": "Linux", "database_os": "Linux", "display_name": "ditsmod [postgres]", - "notes": "", + "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "nodejs" }, "mysql": { + "dockerfile": "ditsmod-mysql.dockerfile", "db_url": "/db", "query_url": "/queries?queries=", "update_url": "/updates?queries=", @@ -82,52 +65,6 @@ "os": "Linux", "database_os": "Linux", "display_name": "ditsmod [mysql]", - "notes": "", - "versus": "nodejs" - }, - "postgres2": { - "dockerfile": "ditsmod-postgres.dockerfile", - "db_url": "/db2", - "query_url": "/queries2?queries=", - "update_url": "/updates2?queries=", - "cached_query_url": "/cached-queries2?count=", - "fortune_url": "/fortunes2", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "Ditsmod", - "language": "TypeScript", - "flavor": "None", - "orm": "Raw", - "platform": "nodejs", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "ditsmod [postgres & simplified use of di]", - "notes": "Simplified use of Dependency Injection (no request level injector).", - "versus": "nodejs" - }, - "mysql2": { - "dockerfile": "ditsmod-mysql.dockerfile", - "db_url": "/db2", - "query_url": "/queries2?queries=", - "update_url": "/updates2?queries=", - "cached_query_url": "/cached-queries2?count=", - "fortune_url": "/fortunes2", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "Ditsmod", - "language": "TypeScript", - "flavor": "None", - "orm": "Raw", - "platform": "nodejs", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "ditsmod [mysql & simplified use of di]", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "nodejs" }, @@ -139,7 +76,7 @@ "approach": "Realistic", "classification": "Micro", "database": "None", - "framework": "Ditsmod", + "framework": "ditsmod-bun", "language": "TypeScript", "flavor": "None", "orm": "None", @@ -147,27 +84,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Ditsmod on bun", - "notes": "", - "versus": "bun" - }, - "simplified-di-bun": { - "dockerfile": "ditsmod-bun.dockerfile", - "json_url": "/json2", - "plaintext_url": "/plaintext2", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "Ditsmod", - "language": "TypeScript", - "flavor": "None", - "orm": "None", - "platform": "bun", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "ditsmod on bun [simplified use of di]", + "display_name": "ditsmod on bun", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "bun" }, @@ -182,7 +99,7 @@ "approach": "Realistic", "classification": "Micro", "database": "Postgres", - "framework": "Ditsmod", + "framework": "ditsmod-bun", "language": "TypeScript", "flavor": "None", "orm": "Raw", @@ -191,7 +108,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "ditsmod on bun [postgres]", - "notes": "", + "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "bun" }, "mysql-bun": { @@ -205,7 +122,7 @@ "approach": "Realistic", "classification": "Micro", "database": "MySQL", - "framework": "Ditsmod", + "framework": "ditsmod-bun", "language": "TypeScript", "flavor": "None", "orm": "Raw", @@ -214,52 +131,6 @@ "os": "Linux", "database_os": "Linux", "display_name": "ditsmod on bun [mysql]", - "notes": "", - "versus": "bun" - }, - "postgres2-bun": { - "dockerfile": "ditsmod-bun-postgres.dockerfile", - "db_url": "/db2", - "query_url": "/queries2?queries=", - "update_url": "/updates2?queries=", - "cached_query_url": "/cached-queries2?count=", - "fortune_url": "/fortunes2", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "Ditsmod", - "language": "TypeScript", - "flavor": "None", - "orm": "Raw", - "platform": "bun", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "ditsmod on bun [postgres & simplified use of di]", - "notes": "Simplified use of Dependency Injection (no request level injector).", - "versus": "bun" - }, - "mysql2-bun": { - "dockerfile": "ditsmod-bun-mysql.dockerfile", - "db_url": "/db2", - "query_url": "/queries2?queries=", - "update_url": "/updates2?queries=", - "cached_query_url": "/cached-queries2?count=", - "fortune_url": "/fortunes2", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "Ditsmod", - "language": "TypeScript", - "flavor": "None", - "orm": "Raw", - "platform": "bun", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "ditsmod on bun [mysql & simplified use of di]", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "bun" } diff --git a/frameworks/TypeScript/ditsmod/bun.lockb b/frameworks/TypeScript/ditsmod/bun.lockb deleted file mode 100755 index c15ebbf0d57fa7a70302adedf5ceb815a5c211fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59387 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 diff --git a/frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile index c6c56b41443..d0f44000dc7 100644 --- a/frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile +++ b/frameworks/TypeScript/ditsmod/ditsmod-bun-mysql.dockerfile @@ -6,7 +6,6 @@ RUN bun install RUN bun run build ENV NODE_ENV production -ENV IS_BUN true ENV DATABASE mysql ENV MYSQL_HOST tfb-database ENV MYSQL_USER benchmarkdbuser @@ -14,4 +13,4 @@ ENV MYSQL_PSWD benchmarkdbpass ENV MYSQL_DBNAME hello_world EXPOSE 8080 -CMD rm node_modules/@ditsmod/*/tsconfig.json && bun src/app/bun-integration/spawn.ts +CMD rm node_modules/@ditsmod/*/tsconfig.json && bun dist/main.js diff --git a/frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile index 6d10f0bfc7b..1bcc29a8b2f 100644 --- a/frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile +++ b/frameworks/TypeScript/ditsmod/ditsmod-bun-postgres.dockerfile @@ -6,7 +6,6 @@ RUN bun install RUN bun run build ENV NODE_ENV production -ENV IS_BUN true ENV DATABASE postgres ENV PG_HOST tfb-database ENV PG_USER benchmarkdbuser @@ -14,4 +13,4 @@ ENV PG_PSWD benchmarkdbpass ENV PG_DBNAME hello_world EXPOSE 8080 -CMD rm node_modules/@ditsmod/*/tsconfig.json && bun src/app/bun-integration/spawn.ts +CMD rm node_modules/@ditsmod/*/tsconfig.json && bun dist/main.js diff --git a/frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile b/frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile index d18c49cab44..8f0268556af 100644 --- a/frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile +++ b/frameworks/TypeScript/ditsmod/ditsmod-bun.dockerfile @@ -6,7 +6,6 @@ RUN bun install RUN bun run build ENV NODE_ENV production -ENV IS_BUN true EXPOSE 8080 -CMD rm node_modules/@ditsmod/*/tsconfig.json && bun src/app/bun-integration/spawn.ts +CMD rm node_modules/@ditsmod/*/tsconfig.json && bun dist/main.js diff --git a/frameworks/TypeScript/ditsmod/package.json b/frameworks/TypeScript/ditsmod/package.json index 3d74a7822de..a4d1ec09851 100755 --- a/frameworks/TypeScript/ditsmod/package.json +++ b/frameworks/TypeScript/ditsmod/package.json @@ -10,16 +10,11 @@ "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist*" }, - "imports": { - "#routed/*": "./dist/app/modules/routed/*", - "#service/*": "./dist/app/modules/service/*", - "#utils/*": "./dist/app/utils/*" - }, "keywords": [], "author": "Костя Третяк", "license": "MIT", "dependencies": { - "@ditsmod/core": "~2.54.2", + "@ditsmod/core": "~2.55.0", "@ditsmod/routing": "~2.3.0", "handlebars": "^4.7.8", "lru-cache": "^11.0.0", diff --git a/frameworks/TypeScript/ditsmod/src/app/app.module.ts b/frameworks/TypeScript/ditsmod/src/app/app.module.ts index e0c1dfedcec..34bfc4357cf 100644 --- a/frameworks/TypeScript/ditsmod/src/app/app.module.ts +++ b/frameworks/TypeScript/ditsmod/src/app/app.module.ts @@ -1,13 +1,16 @@ -import { PreRouter, rootModule } from '@ditsmod/core'; +import { Providers, rootModule } from '@ditsmod/core'; +import { PRE_ROUTER_EXTENSIONS, RoutingModule } from '@ditsmod/routing'; -import { SimpleModule } from '#routed/simple/simple.module.js'; -import { BunPreRouter } from './bun-integration/pre-router.js'; -import { BunProviders } from './bun-integration/bun-providers.js'; +import { OneController } from './one.controller.js'; +import { DbService } from './db.service.js'; +import { InitExtension } from './init.extension.js'; +import { DB_INIT_EXTENSIONS } from './tokens.js'; +import { ModelService } from './types.js'; @rootModule({ - appends: [SimpleModule], - providersPerApp: [ - ...new BunProviders().useLogConfig({ level: 'off' }).if(process.env.IS_BUN).useClass(PreRouter, BunPreRouter), - ], + imports: [RoutingModule], + providersPerApp: new Providers().passThrough(DbService).passThrough(ModelService).useLogConfig({ level: 'off' }), + extensions: [{ extension: InitExtension, groupToken: DB_INIT_EXTENSIONS, nextToken: PRE_ROUTER_EXTENSIONS }], + controllers: [OneController], }) export class AppModule {} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts deleted file mode 100644 index 0b462db87bb..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-application.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AnyFn, AppInitializer, Application } from '@ditsmod/core'; -import { Serve, Server } from 'bun'; - -export class BunApplication extends Application { - protected override createServer(requestListener: any): any { - const serveOptions = this.appOptions.serverOptions as Serve; - serveOptions.fetch ??= (req) => requestListener(req); - return Bun.serve(serveOptions); - } - - protected override async createServerAndBindToListening(appInitializer: AppInitializer, resolve: AnyFn) { - this.flushLogs(); - const server = (await this.createServer(appInitializer.requestListener)) as Server; - this.systemLogMediator.serverListen(this, server.hostname, server.port); - resolve({ server }); - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts deleted file mode 100644 index 0581973f421..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/bun-integration/bun-providers.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Providers, Class } from '@ditsmod/core'; - -export class BunProviders extends Providers { - protected setCondition?: boolean; - protected ifCondition?: boolean; - - if(condition: any) { - this.setCondition = true; - this.ifCondition = condition; - return this; - } - - override useClass(token: A, useClass: B, multi?: boolean): this { - if (!this.setCondition || this.ifCondition) { - this.pushProvider({ token, useClass }, multi); - } - this.setCondition = undefined; - this.ifCondition = undefined; - return this; - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts deleted file mode 100644 index 7dae8de27a6..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/bun-integration/node-res.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Writable } from 'node:stream'; - -export class NodeRes extends Writable { - #chunks: Buffer[] = []; - #resolve: (body: string) => void; - status: number = 200; - headers = {} as HeadersInit; - body = new Promise((resolve) => (this.#resolve = resolve)); - headersSent?: boolean; - statusText?: string; - - set statusCode(statusCode: number) { - this.status = statusCode; - } - - getHeader(name: string) { - return this.headers[name as keyof HeadersInit]; - } - - getHeaders() { - return this.headers; - } - - setHeader(name: string, value: number | string | readonly string[]) { - this.headers = { ...this.headers, [name]: value } as HeadersInit; - return this; - } - - writeHead(statusCode: number, headers?: HeadersInit): this; - writeHead(statusCode: number, statusMessage: string, headers?: HeadersInit): this; - writeHead(statusCode: number, statusMsgOrHeaders?: string | HeadersInit, headers?: HeadersInit): this { - this.status = statusCode; - if (typeof statusMsgOrHeaders == 'object') { - this.mergeHeaders(statusMsgOrHeaders); - } else { - this.statusText = statusMsgOrHeaders; - this.mergeHeaders(headers); - } - return this; - } - - override _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void { - this.#chunks.push(Buffer.from(chunk)); - callback(); - } - - override _final(callback: (error?: Error | null) => void): void { - const finalData = Buffer.concat(this.#chunks); - this.headersSent = true; - this.#resolve(finalData.toString()); - callback(); - } - - protected mergeHeaders(headers: HeadersInit = {}) { - if (Array.isArray(headers)) { - headers.forEach(([key, val]) => ((this.headers as any)[key] = val)); - } else { - this.headers = { ...this.headers, ...headers }; - } - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts deleted file mode 100644 index 26a0100e4e0..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/bun-integration/pre-router.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { PreRouter } from '@ditsmod/core'; -import { NodeRes } from './node-res.js'; - -export class BunPreRouter extends PreRouter { - override requestListener: any = async (req: Request) => { - const nodeReq = req as any; - const nodeRes = new NodeRes(); - - const url = new URL(req.url); - const uri = url.pathname; - const queryString = url.search.slice(1); - const { handle, params } = this.router.find(req.method as any, uri); - if (!handle) { - this.sendNotImplemented(nodeRes as any); - const body = await nodeRes.body; - return new Response(body, nodeRes); - } - - await handle(nodeReq, nodeRes as any, params!, queryString).catch((err) => { - this.sendInternalServerError(nodeRes as any, err); - }); - - const body = await nodeRes.body; - return new Response(body, nodeRes); - }; -} diff --git a/frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts b/frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts deleted file mode 100644 index 439451029a4..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/bun-integration/spawn.ts +++ /dev/null @@ -1,9 +0,0 @@ -import os from 'node:os'; - -const numCPUs = os.cpus().length; -for (let i = 0; i < numCPUs; i++) { - Bun.spawn(['bun', 'dist/main.bun.js'], { - stdio: ['inherit', 'inherit', 'inherit'], - env: { ...process.env }, - }); -} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/db.service.ts b/frameworks/TypeScript/ditsmod/src/app/db.service.ts similarity index 96% rename from frameworks/TypeScript/ditsmod/src/app/modules/service/db/db.service.ts rename to frameworks/TypeScript/ditsmod/src/app/db.service.ts index 61c9b5bbfbd..1267c11f360 100644 --- a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/db.service.ts +++ b/frameworks/TypeScript/ditsmod/src/app/db.service.ts @@ -1,8 +1,8 @@ import { injectable } from '@ditsmod/core'; import { LRUCache } from 'lru-cache'; -import { getNumberOfObjects, getRandomNumber } from '#utils/helper.js'; import { ModelService, World } from './types.js'; +import { getNumberOfObjects, getRandomNumber } from './helper.js'; @injectable() export class DbService { diff --git a/frameworks/TypeScript/ditsmod/src/app/utils/helper.ts b/frameworks/TypeScript/ditsmod/src/app/helper.ts similarity index 90% rename from frameworks/TypeScript/ditsmod/src/app/utils/helper.ts rename to frameworks/TypeScript/ditsmod/src/app/helper.ts index 33a0cb20ad6..3adcffe4fef 100644 --- a/frameworks/TypeScript/ditsmod/src/app/utils/helper.ts +++ b/frameworks/TypeScript/ditsmod/src/app/helper.ts @@ -1,4 +1,4 @@ -import { Fortune } from '#service/db/types.js'; +import { Fortune } from './types.js'; export function getRandomNumber() { return Math.floor(Math.random() * 10000) + 1; diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/init.extension.ts b/frameworks/TypeScript/ditsmod/src/app/init.extension.ts similarity index 100% rename from frameworks/TypeScript/ditsmod/src/app/modules/service/db/init.extension.ts rename to frameworks/TypeScript/ditsmod/src/app/init.extension.ts diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller.ts b/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller.ts deleted file mode 100644 index ac39c4bc715..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AnyObj, controller, inject, QUERY_PARAMS, Res, route } from '@ditsmod/core'; - -import { DbService } from '#service/db/db.service.js'; -import { getRandomNumber } from '#utils/helper.js'; - -@controller() -export class DbController { - constructor( - private res: Res, - private dbService: DbService, - ) { - res.nodeRes.setHeader('Server', 'Ditsmod'); - } - - @route('GET', 'db') - async getSingleQuery() { - const id = getRandomNumber(); - const result = await this.dbService.findOneWorld(id); - this.res.sendJson(result); - } - - @route('GET', 'queries') - async getMultiQueries(@inject(QUERY_PARAMS) queryParams: AnyObj) { - const result = await this.dbService.getMultiQueries(queryParams.queries); - this.res.sendJson(result); - } - - @route('GET', 'cached-queries') - async getCachedWorlds(@inject(QUERY_PARAMS) queryParams: AnyObj) { - const result = await this.dbService.getMultiQueries(queryParams.count, false); - this.res.sendJson(result); - } - - @route('GET', 'updates') - async getUpdates(@inject(QUERY_PARAMS) queryParams: AnyObj) { - const worlds = await this.dbService.saveWorlds(queryParams.queries); - this.res.sendJson(worlds); - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller2.ts b/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller2.ts deleted file mode 100644 index cef38bd4d0b..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller2.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { AnyObj, controller, RequestContext, SingletonRequestContext, route } from '@ditsmod/core'; - -import { DbService } from '#service/db/db.service.js'; -import { getRandomNumber } from '#utils/helper.js'; - -@controller({ isSingleton: true }) -export class DbController2 { - constructor(private dbService: DbService) {} - - @route('GET', 'db2') - async getSingleQuery(ctx: RequestContext) { - const id = getRandomNumber(); - const result = await this.dbService.findOneWorld(id); - this.sendJson(ctx, result); - } - - @route('GET', 'queries2') - async getMultiQueries(ctx: SingletonRequestContext) { - const result = await this.dbService.getMultiQueries(ctx.queryParams!.queries); - this.sendJson(ctx, result); - } - - @route('GET', 'cached-queries2') - async getCachedWorlds(ctx: SingletonRequestContext) { - const result = await this.dbService.getMultiQueries(ctx.queryParams!.count, false); - this.sendJson(ctx, result); - } - - @route('GET', 'updates2') - async getUpdates(ctx: SingletonRequestContext) { - const worlds = await this.dbService.saveWorlds(ctx.queryParams!.queries); - this.sendJson(ctx, worlds); - } - - protected sendJson(ctx: RequestContext, value: AnyObj) { - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'application/json; charset=utf-8'); - ctx.nodeRes.end(JSON.stringify(value)); - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller.ts b/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller.ts deleted file mode 100644 index 64c6b087cc5..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller.ts +++ /dev/null @@ -1,41 +0,0 @@ -import Handlebars from 'handlebars'; -import { NODE_RES, NodeResponse, controller, inject, route } from '@ditsmod/core'; - -import { additionalFortune, compare } from '#utils/helper.js'; -import { DbService } from '#service/db/db.service.js'; - -const tmpl = Handlebars.compile( - [ - '', - '', - 'Fortunes', - '', - '', - '', - '', - '', - '', - '{{#fortunes}}', - '', - '', - '', - '', - '{{/fortunes}}', - '
    idmessage
    {{id}}{{message}}
    ', - '', - '', - ].join(''), -); - -@controller() -export class FortuneController { - @route('GET', 'fortunes') - async fortunes(@inject(NODE_RES) nodeRes: NodeResponse, dbService: DbService) { - const fortunes = await dbService.findAllFortunes(); - fortunes.push(additionalFortune); - fortunes.sort(compare); - nodeRes.setHeader('Server', 'Ditsmod'); - nodeRes.setHeader('Content-Type', 'text/html; charset=utf-8'); - nodeRes.end(tmpl({ fortunes })); - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller2.ts b/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller2.ts deleted file mode 100644 index 5100a0dcb54..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller2.ts +++ /dev/null @@ -1,43 +0,0 @@ -import Handlebars from 'handlebars'; -import { RequestContext, controller, route } from '@ditsmod/core'; - -import { additionalFortune, compare } from '#utils/helper.js'; -import { DbService } from '#service/db/db.service.js'; - -const tmpl = Handlebars.compile( - [ - '', - '', - 'Fortunes', - '', - '', - '', - '', - '', - '', - '{{#fortunes}}', - '', - '', - '', - '', - '{{/fortunes}}', - '
    idmessage
    {{id}}{{message}}
    ', - '', - '', - ].join(''), -); - -@controller({ isSingleton: true }) -export class FortuneController2 { - constructor(private dbService: DbService) {} - - @route('GET', 'fortunes2') - async fortunes(ctx: RequestContext) { - const fortunes = await this.dbService.findAllFortunes(); - fortunes.push(additionalFortune); - fortunes.sort(compare); - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'text/html; charset=utf-8'); - ctx.nodeRes.end(tmpl({ fortunes })); - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/simple.module.ts b/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/simple.module.ts deleted file mode 100644 index 123681d91aa..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/simple.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { featureModule } from '@ditsmod/core'; -import { RoutingModule } from '@ditsmod/routing'; - -import { DbModule } from '#service/db/db.module.js'; -import { WithoutDbController } from './without-db.controller.js'; -import { DbController } from './db.controller.js'; -import { FortuneController } from './fortune.controller.js'; -import { SingletonController } from './singleton.controller.js'; -import { DbController2 } from './db.controller2.js'; -import { FortuneController2 } from './fortune.controller2.js'; - -@featureModule({ - imports: [RoutingModule, DbModule], - controllers: [ - WithoutDbController, - DbController, - DbController2, - FortuneController, - FortuneController2, - SingletonController, - ], -}) -export class SimpleModule {} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/singleton.controller.ts b/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/singleton.controller.ts deleted file mode 100644 index 3661775e536..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/singleton.controller.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { controller, route, SingletonRequestContext } from '@ditsmod/core'; - -@controller({ isSingleton: true }) -export class SingletonController { - @route('GET', 'plaintext2') - getHello(ctx: SingletonRequestContext) { - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'text/plain; charset=utf-8'); - ctx.nodeRes.end('Hello, World!'); - } - - @route('GET', 'json2') - getJson(ctx: SingletonRequestContext) { - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'application/json; charset=utf-8'); - ctx.nodeRes.end(JSON.stringify({ message: 'Hello, World!' })); - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/without-db.controller.ts b/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/without-db.controller.ts deleted file mode 100644 index 9ff5246609f..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/without-db.controller.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { controller, Res, route } from '@ditsmod/core'; - -@controller() -export class WithoutDbController { - constructor(private res: Res) { - res.nodeRes.setHeader('Server', 'Ditsmod'); - } - - @route('GET', 'plaintext') - getHello() { - this.res.send('Hello, World!'); - } - - @route('GET', 'json') - getJson() { - this.res.sendJson({ message: 'Hello, World!' }); - } -} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/db.module.ts b/frameworks/TypeScript/ditsmod/src/app/modules/service/db/db.module.ts deleted file mode 100644 index 08de21fb22a..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/db.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { featureModule } from '@ditsmod/core'; -import { PRE_ROUTER_EXTENSIONS } from '@ditsmod/routing'; - -import { DbService } from './db.service.js'; -import { InitExtension } from './init.extension.js'; -import { DB_INIT_EXTENSIONS } from './tokens.js'; -import { ModelService } from './types.js'; - -@featureModule({ - providersPerApp: [DbService, ModelService], - extensions: [{ extension: InitExtension, groupToken: DB_INIT_EXTENSIONS, nextToken: PRE_ROUTER_EXTENSIONS }], -}) -export class DbModule {} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/mysql.service.ts b/frameworks/TypeScript/ditsmod/src/app/mysql.service.ts similarity index 100% rename from frameworks/TypeScript/ditsmod/src/app/modules/service/db/mysql.service.ts rename to frameworks/TypeScript/ditsmod/src/app/mysql.service.ts diff --git a/frameworks/TypeScript/ditsmod/src/app/one.controller.ts b/frameworks/TypeScript/ditsmod/src/app/one.controller.ts new file mode 100644 index 00000000000..09615c93598 --- /dev/null +++ b/frameworks/TypeScript/ditsmod/src/app/one.controller.ts @@ -0,0 +1,88 @@ +import { AnyObj, controller, RequestContext, SingletonRequestContext, route } from '@ditsmod/core'; +import Handlebars from 'handlebars'; + +import { DbService } from './db.service.js'; +import { additionalFortune, compare, getRandomNumber } from './helper.js'; + +const tmpl = Handlebars.compile( + [ + '', + '', + 'Fortunes', + '', + '', + '', + '', + '', + '', + '{{#fortunes}}', + '', + '', + '', + '', + '{{/fortunes}}', + '
    idmessage
    {{id}}{{message}}
    ', + '', + '', + ].join(''), +); + +@controller({ isSingleton: true }) +export class OneController { + constructor(private dbService: DbService) {} + + @route('GET', 'db') + async getSingleQuery(ctx: RequestContext) { + const id = getRandomNumber(); + const result = await this.dbService.findOneWorld(id); + this.sendJson(ctx, result); + } + + @route('GET', 'queries') + async getMultiQueries(ctx: SingletonRequestContext) { + const result = await this.dbService.getMultiQueries(ctx.queryParams!.queries); + this.sendJson(ctx, result); + } + + @route('GET', 'cached-queries') + async getCachedWorlds(ctx: SingletonRequestContext) { + const result = await this.dbService.getMultiQueries(ctx.queryParams!.count, false); + this.sendJson(ctx, result); + } + + @route('GET', 'updates') + async getUpdates(ctx: SingletonRequestContext) { + const worlds = await this.dbService.saveWorlds(ctx.queryParams!.queries); + this.sendJson(ctx, worlds); + } + + @route('GET', 'fortunes') + async fortunes(ctx: RequestContext) { + const fortunes = await this.dbService.findAllFortunes(); + fortunes.push(additionalFortune); + fortunes.sort(compare); + ctx.nodeRes.setHeader('Server', 'Ditsmod'); + ctx.nodeRes.setHeader('Content-Type', 'text/html; charset=utf-8'); + ctx.nodeRes.end(tmpl({ fortunes })); + } + + @route('GET', 'plaintext') + getHello(ctx: SingletonRequestContext) { + ctx.nodeRes.setHeader('Server', 'Ditsmod'); + ctx.nodeRes.setHeader('Content-Type', 'text/plain; charset=utf-8'); + ctx.nodeRes.end('Hello, World!'); + } + + @route('GET', 'json') + getJson(ctx: SingletonRequestContext) { + ctx.nodeRes.setHeader('Server', 'Ditsmod'); + ctx.nodeRes.setHeader('Content-Type', 'application/json; charset=utf-8'); + ctx.nodeRes.end(JSON.stringify({ message: 'Hello, World!' })); + } + + protected sendJson(ctx: RequestContext, value: AnyObj) { + ctx.nodeRes.setHeader('Server', 'Ditsmod'); + ctx.nodeRes.setHeader('Content-Type', 'application/json; charset=utf-8'); + ctx.nodeRes.end(JSON.stringify(value)); + } +} diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/postgres.service.ts b/frameworks/TypeScript/ditsmod/src/app/postgres.service.ts similarity index 100% rename from frameworks/TypeScript/ditsmod/src/app/modules/service/db/postgres.service.ts rename to frameworks/TypeScript/ditsmod/src/app/postgres.service.ts diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/tokens.ts b/frameworks/TypeScript/ditsmod/src/app/tokens.ts similarity index 100% rename from frameworks/TypeScript/ditsmod/src/app/modules/service/db/tokens.ts rename to frameworks/TypeScript/ditsmod/src/app/tokens.ts diff --git a/frameworks/TypeScript/ditsmod/src/app/modules/service/db/types.ts b/frameworks/TypeScript/ditsmod/src/app/types.ts similarity index 100% rename from frameworks/TypeScript/ditsmod/src/app/modules/service/db/types.ts rename to frameworks/TypeScript/ditsmod/src/app/types.ts diff --git a/frameworks/TypeScript/ditsmod/src/main.bun.ts b/frameworks/TypeScript/ditsmod/src/main.bun.ts deleted file mode 100644 index 42c0798a066..00000000000 --- a/frameworks/TypeScript/ditsmod/src/main.bun.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Serve, Server } from 'bun'; - -import { AppModule } from './app/app.module.js'; -import { BunApplication } from './app/bun-integration/bun-application.js'; - -const reusePort = process.env.NODE_ENV == 'production'; -const serverOptions = { port: 8080, hostname: '0.0.0.0', reusePort } as Serve; -const { server } = await new BunApplication().bootstrap(AppModule, { - serverOptions: serverOptions as any, -}); - -const bunServer = server as unknown as Server; diff --git a/frameworks/TypeScript/ditsmod/tsconfig.json b/frameworks/TypeScript/ditsmod/tsconfig.json index ef1b58e6cb3..34983f83409 100644 --- a/frameworks/TypeScript/ditsmod/tsconfig.json +++ b/frameworks/TypeScript/ditsmod/tsconfig.json @@ -17,12 +17,6 @@ "strictPropertyInitialization": false, "allowJs": false, "types": ["bun-types"], - // Bun works with bugs if this code is uncommented. - // "paths": { - // "#routed/*": ["./src/app/modules/routed/*"], - // "#service/*": ["./src/app/modules/service/*"], - // "#utils/*": ["./src/app/utils/*"], - // } }, "include": [ "src", From 404f8899abaa38b6b745b3435b54533991df9eea Mon Sep 17 00:00:00 2001 From: Sanskar Jethi <29942790+sansyrox@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:28:20 +0100 Subject: [PATCH 0769/1766] chore: update robyn to latest version (#9217) * chore: update robyn to latest version * update v number --- frameworks/Python/robyn/app-const.py | 18 +++++++----------- frameworks/Python/robyn/app.py | 17 +++++++---------- frameworks/Python/robyn/benchmark_config.json | 3 ++- frameworks/Python/robyn/requirements-const.txt | 2 +- frameworks/Python/robyn/requirements.txt | 2 +- frameworks/Python/robyn/robyn-const.dockerfile | 2 +- frameworks/Python/robyn/robyn.dockerfile | 2 +- 7 files changed, 20 insertions(+), 26 deletions(-) diff --git a/frameworks/Python/robyn/app-const.py b/frameworks/Python/robyn/app-const.py index e082ff1b129..4b806389fa5 100755 --- a/frameworks/Python/robyn/app-const.py +++ b/frameworks/Python/robyn/app-const.py @@ -1,15 +1,15 @@ import multiprocessing import os -from robyn import Response, Robyn, jsonify +from robyn import Response, Robyn from robyn.argument_parser import Config class SpecialConfig(Config): def __init__(self): super().__init__() - self.workers = 2 - self.processes = (os.cpu_count() * 2) + 1 + self.workers = (os.cpu_count() * 2) + 1 + self.processes = os.cpu_count() self.log_level = "WARN" @@ -22,16 +22,12 @@ def plaintext() -> str: @app.get("/json", const=True) -def json() -> str: - return Response( - status_code=200, - description=jsonify({"message": "Hello, world!"}), - headers={"Content-Type": "application/json"} - ) - +def json() -> dict: + return { + "message": "Hello, world!" + } if __name__ == "__main__": app.add_response_header("Server", "Robyn") - app.start(host="0.0.0.0", port=8080) diff --git a/frameworks/Python/robyn/app.py b/frameworks/Python/robyn/app.py index 798b67026e2..e8c975e530f 100755 --- a/frameworks/Python/robyn/app.py +++ b/frameworks/Python/robyn/app.py @@ -1,15 +1,15 @@ import multiprocessing import os -from robyn import Response, Robyn, jsonify +from robyn import Response, Robyn from robyn.argument_parser import Config class SpecialConfig(Config): def __init__(self): super().__init__() - self.workers = 2 - self.processes = (os.cpu_count() * 2) + 1 + self.workers = (os.cpu_count() * 2) + 1 + self.processes = os.cpu_count() self.log_level = "WARN" @@ -22,13 +22,10 @@ def plaintext() -> str: @app.get("/json") -def json() -> str: - return Response( - status_code=200, - description=jsonify({"message": "Hello, world!"}), - headers={"Content-Type": "application/json"} - ) - +def json() -> dict: + return { + "message": "Hello, world!" + } if __name__ == "__main__": app.add_response_header("Server", "Roby1n") diff --git a/frameworks/Python/robyn/benchmark_config.json b/frameworks/Python/robyn/benchmark_config.json index 3d8c6baa8a3..46cd72fe4c6 100755 --- a/frameworks/Python/robyn/benchmark_config.json +++ b/frameworks/Python/robyn/benchmark_config.json @@ -38,4 +38,5 @@ } } ] -} \ No newline at end of file +} + diff --git a/frameworks/Python/robyn/requirements-const.txt b/frameworks/Python/robyn/requirements-const.txt index 0056c1d2876..fbb88344955 100644 --- a/frameworks/Python/robyn/requirements-const.txt +++ b/frameworks/Python/robyn/requirements-const.txt @@ -1,2 +1,2 @@ uvloop==0.19.0 -robyn==0.45.0 +robyn==0.60.2 diff --git a/frameworks/Python/robyn/requirements.txt b/frameworks/Python/robyn/requirements.txt index 0056c1d2876..fbb88344955 100644 --- a/frameworks/Python/robyn/requirements.txt +++ b/frameworks/Python/robyn/requirements.txt @@ -1,2 +1,2 @@ uvloop==0.19.0 -robyn==0.45.0 +robyn==0.60.2 diff --git a/frameworks/Python/robyn/robyn-const.dockerfile b/frameworks/Python/robyn/robyn-const.dockerfile index a12c64e248f..90b201eccff 100644 --- a/frameworks/Python/robyn/robyn-const.dockerfile +++ b/frameworks/Python/robyn/robyn-const.dockerfile @@ -8,4 +8,4 @@ RUN pip3 install -r /robyn/requirements-const.txt EXPOSE 8080 -CMD ["python", "app-const.py", "--log-level", "warn"]] +CMD ["robyn", "app-const.py", "--fast"] diff --git a/frameworks/Python/robyn/robyn.dockerfile b/frameworks/Python/robyn/robyn.dockerfile index bc42b5be462..8de6fea2c19 100644 --- a/frameworks/Python/robyn/robyn.dockerfile +++ b/frameworks/Python/robyn/robyn.dockerfile @@ -8,4 +8,4 @@ RUN pip3 install -r /robyn/requirements.txt EXPOSE 8080 -CMD ["python", "app.py", "--log-level", "warn"] +CMD ["robyn", "app.py", "--fast"] From 3db2b8d977018b4af298255739b12ca20311513a Mon Sep 17 00:00:00 2001 From: itrofimow Date: Mon, 26 Aug 2024 20:28:36 +0400 Subject: [PATCH 0770/1766] [C++] [userver] bump userver commit, improve application scalability (#9219) * bump userver commit * improve scalability * fix the configs --- frameworks/C++/userver/userver-bare.dockerfile | 2 +- frameworks/C++/userver/userver.dockerfile | 2 +- frameworks/C++/userver/userver_configs/static_config.yaml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/C++/userver/userver-bare.dockerfile b/frameworks/C++/userver/userver-bare.dockerfile index a318a9601b7..92f8cdaa080 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 ec1a3b07793f8d4cd0968cd61d8e6079d667a1e7 + cd userver && git checkout bdd5e1e03921ff378b062f86a189c3cfa3d66332 COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ diff --git a/frameworks/C++/userver/userver.dockerfile b/frameworks/C++/userver/userver.dockerfile index 9b45edd2418..5f4755e3714 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 ec1a3b07793f8d4cd0968cd61d8e6079d667a1e7 + cd userver && git checkout bdd5e1e03921ff378b062f86a189c3cfa3d66332 COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ diff --git a/frameworks/C++/userver/userver_configs/static_config.yaml b/frameworks/C++/userver/userver_configs/static_config.yaml index 2bdcf1fbce5..4d7a7878912 100644 --- a/frameworks/C++/userver/userver_configs/static_config.yaml +++ b/frameworks/C++/userver/userver_configs/static_config.yaml @@ -1,8 +1,7 @@ # yaml components_manager: event_thread_pool: - threads: 9 - dedicated_timer_threads: 1 + threads: 8 coro_pool: initial_size: 10000 # Preallocate 10000 coroutines at startup. max_size: 300000 # Do not keep more than 300000 preallocated coroutines. @@ -12,8 +11,9 @@ components_manager: main-task-processor: # Make a task processor for CPU-bound couroutine tasks. thread_name: main-worker # OS will show the threads of this task processor with 'main-worker' prefix. - worker_threads: 46 + worker_threads: 48 guess-cpu-limit: true + task-processor-queue: work-stealing-task-queue fs-task-processor: # Make a separate task processor for filesystem bound tasks. thread_name: fs-worker From 9e58d22fdf5d4a3a77c6df727d4c02d670274e19 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Mon, 26 Aug 2024 21:28:57 +0500 Subject: [PATCH 0771/1766] [ntex] replace async-std with compio runtime (#9222) * ntex: replace async-std with compio * wip * wip --- frameworks/Rust/ntex/Cargo.toml | 21 ++++++++++++------- frameworks/Rust/ntex/benchmark_config.json | 12 +++++------ frameworks/Rust/ntex/config.toml | 6 +++--- ...astd.dockerfile => ntex-compio.dockerfile} | 4 ++-- ...d.dockerfile => ntex-db-compio.dockerfile} | 4 ++-- ....dockerfile => ntex-plt-compio.dockerfile} | 4 ++-- frameworks/Rust/ntex/src/main.rs | 1 - frameworks/Rust/ntex/src/main_plt.rs | 2 +- 8 files changed, 30 insertions(+), 24 deletions(-) rename frameworks/Rust/ntex/{ntex-astd.dockerfile => ntex-compio.dockerfile} (84%) rename frameworks/Rust/ntex/{ntex-db-astd.dockerfile => ntex-db-compio.dockerfile} (84%) rename frameworks/Rust/ntex/{ntex-plt-astd.dockerfile => ntex-plt-compio.dockerfile} (83%) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index 92c0da890ac..850e640f2ad 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ntex" +name = "ntex-bench" version = "2.0.0" edition = "2018" @@ -8,7 +8,7 @@ name = "ntex" path = "src/main.rs" [[bin]] -name = "ntex-astd" +name = "ntex-compio" path = "src/main.rs" [[bin]] @@ -16,7 +16,7 @@ name = "ntex-db" path = "src/main_db.rs" [[bin]] -name = "ntex-db-astd" +name = "ntex-db-compio" path = "src/main_db.rs" [[bin]] @@ -24,7 +24,7 @@ name = "ntex-plt" path = "src/main_plt.rs" [[bin]] -name = "ntex-plt-astd" +name = "ntex-plt-compio" path = "src/main_plt.rs" [features] @@ -33,11 +33,11 @@ default = [] # tokio runtime tokio = ["ntex/tokio"] -# async-std runtime -async-std = ["ntex/async-std"] +# compio runtime +compio = ["ntex/compio"] [dependencies] -ntex = "=2.1.0" +ntex = "2.4" 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"] } @@ -63,3 +63,10 @@ lto = "thin" debug = false incremental = false overflow-checks = false + +[patch.crates-io] +ntex = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } +ntex-io = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } +ntex-rt = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } +ntex-net = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } +ntex-compio = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } diff --git a/frameworks/Rust/ntex/benchmark_config.json b/frameworks/Rust/ntex/benchmark_config.json index ab6fc091970..9ed29c64b97 100755 --- a/frameworks/Rust/ntex/benchmark_config.json +++ b/frameworks/Rust/ntex/benchmark_config.json @@ -19,7 +19,7 @@ "notes": "", "versus": "" }, - "astd": { + "compio": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -33,7 +33,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [async-std]", + "display_name": "ntex [compio]", "notes": "", "versus": "" }, @@ -57,7 +57,7 @@ "notes": "", "versus": "" }, - "db-astd": { + "db-compio": { "fortune_url": "/fortunes", "db_url": "/db", "query_url": "/query?q=", @@ -73,7 +73,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [async-std,db]", + "display_name": "ntex [compio,db]", "notes": "", "versus": "" }, @@ -95,7 +95,7 @@ "notes": "", "versus": "" }, - "plt-astd": { + "plt-compio": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -109,7 +109,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [async-std,platform]", + "display_name": "ntex [compio,platform]", "notes": "", "versus": "" } diff --git a/frameworks/Rust/ntex/config.toml b/frameworks/Rust/ntex/config.toml index 84527c12626..759dca26c70 100644 --- a/frameworks/Rust/ntex/config.toml +++ b/frameworks/Rust/ntex/config.toml @@ -14,7 +14,7 @@ platform = "None" webserver = "ntex" versus = "" -[astd] +[compio] urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" @@ -42,7 +42,7 @@ platform = "None" webserver = "ntex" versus = "" -[db-astd] +[db-compio] urls.db = "/db" urls.query = "/query?q=" urls.update = "/update?q=" @@ -70,7 +70,7 @@ platform = "None" webserver = "ntex" versus = "" -[plt-astd] +[plt-compio] urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" diff --git a/frameworks/Rust/ntex/ntex-astd.dockerfile b/frameworks/Rust/ntex/ntex-compio.dockerfile similarity index 84% rename from frameworks/Rust/ntex/ntex-astd.dockerfile rename to frameworks/Rust/ntex/ntex-compio.dockerfile index be97758bbeb..c825e18078e 100644 --- a/frameworks/Rust/ntex/ntex-astd.dockerfile +++ b/frameworks/Rust/ntex/ntex-compio.dockerfile @@ -9,8 +9,8 @@ ADD ./ /ntex WORKDIR /ntex RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="async-std" +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="compio" EXPOSE 8080 -CMD ./target/release/ntex-astd +CMD ./target/release/ntex-compio diff --git a/frameworks/Rust/ntex/ntex-db-astd.dockerfile b/frameworks/Rust/ntex/ntex-db-compio.dockerfile similarity index 84% rename from frameworks/Rust/ntex/ntex-db-astd.dockerfile rename to frameworks/Rust/ntex/ntex-db-compio.dockerfile index e8717d37a50..c892bcdc9fc 100644 --- a/frameworks/Rust/ntex/ntex-db-astd.dockerfile +++ b/frameworks/Rust/ntex/ntex-db-compio.dockerfile @@ -9,8 +9,8 @@ ADD ./ /ntex WORKDIR /ntex RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="async-std" +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="compio" EXPOSE 8080 -CMD ./target/release/ntex-db-astd +CMD ./target/release/ntex-db-compio diff --git a/frameworks/Rust/ntex/ntex-plt-astd.dockerfile b/frameworks/Rust/ntex/ntex-plt-compio.dockerfile similarity index 83% rename from frameworks/Rust/ntex/ntex-plt-astd.dockerfile rename to frameworks/Rust/ntex/ntex-plt-compio.dockerfile index 8ec6c7fe636..849e224994b 100644 --- a/frameworks/Rust/ntex/ntex-plt-astd.dockerfile +++ b/frameworks/Rust/ntex/ntex-plt-compio.dockerfile @@ -9,8 +9,8 @@ ADD ./ /ntex WORKDIR /ntex RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="async-std" +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="compio" EXPOSE 8080 -CMD ./target/release/ntex-plt-astd +CMD ./target/release/ntex-plt-compio diff --git a/frameworks/Rust/ntex/src/main.rs b/frameworks/Rust/ntex/src/main.rs index c456fac47e4..218ed03c727 100644 --- a/frameworks/Rust/ntex/src/main.rs +++ b/frameworks/Rust/ntex/src/main.rs @@ -1,6 +1,5 @@ #[global_allocator] static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; -// static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; use ntex::http::header::{CONTENT_TYPE, SERVER}; use ntex::{http, time::Seconds, util::BytesMut, util::PoolId, web}; diff --git a/frameworks/Rust/ntex/src/main_plt.rs b/frameworks/Rust/ntex/src/main_plt.rs index 2f46ce448e1..b6c435f6773 100644 --- a/frameworks/Rust/ntex/src/main_plt.rs +++ b/frameworks/Rust/ntex/src/main_plt.rs @@ -1,5 +1,5 @@ #[global_allocator] -static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; use std::{future::Future, io, pin::Pin, task::Context, task::Poll}; From 98fb99ac99759e4d8deddf6f212bb7743019b1e6 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Mon, 26 Aug 2024 17:29:50 +0100 Subject: [PATCH 0772/1766] Revert "H2O: Use 2 database connections per thread again (#9176)" (#9223) This reverts commit 57f2f117488029a625feea0605f7da76bfb2a0b9. --- frameworks/C/h2o/h2o.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 3b383b7f6df..976c938337a 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -109,4 +109,4 @@ CMD ["taskset", \ "dbname=hello_world host=tfb-database password=benchmarkdbpass sslmode=disable user=benchmarkdbuser", \ "-f", \ "/opt/h2o_app/share/h2o_app/template", \ - "-m2"] + "-m1"] From 12ba6b9c5a8c54b6be540feead83dce7206d3def Mon Sep 17 00:00:00 2001 From: Yan Kun <1939810907@qq.com> Date: Tue, 27 Aug 2024 00:30:06 +0800 Subject: [PATCH 0773/1766] [Scala/otavia] upgrade otavia to 0.4.2 (#9224) * [Scala/otavia] upgrade otavia to 0.4.2 * [Scala/otavia] change randomnumber to randomNumber * [Scala/otavia] upgrade otavia to 0.4.3 --- .../Scala/otavia/{README.MD => README.md} | 0 .../src/app/controller/DBController.scala | 19 ++++---- .../app/controller/FortuneController.scala | 18 +++++-- .../benchmark/src/app/model/Fortune.scala | 4 +- .../benchmark/src/app/model/World.scala | 4 +- .../src/app/util/FortunesRender.scala | 6 +-- frameworks/Scala/otavia/benchmark_config.json | 48 ++++++++++++++++++- frameworks/Scala/otavia/build.sc | 2 +- frameworks/Scala/otavia/config.toml | 36 +++++++++++++- .../otavia-equalization-offgc.dockerfile | 16 +++++++ ...kerfile => otavia-equalization.dockerfile} | 4 +- .../Scala/otavia/otavia-offgc.dockerfile | 16 +++++++ frameworks/Scala/otavia/otavia.dockerfile | 4 +- 13 files changed, 148 insertions(+), 29 deletions(-) rename frameworks/Scala/otavia/{README.MD => README.md} (100%) create mode 100644 frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile rename frameworks/Scala/otavia/{otavia-reserve.dockerfile => otavia-equalization.dockerfile} (76%) create mode 100644 frameworks/Scala/otavia/otavia-offgc.dockerfile diff --git a/frameworks/Scala/otavia/README.MD b/frameworks/Scala/otavia/README.md similarity index 100% rename from frameworks/Scala/otavia/README.MD rename to frameworks/Scala/otavia/README.md diff --git a/frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala b/frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala index 6b54504aecc..2e9e32abbe7 100644 --- a/frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala +++ b/frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala @@ -9,7 +9,7 @@ import cc.otavia.core.stack.helper.{FutureState, FuturesState, StartState} import cc.otavia.core.stack.{AskStack, StackState, StackYield} import cc.otavia.http.server.{HttpRequest, HttpResponse} import cc.otavia.sql.Connection -import cc.otavia.sql.Statement.{ModifyRows, PrepareQuery} +import cc.otavia.sql.statement.{ModifyRows, PrepareQuery} import java.util.SplittableRandom @@ -22,20 +22,17 @@ class DBController extends StateActor[REQ] { override protected def afterMount(): Unit = connection = autowire[Connection]() override protected def resumeAsk(stack: AskStack[REQ & Ask[? <: Reply]]): StackYield = - stack match - case stack: AskStack[SingleQueryRequest] if stack.ask.isInstanceOf[SingleQueryRequest] => - handleSingleQuery(stack) - case stack: AskStack[MultipleQueryRequest] if stack.ask.isInstanceOf[MultipleQueryRequest] => - handleMultipleQuery(stack) - case stack: AskStack[UpdateRequest] if stack.ask.isInstanceOf[UpdateRequest] => - handleUpdateQuery(stack) + stack.ask match + case _: SingleQueryRequest => handleSingleQuery(stack.asInstanceOf[AskStack[SingleQueryRequest]]) + case _: MultipleQueryRequest => handleMultipleQuery(stack.asInstanceOf[AskStack[MultipleQueryRequest]]) + case _: UpdateRequest => handleUpdateQuery(stack.asInstanceOf[AskStack[UpdateRequest]]) // Test 2: Single database query private def handleSingleQuery(stack: AskStack[SingleQueryRequest]): StackYield = { stack.state match case _: StartState => val state = FutureState[World]() - connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, Tuple1(randomWorld())), state.future) + connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, randomWorld()), state.future) stack.suspend(state) case state: FutureState[World] => stack.`return`(state.future.getNow) @@ -61,7 +58,7 @@ class DBController extends StateActor[REQ] { stack.attach(worlds) val newState = FutureState[ModifyRows]() val newWorlds = worlds.sortBy(_.id).map(_.copy(randomNumber = randomWorld())) - connection.ask(PrepareQuery.update(UPDATE_WORLD, newWorlds), newState.future) + connection.ask(PrepareQuery.updateBatch(UPDATE_WORLD, newWorlds), newState.future) stack.suspend(newState) case state: FutureState[ModifyRows] => if (state.future.isFailed) state.future.causeUnsafe.printStackTrace() @@ -72,7 +69,7 @@ class DBController extends StateActor[REQ] { private def selectWorlds(queries: Int): StackState = { val state = FuturesState[World](queries) for (future <- state.futures) - connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, Tuple1(randomWorld())), future) + connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, randomWorld()), future) state } diff --git a/frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala b/frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala index 05ff8c468ba..4f7fe7bf800 100644 --- a/frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala +++ b/frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala @@ -7,12 +7,20 @@ import cc.otavia.core.address.Address import cc.otavia.core.stack.helper.{FutureState, StartState} import cc.otavia.core.stack.{AskStack, StackState, StackYield} import cc.otavia.http.server.{HttpRequest, HttpResponse} -import cc.otavia.sql.Statement.PrepareQuery +import cc.otavia.sql.statement.PrepareQuery import cc.otavia.sql.{Connection, RowSet} +import java.util +import java.util.Comparator + class FortuneController extends StateActor[FortuneRequest] { private var connection: Address[MessageOf[Connection]] = _ + private val tmpArray: Array[Fortune] = new Array[Fortune](13) + + private val comparator = new Comparator[Fortune] { + override def compare(o1: Fortune, o2: Fortune): Int = o1.message.compareTo(o2.message) + } override protected def afterMount(): Unit = connection = autowire[Connection]() @@ -24,8 +32,10 @@ class FortuneController extends StateActor[FortuneRequest] { connection.ask(PrepareQuery.fetchAll[Fortune](SELECT_FORTUNE), state.future) stack.suspend(state) case state: FutureState[RowSet[Fortune]] => - val fortunes = (state.future.getNow.rows :+ Fortune(0, "Additional fortune added at request time.")) - .sortBy(_.message) + System.arraycopy(state.future.getNow.rows, 0, tmpArray, 0, 12) + tmpArray(12) = Fortune(0, "Additional fortune added at request time.") + util.Arrays.sort(tmpArray, comparator) + val fortunes = tmpArray.clone() val response = HttpResponse.builder.setContent(fortunes).build() stack.`return`(response) } @@ -34,7 +44,7 @@ class FortuneController extends StateActor[FortuneRequest] { object FortuneController { - class FortuneRequest extends HttpRequest[Nothing, HttpResponse[Seq[Fortune]]] + class FortuneRequest extends HttpRequest[Nothing, HttpResponse[Array[Fortune]]] private val SELECT_FORTUNE = "SELECT id, message from FORTUNE" diff --git a/frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala b/frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala index edb58d3cdc9..1df592954a4 100644 --- a/frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala +++ b/frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala @@ -1,7 +1,7 @@ package app.model import cc.otavia.json.JsonSerde -import cc.otavia.sql.{Row, RowDecoder} +import cc.otavia.sql.{Row, RowCodec} /** The model for the "fortune" database table. */ -case class Fortune(id: Int, message: String) extends Row derives RowDecoder, JsonSerde +case class Fortune(id: Int, message: String) extends Row derives RowCodec, JsonSerde diff --git a/frameworks/Scala/otavia/benchmark/src/app/model/World.scala b/frameworks/Scala/otavia/benchmark/src/app/model/World.scala index a0e6f6056f8..af6f8539d74 100644 --- a/frameworks/Scala/otavia/benchmark/src/app/model/World.scala +++ b/frameworks/Scala/otavia/benchmark/src/app/model/World.scala @@ -2,7 +2,7 @@ package app.model import cc.otavia.json.JsonSerde import cc.otavia.serde.annotation.rename -import cc.otavia.sql.{Row, RowDecoder} +import cc.otavia.sql.{Row, RowCodec} /** The model for the "world" database table. */ -case class World(id: Int, @rename("randomnumber") randomNumber: Int) extends Row derives RowDecoder, JsonSerde +case class World(id: Int, randomNumber: Int) extends Row derives RowCodec, JsonSerde diff --git a/frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala b/frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala index 0c0694ee836..69401305550 100644 --- a/frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala +++ b/frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala @@ -7,7 +7,7 @@ import cc.otavia.serde.Serde import java.nio.charset.StandardCharsets import scala.annotation.switch -class FortunesRender extends Serde[Seq[Fortune]] { +class FortunesRender extends Serde[Array[Fortune]] { private val text1 = "Fortunes" @@ -27,7 +27,7 @@ class FortunesRender extends Serde[Seq[Fortune]] { private val squot = "'".getBytes() private val amp = "&".getBytes() - override def serialize(fortunes: Seq[Fortune], out: Buffer): Unit = { + override def serialize(fortunes: Array[Fortune], out: Buffer): Unit = { out.writeBytes(text1) for (fortune <- fortunes) { out.writeBytes(text2) @@ -39,7 +39,7 @@ class FortunesRender extends Serde[Seq[Fortune]] { out.writeBytes(text5) } - override def deserialize(in: Buffer): Seq[Fortune] = throw new UnsupportedOperationException() + override def deserialize(in: Buffer): Array[Fortune] = throw new UnsupportedOperationException() private def writeEscapeMessage(buffer: Buffer, message: String): Unit = { var i = 0 diff --git a/frameworks/Scala/otavia/benchmark_config.json b/frameworks/Scala/otavia/benchmark_config.json index ae712574778..a93a000f3b4 100644 --- a/frameworks/Scala/otavia/benchmark_config.json +++ b/frameworks/Scala/otavia/benchmark_config.json @@ -25,7 +25,53 @@ "notes": "", "versus": "Otavia" }, - "reserve": { + "equalization": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "otavia", + "language": "Scala", + "flavor": "None", + "orm": "Micro", + "platform": "Otavia", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "otavia", + "notes": "", + "versus": "Otavia" + }, + "equalization-offgc": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "otavia", + "language": "Scala", + "flavor": "None", + "orm": "Micro", + "platform": "Otavia", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "otavia", + "notes": "", + "versus": "Otavia" + }, + "offgc": { "json_url": "/json", "plaintext_url": "/plaintext", "db_url": "/db", diff --git a/frameworks/Scala/otavia/build.sc b/frameworks/Scala/otavia/build.sc index 2b7877b7891..7f872fdf851 100644 --- a/frameworks/Scala/otavia/build.sc +++ b/frameworks/Scala/otavia/build.sc @@ -1,7 +1,7 @@ import mill._ import mill.scalalib._ -def otaviaVersion = "0.4.0" +def otaviaVersion = "0.4.3" object benchmark extends ScalaModule { diff --git a/frameworks/Scala/otavia/config.toml b/frameworks/Scala/otavia/config.toml index 96613dfd2fd..9443c4d261b 100644 --- a/frameworks/Scala/otavia/config.toml +++ b/frameworks/Scala/otavia/config.toml @@ -18,7 +18,7 @@ platform = "Otavia" webserver = "None" versus = "Otavia" -[reserve] +[equalization] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -34,3 +34,37 @@ orm = "Micro" platform = "Otavia" webserver = "None" versus = "Otavia" + +[equalization-offgc] +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 = "Micro" +platform = "Otavia" +webserver = "None" +versus = "Otavia" + +[offgc] +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 = "Micro" +platform = "Otavia" +webserver = "None" +versus = "Otavia" \ No newline at end of file diff --git a/frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile b/frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile new file mode 100644 index 00000000000..23c9a90fd9e --- /dev/null +++ b/frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile @@ -0,0 +1,16 @@ +FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0 +WORKDIR /otavia +COPY benchmark benchmark +COPY build.sc build.sc +ENV COURSIER_REPOSITORIES=ivy2Local|central +RUN mill benchmark.assembly + +EXPOSE 8080 + +CMD java -server \ + -Dcc.otavia.actor.worker.size=56 -Dcc.otavia.nio.worker.size=56 \ + -Dcc.otavia.system.gc.aggressive=false \ + -jar \ + out/benchmark/assembly.dest/out.jar \ + jdbc:postgresql://tfb-database:5432/hello_world \ + benchmarkdbuser benchmarkdbpass 56 diff --git a/frameworks/Scala/otavia/otavia-reserve.dockerfile b/frameworks/Scala/otavia/otavia-equalization.dockerfile similarity index 76% rename from frameworks/Scala/otavia/otavia-reserve.dockerfile rename to frameworks/Scala/otavia/otavia-equalization.dockerfile index 5768000706e..780aeafe0b0 100644 --- a/frameworks/Scala/otavia/otavia-reserve.dockerfile +++ b/frameworks/Scala/otavia/otavia-equalization.dockerfile @@ -8,8 +8,8 @@ RUN mill benchmark.assembly EXPOSE 8080 CMD java -server \ - -Dcc.otavia.actor.worker.size=18 -Dcc.otavia.nio.worker.size=36 \ + -Dcc.otavia.actor.worker.size=56 -Dcc.otavia.nio.worker.size=56 \ -jar \ out/benchmark/assembly.dest/out.jar \ jdbc:postgresql://tfb-database:5432/hello_world \ - benchmarkdbuser benchmarkdbpass 54 + benchmarkdbuser benchmarkdbpass 56 diff --git a/frameworks/Scala/otavia/otavia-offgc.dockerfile b/frameworks/Scala/otavia/otavia-offgc.dockerfile new file mode 100644 index 00000000000..378a48dd2f9 --- /dev/null +++ b/frameworks/Scala/otavia/otavia-offgc.dockerfile @@ -0,0 +1,16 @@ +FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0 +WORKDIR /otavia +COPY benchmark benchmark +COPY build.sc build.sc +ENV COURSIER_REPOSITORIES=ivy2Local|central +RUN mill benchmark.assembly + +EXPOSE 8080 + +CMD java -server \ + -Dcc.otavia.actor.worker.size=28 -Dcc.otavia.nio.worker.size=56 \ + -Dcc.otavia.system.gc.aggressive=false \ + -jar \ + out/benchmark/assembly.dest/out.jar \ + jdbc:postgresql://tfb-database:5432/hello_world \ + benchmarkdbuser benchmarkdbpass 56 diff --git a/frameworks/Scala/otavia/otavia.dockerfile b/frameworks/Scala/otavia/otavia.dockerfile index c1c944d60aa..e407df7ad79 100644 --- a/frameworks/Scala/otavia/otavia.dockerfile +++ b/frameworks/Scala/otavia/otavia.dockerfile @@ -8,8 +8,8 @@ RUN mill benchmark.assembly EXPOSE 8080 CMD java -server \ - -Dcc.otavia.actor.worker.size=24 -Dcc.otavia.nio.worker.size=48 \ + -Dcc.otavia.actor.worker.size=28 -Dcc.otavia.nio.worker.size=56 \ -jar \ out/benchmark/assembly.dest/out.jar \ jdbc:postgresql://tfb-database:5432/hello_world \ - benchmarkdbuser benchmarkdbpass 72 + benchmarkdbuser benchmarkdbpass 56 From 8d455d57e1eb293f7959b93bead6102df9e19403 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Wed, 28 Aug 2024 01:58:12 +0800 Subject: [PATCH 0774/1766] [xitca-web] fix wasi build. (#9225) * [xitca-web] fix wasi build. * fix config json. --- frameworks/Rust/xitca-web/Cargo.lock | 60 +++++++------- frameworks/Rust/xitca-web/Cargo.toml | 3 +- .../Rust/xitca-web/benchmark_config.json | 3 +- frameworks/Rust/xitca-web/src/db.rs | 78 +++++++++++-------- frameworks/Rust/xitca-web/src/db_diesel.rs | 6 +- frameworks/Rust/xitca-web/src/main.rs | 2 +- frameworks/Rust/xitca-web/src/main_iou.rs | 3 +- frameworks/Rust/xitca-web/src/main_sync.rs | 7 +- .../Rust/xitca-web/xitca-web-wasm.dockerfile | 2 +- 9 files changed, 93 insertions(+), 71 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index e510a6c31dc..01bd80ec5e3 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -149,9 +149,12 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.1.8" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" +checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -161,9 +164,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] @@ -471,9 +474,9 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libmimalloc-sys" @@ -560,9 +563,8 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +version = "1.0.2" +source = "git+https://github.com/fakeshadow/mio?rev=9bae6012b7ecfc6083350785f71a5e8265358178#9bae6012b7ecfc6083350785f71a5e8265358178" dependencies = [ "hermit-abi", "libc", @@ -847,18 +849,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.205" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" +checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.205" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" +checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" dependencies = [ "proc-macro2", "quote", @@ -867,9 +869,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.122" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" +checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" dependencies = [ "itoa", "memchr", @@ -910,6 +912,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -979,9 +987,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.72" +version = "2.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" dependencies = [ "proc-macro2", "quote", @@ -1017,9 +1025,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.2" +version = "1.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" dependencies = [ "backtrace", "libc", @@ -1079,15 +1087,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -1138,9 +1146,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" [[package]] name = "vcpkg" @@ -1311,7 +1319,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=0cad5309beb278dc967378a35b733e26be0d4073#0cad5309beb278dc967378a35b733e26be0d4073" +source = "git+https://github.com/HFQR/xitca-web.git?rev=f4e7bed#f4e7bedfb441897d1f26a6e4d8cbfada23953269" dependencies = [ "fallible-iterator", "percent-encoding", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index d9606bf2a96..e4614eb0bab 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -95,4 +95,5 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "0cad5309beb278dc967378a35b733e26be0d4073" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "f4e7bed" } +mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } diff --git a/frameworks/Rust/xitca-web/benchmark_config.json b/frameworks/Rust/xitca-web/benchmark_config.json index 5371bcd2551..f4c152eb729 100755 --- a/frameworks/Rust/xitca-web/benchmark_config.json +++ b/frameworks/Rust/xitca-web/benchmark_config.json @@ -62,8 +62,7 @@ "database_os": "linux", "display_name": "xitca-web [wasm]", "notes": "", - "versus": "", - "tags": ["broken"] + "versus": "" }, "axum": { "json_url": "/json", diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index 755dfaacf70..aa783e29dce 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,9 +1,9 @@ -use std::{collections::HashMap, fmt::Write}; +use std::fmt::Write; +use xitca_io::bytes::BytesMut; use xitca_postgres::{ pipeline::Pipeline, statement::Statement, AsyncLendingIterator, SharedClient, }; -use xitca_unsafe_collection::no_hash::NoHashBuilder; use super::{ ser::{Fortune, Fortunes, World}, @@ -13,14 +13,16 @@ use super::{ pub struct Client { client: SharedClient, #[cfg(not(feature = "pg-sync"))] - rng: std::cell::RefCell, + shared: std::cell::RefCell, #[cfg(feature = "pg-sync")] - rng: std::sync::Mutex, + shared: std::sync::Mutex, fortune: Statement, world: Statement, - updates: HashMap, + updates: Box<[Statement]>, } +type Shared = (Rand, BytesMut); + pub async fn create() -> HandleResult { let mut client = SharedClient::new(DB_URL.to_string()).await?; @@ -30,7 +32,11 @@ pub async fn create() -> HandleResult { .prepare_cached("SELECT * FROM world WHERE id=$1", &[]) .await?; - let mut updates = HashMap::default(); + let mut updates = Vec::new(); + + // a dummy statement as placeholder of 0 index. + // avoid off by one calculation when using non zero u16 as slicing index. + updates.push(Statement::default()); for num in 1..=500u16 { let mut pl = 1; @@ -49,34 +55,36 @@ pub async fn create() -> HandleResult { q.push(')'); let st = client.prepare_cached(&q, &[]).await?; - updates.insert(num, st); + updates.push(st); } + let shared = (Rand::default(), BytesMut::new()); + Ok(Client { client, #[cfg(not(feature = "pg-sync"))] - rng: std::cell::RefCell::new(Rand::default()), + shared: std::cell::RefCell::new(shared), #[cfg(feature = "pg-sync")] - rng: std::sync::Mutex::new(Rand::default()), + shared: std::sync::Mutex::new(shared), fortune, world, - updates, + updates: updates.into_boxed_slice(), }) } impl Client { #[cfg(not(feature = "pg-sync"))] - fn borrow_rng_mut(&self) -> std::cell::RefMut<'_, Rand> { - self.rng.borrow_mut() + fn shared(&self) -> std::cell::RefMut<'_, Shared> { + self.shared.borrow_mut() } #[cfg(feature = "pg-sync")] - fn borrow_rng_mut(&self) -> std::sync::MutexGuard<'_, Rand> { - self.rng.lock().unwrap() + fn shared(&self) -> std::sync::MutexGuard<'_, Shared> { + self.shared.lock().unwrap() } pub async fn get_world(&self) -> HandleResult { - let id = self.borrow_rng_mut().gen_id(); + let id = self.shared().0.gen_id(); self.client .query_raw(&self.world, [id]) .await? @@ -87,17 +95,21 @@ impl Client { } pub async fn get_worlds(&self, num: u16) -> HandleResult> { - let mut pipe = Pipeline::new(); + let len = num as usize; + + let mut res = { + let (ref mut rng, ref mut buf) = *self.shared(); + + let mut pipe = Pipeline::<_, false>::with_capacity_from_buf(len, buf); - { - let mut rng = self.borrow_rng_mut(); (0..num).try_for_each(|_| pipe.query_raw(&self.world, [rng.gen_id()]))?; + + self.client.pipeline(pipe) } + .await?; - let mut worlds = Vec::new(); - worlds.reserve(num as usize); + let mut worlds = Vec::with_capacity(len); - 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))) @@ -113,27 +125,31 @@ impl Client { let mut params = Vec::new(); params.reserve(len * 3); - let mut pipe = Pipeline::new(); + let mut res = { + let (ref mut rng, ref mut buf) = *self.shared(); + + let mut pipe = Pipeline::<_, false>::with_capacity_from_buf(len + 1, buf); - { - let mut rng = self.borrow_rng_mut(); (0..num).try_for_each(|_| { let w_id = rng.gen_id(); let r_id = rng.gen_id(); params.extend([w_id, r_id]); pipe.query_raw(&self.world, [w_id]) })?; - } - params.extend_from_within(..len); - let st = self.updates.get(&num).unwrap(); - pipe.query_raw(st, ¶ms)?; + params.extend_from_within(..len); + + let st = self.updates.get(len).unwrap(); + pipe.query_raw(st, ¶ms)?; + + self.client.pipeline(pipe) + } + .await?; let mut worlds = Vec::new(); worlds.reserve(len); let mut r_ids = params.into_iter().skip(1).step_by(2); - 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(); @@ -148,8 +164,8 @@ impl Client { let mut items = Vec::with_capacity(32); 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.try_next().await? { + let mut res = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?; + while let Some(row) = res.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 index 49a3e158e18..79ba4c9a69a 100644 --- a/frameworks/Rust/xitca-web/src/db_diesel.rs +++ b/frameworks/Rust/xitca-web/src/db_diesel.rs @@ -16,8 +16,8 @@ pub struct _Pool { pub fn create() -> std::io::Result> { r2d2::Builder::new() - .max_size(256) - .min_idle(Some(256)) + .max_size(100) + .min_idle(Some(100)) .test_on_check_out(false) .idle_timeout(None) .max_lifetime(None) @@ -34,7 +34,7 @@ pub fn create() -> std::io::Result> { #[cold] #[inline(never)] fn not_found() -> Error { - format!("world not found").into() + "world not found".into() } impl _Pool { diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index 632504dac5e..8405c986717 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -53,7 +53,7 @@ where async fn plain_text(ctx: Ctx<'_>) -> HandleResult { let (req, _) = ctx.into_parts(); - let mut res = req.into_response(Bytes::from_static(b"Hello, World!")); + let mut res = req.into_response(const { Bytes::from_static(b"Hello, World!") }); res.headers_mut().insert(CONTENT_TYPE, TEXT); Ok(res) } diff --git a/frameworks/Rust/xitca-web/src/main_iou.rs b/frameworks/Rust/xitca-web/src/main_iou.rs index 67ae6dad4d3..8ca722f1fbe 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_iou.rs @@ -57,8 +57,7 @@ async fn handler(ctx: Ctx<'_, Request>) -> Result { let (req, state) = ctx.into_parts(); let mut res = match req.uri().path() { "/plaintext" => { - const HELLO: Bytes = Bytes::from_static(b"Hello, World!"); - let mut res = req.into_response(HELLO); + let mut res = req.into_response(const { Bytes::from_static(b"Hello, World!") }); res.headers_mut().insert(CONTENT_TYPE, TEXT); res } diff --git a/frameworks/Rust/xitca-web/src/main_sync.rs b/frameworks/Rust/xitca-web/src/main_sync.rs index 03f6c9ea3a3..cf36166ac70 100644 --- a/frameworks/Rust/xitca-web/src/main_sync.rs +++ b/frameworks/Rust/xitca-web/src/main_sync.rs @@ -27,6 +27,7 @@ fn main() -> std::io::Result<()> { .at_typed(updates) .map(header) .serve() + .disable_vectored_write() .bind("0.0.0.0:8080")? .run() .wait() @@ -45,10 +46,8 @@ fn db(StateOwn(pool): StateOwn) -> HandleResult> { #[route("/fortunes", method = get)] fn fortunes(StateOwn(pool): StateOwn) -> HandleResult> { use sailfish::TemplateOnce; - pool.tell_fortune()? - .render_once() - .map(Html) - .map_err(Into::into) + let html = pool.tell_fortune()?.render_once()?; + Ok(Html(html)) } #[route("/queries", method = get)] diff --git a/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile b/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile index 51aa96fd4eb..02634638c16 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-wasip1-threads -FROM rust:1.77 AS compile +FROM rust:1.79 AS compile ARG WASMTIME_VERSION ARG WASM_TARGET From 33044001ca026e7fb2652d5deb2cbda4d19a0358 Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Wed, 28 Aug 2024 01:58:27 +0800 Subject: [PATCH 0775/1766] [PHP]update swoole version to 5.1.4 (#9229) * update swoole version to 5.1.4 * update container to 24.04 * cache statement for coroutine type --- frameworks/PHP/swoole/database.php | 112 ++++++++++++------ frameworks/PHP/swoole/php.ini | 2 +- .../PHP/swoole/swoole-async-mysql.dockerfile | 6 +- .../swoole/swoole-async-postgres.dockerfile | 6 +- frameworks/PHP/swoole/swoole-server.php | 14 ++- .../PHP/swoole/swoole-sync-mysql.dockerfile | 6 +- .../swoole/swoole-sync-postgres.dockerfile | 6 +- 7 files changed, 96 insertions(+), 56 deletions(-) diff --git a/frameworks/PHP/swoole/database.php b/frameworks/PHP/swoole/database.php index 6a7cdb3c1ea..19aac390968 100644 --- a/frameworks/PHP/swoole/database.php +++ b/frameworks/PHP/swoole/database.php @@ -21,14 +21,14 @@ public static function db(PDOStatement|PDOStatementProxy $db): string public static function fortunes(PDOStatement|PDOStatementProxy $fortune): string { $fortune->execute(); - $results = $fortune->fetchAll(PDO::FETCH_KEY_PAIR); + $results = $fortune->fetchAll(PDO::FETCH_KEY_PAIR); $results[0] = 'Additional fortune added at request time.'; asort($results); $html = ''; foreach ($results as $id => $message) { $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); - $html .= ""; + $html .= ""; } return "Fortunes
    idmessage
    $id$message
    $id$message
    $html
    idmessage
    "; @@ -36,13 +36,8 @@ public static function fortunes(PDOStatement|PDOStatementProxy $fortune): string public static function query(PDOStatement|PDOStatementProxy $query, int $queries): string { - $query_count = 1; - if ($queries > 1) { - $query_count = min($queries, 500); - } - $results = []; - while ($query_count--) { + while ($queries--) { $query->execute([mt_rand(1, 10000)]); $results[] = $query->fetch(PDO::FETCH_ASSOC); } @@ -50,33 +45,38 @@ public static function query(PDOStatement|PDOStatementProxy $query, int $queries return json_encode($results, JSON_NUMERIC_CHECK); } - public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries): string + public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries, string $driver): string { - $query_count = 1; - if ($queries > 1) { - $query_count = min($queries, 500); - } - - $results = []; - while ($query_count--) { - $id = mt_rand(1, 10000); - $random->execute([$id]); - $item = $random->fetch(PDO::FETCH_ASSOC); - $update->execute([$item['randomNumber'] = mt_rand(1, 10000), $id]); + $results = $keys = $values = []; + while ($queries--) { + $random->execute([mt_rand(1, 10000)]); + $item = $random->fetch(PDO::FETCH_ASSOC); + $item['randomNumber'] = mt_rand(1, 10000); + $results[] = $item; - $results[] = $item; + if ($driver == 'pgsql') { + $values[] = $keys[] = $item['id']; + $values[] = $item['randomNumber']; + } else { + $update->execute([$item['randomNumber'], $item['id']]); + } } + if ($driver == 'pgsql') { + $update->execute([...$values, ...$keys]); + } return json_encode($results, JSON_NUMERIC_CHECK); } } class Connection { + private static PDO $pdo; + private static string $driver; + private static array $updates = []; private static PDOStatement $db; private static PDOStatement $fortune; private static PDOStatement $random; - private static PDOStatement $update; private static PDOStatement $query; public static function init(string $driver): void @@ -87,15 +87,16 @@ public static function init(string $driver): void "benchmarkdbpass", [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_EMULATE_PREPARES => false + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_EMULATE_PREPARES => false ] ); - self::$db = self::$random = self::$query = $pdo->prepare(Operation::WORLD_SELECT_SQL); + self::$db = self::$random = self::$query = $pdo->prepare(Operation::WORLD_SELECT_SQL); self::$fortune = $pdo->prepare(Operation::FORTUNE_SQL); - self::$update = $pdo->prepare(Operation::WORLD_UPDATE_SQL); + self::$pdo = $pdo; + self::$driver = $driver; } public static function db(): string @@ -115,13 +116,23 @@ public static function query(int $queries): string public static function updates(int $queries): string { - return Operation::updates(self::$random, self::$update, $queries); + if (!isset(self::$updates[$queries])) { + self::$updates[$queries] = self::$driver == 'pgsql' + ? self::$pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)') + : self::$pdo->prepare(Operation::WORLD_UPDATE_SQL); + } + + return Operation::updates(self::$random, self::$updates[$queries], $queries, self::$driver); } } class Connections { private static PDOPool $pool; + private static string $driver; + private static array $dbs = []; + private static array $fortunes = []; + private static array $updates = []; public static function init(string $driver): void { @@ -133,22 +144,22 @@ public static function init(string $driver): void ->withUsername('benchmarkdbuser') ->withPassword('benchmarkdbpass'); - self::$pool = new PDOPool($config, intval(1024 / swoole_cpu_num())); + self::$pool = new PDOPool($config, 128); + self::$driver = $driver; } public static function db(): string { - $pdo = self::get(); - $result = Operation::db($pdo->prepare(Operation::WORLD_SELECT_SQL)); + $pdo = self::get(); + $result = Operation::db(self::getStatement($pdo, 'select')); self::put($pdo); - return $result; } public static function fortunes(): string { - $pdo = self::get(); - $result = Operation::fortunes($pdo->prepare(Operation::FORTUNE_SQL)); + $pdo = self::get(); + $result = Operation::fortunes(self::getStatement($pdo, 'fortunes')); self::put($pdo); return $result; @@ -156,8 +167,8 @@ public static function fortunes(): string public static function query(int $queries): string { - $pdo = self::get(); - $result = Operation::query($pdo->prepare(Operation::WORLD_SELECT_SQL), $queries); + $pdo = self::get(); + $result = Operation::query(self::getStatement($pdo, 'select'), $queries); self::put($pdo); return $result; @@ -165,8 +176,8 @@ public static function query(int $queries): string public static function updates(int $queries): string { - $pdo = self::get(); - $result = Operation::updates($pdo->prepare(Operation::WORLD_SELECT_SQL), $pdo->prepare(Operation::WORLD_UPDATE_SQL), $queries); + $pdo = self::get(); + $result = Operation::updates(self::getStatement($pdo, 'select'), self::getStatement($pdo, 'update', $queries), $queries, self::$driver); self::put($pdo); return $result; @@ -181,4 +192,31 @@ private static function put(PDO|PDOProxy $db): void { self::$pool->put($db); } + + private static function getStatement(PDO|PDOProxy $pdo, string $type, int $queries = 0): PDOStatement|PDOStatementProxy + { + $hash = spl_object_id($pdo); + + if ('select' == $type) { + if (!isset(self::$dbs[$hash])) { + self::$dbs[$hash] = $pdo->prepare(Operation::WORLD_SELECT_SQL); + } + + return self::$dbs[$hash]; + } elseif ('fortunes' == $type) { + if (!isset(self::$fortunes[$hash])) { + self::$fortunes[$hash] = $pdo->prepare(Operation::FORTUNE_SQL); + } + + return self::$fortunes[$hash]; + } else { + if (!isset(self::$updates[$hash][$queries])) { + self::$updates[$hash][$queries] = self::$driver == 'pgsql' + ? $pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)') + : $pdo->prepare(Operation::WORLD_UPDATE_SQL); + } + + return self::$updates[$hash][$queries]; + } + } } diff --git a/frameworks/PHP/swoole/php.ini b/frameworks/PHP/swoole/php.ini index 99a548fe57e..082e86dedbc 100644 --- a/frameworks/PHP/swoole/php.ini +++ b/frameworks/PHP/swoole/php.ini @@ -6,4 +6,4 @@ opcache.huge_code_pages=1 memory_limit=1024M opcache.jit_buffer_size=128M -opcache.jit=tracing +opcache.jit=1225 diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index 9b9daf07c43..82dbe32833f 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 +FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.1 +ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 1 ENV DATABASE_DRIVER mysql @@ -10,7 +10,7 @@ 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.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \ + && apt install libbrotli-dev 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 \ diff --git a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile index d75390c922e..4a6b27b2bb0 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 +FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.1 +ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 1 ENV DATABASE_DRIVER pgsql @@ -10,7 +10,7 @@ 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.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \ + && apt install libbrotli-dev 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 \ diff --git a/frameworks/PHP/swoole/swoole-server.php b/frameworks/PHP/swoole/swoole-server.php index 8de85f5c0a1..3794c364cb7 100644 --- a/frameworks/PHP/swoole/swoole-server.php +++ b/frameworks/PHP/swoole/swoole-server.php @@ -48,16 +48,18 @@ $res->end($connection::fortunes()); break; case '/query': + $queries = isset($req->get['queries']) ? (int) $req->get['queries'] : -1; + $query_count = $queries > 1 ? min($queries, 500) : 1; + $res->header['Content-Type'] = 'application/json'; - $res->end($connection::query( - isset($req->get['queries']) ? (int) $req->get['queries'] : -1 - )); + $res->end($connection::query($query_count)); break; case '/updates': + $queries = isset($req->get['queries']) ? (int) $req->get['queries'] : -1; + $query_count = $queries > 1 ? min($queries, 500) : 1; + $res->header['Content-Type'] = 'application/json'; - $res->end($connection::updates( - isset($req->get['queries']) ? (int) $req->get['queries'] : -1 - )); + $res->end($connection::updates($query_count)); break; default: diff --git a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile index 4893a1aad1a..97a0e11d111 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 +FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.1 +ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 0 ENV DATABASE_DRIVER mysql @@ -10,7 +10,7 @@ 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.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \ + && apt install libbrotli-dev 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 \ diff --git a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile index 9559267ce6c..1b5a68b6169 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 +FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.1 +ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 0 ENV DATABASE_DRIVER pgsql @@ -10,7 +10,7 @@ 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.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \ + && apt install libbrotli-dev 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 \ From b356e76c8f0c3198c6111800cca88e7831e5437e Mon Sep 17 00:00:00 2001 From: Ali RajabNezhad Date: Tue, 27 Aug 2024 21:45:53 +0330 Subject: [PATCH 0776/1766] Update Panther Version To 4.3.1 (#9228) --- frameworks/Python/panther/README.md | 6 ++--- frameworks/Python/panther/app.py | 30 ++++++++++------------ frameworks/Python/panther/requirements.txt | 14 +++------- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/frameworks/Python/panther/README.md b/frameworks/Python/panther/README.md index c1edfd4f5b7..f57bc888b7e 100644 --- a/frameworks/Python/panther/README.md +++ b/frameworks/Python/panther/README.md @@ -31,6 +31,6 @@ All tests are implemented in a single file ([app.py](app.py)). ## Resources -* [GitHub](https://github.com/AliRn76/Panther) -* [Documentation](https://pantherpy.github.io) -* [PyPI](https://pypi.org/project/panther) +* GitHub -> [GitHub.com/AliRn76/Panther](https://github.com/AliRn76/Panther) +* Documentation -> [PantherPy.GitHub.io](https://pantherpy.github.io) +* PyPI -> [PyPI.org/project/Panther](https://pypi.org/project/panther) diff --git a/frameworks/Python/panther/app.py b/frameworks/Python/panther/app.py index b3f712cd979..0b20d44413c 100644 --- a/frameworks/Python/panther/app.py +++ b/frameworks/Python/panther/app.py @@ -1,11 +1,12 @@ import multiprocessing -import os +from pathlib import Path from random import randint, sample import asyncpg import jinja2 from panther import Panther from panther.app import API +from panther.events import Event from panther.request import Request from panther.response import Response, PlainTextResponse, HTMLResponse @@ -18,6 +19,7 @@ pool = None +@Event.startup async def create_db_pool(): global pool pool = await asyncpg.create_pool( @@ -31,18 +33,13 @@ async def create_db_pool(): ) +@Event.shutdown 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() +with Path('templates/fortune.html').open() as f: + fortune_template = jinja2.Template(f.read()) def get_num_queries(request): @@ -99,17 +96,16 @@ async def fortunes(): @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)) + updates = list(zip( + sample(range(1, 10000), num_queries), + sorted(sample(range(1, 10000), num_queries)) + )) - worlds = [ - {'id': row_id, 'randomNumber': number} for row_id, number in updates - ] + 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: + for _, row_id in updates: await statement.fetchval(row_id) await connection.executemany(WRITE_ROW_SQL, updates) return Response(data=worlds) @@ -129,4 +125,4 @@ async def plaintext(): 'plaintext': plaintext, } -app = Panther(__name__, configs=__name__, urls=url_routing, startup=create_db_pool, shutdown=clean_db_pool) +app = Panther(__name__, configs=__name__, urls=url_routing) diff --git a/frameworks/Python/panther/requirements.txt b/frameworks/Python/panther/requirements.txt index 4a494ed3f7a..691d573162f 100644 --- a/frameworks/Python/panther/requirements.txt +++ b/frameworks/Python/panther/requirements.txt @@ -1,11 +1,5 @@ -panther==3.2.1 - -cython==3.0.6 -jinja2==3.1.4 - +panther==4.3.1 +cython==3.0.11 asyncpg==0.29.0 - -gunicorn==22.0.0 -uvicorn==0.24.0 -uvloop==0.19.0 -httptools==0.6.1 +gunicorn==23.0.0 +uvloop==0.20.0 From 5ec9c62c84cf5125b9fc5c9ee462b09444faa246 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Wed, 28 Aug 2024 00:47:39 +0530 Subject: [PATCH 0777/1766] Upgrade Deno to v1.46 (#9230) * Upgrade Deno to v1.46 Uses the new `deno serve --parallel` feature * Fix --- frameworks/TypeScript/deno/deno.dockerfile | 4 ++-- frameworks/TypeScript/deno/src/main.ts | 13 +++---------- frameworks/TypeScript/deno/src/spawn.ts | 13 ------------- 3 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 frameworks/TypeScript/deno/src/spawn.ts diff --git a/frameworks/TypeScript/deno/deno.dockerfile b/frameworks/TypeScript/deno/deno.dockerfile index bd98d179541..cfb43644c10 100644 --- a/frameworks/TypeScript/deno/deno.dockerfile +++ b/frameworks/TypeScript/deno/deno.dockerfile @@ -1,4 +1,4 @@ -FROM denoland/deno:1.42.1 +FROM denoland/deno:1.46.1 EXPOSE 8080 @@ -12,4 +12,4 @@ RUN deno cache main.ts EXPOSE 8080 -CMD ["run", "-A", "--unstable-net", "spawn.ts"] +CMD ["deno", "serve", "--parallel", "--port", "8080", "--host", "0.0.0.0", "-A", "main.ts"] diff --git a/frameworks/TypeScript/deno/src/main.ts b/frameworks/TypeScript/deno/src/main.ts index 347e7f4c1a8..3e6f71506bd 100644 --- a/frameworks/TypeScript/deno/src/main.ts +++ b/frameworks/TypeScript/deno/src/main.ts @@ -1,9 +1,8 @@ const HELLO_WORLD_STR = "Hello, World!"; const options: ResponseInit = { headers: { "Server": "Deno" } }; -Deno.serve({ - reusePort: true, - handler: (req: Request) => { +export default { + fetch: (req: Request) => { const path = req.url.slice(req.url.indexOf("/", 8)); if (path == "/plaintext") { return new Response(HELLO_WORLD_STR, options); @@ -13,10 +12,4 @@ Deno.serve({ return new Response("404 Not Found", { status: 404, ...options }); } }, - onError(err) { - console.error(err); - Deno.exit(9); - }, - port: 8080, - hostname: "0.0.0.0", -}); +}; diff --git a/frameworks/TypeScript/deno/src/spawn.ts b/frameworks/TypeScript/deno/src/spawn.ts deleted file mode 100644 index cc56c4543b6..00000000000 --- a/frameworks/TypeScript/deno/src/spawn.ts +++ /dev/null @@ -1,13 +0,0 @@ -import os from "node:os"; -import process from "node:process"; - -const numCPUs = os.cpus().length; -for (let i = 0; i < numCPUs; i++) { - new Deno.Command(Deno.execPath(), { - args: ["run", "-A", "--unstable-net", "main.ts"], - stdin: "inherit", - stdout: "inherit", - stderr: "inherit", - env: { ...process.env }, - }).spawn(); -} From 1f84792e2083cfcbef7586de4c5466b9b2ca7131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Wed, 28 Aug 2024 03:18:50 +0800 Subject: [PATCH 0778/1766] [Java] Update Solon Version To 2.9.1 (#9233) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 --- frameworks/Java/solon/pom.xml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index 58e7d792301..df69e436229 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -9,9 +9,8 @@ UTF-8 - 11 - 11 - 2.0.0 + 11 + 2.9.1 @@ -66,11 +65,11 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.11.0 -parameters - 1.8 - 1.8 + ${java.vertsion} + ${java.vertsion} UTF-8 false @@ -79,7 +78,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.6.0 jar-with-dependencies From 8606bb835c99db9aa9d75a5d46c52f165c58e9e1 Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Tue, 27 Aug 2024 22:19:13 +0300 Subject: [PATCH 0779/1766] [F#/Oxpecker] Improved fortunes rendering (#9234) --- frameworks/FSharp/oxpecker/src/App/App.fsproj | 5 +- frameworks/FSharp/oxpecker/src/App/Program.fs | 50 ++++++++++--------- .../FSharp/oxpecker/src/App/RenderHelpers.fs | 24 +++++++++ 3 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index 1b6f8b76cd3..35df8d5c493 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -8,12 +8,13 @@ + - - + + \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index 09ba84b4fae..ea6bc66b911 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -7,32 +7,34 @@ open Oxpecker module HtmlViews = open Oxpecker.ViewEngine - let private fortunesHead = - head() { - title() { raw "Fortunes" } - } - - let private layout (content: HtmlElement) = - html() { - fortunesHead - body() { content } - } - - let private fortunesTableHeader = - tr() { - th() { raw "id" } - th() { raw "message" } - } + let private head, tail = + (fun (content: HtmlElement) -> + html() { + head() { + title() { "Fortunes" } + } + body() { + table() { + tr() { + th() { "id" } + th() { "message" } + } + content + } + } + } :> HtmlElement + ) |> RenderHelpers.prerender let fortunes (fortunesData: ResizeArray) = - table() { - fortunesTableHeader - for fortune in fortunesData do - tr() { - td() { raw <| string fortune.id } - td() { fortune.message } - } - } |> layout + RenderHelpers.combine head tail ( + __() { + for fortune in fortunesData do + tr() { + td() { raw <| string fortune.id } + td() { fortune.message } + } + } + ) [] module HttpHandlers = diff --git a/frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs b/frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs new file mode 100644 index 00000000000..003fc09d8ce --- /dev/null +++ b/frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs @@ -0,0 +1,24 @@ +module RenderHelpers + + open System.Text + open Oxpecker.ViewEngine + + let prerender (view: HtmlElement -> HtmlElement) = + let sb = StringBuilder() + let mutable head = "" + let fakeHole = + { new HtmlElement with + member this.Render(sb) = + head <- sb.ToString() + sb.Clear() |> ignore } + let readyView = view fakeHole + readyView.Render(sb) + (head, sb.ToString()) + + let inline combine (head: string) (tail: string) (hole: HtmlElement) = + { new HtmlElement with + member this.Render(sb) = + sb.Append(head) |> ignore + hole.Render(sb) + sb.Append(tail) |> ignore + } \ No newline at end of file From d04efec4de37ad44cf13b453c0d2b946e2402ebd Mon Sep 17 00:00:00 2001 From: Redkale Date: Wed, 28 Aug 2024 03:19:36 +0800 Subject: [PATCH 0780/1766] Update jdk-23 (#9236) * Update jdk-23 * Update jdk-23 --- frameworks/Java/redkale/benchmark_config.json | 4 ++-- frameworks/Java/redkale/config.toml | 2 +- frameworks/Java/redkale/{pom-vertx.xml => pom-pgclient.xml} | 2 +- frameworks/Java/redkale/redkale-block.dockerfile | 2 +- frameworks/Java/redkale/redkale-jdbc.dockerfile | 2 +- .../{redkale-vertx.dockerfile => redkale-pgclient.dockerfile} | 4 ++-- frameworks/Java/redkale/redkale.dockerfile | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) rename frameworks/Java/redkale/{pom-vertx.xml => pom-pgclient.xml} (99%) rename frameworks/Java/redkale/{redkale-vertx.dockerfile => redkale-pgclient.dockerfile} (86%) diff --git a/frameworks/Java/redkale/benchmark_config.json b/frameworks/Java/redkale/benchmark_config.json index eb9e8d92ba2..fa84965daa3 100644 --- a/frameworks/Java/redkale/benchmark_config.json +++ b/frameworks/Java/redkale/benchmark_config.json @@ -116,7 +116,7 @@ "notes": "", "versus": "Redkale" }, - "vertx": { + "pgclient": { "db_url": "/db", "query_url": "/queries?q=", "fortune_url": "/fortunes", @@ -133,7 +133,7 @@ "webserver": "Redkale", "os": "Linux", "database_os": "Linux", - "display_name": "redkale-vertx", + "display_name": "redkale-pgclient", "notes": "", "versus": "Redkale" } diff --git a/frameworks/Java/redkale/config.toml b/frameworks/Java/redkale/config.toml index 73c0a6678e3..c2fcbb80d77 100644 --- a/frameworks/Java/redkale/config.toml +++ b/frameworks/Java/redkale/config.toml @@ -85,7 +85,7 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[vertx] +[pgclient] urls.db = "/db" urls.fortune = "/fortunes" urls.query = "/queries?q=" diff --git a/frameworks/Java/redkale/pom-vertx.xml b/frameworks/Java/redkale/pom-pgclient.xml similarity index 99% rename from frameworks/Java/redkale/pom-vertx.xml rename to frameworks/Java/redkale/pom-pgclient.xml index fc371f67798..1e7315a9ff2 100644 --- a/frameworks/Java/redkale/pom-vertx.xml +++ b/frameworks/Java/redkale/pom-pgclient.xml @@ -9,7 +9,7 @@ org.redkale.boot.Application 2.9.0-SNAPSHOT 1.3.0-SNAPSHOT - 4.5.0 + 4.5.8 2.1 UTF-8 18 diff --git a/frameworks/Java/redkale/redkale-block.dockerfile b/frameworks/Java/redkale/redkale-block.dockerfile index 67594021962..36d75c9db4d 100644 --- a/frameworks/Java/redkale/redkale-block.dockerfile +++ b/frameworks/Java/redkale/redkale-block.dockerfile @@ -6,7 +6,7 @@ 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 +FROM openjdk:23-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar diff --git a/frameworks/Java/redkale/redkale-jdbc.dockerfile b/frameworks/Java/redkale/redkale-jdbc.dockerfile index c6549abfa03..4588baf43f1 100644 --- a/frameworks/Java/redkale/redkale-jdbc.dockerfile +++ b/frameworks/Java/redkale/redkale-jdbc.dockerfile @@ -6,7 +6,7 @@ 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 +FROM openjdk:23-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar diff --git a/frameworks/Java/redkale/redkale-vertx.dockerfile b/frameworks/Java/redkale/redkale-pgclient.dockerfile similarity index 86% rename from frameworks/Java/redkale/redkale-vertx.dockerfile rename to frameworks/Java/redkale/redkale-pgclient.dockerfile index f4099b6a776..fdc4786a478 100644 --- a/frameworks/Java/redkale/redkale-vertx.dockerfile +++ b/frameworks/Java/redkale/redkale-pgclient.dockerfile @@ -2,10 +2,10 @@ FROM maven:3.8.6-openjdk-18-slim as maven WORKDIR /redkale COPY src src COPY conf conf -COPY pom-vertx.xml pom.xml +COPY pom-pgclient.xml pom.xml RUN mvn package -q -FROM openjdk:21-jdk-slim +FROM openjdk:23-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar diff --git a/frameworks/Java/redkale/redkale.dockerfile b/frameworks/Java/redkale/redkale.dockerfile index d7878808a4b..8982ae3b16d 100644 --- a/frameworks/Java/redkale/redkale.dockerfile +++ b/frameworks/Java/redkale/redkale.dockerfile @@ -5,7 +5,7 @@ COPY conf conf COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:21-jdk-slim +FROM openjdk:23-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar From 48de47f8d36b1fa734bb52dbde92b78760becb3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2024 18:37:57 +0000 Subject: [PATCH 0781/1766] Bump com.mysql:mysql-connector-j in /frameworks/Kotlin/kooby Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.0.33 to 8.2.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.0.33...8.2.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 44397e8f522..9ae92257022 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -52,7 +52,7 @@ com.mysql mysql-connector-j - 8.0.33 + 8.2.0 From b8c31e25bcf99f3e20e832aa46c386ea2751fbbf Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Fri, 30 Aug 2024 16:28:11 +0200 Subject: [PATCH 0782/1766] Micronaut 4.6 (#9244) * Micronaut 4.6 * Use GraalVM 21 --- frameworks/Java/micronaut/buildSrc/build.gradle | 2 +- frameworks/Java/micronaut/gradle.properties | 2 +- .../Java/micronaut/gradle/wrapper/gradle-wrapper.properties | 2 +- .../Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile | 5 ++--- .../micronaut/micronaut-data-mongodb-graalvm.dockerfile | 5 ++--- .../Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile | 5 ++--- frameworks/Java/micronaut/micronaut-graalvm.dockerfile | 6 ++---- frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile | 5 ++--- .../Java/micronaut/micronaut-r2dbc-graalvm.dockerfile | 5 ++--- 9 files changed, 15 insertions(+), 22 deletions(-) diff --git a/frameworks/Java/micronaut/buildSrc/build.gradle b/frameworks/Java/micronaut/buildSrc/build.gradle index 7f10f90ed59..386638337fe 100644 --- a/frameworks/Java/micronaut/buildSrc/build.gradle +++ b/frameworks/Java/micronaut/buildSrc/build.gradle @@ -8,6 +8,6 @@ repositories { } dependencies { - implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.3.7" + implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.4.2" implementation "com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1" } \ No newline at end of file diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index ba63eab22c9..22d843f7643 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion=4.5.0 +micronautVersion=4.6.0 diff --git a/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties b/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f0..9355b415575 100644 --- a/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile index 63eb26907b0..8d7377b166d 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile @@ -1,12 +1,11 @@ -FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src RUN ./gradlew micronaut-data-jdbc:nativeCompile -x test -x internalStartTestResourcesService --no-daemon -FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut -COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/native/nativeCompile/micronaut-data-jdbc micronaut +RUN mv /home/gradle/src/micronaut-data-jdbc/build/native/nativeCompile/micronaut-data-jdbc micronaut EXPOSE 8080 ENV MICRONAUT_ENVIRONMENTS=benchmark diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile index 85472860d78..f0b28e5bcf3 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile @@ -1,12 +1,11 @@ -FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src RUN ./gradlew micronaut-data-mongodb:nativeCompile -x test -x internalStartTestResourcesService --no-daemon -FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut -COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/native/nativeCompile/micronaut-data-mongodb micronaut +RUN mv /home/gradle/src/micronaut-data-mongodb/build/native/nativeCompile/micronaut-data-mongodb micronaut EXPOSE 8080 ENV MICRONAUT_ENVIRONMENTS=benchmark diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile index 6ada77518a5..614967b3379 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile @@ -1,12 +1,11 @@ -FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src RUN ./gradlew micronaut-data-r2dbc:nativeCompile -x test -x internalStartTestResourcesService --no-daemon -FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut -COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/native/nativeCompile/micronaut-data-r2dbc micronaut +RUN mv /home/gradle/src/micronaut-data-r2dbc/build/native/nativeCompile/micronaut-data-r2dbc micronaut EXPOSE 8080 ENV MICRONAUT_ENVIRONMENTS=benchmark diff --git a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile index 6a9208967cc..0b45b87f1dc 100644 --- a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile @@ -1,13 +1,11 @@ -FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src RUN ./gradlew micronaut-vertx-pg-client:nativeCompile -x test -x internalStartTestResourcesService --no-daemon -FROM cgr.dev/chainguard/wolfi-base:latest -RUN apk --no-cache update && apk add libstdc++ WORKDIR /micronaut -COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/native/nativeCompile/micronaut-vertx-pg-client micronaut +RUN mv /home/gradle/src/micronaut-vertx-pg-client/build/native/nativeCompile/micronaut-vertx-pg-client micronaut EXPOSE 8080 ENV MICRONAUT_ENVIRONMENTS=benchmark diff --git a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile index 27cb088bb04..ceae0bdf03e 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile @@ -1,12 +1,11 @@ -FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src RUN ./gradlew micronaut-jdbc:nativeCompile -x test -x internalStartTestResourcesService --no-daemon -FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut -COPY --from=build /home/gradle/src/micronaut-jdbc/build/native/nativeCompile/micronaut-jdbc micronaut +RUN mv /home/gradle/src/micronaut-jdbc/build/native/nativeCompile/micronaut-jdbc micronaut EXPOSE 8080 ENV MICRONAUT_ENVIRONMENTS=benchmark diff --git a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile index ff10709dae7..574496a0b91 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile @@ -1,12 +1,11 @@ -FROM ghcr.io/graalvm/native-image-community:21-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src RUN ./gradlew micronaut-r2dbc:nativeCompile -x test --no-daemon -FROM cgr.dev/chainguard/wolfi-base:latest WORKDIR /micronaut -COPY --from=build /home/gradle/src/micronaut-r2dbc/build/native/nativeCompile/micronaut-r2dbc micronaut +RUN mv /home/gradle/src/micronaut-r2dbc/build/native/nativeCompile/micronaut-r2dbc micronaut EXPOSE 8080 ENV MICRONAUT_ENVIRONMENTS=benchmark From 44a869e49fa0126831df30844ce4e897e4830264 Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Tue, 3 Sep 2024 20:47:27 +0100 Subject: [PATCH 0783/1766] feat: upgrade axum & dependencies, refactor, and add code and build optimisations (#9237) --- frameworks/Rust/axum/Cargo.lock | 1436 ++++++++++------- frameworks/Rust/axum/Cargo.toml | 75 +- frameworks/Rust/axum/README.md | 70 +- .../Rust/axum/axum-mongo-raw.dockerfile | 25 - frameworks/Rust/axum/axum-mongo.dockerfile | 25 - frameworks/Rust/axum/axum-pg-pool.dockerfile | 24 - frameworks/Rust/axum/axum-pg.dockerfile | 23 - frameworks/Rust/axum/axum-sqlx.dockerfile | 26 - frameworks/Rust/axum/axum.dockerfile | 27 +- frameworks/Rust/axum/benchmark_config.json | 13 + frameworks/Rust/axum/config.toml | 3 +- frameworks/Rust/axum/src/common/mod.rs | 51 + .../src/{models_mongo.rs => common/models.rs} | 5 + frameworks/Rust/axum/src/common/simd_json.rs | 152 ++ .../Rust/axum/src/{ => common}/utils.rs | 24 +- frameworks/Rust/axum/src/database_pg.rs | 199 --- frameworks/Rust/axum/src/database_sqlx.rs | 86 - frameworks/Rust/axum/src/main.rs | 42 +- frameworks/Rust/axum/src/main_mongo.rs | 76 +- frameworks/Rust/axum/src/main_mongo_raw.rs | 80 +- frameworks/Rust/axum/src/main_pg.rs | 90 +- frameworks/Rust/axum/src/main_pg_pool.rs | 136 +- frameworks/Rust/axum/src/main_sqlx.rs | 143 +- frameworks/Rust/axum/src/models_common.rs | 6 - .../{database_mongo.rs => mongo/database.rs} | 3 +- frameworks/Rust/axum/src/mongo/mod.rs | 1 + .../database.rs} | 3 +- frameworks/Rust/axum/src/mongo_raw/mod.rs | 1 + frameworks/Rust/axum/src/pg/database.rs | 155 ++ frameworks/Rust/axum/src/pg/mod.rs | 2 + .../axum/src/{models_pg.rs => pg/models.rs} | 0 .../database.rs} | 56 +- frameworks/Rust/axum/src/pg_pool/mod.rs | 2 + .../{models_pg_pool.rs => pg_pool/models.rs} | 0 frameworks/Rust/axum/src/server.rs | 119 +- frameworks/Rust/axum/src/sqlx/database.rs | 36 + frameworks/Rust/axum/src/sqlx/mod.rs | 2 + .../src/{models_sqlx.rs => sqlx/models.rs} | 0 38 files changed, 1741 insertions(+), 1476 deletions(-) delete mode 100644 frameworks/Rust/axum/axum-mongo-raw.dockerfile delete mode 100644 frameworks/Rust/axum/axum-mongo.dockerfile delete mode 100644 frameworks/Rust/axum/axum-pg-pool.dockerfile delete mode 100644 frameworks/Rust/axum/axum-pg.dockerfile delete mode 100644 frameworks/Rust/axum/axum-sqlx.dockerfile create mode 100644 frameworks/Rust/axum/src/common/mod.rs rename frameworks/Rust/axum/src/{models_mongo.rs => common/models.rs} (85%) create mode 100644 frameworks/Rust/axum/src/common/simd_json.rs rename frameworks/Rust/axum/src/{ => common}/utils.rs (65%) delete mode 100644 frameworks/Rust/axum/src/database_pg.rs delete mode 100644 frameworks/Rust/axum/src/database_sqlx.rs delete mode 100644 frameworks/Rust/axum/src/models_common.rs rename frameworks/Rust/axum/src/{database_mongo.rs => mongo/database.rs} (97%) create mode 100644 frameworks/Rust/axum/src/mongo/mod.rs rename frameworks/Rust/axum/src/{database_mongo_raw.rs => mongo_raw/database.rs} (97%) create mode 100644 frameworks/Rust/axum/src/mongo_raw/mod.rs create mode 100644 frameworks/Rust/axum/src/pg/database.rs create mode 100644 frameworks/Rust/axum/src/pg/mod.rs rename frameworks/Rust/axum/src/{models_pg.rs => pg/models.rs} (100%) rename frameworks/Rust/axum/src/{database_pg_pool.rs => pg_pool/database.rs} (60%) create mode 100644 frameworks/Rust/axum/src/pg_pool/mod.rs rename frameworks/Rust/axum/src/{models_pg_pool.rs => pg_pool/models.rs} (100%) create mode 100644 frameworks/Rust/axum/src/sqlx/database.rs create mode 100644 frameworks/Rust/axum/src/sqlx/mod.rs rename frameworks/Rust/axum/src/{models_sqlx.rs => sqlx/models.rs} (100%) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 3a9dba5fb18..005a10fb7ca 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -17,11 +17,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -32,18 +38,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -70,15 +76,26 @@ dependencies = [ "yansi-term", ] +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-trait" -version = "0.1.75" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", ] [[package]] @@ -91,61 +108,32 @@ dependencies = [ ] [[package]] -name = "atomic-write-file" -version = "0.1.2" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" -dependencies = [ - "nix", - "rand", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" -version = "0.2.0" -dependencies = [ - "axum 0.6.20", - "deadpool", - "deadpool-postgres", - "dotenv", - "futures", - "futures-util", - "hyper", - "mongodb", - "num_cpus", - "rand", - "serde", - "serde_json", - "sqlx", - "tokio", - "tokio-pg-mapper", - "tokio-pg-mapper-derive", - "tokio-postgres", - "tower", - "tower-http", - "yarte", -] - -[[package]] -name = "axum" -version = "0.6.20" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" dependencies = [ "async-trait", "axum-core", - "bitflags 1.3.2", "bytes", "futures-util", "http", "http-body", + "http-body-util", "hyper", + "hyper-util", "itoa", "matchit", "memchr", @@ -157,41 +145,78 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" dependencies = [ "async-trait", "bytes", "futures-util", "http", "http-body", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper 0.1.2", "tower-layer", "tower-service", ] +[[package]] +name = "axum-techempower" +version = "0.2.1" +dependencies = [ + "axum", + "axum-core", + "bytes", + "deadpool", + "deadpool-postgres", + "dotenv", + "futures", + "futures-util", + "hyper", + "hyper-util", + "mime", + "moka", + "mongodb", + "num_cpus", + "rand", + "serde", + "serde_json", + "serde_path_to_error", + "simd-json", + "socket2 0.5.7", + "sqlx", + "tokio", + "tokio-pg-mapper", + "tokio-pg-mapper-derive", + "tokio-postgres", + "tower 0.5.0", + "tower-http", + "yarte", +] + [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.4", "object", "rustc-demangle", ] @@ -204,9 +229,15 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -222,9 +253,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -252,15 +283,15 @@ dependencies = [ [[package]] name = "bson" -version = "2.8.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c18b51216e1f74b9d769cead6ace2f82b965b807e3d73330aabe9faec31c84" +checksum = "d8a88e82b9106923b5c4d6edfca9e7db958d4e98a478ec115022e81b9b38e2c8" dependencies = [ "ahash", "base64 0.13.1", "bitvec", "hex", - "indexmap 1.9.3", + "indexmap", "js-sys", "once_cell", "rand", @@ -273,9 +304,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byteorder" @@ -285,18 +316,19 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.0.83" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -307,14 +339,23 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "windows-targets 0.48.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", ] [[package]] @@ -329,36 +370,26 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ "crc-catalog", ] @@ -371,32 +402,46 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] -name = "crossbeam-queue" -version = "0.3.9" +name = "crossbeam-channel" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bcf5bdbfdd6030fb4a1c497b5d5fc5921aa2f60d359a17e249c0e6df3de153" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] -name = "crossbeam-utils" -version = "0.8.17" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "cfg-if", + "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + [[package]] name = "crypto-common" version = "0.1.6" @@ -444,17 +489,16 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "deadpool" -version = "0.10.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb84100978c1c7b37f09ed3ce3e5f843af02c2a2c431bae5b19230dad2c1b490" +checksum = "6541a3916932fe57768d4be0b1ffb5ec7cbf74ca8c903fdfd5c0fe8aa958f0ed" dependencies = [ - "async-trait", "deadpool-runtime", "num_cpus", "serde", @@ -463,11 +507,14 @@ dependencies = [ [[package]] name = "deadpool-postgres" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda39fa1cfff190d8924d447ad04fd22772c250438ca5ce1dfb3c80621c05aaa" +checksum = "1ab8a4ea925ce79678034870834602a2980f4b88c09e97feb266496dbb4493d2" dependencies = [ + "async-trait", "deadpool", + "getrandom", + "serde", "tokio", "tokio-postgres", "tracing", @@ -475,18 +522,18 @@ dependencies = [ [[package]] name = "deadpool-runtime" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" dependencies = [ "tokio", ] [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -495,9 +542,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", ] @@ -515,15 +562,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version 0.4.0", - "syn 1.0.109", + "syn 2.0.75", ] [[package]] @@ -558,9 +605,9 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ "serde", ] @@ -585,9 +632,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -610,6 +657,27 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -618,24 +686,27 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] -name = "finl_unicode" -version = "1.2.0" +name = "flate2" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" +checksum = "9c0596c1eac1f9e04ed902702e9878208b336edc9d6fddc8a48387349bab3666" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] [[package]] -name = "flate2" -version = "1.0.28" +name = "float-cmp" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" dependencies = [ - "crc32fast", - "miniz_oxide", + "num-traits", ] [[package]] @@ -646,7 +717,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -655,21 +726,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -687,9 +743,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[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", @@ -702,9 +758,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", @@ -712,15 +768,15 @@ 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-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -740,38 +796,38 @@ 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-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.42", + "syn 2.0.75", ] [[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", @@ -797,32 +853,57 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] -name = "hashbrown" -version = "0.12.3" +name = "h2" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "halfbrown" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +dependencies = [ + "hashbrown", + "serde", +] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -834,7 +915,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.3", + "hashbrown", ] [[package]] @@ -848,9 +929,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -898,9 +979,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -909,26 +990,32 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", - "pin-project-lite", ] [[package]] -name = "http-range-header" -version = "0.3.1" +name = "http-body-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -938,32 +1025,44 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", + "h2", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", "tokio", - "tower-service", - "tracing", - "want", ] [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1011,22 +1110,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown", ] [[package]] @@ -1035,7 +1124,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.5", + "socket2 0.5.7", "widestring", "windows-sys 0.48.0", "winreg", @@ -1047,53 +1136,108 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" -[[package]] -name = "itertools" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" -dependencies = [ - "either", -] - [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "lexical-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" dependencies = [ - "spin 0.5.2", + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +dependencies = [ + "lexical-util", + "static_assertions", ] [[package]] name = "libc" -version = "0.2.151" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libm" @@ -1120,15 +1264,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1136,9 +1280,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru-cache" @@ -1179,9 +1323,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1197,29 +1341,63 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" -version = "0.8.10" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "moka" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cf62eb4dd975d2dde76432fb1075c49e3ee2331cf36f1f8fd4b66550d32b6f" +dependencies = [ + "async-lock", + "async-trait", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "event-listener 5.3.1", + "futures-util", + "once_cell", + "parking_lot", + "quanta", + "rustc_version 0.4.0", + "smallvec", + "tagptr", + "thiserror", + "triomphe", + "uuid", ] [[package]] name = "mongodb" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c30763a5c6c52079602be44fa360ca3bfacee55fca73f4734aecd23706a7f2" +checksum = "ef206acb1b72389b49bc9985efe7eb1f8a9bb18e5680d262fac26c07f44025f1" dependencies = [ "async-trait", "base64 0.13.1", @@ -1249,49 +1427,20 @@ dependencies = [ "sha-1", "sha2", "snap", - "socket2 0.4.10", - "stringprep", - "strsim", - "take_mut", - "thiserror", - "tokio", - "tokio-rustls", - "tokio-util", - "trust-dns-proto", - "trust-dns-resolver", - "typed-builder", - "uuid", - "webpki-roots", - "zstd", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.4.1", - "cfg-if", - "libc", + "socket2 0.4.10", + "stringprep", + "strsim", + "take_mut", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "trust-dns-proto", + "trust-dns-resolver", + "typed-builder", + "uuid", + "webpki-roots", + "zstd", ] [[package]] @@ -1321,21 +1470,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[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 = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -1344,9 +1498,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -1364,9 +1518,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -1378,54 +1532,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "openssl" -version = "0.10.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags 2.4.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.42", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.103" +name = "parking" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1433,22 +1549,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" @@ -1494,29 +1610,29 @@ dependencies = [ [[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", - "syn 2.0.42", + "syn 2.0.75", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1547,17 +1663,17 @@ 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 = "postgres-protocol" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520" +checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" dependencies = [ - "base64 0.21.5", + "base64 0.22.1", "byteorder", "bytes", "fallible-iterator", @@ -1571,9 +1687,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" +checksum = "02048d9e032fb3cc3413bbf7b83a15d84a5d419778e2628751896d856498eee9" dependencies = [ "bytes", "fallible-iterator", @@ -1588,9 +1704,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" @@ -1604,13 +1723,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] +[[package]] +name = "quanta" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -1619,9 +1753,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1662,6 +1796,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "raw-cpuid" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -1671,11 +1814,40 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.75", +] + [[package]] name = "regex" -version = "1.10.2" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -1685,9 +1857,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1696,9 +1868,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "resolv-conf" @@ -1712,16 +1884,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", - "spin 0.9.8", + "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1746,9 +1919,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" @@ -1765,7 +1938,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.20", + "semver 1.0.23", ] [[package]] @@ -1780,11 +1953,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -1793,9 +1966,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.11" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", @@ -1809,7 +1982,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", ] [[package]] @@ -1824,24 +1997,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" - -[[package]] -name = "schannel" -version = "0.1.22" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys 0.48.0", -] +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scopeguard" @@ -1859,29 +2023,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "0.9.0" @@ -1893,9 +2034,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "semver-parser" @@ -1905,50 +2046,51 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.12" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ - "indexmap 2.1.0", + "indexmap", "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_path_to_error" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ "itoa", "serde", @@ -2021,11 +2163,17 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -2040,6 +2188,28 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simd-json" +version = "0.13.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "570c430b3d902ea083097e853263ae782dfe40857d93db019a12356c8e8143fa" +dependencies = [ + "getrandom", + "halfbrown", + "lexical-core", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "siphasher" version = "0.3.11" @@ -2057,9 +2227,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snap" @@ -2079,20 +2249,14 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.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" @@ -2114,20 +2278,19 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" dependencies = [ - "itertools", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2138,9 +2301,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ "ahash", "atoi", @@ -2148,9 +2311,8 @@ dependencies = [ "bytes", "crc", "crossbeam-queue", - "dotenvy", "either", - "event-listener", + "event-listener 2.5.3", "futures-channel", "futures-core", "futures-intrusive", @@ -2158,13 +2320,14 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.1.0", + "indexmap", "log", "memchr", - "native-tls", "once_cell", "paste", "percent-encoding", + "rustls", + "rustls-pemfile", "serde", "serde_json", "sha2", @@ -2175,13 +2338,14 @@ dependencies = [ "tokio-stream", "tracing", "url", + "webpki-roots", ] [[package]] name = "sqlx-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" dependencies = [ "proc-macro2", "quote", @@ -2192,11 +2356,10 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ - "atomic-write-file", "dotenvy", "either", "heck", @@ -2219,13 +2382,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", - "base64 0.21.5", - "bitflags 2.4.1", + "base64 0.21.7", + "bitflags 2.6.0", "byteorder", "bytes", "crc", @@ -2261,13 +2424,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", - "base64 0.21.5", - "bitflags 2.4.1", + "base64 0.21.7", + "bitflags 2.6.0", "byteorder", "crc", "dotenvy", @@ -2288,7 +2451,6 @@ dependencies = [ "rand", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlx-core", @@ -2300,9 +2462,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" dependencies = [ "atoi", "flume", @@ -2321,15 +2483,21 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] @@ -2340,9 +2508,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2357,9 +2525,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.42" +version = "2.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b7d0a2c048d661a1a59fcd7355baa232f7ed34e0ee4df2eef3c1c1c0d3852d8" +checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" dependencies = [ "proc-macro2", "quote", @@ -2372,6 +2540,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "take_mut" version = "0.2.2" @@ -2386,45 +2566,46 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "once_cell", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.51" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.51" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", ] [[package]] name = "time" -version = "0.3.31" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -2439,18 +2620,19 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -2463,32 +2645,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", ] [[package]] @@ -2513,9 +2694,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d340244b32d920260ae7448cb72b6e238bddc3d4f7603394e7dd46ed8e48f5b8" +checksum = "03adcf0147e203b6032c0b2d30be1415ba03bc348901f3ff1cc0df6a733e60c3" dependencies = [ "async-trait", "byteorder", @@ -2531,7 +2712,7 @@ dependencies = [ "postgres-protocol", "postgres-types", "rand", - "socket2 0.5.5", + "socket2 0.5.7", "tokio", "tokio-util", "whoami", @@ -2549,9 +2730,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -2560,9 +2741,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", @@ -2570,7 +2751,6 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -2595,22 +2775,33 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] -name = "tower-http" -version = "0.4.4" +name = "tower" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" +checksum = "36b837f86b25d7c0d7988f00a54e74739be6477f2aac6201b8f429a7569991b7" dependencies = [ - "bitflags 2.4.1", - "bytes", "futures-core", "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.6.0", + "bytes", "http", "http-body", - "http-range-header", + "http-body-util", "pin-project-lite", "tower-layer", "tower-service", @@ -2618,15 +2809,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -2648,7 +2839,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", ] [[package]] @@ -2660,6 +2851,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "triomphe" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" + [[package]] name = "trust-dns-proto" version = "0.21.2" @@ -2705,12 +2902,6 @@ dependencies = [ "trust-dns-proto", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "typed-builder" version = "0.10.0" @@ -2730,9 +2921,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" @@ -2742,30 +2933,36 @@ 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", ] +[[package]] +name = "unicode-properties" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" + [[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-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "unicode_categories" @@ -2781,9 +2978,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna 0.5.0", @@ -2798,9 +2995,9 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "uuid" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "getrandom", "serde", @@ -2822,6 +3019,18 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" +[[package]] +name = "value-trait" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad8db98c1e677797df21ba03fca7d3bf9bec3ca38db930954e4fe6e1ea27eb4" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -2830,18 +3039,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "want" -version = "0.3.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" @@ -2857,34 +3057,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2892,28 +3093,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -2921,9 +3122,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "whoami" @@ -2931,16 +3132,16 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "redox_syscall", + "redox_syscall 0.4.1", "wasite", "web-sys", ] [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -2966,11 +3167,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2988,7 +3189,16 @@ 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.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -3008,17 +3218,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 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.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -3029,9 +3240,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -3041,9 +3252,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -3053,9 +3264,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -3065,9 +3282,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -3077,9 +3294,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -3089,9 +3306,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -3101,9 +3318,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" @@ -3220,29 +3437,30 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.31" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.31" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.75", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zstd" @@ -3265,9 +3483,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/frameworks/Rust/axum/Cargo.toml b/frameworks/Rust/axum/Cargo.toml index f4ecf45adf4..49b594972d1 100644 --- a/frameworks/Rust/axum/Cargo.toml +++ b/frameworks/Rust/axum/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "axum" -version = "0.2.0" +name = "axum-techempower" +version = "0.2.1" authors = ["Dragos Varovici "] edition = "2021" @@ -28,28 +28,63 @@ path = "src/main_mongo_raw.rs" name = "axum-pg" path = "src/main_pg.rs" +[features] +default = [] +simd-json = [ + "dep:simd-json", + "dep:axum-core", + "dep:mime", + "dep:bytes", + "dep:serde_path_to_error", +] + [dependencies] -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" +axum = { version = "0.7.5", default-features = false, features = [ + "json", + "query", + "http1", + "tokio", +] } +deadpool = { version = "0.12.1", features = ["rt_tokio_1", "serde", "managed"] } +deadpool-postgres = { version = "0.14.0", features = ["rt_tokio_1", "serde"] } dotenv = "0.15.0" -futures = "0.3.25" -futures-util = "0.3.25" -hyper = { version = "0.14.23", features = ["http1", "server"] } -mongodb = { version = "2.3.1", features = ["zstd-compression", "snappy-compression", "zlib-compression"] } -num_cpus = "1.14.0" +futures = "0.3.30" +futures-util = "0.3.30" +mongodb = { version = "2.8.0", features = [ + "zstd-compression", + "snappy-compression", + "zlib-compression", +] } +num_cpus = "1.16.0" rand = { version = "0.8.5", features = ["small_rng"] } -serde = { version = "1.0.149", features = ["derive"] } -serde_json = "1.0.89" -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" -tokio-postgres = "0.7.7" -tower = { version = "0.4.13", features = ["util"] } -tower-http = { version = "0.4.0", features = ["set-header"] } +serde = { version = "1.0.196", features = ["derive"] } +serde_json = "1.0.127" +sqlx = { version = "0.7.3", features = [ + "postgres", + "macros", + "runtime-tokio", + "tls-rustls", +] } +tokio = { version = "1.39.3", features = ["full"] } +tokio-pg-mapper = { version = "0.2.0" } +tokio-pg-mapper-derive = { version = "0.2.0" } +tokio-postgres = { version = "0.7.11" } +tower = { version = "0.5.0", features = ["util"] } +tower-http = { version = "0.5.2", features = ["set-header"] } yarte = "0.15.7" +simd-json = { version = "0.13.8", optional = true } +axum-core = { version = "0.4.3", optional = true } +mime = { version = "0.3.17", optional = true } +bytes = { version = "1.5.0", optional = true } +serde_path_to_error = { version = "0.1.15", optional = true } +moka = { version = "0.12.8", features = ["future"] } +socket2 = "0.5.7" +hyper = { version = "1.4", features = ["server", "http1"] } +hyper-util = { version = "0.1", features = ["tokio", "server-auto", "http1"] } + [profile.release] -lto = true +lto = "fat" codegen-units = 1 +strip = true +opt-level = 3 diff --git a/frameworks/Rust/axum/README.md b/frameworks/Rust/axum/README.md index 55ca3e0978e..59979fe441d 100755 --- a/frameworks/Rust/axum/README.md +++ b/frameworks/Rust/axum/README.md @@ -1,42 +1,46 @@ - -# [Axum](https://github.com/tokio-rs/axum) - Ergonomic and modular web framework built with Tokio, Tower, and Hyper +# [Axum](https://github.com/tokio-rs/axum) ## Description -Axum is a web application framework that focuses on ergonomics and modularity. - -* [User Guide](https://docs.rs/axum/0.3/axum/) -* [API Documentation](https://docs.rs/axum/0.3/axum/) -* Cargo package: [axum](https://crates.io/crates/axum) +Axum is a web application framework that focuses on ergonomics and modularity, +built with Tokio, Tower, and Hyper. -## Database +- [User Guide](https://docs.rs/axum/latest/axum/) +- [API Documentation](https://docs.rs/axum/latest/axum/) +- [Cargo Package (`axum`)](https://crates.io/crates/axum) -PostgreSQL +## Variants -* Raw using [sqlx](https://github.com/launchbadge/sqlx) +- PostgreSQL using `SQLx`, `tokio_postgres`, and `deadpool`. +- MongoDB with `mongodb`. ## Test URLs -### Test 1: JSON Encoding - - http://localhost:8000/json - -### Test 2: Single Row Query - - http://localhost:8000/db - -### Test 3: Multi Row Query - - http://localhost:8000/queries?q=20 - -### Test 4: Fortunes (Template rendering) - - http://localhost:8000/fortunes - -### Test 5: Update Query - - http://localhost:8000/updates?q=20 - -### Test 6: Plaintext - - http://localhost:8000/plaintext +- Plaintext: http://localhost:8000/plaintext +- JSON Encoding: http://localhost:8000/json +- Single Row Query: http://localhost:8000/db +- Multi Row Query: http://localhost:8000/queries?q=20 +- Fortunes: http://localhost:8000/fortunes +- Update Query: http://localhost:8000/updates?q=20 +- Cached Query: http://localhost:8000/cached-queries?q=20 + +## Notable Points (both performance and build) + +- Use of `async`. +- Use of most recent versions of Rust, `axum` and dependencies. +- (Disabled by default) Compile-time swap-in of `simd-json` instead of `serde_json` for faster JSON serialization. +- Release binaries are stripped and compiled with CPU native. +- Sockets configured with TCP_NODELAY and to support an increased number of pending connections. +- Server configured to serve HTTP/1 only, with no need for websockets. +- Separation of build and deployment containers using multi-stage builds. +- Deployment into Google's minimal `distroless-cc` container. +- Use of pipelined database queries (where supported). +- Streaming database queries (where supported). +- Use of PostgreSQL prepared statements cache (where supported). +- Use of PostgreSQL arrays to execute multi-row database updates with a single `UPDATE` query. + - This is permitted by the [test requirements](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates), step (ix). +- In version 0.7.6 (as yet unreleased), a native API to set TCP_NODELAY will be included. + - https://github.com/tokio-rs/axum/pull/2653/ + - https://github.com/tokio-rs/axum/issues/2521 +- More performance improvements are to be expected in version 0.8: + - https://github.com/tokio-rs/axum/issues/1827 diff --git a/frameworks/Rust/axum/axum-mongo-raw.dockerfile b/frameworks/Rust/axum/axum-mongo-raw.dockerfile deleted file mode 100644 index ffdabfc2d8c..00000000000 --- a/frameworks/Rust/axum/axum-mongo-raw.dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM rust:1.75-slim-buster - -ENV AXUM_TECHEMPOWER_MONGODB_URL=mongodb://tfb-database:27017 -ENV AXUM_TECHEMPOWER_MAX_POOL_SIZE=28 -ENV AXUM_TECHEMPOWER_MIN_POOL_SIZE=14 - -RUN apt-get update && apt-get install -y --no-install-recommends \ - pkg-config libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /axum -COPY ./src ./src -COPY ./templates ./templates -COPY ./Cargo.toml ./Cargo.toml -COPY ./Cargo.lock ./Cargo.lock -COPY ./run.sh ./run.sh -RUN chmod +x ./run.sh - -ENV RUSTFLAGS "-C target-cpu=native" -RUN cargo build --release -RUN cp ./target/release/axum-mongo-raw ./target/release/axum-techempower - -EXPOSE 8000 - -CMD ["./run.sh"] diff --git a/frameworks/Rust/axum/axum-mongo.dockerfile b/frameworks/Rust/axum/axum-mongo.dockerfile deleted file mode 100644 index 99a6f76f997..00000000000 --- a/frameworks/Rust/axum/axum-mongo.dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM rust:1.75-slim-buster - -ENV AXUM_TECHEMPOWER_MONGODB_URL=mongodb://tfb-database:27017 -ENV AXUM_TECHEMPOWER_MAX_POOL_SIZE=28 -ENV AXUM_TECHEMPOWER_MIN_POOL_SIZE=14 - -RUN apt-get update && apt-get install -y --no-install-recommends \ - pkg-config libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /axum -COPY ./src ./src -COPY ./templates ./templates -COPY ./Cargo.toml ./Cargo.toml -COPY ./Cargo.lock ./Cargo.lock -COPY ./run.sh ./run.sh -RUN chmod +x ./run.sh - -ENV RUSTFLAGS "-C target-cpu=native" -RUN cargo build --release -RUN cp ./target/release/axum-mongo ./target/release/axum-techempower - -EXPOSE 8000 - -CMD ["./run.sh"] diff --git a/frameworks/Rust/axum/axum-pg-pool.dockerfile b/frameworks/Rust/axum/axum-pg-pool.dockerfile deleted file mode 100644 index c836faa2381..00000000000 --- a/frameworks/Rust/axum/axum-pg-pool.dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -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 - -RUN apt-get update && apt-get install -y --no-install-recommends \ - libpq-dev pkg-config libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /axum -COPY ./src ./src -COPY ./templates ./templates -COPY ./Cargo.toml ./Cargo.toml -COPY ./Cargo.lock ./Cargo.lock -COPY ./run.sh ./run.sh -RUN chmod +x ./run.sh - -ENV RUSTFLAGS "-C target-cpu=native" -RUN cargo build --release -RUN cp ./target/release/axum-pg-pool ./target/release/axum-techempower - -EXPOSE 8000 - -CMD ["./run.sh"] diff --git a/frameworks/Rust/axum/axum-pg.dockerfile b/frameworks/Rust/axum/axum-pg.dockerfile deleted file mode 100644 index 98d44481007..00000000000 --- a/frameworks/Rust/axum/axum-pg.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM rust:1.75-slim-buster - -ENV AXUM_TECHEMPOWER_DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world - -RUN apt-get update && apt-get install -y --no-install-recommends \ - libpq-dev pkg-config libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /axum -COPY ./src ./src -COPY ./templates ./templates -COPY ./Cargo.toml ./Cargo.toml -COPY ./Cargo.lock ./Cargo.lock -COPY ./run.sh ./run.sh -RUN chmod +x ./run.sh - -ENV RUSTFLAGS "-C target-cpu=native" -RUN cargo build --release -RUN cp ./target/release/axum-pg ./target/release/axum-techempower - -EXPOSE 8000 - -CMD ["./run.sh"] diff --git a/frameworks/Rust/axum/axum-sqlx.dockerfile b/frameworks/Rust/axum/axum-sqlx.dockerfile deleted file mode 100644 index 0cecda65f32..00000000000 --- a/frameworks/Rust/axum/axum-sqlx.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -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 -ENV AXUM_TECHEMPOWER_MIN_POOL_SIZE=56 - -RUN apt-get update && apt-get install -y --no-install-recommends \ - libpq-dev pkg-config libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /axum -COPY ./src ./src -COPY ./templates ./templates -COPY ./Cargo.toml ./Cargo.toml -COPY ./Cargo.lock ./Cargo.lock -COPY ./run.sh ./run.sh -RUN chmod +x ./run.sh - -ENV RUSTFLAGS "-C target-cpu=native" -RUN cargo build --release -RUN cp ./target/release/axum-sqlx ./target/release/axum-techempower - - -EXPOSE 8000 - -CMD ["./run.sh"] diff --git a/frameworks/Rust/axum/axum.dockerfile b/frameworks/Rust/axum/axum.dockerfile index 2cd772a3426..044e68bbf02 100644 --- a/frameworks/Rust/axum/axum.dockerfile +++ b/frameworks/Rust/axum/axum.dockerfile @@ -1,21 +1,24 @@ -FROM rust:1.75-slim-buster +FROM docker.io/rust:1.80-slim-bookworm AS builder RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config libssl-dev \ && rm -rf /var/lib/apt/lists/* -WORKDIR /axum -COPY ./src ./src -COPY ./templates ./templates -COPY ./Cargo.toml ./Cargo.toml -COPY ./Cargo.lock ./Cargo.lock -COPY ./run.sh ./run.sh -RUN chmod +x ./run.sh - +WORKDIR /build +COPY ./Cargo.toml ./Cargo.lock /build/ +RUN cargo fetch +COPY ./templates/ /build/templates +COPY ./src/ /build/src ENV RUSTFLAGS "-C target-cpu=native" RUN cargo build --release -RUN cp ./target/release/axum ./target/release/axum-techempower +FROM gcr.io/distroless/cc-debian12 +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world +ENV POSTGRES_MIN_POOL_SIZE=56 +ENV POSTGRES_MAX_POOL_SIZE=56 +ENV MONGODB_URL=mongodb://tfb-database:27017 +ENV MONGODB_MIN_POOL_SIZE=28 +ENV MONGODB_MAX_POOL_SIZE=14 +COPY --from=builder /build/target/release/axum* /app/ EXPOSE 8000 - -CMD ["./run.sh"] +CMD ["/app/axum"] diff --git a/frameworks/Rust/axum/benchmark_config.json b/frameworks/Rust/axum/benchmark_config.json index f05dd4a67dd..ade60875389 100755 --- a/frameworks/Rust/axum/benchmark_config.json +++ b/frameworks/Rust/axum/benchmark_config.json @@ -3,6 +3,8 @@ "tests": [ { "default": { + "dockerfile": "axum.dockerfile", + "docker_cmd": "/app/axum", "json_url": "/json", "plaintext_url": "/plaintext", "port": 8000, @@ -22,8 +24,11 @@ "versus": "None" }, "sqlx": { + "dockerfile": "axum.dockerfile", + "docker_cmd": "/app/axum-sqlx", "db_url": "/db", "fortune_url": "/fortunes", + "cached_query_url": "/cached-queries?queries=", "port": 8000, "approach": "Realistic", "classification": "Fullstack", @@ -41,6 +46,8 @@ "versus": "None" }, "pg": { + "dockerfile": "axum.dockerfile", + "docker_cmd": "/app/axum-pg", "db_url": "/db", "fortune_url": "/fortunes", "query_url": "/queries?queries=", @@ -62,6 +69,8 @@ "versus": "None" }, "pg-pool": { + "dockerfile": "axum.dockerfile", + "docker_cmd": "/app/axum-pg-pool", "db_url": "/db", "query_url": "/queries?queries=", "update_url": "/updates?queries=", @@ -83,6 +92,8 @@ "versus": "None" }, "mongo": { + "dockerfile": "axum.dockerfile", + "docker_cmd": "/app/axum-mongo", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", @@ -104,6 +115,8 @@ "versus": "None" }, "mongo-raw": { + "dockerfile": "axum.dockerfile", + "docker_cmd": "/app/axum-mongo-raw", "db_url": "/db", "query_url": "/queries?queries=", "update_url": "/updates?queries=", diff --git a/frameworks/Rust/axum/config.toml b/frameworks/Rust/axum/config.toml index d4bb9d7ad0e..b5695c19bf0 100644 --- a/frameworks/Rust/axum/config.toml +++ b/frameworks/Rust/axum/config.toml @@ -8,6 +8,7 @@ urls.db = "/db" urls.query = "/queries?q=" urls.update = "/updates?q=" urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?q=" approach = "Realistic" classification = "Fullstack" database = "Postgres" @@ -16,4 +17,4 @@ os = "Linux" orm = "Raw" platform = "Rust" webserver = "Hyper" -versus = "None" \ No newline at end of file +versus = "None" diff --git a/frameworks/Rust/axum/src/common/mod.rs b/frameworks/Rust/axum/src/common/mod.rs new file mode 100644 index 00000000000..d55958155f1 --- /dev/null +++ b/frameworks/Rust/axum/src/common/mod.rs @@ -0,0 +1,51 @@ +use std::{env, str::FromStr}; + +use core::fmt::Debug; +use rand::{distributions::Uniform, rngs::SmallRng, Rng}; +pub mod models; +pub mod utils; + +#[cfg(feature = "simd-json")] +pub mod simd_json; + +#[allow(dead_code)] +pub const SELECT_ALL_FORTUNES: &str = "SELECT * FROM fortune"; +#[allow(dead_code)] +pub const SELECT_WORLD_BY_ID: &str = + "SELECT id, randomnumber FROM world WHERE id = $1 LIMIT 1"; +#[allow(dead_code)] +pub const SELECT_ALL_CACHED_WORLDS: &str = + "SELECT id, randomnumber FROM world ORDER BY id"; +#[allow(dead_code)] +pub const UPDATE_WORLDS: &str = "WITH vals AS (SELECT * FROM UNNEST($1::int[], $2::int[]) AS v(id, rnum)) + UPDATE world SET randomnumber = new.rnum FROM + (SELECT w.id, v.rnum FROM world w INNER JOIN vals v ON v.id = w.id ORDER BY w.id FOR UPDATE) AS new + WHERE world.id = new.id"; + +/// Return the value of an environment variable. +#[allow(dead_code)] +pub fn get_env(key: &str) -> T +where + ::Err: Debug, +{ + env::var(key) + .unwrap_or_else(|_| panic!("{key} environment variable was not set")) + .parse::() + .unwrap_or_else(|_| panic!("could not parse {key}")) +} + +/// Generate a single integer in the range 1 to 10,000 (inclusive) +#[allow(dead_code)] +#[inline] +pub fn random_id(rng: &mut SmallRng) -> i32 { + rng.gen_range(1..10_001) +} + +/// Generate vector of integers in the range 1 to 10,000 (inclusive) +#[allow(dead_code)] +#[inline] +pub fn random_ids(rng: &mut SmallRng, count: usize) -> Vec { + rng.sample_iter(Uniform::new(1, 10_001)) + .take(count) + .collect() +} diff --git a/frameworks/Rust/axum/src/models_mongo.rs b/frameworks/Rust/axum/src/common/models.rs similarity index 85% rename from frameworks/Rust/axum/src/models_mongo.rs rename to frameworks/Rust/axum/src/common/models.rs index 31c76cc7c07..1644447c3cd 100644 --- a/frameworks/Rust/axum/src/models_mongo.rs +++ b/frameworks/Rust/axum/src/common/models.rs @@ -1,5 +1,10 @@ use serde::{Deserialize, Serialize}; +#[derive(Serialize)] +pub struct Message { + pub message: &'static str, +} + #[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub struct Fortune { pub id: i32, diff --git a/frameworks/Rust/axum/src/common/simd_json.rs b/frameworks/Rust/axum/src/common/simd_json.rs new file mode 100644 index 00000000000..e8a2aafeee1 --- /dev/null +++ b/frameworks/Rust/axum/src/common/simd_json.rs @@ -0,0 +1,152 @@ +use axum::extract::rejection::JsonRejection::MissingJsonContentType; +use axum::extract::Request; +use axum::extract::{rejection::*, FromRequest}; +use axum::{async_trait, http}; +use axum_core::response::{IntoResponse, Response}; +use bytes::{BufMut, Bytes, BytesMut}; +use http::{ + header::{self, HeaderMap, HeaderValue}, + StatusCode, +}; +use serde::{de::DeserializeOwned, Serialize}; +use simd_json; + +#[derive(Debug, Clone, Copy, Default)] +pub struct Json(pub T); + +pub enum SimdJsonRejection { + Json(JsonRejection), + Bytes(BytesRejection), + Simd(String), +} + +impl IntoResponse for SimdJsonRejection { + fn into_response(self) -> Response { + todo!() + } +} + +impl From for SimdJsonRejection { + fn from(err: JsonRejection) -> Self { + SimdJsonRejection::Json(err) + } +} + +impl From for SimdJsonRejection { + fn from(err: BytesRejection) -> Self { + SimdJsonRejection::Bytes(err) + } +} + +impl From for SimdJsonRejection { + fn from(err: simd_json::Error) -> Self { + SimdJsonRejection::Simd(err.to_string()) + } +} + +#[async_trait] +impl FromRequest for Json +where + T: DeserializeOwned, + S: Send + Sync, +{ + type Rejection = SimdJsonRejection; + + async fn from_request(req: Request, state: &S) -> Result { + if json_content_type(req.headers()) { + let bytes = Bytes::from_request(req, state).await?; + Self::from_bytes(&bytes) + } else { + Err(SimdJsonRejection::Json(MissingJsonContentType( + axum::extract::rejection::MissingJsonContentType::default(), + ))) + } + } +} + +fn json_content_type(headers: &HeaderMap) -> bool { + let content_type = if let Some(content_type) = headers.get(header::CONTENT_TYPE) { + content_type + } else { + return false; + }; + + let content_type = if let Ok(content_type) = content_type.to_str() { + content_type + } else { + return false; + }; + + let mime = if let Ok(mime) = content_type.parse::() { + mime + } else { + return false; + }; + + let is_json_content_type = mime.type_() == "application" + && (mime.subtype() == "json" + || mime.suffix().map_or(false, |name| name == "json")); + + is_json_content_type +} + +axum_core::__impl_deref!(Json); + +impl From for Json { + fn from(inner: T) -> Self { + Self(inner) + } +} + +impl Json +where + T: DeserializeOwned, +{ + /// Construct a `Json` from a byte slice. Most users should prefer to use the `FromRequest` impl + /// but special cases may require first extracting a `Request` into `Bytes` then optionally + /// constructing a `Json`. + pub fn from_bytes(bytes: &[u8]) -> Result { + let body = &mut bytes.to_owned(); + let deserializer = simd_json::from_slice::(body); + + let value = match deserializer { + Ok(v) => v, + Err(err) => { + let rejection = { SimdJsonRejection::from(err) }; + return Err(rejection); + } + }; + + Ok(Json(value)) + } +} + +impl IntoResponse for Json +where + T: Serialize, +{ + fn into_response(self) -> Response { + // Use a small initial capacity of 128 bytes like serde_json::to_vec + // https://docs.rs/serde_json/1.0.82/src/serde_json/ser.rs.html#2189 + let mut buf = BytesMut::with_capacity(128).writer(); + match simd_json::to_writer(&mut buf, &self.0) { + Ok(()) => ( + [( + header::CONTENT_TYPE, + HeaderValue::from_static(mime::APPLICATION_JSON.as_ref()), + )], + buf.into_inner().freeze(), + ) + .into_response(), + Err(err) => ( + StatusCode::INTERNAL_SERVER_ERROR, + [( + header::CONTENT_TYPE, + HeaderValue::from_static(mime::TEXT_PLAIN_UTF_8.as_ref()), + )], + err.to_string(), + ) + .into_response(), + } + } +} diff --git a/frameworks/Rust/axum/src/utils.rs b/frameworks/Rust/axum/src/common/utils.rs similarity index 65% rename from frameworks/Rust/axum/src/utils.rs rename to frameworks/Rust/axum/src/common/utils.rs index 89ecaeae6ab..063411f3da7 100644 --- a/frameworks/Rust/axum/src/utils.rs +++ b/frameworks/Rust/axum/src/common/utils.rs @@ -1,35 +1,17 @@ -use std::{env, fmt::Debug, str::FromStr}; - use axum::{ - body::{Bytes, Full}, + body::Bytes, http::{header, HeaderValue, StatusCode}, response::{IntoResponse, Response}, }; -use rand::{rngs::SmallRng, Rng}; use serde::Deserialize; -pub fn get_environment_variable(key: &str) -> T -where - ::Err: Debug, -{ - env::var(key) - .unwrap_or_else(|_| panic!("{key} environment variable was not set")) - .parse::() - .unwrap_or_else(|_| panic!("could not parse {key}")) -} - #[derive(Debug, Deserialize)] pub struct Params { queries: Option, } #[allow(dead_code)] -pub fn random_number(rng: &mut SmallRng) -> i32 { - (rng.gen::() % 10_000 + 1) as i32 -} - -#[allow(dead_code)] -pub fn parse_params(params: Params) -> i32 { +pub fn parse_params(params: Params) -> usize { params .queries .and_then(|q| q.parse().ok()) @@ -52,7 +34,7 @@ pub struct Utf8Html(pub T); impl IntoResponse for Utf8Html where - T: Into>, + T: Into, { fn into_response(self) -> Response { let mut res = (StatusCode::OK, self.0.into()).into_response(); diff --git a/frameworks/Rust/axum/src/database_pg.rs b/frameworks/Rust/axum/src/database_pg.rs deleted file mode 100644 index 56e07553af3..00000000000 --- a/frameworks/Rust/axum/src/database_pg.rs +++ /dev/null @@ -1,199 +0,0 @@ -use std::{collections::HashMap, convert::Infallible, fmt::Write, io, sync::Arc}; - -use axum::{async_trait, extract::FromRequestParts, http::request::Parts}; -use futures::{ - stream::futures_unordered::FuturesUnordered, FutureExt, StreamExt, TryStreamExt, -}; -use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; -use tokio::pin; -use tokio_postgres::{connect, types::ToSql, Client, NoTls, Statement}; - -use crate::models_pg::{Fortune, World}; - -#[derive(Debug)] -pub enum PgError { - Io(io::Error), - Pg(tokio_postgres::Error), -} - -impl From for PgError { - fn from(err: io::Error) -> Self { - PgError::Io(err) - } -} - -impl From for PgError { - fn from(err: tokio_postgres::Error) -> Self { - PgError::Pg(err) - } -} - -/// Postgres interface -pub struct PgConnection { - client: Client, - fortune: Statement, - world: Statement, - updates: HashMap, -} - -impl PgConnection { - pub async fn connect(db_url: String) -> Arc { - let (cl, conn) = connect(&db_url, NoTls) - .await - .expect("can not connect to postgresql"); - - // Spawn connection - tokio::spawn(async move { - if let Err(error) = conn.await { - eprintln!("Connection error: {error}"); - } - }); - - let fortune = cl.prepare("SELECT * FROM fortune").await.unwrap(); - let mut updates = HashMap::new(); - - for num in 1..=500u16 { - let mut pl = 1; - let mut q = String::new(); - - q.push_str("UPDATE world SET randomnumber = CASE id "); - - for _ in 1..=num { - let _ = write!(q, "when ${pl} then ${} ", pl + 1); - pl += 2; - } - - q.push_str("ELSE randomnumber END WHERE id IN ("); - - for _ in 1..=num { - let _ = write!(q, "${pl},"); - pl += 1; - } - - q.pop(); - q.push(')'); - - updates.insert(num, cl.prepare(&q).await.unwrap()); - } - - let world = cl.prepare("SELECT * FROM world WHERE id=$1").await.unwrap(); - - Arc::new(PgConnection { - client: cl, - fortune, - world, - updates, - }) - } -} - -impl PgConnection { - async fn query_one_world(&self, id: i32) -> Result { - let stream = self.client.query_raw(&self.world, &[&id]).await?; - pin!(stream); - let row = stream.next().await.unwrap()?; - Ok(World { - id: row.get(0), - randomnumber: row.get(1), - }) - } - - pub async fn get_world(&self) -> Result { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - - let random_id = (rng.gen::() % 10_000 + 1) as i32; - - let world = self.query_one_world(random_id).await?; - Ok(world) - } - - pub async fn get_worlds(&self, num: usize) -> Result, PgError> { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - - let worlds = FuturesUnordered::new(); - - for _ in 0..num { - let w_id = (rng.gen::() % 10_000 + 1) as i32; - worlds.push(self.query_one_world(w_id)); - } - - worlds.try_collect().await - } - - pub async fn update(&self, num: u16) -> Result, PgError> { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - - let worlds = FuturesUnordered::new(); - - for _ in 0..num { - let id = (rng.gen::() % 10_000 + 1) as i32; - let w_id = (rng.gen::() % 10_000 + 1) as i32; - - worlds.push(self.query_one_world(w_id).map(move |res| match res { - Ok(mut world) => { - world.randomnumber = id; - Ok(world) - } - - Err(err) => Err(err), - })); - } - - let st = self.updates.get(&num).unwrap().clone(); - - let worlds: Vec = worlds.try_collect().await?; - - let mut params: Vec<&(dyn ToSql + Sync)> = Vec::with_capacity(num as usize * 3); - - for w in &worlds { - params.push(&w.id); - params.push(&w.randomnumber); - } - - for w in &worlds { - params.push(&w.id); - } - - self.client.query(&st, ¶ms[..]).await?; - - Ok(worlds) - } - - pub async fn tell_fortune(&self) -> Result, PgError> { - let mut items = vec![Fortune { - id: 0, - message: "Additional fortune added at request time.".parse().unwrap(), - }]; - - let fut = self.client.query_raw::<_, _, &[i32; 0]>(&self.fortune, &[]); - - let stream = fut.await?; - pin!(stream); - - while let Some(row) = stream.next().await { - let row = row?; - - items.push(Fortune { - id: row.get(0), - message: row.get(1), - }); - } - - items.sort_by(|it, next| it.message.cmp(&next.message)); - Ok(items) - } -} - -pub struct DatabaseConnection(pub Arc); - -#[async_trait] -impl FromRequestParts> for DatabaseConnection { - type Rejection = Infallible; - - async fn from_request_parts( - _parts: &mut Parts, - pg_connection: &Arc, - ) -> Result { - Ok(Self(pg_connection.clone())) - } -} diff --git a/frameworks/Rust/axum/src/database_sqlx.rs b/frameworks/Rust/axum/src/database_sqlx.rs deleted file mode 100644 index b156bb3a3b7..00000000000 --- a/frameworks/Rust/axum/src/database_sqlx.rs +++ /dev/null @@ -1,86 +0,0 @@ -use std::io; - -use axum::{ - async_trait, - extract::FromRequestParts, - http::{request::Parts, StatusCode}, -}; -use sqlx::{ - pool::PoolConnection, - postgres::{PgArguments, PgPoolOptions}, - Arguments, PgPool, Postgres, -}; - -use crate::{utils::internal_error, Fortune, World}; - -#[derive(Debug)] -pub enum PgError { - Io(io::Error), - Pg(sqlx::Error), -} - -impl From for PgError { - fn from(err: io::Error) -> Self { - PgError::Io(err) - } -} - -impl From for PgError { - fn from(err: sqlx::Error) -> Self { - PgError::Pg(err) - } -} - -pub async fn create_pool( - database_url: String, - max_pool_size: u32, - min_pool_size: u32, -) -> PgPool { - PgPoolOptions::new() - .max_connections(max_pool_size) - .min_connections(min_pool_size) - .connect(&database_url) - .await - .unwrap() -} - -pub struct DatabaseConnection(pub PoolConnection); - -#[async_trait] -impl FromRequestParts for DatabaseConnection { - type Rejection = (StatusCode, String); - - async fn from_request_parts( - _parts: &mut Parts, - pool: &PgPool, - ) -> Result { - let conn = pool.acquire().await.map_err(internal_error)?; - - Ok(Self(conn)) - } -} - -pub async fn fetch_world( - mut conn: PoolConnection, - number: i32, -) -> Result { - let mut args = PgArguments::default(); - args.add(number); - - let world: World = - sqlx::query_as_with("SELECT id, randomnumber FROM World WHERE id = $1", args) - .fetch_one(&mut *conn) - .await - .expect("error loading world"); - Ok(world) -} - -pub async fn fetch_fortunes( - mut conn: PoolConnection, -) -> Result, PgError> { - let fortunes: Vec = sqlx::query_as("SELECT * FROM Fortune") - .fetch_all(&mut *conn) - .await - .expect("error loading Fortunes"); - Ok(fortunes) -} diff --git a/frameworks/Rust/axum/src/main.rs b/frameworks/Rust/axum/src/main.rs index 075ee1c01e6..b29da958d20 100644 --- a/frameworks/Rust/axum/src/main.rs +++ b/frameworks/Rust/axum/src/main.rs @@ -1,21 +1,21 @@ -use axum::{ - http::{header, HeaderValue, StatusCode}, - response::IntoResponse, - routing::get, - Json, Router, -}; -use dotenv::dotenv; -use tower_http::set_header::SetResponseHeaderLayer; - -mod models_common; +mod common; mod server; -use self::models_common::Message; +use axum::{http::StatusCode, response::IntoResponse, routing::get, Router}; +use common::models::Message; +use dotenv::dotenv; + +#[cfg(not(feature = "simd-json"))] +use axum::Json; +#[cfg(feature = "simd-json")] +use common::simd_json::Json; -pub async fn plaintext() -> &'static str { - "Hello, World!" +/// Return a plaintext static string. +pub async fn plaintext() -> impl IntoResponse { + (StatusCode::OK, "Hello, World!") } +/// Return a JSON message. pub async fn json() -> impl IntoResponse { let message = Message { message: "Hello, World!", @@ -28,19 +28,9 @@ pub async fn json() -> impl IntoResponse { async fn main() { dotenv().ok(); - let server_header_value = HeaderValue::from_static("Axum"); - let app = Router::new() .route("/plaintext", get(plaintext)) - .route("/json", get(json)) - .layer(SetResponseHeaderLayer::if_not_present( - header::SERVER, - server_header_value, - )); - - server::builder() - .http1_pipeline_flush(true) - .serve(app.into_make_service()) - .await - .unwrap(); + .route("/json", get(json)); + + server::serve_hyper(app, Some(8000)).await } diff --git a/frameworks/Rust/axum/src/main_mongo.rs b/frameworks/Rust/axum/src/main_mongo.rs index 8219113f583..8f7ac7961c3 100644 --- a/frameworks/Rust/axum/src/main_mongo.rs +++ b/frameworks/Rust/axum/src/main_mongo.rs @@ -1,11 +1,20 @@ +mod common; +mod mongo; +//mod mongo_raw; + use std::time::Duration; use axum::{ - extract::Query, - http::{header, HeaderValue, StatusCode}, - response::IntoResponse, - routing::get, - Json, Router, + extract::Query, http::StatusCode, response::IntoResponse, routing::get, Router, +}; + +#[cfg(not(feature = "simd-json"))] +use axum::Json; +#[cfg(feature = "simd-json")] +use common::simd_json::Json; +use common::{ + models::{FortuneInfo, World}, + random_ids, }; use dotenv::dotenv; use mongodb::{ @@ -13,21 +22,16 @@ use mongodb::{ Client, }; use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; -use tower_http::set_header::SetResponseHeaderLayer; use yarte::Template; -mod database_mongo; -mod models_common; -mod models_mongo; mod server; -mod utils; - -use self::{ - database_mongo::{ - fetch_fortunes, find_world_by_id, find_worlds, update_worlds, DatabaseConnection, - }, - models_mongo::{Fortune, FortuneInfo, World}, - utils::{get_environment_variable, parse_params, Params, Utf8Html}, + +use common::{ + get_env, + utils::{parse_params, Params, Utf8Html}, +}; +use mongo::database::{ + fetch_fortunes, find_world_by_id, find_worlds, update_worlds, DatabaseConnection, }; #[derive(Template)] @@ -55,13 +59,7 @@ async fn queries( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let mut ids: Vec = Vec::with_capacity(q as usize); - - for _ in 0..q { - let random_id = (rng.gen::() % 10_000 + 1) as i32; - - ids.push(random_id); - } + let ids = random_ids(&mut rng, q); let worlds = find_worlds(db, ids).await; let results = worlds.expect("worlds could not be retrieved"); @@ -76,18 +74,12 @@ async fn updates( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let mut ids: Vec = Vec::with_capacity(q as usize); - - for _ in 0..q { - let random_id = (rng.gen::() % 10_000 + 1) as i32; - - ids.push(random_id); - } + let ids = random_ids(&mut rng, q); let worlds = find_worlds(db.clone(), ids) .await .expect("worlds could not be retrieved"); - let mut updated_worlds: Vec = Vec::with_capacity(q as usize); + let mut updated_worlds: Vec = Vec::with_capacity(q); for mut world in worlds { let random_number = (rng.gen::() % 10_000 + 1) as i32; @@ -144,9 +136,9 @@ fn main() { } async fn serve() { - let database_url: String = get_environment_variable("AXUM_TECHEMPOWER_MONGODB_URL"); - let max_pool_size: u32 = get_environment_variable("AXUM_TECHEMPOWER_MAX_POOL_SIZE"); - let min_pool_size: u32 = get_environment_variable("AXUM_TECHEMPOWER_MIN_POOL_SIZE"); + let database_url: String = get_env("MONGODB_URL"); + let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE"); + let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE"); let mut client_options = ClientOptions::parse(database_url).await.unwrap(); @@ -168,21 +160,13 @@ async fn serve() { let client = Client::with_options(client_options).unwrap(); let database = client.database("hello_world"); - let server_header_value = HeaderValue::from_static("Axum"); let app = Router::new() .route("/fortunes", get(fortunes)) .route("/db", get(db)) .route("/queries", get(queries)) .route("/updates", get(updates)) - .with_state(database) - .layer(SetResponseHeaderLayer::if_not_present( - header::SERVER, - server_header_value, - )); - - server::builder() - .serve(app.into_make_service()) - .await - .unwrap(); + .with_state(database); + + server::serve(app, Some(8000)).await } diff --git a/frameworks/Rust/axum/src/main_mongo_raw.rs b/frameworks/Rust/axum/src/main_mongo_raw.rs index 72db28af280..fdf09c179a3 100644 --- a/frameworks/Rust/axum/src/main_mongo_raw.rs +++ b/frameworks/Rust/axum/src/main_mongo_raw.rs @@ -1,38 +1,38 @@ +mod common; +mod mongo_raw; +mod server; + +use common::{models::World, random_id, random_ids}; +use mongo_raw::database::{ + find_world_by_id, find_worlds, update_worlds, DatabaseConnection, +}; + +use common::{ + get_env, + utils::{parse_params, Params}, +}; use std::time::Duration; use axum::{ - extract::Query, - http::{header, HeaderValue, StatusCode}, - response::IntoResponse, - routing::get, - Json, Router, + extract::Query, http::StatusCode, response::IntoResponse, routing::get, Router, }; + +#[cfg(not(feature = "simd-json"))] +use axum::Json; +#[cfg(feature = "simd-json")] +use common::simd_json::Json; + use dotenv::dotenv; use mongodb::{ options::{ClientOptions, Compressor}, Client, }; use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; -use tower_http::set_header::SetResponseHeaderLayer; - -mod database_mongo_raw; -mod models_common; -mod models_mongo; -mod server; -mod utils; - -use self::{ - database_mongo_raw::{ - find_world_by_id, find_worlds, update_worlds, DatabaseConnection, - }, - models_mongo::World, - utils::{get_environment_variable, parse_params, Params}, -}; async fn db(DatabaseConnection(db): DatabaseConnection) -> impl IntoResponse { let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let random_id = (rng.gen::() % 10_000 + 1) as i32; + let random_id = random_id(&mut rng); let world = find_world_by_id(db, random_id) .await @@ -48,13 +48,7 @@ async fn queries( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let mut ids: Vec = Vec::with_capacity(q as usize); - - for _ in 0..q { - let random_id = (rng.gen::() % 10_000 + 1) as i32; - - ids.push(random_id); - } + let ids = random_ids(&mut rng, q); let worlds = find_worlds(db, ids).await; let results = worlds.expect("worlds could not be retrieved"); @@ -69,18 +63,12 @@ async fn updates( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let mut ids: Vec = Vec::with_capacity(q as usize); - - for _ in 0..q { - let random_id = (rng.gen::() % 10_000 + 1) as i32; - - ids.push(random_id); - } + let ids = random_ids(&mut rng, q); let worlds = find_worlds(db.clone(), ids) .await .expect("worlds could not be retrieved"); - let mut updated_worlds: Vec = Vec::with_capacity(q as usize); + let mut updated_worlds: Vec = Vec::with_capacity(q); for mut world in worlds { let random_number = (rng.gen::() % 10_000 + 1) as i32; @@ -117,9 +105,9 @@ fn main() { } async fn serve() { - let database_url: String = get_environment_variable("AXUM_TECHEMPOWER_MONGODB_URL"); - let max_pool_size: u32 = get_environment_variable("AXUM_TECHEMPOWER_MAX_POOL_SIZE"); - let min_pool_size: u32 = get_environment_variable("AXUM_TECHEMPOWER_MIN_POOL_SIZE"); + let database_url: String = get_env("MONGODB_URL"); + let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE"); + let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE"); let mut client_options = ClientOptions::parse(database_url).await.unwrap(); @@ -141,20 +129,12 @@ async fn serve() { let client = Client::with_options(client_options).unwrap(); let database = client.database("hello_world"); - let server_header_value = HeaderValue::from_static("Axum"); let app = Router::new() .route("/db", get(db)) .route("/queries", get(queries)) .route("/updates", get(updates)) - .with_state(database) - .layer(SetResponseHeaderLayer::if_not_present( - header::SERVER, - server_header_value, - )); - - server::builder() - .serve(app.into_make_service()) - .await - .unwrap(); + .with_state(database); + + server::serve(app, Some(8000)).await } diff --git a/frameworks/Rust/axum/src/main_pg.rs b/frameworks/Rust/axum/src/main_pg.rs index 3b4748dfc39..20acb2a1769 100644 --- a/frameworks/Rust/axum/src/main_pg.rs +++ b/frameworks/Rust/axum/src/main_pg.rs @@ -1,25 +1,26 @@ +mod common; +mod pg; + use axum::{ - extract::Query, - http::{header, HeaderValue, StatusCode}, - response::IntoResponse, - routing::get, - Json, Router, + extract::Query, http::StatusCode, response::IntoResponse, routing::get, Router, }; use dotenv::dotenv; -use tower_http::set_header::SetResponseHeaderLayer; +use rand::{rngs::SmallRng, thread_rng, SeedableRng}; use yarte::Template; -mod database_pg; -mod models_common; -mod models_pg; +#[cfg(not(feature = "simd-json"))] +use axum::Json; +#[cfg(feature = "simd-json")] +use common::simd_json::Json; + mod server; -mod utils; -use self::{ - database_pg::{DatabaseConnection, PgConnection}, - models_pg::Fortune, - utils::{get_environment_variable, parse_params, Params, Utf8Html}, +use common::{ + get_env, random_id, + utils::{parse_params, Params, Utf8Html}, }; +use pg::database::{DatabaseConnection, PgConnection}; +use pg::models::Fortune; #[derive(Template)] #[template(path = "fortunes.html.hbs")] @@ -28,7 +29,12 @@ pub struct FortunesTemplate<'a> { } async fn db(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResponse { - let world = conn.get_world().await.expect("error loading world"); + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + + let world = conn + .fetch_world_by_id(random_id(&mut rng)) + .await + .expect("error loading world"); (StatusCode::OK, Json(world)) } @@ -40,7 +46,7 @@ async fn queries( let q = parse_params(params); let results = conn - .get_worlds(q as usize) + .fetch_random_worlds(q) .await .expect("error loading worlds"); @@ -48,8 +54,10 @@ async fn queries( } async fn fortunes(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResponse { - let fortunes: Vec = - conn.tell_fortune().await.expect("error loading fortunes"); + let fortunes: Vec = conn + .fetch_all_fortunes() + .await + .expect("error loading fortunes"); Utf8Html( FortunesTemplate { @@ -65,52 +73,26 @@ async fn updates( Query(params): Query, ) -> impl IntoResponse { let q = parse_params(params); + let worlds = conn.update_worlds(q).await.expect("error updating worlds"); - let results = conn.update(q as u16).await.expect("error updating worlds"); - - (StatusCode::OK, Json(results)) + (StatusCode::OK, Json(worlds)) } -fn main() { +#[tokio::main] +async fn main() { dotenv().ok(); - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - - for _ in 1..num_cpus::get() { - std::thread::spawn(move || { - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - rt.block_on(serve()); - }); - } - rt.block_on(serve()); -} - -async fn serve() { - let database_url: String = get_environment_variable("AXUM_TECHEMPOWER_DATABASE_URL"); + let database_url: String = get_env("POSTGRES_URL"); - // setup connection pool + // Create shared database connection let pg_connection = PgConnection::connect(database_url).await; - let server_header_value = HeaderValue::from_static("Axum"); - let router = Router::new() + let app = Router::new() .route("/fortunes", get(fortunes)) .route("/db", get(db)) .route("/queries", get(queries)) .route("/updates", get(updates)) - .with_state(pg_connection) - .layer(SetResponseHeaderLayer::if_not_present( - header::SERVER, - server_header_value, - )); - - server::builder() - .serve(router.into_make_service()) - .await - .unwrap(); + .with_state(pg_connection); + + server::serve_hyper(app, Some(8000)).await } diff --git a/frameworks/Rust/axum/src/main_pg_pool.rs b/frameworks/Rust/axum/src/main_pg_pool.rs index 4c767b4a06c..d4b7754cba8 100644 --- a/frameworks/Rust/axum/src/main_pg_pool.rs +++ b/frameworks/Rust/axum/src/main_pg_pool.rs @@ -1,31 +1,31 @@ +mod common; +mod pg_pool; + use axum::{ - extract::Query, - http::{header, HeaderValue, StatusCode}, - response::IntoResponse, - routing::get, - Json, Router, + extract::Query, http::StatusCode, response::IntoResponse, routing::get, Router, }; + +#[cfg(not(feature = "simd-json"))] +use axum::Json; +#[cfg(feature = "simd-json")] +use common::simd_json::Json; + +use common::{random_ids, SELECT_ALL_FORTUNES, SELECT_WORLD_BY_ID, UPDATE_WORLDS}; use dotenv::dotenv; use futures_util::{stream::FuturesUnordered, TryStreamExt}; -use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; -use tower_http::set_header::SetResponseHeaderLayer; +use rand::{rngs::SmallRng, thread_rng, SeedableRng}; use yarte::Template; -mod database_pg_pool; -mod models_common; -mod models_pg_pool; mod server; -mod utils; - -use self::{ - database_pg_pool::{ - create_pool, fetch_all_fortunes, fetch_world_by_id, - prepare_fetch_all_fortunes_statement, prepare_fetch_world_by_id_statement, - prepare_update_world_by_id_statement, update_world, DatabaseClient, PgError, - }, - models_pg_pool::{Fortune, World}, - utils::{get_environment_variable, parse_params, random_number, Params, Utf8Html}, + +use common::{ + get_env, random_id, + utils::{parse_params, Params, Utf8Html}, }; +use pg_pool::database::{ + create_pool, fetch_all_fortunes, fetch_world_by_id, DatabaseClient, PgError, +}; +use pg_pool::models::{Fortune, World}; #[derive(Template)] #[template(path = "fortunes.html.hbs")] @@ -35,11 +35,10 @@ pub struct FortunesTemplate<'a> { async fn db(DatabaseClient(client): DatabaseClient) -> impl IntoResponse { let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let random_id = random_id(&mut rng); - let random_id = (rng.gen::() % 10_000 + 1) as i32; - - let select = prepare_fetch_world_by_id_statement(&client).await; - let world = fetch_world_by_id(&client, random_id, &select) + let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + let world = fetch_world_by_id(&client, random_id, select) .await .expect("could not fetch world"); @@ -53,15 +52,11 @@ async fn queries( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - - let select = prepare_fetch_world_by_id_statement(&client).await; - + let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); let future_worlds = FuturesUnordered::new(); - for _ in 0..q { - let w_id = (rng.gen::() % 10_000 + 1) as i32; - - future_worlds.push(fetch_world_by_id(&client, w_id, &select)); + for id in random_ids(&mut rng, q) { + future_worlds.push(fetch_world_by_id(&client, id, select)); } let worlds: Result, PgError> = future_worlds.try_collect().await; @@ -71,9 +66,9 @@ async fn queries( } async fn fortunes(DatabaseClient(client): DatabaseClient) -> impl IntoResponse { - let select = prepare_fetch_all_fortunes_statement(&client).await; + let select = &client.prepare_cached(SELECT_ALL_FORTUNES).await.unwrap(); - let mut fortunes = fetch_all_fortunes(client, &select) + let mut fortunes = fetch_all_fortunes(client, select) .await .expect("could not fetch fortunes"); @@ -100,66 +95,49 @@ async fn updates( let q = parse_params(params); let mut rng = SmallRng::from_entropy(); + let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + let update = &client.prepare_cached(UPDATE_WORLDS).await.unwrap(); - let select = prepare_fetch_world_by_id_statement(&client).await; - + // Select the random worlds. let future_worlds = FuturesUnordered::new(); - - for _ in 0..q { - let query_id = random_number(&mut rng); - - future_worlds.push(fetch_world_by_id(&client, query_id, &select)); + for id in random_ids(&mut rng, q) { + future_worlds.push(fetch_world_by_id(&client, id, select)); } - - let worlds: Result, PgError> = future_worlds.try_collect().await; - let results = worlds.expect("worlds could not be retrieved"); - - let update = prepare_update_world_by_id_statement(&client).await; - - let future_world_updates = FuturesUnordered::new(); - - for w in &results { - let random_id = random_number(&mut rng); - let w_id = w.id; - - future_world_updates.push(update_world(&client, &update, random_id, w_id)); - } - - let world_updates: Result, PgError> = - future_world_updates.try_collect().await; - world_updates.expect("updates could not be executed"); - - (StatusCode::OK, Json(results)) + let worlds: Vec = future_worlds.try_collect().await.unwrap(); + + let mut ids = Vec::with_capacity(q); + let mut nids = Vec::with_capacity(q); + let worlds: Vec = worlds + .into_iter() + .map(|mut w| { + w.randomnumber = random_id(&mut rng); + ids.push(w.id); + nids.push(w.randomnumber); + w + }) + .collect(); + + // Update the random worlds in the database. + client.execute(update, &[&ids, &nids]).await.unwrap(); + + (StatusCode::OK, Json(worlds)) } #[tokio::main] async fn main() { dotenv().ok(); - serve().await; -} - -async fn serve() { - let database_url: String = get_environment_variable("AXUM_TECHEMPOWER_DATABASE_URL"); - let max_pool_size: u32 = get_environment_variable("AXUM_TECHEMPOWER_MAX_POOL_SIZE"); + let database_url: String = get_env("POSTGRES_URL"); + let max_pool_size: u32 = get_env("POSTGRES_MAX_POOL_SIZE"); - // setup Client pool let pool = create_pool(database_url, max_pool_size).await; - let server_header_value = HeaderValue::from_static("Axum"); - let router = Router::new() + let app = Router::new() .route("/fortunes", get(fortunes)) .route("/db", get(db)) .route("/queries", get(queries)) .route("/updates", get(updates)) - .with_state(pool) - .layer(SetResponseHeaderLayer::if_not_present( - header::SERVER, - server_header_value, - )); - - server::builder() - .serve(router.into_make_service()) - .await - .unwrap(); + .with_state(pool); + + server::serve_hyper(app, Some(8000)).await } diff --git a/frameworks/Rust/axum/src/main_sqlx.rs b/frameworks/Rust/axum/src/main_sqlx.rs index c773233fcfa..d10b1ea99ef 100644 --- a/frameworks/Rust/axum/src/main_sqlx.rs +++ b/frameworks/Rust/axum/src/main_sqlx.rs @@ -1,27 +1,35 @@ +mod common; +mod sqlx; + +use std::sync::Arc; + +use ::sqlx::PgPool; use axum::{ - http::{header, HeaderValue, StatusCode}, + extract::{Query, State}, + http::StatusCode, response::IntoResponse, routing::get, - Json, Router, + Router, }; use dotenv::dotenv; -use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; -use sqlx::PgPool; -use tower_http::set_header::SetResponseHeaderLayer; +use moka::future::Cache; +use rand::{rngs::SmallRng, thread_rng, SeedableRng}; +use sqlx::models::World; use yarte::Template; -mod database_sqlx; -mod models_common; -mod models_sqlx; +#[cfg(not(feature = "simd-json"))] +use axum::Json; +#[cfg(feature = "simd-json")] +use common::simd_json::Json; + mod server; -mod utils; -use self::{ - database_sqlx::{create_pool, fetch_fortunes, fetch_world, DatabaseConnection}, - models_sqlx::{Fortune, World}, - utils::get_environment_variable, - utils::Utf8Html, +use common::{ + get_env, random_id, random_ids, + utils::{parse_params, Params, Utf8Html}, }; +use sqlx::database::create_pool; +use sqlx::models::Fortune; #[derive(Template)] #[template(path = "fortunes.html.hbs")] @@ -29,22 +37,44 @@ pub struct FortunesTemplate<'a> { pub fortunes: &'a Vec, } -async fn db(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResponse { +async fn db(State(AppState { db, .. }): State) -> impl IntoResponse { let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let random_id = (rng.gen::() % 10_000 + 1) as i32; - - let world = fetch_world(conn, random_id) + let world: World = ::sqlx::query_as(common::SELECT_WORLD_BY_ID) + .bind(random_id(&mut rng)) + .fetch_one(&mut *db.acquire().await.unwrap()) .await - .expect("could not fetch world"); + .expect("error loading world"); (StatusCode::OK, Json(world)) } -async fn fortunes(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResponse { - let mut fortunes = fetch_fortunes(conn) +async fn queries( + State(AppState { db, .. }): State, + Query(params): Query, +) -> impl IntoResponse { + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let count = parse_params(params); + let ids = random_ids(&mut rng, count); + let mut worlds: Vec = Vec::with_capacity(count); + + for id in ids { + let world: World = ::sqlx::query_as(common::SELECT_WORLD_BY_ID) + .bind(id) + .fetch_one(&mut *db.acquire().await.unwrap()) + .await + .expect("error loading world"); + worlds.push(world); + } + + (StatusCode::OK, Json(worlds)) +} + +async fn fortunes(State(AppState { db, .. }): State) -> impl IntoResponse { + let mut fortunes: Vec = ::sqlx::query_as(common::SELECT_ALL_FORTUNES) + .fetch_all(&mut *db.acquire().await.unwrap()) .await - .expect("could not fetch fortunes"); + .expect("error loading Fortunes"); fortunes.push(Fortune { id: 0, @@ -62,34 +92,61 @@ async fn fortunes(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResp ) } -#[tokio::main] -async fn main() { - dotenv().ok(); - - let database_url: String = get_environment_variable("AXUM_TECHEMPOWER_DATABASE_URL"); - let max_pool_size: u32 = get_environment_variable("AXUM_TECHEMPOWER_MAX_POOL_SIZE"); - let min_pool_size: u32 = get_environment_variable("AXUM_TECHEMPOWER_MIN_POOL_SIZE"); +async fn cache( + State(AppState { cache, .. }): State, + Query(params): Query, +) -> impl IntoResponse { + let count = parse_params(params); + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut worlds: Vec>> = Vec::with_capacity(count); - // setup connection pool - let pool = create_pool(database_url, max_pool_size, min_pool_size).await; + for id in random_ids(&mut rng, count) { + worlds.push(cache.get(&id).await); + } - let app = router(pool).await; + (StatusCode::OK, Json(worlds)) +} - server::builder() - .serve(app.into_make_service()) +/// Pre-load the cache with all worlds. +async fn preload_cache(AppState { db, cache }: &AppState) { + let worlds: Vec = ::sqlx::query_as(common::SELECT_ALL_CACHED_WORLDS) + .fetch_all(&mut *db.acquire().await.unwrap()) .await - .unwrap(); + .expect("error loading worlds"); + + for world in worlds { + cache.insert(world.id, Arc::new(world)).await; + } } -async fn router(pool: PgPool) -> Router { - let server_header_value = HeaderValue::from_static("Axum"); +#[derive(Clone)] +struct AppState { + db: PgPool, + cache: Cache>, +} - Router::new() +#[tokio::main] +async fn main() { + dotenv().ok(); + + let database_url: String = get_env("POSTGRES_URL"); + let max_pool_size: u32 = get_env("POSTGRES_MAX_POOL_SIZE"); + let min_pool_size: u32 = get_env("POSTGRES_MIN_POOL_SIZE"); + + let state = AppState { + db: create_pool(database_url, max_pool_size, min_pool_size).await, + cache: Cache::new(10000), + }; + + // Prime the cache with CachedWorld objects + preload_cache(&state).await; + + let app = Router::new() .route("/fortunes", get(fortunes)) .route("/db", get(db)) - .with_state(pool) - .layer(SetResponseHeaderLayer::if_not_present( - header::SERVER, - server_header_value, - )) + .route("/queries", get(queries)) + .route("/cached-queries", get(cache)) + .with_state(state); + + server::serve_hyper(app, Some(8000)).await } diff --git a/frameworks/Rust/axum/src/models_common.rs b/frameworks/Rust/axum/src/models_common.rs deleted file mode 100644 index 9aed68955a4..00000000000 --- a/frameworks/Rust/axum/src/models_common.rs +++ /dev/null @@ -1,6 +0,0 @@ -use serde::Serialize; - -#[derive(Serialize)] -pub struct Message { - pub message: &'static str, -} diff --git a/frameworks/Rust/axum/src/database_mongo.rs b/frameworks/Rust/axum/src/mongo/database.rs similarity index 97% rename from frameworks/Rust/axum/src/database_mongo.rs rename to frameworks/Rust/axum/src/mongo/database.rs index dcb9b1bebb9..28c55d25c01 100644 --- a/frameworks/Rust/axum/src/database_mongo.rs +++ b/frameworks/Rust/axum/src/mongo/database.rs @@ -4,7 +4,7 @@ use axum::{async_trait, extract::FromRequestParts, http::request::Parts}; use futures_util::{stream::FuturesUnordered, StreamExt, TryStreamExt}; use mongodb::{bson::doc, Database}; -use crate::{Fortune, World}; +use crate::common::models::{Fortune, World}; pub struct DatabaseConnection(pub Database); @@ -21,6 +21,7 @@ impl FromRequestParts for DatabaseConnection { } #[derive(Debug)] +#[allow(dead_code)] pub enum MongoError { Io(io::Error), Mongo(mongodb::error::Error), diff --git a/frameworks/Rust/axum/src/mongo/mod.rs b/frameworks/Rust/axum/src/mongo/mod.rs new file mode 100644 index 00000000000..8fd0a6be869 --- /dev/null +++ b/frameworks/Rust/axum/src/mongo/mod.rs @@ -0,0 +1 @@ +pub mod database; diff --git a/frameworks/Rust/axum/src/database_mongo_raw.rs b/frameworks/Rust/axum/src/mongo_raw/database.rs similarity index 97% rename from frameworks/Rust/axum/src/database_mongo_raw.rs rename to frameworks/Rust/axum/src/mongo_raw/database.rs index 2fa02c07ec4..638c590c9fa 100644 --- a/frameworks/Rust/axum/src/database_mongo_raw.rs +++ b/frameworks/Rust/axum/src/mongo_raw/database.rs @@ -7,7 +7,7 @@ use mongodb::{ Database, }; -use crate::World; +use crate::common::models::World; pub struct DatabaseConnection(pub Database); @@ -24,6 +24,7 @@ impl FromRequestParts for DatabaseConnection { } #[derive(Debug)] +#[allow(dead_code)] pub enum MongoError { Io(io::Error), Mongo(mongodb::error::Error), diff --git a/frameworks/Rust/axum/src/mongo_raw/mod.rs b/frameworks/Rust/axum/src/mongo_raw/mod.rs new file mode 100644 index 00000000000..8fd0a6be869 --- /dev/null +++ b/frameworks/Rust/axum/src/mongo_raw/mod.rs @@ -0,0 +1 @@ +pub mod database; diff --git a/frameworks/Rust/axum/src/pg/database.rs b/frameworks/Rust/axum/src/pg/database.rs new file mode 100644 index 00000000000..bc78b2ba5c8 --- /dev/null +++ b/frameworks/Rust/axum/src/pg/database.rs @@ -0,0 +1,155 @@ +use std::{convert::Infallible, io, sync::Arc}; + +use axum::{async_trait, extract::FromRequestParts, http::request::Parts}; +use futures::{stream::futures_unordered::FuturesUnordered, StreamExt, TryStreamExt}; +use rand::{rngs::SmallRng, thread_rng, SeedableRng}; +use tokio::pin; +use tokio_postgres::{connect, Client, NoTls, Statement}; + +use crate::common::{self, random_id, random_ids}; + +use super::models::{Fortune, World}; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum PgError { + Io(io::Error), + Pg(tokio_postgres::Error), +} + +impl From for PgError { + fn from(err: io::Error) -> Self { + PgError::Io(err) + } +} + +impl From for PgError { + fn from(err: tokio_postgres::Error) -> Self { + PgError::Pg(err) + } +} + +/// Postgres interface +pub struct PgConnection { + client: Client, + fortune: Statement, + world: Statement, + updates: Statement, +} + +impl PgConnection { + pub async fn connect(db_url: String) -> Arc { + let (cl, conn) = connect(&db_url, NoTls) + .await + .expect("cannot connect to postgresql."); + + // Spawn connection + tokio::spawn(async move { + if let Err(error) = conn.await { + eprintln!("database connection error: {error}"); + } + }); + + // Prepare statements for the connection. + let fortune = cl.prepare(common::SELECT_ALL_FORTUNES).await.unwrap(); + let world = cl.prepare(common::SELECT_WORLD_BY_ID).await.unwrap(); + let updates = cl.prepare(common::UPDATE_WORLDS).await.unwrap(); + + Arc::new(PgConnection { + client: cl, + fortune, + world, + updates, + }) + } +} + +impl PgConnection { + pub async fn fetch_world_by_id(&self, id: i32) -> Result { + self.client + .query_one(&self.world, &[&id]) + .await + .map(|row| { + Ok(World { + id: row.get(0), + randomnumber: row.get(1), + }) + })? + } + + pub async fn fetch_random_worlds(&self, num: usize) -> Result, PgError> { + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + + let futures = FuturesUnordered::new(); + + for id in random_ids(&mut rng, num) { + futures.push(self.fetch_world_by_id(id)); + } + + futures.try_collect().await + } + + pub async fn update_worlds(&self, num: usize) -> Result, PgError> { + let worlds = self.fetch_random_worlds(num).await?; + + // Update the worlds with new random numbers + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut ids = Vec::with_capacity(num); + let mut nids = Vec::with_capacity(num); + let worlds: Vec = worlds + .into_iter() + .map(|mut w| { + w.randomnumber = random_id(&mut rng); + ids.push(w.id); + nids.push(w.randomnumber); + w + }) + .collect(); + + // Update the random worlds in the database. + self.client + .execute(&self.updates, &[&ids, &nids]) + .await + .unwrap(); + + Ok(worlds) + } + + pub async fn fetch_all_fortunes(&self) -> Result, PgError> { + let mut fortunes = vec![Fortune { + id: 0, + message: "Additional fortune added at request time.".parse().unwrap(), + }]; + + let rows = self + .client + .query_raw::<_, _, &[i32; 0]>(&self.fortune, &[]) + .await?; + + pin!(rows); + + while let Some(row) = rows.next().await.transpose()? { + fortunes.push(Fortune { + id: row.get(0), + message: row.get(1), + }); + } + + fortunes.sort_by(|it, next| it.message.cmp(&next.message)); + Ok(fortunes) + } +} + +pub struct DatabaseConnection(pub Arc); + +#[async_trait] +impl FromRequestParts> for DatabaseConnection { + type Rejection = Infallible; + + async fn from_request_parts( + _parts: &mut Parts, + pg_connection: &Arc, + ) -> Result { + Ok(Self(pg_connection.clone())) + } +} diff --git a/frameworks/Rust/axum/src/pg/mod.rs b/frameworks/Rust/axum/src/pg/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/axum/src/pg/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/axum/src/models_pg.rs b/frameworks/Rust/axum/src/pg/models.rs similarity index 100% rename from frameworks/Rust/axum/src/models_pg.rs rename to frameworks/Rust/axum/src/pg/models.rs diff --git a/frameworks/Rust/axum/src/database_pg_pool.rs b/frameworks/Rust/axum/src/pg_pool/database.rs similarity index 60% rename from frameworks/Rust/axum/src/database_pg_pool.rs rename to frameworks/Rust/axum/src/pg_pool/database.rs index f86c002845a..e1a43f34f23 100644 --- a/frameworks/Rust/axum/src/database_pg_pool.rs +++ b/frameworks/Rust/axum/src/pg_pool/database.rs @@ -1,17 +1,22 @@ use std::io; +use crate::{ + common::utils::internal_error, + pg_pool::models::{Fortune, World}, +}; use axum::{ async_trait, extract::FromRequestParts, http::{request::Parts, StatusCode}, }; use deadpool_postgres::{Client, Manager, ManagerConfig, RecyclingMethod}; +use futures_util::StreamExt; +use tokio::pin; use tokio_pg_mapper::FromTokioPostgresRow; use tokio_postgres::{NoTls, Row, Statement}; -use crate::{utils::internal_error, Fortune, World}; - #[derive(Debug)] +#[allow(dead_code)] pub enum PgError { Io(io::Error), Pg(tokio_postgres::Error), @@ -66,57 +71,26 @@ impl FromRequestParts for DatabaseClient { pub async fn fetch_world_by_id( client: &Client, - number: i32, + id: i32, select: &Statement, ) -> Result { - let row: Row = client.query_one(select, &[&number]).await.unwrap(); + let row: Row = client.query_one(select, &[&id]).await.unwrap(); Ok(World::from_row(row).unwrap()) } -pub async fn update_world( - client: &Client, - update: &Statement, - random_id: i32, - w_id: i32, -) -> Result { - let rows_modified: u64 = client.execute(update, &[&random_id, &w_id]).await.unwrap(); - - Ok(rows_modified) -} - pub async fn fetch_all_fortunes( client: Client, select: &Statement, ) -> Result, PgError> { - let rows: Vec = client.query(select, &[]).await.unwrap(); - - let mut fortunes: Vec = Vec::with_capacity(rows.capacity()); + let mut fortunes: Vec = Vec::new(); + let rows = client.query_raw::<_, _, &[i32; 0]>(select, &[]).await?; + pin!(rows); - for row in rows { - fortunes.push(Fortune::from_row(row).unwrap()); + while let Some(row) = rows.next().await.transpose()? { + fortunes + .push(Fortune::from_row(row).expect("could not convert row to fortune.")); } Ok(fortunes) } - -pub async fn prepare_fetch_all_fortunes_statement(client: &Client) -> Statement { - client - .prepare_cached("SELECT * FROM Fortune") - .await - .unwrap() -} - -pub async fn prepare_fetch_world_by_id_statement(client: &Client) -> Statement { - client - .prepare_cached("SELECT id, randomnumber FROM World WHERE id = $1") - .await - .unwrap() -} - -pub async fn prepare_update_world_by_id_statement(client: &Client) -> Statement { - client - .prepare_cached("UPDATE World SET randomnumber = $1 WHERE id = $2") - .await - .unwrap() -} diff --git a/frameworks/Rust/axum/src/pg_pool/mod.rs b/frameworks/Rust/axum/src/pg_pool/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/axum/src/pg_pool/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/axum/src/models_pg_pool.rs b/frameworks/Rust/axum/src/pg_pool/models.rs similarity index 100% rename from frameworks/Rust/axum/src/models_pg_pool.rs rename to frameworks/Rust/axum/src/pg_pool/models.rs diff --git a/frameworks/Rust/axum/src/server.rs b/frameworks/Rust/axum/src/server.rs index 29e165f6f5c..5e03a6aca88 100644 --- a/frameworks/Rust/axum/src/server.rs +++ b/frameworks/Rust/axum/src/server.rs @@ -1,37 +1,106 @@ use std::{ io, - net::{Ipv4Addr, SocketAddr}, + net::{Ipv4Addr, SocketAddr, TcpListener}, }; -use hyper::server::conn::AddrIncoming; -use tokio::net::{TcpListener, TcpSocket}; - -pub fn builder() -> hyper::server::Builder { - let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 8000)); - let listener = reuse_listener(addr).expect("couldn't bind to addr"); - let incoming = AddrIncoming::from_listener(listener).unwrap(); +use axum::{ + http::{header, HeaderValue}, + Router, +}; - println!("Started axum server at 8000"); +use hyper::body::Incoming; +use hyper::Request; +use hyper_util::rt::{TokioExecutor, TokioIo}; +use tower::Service; +use tower_http::set_header::SetResponseHeaderLayer; - axum::Server::builder(incoming) - .http1_only(true) - .tcp_nodelay(true) -} +use socket2::{Domain, Socket, Type}; -fn reuse_listener(addr: SocketAddr) -> io::Result { +/// Reuse an existing listener, ensuring that the socket `backlog`` +/// is set to enable a higher number of pending connections. +fn set_socket_options(addr: SocketAddr) -> io::Result { let socket = match addr { - SocketAddr::V4(_) => TcpSocket::new_v4()?, - SocketAddr::V6(_) => TcpSocket::new_v6()?, + SocketAddr::V4(_) => Socket::new(Domain::IPV4, Type::STREAM, None)?, + SocketAddr::V6(_) => Socket::new(Domain::IPV6, Type::STREAM, None)?, }; - #[cfg(unix)] - { - if let Err(e) = socket.set_reuseport(true) { - eprintln!("error setting SO_REUSEPORT: {e}"); - } - } + socket.set_reuse_port(true)?; + socket.set_reuse_address(true)?; + socket.set_nonblocking(true)?; + socket.set_nodelay(true)?; + socket.bind(&addr.into())?; + socket.listen(4096)?; + + let listener: TcpListener = socket.into(); + tokio::net::TcpListener::from_std(listener) +} + +/// Build an Axum server with consistent configuration, using the high-level API exposed +/// by Axum 0.7. This is intended for convenience and intentionally does not provide much +/// customisability. +#[allow(dead_code)] +pub async fn serve(app: Router<()>, port: Option) { + let port = port.unwrap_or(8000); + let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, port)); + let listener = set_socket_options(addr).expect("couldn't bind to address"); + println!("started axum server on port {port}."); + + let server_header_value = HeaderValue::from_static("Axum"); + let app = app.layer(SetResponseHeaderLayer::overriding( + header::SERVER, + server_header_value, + )); - socket.set_reuseaddr(true)?; - socket.bind(addr)?; - socket.listen(1024) + axum::serve(listener, app.into_make_service()) + .await + .unwrap(); +} + +/// Build an Axum server using the lower-level Hyper APIs for more +/// configurability. This has a few optimisations, including: +/// * Serving HTTP/1 only. +/// * Disabling connection upgrades (websockets are not needed). +/// * Setting TCP_NODELAY on the input stream. +/// * Aggregating flushes to better support pipelined responses. +/// +/// See for more details: +/// * https://github.com/tokio-rs/axum/blob/1ac617a1b540e8523347f5ee889d65cad9a45ec4/examples/serve-with-hyper/src/main.rs +#[allow(dead_code)] +pub async fn serve_hyper(app: Router<()>, port: Option) { + let port = port.unwrap_or(8000); + let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, port)); + let listener = set_socket_options(addr).expect("couldn't bind to address"); + println!("started axum server on port {port}."); + + let server_header_value = HeaderValue::from_static("Axum"); + let app = app.layer(SetResponseHeaderLayer::overriding( + header::SERVER, + server_header_value, + )); + + // Continuously accept new connections. + loop { + let (socket, _remote_addr) = listener.accept().await.unwrap(); + socket + .set_nodelay(true) + .expect("could not set TCP_NODELAY!"); + + let tower_service = app.clone(); + tokio::spawn(async move { + let socket = TokioIo::new(socket); + + let hyper_service = + hyper::service::service_fn(move |request: Request| { + tower_service.clone().call(request) + }); + + if (hyper_util::server::conn::auto::Builder::new(TokioExecutor::new()) + .http1() + .pipeline_flush(true) + .serve_connection(socket, hyper_service) + .await) + .is_err() + {} + }); + } } diff --git a/frameworks/Rust/axum/src/sqlx/database.rs b/frameworks/Rust/axum/src/sqlx/database.rs new file mode 100644 index 00000000000..1d824144696 --- /dev/null +++ b/frameworks/Rust/axum/src/sqlx/database.rs @@ -0,0 +1,36 @@ +use std::io; + +use sqlx::{postgres::PgPoolOptions, PgPool}; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum PgError { + Io(io::Error), + Pg(sqlx::Error), +} + +impl From for PgError { + fn from(err: io::Error) -> Self { + PgError::Io(err) + } +} + +impl From for PgError { + fn from(err: sqlx::Error) -> Self { + PgError::Pg(err) + } +} + +pub async fn create_pool( + database_url: String, + max_pool_size: u32, + min_pool_size: u32, +) -> PgPool { + PgPoolOptions::new() + .max_connections(max_pool_size) + .min_connections(min_pool_size) + .test_before_acquire(false) + .connect(&database_url) + .await + .unwrap() +} diff --git a/frameworks/Rust/axum/src/sqlx/mod.rs b/frameworks/Rust/axum/src/sqlx/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/axum/src/sqlx/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/axum/src/models_sqlx.rs b/frameworks/Rust/axum/src/sqlx/models.rs similarity index 100% rename from frameworks/Rust/axum/src/models_sqlx.rs rename to frameworks/Rust/axum/src/sqlx/models.rs From a05b90e347cd3b8b29f1331c198e133b8600477d Mon Sep 17 00:00:00 2001 From: Ishtmeet Singh Date: Wed, 4 Sep 2024 01:22:48 +0530 Subject: [PATCH 0784/1766] Bumps version (#9241) --- frameworks/JavaScript/velocy/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/velocy/package.json b/frameworks/JavaScript/velocy/package.json index a51441b5c26..320f6058e7a 100644 --- a/frameworks/JavaScript/velocy/package.json +++ b/frameworks/JavaScript/velocy/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "velocy": "0.0.13" + "velocy": "0.0.14" } } From 902efb7223f1243beada2f4d2d9bfcd4d6e9bd04 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Wed, 4 Sep 2024 03:53:11 +0800 Subject: [PATCH 0785/1766] [xitca-web] bug fix (#9243) * [xitca-web] bug fix * dep update. * template fix --- frameworks/Rust/xitca-web/Cargo.lock | 58 +++++++++---------- frameworks/Rust/xitca-web/Cargo.toml | 18 +++--- frameworks/Rust/xitca-web/src/db.rs | 4 +- .../Rust/xitca-web/templates/fortune.stpl | 2 +- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 01bd80ec5e3..1f1f0e18a74 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -149,9 +149,9 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.1.13" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ "shlex", ] @@ -218,9 +218,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf97ee7261bb708fa3402fa9c17a54b70e90e3cb98afb3dc8999d5512cb03f94" +checksum = "65e13bab2796f412722112327f3e575601a3e9cdcbe426f0d30dbf43f3f5dc71" dependencies = [ "bitflags 2.6.0", "byteorder", @@ -232,9 +232,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ff2be1e7312c858b2ef974f5c7089833ae57b5311b334b30923af58e5718d8" +checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", @@ -291,9 +291,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "filetime" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf401df4a4e3872c4fe8151134cf483738e74b67fc934d6532c882b3d24a4550" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", @@ -589,9 +589,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -721,9 +721,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -798,9 +798,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sailfish" -version = "0.8.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd5f4680149b62b3478f6af08a8f1c37794bc1bc577e28874a4d0c70084d600" +checksum = "d4d5cd6d4f24f3ab107e949ab424738cf55b03deddce3b184c46985d7b1394ef" dependencies = [ "itoap", "ryu", @@ -810,9 +810,9 @@ dependencies = [ [[package]] name = "sailfish-compiler" -version = "0.8.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67087aca4a3886686a88cee6835089c53e6143a0b8c5be01e63e4fe2f6dfe7cb" +checksum = "7254ec7b3651f7f723a9073153f5dcddc1f2bf1bf8d1b23ac71c236ef6360d2b" dependencies = [ "filetime", "home", @@ -824,9 +824,9 @@ dependencies = [ [[package]] name = "sailfish-macros" -version = "0.8.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47e31910c5f9230e99992568d05a5968fe4f42a635c3f912c993e9f66a619a5" +checksum = "00812289fe1891c191cc2d9db461352fc410619e07ec2bb748faaa06412619d0" dependencies = [ "proc-macro2", "sailfish-compiler", @@ -849,18 +849,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", @@ -869,9 +869,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", "memchr", @@ -987,9 +987,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.75" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -1025,9 +1025,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "libc", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=f4e7bed#f4e7bedfb441897d1f26a6e4d8cbfada23953269" +source = "git+https://github.com/HFQR/xitca-web.git?rev=6870448#687044829f0e89bab3efafcf7fb53e53167ad32c" dependencies = [ "fallible-iterator", "percent-encoding", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index e4614eb0bab..84eb12264b3 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -30,25 +30,25 @@ required-features = ["pg-orm", "template", "web-codegen"] [features] # pg optional -pg = ["xitca-postgres/single-thread"] +pg = ["dep:xitca-postgres"] # pg send/sync optional -pg-sync = ["xitca-postgres"] +pg-sync = ["dep:xitca-postgres"] # pg orm optional -pg-orm = ["diesel"] +pg-orm = ["dep:diesel"] # http router optional router = ["xitca-http/router"] # web optional -web = ["xitca-web"] +web = ["dep:xitca-web"] # web codegen optional web-codegen = ["xitca-web/codegen", "xitca-web/urlencoded"] # template optional -template = ["sailfish"] +template = ["dep:sailfish"] # io-uring optional io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"] # axum optional -axum = ["dep:axum", "http-body", "tower", "tower-http", "xitca-web/tower-http-compat" ] +axum = ["dep:axum", "dep:http-body", "dep:tower", "dep:tower-http", "xitca-web/tower-http-compat" ] # unrealistic performance optimization -perf = ["mimalloc", "tokio/parking_lot"] +perf = ["dep:mimalloc", "tokio/parking_lot"] [dependencies] xitca-http = "0.6" @@ -71,7 +71,7 @@ xitca-postgres = { version = "0.1", optional = true } diesel = { version = "2", features = ["postgres", "r2d2"], optional = true } # template optional -sailfish = { version = "0.8", default-features = false, features = ["derive", "perf-inline"], optional = true } +sailfish = { version = "0.9", default-features = false, features = ["derive", "perf-inline"], optional = true } # axum optional axum = { version = "0.7", optional = true, default-features = false, features = ["json", "query"] } @@ -95,5 +95,5 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "f4e7bed" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "6870448" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index aa783e29dce..276eb93ec9e 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -100,7 +100,7 @@ impl Client { let mut res = { let (ref mut rng, ref mut buf) = *self.shared(); - let mut pipe = Pipeline::<_, false>::with_capacity_from_buf(len, buf); + let mut pipe = Pipeline::with_capacity_from_buf(len, buf); (0..num).try_for_each(|_| pipe.query_raw(&self.world, [rng.gen_id()]))?; @@ -128,7 +128,7 @@ impl Client { let mut res = { let (ref mut rng, ref mut buf) = *self.shared(); - let mut pipe = Pipeline::<_, false>::with_capacity_from_buf(len + 1, buf); + let mut pipe = Pipeline::with_capacity_from_buf(len + 1, buf); (0..num).try_for_each(|_| { let w_id = rng.gen_id(); diff --git a/frameworks/Rust/xitca-web/templates/fortune.stpl b/frameworks/Rust/xitca-web/templates/fortune.stpl index eb1abe6a4fa..28227945b4c 100644 --- a/frameworks/Rust/xitca-web/templates/fortune.stpl +++ b/frameworks/Rust/xitca-web/templates/fortune.stpl @@ -4,7 +4,7 @@ - <% for item in items { %><% } %> + <% for item in self.items { %><% } %>
    idmessage
    <%= item.id %><%= &*item.message %>
    <%= item.id %><%= &*item.message %>
    \ No newline at end of file From d62e690f2a9109f3dd8465704eafd35f933fc4b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Wed, 4 Sep 2024 03:53:44 +0800 Subject: [PATCH 0786/1766] Update Solon Jdk To 21 (#9245) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 --- frameworks/Java/solon/README.md | 8 +-- frameworks/Java/solon/pom.xml | 63 ++++--------------- frameworks/Java/solon/solon.dockerfile | 8 +-- .../src/main/java/{pmg => hello}/Main.java | 26 ++++---- .../controller/HelloController.java | 4 +- .../java/{pmg => hello}/model/Message.java | 2 +- 6 files changed, 35 insertions(+), 76 deletions(-) rename frameworks/Java/solon/src/main/java/{pmg => hello}/Main.java (87%) rename frameworks/Java/solon/src/main/java/{pmg => hello}/controller/HelloController.java (88%) rename frameworks/Java/solon/src/main/java/{pmg => hello}/model/Message.java (93%) diff --git a/frameworks/Java/solon/README.md b/frameworks/Java/solon/README.md index 0824b5effd9..f2370ab2305 100644 --- a/frameworks/Java/solon/README.md +++ b/frameworks/Java/solon/README.md @@ -4,13 +4,13 @@ This is the solon portion of a [benchmarking test suite](../) comparing a variety of web development platforms. ### JSON Encoding Test -* [JSON test source](src/main/java/pmg/Main.java) -* [Plaintext test source](src/main/java/pmg/Main.java) +* [JSON test source](src/main/java/hello/Main.java) +* [Plaintext test source](src/main/java/hello/Main.java) ## Versions -* [Java OpenJDK 1.8](http://openjdk.java.net/) -* [solon 2.0.0](https://github.com/noear/solon) +* [Java OpenJDK 21](http://openjdk.java.net/) +* [solon 2.9.1](https://github.com/noear/solon) ## Test URLs diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index df69e436229..a9568927908 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -2,15 +2,19 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.noear.solon - solon-benchmark + + org.noear + solon-parent + 2.9.1 + + + hello + hello-solon 1.0 jar - UTF-8 - 11 - 2.9.1 + 21 @@ -19,6 +23,7 @@ solon.boot.smarthttp ${solon.version} + org.noear solon.serialization.snack3 @@ -26,66 +31,20 @@ - - - central - Central Repository - https://repo.maven.apache.org/maven2 - - - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - - - - central - Central Repository - https://repo.maven.apache.org/maven2 - - - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots - - false - - - true - - - - ${project.artifactId} - - org.apache.maven.plugins - maven-compiler-plugin - 3.11.0 - - -parameters - ${java.vertsion} - ${java.vertsion} - UTF-8 - false - - - org.apache.maven.plugins maven-assembly-plugin - 3.6.0 jar-with-dependencies - pmg.Main + hello.Main diff --git a/frameworks/Java/solon/solon.dockerfile b/frameworks/Java/solon/solon.dockerfile index 21d7f50d8a8..c387938661c 100644 --- a/frameworks/Java/solon/solon.dockerfile +++ b/frameworks/Java/solon/solon.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /solon 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 /solon -COPY --from=maven /solon/target/solon-benchmark-jar-with-dependencies.jar app.jar +COPY --from=maven /solon/target/hello-solon.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-cp", "app.jar", "pmg.Main"] +CMD ["java", "-server", "-cp", "app.jar", "hello.Main"] \ No newline at end of file diff --git a/frameworks/Java/solon/src/main/java/pmg/Main.java b/frameworks/Java/solon/src/main/java/hello/Main.java similarity index 87% rename from frameworks/Java/solon/src/main/java/pmg/Main.java rename to frameworks/Java/solon/src/main/java/hello/Main.java index b4b7b651797..0746f86be45 100644 --- a/frameworks/Java/solon/src/main/java/pmg/Main.java +++ b/frameworks/Java/solon/src/main/java/hello/Main.java @@ -1,13 +1,13 @@ -package pmg; - -import org.noear.solon.Solon; - -/** - * @author pmg1991 - * @version V1.0 - */ -public class Main { - public static void main(String[] args) { - Solon.start(Main.class, args); - } -} +package hello; + +import org.noear.solon.Solon; + +/** + * @author pmg1991 + * @version V1.0 + */ +public class Main { + public static void main(String[] args) { + Solon.start(Main.class, args); + } +} diff --git a/frameworks/Java/solon/src/main/java/pmg/controller/HelloController.java b/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java similarity index 88% rename from frameworks/Java/solon/src/main/java/pmg/controller/HelloController.java rename to frameworks/Java/solon/src/main/java/hello/controller/HelloController.java index fe9a1b43e3a..77049043e97 100644 --- a/frameworks/Java/solon/src/main/java/pmg/controller/HelloController.java +++ b/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java @@ -1,9 +1,9 @@ -package pmg.controller; +package hello.controller; import org.noear.solon.annotation.Controller; import org.noear.solon.annotation.Get; import org.noear.solon.annotation.Mapping; -import pmg.model.Message; +import hello.model.Message; /** * @author noear diff --git a/frameworks/Java/solon/src/main/java/pmg/model/Message.java b/frameworks/Java/solon/src/main/java/hello/model/Message.java similarity index 93% rename from frameworks/Java/solon/src/main/java/pmg/model/Message.java rename to frameworks/Java/solon/src/main/java/hello/model/Message.java index f88b9b1a8d4..1df5276ca8d 100644 --- a/frameworks/Java/solon/src/main/java/pmg/model/Message.java +++ b/frameworks/Java/solon/src/main/java/hello/model/Message.java @@ -1,4 +1,4 @@ -package pmg.model; +package hello.model; /** * @author pmg1991 From 9ae18ac38774bb48ea9a6eacd0454a79d1a5c9cc Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Tue, 3 Sep 2024 22:54:16 +0300 Subject: [PATCH 0787/1766] [F#/Oxpecker] Improvements for json and fortunes benchmarks (#9246) * [F#/Oxpecker] Improved fortunes rendering * [F#/Oxpecker] Use SpanJson for json benchmark --- frameworks/FSharp/oxpecker/README.md | 2 +- frameworks/FSharp/oxpecker/src/App/App.fsproj | 2 ++ frameworks/FSharp/oxpecker/src/App/Program.fs | 22 +++++++++---------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/frameworks/FSharp/oxpecker/README.md b/frameworks/FSharp/oxpecker/README.md index 3d8a00a248a..a35cbf08522 100644 --- a/frameworks/FSharp/oxpecker/README.md +++ b/frameworks/FSharp/oxpecker/README.md @@ -19,5 +19,5 @@ This includes tests for plaintext, json, fortunes, single query, mutliple querie * [Oxpecker](https://github.com/Lanayx/Oxpecker) * [Npgsql](https://github.com/npgsql/npgsql) -* [System.Text.Json](https://github.com/dotnet/runtime/tree/main/src/libraries/System.Text.Json) +* [SpanJson](https://github.com/Tornhoof/SpanJson) * ASP.NET Core \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index 35df8d5c493..e9aa702a5a1 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -15,6 +15,8 @@ + + \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index ea6bc66b911..895c54c9693 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -2,6 +2,7 @@ namespace App open System open Oxpecker +open System.Runtime.InteropServices [] module HtmlViews = @@ -26,21 +27,20 @@ module HtmlViews = ) |> RenderHelpers.prerender let fortunes (fortunesData: ResizeArray) = - RenderHelpers.combine head tail ( - __() { - for fortune in fortunesData do - tr() { - td() { raw <| string fortune.id } - td() { fortune.message } - } + let fragment = __() + for fortune in CollectionsMarshal.AsSpan fortunesData do + tr() { + td() { raw <| string fortune.id } + td() { fortune.message } } - ) + |> fragment.AddChild + RenderHelpers.combine head tail fragment [] module HttpHandlers = open System.Text open Microsoft.AspNetCore.Http - open System.Text.Json + open SpanJson let private extra = { @@ -98,9 +98,9 @@ module HttpHandlers = ctx.WriteBytes(result) let jsonSimple value : EndpointHandler = - let options = JsonSerializerOptions(JsonSerializerDefaults.Web) fun ctx -> - ctx.Response.WriteAsJsonAsync(value, options) + ctx.SetContentType("application/json") + JsonSerializer.Generic.Utf8.SerializeAsync<_>(value, stream = ctx.Response.Body).AsTask() let endpoints = [| From f7a663eaf6b46d90f0b2541334cb1da72e2cd259 Mon Sep 17 00:00:00 2001 From: kanarus Date: Wed, 4 Sep 2024 04:54:40 +0900 Subject: [PATCH 0788/1766] bunp ohkami to v0.20, deps & refactor some (#9247) --- frameworks/Rust/ohkami/Cargo.lock | 565 ++++++++++++----------- frameworks/Rust/ohkami/Cargo.toml | 19 +- frameworks/Rust/ohkami/ohkami.dockerfile | 2 +- frameworks/Rust/ohkami/src/fangs.rs | 39 -- frameworks/Rust/ohkami/src/main.rs | 36 +- frameworks/Rust/ohkami/src/models.rs | 9 +- frameworks/Rust/ohkami/src/postgres.rs | 29 +- 7 files changed, 363 insertions(+), 336 deletions(-) diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index 95d46009a5b..e379d121817 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -24,7 +24,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", "once_cell", "version_check", "zerocopy", @@ -66,15 +65,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -87,9 +86,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -105,9 +104,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -123,9 +122,9 @@ dependencies = [ [[package]] name = "byte_reader" -version = "3.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac67f5455e694831246ed9a2d62c98dbb7586281dcfaba6621888ac9b576df" +checksum = "3aad623c0c9416ec94524edd23af3f3e2fd16d1ec7d41c940084c05f77e35c96" [[package]] name = "byteorder" @@ -135,15 +134,18 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.0.95" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -151,6 +153,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -175,15 +186,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] @@ -214,9 +225,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-common" @@ -241,15 +252,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] @@ -278,9 +289,9 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ "serde", ] @@ -293,9 +304,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -314,21 +325,20 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "flume" @@ -338,7 +348,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -417,7 +427,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -461,9 +471,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -472,15 +482,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -488,21 +498,18 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ "hashbrown", ] [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -555,23 +562,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.11" @@ -580,18 +578,18 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] name = "libc" -version = "0.2.153" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libm" @@ -601,9 +599,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "cc", "pkg-config", @@ -612,15 +610,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -628,9 +626,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "md-5" @@ -644,9 +642,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "minimal-lexical" @@ -656,31 +654,31 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -730,9 +728,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -741,38 +739,28 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "object" -version = "0.32.2" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] [[package]] name = "ohkami" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e598d3d323527b920e159d55da2754067a5edfbc0678d60b3886fc379f4637f2" +checksum = "aa5507d0f2230d8fbbec9163207da1219ac513441269465a8d532e0bf5018411" dependencies = [ "byte_reader", "hmac", @@ -787,7 +775,7 @@ dependencies = [ [[package]] name = "ohkami_framework_benchmarks" -version = "0.19.0" +version = "0.20.0" dependencies = [ "futures-util", "ohkami", @@ -799,9 +787,9 @@ dependencies = [ [[package]] name = "ohkami_lib" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05fdeee00f86ee850c63a15068f2c2a3aeb6d707d4936f2261ec0e70ff48704b" +checksum = "889b290a5ca6f0e2d1b1bae72d0ec1fb768d84cf246c532e6f7c65ff962e65e3" dependencies = [ "byte_reader", "percent-encoding", @@ -810,9 +798,9 @@ dependencies = [ [[package]] name = "ohkami_macros" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fa46d8805dede76dce71f8725d48d655f74e2c702824f7a785257d1cc4dd1b" +checksum = "8a231d9afdadeab9fc5c850093377c65ecd30512692de0efec51f708dff5be12" dependencies = [ "proc-macro2", "quote", @@ -827,11 +815,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -848,7 +836,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -859,9 +847,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -869,11 +857,17 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -881,22 +875,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem-rfc7468" @@ -954,9 +948,12 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" @@ -970,18 +967,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1025,11 +1022,20 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "regex" -version = "1.10.4" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -1039,9 +1045,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1050,9 +1056,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rsa" @@ -1076,32 +1082,32 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -1110,9 +1116,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" @@ -1131,11 +1137,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -1144,9 +1150,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -1154,36 +1160,49 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ + "form_urlencoded", "itoa", "ryu", "serde", @@ -1211,6 +1230,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1244,23 +1269,20 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.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" @@ -1282,20 +1304,19 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" dependencies = [ - "itertools", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +checksum = "fcfa89bea9500db4a0d038513d7a060566bfc51d46d1c014847049a45cce85e8" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1306,11 +1327,10 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +checksum = "d06e2f2bd861719b1f3f0c7dbe1d80c30bf59e76cf019f07d9014ed7eefb8e08" dependencies = [ - "ahash", "atoi", "byteorder", "bytes", @@ -1323,6 +1343,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", + "hashbrown", "hashlink", "hex", "indexmap", @@ -1346,22 +1367,22 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +checksum = "2f998a9defdbd48ed005a89362bd40dd2117502f15294f61c8d47034107dbbdc" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] name = "sqlx-macros-core" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +checksum = "3d100558134176a2629d46cec0c8891ba0be8910f7896abfdb75ef4ab6f4e7ce" dependencies = [ "dotenvy", "either", @@ -1377,7 +1398,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 1.0.109", + "syn 2.0.77", "tempfile", "tokio", "url", @@ -1385,13 +1406,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +checksum = "936cac0ab331b14cb3921c62156d913e4c15b74fb6ec0f3146bd4ef6e4fb3c12" dependencies = [ "atoi", "base64", - "bitflags 2.5.0", + "bitflags 2.6.0", "byteorder", "bytes", "crc", @@ -1427,13 +1448,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +checksum = "9734dbce698c67ecf67c442f768a5e90a49b2a4d61a9f1d59f73874bd4cf0710" dependencies = [ "atoi", "base64", - "bitflags 2.5.0", + "bitflags 2.6.0", "byteorder", "crc", "dotenvy", @@ -1465,9 +1486,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +checksum = "a75b419c3c1b1697833dd927bdc4c6545a620bc1bbafabd44e1efbe9afcd337e" dependencies = [ "atoi", "flume", @@ -1480,28 +1501,28 @@ dependencies = [ "log", "percent-encoding", "serde", + "serde_urlencoded", "sqlx-core", "tracing", "url", - "urlencoding", ] [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -1516,9 +1537,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -1527,41 +1548,42 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -1574,32 +1596,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -1642,7 +1663,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -1682,22 +1703,22 @@ dependencies = [ ] [[package]] -name = "unicode-segmentation" -version = "1.11.0" +name = "unicode-properties" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "unicode_categories" @@ -1707,21 +1728,15 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 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" @@ -1746,9 +1761,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" @@ -1768,7 +1783,7 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "redox_syscall", + "redox_syscall 0.4.1", "wasite", ] @@ -1809,7 +1824,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -1829,18 +1853,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1851,9 +1875,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -1863,9 +1887,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -1875,15 +1899,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -1893,9 +1917,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -1905,9 +1929,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -1917,9 +1941,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -1929,9 +1953,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "yansi-term" @@ -2029,26 +2053,27 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] name = "zeroize" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index b6bf50cf97c..04e08b92b0c 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -1,13 +1,24 @@ [package] name = "ohkami_framework_benchmarks" -version = "0.19.0" +version = "0.20.0" edition = "2021" authors = ["kanarus "] [dependencies] -ohkami = { version = "=0.19.0", features = ["rt_tokio"] } -tokio = { version = "1.38.0" , features = ["full"] } +ohkami = { version = "=0.20.0", features = ["rt_tokio"] } +tokio = { version = "1.40.0" , features = ["full"] } rand = { version = "0.8.5" , features = ["small_rng"] } -sqlx = { version = "0.7.4" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } +sqlx = { version = "0.8.1" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } yarte = { version = "0.15.7" } futures-util = { version = "0.3.30" } + +[profile.release] +opt-level = 3 +debug = false +debug-assertions = false +lto = true +panic = "abort" +incremental = false +codegen-units = 1 +rpath = false +strip = false \ No newline at end of file diff --git a/frameworks/Rust/ohkami/ohkami.dockerfile b/frameworks/Rust/ohkami/ohkami.dockerfile index b993ec905a5..287f293a061 100644 --- a/frameworks/Rust/ohkami/ohkami.dockerfile +++ b/frameworks/Rust/ohkami/ohkami.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.79-slim-buster +FROM rust:1.80-slim-bullseye WORKDIR /ohkami_framework_benchmarks ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world diff --git a/frameworks/Rust/ohkami/src/fangs.rs b/frameworks/Rust/ohkami/src/fangs.rs index 46a19808f46..2dd8e27e5d3 100644 --- a/frameworks/Rust/ohkami/src/fangs.rs +++ b/frameworks/Rust/ohkami/src/fangs.rs @@ -1,5 +1,4 @@ use ohkami::prelude::*; -use crate::Postgres; #[derive(Clone)] @@ -10,41 +9,3 @@ impl FangAction for SetServer { res.headers.set().Server("ohkami"); } } - -impl Postgres { - pub async fn init() -> impl FangAction { - #[derive(Clone)] - pub struct UsePostgres(Postgres); - impl FangAction for UsePostgres { - #[inline(always)] - async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { - Ok(req.memorize(self.0.clone())) - } - } - - 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 - } - - let pool = sqlx::postgres::PgPoolOptions::new() - .max_connections(MAX_CONNECTIONS) - .min_connections(MIN_CONNECTIONS) - .connect(&DATABASE_URL).await - .unwrap(); - - UsePostgres(pool.into()) - } -} diff --git a/frameworks/Rust/ohkami/src/main.rs b/frameworks/Rust/ohkami/src/main.rs index 7473338dc5b..96cc9cc2fbc 100644 --- a/frameworks/Rust/ohkami/src/main.rs +++ b/frameworks/Rust/ohkami/src/main.rs @@ -11,12 +11,16 @@ mod templates; use templates::FortunesTemplate; use ohkami::prelude::*; +use ohkami::format::{JSON, Query}; use ohkami::Memory; #[tokio::main] async fn main() { - Ohkami::with((SetServer, Postgres::init().await), ( + Ohkami::with(( + SetServer, + Memory::new(Postgres::new().await), + ), ( "/json" .GET(json_serialization), "/db" .GET(single_database_query), "/queries" .GET(multiple_database_query), @@ -26,40 +30,44 @@ async fn main() { )).howl("0.0.0.0:8000").await } -async fn json_serialization() -> Message { - Message { +async fn json_serialization() -> JSON { + JSON(Message { message: "Hello, World!" - } + }) } -async fn single_database_query(p: Memory<'_, Postgres>) -> World { - p.select_random_world().await +async fn single_database_query(p: Memory<'_, Postgres>) -> JSON { + let world = p.select_random_world().await; + JSON(world) } -async fn multiple_database_query(q: WorldsQuery<'_>, p: Memory<'_, Postgres>) -> Vec { +async fn multiple_database_query( + Query(q): Query>, + p: Memory<'_, Postgres> +) -> JSON> { let n = q.parse(); - p.select_n_random_worlds(n).await + let worlds = p.select_n_random_worlds(n).await; + JSON(worlds) } async fn fortunes(p: Memory<'_, Postgres>) -> FortunesTemplate { let mut fortunes = p.select_all_fortunes().await; - fortunes.push(Fortune { id: 0, message: String::from("Additional fortune added at request time."), }); fortunes.sort_unstable_by(|a, b| str::cmp(&a.message, &b.message)); - FortunesTemplate { fortunes } } -async fn database_updates(q: WorldsQuery<'_>, p: Memory<'_, Postgres>) -> Vec { +async fn database_updates( + Query(q): Query>, + p: Memory<'_, Postgres> +) -> JSON> { let n = q.parse(); let mut worlds = p.select_n_random_worlds(n).await; - p.update_random_ids_of_worlds(&mut worlds).await; - - worlds + JSON(worlds) } async fn plaintext() -> &'static str { diff --git a/frameworks/Rust/ohkami/src/models.rs b/frameworks/Rust/ohkami/src/models.rs index 55eb8f8fa6d..874dd22a5d7 100644 --- a/frameworks/Rust/ohkami/src/models.rs +++ b/frameworks/Rust/ohkami/src/models.rs @@ -1,8 +1,7 @@ -use ohkami::typed::{Payload, Query}; -use ohkami::builtin::payload::JSON; +use ohkami::serde::{Serialize, Deserialize}; -#[Payload(JSON/S)] +#[derive(Serialize)] pub struct Message { pub message: &'static str, } @@ -14,14 +13,14 @@ pub struct Fortune { } #[derive(sqlx::FromRow)] -#[Payload(JSON/S)] +#[derive(Serialize)] pub struct World { pub id: i32, #[serde(rename="randomNumber")] pub randomnumber: i32, } -#[Query] +#[derive(Deserialize)] pub struct WorldsQuery<'q> { q: Option<&'q str>, } diff --git a/frameworks/Rust/ohkami/src/postgres.rs b/frameworks/Rust/ohkami/src/postgres.rs index e9238d67493..c320e2516e3 100644 --- a/frameworks/Rust/ohkami/src/postgres.rs +++ b/frameworks/Rust/ohkami/src/postgres.rs @@ -6,9 +6,32 @@ use crate::models::{World, Fortune}; #[derive(Clone)] pub struct Postgres(sqlx::PgPool); -impl From for Postgres { - fn from(pgpool: sqlx::PgPool) -> Self { - Self(pgpool) +impl Postgres { + pub async fn new() -> Self { + 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 + } + + let pool = sqlx::postgres::PgPoolOptions::new() + .max_connections(MAX_CONNECTIONS) + .min_connections(MIN_CONNECTIONS) + .connect(&DATABASE_URL).await + .unwrap(); + + Self(pool) } } From 96d08a74c0b2e1392ad60c328a94f7c23e489f60 Mon Sep 17 00:00:00 2001 From: cclilshy Date: Wed, 4 Sep 2024 04:35:23 +0800 Subject: [PATCH 0789/1766] [PHP/laravel] Add PRipple coroutine engine for Laravel framework (#9239) * [PHP/laravel] Add PRipple coroutine engine for Laravel framework * Style: Normalized code style & display_name adjustment --- frameworks/PHP/laravel/benchmark_config.json | 25 +++++++++- .../PHP/laravel/laravel-pripple.dockerfile | 48 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 frameworks/PHP/laravel/laravel-pripple.dockerfile diff --git a/frameworks/PHP/laravel/benchmark_config.json b/frameworks/PHP/laravel/benchmark_config.json index 588dab1e17f..f8421378e51 100644 --- a/frameworks/PHP/laravel/benchmark_config.json +++ b/frameworks/PHP/laravel/benchmark_config.json @@ -138,6 +138,29 @@ "display_name": "laravel-octane [frankenphp]", "notes": "", "versus": "php" + }, + "pripple": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "fortune_url": "/fortunes", + "update_url": "/updates/", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "laravel", + "language": "PHP", + "flavor": "PHP8.3", + "orm": "Full", + "platform": "PRipple", + "webserver": "PServer", + "os": "Linux", + "database_os": "Linux", + "display_name": "laravel-pripple", + "notes": "", + "versus": "php" } }] -} \ No newline at end of file +} diff --git a/frameworks/PHP/laravel/laravel-pripple.dockerfile b/frameworks/PHP/laravel/laravel-pripple.dockerfile new file mode 100644 index 00000000000..869661a0432 --- /dev/null +++ b/frameworks/PHP/laravel/laravel-pripple.dockerfile @@ -0,0 +1,48 @@ +FROM php:8.3-cli + +RUN apt-get update -yqq >> /dev/null +RUN apt-get install -y libevent-dev \ + libssl-dev \ + pkg-config \ + build-essential \ + unzip >> /dev/null + +RUN docker-php-ext-install pdo_mysql \ + opcache \ + posix \ + pcntl \ + sockets >> /dev/null + +RUN pecl install event >> /dev/null + +RUN docker-php-ext-enable pdo_mysql opcache posix pcntl sockets +RUN docker-php-ext-enable --ini-name zz-event.ini event +RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini +RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini +RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini + +COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer + +# Initialize +WORKDIR /laravel +COPY --link . . + +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache + +# Configure +RUN echo "PRP_HTTP_LISTEN=http://0.0.0.0:8080" >> .env +RUN echo "PRP_HTTP_COUNT=64" >> .env + +RUN composer install --quiet +RUN php artisan optimize + +RUN composer require cclilshy/p-ripple-drive --quiet +RUN composer update --quiet + +EXPOSE 8080 + +ENTRYPOINT ["php","artisan","p:server","start"] From f83474331848fc9bb33426c1fd3b18c6fe118701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 4 Sep 2024 19:00:23 +0200 Subject: [PATCH 0790/1766] Optimize Spring samples (#9249) * Optimize spring-webflux - Upgrade to Spring Boot 3.3.3 - Optimize handler implementations - Optimize the router implementation - Use WebFlux.fn configuration for HttpHandler * Optimize spring - Upgrade to Spring Boot 3.3.3 - Use WebMVC.fn instead of `@Controller` - Refine configuration --- frameworks/Java/spring-webflux/pom.xml | 2 +- .../src/main/java/benchmark/App.java | 17 ++++ .../{WebfluxHandler.java => DbHandler.java} | 32 ++----- .../main/java/benchmark/web/JsonHandler.java | 54 ++++++++++++ .../benchmark/{ => web}/ServerFilter.java | 5 +- .../main/java/benchmark/web/TextHandler.java | 37 +++++++++ .../java/benchmark/web/WebfluxRouter.java | 29 ++++--- frameworks/Java/spring/pom.xml | 2 +- frameworks/Java/spring/spring.dockerfile | 2 +- .../Java/spring/src/main/java/hello/App.java | 3 +- .../java/hello/UpdateWorldServiceImpl.java | 5 +- .../DbHandler.java} | 83 ++++++++----------- .../src/main/java/hello/web/JsonHandler.java | 39 +++++++++ .../src/main/java/hello/web/TextHandler.java | 27 ++++++ .../src/main/java/hello/web/WebmvcRouter.java | 32 +++++++ .../spring/src/main/resources/application.yml | 9 +- 16 files changed, 281 insertions(+), 97 deletions(-) rename frameworks/Java/spring-webflux/src/main/java/benchmark/web/{WebfluxHandler.java => DbHandler.java} (74%) create mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/web/JsonHandler.java rename frameworks/Java/spring-webflux/src/main/java/benchmark/{ => web}/ServerFilter.java (83%) create mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/web/TextHandler.java rename frameworks/Java/spring/src/main/java/hello/{controller/HelloController.java => web/DbHandler.java} (50%) create mode 100644 frameworks/Java/spring/src/main/java/hello/web/JsonHandler.java create mode 100644 frameworks/Java/spring/src/main/java/hello/web/TextHandler.java create mode 100644 frameworks/Java/spring/src/main/java/hello/web/WebmvcRouter.java diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index 4dd5b09698c..c15b211c92d 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.3 diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java index 37ff0a80ff0..c574863a9a9 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java @@ -1,13 +1,30 @@ package benchmark; +import benchmark.web.ServerFilter; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.http.server.reactive.HttpHandler; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.reactive.function.server.HandlerStrategies; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.reactive.result.view.ViewResolver; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; @SpringBootApplication @EnableScheduling public class App { + @Bean + public HttpHandler httpHandler(RouterFunction route, ServerFilter serverFilter, ViewResolver viewResolver) { + WebHandler webHandler = RouterFunctions.toWebHandler(route, HandlerStrategies.builder().viewResolver(viewResolver).build()); + return WebHttpHandlerBuilder.webHandler(webHandler).filter(serverFilter).build(); + } + public static void main(String[] args) { SpringApplication.run(App.class, args); } diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java similarity index 74% rename from frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxHandler.java rename to frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java index a7516af6636..bafddaf83c6 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxHandler.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java @@ -2,11 +2,9 @@ import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; import benchmark.model.Fortune; -import benchmark.model.Message; import benchmark.model.World; import benchmark.repository.DbRepository; import reactor.core.publisher.Flux; @@ -21,26 +19,14 @@ import static java.util.Comparator.comparing; @Component -public class WebfluxHandler { +public class DbHandler { private final DbRepository dbRepository; - public WebfluxHandler(DbRepository dbRepository) { + public DbHandler(DbRepository dbRepository) { this.dbRepository = dbRepository; } - public Mono plaintext(ServerRequest request) { - return ServerResponse.ok() - .contentType(MediaType.TEXT_PLAIN) - .bodyValue("Hello, World!"); - } - - public Mono json(ServerRequest request) { - return ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) - .bodyValue(new Message("Hello, World!")); - } - public Mono db(ServerRequest request) { int id = randomWorldNumber(); Mono world = dbRepository.getWorld(id) @@ -52,7 +38,7 @@ public Mono db(ServerRequest request) { } public Mono queries(ServerRequest request) { - int queries = getQueries(request); + int queries = parseQueryCount(request.queryParams().getFirst("queries")); Mono> worlds = Flux.range(0, queries) .flatMap(i -> dbRepository.getWorld(randomWorldNumber())) @@ -64,13 +50,13 @@ public Mono queries(ServerRequest request) { }); } - private static int parseQueryCount(Optional maybeTextValue) { - if (!maybeTextValue.isPresent()) { + private static int parseQueryCount(String maybeTextValue) { + if (maybeTextValue == null) { return 1; } int parsedValue; try { - parsedValue = Integer.parseInt(maybeTextValue.get()); + parsedValue = Integer.parseInt(maybeTextValue); } catch (NumberFormatException e) { return 1; } @@ -78,7 +64,7 @@ private static int parseQueryCount(Optional maybeTextValue) { } public Mono updates(ServerRequest request) { - int queries = getQueries(request); + int queries = parseQueryCount(request.queryParams().getFirst("queries")); Mono> worlds = Flux.range(0, queries) .flatMap(i -> dbRepository.findAndUpdateWorld(randomWorldNumber(), randomWorldNumber())) @@ -101,10 +87,6 @@ public Mono fortunes(ServerRequest request) { .render("fortunes", Collections.singletonMap("fortunes", result)); } - private static int getQueries(ServerRequest request) { - return parseQueryCount(request.queryParam("queries")); - } - private static int randomWorldNumber() { return 1 + ThreadLocalRandom.current().nextInt(10000); } diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/JsonHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/JsonHandler.java new file mode 100644 index 00000000000..6f4bc19249f --- /dev/null +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/JsonHandler.java @@ -0,0 +1,54 @@ +package benchmark.web; + +import java.util.Map; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; +import reactor.core.publisher.Mono; + +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; + +@Component +public class JsonHandler implements HandlerFunction { + + private final ObjectWriter writer; + + public JsonHandler(ObjectMapper objectMapper) { + this.writer = objectMapper.writerFor(Map.class); + } + + @Override + public Mono handle(ServerRequest request) { + return ServerResponse.ok() + .body((message, context) -> { + DataBuffer buffer = serialize(request, Map.of("message", "Hello, world!")); + HttpHeaders headers = message.getHeaders(); + headers.setContentLength(buffer.readableByteCount()); + headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + return message.writeWith(Mono.just(buffer)); + }); + } + + private DataBuffer serialize(ServerRequest request, Object object) { + try { + byte[] bytes = this.writer.writeValueAsBytes(object); + return bufferFactory(request).wrap(bytes); + } + catch (JsonProcessingException ex) { + throw new RuntimeException(ex); + } + } + + private static DataBufferFactory bufferFactory(ServerRequest request) { + return request.exchange().getResponse().bufferFactory(); + } + +} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/ServerFilter.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/ServerFilter.java similarity index 83% rename from frameworks/Java/spring-webflux/src/main/java/benchmark/ServerFilter.java rename to frameworks/Java/spring-webflux/src/main/java/benchmark/web/ServerFilter.java index 685ac39e6ad..38357eefdb2 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/ServerFilter.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/ServerFilter.java @@ -1,6 +1,5 @@ package benchmark.web; -import io.netty.handler.codec.http.HttpHeaderNames; import org.springframework.http.HttpHeaders; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -28,8 +27,8 @@ public void updateDate() { @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { HttpHeaders headers = exchange.getResponse().getHeaders(); - headers.add(HttpHeaderNames.SERVER.toString(), SERVER_NAME); - headers.add(HttpHeaderNames.DATE.toString(), this.date); + headers.add(HttpHeaders.SERVER, SERVER_NAME); + headers.add(HttpHeaders.DATE, this.date); return chain.filter(exchange); } } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/TextHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/TextHandler.java new file mode 100644 index 00000000000..8abac92606d --- /dev/null +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/TextHandler.java @@ -0,0 +1,37 @@ +package benchmark.web; + +import java.nio.charset.StandardCharsets; + +import reactor.core.publisher.Mono; + +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; + +@Component +public class TextHandler implements HandlerFunction { + + private static final byte[] TEXT_BODY = "Hello, World!".getBytes(StandardCharsets.UTF_8); + + private static final String TEXT_BODY_LENGTH = String.valueOf(TEXT_BODY.length); + + @Override + public Mono handle(ServerRequest request) { + return ServerResponse.ok() + .body((message, context) -> { + HttpHeaders headers = message.getHeaders(); + headers.add(HttpHeaders.CONTENT_LENGTH, TEXT_BODY_LENGTH); + headers.add(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE); + return message.writeWith(Mono.just(bufferFactory(request).wrap(TEXT_BODY))); + }); + } + + private static DataBufferFactory bufferFactory(ServerRequest request) { + return request.exchange().getResponse().bufferFactory(); + } + +} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java index 061797738c2..1499dc4f839 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/WebfluxRouter.java @@ -1,23 +1,32 @@ package benchmark.web; +import reactor.core.publisher.Mono; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.server.HandlerFunction; import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; @Configuration public class WebfluxRouter { @Bean - public RouterFunction route(WebfluxHandler handler) { - return RouterFunctions.route() - .GET("/plaintext", handler::plaintext) - .GET("/json", handler::json) - .GET("/db", handler::db) - .GET("/queries", handler::queries) - .GET("/updates", handler::updates) - .GET("/fortunes", handler::fortunes) - .build(); + public RouterFunction route( + TextHandler textHandler, JsonHandler jsonHandler, DbHandler dbHandler) { + + return request -> { + HandlerFunction fn = switch (request.uri().getRawPath()) { + case "/plaintext" -> textHandler; + case "/json" -> jsonHandler; + case "/db" -> dbHandler::db; + case "/queries" -> dbHandler::queries; + case "/updates" -> dbHandler::updates; + case "/fortunes" -> dbHandler::fortunes; + default -> r -> ServerResponse.notFound().build(); + }; + return Mono.just(fn); + }; } + } \ No newline at end of file diff --git a/frameworks/Java/spring/pom.xml b/frameworks/Java/spring/pom.xml index 9f131b9a23f..4a8d36e9749 100644 --- a/frameworks/Java/spring/pom.xml +++ b/frameworks/Java/spring/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.3 diff --git a/frameworks/Java/spring/spring.dockerfile b/frameworks/Java/spring/spring.dockerfile index 0598e9c1f28..f52c1f36df1 100644 --- a/frameworks/Java/spring/spring.dockerfile +++ b/frameworks/Java/spring/spring.dockerfile @@ -12,4 +12,4 @@ RUN java -Djarmode=tools -jar app.jar extract EXPOSE 8080 -CMD ["java", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app/app.jar", "--spring.profiles.active=jpa"] \ No newline at end of file +CMD ["java", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app/app.jar", "--spring.profiles.active=jdbc"] \ No newline at end of file diff --git a/frameworks/Java/spring/src/main/java/hello/App.java b/frameworks/Java/spring/src/main/java/hello/App.java index d0c13e06844..0484b46517e 100644 --- a/frameworks/Java/spring/src/main/java/hello/App.java +++ b/frameworks/Java/spring/src/main/java/hello/App.java @@ -4,8 +4,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -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; @@ -35,4 +33,5 @@ DataSource datasource(DataSourceProperties dataSourceProperties) { return dataSource; } + } diff --git a/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java b/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java index b59680aef5c..2bd4304a9ee 100644 --- a/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java +++ b/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java @@ -3,7 +3,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import hello.controller.HelloController; +import hello.web.DbHandler; +import hello.web.WebmvcRouter; import hello.model.World; import hello.repository.DbRepository; @@ -33,7 +34,7 @@ public World updateWorld(int worldId) { int newRandomNumber; do { - newRandomNumber = HelloController.randomWorldNumber(); + newRandomNumber = DbHandler.randomWorldNumber(); } while (newRandomNumber == world.randomnumber); return dbRepository.updateWorld(world, newRandomNumber); diff --git a/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java similarity index 50% rename from frameworks/Java/spring/src/main/java/hello/controller/HelloController.java rename to frameworks/Java/spring/src/main/java/hello/web/DbHandler.java index 5c11b82ac66..1611cf21170 100644 --- a/frameworks/Java/spring/src/main/java/hello/controller/HelloController.java +++ b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java @@ -1,79 +1,68 @@ -package hello.controller; +package hello.web; -import static java.util.Comparator.comparing; - -import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; -import hello.model.Message; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import hello.UpdateWorldService; import hello.model.Fortune; import hello.model.World; import hello.repository.DbRepository; -@RestController -public final class HelloController { +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.function.RenderingResponse; +import org.springframework.web.servlet.function.ServerRequest; +import org.springframework.web.servlet.function.ServerResponse; + +import static java.util.Comparator.comparing; + +@Component +public class DbHandler { private DbRepository dbRepository; private UpdateWorldService updateWorldService; - public HelloController( - DbRepository dbRepository, - UpdateWorldService updateWorldService) { + public DbHandler(DbRepository dbRepository, UpdateWorldService updateWorldService) { this.dbRepository = dbRepository; this.updateWorldService = updateWorldService; } - @GetMapping("/plaintext") - String plaintext(HttpServletResponse response) { - response.setContentType(MediaType.TEXT_PLAIN_VALUE); - return "Hello, World!"; - } - - @GetMapping("/json") - Message json(HttpServletResponse response) { - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - return new Message("Hello, World!"); + ServerResponse db(ServerRequest request) { + return ServerResponse.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(dbRepository.getWorld(randomWorldNumber())); } - @GetMapping("/db") - World db(HttpServletResponse response) { - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - return dbRepository.getWorld(randomWorldNumber()); - } - - @GetMapping("/queries") - World[] queries(HttpServletResponse response, @RequestParam(required = false) String queries) { - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - return randomWorldNumbers().mapToObj(dbRepository::getWorld).limit(parseQueryCount(queries)) + ServerResponse queries(ServerRequest request) { + String queries = request.params().getFirst("queries"); + World[] worlds = randomWorldNumbers() + .mapToObj(dbRepository::getWorld).limit(parseQueryCount(queries)) .toArray(World[]::new); + return ServerResponse.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(worlds); } - @GetMapping("/updates") - World[] updates(HttpServletResponse response, @RequestParam(required = false) String queries) { - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - return randomWorldNumbers() + ServerResponse updates(ServerRequest request) { + String queries = request.params().getFirst("queries"); + World[] worlds = randomWorldNumbers() .mapToObj(id -> updateWorldService.updateWorld(id)) .limit(parseQueryCount(queries)).toArray(World[]::new); + return ServerResponse.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(worlds); } - @GetMapping("/fortunes") - @ModelAttribute("fortunes") - List fortunes(HttpServletResponse response) { - response.setContentType(MediaType.TEXT_HTML_VALUE); + ServerResponse fortunes(ServerRequest request) { var fortunes = dbRepository.fortunes(); - fortunes.add(new Fortune(0, "Additional fortune added at request time.")); fortunes.sort(comparing(fortune -> fortune.message)); - return fortunes; + return RenderingResponse + .create("fortunes") + .modelAttribute("fortunes", fortunes) + .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML_VALUE) + .build(); } private static final int MIN_WORLD_NUMBER = 1; diff --git a/frameworks/Java/spring/src/main/java/hello/web/JsonHandler.java b/frameworks/Java/spring/src/main/java/hello/web/JsonHandler.java new file mode 100644 index 00000000000..c6690811eca --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/web/JsonHandler.java @@ -0,0 +1,39 @@ +package hello.web; + +import java.util.Map; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.function.HandlerFunction; +import org.springframework.web.servlet.function.ServerRequest; +import org.springframework.web.servlet.function.ServerResponse; + +@Component +public class JsonHandler implements HandlerFunction { + + private final ObjectWriter writer; + + public JsonHandler(ObjectMapper objectMapper) { + this.writer = objectMapper.writerFor(Map.class); + } + + @Override + public ServerResponse handle(ServerRequest request) { + try { + byte[] body = this.writer.writeValueAsBytes(Map.of("message", "Hello, world!")); + return ServerResponse.ok() + .contentLength(body.length) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body(body); + } + catch (JsonProcessingException ex) { + throw new RuntimeException(ex); + } + } + +} diff --git a/frameworks/Java/spring/src/main/java/hello/web/TextHandler.java b/frameworks/Java/spring/src/main/java/hello/web/TextHandler.java new file mode 100644 index 00000000000..b70b3010268 --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/web/TextHandler.java @@ -0,0 +1,27 @@ +package hello.web; + +import java.nio.charset.StandardCharsets; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.function.HandlerFunction; +import org.springframework.web.servlet.function.ServerRequest; +import org.springframework.web.servlet.function.ServerResponse; + +@Component +public class TextHandler implements HandlerFunction { + + private static final byte[] TEXT_BODY = "Hello, World!".getBytes(StandardCharsets.UTF_8); + + private static final String TEXT_BODY_LENGTH = String.valueOf(TEXT_BODY.length); + + @Override + public ServerResponse handle(ServerRequest request) { + return ServerResponse.ok() + .header(HttpHeaders.CONTENT_LENGTH, TEXT_BODY_LENGTH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) + .body(TEXT_BODY); + } + +} diff --git a/frameworks/Java/spring/src/main/java/hello/web/WebmvcRouter.java b/frameworks/Java/spring/src/main/java/hello/web/WebmvcRouter.java new file mode 100644 index 00000000000..0a5810affd2 --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/web/WebmvcRouter.java @@ -0,0 +1,32 @@ +package hello.web; + +import java.util.Optional; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.function.HandlerFunction; +import org.springframework.web.servlet.function.RouterFunction; +import org.springframework.web.servlet.function.ServerResponse; + +@Configuration +public class WebmvcRouter { + + @Bean + public RouterFunction route( + TextHandler textHandler, + JsonHandler jsonHandler, + DbHandler dbHandler) { + + return request -> Optional.of((HandlerFunction) r -> + switch (r.uri().getRawPath()) { + case "/plaintext" -> textHandler.handle(r); + case "/json" -> jsonHandler.handle(r); + case "/db" -> dbHandler.db(r); + case "/queries" -> dbHandler.queries(r); + case "/updates" -> dbHandler.updates(r); + case "/fortunes" -> dbHandler.fortunes(r); + default -> ServerResponse.notFound().build(); + }); + } +} + diff --git a/frameworks/Java/spring/src/main/resources/application.yml b/frameworks/Java/spring/src/main/resources/application.yml index 4796669a8e5..4f6592dc53b 100644 --- a/frameworks/Java/spring/src/main/resources/application.yml +++ b/frameworks/Java/spring/src/main/resources/application.yml @@ -1,12 +1,10 @@ --- spring: - jpa: - open-in-view: false config: activate: on-profile: jdbc autoconfigure: - exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration + exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration --- spring: @@ -31,7 +29,7 @@ spring: activate: on-profile: jpa autoconfigure: - exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration + exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration jpa: database-platform: org.hibernate.dialect.PostgreSQLDialect @@ -41,7 +39,7 @@ spring: activate: on-profile: mongo autoconfigure: - exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration spring.data.mongodb: host: tfb-database @@ -55,3 +53,4 @@ spring: server.server-header: Spring server.servlet.encoding.force: true +spring.jpa.open-in-view: false From 8afa827e93500685666071353455ce281c4c69c2 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 5 Sep 2024 18:30:18 +0200 Subject: [PATCH 0791/1766] [php] Fix Leaf v3.6 dockerfiles (#9250) * Leafphp fix dockerfiles * Clean event install --- frameworks/PHP/leaf/leaf-workerman.dockerfile | 15 ++++++++------- frameworks/PHP/leaf/leaf.dockerfile | 8 ++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/frameworks/PHP/leaf/leaf-workerman.dockerfile b/frameworks/PHP/leaf/leaf-workerman.dockerfile index eaa11589d3a..ddcc5dc928c 100644 --- a/frameworks/PHP/leaf/leaf-workerman.dockerfile +++ b/frameworks/PHP/leaf/leaf-workerman.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,21 +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 update -yqq > /dev/null && apt-get install -yqq git \ - php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null + php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y libevent-dev php8.3-dev > /dev/null \ + && pecl install event-3.1.4 > /dev/null \ + && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini -ADD ./ /leaf WORKDIR /leaf +COPY --link . . EXPOSE 8080 -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN composer require joanhey/adapterman:^0.6 --quiet diff --git a/frameworks/PHP/leaf/leaf.dockerfile b/frameworks/PHP/leaf/leaf.dockerfile index 167a5af7039..52a4c2f704c 100644 --- a/frameworks/PHP/leaf/leaf.dockerfile +++ b/frameworks/PHP/leaf/leaf.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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 install -yqq nginx git unzip \ - php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl php8.3-zip > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.3/fpm/ -ADD ./ /leaf WORKDIR /leaf +COPY --link . . 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; From 91cefe6b137714379b5c5f182e3ef63a409418bb Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Fri, 6 Sep 2024 04:03:14 +0800 Subject: [PATCH 0792/1766] [xitca-web] add connection pool (#9252) * [xitca-web] connection pool * fix plaintext. * update dep * simplify api --- frameworks/Rust/xitca-web/Cargo.lock | 43 ++++-- frameworks/Rust/xitca-web/Cargo.toml | 2 +- frameworks/Rust/xitca-web/rustfmt.toml | 1 + frameworks/Rust/xitca-web/src/db.rs | 169 ++++++++++++--------- frameworks/Rust/xitca-web/src/db_diesel.rs | 6 +- frameworks/Rust/xitca-web/src/main.rs | 55 +++---- frameworks/Rust/xitca-web/src/main_axum.rs | 24 +-- frameworks/Rust/xitca-web/src/main_iou.rs | 56 ++----- frameworks/Rust/xitca-web/src/main_sync.rs | 10 +- frameworks/Rust/xitca-web/src/ser.rs | 73 ++++++--- frameworks/Rust/xitca-web/src/util.rs | 4 +- 11 files changed, 234 insertions(+), 209 deletions(-) create mode 100644 frameworks/Rust/xitca-web/rustfmt.toml diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 1f1f0e18a74..00bf2423449 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.81" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", @@ -149,9 +149,9 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.1.15" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" dependencies = [ "shlex", ] @@ -218,9 +218,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.3" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e13bab2796f412722112327f3e575601a3e9cdcbe426f0d30dbf43f3f5dc71" +checksum = "158fe8e2e68695bd615d7e4f3227c0727b151330d3e253b525086c348d055d5e" dependencies = [ "bitflags 2.6.0", "byteorder", @@ -631,6 +631,24 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.5" @@ -869,9 +887,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -927,6 +945,12 @@ dependencies = [ "libc", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.9" @@ -1319,10 +1343,11 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=6870448#687044829f0e89bab3efafcf7fb53e53167ad32c" +source = "git+https://github.com/HFQR/xitca-web.git?rev=9835c0b#9835c0b79ebd77f01b74e3ccb1c9893f022db9f3" dependencies = [ "fallible-iterator", "percent-encoding", + "phf", "postgres-protocol", "postgres-types", "tokio", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 84eb12264b3..1d6ccc17751 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -95,5 +95,5 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "6870448" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "9835c0b" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } diff --git a/frameworks/Rust/xitca-web/rustfmt.toml b/frameworks/Rust/xitca-web/rustfmt.toml new file mode 100644 index 00000000000..866c7561055 --- /dev/null +++ b/frameworks/Rust/xitca-web/rustfmt.toml @@ -0,0 +1 @@ +max_width = 120 \ No newline at end of file diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index 276eb93ec9e..0b7a18601fb 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,9 +1,7 @@ use std::fmt::Write; use xitca_io::bytes::BytesMut; -use xitca_postgres::{ - pipeline::Pipeline, statement::Statement, AsyncLendingIterator, SharedClient, -}; +use xitca_postgres::{pipeline::Pipeline, AsyncLendingIterator, Pool, Type}; use super::{ ser::{Fortune, Fortunes, World}, @@ -11,64 +9,63 @@ use super::{ }; pub struct Client { - client: SharedClient, + pool: Pool, #[cfg(not(feature = "pg-sync"))] shared: std::cell::RefCell, #[cfg(feature = "pg-sync")] shared: std::sync::Mutex, - fortune: Statement, - world: Statement, - updates: Box<[Statement]>, + updates: Box<[Box]>, } type Shared = (Rand, BytesMut); -pub async fn create() -> HandleResult { - let mut client = SharedClient::new(DB_URL.to_string()).await?; +const FORTUNE_SQL: &str = "SELECT * FROM fortune"; - let fortune = client.prepare_cached("SELECT * FROM fortune", &[]).await?; +const FORTUNE_SQL_TYPES: &[Type] = &[]; - let world = client - .prepare_cached("SELECT * FROM world WHERE id=$1", &[]) - .await?; +const WORLD_SQL: &str = "SELECT * FROM world WHERE id=$1"; - let mut updates = Vec::new(); +const WORLD_SQL_TYPES: &[Type] = &[Type::INT4]; - // a dummy statement as placeholder of 0 index. - // avoid off by one calculation when using non zero u16 as slicing index. - updates.push(Statement::default()); +fn update_query(num: usize) -> Box { + const PREFIX: &str = "UPDATE world SET randomNumber = w.r FROM (VALUES "; + const SUFFIX: &str = ") AS w (i,r) WHERE world.id = w.i"; - for num in 1..=500u16 { - let mut pl = 1; - let mut q = String::new(); - q.push_str("UPDATE world SET randomnumber = CASE id "); - for _ in 1..=num { - let _ = write!(&mut q, "when ${} then ${} ", pl, pl + 1); - pl += 2; - } - q.push_str("ELSE randomnumber END WHERE id IN ("); - for _ in 1..=num { - let _ = write!(&mut q, "${},", pl); - pl += 1; - } - q.pop(); - q.push(')'); + let (_, mut query) = (1..=num).fold((1, String::from(PREFIX)), |(idx, mut query), _| { + write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); + (idx + 2, query) + }); - let st = client.prepare_cached(&q, &[]).await?; - updates.push(st); - } + query.pop(); + + query.push_str(SUFFIX); + + query.into_boxed_str() +} + +pub async fn create() -> HandleResult { + let pool = Pool::builder(DB_URL).capacity(1).build()?; let shared = (Rand::default(), BytesMut::new()); + let updates = core::iter::once(Box::from("")) + .chain((1..=500).map(update_query)) + .collect::]>>(); + + { + let mut conn = pool.get().await?; + for update in updates.iter().skip(1) { + conn.prepare(update, &[]).await?; + } + } + Ok(Client { - client, + pool, #[cfg(not(feature = "pg-sync"))] shared: std::cell::RefCell::new(shared), #[cfg(feature = "pg-sync")] shared: std::sync::Mutex::new(shared), - fortune, - world, - updates: updates.into_boxed_slice(), + updates, }) } @@ -84,29 +81,26 @@ impl Client { } pub async fn get_world(&self) -> HandleResult { + let mut conn = self.pool.get().await?; + let stmt = conn.prepare(WORLD_SQL, WORLD_SQL_TYPES).await?; let id = self.shared().0.gen_id(); - self.client - .query_raw(&self.world, [id]) - .await? - .try_next() - .await? - .map(|row| World::new(row.get_raw(0), row.get_raw(1))) - .ok_or_else(|| "World does not exist".into()) + let mut res = conn.consume().query_raw(&stmt, [id])?; + let row = res.try_next().await?.ok_or_else(|| "World does not exist")?; + Ok(World::new(row.get_raw(0), row.get_raw(1))) } pub async fn get_worlds(&self, num: u16) -> HandleResult> { let len = num as usize; + let mut conn = self.pool.get().await?; + let stmt = conn.prepare(WORLD_SQL, WORLD_SQL_TYPES).await?; + let mut res = { let (ref mut rng, ref mut buf) = *self.shared(); - let mut pipe = Pipeline::with_capacity_from_buf(len, buf); - - (0..num).try_for_each(|_| pipe.query_raw(&self.world, [rng.gen_id()]))?; - - self.client.pipeline(pipe) - } - .await?; + (0..num).try_for_each(|_| pipe.query_raw(&stmt, [rng.gen_id()]))?; + conn.consume().pipeline(pipe)? + }; let mut worlds = Vec::with_capacity(len); @@ -122,37 +116,34 @@ impl Client { pub async fn update(&self, num: u16) -> HandleResult> { let len = num as usize; - let mut params = Vec::new(); - params.reserve(len * 3); + let update = self.updates.get(len).ok_or_else(|| "num out of bound")?; + + let mut conn = self.pool.get().await?; + let world_stmt = conn.prepare(WORLD_SQL, WORLD_SQL_TYPES).await?; + let update_stmt = conn.prepare(&update, &[]).await?; + + let mut params = Vec::with_capacity(len); let mut res = { let (ref mut rng, ref mut buf) = *self.shared(); - let mut pipe = Pipeline::with_capacity_from_buf(len + 1, buf); - (0..num).try_for_each(|_| { let w_id = rng.gen_id(); let r_id = rng.gen_id(); - params.extend([w_id, r_id]); - pipe.query_raw(&self.world, [w_id]) + params.push([w_id, r_id]); + pipe.query_raw(&world_stmt, [w_id]) })?; + pipe.query_raw(&update_stmt, sort_update_params(¶ms))?; + conn.consume().pipeline(pipe)? + }; - params.extend_from_within(..len); - - let st = self.updates.get(len).unwrap(); - pipe.query_raw(st, ¶ms)?; - - self.client.pipeline(pipe) - } - .await?; + let mut worlds = Vec::with_capacity(len); - let mut worlds = Vec::new(); - worlds.reserve(len); - let mut r_ids = params.into_iter().skip(1).step_by(2); + let mut r_ids = params.into_iter(); while let Some(mut item) = res.try_next().await? { while let Some(row) = item.try_next().await? { - let r_id = r_ids.next().unwrap(); + let r_id = r_ids.next().unwrap()[1]; worlds.push(World::new(row.get_raw(0), r_id)) } } @@ -164,12 +155,46 @@ impl Client { let mut items = Vec::with_capacity(32); items.push(Fortune::new(0, "Additional fortune added at request time.")); - let mut res = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?; + let mut conn = self.pool.get().await?; + let stmt = conn.prepare(FORTUNE_SQL, FORTUNE_SQL_TYPES).await?; + let mut res = conn.consume().query_raw::<[i32; 0]>(&stmt, [])?; + while let Some(row) = res.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)); Ok(Fortunes::new(items)) } } + +fn sort_update_params(params: &Vec<[i32; 2]>) -> impl ExactSizeIterator { + let mut params = params.clone(); + params.sort_by(|a, b| a[0].cmp(&b[0])); + + struct ParamIter(I); + + impl Iterator for ParamIter + where + I: Iterator, + { + type Item = I::Item; + + #[inline] + fn next(&mut self) -> Option { + self.0.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } + } + + // impl depends on compiler optimization to flat Vec<[T]> to Vec when inferring + // it's size hint. possible to cause runtime panic. + impl ExactSizeIterator for ParamIter where I: Iterator {} + + ParamIter(params.into_iter().flatten()) +} diff --git a/frameworks/Rust/xitca-web/src/db_diesel.rs b/frameworks/Rust/xitca-web/src/db_diesel.rs index 79ba4c9a69a..2cd44344499 100644 --- a/frameworks/Rust/xitca-web/src/db_diesel.rs +++ b/frameworks/Rust/xitca-web/src/db_diesel.rs @@ -43,11 +43,7 @@ impl _Pool { 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) + world.filter(id.eq(w_id)).load(&mut conn)?.pop().ok_or_else(not_found) } pub fn get_worlds(&self, num: u16) -> HandleResult> { diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index 8405c986717..06c925bbb25 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -3,26 +3,20 @@ mod ser; mod util; use xitca_http::{ - body::Once, - bytes::Bytes, h1::RequestBody, - http::{ - self, - const_header_value::{TEXT, TEXT_HTML_UTF8}, - header::{CONTENT_TYPE, SERVER}, - IntoResponse, RequestExt, + http::{header::SERVER, StatusCode}, + util::service::{ + route::get, + router::{Router, RouterError}, }, - util::service::{route::get, router::Router}, HttpServiceBuilder, }; use xitca_service::{fn_service, Service, ServiceExt}; -use ser::{json_response, Message}; +use ser::{error_response, IntoResponse, Message, Request, Response}; use util::{context_mw, HandleResult, QueryParse, SERVER_HEADER_VALUE}; -type Request = http::Request>; -type Response = http::Response>; -type Ctx<'a> = util::Ctx<'a, Request>; +type Ctx<'a> = util::Ctx<'a, Request>; fn main() -> std::io::Result<()> { let service = Router::new() @@ -32,7 +26,7 @@ fn main() -> std::io::Result<()> { .insert("/fortunes", get(fn_service(fortunes))) .insert("/queries", get(fn_service(queries))) .insert("/updates", get(fn_service(updates))) - .enclosed_fn(middleware_fn) + .enclosed_fn(middleware) .enclosed(context_mw()) .enclosed(HttpServiceBuilder::h1().io_uring()); xitca_server::Builder::new() @@ -41,53 +35,54 @@ fn main() -> std::io::Result<()> { .wait() } -async fn middleware_fn(service: &S, req: Ctx<'_>) -> Result +async fn middleware(service: &S, req: Ctx<'_>) -> Result where - S: for<'c> Service, Response = Response, Error = E>, + S: for<'c> Service, Response = Response, Error = RouterError>, { - service.call(req).await.map(|mut res| { - res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); - res - }) + let mut res = service.call(req).await.unwrap_or_else(|e| match e { + RouterError::Match(_) => error_response(StatusCode::NOT_FOUND), + RouterError::NotAllowed(_) => error_response(StatusCode::METHOD_NOT_ALLOWED), + RouterError::Service(e) => { + println!("{e}"); + error_response(StatusCode::INTERNAL_SERVER_ERROR) + } + }); + res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); + Ok(res) } async fn plain_text(ctx: Ctx<'_>) -> HandleResult { - let (req, _) = ctx.into_parts(); - let mut res = req.into_response(const { Bytes::from_static(b"Hello, World!") }); - res.headers_mut().insert(CONTENT_TYPE, TEXT); - Ok(res) + ctx.into_parts().0.text_response() } async fn json(ctx: Ctx<'_>) -> HandleResult { let (req, state) = ctx.into_parts(); - json_response(req, &mut state.write_buf.borrow_mut(), &Message::new()) + req.json_response(state, &Message::new()) } async fn db(ctx: Ctx<'_>) -> HandleResult { let (req, state) = ctx.into_parts(); let world = state.client.get_world().await?; - json_response(req, &mut state.write_buf.borrow_mut(), &world) + req.json_response(state, &world) } async fn fortunes(ctx: Ctx<'_>) -> HandleResult { let (req, state) = ctx.into_parts(); use sailfish::TemplateOnce; let fortunes = state.client.tell_fortune().await?.render_once()?; - let mut res = req.into_response(Bytes::from(fortunes)); - res.headers_mut().insert(CONTENT_TYPE, TEXT_HTML_UTF8); - Ok(res) + req.html_response(fortunes) } async fn queries(ctx: Ctx<'_>) -> HandleResult { let (req, state) = ctx.into_parts(); let num = req.uri().query().parse_query(); let worlds = state.client.get_worlds(num).await?; - json_response(req, &mut state.write_buf.borrow_mut(), worlds.as_slice()) + req.json_response(state, &worlds) } async fn updates(ctx: Ctx<'_>) -> HandleResult { let (req, state) = ctx.into_parts(); let num = req.uri().query().parse_query(); let worlds = state.client.update(num).await?; - json_response(req, &mut state.write_buf.borrow_mut(), worlds.as_slice()) + req.json_response(state, &worlds) } diff --git a/frameworks/Rust/xitca-web/src/main_axum.rs b/frameworks/Rust/xitca-web/src/main_axum.rs index d15aaefdc6e..02fdfba8a20 100644 --- a/frameworks/Rust/xitca-web/src/main_axum.rs +++ b/frameworks/Rust/xitca-web/src/main_axum.rs @@ -99,9 +99,7 @@ mod tower_compat { HttpServiceBuilder, }; use xitca_io::net::io_uring::TcpStream; - use xitca_service::{ - fn_build, middleware::UncheckedReady, ready::ReadyService, Service, ServiceExt, - }; + use xitca_service::{fn_build, middleware::UncheckedReady, ready::ReadyService, Service, ServiceExt}; use xitca_web::service::tower_http_compat::{CompatReqBody, CompatResBody}; pub struct TowerHttp { @@ -112,17 +110,11 @@ mod tower_compat { impl TowerHttp { pub fn service( func: F, - ) -> impl Service< - Response = impl ReadyService + Service<(TcpStream, SocketAddr)>, - Error = impl fmt::Debug, - > + ) -> impl Service, Error = impl fmt::Debug> where F: Fn() -> Fut + Send + Sync + Clone, Fut: Future>, - S: tower::Service< - Request, ()>>, - Response = Response, - >, + S: tower::Service, ()>>, Response = Response>, S::Error: fmt::Debug, B: Body + Send + 'static, { @@ -142,18 +134,12 @@ mod tower_compat { impl Service>> for TowerHttp where - S: tower::Service< - Request, ()>>, - Response = Response, - >, + S: tower::Service, ()>>, Response = Response>, { type Response = Response>; type Error = S::Error; - async fn call( - &self, - req: Request>, - ) -> Result { + async fn call(&self, req: Request>) -> Result { let (parts, ext) = req.into_parts(); let req = Request::from_parts(parts, CompatReqBody::new(ext, ())); let fut = self.service.borrow_mut().call(req); diff --git a/frameworks/Rust/xitca-web/src/main_iou.rs b/frameworks/Rust/xitca-web/src/main_iou.rs index 8ca722f1fbe..af6f8424db0 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_iou.rs @@ -12,31 +12,22 @@ use std::{convert::Infallible, fmt, future::poll_fn, io, pin::pin}; use futures_core::stream::Stream; use xitca_http::{ - body::Once, date::DateTimeService, h1::proto::context::Context, - http::{ - self, - const_header_value::{TEXT, TEXT_HTML_UTF8}, - header::{CONTENT_TYPE, SERVER}, - IntoResponse, RequestExt, StatusCode, - }, + http::{header::SERVER, StatusCode}, }; use xitca_io::{ - bytes::{Bytes, BytesMut}, + bytes::BytesMut, io_uring::BoundedBuf, net::{io_uring::TcpStream as IOUTcpStream, TcpStream}, }; use xitca_service::{fn_build, fn_service, middleware::UncheckedReady, Service, ServiceExt}; use self::{ - ser::{json_response, Message}, + ser::{error_response, IntoResponse, Message, Request, Response}, util::{context_mw, Ctx, QueryParse, SERVER_HEADER_VALUE}, }; -type Request = http::Request>; -type Response = http::Response>; - fn main() -> io::Result<()> { let service = fn_service(handler) .enclosed(context_mw()) @@ -53,47 +44,31 @@ fn main() -> io::Result<()> { .wait() } -async fn handler(ctx: Ctx<'_, Request>) -> Result { +async fn handler(ctx: Ctx<'_, Request<()>>) -> Result { let (req, state) = ctx.into_parts(); let mut res = match req.uri().path() { - "/plaintext" => { - let mut res = req.into_response(const { Bytes::from_static(b"Hello, World!") }); - res.headers_mut().insert(CONTENT_TYPE, TEXT); - res - } - "/json" => json_response(req, &mut state.write_buf.borrow_mut(), &Message::new()).unwrap(), + "/plaintext" => req.text_response().unwrap(), + "/json" => req.json_response(state, &Message::new()).unwrap(), "/db" => { let world = state.client.get_world().await.unwrap(); - json_response(req, &mut state.write_buf.borrow_mut(), &world).unwrap() + req.json_response(state, &world).unwrap() } "/queries" => { let num = req.uri().query().parse_query(); let worlds = state.client.get_worlds(num).await.unwrap(); - json_response(req, &mut state.write_buf.borrow_mut(), worlds.as_slice()).unwrap() + req.json_response(state, &worlds).unwrap() } "/updates" => { let num = req.uri().query().parse_query(); let worlds = state.client.update(num).await.unwrap(); - json_response(req, &mut state.write_buf.borrow_mut(), worlds.as_slice()).unwrap() + req.json_response(state, &worlds).unwrap() } "/fortunes" => { use sailfish::TemplateOnce; - let fortunes = state - .client - .tell_fortune() - .await - .unwrap() - .render_once() - .unwrap(); - let mut res = req.into_response(Bytes::from(fortunes)); - res.headers_mut().append(CONTENT_TYPE, TEXT_HTML_UTF8); - res - } - _ => { - let mut res = req.into_response(Bytes::new()); - *res.status_mut() = StatusCode::NOT_FOUND; - res + let fortunes = state.client.tell_fortune().await.unwrap().render_once().unwrap(); + req.html_response(fortunes).unwrap() } + _ => error_response(StatusCode::NOT_FOUND), }; res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); Ok(res) @@ -107,7 +82,7 @@ struct Http1IOU { // runner for http service. impl Service for Http1IOU where - S: Service, + S: Service, Response = Response>, S::Error: fmt::Debug, { type Response = (); @@ -138,10 +113,7 @@ where let (parts, body) = self.service.call(req).await.unwrap().into_parts(); let mut encoder = ctx.encode_head(parts, &body, &mut write_buf).unwrap(); let mut body = pin!(body); - let chunk = poll_fn(|cx| body.as_mut().poll_next(cx)) - .await - .unwrap() - .unwrap(); + let chunk = poll_fn(|cx| body.as_mut().poll_next(cx)).await.unwrap().unwrap(); encoder.encode(chunk, &mut write_buf); encoder.encode_eof(&mut write_buf); } diff --git a/frameworks/Rust/xitca-web/src/main_sync.rs b/frameworks/Rust/xitca-web/src/main_sync.rs index cf36166ac70..ae49ebf5827 100644 --- a/frameworks/Rust/xitca-web/src/main_sync.rs +++ b/frameworks/Rust/xitca-web/src/main_sync.rs @@ -51,17 +51,11 @@ fn fortunes(StateOwn(pool): StateOwn) -> HandleResult> { } #[route("/queries", method = get)] -fn queries( - Query(Num(num)): Query, - StateOwn(pool): StateOwn, -) -> HandleResult> { +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> { +fn updates(Query(Num(num)): Query, StateOwn(pool): StateOwn) -> HandleResult> { pool.update(num).map(Json) } diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index ca1c56caf70..e52f2f9c92c 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -5,11 +5,19 @@ use std::borrow::Cow; use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; use xitca_http::{ body::Once, - bytes::{BufMutWriter, Bytes, BytesMut}, - http::{const_header_value::JSON, header::CONTENT_TYPE, IntoResponse, Request, Response}, + bytes::{BufMutWriter, Bytes}, + http::{ + self, + const_header_value::{JSON, TEXT, TEXT_HTML_UTF8}, + header::CONTENT_TYPE, + IntoResponse as _, RequestExt, StatusCode, + }, }; -use crate::util::Error; +use crate::util::{Error, State}; + +const HELLO: &str = "Hello, World!"; +const HELLO_BYTES: &[u8] = HELLO.as_bytes(); #[derive(Clone)] pub struct Message { @@ -19,9 +27,7 @@ pub struct Message { impl Message { #[inline] pub const fn new() -> Self { - Self { - message: "Hello, World!", - } + Self { message: HELLO } } } @@ -128,8 +134,7 @@ impl<'de> Deserialize<'de> for Num { where V: MapAccess<'de>, { - map.next_key::()? - .ok_or_else(|| Error::missing_field("q"))?; + 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)) @@ -163,16 +168,44 @@ impl Serialize for World { } } -pub fn json_response( - req: Request, - buf: &mut BytesMut, - value: &S, -) -> Result>, Error> -where - S: ?Sized + Serialize, -{ - serde_json::to_writer(BufMutWriter(buf), value)?; - let mut res = req.into_response(buf.split().freeze()); - res.headers_mut().insert(CONTENT_TYPE, JSON); - Ok(res) +pub type Request = http::Request>; +pub type Response = http::Response>; + +pub trait IntoResponse: Sized { + fn json_response(self, state: &State, val: &impl Serialize) -> Result; + + fn text_response(self) -> Result; + + fn html_response(self, val: String) -> Result; +} + +impl IntoResponse for Request { + fn json_response(self, state: &State, val: &impl Serialize) -> Result { + let buf = &mut *state.write_buf.borrow_mut(); + serde_json::to_writer(BufMutWriter(buf), val)?; + let mut res = self.into_response(buf.split().freeze()); + res.headers_mut().insert(CONTENT_TYPE, JSON); + Ok(res) + } + + fn text_response(self) -> Result { + let mut res = self.into_response(const { Bytes::from_static(HELLO_BYTES) }); + res.headers_mut().insert(CONTENT_TYPE, TEXT); + Ok(res) + } + + fn html_response(self, val: String) -> Result { + let mut res = self.into_response(Bytes::from(val)); + res.headers_mut().insert(CONTENT_TYPE, TEXT_HTML_UTF8); + Ok(res) + } +} + +#[cold] +#[inline(never)] +pub fn error_response(status: StatusCode) -> Response { + http::Response::builder() + .status(status) + .body(Once::new(Bytes::new())) + .unwrap() } diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index dc0476a5d15..707279559ba 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -65,9 +65,7 @@ mod non_wasm { pub type Ctx<'a, Req> = Context<'a, Req, State>; - pub fn context_mw( - ) -> ContextBuilder Pin>>>>> - { + pub fn context_mw() -> ContextBuilder Pin>>>>> { ContextBuilder::new(|| { Box::pin(async { db::create().await.map(|client| State { From ced92062ee65608268915a8735de7ec427bcea54 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Thu, 5 Sep 2024 22:03:30 +0200 Subject: [PATCH 0793/1766] [Python] Bump Granian to 1.6 (#9253) --- frameworks/Python/granian/requirements.txt | 2 +- frameworks/Python/granian/run.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index 1a22a3ddfc2..90c02f2c8d4 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.29.0 -granian>=1.5.1,<1.6.0 +granian>=1.6.0,<1.7.0 jinja2==3.1.4 orjson==3.10.2 diff --git a/frameworks/Python/granian/run.py b/frameworks/Python/granian/run.py index 910b248422b..ef0724fad2f 100644 --- a/frameworks/Python/granian/run.py +++ b/frameworks/Python/granian/run.py @@ -7,9 +7,11 @@ if __name__ == '__main__': interface = sys.argv[1] threading_mode = sys.argv[2] + workers = multiprocessing.cpu_count() - #: split cores between the two loops - workers = round(multiprocessing.cpu_count() / 2) + if interface == "rsgi": + #: split cores between the two loops + workers = round(workers / 2) blocking_threads = None if interface == "wsgi": From 49663874d8b9bd42143fd20987a75dc90f8ed7f9 Mon Sep 17 00:00:00 2001 From: lospejos Date: Tue, 10 Sep 2024 23:10:44 +0300 Subject: [PATCH 0794/1766] Bumped version for Java, Jooby, Maven and other libraries/dependencies (#9182) * Bumped version for Java, Jooby, Maven and other libraries/dependencies * Bumped dependencies versions * Bumped dependencies versions * Bumped dependencies versions * Bumped dependencies versions * Fixed Resource_ issue * Bumped versions for Golang, Fiber and other dependencies * Bumped many deps versions, removed deprecated reuseBuffer() in Rocker * Bumped versions for Golang, Fiber and other dependencies --- frameworks/Go/fiber/fiber-prefork.dockerfile | 2 +- frameworks/Go/fiber/fiber.dockerfile | 2 +- frameworks/Go/fiber/src/go.mod | 30 ++++---- frameworks/Go/fiber/src/go.sum | 74 ++++++++----------- frameworks/Java/jooby/pom.xml | 12 +-- .../src/main/java/com/techempower/MvcApp.java | 2 +- frameworks/Kotlin/kooby/kooby.dockerfile | 2 +- frameworks/Kotlin/kooby/pom.xml | 20 ++--- .../Kotlin/kooby/src/main/kotlin/kooby/App.kt | 2 +- 9 files changed, 67 insertions(+), 79 deletions(-) diff --git a/frameworks/Go/fiber/fiber-prefork.dockerfile b/frameworks/Go/fiber/fiber-prefork.dockerfile index 85acc26ef6b..c741baca1b8 100644 --- a/frameworks/Go/fiber/fiber-prefork.dockerfile +++ b/frameworks/Go/fiber/fiber-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.20 +FROM docker.io/golang:1.23 WORKDIR /fiber diff --git a/frameworks/Go/fiber/fiber.dockerfile b/frameworks/Go/fiber/fiber.dockerfile index 37f02a59405..23c8ab72ea7 100644 --- a/frameworks/Go/fiber/fiber.dockerfile +++ b/frameworks/Go/fiber/fiber.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.20 +FROM docker.io/golang:1.23 WORKDIR /fiber diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index bb9b8bc5701..252db9355e6 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -1,30 +1,30 @@ module fiber/app -go 1.19 +go 1.23 require ( - github.com/goccy/go-json v0.10.0 + github.com/goccy/go-json v0.10.3 github.com/gofiber/fiber/v2 v2.52.5 - github.com/jackc/pgx/v5 v5.5.4 - github.com/valyala/quicktemplate v1.7.0 + github.com/jackc/pgx/v5 v5.6.0 + github.com/valyala/quicktemplate v1.8.0 ) require ( - github.com/andybalholm/brotli v1.0.5 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/mattn/go-colorable v0.1.13 // 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/mattn/go-runewidth v0.0.16 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/fasthttp v1.55.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 + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 1414375d002..1cada1ee655 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -1,72 +1,60 @@ -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.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= 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/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= -github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.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-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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= 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= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= 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.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/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 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/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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.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/fasthttp v1.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= +github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= +github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= +github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -golang.org/x/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= -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= -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= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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.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.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/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index bd6ce1a1c68..99170fb8cfe 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,10 +11,10 @@ jooby - 3.2.4 - 4.1.111.Final + 3.2.9 + 4.1.112.Final 2.0.2 - 42.7.3 + 42.7.4 UTF-8 21 21 @@ -72,7 +72,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.5.0 + 3.6.0 add-source @@ -110,7 +110,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.12.1 + 3.13.0 @@ -130,7 +130,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.6.0 uber-jar diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java b/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java index 68d09e0a472..ad40629a635 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java @@ -17,7 +17,7 @@ public static void main(String[] args) { /** Template engine: */ app.install(new RockerModule()); - app.mvc(new Resource(app.require(DataSource.class))); + app.mvc(new Resource_(app.require(DataSource.class))); }); } } diff --git a/frameworks/Kotlin/kooby/kooby.dockerfile b/frameworks/Kotlin/kooby/kooby.dockerfile index 56c278c467a..678fc57b8d4 100644 --- a/frameworks/Kotlin/kooby/kooby.dockerfile +++ b/frameworks/Kotlin/kooby/kooby.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 +FROM maven:3.9.9-eclipse-temurin-22-alpine WORKDIR /kooby COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Kotlin/kooby/pom.xml b/frameworks/Kotlin/kooby/pom.xml index 9ae92257022..4ff8df958da 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -12,12 +12,12 @@ kooby: jooby+kotlin - 3.0.5 - 42.7.2 + 3.3.0 + 42.7.4 UTF-8 - 17 - 17 - 1.8.21 + 22 + 22 + 2.0.20 kooby.AppKt @@ -52,7 +52,7 @@ com.mysql mysql-connector-j - 8.2.0 + 9.0.0 @@ -77,7 +77,7 @@ com.fizzed rocker-maven-plugin - 1.3.0 + 1.4.0 generate-rocker-templates @@ -98,7 +98,7 @@ kotlin-maven-plugin ${kotlin.version} - 17 + 22 @@ -127,7 +127,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.13.0 @@ -159,7 +159,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.6.0 uber-jar diff --git a/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt b/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt index edc43137b1b..958991e29d3 100644 --- a/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt +++ b/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt @@ -33,7 +33,7 @@ fun main(args: Array) { runApp(args, EVENT_LOOP) { /** Template engine: */ - install(RockerModule().reuseBuffer(true)) + install(RockerModule()) /** JSON: */ install(JacksonModule()) From ba6923509494dc5ed1d1b48d2f5e8f79c9bc0510 Mon Sep 17 00:00:00 2001 From: Dragos Varovici Date: Tue, 10 Sep 2024 14:11:29 -0600 Subject: [PATCH 0795/1766] Zap upgraded to 0.8 (#9254) * Zap upgraded to 0.8 * Zap 0.8 fixes --- frameworks/Zig/zap/build.zig | 42 +++++++-------- frameworks/Zig/zap/build.zig.zon | 34 +++++------- frameworks/Zig/zap/run.sh | 2 +- frameworks/Zig/zap/src/endpoints.zig | 33 ++++++------ frameworks/Zig/zap/src/main.zig | 11 ++-- frameworks/Zig/zap/src/middleware.zig | 10 ++-- frameworks/Zig/zap/src/pool.zig | 77 +++++++++++++++------------ frameworks/Zig/zap/zap.dockerfile | 46 ++++++++-------- 8 files changed, 128 insertions(+), 127 deletions(-) diff --git a/frameworks/Zig/zap/build.zig b/frameworks/Zig/zap/build.zig index 70c740351a1..762284c2acb 100644 --- a/frameworks/Zig/zap/build.zig +++ b/frameworks/Zig/zap/build.zig @@ -1,9 +1,12 @@ const std = @import("std"); +const ModuleMap = std.StringArrayHashMap(*std.Build.Module); +var gpa = std.heap.GeneralPurposeAllocator(.{}){}; +const allocator = gpa.allocator(); // 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 { +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 @@ -15,41 +18,38 @@ pub fn build(b: *std.Build) void { // set a preferred release mode, allowing the user to decide how to optimize. const optimize = b.standardOptimizeOption(.{}); + const dep_opts = .{ .target = target, .optimize = optimize }; + 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" }, + .root_source_file = b.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")); + var modules = ModuleMap.init(allocator); + defer modules.deinit(); - const dig = b.dependency("dig", .{ - .target = target, - .optimize = optimize, - }); - exe.addModule("dns", dig.module("dns")); + const zap_module = b.dependency("zap", dep_opts).module("zap"); + const pg_module = b.dependency("pg", dep_opts).module("pg"); + const dig_module = b.dependency("dig", dep_opts).module("dns"); + + try modules.put("zap", zap_module); + try modules.put("pg", pg_module); + try modules.put("dig", dig_module); - // const mustache = b.dependency("mustache", .{ - // .target = target, - // .optimize = optimize, - // }); - // exe.addModule("mustache", mustache.module("mustache")); + // // Expose this as a module that others can import + exe.root_module.addImport("zap", zap_module); + exe.root_module.addImport("pg", pg_module); + exe.root_module.addImport("dig", dig_module); exe.linkLibrary(zap.artifact("facil.io")); @@ -84,7 +84,7 @@ pub fn build(b: *std.Build) void { // 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" }, + .root_source_file = b.path("src/main.zig"), .target = target, .optimize = optimize, }); diff --git a/frameworks/Zig/zap/build.zig.zon b/frameworks/Zig/zap/build.zig.zon index 3abfe719e55..871e73b7f76 100644 --- a/frameworks/Zig/zap/build.zig.zon +++ b/frameworks/Zig/zap/build.zig.zon @@ -1,21 +1,13 @@ -.{ - .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 +.{ .name = "Zap testing", .version = "0.1.1", .paths = .{ + "build.zig", + "build.zig.zon", + "src", +}, .dependencies = .{ + .zap = .{ + .url = "https://github.com/zigzap/zap/archive/refs/tags/v0.8.0.tar.gz", + .hash = "12209936c3333b53b53edcf453b1670babb9ae8c2197b1ca627c01e72670e20c1a21", + }, + .pg = .{ .url = "https://github.com/karlseguin/pg.zig/archive/239a4468163a49d8c0d03285632eabe96003e9e2.tar.gz", + .hash = "1220a1d7e51e2fa45e547c76a9e099c09d06e14b0b9bfc6baa89367f56f1ded399a0" }, + .dig = .{ .url = "https://github.com/lun-4/zigdig/archive/a54c85c26aa83c64ee81e3ee1818890be5cbed0b.tar.gz", .hash = "1220f078ab62d1328339504f9122dc4d241be30ada451628d78b8a3bf5bb9be1dcba" }, +} } diff --git a/frameworks/Zig/zap/run.sh b/frameworks/Zig/zap/run.sh index 95c2266e8bd..b4698a15de1 100644 --- a/frameworks/Zig/zap/run.sh +++ b/frameworks/Zig/zap/run.sh @@ -1,3 +1,3 @@ -echo "Waiting for ZAP to start..." +echo "Waiting for ZAP framework 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 index aeeffbf4e0a..3492e686591 100644 --- a/frameworks/Zig/zap/src/endpoints.zig +++ b/frameworks/Zig/zap/src/endpoints.zig @@ -64,27 +64,27 @@ pub const FortunesEndpoint = struct { defer conn.release(); var rows = try conn.query("SELECT id, message FROM Fortune", .{}); - rows.deinit(); + defer 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); + const 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); + const fortune = Fortune{ .id = 0, .message = "Additional fortune added at request time." }; + try fortunes.append(fortune); - var fortunes_slice = try fortunes.toOwnedSlice(); + const 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); + const fortunes = try getFortunes(pool); self.mutex.lock(); const ret = self.mustache.build(.{ .fortunes = fortunes }); @@ -95,7 +95,7 @@ pub const FortunesEndpoint = struct { // std.debug.print("mustache output {s}\n", .{raw}); - var html = try deescapeHtml(raw); + const html = try deescapeHtml(raw); // std.debug.print("html output {s}\n", .{html}); @@ -103,7 +103,7 @@ pub const FortunesEndpoint = struct { } pub fn get(ep: *zap.Endpoint, req: zap.Request) void { - const self = @fieldParentPtr(Self, "ep", ep); + const self: *FortunesEndpoint = @fieldParentPtr("ep", ep); if (!checkPath(ep, req)) return; @@ -118,7 +118,7 @@ pub const FortunesEndpoint = struct { } } - var fortunes_html = getFortunesHtml(self, pool) catch return; + const fortunes_html = getFortunesHtml(self, pool) catch return; req.sendBody(fortunes_html) catch return; @@ -146,7 +146,7 @@ pub const DbEndpoint = struct { } pub fn get(ep: *zap.Endpoint, req: zap.Request) void { - const self = @fieldParentPtr(Self, "ep", ep); + const self: *DbEndpoint = @fieldParentPtr("ep", ep); if (!checkPath(ep, req)) return; @@ -177,14 +177,13 @@ pub const DbEndpoint = struct { 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| { + const 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) }; + const world = World{ .id = row.get(i32, 0), .randomNumber = row.get(i32, 1) }; var buf: [100]u8 = undefined; var json_to_send: []const u8 = undefined; @@ -218,7 +217,7 @@ pub const PlaintextEndpoint = struct { } pub fn get(ep: *zap.Endpoint, req: zap.Request) void { - const self = @fieldParentPtr(Self, "ep", ep); + const self: *PlaintextEndpoint = @fieldParentPtr("ep", ep); _ = self; if (!checkPath(ep, req)) return; @@ -248,14 +247,14 @@ pub const JsonEndpoint = struct { } pub fn get(ep: *zap.Endpoint, req: zap.Request) void { - const self = @fieldParentPtr(Self, "ep", ep); + const self: *JsonEndpoint = @fieldParentPtr("ep", ep); _ = self; if (!checkPath(ep, req)) return; req.setContentType(.JSON) catch return; - var message = Message{ .message = "Hello, World!" }; + const message = Message{ .message = "Hello, World!" }; var buf: [100]u8 = undefined; var json_to_send: []const u8 = undefined; diff --git a/frameworks/Zig/zap/src/main.zig b/frameworks/Zig/zap/src/main.zig index 489fb5d5b7e..0c66a7639bb 100644 --- a/frameworks/Zig/zap/src/main.zig +++ b/frameworks/Zig/zap/src/main.zig @@ -21,16 +21,12 @@ pub fn main() !void { .child_allocator = gpa.allocator(), }; - var allocator = tsa.allocator(); + const 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; - }); + var prng = std.rand.DefaultPrng.init(@as(u64, @bitCast(std.time.milliTimestamp()))); middleware.SharedAllocator.init(allocator); @@ -66,7 +62,7 @@ pub fn main() !void { ); var headerHandler = middleware.HeaderMiddleWare.init(dbEndpointHandler.getHandler()); - var prngHandler = middleware.PrngMiddleWare.init(headerHandler.getHandler(), &rnd); + var prngHandler = middleware.RandomMiddleWare.init(headerHandler.getHandler(), &prng); var pgHandler = middleware.PgMiddleWare.init(prngHandler.getHandler(), pg_pool); var listener = try zap.Middleware.Listener(middleware.Context).init( @@ -92,4 +88,3 @@ pub fn main() !void { .workers = 1, }); } - diff --git a/frameworks/Zig/zap/src/middleware.zig b/frameworks/Zig/zap/src/middleware.zig index 20c01b7ffde..99fb9255c0c 100644 --- a/frameworks/Zig/zap/src/middleware.zig +++ b/frameworks/Zig/zap/src/middleware.zig @@ -22,7 +22,7 @@ pub const SharedAllocator = struct { // create a combined context struct pub const Context = struct { - prng: ?PrngMiddleWare.Prng = null, + prng: ?RandomMiddleWare.Prng = null, pg: ?PgMiddleWare.Pg = null, }; @@ -47,7 +47,7 @@ pub const HeaderMiddleWare = struct { // 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); + const self: *Self = @fieldParentPtr("handler", handler); _ = self; req.setHeader("Server", "Zap") catch return false; @@ -57,7 +57,7 @@ pub const HeaderMiddleWare = struct { } }; -pub const PrngMiddleWare = struct { +pub const RandomMiddleWare = struct { handler: Handler, rnd: *std.rand.DefaultPrng, @@ -83,7 +83,7 @@ pub const PrngMiddleWare = struct { 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); + const self: *RandomMiddleWare = @fieldParentPtr("handler", handler); context.prng = Prng{ .rnd = self.rnd }; @@ -118,7 +118,7 @@ pub const PgMiddleWare = struct { 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); + const self: *Self = @fieldParentPtr("handler", handler); // do our work: fill in the user field of the context context.pg = Pg{ .pool = self.pool }; diff --git a/frameworks/Zig/zap/src/pool.zig b/frameworks/Zig/zap/src/pool.zig index 7241780a464..84df32104b0 100644 --- a/frameworks/Zig/zap/src/pool.zig +++ b/frameworks/Zig/zap/src/pool.zig @@ -1,7 +1,7 @@ const std = @import("std"); -const pg = @import("pg"); const regex = @import("regex"); -const dns = @import("dns"); +const dns = @import("dig"); +const pg = @import("pg"); const Allocator = std.mem.Allocator; const Pool = pg.Pool; @@ -9,31 +9,22 @@ 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,}); + const info = try parsePostgresConnStr(allocator); + std.debug.print("Connection: {s}:{s}@{s}:{d}/{s}\n", .{ info.username, info.password, info.hostname, info.port, info.database }); + + const pg_pool = try Pool.init(allocator, .{ + .size = 28, + .connect = .{ + .port = info.port, + .host = info.hostname, + }, + .auth = .{ + .username = info.username, + .database = info.database, + .password = info.password, + }, + .timeout = 10_000, + }); return pg_pool; } @@ -67,12 +58,32 @@ fn addressAsString(address: std.net.Address) ![]const u8 { return output; } -fn parsePostgresConnStr() !ConnectionInfo { +fn parsePostgresConnStr(allocator: Allocator) !ConnectionInfo { + const pg_port = try getEnvVar(allocator, "PG_PORT", "5432"); + std.debug.print("tfb port {s}\n", .{pg_port}); + var port = try std.fmt.parseInt(u16, pg_port, 0); + + if (port == 0) { + port = 5432; + } + 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", + .username = try getEnvVar(allocator, "PG_USER", "benchmarkdbuser"), + .password = try getEnvVar(allocator, "PG_PASS", "benchmarkdbpass"), + .hostname = try getEnvVar(allocator, "PG_HOST", "localhost"), + .port = port, + .database = try getEnvVar(allocator, "PG_DB", "hello_world"), }; } + +fn getEnvVar(allocator: Allocator, name: []const u8, default: []const u8) ![]const u8 { + const env_var = std.process.getEnvVarOwned(allocator, name) catch |err| switch (err) { + error.EnvironmentVariableNotFound => return default, + error.OutOfMemory => return err, + error.InvalidWtf8 => return err, + }; + + if (env_var.len == 0) return default; + + return env_var; +} diff --git a/frameworks/Zig/zap/zap.dockerfile b/frameworks/Zig/zap/zap.dockerfile index 580f037bcef..9aa8a4109ae 100644 --- a/frameworks/Zig/zap/zap.dockerfile +++ b/frameworks/Zig/zap/zap.dockerfile @@ -1,42 +1,46 @@ -#FROM ziglang/static-base:llvm15-aarch64-3 as build -FROM buddyspencer/ziglang:0.11.0-r3 as build +FROM fedora:40 AS build 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 src src +COPY run.sh run.sh 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 dnf install -y zig RUN zig version -RUN ls +# RUN zig build -Doptimize=ReleaseFast +RUN zig build +RUN cp /zap/zig-out/bin/zap /usr/local/bin EXPOSE 3000 CMD ["sh", "run.sh"] -FROM alpine:3.19 +# FROM alpine:3.19 -WORKDIR /zap +# WORKDIR /zap -ENV PG_USER=benchmarkdbuser -ENV PG_PASS=benchmarkdbpass -ENV PG_DB=hello_world -ENV PG_HOST=tfb-database -ENV PG_PORT=5432 +# 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 +# RUN apk add libc6-compat -RUN apk update +# COPY run.sh run.sh -COPY --from=build /usr/bin/zap /usr/bin/zap +# COPY --from=build /zap/zig-out/bin/zap /usr/local/bin -EXPOSE 3000 +# EXPOSE 3000 -CMD ["sh", "run.sh"] \ No newline at end of file +# CMD ["sh", "run.sh"] \ No newline at end of file From f03d5ee8221a3c68ab9efe7dd2f4f56c29c73320 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 20:11:35 +0000 Subject: [PATCH 0796/1766] Bump body-parser from 1.19.0 to 1.20.3 in /frameworks/JavaScript/express Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.19.0 to 1.20.3. - [Release notes](https://github.com/expressjs/body-parser/releases) - [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/body-parser/compare/1.19.0...1.20.3) --- updated-dependencies: - dependency-name: body-parser dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 32ea58ae528..09723c74dd8 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "body-parser": "1.19.0", + "body-parser": "1.20.3", "dateformat": "3.0.3", "escape-html": "1.0.3", "express": "4.18.2", From 844094b11d96033697b39bad81c791c88021fe17 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 12 Sep 2024 18:06:27 +0200 Subject: [PATCH 0797/1766] [rails] Delete remaining unused middleware (#9259) The following middleware is unused for the benchmark: - Callbacks - Rack::TempfileReaper The following middleware is already disabled in production by default, so they don't need to be deleted: - ActionDispatch::HostAuthorization - ActionDispatch::Static The remaining middleware are: - ActiveSupport::Cache::Strategy::LocalCache::Middleware - Hello::Application.routes Also sort the middleware. The middleware can be checked using the following command: SECRET_KEY_BASE_DUMMY=1 RAILS_ENV=production_mysql bin/rails middleware --- frameworks/Ruby/rails/config/application.rb | 31 +++++++++---------- .../rails/config/environments/production.rb | 3 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/frameworks/Ruby/rails/config/application.rb b/frameworks/Ruby/rails/config/application.rb index 7e3e1d4af56..75a12720345 100644 --- a/frameworks/Ruby/rails/config/application.rb +++ b/frameworks/Ruby/rails/config/application.rb @@ -30,27 +30,26 @@ class Application < Rails::Application config.action_dispatch.default_headers.merge!('Server' => 'WebServer') - config.middleware.delete ActionDispatch::HostAuthorization - config.middleware.delete Rack::Sendfile - config.middleware.delete ActionDispatch::Static + config.middleware.delete ActionDispatch::Callbacks + config.middleware.delete ActionDispatch::ContentSecurityPolicy::Middleware + config.middleware.delete ActionDispatch::Cookies + config.middleware.delete ActionDispatch::DebugExceptions config.middleware.delete ActionDispatch::Executor - config.middleware.delete Rack::Runtime - config.middleware.delete Rack::MethodOverride - config.middleware.delete ActionDispatch::RequestId + config.middleware.delete ActionDispatch::Flash + config.middleware.delete ActionDispatch::PermissionsPolicy::Middleware + config.middleware.delete ActionDispatch::Reloader config.middleware.delete ActionDispatch::RemoteIp - config.middleware.delete Rails::Rack::Logger + config.middleware.delete ActionDispatch::RequestId + config.middleware.delete ActionDispatch::Session::CookieStore config.middleware.delete ActionDispatch::ShowExceptions - config.middleware.delete ActionDispatch::DebugExceptions - config.middleware.delete ActionDispatch::ActionableExceptions - config.middleware.delete ActionDispatch::Reloader config.middleware.delete ActiveRecord::Migration::CheckPending - config.middleware.delete ActionDispatch::Cookies - config.middleware.delete ActionDispatch::Session::CookieStore - config.middleware.delete ActionDispatch::Flash - config.middleware.delete ActionDispatch::ContentSecurityPolicy::Middleware - config.middleware.delete ActionDispatch::PermissionsPolicy::Middleware - config.middleware.delete Rack::Head config.middleware.delete Rack::ConditionalGet config.middleware.delete Rack::ETag + config.middleware.delete Rack::Head + config.middleware.delete Rack::MethodOverride + config.middleware.delete Rack::Runtime + config.middleware.delete Rack::Sendfile + config.middleware.delete Rack::TempfileReaper + config.middleware.delete Rails::Rack::Logger end end diff --git a/frameworks/Ruby/rails/config/environments/production.rb b/frameworks/Ruby/rails/config/environments/production.rb index f9de0f173d6..45b097c9f04 100644 --- a/frameworks/Ruby/rails/config/environments/production.rb +++ b/frameworks/Ruby/rails/config/environments/production.rb @@ -21,7 +21,8 @@ # config.require_master_key = true # Disable serving static files from `public/`, relying on NGINX/Apache to do so instead. - # config.public_file_server.enabled = false + # This disables the ActionDispatch::Static middleware. + config.public_file_server.enabled = false # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.asset_host = "http://assets.example.com" From a329357a317652fad2f7ac2c0bde2e384264fceb Mon Sep 17 00:00:00 2001 From: Redkale Date: Fri, 13 Sep 2024 00:06:42 +0800 Subject: [PATCH 0798/1766] Update maven:3.9.6 (#9257) * Update maven:3.9.6 * Update graalvm:22.0.2 * Update graalvm-ce:22.3.3 * Update native-image-community:22.0.2 * Update jdk-community:22.0.2 * Update graalvm-ce:ol9 * Update graalvm-ce:ol9 * Update config * Update config * Update config * Update config * Update FortuneRender * Update Redkale-2.8.0 --- frameworks/Java/redkale/BenchmarkService.java | 5 +++ frameworks/Java/redkale/conf/application.xml | 8 ++--- .../Java/redkale/conf/source.properties | 5 +-- frameworks/Java/redkale/pom-jdbc.xml | 9 +++--- frameworks/Java/redkale/pom-pgclient.xml | 9 +++--- frameworks/Java/redkale/pom.xml | 8 ++--- .../Java/redkale/redkale-block.dockerfile | 2 +- .../Java/redkale/redkale-graalvm.dockerfile | 4 +-- .../Java/redkale/redkale-jdbc.dockerfile | 2 +- .../Java/redkale/redkale-native.dockerfile | 10 +++--- .../Java/redkale/redkale-pgclient.dockerfile | 2 +- frameworks/Java/redkale/redkale.dockerfile | 2 +- .../redkalex/benchmark/BenchmarkService.java | 9 ++++-- .../org/redkalex/benchmark/FortuneRender.java | 31 ++++++++++--------- 14 files changed, 58 insertions(+), 48 deletions(-) diff --git a/frameworks/Java/redkale/BenchmarkService.java b/frameworks/Java/redkale/BenchmarkService.java index 06e760bf879..39e9956a75d 100644 --- a/frameworks/Java/redkale/BenchmarkService.java +++ b/frameworks/Java/redkale/BenchmarkService.java @@ -12,6 +12,7 @@ import org.redkale.net.http.*; import org.redkale.service.AbstractService; import org.redkale.source.DataSource; +import org.redkale.util.AnyValue; /** * 测试redkale-jdbc, 需要覆盖到原BenchmarkService @@ -26,6 +27,10 @@ public class BenchmarkService extends AbstractService { @Resource private DataSource source; + public void init(AnyValue conf) { + source.finds(CachedWorld.class, 1); + } + @NonBlocking @RestMapping(auth = false) public byte[] plaintext() { diff --git a/frameworks/Java/redkale/conf/application.xml b/frameworks/Java/redkale/conf/application.xml index d7157c9f8d3..aa535805113 100644 --- a/frameworks/Java/redkale/conf/application.xml +++ b/frameworks/Java/redkale/conf/application.xml @@ -4,19 +4,19 @@ - - + - - + + + diff --git a/frameworks/Java/redkale/conf/source.properties b/frameworks/Java/redkale/conf/source.properties index 9efb8cd4158..f88e22a2a12 100644 --- a/frameworks/Java/redkale/conf/source.properties +++ b/frameworks/Java/redkale/conf/source.properties @@ -4,5 +4,6 @@ redkale.datasource[].url = jdbc:postgresql://tfb-database:5432/hello_world redkale.datasource[].user = benchmarkdbuser redkale.datasource[].password = benchmarkdbpass -redkale.datasource[].warnslowms = 0 -redkale.datasource[].errorslowms = 0 +redkale.datasource[].non-blocking = true +redkale.datasource[].warn-slowms = 0 +redkale.datasource[].error-slowms = 0 diff --git a/frameworks/Java/redkale/pom-jdbc.xml b/frameworks/Java/redkale/pom-jdbc.xml index 93df4fb9464..e617e4e4059 100644 --- a/frameworks/Java/redkale/pom-jdbc.xml +++ b/frameworks/Java/redkale/pom-jdbc.xml @@ -7,12 +7,12 @@ org.redkale.boot.Application - 2.9.0-SNAPSHOT + 2.8.0-SNAPSHOT 1.3.0-SNAPSHOT - 42.6.0 + 42.7.2 UTF-8 - 18 - 18 + 21 + 21 @@ -77,7 +77,6 @@ UTF-8 -parameters - --enable-preview true diff --git a/frameworks/Java/redkale/pom-pgclient.xml b/frameworks/Java/redkale/pom-pgclient.xml index 1e7315a9ff2..47f212a3053 100644 --- a/frameworks/Java/redkale/pom-pgclient.xml +++ b/frameworks/Java/redkale/pom-pgclient.xml @@ -7,13 +7,13 @@ org.redkale.boot.Application - 2.9.0-SNAPSHOT - 1.3.0-SNAPSHOT + 2.8.0-SNAPSHOT + 1.2.0-SNAPSHOT 4.5.8 2.1 UTF-8 - 18 - 18 + 21 + 21 @@ -84,7 +84,6 @@ UTF-8 -parameters - --enable-preview true
    diff --git a/frameworks/Java/redkale/pom.xml b/frameworks/Java/redkale/pom.xml index 78ffcbdd93b..8844a8b7aff 100644 --- a/frameworks/Java/redkale/pom.xml +++ b/frameworks/Java/redkale/pom.xml @@ -7,11 +7,11 @@ org.redkale.boot.Application - 2.9.0-SNAPSHOT - 1.3.0-SNAPSHOT + 2.8.0-SNAPSHOT + 1.2.0-SNAPSHOT UTF-8 - 11 - 11 + 21 + 21 diff --git a/frameworks/Java/redkale/redkale-block.dockerfile b/frameworks/Java/redkale/redkale-block.dockerfile index 36d75c9db4d..b163c60e53f 100644 --- a/frameworks/Java/redkale/redkale-block.dockerfile +++ b/frameworks/Java/redkale/redkale-block.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.6-amazoncorretto-21-debian as maven WORKDIR /redkale COPY src src COPY conf conf diff --git a/frameworks/Java/redkale/redkale-graalvm.dockerfile b/frameworks/Java/redkale/redkale-graalvm.dockerfile index 25ad428f6c8..0e3a9a4a597 100644 --- a/frameworks/Java/redkale/redkale-graalvm.dockerfile +++ b/frameworks/Java/redkale/redkale-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.6-amazoncorretto-21-debian as maven WORKDIR /redkale COPY src src COPY conf conf @@ -6,7 +6,7 @@ COPY pom.xml pom.xml RUN mvn package -q -FROM ghcr.io/graalvm/jdk-community:21.0.0 +FROM ghcr.io/graalvm/jdk-community:22.0.2 WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar diff --git a/frameworks/Java/redkale/redkale-jdbc.dockerfile b/frameworks/Java/redkale/redkale-jdbc.dockerfile index 4588baf43f1..b39997adf5f 100644 --- a/frameworks/Java/redkale/redkale-jdbc.dockerfile +++ b/frameworks/Java/redkale/redkale-jdbc.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.6-amazoncorretto-21-debian as maven WORKDIR /redkale COPY src src COPY conf conf diff --git a/frameworks/Java/redkale/redkale-native.dockerfile b/frameworks/Java/redkale/redkale-native.dockerfile index ae8e0cd7895..56fa1921f96 100644 --- a/frameworks/Java/redkale/redkale-native.dockerfile +++ b/frameworks/Java/redkale/redkale-native.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.6-amazoncorretto-21-debian as maven WORKDIR /redkale COPY src src COPY conf conf @@ -6,15 +6,15 @@ COPY pom.xml pom.xml RUN mvn package -q -FROM ghcr.io/graalvm/graalvm-ce:ol9-java17-22.3.3 -RUN gu install native-image +FROM ghcr.io/graalvm/native-image-community:22.0.2 as native WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar - RUN native-image -H:+ReportExceptionStackTraces --report-unsupported-elements-at-runtime -jar redkale-benchmark.jar -RUN ls -lh +FROM ghcr.io/graalvm/jdk-community:22.0.2 +WORKDIR /redkale +COPY --from=native /redkale/redkale-benchmark redkale-benchmark EXPOSE 8080 diff --git a/frameworks/Java/redkale/redkale-pgclient.dockerfile b/frameworks/Java/redkale/redkale-pgclient.dockerfile index fdc4786a478..6da37e715c5 100644 --- a/frameworks/Java/redkale/redkale-pgclient.dockerfile +++ b/frameworks/Java/redkale/redkale-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.6-amazoncorretto-21-debian as maven WORKDIR /redkale COPY src src COPY conf conf diff --git a/frameworks/Java/redkale/redkale.dockerfile b/frameworks/Java/redkale/redkale.dockerfile index 8982ae3b16d..4bb09a8dd56 100644 --- a/frameworks/Java/redkale/redkale.dockerfile +++ b/frameworks/Java/redkale/redkale.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.8.6-openjdk-18-slim as maven +FROM maven:3.9.6-amazoncorretto-21-debian as maven WORKDIR /redkale COPY src src COPY conf conf 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 20f816362d2..48af592f928 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 @@ -13,6 +13,7 @@ import org.redkale.net.http.*; import org.redkale.service.AbstractService; import org.redkale.source.DataSource; +import org.redkale.util.AnyValue; /** * @@ -27,6 +28,10 @@ public class BenchmarkService extends AbstractService { @Resource private DataSource source; + public void init(AnyValue conf) { + source.finds(CachedWorld.class, 1); + } + @RestMapping(auth = false) public byte[] plaintext() { return helloBytes; @@ -53,8 +58,8 @@ public CompletableFuture> updates(int q) { IntStream ids = ThreadLocalRandom.current().ints(size, 1, 10001); int[] newNumbers = ThreadLocalRandom.current().ints(size, 1, 10001).toArray(); return source.findsListAsync(World.class, ids.boxed()) - .thenCompose(words -> source.updateAsync(World.updateNewNumbers(words, newNumbers)) - .thenApply(v -> words)); + .thenCompose(words -> source.updateAsync(World.updateNewNumbers(words, newNumbers)) + .thenApply(v -> words)); } @RestMapping(auth = false) diff --git a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/FortuneRender.java b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/FortuneRender.java index 201c58bc741..651864d0da5 100644 --- a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/FortuneRender.java +++ b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/FortuneRender.java @@ -7,6 +7,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.function.Function; import org.redkale.convert.Convert; import org.redkale.net.http.*; import org.redkale.util.*; @@ -19,7 +20,9 @@ public class FortuneRender implements org.redkale.net.http.HttpRender { private static final String contentType = "text/html; charset=utf-8"; - private static final byte[] text1 = "Fortunes".getBytes(StandardCharsets.UTF_8); + private static final byte[] text1 = + "Fortunes
    idmessage
    " + .getBytes(StandardCharsets.UTF_8); private static final byte[] text2 = "
    idmessage
    ".getBytes(StandardCharsets.UTF_8); @@ -29,9 +32,9 @@ public class FortuneRender implements org.redkale.net.http.HttpRender { private static final byte[] text5 = "
    ".getBytes(StandardCharsets.UTF_8); - private final ThreadLocal localByteArray = ThreadLocal.withInitial(() -> new ByteArray(1280)); + private static final String arrayName = "fortuneByteArray"; - private final ThreadLocal localTmpArray = ThreadLocal.withInitial(() -> new ByteArray(128)); + private static final Function arrayFunc = s -> new ByteArray(1280); private byte[][] idBytesCache; @@ -53,12 +56,11 @@ public void init(HttpContext context, AnyValue config) { @Override public void renderTo(HttpRequest request, HttpResponse response, Convert convert, HttpScope scope) { - ByteArray array = localByteArray.get().clear(); + ByteArray array = request.getSubobjectIfAbsent(arrayName, arrayFunc).clear(); array.put(text1); - ByteArray tmp = localTmpArray.get(); for (Fortune item : (List) scope.getReferObj()) { - array.put(text2).put(escapeId(item.getId())) - .put(text3).put(escapeMessage(tmp, item.getMessage())).put(text4); + ByteArray msg = request.getSubobjectIfAbsent(item.getMessage(), this::escapeMessage); + array.put(text2).put(escapeId(item.getId())).put(text3).put(msg).put(text4); } array.put(text5); response.finish(contentType, array); @@ -72,23 +74,22 @@ private byte[] escapeId(int id) { } } - private ByteArray escapeMessage(ByteArray tmp, String message) { - tmp.clear(); + private ByteArray escapeMessage(String message) { + ByteArray array = new ByteArray(128); CharSequence cs = message; for (int i = 0; i < cs.length(); i++) { char c = cs.charAt(i); byte[] bs = c < escapeCache.length ? escapeCache[c] : null; if (bs != null) { - tmp.put(bs); + array.put(bs); } else if (c < 0x80) { - tmp.put((byte) c); + array.put((byte) c); } else if (c < 0x800) { - tmp.put((byte) (0xc0 | (c >> 6)), (byte) (0x80 | (c & 0x3f))); + array.put((byte) (0xc0 | (c >> 6)), (byte) (0x80 | (c & 0x3f))); } else { - tmp.put((byte) (0xe0 | ((c >> 12))), (byte) (0x80 | ((c >> 6) & 0x3f)), (byte) (0x80 | (c & 0x3f))); + array.put((byte) (0xe0 | (c >> 12)), (byte) (0x80 | ((c >> 6) & 0x3f)), (byte) (0x80 | (c & 0x3f))); } } - return tmp; + return array; } - } From aac290b65e3178e330b8ef2948b953023d0ba4f7 Mon Sep 17 00:00:00 2001 From: SaltyAom Date: Thu, 12 Sep 2024 23:06:55 +0700 Subject: [PATCH 0799/1766] [Elysia] add compiled configuration, use cluster mode, optimize performance (#9251) * feat(elysia): use cluster mode, static resource, add compiled mode * feat(elysia): use imperative for-loop instead of map to optimize performance --- .../TypeScript/elysia/benchmark_config.json | 23 +++++++ frameworks/TypeScript/elysia/bun.lockb | Bin 4963 -> 3513 bytes .../elysia/elysia-compiled.dockerfile | 15 +++++ .../elysia/elysia-postgres.dockerfile | 6 +- .../elysia/elysia-smol-postgres.dockerfile | 8 +-- .../TypeScript/elysia/elysia.dockerfile | 2 +- frameworks/TypeScript/elysia/package.json | 8 +-- frameworks/TypeScript/elysia/spawn.ts | 18 ------ .../TypeScript/elysia/src/db-handlers.ts | 59 +++++++++--------- frameworks/TypeScript/elysia/src/index.ts | 39 +++++------- frameworks/TypeScript/elysia/src/postgres.ts | 37 ++++++----- frameworks/TypeScript/elysia/src/server.ts | 20 ++++++ 12 files changed, 133 insertions(+), 102 deletions(-) create mode 100644 frameworks/TypeScript/elysia/elysia-compiled.dockerfile delete mode 100644 frameworks/TypeScript/elysia/spawn.ts create mode 100644 frameworks/TypeScript/elysia/src/server.ts diff --git a/frameworks/TypeScript/elysia/benchmark_config.json b/frameworks/TypeScript/elysia/benchmark_config.json index 1a0652745db..04e9073cbe8 100755 --- a/frameworks/TypeScript/elysia/benchmark_config.json +++ b/frameworks/TypeScript/elysia/benchmark_config.json @@ -62,6 +62,29 @@ "display_name": "Elysia [smol] [PostgreSQL]", "notes": "", "versus": "nodejs" + }, + "compiled": { + "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": "elysia", + "language": "TypeScript", + "flavor": "None", + "orm": "Raw", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Elysia [Compiled]", + "notes": "", + "versus": "nodejs" } } ] diff --git a/frameworks/TypeScript/elysia/bun.lockb b/frameworks/TypeScript/elysia/bun.lockb index 7e29924798c25d30517bcca2ed92c9934b0540fa..0020cf63f06be5b698becc47ddfdaa4336096013 100755 GIT binary patch delta 600 zcmaE?wo`h7p60FYj0cti2jnY#70S<@wUYhy!=#8|`@K(c=FNg#Q4GAFb7*;%tM9Z9tQ%OpSJWAA>c-7io3E-Pr* zAmkua_~S>ViP!UlR`spP4Egq@o7s-P-Y~25@z$=`=bp}N1>vTfS=n|oPIl(%nY@P6 zWwQfU1S8i5sN0WlOitsmlLNW*-+u@IvDtz615^nQ=j44nMq(^LA&}?UfY^c)NB}_u zNJ?q44X*-M2TX`-av87IH6v0%ME^7XX0LGh3YryXFG&mD=j`fqjG-MrOb)?QN3zgZ7n(TZH~PPoV9xrqX(n# zWKTwWUT>gLCP1x>K$>xKAd~iF2SyIYZIe$j+B5!~%*kZW7(Ce%NVZSz1d>-LpJXxz zsSp$dT4fE>2h=M*nUPT)ERz6~0h!1F6lDcs9=OaDpo|qzMg$}Z#C&j>TR<5{pbSX8 z6cDolWwh&AfGiLO0T2z61qA^J5JLkE1qBNO$ZsI~Kr}FT;edeoW?+T*EW&ER@$A#y+c3j#&-(1Fj{V|p-L0h|~^u}4Q zH!s(nv5aX~)1>wHX4jR>WZc}!vYWAMZzKcK5YK?wsa7tVyTPpwIduTePB+$K|; z;8>)+%D@%n!bcjYgx?Y<#hI^804q5N78->Zw>^>Li~@#=O|_d$k7uR4u8PdJ
    Qfl|1()92?QpJt!in3HqP~aSWo(a4 zC_BI_Cc1XAVD8s_*Ww}$mO5*7IICPSoQPyFFpge$m~LKz1`}P48=f$ql^;|7u)sE$TVTLi=W0?UKpi43&~(m zbix3OT0oEW^Mxf&T&n^LCohr@YY+*`Fn)W~`i%X!P9W|RKDSm&r-&-{8Rn?No0_^>h&#<{n4qyw|EWjSYI9Y-H2-gBoQUQW3Jd=w! z?48+JrAo}eSe$ImsVD_f z4$}rQaRF4>C%(x^oLbUA5pd>)KPg^VCvBVxeN%vr3}zESYZOxW2$Flrf0(7zzq0_BuOz+70jx_uFFz#}$}BIQ9K|gy3g-bemKW=Sy=F8yo=080;)vj>Vmy(3Q|8=kbMRKOc#%C diff --git a/frameworks/TypeScript/elysia/elysia-compiled.dockerfile b/frameworks/TypeScript/elysia/elysia-compiled.dockerfile new file mode 100644 index 00000000000..73de65fcfa7 --- /dev/null +++ b/frameworks/TypeScript/elysia/elysia-compiled.dockerfile @@ -0,0 +1,15 @@ +FROM oven/bun:1.1 + +EXPOSE 8080 + +COPY . . + +ENV NODE_ENV production + +RUN bun install --production + +ENV DATABASE postgres + +RUN bun run compile + +CMD ["./server"] diff --git a/frameworks/TypeScript/elysia/elysia-postgres.dockerfile b/frameworks/TypeScript/elysia/elysia-postgres.dockerfile index 40ff868c528..68ce83d3325 100644 --- a/frameworks/TypeScript/elysia/elysia-postgres.dockerfile +++ b/frameworks/TypeScript/elysia/elysia-postgres.dockerfile @@ -8,8 +8,8 @@ ENV NODE_ENV production RUN bun install --production -RUN bun run build - ENV DATABASE postgres -CMD ["bun", "spawn.ts"] +RUN bun run build + +CMD ["bun", "./dist/index.js"] diff --git a/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile b/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile index de7b9d63bb0..fa6c7a7aca7 100644 --- a/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile +++ b/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile @@ -6,12 +6,12 @@ COPY . . ENV NODE_ENV production -RUN bun install --production - -RUN bun run build +RUN bun install ENV DATABASE postgres +RUN bun run build + RUN sed -i 's/smol = false/smol = true/g' bunfig.toml -CMD ["bun", "spawn.ts"] +CMD ["bun", "./dist/index.js"] diff --git a/frameworks/TypeScript/elysia/elysia.dockerfile b/frameworks/TypeScript/elysia/elysia.dockerfile index 3ed07652df1..f95b8706c6c 100644 --- a/frameworks/TypeScript/elysia/elysia.dockerfile +++ b/frameworks/TypeScript/elysia/elysia.dockerfile @@ -10,4 +10,4 @@ RUN bun install --production RUN bun run build -CMD ["bun", "spawn.ts"] +CMD ["bun", "./dist/index.js"] diff --git a/frameworks/TypeScript/elysia/package.json b/frameworks/TypeScript/elysia/package.json index ba38bf05ee6..c23716506c8 100644 --- a/frameworks/TypeScript/elysia/package.json +++ b/frameworks/TypeScript/elysia/package.json @@ -3,16 +3,16 @@ "version": "0.0.1", "module": "src/index.js", "devDependencies": { - "bun-types": "^1.1.23", "typescript": "^5.5.4" }, "scripts": { "dev": "bun run --watch src/index.ts", "start": "bun run src/index.ts", - "build": "bun build --compile --minify --outfile server src/index.ts" + "build": "bun build --minify --target bun --outdir dist src/index.ts", + "compile": "bun build --compile --minify --target bun --outfile server src/index.ts" }, "dependencies": { - "elysia": "^1.1.6", + "elysia": "^1.1.12", "postgres": "^3.4.4" } -} \ No newline at end of file +} diff --git a/frameworks/TypeScript/elysia/spawn.ts b/frameworks/TypeScript/elysia/spawn.ts deleted file mode 100644 index 3bf8959c230..00000000000 --- a/frameworks/TypeScript/elysia/spawn.ts +++ /dev/null @@ -1,18 +0,0 @@ -const cpus = navigator.hardwareConcurrency; -const buns = new Array(cpus); - -for (let i = 0; i < cpus; i++) { - buns[i] = Bun.spawn(['./server'], { - stdio: ['inherit', 'inherit', 'inherit'], - env: { ...process.env }, - }); -} - -function kill() { - for (const bun of buns) { - bun.kill(); - } -} - -process.on('SIGINT', kill); -process.on('exit', kill); \ No newline at end of file diff --git a/frameworks/TypeScript/elysia/src/db-handlers.ts b/frameworks/TypeScript/elysia/src/db-handlers.ts index d75e91ff1a5..b75ccfdea60 100644 --- a/frameworks/TypeScript/elysia/src/db-handlers.ts +++ b/frameworks/TypeScript/elysia/src/db-handlers.ts @@ -1,64 +1,63 @@ -import Elysia from 'elysia'; -import * as db from './postgres'; -import { Fortune } from './types'; +import { Elysia, t } from "elysia"; +import * as db from "./postgres"; +import { Fortune } from "./types"; -function rand () { - return Math.ceil(Math.random() * 10000) +function rand() { + return Math.ceil(Math.random() * 10000); } -function parseQueriesNumber (q?: string) { - return Math.min(parseInt(q || '1') || 1, 500) +function parseQueriesNumber(q?: string) { + return Math.min(parseInt(q || "1") || 1, 500); } -function renderTemplate (fortunes: Fortune[]) { +function renderTemplate(fortunes: Fortune[]) { const n = fortunes.length; - let html = ''; + let html = ""; for (let i = 0; i < n; i++) { html += `${fortunes[i].id}${Bun.escapeHTML( - fortunes[i].message + fortunes[i].message, )}`; } return `Fortunes${html}
    idmessage
    `; } -const dbHandlers = new Elysia({ - name: 'db-handlers', -}) - .onAfterHandle(({ set }) => { - set.headers['server'] = 'Elysia'; +export const dbHandlers = new Elysia() + .headers({ + server: "Elysia", }) - - .get('/db', () => db.find(rand())) - - .get('/fortunes', async ({ set }) => { + .get("/db", () => db.find(rand())) + .get("/fortunes", async (c) => { const fortunes = await db.fortunes(); fortunes.push({ id: 0, - message: 'Additional fortune added at request time.', + message: "Additional fortune added at request time.", + }); + + fortunes.sort((a, b) => { + if (a.message < b.message) return -1; + + return 1; }); - fortunes.sort((a, b) => (a.message < b.message ? -1 : 1)); + c.set.headers["content-type"] = "text/html; charset=utf-8"; - set.headers['content-type'] = 'text/html; charset=utf-8'; return renderTemplate(fortunes); }) - - .get('/queries', async ({ query }) => { - const num = parseQueriesNumber(query.queries) + .get("/queries", (c) => { + const num = parseQueriesNumber(c.query.queries); const worldPromises = new Array(num); for (let i = 0; i < num; i++) { worldPromises[i] = db.find(rand()); } - return await Promise.all(worldPromises); + return Promise.all(worldPromises); }) - - .get('/updates', async ({ query }) => { - const num = parseQueriesNumber(query.queries) + .get("/updates", async (c) => { + const num = parseQueriesNumber(c.query.queries); const worldPromises = new Array(num); for (let i = 0; i < num; i++) { @@ -74,5 +73,3 @@ const dbHandlers = new Elysia({ await db.bulkUpdate(worlds); return worlds; }); - -export default dbHandlers; diff --git a/frameworks/TypeScript/elysia/src/index.ts b/frameworks/TypeScript/elysia/src/index.ts index af24275c128..b34edbde4b7 100644 --- a/frameworks/TypeScript/elysia/src/index.ts +++ b/frameworks/TypeScript/elysia/src/index.ts @@ -1,29 +1,20 @@ -import { Elysia } from 'elysia'; -import dbHandlers from './db-handlers'; +import cluster from "node:cluster"; +import os from "node:os"; +import process from "node:process"; -const app = new Elysia({ - serve: { - reusePort: true, - }, -}) - .get('/plaintext', ({ set }) => { - set.headers['server'] = 'Elysia'; - return 'Hello, World!'; - }) +if (cluster.isPrimary) { + console.log(`Primary ${process.pid} is running`); - .get('/json', ({ set }) => { - set.headers = { - 'content-type': 'application/json', - 'server': 'Elysia', - }; + const numCPUs = os.availableParallelism(); + for (let i = 0; i < numCPUs; i++) { + cluster.fork(); + } - return JSON.stringify({ message: 'Hello, World!' }); + cluster.on("exit", (worker) => { + console.log(`worker ${worker.process.pid} died`); + process.exit(1); }); - -if (Bun.env.DATABASE) { - app.use(dbHandlers); +} else { + await import("./server"); + console.log(`Worker ${process.pid} started`); } - -app.listen(8080); - -console.info(`🦊 Elysia is running at ${app.server!.url}`); diff --git a/frameworks/TypeScript/elysia/src/postgres.ts b/frameworks/TypeScript/elysia/src/postgres.ts index 5c9ba1dbcbe..cc6d4389a02 100644 --- a/frameworks/TypeScript/elysia/src/postgres.ts +++ b/frameworks/TypeScript/elysia/src/postgres.ts @@ -1,27 +1,30 @@ -import postgres from 'postgres'; -import { Fortune, World } from './types'; +import postgres from "postgres"; +import { Fortune, World } from "./types"; const sql = postgres({ - host: 'tfb-database', - user: 'benchmarkdbuser', - password: 'benchmarkdbpass', - database: 'hello_world', + host: "tfb-database", + user: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", max: 1, }); -export const fortunes = () => - sql`SELECT id, message FROM fortune`; +export const fortunes = () => sql`SELECT id, message FROM fortune`; export const find = (id: number) => sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( - (arr) => arr[0] + (arr) => arr[0], ); -export const bulkUpdate = (worlds: World[]) => - 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`; +export const bulkUpdate = (worlds: World[]) => { + worlds = worlds.toSorted((a, b) => a.id - b.id); + + const values = new Array(worlds.length); + for (let i = 0; i < worlds.length; i++) { + values[i] = [worlds[i].id, worlds[i].randomNumber]; + } + + return sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int + FROM (VALUES ${sql(values)}) AS update_data (id, randomNumber) + WHERE world.id = (update_data.id)::int`; +}; diff --git a/frameworks/TypeScript/elysia/src/server.ts b/frameworks/TypeScript/elysia/src/server.ts new file mode 100644 index 00000000000..7c2c46d224d --- /dev/null +++ b/frameworks/TypeScript/elysia/src/server.ts @@ -0,0 +1,20 @@ +import { Elysia } from "elysia"; +import { dbHandlers } from "./db-handlers"; + +const app = new Elysia() + .headers({ + server: "Elysia", + }) + .get("/plaintext", "Hello, World!") + // As state on xiv in https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#requirements + // The serialization to JSON must not be cached; + // the computational effort to serialize an object to JSON must occur within the scope of handling each request. + .get("/json", () => ({ message: "Hello, World!" })) + .use((app) => { + if (Bun.env.DATABASE) app.use(dbHandlers); + + return app; + }) + .listen(8080); + +console.info(`🦊 Elysia is running at ${app.server!.url}`); From 4a7b80c4cdadd6be50f0a1995a19bf6fbc94e4e2 Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Thu, 12 Sep 2024 19:07:09 +0300 Subject: [PATCH 0800/1766] [F#/Oxpecker] Simplified connection string (should benefit performance as well) (#9255) --- frameworks/FSharp/oxpecker/src/App/Common.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/FSharp/oxpecker/src/App/Common.fs b/frameworks/FSharp/oxpecker/src/App/Common.fs index 0b62abdefee..47a63e2108e 100644 --- a/frameworks/FSharp/oxpecker/src/App/Common.fs +++ b/frameworks/FSharp/oxpecker/src/App/Common.fs @@ -26,7 +26,7 @@ module Common = } [] - let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" + let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3" let FortuneComparer = { new IComparer with From 8222e5dea25315164b6aced97125527f0704c724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Fri, 13 Sep 2024 00:07:32 +0800 Subject: [PATCH 0801/1766] [Java] Update Solon Version To 2.9.2 (#9260) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Version To 2.9.2 * Add Solon-Virtual * Remove solon-virtual --- frameworks/Java/solon/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index a9568927908..035ad60951a 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -5,7 +5,7 @@ org.noear solon-parent - 2.9.1 + 2.9.2 hello @@ -26,7 +26,7 @@ org.noear - solon.serialization.snack3 + solon.serialization.fastjson2 ${solon.version} From 64398bce241937e42ab2a212f621f0c3fb0ef9d5 Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Fri, 13 Sep 2024 00:09:35 +0800 Subject: [PATCH 0802/1766] optimize swoole (#9261) --- frameworks/PHP/swoole/database.php | 2 +- frameworks/PHP/swoole/php.ini | 1 + frameworks/PHP/swoole/swoole-async-mysql.dockerfile | 1 + frameworks/PHP/swoole/swoole-async-postgres.dockerfile | 1 + frameworks/PHP/swoole/swoole-server.php | 6 ++---- frameworks/PHP/swoole/swoole-sync-mysql.dockerfile | 1 + frameworks/PHP/swoole/swoole-sync-postgres.dockerfile | 3 ++- 7 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frameworks/PHP/swoole/database.php b/frameworks/PHP/swoole/database.php index 19aac390968..97d3af6887a 100644 --- a/frameworks/PHP/swoole/database.php +++ b/frameworks/PHP/swoole/database.php @@ -144,7 +144,7 @@ public static function init(string $driver): void ->withUsername('benchmarkdbuser') ->withPassword('benchmarkdbpass'); - self::$pool = new PDOPool($config, 128); + self::$pool = new PDOPool($config, intval(1400 / swoole_cpu_num())); self::$driver = $driver; } diff --git a/frameworks/PHP/swoole/php.ini b/frameworks/PHP/swoole/php.ini index 082e86dedbc..089c4837bd5 100644 --- a/frameworks/PHP/swoole/php.ini +++ b/frameworks/PHP/swoole/php.ini @@ -1,3 +1,4 @@ +zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.validate_timestamps=0 diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index 82dbe32833f..ebfe9084357 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 1 +ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile index 4a6b27b2bb0..f8cd24cc887 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 1 +ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER pgsql ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/swoole/swoole-server.php b/frameworks/PHP/swoole/swoole-server.php index 3794c364cb7..13050d75ebb 100644 --- a/frameworks/PHP/swoole/swoole-server.php +++ b/frameworks/PHP/swoole/swoole-server.php @@ -8,9 +8,8 @@ $enableCoroutine = getenv('ENABLE_COROUTINE') == 1; $connection = $enableCoroutine ? Connections::class : Connection::class; -$server = new Server('0.0.0.0', 8080); $setting = [ - 'worker_num' => swoole_cpu_num() * 4, + 'worker_num' => swoole_cpu_num() * ((int) getenv('CPU_MULTIPLES')), 'log_file' => '/dev/null', 'enable_coroutine' => $enableCoroutine, 'enable_reuse_port' => true @@ -18,12 +17,11 @@ if ($enableCoroutine) { $setting['hook_flags'] = SWOOLE_HOOK_ALL; - $setting['worker_num'] = swoole_cpu_num(); } +$server = new Server('0.0.0.0', 8080); $server->set($setting); - $server->on('workerStart', function () use ($connection) { $connection::init(getenv('DATABASE_DRIVER')); }); diff --git a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile index 97a0e11d111..6c1278bed67 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 0 +ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile index 1b5a68b6169..8651d205921 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV SWOOLE_VERSION 5.1.4 ENV ENABLE_COROUTINE 0 +ENV CPU_MULTIPLES 4 ENV DATABASE_DRIVER pgsql ARG DEBIAN_FRONTEND=noninteractive @@ -15,7 +16,7 @@ RUN apt update -yqq > /dev/null \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure > /dev/null \ - && make -j2 > /dev/null \ + && make -j8 > /dev/null \ && make install > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini From 1d0f0af6294c9adc0f055bdef66a2c0c2f4b1a13 Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Thu, 12 Sep 2024 18:10:36 +0200 Subject: [PATCH 0803/1766] Micronaut: Use JTE template engine and GraalVM 22 (#9262) * Micronaut: Use JTE template engine and GraalVM 22 * CR * User Graalvm 21 for Micronaut Data --- .../io.micronaut.benchmark.module.gradle | 2 +- frameworks/Java/micronaut/common/build.gradle | 24 +++++---- .../AbstractBenchmarkController.java | 15 ++++++ .../controller/AsyncBenchmarkController.java | 13 +---- .../controller/BenchmarkController.java | 17 ++---- .../controller/FortunesBodyWriter.java | 54 +++++++++++++++++++ .../ReactiveBenchmarkController.java | 15 +----- .../repository/FortuneRepository.java | 3 +- .../common/src/main/jte/fortunes.jte | 4 ++ .../main/resources/views/fortunes.rocker.html | 8 --- frameworks/Java/micronaut/gradle.properties | 2 +- .../java/benchmark/JdbcWorldRepository.java | 2 + .../micronaut/micronaut-graalvm.dockerfile | 2 +- .../micronaut-jdbc-graalvm.dockerfile | 2 +- .../java/benchmark/JdbcFortuneRepository.java | 2 +- .../micronaut-r2dbc-graalvm.dockerfile | 2 +- 16 files changed, 104 insertions(+), 63 deletions(-) create mode 100644 frameworks/Java/micronaut/common/src/main/java/benchmark/controller/FortunesBodyWriter.java create mode 100644 frameworks/Java/micronaut/common/src/main/jte/fortunes.jte delete mode 100644 frameworks/Java/micronaut/common/src/main/resources/views/fortunes.rocker.html diff --git a/frameworks/Java/micronaut/buildSrc/src/main/groovy/io.micronaut.benchmark.module.gradle b/frameworks/Java/micronaut/buildSrc/src/main/groovy/io.micronaut.benchmark.module.gradle index 43a854cf848..dcb6b3389fc 100644 --- a/frameworks/Java/micronaut/buildSrc/src/main/groovy/io.micronaut.benchmark.module.gradle +++ b/frameworks/Java/micronaut/buildSrc/src/main/groovy/io.micronaut.benchmark.module.gradle @@ -28,7 +28,7 @@ dependencies { } graalvmNative.binaries.all { - buildArgs.add("--initialize-at-build-time=views") + buildArgs.add("--initialize-at-build-time=gg.jte.generated.precompiled") } test { diff --git a/frameworks/Java/micronaut/common/build.gradle b/frameworks/Java/micronaut/common/build.gradle index c254fb8e743..8153fd5d8ea 100644 --- a/frameworks/Java/micronaut/common/build.gradle +++ b/frameworks/Java/micronaut/common/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id "io.micronaut.library" - id "nu.studer.rocker" version "3.0.4" + id "gg.jte.gradle" version "3.1.12" } group 'io.micronaut.benchmark' @@ -16,14 +16,10 @@ micronaut { testRuntime "junit5" } -rocker { - configurations { - main { - templateDir = file('src/main/resources') - outputDir = file('build/generated/rocker') - optimize = true - } - } +jte { + sourceDirectory = file("src/main/jte").toPath() + generate() + binaryStaticContent = true } dependencies { @@ -38,7 +34,8 @@ dependencies { transitive = false } - implementation("com.fizzed:rocker-runtime") + // Switch to BOM version after https://github.com/micronaut-projects/micronaut-views/issues/876 + implementation("gg.jte:jte-runtime:3.1.12") runtimeOnly("ch.qos.logback:logback-classic") runtimeOnly("org.yaml:snakeyaml") @@ -46,4 +43,11 @@ dependencies { test { useJUnitPlatform() +} + +// Gradle requires that generateJte is run before some tasks +tasks.configureEach { + if (name == "inspectRuntimeClasspath") { + mustRunAfter("generateJte") + } } \ No newline at end of file diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AbstractBenchmarkController.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AbstractBenchmarkController.java index 637649b448e..8f595d99931 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AbstractBenchmarkController.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AbstractBenchmarkController.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; @@ -12,6 +13,20 @@ public class AbstractBenchmarkController { protected final Integer[] boxed = IntStream.range(1, 10001).boxed().toArray(Integer[]::new); + private static final Comparator FORTUNES_COMPARATOR = new Comparator<>() { + @Override + public int compare(Fortune o1, Fortune o2) { + return o1.message().compareTo(o2.message()); + } + }; + + protected List prepareFortunes(List fortuneList) { + List all = new ArrayList<>(fortuneList.size() + 1); + all.add(new Fortune(0, "Additional fortune added at request time.")); + all.addAll(fortuneList); + all.sort(FORTUNES_COMPARATOR); + return all; + } protected List createFortunes() { List fortuneMessages = IntStream.range(0, 10).boxed().toList(); 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..a16ce1933c3 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 @@ -5,11 +5,9 @@ import benchmark.repository.AsyncFortuneRepository; import benchmark.repository.AsyncWorldRepository; import io.micronaut.context.annotation.Requires; -import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.QueryValue; -import views.fortunes; import java.util.ArrayList; import java.util.Comparator; @@ -55,15 +53,8 @@ public CompletionStage> queries(@QueryValue String queries) { // 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 -> { - 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"); - }); + public CompletionStage> fortune() { + return fortuneRepository.findAll().thenApply(this::prepareFortunes); } // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java index c00eed41fb4..f38940257d3 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java @@ -5,19 +5,14 @@ import benchmark.repository.FortuneRepository; import benchmark.repository.WorldRepository; import io.micronaut.context.annotation.Requires; -import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.QueryValue; -import views.fortunes; import java.util.ArrayList; -import java.util.Collection; import java.util.Comparator; import java.util.List; -import static java.util.Comparator.comparing; - @Requires(beans = {WorldRepository.class, FortuneRepository.class}) @Controller public class BenchmarkController extends AbstractBenchmarkController { @@ -56,14 +51,8 @@ public List queries(@QueryValue String queries) { // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes @Get(value = "/fortunes", produces = "text/html;charset=utf-8") - public HttpResponse fortune() { - Collection all = fortuneRepository.findAll(); - List fortunesList = new ArrayList<>(all.size() + 1); - fortunesList.add(new Fortune(0, "Additional fortune added at request time.")); - fortunesList.addAll(all); - fortunesList.sort(comparing(Fortune::message)); - String body = fortunes.template(fortunesList).render().toString(); - return HttpResponse.ok(body).contentType("text/html;charset=utf-8"); + public List fortune() { + return prepareFortunes(fortuneRepository.findAll()); } // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates @@ -77,5 +66,5 @@ public List updates(@QueryValue String queries) { worldRepository.updateAll(worldList); return worldList; } - + } diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/FortunesBodyWriter.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/FortunesBodyWriter.java new file mode 100644 index 00000000000..a7bee37d493 --- /dev/null +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/FortunesBodyWriter.java @@ -0,0 +1,54 @@ +package benchmark.controller; + +import benchmark.model.Fortune; +import gg.jte.TemplateOutput; +import gg.jte.generated.precompiled.JtefortunesGenerated; +import gg.jte.html.OwaspHtmlTemplateOutput; +import io.micronaut.core.annotation.NonNull; +import io.micronaut.core.type.Argument; +import io.micronaut.core.type.MutableHeaders; +import io.micronaut.http.MediaType; +import io.micronaut.http.body.MessageBodyWriter; +import io.micronaut.http.codec.CodecException; +import io.micronaut.http.netty.NettyHttpHeaders; +import jakarta.inject.Singleton; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@Singleton +public class FortunesBodyWriter implements MessageBodyWriter> { + + @Override + public void writeTo(@NonNull Argument> type, + @NonNull MediaType mediaType, + List values, + @NonNull MutableHeaders outgoingHeaders, + @NonNull OutputStream outputStream) throws CodecException { + outgoingHeaders.set(NettyHttpHeaders.CONTENT_TYPE, "text/html;charset=utf-8"); + TemplateOutput output = new TemplateOutput() { + + @Override + public void writeContent(String value) { + writeBinaryContent(value.getBytes(StandardCharsets.UTF_8)); + } + + @Override + public void writeContent(String value, int beginIndex, int endIndex) { + writeBinaryContent(value.substring(beginIndex, endIndex).getBytes(StandardCharsets.UTF_8)); + } + + @Override + public void writeBinaryContent(byte[] value) { + try { + outputStream.write(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }; + JtefortunesGenerated.render(new OwaspHtmlTemplateOutput(output), null, values); + } +} diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/ReactiveBenchmarkController.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/ReactiveBenchmarkController.java index 8adbc4c4716..e85d236acee 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/ReactiveBenchmarkController.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/ReactiveBenchmarkController.java @@ -6,21 +6,17 @@ import benchmark.repository.ReactiveWorldRepository; import io.micronaut.context.annotation.Requires; import io.micronaut.core.async.annotation.SingleResult; -import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.QueryValue; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import views.fortunes; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import static java.util.Comparator.comparing; - @Requires(beans = {ReactiveWorldRepository.class, ReactiveFortuneRepository.class}) @Controller public class ReactiveBenchmarkController extends AbstractBenchmarkController { @@ -61,15 +57,8 @@ public Publisher> queries(@QueryValue String queries) { // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes @Get(value = "/fortunes", produces = "text/html;charset=utf-8") @SingleResult - public Mono> fortune() { - return Mono.from(fortuneRepository.findAll()).map(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"); - }); + public Mono> fortune() { + return Mono.from(fortuneRepository.findAll()).map(this::prepareFortunes); } // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/repository/FortuneRepository.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/repository/FortuneRepository.java index 701f647e384..b1c8fe3989e 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/repository/FortuneRepository.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/repository/FortuneRepository.java @@ -4,11 +4,12 @@ import org.reactivestreams.Publisher; import java.util.Collection; +import java.util.List; public interface FortuneRepository { void initDb(Collection fortunes); - Collection findAll(); + List findAll(); } diff --git a/frameworks/Java/micronaut/common/src/main/jte/fortunes.jte b/frameworks/Java/micronaut/common/src/main/jte/fortunes.jte new file mode 100644 index 00000000000..7ac61415c99 --- /dev/null +++ b/frameworks/Java/micronaut/common/src/main/jte/fortunes.jte @@ -0,0 +1,4 @@ +@param java.util.List fortunes +Fortunes@for(benchmark.model.Fortune fortune : fortunes) + @endfor +
    idmessage
    ${fortune.id()}${fortune.message()}
    \ No newline at end of file diff --git a/frameworks/Java/micronaut/common/src/main/resources/views/fortunes.rocker.html b/frameworks/Java/micronaut/common/src/main/resources/views/fortunes.rocker.html deleted file mode 100644 index c6b9d0124a6..00000000000 --- a/frameworks/Java/micronaut/common/src/main/resources/views/fortunes.rocker.html +++ /dev/null @@ -1,8 +0,0 @@ -@import java.util.* -@import benchmark.model.* -@args(List fortunes) -Fortunes - @for ((ForIterator i, Fortune fortune) : fortunes) { - - } -
    idmessage
    @fortune.id()@fortune.message()
    \ No newline at end of file diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index 22d843f7643..8ce6479ffe6 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion=4.6.0 +micronautVersion=4.6.1 diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc/src/main/java/benchmark/JdbcWorldRepository.java b/frameworks/Java/micronaut/micronaut-data-jdbc/src/main/java/benchmark/JdbcWorldRepository.java index 3b08db89390..89e9a6be895 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc/src/main/java/benchmark/JdbcWorldRepository.java +++ b/frameworks/Java/micronaut/micronaut-data-jdbc/src/main/java/benchmark/JdbcWorldRepository.java @@ -2,6 +2,7 @@ import benchmark.model.World; import benchmark.repository.WorldRepository; +import io.micronaut.data.connection.annotation.Connectable; import io.micronaut.data.jdbc.annotation.JdbcRepository; import io.micronaut.data.model.query.builder.sql.Dialect; import io.micronaut.data.repository.GenericRepository; @@ -20,6 +21,7 @@ default void initDb(Collection worlds) { void saveAll(Collection worlds); + @Connectable @Override default List findByIds(List ids) { return WorldRepository.super.findByIds(ids); diff --git a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile index 0b45b87f1dc..c1e1207fa96 100644 --- a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:21 +FROM container-registry.oracle.com/graalvm/native-image:22 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile index ceae0bdf03e..6b6e9262aa2 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:21 +FROM container-registry.oracle.com/graalvm/native-image:22 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-jdbc/src/main/java/benchmark/JdbcFortuneRepository.java b/frameworks/Java/micronaut/micronaut-jdbc/src/main/java/benchmark/JdbcFortuneRepository.java index 8b07fd1c6fc..2315804f7c2 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc/src/main/java/benchmark/JdbcFortuneRepository.java +++ b/frameworks/Java/micronaut/micronaut-jdbc/src/main/java/benchmark/JdbcFortuneRepository.java @@ -42,7 +42,7 @@ public void initDb(Collection fortunes) { } @Override - public Collection findAll() { + public List findAll() { try (Connection connection = dataSource.getConnection()) { try (PreparedStatement statement = connection.prepareStatement("SELECT id, message FROM fortune", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) { diff --git a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile index 574496a0b91..06ccaea922c 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:21 +FROM container-registry.oracle.com/graalvm/native-image:22 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src From 30c9830883dd35f8bad05d626638a4a81a2b80c9 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 18 Sep 2024 22:32:02 +0200 Subject: [PATCH 0804/1766] Update dependencies and change settings --- frameworks/Kotlin/hexagon/build.gradle | 14 +++++++------- .../src/main/kotlin/Benchmark.kt | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 5f11a1c40a2..d1f77b2b178 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,7 +1,7 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.0.10" apply false - id "org.graalvm.buildtools.native" version "0.10.2" apply false + id "org.jetbrains.kotlin.jvm" version "2.0.20" apply false + id "org.graalvm.buildtools.native" version "0.10.3" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.6.2" - jettyVersion = "12.0.12" - nettyVersion = "4.1.112.Final" + hexagonVersion = "3.7.0" + jettyVersion = "12.0.13" + nettyVersion = "4.1.113.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.7.3" - vertxVersion = "4.5.9" + postgresqlVersion = "42.7.4" + vertxVersion = "4.5.10" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt index d38d33281f8..a5778a2c353 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt @@ -1,18 +1,30 @@ package com.hexagonkt +import com.hexagonkt.core.Jvm.systemSettingOrNull import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.helidon.HelidonServerAdapter import com.hexagonkt.store.BenchmarkPgClientStore import com.hexagonkt.templates.jte.JteAdapter +import java.time.Duration fun main() { - val settings = Settings() val store = BenchmarkPgClientStore("postgresql") val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = HelidonServerAdapter() + val engine = HelidonServerAdapter( + backlog = systemSettingOrNull("backlog") ?: (8 * 1024), + writeQueueLength = systemSettingOrNull("writeQueueLength") ?: (8 * 1024), + readTimeout = Duration.parse(systemSettingOrNull("readTimeout") ?: "PT0S"), + connectTimeout = Duration.parse(systemSettingOrNull("connectTimeout") ?: "PT0S"), + tcpNoDelay = systemSettingOrNull("tcpNoDelay") ?: true, + receiveLog = systemSettingOrNull("receiveLog") ?: false, + sendLog = systemSettingOrNull("sendLog") ?: false, + validatePath = systemSettingOrNull("validatePath") ?: false, + validateRequestHeaders = systemSettingOrNull("validateRequestHeaders") ?: false, + validateResponseHeaders = systemSettingOrNull("validateResponseHeaders") ?: false, + ) - val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, Settings()) benchmark.server.start() } From b87e736d3f2e1ff55b066c29bc55232852bba133 Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Thu, 19 Sep 2024 16:17:08 +0200 Subject: [PATCH 0805/1766] [Kotlin/Hexagon] Update Hexagon toolkit release (#9284) * 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 * Update dependencies * Update dependencies and change settings * Update dependencies and change settings --------- 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 ++++++++-------- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43504 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 7 +++++-- frameworks/Kotlin/hexagon/gradlew.bat | 2 ++ .../hexagon/hexagon-helidon-native.dockerfile | 2 ++ .../hexagon-helidon-pgclient.dockerfile | 9 +++++---- .../Kotlin/hexagon/hexagon-helidon.dockerfile | 9 +++++---- .../hexagon/hexagon-jetty-native.dockerfile | 2 ++ .../hexagon-jettyloom-pgclient.dockerfile | 7 ++++--- .../hexagon/hexagon-jettyloom.dockerfile | 7 ++++--- .../hexagon-nettyepoll-pgclient.dockerfile | 7 ++++--- .../hexagon/hexagon-nettyepoll.dockerfile | 7 ++++--- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 7 ++++--- frameworks/Kotlin/hexagon/hexagon.dockerfile | 7 ++++--- .../src/main/kotlin/Benchmark.kt | 18 +++++++++++++++--- .../src/main/kotlin/BenchmarkPgClientStore.kt | 12 +++++++++--- 17 files changed, 78 insertions(+), 43 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index a4d141e5c2a..d1f77b2b178 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,7 +1,7 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.0.20-RC" apply false - id "org.graalvm.buildtools.native" version "0.10.2" apply false + id "org.jetbrains.kotlin.jvm" version "2.0.20" apply false + id "org.graalvm.buildtools.native" version "0.10.3" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.6.1" - jettyVersion = "12.0.12" - nettyVersion = "4.1.112.Final" + hexagonVersion = "3.7.0" + jettyVersion = "12.0.13" + nettyVersion = "4.1.113.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.7.3" - vertxVersion = "4.5.9" + postgresqlVersion = "42.7.4" + vertxVersion = "4.5.10" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.9" + gradleVersion = "8.10" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 34463 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 SXRcJ{65?fGI57uQ5&!`B?F@7P delta 34554 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 diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 09523c0e549..9355b415575 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.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index 1aa94a42690..f5feea6d6b1 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat index 25da30dbdee..9d21a21834d 100644 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ b/frameworks/Kotlin/hexagon/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index c402f0ee792..25a78904f79 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile @@ -16,6 +16,8 @@ RUN ./gradlew --quiet -x test hexagon_helidon_pgclient:nativeCompile FROM scratch ARG PROJECT=hexagon_helidon_pgclient +ENV maximumPoolSize 300 + COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / ENTRYPOINT [ "/hexagon_helidon_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index 3b3a1602f55..f11c4e7b2bd 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile @@ -1,22 +1,23 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-22-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-22-musl ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 271fa95dbf8..27177de5eb9 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile @@ -1,22 +1,23 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-22-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-22-musl ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile index 2919fdba8b7..b8efc965eb3 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile @@ -16,6 +16,8 @@ RUN ./gradlew --quiet -x test hexagon_jetty_postgresql:nativeCompile FROM scratch ARG PROJECT=hexagon_jetty_postgresql +ENV maximumPoolSize 300 + COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT / ENTRYPOINT [ "/hexagon_jetty_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index d6c37bcd77f..21ef3b64c8b 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_jetty_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index 07bf482b28e..c51c03bc6db 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index 972347f053b..90c5a0d03c8 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_nettyepoll_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 393f73f62a6..35a0e4729b7 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_nettyepoll_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 32e153cbc0a..42f28071128 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test war +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test war # # RUNTIME @@ -17,5 +17,6 @@ ARG MODULE=/hexagon/hexagon_tomcat_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build $MODULE/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 59f89e5cb5c..2654c706db1 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,13 +1,13 @@ # # BUILD # -FROM docker.io/gradle:8.9-jdk21-alpine AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build USER root WORKDIR /hexagon ADD . . -RUN gradle --quiet classes -RUN gradle --quiet -x test installDist +RUN ./gradlew --quiet classes +RUN ./gradlew --quiet -x test installDist # # RUNTIME @@ -17,6 +17,7 @@ ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA +ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt index d38d33281f8..a5778a2c353 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt @@ -1,18 +1,30 @@ package com.hexagonkt +import com.hexagonkt.core.Jvm.systemSettingOrNull import com.hexagonkt.core.media.TEXT_HTML import com.hexagonkt.core.urlOf import com.hexagonkt.http.server.helidon.HelidonServerAdapter import com.hexagonkt.store.BenchmarkPgClientStore import com.hexagonkt.templates.jte.JteAdapter +import java.time.Duration fun main() { - val settings = Settings() val store = BenchmarkPgClientStore("postgresql") val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = HelidonServerAdapter() + val engine = HelidonServerAdapter( + backlog = systemSettingOrNull("backlog") ?: (8 * 1024), + writeQueueLength = systemSettingOrNull("writeQueueLength") ?: (8 * 1024), + readTimeout = Duration.parse(systemSettingOrNull("readTimeout") ?: "PT0S"), + connectTimeout = Duration.parse(systemSettingOrNull("connectTimeout") ?: "PT0S"), + tcpNoDelay = systemSettingOrNull("tcpNoDelay") ?: true, + receiveLog = systemSettingOrNull("receiveLog") ?: false, + sendLog = systemSettingOrNull("sendLog") ?: false, + validatePath = systemSettingOrNull("validatePath") ?: false, + validateRequestHeaders = systemSettingOrNull("validateRequestHeaders") ?: false, + validateResponseHeaders = systemSettingOrNull("validateResponseHeaders") ?: false, + ) - val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, Settings()) benchmark.server.start() } diff --git a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt index 1fb9547353f..510abda0295 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt +++ b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt @@ -6,8 +6,10 @@ import com.hexagonkt.model.CachedWorld import com.hexagonkt.model.Fortune import com.hexagonkt.model.World import io.vertx.core.Future +import io.vertx.core.Vertx +import io.vertx.core.VertxOptions +import io.vertx.pgclient.PgBuilder import io.vertx.pgclient.PgConnectOptions -import io.vertx.pgclient.PgPool import io.vertx.sqlclient.* import org.cache2k.Cache @@ -35,11 +37,15 @@ class BenchmarkPgClientStore( private val poolOptions: PoolOptions by lazy { PoolOptions().apply { val environment = Jvm.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() - maxSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + maxSize = Jvm.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize } } - private val dataSource: SqlClient by lazy { PgPool.client(connectOptions, poolOptions) } + private val dataSource: SqlClient by lazy { + val vertx = Vertx.vertx(VertxOptions().setPreferNativeTransport(true)) + PgBuilder.client().using(vertx).connectingTo(connectOptions).with(poolOptions).build() + } override fun findAllFortunes(): List = dataSource.preparedQuery(SELECT_ALL_FORTUNES) From d8418079a7828386175befd210cbd7af9d6bd183 Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Thu, 19 Sep 2024 22:18:56 +0800 Subject: [PATCH 0806/1766] fix extension error (#9280) --- frameworks/PHP/swoole/{php.ini => 10-opcache.ini} | 3 +-- 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 +++++--- 5 files changed, 21 insertions(+), 14 deletions(-) rename frameworks/PHP/swoole/{php.ini => 10-opcache.ini} (89%) diff --git a/frameworks/PHP/swoole/php.ini b/frameworks/PHP/swoole/10-opcache.ini similarity index 89% rename from frameworks/PHP/swoole/php.ini rename to frameworks/PHP/swoole/10-opcache.ini index 089c4837bd5..3e65df6b191 100644 --- a/frameworks/PHP/swoole/php.ini +++ b/frameworks/PHP/swoole/10-opcache.ini @@ -2,9 +2,8 @@ zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.validate_timestamps=0 +opcache.save_comments=0 opcache.enable_file_override=1 opcache.huge_code_pages=1 -memory_limit=1024M - opcache.jit_buffer_size=128M opcache.jit=1225 diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index ebfe9084357..b9ce354edb2 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -18,15 +18,17 @@ RUN apt update -yqq > /dev/null \ && ./configure > /dev/null \ && make -j8 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ + && php -m WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD ./php.ini /swoole +ADD 10-opcache.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini +COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.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 f8cd24cc887..3bed20ce226 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -18,15 +18,17 @@ RUN apt update -yqq > /dev/null \ && ./configure --enable-swoole-pgsql > /dev/null \ && make -j8 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ + && php -m WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD ./php.ini /swoole +ADD 10-opcache.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini +COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.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 6c1278bed67..e8de37fd49b 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -18,15 +18,17 @@ RUN apt update -yqq > /dev/null \ && ./configure > /dev/null \ && make -j8 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ + && php -m WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD ./php.ini /swoole +ADD 10-opcache.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini +COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.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 8651d205921..670ea96ad4b 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -18,15 +18,17 @@ RUN apt update -yqq > /dev/null \ && ./configure > /dev/null \ && make -j8 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ + && php -m WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD ./php.ini /swoole +ADD 10-opcache.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini +COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini EXPOSE 8080 CMD php /swoole/swoole-server.php From 1f59d8175846a7ef0b114bfcd8ffd5f874a38934 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 19 Sep 2024 16:19:04 +0200 Subject: [PATCH 0807/1766] [ruby/hanami] Rename DB namespace for Zeitwerk (#9279) Fixes the following error: Zeitwerk::NameError: expected file /hanami/app/actions/db/index.rb to define constant HelloWorld::Actions::DB::Index, but didn't --- frameworks/Ruby/hanami/app/actions/db/index.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/hanami/app/actions/db/index.rb b/frameworks/Ruby/hanami/app/actions/db/index.rb index 3751a8d0621..c32ec0f1df0 100644 --- a/frameworks/Ruby/hanami/app/actions/db/index.rb +++ b/frameworks/Ruby/hanami/app/actions/db/index.rb @@ -2,7 +2,7 @@ module HelloWorld module Actions - module Db + module DB class Index < HelloWorld::Action QUERY_RANGE = 1..10_000 # range of IDs in the Fortune DB include Deps["persistence.rom"] From 38c2852ad058a55c6231f02d7d76712a1b049d64 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 19 Sep 2024 16:19:11 +0200 Subject: [PATCH 0808/1766] [ruby/sinatra-sequel] Upgrade Ruby to 3.4 (#9277) --- .../Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index 77a2801d16d..eee06752667 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 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 From 90b1dd3001b5bed98d87beec70217f164936ded8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 19 Sep 2024 16:19:18 +0200 Subject: [PATCH 0809/1766] [ruby/rage] Upgrade Ruby to 3.4 (#9276) --- frameworks/Ruby/rage/Gemfile | 2 +- frameworks/Ruby/rage/rage.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rage/Gemfile b/frameworks/Ruby/rage/Gemfile index a7f090d01f9..96d6e7042fc 100644 --- a/frameworks/Ruby/rage/Gemfile +++ b/frameworks/Ruby/rage/Gemfile @@ -3,7 +3,7 @@ source "https://rubygems.org" gem "rage-rb", "~> 1.3" gem "pg", "~> 1.0" -gem "activerecord", "~> 7.0.0", require: "active_record" +gem "activerecord", "~> 7.2.0", require: "active_record" # Build JSON APIs with ease # gem "alba" diff --git a/frameworks/Ruby/rage/rage.dockerfile b/frameworks/Ruby/rage/rage.dockerfile index a1e80a095f3..bbacb344f29 100644 --- a/frameworks/Ruby/rage/rage.dockerfile +++ b/frameworks/Ruby/rage/rage.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4-rc EXPOSE 8080 WORKDIR /rage From 423880cfcecc1c14393cad7d0ccb86fb3c6bcb4f Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Thu, 19 Sep 2024 19:19:27 +0500 Subject: [PATCH 0810/1766] ntex: use released deps (#9269) --- frameworks/Rust/ntex/Cargo.toml | 11 +++-------- frameworks/Rust/ntex/src/db.rs | 27 +++++++++++---------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index 850e640f2ad..ec2173e26e3 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -34,10 +34,11 @@ default = [] tokio = ["ntex/tokio"] # compio runtime -compio = ["ntex/compio"] +compio = ["ntex/compio", ] [dependencies] ntex = "2.4" +ntex-compio = "0.1.2" 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"] } @@ -52,6 +53,7 @@ futures = "0.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" log = { version = "0.4", features = ["release_max_level_off"] } +compio-driver = { version = "0.4", features = ["io-uring", "io-uring-socket"]} tok_io = {version = "1", package = "tokio" } tokio-postgres = { git="https://github.com/fafhrd91/postgres.git", branch="ntex-2" } @@ -63,10 +65,3 @@ lto = "thin" debug = false incremental = false overflow-checks = false - -[patch.crates-io] -ntex = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } -ntex-io = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } -ntex-rt = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } -ntex-net = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } -ntex-compio = { git = "https://github.com/ntex-rs/ntex.git", branch = "compio" } diff --git a/frameworks/Rust/ntex/src/db.rs b/frameworks/Rust/ntex/src/db.rs index b3adc6e70bf..c5d525eb6de 100644 --- a/frameworks/Rust/ntex/src/db.rs +++ b/frameworks/Rust/ntex/src/db.rs @@ -68,7 +68,7 @@ impl PgConnection { world, updates, rng: WyRand::new(), - buf: RefCell::new(BytesMut::with_capacity(65535)), + buf: RefCell::new(BytesMut::with_capacity(10 * 1024 * 1024)), } } } @@ -80,7 +80,7 @@ impl PgConnection { let row = self.cl.query_one(&self.world, &[&random_id]).await.unwrap(); let mut body = self.buf.borrow_mut(); - utils::reserve(&mut body, 8 * 1024); + utils::reserve(&mut body, 1024); World { id: row.get(0), randomnumber: row.get(1), @@ -107,7 +107,7 @@ impl PgConnection { } let mut body = self.buf.borrow_mut(); - utils::reserve(&mut body, 8 * 1024); + utils::reserve(&mut body, 2 * 1024); body.put_u8(b'['); worlds.iter().for_each(|w| { w.to_bytes_mut(&mut *body); @@ -119,7 +119,7 @@ impl PgConnection { } pub async fn update(&self, num: usize) -> Bytes { - let mut rng = self.rng.clone(); + let mut rng = nanorand::tls_rng(); let mut queries = SmallVec::<[_; 32]>::new(); (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; @@ -146,7 +146,7 @@ impl PgConnection { let _ = self.cl.query(&self.updates[num - 1], ¶ms).await; let mut body = self.buf.borrow_mut(); - utils::reserve(&mut body, 8 * 1024); + utils::reserve(&mut body, 2 * 1024); body.put_u8(b'['); worlds.iter().for_each(|w| { w.to_bytes_mut(&mut *body); @@ -158,25 +158,20 @@ impl PgConnection { } pub async fn tell_fortune(&self) -> Bytes { - let fut = self.cl.query_raw(&self.fortune, &[]); + let rows = self.cl.query_raw(&self.fortune, &[]).await.unwrap(); - let rows = fut.await.unwrap(); let mut fortunes: SmallVec<[_; 32]> = smallvec::smallvec![Fortune { id: 0, message: Cow::Borrowed("Additional fortune added at request time."), }]; - - for row in rows { - fortunes.push(Fortune { - id: row.get(0), - message: Cow::Owned(row.get(1)), - }); - } - + fortunes.extend(rows.iter().map(|row| Fortune { + id: row.get(0), + message: Cow::Owned(row.get(1)), + })); fortunes.sort_by(|it, next| it.message.cmp(&next.message)); let mut body = std::mem::replace(&mut *self.buf.borrow_mut(), BytesMut::new()); - utils::reserve(&mut body, 8 * 1024); + utils::reserve(&mut body, 4 * 1024); ywrite_html!(body, "{{> fortune }}"); let result = body.split().freeze(); let _ = std::mem::replace(&mut *self.buf.borrow_mut(), body); From 45c151d5ab020099589d08998318cd0872851131 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Thu, 19 Sep 2024 22:21:05 +0800 Subject: [PATCH 0811/1766] [xitca-web] bug fix and improvements (#9272) * [xitca-web] bug fix and improvements * comment fix --- frameworks/Rust/xitca-web/Cargo.lock | 69 +++++++-------- frameworks/Rust/xitca-web/Cargo.toml | 4 +- frameworks/Rust/xitca-web/src/db.rs | 43 ++++------ frameworks/Rust/xitca-web/src/db_diesel.rs | 49 +++++++---- frameworks/Rust/xitca-web/src/main.rs | 14 +++- frameworks/Rust/xitca-web/src/main_iou.rs | 84 ++----------------- frameworks/Rust/xitca-web/src/ser.rs | 12 +-- frameworks/Rust/xitca-web/src/util.rs | 50 ++++++++--- .../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 +- 13 files changed, 145 insertions(+), 190 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 00bf2423449..14daebadc05 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "async-trait" @@ -95,17 +95,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -149,9 +149,9 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ "shlex", ] @@ -164,9 +164,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -364,9 +364,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "heck" @@ -554,11 +554,11 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] @@ -572,12 +572,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" - [[package]] name = "num-traits" version = "0.2.19" @@ -721,9 +715,9 @@ dependencies = [ [[package]] name = "pq-sys" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24ff9e4cf6945c988f0db7005d87747bf72864965c3529d259ad155ac41d584" +checksum = "a92c30dd81695321846d4dfe348da67b1752ebb61cd1549d203a7b57e323c435" dependencies = [ "vcpkg", ] @@ -789,9 +783,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ "bitflags 2.6.0", ] @@ -867,18 +861,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1155,9 +1149,9 @@ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -1330,9 +1324,9 @@ dependencies = [ [[package]] name = "xitca-io" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "376a4849eef1f3475a6b7a5c474dac278c320a28f6e2abc07be57048b35cc5df" +checksum = "19b91b7a5ff9e3bed167b7e3bcc7b4462d2cb16d05e3ae913dbc384e463fdd7f" dependencies = [ "bytes", "tokio", @@ -1343,7 +1337,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=9835c0b#9835c0b79ebd77f01b74e3ccb1c9893f022db9f3" +source = "git+https://github.com/HFQR/xitca-web.git?rev=0cda225#0cda2254f98b40f21bc3170dd8983f16444f0bd0" dependencies = [ "fallible-iterator", "percent-encoding", @@ -1353,7 +1347,6 @@ dependencies = [ "tokio", "tracing", "xitca-io", - "xitca-service", "xitca-unsafe-collection", ] @@ -1406,7 +1399,7 @@ dependencies = [ "futures-core", "http-body", "mimalloc", - "nanorand", + "rand", "sailfish", "serde", "serde_json", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 1d6ccc17751..6c16d2d7a54 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -85,7 +85,7 @@ mimalloc = { version = "0.1", default-features = false, 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 } -nanorand = { version = "0.7", default-features = false, features = ["tls"] } +rand = { version = "0.8", features = ["small_rng"] } tokio = "1" [profile.release] @@ -95,5 +95,5 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "9835c0b" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "0cda225" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index 0b7a18601fb..818804341b1 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,11 +1,12 @@ -use std::fmt::Write; +// clippy is dumb and have no idea what should be lazy or not +#![allow(clippy::unnecessary_lazy_evaluations)] use xitca_io::bytes::BytesMut; -use xitca_postgres::{pipeline::Pipeline, AsyncLendingIterator, Pool, Type}; +use xitca_postgres::{pipeline::Pipeline, pool::Pool, AsyncLendingIterator, Type}; use super::{ ser::{Fortune, Fortunes, World}, - util::{HandleResult, Rand, DB_URL}, + util::{bulk_update_gen, HandleResult, Rand, DB_URL}, }; pub struct Client { @@ -28,19 +29,14 @@ const WORLD_SQL: &str = "SELECT * FROM world WHERE id=$1"; const WORLD_SQL_TYPES: &[Type] = &[Type::INT4]; fn update_query(num: usize) -> Box { - const PREFIX: &str = "UPDATE world SET randomNumber = w.r FROM (VALUES "; - const SUFFIX: &str = ") AS w (i,r) WHERE world.id = w.i"; - - let (_, mut query) = (1..=num).fold((1, String::from(PREFIX)), |(idx, mut query), _| { - write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); - (idx + 2, query) - }); - - query.pop(); - - query.push_str(SUFFIX); - - query.into_boxed_str() + bulk_update_gen(|query| { + use std::fmt::Write; + (1..=num).fold((1, query), |(idx, query), _| { + write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); + (idx + 2, query) + }); + }) + .into_boxed_str() } pub async fn create() -> HandleResult { @@ -50,14 +46,7 @@ pub async fn create() -> HandleResult { let updates = core::iter::once(Box::from("")) .chain((1..=500).map(update_query)) - .collect::]>>(); - - { - let mut conn = pool.get().await?; - for update in updates.iter().skip(1) { - conn.prepare(update, &[]).await?; - } - } + .collect(); Ok(Client { pool, @@ -120,7 +109,7 @@ impl Client { let mut conn = self.pool.get().await?; let world_stmt = conn.prepare(WORLD_SQL, WORLD_SQL_TYPES).await?; - let update_stmt = conn.prepare(&update, &[]).await?; + let update_stmt = conn.prepare(update, &[]).await?; let mut params = Vec::with_capacity(len); @@ -169,8 +158,8 @@ impl Client { } } -fn sort_update_params(params: &Vec<[i32; 2]>) -> impl ExactSizeIterator { - let mut params = params.clone(); +fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator { + let mut params = params.to_owned(); params.sort_by(|a, b| a[0].cmp(&b[0])); struct ParamIter(I); diff --git a/frameworks/Rust/xitca-web/src/db_diesel.rs b/frameworks/Rust/xitca-web/src/db_diesel.rs index 2cd44344499..cf19768ac9f 100644 --- a/frameworks/Rust/xitca-web/src/db_diesel.rs +++ b/frameworks/Rust/xitca-web/src/db_diesel.rs @@ -1,10 +1,13 @@ -use std::sync::{Arc, Mutex}; +use std::{ + io, + sync::{Arc, Mutex}, +}; use diesel::{prelude::*, r2d2}; use crate::{ ser::{Fortune, Fortunes, World}, - util::{Error, HandleResult, Rand, DB_URL}, + util::{bulk_update_gen, Error, HandleResult, Rand, DB_URL}, }; pub type Pool = Arc<_Pool>; @@ -14,7 +17,7 @@ pub struct _Pool { rng: Mutex, } -pub fn create() -> std::io::Result> { +pub fn create() -> io::Result> { r2d2::Builder::new() .max_size(100) .min_idle(Some(100)) @@ -22,7 +25,7 @@ pub fn create() -> std::io::Result> { .idle_timeout(None) .max_lifetime(None) .build(r2d2::ConnectionManager::new(DB_URL)) - .map_err(std::io::Error::other) + .map_err(io::Error::other) .map(|pool| { Arc::new(_Pool { pool, @@ -65,33 +68,32 @@ impl _Pool { pub fn update(&self, num: u16) -> HandleResult> { use crate::schema::world::dsl::*; + let mut rngs = { + let mut rng = self.rng.lock().unwrap(); + (0..num).map(|_| (rng.gen_id(), rng.gen_id())).collect::>() + }; + + rngs.sort_by(|(a, _), (b, _)| a.cmp(b)); + 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); + + let worlds = rngs + .iter() + .map(|(w_id, num)| { world .filter(id.eq(w_id)) .load::(&mut conn)? .pop() .map(|mut w| { - w.randomnumber = r_id; + w.randomnumber = *num; 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(|_| ()) - })?; + diesel::sql_query(update_query(&rngs)).execute(&mut conn)?; worlds }; @@ -115,3 +117,14 @@ impl _Pool { Ok(Fortunes::new(items)) } } + +// diesel does not support high level bulk update api. use raw sql to bypass the limitation. +// relate discussion: https://github.com/diesel-rs/diesel/discussions/2879 +fn update_query(ids: &[(i32, i32)]) -> String { + bulk_update_gen(|query| { + use std::fmt::Write; + ids.iter().for_each(|(w_id, num)| { + write!(query, "({}::int,{}::int),", w_id, num).unwrap(); + }); + }) +} diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index 06c925bbb25..710ff577586 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -39,16 +39,22 @@ async fn middleware(service: &S, req: Ctx<'_>) -> Result Service, Response = Response, Error = RouterError>, { - let mut res = service.call(req).await.unwrap_or_else(|e| match e { + let mut res = service.call(req).await.unwrap_or_else(error_handler); + res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); + Ok(res) +} + +#[cold] +#[inline(never)] +fn error_handler(e: RouterError) -> Response { + match e { RouterError::Match(_) => error_response(StatusCode::NOT_FOUND), RouterError::NotAllowed(_) => error_response(StatusCode::METHOD_NOT_ALLOWED), RouterError::Service(e) => { println!("{e}"); error_response(StatusCode::INTERNAL_SERVER_ERROR) } - }); - res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); - Ok(res) + } } async fn plain_text(ctx: Ctx<'_>) -> HandleResult { diff --git a/frameworks/Rust/xitca-web/src/main_iou.rs b/frameworks/Rust/xitca-web/src/main_iou.rs index af6f8424db0..f66eb8778e6 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_iou.rs @@ -8,43 +8,31 @@ mod db; mod ser; mod util; -use std::{convert::Infallible, fmt, future::poll_fn, io, pin::pin}; +use std::{convert::Infallible, io}; -use futures_core::stream::Stream; use xitca_http::{ - date::DateTimeService, - h1::proto::context::Context, - http::{header::SERVER, StatusCode}, + body::ResponseBody, + http::{self, header::SERVER, StatusCode}, + HttpServiceBuilder, }; -use xitca_io::{ - bytes::BytesMut, - io_uring::BoundedBuf, - net::{io_uring::TcpStream as IOUTcpStream, TcpStream}, -}; -use xitca_service::{fn_build, fn_service, middleware::UncheckedReady, Service, ServiceExt}; +use xitca_service::{fn_service, ServiceExt}; use self::{ - ser::{error_response, IntoResponse, Message, Request, Response}, + ser::{error_response, IntoResponse, Message, Request}, util::{context_mw, Ctx, QueryParse, SERVER_HEADER_VALUE}, }; fn main() -> io::Result<()> { let service = fn_service(handler) .enclosed(context_mw()) - .enclosed(fn_build(|res: Result<_, _>| async { - res.map(|service| Http1IOU { - service, - date: DateTimeService::new(), - }) - })) - .enclosed(UncheckedReady); + .enclosed(HttpServiceBuilder::h1().io_uring()); xitca_server::Builder::new() .bind("xitca-iou", "0.0.0.0:8080", service)? .build() .wait() } -async fn handler(ctx: Ctx<'_, Request<()>>) -> Result { +async fn handler(ctx: Ctx<'_, Request>) -> Result, Infallible> { let (req, state) = ctx.into_parts(); let mut res = match req.uri().path() { "/plaintext" => req.text_response().unwrap(), @@ -71,59 +59,5 @@ async fn handler(ctx: Ctx<'_, Request<()>>) -> Result { _ => error_response(StatusCode::NOT_FOUND), }; res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); - Ok(res) -} - -struct Http1IOU { - service: S, - date: DateTimeService, -} - -// runner for http service. -impl Service for Http1IOU -where - S: Service, Response = Response>, - S::Error: fmt::Debug, -{ - type Response = (); - type Error = io::Error; - - async fn call(&self, stream: TcpStream) -> Result { - let std = stream.into_std()?; - let stream = IOUTcpStream::from_std(std); - - let mut ctx = Context::<_, 8>::new(self.date.get()); - let mut read_buf = BytesMut::new(); - let mut write_buf = BytesMut::with_capacity(4096); - - loop { - let len = read_buf.len(); - let rem = read_buf.capacity() - len; - if rem < 4096 { - read_buf.reserve(4096 - rem); - } - - let (res, buf) = stream.read(read_buf.slice(len..)).await; - read_buf = buf.into_inner(); - if res? == 0 { - break; - } - - while let Some((req, _)) = ctx.decode_head::<{ usize::MAX }>(&mut read_buf).unwrap() { - let (parts, body) = self.service.call(req).await.unwrap().into_parts(); - let mut encoder = ctx.encode_head(parts, &body, &mut write_buf).unwrap(); - let mut body = pin!(body); - let chunk = poll_fn(|cx| body.as_mut().poll_next(cx)).await.unwrap().unwrap(); - encoder.encode(chunk, &mut write_buf); - encoder.encode_eof(&mut write_buf); - } - - let (res, b) = stream.write_all(write_buf).await; - write_buf = b; - write_buf.clear(); - res?; - } - - stream.shutdown(std::net::Shutdown::Both) - } + Ok(res.map(Into::into)) } diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index e52f2f9c92c..53dcff13cf0 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -62,7 +62,7 @@ impl Fortune { } } -// TODO: use another template engine with faster compile time.(perferably with no proc macro) +// TODO: use another template engine with faster compile time.(preferably with no proc macro) #[cfg_attr( feature = "template", derive(sailfish::TemplateOnce), @@ -84,11 +84,11 @@ impl<'de> Deserialize<'de> for Num { where D: Deserializer<'de>, { - use core::{cmp, fmt}; + use core::fmt; use serde::de::{Error, MapAccess, Visitor}; - const FIELDS: &'static [&'static str] = &["q"]; + const FIELDS: &[&str] = &["q"]; struct Field; @@ -135,9 +135,7 @@ impl<'de> Deserialize<'de> for Num { 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)) + Ok(Num(map.next_value().unwrap_or(1).clamp(1, 500))) } } @@ -201,8 +199,6 @@ impl IntoResponse for Request { } } -#[cold] -#[inline(never)] pub fn error_response(status: StatusCode) -> Response { http::Response::builder() .status(status) diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index 707279559ba..62888fb6c26 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -use core::{cell::RefCell, cmp}; +use core::cell::RefCell; use xitca_http::{bytes::BytesMut, http::header::HeaderValue}; @@ -10,16 +10,34 @@ pub trait QueryParse { impl QueryParse for Option<&str> { fn parse_query(self) -> u16 { - let num = self - .and_then(|this| { - use atoi::FromRadix10; - this.find('q') - .map(|pos| u16::from_radix_10(this.split_at(pos + 2).1.as_ref()).0) - }) - .unwrap_or(1); + self.and_then(|this| { + use atoi::FromRadix10; + this.find('q') + .map(|pos| u16::from_radix_10(this.split_at(pos + 2).1.as_ref()).0) + }) + .unwrap_or(1) + .clamp(1, 500) + } +} + +pub fn bulk_update_gen(func: F) -> String +where + F: FnOnce(&mut String), +{ + const PREFIX: &str = "UPDATE world SET randomNumber = w.r FROM (VALUES "; + const SUFFIX: &str = ") AS w (i,r) WHERE world.id = w.i"; + + let mut query = String::from(PREFIX); + + func(&mut query); - cmp::min(500, cmp::max(1, num)) + if query.ends_with(',') { + query.pop(); } + + query.push_str(SUFFIX); + + query } #[allow(clippy::declare_interior_mutable_const)] @@ -38,14 +56,20 @@ pub struct State { #[cfg(not(target_arch = "wasm32"))] mod non_wasm { - #[derive(Default)] - pub struct Rand(nanorand::WyRand); + use rand::{rngs::SmallRng, Rng, SeedableRng}; + + pub struct Rand(SmallRng); + + impl Default for Rand { + fn default() -> Self { + Self(SmallRng::from_entropy()) + } + } impl Rand { #[inline] pub fn gen_id(&mut self) -> i32 { - use nanorand::Rng; - (self.0.generate::() % 10_000 + 1) as _ + self.0.gen_range(1..=10000) } } diff --git a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile index f5a87ea8ec5..3c6271834ea 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.79 +FROM rust:1.81 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 3b0ef259420..461d5740603 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.79 +FROM rust:1.81 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 21ed93620d3..ad2602a8606 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.79 +FROM rust:1.81 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 02634638c16..1c22986b0a2 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-wasip1-threads -FROM rust:1.79 AS compile +FROM rust:1.81 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 0bbd89946c6..d928183362f 100644 --- a/frameworks/Rust/xitca-web/xitca-web.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.79 +FROM rust:1.81 ADD ./ /xitca-web WORKDIR /xitca-web From caef9599e77f0693db3db11ce915e2d366af9fa3 Mon Sep 17 00:00:00 2001 From: Yan Kun <1939810907@qq.com> Date: Thu, 19 Sep 2024 22:40:25 +0800 Subject: [PATCH 0812/1766] [Scala/otavia] upgrade otavia to 0.4.5 (#9275) * [Scala/otavia] upgrade otavia to 0.4.5 * [Scala/otavia] Add a test mutation --- frameworks/Scala/otavia/benchmark_config.json | 48 +------------------ frameworks/Scala/otavia/build.sc | 4 +- frameworks/Scala/otavia/config.toml | 36 +------------- .../otavia-equalization-offgc.dockerfile | 16 ------- .../Scala/otavia/otavia-offgc.dockerfile | 16 ------- ...dockerfile => otavia-overshoot.dockerfile} | 4 +- frameworks/Scala/otavia/otavia.dockerfile | 2 +- 7 files changed, 7 insertions(+), 119 deletions(-) delete mode 100644 frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile delete mode 100644 frameworks/Scala/otavia/otavia-offgc.dockerfile rename frameworks/Scala/otavia/{otavia-equalization.dockerfile => otavia-overshoot.dockerfile} (76%) diff --git a/frameworks/Scala/otavia/benchmark_config.json b/frameworks/Scala/otavia/benchmark_config.json index a93a000f3b4..87204fa771d 100644 --- a/frameworks/Scala/otavia/benchmark_config.json +++ b/frameworks/Scala/otavia/benchmark_config.json @@ -25,53 +25,7 @@ "notes": "", "versus": "Otavia" }, - "equalization": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "otavia", - "language": "Scala", - "flavor": "None", - "orm": "Micro", - "platform": "Otavia", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "otavia", - "notes": "", - "versus": "Otavia" - }, - "equalization-offgc": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "otavia", - "language": "Scala", - "flavor": "None", - "orm": "Micro", - "platform": "Otavia", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "otavia", - "notes": "", - "versus": "Otavia" - }, - "offgc": { + "overshoot": { "json_url": "/json", "plaintext_url": "/plaintext", "db_url": "/db", diff --git a/frameworks/Scala/otavia/build.sc b/frameworks/Scala/otavia/build.sc index 7f872fdf851..c2bf1888dc9 100644 --- a/frameworks/Scala/otavia/build.sc +++ b/frameworks/Scala/otavia/build.sc @@ -1,11 +1,11 @@ import mill._ import mill.scalalib._ -def otaviaVersion = "0.4.3" +def otaviaVersion = "0.4.5" object benchmark extends ScalaModule { - override def scalaVersion = "3.3.1" + override def scalaVersion = "3.3.3" override def ivyDeps = Agg( ivy"cc.otavia::otavia-codec-http:$otaviaVersion", diff --git a/frameworks/Scala/otavia/config.toml b/frameworks/Scala/otavia/config.toml index 9443c4d261b..3a8b7f85e94 100644 --- a/frameworks/Scala/otavia/config.toml +++ b/frameworks/Scala/otavia/config.toml @@ -18,41 +18,7 @@ platform = "Otavia" webserver = "None" versus = "Otavia" -[equalization] -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 = "Micro" -platform = "Otavia" -webserver = "None" -versus = "Otavia" - -[equalization-offgc] -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 = "Micro" -platform = "Otavia" -webserver = "None" -versus = "Otavia" - -[offgc] +[overshoot] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" diff --git a/frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile b/frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile deleted file mode 100644 index 23c9a90fd9e..00000000000 --- a/frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0 -WORKDIR /otavia -COPY benchmark benchmark -COPY build.sc build.sc -ENV COURSIER_REPOSITORIES=ivy2Local|central -RUN mill benchmark.assembly - -EXPOSE 8080 - -CMD java -server \ - -Dcc.otavia.actor.worker.size=56 -Dcc.otavia.nio.worker.size=56 \ - -Dcc.otavia.system.gc.aggressive=false \ - -jar \ - out/benchmark/assembly.dest/out.jar \ - jdbc:postgresql://tfb-database:5432/hello_world \ - benchmarkdbuser benchmarkdbpass 56 diff --git a/frameworks/Scala/otavia/otavia-offgc.dockerfile b/frameworks/Scala/otavia/otavia-offgc.dockerfile deleted file mode 100644 index 378a48dd2f9..00000000000 --- a/frameworks/Scala/otavia/otavia-offgc.dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0 -WORKDIR /otavia -COPY benchmark benchmark -COPY build.sc build.sc -ENV COURSIER_REPOSITORIES=ivy2Local|central -RUN mill benchmark.assembly - -EXPOSE 8080 - -CMD java -server \ - -Dcc.otavia.actor.worker.size=28 -Dcc.otavia.nio.worker.size=56 \ - -Dcc.otavia.system.gc.aggressive=false \ - -jar \ - out/benchmark/assembly.dest/out.jar \ - jdbc:postgresql://tfb-database:5432/hello_world \ - benchmarkdbuser benchmarkdbpass 56 diff --git a/frameworks/Scala/otavia/otavia-equalization.dockerfile b/frameworks/Scala/otavia/otavia-overshoot.dockerfile similarity index 76% rename from frameworks/Scala/otavia/otavia-equalization.dockerfile rename to frameworks/Scala/otavia/otavia-overshoot.dockerfile index 780aeafe0b0..10df5b40e71 100644 --- a/frameworks/Scala/otavia/otavia-equalization.dockerfile +++ b/frameworks/Scala/otavia/otavia-overshoot.dockerfile @@ -8,8 +8,8 @@ RUN mill benchmark.assembly EXPOSE 8080 CMD java -server \ - -Dcc.otavia.actor.worker.size=56 -Dcc.otavia.nio.worker.size=56 \ + -Dcc.otavia.actor.worker.size=64 \ -jar \ out/benchmark/assembly.dest/out.jar \ jdbc:postgresql://tfb-database:5432/hello_world \ - benchmarkdbuser benchmarkdbpass 56 + benchmarkdbuser benchmarkdbpass 64 diff --git a/frameworks/Scala/otavia/otavia.dockerfile b/frameworks/Scala/otavia/otavia.dockerfile index e407df7ad79..81e16063b03 100644 --- a/frameworks/Scala/otavia/otavia.dockerfile +++ b/frameworks/Scala/otavia/otavia.dockerfile @@ -8,7 +8,7 @@ RUN mill benchmark.assembly EXPOSE 8080 CMD java -server \ - -Dcc.otavia.actor.worker.size=28 -Dcc.otavia.nio.worker.size=56 \ + -Dcc.otavia.actor.worker.size=56 \ -jar \ out/benchmark/assembly.dest/out.jar \ jdbc:postgresql://tfb-database:5432/hello_world \ From 21fde310027d96107da7a771beecb10f6169a429 Mon Sep 17 00:00:00 2001 From: Andrew Stewart Date: Thu, 19 Sep 2024 10:40:36 -0400 Subject: [PATCH 0813/1766] Disable bandit compression (#9268) --- frameworks/Elixir/phoenix/config/prod.exs | 10 ++++++++-- frameworks/Elixir/phoenix/mix.exs | 2 +- frameworks/Elixir/phoenix/mix.lock | 6 +++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/frameworks/Elixir/phoenix/config/prod.exs b/frameworks/Elixir/phoenix/config/prod.exs index 48b24364a40..9ad458a09be 100755 --- a/frameworks/Elixir/phoenix/config/prod.exs +++ b/frameworks/Elixir/phoenix/config/prod.exs @@ -2,8 +2,14 @@ import Config config :hello, HelloWeb.Endpoint, adapter: Bandit.PhoenixAdapter, - http: [port: 8080, ip: {0, 0, 0, 0}], - http_options: [log_protocol_errors: false], + http: [ + port: 8080, + ip: {0, 0, 0, 0}, + http_options: [ + compress: false, + log_protocol_errors: false + ] + ], compress: false, check_origin: false, debug_errors: false, diff --git a/frameworks/Elixir/phoenix/mix.exs b/frameworks/Elixir/phoenix/mix.exs index a0ecab89cd7..c11d586e566 100755 --- a/frameworks/Elixir/phoenix/mix.exs +++ b/frameworks/Elixir/phoenix/mix.exs @@ -29,7 +29,7 @@ defmodule Hello.Mixfile do # Type `mix help deps` for examples and options defp deps do [ - {:bandit, "~> 1.0.0"}, + {:bandit, "1.5.7"}, {:gettext, "~> 0.20"}, {:ecto_sql, "~> 3.10"}, {:jason, "~> 1.2"}, diff --git a/frameworks/Elixir/phoenix/mix.lock b/frameworks/Elixir/phoenix/mix.lock index f3c8c288625..4c59758f12a 100644 --- a/frameworks/Elixir/phoenix/mix.lock +++ b/frameworks/Elixir/phoenix/mix.lock @@ -1,5 +1,5 @@ %{ - "bandit": {:hex, :bandit, "1.0.0", "2bd87bbf713d0eed0090f2fa162cd1676198122e6c2b68a201c706e354a6d5e5", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "32acf6ac030fee1f99fd9c3fcf81671911ae8637e0a61c98111861b466efafdb"}, + "bandit": {:hex, :bandit, "1.5.7", "6856b1e1df4f2b0cb3df1377eab7891bec2da6a7fd69dc78594ad3e152363a50", [:mix], [{:hpax, "~> 1.0.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "f2dd92ae87d2cbea2fa9aa1652db157b6cba6c405cb44d4f6dd87abba41371cd"}, "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, "cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, @@ -10,7 +10,7 @@ "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, "expo": {:hex, :expo, "1.0.0", "647639267e088717232f4d4451526e7a9de31a3402af7fcbda09b27e9a10395a", [:mix], [], "hexpm", "18d2093d344d97678e8a331ca0391e85d29816f9664a25653fd7e6166827827c"}, "gettext": {:hex, :gettext, "0.25.0", "98a95a862a94e2d55d24520dd79256a15c87ea75b49673a2e2f206e6ebc42e5d", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "38e5d754e66af37980a94fb93bb20dcde1d2361f664b0a19f01e87296634051f"}, - "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, + "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, "nebulex": {:hex, :nebulex, "2.6.3", "78af348ed9f8a338871b41e0b6de718c1808e627ce03fbe86598cbda2bdda2f5", [:mix], [{:decorator, "~> 1.4", [hex: :decorator, repo: "hexpm", optional: true]}, {:shards, "~> 1.1", [hex: :shards, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "09cdcbb62f8463ffcec7cae4936425ce91e25d92a6cd37e48b5dda7c851958d5"}, @@ -25,7 +25,7 @@ "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, "postgrex": {:hex, :postgrex, "0.19.0", "f7d50e50cb42e0a185f5b9a6095125a9ab7e4abccfbe2ab820ab9aa92b71dbab", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "dba2d2a0a8637defbf2307e8629cb2526388ba7348f67d04ec77a5d6a72ecfae"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, - "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, "websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"}, From 15910b2e4245368b288893450664806c252cf09e Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:53:44 +0300 Subject: [PATCH 0814/1766] [mORMot] - mORmot@2.2.8407 + use mormot2 memory manager to found reason of GPF in /plaintext test (#9283) Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/setup_and_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index ed0c26034e8..8f2d533127f 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/a0dda41833c3d32531080d1eeb5a1627540d62e9 +URL=https://github.com/synopse/mORMot2/tarball/6dc09ceca456931384857b383ed61b63f11f3be7 #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 @@ -80,7 +80,7 @@ fpc -MDelphi -Sci -Ci -O3 -g -gl -gw2 -Xg -k'-rpath=$ORIGIN' -k-L$BIN \ -Fu"$MSRC/core" -Fu"$MSRC/db" -Fu"$MSRC/rest" -Fu"$MSRC/crypt" \ -Fu"$MSRC/app" -Fu"$MSRC/net" -Fu"$MSRC/lib" -Fu"$MSRC/orm" -Fu"$MSRC/soa" \ -FU"$BIN/fpc-$ARCH_TG/.dcu" -FE"$BIN/fpc-$ARCH_TG" -o"$BIN/fpc-$ARCH_TG/$dest_fn" \ - -dFPC_LIBCMM -dFPC_LIBCMM_NOMSIZE \ + -dFPC_X64MM -dFPCMM_SERVER \ -B -Se1 "./src/raw.pas" | grep "[Warning|Error|Fatal]:" script_successful \ No newline at end of file From 3d85c25d27cddd536b1dc5d4d2b99aec5f54ead4 Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Thu, 19 Sep 2024 16:53:52 +0200 Subject: [PATCH 0815/1766] Micronaut: Use OpenJdk 23 and Graalvm 23 (#9282) * Micronaut: Use Graalvm 23 * Use OpenJdk 23 --- frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-jdbc.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile | 2 +- frameworks/Java/micronaut/micronaut-r2dbc.dockerfile | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile index 60c935c6d25..f506d3e9fb8 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile @@ -3,7 +3,7 @@ COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-jdbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:21 +FROM openjdk:23 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/libs/micronaut-data-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile index f098cf335eb..16c0061d17a 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile @@ -3,7 +3,7 @@ COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-mongodb:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:21 +FROM openjdk:23 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/libs/micronaut-data-mongodb-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile index 0fe88905ef3..f8a07dc83a0 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile @@ -3,7 +3,7 @@ COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-r2dbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:21 +FROM openjdk:23 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/libs/micronaut-data-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile index c1e1207fa96..bbef52f862a 100644 --- a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:22 +FROM container-registry.oracle.com/graalvm/native-image:23 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile index 6b6e9262aa2..671d236193d 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:22 +FROM container-registry.oracle.com/graalvm/native-image:23 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile index 63b613d4e61..d6a026f0778 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile @@ -3,7 +3,7 @@ COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-jdbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:21 +FROM openjdk:23 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-jdbc/build/libs/micronaut-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile index 06ccaea922c..eaf2985de2d 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:22 +FROM container-registry.oracle.com/graalvm/native-image:23 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile index 480b47cffa2..e0fd59fc36b 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile @@ -3,7 +3,7 @@ COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-r2dbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:21 +FROM openjdk:23 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-r2dbc/build/libs/micronaut-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh From 55a16e9753451e5247b3fd73a49b92b1b508392a Mon Sep 17 00:00:00 2001 From: itrofimow Date: Thu, 19 Sep 2024 22:24:55 +0400 Subject: [PATCH 0816/1766] [C++] [userver] Remove way too unrealistic "bare" configuration (#9267) * drop bare-configuration from the suite * cleanup README * drop LTO, as userver doesn't support it * remove unrealistic tweaks --- frameworks/C++/userver/README.md | 9 +++--- frameworks/C++/userver/benchmark_config.json | 24 --------------- frameworks/C++/userver/config.toml | 18 ------------ .../C++/userver/userver-bare.dockerfile | 29 ------------------- frameworks/C++/userver/userver.dockerfile | 2 +- .../userver_benchmark/userver_techempower.cpp | 19 ++---------- .../userver_configs/static_config.yaml | 3 -- 7 files changed, 8 insertions(+), 96 deletions(-) delete mode 100644 frameworks/C++/userver/userver-bare.dockerfile diff --git a/frameworks/C++/userver/README.md b/frameworks/C++/userver/README.md index d10de17e403..8b1d83c4d2a 100755 --- a/frameworks/C++/userver/README.md +++ b/frameworks/C++/userver/README.md @@ -2,14 +2,11 @@ This is the [userver](https://github.com/userver-framework/userver) portion of a [benchmarking test suite](https://github.com/TechEmpower/FrameworkBenchmarks) comparing a variety of web development platforms. -This benchmarks comes in two configurations: **userver** and **userver-bare**, where both configurations use exactly the same handlers code, but **userver-bare** replaces default http implementation of **userver** with custom one. -You see, **userver** being feature-rich framework widely used in production comes with a lot of useful functionality built-in (metrics, dynamic configuring, logging/tracing, congestion control etc...) none of which is of any use in benchmarks; although most of that can be disabled via configs, some parts remain, and these parts aren't free. -The aim of **userver-bare** is to explore practical limits of lower-level **userver** functionality when performance is an absolute must, while still being idiomatic userver code. - ### Test Type Implementation Source Code * [Plaintext](userver_benchmark/controllers/plaintext/handler.cpp) * [Json](userver_benchmark/controllers/json/handler.cpp) +* [Fortunes](userver_benchmark/controllers/fortunes/handler.cpp) * [Single Database Query](userver_benchmark/controllers/single_query/handler.cpp) * [Multiple Database Queries](userver_benchmark/controllers/multiple_queries/handler.cpp) * [Database Updates](userver_benchmark/controllers/updates/handler.cpp) @@ -24,6 +21,10 @@ http://localhost:8080/plaintext http://localhost:8080/json +### Fortunes + +http://localhost:8080/fortunes + ### Single Database Query http://localhost:8080/db diff --git a/frameworks/C++/userver/benchmark_config.json b/frameworks/C++/userver/benchmark_config.json index aba5e7d5933..8a455b99a30 100755 --- a/frameworks/C++/userver/benchmark_config.json +++ b/frameworks/C++/userver/benchmark_config.json @@ -25,30 +25,6 @@ "display_name": "userver", "notes": "", "versus": "None" - }, - "bare": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "cached_query_url": "/cached-queries?count=", - "fortune_url": "/fortunes", - "port": 8081, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "userver", - "language": "C++", - "flavor": "None", - "orm": "Micro", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "userver[bare]", - "notes": "", - "versus": "None" } } ] diff --git a/frameworks/C++/userver/config.toml b/frameworks/C++/userver/config.toml index 316860f74a1..424fd5d6457 100644 --- a/frameworks/C++/userver/config.toml +++ b/frameworks/C++/userver/config.toml @@ -18,21 +18,3 @@ orm = "Micro" platform = "None" webserver = "None" versus = "None" - -[bare] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.cached_query = "/cached-queries?count=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "None" -versus = "None" diff --git a/frameworks/C++/userver/userver-bare.dockerfile b/frameworks/C++/userver/userver-bare.dockerfile deleted file mode 100644 index 92f8cdaa080..00000000000 --- a/frameworks/C++/userver/userver-bare.dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM ghcr.io/userver-framework/ubuntu-22.04-userver-pg AS builder - -RUN apt update && \ - apt install -y lsb-release wget software-properties-common gnupg && \ - wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && ./llvm.sh 16 - -WORKDIR /src -RUN git clone https://github.com/userver-framework/userver.git && \ - cd userver && git checkout bdd5e1e03921ff378b062f86a189c3cfa3d66332 - -COPY userver_benchmark/ ./ -RUN mkdir build && cd build && \ - cmake -DUSERVER_IS_THE_ROOT_PROJECT=0 -DUSERVER_FEATURE_CRYPTOPP_BLAKE2=0 \ - -DUSERVER_FEATURE_UTEST=0 \ - -DUSERVER_FEATURE_POSTGRESQL=1 \ - -DUSERVER_FEATURE_ERASE_LOG_WITH_LEVEL=warning \ - -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 -WORKDIR /app -COPY userver_configs/* ./ -COPY --from=builder /src/build/userver_techempower ./ - -EXPOSE 8081 -CMD ./userver_techempower -c ./static_config.yaml - diff --git a/frameworks/C++/userver/userver.dockerfile b/frameworks/C++/userver/userver.dockerfile index 5f4755e3714..e115816b324 100644 --- a/frameworks/C++/userver/userver.dockerfile +++ b/frameworks/C++/userver/userver.dockerfile @@ -14,7 +14,7 @@ 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 -flto=thin" -DCMAKE_C_FLAGS="-march=native -flto=thin" \ + -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=0 .. && \ make -j $(nproc) diff --git a/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp b/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp index 6e994d3021c..af0a2b64842 100644 --- a/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp +++ b/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp @@ -46,20 +46,6 @@ 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() @@ -78,10 +64,9 @@ int Main(int argc, char* argv[]) { .Append() // cache component .Append() .Append() - // tracing and metrics tweaks + // tracing tweaks .Append() - .Append() - // bare + // bare (not used in the benchmark currently) .Append() .Append(); diff --git a/frameworks/C++/userver/userver_configs/static_config.yaml b/frameworks/C++/userver/userver_configs/static_config.yaml index 4d7a7878912..ed793a694a7 100644 --- a/frameworks/C++/userver/userver_configs/static_config.yaml +++ b/frameworks/C++/userver/userver_configs/static_config.yaml @@ -13,7 +13,6 @@ components_manager: thread_name: main-worker # OS will show the threads of this task processor with 'main-worker' prefix. worker_threads: 48 guess-cpu-limit: true - task-processor-queue: work-stealing-task-queue fs-task-processor: # Make a separate task processor for filesystem bound tasks. thread_name: fs-worker @@ -29,7 +28,6 @@ components_manager: handler-defaults: set_tracing_headers: false server-name: us - middleware-pipeline-builder: minimal-middleware-pipeline-builder simple-router: simple-server: port: 8081 @@ -63,7 +61,6 @@ components_manager: noop-tracing-manager: tracing-manager-locator: component-name: noop-tracing-manager - minimal-middleware-pipeline-builder: plaintext-handler: path: /plaintext From 4cbc9751b0a29f813f6092439729624f3bdf0ed1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:51:03 +0000 Subject: [PATCH 0817/1766] Bump puma from 6.4.2 to 6.4.3 in /frameworks/Ruby/rack Bumps [puma](https://github.com/puma/puma) from 6.4.2 to 6.4.3. - [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.2...v6.4.3) --- updated-dependencies: - dependency-name: puma 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 f3224c850b1..cf785ab1792 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -77,7 +77,7 @@ GEM protocol-rack (0.6.0) protocol-http (~> 0.23) rack (>= 1.0) - puma (6.4.2) + puma (6.4.3) nio4r (~> 2.0) racc (1.8.0) rack (3.1.6) From 0454c5721b89845dfe90d5a9a3163b3a25bc6ddc Mon Sep 17 00:00:00 2001 From: vividsnow Date: Fri, 27 Sep 2024 23:46:14 +0300 Subject: [PATCH 0818/1766] perl: feersum --- frameworks/Perl/feersum/README.md | 12 + frameworks/Perl/feersum/app.pl | 334 ++++++++++++++++++ frameworks/Perl/feersum/benchmark_config.json | 56 +++ frameworks/Perl/feersum/cpanfile | 8 + frameworks/Perl/feersum/cpanfile_alt | 1 + frameworks/Perl/feersum/feersum.dockerfile | 28 ++ 6 files changed, 439 insertions(+) create mode 100644 frameworks/Perl/feersum/README.md create mode 100644 frameworks/Perl/feersum/app.pl create mode 100644 frameworks/Perl/feersum/benchmark_config.json create mode 100644 frameworks/Perl/feersum/cpanfile create mode 100644 frameworks/Perl/feersum/cpanfile_alt create mode 100644 frameworks/Perl/feersum/feersum.dockerfile diff --git a/frameworks/Perl/feersum/README.md b/frameworks/Perl/feersum/README.md new file mode 100644 index 00000000000..a620bf8e9de --- /dev/null +++ b/frameworks/Perl/feersum/README.md @@ -0,0 +1,12 @@ +# About + +[Feersum](https://metacpan.org/dist/Feersum) - HTTP 1.0/1.1 handler for Perl based on +[EV](https://metacpan.org/dist/EV) and [picohttpparser](https://github.com/h2o/picohttpparser) + +# Requirements + +* Perl 5.40) +* [JSON::XS](https://metacpan.org/dist/JSON-XS) +* [DBI](https://metacpan.org/dist/DBI) +* [Text::Xslate](https://metacpan.org/dist/Text-Xslate) +* [LMDB](https://metacpan.org/dist/LMDB_File) diff --git a/frameworks/Perl/feersum/app.pl b/frameworks/Perl/feersum/app.pl new file mode 100644 index 00000000000..f826a2791a0 --- /dev/null +++ b/frameworks/Perl/feersum/app.pl @@ -0,0 +1,334 @@ +use v5.40; +use warnings; +use Feersum::Runner; +use EV; use AnyEvent; +use DBI 'SQL_INTEGER'; +use DBD::Pg ':async'; +use Scalar::Util 'weaken'; +use List::Util qw'min max pairmap'; +use JSON::XS; +use Text::Xslate; +use LMDB_File qw':flags :error'; + +use constant { + host_port => $ENV{host_port} || '0.0.0.0:8080', + debug => $ENV{debug} // 0, + db => lc($ENV{db} || 'postgres'), # postgres / mysql / maria (will use for constant folding) + db_name => $ENV{db_name} || 'hello_world', + db_host => $ENV{db_host} || 'tfb-database', + db_port => $ENV{db_port}, + db_user => $ENV{db_user} || 'benchmarkdbuser', + db_pass => $ENV{db_pass} || 'benchmarkdbpass', + empty => [], o => +{}, + reconnect_interval => 60, + max_db_connections => 512, + max_update_tries => 3 +}; +use constant max_batch_update_size => 1; # db eq 'postgres' ? 5 : 10; # rule of thumb +use constant server => qw'Server Feersum'; +use constant { + text => [server, qw'Content-Type text/plain'], + json => [server, qw'Content-Type application/json'], + html => [server, 'Content-Type', 'text/html; charset=utf-8'], + nocontent => [server], +}; + +my @dsn = ( + (sprintf 'dbi:%s:port=%d;host=%s;database=%s;', + (db eq 'mysql' ? ('mysql', db_port // 3306) : + db eq 'maria' ? ('MariaDB', db_port // 3306) : + db eq 'postgres' ? ('Pg', db_port // 5432) + : die 'unknown db'), db_host, db_name), + db_user, db_pass, + +{qw'AutoCommit 1 RaiseError 0 PrintError 1', + (db eq 'maria' ? (qw'mariadb_server_prepare 1 mariadb_ssl 0') : + db eq 'mysql' ? (qw'mysql_server_prepare 1 mysql_ssl 0 mysql_get_server_pubkey 1') : + db eq 'postgres' ? (qw'pg_server_prepare 1 sslmode 0') : ())} +); + +chomp(my $cpus = `nproc`); +say "$cpus cpus available" if debug; +my $pool_size = int max_db_connections / $cpus; # number of db connections in each worker +my $js = JSON::XS->new; + +my $html = render(); +cache('init'); + +my %prepare = ( + world => ['select randomNumber, id from World where id = ?', SQL_INTEGER], + fortune => ['select id, message from Fortune'], + update1 => ['update World set randomNumber = ? where id = ?', (SQL_INTEGER) x 2], + (map { + 'update'.$_ => + [sprintf( + (db eq 'mysql' || db eq 'maria') ? 'with t(v,i) as (values %s) update World w join t on t.i = w.id set w.randomNumber = t.v' : + db eq 'postgres' ? 'with t(v,i) as (values %s) update World w set randomNumber = t.v from t where t.i = w.id' : undef, + (join ',', ((db eq 'mysql' || db eq 'maria') ? 'row(?,?)' : '(?,?)') x $_) + ), (SQL_INTEGER) x ($_ * 2)] + } 2..max_batch_update_size) +); + +my ($pool, $cache); +my $w = EV::fork sub { # child init + $pool = db_pool($pool_size, \@dsn, \%prepare); # db connection pool in each worker + $cache = cache('use'); # cache +}; + +my %route = controllers(); + +my $runner = Feersum::Runner->new( + pre_fork => $cpus, + quiet => !debug, keepalive => 1, + max_connection_reqs => 1000, + read_timeout => 60, + listen => [host_port] +)->run(sub ($h) { ($route{$h->path} // $route{404})->($h) }); + +sub controllers {( + '/plaintext', sub ($h) { $h->send_response(200, text, \'Hello, World!') }, + '/json', sub ($h) { $h->send_response(200, json, \$js->encode(+{ message => 'Hello, World!' })) }, + (map +('/db', $_, '/queries', $_, '/updates', $_ ), sub ($h) { + my ($n) = (my $q = $h->query // '') =~ m/queries=(\d+)/a; + $n = max(1, min($n//1, 500)); + my ($cv, @rs) = (AE::cv); + my $on_done = sub { $h->send_response(200, json, \$js->encode($q ? \@rs : ($rs[0] // o))) }; + $cv->begin( + $h->path ne '/updates' + ? $on_done # select + : sub { # update + if (@rs) { + my ($i, $j) = (0, 0); + my $cv = AE::cv; + $cv->begin($on_done); + while () { + $j = min($i + max_batch_update_size - 1, $#rs); + say "$i $j" if debug; + $cv->begin; + $_->{randomNumber} = int(rand 10000) + 1 for @rs[$i..$j]; + my $tries = max_update_tries; + my $st = 'update'.($j - $i + 1); + my $args = [map @$_{qw/randomNumber id/}, @rs[$i..$j]]; + my $update = sub ($rv = undef, $sth_or_e = undef) { + $cv->end, return if $rv; + say 'retryin update on '.$sth_or_e if $tries < max_update_tries; + say 'fail to update on '.max_update_tries.' tries ' and $cv->end unless $tries--; + db_execute($pool, $st, $args, __SUB__); + }; + $update->(); + $i += max_batch_update_size; + last if $i >= @rs; + } + $cv->end; + } else { $on_done->() } + } + ); + for (1..$n) { + my $id = int(rand 10000) + 1; + $cv->begin; + db_execute($pool, world => [$id], sub ($rows, $sth) { + push @rs, @{$sth->fetchall_arrayref(+{ randomNumber => 1, id => 1 })} if $rows > 0; + $cv->end + }); + } + $cv->end + }), + '/fortunes' => sub ($h) { + db_execute($pool, fortune => empty, sub ($rows, $sth) { + $h->send_response(200, html, \$html->render('fortune.tx', +{ rows => [ + sort { $a->[1] cmp $b->[1] } + @{$sth->fetchall_arrayref}, + [0, 'Additional fortune added at request time.'] + ]})) + }); + }, + '/cached-queries' => sub ($h) { + my ($n) = (my $q = $h->query // '') =~ m/count=(\d+)/a; + $n = max(1, min($n//1, 500)); + my @rs = map +{ id => $_ , randomNumber => $cache->($_) }, map int(rand 10000) + 1, 1..$n; + $h->send_response(200, json, \$js->encode(\@rs)); + }, + '/' => sub ($h) { $h->send_response(204, nocontent, empty) }, + 404 => sub ($h) { $h->send_response(404, nocontent, empty) } +)} + +sub render { + my $t = Text::Xslate->new(path => +{ + (my $file = 'fortune.tx') => <<~\html =~ s/(?<=[\r\n])\s+//sgr + + + Fortunes + + + + : for $rows -> $i { + + : } +
      idmessage
      <: $i.0 :><: $i.1 :>
      + + + html + }); + $t->load_file($file); + $t +} + +sub cache ($type = 'init') { + my $path = '/dev/shm/feersum'; + say "clearing $path" and unlink glob "$path*" if $type eq 'init' && -e $path; + my $env = LMDB::Env->new($path, +{ + mapsize => 1024*512, + flags => MDB_WRITEMAP|MDB_NOSYNC|MDB_NOMETASYNC|MDB_NOTLS|MDB_NOSUBDIR|MDB_NORDAHEAD + }) or die $LMDB_File::last_err; + if ($type eq 'init') { + die unless defined(my $tx = $env->BeginTxn); + my $handle = $tx->open(undef, MDB_CREATE|MDB_INTEGERKEY); + my $dbh = DBI->connect(@dsn); + $tx->put($handle, $_->[0], pack S => $_->[1]) for @{$dbh->selectall_arrayref('select id, randomNumber from World')}; + $tx->commit; + $dbh->disconnect; + say 'cache populated' if debug; + return; + } + my $tx = $env->BeginTxn(MDB_RDONLY); + my $handle = $tx->open(undef, MDB_INTEGERKEY); + sub ($k) { $tx->renew; $tx->get($handle, $k, my $v); unpack S => $v } +} + +sub db_pool ($size, $dsn, $prepare = undef) { + my %pool = (slot => [], active => +{}, free => [], pending => [], prepare => $prepare); + db_connect(\%pool, $_, $dsn) for 0 .. $size - 1; + \%pool +} + +sub db_connect ($pool, $id, $dsn) { + say "db[$id] connection.." if debug; + my $dbh = DBI->connect(@$dsn); + unless ($dbh) { + warn sprintf 'err: %s. will try reconnect %d sec', $DBI::errstr, reconnect_interval; + $pool->{slot}[$id] = AE::timer +reconnect_interval, 0, sub { db_connect($pool, $id, $dsn) }; # try later + return + } + my $fd = db eq 'maria' ? $dbh->mariadb_sockfd : db eq 'mysql' ? $dbh->mysql_fd : db eq 'postgres' ? $dbh->{pg_socket} : undef; + open my $fh, "<&=", $fd or die $!; # dup handle + state $st_opt = +{ + db eq 'maria' ? (mariadb_async => 1) : + db eq 'mysql' ? (async => 1) : + db eq 'postgres' ? (pg_async => PG_ASYNC + PG_OLDQUERY_CANCEL) : () + }; + my %conn = ( + id => $id, db => $dbh, fd => $fd, fh => $fh, dsn => $dsn, + st => +{ $pool->{prepare} ? (pairmap { + my $sth = $dbh->prepare($b->[0], $st_opt); + $sth->bind_param($_, undef, $b->[$_]) for 1..$#$b; + ($a, $sth) + } %{$pool->{prepare}}) : () }, + connected => 1, + ); + $conn{w} = EV::io $fh, EV::READ, sub { + my $e; + { ; + $e = 'inactive', last unless defined(my $st = $conn{active}); + if ($st) { # executed st + $e = 'nost', last unless my $sth = $conn{st}{$st}; + $e = 'unready', last unless + db eq 'maria' ? $sth->mariadb_async_ready : + db eq 'mysql' ? $sth->mysql_async_ready : + db eq 'postgres' ? $sth->pg_ready : undef; + $e = 'noresult', $sth->finish unless defined( + my $rows = + db eq 'maria' ? $sth->mariadb_async_result : + db eq 'mysql' ? $sth->mysql_async_result : + db eq 'postgres' ? $sth->pg_result : undef + ); + say "db[$id $fd] calling cb: ".$st if debug; + if (my $cb = $conn{cb}) { $cb->($rows, $e // $sth) } + else { say "db[$id $fd] no handler for response with $rows rows" } + $sth->finish unless $e; + } else { # db do + $e = 'nodb', last unless my $dbh = $conn{db}; + $e = 'unready', last unless + db eq 'maria' ? $dbh->mariadb_async_ready : + db eq 'mysql' ? $dbh->mysql_async_ready : + db eq 'postgres' ? $dbh->pg_ready : undef; + $e = 'noresult' unless defined( + my $rv = + db eq 'maria' ? $dbh->mariadb_async_result : + db eq 'mysql' ? $dbh->mysql_async_result : + db eq 'postgres' ? $dbh->pg_result : undef + ); + say "db[$id $fd] calling cb: db do query" if debug; + if (my $cb = $conn{cb}) { $cb->($rv, $e) } + else { say "db[$id $fd] no handler response with $rv return" } + } + say "db[$id $fd] error: $e " if debug && $e; + say "db[$id $fd] finish" if debug; + delete $conn{active}; + delete $pool->{active}{$id}; + push @{$pool->{free}}, \%conn; + if (defined(my $pending = shift @{$pool->{pending}})) { + my $code = shift @$pending; + $code->($pool, splice @$pending) + } + return + } + say "db[$id $fd] $e" if debug; + if (eof($fh) || (my $inactive = $e eq 'inactive')) { + say "db[$id $fd] disconnected" if debug; + delete @conn{qw/w connected/}; + $conn{db}->disconnect if $inactive; + $conn{cb}->(-1, undef) if $conn{st} && $conn{active} && $conn{cb}; + db_connect($pool, $id, $dsn); # reconnect + } else { + say "db[$id $fd] stalled?"; + } + }; + say "db[$id $fd] connected" if debug; + $pool->{slot}[$id] = \%conn; + weaken(my $weak = $pool->{slot}[$id]); + push @{$pool->{free}}, $weak; + if (defined(my $pending = shift @{$pool->{pending}})) { + my $code = shift @$pending; + $code->($pool, splice @$pending) + } +} + +sub db_execute ($pool, $st, $args, $cb) { + say 'db executing..' if debug; + while (my $conn = shift @{$pool->{free}}) { + (debug and say 'skip unconnected'), next unless defined($conn) && $conn->{connected}; + say 'on connection..'.$conn->{id} if debug; + if ($conn->{st}{$st}->execute(@$args)) { + (@$conn{qw/cb active/}, $pool->{active}{$conn->{id}}) = ($cb, $st, 1); + return; + } else { + say 'error: ', $conn->{st}{$st}->errstr; + db_connect($pool, @$conn{qw/id dsn/}); # reconnect + next; + } + } + say '..put to pending..' if debug; + push @{$pool->{pending}}, [__SUB__, $st, $args, $cb]; +} + +sub db_do ($pool, $query, $args, $cb) { + say 'db doing..' if debug; + state $db_opt = +{ + db eq 'maria' ? (mariadb_async => 1) : + db eq 'mysql' ? (async => 1) : + db eq 'postgres' ? (pg_async => PG_ASYNC + PG_OLDQUERY_CANCEL) : () + }; + while (my $conn = shift @{$pool->{free}}) { + (debug and say 'skip unconnected'), next unless defined($conn) && $conn->{connected}; + say 'on connection..'.$conn->{id} if debug; + if ($conn->{db}->do($query, $db_opt, defined($args) ? @$args : ())) { + (@$conn{qw/cb active/}, $pool->{active}{$conn->{id}}) = ($cb, 0, 1); + return; + } else { + say 'error: ', $conn->{db}->errstr; + db_connect($pool, @$conn{qw/id dsn/}); # reconnect + next; + } + } + say '..put to pending..' if debug; + push @{$pool->{pending}}, [__SUB__, $query, $args, $cb]; +} diff --git a/frameworks/Perl/feersum/benchmark_config.json b/frameworks/Perl/feersum/benchmark_config.json new file mode 100644 index 00000000000..84e75044bd2 --- /dev/null +++ b/frameworks/Perl/feersum/benchmark_config.json @@ -0,0 +1,56 @@ +{ + "framework": "feersum", + "maintainers": ["vividsnow"], + "tests": [{ + "default": { + "dockerfile": "feersum.dockerfile", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "cached_query_url": "/cached-queries?count=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "database_os": "Linux", + "framework": "feersum", + "language": "Perl", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "feersum", + "os": "Linux", + "database_os": "Linux", + "display_name": "feersum", + "notes": "" + }, + "mysql": { + "dockerfile": "feersum.dockerfile", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "cached_query_url": "/cached-queries?count=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "MySQL", + "database_os": "Linux", + "framework": "feersum", + "language": "Perl", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "feersum", + "os": "Linux", + "database_os": "Linux", + "display_name": "feersum", + "notes": "" + } + }] +} diff --git a/frameworks/Perl/feersum/cpanfile b/frameworks/Perl/feersum/cpanfile new file mode 100644 index 00000000000..9b868f48ffe --- /dev/null +++ b/frameworks/Perl/feersum/cpanfile @@ -0,0 +1,8 @@ +requires 'Feersum', '== 1.503'; +requires 'JSON::XS', '== 4.03'; +requires 'DBD::MariaDB', '== 1.23'; +requires 'DBD::Pg', '== 3.18.0'; +requires 'AnyEvent', '== 7.17'; +requires 'Async::Interrupt', '== 1.26'; +requires 'Text::Xslate', '== v3.5.9'; +requires 'LMDB_File', '== 0.13'; diff --git a/frameworks/Perl/feersum/cpanfile_alt b/frameworks/Perl/feersum/cpanfile_alt new file mode 100644 index 00000000000..7b26f606c2d --- /dev/null +++ b/frameworks/Perl/feersum/cpanfile_alt @@ -0,0 +1 @@ +requires 'DBD::mysql', '== 5.009'; diff --git a/frameworks/Perl/feersum/feersum.dockerfile b/frameworks/Perl/feersum/feersum.dockerfile new file mode 100644 index 00000000000..ed8865deb4f --- /dev/null +++ b/frameworks/Perl/feersum/feersum.dockerfile @@ -0,0 +1,28 @@ +from perl:5.40-slim +run apt-get update +run apt-get install -y --no-install-recommends --no-install-suggests catatonit libmariadb-dev libpq-dev libev-dev liblmdb-dev build-essential curl gnupg +run curl -fsSL https://raw.githubusercontent.com/skaji/cpm/main/cpm | perl - install -g App::cpm +workdir /app +add cpanfile . +run cpm install -g + +run curl https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 -o /etc/apt/trusted.gpg.d/mysql2023 +run gpg --dearmor /etc/apt/trusted.gpg.d/mysql2023 +run rm /etc/apt/trusted.gpg.d/mysql2023 +run echo 'deb http://repo.mysql.com/apt/debian bookworm mysql-innovation' > /etc/apt/sources.list.d/mysql.list +run apt-get update +run apt-get install -y --no-install-recommends --no-install-suggests libmysqlclient-dev +add cpanfile_alt . +run cpm install -g --cpanfile=cpanfile_alt + +run apt-get clean +run rm -rf $HOME/.perl-cpm +add app.pl . +expose 8080 + +arg TFB_TEST_DATABASE +env db=$TFB_TEST_DATABASE + +stopsignal SIGKILL + +cmd perl app.pl From 5e3690097f7fcfc74e0ccbbbe09ca7c3140e0174 Mon Sep 17 00:00:00 2001 From: Andrew Stewart Date: Mon, 30 Sep 2024 13:53:13 -0400 Subject: [PATCH 0819/1766] Use transaction for multiple updates, multiple queries (#9263) --- .../hello_web/controllers/page_controller.ex | 63 +++++++++++-------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex index 34c1fc120fd..7cb7d1fbe2b 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex @@ -1,5 +1,4 @@ defmodule HelloWeb.PageController do - use HelloWeb, :controller alias Hello.Models.Fortune @@ -25,13 +24,18 @@ defmodule HelloWeb.PageController do end def queries(conn, params) do - :rand.seed(:exsp) + {:ok, worlds} = + Repo.transaction(fn -> + :rand.seed(:exsp) - worlds = - Stream.repeatedly(&random_id/0) - |> Stream.uniq() - |> Stream.map(&Repo.get(World, &1)) - |> Enum.take(size(params["queries"])) + worlds = + Stream.repeatedly(&random_id/0) + |> Stream.uniq() + |> Stream.map(&Repo.get(World, &1)) + |> Enum.take(size(params["queries"])) + + worlds + end) json(conn, worlds) end @@ -50,26 +54,31 @@ defmodule HelloWeb.PageController do end def updates(conn, params) do - :rand.seed(:exsp) - - worlds = - Stream.repeatedly(&random_id/0) - |> Stream.uniq() - |> Stream.map(&Repo.get(World, &1)) - |> Stream.map(fn world -> %{id: world.id, randomnumber: :rand.uniform(@random_max)} end) - |> Enum.take(size(params["queries"])) - # If this is not sorted it sometimes generates - # FAIL for http://tfb-server:8080/updates/20 - # Only 20470 executed queries in the database out of roughly 20480 expected. - |> Enum.sort_by(& &1.id) - - Repo.insert_all( - World, - worlds, - on_conflict: {:replace_all_except, [:id]}, - conflict_target: [:id], - returning: false - ) + {:ok, worlds} = + Repo.transaction(fn -> + :rand.seed(:exsp) + + worlds = + Stream.repeatedly(&random_id/0) + |> Stream.uniq() + |> Stream.map(&Repo.get(World, &1)) + |> Stream.map(fn world -> %{id: world.id, randomnumber: :rand.uniform(@random_max)} end) + |> Enum.take(size(params["queries"])) + # If this is not sorted it sometimes generates + # FAIL for http://tfb-server:8080/updates/20 + # Only 20470 executed queries in the database out of roughly 20480 expected. + |> Enum.sort_by(& &1.id) + + Repo.insert_all( + World, + worlds, + on_conflict: {:replace_all_except, [:id]}, + conflict_target: [:id], + returning: false + ) + + worlds + end) json(conn, worlds) end From e816639b2c1c5392baf947109c9e91d35919a736 Mon Sep 17 00:00:00 2001 From: Andy Pan <169128354+andy2pan@users.noreply.github.com> Date: Tue, 1 Oct 2024 01:53:26 +0800 Subject: [PATCH 0820/1766] gnet: fix a bug of Content-Length header when using wildcat (#9273) --- frameworks/Go/gnet/benchmark_config.json | 4 +- frameworks/Go/gnet/gnet.dockerfile | 2 +- frameworks/Go/gnet/src/go.mod | 20 ++++--- frameworks/Go/gnet/src/go.sum | 47 +++++++--------- frameworks/Go/gnet/src/main.go | 70 +++++++++++++++++++----- 5 files changed, 90 insertions(+), 53 deletions(-) diff --git a/frameworks/Go/gnet/benchmark_config.json b/frameworks/Go/gnet/benchmark_config.json index 3999bd74f97..1ff8439be6d 100644 --- a/frameworks/Go/gnet/benchmark_config.json +++ b/frameworks/Go/gnet/benchmark_config.json @@ -4,8 +4,8 @@ "default": { "plaintext_url": "/plaintext", "port": 8080, - "approach": "stripped", - "classification": "Micro", + "approach": "Realistic", + "classification": "Platform", "database": "None", "framework": "gnet", "language": "Go", diff --git a/frameworks/Go/gnet/gnet.dockerfile b/frameworks/Go/gnet/gnet.dockerfile index 2b060d96acd..bf9715306d8 100644 --- a/frameworks/Go/gnet/gnet.dockerfile +++ b/frameworks/Go/gnet/gnet.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:latest WORKDIR /gnet diff --git a/frameworks/Go/gnet/src/go.mod b/frameworks/Go/gnet/src/go.mod index bc59a7c9cfd..77b8811ce55 100644 --- a/frameworks/Go/gnet/src/go.mod +++ b/frameworks/Go/gnet/src/go.mod @@ -1,17 +1,19 @@ module gnet -go 1.19 +go 1.23.1 require ( - github.com/panjf2000/gnet/v2 v2.1.2 - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 // indirect + github.com/evanphx/wildcat v0.0.0-20141114174135-e7012f664567 + github.com/panjf2000/gnet/v2 v2.5.7 ) require ( - github.com/josharian/intern v1.0.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/zap v1.23.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/vektra/errors v0.0.0-20140903201135-c64d83aba85a // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.21.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) diff --git a/frameworks/Go/gnet/src/go.sum b/frameworks/Go/gnet/src/go.sum index f9f9c868493..e39645c8777 100644 --- a/frameworks/Go/gnet/src/go.sum +++ b/frameworks/Go/gnet/src/go.sum @@ -1,46 +1,39 @@ -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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/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/evanphx/wildcat v0.0.0-20141114174135-e7012f664567 h1:7+oQw6YjB/kk9x27AEC7DMXudqERHD583hZpno18lRw= +github.com/evanphx/wildcat v0.0.0-20141114174135-e7012f664567/go.mod h1:XNGflD53X+hfdCAt1NGeBUgiUpe9QmweW/zI1gV26Zw= 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/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/panjf2000/ants/v2 v2.4.8 h1:JgTbolX6K6RreZ4+bfctI0Ifs+3mrE5BIHudQxUDQ9k= -github.com/panjf2000/ants/v2 v2.4.8/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A= -github.com/panjf2000/gnet/v2 v2.1.2 h1:WJ/PkbfV6G0wcGOng2pyCwv8oadKiqtP8p+38smN7ao= -github.com/panjf2000/gnet/v2 v2.1.2/go.mod h1:unWr2B4jF0DQPJH3GsXBGQiDcAamM6+Pf5FiK705kc4= +github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= +github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= +github.com/panjf2000/gnet/v2 v2.5.7 h1:EGGIfLYEVAp2l5WSYT2XddSjpQ642PjwphbWhcJ0WBY= +github.com/panjf2000/gnet/v2 v2.5.7/go.mod h1:ppopMJ8VrDbJu8kDsqFQTgNmpMS8Le5CmPxISf+Sauk= 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/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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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/vektra/errors v0.0.0-20140903201135-c64d83aba85a h1:lUVfiMMY/te9icPKBqOKkBIMZNxSpM90dxokDeCcfBg= +github.com/vektra/errors v0.0.0-20140903201135-c64d83aba85a/go.mod h1:KUxJS71XlMs+ztT+RzsLRoWUQRUpECo/+Rb0EBk8/Wc= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -51,14 +44,15 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/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.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.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.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -71,12 +65,11 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T 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/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/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.0-20210107192922-496545a6307b/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= diff --git a/frameworks/Go/gnet/src/main.go b/frameworks/Go/gnet/src/main.go index 88f1fba167c..125e12ac10b 100644 --- a/frameworks/Go/gnet/src/main.go +++ b/frameworks/Go/gnet/src/main.go @@ -7,9 +7,11 @@ import ( "fmt" "log" "runtime" + "strconv" "sync/atomic" "time" + "github.com/evanphx/wildcat" "github.com/panjf2000/gnet/v2" ) @@ -22,30 +24,68 @@ type httpServer struct { } type httpCodec struct { - delimiter []byte - buf []byte + parser *wildcat.HTTPParser + contentLength int + buf []byte } -func (hc *httpCodec) appendResponse() { - hc.buf = append(hc.buf, "HTTP/1.1 200 OK\r\nServer: gnet\r\nContent-Type: text/plain\r\nDate: "...) - //hc.buf = time.Now().AppendFormat(hc.buf, "Mon, 02 Jan 2006 15:04:05 GMT") - hc.buf = append(hc.buf, NowTimeFormat()...) - hc.buf = append(hc.buf, "\r\nContent-Length: 13\r\n\r\nHello, World!"...) -} - -var errCRLFNotFound = errors.New("CRLF not found") +var CRLF = []byte("\r\n\r\n") func (hc *httpCodec) parse(data []byte) (int, error) { - if idx := bytes.Index(data, hc.delimiter); idx != -1 { + // Perform a legit HTTP request parsing. + bodyOffset, err := hc.parser.Parse(data) + if err != nil { + return 0, err + } + + // First check if the Content-Length header is present. + contentLength := hc.getContentLength() + if contentLength > -1 { + return bodyOffset + contentLength, nil + } + + // If the Content-Length header is not found, + // we need to find the end of the body section. + if idx := bytes.Index(data, CRLF); idx != -1 { return idx + 4, nil } - return -1, errCRLFNotFound + + return 0, errors.New("invalid http request") +} + +var contentLengthKey = []byte("Content-Length") + +func (hc *httpCodec) getContentLength() int { + if hc.contentLength != -1 { + return hc.contentLength + } + + val := hc.parser.FindHeader(contentLengthKey) + if val != nil { + i, err := strconv.ParseInt(string(val), 10, 0) + if err == nil { + hc.contentLength = int(i) + } + } + + return hc.contentLength +} + +func (hc *httpCodec) resetParser() { + hc.contentLength = -1 } func (hc *httpCodec) reset() { + hc.resetParser() hc.buf = hc.buf[:0] } +func (hc *httpCodec) appendResponse() { + hc.buf = append(hc.buf, "HTTP/1.1 200 OK\r\nServer: gnet\r\nContent-Type: text/plain\r\nDate: "...) + hc.buf = append(hc.buf, NowTimeFormat()...) + hc.buf = append(hc.buf, "\r\nContent-Length: 13\r\n\r\nHello, World!"...) +} + func (hs *httpServer) OnBoot(eng gnet.Engine) gnet.Action { hs.eng = eng log.Printf("echo server with multi-core=%t is listening on %s\n", hs.multicore, hs.addr) @@ -53,18 +93,20 @@ func (hs *httpServer) OnBoot(eng gnet.Engine) gnet.Action { } func (hs *httpServer) OnOpen(c gnet.Conn) ([]byte, gnet.Action) { - c.SetContext(&httpCodec{delimiter: []byte("\r\n\r\n")}) + c.SetContext(&httpCodec{parser: wildcat.NewHTTPParser()}) return nil, gnet.None } func (hs *httpServer) OnTraffic(c gnet.Conn) gnet.Action { - buf, _ := c.Next(-1) hc := c.Context().(*httpCodec) + buf, _ := c.Next(-1) + pipeline: nextOffset, err := hc.parse(buf) if err != nil { goto response } + hc.resetParser() hc.appendResponse() buf = buf[nextOffset:] if len(buf) > 0 { From c966c96522dcb2fdb4ec73b2b194ab2047bc6463 Mon Sep 17 00:00:00 2001 From: lospejos Date: Mon, 30 Sep 2024 20:53:57 +0300 Subject: [PATCH 0821/1766] Updated Java version, Maven Docker image, Jooby, Netty versions (#9286) * Bumped version for Java, Jooby, Maven and other libraries/dependencies * Bumped dependencies versions * Bumped dependencies versions * Bumped dependencies versions * Bumped dependencies versions * Fixed Resource_ issue * Bumped versions for Golang, Fiber and other dependencies * Bumped many deps versions, removed deprecated reuseBuffer() in Rocker * Bumped versions for Golang, Fiber and other dependencies * Updated Java version, Maven Docker image, Jooby, Netty versions * Bumped pgx version --- frameworks/Go/fiber/src/go.mod | 4 ++-- frameworks/Go/fiber/src/go.sum | 8 ++++---- frameworks/Java/jooby/jooby-jetty.dockerfile | 2 +- frameworks/Java/jooby/jooby-mvc.dockerfile | 2 +- frameworks/Java/jooby/jooby-netty.dockerfile | 2 +- frameworks/Java/jooby/jooby-pgclient.dockerfile | 2 +- frameworks/Java/jooby/jooby.dockerfile | 2 +- frameworks/Java/jooby/pom.xml | 8 ++++---- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index 252db9355e6..36e65622cc4 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -5,7 +5,7 @@ go 1.23 require ( github.com/goccy/go-json v0.10.3 github.com/gofiber/fiber/v2 v2.52.5 - github.com/jackc/pgx/v5 v5.6.0 + github.com/jackc/pgx/v5 v5.7.1 github.com/valyala/quicktemplate v1.8.0 ) @@ -14,7 +14,7 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 1cada1ee655..62741e5425b 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -13,10 +13,10 @@ 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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -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/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= +github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= diff --git a/frameworks/Java/jooby/jooby-jetty.dockerfile b/frameworks/Java/jooby/jooby-jetty.dockerfile index bd3786886ca..c5d636ada2d 100644 --- a/frameworks/Java/jooby/jooby-jetty.dockerfile +++ b/frameworks/Java/jooby/jooby-jetty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.6-eclipse-temurin-21-jammy +FROM maven:3.9.9-eclipse-temurin-22-alpine 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 feaeb23bc8e..b2a4db4712b 100644 --- a/frameworks/Java/jooby/jooby-mvc.dockerfile +++ b/frameworks/Java/jooby/jooby-mvc.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.6-eclipse-temurin-21-jammy +FROM maven:3.9.9-eclipse-temurin-22-alpine 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 dd6afe017c7..1c3efc2585e 100644 --- a/frameworks/Java/jooby/jooby-netty.dockerfile +++ b/frameworks/Java/jooby/jooby-netty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.6-eclipse-temurin-21-jammy +FROM maven:3.9.9-eclipse-temurin-22-alpine 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 e3c58df435c..044cdd5c5de 100644 --- a/frameworks/Java/jooby/jooby-pgclient.dockerfile +++ b/frameworks/Java/jooby/jooby-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.6-eclipse-temurin-21-jammy +FROM maven:3.9.9-eclipse-temurin-22-alpine 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 98d1b029d36..a5d4570a60d 100644 --- a/frameworks/Java/jooby/jooby.dockerfile +++ b/frameworks/Java/jooby/jooby.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.6-eclipse-temurin-21-jammy +FROM maven:3.9.9-eclipse-temurin-22-alpine 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 99170fb8cfe..3b6edfc79ec 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,13 +11,13 @@ jooby - 3.2.9 - 4.1.112.Final + 3.4.0 + 4.1.113.Final 2.0.2 42.7.4 UTF-8 - 21 - 21 + 22 + 22 com.techempower.App From d4b3ac80417a0328f2d1649d721d9120770078c7 Mon Sep 17 00:00:00 2001 From: LLT21 <43903768+LLT21@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:54:17 +0200 Subject: [PATCH 0822/1766] Use asynchronous data access methods in appMpower.Orm (#9281) * Use asynchronous data access methods in appMpower.Orm * Improved connection pool handling * Using tuple with base connection elements instead of "this" for pooling * Improved caching * Better separation of keyed and unkeyed command caching --------- Co-authored-by: LLT21 <> --- .../src/appMpower.Orm/Data/DbCommand.cs | 16 ++-- .../src/appMpower.Orm/Data/DbConnection.cs | 87 ++++++++++++------- .../src/appMpower.Orm/Data/DbConnections.cs | 64 +++++++------- .../appMpower.Orm/Data/DbConnectionsKeyed.cs | 61 +++++++++++++ .../src/appMpower.Orm/DotnetMethods.cs | 8 +- .../src/appMpower.Orm/NativeMethods.cs | 10 +-- .../appmpower/src/appMpower.Orm/RawDb.cs | 65 +++++++------- 7 files changed, 192 insertions(+), 119 deletions(-) create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs index a580aa5e110..0dfe4581906 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs @@ -20,12 +20,6 @@ public DbCommand(string commandText, DbConnection dbConnection) _dbConnection = dbConnection; } - public DbCommand(string commandText, DbConnection dbConnection, bool keyed) - { - _odbcCommand = dbConnection.GetCommand(commandText, CommandType.Text, keyed); - _dbConnection = dbConnection; - } - public DbCommand(string commandText, CommandType commandType, DbConnection dbConnection) { _odbcCommand = dbConnection.GetCommand(commandText, commandType); @@ -175,7 +169,7 @@ public IDataReader ExecuteReader() public async Task ExecuteNonQueryAsync() { - return await (_odbcCommand as System.Data.Common.DbCommand).ExecuteNonQueryAsync(); + return await _odbcCommand.ExecuteNonQueryAsync(); } public IDataReader ExecuteReader(CommandBehavior behavior) @@ -183,6 +177,11 @@ public IDataReader ExecuteReader(CommandBehavior behavior) return _odbcCommand.ExecuteReader(behavior); } + public async Task ExecuteReaderAsync(CommandBehavior behavior) + { + return await _odbcCommand.ExecuteReaderAsync(behavior); + } + #nullable enable public object? ExecuteScalar() { @@ -197,8 +196,7 @@ public void Prepare() public void Dispose() { - if (_dbConnection._keyed) _dbConnection._keyedOdbcCommands.TryAdd(_odbcCommand.CommandText, _odbcCommand); - else _dbConnection._odbcCommands.Push(_odbcCommand); + _dbConnection.Release(_odbcCommand); } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs index ba3b6cf85b6..1a9c5ae0355 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs @@ -1,26 +1,27 @@ using System.Collections.Concurrent; using System.Data; -using System.Data.Odbc; +using System.Data.Odbc; namespace appMpower.Orm.Data { public class DbConnection : IDbConnection { private string _connectionString; - internal bool _keyed = false; - internal int _number; - internal OdbcConnection _odbcConnection; - internal ConcurrentStack _odbcCommands = new(); - internal Dictionary _keyedOdbcCommands; + private bool _keyed = false; + private int _number; + private OdbcConnection _odbcConnection; + private ConcurrentStack _odbcCommands = new(); + private Dictionary _keyedOdbcCommands; public DbConnection() { - _connectionString = DbProviderFactory.ConnectionString; } - public DbConnection(string connectionString) + public DbConnection(string connectionString, bool keyed = false) { - _connectionString = connectionString; + _keyed = keyed; + _connectionString = connectionString; + GetConnection(); } public IDbConnection Connection @@ -43,7 +44,22 @@ public string ConnectionString } set { - _odbcConnection.ConnectionString = value; + _connectionString = value; + GetConnection(); + } + } + + private void GetConnection() + { + if (_keyed) + { + (_number, _odbcConnection, _keyedOdbcCommands) = + DbConnectionsKeyed.GetConnectionBase(_connectionString).GetAwaiter().GetResult(); + } + else + { + (_number, _odbcConnection, _odbcCommands) = + DbConnections.GetConnectionBase(_connectionString).GetAwaiter().GetResult(); } } @@ -99,23 +115,33 @@ public IDbCommand CreateCommand() public void Open() { - if (_odbcConnection is null) + if (_odbcConnection.State == ConnectionState.Closed) { - DbConnections.GetConnection(_connectionString, this); + _odbcConnection.Open(); } + } + public async Task OpenAsync() + { if (_odbcConnection.State == ConnectionState.Closed) { - _odbcConnection.Open(); + await _odbcConnection.OpenAsync(); } } public void Dispose() { - DbConnections.Release(this); + if (_keyed) + { + DbConnectionsKeyed.Release((Number: _number, OdbcConnection: _odbcConnection, KeyedOdbcCommands: _keyedOdbcCommands)); + } + else + { + DbConnections.Release((Number: _number, OdbcConnection: _odbcConnection, OdbcCommands: _odbcCommands)); + } } - internal OdbcCommand GetCommand(string commandText, CommandType commandType, bool keyed = false) + internal OdbcCommand GetCommand(string commandText, CommandType commandType) { OdbcCommand odbcCommand; @@ -129,25 +155,20 @@ internal OdbcCommand GetCommand(string commandText, CommandType commandType, boo return odbcCommand; } - else if (_keyed && _keyedOdbcCommands.TryGetValue(commandText, out odbcCommand)) - { - return odbcCommand; - } - else - { - if (!_keyed && keyed) - { - _keyedOdbcCommands = new(); - _keyed = keyed; - } - - odbcCommand = _odbcConnection.CreateCommand(); - odbcCommand.CommandText = commandText; - odbcCommand.CommandType = commandType; - odbcCommand.Prepare(); + else if (_keyed && _keyedOdbcCommands.TryGetValue(commandText, out odbcCommand)) return odbcCommand; - return odbcCommand; - } + odbcCommand = _odbcConnection.CreateCommand(); + odbcCommand.CommandText = commandText; + odbcCommand.CommandType = commandType; + odbcCommand.Prepare(); + + return odbcCommand; + } + + internal void Release(OdbcCommand odbcCommand) + { + if (_keyed) _keyedOdbcCommands.TryAdd(odbcCommand.CommandText, odbcCommand); + else _odbcCommands.Push(odbcCommand); } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs index 514e2945d38..b278e54fa57 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs @@ -1,61 +1,61 @@ using System.Collections.Concurrent; +using System.Data.Odbc; namespace appMpower.Orm.Data { - public static class DbConnections + internal static class DbConnections { + private static bool _maxConnectionsCreated = false; private static short _createdConnections = 0; - private static ConcurrentStack _connectionsStack = new(); + private static short _maxConnections = 500; - public static DbConnection GetConnection(string connectionString) + private static ConcurrentStack<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> _connectionsStack = new(); + private static ConcurrentQueue OdbcCommands)>> _waitingQueue = new(); + + internal static async Task<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> GetConnectionBase(string connectionString) { - DbConnection popDbConnection; + (int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands) dbConnectionBase; - if (!_connectionsStack.TryPop(out popDbConnection)) + if (!_connectionsStack.TryPop(out dbConnectionBase)) { - popDbConnection = new DbConnection(); - popDbConnection._odbcConnection = new System.Data.Odbc.OdbcConnection(connectionString); + if (_maxConnectionsCreated) + { + dbConnectionBase = await GetDbConnectionBaseAsync(); + } + else + { + _createdConnections++; + dbConnectionBase = (Number: _maxConnections, OdbcConnection: new OdbcConnection(connectionString), OdbcCommands: new ConcurrentStack()); - _createdConnections++; - popDbConnection._number = _createdConnections; + if (_createdConnections == _maxConnections) _maxConnectionsCreated = true; - if (_createdConnections % 25 == 0) - { - Console.WriteLine("Pooled connections created: " + _createdConnections.ToString()); + //Console.WriteLine("opened connection number: " + dbConnectionBase._number); } } - return popDbConnection; + return dbConnectionBase; } - - public static void GetConnection(string connectionString, DbConnection dbConnection) + internal static void Release((int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands) dbConnectionBase) { - DbConnection popDbConnection = null; + TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> taskCompletionSource; - if (_connectionsStack.TryPop(out popDbConnection)) + if (_waitingQueue.TryDequeue(out taskCompletionSource)) { - dbConnection._odbcConnection = popDbConnection._odbcConnection; - dbConnection._odbcCommands = popDbConnection._odbcCommands; - dbConnection._number = popDbConnection._number; + taskCompletionSource.SetResult(dbConnectionBase); } else { - dbConnection._odbcConnection = new System.Data.Odbc.OdbcConnection(connectionString); - - _createdConnections++; - dbConnection._number = _createdConnections; - - if (_createdConnections % 25 == 0) - { - Console.WriteLine("Pooled connections created: " + _createdConnections.ToString()); - } - } + _connectionsStack.Push(dbConnectionBase); + } } - public static void Release(DbConnection dbConnection) + private static Task<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> GetDbConnectionBaseAsync() { - _connectionsStack.Push(dbConnection); + var taskCompletionSource = new TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)>(TaskCreationOptions.RunContinuationsAsynchronously); + + _waitingQueue.Enqueue(taskCompletionSource); + return taskCompletionSource.Task; } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs new file mode 100644 index 00000000000..25cd4dcbab7 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs @@ -0,0 +1,61 @@ +using System.Collections.Concurrent; +using System.Data.Odbc; + +namespace appMpower.Orm.Data +{ + internal static class DbConnectionsKeyed + { + private static bool _maxConnectionsCreated = false; + private static short _createdConnections = 0; + private static short _maxConnections = 500; + + private static ConcurrentStack<(int Number, OdbcConnection OdbcConnection, Dictionary)> _connectionsStack = new(); + private static ConcurrentQueue)>> _waitingQueue = new(); + + internal static async Task<(int Number, OdbcConnection OdbcConnection, Dictionary KeyedOdbcCommands)> GetConnectionBase(string connectionString) + { + (int Number, OdbcConnection OdbcConnection, Dictionary KeyedOdbcCommands) dbConnectionBase; + + if (!_connectionsStack.TryPop(out dbConnectionBase)) + { + if (_maxConnectionsCreated) + { + dbConnectionBase = await GetDbConnectionBaseAsync(); + } + else + { + _createdConnections++; + dbConnectionBase = (Number: _maxConnections, OdbcConnection: new OdbcConnection(connectionString), KeyedOdbcCommands: new Dictionary()); + + if (_createdConnections == _maxConnections) _maxConnectionsCreated = true; + + //Console.WriteLine("opened connection number: " + dbConnectionBase._number); + } + } + + return dbConnectionBase; + } + + internal static void Release((int Number, OdbcConnection OdbcConnection, Dictionary KeyedOdbcCommands) dbConnectionBase) + { + TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, Dictionary)> taskCompletionSource; + + if (_waitingQueue.TryDequeue(out taskCompletionSource)) + { + taskCompletionSource.SetResult(dbConnectionBase); + } + else + { + _connectionsStack.Push(dbConnectionBase); + } + } + + private static Task<(int Number, OdbcConnection OdbcConnection, Dictionary)> GetDbConnectionBaseAsync() + { + var taskCompletionSource = new TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, Dictionary)>(TaskCreationOptions.RunContinuationsAsynchronously); + + _waitingQueue.Enqueue(taskCompletionSource); + return taskCompletionSource.Task; + } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs index f6b8b4cad1c..5ea4ce43fa2 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/DotnetMethods.cs @@ -21,7 +21,7 @@ public static class DotnetMethods public static byte[] Db() { - var world = RawDb.LoadSingleQueryRow(); + var world = RawDb.LoadSingleQueryRow().GetAwaiter().GetResult(); var memoryStream = new MemoryStream(); using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); @@ -33,7 +33,7 @@ public static byte[] Db() public static byte[] Query(int queries) { - World[] worlds = RawDb.ReadMultipleRows(queries); + World[] worlds = RawDb.ReadMultipleRows(queries).GetAwaiter().GetResult(); var memoryStream = new MemoryStream(); using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); @@ -45,7 +45,7 @@ public static byte[] Query(int queries) public static byte[] Updates(int count) { - World[] worlds = RawDb.LoadMultipleUpdatesRows(count); + World[] worlds = RawDb.LoadMultipleUpdatesRows(count).GetAwaiter().GetResult(); var memoryStream = new MemoryStream(); using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); @@ -57,7 +57,7 @@ public static byte[] Updates(int count) public static byte[] Fortunes() { - List fortunes = RawDb.LoadFortunesRows(); + List fortunes = RawDb.LoadFortunesRows().GetAwaiter().GetResult(); string fortunesView = FortunesView.Render(fortunes); byte[] byteArray = Encoding.UTF8.GetBytes(fortunesView); diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs index 0f3ee5b59c2..64337e6269e 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs @@ -42,7 +42,7 @@ public static void FreeHandlePointer(IntPtr handlePointer) [UnmanagedCallersOnly(EntryPoint = "Db")] public static unsafe IntPtr Db(int* length, IntPtr* handlePointer) { - var world = RawDb.LoadSingleQueryRow(); + var world = RawDb.LoadSingleQueryRow().GetAwaiter().GetResult(); var memoryStream = new MemoryStream(); using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); @@ -69,7 +69,7 @@ public static unsafe IntPtr Db(int* length, IntPtr* handlePointer) [UnmanagedCallersOnly(EntryPoint = "Fortunes")] public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer) { - List fortunes = RawDb.LoadFortunesRows(); + List fortunes = RawDb.LoadFortunesRows().GetAwaiter().GetResult(); string fortunesView = FortunesView.Render(fortunes); byte[] byteArray = Encoding.UTF8.GetBytes(fortunesView); @@ -85,7 +85,7 @@ public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer) [UnmanagedCallersOnly(EntryPoint = "Query")] public static unsafe IntPtr Query(int queries, int* length, IntPtr* handlePointer) { - World[] worlds = RawDb.ReadMultipleRows(queries); + World[] worlds = RawDb.ReadMultipleRows(queries).GetAwaiter().GetResult(); var memoryStream = new MemoryStream(); using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); @@ -105,7 +105,7 @@ public static unsafe IntPtr Query(int queries, int* length, IntPtr* handlePointe [UnmanagedCallersOnly(EntryPoint = "Updates")] public static unsafe IntPtr Updates(int count, int* length, IntPtr* handlePointer) { - World[] worlds = RawDb.LoadMultipleUpdatesRows(count); + World[] worlds = RawDb.LoadMultipleUpdatesRows(count).GetAwaiter().GetResult(); var memoryStream = new MemoryStream(); using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); @@ -125,7 +125,7 @@ public static unsafe IntPtr Updates(int count, int* length, IntPtr* handlePointe [UnmanagedCallersOnly(EntryPoint = "DbById")] public static unsafe IntPtr DbById(int id, int* length, IntPtr* handlePointer) { - var world = RawDb.LoadSingleQueryRowById(id); + var world = RawDb.LoadSingleQueryRowById(id).GetAwaiter().GetResult(); var memoryStream = new MemoryStream(); using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs index b748d78a251..fec986f8755 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/RawDb.cs @@ -13,42 +13,42 @@ public static class RawDb private static string[] _queriesMultipleRows = new string[MaxBatch + 1]; - public static World LoadSingleQueryRow() + public static async Task LoadSingleQueryRow() { - using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); - pooledConnection.Open(); + using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); + await pooledConnection.OpenAsync(); var (dbCommand, _) = CreateReadCommand(pooledConnection); using (dbCommand) { - World world = ReadSingleRow(dbCommand); + World world = await ReadSingleRow(dbCommand); return world; } } - public static World LoadSingleQueryRowById(int id) + public static async Task LoadSingleQueryRowById(int id) { - using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); - pooledConnection.Open(); + using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); + await pooledConnection.OpenAsync(); var (dbCommand, _) = CreateReadCommandById(pooledConnection, id); using (dbCommand) { - World world = ReadSingleRow(dbCommand); + World world = await ReadSingleRow(dbCommand); return world; } } - public static World[] LoadMultipleQueriesRows(int count) + public static async Task LoadMultipleQueriesRows(int count) { var worlds = new World[count]; - using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); - pooledConnection.Open(); + using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); + await pooledConnection.OpenAsync(); var (dbCommand, dbDataParameter) = CreateReadCommand(pooledConnection); @@ -56,7 +56,7 @@ public static World[] LoadMultipleQueriesRows(int count) { for (int i = 0; i < count; i++) { - worlds[i] = ReadSingleRow(dbCommand); + worlds[i] = await ReadSingleRow(dbCommand); dbDataParameter.Value = _random.Next(1, 10001); } } @@ -64,18 +64,18 @@ public static World[] LoadMultipleQueriesRows(int count) return worlds; } - public static List LoadFortunesRows() + public static async Task> LoadFortunesRows() { var fortunes = new List(); - using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); - pooledConnection.Open(); + using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); + await pooledConnection.OpenAsync(); var dbCommand = new DbCommand("SELECT * FROM fortune", pooledConnection); using (dbCommand) { - IDataReader dataReader = dbCommand.ExecuteReader(CommandBehavior.SingleResult & CommandBehavior.SequentialAccess); + IDataReader dataReader = await dbCommand.ExecuteReaderAsync(CommandBehavior.SingleResult & CommandBehavior.SequentialAccess); while (dataReader.Read()) { @@ -97,25 +97,25 @@ public static List LoadFortunesRows() return fortunes; } - public static World[] LoadMultipleUpdatesRows(int count) + public static async Task LoadMultipleUpdatesRows(int count) { var worlds = new World[count]; - using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); - pooledConnection.Open(); + using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString, true); + await pooledConnection.OpenAsync(); - var (queryCommand, dbDataParameter) = CreateReadCommand(pooledConnection, true); + var (queryCommand, dbDataParameter) = CreateReadCommand(pooledConnection); using (queryCommand) { for (int i = 0; i < count; i++) { - worlds[i] = ReadSingleRow(queryCommand); + worlds[i] = await ReadSingleRow(queryCommand); dbDataParameter.Value = _random.Next(1, 10001); } } - using var updateCommand = new DbCommand(BatchUpdateString.Query(count), pooledConnection, true); + using var updateCommand = new DbCommand(BatchUpdateString.Query(count), pooledConnection); var ids = BatchUpdateString.Ids; var randoms = BatchUpdateString.Randoms; @@ -152,13 +152,6 @@ internal static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateRe return (dbCommand, dbCommand.CreateParameter("Id", DbType.Int32, _random.Next(1, 10001))); } - internal static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateReadCommand(DbConnection pooledConnection, bool keyed) - { - DbCommand dbCommand = new DbCommand("SELECT * FROM world WHERE id=?", pooledConnection, keyed); - - return (dbCommand, dbCommand.CreateParameter("Id", DbType.Int32, _random.Next(1, 10001))); - } - internal static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateReadCommandById(DbConnection pooledConnection, int id) { DbCommand dbCommand = new DbCommand("SELECT * FROM world WHERE id=?", pooledConnection); @@ -166,9 +159,9 @@ internal static (DbCommand dbCommand, IDbDataParameter dbDataParameter) CreateRe return (dbCommand, dbCommand.CreateParameter("Id", DbType.Int32, id)); } - internal static World ReadSingleRow(DbCommand dbCommand) + internal static async Task ReadSingleRow(DbCommand dbCommand) { - var dataReader = dbCommand.ExecuteReader(CommandBehavior.SingleRow & CommandBehavior.SequentialAccess); + var dataReader = await dbCommand.ExecuteReaderAsync(CommandBehavior.SingleRow & CommandBehavior.SequentialAccess); dataReader.Read(); @@ -183,7 +176,7 @@ internal static World ReadSingleRow(DbCommand dbCommand) return world; } - public static World[] ReadMultipleRows(int count) + public static async Task ReadMultipleRows(int count) { int j = 0; var ids = BatchUpdateString.Ids; @@ -206,8 +199,8 @@ public static World[] ReadMultipleRows(int count) queryString = _queriesMultipleRows[count] = StringBuilderCache.GetStringAndRelease(stringBuilder); } - using var pooledConnection = DbConnections.GetConnection(DbProviderFactory.ConnectionString); - pooledConnection.Open(); + using var pooledConnection = new DbConnection(DbProviderFactory.ConnectionString); + await pooledConnection.OpenAsync(); using var dbCommand = new DbCommand(queryString, pooledConnection); @@ -216,7 +209,7 @@ public static World[] ReadMultipleRows(int count) dbCommand.CreateParameter(ids[i], DbType.Int32, _random.Next(1, 10001)); } - var dataReader = dbCommand.ExecuteReader(CommandBehavior.Default & CommandBehavior.SequentialAccess); + var dataReader = await dbCommand.ExecuteReaderAsync(CommandBehavior.Default & CommandBehavior.SequentialAccess); do { @@ -229,7 +222,7 @@ public static World[] ReadMultipleRows(int count) }; j++; - } while (dataReader.NextResult()); + } while (await dataReader.NextResultAsync()); dataReader.Close(); From 9e89ea26ffe49a4005fb4667a40f2cf35e485842 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:47:06 +0000 Subject: [PATCH 0823/1766] Bump io.undertow:undertow-core in /frameworks/Java/undertow-jersey Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.14.Final to 2.3.16.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.14.Final...2.3.16.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/undertow-jersey/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/undertow-jersey/pom.xml b/frameworks/Java/undertow-jersey/pom.xml index bf4603735ca..6c2ced9b7a1 100644 --- a/frameworks/Java/undertow-jersey/pom.xml +++ b/frameworks/Java/undertow-jersey/pom.xml @@ -174,7 +174,7 @@ io.undertow undertow-core - 2.3.14.Final + 2.3.16.Final From 5b93494b422b3c42136562cf6019dc220654b6e9 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Wed, 2 Oct 2024 00:34:53 +0100 Subject: [PATCH 0824/1766] H2O: Use the PostgreSQL project's Apt repository for libpq (#9294) --- frameworks/C/h2o/h2o.dockerfile | 44 ++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 976c938337a..109c5e4375a 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -6,19 +6,28 @@ FROM "ubuntu:${UBUNTU_VERSION}" AS compile ARG DEBIAN_FRONTEND=noninteractive RUN apt-get -yqq update && \ + apt-get -yqq install \ + ca-certificates \ + curl \ + lsb-release && \ + install -dm755 /usr/share/postgresql-common/pgdg && \ + curl --fail -LSso /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \ + "https://www.postgresql.org/media/keys/ACCC4CF8.asc" && \ + sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \ + https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > \ + /etc/apt/sources.list.d/pgdg.list' && \ + apt-get -yqq update && \ apt-get -yqq install \ autoconf \ bison \ cmake \ - curl \ flex \ g++ \ libbpfcc-dev \ libbrotli-dev \ libcap-dev \ - libicu-dev \ libnuma-dev \ - libreadline-dev \ + libpq-dev \ libssl-dev \ libtool \ libuv1-dev \ @@ -57,18 +66,6 @@ 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=a37bb7c13995b834095d9d064cad1023a6f99b10 - -WORKDIR /tmp/postgresql-build -RUN curl -LSs "https://github.com/postgres/postgres/archive/${POSTGRESQL_VERSION}.tar.gz" | \ - tar --strip-components=1 -xz && \ - CFLAGS="-flto -march=native -mtune=native -O3" ./configure \ - --includedir=/usr/local/include/postgresql \ - --prefix=/usr/local \ - --with-ssl=openssl && \ - make -j "$(nproc)" -C src/include install && \ - make -j "$(nproc)" -C src/interfaces/libpq install - ARG H2O_APP_PREFIX WORKDIR /tmp/build COPY CMakeLists.txt ../ @@ -85,15 +82,28 @@ RUN cmake \ FROM "ubuntu:${UBUNTU_VERSION}" +ARG POSTGRESQL_VERSION=17 + ARG DEBIAN_FRONTEND=noninteractive RUN apt-get -yqq update && \ + apt-get -yqq install \ + ca-certificates \ + curl \ + lsb-release && \ + install -dm755 /usr/share/postgresql-common/pgdg && \ + curl --fail -LSso /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \ + "https://www.postgresql.org/media/keys/ACCC4CF8.asc" && \ + sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \ + https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > \ + /etc/apt/sources.list.d/pgdg.list' && \ + apt-get -yqq update && \ apt-get -yqq install \ libnuma1 \ - libyajl2 + libyajl2 \ + "postgresql-client-${POSTGRESQL_VERSION}" ARG H2O_APP_PREFIX COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/" COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/" -COPY --from=compile /usr/local/lib/libpq.so.5.17 "${H2O_APP_PREFIX}/lib/libpq.so.5" ENV LD_LIBRARY_PATH="${H2O_APP_PREFIX}/lib" EXPOSE 8080 ARG BENCHMARK_ENV From b03e526dbcf64e3e68ba7aa9f79bbf8d0db2bb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 2 Oct 2024 01:35:07 +0200 Subject: [PATCH 0825/1766] New round of Spring optimizations (#9288) * New round of spring optimizations - Upgrade to Spring Boot 3.3.4 - Remove the JPA variant that is not competitive and introduces additional processing not needed in other variants - Use batched update in the JDBC variant (compliant with the test requirements) - Set Hikari maximum pool size to 256 - Switch to jstachio for view rendering * New round of spring-webflux optimizations - Upgrade to Spring Boot 3.3.4 - Disable Netty leak detection - Turn a flapMap operation to a map - Switch to jstachio for view rendering - Remove unused JdbcDbRepository class - Set R2DBC maximum pool size to 256 - Polishing --- frameworks/Java/spring-webflux/pom.xml | 28 ++++++-- .../spring-webflux-mongo.dockerfile | 2 +- .../spring-webflux/spring-webflux.dockerfile | 2 +- .../src/main/java/benchmark/App.java | 5 +- .../main/java/benchmark/model/Fortune.java | 13 ++-- .../main/java/benchmark/model/Message.java | 15 ---- .../src/main/java/benchmark/model/World.java | 1 + .../benchmark/repository/DbRepository.java | 1 + .../repository/JdbcDbRepository.java | 63 ---------------- .../main/java/benchmark/web/DbHandler.java | 28 ++++---- .../src/main/java/benchmark/web/Fortunes.java | 10 +++ .../src/main/resources/application.yml | 4 +- .../{templates => }/fortunes.mustache | 0 frameworks/Java/spring/README.md | 4 +- frameworks/Java/spring/benchmark_config.json | 21 ------ frameworks/Java/spring/pom.xml | 26 +++++-- frameworks/Java/spring/spring-jpa.dockerfile | 15 ---- .../Java/spring/src/main/java/hello/App.java | 21 +----- .../spring/src/main/java/hello/JpaConfig.java | 12 ---- .../main/java/hello/UpdateWorldService.java | 9 --- .../java/hello/UpdateWorldServiceImpl.java | 43 ----------- .../spring/src/main/java/hello/Utils.java | 19 +++++ .../java/hello/jpa/FortuneRepository.java | 12 ---- .../main/java/hello/jpa/JpaDbRepository.java | 38 ---------- .../main/java/hello/jpa/WorldRepository.java | 12 ---- .../src/main/java/hello/model/Fortune.java | 26 +++---- .../src/main/java/hello/model/Message.java | 15 ---- .../src/main/java/hello/model/World.java | 14 ++-- .../java/hello/repository/DbRepository.java | 3 +- .../hello/repository/JdbcDbRepository.java | 36 ++++++---- .../hello/repository/MongoDbRepository.java | 18 ++++- .../src/main/java/hello/web/DbHandler.java | 72 ++++++++----------- .../src/main/java/hello/web/Fortunes.java | 10 +++ .../spring/src/main/resources/application.yml | 34 +++------ .../{templates => }/fortunes.mustache | 0 35 files changed, 210 insertions(+), 422 deletions(-) delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java delete mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/repository/JdbcDbRepository.java create mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/web/Fortunes.java rename frameworks/Java/spring-webflux/src/main/resources/{templates => }/fortunes.mustache (100%) delete mode 100644 frameworks/Java/spring/spring-jpa.dockerfile delete mode 100644 frameworks/Java/spring/src/main/java/hello/JpaConfig.java delete mode 100644 frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java delete mode 100644 frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java create mode 100644 frameworks/Java/spring/src/main/java/hello/Utils.java delete mode 100644 frameworks/Java/spring/src/main/java/hello/jpa/FortuneRepository.java delete mode 100644 frameworks/Java/spring/src/main/java/hello/jpa/JpaDbRepository.java delete mode 100644 frameworks/Java/spring/src/main/java/hello/jpa/WorldRepository.java delete mode 100644 frameworks/Java/spring/src/main/java/hello/model/Message.java create mode 100644 frameworks/Java/spring/src/main/java/hello/web/Fortunes.java rename frameworks/Java/spring/src/main/resources/{templates => }/fortunes.mustache (100%) diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index c15b211c92d..500e9fc8e07 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -13,13 +13,12 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 - 21 - 21 - UTF-8 + 21 + 1.3.6 @@ -36,8 +35,16 @@ r2dbc-postgresql - org.springframework.boot - spring-boot-starter-mustache + io.jstach + jstachio + ${jstachio.version} + + + io.jstach + jstachio-apt + ${jstachio.version} + provided + true org.springframework.boot @@ -55,6 +62,15 @@ org.apache.maven.plugins maven-compiler-plugin + + + + io.jstach + jstachio-apt + ${jstachio.version} + + + diff --git a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile index 41eedefa4c6..d565d1556c3 100644 --- a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile @@ -13,4 +13,4 @@ RUN java -Djarmode=tools -jar app.jar extract EXPOSE 8080 -CMD ["java", "-Dlogging.level.root=OFF", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=mongo"] \ No newline at end of file +CMD ["java", "-Dlogging.level.root=OFF", "-Dio.netty.leakDetection.level=disabled", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=mongo"] \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/spring-webflux.dockerfile b/frameworks/Java/spring-webflux/spring-webflux.dockerfile index 6ff2ed4e537..e1cee08ff31 100644 --- a/frameworks/Java/spring-webflux/spring-webflux.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux.dockerfile @@ -12,4 +12,4 @@ RUN java -Djarmode=tools -jar app.jar extract EXPOSE 8080 -CMD ["java", "-Dlogging.level.root=OFF", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=r2dbc"] +CMD ["java", "-Dlogging.level.root=OFF", "-Dio.netty.leakDetection.level=disabled", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=r2dbc"] diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java index c574863a9a9..3ba49056611 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/App.java @@ -11,7 +11,6 @@ import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; -import org.springframework.web.reactive.result.view.ViewResolver; import org.springframework.web.server.WebHandler; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; @@ -20,8 +19,8 @@ public class App { @Bean - public HttpHandler httpHandler(RouterFunction route, ServerFilter serverFilter, ViewResolver viewResolver) { - WebHandler webHandler = RouterFunctions.toWebHandler(route, HandlerStrategies.builder().viewResolver(viewResolver).build()); + public HttpHandler httpHandler(RouterFunction route, ServerFilter serverFilter) { + WebHandler webHandler = RouterFunctions.toWebHandler(route, HandlerStrategies.builder().build()); return WebHttpHandlerBuilder.webHandler(webHandler).filter(serverFilter).build(); } diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Fortune.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Fortune.java index 12ae17e0448..d66f56215fc 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Fortune.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Fortune.java @@ -4,9 +4,11 @@ import org.springframework.data.mongodb.core.mapping.Document; @Document -public final class Fortune { +public final class Fortune implements Comparable { + @Id public int id; + public String message; public Fortune(int id, String message) { @@ -14,11 +16,8 @@ public Fortune(int id, String message) { 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); } } diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java deleted file mode 100644 index 8a94c8d3ed1..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java +++ /dev/null @@ -1,15 +0,0 @@ -package benchmark.model; - -public class Message { - - private final String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/model/World.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/model/World.java index 612c7fef03a..ab096a1e313 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/model/World.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/model/World.java @@ -9,6 +9,7 @@ public final class World { @Id public int id; + @Field("randomNumber") public int randomnumber; diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java index 20e753e317e..54b6d0d9d02 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java @@ -6,6 +6,7 @@ import reactor.core.publisher.Mono; public interface DbRepository { + Mono getWorld(int id); Mono findAndUpdateWorld(int id, int randomNumber); diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/JdbcDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/JdbcDbRepository.java deleted file mode 100644 index 5e159f816ed..00000000000 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/JdbcDbRepository.java +++ /dev/null @@ -1,63 +0,0 @@ -package benchmark.repository; - -import benchmark.model.Fortune; -import benchmark.model.World; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Profile; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.core.scheduler.Scheduler; - -@Component -@Profile("jdbc") -public class JdbcDbRepository implements DbRepository { - private final Logger log = LoggerFactory.getLogger(getClass()); - private final JdbcTemplate jdbcTemplate; - private final Scheduler scheduler; - - public JdbcDbRepository(JdbcTemplate jdbcTemplate, Scheduler scheduler) { - this.jdbcTemplate = jdbcTemplate; - this.scheduler = scheduler; - } - - @Override - public Mono getWorld(int id) { - log.debug("getWorld({})", id); - return Mono.fromCallable(() -> { - return jdbcTemplate.queryForObject( - "SELECT * FROM world WHERE id = ?", - (rs, rn) -> new World(rs.getInt("id"), rs.getInt("randomnumber")), - id); - }).subscribeOn(scheduler); - } - - private Mono updateWorld(World world) { - return Mono.fromCallable(() -> { - jdbcTemplate.update( - "UPDATE world SET randomnumber = ? WHERE id = ?", - world.randomnumber, - world.id); - return world; - }).subscribeOn(scheduler); - } - - @Override - public Mono findAndUpdateWorld(int id, int randomNumber) { - return getWorld(id).flatMap(world -> { - world.randomnumber = randomNumber; - return updateWorld(world); - }); - } - - @Override - public Flux fortunes() { - return Mono.fromCallable(() -> { - return jdbcTemplate.query( - "SELECT * FROM fortune", - (rs, rn) -> new Fortune(rs.getInt("id"), rs.getString("message"))); - }).subscribeOn(scheduler).flatMapIterable(fortunes -> fortunes); - } -} \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java index bafddaf83c6..970ace1d46d 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java @@ -1,26 +1,27 @@ package benchmark.web; -import java.util.Collections; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import benchmark.model.Fortune; import benchmark.model.World; import benchmark.repository.DbRepository; +import io.jstach.jstachio.JStachio; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; -import static java.util.Comparator.comparing; - @Component public class DbHandler { + private static final String CONTENT_TYPE_VALUE = "text/html; charset=utf-8"; + private final DbRepository dbRepository; public DbHandler(DbRepository dbRepository) { @@ -33,7 +34,7 @@ public Mono db(ServerRequest request) { .switchIfEmpty(Mono.error(new Exception("No World found with Id: " + id))); return ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(world, World.class); } @@ -45,7 +46,7 @@ public Mono queries(ServerRequest request) { .collectList(); return ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(worlds, new ParameterizedTypeReference>() { }); } @@ -71,20 +72,19 @@ public Mono updates(ServerRequest request) { .collectList(); return ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(worlds, new ParameterizedTypeReference>() { }); } public Mono fortunes(ServerRequest request) { - Mono> result = dbRepository.fortunes().collectList().flatMap(fortunes -> { - fortunes.add(new Fortune(0, "Additional fortune added at request time.")); - fortunes.sort(comparing(fortune -> fortune.message)); - return Mono.just(fortunes); - }); - - return ServerResponse.ok() - .render("fortunes", Collections.singletonMap("fortunes", result)); + return dbRepository.fortunes() + .concatWith(Mono.just(new Fortune(0, "Additional fortune added at request time."))) + .collectSortedList() + .flatMap(fortunes -> + ServerResponse.ok() + .header(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE_VALUE) + .bodyValue(JStachio.render(new Fortunes(fortunes)))); } private static int randomWorldNumber() { diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/Fortunes.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/Fortunes.java new file mode 100644 index 00000000000..d8fc3dd7e2d --- /dev/null +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/Fortunes.java @@ -0,0 +1,10 @@ +package benchmark.web; + +import java.util.List; + +import benchmark.model.Fortune; +import io.jstach.jstache.JStache; + +@JStache(path = "fortunes.mustache") +public record Fortunes(List fortunes) { +} diff --git a/frameworks/Java/spring-webflux/src/main/resources/application.yml b/frameworks/Java/spring-webflux/src/main/resources/application.yml index af7743831e3..45ca20c7d80 100755 --- a/frameworks/Java/spring-webflux/src/main/resources/application.yml +++ b/frameworks/Java/spring-webflux/src/main/resources/application.yml @@ -15,7 +15,9 @@ spring: r2dbc: username: ${database.username} password: ${database.password} - url: r2dbc:postgresql://${database.host}:${database.port}/${database.name} + url: r2dbc:postgresql://${database.host}:${database.port}/${database.name}?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable + pool: + max-size: 256 --- spring: diff --git a/frameworks/Java/spring-webflux/src/main/resources/templates/fortunes.mustache b/frameworks/Java/spring-webflux/src/main/resources/fortunes.mustache similarity index 100% rename from frameworks/Java/spring-webflux/src/main/resources/templates/fortunes.mustache rename to frameworks/Java/spring-webflux/src/main/resources/fortunes.mustache diff --git a/frameworks/Java/spring/README.md b/frameworks/Java/spring/README.md index 8e25a585d44..742649fff7e 100644 --- a/frameworks/Java/spring/README.md +++ b/frameworks/Java/spring/README.md @@ -2,9 +2,7 @@ This is the Spring MVC portion of a [benchmarking test suite](../) comparing a variety of web development platforms. -An embedded undertow is used for the web server, with nearly everything configured with default settings. -The only thing changed is Hikari can use up to (2 * cores count) connections (the default is 10). -See [About-Pool-Sizing](https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing) +An embedded undertow is used for the web server. There are two implementations : * For postgresql access, JdbcTemplate is used. See [JdbcDbRepository](src/main/java/hello/JdbcDbRepository.java). diff --git a/frameworks/Java/spring/benchmark_config.json b/frameworks/Java/spring/benchmark_config.json index 615c4a478ca..72362984811 100644 --- a/frameworks/Java/spring/benchmark_config.json +++ b/frameworks/Java/spring/benchmark_config.json @@ -24,27 +24,6 @@ "notes": "", "versus": "" }, - "jpa": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "spring", - "language": "Java", - "flavor": "None", - "orm": "Full", - "platform": "Servlet", - "webserver": "Undertow", - "os": "Linux", - "database_os": "Linux", - "display_name": "spring-jpa", - "notes": "", - "versus": "spring" - }, "mongo": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Java/spring/pom.xml b/frameworks/Java/spring/pom.xml index 4a8d36e9749..6c9341fed54 100644 --- a/frameworks/Java/spring/pom.xml +++ b/frameworks/Java/spring/pom.xml @@ -11,11 +11,12 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 21 + 1.3.6 @@ -35,15 +36,23 @@ org.springframework.boot - spring-boot-starter-data-jpa + spring-boot-starter-jdbc org.springframework.boot spring-boot-starter-data-mongodb - org.springframework.boot - spring-boot-starter-mustache + io.jstach + jstachio + ${jstachio.version} + + + io.jstach + jstachio-apt + ${jstachio.version} + provided + true @@ -61,6 +70,15 @@ org.apache.maven.plugins maven-compiler-plugin + + + + io.jstach + jstachio-apt + ${jstachio.version} + + + diff --git a/frameworks/Java/spring/spring-jpa.dockerfile b/frameworks/Java/spring/spring-jpa.dockerfile deleted file mode 100644 index 0598e9c1f28..00000000000 --- a/frameworks/Java/spring/spring-jpa.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM maven:3.9.5-eclipse-temurin-21 as maven -WORKDIR /spring -COPY src src -COPY pom.xml pom.xml -RUN mvn package -q - -FROM bellsoft/liberica-openjre-debian:21 -WORKDIR /spring -COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar -# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html -RUN java -Djarmode=tools -jar app.jar extract - -EXPOSE 8080 - -CMD ["java", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app/app.jar", "--spring.profiles.active=jpa"] \ No newline at end of file diff --git a/frameworks/Java/spring/src/main/java/hello/App.java b/frameworks/Java/spring/src/main/java/hello/App.java index 0484b46517e..da87b679f87 100644 --- a/frameworks/Java/spring/src/main/java/hello/App.java +++ b/frameworks/Java/spring/src/main/java/hello/App.java @@ -1,17 +1,10 @@ package hello; -import javax.sql.DataSource; - import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -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; - @SpringBootApplication public class App { @@ -20,18 +13,8 @@ public static void main(String[] args) { } @EventListener(ApplicationReadyEvent.class) - public void runAfterStartup() { - System.out.println("Application is ready"); - } - - @Bean - @Profile({ "jdbc", "jpa" }) - DataSource datasource(DataSourceProperties dataSourceProperties) { - HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class) - .build(); - dataSource.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() * 2); - - return dataSource; + public void runAfterStartup() { + System.out.println("Application is ready"); } } diff --git a/frameworks/Java/spring/src/main/java/hello/JpaConfig.java b/frameworks/Java/spring/src/main/java/hello/JpaConfig.java deleted file mode 100644 index c5b8576acab..00000000000 --- a/frameworks/Java/spring/src/main/java/hello/JpaConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -package hello; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@Profile("jpa") -@Configuration -@EnableJpaRepositories(basePackages = "hello.jpa") -public class JpaConfig { - -} diff --git a/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java b/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java deleted file mode 100644 index 11c6568c076..00000000000 --- a/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java +++ /dev/null @@ -1,9 +0,0 @@ -package hello; - -import hello.model.World; - -public interface UpdateWorldService { - - World updateWorld(int worldId); - -} diff --git a/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java b/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java deleted file mode 100644 index 2bd4304a9ee..00000000000 --- a/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package hello; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import hello.web.DbHandler; -import hello.web.WebmvcRouter; -import hello.model.World; -import hello.repository.DbRepository; - -@Service -public class UpdateWorldServiceImpl implements UpdateWorldService { - - private DbRepository dbRepository; - - public UpdateWorldServiceImpl(DbRepository dbRepository) { - this.dbRepository = dbRepository; - } - - @Override - @Transactional - public World updateWorld(int worldId) { - var world = dbRepository.getWorld(worldId); - // Ensure that the new random number is not equal to the old one. - // That would cause the JPA-based implementation to avoid sending the - // UPDATE query to the database, which would violate the test - // requirements. - - // Locally the records doesn't exist, maybe in the yours is ok but we need to - // make this check - if (world == null) { - return null; - } - - int newRandomNumber; - do { - newRandomNumber = DbHandler.randomWorldNumber(); - } while (newRandomNumber == world.randomnumber); - - return dbRepository.updateWorld(world, newRandomNumber); - } - -} diff --git a/frameworks/Java/spring/src/main/java/hello/Utils.java b/frameworks/Java/spring/src/main/java/hello/Utils.java new file mode 100644 index 00000000000..fbb1216624f --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/Utils.java @@ -0,0 +1,19 @@ +package hello; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +abstract public class Utils { + + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; + + public static int randomWorldNumber() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); + } + + public static IntStream randomWorldNumbers() { + return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE).distinct(); + } + +} diff --git a/frameworks/Java/spring/src/main/java/hello/jpa/FortuneRepository.java b/frameworks/Java/spring/src/main/java/hello/jpa/FortuneRepository.java deleted file mode 100644 index 30dea98cc27..00000000000 --- a/frameworks/Java/spring/src/main/java/hello/jpa/FortuneRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package hello.jpa; - -import org.springframework.context.annotation.Profile; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import hello.model.Fortune; - -@Repository -@Profile("jpa") -public interface FortuneRepository extends JpaRepository { -} diff --git a/frameworks/Java/spring/src/main/java/hello/jpa/JpaDbRepository.java b/frameworks/Java/spring/src/main/java/hello/jpa/JpaDbRepository.java deleted file mode 100644 index 2b58841a035..00000000000 --- a/frameworks/Java/spring/src/main/java/hello/jpa/JpaDbRepository.java +++ /dev/null @@ -1,38 +0,0 @@ -package hello.jpa; - -import java.util.List; - -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; - -import hello.model.Fortune; -import hello.model.World; -import hello.repository.DbRepository; - -@Service -@Profile("jpa") -public class JpaDbRepository implements DbRepository { - private final WorldRepository worldRepository; - private final FortuneRepository fortuneRepository; - - public JpaDbRepository(WorldRepository worldRepository, FortuneRepository fortuneRepository) { - this.worldRepository = worldRepository; - this.fortuneRepository = fortuneRepository; - } - - @Override - public World getWorld(int id) { - return worldRepository.findById(id).orElse(null); - } - - @Override - public World updateWorld(World world, int randomNumber) { - world.randomnumber = randomNumber; - return worldRepository.save(world); - } - - @Override - public List fortunes() { - return fortuneRepository.findAll(); - } -} diff --git a/frameworks/Java/spring/src/main/java/hello/jpa/WorldRepository.java b/frameworks/Java/spring/src/main/java/hello/jpa/WorldRepository.java deleted file mode 100644 index 70361aa40d6..00000000000 --- a/frameworks/Java/spring/src/main/java/hello/jpa/WorldRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package hello.jpa; - -import org.springframework.context.annotation.Profile; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import hello.model.World; - -@Repository -@Profile("jpa") -public interface WorldRepository extends JpaRepository { -} diff --git a/frameworks/Java/spring/src/main/java/hello/model/Fortune.java b/frameworks/Java/spring/src/main/java/hello/model/Fortune.java index e4ff559610a..a628d3c755f 100644 --- a/frameworks/Java/spring/src/main/java/hello/model/Fortune.java +++ b/frameworks/Java/spring/src/main/java/hello/model/Fortune.java @@ -1,33 +1,25 @@ package hello.model; -import jakarta.persistence.Entity; - import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Document -@Entity -public final class Fortune { +public final class Fortune implements Comparable{ + @Id - @jakarta.persistence.Id - public int id; - @Field("message") - public String message; + public final int id; - protected Fortune() { - } + @Field("message") + public final String message; public Fortune(int id, 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/spring/src/main/java/hello/model/Message.java b/frameworks/Java/spring/src/main/java/hello/model/Message.java deleted file mode 100644 index 4c675c8a162..00000000000 --- a/frameworks/Java/spring/src/main/java/hello/model/Message.java +++ /dev/null @@ -1,15 +0,0 @@ -package hello.model; - -public class Message { - - private final String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - -} \ No newline at end of file diff --git a/frameworks/Java/spring/src/main/java/hello/model/World.java b/frameworks/Java/spring/src/main/java/hello/model/World.java index 2855df8a5d8..762e9e622ce 100644 --- a/frameworks/Java/spring/src/main/java/hello/model/World.java +++ b/frameworks/Java/spring/src/main/java/hello/model/World.java @@ -1,26 +1,22 @@ package hello.model; -import jakarta.persistence.Entity; - import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Document -@Entity public final class World { @Id - @jakarta.persistence.Id public int id; + @Field("randomNumber") - public int randomnumber; + public int randomNumber; - protected World() { - } - public World(int id, int randomnumber) { + public World(int id, int randomNumber) { this.id = id; - this.randomnumber = randomnumber; + this.randomNumber = randomNumber; } + } \ No newline at end of file diff --git a/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java b/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java index 5cfa8c7d5c3..d7733754c2c 100644 --- a/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java +++ b/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java @@ -6,9 +6,10 @@ import hello.model.World; public interface DbRepository { + World getWorld(int id); - World updateWorld(World world, int randomNumber); + void updateWorlds(List worlds); List fortunes(); } diff --git a/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java b/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java index f1dcdae0352..bc706e232c8 100644 --- a/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java +++ b/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java @@ -1,10 +1,15 @@ package hello.repository; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import org.springframework.context.annotation.Profile; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter; import org.springframework.stereotype.Repository; import hello.model.Fortune; @@ -22,27 +27,34 @@ public JdbcDbRepository(JdbcTemplate jdbcTemplate) { @Override public World getWorld(int id) { try { - return jdbcTemplate.queryForObject("SELECT * FROM world WHERE id = ?", - (rs, rn) -> new World(rs.getInt("id"), rs.getInt("randomnumber")), id); + return jdbcTemplate.queryForObject("SELECT id, randomnumber FROM world WHERE id = ?", + (rs, rn) -> new World(rs.getInt(1), rs.getInt(2)), id); } catch (EmptyResultDataAccessException e) { return null; } } - private World updateWorld(World world) { - jdbcTemplate.update("UPDATE world SET randomnumber = ? WHERE id = ?", world.randomnumber, world.id); - return world; - } - @Override - public World updateWorld(World world, int randomNumber) { - world.randomnumber = randomNumber; - return updateWorld(world); + public void updateWorlds(List worlds) { + jdbcTemplate.batchUpdate("UPDATE world SET randomnumber = ? WHERE id = ?", worlds, worlds.size(), new ParameterizedPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, World world) throws SQLException { + ps.setInt(1, world.randomNumber); + ps.setInt(2, world.id); + } + }); } @Override public List fortunes() { - return jdbcTemplate.query("SELECT * FROM fortune", - (rs, rn) -> new Fortune(rs.getInt("id"), rs.getString("message"))); + return jdbcTemplate.query(con -> con.prepareStatement("SELECT id, message FROM fortune", + ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY), rs -> { + List results = new ArrayList<>(); + while (rs.next()) { + results.add(new Fortune(rs.getInt(1), rs.getString(2))); + } + return results; + }); } + } diff --git a/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java b/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java index 66c81e64f1d..9b6b67c4c95 100644 --- a/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java +++ b/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java @@ -1,11 +1,18 @@ package hello.repository; +import java.util.ArrayList; import java.util.List; import org.springframework.context.annotation.Profile; +import org.springframework.data.mongodb.core.BulkOperations; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; +import com.mongodb.bulk.BulkWriteResult; +import hello.Utils; import hello.model.Fortune; import hello.model.World; @@ -24,9 +31,14 @@ public World getWorld(int id) { } @Override - public World updateWorld(World world, int randomNumber) { - world.randomnumber = randomNumber; - return mongoTemplate.save(world); + public void updateWorlds(List worlds) { + BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, World.class); + for (World world : worlds) { + Query query = new Query().addCriteria(new Criteria("_id").is(world.id)); + Update update = new Update().set("randomNumber", world.randomNumber); + bulkOps.updateOne(query, update); + } + bulkOps.execute(); } @Override diff --git a/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java index 1611cf21170..affb752268f 100644 --- a/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java +++ b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java @@ -1,83 +1,71 @@ package hello.web; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.IntStream; +import java.util.Collections; +import java.util.List; -import hello.UpdateWorldService; +import hello.Utils; import hello.model.Fortune; import hello.model.World; import hello.repository.DbRepository; +import io.jstach.jstachio.JStachio; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; -import org.springframework.web.servlet.function.RenderingResponse; import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; -import static java.util.Comparator.comparing; - @Component public class DbHandler { - private DbRepository dbRepository; - private UpdateWorldService updateWorldService; + private final DbRepository dbRepository; - public DbHandler(DbRepository dbRepository, UpdateWorldService updateWorldService) { + public DbHandler(DbRepository dbRepository) { this.dbRepository = dbRepository; - this.updateWorldService = updateWorldService; } ServerResponse db(ServerRequest request) { return ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) - .body(dbRepository.getWorld(randomWorldNumber())); + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body(dbRepository.getWorld(Utils.randomWorldNumber())); } ServerResponse queries(ServerRequest request) { - String queries = request.params().getFirst("queries"); - World[] worlds = randomWorldNumbers() - .mapToObj(dbRepository::getWorld).limit(parseQueryCount(queries)) + int queries = parseQueryCount(request.params().getFirst("queries")); + World[] worlds = Utils.randomWorldNumbers() + .mapToObj(dbRepository::getWorld).limit(queries) .toArray(World[]::new); return ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(worlds); } ServerResponse updates(ServerRequest request) { - String queries = request.params().getFirst("queries"); - World[] worlds = randomWorldNumbers() - .mapToObj(id -> updateWorldService.updateWorld(id)) - .limit(parseQueryCount(queries)).toArray(World[]::new); + int queries = parseQueryCount(request.params().getFirst("queries")); + List worlds = Utils.randomWorldNumbers() + .mapToObj(id -> { + World world = dbRepository.getWorld(id); + int randomNumber; + do { + randomNumber = Utils.randomWorldNumber(); + } while (randomNumber == world.randomNumber); + world.randomNumber = randomNumber; + return world; + }).limit(queries) + .toList(); + dbRepository.updateWorlds(worlds); return ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(worlds); } ServerResponse fortunes(ServerRequest request) { - var fortunes = dbRepository.fortunes(); + List fortunes = dbRepository.fortunes(); fortunes.add(new Fortune(0, "Additional fortune added at request time.")); - fortunes.sort(comparing(fortune -> fortune.message)); - return RenderingResponse - .create("fortunes") - .modelAttribute("fortunes", fortunes) + Collections.sort(fortunes); + return ServerResponse.ok() .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML_VALUE) - .build(); - } - - private static final int MIN_WORLD_NUMBER = 1; - private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; - - public static int randomWorldNumber() { - return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); - } - - private static IntStream randomWorldNumbers() { - return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE) - // distinct() allows us to avoid using Hibernate's first-level cache in - // the JPA-based implementation. Using a cache like that would bypass - // querying the database, which would violate the test requirements. - .distinct(); + .body(JStachio.render(new Fortunes(fortunes))); } private static int parseQueryCount(String textValue) { diff --git a/frameworks/Java/spring/src/main/java/hello/web/Fortunes.java b/frameworks/Java/spring/src/main/java/hello/web/Fortunes.java new file mode 100644 index 00000000000..cbd6daf2396 --- /dev/null +++ b/frameworks/Java/spring/src/main/java/hello/web/Fortunes.java @@ -0,0 +1,10 @@ +package hello.web; + +import java.util.List; + +import hello.model.Fortune; +import io.jstach.jstache.JStache; + +@JStache(path = "fortunes.mustache") +public record Fortunes(List fortunes) { +} diff --git a/frameworks/Java/spring/src/main/resources/application.yml b/frameworks/Java/spring/src/main/resources/application.yml index 4f6592dc53b..efde83cda61 100644 --- a/frameworks/Java/spring/src/main/resources/application.yml +++ b/frameworks/Java/spring/src/main/resources/application.yml @@ -1,21 +1,21 @@ +server: + server-header: Spring + servlet: + encoding: + force: true --- spring: config: activate: on-profile: jdbc autoconfigure: - exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration - ---- -spring: - config: - activate: - on-profile: jdbc,jpa + exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration datasource: - url: jdbc:postgresql://${database.host}:${database.port}/${database.name} + url: jdbc:postgresql://${database.host}:${database.port}/${database.name}?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable username: ${database.username} password: ${database.password} - + hikari: + maximum-pool-size: 256 database: name: hello_world host: tfb-database @@ -23,23 +23,13 @@ database: username: benchmarkdbuser password: benchmarkdbpass ---- -spring: - config: - activate: - on-profile: jpa - autoconfigure: - exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration - jpa: - database-platform: org.hibernate.dialect.PostgreSQLDialect - --- spring: config: activate: on-profile: mongo autoconfigure: - exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration spring.data.mongodb: host: tfb-database @@ -50,7 +40,3 @@ spring.data.mongodb: spring: profiles: active: jdbc - -server.server-header: Spring -server.servlet.encoding.force: true -spring.jpa.open-in-view: false diff --git a/frameworks/Java/spring/src/main/resources/templates/fortunes.mustache b/frameworks/Java/spring/src/main/resources/fortunes.mustache similarity index 100% rename from frameworks/Java/spring/src/main/resources/templates/fortunes.mustache rename to frameworks/Java/spring/src/main/resources/fortunes.mustache From d96bcdc36e248a5ea0cb732909e3a601512b85f7 Mon Sep 17 00:00:00 2001 From: Jonathan Cooper <4676022+ReallySnazzy@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:35:20 -0700 Subject: [PATCH 0826/1766] [OCaml/Dream] Add initial tests for Dream (#9278) --- frameworks/OCaml/dream/README.md | 35 ++++++++++++ frameworks/OCaml/dream/benchmark_config.json | 26 +++++++++ frameworks/OCaml/dream/dream.dockerfile | 12 +++++ frameworks/OCaml/dream/dream_test/bin/dune | 5 ++ frameworks/OCaml/dream/dream_test/bin/main.ml | 53 +++++++++++++++++++ .../OCaml/dream/dream_test/dream_test.opam | 35 ++++++++++++ .../OCaml/dream/dream_test/dune-project | 26 +++++++++ frameworks/OCaml/dream/dream_test/lib/dune | 2 + frameworks/OCaml/dream/dream_test/test/dune | 2 + .../dream/dream_test/test/test_dream_test.ml | 0 10 files changed, 196 insertions(+) create mode 100755 frameworks/OCaml/dream/README.md create mode 100755 frameworks/OCaml/dream/benchmark_config.json create mode 100644 frameworks/OCaml/dream/dream.dockerfile create mode 100755 frameworks/OCaml/dream/dream_test/bin/dune create mode 100755 frameworks/OCaml/dream/dream_test/bin/main.ml create mode 100644 frameworks/OCaml/dream/dream_test/dream_test.opam create mode 100755 frameworks/OCaml/dream/dream_test/dune-project create mode 100755 frameworks/OCaml/dream/dream_test/lib/dune create mode 100755 frameworks/OCaml/dream/dream_test/test/dune create mode 100755 frameworks/OCaml/dream/dream_test/test/test_dream_test.ml diff --git a/frameworks/OCaml/dream/README.md b/frameworks/OCaml/dream/README.md new file mode 100755 index 00000000000..86e484bc978 --- /dev/null +++ b/frameworks/OCaml/dream/README.md @@ -0,0 +1,35 @@ +# Dream + +## Overview + +Most of all of the code is inside of `test_dream/bin/main.ml` file. + +## Implemented tests + +| Test Name | Endpoint | +|------------|-------------------------------| +| Plain text | http://0.0.0.0:8080/plaintext | +| Json | http://0.0.0.0:8080/json | + +## Headers + +A simple middleware was added that adds the required headers for the Techempower Benchmarks. +The date header is refreshed only once per second as allowed by the rules for performance. + +## Dependencies + +The `test_dream/dune-project` and `test_dream/bin/dune` are where dependencies are managed +for this project. If you add a dependency to those locations and then run the following: + +``` +cd test_dream +dune build test_dream.opam +opam install --yes --deps-only . +``` + +You will update the opam package list and install your changes locally. + +## Running tests + +$ tfb --mode verify --test dream + diff --git a/frameworks/OCaml/dream/benchmark_config.json b/frameworks/OCaml/dream/benchmark_config.json new file mode 100755 index 00000000000..d5d83b838f4 --- /dev/null +++ b/frameworks/OCaml/dream/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "dream", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "Dream", + "language": "OCaml", + "flavor": "None", + "orm": "Micro", + "platform": "http/af", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Dream", + "notes": "", + "versus": "httpaf" + } + } + ] +} diff --git a/frameworks/OCaml/dream/dream.dockerfile b/frameworks/OCaml/dream/dream.dockerfile new file mode 100644 index 00000000000..8a806026a4e --- /dev/null +++ b/frameworks/OCaml/dream/dream.dockerfile @@ -0,0 +1,12 @@ +FROM ocaml/opam:debian-ocaml-5.1 +COPY ./dream_test/ /app +WORKDIR /app +USER root +RUN apt install -y libgmp-dev libev-dev pkg-config libssl-dev +RUN opam install --yes --deps-only . +RUN opam install dune +RUN eval $(opam env) +RUN opam exec -- dune build --profile release +CMD [ "./_build/default/bin/main.exe" ] +EXPOSE 8080 + diff --git a/frameworks/OCaml/dream/dream_test/bin/dune b/frameworks/OCaml/dream/dream_test/bin/dune new file mode 100755 index 00000000000..171e6829182 --- /dev/null +++ b/frameworks/OCaml/dream/dream_test/bin/dune @@ -0,0 +1,5 @@ +(executable + (public_name dream_test) + (name main) + (preprocess (pps lwt_ppx ppx_yojson_conv)) + (libraries dream_test dream ppx_yojson_conv calendar)) diff --git a/frameworks/OCaml/dream/dream_test/bin/main.ml b/frameworks/OCaml/dream/dream_test/bin/main.ml new file mode 100755 index 00000000000..4c5ac18c30c --- /dev/null +++ b/frameworks/OCaml/dream/dream_test/bin/main.ml @@ -0,0 +1,53 @@ +open Ppx_yojson_conv_lib.Yojson_conv.Primitives + +type message_object = { + message : string; +} [@@deriving yojson] + +let time_cache = Atomic.make false;; +let time_ref = ref("None");; + +let time () = + if not @@ Atomic.get time_cache + then begin + time_ref := CalendarLib.Printer.Calendar.sprint "%a, %d %b %Y %H:%M:%S UTC" @@ CalendarLib.Calendar.now (); + Atomic.set time_cache true; + (!time_ref) + end + else + (!time_ref);; + +let tech_empower_headers (inner_handler: Dream.handler) = + (fun (req) -> + let%lwt res = inner_handler req in + Dream.set_header res "Server" "dream"; + Dream.set_header res "Date" @@ time (); + Lwt.return res + );; + +let rec timer () = + Unix.sleepf 0.9; + Atomic.set time_cache false; + timer();; + +let () = + let time_invalidator = Domain.spawn(fun () -> timer ()) in + Dream.run ~interface: "0.0.0.0" + @@ tech_empower_headers + @@ Dream.router [ + Dream.get "/" (fun _ -> + Dream.html "Hello, world!" + ); + Dream.get "/plaintext" (fun _ -> + Dream.response ~headers: [("Content-Type", "text/plain")] + "Hello, world!" + |> Lwt.return + ); + Dream.get "/json" (fun _ -> + { message = "Hello, world!" } + |> yojson_of_message_object + |> Yojson.Safe.to_string + |> Dream.json + ); + ]; + Domain.join time_invalidator;; diff --git a/frameworks/OCaml/dream/dream_test/dream_test.opam b/frameworks/OCaml/dream/dream_test/dream_test.opam new file mode 100644 index 00000000000..b9db80a34bd --- /dev/null +++ b/frameworks/OCaml/dream/dream_test/dream_test.opam @@ -0,0 +1,35 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +synopsis: "A short synopsis" +description: "A longer description" +maintainer: ["Maintainer Name"] +authors: ["Author Name"] +license: "LICENSE" +tags: ["topics" "to describe" "your" "project"] +homepage: "https://github.com/username/reponame" +doc: "https://url/to/documentation" +bug-reports: "https://github.com/username/reponame/issues" +depends: [ + "ocaml" + "dune" {>= "3.14"} + "dream" + "lwt" + "ppx_yojson_conv" + "calendar" + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/username/reponame.git" diff --git a/frameworks/OCaml/dream/dream_test/dune-project b/frameworks/OCaml/dream/dream_test/dune-project new file mode 100755 index 00000000000..aaeaf8c0df8 --- /dev/null +++ b/frameworks/OCaml/dream/dream_test/dune-project @@ -0,0 +1,26 @@ +(lang dune 3.14) + +(name dream_test) + +(generate_opam_files true) + +(source + (github username/reponame)) + +(authors "Author Name") + +(maintainers "Maintainer Name") + +(license LICENSE) + +(documentation https://url/to/documentation) + +(package + (name dream_test) + (synopsis "A short synopsis") + (description "A longer description") + (depends ocaml dune dream lwt ppx_yojson_conv calendar) + (tags + (topics "to describe" your project))) + +; See the complete stanza docs at https://dune.readthedocs.io/en/stable/dune-files.html#dune-project diff --git a/frameworks/OCaml/dream/dream_test/lib/dune b/frameworks/OCaml/dream/dream_test/lib/dune new file mode 100755 index 00000000000..b8d991f91da --- /dev/null +++ b/frameworks/OCaml/dream/dream_test/lib/dune @@ -0,0 +1,2 @@ +(library + (name dream_test)) diff --git a/frameworks/OCaml/dream/dream_test/test/dune b/frameworks/OCaml/dream/dream_test/test/dune new file mode 100755 index 00000000000..434f4a8ee36 --- /dev/null +++ b/frameworks/OCaml/dream/dream_test/test/dune @@ -0,0 +1,2 @@ +(test + (name test_dream_test)) diff --git a/frameworks/OCaml/dream/dream_test/test/test_dream_test.ml b/frameworks/OCaml/dream/dream_test/test/test_dream_test.ml new file mode 100755 index 00000000000..e69de29bb2d From 289d579cafb5859107dca2f71648148af2ab0f9a Mon Sep 17 00:00:00 2001 From: Redkale Date: Wed, 2 Oct 2024 07:35:54 +0800 Subject: [PATCH 0827/1766] Update redkale-block (#9295) * Update redkale-block * ConvertStandardString --- frameworks/Java/redkale/BenchmarkService.java | 7 +------ frameworks/Java/redkale/benchmark_config.json | 1 + frameworks/Java/redkale/conf/application.xml | 2 +- frameworks/Java/redkale/config.toml | 1 + frameworks/Java/redkale/redkale-block.dockerfile | 1 + .../java/org/redkalex/benchmark/BenchmarkService.java | 8 +------- .../src/main/java/org/redkalex/benchmark/Message.java | 4 ++-- 7 files changed, 8 insertions(+), 16 deletions(-) diff --git a/frameworks/Java/redkale/BenchmarkService.java b/frameworks/Java/redkale/BenchmarkService.java index 39e9956a75d..558cbe2fbb2 100644 --- a/frameworks/Java/redkale/BenchmarkService.java +++ b/frameworks/Java/redkale/BenchmarkService.java @@ -6,13 +6,12 @@ package org.redkalex.benchmark; import java.util.*; -import java.util.concurrent.*; +import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Stream; import org.redkale.annotation.*; import org.redkale.net.http.*; import org.redkale.service.AbstractService; import org.redkale.source.DataSource; -import org.redkale.util.AnyValue; /** * 测试redkale-jdbc, 需要覆盖到原BenchmarkService @@ -27,10 +26,6 @@ public class BenchmarkService extends AbstractService { @Resource private DataSource source; - public void init(AnyValue conf) { - source.finds(CachedWorld.class, 1); - } - @NonBlocking @RestMapping(auth = false) public byte[] plaintext() { diff --git a/frameworks/Java/redkale/benchmark_config.json b/frameworks/Java/redkale/benchmark_config.json index fa84965daa3..2371e0e2bec 100644 --- a/frameworks/Java/redkale/benchmark_config.json +++ b/frameworks/Java/redkale/benchmark_config.json @@ -96,6 +96,7 @@ "versus": "Redkale" }, "block": { + "plaintext_url": "/plaintext", "db_url": "/db", "query_url": "/queries?q=", "fortune_url": "/fortunes", diff --git a/frameworks/Java/redkale/conf/application.xml b/frameworks/Java/redkale/conf/application.xml index aa535805113..642b3da5928 100644 --- a/frameworks/Java/redkale/conf/application.xml +++ b/frameworks/Java/redkale/conf/application.xml @@ -8,7 +8,7 @@ - + diff --git a/frameworks/Java/redkale/config.toml b/frameworks/Java/redkale/config.toml index c2fcbb80d77..96d8a7f4bf8 100644 --- a/frameworks/Java/redkale/config.toml +++ b/frameworks/Java/redkale/config.toml @@ -71,6 +71,7 @@ webserver = "Redkale" versus = "Redkale" [block] +urls.plaintext = "/plaintext" urls.db = "/db" urls.fortune = "/fortunes" urls.query = "/queries?q=" diff --git a/frameworks/Java/redkale/redkale-block.dockerfile b/frameworks/Java/redkale/redkale-block.dockerfile index b163c60e53f..55e13c76b73 100644 --- a/frameworks/Java/redkale/redkale-block.dockerfile +++ b/frameworks/Java/redkale/redkale-block.dockerfile @@ -9,6 +9,7 @@ RUN mvn package -q FROM openjdk:23-jdk-slim WORKDIR /redkale COPY conf conf +RUN sed -i 's/sameHeader="true"/ /g' /redkale/conf/application.xml COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar EXPOSE 8080 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 48af592f928..e2ebc7b8aad 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 @@ -7,13 +7,11 @@ import java.util.*; import java.util.concurrent.*; -import java.util.stream.IntStream; -import java.util.stream.Stream; +import java.util.stream.*; import org.redkale.annotation.*; import org.redkale.net.http.*; import org.redkale.service.AbstractService; import org.redkale.source.DataSource; -import org.redkale.util.AnyValue; /** * @@ -28,10 +26,6 @@ public class BenchmarkService extends AbstractService { @Resource private DataSource source; - public void init(AnyValue conf) { - source.finds(CachedWorld.class, 1); - } - @RestMapping(auth = false) public byte[] plaintext() { return helloBytes; diff --git a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java index 00c529e9eee..a5e7aed358d 100644 --- a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java +++ b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java @@ -6,7 +6,7 @@ package org.redkalex.benchmark; import org.redkale.annotation.Serial; -import org.redkale.convert.ConvertSmallString; +import org.redkale.convert.ConvertStandardString; import org.redkale.convert.json.JsonConvert; /** @@ -16,7 +16,7 @@ @Serial public final class Message { - @ConvertSmallString + @ConvertStandardString private String message; public Message() {} From 27cade8f3987e48fa3505d879ee1994c2f8b32d9 Mon Sep 17 00:00:00 2001 From: SaltyAom Date: Wed, 2 Oct 2024 06:36:09 +0700 Subject: [PATCH 0828/1766] [Elysia] fix /plaintext failing on newer Bun version (#9290) * fix(elysia): native static response not setting headers conflict with recent Bun version * fix(elysia): remove lockfile * fix(elysia): update lockfile * fix(elysia): update elysia version * fix(elysia): update lockfile --- frameworks/TypeScript/elysia/bun.lockb | Bin 3513 -> 3513 bytes frameworks/TypeScript/elysia/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/TypeScript/elysia/bun.lockb b/frameworks/TypeScript/elysia/bun.lockb index 0020cf63f06be5b698becc47ddfdaa4336096013..5d4cdb0b97af1c97b83aa10bf44cc1db342ee378 100755 GIT binary patch delta 492 zcmdlfy;FLEp2BDLxQ6$S8|PZCudFP6c7D24_zNK?wv6hWkB3+Da3r3Y=;x&{m4Sgl zl7XS21xO15>2e^=3#60t^RqKk85kz+P*4zX?pSl?@FEfUxl9jCgtk2Azd!r2VP8V| zd1)u&dKIK_oe(em;=EsGZ7s9uA zOgpN!W_f?Ig>ve4V`+{zr@5a7f4-D_YwEgQMg|5(hJXD3fHd>umn`9vU$F2_Udrmt z$U1oje7|kZ{=9HfN zfm6y97G|(;VPcFkG}1HFGiHE=DlFuf7!CA{jr5F77^Y6<=91iO$K}H)WTsb=UX@>v znwMCRsasN6kXk&spId9P61VhZ6`rWcn|RbGC-X>8e#q@SxsFG2@=YE`b~8OAkfzCk G>@xs9GqD8# delta 490 zcmdlfy;FLEp2Dr}j0cti2jnY#70S<@wUYhy!=#8|`@k%#Msc)jV^%v$JMjI+AGpmq~uc$KL%?yI-F6T~^SrLC8U<@W+oz6R+n9t?FBo z8S?E*H?tjoyq>&pn;l3c^hp85kHD{_+0<(#(?`S;Hs4VBwuSm&F@s$4nq^ z1}pF6uPola>_A_@0E^MBZQl+xGq~};U7760?Qb>Zz2&zLu9-nEFJC;*aaZ`k7WcN- z@gJw061-G-?6^VDS(fdb3cqXT#TQ9Wxp|$v{pVx>_WsRh*xoTQ8cp8KDa}|unVU<} z6c%8xKw)BxGte{BGhkqV1t~1pfHH=926~1J3=1cJ Date: Wed, 2 Oct 2024 00:36:21 +0100 Subject: [PATCH 0829/1766] Resolve Axum 0.7 regressions (#9291) * perf: restore axum [postgresql] performance * fix: axum plaintext regression * feat: upgrade to axum 0.7.6 --- frameworks/Rust/axum/Cargo.lock | 21 +++++++++++-------- frameworks/Rust/axum/Cargo.toml | 2 +- frameworks/Rust/axum/src/main.rs | 6 ++++-- frameworks/Rust/axum/src/main_mongo.rs | 22 +++----------------- frameworks/Rust/axum/src/main_mongo_raw.rs | 19 ++--------------- frameworks/Rust/axum/src/main_pg.rs | 6 ++++-- frameworks/Rust/axum/src/server.rs | 24 ++++++++++++++++++++++ 7 files changed, 50 insertions(+), 50 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 005a10fb7ca..8f756182439 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -121,9 +121,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" dependencies = [ "async-trait", "axum-core", @@ -147,16 +147,16 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower 0.4.13", + "tower 0.5.1", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" dependencies = [ "async-trait", "bytes", @@ -167,7 +167,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", ] @@ -201,7 +201,7 @@ dependencies = [ "tokio-pg-mapper", "tokio-pg-mapper-derive", "tokio-postgres", - "tower 0.5.0", + "tower 0.5.1", "tower-http", "yarte", ] @@ -1056,6 +1056,8 @@ dependencies = [ "hyper", "pin-project-lite", "tokio", + "tower 0.4.13", + "tower-service", ] [[package]] @@ -2779,14 +2781,15 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36b837f86b25d7c0d7988f00a54e74739be6477f2aac6201b8f429a7569991b7" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", "pin-project-lite", "sync_wrapper 0.1.2", + "tokio", "tower-layer", "tower-service", ] diff --git a/frameworks/Rust/axum/Cargo.toml b/frameworks/Rust/axum/Cargo.toml index 49b594972d1..a47514726c7 100644 --- a/frameworks/Rust/axum/Cargo.toml +++ b/frameworks/Rust/axum/Cargo.toml @@ -39,7 +39,7 @@ simd-json = [ ] [dependencies] -axum = { version = "0.7.5", default-features = false, features = [ +axum = { version = "0.7.6", default-features = false, features = [ "json", "query", "http1", diff --git a/frameworks/Rust/axum/src/main.rs b/frameworks/Rust/axum/src/main.rs index b29da958d20..70858e27ddc 100644 --- a/frameworks/Rust/axum/src/main.rs +++ b/frameworks/Rust/axum/src/main.rs @@ -11,11 +11,13 @@ use axum::Json; use common::simd_json::Json; /// Return a plaintext static string. -pub async fn plaintext() -> impl IntoResponse { - (StatusCode::OK, "Hello, World!") +#[inline(always)] +pub async fn plaintext() -> &'static str { + "Hello, World!" } /// Return a JSON message. +#[inline(always)] pub async fn json() -> impl IntoResponse { let message = Message { message: "Hello, World!", diff --git a/frameworks/Rust/axum/src/main_mongo.rs b/frameworks/Rust/axum/src/main_mongo.rs index 8f7ac7961c3..6d301189b9a 100644 --- a/frameworks/Rust/axum/src/main_mongo.rs +++ b/frameworks/Rust/axum/src/main_mongo.rs @@ -1,5 +1,6 @@ mod common; mod mongo; +mod server; //mod mongo_raw; use std::time::Duration; @@ -24,8 +25,6 @@ use mongodb::{ use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; use yarte::Template; -mod server; - use common::{ get_env, utils::{parse_params, Params, Utf8Html}, @@ -117,25 +116,10 @@ async fn fortunes(DatabaseConnection(db): DatabaseConnection) -> impl IntoRespon fn main() { dotenv().ok(); - - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - - for _ in 1..num_cpus::get() { - std::thread::spawn(move || { - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - rt.block_on(serve()); - }); - } - rt.block_on(serve()); + server::start_tokio(serve_app) } -async fn serve() { +async fn serve_app() { let database_url: String = get_env("MONGODB_URL"); let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE"); let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE"); diff --git a/frameworks/Rust/axum/src/main_mongo_raw.rs b/frameworks/Rust/axum/src/main_mongo_raw.rs index fdf09c179a3..0d2735ad3bb 100644 --- a/frameworks/Rust/axum/src/main_mongo_raw.rs +++ b/frameworks/Rust/axum/src/main_mongo_raw.rs @@ -86,25 +86,10 @@ async fn updates( fn main() { dotenv().ok(); - - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - - for _ in 1..num_cpus::get() { - std::thread::spawn(move || { - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - rt.block_on(serve()); - }); - } - rt.block_on(serve()); + server::start_tokio(serve_app) } -async fn serve() { +async fn serve_app() { let database_url: String = get_env("MONGODB_URL"); let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE"); let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE"); diff --git a/frameworks/Rust/axum/src/main_pg.rs b/frameworks/Rust/axum/src/main_pg.rs index 20acb2a1769..be691f9720c 100644 --- a/frameworks/Rust/axum/src/main_pg.rs +++ b/frameworks/Rust/axum/src/main_pg.rs @@ -78,10 +78,12 @@ async fn updates( (StatusCode::OK, Json(worlds)) } -#[tokio::main] -async fn main() { +fn main() { dotenv().ok(); + server::start_tokio(serve_app) +} +async fn serve_app() { let database_url: String = get_env("POSTGRES_URL"); // Create shared database connection diff --git a/frameworks/Rust/axum/src/server.rs b/frameworks/Rust/axum/src/server.rs index 5e03a6aca88..6d861277c10 100644 --- a/frameworks/Rust/axum/src/server.rs +++ b/frameworks/Rust/axum/src/server.rs @@ -1,4 +1,5 @@ use std::{ + future::Future, io, net::{Ipv4Addr, SocketAddr, TcpListener}, }; @@ -104,3 +105,26 @@ pub async fn serve_hyper(app: Router<()>, port: Option) { }); } } + +/// Start a single-threaded tokio runtime on multiple threads. +#[allow(dead_code)] +pub fn start_tokio(f: fn() -> Fut) +where + Fut: Future + 'static, +{ + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + + for _ in 1..num_cpus::get() { + std::thread::spawn(move || { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + rt.block_on(f()); + }); + } + rt.block_on(f()); +} From 19dbe27e1d62887e261840d04f4f43fa5550bd32 Mon Sep 17 00:00:00 2001 From: Dragos Varovici Date: Tue, 1 Oct 2024 17:36:43 -0600 Subject: [PATCH 0830/1766] Zap performance improvements (#9293) --- frameworks/Zig/zap/build-nginx-conf.sh | 13 +++++++++ frameworks/Zig/zap/build.zig | 19 ------------ frameworks/Zig/zap/build.zig.zon | 1 - frameworks/Zig/zap/nginx.conf | 33 +++++++++++++++++++++ frameworks/Zig/zap/run.sh | 3 -- frameworks/Zig/zap/src/endpoints.zig | 24 ++++++++++------ frameworks/Zig/zap/src/main.zig | 30 +++++++++++++++---- frameworks/Zig/zap/src/pool.zig | 4 +-- frameworks/Zig/zap/start-servers.sh | 10 +++++++ frameworks/Zig/zap/zap.dockerfile | 40 ++++++++------------------ 10 files changed, 110 insertions(+), 67 deletions(-) create mode 100644 frameworks/Zig/zap/build-nginx-conf.sh create mode 100644 frameworks/Zig/zap/nginx.conf delete mode 100644 frameworks/Zig/zap/run.sh create mode 100644 frameworks/Zig/zap/start-servers.sh diff --git a/frameworks/Zig/zap/build-nginx-conf.sh b/frameworks/Zig/zap/build-nginx-conf.sh new file mode 100644 index 00000000000..ecb55c80bfa --- /dev/null +++ b/frameworks/Zig/zap/build-nginx-conf.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +CPU_COUNT=$(nproc) +P=3000 +END=$(($P+$CPU_COUNT)) +CONF="" + +while [ $P -lt $END ]; do + CONF+="\t\tserver 127.0.0.1:$P;\n" + let P=P+1 +done + +sed -i "s|# replace|$CONF|g" nginx.conf diff --git a/frameworks/Zig/zap/build.zig b/frameworks/Zig/zap/build.zig index 762284c2acb..2da55a07981 100644 --- a/frameworks/Zig/zap/build.zig +++ b/frameworks/Zig/zap/build.zig @@ -40,16 +40,13 @@ pub fn build(b: *std.Build) !void { const zap_module = b.dependency("zap", dep_opts).module("zap"); const pg_module = b.dependency("pg", dep_opts).module("pg"); - const dig_module = b.dependency("dig", dep_opts).module("dns"); try modules.put("zap", zap_module); try modules.put("pg", pg_module); - try modules.put("dig", dig_module); // // Expose this as a module that others can import exe.root_module.addImport("zap", zap_module); exe.root_module.addImport("pg", pg_module); - exe.root_module.addImport("dig", dig_module); exe.linkLibrary(zap.artifact("facil.io")); @@ -80,20 +77,4 @@ pub fn build(b: *std.Build) !void { // 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 = b.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 index 871e73b7f76..3f492b7d954 100644 --- a/frameworks/Zig/zap/build.zig.zon +++ b/frameworks/Zig/zap/build.zig.zon @@ -9,5 +9,4 @@ }, .pg = .{ .url = "https://github.com/karlseguin/pg.zig/archive/239a4468163a49d8c0d03285632eabe96003e9e2.tar.gz", .hash = "1220a1d7e51e2fa45e547c76a9e099c09d06e14b0b9bfc6baa89367f56f1ded399a0" }, - .dig = .{ .url = "https://github.com/lun-4/zigdig/archive/a54c85c26aa83c64ee81e3ee1818890be5cbed0b.tar.gz", .hash = "1220f078ab62d1328339504f9122dc4d241be30ada451628d78b8a3bf5bb9be1dcba" }, } } diff --git a/frameworks/Zig/zap/nginx.conf b/frameworks/Zig/zap/nginx.conf new file mode 100644 index 00000000000..f394b2ad206 --- /dev/null +++ b/frameworks/Zig/zap/nginx.conf @@ -0,0 +1,33 @@ +error_log stderr; +worker_processes auto; + +events { + worker_connections 65535; + multi_accept off; +} + +http { + default_type application/octet-stream; + client_body_temp_path /tmp; + access_log off; + + sendfile on; + tcp_nopush on; + keepalive_requests 100000; + keepalive_timeout 65; + + upstream workers { + # replace + } + + server { + listen 8080; + server_name tfb-server; + + location / { + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_pass http://workers; + } + } +} diff --git a/frameworks/Zig/zap/run.sh b/frameworks/Zig/zap/run.sh deleted file mode 100644 index b4698a15de1..00000000000 --- a/frameworks/Zig/zap/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -echo "Waiting for ZAP framework 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 index 3492e686591..44a3afc43e2 100644 --- a/frameworks/Zig/zap/src/endpoints.zig +++ b/frameworks/Zig/zap/src/endpoints.zig @@ -168,20 +168,28 @@ pub const DbEndpoint = struct { } } - // std.debug.print("Attempting to return random: {}\n", .{random_number}); - if (random_number == 0) { return; } - var conn = pool.acquire() catch return; - defer conn.release(); - - const row_result = conn.row("SELECT id, randomNumber FROM World WHERE id = $1", .{random_number}) catch |err| { + const json_to_send = getJson(pool, random_number) catch |err| { std.debug.print("Error querying database: {}\n", .{err}); return; }; + + req.sendBody(json_to_send) catch return; + + return; + } + + fn getJson(pool: *pg.Pool, random_number: u32) ![]const u8{ + var conn = try pool.acquire(); + defer conn.release(); + + const row_result = try conn.row("SELECT id, randomNumber FROM World WHERE id = $1", .{random_number}); + var row = row_result.?; + defer row.deinit() catch {}; const world = World{ .id = row.get(i32, 0), .randomNumber = row.get(i32, 1) }; @@ -193,9 +201,7 @@ pub const DbEndpoint = struct { json_to_send = "null"; } - req.sendBody(json_to_send) catch return; - - return; + return json_to_send; } }; diff --git a/frameworks/Zig/zap/src/main.zig b/frameworks/Zig/zap/src/main.zig index 0c66a7639bb..e2792726f04 100644 --- a/frameworks/Zig/zap/src/main.zig +++ b/frameworks/Zig/zap/src/main.zig @@ -1,8 +1,8 @@ const std = @import("std"); +const builtin = @import("builtin"); 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"); @@ -23,6 +23,24 @@ pub fn main() !void { const allocator = tsa.allocator(); + var zap_port: []u8 = undefined; + var arg_string = try std.fmt.allocPrint(allocator, "{s}", .{"0"}); + defer allocator.free(arg_string); + + var args = try std.process.argsWithAllocator(allocator); + defer args.deinit(); + while (args.next()) |arg| { + arg_string = try std.fmt.allocPrint(allocator, "{s}", .{arg}); + + zap_port = arg_string; // use arg + } + + var port = try std.fmt.parseInt(u16, zap_port, 0); + + if (port == 0) { + port = 3000; + } + var pg_pool = try pool.initPool(allocator); defer pg_pool.deinit(); @@ -68,7 +86,7 @@ pub fn main() !void { var listener = try zap.Middleware.Listener(middleware.Context).init( .{ .on_request = null, // must be null - .port = 3000, + .port = port, .log = false, .max_clients = 100000, }, @@ -78,13 +96,15 @@ pub fn main() !void { ); try listener.listen(); - const cpuCount = @as(i16, @intCast(std.Thread.getCpuCount() catch 1)); + //const cpuCount = @as(i16, @intCast(std.Thread.getCpuCount() catch 1)); + //const workers = if (builtin.mode == .Debug) 1 else cpuCount; + const threads = 128; - std.debug.print("Listening on 0.0.0.0:3000 on {d} threads\n", .{cpuCount}); + std.debug.print("Listening at 0.0.0.0:{d} on {d} threads\n", .{port, threads}); // start worker threads zap.start(.{ - .threads = 16 * cpuCount, + .threads = threads, .workers = 1, }); } diff --git a/frameworks/Zig/zap/src/pool.zig b/frameworks/Zig/zap/src/pool.zig index 84df32104b0..6615ae217ce 100644 --- a/frameworks/Zig/zap/src/pool.zig +++ b/frameworks/Zig/zap/src/pool.zig @@ -10,7 +10,7 @@ const Regex = regex.Regex; pub fn initPool(allocator: Allocator) !*pg.Pool { const info = try parsePostgresConnStr(allocator); - std.debug.print("Connection: {s}:{s}@{s}:{d}/{s}\n", .{ info.username, info.password, info.hostname, info.port, info.database }); + //std.debug.print("Connection: {s}:{s}@{s}:{d}/{s}\n", .{ info.username, info.password, info.hostname, info.port, info.database }); const pg_pool = try Pool.init(allocator, .{ .size = 28, @@ -60,7 +60,7 @@ fn addressAsString(address: std.net.Address) ![]const u8 { fn parsePostgresConnStr(allocator: Allocator) !ConnectionInfo { const pg_port = try getEnvVar(allocator, "PG_PORT", "5432"); - std.debug.print("tfb port {s}\n", .{pg_port}); + // std.debug.print("tfb port {s}\n", .{pg_port}); var port = try std.fmt.parseInt(u16, pg_port, 0); if (port == 0) { diff --git a/frameworks/Zig/zap/start-servers.sh b/frameworks/Zig/zap/start-servers.sh new file mode 100644 index 00000000000..b5cf175de41 --- /dev/null +++ b/frameworks/Zig/zap/start-servers.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +CPU_COUNT=$(nproc) +P=3000 +END=$(($P+$CPU_COUNT)) + +while [ $P -lt $END ]; do + zap $P & + let P=P+1 +done diff --git a/frameworks/Zig/zap/zap.dockerfile b/frameworks/Zig/zap/zap.dockerfile index 9aa8a4109ae..71123f4f3e7 100644 --- a/frameworks/Zig/zap/zap.dockerfile +++ b/frameworks/Zig/zap/zap.dockerfile @@ -9,38 +9,22 @@ ENV PG_HOST=tfb-database ENV PG_PORT=5432 COPY src src -COPY run.sh run.sh - COPY build.zig.zon build.zig.zon COPY build.zig build.zig +COPY start-servers.sh start-servers.sh +COPY build-nginx-conf.sh build-nginx-conf.sh +COPY nginx.conf nginx.conf -RUN dnf install -y zig -RUN zig version -# RUN zig build -Doptimize=ReleaseFast -RUN zig build -RUN cp /zap/zig-out/bin/zap /usr/local/bin - -EXPOSE 3000 - -CMD ["sh", "run.sh"] - -# FROM alpine:3.19 +RUN chmod +x start-servers.sh +RUN chmod +x build-nginx-conf.sh -# WORKDIR /zap +RUN ./build-nginx-conf.sh -# ENV PG_USER=benchmarkdbuser -# ENV PG_PASS=benchmarkdbpass -# ENV PG_DB=hello_world -# ENV PG_HOST=tfb-database -# ENV PG_PORT=5432 - -# RUN apk update -# RUN apk add libc6-compat - -# COPY run.sh run.sh - -# COPY --from=build /zap/zig-out/bin/zap /usr/local/bin +RUN dnf install -y zig nginx +RUN zig version +RUN zig build -Doptimize=ReleaseFast +RUN cp /zap/zig-out/bin/zap /usr/local/bin -# EXPOSE 3000 +EXPOSE 8080 -# CMD ["sh", "run.sh"] \ No newline at end of file +CMD ./start-servers.sh && nginx -c /zap/nginx.conf -g "daemon off;" \ No newline at end of file From 85ff4916681461ffe36724a91895cbc978fcf20b Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 2 Oct 2024 01:37:03 +0200 Subject: [PATCH 0831/1766] [toolset] Postgresql update to v17 (#9296) --- 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 757d3ba79e8..aa2bcebf01d 100644 --- a/toolset/databases/postgres/postgres.dockerfile +++ b/toolset/databases/postgres/postgres.dockerfile @@ -1,4 +1,4 @@ -FROM postgres:16-bookworm +FROM postgres:17-bookworm ENV PGDATA=/ssd/postgresql \ POSTGRES_DB=hello_world \ From 71b06236af804042873677a66d8f4a1b43fc2dde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 01:34:27 +0000 Subject: [PATCH 0832/1766] Bump System.Runtime.Caching Bumps [System.Runtime.Caching](https://github.com/dotnet/runtime) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1) --- updated-dependencies: - dependency-name: System.Runtime.Caching dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj index ba5b9d4202d..d6a786daa3b 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj @@ -12,7 +12,7 @@ - + From 8d4f5ed1edf0204493a62252b1d097f8dcb5271c Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Fri, 11 Oct 2024 00:46:02 +0800 Subject: [PATCH 0833/1766] [xitca-web] add bench for async orm (#9287) * [xitca-web] add bench for async orm * dep fix * use release build of xitca-postgres * fix framework naming * dep update * fix build * add unrealistic db impl * dedup * improve compile time * update to pre-release version of xitca-web --- frameworks/Rust/xitca-web/Cargo.lock | 576 +++++++++--------- frameworks/Rust/xitca-web/Cargo.toml | 61 +- .../Rust/xitca-web/benchmark_config.json | 18 +- frameworks/Rust/xitca-web/src/db.rs | 143 ++--- .../Rust/xitca-web/src/db_diesel_async.rs | 153 +++++ .../Rust/xitca-web/src/db_unrealistic.rs | 130 ++++ frameworks/Rust/xitca-web/src/db_util.rs | 53 ++ frameworks/Rust/xitca-web/src/main.rs | 16 +- frameworks/Rust/xitca-web/src/main_axum.rs | 150 ----- frameworks/Rust/xitca-web/src/main_iou.rs | 162 +++-- frameworks/Rust/xitca-web/src/main_orm.rs | 67 ++ frameworks/Rust/xitca-web/src/ser.rs | 41 +- frameworks/Rust/xitca-web/src/util.rs | 40 +- .../Rust/xitca-web/xitca-web-axum.dockerfile | 10 - .../Rust/xitca-web/xitca-web-orm.dockerfile | 10 + 15 files changed, 945 insertions(+), 685 deletions(-) create mode 100644 frameworks/Rust/xitca-web/src/db_diesel_async.rs create mode 100644 frameworks/Rust/xitca-web/src/db_unrealistic.rs create mode 100644 frameworks/Rust/xitca-web/src/db_util.rs delete mode 100644 frameworks/Rust/xitca-web/src/main_axum.rs create mode 100644 frameworks/Rust/xitca-web/src/main_orm.rs delete mode 100644 frameworks/Rust/xitca-web/xitca-web-axum.dockerfile create mode 100644 frameworks/Rust/xitca-web/xitca-web-orm.dockerfile diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 14daebadc05..71038073ca5 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -1,12 +1,12 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -19,9 +19,9 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -39,59 +39,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "axum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" -dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 0.1.2", - "tower-layer", - "tower-service", -] +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" @@ -114,6 +64,18 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bb8" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b10cf871f3ff2ce56432fddc2615ac7acc3aa22ca321f8fea800846fbb32f188" +dependencies = [ + "async-trait", + "futures-util", + "parking_lot", + "tokio", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -135,6 +97,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + [[package]] name = "byteorder" version = "1.5.0" @@ -143,15 +111,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.1.18" +version = "1.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" dependencies = [ "shlex", ] @@ -230,6 +198,20 @@ dependencies = [ "r2d2", ] +[[package]] +name = "diesel-async" +version = "0.5.0" +source = "git+https://github.com/weiznich/diesel_async?rev=5b8262b#5b8262b86d8ed0e13adbbc4aee39500b9931ef8d" +dependencies = [ + "async-trait", + "bb8", + "diesel", + "futures-util", + "scoped-futures", + "tokio", + "tokio-postgres", +] + [[package]] name = "diesel_derives" version = "2.2.3" @@ -289,18 +271,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - [[package]] name = "fnv" version = "1.0.7" @@ -316,12 +286,39 @@ 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", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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" @@ -335,6 +332,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", + "futures-macro", + "futures-sink", "futures-task", "pin-project-lite", "pin-utils", @@ -364,9 +363,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "heck" @@ -389,15 +388,6 @@ 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 = "http" version = "1.1.0" @@ -409,34 +399,11 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -472,11 +439,20 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libmimalloc-sys" @@ -488,17 +464,6 @@ dependencies = [ "libc", ] -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", - "redox_syscall", -] - [[package]] name = "lock_api" version = "0.4.12" @@ -515,12 +480,6 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "md-5" version = "0.10.6" @@ -546,12 +505,6 @@ dependencies = [ "libmimalloc-sys", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -569,7 +522,7 @@ dependencies = [ "hermit-abi", "libc", "wasi", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -583,18 +536,21 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +dependencies = [ + "portable-atomic", +] [[package]] name = "parking_lot" @@ -643,26 +599,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pin-project-lite" version = "0.2.14" @@ -675,6 +611,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + [[package]] name = "postgres-protocol" version = "0.6.7" @@ -695,9 +637,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02048d9e032fb3cc3413bbf7b83a15d84a5d419778e2628751896d856498eee9" +checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" dependencies = [ "bytes", "fallible-iterator", @@ -715,9 +657,9 @@ dependencies = [ [[package]] name = "pq-sys" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92c30dd81695321846d4dfe348da67b1752ebb61cd1549d203a7b57e323c435" +checksum = "f6cc05d7ea95200187117196eee9edd0644424911821aeb28a18ce60ea0b8793" dependencies = [ "vcpkg", ] @@ -783,9 +725,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -796,12 +738,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - [[package]] name = "ryu" version = "1.0.18" @@ -816,41 +752,26 @@ checksum = "d4d5cd6d4f24f3ab107e949ab424738cf55b03deddce3b184c46985d7b1394ef" dependencies = [ "itoap", "ryu", - "sailfish-macros", "version_check", ] [[package]] -name = "sailfish-compiler" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7254ec7b3651f7f723a9073153f5dcddc1f2bf1bf8d1b23ac71c236ef6360d2b" -dependencies = [ - "filetime", - "home", - "memchr", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sailfish-macros" -version = "0.9.0" +name = "scheduled-thread-pool" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00812289fe1891c191cc2d9db461352fc410619e07ec2bb748faaa06412619d0" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" dependencies = [ - "proc-macro2", - "sailfish-compiler", + "parking_lot", ] [[package]] -name = "scheduled-thread-pool" -version = "0.2.7" +name = "scoped-futures" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +checksum = "b1473e24c637950c9bd38763220bea91ec3e095a89f672bbd7a10d03e77ba467" dependencies = [ - "parking_lot", + "cfg-if", + "pin-utils", ] [[package]] @@ -891,16 +812,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" -dependencies = [ - "itoa", - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -977,7 +888,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1005,27 +916,15 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" - [[package]] name = "tinyvec" version = "1.8.0" @@ -1048,13 +947,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", + "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2 0.5.7", - "windows-sys 0.52.0", + "windows-sys", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand", + "socket2 0.5.7", + "tokio", + "tokio-util", + "whoami", ] [[package]] @@ -1073,55 +999,24 @@ dependencies = [ ] [[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.5.2" +name = "tokio-util" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ - "bitflags 2.6.0", "bytes", - "http", - "http-body", - "http-body-util", + "futures-core", + "futures-sink", "pin-project-lite", - "tower-layer", - "tower-service", + "tokio", ] -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - [[package]] name = "tracing" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-core", ] @@ -1131,9 +1026,6 @@ name = "tracing-core" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] [[package]] name = "typenum" @@ -1143,9 +1035,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" @@ -1155,18 +1047,18 @@ checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "vcpkg" @@ -1186,6 +1078,88 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", + "web-sys", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1217,15 +1191,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -1292,9 +1257,8 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "xitca-codegen" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b646a30e6d44093beaae1bbe5dda664e8466d387663fc9d61c55fb2d78424" +version = "0.4.0" +source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" dependencies = [ "quote", "syn", @@ -1302,9 +1266,8 @@ dependencies = [ [[package]] name = "xitca-http" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b5b036e32261c69d4f0e81bcb28c2e058ed569518959336fd75fc086208d3f" +version = "0.7.0" +source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" dependencies = [ "futures-core", "http", @@ -1336,12 +1299,13 @@ dependencies = [ [[package]] name = "xitca-postgres" -version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=0cda225#0cda2254f98b40f21bc3170dd8983f16444f0bd0" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46046cb7a3d4fcfb5c858bab0651c73bb45c0c5f9f0f53dd4eb991f2d6e5d6f4" dependencies = [ "fallible-iterator", + "futures-core", "percent-encoding", - "phf", "postgres-protocol", "postgres-types", "tokio", @@ -1350,6 +1314,19 @@ dependencies = [ "xitca-unsafe-collection", ] +[[package]] +name = "xitca-postgres-diesel" +version = "0.1.0" +source = "git+https://github.com/fakeshadow/xitca-postgres-diesel?rev=ae93ee9#ae93ee95277e281fb87b351c42bfc2fc5a56703a" +dependencies = [ + "diesel", + "diesel-async", + "futures-core", + "scoped-futures", + "tokio", + "xitca-postgres", +] + [[package]] name = "xitca-router" version = "0.3.0" @@ -1361,9 +1338,8 @@ dependencies = [ [[package]] name = "xitca-server" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40a05f18780f1de843c5077583e4650b08d0518fcf9cf7948e28bc92e489736" +version = "0.5.0" +source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" dependencies = [ "socket2 0.5.7", "tokio", @@ -1376,9 +1352,8 @@ dependencies = [ [[package]] name = "xitca-service" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b093ca75b264924773d53e445de08a937100bf1cbe4f62d4dc2c0d04a3ba4b" +version = "0.3.0" +source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" [[package]] name = "xitca-unsafe-collection" @@ -1394,42 +1369,39 @@ name = "xitca-web" version = "0.1.0" dependencies = [ "atoi", - "axum", "diesel", + "diesel-async", "futures-core", - "http-body", + "futures-util", + "httparse", "mimalloc", "rand", "sailfish", "serde", "serde_json", "tokio", - "tower", - "tower-http", + "tokio-uring", "xitca-http", "xitca-io", "xitca-postgres", + "xitca-postgres-diesel", "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.6.2", + "xitca-web 0.7.0", ] [[package]] name = "xitca-web" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4f8f16791ea2a8845f617f1e87887f917835e0603d01f03a51e638b9613d0c" +version = "0.7.0" +source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" dependencies = [ "futures-core", - "http-body", "pin-project-lite", "serde", "serde_json", "serde_urlencoded", "tokio", - "tower-layer", - "tower-service", "xitca-codegen", "xitca-http", "xitca-server", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 6c16d2d7a54..03d7098e796 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -19,9 +19,9 @@ path = "./src/main_wasm.rs" required-features = ["web"] [[bin]] -name = "xitca-web-axum" -path = "./src/main_axum.rs" -required-features = ["axum", "io-uring", "perf", "pg-sync", "template"] +name = "xitca-web-orm" +path = "./src/main_orm.rs" +required-features = ["pg-orm-async", "template", "web-codegen"] [[bin]] name = "xitca-web-sync" @@ -29,55 +29,56 @@ path = "./src/main_sync.rs" required-features = ["pg-orm", "template", "web-codegen"] [features] -# pg optional +# pg client optional pg = ["dep:xitca-postgres"] -# pg send/sync optional -pg-sync = ["dep:xitca-postgres"] -# pg orm optional -pg-orm = ["dep:diesel"] +# diesel orm optional +pg-orm = ["diesel/r2d2"] +# diesel async orm optional +pg-orm-async = ["dep:diesel", "dep:diesel-async", "dep:xitca-postgres-diesel", "futures-util"] # http router optional router = ["xitca-http/router"] # web optional web = ["dep:xitca-web"] -# web codegen optional +# web with macros optional web-codegen = ["xitca-web/codegen", "xitca-web/urlencoded"] # template optional template = ["dep:sailfish"] # io-uring optional -io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"] -# axum optional -axum = ["dep:axum", "dep:http-body", "dep:tower", "dep:tower-http", "xitca-web/tower-http-compat" ] +io-uring = ["dep:tokio-uring", "xitca-http/io-uring", "xitca-server/io-uring"] # unrealistic performance optimization perf = ["dep:mimalloc", "tokio/parking_lot"] [dependencies] -xitca-http = "0.6" -xitca-io = "0.4" -xitca-server = "0.4" -xitca-service = "0.2" +xitca-http = "0.7" +xitca-io = "0.4.1" +xitca-server = "0.5" +xitca-service = "0.3" xitca-unsafe-collection = "0.2" atoi = "2" +httparse = "1" serde = { version = "1" } serde_json = { version = "1" } # web optional -xitca-web = { version = "0.6", features = ["json"], optional = true } +xitca-web = { version = "0.7", features = ["json"], optional = true } # raw-pg optional -xitca-postgres = { version = "0.1", optional = true } +xitca-postgres = { version = "0.2", optional = true } # orm optional -diesel = { version = "2", features = ["postgres", "r2d2"], optional = true } +diesel = { version = "2", features = ["postgres"], optional = true } + +# orm async optional +diesel-async = { version = "0.5", features = ["bb8", "postgres"], optional = true } +xitca-postgres-diesel = { version = "0.1", optional = true } +futures-util = { version = "0.3", default-features = false, optional = true } # template optional -sailfish = { version = "0.9", default-features = false, features = ["derive", "perf-inline"], optional = true } +sailfish = { version = "0.9", default-features = false, features = ["perf-inline"], optional = true } -# axum optional -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 } +# io-uring optional +tokio-uring = { version = "0.5", optional = true } # perf optional mimalloc = { version = "0.1", default-features = false, optional = true } @@ -95,5 +96,13 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "0cda225" } +xitca-postgres-diesel = { git = "https://github.com/fakeshadow/xitca-postgres-diesel", rev = "ae93ee9" } + +diesel-async = { git = "https://github.com/weiznich/diesel_async", rev = "5b8262b" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } + +xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } +xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } +xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } +xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } +xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } diff --git a/frameworks/Rust/xitca-web/benchmark_config.json b/frameworks/Rust/xitca-web/benchmark_config.json index f4c152eb729..973d1961472 100755 --- a/frameworks/Rust/xitca-web/benchmark_config.json +++ b/frameworks/Rust/xitca-web/benchmark_config.json @@ -35,14 +35,14 @@ "approach": "Stripped", "classification": "Platform", "database": "Postgres", - "framework": "xitca-web [unrealistic]", + "framework": "xitca-web", "language": "Rust", "orm": "Raw", "platform": "None", "webserver": "xitca-server", "os": "Linux", "database_os": "Linux", - "display_name": "xitca-web [unrealistic]", + "display_name": "xitca-web [iou]", "notes": "", "versus": "" }, @@ -53,7 +53,7 @@ "approach": "Realistic", "classification": "Micro", "database": "none", - "framework": "xitca-web [wasm]", + "framework": "xitca-web", "language": "rust", "orm": "raw", "platform": "none", @@ -64,7 +64,7 @@ "notes": "", "versus": "" }, - "axum": { + "orm": { "json_url": "/json", "plaintext_url": "/plaintext", "db_url": "/db", @@ -73,16 +73,16 @@ "update_url": "/updates?q=", "port": 8080, "approach": "realistic", - "classification": "micro", + "classification": "fullstack", "database": "postgres", - "framework": "axum [xitca]", + "framework": "xitca-web", "language": "rust", - "orm": "raw", + "orm": "full", "platform": "none", "webserver": "xitca-server", "os": "linux", "database_os": "linux", - "display_name": "axum [xitca]", + "display_name": "xitca-web [orm]", "notes": "", "versus": "" }, @@ -97,7 +97,7 @@ "approach": "realistic", "classification": "micro", "database": "postgres", - "framework": "xitca-web [sync]", + "framework": "xitca-web", "language": "rust", "orm": "full", "platform": "none", diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index 818804341b1..ad75d6f8bbe 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,101 +1,63 @@ -// clippy is dumb and have no idea what should be lazy or not -#![allow(clippy::unnecessary_lazy_evaluations)] +#[path = "./db_util.rs"] +mod db_util; -use xitca_io::bytes::BytesMut; -use xitca_postgres::{pipeline::Pipeline, pool::Pool, AsyncLendingIterator, Type}; +use std::cell::RefCell; + +use xitca_postgres::{ + iter::AsyncLendingIterator, pipeline::Pipeline, pool::Pool, statement::Statement, Execute, ExecuteMut, +}; use super::{ ser::{Fortune, Fortunes, World}, - util::{bulk_update_gen, HandleResult, Rand, DB_URL}, + util::{HandleResult, DB_URL}, }; +use db_util::{sort_update_params, update_query, Shared, FORTUNE_STMT, WORLD_STMT}; + pub struct Client { pool: Pool, - #[cfg(not(feature = "pg-sync"))] - shared: std::cell::RefCell, - #[cfg(feature = "pg-sync")] - shared: std::sync::Mutex, + shared: RefCell, updates: Box<[Box]>, } -type Shared = (Rand, BytesMut); - -const FORTUNE_SQL: &str = "SELECT * FROM fortune"; - -const FORTUNE_SQL_TYPES: &[Type] = &[]; - -const WORLD_SQL: &str = "SELECT * FROM world WHERE id=$1"; - -const WORLD_SQL_TYPES: &[Type] = &[Type::INT4]; - -fn update_query(num: usize) -> Box { - bulk_update_gen(|query| { - use std::fmt::Write; - (1..=num).fold((1, query), |(idx, query), _| { - write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); - (idx + 2, query) - }); - }) - .into_boxed_str() -} - pub async fn create() -> HandleResult { - let pool = Pool::builder(DB_URL).capacity(1).build()?; - - let shared = (Rand::default(), BytesMut::new()); - - let updates = core::iter::once(Box::from("")) - .chain((1..=500).map(update_query)) - .collect(); - Ok(Client { - pool, - #[cfg(not(feature = "pg-sync"))] - shared: std::cell::RefCell::new(shared), - #[cfg(feature = "pg-sync")] - shared: std::sync::Mutex::new(shared), - updates, + pool: Pool::builder(DB_URL).capacity(1).build()?, + shared: Default::default(), + updates: core::iter::once(Box::from("")) + .chain((1..=500).map(update_query)) + .collect(), }) } impl Client { - #[cfg(not(feature = "pg-sync"))] - fn shared(&self) -> std::cell::RefMut<'_, Shared> { - self.shared.borrow_mut() - } - - #[cfg(feature = "pg-sync")] - fn shared(&self) -> std::sync::MutexGuard<'_, Shared> { - self.shared.lock().unwrap() - } - pub async fn get_world(&self) -> HandleResult { let mut conn = self.pool.get().await?; - let stmt = conn.prepare(WORLD_SQL, WORLD_SQL_TYPES).await?; - let id = self.shared().0.gen_id(); - let mut res = conn.consume().query_raw(&stmt, [id])?; - let row = res.try_next().await?.ok_or_else(|| "World does not exist")?; - Ok(World::new(row.get_raw(0), row.get_raw(1))) + let stmt = WORLD_STMT.execute_mut(&mut conn).await?; + let id = self.shared.borrow_mut().0.gen_id(); + let mut res = stmt.bind([id]).query(&conn.consume()).await?; + let row = res.try_next().await?.ok_or("request World does not exist")?; + Ok(World::new(row.get(0), row.get(1))) } pub async fn get_worlds(&self, num: u16) -> HandleResult> { let len = num as usize; let mut conn = self.pool.get().await?; - let stmt = conn.prepare(WORLD_SQL, WORLD_SQL_TYPES).await?; + let stmt = WORLD_STMT.execute_mut(&mut conn).await?; let mut res = { - let (ref mut rng, ref mut buf) = *self.shared(); + let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); let mut pipe = Pipeline::with_capacity_from_buf(len, buf); - (0..num).try_for_each(|_| pipe.query_raw(&stmt, [rng.gen_id()]))?; - conn.consume().pipeline(pipe)? + (0..num).try_for_each(|_| stmt.bind([rng.gen_id()]).query_mut(&mut pipe))?; + pipe.query(&conn.consume())? }; let mut worlds = Vec::with_capacity(len); 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))) + worlds.push(World::new(row.get(0), row.get(1))) } } @@ -105,25 +67,24 @@ impl Client { pub async fn update(&self, num: u16) -> HandleResult> { let len = num as usize; - let update = self.updates.get(len).ok_or_else(|| "num out of bound")?; - + let update = self.updates.get(len).ok_or("request num is out of range")?; let mut conn = self.pool.get().await?; - let world_stmt = conn.prepare(WORLD_SQL, WORLD_SQL_TYPES).await?; - let update_stmt = conn.prepare(update, &[]).await?; + let world_stmt = WORLD_STMT.execute_mut(&mut conn).await?; + let update_stmt = Statement::named(update, &[]).execute_mut(&mut conn).await?; let mut params = Vec::with_capacity(len); let mut res = { - let (ref mut rng, ref mut buf) = *self.shared(); + let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); let mut pipe = Pipeline::with_capacity_from_buf(len + 1, buf); (0..num).try_for_each(|_| { let w_id = rng.gen_id(); let r_id = rng.gen_id(); params.push([w_id, r_id]); - pipe.query_raw(&world_stmt, [w_id]) + world_stmt.bind([w_id]).query_mut(&mut pipe) })?; - pipe.query_raw(&update_stmt, sort_update_params(¶ms))?; - conn.consume().pipeline(pipe)? + update_stmt.bind(sort_update_params(¶ms)).query_mut(&mut pipe)?; + pipe.query(&conn.consume())? }; let mut worlds = Vec::with_capacity(len); @@ -133,7 +94,7 @@ impl Client { while let Some(mut item) = res.try_next().await? { while let Some(row) = item.try_next().await? { let r_id = r_ids.next().unwrap()[1]; - worlds.push(World::new(row.get_raw(0), r_id)) + worlds.push(World::new(row.get(0), r_id)) } } @@ -145,11 +106,11 @@ impl Client { items.push(Fortune::new(0, "Additional fortune added at request time.")); let mut conn = self.pool.get().await?; - let stmt = conn.prepare(FORTUNE_SQL, FORTUNE_SQL_TYPES).await?; - let mut res = conn.consume().query_raw::<[i32; 0]>(&stmt, [])?; + let stmt = FORTUNE_STMT.execute_mut(&mut conn).await?; + let mut res = stmt.query(&conn.consume()).await?; while let Some(row) = res.try_next().await? { - items.push(Fortune::new(row.get_raw(0), row.get_raw::(1))); + items.push(Fortune::new(row.get(0), row.get::(1))); } items.sort_by(|it, next| it.message.cmp(&next.message)); @@ -157,33 +118,3 @@ impl Client { Ok(Fortunes::new(items)) } } - -fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator { - let mut params = params.to_owned(); - params.sort_by(|a, b| a[0].cmp(&b[0])); - - struct ParamIter(I); - - impl Iterator for ParamIter - where - I: Iterator, - { - type Item = I::Item; - - #[inline] - fn next(&mut self) -> Option { - self.0.next() - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.0.size_hint() - } - } - - // impl depends on compiler optimization to flat Vec<[T]> to Vec when inferring - // it's size hint. possible to cause runtime panic. - impl ExactSizeIterator for ParamIter where I: Iterator {} - - ParamIter(params.into_iter().flatten()) -} diff --git a/frameworks/Rust/xitca-web/src/db_diesel_async.rs b/frameworks/Rust/xitca-web/src/db_diesel_async.rs new file mode 100644 index 00000000000..fdd93e43a74 --- /dev/null +++ b/frameworks/Rust/xitca-web/src/db_diesel_async.rs @@ -0,0 +1,153 @@ +use std::{ + io, + sync::{Arc, Mutex}, +}; + +use diesel::prelude::*; +use diesel_async::{ + pooled_connection::{bb8, AsyncDieselConnectionManager}, + RunQueryDsl, +}; +use futures_util::{ + future::join, + stream::{FuturesUnordered, TryStreamExt}, +}; +use xitca_postgres_diesel::AsyncPgConnection; + +use crate::{ + ser::{Fortune, Fortunes, World}, + util::{bulk_update_gen, Error, HandleResult, Rand, DB_URL}, +}; + +pub type Pool = Arc<_Pool>; + +pub struct _Pool { + pool: bb8::Pool, + rng: Mutex, +} + +pub async fn create() -> io::Result> { + bb8::Pool::builder() + .max_size(1) + .min_idle(Some(1)) + .test_on_check_out(false) + .build(AsyncDieselConnectionManager::new(DB_URL)) + .await + .map_err(io::Error::other) + .map(|pool| { + Arc::new(_Pool { + pool, + rng: Mutex::new(Rand::default()), + }) + }) +} + +#[cold] +#[inline(never)] +fn not_found() -> Error { + "world not found".into() +} + +impl _Pool { + pub async 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().await?; + world.filter(id.eq(w_id)).load(&mut conn) + } + .await? + .pop() + .ok_or_else(not_found) + } + + pub async fn get_worlds(&self, num: u16) -> HandleResult> { + use crate::schema::world::dsl::*; + { + let mut conn = self.pool.get().await?; + let mut rng = self.rng.lock().unwrap(); + (0..num) + .map(|_| { + let w_id = rng.gen_id(); + let fut = world.filter(id.eq(w_id)).load::(&mut conn); + async { fut.await?.pop().ok_or_else(not_found) } + }) + .collect::>() + } + .try_collect() + .await + } + + pub async fn update(&self, num: u16) -> HandleResult> { + use crate::schema::world::dsl::*; + + let mut rngs = Vec::with_capacity(num as _); + + let (select_res, update_res) = { + let mut conn = self.pool.get().await?; + + let mut rng = self.rng.lock().unwrap(); + + let select = (0..num) + .map(|_| { + let w_id = rng.gen_id(); + let num = rng.gen_id(); + + rngs.push((w_id, num)); + + let fut = world.filter(id.eq(w_id)).load::(&mut conn); + + async move { + fut.await? + .pop() + .map(|mut w| { + w.randomnumber = num; + w + }) + .ok_or_else(not_found) + } + }) + .collect::>(); + + rngs.sort_by(|(a, _), (b, _)| a.cmp(b)); + + let update = diesel::sql_query(update_query(&rngs)).execute(&mut conn); + + join(select.try_collect::>(), update) + } + .await; + + update_res?; + let mut worlds = select_res?; + + worlds.sort_by_key(|w| w.id); + + Ok(worlds) + } + + pub async fn tell_fortune(&self) -> HandleResult { + use crate::schema::fortune::dsl::*; + + let mut items = { + let mut conn = self.pool.get().await?; + fortune.load::(&mut conn) + } + .await?; + + 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)) + } +} + +// diesel does not support high level bulk update api. use raw sql to bypass the limitation. +// relate discussion: https://github.com/diesel-rs/diesel/discussions/2879 +fn update_query(ids: &[(i32, i32)]) -> String { + bulk_update_gen(|query| { + use std::fmt::Write; + ids.iter().for_each(|(w_id, num)| { + write!(query, "({}::int,{}::int),", w_id, num).unwrap(); + }); + }) +} diff --git a/frameworks/Rust/xitca-web/src/db_unrealistic.rs b/frameworks/Rust/xitca-web/src/db_unrealistic.rs new file mode 100644 index 00000000000..7b04449a716 --- /dev/null +++ b/frameworks/Rust/xitca-web/src/db_unrealistic.rs @@ -0,0 +1,130 @@ +//! this module is unrealistic. related issue: +//! https://github.com/TechEmpower/FrameworkBenchmarks/issues/8790 + +#[path = "./db_util.rs"] +mod db_util; + +use std::cell::RefCell; + +use xitca_postgres::{iter::AsyncLendingIterator, pipeline::Pipeline, statement::Statement, Execute, ExecuteMut}; + +use super::{ + ser::{Fortune, Fortunes, World}, + util::{HandleResult, DB_URL}, +}; + +use db_util::{sort_update_params, update_query, Shared, FORTUNE_STMT, WORLD_STMT}; + +pub struct Client { + cli: xitca_postgres::Client, + shared: RefCell, + fortune: Statement, + world: Statement, + updates: Box<[Statement]>, +} + +pub async fn create() -> HandleResult { + let (cli, mut drv) = xitca_postgres::Postgres::new(DB_URL).connect().await?; + + tokio::task::spawn(tokio::task::unconstrained(async move { + while drv.try_next().await?.is_some() {} + HandleResult::Ok(()) + })); + + let world = WORLD_STMT.execute(&cli).await?.leak(); + let fortune = FORTUNE_STMT.execute(&cli).await?.leak(); + + let mut updates = vec![Statement::default()]; + + for update in (1..=500).map(update_query).into_iter() { + let stmt = Statement::named(&update, &[]).execute(&cli).await?.leak(); + updates.push(stmt); + } + + Ok(Client { + cli, + shared: Default::default(), + world, + fortune, + updates: updates.into_boxed_slice(), + }) +} + +impl Client { + pub async fn get_world(&self) -> HandleResult { + let id = self.shared.borrow_mut().0.gen_id(); + let mut res = self.world.bind([id]).query(&self.cli).await?; + let row = res.try_next().await?.ok_or("request World does not exist")?; + Ok(World::new(row.get(0), row.get(1))) + } + + pub async fn get_worlds(&self, num: u16) -> HandleResult> { + let len = num as usize; + + let mut res = { + let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); + let mut pipe = Pipeline::with_capacity_from_buf(len, buf); + (0..num).try_for_each(|_| self.world.bind([rng.gen_id()]).query_mut(&mut pipe))?; + pipe.query(&self.cli)? + }; + + let mut worlds = Vec::with_capacity(len); + + while let Some(mut item) = res.try_next().await? { + while let Some(row) = item.try_next().await? { + worlds.push(World::new(row.get(0), row.get(1))) + } + } + + Ok(worlds) + } + + pub async fn update(&self, num: u16) -> HandleResult> { + let len = num as usize; + + let mut params = Vec::with_capacity(len); + + let mut res = { + let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); + let mut pipe = Pipeline::with_capacity_from_buf(len + 1, buf); + (0..num).try_for_each(|_| { + let w_id = rng.gen_id(); + let r_id = rng.gen_id(); + params.push([w_id, r_id]); + self.world.bind([w_id]).query_mut(&mut pipe) + })?; + self.updates[len] + .bind(sort_update_params(¶ms)) + .query_mut(&mut pipe)?; + pipe.query(&self.cli)? + }; + + let mut worlds = Vec::with_capacity(len); + + let mut r_ids = params.into_iter(); + + while let Some(mut item) = res.try_next().await? { + while let Some(row) = item.try_next().await? { + let r_id = r_ids.next().unwrap()[1]; + worlds.push(World::new(row.get(0), r_id)) + } + } + + Ok(worlds) + } + + pub async fn tell_fortune(&self) -> HandleResult { + let mut items = Vec::with_capacity(32); + items.push(Fortune::new(0, "Additional fortune added at request time.")); + + let mut res = self.fortune.query(&self.cli).await?; + + while let Some(row) = res.try_next().await? { + items.push(Fortune::new(row.get(0), row.get::(1))); + } + + items.sort_by(|it, next| it.message.cmp(&next.message)); + + Ok(Fortunes::new(items)) + } +} diff --git a/frameworks/Rust/xitca-web/src/db_util.rs b/frameworks/Rust/xitca-web/src/db_util.rs new file mode 100644 index 00000000000..19879333427 --- /dev/null +++ b/frameworks/Rust/xitca-web/src/db_util.rs @@ -0,0 +1,53 @@ +use xitca_io::bytes::BytesMut; +use xitca_postgres::{ + statement::{Statement, StatementNamed}, + types::Type, +}; + +use crate::util::{bulk_update_gen, Rand}; + +pub(super) type Shared = (Rand, BytesMut); + +pub(super) const FORTUNE_STMT: StatementNamed = Statement::named("SELECT * FROM fortune", &[]); +pub(super) const WORLD_STMT: StatementNamed = Statement::named("SELECT * FROM world WHERE id=$1", &[Type::INT4]); + +pub(super) fn update_query(num: usize) -> Box { + bulk_update_gen(|query| { + use std::fmt::Write; + (1..=num).fold((1, query), |(idx, query), _| { + write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); + (idx + 2, query) + }); + }) + .into_boxed_str() +} + +pub(super) fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator { + let mut params = params.to_owned(); + params.sort_by(|a, b| a[0].cmp(&b[0])); + + struct ParamIter(I); + + impl Iterator for ParamIter + where + I: Iterator, + { + type Item = I::Item; + + #[inline] + fn next(&mut self) -> Option { + self.0.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } + } + + // impl depends on compiler optimization to flat Vec<[T]> to Vec when inferring + // it's size hint. possible to cause runtime panic. + impl ExactSizeIterator for ParamIter where I: Iterator {} + + ParamIter(params.into_iter().flatten()) +} diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index 710ff577586..b7389fbb821 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -5,18 +5,22 @@ mod util; use xitca_http::{ h1::RequestBody, http::{header::SERVER, StatusCode}, - util::service::{ - route::get, - router::{Router, RouterError}, + util::{ + middleware::context::{Context, ContextBuilder}, + service::{ + route::get, + router::{Router, RouterError}, + }, }, HttpServiceBuilder, }; use xitca_service::{fn_service, Service, ServiceExt}; +use db::Client; use ser::{error_response, IntoResponse, Message, Request, Response}; -use util::{context_mw, HandleResult, QueryParse, SERVER_HEADER_VALUE}; +use util::{HandleResult, QueryParse, State, SERVER_HEADER_VALUE}; -type Ctx<'a> = util::Ctx<'a, Request>; +type Ctx<'a> = Context<'a, Request, State>; fn main() -> std::io::Result<()> { let service = Router::new() @@ -27,7 +31,7 @@ fn main() -> std::io::Result<()> { .insert("/queries", get(fn_service(queries))) .insert("/updates", get(fn_service(updates))) .enclosed_fn(middleware) - .enclosed(context_mw()) + .enclosed(ContextBuilder::new(|| async { db::create().await.map(State::new) })) .enclosed(HttpServiceBuilder::h1().io_uring()); xitca_server::Builder::new() .bind("xitca-web", "0.0.0.0:8080", service)? diff --git a/frameworks/Rust/xitca-web/src/main_axum.rs b/frameworks/Rust/xitca-web/src/main_axum.rs deleted file mode 100644 index 02fdfba8a20..00000000000 --- a/frameworks/Rust/xitca-web/src/main_axum.rs +++ /dev/null @@ -1,150 +0,0 @@ -//! 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; - -use std::sync::Arc; - -use axum::{ - extract::{Json, Query, State}, - http::{ - header::{HeaderValue, SERVER}, - StatusCode, - }, - response::{Html, IntoResponse, Response}, - routing::{get, Router}, -}; -use tower_http::set_header::SetResponseHeaderLayer; - -use crate::{db::Client, ser::Num, tower_compat::TowerHttp}; - -fn main() -> std::io::Result<()> { - let service = TowerHttp::service(|| async { - let cli = db::create().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() - .wait() -} - -async fn plain_text() -> &'static str { - "Hello, World!" -} - -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>, Query(Num(num)): Query) -> impl IntoResponse { - cli.get_worlds(num).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); - -impl IntoResponse for Error { - fn into_response(self) -> Response { - let mut res = self.0.to_string().into_response(); - *res.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; - res - } -} - -// compat module between xitca-http and axum. -mod tower_compat { - use core::{cell::RefCell, fmt, future::Future, marker::PhantomData}; - - use std::net::SocketAddr; - - use http_body::Body; - use xitca_http::{ - bytes::Bytes, - h1::RequestBody, - 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_web::service::tower_http_compat::{CompatReqBody, CompatResBody}; - - pub struct TowerHttp { - service: RefCell, - _p: PhantomData, - } - - impl TowerHttp { - pub fn service( - func: F, - ) -> impl Service, Error = impl fmt::Debug> - where - F: Fn() -> Fut + Send + Sync + Clone, - Fut: Future>, - S: tower::Service, ()>>, Response = Response>, - S::Error: fmt::Debug, - B: Body + Send + 'static, - { - fn_build(move |_| { - let func = func.clone(); - async move { - func().await.map(|service| TowerHttp { - service: RefCell::new(service), - _p: PhantomData, - }) - } - }) - .enclosed(UncheckedReady) - .enclosed(HttpServiceBuilder::h1().io_uring()) - } - } - - impl Service>> for TowerHttp - where - S: tower::Service, ()>>, Response = Response>, - { - type Response = Response>; - type Error = S::Error; - - async fn call(&self, req: Request>) -> Result { - let (parts, ext) = req.into_parts(); - 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_iou.rs b/frameworks/Rust/xitca-web/src/main_iou.rs index f66eb8778e6..7dcf6d1a719 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_iou.rs @@ -1,9 +1,12 @@ -// used as reference of if/how moving from epoll to io-uring(or mixture of the two) make sense for -// network io. +// reference of if/how moving from epoll to io-uring(or mixture of the two) make sense for network io. +// with comment on explaining why some practice are unrealistic +// custom global memory allocator don't affect real world performance in noticeable amount. +// in real world they should be used for reason like security, debug/profiling capability etc. #[global_allocator] static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; +#[path = "db_unrealistic.rs"] mod db; mod ser; mod util; @@ -11,53 +14,138 @@ mod util; use std::{convert::Infallible, io}; use xitca_http::{ - body::ResponseBody, - http::{self, header::SERVER, StatusCode}, - HttpServiceBuilder, + bytes::BufMutWriter, + h1::dispatcher_uring_unreal::{Dispatcher, Request, Response}, + http::StatusCode, }; -use xitca_service::{fn_service, ServiceExt}; +use xitca_io::net::io_uring::TcpStream; +use xitca_service::Service; -use self::{ - ser::{error_response, IntoResponse, Message, Request}, - util::{context_mw, Ctx, QueryParse, SERVER_HEADER_VALUE}, -}; +use self::{ser::Message, util::State}; fn main() -> io::Result<()> { - let service = fn_service(handler) - .enclosed(context_mw()) - .enclosed(HttpServiceBuilder::h1().io_uring()); - xitca_server::Builder::new() - .bind("xitca-iou", "0.0.0.0:8080", service)? - .build() - .wait() + let addr = "0.0.0.0:8080".parse().unwrap(); + + let cores = std::thread::available_parallelism().map(|num| num.get()).unwrap_or(56); + + let handle = core::iter::repeat_with(|| { + std::thread::spawn(move || { + tokio_uring::start(async { + let socket = tokio::net::TcpSocket::new_v4()?; + socket.set_reuseaddr(true)?; + // unrealistic due to following reason: + // 1. this only works good on unix system. + // 2. no resource distribution adjustment between sockets on different threads. causing uneven workload + // where some threads are idle while others busy. resulting in overall increased latency + socket.set_reuseport(true)?; + socket.bind(addr)?; + let listener = socket.listen(1024)?; + + let client = db::create().await.unwrap(); + + // unrealistic http dispatcher. no spec check. no security feature. + let service = Dispatcher::new(handler, State::new(client)); + + loop { + match listener.accept().await { + Ok((stream, _)) => { + let stream = stream.into_std()?; + let stream = TcpStream::from_std(stream); + let service = service.clone(); + tokio::task::spawn_local(async move { + let _ = service.call(stream).await; + }); + } + Err(e) => return Err(e), + }; + } + }) + }) + }) + .take(cores) + .collect::>(); + + // unrealistic due to no signal handling, not shutdown handling. when killing this process all resources that + // need clean async shutdown will be leaked. + for handle in handle { + handle.join().unwrap()?; + } + + Ok(()) } -async fn handler(ctx: Ctx<'_, Request>) -> Result, Infallible> { - let (req, state) = ctx.into_parts(); - let mut res = match req.uri().path() { - "/plaintext" => req.text_response().unwrap(), - "/json" => req.json_response(state, &Message::new()).unwrap(), +async fn handler<'h>(req: Request<'h, '_>, res: Response<'h>, state: &State) -> Response<'h, 3> { + // unrealistic due to no http method check + match req.path.unwrap_or("404") { + // unrealistic due to no dynamic path matching + "/plaintext" => { + // unrealistic due to no body streaming and no post processing. violating middleware feature of xitca-web + res.status(StatusCode::OK) + .header("content-type", "text/plain") + .header("server", "X") + // unrealistic content length header. + .header("content-length", "13") + .body_writer(|buf| Ok::<_, Infallible>(buf.extend_from_slice(b"Hello, World!"))) + .unwrap() + } + "/json" => res + .status(StatusCode::OK) + .header("content-type", "application/json") + .header("server", "X") + // unrealistic content length header. + .header("content-length", "27") + .body_writer(|buf| serde_json::to_writer(BufMutWriter(buf), &Message::new())) + .unwrap(), + // all database related categories are unrealistic. please reference db_unrealistic module for detail. + "/fortunes" => { + use sailfish::TemplateOnce; + let fortunes = state.client.tell_fortune().await.unwrap().render_once().unwrap(); + res.status(StatusCode::OK) + .header("content-type", "text/html; charset=utf-8") + .header("server", "X") + .body(fortunes.as_bytes()) + } "/db" => { + // unrealistic due to no error handling. any db/serialization error will cause process crash. + // the same goes for all following unwraps on database related functions. let world = state.client.get_world().await.unwrap(); - req.json_response(state, &world).unwrap() + json_response(res, state, &world) } - "/queries" => { - let num = req.uri().query().parse_query(); + p if p.starts_with("/queries") => { + let num = path_param(p); let worlds = state.client.get_worlds(num).await.unwrap(); - req.json_response(state, &worlds).unwrap() + json_response(res, state, &worlds) } - "/updates" => { - let num = req.uri().query().parse_query(); + p if p.starts_with("/updates") => { + let num = path_param(p); let worlds = state.client.update(num).await.unwrap(); - req.json_response(state, &worlds).unwrap() - } - "/fortunes" => { - use sailfish::TemplateOnce; - let fortunes = state.client.tell_fortune().await.unwrap().render_once().unwrap(); - req.html_response(fortunes).unwrap() + json_response(res, state, &worlds) } - _ => error_response(StatusCode::NOT_FOUND), + _ => res.status(StatusCode::NOT_FOUND).header("server", "X").body(&[]), + } +} + +fn json_response<'r, DB, T>(res: Response<'r>, state: &State, val: &T) -> Response<'r, 3> +where + T: serde::Serialize, +{ + let buf = &mut *state.write_buf.borrow_mut(); + serde_json::to_writer(BufMutWriter(buf), val).unwrap(); + let res = res + .status(StatusCode::OK) + .header("content-type", "application/json") + .header("server", "X") + .body(buf.as_ref()); + buf.clear(); + res +} + +fn path_param(query: &str) -> u16 { + use atoi::FromRadix10; + let q = if let Some(pos) = query.find("?q") { + u16::from_radix_10(query.split_at(pos + 3).1.as_ref()).0 + } else { + 1 }; - res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); - Ok(res.map(Into::into)) + q.clamp(1, 500) } diff --git a/frameworks/Rust/xitca-web/src/main_orm.rs b/frameworks/Rust/xitca-web/src/main_orm.rs new file mode 100644 index 00000000000..86e8037ac2e --- /dev/null +++ b/frameworks/Rust/xitca-web/src/main_orm.rs @@ -0,0 +1,67 @@ +mod db_diesel_async; +mod schema; +mod ser; +mod util; + +use serde::Serialize; +use xitca_web::{ + codegen::route, + handler::{html::Html, json::Json, query::Query, state::StateRef, text::Text}, + http::{header::SERVER, WebResponse}, + route::get, + App, +}; + +use db_diesel_async::Pool; +use ser::Num; +use util::{HandleResult, SERVER_HEADER_VALUE}; + +fn main() -> std::io::Result<()> { + App::new() + .with_async_state(db_diesel_async::create) + .at("/plaintext", get(Text("Hello, World!"))) + .at("/json", get(Json(ser::Message::new()))) + .at_typed(db) + .at_typed(fortunes) + .at_typed(queries) + .at_typed(updates) + .map(header) + .serve() + .disable_vectored_write() + .bind("0.0.0.0:8080")? + .run() + .wait() +} + +fn header(mut res: WebResponse) -> WebResponse { + res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); + res +} + +#[route("/db", method = get)] +async fn db(StateRef(pool): StateRef<'_, Pool>) -> HandleResult> { + pool.get_world().await.map(Json) +} + +#[route("/fortunes", method = get)] +async fn fortunes(StateRef(pool): StateRef<'_, Pool>) -> HandleResult> { + use sailfish::TemplateOnce; + let html = pool.tell_fortune().await?.render_once()?; + Ok(Html(html)) +} + +#[route("/queries", method = get)] +async fn queries( + Query(Num(num)): Query, + StateRef(pool): StateRef<'_, Pool>, +) -> HandleResult> { + pool.get_worlds(num).await.map(Json) +} + +#[route("/updates", method = get)] +async fn updates( + Query(Num(num)): Query, + StateRef(pool): StateRef<'_, Pool>, +) -> HandleResult> { + pool.update(num).await.map(Json) +} diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index 53dcff13cf0..3c630c54bc6 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -33,7 +33,7 @@ impl Message { pub struct Num(pub u16); -#[cfg_attr(feature = "pg-orm", derive(diesel::Queryable))] +#[cfg_attr(any(feature = "pg-orm", feature = "pg-orm-async"), derive(diesel::Queryable))] pub struct World { pub id: i32, pub randomnumber: i32, @@ -46,7 +46,7 @@ impl World { } } -#[cfg_attr(feature = "pg-orm", derive(diesel::Queryable))] +#[cfg_attr(any(feature = "pg-orm", feature = "pg-orm-async"), derive(diesel::Queryable))] pub struct Fortune { pub id: i32, pub message: Cow<'static, str>, @@ -62,16 +62,41 @@ impl Fortune { } } -// TODO: use another template engine with faster compile time.(preferably with no proc macro) -#[cfg_attr( - feature = "template", - derive(sailfish::TemplateOnce), - template(path = "fortune.stpl", rm_whitespace = true) -)] pub struct Fortunes { items: Vec, } +// this is roughly the code generated by sailfish::TemplateOnce macro. +// using the macro does not have any perf cost and this piece of code is expanded manually to speed up compile time of +// bench to reduce resource usage of bench runner +#[cfg(feature = "template")] +impl sailfish::TemplateOnce for Fortunes { + fn render_once(self) -> sailfish::RenderResult { + use sailfish::runtime::{Buffer, Render}; + + const PREFIX: &str = "\n\nFortunes\n\n\n\n"; + const SUFFIX: &str = "\n
      idmessage
      \n\n"; + + let mut buf = Buffer::with_capacity(1236); + + buf.push_str(PREFIX); + for item in self.items { + buf.push_str(""); + Render::render_escaped(&item.id, &mut buf)?; + buf.push_str(""); + Render::render_escaped(&item.message, &mut buf)?; + buf.push_str(""); + } + buf.push_str(SUFFIX); + + Ok(buf.into_string()) + } + + fn render_once_to(self, _: &mut sailfish::runtime::Buffer) -> Result<(), sailfish::runtime::RenderError> { + unimplemented!("") + } +} + impl Fortunes { #[inline] pub const fn new(items: Vec) -> Self { diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index 62888fb6c26..9183d067f5d 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -54,6 +54,15 @@ pub struct State { pub write_buf: RefCell, } +impl State { + pub fn new(client: DB) -> Self { + Self { + client, + write_buf: Default::default(), + } + } +} + #[cfg(not(target_arch = "wasm32"))] mod non_wasm { use rand::{rngs::SmallRng, Rng, SeedableRng}; @@ -72,37 +81,6 @@ mod non_wasm { self.0.gen_range(1..=10000) } } - - #[cfg(feature = "pg")] - 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 _ - }) - } - } - - #[cfg(feature = "pg")] - 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 deleted file mode 100644 index 3c6271834ea..00000000000 --- a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM rust:1.81 - -ADD ./ /xitca-web -WORKDIR /xitca-web - -RUN cargo build --release --bin xitca-web-axum --features axum,io-uring,perf,pg-sync,template - -EXPOSE 8080 - -CMD ./target/release/xitca-web-axum diff --git a/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile b/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile new file mode 100644 index 00000000000..06e40825b00 --- /dev/null +++ b/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile @@ -0,0 +1,10 @@ +FROM rust:1.81 + +ADD ./ /xitca-web +WORKDIR /xitca-web + +RUN cargo build --release --bin xitca-web-orm --features pg-orm-async,template,web-codegen + +EXPOSE 8080 + +CMD ./target/release/xitca-web-orm From eb5a28687fe3aa976d65c1550c6f2142b1443d0d Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Tue, 15 Oct 2024 01:32:22 +0800 Subject: [PATCH 0834/1766] [xitca-web] new async runtime variant and header fix (#9322) * [xitca-web] reduce duplicate code and header fix * query parse fix * enable new variant of tokio runtime --- frameworks/Rust/xitca-web/.cargo/config.toml | 2 +- frameworks/Rust/xitca-web/Cargo.lock | 106 +++++++-------- frameworks/Rust/xitca-web/Cargo.toml | 24 ++-- .../Rust/xitca-web/benchmark_config.json | 4 +- frameworks/Rust/xitca-web/src/db.rs | 33 +++-- frameworks/Rust/xitca-web/src/db_diesel.rs | 76 ++++------- .../Rust/xitca-web/src/db_diesel_async.rs | 101 +++++---------- .../Rust/xitca-web/src/db_unrealistic.rs | 37 +++--- frameworks/Rust/xitca-web/src/db_util.rs | 121 ++++++++++++------ .../src/{main_iou.rs => main_unrealistic.rs} | 98 +++++++------- frameworks/Rust/xitca-web/src/ser.rs | 4 +- frameworks/Rust/xitca-web/src/util.rs | 32 +---- .../Rust/xitca-web/xitca-web-iou.dockerfile | 10 -- .../xitca-web-unrealistic.dockerfile | 10 ++ 14 files changed, 314 insertions(+), 344 deletions(-) rename frameworks/Rust/xitca-web/src/{main_iou.rs => main_unrealistic.rs} (60%) delete mode 100644 frameworks/Rust/xitca-web/xitca-web-iou.dockerfile create mode 100644 frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile diff --git a/frameworks/Rust/xitca-web/.cargo/config.toml b/frameworks/Rust/xitca-web/.cargo/config.toml index 7d3c09f8a1a..df736010a76 100644 --- a/frameworks/Rust/xitca-web/.cargo/config.toml +++ b/frameworks/Rust/xitca-web/.cargo/config.toml @@ -1,5 +1,5 @@ [build] -rustflags = ["-C", "target-cpu=native"] +rustflags = ["-C", "target-cpu=native", "--cfg", "tokio_unstable"] incremental = false [target.wasm32-wasip1-threads] diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 71038073ca5..070a2e67550 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -117,9 +117,9 @@ checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.1.24" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "shlex", ] @@ -288,9 +288,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -298,15 +298,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -315,21 +315,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-macro", @@ -441,9 +441,9 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -545,12 +545,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "parking_lot" @@ -611,12 +608,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "postgres-protocol" version = "0.6.7" @@ -666,9 +657,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -943,8 +934,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +source = "git+https://github.com/tokio-rs/tokio.git?rev=512e9de#512e9decfb683d22f4a145459142542caa0894c9" dependencies = [ "backtrace", "bytes", @@ -1086,9 +1076,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -1097,9 +1087,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -1112,9 +1102,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1122,9 +1112,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -1135,15 +1125,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -1258,7 +1248,7 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "xitca-codegen" version = "0.4.0" -source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" +source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" dependencies = [ "quote", "syn", @@ -1267,7 +1257,7 @@ dependencies = [ [[package]] name = "xitca-http" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" +source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" dependencies = [ "futures-core", "http", @@ -1314,6 +1304,22 @@ dependencies = [ "xitca-unsafe-collection", ] +[[package]] +name = "xitca-postgres" +version = "0.3.0" +source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" +dependencies = [ + "fallible-iterator", + "futures-core", + "percent-encoding", + "postgres-protocol", + "postgres-types", + "tokio", + "tracing", + "xitca-io", + "xitca-unsafe-collection", +] + [[package]] name = "xitca-postgres-diesel" version = "0.1.0" @@ -1324,7 +1330,7 @@ dependencies = [ "futures-core", "scoped-futures", "tokio", - "xitca-postgres", + "xitca-postgres 0.2.1", ] [[package]] @@ -1339,7 +1345,7 @@ dependencies = [ [[package]] name = "xitca-server" version = "0.5.0" -source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" +source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" dependencies = [ "socket2 0.5.7", "tokio", @@ -1353,7 +1359,7 @@ dependencies = [ [[package]] name = "xitca-service" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" +source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" [[package]] name = "xitca-unsafe-collection" @@ -1383,7 +1389,7 @@ dependencies = [ "tokio-uring", "xitca-http", "xitca-io", - "xitca-postgres", + "xitca-postgres 0.3.0", "xitca-postgres-diesel", "xitca-server", "xitca-service", @@ -1394,7 +1400,7 @@ dependencies = [ [[package]] name = "xitca-web" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=d3066ba#d3066ba5fc65e89c8a20890dd529f05818c853d6" +source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" dependencies = [ "futures-core", "pin-project-lite", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 03d7098e796..c547c16de48 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -9,9 +9,9 @@ path = "./src/main.rs" required-features = ["io-uring", "pg", "router", "template"] [[bin]] -name = "xitca-web-iou" -path = "./src/main_iou.rs" -required-features = ["io-uring", "perf", "pg", "template"] +name = "xitca-web-unrealistic" +path = "./src/main_unrealistic.rs" +required-features = ["perf", "pg", "template"] [[bin]] name = "xitca-web-wasm" @@ -34,7 +34,7 @@ pg = ["dep:xitca-postgres"] # diesel orm optional pg-orm = ["diesel/r2d2"] # diesel async orm optional -pg-orm-async = ["dep:diesel", "dep:diesel-async", "dep:xitca-postgres-diesel", "futures-util"] +pg-orm-async = ["dep:diesel", "dep:diesel-async", "dep:xitca-postgres-diesel", "dep:futures-util"] # http router optional router = ["xitca-http/router"] # web optional @@ -64,7 +64,7 @@ serde_json = { version = "1" } xitca-web = { version = "0.7", features = ["json"], optional = true } # raw-pg optional -xitca-postgres = { version = "0.2", optional = true } +xitca-postgres = { version = "0.3", optional = true } # orm optional diesel = { version = "2", features = ["postgres"], optional = true } @@ -100,9 +100,11 @@ xitca-postgres-diesel = { git = "https://github.com/fakeshadow/xitca-postgres-di diesel-async = { git = "https://github.com/weiznich/diesel_async", rev = "5b8262b" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } - -xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } -xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } -xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } -xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } -xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "d3066ba" } +tokio = { git = "https://github.com/tokio-rs/tokio.git", rev = "512e9de" } + +xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } +xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } +xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } +xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } +xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } +xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } diff --git a/frameworks/Rust/xitca-web/benchmark_config.json b/frameworks/Rust/xitca-web/benchmark_config.json index 973d1961472..db81e362742 100755 --- a/frameworks/Rust/xitca-web/benchmark_config.json +++ b/frameworks/Rust/xitca-web/benchmark_config.json @@ -24,7 +24,7 @@ "notes": "", "versus": "" }, - "iou": { + "unrealistic": { "json_url": "/json", "plaintext_url": "/plaintext", "db_url": "/db", @@ -42,7 +42,7 @@ "webserver": "xitca-server", "os": "Linux", "database_os": "Linux", - "display_name": "xitca-web [iou]", + "display_name": "xitca-web [unrealistic]", "notes": "", "versus": "" }, diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index ad75d6f8bbe..abb9ef10870 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,18 +1,16 @@ #[path = "./db_util.rs"] mod db_util; -use std::cell::RefCell; +use core::cell::RefCell; -use xitca_postgres::{ - iter::AsyncLendingIterator, pipeline::Pipeline, pool::Pool, statement::Statement, Execute, ExecuteMut, -}; +use xitca_postgres::{iter::AsyncLendingIterator, pipeline::Pipeline, pool::Pool, statement::Statement, Execute}; use super::{ ser::{Fortune, Fortunes, World}, util::{HandleResult, DB_URL}, }; -use db_util::{sort_update_params, update_query, Shared, FORTUNE_STMT, WORLD_STMT}; +use db_util::{not_found, sort_update_params, update_query_from_num, Shared, FORTUNE_STMT, WORLD_STMT}; pub struct Client { pool: Pool, @@ -25,7 +23,7 @@ pub async fn create() -> HandleResult { pool: Pool::builder(DB_URL).capacity(1).build()?, shared: Default::default(), updates: core::iter::once(Box::from("")) - .chain((1..=500).map(update_query)) + .chain((1..=500).map(update_query_from_num)) .collect(), }) } @@ -33,10 +31,10 @@ pub async fn create() -> HandleResult { impl Client { pub async fn get_world(&self) -> HandleResult { let mut conn = self.pool.get().await?; - let stmt = WORLD_STMT.execute_mut(&mut conn).await?; + let stmt = WORLD_STMT.execute(&mut conn).await?; let id = self.shared.borrow_mut().0.gen_id(); let mut res = stmt.bind([id]).query(&conn.consume()).await?; - let row = res.try_next().await?.ok_or("request World does not exist")?; + let row = res.try_next().await?.ok_or_else(not_found)?; Ok(World::new(row.get(0), row.get(1))) } @@ -44,21 +42,20 @@ impl Client { let len = num as usize; let mut conn = self.pool.get().await?; - let stmt = WORLD_STMT.execute_mut(&mut conn).await?; + let stmt = WORLD_STMT.execute(&mut conn).await?; let mut res = { let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); let mut pipe = Pipeline::with_capacity_from_buf(len, buf); - (0..num).try_for_each(|_| stmt.bind([rng.gen_id()]).query_mut(&mut pipe))?; + (0..num).try_for_each(|_| stmt.bind([rng.gen_id()]).query(&mut pipe))?; pipe.query(&conn.consume())? }; let mut worlds = Vec::with_capacity(len); while let Some(mut item) = res.try_next().await? { - while let Some(row) = item.try_next().await? { - worlds.push(World::new(row.get(0), row.get(1))) - } + let row = item.try_next().await?.ok_or_else(not_found)?; + worlds.push(World::new(row.get(0), row.get(1))); } Ok(worlds) @@ -69,8 +66,8 @@ impl Client { let update = self.updates.get(len).ok_or("request num is out of range")?; let mut conn = self.pool.get().await?; - let world_stmt = WORLD_STMT.execute_mut(&mut conn).await?; - let update_stmt = Statement::named(update, &[]).execute_mut(&mut conn).await?; + let world_stmt = WORLD_STMT.execute(&mut conn).await?; + let update_stmt = Statement::named(update, &[]).execute(&mut conn).await?; let mut params = Vec::with_capacity(len); @@ -81,9 +78,9 @@ impl Client { let w_id = rng.gen_id(); let r_id = rng.gen_id(); params.push([w_id, r_id]); - world_stmt.bind([w_id]).query_mut(&mut pipe) + world_stmt.bind([w_id]).query(&mut pipe) })?; - update_stmt.bind(sort_update_params(¶ms)).query_mut(&mut pipe)?; + update_stmt.bind(sort_update_params(¶ms)).query(&mut pipe)?; pipe.query(&conn.consume())? }; @@ -106,7 +103,7 @@ impl Client { items.push(Fortune::new(0, "Additional fortune added at request time.")); let mut conn = self.pool.get().await?; - let stmt = FORTUNE_STMT.execute_mut(&mut conn).await?; + let stmt = FORTUNE_STMT.execute(&mut conn).await?; let mut res = stmt.query(&conn.consume()).await?; while let Some(row) = res.try_next().await? { diff --git a/frameworks/Rust/xitca-web/src/db_diesel.rs b/frameworks/Rust/xitca-web/src/db_diesel.rs index cf19768ac9f..1675a7c2cd1 100644 --- a/frameworks/Rust/xitca-web/src/db_diesel.rs +++ b/frameworks/Rust/xitca-web/src/db_diesel.rs @@ -1,3 +1,6 @@ +#[path = "./db_util.rs"] +mod db_util; + use std::{ io, sync::{Arc, Mutex}, @@ -7,9 +10,11 @@ use diesel::{prelude::*, r2d2}; use crate::{ ser::{Fortune, Fortunes, World}, - util::{bulk_update_gen, Error, HandleResult, Rand, DB_URL}, + util::{HandleResult, Rand, DB_URL}, }; +use db_util::{not_found, update_query_from_ids}; + pub type Pool = Arc<_Pool>; pub struct _Pool { @@ -34,12 +39,6 @@ pub fn create() -> io::Result> { }) } -#[cold] -#[inline(never)] -fn not_found() -> Error { - "world not found".into() -} - impl _Pool { pub fn get_world(&self) -> HandleResult { use crate::schema::world::dsl::*; @@ -53,16 +52,12 @@ impl _Pool { 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() + core::iter::repeat_with(|| { + let w_id = self.rng.lock().unwrap().gen_id(); + world.filter(id.eq(w_id)).load(&mut conn)?.pop().ok_or_else(not_found) + }) + .take(num as _) + .collect() } pub fn update(&self, num: u16) -> HandleResult> { @@ -75,30 +70,20 @@ impl _Pool { rngs.sort_by(|(a, _), (b, _)| a.cmp(b)); - let mut worlds = { - let mut conn = self.pool.get()?; + let update_sql = update_query_from_ids(&rngs); - let worlds = rngs - .iter() - .map(|(w_id, num)| { - world - .filter(id.eq(w_id)) - .load::(&mut conn)? - .pop() - .map(|mut w| { - w.randomnumber = *num; - w - }) - .ok_or_else(not_found) - }) - .collect::>>()?; - - diesel::sql_query(update_query(&rngs)).execute(&mut conn)?; - - worlds - }; + let mut conn = self.pool.get()?; + + let worlds = rngs + .into_iter() + .map(|(w_id, num)| { + let mut w: World = world.filter(id.eq(w_id)).load(&mut conn)?.pop().ok_or_else(not_found)?; + w.randomnumber = num; + Ok(w) + }) + .collect::>>()?; - worlds.sort_by_key(|w| w.id); + diesel::sql_query(update_sql).execute(&mut conn)?; Ok(worlds) } @@ -108,7 +93,7 @@ impl _Pool { let mut items = { let mut conn = self.pool.get()?; - fortune.load::(&mut conn)? + fortune.load(&mut conn)? }; items.push(Fortune::new(0, "Additional fortune added at request time.")); @@ -117,14 +102,3 @@ impl _Pool { Ok(Fortunes::new(items)) } } - -// diesel does not support high level bulk update api. use raw sql to bypass the limitation. -// relate discussion: https://github.com/diesel-rs/diesel/discussions/2879 -fn update_query(ids: &[(i32, i32)]) -> String { - bulk_update_gen(|query| { - use std::fmt::Write; - ids.iter().for_each(|(w_id, num)| { - write!(query, "({}::int,{}::int),", w_id, num).unwrap(); - }); - }) -} diff --git a/frameworks/Rust/xitca-web/src/db_diesel_async.rs b/frameworks/Rust/xitca-web/src/db_diesel_async.rs index fdd93e43a74..e3ee7e895fd 100644 --- a/frameworks/Rust/xitca-web/src/db_diesel_async.rs +++ b/frameworks/Rust/xitca-web/src/db_diesel_async.rs @@ -1,7 +1,7 @@ -use std::{ - io, - sync::{Arc, Mutex}, -}; +#[path = "./db_util.rs"] +mod db_util; + +use std::{io, sync::Mutex}; use diesel::prelude::*; use diesel_async::{ @@ -16,17 +16,17 @@ use xitca_postgres_diesel::AsyncPgConnection; use crate::{ ser::{Fortune, Fortunes, World}, - util::{bulk_update_gen, Error, HandleResult, Rand, DB_URL}, + util::{HandleResult, Rand, DB_URL}, }; -pub type Pool = Arc<_Pool>; +use db_util::{not_found, update_query_from_ids}; -pub struct _Pool { +pub struct Pool { pool: bb8::Pool, rng: Mutex, } -pub async fn create() -> io::Result> { +pub async fn create() -> io::Result { bb8::Pool::builder() .max_size(1) .min_idle(Some(1)) @@ -34,21 +34,13 @@ pub async fn create() -> io::Result> { .build(AsyncDieselConnectionManager::new(DB_URL)) .await .map_err(io::Error::other) - .map(|pool| { - Arc::new(_Pool { - pool, - rng: Mutex::new(Rand::default()), - }) + .map(|pool| Pool { + pool, + rng: Mutex::new(Rand::default()), }) } -#[cold] -#[inline(never)] -fn not_found() -> Error { - "world not found".into() -} - -impl _Pool { +impl Pool { pub async fn get_world(&self) -> HandleResult { use crate::schema::world::dsl::*; { @@ -66,13 +58,13 @@ impl _Pool { { let mut conn = self.pool.get().await?; let mut rng = self.rng.lock().unwrap(); - (0..num) - .map(|_| { - let w_id = rng.gen_id(); - let fut = world.filter(id.eq(w_id)).load::(&mut conn); - async { fut.await?.pop().ok_or_else(not_found) } - }) - .collect::>() + core::iter::repeat_with(|| { + let w_id = rng.gen_id(); + let fut = world.filter(id.eq(w_id)).load(&mut conn); + async { fut.await?.pop().ok_or_else(not_found) } + }) + .take(num as _) + .collect::>() } .try_collect() .await @@ -81,48 +73,36 @@ impl _Pool { pub async fn update(&self, num: u16) -> HandleResult> { use crate::schema::world::dsl::*; - let mut rngs = Vec::with_capacity(num as _); - let (select_res, update_res) = { let mut conn = self.pool.get().await?; - let mut rng = self.rng.lock().unwrap(); - let select = (0..num) - .map(|_| { - let w_id = rng.gen_id(); - let num = rng.gen_id(); - - rngs.push((w_id, num)); + let (select, mut rngs) = core::iter::repeat_with(|| { + let w_id = rng.gen_id(); + let num = rng.gen_id(); - let fut = world.filter(id.eq(w_id)).load::(&mut conn); + let fut = world.filter(id.eq(w_id)).load::(&mut conn); + let select = async move { + let mut w = fut.await?.pop().ok_or_else(not_found)?; + w.randomnumber = num; + HandleResult::Ok(w) + }; - async move { - fut.await? - .pop() - .map(|mut w| { - w.randomnumber = num; - w - }) - .ok_or_else(not_found) - } - }) - .collect::>(); + (select, (w_id, num)) + }) + .take(num as _) + .collect::<(FuturesUnordered<_>, Vec<_>)>(); rngs.sort_by(|(a, _), (b, _)| a.cmp(b)); - let update = diesel::sql_query(update_query(&rngs)).execute(&mut conn); + let update = diesel::sql_query(update_query_from_ids(&rngs)).execute(&mut conn); join(select.try_collect::>(), update) } .await; update_res?; - let mut worlds = select_res?; - - worlds.sort_by_key(|w| w.id); - - Ok(worlds) + select_res } pub async fn tell_fortune(&self) -> HandleResult { @@ -130,7 +110,7 @@ impl _Pool { let mut items = { let mut conn = self.pool.get().await?; - fortune.load::(&mut conn) + fortune.load(&mut conn) } .await?; @@ -140,14 +120,3 @@ impl _Pool { Ok(Fortunes::new(items)) } } - -// diesel does not support high level bulk update api. use raw sql to bypass the limitation. -// relate discussion: https://github.com/diesel-rs/diesel/discussions/2879 -fn update_query(ids: &[(i32, i32)]) -> String { - bulk_update_gen(|query| { - use std::fmt::Write; - ids.iter().for_each(|(w_id, num)| { - write!(query, "({}::int,{}::int),", w_id, num).unwrap(); - }); - }) -} diff --git a/frameworks/Rust/xitca-web/src/db_unrealistic.rs b/frameworks/Rust/xitca-web/src/db_unrealistic.rs index 7b04449a716..99e4249e39b 100644 --- a/frameworks/Rust/xitca-web/src/db_unrealistic.rs +++ b/frameworks/Rust/xitca-web/src/db_unrealistic.rs @@ -6,14 +6,14 @@ mod db_util; use std::cell::RefCell; -use xitca_postgres::{iter::AsyncLendingIterator, pipeline::Pipeline, statement::Statement, Execute, ExecuteMut}; +use xitca_postgres::{iter::AsyncLendingIterator, pipeline::Pipeline, statement::Statement, Execute}; use super::{ ser::{Fortune, Fortunes, World}, util::{HandleResult, DB_URL}, }; -use db_util::{sort_update_params, update_query, Shared, FORTUNE_STMT, WORLD_STMT}; +use db_util::{not_found, sort_update_params, update_query_from_num, Shared, FORTUNE_STMT, WORLD_STMT}; pub struct Client { cli: xitca_postgres::Client, @@ -36,7 +36,7 @@ pub async fn create() -> HandleResult { let mut updates = vec![Statement::default()]; - for update in (1..=500).map(update_query).into_iter() { + for update in (1..=500).map(update_query_from_num).into_iter() { let stmt = Statement::named(&update, &[]).execute(&cli).await?.leak(); updates.push(stmt); } @@ -54,26 +54,28 @@ impl Client { pub async fn get_world(&self) -> HandleResult { let id = self.shared.borrow_mut().0.gen_id(); let mut res = self.world.bind([id]).query(&self.cli).await?; - let row = res.try_next().await?.ok_or("request World does not exist")?; + let row = res.try_next().await?.ok_or_else(not_found)?; Ok(World::new(row.get(0), row.get(1))) } pub async fn get_worlds(&self, num: u16) -> HandleResult> { let len = num as usize; - let mut res = { - let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); - let mut pipe = Pipeline::with_capacity_from_buf(len, buf); - (0..num).try_for_each(|_| self.world.bind([rng.gen_id()]).query_mut(&mut pipe))?; - pipe.query(&self.cli)? + let mut res = Vec::with_capacity(len); + + { + let (ref mut rng, ..) = *self.shared.borrow_mut(); + for _ in 0..len { + let stream = self.world.bind([rng.gen_id()]).query(&self.cli).await?; + res.push(stream); + } }; let mut worlds = Vec::with_capacity(len); - while let Some(mut item) = res.try_next().await? { - while let Some(row) = item.try_next().await? { - worlds.push(World::new(row.get(0), row.get(1))) - } + for mut stream in res { + let row = stream.try_next().await?.ok_or_else(not_found)?; + worlds.push(World::new(row.get(0), row.get(1))); } Ok(worlds) @@ -86,16 +88,15 @@ impl Client { let mut res = { let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); - let mut pipe = Pipeline::with_capacity_from_buf(len + 1, buf); + // unrealistic as all queries are sent with only one sync point. + let mut pipe = Pipeline::unsync_with_capacity_from_buf(len + 1, buf); (0..num).try_for_each(|_| { let w_id = rng.gen_id(); let r_id = rng.gen_id(); params.push([w_id, r_id]); - self.world.bind([w_id]).query_mut(&mut pipe) + self.world.bind([w_id]).query(&mut pipe) })?; - self.updates[len] - .bind(sort_update_params(¶ms)) - .query_mut(&mut pipe)?; + self.updates[len].bind(sort_update_params(¶ms)).query(&mut pipe)?; pipe.query(&self.cli)? }; diff --git a/frameworks/Rust/xitca-web/src/db_util.rs b/frameworks/Rust/xitca-web/src/db_util.rs index 19879333427..42c2c455bbe 100644 --- a/frameworks/Rust/xitca-web/src/db_util.rs +++ b/frameworks/Rust/xitca-web/src/db_util.rs @@ -1,53 +1,96 @@ -use xitca_io::bytes::BytesMut; -use xitca_postgres::{ - statement::{Statement, StatementNamed}, - types::Type, -}; +use crate::util::Error; -use crate::util::{bulk_update_gen, Rand}; +#[cfg(any(feature = "pg-orm", feature = "pg-orm-async"))] +// diesel does not support high level bulk update api. use raw sql to bypass the limitation. +// relate discussion: https://github.com/diesel-rs/diesel/discussions/2879 +pub fn update_query_from_ids(ids: &[(i32, i32)]) -> String { + update_query(|query| { + use core::fmt::Write; + ids.iter().for_each(|(w_id, num)| { + write!(query, "({}::int,{}::int),", w_id, num).unwrap(); + }); + }) +} -pub(super) type Shared = (Rand, BytesMut); +fn update_query(func: impl FnOnce(&mut String)) -> String { + const PREFIX: &str = "UPDATE world SET randomNumber = w.r FROM (VALUES "; + const SUFFIX: &str = ") AS w (i,r) WHERE world.id = w.i"; -pub(super) const FORTUNE_STMT: StatementNamed = Statement::named("SELECT * FROM fortune", &[]); -pub(super) const WORLD_STMT: StatementNamed = Statement::named("SELECT * FROM world WHERE id=$1", &[Type::INT4]); + let mut query = String::from(PREFIX); -pub(super) fn update_query(num: usize) -> Box { - bulk_update_gen(|query| { - use std::fmt::Write; - (1..=num).fold((1, query), |(idx, query), _| { - write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); - (idx + 2, query) - }); - }) - .into_boxed_str() + func(&mut query); + + if query.ends_with(',') { + query.pop(); + } + + query.push_str(SUFFIX); + + query } -pub(super) fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator { - let mut params = params.to_owned(); - params.sort_by(|a, b| a[0].cmp(&b[0])); +#[cold] +#[inline(never)] +pub fn not_found() -> Error { + "request World does not exist".into() +} - struct ParamIter(I); +#[cfg(feature = "pg")] +pub use pg::*; - impl Iterator for ParamIter - where - I: Iterator, - { - type Item = I::Item; +#[cfg(feature = "pg")] +pub mod pg { + use xitca_io::bytes::BytesMut; + use xitca_postgres::{ + statement::{Statement, StatementNamed}, + types::Type, + }; - #[inline] - fn next(&mut self) -> Option { - self.0.next() - } + use crate::util::Rand; - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.0.size_hint() - } + pub type Shared = (Rand, BytesMut); + + pub const FORTUNE_STMT: StatementNamed = Statement::named("SELECT * FROM fortune", &[]); + pub const WORLD_STMT: StatementNamed = Statement::named("SELECT * FROM world WHERE id=$1", &[Type::INT4]); + + pub fn update_query_from_num(num: usize) -> Box { + super::update_query(|query| { + use core::fmt::Write; + (1..=num).fold(1, |idx, _| { + write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); + idx + 2 + }); + }) + .into_boxed_str() } - // impl depends on compiler optimization to flat Vec<[T]> to Vec when inferring - // it's size hint. possible to cause runtime panic. - impl ExactSizeIterator for ParamIter where I: Iterator {} + pub fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator { + let mut params = params.to_owned(); + params.sort_by(|a, b| a[0].cmp(&b[0])); + + struct ParamIter(I); + + impl Iterator for ParamIter + where + I: Iterator, + { + type Item = I::Item; - ParamIter(params.into_iter().flatten()) + #[inline] + fn next(&mut self) -> Option { + self.0.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } + } + + // impl depends on compiler optimization to flat Vec<[T]> to Vec when inferring + // it's size hint. possible to cause runtime panic. + impl ExactSizeIterator for ParamIter where I: Iterator {} + + ParamIter(params.into_iter().flatten()) + } } diff --git a/frameworks/Rust/xitca-web/src/main_iou.rs b/frameworks/Rust/xitca-web/src/main_unrealistic.rs similarity index 60% rename from frameworks/Rust/xitca-web/src/main_iou.rs rename to frameworks/Rust/xitca-web/src/main_unrealistic.rs index 7dcf6d1a719..e291799408c 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_unrealistic.rs @@ -1,5 +1,4 @@ -// reference of if/how moving from epoll to io-uring(or mixture of the two) make sense for network io. -// with comment on explaining why some practice are unrealistic +// unrealistic bench showcase popular tricks for boosting bench score artificially // custom global memory allocator don't affect real world performance in noticeable amount. // in real world they should be used for reason like security, debug/profiling capability etc. @@ -15,13 +14,16 @@ use std::{convert::Infallible, io}; use xitca_http::{ bytes::BufMutWriter, - h1::dispatcher_uring_unreal::{Dispatcher, Request, Response}, + h1::dispatcher_unreal::{Dispatcher, Request, Response}, http::StatusCode, }; -use xitca_io::net::io_uring::TcpStream; +use xitca_io::net::TcpStream; use xitca_service::Service; -use self::{ser::Message, util::State}; +use self::{ + ser::Message, + util::{QueryParse, State}, +}; fn main() -> io::Result<()> { let addr = "0.0.0.0:8080".parse().unwrap(); @@ -30,36 +32,40 @@ fn main() -> io::Result<()> { let handle = core::iter::repeat_with(|| { std::thread::spawn(move || { - tokio_uring::start(async { - let socket = tokio::net::TcpSocket::new_v4()?; - socket.set_reuseaddr(true)?; - // unrealistic due to following reason: - // 1. this only works good on unix system. - // 2. no resource distribution adjustment between sockets on different threads. causing uneven workload - // where some threads are idle while others busy. resulting in overall increased latency - socket.set_reuseport(true)?; - socket.bind(addr)?; - let listener = socket.listen(1024)?; - - let client = db::create().await.unwrap(); - - // unrealistic http dispatcher. no spec check. no security feature. - let service = Dispatcher::new(handler, State::new(client)); - - loop { - match listener.accept().await { - Ok((stream, _)) => { - let stream = stream.into_std()?; - let stream = TcpStream::from_std(stream); - let service = service.clone(); - tokio::task::spawn_local(async move { - let _ = service.call(stream).await; - }); - } - Err(e) => return Err(e), - }; - } - }) + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build_local(&Default::default()) + .unwrap() + .block_on(async { + let socket = tokio::net::TcpSocket::new_v4()?; + socket.set_reuseaddr(true)?; + // unrealistic due to following reason: + // 1. this only works good on unix system. + // 2. no resource distribution adjustment between sockets on different threads. causing uneven workload + // where some threads are idle while others busy. resulting in overall increased latency + socket.set_reuseport(true)?; + socket.bind(addr)?; + let listener = socket.listen(1024)?; + + let client = db::create().await.unwrap(); + + // unrealistic http dispatcher. no spec check. no security feature. + let service = Dispatcher::new(handler, State::new(client)); + + loop { + match listener.accept().await { + Ok((stream, _)) => { + let stream = stream.into_std()?; + let stream = TcpStream::from_std(stream)?; + let service = service.clone(); + tokio::task::spawn_local(async move { + let _ = service.call(stream).await; + }); + } + Err(e) => return Err(e), + }; + } + }) }) }) .take(cores) @@ -74,9 +80,9 @@ fn main() -> io::Result<()> { Ok(()) } -async fn handler<'h>(req: Request<'h, '_>, res: Response<'h>, state: &State) -> Response<'h, 3> { +async fn handler<'h>(req: Request<'h>, res: Response<'h>, state: &State) -> Response<'h, 3> { // unrealistic due to no http method check - match req.path.unwrap_or("404") { + match req.path { // unrealistic due to no dynamic path matching "/plaintext" => { // unrealistic due to no body streaming and no post processing. violating middleware feature of xitca-web @@ -111,13 +117,13 @@ async fn handler<'h>(req: Request<'h, '_>, res: Response<'h>, state: &State { - let num = path_param(p); + p if p.starts_with("/q") => { + let num = p["/queries?q=".len()..].parse_query(); let worlds = state.client.get_worlds(num).await.unwrap(); json_response(res, state, &worlds) } - p if p.starts_with("/updates") => { - let num = path_param(p); + p if p.starts_with("/u") => { + let num = p["/updates?q=".len()..].parse_query(); let worlds = state.client.update(num).await.unwrap(); json_response(res, state, &worlds) } @@ -139,13 +145,3 @@ where buf.clear(); res } - -fn path_param(query: &str) -> u16 { - use atoi::FromRadix10; - let q = if let Some(pos) = query.find("?q") { - u16::from_radix_10(query.split_at(pos + 3).1.as_ref()).0 - } else { - 1 - }; - q.clamp(1, 500) -} diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index 3c630c54bc6..edf9183a8c0 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -8,7 +8,7 @@ use xitca_http::{ bytes::{BufMutWriter, Bytes}, http::{ self, - const_header_value::{JSON, TEXT, TEXT_HTML_UTF8}, + const_header_value::{JSON, TEXT_HTML_UTF8, TEXT_UTF8}, header::CONTENT_TYPE, IntoResponse as _, RequestExt, StatusCode, }, @@ -213,7 +213,7 @@ impl IntoResponse for Request { fn text_response(self) -> Result { let mut res = self.into_response(const { Bytes::from_static(HELLO_BYTES) }); - res.headers_mut().insert(CONTENT_TYPE, TEXT); + res.headers_mut().insert(CONTENT_TYPE, TEXT_UTF8); Ok(res) } diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index 9183d067f5d..3998a2ef1ec 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -10,34 +10,16 @@ pub trait QueryParse { impl QueryParse for Option<&str> { fn parse_query(self) -> u16 { - self.and_then(|this| { - use atoi::FromRadix10; - this.find('q') - .map(|pos| u16::from_radix_10(this.split_at(pos + 2).1.as_ref()).0) - }) - .unwrap_or(1) - .clamp(1, 500) + self.and_then(|q| q.find('q').map(|pos| q.split_at(pos + 2).1.parse_query())) + .unwrap_or(1) } } -pub fn bulk_update_gen(func: F) -> String -where - F: FnOnce(&mut String), -{ - const PREFIX: &str = "UPDATE world SET randomNumber = w.r FROM (VALUES "; - const SUFFIX: &str = ") AS w (i,r) WHERE world.id = w.i"; - - let mut query = String::from(PREFIX); - - func(&mut query); - - if query.ends_with(',') { - query.pop(); +impl QueryParse for &str { + fn parse_query(self) -> u16 { + use atoi::FromRadix10; + u16::from_radix_10(self.as_bytes()).0.clamp(1, 500) } - - query.push_str(SUFFIX); - - query } #[allow(clippy::declare_interior_mutable_const)] @@ -64,7 +46,7 @@ impl State { } #[cfg(not(target_arch = "wasm32"))] -mod non_wasm { +pub mod non_wasm { use rand::{rngs::SmallRng, Rng, SeedableRng}; pub struct Rand(SmallRng); diff --git a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile deleted file mode 100644 index 461d5740603..00000000000 --- a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM rust:1.81 - -ADD ./ /xitca-web -WORKDIR /xitca-web - -RUN cargo build --release --bin xitca-web-iou --features io-uring,perf,pg,template - -EXPOSE 8080 - -CMD ./target/release/xitca-web-iou diff --git a/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile b/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile new file mode 100644 index 00000000000..f202947acc0 --- /dev/null +++ b/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile @@ -0,0 +1,10 @@ +FROM rust:1.81 + +ADD ./ /xitca-web +WORKDIR /xitca-web + +RUN cargo build --release --bin xitca-web-unrealistic --features perf,pg,template + +EXPOSE 8080 + +CMD ./target/release/xitca-web-unrealistic From 072be3bbd91124878a78d1c40a8112e1e4e4e0c9 Mon Sep 17 00:00:00 2001 From: cclilshy Date: Tue, 15 Oct 2024 01:32:50 +0800 Subject: [PATCH 0835/1766] [Laravel/ripple] added the command for publishing configuration (#9324) * [Laravel/ripple] Update some configurations to be compatible with the v0.6 * [Laravel/ripple] added the command for publishing configuration --- frameworks/PHP/laravel/benchmark_config.json | 6 +++--- ...ipple.dockerfile => laravel-ripple.dockerfile} | 15 ++++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) rename frameworks/PHP/laravel/{laravel-pripple.dockerfile => laravel-ripple.dockerfile} (80%) diff --git a/frameworks/PHP/laravel/benchmark_config.json b/frameworks/PHP/laravel/benchmark_config.json index f8421378e51..053534b12fa 100644 --- a/frameworks/PHP/laravel/benchmark_config.json +++ b/frameworks/PHP/laravel/benchmark_config.json @@ -139,7 +139,7 @@ "notes": "", "versus": "php" }, - "pripple": { + "ripple": { "json_url": "/json", "db_url": "/db", "query_url": "/queries/", @@ -154,11 +154,11 @@ "language": "PHP", "flavor": "PHP8.3", "orm": "Full", - "platform": "PRipple", + "platform": "Ripple", "webserver": "PServer", "os": "Linux", "database_os": "Linux", - "display_name": "laravel-pripple", + "display_name": "laravel-ripple", "notes": "", "versus": "php" } diff --git a/frameworks/PHP/laravel/laravel-pripple.dockerfile b/frameworks/PHP/laravel/laravel-ripple.dockerfile similarity index 80% rename from frameworks/PHP/laravel/laravel-pripple.dockerfile rename to frameworks/PHP/laravel/laravel-ripple.dockerfile index 869661a0432..4f1bb8bc3a9 100644 --- a/frameworks/PHP/laravel/laravel-pripple.dockerfile +++ b/frameworks/PHP/laravel/laravel-ripple.dockerfile @@ -33,16 +33,17 @@ RUN mkdir -p bootstrap/cache \ storage/framework/views \ storage/framework/cache -# Configure RUN echo "PRP_HTTP_LISTEN=http://0.0.0.0:8080" >> .env -RUN echo "PRP_HTTP_COUNT=64" >> .env +RUN echo "PRP_HTTP_WORKERS=64" >> .env +RUN echo "PRP_HTTP_RELOAD=0" >> .env +RUN echo "PRP_HTTP_SANDBOX=1" >> .env +# Configure RUN composer install --quiet +RUN composer require cloudtay/ripple-driver --quiet +RUN php artisan vendor:publish --tag=ripple-config RUN php artisan optimize -RUN composer require cclilshy/p-ripple-drive --quiet -RUN composer update --quiet - +# Start EXPOSE 8080 - -ENTRYPOINT ["php","artisan","p:server","start"] +ENTRYPOINT ["php","artisan","ripple:server","start"] From 808b21e6886274b69bd90e83391a6fc93ecbee0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 14 Oct 2024 19:33:08 +0200 Subject: [PATCH 0836/1766] [spring] Improve database tests (#9313) * [spring-webflux] Improve database tests - Improve the test reliability with a better random number generation mechanism - Improve the scalability of fortune test * [spring] Fix postgres deadlock The now fixed deadlock issue was only visible under high concurrency and was generating errors and leading to lower than expected performance. Sorting the worlds before updating them allows to avoid this issue. --- .../src/main/java/benchmark/Utils.java | 19 ++++++++++++ .../repository/R2dbcDbRepository.java | 31 ++++++++++++++----- .../main/java/benchmark/web/DbHandler.java | 15 ++++----- .../src/main/java/hello/web/DbHandler.java | 2 ++ 4 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 frameworks/Java/spring-webflux/src/main/java/benchmark/Utils.java diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/Utils.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/Utils.java new file mode 100644 index 00000000000..4631be27f11 --- /dev/null +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/Utils.java @@ -0,0 +1,19 @@ +package benchmark; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +abstract public class Utils { + + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; + + public static int randomWorldNumber() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); + } + + public static IntStream randomWorldNumbers() { + return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE).distinct(); + } + +} diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java index c7cfb89dea4..3cbf5f66d4a 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java @@ -1,20 +1,27 @@ package benchmark.repository; -import benchmark.model.Fortune; -import benchmark.model.World; import org.springframework.context.annotation.Profile; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.stereotype.Component; + +import benchmark.model.Fortune; +import benchmark.model.World; +import io.r2dbc.spi.Connection; +import io.r2dbc.spi.ConnectionFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @Component @Profile("r2dbc") public class R2dbcDbRepository implements DbRepository { + private final DatabaseClient databaseClient; + private final ConnectionFactory connectionFactory; + private final ThreadLocal> conn = new ThreadLocal<>(); public R2dbcDbRepository(DatabaseClient databaseClient) { this.databaseClient = databaseClient; + this.connectionFactory = databaseClient.getConnectionFactory(); } @Override @@ -24,10 +31,9 @@ public Mono getWorld(int id) { .bind("$1", id) .mapProperties(World.class) .first(); - } - public Mono updateWorld(World world) { + private Mono updateWorld(World world) { return databaseClient .sql("UPDATE world SET randomnumber=$2 WHERE id = $1") .bind("$1", world.id) @@ -37,6 +43,8 @@ public Mono updateWorld(World world) { .map(count -> world); } + + @Override public Mono findAndUpdateWorld(int id, int randomNumber) { return getWorld(id).flatMap(world -> { world.randomnumber = randomNumber; @@ -46,9 +54,16 @@ public Mono findAndUpdateWorld(int id, int randomNumber) { @Override public Flux fortunes() { - return databaseClient - .sql("SELECT id, message FROM fortune") - .mapProperties(Fortune.class) - .all(); + return getConnection() + .flatMapMany(conn -> conn.createStatement("SELECT id, message FROM " + "fortune").execute()) + .flatMap(result -> result.map(r -> new Fortune(r.get(0, Integer.class), r.get(1, String.class)))); } + + private Mono getConnection() { + if (this.conn.get() == null) { + this.conn.set(Mono.from(connectionFactory.create()).cache()); + } + return this.conn.get(); + } + } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java index 970ace1d46d..e85d9c5be15 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java @@ -1,8 +1,8 @@ package benchmark.web; import java.util.List; -import java.util.concurrent.ThreadLocalRandom; +import benchmark.Utils; import benchmark.model.Fortune; import benchmark.model.World; import benchmark.repository.DbRepository; @@ -29,7 +29,7 @@ public DbHandler(DbRepository dbRepository) { } public Mono db(ServerRequest request) { - int id = randomWorldNumber(); + int id = Utils.randomWorldNumber(); Mono world = dbRepository.getWorld(id) .switchIfEmpty(Mono.error(new Exception("No World found with Id: " + id))); @@ -41,8 +41,8 @@ public Mono db(ServerRequest request) { public Mono queries(ServerRequest request) { int queries = parseQueryCount(request.queryParams().getFirst("queries")); - Mono> worlds = Flux.range(0, queries) - .flatMap(i -> dbRepository.getWorld(randomWorldNumber())) + Mono> worlds = Flux.fromStream(Utils.randomWorldNumbers().limit(queries).boxed()) + .flatMap(dbRepository::getWorld) .collectList(); return ServerResponse.ok() @@ -67,8 +67,8 @@ private static int parseQueryCount(String maybeTextValue) { public Mono updates(ServerRequest request) { int queries = parseQueryCount(request.queryParams().getFirst("queries")); - Mono> worlds = Flux.range(0, queries) - .flatMap(i -> dbRepository.findAndUpdateWorld(randomWorldNumber(), randomWorldNumber())) + Mono> worlds = Flux.fromStream(Utils.randomWorldNumbers().limit(queries).boxed()) + .flatMap(i -> dbRepository.findAndUpdateWorld(i, Utils.randomWorldNumber())) .collectList(); return ServerResponse.ok() @@ -87,7 +87,4 @@ public Mono fortunes(ServerRequest request) { .bodyValue(JStachio.render(new Fortunes(fortunes)))); } - private static int randomWorldNumber() { - return 1 + ThreadLocalRandom.current().nextInt(10000); - } } \ No newline at end of file diff --git a/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java index affb752268f..983eb79f6b9 100644 --- a/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java +++ b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java @@ -1,6 +1,7 @@ package hello.web; import java.util.Collections; +import java.util.Comparator; import java.util.List; import hello.Utils; @@ -52,6 +53,7 @@ ServerResponse updates(ServerRequest request) { world.randomNumber = randomNumber; return world; }).limit(queries) + .sorted(Comparator.comparingInt(w -> w.id)) .toList(); dbRepository.updateWorlds(worlds); return ServerResponse.ok() From 313487b5fe55d546e34f0b698ce94a1331f7cfaf Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 14 Oct 2024 19:34:33 +0200 Subject: [PATCH 0837/1766] [rails] Use higher log level (#9319) Using a higher log level bypasses a lot of unused instrumentation code. +-------------------------+---------+------+------+-----+-----+-------+------------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|cached-query|weighted_score| +-------------------------+---------+------+------+-----+-----+-------+------------+--------------+ | master| 22816| 8249| 82981|21715|12531| 11234| 13259| 1006| | rails/increase-log-level| 24719| 11040| 90706|25126|16022| 16666| 14304| 1309| --- frameworks/Ruby/rails/config/environments/production.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rails/config/environments/production.rb b/frameworks/Ruby/rails/config/environments/production.rb index 45b097c9f04..c6594e5d17d 100644 --- a/frameworks/Ruby/rails/config/environments/production.rb +++ b/frameworks/Ruby/rails/config/environments/production.rb @@ -47,7 +47,7 @@ # "info" includes generic and useful information about system operation, but avoids logging too much # information to avoid inadvertent exposure of personally identifiable information (PII). If you # want to log everything, set the level to "debug". - config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") + config.log_level = :fatal # Use a different cache store in production. config.cache_store = :redis_cache_store, { From 51155f12b2d2a4e71330aa3d724655cba5bda637 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Mon, 14 Oct 2024 13:35:13 -0400 Subject: [PATCH 0838/1766] Updates benchmark to latest version of Helidon (#9326) * Centralizes JSON serialization. Minor optimizations to pgclient repository implementation. Signed-off-by: Santiago Pericas-Geertsen * Fixes problem in PgClientRepository.getFortunes(). Signed-off-by: Santiago Pericas-Geertsen * Sets a VT factory for Hikari CP. Signed-off-by: Santiago Pericas-Geertsen * Additional configuration for Hikari CP. Signed-off-by: Santiago Pericas-Geertsen * Sets Helidon version to 4.1.2. Signed-off-by: Santiago Pericas-Geertsen * Set content type in response. Fixes problems with JSON serialization. Signed-off-by: Santiago Pericas-Geertsen --------- Signed-off-by: Santiago Pericas-Geertsen --- frameworks/Java/helidon/nima/pom.xml | 2 +- .../benchmark/nima/JsonSerializer.java | 92 +++++++++++++++ .../java/io/helidon/benchmark/nima/Main.java | 58 +--------- .../benchmark/nima/models/DbRepository.java | 19 ---- .../nima/models/HikariJdbcRepository.java | 21 +++- .../nima/models/PgClientRepository.java | 105 ++++++++---------- .../helidon/benchmark/nima/models/World.java | 6 +- .../benchmark/nima/services/DbService.java | 31 ++---- .../nima/src/main/resources/application.yaml | 1 + 9 files changed, 177 insertions(+), 158 deletions(-) create mode 100644 frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java diff --git a/frameworks/Java/helidon/nima/pom.xml b/frameworks/Java/helidon/nima/pom.xml index c884659a0a0..c859b758cfc 100644 --- a/frameworks/Java/helidon/nima/pom.xml +++ b/frameworks/Java/helidon/nima/pom.xml @@ -21,7 +21,7 @@ io.helidon.applications helidon-se - 4.0.3 + 4.1.2 diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java new file mode 100644 index 00000000000..322a7cf030c --- /dev/null +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java @@ -0,0 +1,92 @@ +package io.helidon.benchmark.nima; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; +import java.util.List; + +import com.jsoniter.output.JsonStream; +import com.jsoniter.output.JsonStreamPool; +import com.jsoniter.spi.JsonException; + +public class JsonSerializer { + + private JsonSerializer() { + } + + /** + * Serialize an instance into a JSON object and return it as a byte array. + * + * @param obj the instance + * @return the byte array + */ + public static byte[] serialize(Object obj) { + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + stream.reset(null); + stream.writeVal(obj.getClass(), obj); + return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); + } catch (IOException e) { + throw new JsonException(e); + } finally { + JsonStreamPool.returnJsonStream(stream); + } + } + + /** + * Serialize a map of strings into a JSON object and return it as a byte array. + * + * @param map the map + * @return the byte array + */ + public static byte[] serialize(Map map) { + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + stream.reset(null); + stream.writeObjectStart(); + map.forEach((k, v) -> { + try { + stream.writeObjectField(k); + stream.writeVal(v); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + stream.writeObjectEnd(); + return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); + } catch (IOException e) { + throw new JsonException(e); + } finally { + JsonStreamPool.returnJsonStream(stream); + } + } + + /** + * Serialize a list of objects into a JSON array and return it as a byte array. + * + * @param objs the list of objects + * @return the byte array + */ + public static byte[] serialize(List objs) { + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + stream.reset(null); + stream.writeArrayStart(); + int i = 0; + int n = objs.size(); + for (Object obj : objs) { + stream.writeVal(obj.getClass(), obj); + if (i++ < n - 1) { + stream.writeMore(); + } + + } + stream.writeArrayEnd(); + return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); + } catch (IOException e) { + throw new JsonException(e); + } finally { + JsonStreamPool.returnJsonStream(stream); + } + } +} diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java index 92896867246..df669d8a7a7 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java @@ -16,14 +16,9 @@ package io.helidon.benchmark.nima; -import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.Arrays; import java.util.logging.Logger; -import com.jsoniter.output.JsonStream; -import com.jsoniter.output.JsonStreamPool; -import com.jsoniter.spi.JsonException; import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.HikariJdbcRepository; import io.helidon.benchmark.nima.models.PgClientRepository; @@ -41,6 +36,8 @@ import io.helidon.webserver.http.ServerRequest; import io.helidon.webserver.http.ServerResponse; +import static io.helidon.benchmark.nima.JsonSerializer.serialize; + /** * Main class of the benchmark. * Opens server on localhost:8080 and exposes {@code /plaintext} and {@code /json} endpoints adhering to the @@ -90,29 +87,14 @@ static void routing(HttpRules rules) { rules.get("/plaintext", new PlaintextHandler()) .get("/json", new JsonHandler()) - .get("/10k", new JsonKHandler(10)) .get("/fortunes", new FortuneHandler(repository)) .register("/", new DbService(repository)); } - private static byte[] serializeMsg(Message obj) { - JsonStream stream = JsonStreamPool.borrowJsonStream(); - try { - stream.reset(null); - stream.writeVal(Message.class, obj); - return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); - } catch (IOException e) { - throw new JsonException(e); - } finally { - JsonStreamPool.returnJsonStream(stream); - } - } - static class PlaintextHandler implements Handler { static final Header CONTENT_TYPE = HeaderValues.createCached(HeaderNames.CONTENT_TYPE, - "text/plain; charset=UTF-8"); + "text/plain; charset=UTF-8"); static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, "13"); - private static final byte[] RESPONSE_BYTES = "Hello, World!".getBytes(StandardCharsets.UTF_8); @Override @@ -126,44 +108,16 @@ public void handle(ServerRequest req, ServerResponse res) { static class JsonHandler implements Handler { private static final String MESSAGE = "Hello, World!"; - private static final int JSON_LENGTH = serializeMsg(new Message(MESSAGE)).length; + private static final int JSON_LENGTH = serialize(new Message(MESSAGE)).length; static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, - String.valueOf(JSON_LENGTH)); + String.valueOf(JSON_LENGTH)); @Override public void handle(ServerRequest req, ServerResponse res) { res.header(CONTENT_LENGTH); res.header(HeaderValues.CONTENT_TYPE_JSON); res.header(Main.SERVER); - res.send(serializeMsg(newMsg())); - } - - private static Message newMsg() { - return new Message("Hello, World!"); - } - } - - static class JsonKHandler implements Handler { - private final Header contentLength; - private final String message; - - JsonKHandler(int kilobytes) { - this.message = "a".repeat(1024 * kilobytes); - int length = serializeMsg(new Message(message)).length; - this.contentLength = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, - String.valueOf(length)); - } - - @Override - public void handle(ServerRequest req, ServerResponse res) { - res.header(contentLength); - res.header(HeaderValues.CONTENT_TYPE_JSON); - res.header(Main.SERVER); - res.send(serializeMsg(newMsg())); - } - - private Message newMsg() { - return new Message(message); + res.send(serialize(new Message(MESSAGE))); } } diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java index 204c9ad5ad1..d1f75b558c3 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java @@ -6,35 +6,16 @@ import java.util.concurrent.ThreadLocalRandom; import jakarta.json.Json; -import jakarta.json.JsonArray; -import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonBuilderFactory; -import jakarta.json.JsonObject; public interface DbRepository { JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap()); - default World getWorld() { - return getWorld(randomWorldNumber()); - } - World getWorld(int id); - default JsonObject getWorldAsJson(int id) { - return getWorld().toJson(); - } - List getWorlds(int count); - default JsonArray getWorldsAsJson(int count) { - JsonArrayBuilder result = JSON.createArrayBuilder(); - for (World world : getWorlds(count)) { - result.add(world.toJson()); - } - return result.build(); - } - World updateWorld(World world); List updateWorlds(int count); diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java index 686559b2fd9..fd9760939df 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java @@ -7,6 +7,8 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import java.util.logging.Logger; import com.zaxxer.hikari.HikariConfig; @@ -22,20 +24,31 @@ public class HikariJdbcRepository implements DbRepository { private final HikariConfig hikariConfig; public HikariJdbcRepository(Config config) { + // hikari connection configuration String url = "jdbc:postgresql://" + config.get("host").asString().orElse("tfb-database") + ":" + config.get("port").asString().orElse("5432") + "/" + config.get("db").asString().orElse("hello_world"); - hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl(url); hikariConfig.setUsername(config.get("username").asString().orElse("benchmarkdbuser")); hikariConfig.setPassword(config.get("password").asString().orElse("benchmarkdbpass")); - hikariConfig.addDataSourceProperty("cachePrepStmts", "true"); + // hikari additional configuration int poolSize = config.get("sql-pool-size").asInt().orElse(64); - hikariConfig.addDataSourceProperty("maximumPoolSize", poolSize); - LOGGER.info("Db pool size is set to " + poolSize); + hikariConfig.setMaximumPoolSize(poolSize); + LOGGER.info("Hikari pool size is set to " + poolSize); + ThreadFactory vtThreadFactory = Thread.ofVirtual().factory(); + hikariConfig.setThreadFactory(vtThreadFactory); + hikariConfig.setScheduledExecutor(Executors.newScheduledThreadPool(poolSize, vtThreadFactory)); + LOGGER.info("Set thread factory to VTs"); + + // data source properties + hikariConfig.addDataSourceProperty("cachePrepStmts","true"); + hikariConfig.addDataSourceProperty("prepStmtCacheSize","250"); + hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit","2048"); + hikariConfig.addDataSourceProperty("ssl", "false"); + hikariConfig.addDataSourceProperty("tcpKeepAlive", "true"); } private Connection getConnection() throws SQLException { diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java index 7775a177537..e5166b10fbc 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java @@ -8,27 +8,25 @@ import java.util.concurrent.TimeoutException; import java.util.logging.Logger; -import io.helidon.common.reactive.Multi; -import io.helidon.common.reactive.Single; import io.helidon.config.Config; + import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; +import io.vertx.core.Future; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgPool; import io.vertx.sqlclient.PoolOptions; +import io.vertx.sqlclient.PreparedQuery; import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.SqlClient; import io.vertx.sqlclient.Tuple; -import jakarta.json.JsonArray; -import jakarta.json.JsonArrayBuilder; -import jakarta.json.JsonObject; import static io.helidon.benchmark.nima.models.DbRepository.randomWorldNumber; public class PgClientRepository implements DbRepository { private static final Logger LOGGER = Logger.getLogger(PgClientRepository.class.getName()); - private final SqlClient queryPool; private final SqlClient updatePool; @@ -36,9 +34,13 @@ public class PgClientRepository implements DbRepository { private final long updateTimeout; private final int maxRetries; + private final PreparedQuery> getFortuneQuery; + private final PreparedQuery> getWorldQuery; + private final PreparedQuery> updateWorldQuery; + public PgClientRepository(Config config) { Vertx vertx = Vertx.vertx(new VertxOptions() - .setPreferNativeTransport(true)); + .setPreferNativeTransport(true)); PgConnectOptions connectOptions = new PgConnectOptions() .setPort(config.get("port").asInt().orElse(5432)) .setCachePreparedStatements(config.get("cache-prepared-statements").asBoolean().orElse(true)) @@ -59,31 +61,20 @@ public PgClientRepository(Config config) { queryPool = PgPool.client(vertx, connectOptions, clientOptions); updatePool = PgPool.client(vertx, connectOptions, clientOptions); - } - @Override - public JsonObject getWorldAsJson(int id) { - return getWorld(id, queryPool).map(World::toJson).await(); + getWorldQuery = queryPool.preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1"); + updateWorldQuery = queryPool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2"); + getFortuneQuery = queryPool.preparedQuery("SELECT id, message FROM fortune"); } @Override public World getWorld(int id) { try { - return getWorld(id, queryPool).toCompletableFuture().get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public JsonArray getWorldsAsJson(int count) { - try { - return Multi.range(0, count) - .flatMap(i -> getWorld(randomWorldNumber(), queryPool)) - .map(World::toJson) - .reduce(JSON::createArrayBuilder, JsonArrayBuilder::add) - .map(JsonArrayBuilder::build) - .await(); + return getWorldQuery.execute(Tuple.of(id)) + .map(rows -> { + Row r = rows.iterator().next(); + return new World(r.getInteger(0), r.getInteger(1)); + }).toCompletionStage().toCompletableFuture().get(); } catch (Exception e) { throw new RuntimeException(e); } @@ -92,17 +83,15 @@ public JsonArray getWorldsAsJson(int count) { @Override public List getWorlds(int count) { try { - List result = new ArrayList<>(count); + List> futures = new ArrayList<>(); for (int i = 0; i < count; i++) { - World world = queryPool.preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1") - .execute(Tuple.of(randomWorldNumber())) - .map(rows -> { - Row r = rows.iterator().next(); - return new World(r.getInteger(0), r.getInteger(1)); - }).toCompletionStage().toCompletableFuture().get(); - result.add(world); + futures.add(getWorldQuery.execute(Tuple.of(randomWorldNumber())) + .map(rows -> { + Row r = rows.iterator().next(); + return new World(r.getInteger(0), r.getInteger(1)); + })); } - return result; + return Future.all(futures).toCompletionStage().toCompletableFuture().get().list(); } catch (Exception e) { throw new RuntimeException(e); } @@ -110,10 +99,14 @@ public List getWorlds(int count) { @Override public World updateWorld(World world) { - return Single.create(queryPool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2") - .execute(Tuple.of(world.id, world.id)) - .toCompletionStage() - .thenApply(rows -> world)).await(); + try { + return updateWorldQuery.execute(Tuple.of(world.id, world.id)) + .toCompletionStage() + .thenApply(rows -> world) + .toCompletableFuture().get(); + } catch (Exception e) { + throw new RuntimeException(e); + } } @Override @@ -165,25 +158,18 @@ private List updateWorldsRetry(List worlds, int from, int retries) @Override public List getFortunes() { - return Single.create(queryPool.preparedQuery("SELECT id, message FROM fortune") - .execute() - .map(rows -> { - List fortunes = new ArrayList<>(rows.size() + 1); - for (Row r : rows) { - fortunes.add(new Fortune(r.getInteger(0), r.getString(1))); - } - return fortunes; - }).toCompletionStage()).await(); - } - - private static Single getWorld(int id, SqlClient pool) { - return Single.create(pool.preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1") - .execute(Tuple.of(id)) - .map(rows -> { - Row r = rows.iterator().next(); - return new World(r.getInteger(0), r.getInteger(1)); - }).toCompletionStage()); - + try { + return getFortuneQuery.execute() + .map(rows -> { + List fortunes = new ArrayList<>(rows.size() + 1); + for (Row r : rows) { + fortunes.add(new Fortune(r.getInteger(0), r.getString(1))); + } + return fortunes; + }).toCompletionStage().toCompletableFuture().get(); + } catch (Exception e) { + throw new RuntimeException(e); + } } private CompletableFuture> updateWorlds(List worlds, int from, SqlClient pool) { @@ -193,8 +179,7 @@ private CompletableFuture> updateWorlds(List worlds, int from World w = worlds.get(i); tuples.add(Tuple.of(w.randomNumber, w.id)); } - return pool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2") - .executeBatch(tuples) + return updateWorldQuery.executeBatch(tuples) .toCompletionStage() .thenApply(rows -> worlds) .toCompletableFuture(); diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java index ee8eb9194cd..39deafea11b 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java @@ -9,9 +9,9 @@ public final class World { - private static final String ID_KEY = "id"; - private static final String ID_RANDOM_NUMBER = "randomNumber"; - private static final JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap()); + static final String ID_KEY = "id"; + static final String ID_RANDOM_NUMBER = "randomNumber"; + static final JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap()); public int id; public int randomNumber; diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java index 46c244d96f5..e3bd1fe39fc 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java @@ -1,27 +1,23 @@ package io.helidon.benchmark.nima.services; -import java.util.Collections; import java.util.List; import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.World; import io.helidon.common.parameters.Parameters; +import io.helidon.http.HeaderValues; import io.helidon.webserver.http.HttpRules; import io.helidon.webserver.http.HttpService; import io.helidon.webserver.http.ServerRequest; import io.helidon.webserver.http.ServerResponse; - -import jakarta.json.Json; -import jakarta.json.JsonArrayBuilder; -import jakarta.json.JsonBuilderFactory; -import jakarta.json.JsonObject; +import io.helidon.common.mapper.OptionalValue; import static io.helidon.benchmark.nima.Main.SERVER; import static io.helidon.benchmark.nima.models.DbRepository.randomWorldNumber; +import static io.helidon.benchmark.nima.JsonSerializer.serialize; public class DbService implements HttpService { - private static final JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap()); private final DbRepository repository; @@ -38,36 +34,33 @@ public void routing(HttpRules httpRules) { private void db(ServerRequest req, ServerResponse res) { res.header(SERVER); - res.send(repository.getWorldAsJson(randomWorldNumber())); + res.header(HeaderValues.CONTENT_TYPE_JSON); + res.send(serialize(repository.getWorld(randomWorldNumber()))); } private void queries(ServerRequest req, ServerResponse res) { res.header(SERVER); + res.header(HeaderValues.CONTENT_TYPE_JSON); int count = parseQueryCount(req.query()); - res.send(repository.getWorldsAsJson(count)); + res.send(serialize(repository.getWorlds(count))); } private void updates(ServerRequest req, ServerResponse res) { res.header(SERVER); + res.header(HeaderValues.CONTENT_TYPE_JSON); int count = parseQueryCount(req.query()); List worlds = repository.updateWorlds(count); - JsonArrayBuilder arrayBuilder = JSON.createArrayBuilder(); - for (World world : worlds) { - JsonObject json = world.toJson(); - arrayBuilder.add(json); - } - res.send(arrayBuilder.build()); + res.send(serialize(worlds)); } private int parseQueryCount(Parameters parameters) { - List values = parameters.all("queries"); - if (values.isEmpty()) { + OptionalValue value = parameters.first("queries"); + if (value.isEmpty()) { return 1; } - String first = values.get(0); int parsedValue; try { - parsedValue = Integer.parseInt(first, 10); + parsedValue = Integer.parseInt(value.get(), 10); } catch (NumberFormatException e) { return 1; } diff --git a/frameworks/Java/helidon/nima/src/main/resources/application.yaml b/frameworks/Java/helidon/nima/src/main/resources/application.yaml index ff4aa100b67..41f4d64ec12 100644 --- a/frameworks/Java/helidon/nima/src/main/resources/application.yaml +++ b/frameworks/Java/helidon/nima/src/main/resources/application.yaml @@ -19,6 +19,7 @@ server: port: 8080 backlog: 8192 write-queue-length: 8192 + smart-async-writes: true connection-options: read-timeout: PT0S connect-timeout: PT0S From 9c41401165cb12ba7425e3fd9138332c3ddf3614 Mon Sep 17 00:00:00 2001 From: Eddy Oyieko <67474838+mobley-trent@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:37:30 +0300 Subject: [PATCH 0839/1766] [scala/zio-http] updated to the latest RC version (#9325) * [zio-http] updated to the latest RC version * updated build.sbt, Main.scala --- frameworks/Scala/zio-http/build.sbt | 15 ++-- .../Scala/zio-http/project/build.properties | 2 +- frameworks/Scala/zio-http/project/plugins.sbt | 2 +- .../Scala/zio-http/src/main/scala/Main.scala | 85 ++++++++++--------- 4 files changed, 53 insertions(+), 51 deletions(-) diff --git a/frameworks/Scala/zio-http/build.sbt b/frameworks/Scala/zio-http/build.sbt index 987ee8cbbd2..a985d9b5dc9 100644 --- a/frameworks/Scala/zio-http/build.sbt +++ b/frameworks/Scala/zio-http/build.sbt @@ -1,13 +1,14 @@ name := "zio-http" version := "1.0.0" -scalaVersion := "2.13.6" +scalaVersion := "2.13.14" lazy val root = (project in file(".")) .settings( - libraryDependencies ++= - Seq( - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.9.1", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.9.1" % "compile-internal", - "io.d11" % "zhttp" % "1.0.0-RC5", - ), + libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC10", testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"), + assembly / assemblyMergeStrategy := { + case x if x.contains("io.netty.versions.properties") => MergeStrategy.discard + case x => + val oldStrategy = (assembly / assemblyMergeStrategy).value + oldStrategy(x) + } ) diff --git a/frameworks/Scala/zio-http/project/build.properties b/frameworks/Scala/zio-http/project/build.properties index 215ddd2b39d..ee06c398644 100644 --- a/frameworks/Scala/zio-http/project/build.properties +++ b/frameworks/Scala/zio-http/project/build.properties @@ -1 +1 @@ -sbt.version = 1.5.5 \ No newline at end of file +sbt.version = 1.10.0 \ No newline at end of file diff --git a/frameworks/Scala/zio-http/project/plugins.sbt b/frameworks/Scala/zio-http/project/plugins.sbt index 585d1930dc6..ec25e7aa776 100644 --- a/frameworks/Scala/zio-http/project/plugins.sbt +++ b/frameworks/Scala/zio-http/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.0.0") +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.0") diff --git a/frameworks/Scala/zio-http/src/main/scala/Main.scala b/frameworks/Scala/zio-http/src/main/scala/Main.scala index b72da4e089c..8af102fd7f6 100644 --- a/frameworks/Scala/zio-http/src/main/scala/Main.scala +++ b/frameworks/Scala/zio-http/src/main/scala/Main.scala @@ -1,42 +1,43 @@ -import zhttp.http._ -import zhttp.service.Server -import zio.{App, ExitCode, URIO} -import com.github.plokhotnyuk.jsoniter_scala.macros._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import zhttp.http.Response - -import java.time.format.DateTimeFormatter -import java.time.{Instant, ZoneOffset} - -case class Message(message: String) - -object Main extends App { - val message: String = "Hello, World!" - implicit val codec: JsonValueCodec[Message] = JsonCodecMaker.make - - val app: Http[Any, HttpError, Request, Response] = Http.collect[Request] { - case Method.GET -> Root / "plaintext" => - Response.http( - content = HttpContent.Complete(message), - headers = Header.contentTypeTextPlain :: headers(), - ) - case Method.GET -> Root / "json" => - Response.http( - content = HttpContent.Complete(writeToString(Message(message))), - headers = Header.contentTypeJson :: headers(), - ) - } - - override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = Server.start(8080, app).exitCode - - val formatter: DateTimeFormatter = DateTimeFormatter.RFC_1123_DATE_TIME.withZone(ZoneOffset.UTC) - val constantHeaders: List[Header] = Header("server", "zio-http") :: Nil - @volatile var lastHeaders: (Long, List[Header]) = (0, Nil) - - def headers(): List[Header] = { - val t = System.currentTimeMillis() - if (t - lastHeaders._1 >= 1000) - lastHeaders = (t, Header("date", formatter.format(Instant.ofEpochMilli(t))) :: constantHeaders) - lastHeaders._2 - } -} +import zio._ +import zio.http._ +import zio.http.netty.NettyConfig +import zio.http.netty.NettyConfig.LeakDetectionLevel +import java.lang.{Runtime => JRuntime} + +object Main extends ZIOAppDefault { + + private val plainTextMessage: String = "hello, world!" + private val jsonMessage: String = """{"message": "hello, world!"}""" + + private val STATIC_SERVER_NAME = "zio-http" + private val NUM_PROCESSORS = JRuntime.getRuntime.availableProcessors() + + val app: Routes[Any, Response] = Routes( + Method.GET / "/plaintext" -> + Handler.fromResponse( + Response + .text(plainTextMessage) + .addHeader(Header.Server(STATIC_SERVER_NAME)), + ), + Method.GET / "/json" -> + Handler.fromResponse( + Response + .json(jsonMessage) + .addHeader(Header.Server(STATIC_SERVER_NAME)), + ), + ) + + private val config = Server.Config.default + .port(8080) + .enableRequestStreaming + + private val nettyConfig = NettyConfig.default + .leakDetection(LeakDetectionLevel.DISABLED) + .maxThreads(NUM_PROCESSORS) + + private val configLayer = ZLayer.succeed(config) + private val nettyConfigLayer = ZLayer.succeed(nettyConfig) + + val run: UIO[ExitCode] = + Server.serve(app).provide(configLayer, nettyConfigLayer, Server.customized).exitCode +} \ No newline at end of file From cae4e4320a8f836e68e85a360cc6b15e99fc7776 Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Tue, 15 Oct 2024 01:37:58 +0800 Subject: [PATCH 0840/1766] [Rust/Viz] viz v0.9.0 (#9307) --- frameworks/Rust/viz/Cargo.toml | 17 +++++++++++------ frameworks/Rust/viz/src/db_sqlx.rs | 6 +++--- frameworks/Rust/viz/templates/fortune.stpl | 4 ++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index f28595febb5..b2e90cb4836 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -24,23 +24,28 @@ path = "src/main_diesel.rs" required-features = ["diesel", "diesel-async", "sailfish"] [dependencies] -viz = "0.8" -hyper = "1.0" +viz = "0.9" +hyper = "1.4" hyper-util = "0.1" atoi = "2.0" serde = { version = "1.0", features = ["derive"] } -nanorand = "0.7" rand = { version = "0.8", features = ["small_rng"] } thiserror = "1.0" futures-util = "0.3" +[target.'cfg(not(unix))'.dependencies] +nanorand = { version = "0.7" } + +[target.'cfg(unix)'.dependencies] +nanorand = { version = "0.7", features = ["getrandom"] } + tokio = { version = "1", features = ["full"] } tokio-postgres = { version = "0.7", optional = true } -sqlx = { version = "0.7", features = [ +sqlx = { version = "0.8", features = [ "postgres", "macros", "runtime-tokio", - "tls-native-tls" + "tls-native-tls", ], optional = true } diesel = { version = "2.2", default-features = false, features = [ "i-implement-a-third-party-backend-and-opt-into-breaking-changes", @@ -53,7 +58,7 @@ diesel-async = { git = "https://github.com/weiznich/diesel_async.git", rev = "74 yarte = { version = "0.15", features = ["bytes-buf", "json"], optional = true } markup = { version = "0.15", optional = true } v_htmlescape = { version = "0.15", optional = true } -sailfish = { version = "0.8", optional = true } +sailfish = { version = "0.9", optional = true } [profile.release] lto = true diff --git a/frameworks/Rust/viz/src/db_sqlx.rs b/frameworks/Rust/viz/src/db_sqlx.rs index af8322e9d1d..40c39290265 100644 --- a/frameworks/Rust/viz/src/db_sqlx.rs +++ b/frameworks/Rust/viz/src/db_sqlx.rs @@ -60,7 +60,7 @@ pub async fn get_world( id: i32, ) -> Result { let mut args = PgArguments::default(); - args.add(id); + let _ = args.add(id); let world = sqlx::query_as_with("SELECT id, randomnumber FROM World WHERE id = $1", args) @@ -86,8 +86,8 @@ pub async fn update_worlds( for w in &worlds { let mut args = PgArguments::default(); - args.add(w.randomnumber); - args.add(w.id); + let _ = args.add(w.randomnumber); + let _ = args.add(w.id); sqlx::query_with("UPDATE World SET randomNumber = $1 WHERE id = $2", args) .execute(&mut *conn) diff --git a/frameworks/Rust/viz/templates/fortune.stpl b/frameworks/Rust/viz/templates/fortune.stpl index eb1abe6a4fa..874b48cc6f5 100644 --- a/frameworks/Rust/viz/templates/fortune.stpl +++ b/frameworks/Rust/viz/templates/fortune.stpl @@ -4,7 +4,7 @@ - <% for item in items { %><% } %> + <% for item in self.items { %><% } %>
      idmessage
      <%= item.id %><%= &*item.message %>
      <%= item.id %><%= &*item.message %>
      - \ No newline at end of file + From 1b2161a78292158a81c7d63c7bb742e05e6b69f8 Mon Sep 17 00:00:00 2001 From: Yan Kun <1939810907@qq.com> Date: Tue, 15 Oct 2024 01:38:23 +0800 Subject: [PATCH 0841/1766] [Scala/otavia] Turn off nio optimization. (#9318) --- frameworks/Scala/otavia/otavia-overshoot.dockerfile | 2 ++ frameworks/Scala/otavia/otavia.dockerfile | 2 ++ 2 files changed, 4 insertions(+) diff --git a/frameworks/Scala/otavia/otavia-overshoot.dockerfile b/frameworks/Scala/otavia/otavia-overshoot.dockerfile index 10df5b40e71..78a03840454 100644 --- a/frameworks/Scala/otavia/otavia-overshoot.dockerfile +++ b/frameworks/Scala/otavia/otavia-overshoot.dockerfile @@ -9,6 +9,8 @@ EXPOSE 8080 CMD java -server \ -Dcc.otavia.actor.worker.size=64 \ + -Dcc.otavia.buffer.page.size=8 \ + -Dio.netty5.noKeySetOptimization=true \ -jar \ out/benchmark/assembly.dest/out.jar \ jdbc:postgresql://tfb-database:5432/hello_world \ diff --git a/frameworks/Scala/otavia/otavia.dockerfile b/frameworks/Scala/otavia/otavia.dockerfile index 81e16063b03..f1bbd33234c 100644 --- a/frameworks/Scala/otavia/otavia.dockerfile +++ b/frameworks/Scala/otavia/otavia.dockerfile @@ -9,6 +9,8 @@ EXPOSE 8080 CMD java -server \ -Dcc.otavia.actor.worker.size=56 \ + -Dcc.otavia.buffer.page.size=8 \ + -Dio.netty5.noKeySetOptimization=true \ -jar \ out/benchmark/assembly.dest/out.jar \ jdbc:postgresql://tfb-database:5432/hello_world \ From c94f7f95bd751f86a57dea8b63fb8f336bdbbde3 Mon Sep 17 00:00:00 2001 From: Artur Date: Mon, 14 Oct 2024 19:39:06 +0200 Subject: [PATCH 0842/1766] feat: log testing docker resource usage statistics [ci fw-only Fortran/fortran.io] (#9238) --- toolset/benchmark/benchmarker.py | 41 +++++++++++++++++++++++++------- toolset/utils/docker_helper.py | 12 +++------- toolset/utils/results.py | 29 ++++++++++++---------- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/toolset/benchmark/benchmarker.py b/toolset/benchmark/benchmarker.py index 84e6be29912..8b5ce49d65b 100644 --- a/toolset/benchmark/benchmarker.py +++ b/toolset/benchmark/benchmarker.py @@ -1,3 +1,6 @@ +import threading + +from docker.models.containers import Container from toolset.utils.output_helper import log, FNULL from toolset.utils.docker_helper import DockerHelper from toolset.utils.time_logger import TimeLogger @@ -263,12 +266,6 @@ def benchmark_type(test_type): log("BENCHMARKING %s ... " % test_type.upper(), file=benchmark_log) test = framework_test.runTests[test_type] - raw_file = self.results.get_raw_file(framework_test.name, - test_type) - if not os.path.exists(raw_file): - # Open to create the empty file - with open(raw_file, 'w'): - pass if not test.failed: # Begin resource usage metrics collection @@ -281,8 +278,8 @@ def benchmark_type(test_type): framework_test.port, test.get_url())) - self.docker_helper.benchmark(script, script_variables, - raw_file) + benchmark_container = self.docker_helper.benchmark(script, script_variables) + self.__log_container_output(benchmark_container, framework_test, test_type) # End resource usage metrics collection self.__end_logging() @@ -323,3 +320,31 @@ def __end_logging(self): self.subprocess_handle.terminate() self.subprocess_handle.communicate() + def __log_container_output(self, container: Container, framework_test, test_type) -> None: + def save_docker_logs(stream): + raw_file_path = self.results.get_raw_file(framework_test.name, test_type) + with open(raw_file_path, 'w') as file: + for line in stream: + log(line.decode(), file=file) + + def save_docker_stats(stream): + docker_file_path = self.results.get_docker_stats_file(framework_test.name, test_type) + with open(docker_file_path, 'w') as file: + file.write('[\n') + is_first_line = True + for line in stream: + if is_first_line: + is_first_line = False + else: + file.write(',') + file.write(line.decode()) + file.write(']') + + threads = [ + threading.Thread(target=lambda: save_docker_logs(container.logs(stream=True))), + threading.Thread(target=lambda: save_docker_stats(container.stats(stream=True))) + ] + + [thread.start() for thread in threads] + [thread.join() for thread in threads] + diff --git a/toolset/utils/docker_helper.py b/toolset/utils/docker_helper.py index 1f3ea692ee1..e48a910e99d 100644 --- a/toolset/utils/docker_helper.py +++ b/toolset/utils/docker_helper.py @@ -420,16 +420,11 @@ def server_container_exists(self, container_id_or_name): except: return False - def benchmark(self, script, variables, raw_file): + def benchmark(self, script, variables): ''' Runs the given remote_script on the wrk container on the client machine. ''' - def watch_container(container): - with open(raw_file, 'w') as benchmark_file: - for line in container.logs(stream=True): - log(line.decode(), file=benchmark_file) - if self.benchmarker.config.network_mode is None: sysctl = {'net.core.somaxconn': 65535} else: @@ -438,8 +433,7 @@ def watch_container(container): ulimit = [{'name': 'nofile', 'hard': 65535, 'soft': 65535}] - watch_container( - self.client.containers.run( + return self.client.containers.run( "techempower/tfb.wrk", "/bin/bash /%s" % script, environment=variables, @@ -450,4 +444,4 @@ def watch_container(container): ulimits=ulimit, sysctls=sysctl, remove=True, - log_config={'type': None})) + log_config={'type': None}) diff --git a/toolset/utils/results.py b/toolset/utils/results.py index 7b745a90bc0..0df26636404 100644 --- a/toolset/utils/results.py +++ b/toolset/utils/results.py @@ -212,29 +212,34 @@ def load(self): except (ValueError, IOError): pass + def __make_dir_for_file(self, test_name: str, test_type: str, file_name: str): + path = os.path.join(self.directory, test_name, test_type, file_name) + try: + os.makedirs(os.path.dirname(path), exist_ok=True) + except OSError: + pass + return path + + def get_docker_stats_file(self, test_name, test_type): + ''' + Returns the stats file name for this test_name and + Example: fw_root/results/timestamp/test_type/test_name/stats.txt + ''' + return self.__make_dir_for_file(test_name, test_type, "docker_stats.json") + def get_raw_file(self, test_name, test_type): ''' Returns the output file for this test_name and test_type Example: fw_root/results/timestamp/test_type/test_name/raw.txt ''' - path = os.path.join(self.directory, test_name, test_type, "raw.txt") - try: - os.makedirs(os.path.dirname(path)) - except OSError: - pass - return path + return self.__make_dir_for_file(test_name, test_type, "raw.txt") def get_stats_file(self, test_name, test_type): ''' Returns the stats file name for this test_name and Example: fw_root/results/timestamp/test_type/test_name/stats.txt ''' - path = os.path.join(self.directory, test_name, test_type, "stats.txt") - try: - os.makedirs(os.path.dirname(path)) - except OSError: - pass - return path + return self.__make_dir_for_file(test_name, test_type, "stats.txt") def report_verify_results(self, framework_test, test_type, result): ''' From 45dadf82f72c3ca7d9018b3edc052de7739d6b11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:48:28 +0000 Subject: [PATCH 0843/1766] Bump Microsoft.Extensions.Caching.Memory Bumps [Microsoft.Extensions.Caching.Memory](https://github.com/dotnet/runtime) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1) --- updated-dependencies: - dependency-name: Microsoft.Extensions.Caching.Memory dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj index d6a786daa3b..7518d6b0de0 100644 --- a/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj +++ b/frameworks/CSharp/beetlex/PlatformBenchmarks/PlatformBenchmarks.csproj @@ -9,7 +9,7 @@ - + From 427066cc89b6415e7549a52c13efd0cf27c8cb32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 21:09:16 +0000 Subject: [PATCH 0844/1766] Bump org.eclipse.jetty:jetty-server in /frameworks/Java/jetty Bumps org.eclipse.jetty:jetty-server from 10.0.14 to 10.0.24. --- updated-dependencies: - dependency-name: org.eclipse.jetty:jetty-server dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/jetty/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/jetty/pom.xml b/frameworks/Java/jetty/pom.xml index db5ba4a6b7b..6156c5603f8 100644 --- a/frameworks/Java/jetty/pom.xml +++ b/frameworks/Java/jetty/pom.xml @@ -11,7 +11,7 @@ UTF-8 11 11 - 10.0.14 + 10.0.24 hello.handler.HelloWebServer From dc0bded626057d0241e0a0fbda44acabfc31ca9f Mon Sep 17 00:00:00 2001 From: Roman Samoilov <2270393+rsamoilov@users.noreply.github.com> Date: Tue, 15 Oct 2024 19:19:24 +0100 Subject: [PATCH 0845/1766] [ruby/rage] Code cleanup (#9305) * Remove `load_middlewares` call `Rage.load_middlewares` was deprecated in v1.5 * Bump to Rage >= 1.10 * Remove `as_json` overrides * Remove env variable `RAGE_PATCH_AR_POOL` is enabled by default since v1.10 * Let Rage connect to the DB --- frameworks/Ruby/rage/Gemfile | 2 +- frameworks/Ruby/rage/app/models/fortune.rb | 4 ---- frameworks/Ruby/rage/app/models/world.rb | 4 ---- frameworks/Ruby/rage/config.ru | 1 - .../Ruby/rage/config/initializers/activerecord.rb | 15 +++------------ frameworks/Ruby/rage/rage.dockerfile | 1 - 6 files changed, 4 insertions(+), 23 deletions(-) diff --git a/frameworks/Ruby/rage/Gemfile b/frameworks/Ruby/rage/Gemfile index 96d6e7042fc..89c3affcb58 100644 --- a/frameworks/Ruby/rage/Gemfile +++ b/frameworks/Ruby/rage/Gemfile @@ -1,6 +1,6 @@ source "https://rubygems.org" -gem "rage-rb", "~> 1.3" +gem "rage-rb", "~> 1.10" gem "pg", "~> 1.0" gem "activerecord", "~> 7.2.0", require: "active_record" diff --git a/frameworks/Ruby/rage/app/models/fortune.rb b/frameworks/Ruby/rage/app/models/fortune.rb index 6b7ad122f80..0080d6363c4 100644 --- a/frameworks/Ruby/rage/app/models/fortune.rb +++ b/frameworks/Ruby/rage/app/models/fortune.rb @@ -1,7 +1,3 @@ class Fortune < ApplicationRecord self.table_name = "Fortune" - - def as_json(*) - attributes - end end diff --git a/frameworks/Ruby/rage/app/models/world.rb b/frameworks/Ruby/rage/app/models/world.rb index 951aab55b64..836783137c6 100644 --- a/frameworks/Ruby/rage/app/models/world.rb +++ b/frameworks/Ruby/rage/app/models/world.rb @@ -1,9 +1,5 @@ class World < ApplicationRecord self.table_name = "World" - def as_json(*) - attributes - end - alias_attribute(:randomNumber, :randomnumber) end diff --git a/frameworks/Ruby/rage/config.ru b/frameworks/Ruby/rage/config.ru index 52de8a40479..049a1ad509d 100644 --- a/frameworks/Ruby/rage/config.ru +++ b/frameworks/Ruby/rage/config.ru @@ -1,4 +1,3 @@ require_relative "config/application" run Rage.application -Rage.load_middlewares(self) diff --git a/frameworks/Ruby/rage/config/initializers/activerecord.rb b/frameworks/Ruby/rage/config/initializers/activerecord.rb index c0e3eb08d44..34a3b019a66 100644 --- a/frameworks/Ruby/rage/config/initializers/activerecord.rb +++ b/frameworks/Ruby/rage/config/initializers/activerecord.rb @@ -2,16 +2,7 @@ require "etc" -connection = { - adapter: "postgresql", - host: "tfb-database", - username: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world", - reaping_frequency: 0, - pool: (2 * Math.log(256 / Etc.nprocessors)).floor -} +pool_size = (2 * Math.log(256 / Etc.nprocessors)).floor +puts "ActiveRecord pool size: #{pool_size}" -puts "ActiveRecord connection options: #{connection.inspect}" - -ActiveRecord::Base.establish_connection(connection) +ENV["DATABASE_URL"]="postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world?pool=#{pool_size}&reaping_frequency=0" diff --git a/frameworks/Ruby/rage/rage.dockerfile b/frameworks/Ruby/rage/rage.dockerfile index bbacb344f29..6c65b51fba4 100644 --- a/frameworks/Ruby/rage/rage.dockerfile +++ b/frameworks/Ruby/rage/rage.dockerfile @@ -8,7 +8,6 @@ RUN bundle install --jobs=8 COPY . /rage ENV RUBY_YJIT_ENABLE=1 -ENV RAGE_PATCH_AR_POOL=1 ENV BUNDLE_FORCE_RUBY_PLATFORM=true CMD bundle exec rage s -b 0.0.0.0 -p 8080 -e production From 15f905aae6573cce50a062e59c80f7042b98a9d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 18:59:58 +0000 Subject: [PATCH 0846/1766] Bump starlette from 0.36.2 to 0.40.0 in /frameworks/Python/starlette Bumps [starlette](https://github.com/encode/starlette) from 0.36.2 to 0.40.0. - [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.36.2...0.40.0) --- 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 ef5a1748ca4..47b27a87e9a 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -6,6 +6,6 @@ Jinja2==3.1.4 MarkupSafe==2.1.1 python-dotenv==0.20.0 PyYAML==6.0 -starlette==0.36.2 +starlette==0.40.0 uvicorn==0.20.0 uvloop==0.17.0 From a9b944e3e276ac1b4bfa08ffe70f600b6fe8d06c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 23:42:12 +0000 Subject: [PATCH 0847/1766] Bump actiontext from 7.2.0 to 7.2.1.1 in /frameworks/Ruby/rails Bumps [actiontext](https://github.com/rails/rails) from 7.2.0 to 7.2.1.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1.1/actiontext/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.0...v7.2.1.1) --- updated-dependencies: - dependency-name: actiontext dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 114 ++++++++++++++--------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index dfa97091616..d92307f837d 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.2.0) - actionpack (= 7.2.0) - activesupport (= 7.2.0) + actioncable (7.2.1.1) + actionpack (= 7.2.1.1) + activesupport (= 7.2.1.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.2.0) - actionpack (= 7.2.0) - activejob (= 7.2.0) - activerecord (= 7.2.0) - activestorage (= 7.2.0) - activesupport (= 7.2.0) + actionmailbox (7.2.1.1) + actionpack (= 7.2.1.1) + activejob (= 7.2.1.1) + activerecord (= 7.2.1.1) + activestorage (= 7.2.1.1) + activesupport (= 7.2.1.1) mail (>= 2.8.0) - actionmailer (7.2.0) - actionpack (= 7.2.0) - actionview (= 7.2.0) - activejob (= 7.2.0) - activesupport (= 7.2.0) + actionmailer (7.2.1.1) + actionpack (= 7.2.1.1) + actionview (= 7.2.1.1) + activejob (= 7.2.1.1) + activesupport (= 7.2.1.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.0) - actionview (= 7.2.0) - activesupport (= 7.2.0) + actionpack (7.2.1.1) + actionview (= 7.2.1.1) + activesupport (= 7.2.1.1) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -32,35 +32,35 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (7.2.0) - actionpack (= 7.2.0) - activerecord (= 7.2.0) - activestorage (= 7.2.0) - activesupport (= 7.2.0) + actiontext (7.2.1.1) + actionpack (= 7.2.1.1) + activerecord (= 7.2.1.1) + activestorage (= 7.2.1.1) + activesupport (= 7.2.1.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.2.0) - activesupport (= 7.2.0) + actionview (7.2.1.1) + activesupport (= 7.2.1.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.0) - activesupport (= 7.2.0) + activejob (7.2.1.1) + activesupport (= 7.2.1.1) globalid (>= 0.3.6) - activemodel (7.2.0) - activesupport (= 7.2.0) - activerecord (7.2.0) - activemodel (= 7.2.0) - activesupport (= 7.2.0) + activemodel (7.2.1.1) + activesupport (= 7.2.1.1) + activerecord (7.2.1.1) + activemodel (= 7.2.1.1) + activesupport (= 7.2.1.1) timeout (>= 0.4.0) - activestorage (7.2.0) - actionpack (= 7.2.0) - activejob (= 7.2.0) - activerecord (= 7.2.0) - activesupport (= 7.2.0) + activestorage (7.2.1.1) + actionpack (= 7.2.1.1) + activejob (= 7.2.1.1) + activerecord (= 7.2.1.1) + activesupport (= 7.2.1.1) marcel (~> 1.0) - activesupport (7.2.0) + activesupport (7.2.1.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -82,13 +82,13 @@ GEM erubi (1.13.0) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) io-console (0.7.2) irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - logger (1.6.0) + logger (1.6.1) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -100,7 +100,7 @@ GEM marcel (1.0.4) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.24.1) + minitest (5.25.1) net-imap (0.4.14) date net-protocol @@ -128,7 +128,7 @@ GEM puma (6.4.2) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.7) + rack (3.1.8) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -136,20 +136,20 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) - rails (7.2.0) - actioncable (= 7.2.0) - actionmailbox (= 7.2.0) - actionmailer (= 7.2.0) - actionpack (= 7.2.0) - actiontext (= 7.2.0) - actionview (= 7.2.0) - activejob (= 7.2.0) - activemodel (= 7.2.0) - activerecord (= 7.2.0) - activestorage (= 7.2.0) - activesupport (= 7.2.0) + rails (7.2.1.1) + actioncable (= 7.2.1.1) + actionmailbox (= 7.2.1.1) + actionmailer (= 7.2.1.1) + actionpack (= 7.2.1.1) + actiontext (= 7.2.1.1) + actionview (= 7.2.1.1) + activejob (= 7.2.1.1) + activemodel (= 7.2.1.1) + activerecord (= 7.2.1.1) + activestorage (= 7.2.1.1) + activesupport (= 7.2.1.1) bundler (>= 1.15.0) - railties (= 7.2.0) + railties (= 7.2.1.1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -157,9 +157,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.0) - actionpack (= 7.2.0) - activesupport (= 7.2.0) + railties (7.2.1.1) + actionpack (= 7.2.1.1) + activesupport (= 7.2.1.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From 33881f8e29d9512b0cc4928efc9482f2c9ddd00a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 23:42:13 +0000 Subject: [PATCH 0848/1766] Bump actionpack from 7.2.0 to 7.2.1.1 in /frameworks/Ruby/rails Bumps [actionpack](https://github.com/rails/rails) from 7.2.0 to 7.2.1.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1.1/actionpack/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.0...v7.2.1.1) --- updated-dependencies: - dependency-name: actionpack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 114 ++++++++++++++--------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index dfa97091616..d92307f837d 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.2.0) - actionpack (= 7.2.0) - activesupport (= 7.2.0) + actioncable (7.2.1.1) + actionpack (= 7.2.1.1) + activesupport (= 7.2.1.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.2.0) - actionpack (= 7.2.0) - activejob (= 7.2.0) - activerecord (= 7.2.0) - activestorage (= 7.2.0) - activesupport (= 7.2.0) + actionmailbox (7.2.1.1) + actionpack (= 7.2.1.1) + activejob (= 7.2.1.1) + activerecord (= 7.2.1.1) + activestorage (= 7.2.1.1) + activesupport (= 7.2.1.1) mail (>= 2.8.0) - actionmailer (7.2.0) - actionpack (= 7.2.0) - actionview (= 7.2.0) - activejob (= 7.2.0) - activesupport (= 7.2.0) + actionmailer (7.2.1.1) + actionpack (= 7.2.1.1) + actionview (= 7.2.1.1) + activejob (= 7.2.1.1) + activesupport (= 7.2.1.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.0) - actionview (= 7.2.0) - activesupport (= 7.2.0) + actionpack (7.2.1.1) + actionview (= 7.2.1.1) + activesupport (= 7.2.1.1) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -32,35 +32,35 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (7.2.0) - actionpack (= 7.2.0) - activerecord (= 7.2.0) - activestorage (= 7.2.0) - activesupport (= 7.2.0) + actiontext (7.2.1.1) + actionpack (= 7.2.1.1) + activerecord (= 7.2.1.1) + activestorage (= 7.2.1.1) + activesupport (= 7.2.1.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.2.0) - activesupport (= 7.2.0) + actionview (7.2.1.1) + activesupport (= 7.2.1.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.0) - activesupport (= 7.2.0) + activejob (7.2.1.1) + activesupport (= 7.2.1.1) globalid (>= 0.3.6) - activemodel (7.2.0) - activesupport (= 7.2.0) - activerecord (7.2.0) - activemodel (= 7.2.0) - activesupport (= 7.2.0) + activemodel (7.2.1.1) + activesupport (= 7.2.1.1) + activerecord (7.2.1.1) + activemodel (= 7.2.1.1) + activesupport (= 7.2.1.1) timeout (>= 0.4.0) - activestorage (7.2.0) - actionpack (= 7.2.0) - activejob (= 7.2.0) - activerecord (= 7.2.0) - activesupport (= 7.2.0) + activestorage (7.2.1.1) + actionpack (= 7.2.1.1) + activejob (= 7.2.1.1) + activerecord (= 7.2.1.1) + activesupport (= 7.2.1.1) marcel (~> 1.0) - activesupport (7.2.0) + activesupport (7.2.1.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -82,13 +82,13 @@ GEM erubi (1.13.0) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) io-console (0.7.2) irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - logger (1.6.0) + logger (1.6.1) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -100,7 +100,7 @@ GEM marcel (1.0.4) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.24.1) + minitest (5.25.1) net-imap (0.4.14) date net-protocol @@ -128,7 +128,7 @@ GEM puma (6.4.2) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.7) + rack (3.1.8) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -136,20 +136,20 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) - rails (7.2.0) - actioncable (= 7.2.0) - actionmailbox (= 7.2.0) - actionmailer (= 7.2.0) - actionpack (= 7.2.0) - actiontext (= 7.2.0) - actionview (= 7.2.0) - activejob (= 7.2.0) - activemodel (= 7.2.0) - activerecord (= 7.2.0) - activestorage (= 7.2.0) - activesupport (= 7.2.0) + rails (7.2.1.1) + actioncable (= 7.2.1.1) + actionmailbox (= 7.2.1.1) + actionmailer (= 7.2.1.1) + actionpack (= 7.2.1.1) + actiontext (= 7.2.1.1) + actionview (= 7.2.1.1) + activejob (= 7.2.1.1) + activemodel (= 7.2.1.1) + activerecord (= 7.2.1.1) + activestorage (= 7.2.1.1) + activesupport (= 7.2.1.1) bundler (>= 1.15.0) - railties (= 7.2.0) + railties (= 7.2.1.1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -157,9 +157,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.0) - actionpack (= 7.2.0) - activesupport (= 7.2.0) + railties (7.2.1.1) + actionpack (= 7.2.1.1) + activesupport (= 7.2.1.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From ee7f895d6b213deee2a8cf846dbeeb5d972e38af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:13:40 +0000 Subject: [PATCH 0849/1766] Bump io.undertow:undertow-core in /frameworks/Java/undertow Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.14.Final to 2.3.17.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.14.Final...2.3.17.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 da2a6dd086b..133d1ce186c 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -20,7 +20,7 @@ 3.2.2 0.9.10 42.7.2 - 2.3.14.Final + 2.3.17.Final From 7dfbdfc73e2c8dc0099b132e1962a9f6156eada6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 22 Oct 2024 16:37:28 +0200 Subject: [PATCH 0850/1766] [ruby/sinatra] Upgrade Sinatra to v4 (#9347) --- frameworks/Ruby/sinatra-sequel/Gemfile | 2 +- frameworks/Ruby/sinatra-sequel/README.md | 4 ++-- frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/README.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index f4ac3eb1fe2..4aace641277 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -4,7 +4,7 @@ gem 'oj' gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' -gem 'sinatra', '~> 3.0', :require=>'sinatra/base' +gem 'sinatra', '~> 4.0', :require=>'sinatra/base' gem 'unicorn', '~> 6.1', :platforms=>[:ruby, :mswin], :require=>false group :mysql do diff --git a/frameworks/Ruby/sinatra-sequel/README.md b/frameworks/Ruby/sinatra-sequel/README.md index 147e20cb2ed..9f382526d82 100644 --- a/frameworks/Ruby/sinatra-sequel/README.md +++ b/frameworks/Ruby/sinatra-sequel/README.md @@ -15,9 +15,9 @@ The tests will be run with: * [Ruby 3.3](http://www.ruby-lang.org) * [JRuby 9.4](http://jruby.org) * [Puma 6](http://puma.io) -* [Passenger 5](https://www.phusionpassenger.com) +* [Passenger 6](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) -* [Sinatra 3](http://www.sinatrarb.com) +* [Sinatra 4](http://www.sinatrarb.com) * [Sequel 5](http://sequel.jeremyevans.net) * [Slim 3](http://slim-lang.com) * [MySQL 5.5](https://www.mysql.com) diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index ff34570a2cb..b7db27d395f 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -4,7 +4,7 @@ gem 'activerecord', '~> 7.1', require: 'active_record' gem 'oj' gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false gem 'puma', '~> 6.4', require: false -gem 'sinatra', '~> 3.0', require: 'sinatra/base' +gem 'sinatra', '~> 4.0', require: 'sinatra/base' gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false group :mysql do diff --git a/frameworks/Ruby/sinatra/README.md b/frameworks/Ruby/sinatra/README.md index ff118f6ff21..e0f14b9a171 100644 --- a/frameworks/Ruby/sinatra/README.md +++ b/frameworks/Ruby/sinatra/README.md @@ -16,7 +16,7 @@ The tests will be run with: * [Puma 6](http://puma.io) * [Passenger 6](https://www.phusionpassenger.com) * [Unicorn 6](https://bogomips.org/unicorn/) -* [Sinatra 3](http://www.sinatrarb.com) +* [Sinatra 4](http://www.sinatrarb.com) * [ActiveRecord 7](https://github.com/rails/rails/tree/master/activerecord) * [MySQL 5.5](https://www.mysql.com) * [Postgres 9.3](https://www.postgresql.org) From e2c0eecfb9b0e5d34e12b674e7ddaa4c1c2cd751 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:38:14 +0000 Subject: [PATCH 0851/1766] Bump io.undertow:undertow-core in /frameworks/Java/undertow-jersey Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.16.Final to 2.3.17.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.16.Final...2.3.17.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/undertow-jersey/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/undertow-jersey/pom.xml b/frameworks/Java/undertow-jersey/pom.xml index 6c2ced9b7a1..af553eea552 100644 --- a/frameworks/Java/undertow-jersey/pom.xml +++ b/frameworks/Java/undertow-jersey/pom.xml @@ -174,7 +174,7 @@ io.undertow undertow-core - 2.3.16.Final + 2.3.17.Final From 920ec79bd8f05447519290d61b504b7f8641dc8a Mon Sep 17 00:00:00 2001 From: Redkale Date: Tue, 22 Oct 2024 22:42:10 +0800 Subject: [PATCH 0852/1766] Remove redkale-graalvm (#9346) --- frameworks/Java/redkale/BenchmarkService.java | 78 ------------------- frameworks/Java/redkale/benchmark_config.json | 46 ----------- frameworks/Java/redkale/config.toml | 34 -------- frameworks/Java/redkale/pom-jdbc.xml | 2 +- frameworks/Java/redkale/pom.xml | 2 + .../Java/redkale/redkale-block.dockerfile | 17 ---- .../Java/redkale/redkale-graalvm.dockerfile | 16 ---- .../Java/redkale/redkale-jdbc.dockerfile | 3 +- .../Java/redkale/redkale-pgclient.dockerfile | 2 +- frameworks/Java/redkale/redkale.dockerfile | 2 +- 10 files changed, 6 insertions(+), 196 deletions(-) delete mode 100644 frameworks/Java/redkale/BenchmarkService.java delete mode 100644 frameworks/Java/redkale/redkale-block.dockerfile delete mode 100644 frameworks/Java/redkale/redkale-graalvm.dockerfile diff --git a/frameworks/Java/redkale/BenchmarkService.java b/frameworks/Java/redkale/BenchmarkService.java deleted file mode 100644 index 558cbe2fbb2..00000000000 --- a/frameworks/Java/redkale/BenchmarkService.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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.ThreadLocalRandom; -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 2371e0e2bec..52f8550ce9f 100644 --- a/frameworks/Java/redkale/benchmark_config.json +++ b/frameworks/Java/redkale/benchmark_config.json @@ -26,30 +26,6 @@ "notes": "", "versus": "Redkale" }, - "graalvm": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?q=", - "fortune_url": "/fortunes", - "update_url": "/updates?q=", - "cached_query_url": "/cached-worlds?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-graalvm", - "notes": "", - "versus": "Redkale" - }, "native": { "plaintext_url": "/plaintext", "json_url": "/json", @@ -95,28 +71,6 @@ "notes": "", "versus": "Redkale" }, - "block": { - "plaintext_url": "/plaintext", - "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" - }, "pgclient": { "db_url": "/db", "query_url": "/queries?q=", diff --git a/frameworks/Java/redkale/config.toml b/frameworks/Java/redkale/config.toml index 96d8a7f4bf8..149aaad007e 100644 --- a/frameworks/Java/redkale/config.toml +++ b/frameworks/Java/redkale/config.toml @@ -19,24 +19,6 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[graalvm] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.fortune = "/fortunes" -urls.query = "/queries?q=" -urls.update = "/updates?q=" -urls.cached_query = "/cached-worlds?q=" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Redkale" -webserver = "Redkale" -versus = "Redkale" - [native] urls.plaintext = "/plaintext" urls.json = "/json" @@ -70,22 +52,6 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[block] -urls.plaintext = "/plaintext" -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" - [pgclient] urls.db = "/db" urls.fortune = "/fortunes" diff --git a/frameworks/Java/redkale/pom-jdbc.xml b/frameworks/Java/redkale/pom-jdbc.xml index e617e4e4059..86b6c6d5fd6 100644 --- a/frameworks/Java/redkale/pom-jdbc.xml +++ b/frameworks/Java/redkale/pom-jdbc.xml @@ -8,7 +8,7 @@ org.redkale.boot.Application 2.8.0-SNAPSHOT - 1.3.0-SNAPSHOT + 1.2.0-SNAPSHOT 42.7.2 UTF-8 21 diff --git a/frameworks/Java/redkale/pom.xml b/frameworks/Java/redkale/pom.xml index 8844a8b7aff..3c7970fb4e3 100644 --- a/frameworks/Java/redkale/pom.xml +++ b/frameworks/Java/redkale/pom.xml @@ -79,6 +79,8 @@ --no-fallback + -J-XX:+UseNUMA + -J-XX:+UseParallelGC diff --git a/frameworks/Java/redkale/redkale-block.dockerfile b/frameworks/Java/redkale/redkale-block.dockerfile deleted file mode 100644 index 55e13c76b73..00000000000 --- a/frameworks/Java/redkale/redkale-block.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM maven:3.9.6-amazoncorretto-21-debian 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:23-jdk-slim -WORKDIR /redkale -COPY conf conf -RUN sed -i 's/sameHeader="true"/ /g' /redkale/conf/application.xml -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-graalvm.dockerfile b/frameworks/Java/redkale/redkale-graalvm.dockerfile deleted file mode 100644 index 0e3a9a4a597..00000000000 --- a/frameworks/Java/redkale/redkale-graalvm.dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM maven:3.9.6-amazoncorretto-21-debian as maven -WORKDIR /redkale -COPY src src -COPY conf conf -COPY pom.xml pom.xml -RUN mvn package -q - - -FROM ghcr.io/graalvm/jdk-community:22.0.2 -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"] diff --git a/frameworks/Java/redkale/redkale-jdbc.dockerfile b/frameworks/Java/redkale/redkale-jdbc.dockerfile index b39997adf5f..ac3a85bec8b 100644 --- a/frameworks/Java/redkale/redkale-jdbc.dockerfile +++ b/frameworks/Java/redkale/redkale-jdbc.dockerfile @@ -3,7 +3,6 @@ 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:23-jdk-slim @@ -13,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file diff --git a/frameworks/Java/redkale/redkale-pgclient.dockerfile b/frameworks/Java/redkale/redkale-pgclient.dockerfile index 6da37e715c5..af47b952c72 100644 --- a/frameworks/Java/redkale/redkale-pgclient.dockerfile +++ b/frameworks/Java/redkale/redkale-pgclient.dockerfile @@ -12,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file diff --git a/frameworks/Java/redkale/redkale.dockerfile b/frameworks/Java/redkale/redkale.dockerfile index 4bb09a8dd56..79ec585c205 100644 --- a/frameworks/Java/redkale/redkale.dockerfile +++ b/frameworks/Java/redkale/redkale.dockerfile @@ -12,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] From 8e053f0514bba3b2a92b3ac4fc0c21af63c1b6d9 Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:42:24 +0100 Subject: [PATCH 0853/1766] perf: remove arc used in cached query test to increase performance (#9343) --- frameworks/Rust/axum/src/main_sqlx.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/frameworks/Rust/axum/src/main_sqlx.rs b/frameworks/Rust/axum/src/main_sqlx.rs index d10b1ea99ef..163372b83d8 100644 --- a/frameworks/Rust/axum/src/main_sqlx.rs +++ b/frameworks/Rust/axum/src/main_sqlx.rs @@ -1,8 +1,6 @@ mod common; mod sqlx; -use std::sync::Arc; - use ::sqlx::PgPool; use axum::{ extract::{Query, State}, @@ -98,7 +96,7 @@ async fn cache( ) -> impl IntoResponse { let count = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let mut worlds: Vec>> = Vec::with_capacity(count); + let mut worlds: Vec> = Vec::with_capacity(count); for id in random_ids(&mut rng, count) { worlds.push(cache.get(&id).await); @@ -115,14 +113,15 @@ async fn preload_cache(AppState { db, cache }: &AppState) { .expect("error loading worlds"); for world in worlds { - cache.insert(world.id, Arc::new(world)).await; + cache.insert(world.id, world).await; } } +/// Application state #[derive(Clone)] struct AppState { db: PgPool, - cache: Cache>, + cache: Cache, } #[tokio::main] @@ -135,7 +134,10 @@ async fn main() { let state = AppState { db: create_pool(database_url, max_pool_size, min_pool_size).await, - cache: Cache::new(10000), + cache: Cache::builder() + .initial_capacity(10000) + .max_capacity(10000) + .build() }; // Prime the cache with CachedWorld objects From 25b97fdb7a46bef800b690d3ba861d9e1535194b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Tue, 22 Oct 2024 16:42:42 +0200 Subject: [PATCH 0854/1766] Leverage R2BDC recent optimizations (#9341) Should improve some DB tests very significantly under high load! --- frameworks/Java/spring-webflux/pom.xml | 2 ++ .../repository/R2dbcDbRepository.java | 19 ++++--------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index 500e9fc8e07..7e1b6865d2d 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -19,6 +19,8 @@ 21 1.3.6 + 1.0.2.RELEASE + 1.0.7.RELEASE diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java index 3cbf5f66d4a..c2524f07862 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java @@ -6,8 +6,6 @@ import benchmark.model.Fortune; import benchmark.model.World; -import io.r2dbc.spi.Connection; -import io.r2dbc.spi.ConnectionFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -16,12 +14,9 @@ public class R2dbcDbRepository implements DbRepository { private final DatabaseClient databaseClient; - private final ConnectionFactory connectionFactory; - private final ThreadLocal> conn = new ThreadLocal<>(); public R2dbcDbRepository(DatabaseClient databaseClient) { this.databaseClient = databaseClient; - this.connectionFactory = databaseClient.getConnectionFactory(); } @Override @@ -54,16 +49,10 @@ public Mono findAndUpdateWorld(int id, int randomNumber) { @Override public Flux fortunes() { - return getConnection() - .flatMapMany(conn -> conn.createStatement("SELECT id, message FROM " + "fortune").execute()) - .flatMap(result -> result.map(r -> new Fortune(r.get(0, Integer.class), r.get(1, String.class)))); - } - - private Mono getConnection() { - if (this.conn.get() == null) { - this.conn.set(Mono.from(connectionFactory.create()).cache()); - } - return this.conn.get(); + return databaseClient + .sql("SELECT id, message FROM fortune") + .mapProperties(Fortune.class) + .all(); } } \ No newline at end of file From 2f858b0951cff13e9818480f9e81e658cd8f7b42 Mon Sep 17 00:00:00 2001 From: Sanskar Jethi <29942790+sansyrox@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:42:55 +0100 Subject: [PATCH 0855/1766] chore: update robyn (#9340) --- frameworks/Python/robyn/app-const.py | 4 ++-- frameworks/Python/robyn/app.py | 4 ++-- frameworks/Python/robyn/requirements-const.txt | 2 +- frameworks/Python/robyn/requirements.txt | 2 +- frameworks/Python/robyn/robyn-const.dockerfile | 2 +- frameworks/Python/robyn/robyn.dockerfile | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Python/robyn/app-const.py b/frameworks/Python/robyn/app-const.py index 4b806389fa5..ceec8488829 100755 --- a/frameworks/Python/robyn/app-const.py +++ b/frameworks/Python/robyn/app-const.py @@ -8,8 +8,8 @@ class SpecialConfig(Config): def __init__(self): super().__init__() - self.workers = (os.cpu_count() * 2) + 1 - self.processes = os.cpu_count() + self.workers = 2 + self.processes = ( os.cpu_count() * 2 ) + 1 self.log_level = "WARN" diff --git a/frameworks/Python/robyn/app.py b/frameworks/Python/robyn/app.py index e8c975e530f..bbbb037868a 100755 --- a/frameworks/Python/robyn/app.py +++ b/frameworks/Python/robyn/app.py @@ -8,8 +8,8 @@ class SpecialConfig(Config): def __init__(self): super().__init__() - self.workers = (os.cpu_count() * 2) + 1 - self.processes = os.cpu_count() + self.workers = 2 + self.processes = ( os.cpu_count() * 2 ) + 1 self.log_level = "WARN" diff --git a/frameworks/Python/robyn/requirements-const.txt b/frameworks/Python/robyn/requirements-const.txt index fbb88344955..484d4b7704f 100644 --- a/frameworks/Python/robyn/requirements-const.txt +++ b/frameworks/Python/robyn/requirements-const.txt @@ -1,2 +1,2 @@ uvloop==0.19.0 -robyn==0.60.2 +robyn==0.62.0 diff --git a/frameworks/Python/robyn/requirements.txt b/frameworks/Python/robyn/requirements.txt index fbb88344955..484d4b7704f 100644 --- a/frameworks/Python/robyn/requirements.txt +++ b/frameworks/Python/robyn/requirements.txt @@ -1,2 +1,2 @@ uvloop==0.19.0 -robyn==0.60.2 +robyn==0.62.0 diff --git a/frameworks/Python/robyn/robyn-const.dockerfile b/frameworks/Python/robyn/robyn-const.dockerfile index 90b201eccff..9429ff37376 100644 --- a/frameworks/Python/robyn/robyn-const.dockerfile +++ b/frameworks/Python/robyn/robyn-const.dockerfile @@ -8,4 +8,4 @@ RUN pip3 install -r /robyn/requirements-const.txt EXPOSE 8080 -CMD ["robyn", "app-const.py", "--fast"] +CMD ["python", "app-const.py", "--log-level", "warn"] diff --git a/frameworks/Python/robyn/robyn.dockerfile b/frameworks/Python/robyn/robyn.dockerfile index 8de6fea2c19..bc42b5be462 100644 --- a/frameworks/Python/robyn/robyn.dockerfile +++ b/frameworks/Python/robyn/robyn.dockerfile @@ -8,4 +8,4 @@ RUN pip3 install -r /robyn/requirements.txt EXPOSE 8080 -CMD ["robyn", "app.py", "--fast"] +CMD ["python", "app.py", "--log-level", "warn"] From e5cffb4bc1c96846eb240b71615724c6900194e0 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 22 Oct 2024 16:43:12 +0200 Subject: [PATCH 0856/1766] [rails] Add Falcon benchmarks (#9339) Falcon is an async server for Ruby. --- frameworks/Ruby/rails/Gemfile | 3 +- frameworks/Ruby/rails/Gemfile.lock | 94 ++++++++++++++++--- frameworks/Ruby/rails/benchmark_config.json | 22 +++++ frameworks/Ruby/rails/config/application.rb | 2 + .../Ruby/rails/config/falcon_preload.rb | 3 + frameworks/Ruby/rails/falcon.rb | 12 +++ frameworks/Ruby/rails/rails-falcon.dockerfile | 26 +++++ frameworks/Ruby/rails/rails.dockerfile | 2 +- frameworks/Ruby/rails/run-with-redis.sh | 2 +- 9 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 frameworks/Ruby/rails/config/falcon_preload.rb create mode 100644 frameworks/Ruby/rails/falcon.rb create mode 100644 frameworks/Ruby/rails/rails-falcon.dockerfile diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 8039ed09fd9..e5d6e743679 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -2,7 +2,8 @@ source 'https://rubygems.org' gem 'oj', '~> 3.16' gem 'pg', '~> 1.5', group: :postgresql -gem 'puma', '~> 6.4' +gem 'puma', '~> 6.4', require: false +gem 'falcon', '~> 0.47', require: false gem 'rails', '~> 7.2.0' gem 'redis', '~> 5.0' gem 'trilogy', '~> 2.8.1', group: :mysql diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index d92307f837d..311ffc7f814 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -71,23 +71,73 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + async (2.17.0) + console (~> 1.26) + fiber-annotation + io-event (~> 1.6, >= 1.6.5) + async-container (0.18.3) + async (~> 2.10) + async-http (0.82.1) + async (>= 2.10.2) + async-pool (~> 0.9) + io-endpoint (~> 0.14) + io-stream (~> 0.6) + metrics (~> 0.12) + protocol-http (~> 0.37) + protocol-http1 (>= 0.28.1) + protocol-http2 (~> 0.19) + traces (~> 0.10) + async-http-cache (0.4.4) + async-http (~> 0.56) + async-pool (0.10.1) + async (>= 1.25) + traces + async-service (0.12.0) + async + async-container (~> 0.16) base64 (0.2.0) bigdecimal (3.1.8) builder (3.3.0) concurrent-ruby (1.3.4) connection_pool (2.4.1) + console (1.27.0) + fiber-annotation + fiber-local (~> 1.1) + json crass (1.0.6) date (3.3.4) drb (2.2.1) erubi (1.13.0) + falcon (0.48.3) + async + async-container (~> 0.18) + async-http (~> 0.75) + async-http-cache (~> 0.4) + async-service (~> 0.10) + bundler + localhost (~> 1.1) + openssl (~> 3.0) + process-metrics (~> 0.2) + protocol-http (~> 0.31) + protocol-rack (~> 0.7) + samovar (~> 2.3) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (1.0.0) globalid (1.2.1) activesupport (>= 6.1) i18n (1.14.6) concurrent-ruby (~> 1.0) io-console (0.7.2) - irb (1.14.0) + io-endpoint (0.14.0) + io-event (1.7.2) + io-stream (0.6.0) + irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) + json (2.7.2) + localhost (1.3.1) logger (1.6.1) loofah (2.22.0) crass (~> 1.0.2) @@ -97,11 +147,13 @@ GEM net-imap net-pop net-smtp + mapping (1.1.1) marcel (1.0.4) + metrics (0.12.0) mini_mime (1.1.5) mini_portile2 (2.8.7) minitest (5.25.1) - net-imap (0.4.14) + net-imap (0.4.17) date net-protocol net-pop (0.1.2) @@ -118,14 +170,29 @@ GEM racc (~> 1.4) nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) - oj (3.16.5) + oj (3.16.6) bigdecimal (>= 3.0) ostruct (>= 0.2) + openssl (3.2.0) ostruct (0.6.0) - pg (1.5.7) + pg (1.5.8) + process-metrics (0.3.0) + console (~> 1.8) + json (~> 2) + samovar (~> 2.1) + protocol-hpack (1.5.1) + protocol-http (0.40.0) + protocol-http1 (0.28.1) + protocol-http (~> 0.22) + protocol-http2 (0.19.3) + protocol-hpack (~> 1.4) + protocol-http (~> 0.18) + protocol-rack (0.10.1) + protocol-http (~> 0.37) + rack (>= 1.0) psych (5.1.2) stringio - puma (6.4.2) + puma (6.4.3) nio4r (~> 2.0) racc (1.8.1) rack (3.1.8) @@ -168,27 +235,31 @@ GEM rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) - redis (5.2.0) + redis (5.3.0) redis-client (>= 0.22.0) redis-client (0.22.2) connection_pool - reline (0.5.9) + reline (0.5.10) io-console (~> 0.5) + samovar (2.3.0) + console (~> 1.0) + mapping (~> 1.0) securerandom (0.3.1) stringio (3.1.1) - thor (1.3.1) + thor (1.3.2) timeout (0.4.1) + traces (0.13.1) trilogy (2.8.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2024.1) + tzinfo-data (1.2024.2) tzinfo (>= 1.0.0) useragent (0.16.10) - webrick (1.8.1) + webrick (1.8.2) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.6.17) + zeitwerk (2.7.0) PLATFORMS arm64-darwin-20 @@ -196,6 +267,7 @@ PLATFORMS x86_64-linux DEPENDENCIES + falcon (~> 0.47) oj (~> 3.16) pg (~> 1.5) puma (~> 6.4) diff --git a/frameworks/Ruby/rails/benchmark_config.json b/frameworks/Ruby/rails/benchmark_config.json index 7e309e25450..c5562485d6f 100644 --- a/frameworks/Ruby/rails/benchmark_config.json +++ b/frameworks/Ruby/rails/benchmark_config.json @@ -44,6 +44,28 @@ "display_name": "rails-mysql", "notes": "", "versus": "rack-puma-mri" + }, + "falcon": { + "db_url": "/db", + "json_url": "/json", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "rails", + "language": "Ruby", + "orm": "Full", + "platform": "Rack", + "webserver": "Falcon", + "os": "Linux", + "database_os": "Linux", + "display_name": "rails-falcon", + "notes": "", + "versus": "rack-falcon-mri" } }] } diff --git a/frameworks/Ruby/rails/config/application.rb b/frameworks/Ruby/rails/config/application.rb index 75a12720345..291c4f983ae 100644 --- a/frameworks/Ruby/rails/config/application.rb +++ b/frameworks/Ruby/rails/config/application.rb @@ -51,5 +51,7 @@ class Application < Rails::Application config.middleware.delete Rack::Sendfile config.middleware.delete Rack::TempfileReaper config.middleware.delete Rails::Rack::Logger + + config.active_support.isolation_level = :fiber if defined?(Falcon) end end diff --git a/frameworks/Ruby/rails/config/falcon_preload.rb b/frameworks/Ruby/rails/config/falcon_preload.rb new file mode 100644 index 00000000000..647c7b948d9 --- /dev/null +++ b/frameworks/Ruby/rails/config/falcon_preload.rb @@ -0,0 +1,3 @@ +# required by Falcon: +# https://github.com/socketry/falcon/blob/19fe8ece7cc49aa03222afe2c940682aeb69fe37/guides/rails-integration/readme.md?plain=1#L38 +require_relative "../config/environment" diff --git a/frameworks/Ruby/rails/falcon.rb b/frameworks/Ruby/rails/falcon.rb new file mode 100644 index 00000000000..147d6b3b66f --- /dev/null +++ b/frameworks/Ruby/rails/falcon.rb @@ -0,0 +1,12 @@ +#!/usr/bin/env -S falcon host +# frozen_string_literal: true + +load :rack + +hostname = File.basename(__dir__) +port = ENV["PORT"] || 8080 + +rack hostname do + append preload "config/falcon_preload.rb" + endpoint Async::HTTP::Endpoint.parse("http://0.0.0.0:#{port}") +end diff --git a/frameworks/Ruby/rails/rails-falcon.dockerfile b/frameworks/Ruby/rails/rails-falcon.dockerfile new file mode 100644 index 00000000000..3244b73aa02 --- /dev/null +++ b/frameworks/Ruby/rails/rails-falcon.dockerfile @@ -0,0 +1,26 @@ +FROM ruby:3.4-rc + +RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server + +EXPOSE 8080 +WORKDIR /rails + +# ENV RUBY_YJIT_ENABLE=1 YJIT is enabled in config/initializers/enable_yjit.rb + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +COPY ./Gemfile* /rails/ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +ENV BUNDLE_WITHOUT=mysql +RUN bundle install --jobs=8 + +COPY . /rails/ + +ENV RAILS_ENV=production_postgresql +ENV PORT=8080 +ENV REDIS_URL=redis://localhost:6379/0 +CMD bundle exec falcon host diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 392920be9c4..8eb53c4dbd2 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=trilogy +ENV BUNDLE_WITHOUT=mysql RUN bundle install --jobs=8 COPY . /rails/ diff --git a/frameworks/Ruby/rails/run-with-redis.sh b/frameworks/Ruby/rails/run-with-redis.sh index 9ce9b243b74..036224f0df5 100755 --- a/frameworks/Ruby/rails/run-with-redis.sh +++ b/frameworks/Ruby/rails/run-with-redis.sh @@ -1,3 +1,3 @@ #!/bin/bash service redis-server start -rails server +bundle exec falcon host From 917d50a57592a5978095453280423cbb52cfef1d Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 22 Oct 2024 16:43:25 +0200 Subject: [PATCH 0857/1766] [rack] Don't install unused servers (#9337) For example, don't install falcon when testing puma. Also use the shorter "Puma" for the 'Server' header when using puma. --- frameworks/Ruby/rack/Gemfile | 15 ++++++++++++--- frameworks/Ruby/rack/hello_world.rb | 4 ++-- frameworks/Ruby/rack/rack-falcon.dockerfile | 4 ++-- frameworks/Ruby/rack/rack-jruby.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 4 +--- frameworks/Ruby/rack/rack.dockerfile | 5 ++--- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index af0fc5b1d04..ab7f29130b7 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -4,16 +4,25 @@ source 'https://rubygems.org' gem 'rack', '~> 3.0' gem 'connection_pool', '~> 2.4' -gem 'falcon', '~> 0.47', platforms: %i[ruby mswin] 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.4' gem 'sequel' gem 'sequel_pg', platforms: %i[ruby mswin] gem 'tzinfo-data', '1.2023.3' -gem 'unicorn', '~> 6.1', platforms: %i[ruby mswin], require: false + +group :falcon do + gem 'falcon', '~> 0.47', platforms: %i[ruby mswin] +end + +group :puma do + gem 'puma', '~> 6.4' +end + +group :unicorn do + gem 'unicorn', '~> 6.1', platforms: %i[ruby mswin] +end group :development do gem 'rack-test' diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index 2fcacec605b..050b6eac801 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -30,13 +30,13 @@ class HelloWorld SERVER_STRING = if defined?(PhusionPassenger) 'Passenger' elsif defined?(Puma) - Puma::Const::PUMA_SERVER_STRING + 'Puma' elsif defined?(Unicorn) 'Unicorn' elsif defined?(Falcon) 'Falcon' else - ' Ruby Rack' + 'Ruby Rack' end TEMPLATE_PREFIX = ' diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index f6ba1a106a2..f030cd54177 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -9,10 +9,10 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set without 'development test' +RUN bundle config set without 'development test puma unicorn' RUN bundle install --jobs=8 COPY . . diff --git a/frameworks/Ruby/rack/rack-jruby.dockerfile b/frameworks/Ruby/rack/rack-jruby.dockerfile index 7bf4b329af1..ab06ae132ed 100644 --- a/frameworks/Ruby/rack/rack-jruby.dockerfile +++ b/frameworks/Ruby/rack/rack-jruby.dockerfile @@ -6,7 +6,7 @@ WORKDIR /rack COPY Gemfile ./ -RUN bundle config set without 'development test' +RUN bundle config set without 'development test falcon unicorn' RUN bundle install --jobs=8 COPY . . diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index 8609febfd7b..74b3e82041c 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -12,13 +12,11 @@ WORKDIR /rack COPY Gemfile ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set without 'development test' +RUN bundle config set without 'development test falcon puma' RUN bundle install --jobs=8 COPY . . EXPOSE 8080 -#CMD nginx -c /rack/config/nginx.conf && bundle exec unicorn -E production -c config/unicorn.rb - CMD bundle exec unicorn -c config/unicorn.rb -o 0.0.0.0 -p 8080 -E production diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index b9b39c43122..615775cf9ea 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -10,10 +10,10 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set without 'development test' +RUN bundle config set without 'development test falcon unicorn' RUN bundle install --jobs=8 COPY . . @@ -21,4 +21,3 @@ COPY . . EXPOSE 8080 CMD bundle exec puma -C config/puma.rb -b tcp://0.0.0.0:8080 -e production - From 188ddd594ed6743318d2f0f0e8cd0e114429bfdf Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 22 Oct 2024 16:43:36 +0200 Subject: [PATCH 0858/1766] [ruby/sinatra] Release connection to pool outside block (#9336) ActiveRecord 7.2 introduced ActiveRecord::Base.with_connection which releases the connection after the block has run. This allows us to remove clearing active connections after the request has finished. | |plaintext|update| json| db|query|fortune|weighted_score| |-----------|---------|------|-----|-----|-----|-------|--------------| |master | 73851| 7851|84330|37661|15144| 19934| 1109| |branch | 83429| 8401|91051|41432|14251| 21369| 1147| --- frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/hello_world.rb | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index b7db27d395f..95fe5743580 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'activerecord', '~> 7.1', require: 'active_record' +gem 'activerecord', '~> 7.2', require: 'active_record' gem 'oj' gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false gem 'puma', '~> 6.4', require: false diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index 328fa402921..dad43a41c20 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -39,10 +39,6 @@ def rand1 response['Server'] = SERVER_STRING end if SERVER_STRING - after do - ActiveRecord::Base.connection_handler.clear_active_connections! - end - # Test type 1: JSON serialization get '/json' do json message: 'Hello, World!' @@ -51,7 +47,7 @@ def rand1 # Test type 2: Single database query get '/db' do world = - ActiveRecord::Base.connection_pool.with_connection do + ActiveRecord::Base.with_connection do World.find(rand1).attributes end @@ -61,7 +57,7 @@ def rand1 # Test type 3: Multiple database queries get '/queries' do worlds = - ActiveRecord::Base.connection_pool.with_connection do + ActiveRecord::Base.with_connection do ALL_IDS.sample(bounded_queries).map do |id| World.find(id).attributes end @@ -72,7 +68,7 @@ def rand1 # Test type 4: Fortunes get '/fortunes' do - @fortunes = ActiveRecord::Base.connection_pool.with_connection do + @fortunes = ActiveRecord::Base.with_connection do Fortune.all end.to_a @fortunes << Fortune.new( @@ -86,17 +82,18 @@ def rand1 # Test type 5: Database updates get '/updates' do - worlds = - ALL_IDS.sample(bounded_queries).map do |id| - world = ActiveRecord::Base.connection_pool.with_connection do - World.find(id) - end + worlds = nil + ActiveRecord::Base.with_connection do + worlds = ALL_IDS.sample(bounded_queries).map do |id| + world = World.find(id) new_value = rand1 new_value = rand1 until new_value != world.randomNumber { id: id, randomNumber: new_value } end - ActiveRecord::Base.connection_pool.with_connection do - World.upsert_all(worlds.sort_by!{_1[:id]}) + end + worlds.sort_by!{_1[:id]} + ActiveRecord::Base.with_connection do + World.upsert_all(worlds) end json worlds end From c66c74940d532a54e9a782a2e2134b9859f68fd9 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Tue, 22 Oct 2024 16:43:49 +0200 Subject: [PATCH 0859/1766] Bump emmett to 2.6 (#9330) --- frameworks/Python/emmett/app.py | 2 +- frameworks/Python/emmett/requirements.txt | 4 ++-- frameworks/Python/emmett/run.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Python/emmett/app.py b/frameworks/Python/emmett/app.py index 50a942ce7ad..7d012fe70b3 100644 --- a/frameworks/Python/emmett/app.py +++ b/frameworks/Python/emmett/app.py @@ -32,7 +32,7 @@ def _serialize(self, row): app.config.db.user = 'benchmarkdbuser' app.config.db.password = 'benchmarkdbpass' app.config.db.database = 'hello_world' -app.config.db.pool_size = 10 +app.config.db.pool_size = 16 db = Database(app) db.define_models(World, Fortune) diff --git a/frameworks/Python/emmett/requirements.txt b/frameworks/Python/emmett/requirements.txt index 627a2187091..1621f272390 100644 --- a/frameworks/Python/emmett/requirements.txt +++ b/frameworks/Python/emmett/requirements.txt @@ -1,2 +1,2 @@ -emmett[orjson]>=2.5.12,<2.6.0 -psycopg2-binary==2.9.5 +emmett[orjson]>=2.6.0,<2.7.0 +psycopg2-binary==2.9.9 diff --git a/frameworks/Python/emmett/run.py b/frameworks/Python/emmett/run.py index 02a21e458f9..aad30c549c6 100644 --- a/frameworks/Python/emmett/run.py +++ b/frameworks/Python/emmett/run.py @@ -1,10 +1,10 @@ import multiprocessing -from emmett.server import run +from emmett_core.server import run if __name__ == "__main__": - workers = round(multiprocessing.cpu_count() / 2) + workers = multiprocessing.cpu_count() run( "rsgi", From 17c1c8deb47ba36dd54c72a12927b9dba6c43608 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Tue, 22 Oct 2024 16:44:12 +0200 Subject: [PATCH 0860/1766] [Python] Add emmett55 (#9331) --- frameworks/Python/emmett55/README.md | 26 ++++ frameworks/Python/emmett55/app.py | 129 ++++++++++++++++++ .../Python/emmett55/benchmark_config.json | 27 ++++ frameworks/Python/emmett55/config.toml | 19 +++ .../Python/emmett55/emmett55.dockerfile | 11 ++ frameworks/Python/emmett55/requirements.txt | 3 + frameworks/Python/emmett55/run.py | 20 +++ .../Python/emmett55/templates/fortunes.html | 20 +++ 8 files changed, 255 insertions(+) create mode 100644 frameworks/Python/emmett55/README.md create mode 100644 frameworks/Python/emmett55/app.py create mode 100644 frameworks/Python/emmett55/benchmark_config.json create mode 100644 frameworks/Python/emmett55/config.toml create mode 100644 frameworks/Python/emmett55/emmett55.dockerfile create mode 100644 frameworks/Python/emmett55/requirements.txt create mode 100644 frameworks/Python/emmett55/run.py create mode 100644 frameworks/Python/emmett55/templates/fortunes.html diff --git a/frameworks/Python/emmett55/README.md b/frameworks/Python/emmett55/README.md new file mode 100644 index 00000000000..0e36619cfc8 --- /dev/null +++ b/frameworks/Python/emmett55/README.md @@ -0,0 +1,26 @@ +# Emmett55 Benchmark Test + +This is the Emmett55 portion of a [benchmarking tests suite](../../) comparing a variety of web development platforms. + +The information below is specific to Emmett55. 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 + +[Emmett55](https://github.com/emmett-framework/emmett55) is a Python asyncIO micro web framework. + +## Test Paths & Source + +* [JSON Serialization](app.py): "/json" +* [Single Database Query](app.py): "/db" +* [Multiple Database Queries](app.py): "queries?queries=#" +* [Fortunes](app.py): "/fortunes" +* [Database Updates](app.py): "updates?queries=#" +* [Plaintext](app.py): "/plaintext" + +*Replace # with an actual number.* + +### Resources + +* [Github repository](https://github.com/emmett-framework/emmett55) diff --git a/frameworks/Python/emmett55/app.py b/frameworks/Python/emmett55/app.py new file mode 100644 index 00000000000..e417e8f75fa --- /dev/null +++ b/frameworks/Python/emmett55/app.py @@ -0,0 +1,129 @@ +import os +from operator import itemgetter +from random import randint, sample + +import asyncpg +from emmett55 import App, Pipe, current, request, response +from emmett55.extensions import Extension, Signals, listen_signal +from emmett55.tools import service +from renoir import Renoir + + +class AsyncPG(Extension): + __slots__ = ["pool"] + + def on_load(self): + self.pool = None + self.pipe = AsyncPGPipe(self) + + async def build_pool(self): + self.pool = await asyncpg.create_pool( + user=os.getenv('PGUSER', 'benchmarkdbuser'), + password=os.getenv('PGPASS', 'benchmarkdbpass'), + database='hello_world', + host='tfb-database', + port=5432, + min_size=16, + max_size=16, + max_queries=64_000_000_000, + max_inactive_connection_lifetime=0 + ) + + @listen_signal(Signals.after_loop) + def _init_pool(self, loop): + loop.run_until_complete(self.build_pool()) + + +class AsyncPGPipe(Pipe): + __slots__ = ["ext"] + + def __init__(self, ext): + self.ext = ext + + async def open(self): + conn = current._db_conn = self.ext.pool.acquire() + current.db = await conn.__aenter__() + + async def close(self): + await current._db_conn.__aexit__() + + +app = App(__name__) +app.config.handle_static = False +templates = Renoir() + +db_ext = app.use_extension(AsyncPG) + +SQL_SELECT = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' +SQL_UPDATE = 'UPDATE "world" SET "randomnumber"=$1 WHERE id=$2' +ROW_ADD = [0, 'Additional fortune added at request time.'] +sort_key = itemgetter(1) + + +@app.route() +@service.json +async def json(): + return {'message': 'Hello, World!'} + + +@app.route("/db", pipeline=[db_ext.pipe]) +@service.json +async def get_random_world(): + row_id = randint(1, 10000) + number = await current.db.fetchval(SQL_SELECT, row_id) + return {'id': row_id, 'randomNumber': number} + + +def get_qparam(): + try: + rv = int(request.query_params.queries or 1) + except ValueError: + return 1 + if rv < 1: + return 1 + if rv > 500: + return 500 + return rv + + +@app.route("/queries", pipeline=[db_ext.pipe]) +@service.json +async def get_random_worlds(): + num_queries = get_qparam() + row_ids = sample(range(1, 10000), num_queries) + worlds = [] + statement = await current.db.prepare(SQL_SELECT) + for row_id in row_ids: + number = await statement.fetchval(row_id) + worlds.append({'id': row_id, 'randomNumber': number}) + return worlds + + +@app.route(pipeline=[db_ext.pipe], output='str') +async def fortunes(): + response.content_type = "text/html; charset=utf-8" + fortunes = await current.db.fetch('SELECT * FROM Fortune') + fortunes.append(ROW_ADD) + fortunes.sort(key=sort_key) + return templates.render("templates/fortunes.html", {"fortunes": fortunes}) + + +@app.route(pipeline=[db_ext.pipe]) +@service.json +async def updates(): + num_queries = get_qparam() + updates = list(zip( + sample(range(1, 10000), num_queries), + sorted(sample(range(1, 10000), num_queries)) + )) + worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] + statement = await current.db.prepare(SQL_SELECT) + for row_id, _ in updates: + await statement.fetchval(row_id) + await current.db.executemany(SQL_UPDATE, updates) + return worlds + + +@app.route(output='bytes') +async def plaintext(): + return b'Hello, World!' diff --git a/frameworks/Python/emmett55/benchmark_config.json b/frameworks/Python/emmett55/benchmark_config.json new file mode 100644 index 00000000000..e842529efcb --- /dev/null +++ b/frameworks/Python/emmett55/benchmark_config.json @@ -0,0 +1,27 @@ +{ + "framework": "emmett55", + "tests": [{ + "default": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Emmett55", + "language": "Python", + "orm": "Raw", + "platform": "RSGI", + "webserver": "granian", + "os": "Linux", + "database_os": "Linux", + "display_name": "Emmett55", + "notes": "CPython 3.7", + "versus": "uvicorn" + } + }] +} diff --git a/frameworks/Python/emmett55/config.toml b/frameworks/Python/emmett55/config.toml new file mode 100644 index 00000000000..11586c4e530 --- /dev/null +++ b/frameworks/Python/emmett55/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "emmett55" + +[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 = "RSGI" +webserver = "granian" +versus = "uvicorn" diff --git a/frameworks/Python/emmett55/emmett55.dockerfile b/frameworks/Python/emmett55/emmett55.dockerfile new file mode 100644 index 00000000000..49438fd442d --- /dev/null +++ b/frameworks/Python/emmett55/emmett55.dockerfile @@ -0,0 +1,11 @@ +FROM python:3.11-slim + +ADD ./ /emmett55 + +WORKDIR /emmett55 + +RUN pip install --no-cache-dir -r /emmett55/requirements.txt + +EXPOSE 8080 + +CMD python run.py diff --git a/frameworks/Python/emmett55/requirements.txt b/frameworks/Python/emmett55/requirements.txt new file mode 100644 index 00000000000..ecf2313a108 --- /dev/null +++ b/frameworks/Python/emmett55/requirements.txt @@ -0,0 +1,3 @@ +asyncpg==0.29.0 +emmett55[orjson]>=1.0.0,<1.1.0 +renoir==1.8.0 diff --git a/frameworks/Python/emmett55/run.py b/frameworks/Python/emmett55/run.py new file mode 100644 index 00000000000..aad30c549c6 --- /dev/null +++ b/frameworks/Python/emmett55/run.py @@ -0,0 +1,20 @@ +import multiprocessing + +from emmett_core.server import run + + +if __name__ == "__main__": + workers = multiprocessing.cpu_count() + + run( + "rsgi", + ("app", "app"), + host="0.0.0.0", + port=8080, + workers=workers, + backlog=16384, + threading_mode="runtime", + http="1", + enable_websockets=False, + log_level="warn" + ) diff --git a/frameworks/Python/emmett55/templates/fortunes.html b/frameworks/Python/emmett55/templates/fortunes.html new file mode 100644 index 00000000000..c64ff16ec6f --- /dev/null +++ b/frameworks/Python/emmett55/templates/fortunes.html @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + {{ for fortune in fortunes: }} + + + + + {{ pass }} +
      idmessage
      {{ =fortune[0] }}{{ =fortune[1] }}
      + + From 68e4d14762182ef43e5b05e7a82d35c8df09081e Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Tue, 22 Oct 2024 22:44:25 +0800 Subject: [PATCH 0861/1766] optimize code (#9335) --- frameworks/PHP/swoole/database.php | 33 +++++-------------- .../PHP/swoole/swoole-async-mysql.dockerfile | 1 - .../swoole/swoole-async-postgres.dockerfile | 1 - .../PHP/swoole/swoole-sync-mysql.dockerfile | 1 - .../swoole/swoole-sync-postgres.dockerfile | 1 - 5 files changed, 8 insertions(+), 29 deletions(-) diff --git a/frameworks/PHP/swoole/database.php b/frameworks/PHP/swoole/database.php index 97d3af6887a..a0c15234921 100644 --- a/frameworks/PHP/swoole/database.php +++ b/frameworks/PHP/swoole/database.php @@ -15,7 +15,7 @@ class Operation public static function db(PDOStatement|PDOStatementProxy $db): string { $db->execute([mt_rand(1, 10000)]); - return json_encode($db->fetch(PDO::FETCH_ASSOC), JSON_NUMERIC_CHECK); + return json_encode($db->fetch(PDO::FETCH_ASSOC)); } public static function fortunes(PDOStatement|PDOStatementProxy $fortune): string @@ -42,7 +42,7 @@ public static function query(PDOStatement|PDOStatementProxy $query, int $queries $results[] = $query->fetch(PDO::FETCH_ASSOC); } - return json_encode($results, JSON_NUMERIC_CHECK); + return json_encode($results); } public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries, string $driver): string @@ -65,7 +65,7 @@ public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatem if ($driver == 'pgsql') { $update->execute([...$values, ...$keys]); } - return json_encode($results, JSON_NUMERIC_CHECK); + return json_encode($results); } } @@ -130,9 +130,6 @@ class Connections { private static PDOPool $pool; private static string $driver; - private static array $dbs = []; - private static array $fortunes = []; - private static array $updates = []; public static function init(string $driver): void { @@ -195,28 +192,14 @@ private static function put(PDO|PDOProxy $db): void private static function getStatement(PDO|PDOProxy $pdo, string $type, int $queries = 0): PDOStatement|PDOStatementProxy { - $hash = spl_object_id($pdo); - if ('select' == $type) { - if (!isset(self::$dbs[$hash])) { - self::$dbs[$hash] = $pdo->prepare(Operation::WORLD_SELECT_SQL); - } - - return self::$dbs[$hash]; + return $pdo->prepare(Operation::WORLD_SELECT_SQL); } elseif ('fortunes' == $type) { - if (!isset(self::$fortunes[$hash])) { - self::$fortunes[$hash] = $pdo->prepare(Operation::FORTUNE_SQL); - } - - return self::$fortunes[$hash]; + return $pdo->prepare(Operation::FORTUNE_SQL); } else { - if (!isset(self::$updates[$hash][$queries])) { - self::$updates[$hash][$queries] = self::$driver == 'pgsql' - ? $pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)') - : $pdo->prepare(Operation::WORLD_UPDATE_SQL); - } - - return self::$updates[$hash][$queries]; + return self::$driver == 'pgsql' + ? $pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)') + : $pdo->prepare(Operation::WORLD_UPDATE_SQL); } } } diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index b9ce354edb2..9e5e1882565 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -25,7 +25,6 @@ RUN apt update -yqq > /dev/null \ WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD 10-opcache.ini /swoole ADD ./database.php /swoole COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini diff --git a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile index 3bed20ce226..d431e125b3b 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -25,7 +25,6 @@ RUN apt update -yqq > /dev/null \ WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD 10-opcache.ini /swoole ADD ./database.php /swoole COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini diff --git a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile index e8de37fd49b..c35d26cdc81 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -25,7 +25,6 @@ RUN apt update -yqq > /dev/null \ WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD 10-opcache.ini /swoole ADD ./database.php /swoole COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini diff --git a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile index 670ea96ad4b..a2661c7c010 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -25,7 +25,6 @@ RUN apt update -yqq > /dev/null \ WORKDIR /swoole ADD ./swoole-server.php /swoole -ADD 10-opcache.ini /swoole ADD ./database.php /swoole COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini From 93944012a393f1b434c0819fac34f47b225f3f7b Mon Sep 17 00:00:00 2001 From: Yury Zhuravlev Date: Tue, 22 Oct 2024 23:44:39 +0900 Subject: [PATCH 0862/1766] Update and fix sanic test (#9304) --- frameworks/Python/sanic/app.py | 56 ++++++++++--------- frameworks/Python/sanic/benchmark_config.json | 3 +- frameworks/Python/sanic/requirements.txt | 7 ++- frameworks/Python/sanic/sanic.dockerfile | 4 +- 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/frameworks/Python/sanic/app.py b/frameworks/Python/sanic/app.py index 47b374ce9a3..4070503205d 100644 --- a/frameworks/Python/sanic/app.py +++ b/frameworks/Python/sanic/app.py @@ -11,6 +11,8 @@ import sanic from sanic import response +from orjson import dumps + logger = getLogger(__name__) @@ -41,23 +43,26 @@ def get_num_queries(queries): return query_count -connection_pool = None sort_fortunes_key = itemgetter(1) template = load_fortunes_template() -app = sanic.Sanic(name=__name__) +app = sanic.Sanic(name=__name__, dumps=dumps) @app.listener('before_server_start') async def setup_database(app, loop): - global connection_pool - connection_pool = await asyncpg.create_pool( - user=os.getenv('PGUSER', 'benchmarkdbuser'), - password=os.getenv('PGPASS', 'benchmarkdbpass'), - database='hello_world', - host='tfb-database', - port=5432 - ) + app.ctx.pool = await asyncpg.create_pool( + user=os.getenv('PGUSER', 'benchmarkdbuser'), + password=os.getenv('PGPASS', 'benchmarkdbpass'), + database='hello_world', + host='tfb-database', + port=5432 + ) + + +@app.listener('after_server_stop') +async def close_database(app, loop): + app.ctx.pool.close() @app.get('/json') @@ -69,7 +74,7 @@ def json_view(request): async def single_database_query_view(request): row_id = randint(1, 10000) - async with connection_pool.acquire() as connection: + async with request.app.ctx.pool.acquire() as connection: number = await connection.fetchval(READ_ROW_SQL, row_id) return response.json( @@ -84,7 +89,7 @@ async def multiple_database_queries_view(request): row_ids = sample(range(1, 10000), num_queries) worlds = [] - async with connection_pool.acquire() as connection: + async with request.app.ctx.pool.acquire() as connection: statement = await connection.prepare(READ_ROW_SQL) for row_id in row_ids: number = await statement.fetchval(row_id) @@ -100,7 +105,7 @@ async def multiple_database_queries_view(request): @app.get('/fortunes') async def fortunes_view(request): - async with connection_pool.acquire() as connection: + async with request.app.ctx.pool.acquire() as connection: fortunes = await connection.fetch('SELECT * FROM Fortune') fortunes.append(ADDITIONAL_ROW) @@ -112,22 +117,21 @@ async def fortunes_view(request): @app.get('/updates') async def database_updates_view(request): - worlds = [] - updates = set() queries = request.args.get('queries', 1) + num_queries = get_num_queries(queries) + # To avoid deadlock + ids = sorted(sample(range(1, 10000 + 1), num_queries)) + numbers = sorted(sample(range(1, 10000), num_queries)) + updates = list(zip(ids, numbers)) - async with connection_pool.acquire() as connection: - statement = await connection.prepare(READ_ROW_SQL_TO_UPDATE) - - for row_id in sample(range(1, 10000), get_num_queries(queries)): - record = await statement.fetchrow(row_id) - world = dict( - id=record['id'], randomNumber=record['randomnumber'] - ) - world['randomNumber'] = randint(1, 10000) - worlds.append(world) - updates.add((world['id'], world['randomNumber'])) + worlds = [ + {"id": row_id, "randomNumber": number} for row_id, number in updates + ] + async with request.app.ctx.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.json(worlds, headers=get_headers()) diff --git a/frameworks/Python/sanic/benchmark_config.json b/frameworks/Python/sanic/benchmark_config.json index b1bdd529d60..b3c6799b42b 100644 --- a/frameworks/Python/sanic/benchmark_config.json +++ b/frameworks/Python/sanic/benchmark_config.json @@ -23,8 +23,7 @@ "database_os": "Linux", "display_name": "Sanic", "notes": "", - "versus": "None", - "tags": ["broken"] + "versus": "None" } } ] diff --git a/frameworks/Python/sanic/requirements.txt b/frameworks/Python/sanic/requirements.txt index 5b4738e167d..ff8b4afd8a9 100644 --- a/frameworks/Python/sanic/requirements.txt +++ b/frameworks/Python/sanic/requirements.txt @@ -1,4 +1,5 @@ -asyncpg==0.25.0 +asyncpg==0.29.0 Jinja2==3.1.4 -sanic==22.6.1 -uvloop==0.16.0 +sanic==24.6.0 +uvloop==0.20.0 +orjson==3.10.7 \ No newline at end of file diff --git a/frameworks/Python/sanic/sanic.dockerfile b/frameworks/Python/sanic/sanic.dockerfile index 9619237ed21..d12ebcb391a 100644 --- a/frameworks/Python/sanic/sanic.dockerfile +++ b/frameworks/Python/sanic/sanic.dockerfile @@ -1,8 +1,8 @@ -FROM python:3.8 +FROM python:3.12 ADD ./requirements.txt /sanic/requirements.txt -RUN pip3 install cython==0.29.13 && \ +RUN pip3 install cython==3.0.11 && \ pip3 install -r /sanic/requirements.txt ADD ./ /sanic From d8c3011f5ada78572e05ea7f18cc5243c0754af6 Mon Sep 17 00:00:00 2001 From: lospejos Date: Tue, 22 Oct 2024 17:44:58 +0300 Subject: [PATCH 0863/1766] Bumped Go version to 1.23.1, dependencies versions for Go/Chi framework tests (#9320) * Bumped version for Java, Jooby, Maven and other libraries/dependencies * Bumped dependencies versions * Bumped dependencies versions * Bumped dependencies versions * Bumped dependencies versions * Fixed Resource_ issue * Bumped versions for Golang, Fiber and other dependencies * Bumped many deps versions, removed deprecated reuseBuffer() in Rocker * Bumped versions for Golang, Fiber and other dependencies * Updated Java version, Maven Docker image, Jooby, Netty versions * Bumped pgx version * Bumped Go version to 1.23.1, dependencies versions --- frameworks/Go/chi/chi-gojay-prefork.dockerfile | 2 +- frameworks/Go/chi/chi-gojay.dockerfile | 2 +- frameworks/Go/chi/chi-prefork.dockerfile | 2 +- frameworks/Go/chi/chi-scratch.dockerfile | 7 +++---- frameworks/Go/chi/chi-sjson-prefork.dockerfile | 2 +- frameworks/Go/chi/chi-sjson.dockerfile | 2 +- frameworks/Go/chi/chi.dockerfile | 2 +- frameworks/Go/chi/src/chi-gojay/go.mod | 8 +++++--- frameworks/Go/chi/src/chi-gojay/go.sum | 10 ++++++---- frameworks/Go/chi/src/chi-sjson/go.mod | 8 +++++--- frameworks/Go/chi/src/chi-sjson/go.sum | 10 ++++++---- frameworks/Go/chi/src/chi/go.mod | 11 +++++++---- frameworks/Go/chi/src/chi/go.sum | 10 ++++++---- frameworks/Go/fiber/fiber-prefork.dockerfile | 12 ++++++++---- frameworks/Go/fiber/fiber.dockerfile | 12 ++++++++---- 15 files changed, 60 insertions(+), 40 deletions(-) diff --git a/frameworks/Go/chi/chi-gojay-prefork.dockerfile b/frameworks/Go/chi/chi-gojay-prefork.dockerfile index 2403792062f..5c9eec667f7 100644 --- a/frameworks/Go/chi/chi-gojay-prefork.dockerfile +++ b/frameworks/Go/chi/chi-gojay-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.23.1 ADD ./src/chi-gojay /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-gojay.dockerfile b/frameworks/Go/chi/chi-gojay.dockerfile index 4f4e2ccf72d..c9a6de386d5 100644 --- a/frameworks/Go/chi/chi-gojay.dockerfile +++ b/frameworks/Go/chi/chi-gojay.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.23.1 ADD ./src/chi-gojay /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-prefork.dockerfile b/frameworks/Go/chi/chi-prefork.dockerfile index a516efa3726..fb363d7b06a 100644 --- a/frameworks/Go/chi/chi-prefork.dockerfile +++ b/frameworks/Go/chi/chi-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.23.1 ADD ./src/chi /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-scratch.dockerfile b/frameworks/Go/chi/chi-scratch.dockerfile index 63f9b7ac031..2361e658ca7 100644 --- a/frameworks/Go/chi/chi-scratch.dockerfile +++ b/frameworks/Go/chi/chi-scratch.dockerfile @@ -1,13 +1,12 @@ # build layer -FROM docker.io/golang:1.19-alpine as builder +FROM docker.io/golang:1.23.1-alpine as builder ADD ./src/chi /chi WORKDIR /chi RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOAMD64=v3 \ - go build -ldflags="-w -s" -o server - -RUN apk --no-cache add --update ca-certificates + go build -ldflags="-w -s" -o server && \ + apk --no-cache add --update ca-certificates # release layer FROM scratch diff --git a/frameworks/Go/chi/chi-sjson-prefork.dockerfile b/frameworks/Go/chi/chi-sjson-prefork.dockerfile index 1e6e7029c01..97071fe5e22 100644 --- a/frameworks/Go/chi/chi-sjson-prefork.dockerfile +++ b/frameworks/Go/chi/chi-sjson-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.23.1 ADD ./src/chi-sjson /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-sjson.dockerfile b/frameworks/Go/chi/chi-sjson.dockerfile index 6af99dc4011..99a2204147f 100644 --- a/frameworks/Go/chi/chi-sjson.dockerfile +++ b/frameworks/Go/chi/chi-sjson.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.23.1 ADD ./src/chi-sjson /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi.dockerfile b/frameworks/Go/chi/chi.dockerfile index 205c2bdf7d5..6facc00990f 100644 --- a/frameworks/Go/chi/chi.dockerfile +++ b/frameworks/Go/chi/chi.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.23.1 ADD ./src/chi /chi WORKDIR /chi diff --git a/frameworks/Go/chi/src/chi-gojay/go.mod b/frameworks/Go/chi/src/chi-gojay/go.mod index 8521c5e7b7f..f8c266996ec 100644 --- a/frameworks/Go/chi/src/chi-gojay/go.mod +++ b/frameworks/Go/chi/src/chi-gojay/go.mod @@ -1,8 +1,10 @@ module chi/server -go 1.19 +go 1.23.1 require ( - github.com/go-chi/chi/v5 v5.0.7 - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-chi/chi/v5 v5.1.0 + github.com/go-sql-driver/mysql v1.8.1 ) + +require filippo.io/edwards25519 v1.1.0 // indirect diff --git a/frameworks/Go/chi/src/chi-gojay/go.sum b/frameworks/Go/chi/src/chi-gojay/go.sum index 68a8dd38f73..701d0184cbb 100644 --- a/frameworks/Go/chi/src/chi-gojay/go.sum +++ b/frameworks/Go/chi/src/chi-gojay/go.sum @@ -1,4 +1,6 @@ -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= diff --git a/frameworks/Go/chi/src/chi-sjson/go.mod b/frameworks/Go/chi/src/chi-sjson/go.mod index 8521c5e7b7f..f8c266996ec 100644 --- a/frameworks/Go/chi/src/chi-sjson/go.mod +++ b/frameworks/Go/chi/src/chi-sjson/go.mod @@ -1,8 +1,10 @@ module chi/server -go 1.19 +go 1.23.1 require ( - github.com/go-chi/chi/v5 v5.0.7 - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-chi/chi/v5 v5.1.0 + github.com/go-sql-driver/mysql v1.8.1 ) + +require filippo.io/edwards25519 v1.1.0 // indirect diff --git a/frameworks/Go/chi/src/chi-sjson/go.sum b/frameworks/Go/chi/src/chi-sjson/go.sum index 68a8dd38f73..701d0184cbb 100644 --- a/frameworks/Go/chi/src/chi-sjson/go.sum +++ b/frameworks/Go/chi/src/chi-sjson/go.sum @@ -1,4 +1,6 @@ -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= diff --git a/frameworks/Go/chi/src/chi/go.mod b/frameworks/Go/chi/src/chi/go.mod index 829aae200bd..906b029b388 100644 --- a/frameworks/Go/chi/src/chi/go.mod +++ b/frameworks/Go/chi/src/chi/go.mod @@ -1,11 +1,14 @@ module chi/server -go 1.19 +go 1.23.1 require ( - github.com/go-chi/chi/v5 v5.0.7 - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-chi/chi/v5 v5.1.0 + github.com/go-sql-driver/mysql v1.8.1 github.com/mailru/easyjson v0.7.7 ) -require github.com/josharian/intern v1.0.0 // indirect +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect +) diff --git a/frameworks/Go/chi/src/chi/go.sum b/frameworks/Go/chi/src/chi/go.sum index f18160ebd73..b39d37edbe5 100644 --- a/frameworks/Go/chi/src/chi/go.sum +++ b/frameworks/Go/chi/src/chi/go.sum @@ -1,7 +1,9 @@ -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= 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= diff --git a/frameworks/Go/fiber/fiber-prefork.dockerfile b/frameworks/Go/fiber/fiber-prefork.dockerfile index c741baca1b8..43995ca7de7 100644 --- a/frameworks/Go/fiber/fiber-prefork.dockerfile +++ b/frameworks/Go/fiber/fiber-prefork.dockerfile @@ -1,14 +1,18 @@ -FROM docker.io/golang:1.23 +FROM golang:1.23-alpine as builder WORKDIR /fiber COPY ./src /fiber -RUN go mod download +RUN go mod download && \ + go generate -x ./templates && \ + GOAMD64=v3 go build -ldflags="-s -w" -o app . -RUN go generate -x ./templates +FROM alpine:latest -RUN GOAMD64=v3 go build -ldflags="-s -w" -o app . +WORKDIR /fiber + +COPY --from=builder /fiber/app . EXPOSE 8080 diff --git a/frameworks/Go/fiber/fiber.dockerfile b/frameworks/Go/fiber/fiber.dockerfile index 23c8ab72ea7..38f97b03d56 100644 --- a/frameworks/Go/fiber/fiber.dockerfile +++ b/frameworks/Go/fiber/fiber.dockerfile @@ -1,14 +1,18 @@ -FROM docker.io/golang:1.23 +FROM golang:1.23-alpine as builder WORKDIR /fiber COPY ./src /fiber -RUN go mod download +RUN go mod download && \ + go generate -x ./templates && \ + GOAMD64=v3 go build -ldflags="-s -w" -o app . -RUN go generate -x ./templates +FROM alpine:latest -RUN GOAMD64=v3 go build -ldflags="-s -w" -o app . +WORKDIR /fiber + +COPY --from=builder /fiber/app . EXPOSE 8080 From 55c143645c5b943aff7736d7db305ac74c0d9717 Mon Sep 17 00:00:00 2001 From: Aaron Tavistock Date: Tue, 22 Oct 2024 07:45:42 -0700 Subject: [PATCH 0864/1766] [Elixir/phoenix] Implementing suggestions from @josevalim (#9302) * Implementing suggestions from @josevalim * We don't need to worry about 'accepts' plug in this case * Prematurely removed accepts plug (still needed for 'fortunes' test) * Avoid checking a list we don't need to * Using explicit content-type for plain-text * Updating ecto to use pool count (also tested different count/size groupings) * db pools set for the target machine --- frameworks/Elixir/phoenix/config/prod.exs | 17 +--- .../Elixir/phoenix/lib/hello/world_cache.ex | 2 +- frameworks/Elixir/phoenix/lib/hello_web.ex | 4 +- .../hello_web/controllers/page_controller.ex | 97 ++++++++++--------- .../Elixir/phoenix/lib/hello_web/endpoint.ex | 1 - .../Elixir/phoenix/lib/hello_web/router.ex | 6 -- frameworks/Elixir/phoenix/mix.lock | 4 +- 7 files changed, 56 insertions(+), 75 deletions(-) diff --git a/frameworks/Elixir/phoenix/config/prod.exs b/frameworks/Elixir/phoenix/config/prod.exs index 9ad458a09be..c920950ee04 100755 --- a/frameworks/Elixir/phoenix/config/prod.exs +++ b/frameworks/Elixir/phoenix/config/prod.exs @@ -21,7 +21,8 @@ config :hello, Hello.Repo, password: "benchmarkdbpass", database: "hello_world", hostname: "tfb-database", - pool_size: 50, + pool_count: 56, + pool_size: 15, queue_target: 5000, log: false @@ -33,17 +34,3 @@ config :logger, ], level: :error, backends: [] - -# ## SSL Support -# -# To get SSL working, you will need to add the `https` key -# to the previous section: -# -# config:hello, Hello.Endpoint, -# ... -# https: [port: 443, -# keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), -# certfile: System.get_env("SOME_APP_SSL_CERT_PATH")] -# -# Where those two env variables point to a file on -# disk for the key and cert. diff --git a/frameworks/Elixir/phoenix/lib/hello/world_cache.ex b/frameworks/Elixir/phoenix/lib/hello/world_cache.ex index b4943e14a35..e6cde7ab58e 100644 --- a/frameworks/Elixir/phoenix/lib/hello/world_cache.ex +++ b/frameworks/Elixir/phoenix/lib/hello/world_cache.ex @@ -23,9 +23,9 @@ defmodule Hello.WorldCache do world = Repo.get(World, id) :ok = __MODULE__.put(id, world) world + world -> world end end - end diff --git a/frameworks/Elixir/phoenix/lib/hello_web.ex b/frameworks/Elixir/phoenix/lib/hello_web.ex index 1193aab23a5..1114ed22e51 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web.ex @@ -95,8 +95,8 @@ defmodule HelloWeb do end @doc """ - When used, dispatch to the appropriate controller/view/etc. - """ + When used, dispatch to the appropriate controller/view/etc. + """ defmacro __using__(which) when is_atom(which) do apply(__MODULE__, which, []) end diff --git a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex index 7cb7d1fbe2b..59f2f5c2f35 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex @@ -8,6 +8,8 @@ defmodule HelloWeb.PageController do @random_max 10_000 + plug :accepts, ~w(html json) when action == :fortunes + def index(conn, _params) do json(conn, %{"TE Benchmarks\n" => "Started"}) end @@ -24,17 +26,11 @@ defmodule HelloWeb.PageController do end def queries(conn, params) do - {:ok, worlds} = - Repo.transaction(fn -> - :rand.seed(:exsp) - - worlds = - Stream.repeatedly(&random_id/0) - |> Stream.uniq() - |> Stream.map(&Repo.get(World, &1)) - |> Enum.take(size(params["queries"])) - - worlds + worlds = + Repo.checkout(fn -> + params["queries"] + |> random_ids_sample() + |> Enum.map(&Repo.get(World, &1)) end) json(conn, worlds) @@ -48,54 +44,53 @@ defmodule HelloWeb.PageController do fortunes = [additional_fortune | Repo.all(Fortune)] - |> Enum.sort_by(& &1.message) + |> Enum.sort(fn a, b -> a.message < b.message end) render(conn, :fortunes, fortunes: fortunes) end def updates(conn, params) do - {:ok, worlds} = - Repo.transaction(fn -> - :rand.seed(:exsp) - - worlds = - Stream.repeatedly(&random_id/0) - |> Stream.uniq() - |> Stream.map(&Repo.get(World, &1)) - |> Stream.map(fn world -> %{id: world.id, randomnumber: :rand.uniform(@random_max)} end) - |> Enum.take(size(params["queries"])) - # If this is not sorted it sometimes generates - # FAIL for http://tfb-server:8080/updates/20 - # Only 20470 executed queries in the database out of roughly 20480 expected. - |> Enum.sort_by(& &1.id) - - Repo.insert_all( - World, - worlds, - on_conflict: {:replace_all_except, [:id]}, - conflict_target: [:id], - returning: false - ) - - worlds + world_updates = + Repo.checkout(fn -> + params["queries"] + |> random_ids_sample() + |> Enum.sort() + # + # If this is not sorted it will intermittently generate: + # + # FAIL for http://tfb-server:8080/updates/20 + # Only 20470 executed queries in the database out of roughly 20480 expected. + # + |> Enum.map(fn id -> + world = Repo.get(World, id) + %{id: world.id, randomnumber: :rand.uniform(@random_max)} + end) end) - json(conn, worlds) + Repo.insert_all( + World, + world_updates, + on_conflict: {:replace_all_except, [:id]}, + conflict_target: [:id], + returning: false + ) + + json(conn, world_updates) end - def plaintext(conn, _params) do - text(conn, "Hello, World!") + def plaintext(conn, _params) do + conn + |> put_resp_header("content-type", "text/plain") + |> send_resp(200, "Hello, World!") end def cached(conn, params) do - :rand.seed(:exsp) WorldCache.seed() worlds = - Stream.repeatedly(&random_id/0) - |> Stream.uniq() - |> Stream.map(&WorldCache.fetch(&1)) - |> Enum.take(size(params["count"])) + params["count"] + |> random_ids_sample() + |> Enum.map(&WorldCache.fetch(&1)) json(conn, worlds) end @@ -104,11 +99,17 @@ defmodule HelloWeb.PageController do :rand.uniform(@random_max) end - defp size(nil), do: 1 - defp size(""), do: 1 + defp random_ids_sample(count) do + # Use the fastest rand algorithm + :rand.seed(:exsp) + + Stream.repeatedly(&random_id/0) + |> Stream.uniq() + |> Enum.take(size(count)) + end - defp size(queries) when is_bitstring(queries) do - case Integer.parse(queries) do + defp size(param_count) when is_bitstring(param_count) do + case Integer.parse(param_count) do {count, _} -> max(1, min(500, count)) _ -> 1 end diff --git a/frameworks/Elixir/phoenix/lib/hello_web/endpoint.ex b/frameworks/Elixir/phoenix/lib/hello_web/endpoint.ex index f709d00a2e8..a764bbf653e 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web/endpoint.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web/endpoint.ex @@ -20,4 +20,3 @@ defmodule HelloWeb.Endpoint do plug HelloWeb.HeadersPlug plug HelloWeb.Router end - diff --git a/frameworks/Elixir/phoenix/lib/hello_web/router.ex b/frameworks/Elixir/phoenix/lib/hello_web/router.ex index 1634f3403fd..7e3caed3b8f 100755 --- a/frameworks/Elixir/phoenix/lib/hello_web/router.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web/router.ex @@ -1,13 +1,7 @@ defmodule HelloWeb.Router do use HelloWeb, :router - pipeline :browser do - plug :accepts, ~w(html json) - end - scope "/", HelloWeb do - pipe_through [:browser] - get "/json", PageController, :_json get "/db", PageController, :db get "/queries", PageController, :queries diff --git a/frameworks/Elixir/phoenix/mix.lock b/frameworks/Elixir/phoenix/mix.lock index 4c59758f12a..0c47cab2458 100644 --- a/frameworks/Elixir/phoenix/mix.lock +++ b/frameworks/Elixir/phoenix/mix.lock @@ -6,8 +6,8 @@ "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"}, - "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, + "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, + "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "expo": {:hex, :expo, "1.0.0", "647639267e088717232f4d4451526e7a9de31a3402af7fcbda09b27e9a10395a", [:mix], [], "hexpm", "18d2093d344d97678e8a331ca0391e85d29816f9664a25653fd7e6166827827c"}, "gettext": {:hex, :gettext, "0.25.0", "98a95a862a94e2d55d24520dd79256a15c87ea75b49673a2e2f206e6ebc42e5d", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "38e5d754e66af37980a94fb93bb20dcde1d2361f664b0a19f01e87296634051f"}, "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, From 7c7cceea1ab3bab63c77a4de9005a47cc69c876c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 22 Oct 2024 16:46:30 +0200 Subject: [PATCH 0865/1766] [elixir/plug] Clean up boilerplate when encoding to Jason (#9301) --- .../framework_benchmarks/handlers/cached-world.ex | 4 ++-- .../plug/lib/framework_benchmarks/handlers/db.ex | 6 ++---- .../plug/lib/framework_benchmarks/handlers/json.ex | 2 +- .../lib/framework_benchmarks/handlers/query.ex | 14 +++----------- .../lib/framework_benchmarks/handlers/update.ex | 14 +++----------- .../plug/lib/framework_benchmarks/models/world.ex | 1 + 6 files changed, 12 insertions(+), 29 deletions(-) diff --git a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/cached-world.ex b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/cached-world.ex index c80b71053e7..60b441557c5 100644 --- a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/cached-world.ex +++ b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/cached-world.ex @@ -11,10 +11,10 @@ defmodule FrameworkBenchmarks.Handlers.CachedWorld do :rand.uniform(10_000) end) - {:ok, json} = + json = ids |> Enum.map(&FrameworkBenchmarks.CachedWorld.get/1) - |> Jason.encode() + |> Jason.encode_to_iodata!() conn |> Plug.Conn.put_resp_content_type("application/json") diff --git a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/db.ex b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/db.ex index b1abba5dd8b..101b7e5f8fd 100644 --- a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/db.ex +++ b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/db.ex @@ -5,11 +5,9 @@ defmodule FrameworkBenchmarks.Handlers.DB do def handle(conn) do id = :rand.uniform(10_000) - {:ok, json} = + json = FrameworkBenchmarks.Repo.get(FrameworkBenchmarks.Models.World, id) - |> Map.from_struct() - |> Map.drop([:__meta__]) - |> Jason.encode() + |> Jason.encode_to_iodata!() conn |> Plug.Conn.put_resp_content_type("application/json") diff --git a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/json.ex b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/json.ex index c013110a6de..3a7ada06cdb 100644 --- a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/json.ex +++ b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/json.ex @@ -3,7 +3,7 @@ defmodule FrameworkBenchmarks.Handlers.JSON do This is the handle for the /json route """ def handle(conn) do - {:ok, json} = Jason.encode(%{message: "Hello, World!"}) + json = Jason.encode_to_iodata!(%{message: "Hello, World!"}) conn |> Plug.Conn.put_resp_content_type("application/json") diff --git a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/query.ex b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/query.ex index b4e83026a82..6ad2af9061a 100644 --- a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/query.ex +++ b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/query.ex @@ -5,7 +5,7 @@ defmodule FrameworkBenchmarks.Handlers.Query do def handle(conn) do number_of_queries = FrameworkBenchmarks.Handlers.Helpers.parse_queries(conn, "queries") - records = + json = 1..number_of_queries |> Enum.map(fn _ -> :rand.uniform(10_000) @@ -15,16 +15,8 @@ defmodule FrameworkBenchmarks.Handlers.Query do FrameworkBenchmarks.Repo.get(FrameworkBenchmarks.Models.World, &1) end) ) - |> Enum.map(&Task.await(&1)) - - {:ok, json} = - records - |> Enum.map(fn record -> - record - |> Map.from_struct() - |> Map.drop([:__meta__]) - end) - |> Jason.encode() + |> Enum.map(&Task.await(&1, :infinity)) + |> Jason.encode_to_iodata!() conn |> Plug.Conn.put_resp_content_type("application/json") diff --git a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/update.ex b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/update.ex index d06744adfde..0b5ad54c4b8 100644 --- a/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/update.ex +++ b/frameworks/Elixir/plug/lib/framework_benchmarks/handlers/update.ex @@ -22,7 +22,7 @@ defmodule FrameworkBenchmarks.Handlers.Update do :rand.uniform(10_000) end) - records = + json = ids |> Enum.map( &Task.async(fn -> @@ -38,16 +38,8 @@ defmodule FrameworkBenchmarks.Handlers.Update do |> FrameworkBenchmarks.Repo.update!() end) ) - |> Enum.map(&Task.await(&1)) - - {:ok, json} = - records - |> Enum.map(fn record -> - record - |> Map.from_struct() - |> Map.drop([:__meta__]) - end) - |> Jason.encode() + |> Enum.map(&Task.await(&1, :infinity)) + |> Jason.encode_to_iodata!() conn |> Plug.Conn.put_resp_content_type("application/json") diff --git a/frameworks/Elixir/plug/lib/framework_benchmarks/models/world.ex b/frameworks/Elixir/plug/lib/framework_benchmarks/models/world.ex index 549d8415a9e..d3db33611c1 100644 --- a/frameworks/Elixir/plug/lib/framework_benchmarks/models/world.ex +++ b/frameworks/Elixir/plug/lib/framework_benchmarks/models/world.ex @@ -1,6 +1,7 @@ defmodule FrameworkBenchmarks.Models.World do use Ecto.Schema + @derive {Jason.Encoder, only: [:id, :randomnumber]} schema "world" do field(:randomnumber, :integer) end From 540de89f044864114b255d34d78bfd17eec17be5 Mon Sep 17 00:00:00 2001 From: Dragos Varovici Date: Tue, 22 Oct 2024 08:46:41 -0600 Subject: [PATCH 0866/1766] Added Zig Httpz framework (#9298) * Added Zig httpz framework * Zig httpz fortunes --- frameworks/Zig/httpz/.gitignore | 2 + frameworks/Zig/httpz/README.md | 25 +++ frameworks/Zig/httpz/benchmark_config.json | 26 +++ frameworks/Zig/httpz/build.zig | 78 +++++++++ frameworks/Zig/httpz/build.zig.zon | 19 ++ frameworks/Zig/httpz/httpz.dockerfile | 23 +++ frameworks/Zig/httpz/run.sh | 3 + frameworks/Zig/httpz/src/endpoints.zig | 192 +++++++++++++++++++++ frameworks/Zig/httpz/src/main.zig | 71 ++++++++ frameworks/Zig/httpz/src/pool.zig | 87 ++++++++++ 10 files changed, 526 insertions(+) create mode 100644 frameworks/Zig/httpz/.gitignore create mode 100644 frameworks/Zig/httpz/README.md create mode 100644 frameworks/Zig/httpz/benchmark_config.json create mode 100644 frameworks/Zig/httpz/build.zig create mode 100644 frameworks/Zig/httpz/build.zig.zon create mode 100644 frameworks/Zig/httpz/httpz.dockerfile create mode 100644 frameworks/Zig/httpz/run.sh create mode 100644 frameworks/Zig/httpz/src/endpoints.zig create mode 100644 frameworks/Zig/httpz/src/main.zig create mode 100644 frameworks/Zig/httpz/src/pool.zig diff --git a/frameworks/Zig/httpz/.gitignore b/frameworks/Zig/httpz/.gitignore new file mode 100644 index 00000000000..170dc0f1403 --- /dev/null +++ b/frameworks/Zig/httpz/.gitignore @@ -0,0 +1,2 @@ +zig-cache/**/*', +zig-out: 'zig-out/**/*', diff --git a/frameworks/Zig/httpz/README.md b/frameworks/Zig/httpz/README.md new file mode 100644 index 00000000000..e83169efe17 --- /dev/null +++ b/frameworks/Zig/httpz/README.md @@ -0,0 +1,25 @@ + +# [Httpz](https://github.com/karlseguin/http.zig) - An HTTP/1.1 server for Zig + +## Description + +Native Zig framework and zig http replacement + +## 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/httpz/benchmark_config.json b/frameworks/Zig/httpz/benchmark_config.json new file mode 100644 index 00000000000..e36c9c17a1c --- /dev/null +++ b/frameworks/Zig/httpz/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "httpz", + "tests": [{ + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "port": 3000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "httpz", + "language": "Zig", + "flavor": "None", + "orm": "raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Httpz (Zig)", + "notes": "", + "versus": "" + } + }] +} diff --git a/frameworks/Zig/httpz/build.zig b/frameworks/Zig/httpz/build.zig new file mode 100644 index 00000000000..5978de7c6aa --- /dev/null +++ b/frameworks/Zig/httpz/build.zig @@ -0,0 +1,78 @@ +const std = @import("std"); +const ModuleMap = std.StringArrayHashMap(*std.Build.Module); +var gpa = std.heap.GeneralPurposeAllocator(.{}){}; +const allocator = gpa.allocator(); + +// 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 dep_opts = .{ .target = target, .optimize = optimize }; + + const exe = b.addExecutable(.{ + .name = "httpz", + // 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 = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + var modules = ModuleMap.init(allocator); + defer modules.deinit(); + + const httpz_module = b.dependency("httpz", dep_opts).module("httpz"); + const pg_module = b.dependency("pg", dep_opts).module("pg"); + const datetimez_module = b.dependency("datetimez", dep_opts).module("zig-datetime"); + const mustache_module = b.dependency("mustache", dep_opts).module("mustache"); + + try modules.put("httpz", httpz_module); + try modules.put("pg", pg_module); + try modules.put("datetimez", datetimez_module); + try modules.put("mustache", mustache_module); + + // // Expose this as a module that others can import + exe.root_module.addImport("httpz", httpz_module); + exe.root_module.addImport("pg", pg_module); + exe.root_module.addImport("datetimez", datetimez_module); + exe.root_module.addImport("mustache", mustache_module); + + // 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); +} diff --git a/frameworks/Zig/httpz/build.zig.zon b/frameworks/Zig/httpz/build.zig.zon new file mode 100644 index 00000000000..58b494c2fe3 --- /dev/null +++ b/frameworks/Zig/httpz/build.zig.zon @@ -0,0 +1,19 @@ +.{ .name = "Zap testing", .version = "0.1.1", .paths = .{ + "build.zig", + "build.zig.zon", + "src", +}, .dependencies = .{ + .pg = .{ .url = "https://github.com/karlseguin/pg.zig/archive/239a4468163a49d8c0d03285632eabe96003e9e2.tar.gz", .hash = "1220a1d7e51e2fa45e547c76a9e099c09d06e14b0b9bfc6baa89367f56f1ded399a0" }, + .httpz = .{ + .url = "git+https://github.com/karlseguin/http.zig?ref=zig-0.13#7d2ddae87af9b110783085c0ea6b03985faa4584", + .hash = "12208c1f2c5f730c4c03aabeb0632ade7e21914af03e6510311b449458198d0835d6", + }, + .datetimez = .{ + .url = "git+https://github.com/frmdstryr/zig-datetime#70aebf28fb3e137cd84123a9349d157a74708721", + .hash = "122077215ce36e125a490e59ec1748ffd4f6ba00d4d14f7308978e5360711d72d77f", + }, + .mustache = .{ + .url = "git+https://github.com/batiati/mustache-zig#ae5ecc1522da983dc39bb0d8b27f5d1b1d7956e3", + .hash = "1220ac9e3316ce71ad9cd66c7f215462bf5c187828b50bb3d386549bf6af004e3bb0", + }, +} } diff --git a/frameworks/Zig/httpz/httpz.dockerfile b/frameworks/Zig/httpz/httpz.dockerfile new file mode 100644 index 00000000000..5257b77ea18 --- /dev/null +++ b/frameworks/Zig/httpz/httpz.dockerfile @@ -0,0 +1,23 @@ +FROM fedora:40 + +WORKDIR /httpz + +ENV PG_USER=benchmarkdbuser +ENV PG_PASS=benchmarkdbpass +ENV PG_DB=hello_world +ENV PG_HOST=tfb-database +ENV PG_PORT=5432 + +COPY src src +COPY build.zig.zon build.zig.zon +COPY build.zig build.zig +COPY run.sh run.sh + +RUN dnf install -y zig +RUN zig version +RUN zig build -Doptimize=ReleaseFast +RUN cp /httpz/zig-out/bin/httpz /usr/local/bin + +EXPOSE 3000 + +CMD ["sh", "run.sh"] \ No newline at end of file diff --git a/frameworks/Zig/httpz/run.sh b/frameworks/Zig/httpz/run.sh new file mode 100644 index 00000000000..582c2ad0228 --- /dev/null +++ b/frameworks/Zig/httpz/run.sh @@ -0,0 +1,3 @@ +echo "Waiting for Httpz framework to start..." + +httpz \ No newline at end of file diff --git a/frameworks/Zig/httpz/src/endpoints.zig b/frameworks/Zig/httpz/src/endpoints.zig new file mode 100644 index 00000000000..0ee22b274de --- /dev/null +++ b/frameworks/Zig/httpz/src/endpoints.zig @@ -0,0 +1,192 @@ +const std = @import("std"); +const httpz = @import("httpz"); +const pg = @import("pg"); +const datetimez = @import("datetimez"); +const mustache = @import("mustache"); + +const Allocator = std.mem.Allocator; +const Thread = std.Thread; +const Mutex = Thread.Mutex; +const template = "Fortunes{{#fortunes}}{{/fortunes}}
      idmessage
      {{id}}{{message}}
      "; + +pub const Global = struct { + pool: *pg.Pool, + prng: *std.rand.DefaultPrng, + allocator: Allocator, + mutex: std.Thread.Mutex = .{}, +}; + +const Message = struct { + message: []const u8, +}; + +const World = struct { + id: i32, + randomNumber: i32, +}; + +const Fortune = struct { + id: i32, + message: []const u8, +}; + +pub fn plaintext(global: *Global, _: *httpz.Request, res: *httpz.Response) !void { + try setHeaders(global.allocator, res); + + res.content_type = .TEXT; + res.body = "Hello, World!"; +} + +pub fn json(global: *Global, _: *httpz.Request, res: *httpz.Response) !void { + try setHeaders(global.allocator, res); + + const message = Message{ .message = "Hello, World!" }; + + try res.json(message, .{}); +} + +pub fn db(global: *Global, _: *httpz.Request, res: *httpz.Response) !void { + try setHeaders(global.allocator, res); + + global.mutex.lock(); + const random_number = 1 + (global.prng.random().uintAtMost(u32, 9999)); + global.mutex.unlock(); + + const world = getWorld(global.pool, random_number) catch |err| { + std.debug.print("Error querying database: {}\n", .{err}); + return; + }; + + try res.json(world, .{}); +} + +pub fn fortune(global: *Global, _: *httpz.Request, res: *httpz.Response) !void { + try setHeaders(global.allocator, res); + + const fortunes_html = try getFortunesHtml(global.allocator, global.pool); + + res.header("content-type", "text/html; charset=utf-8"); + res.body = fortunes_html; +} + +fn getWorld(pool: *pg.Pool, random_number: u32) !World{ + var conn = try pool.acquire(); + defer conn.release(); + + const row_result = try conn.row("SELECT id, randomNumber FROM World WHERE id = $1", .{random_number}); + + var row = row_result.?; + defer row.deinit() catch {}; + + return World{ .id = row.get(i32, 0), .randomNumber = row.get(i32, 1) }; +} + +fn setHeaders(allocator: Allocator, res: *httpz.Response) !void { + res.header("Server", "Httpz"); + + const now = datetimez.datetime.Date.now(); + const time = datetimez.datetime.Time.now(); + + // Wed, 17 Apr 2013 12:00:00 GMT + // Return date in ISO format YYYY-MM-DD + const TB_DATE_FMT = "{s:0>3}, {d:0>2} {s:0>3} {d:0>4} {d:0>2}:{d:0>2}:{d:0>2} GMT"; + const now_str = try std.fmt.allocPrint(allocator, TB_DATE_FMT, .{ now.weekdayName()[0..3], now.day, now.monthName()[0..3], now.year, time.hour, time.minute, time.second }); + + //defer allocator.free(now_str); + + res.header("Date", now_str); +} + +fn getFortunesHtml(allocator: Allocator, pool: *pg.Pool) ![]const u8 { + const fortunes = try getFortunes(allocator, pool); + + const raw = try mustache.allocRenderText(allocator, template,.{ .fortunes = fortunes }); + + // std.debug.print("mustache output {s}\n", .{raw}); + + const html = try deescapeHtml(allocator, raw); + + // std.debug.print("html output {s}\n", .{html}); + + return html; +} + +fn getFortunes(allocator: Allocator, pool: *pg.Pool) ![]const Fortune { + var conn = try pool.acquire(); + defer conn.release(); + + var rows = try conn.query("SELECT id, message FROM Fortune", .{}); + defer rows.deinit(); + + var fortunes = std.ArrayList(Fortune).init(allocator); + defer fortunes.deinit(); + + while (try rows.next()) |row| { + const current_fortune = Fortune{ .id = row.get(i32, 0), .message = row.get([]const u8, 1) }; + try fortunes.append(current_fortune); + } + + const zero_fortune = Fortune{ .id = 0, .message = "Additional fortune added at request time." }; + try fortunes.append(zero_fortune); + + const fortunes_slice = try fortunes.toOwnedSlice(); + std.mem.sort(Fortune, fortunes_slice, {}, cmpFortuneByMessage); + + return fortunes_slice; +} + +fn cmpFortuneByMessage(_: void, a: Fortune, b: Fortune) bool { + return std.mem.order(u8, a.message, b.message).compare(std.math.CompareOperator.lt); +} + +fn deescapeHtml(allocator: Allocator, input: []const u8) ![]const u8 { + var output = std.ArrayList(u8).init(allocator); + 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/httpz/src/main.zig b/frameworks/Zig/httpz/src/main.zig new file mode 100644 index 00000000000..ae2c1a70ac4 --- /dev/null +++ b/frameworks/Zig/httpz/src/main.zig @@ -0,0 +1,71 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const httpz = @import("httpz"); +const pg = @import("pg"); +const datetimez = @import("datetimez"); +const pool = @import("pool.zig"); + +const endpoints = @import("endpoints.zig"); + +const RndGen = std.rand.DefaultPrng; +const Allocator = std.mem.Allocator; +const Pool = pg.Pool; + +var server: httpz.ServerCtx(*endpoints.Global,*endpoints.Global) = undefined; + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{ + .thread_safe = true, + }){}; + + const allocator = gpa.allocator(); + + var pg_pool = try pool.initPool(allocator); + defer pg_pool.deinit(); + + var prng = std.rand.DefaultPrng.init(@as(u64, @bitCast(std.time.milliTimestamp()))); + + var global = endpoints.Global{ .pool = pg_pool, .prng = &prng, .allocator = allocator }; + + server = try httpz.ServerApp(*endpoints.Global).init(allocator, .{ + .port = 3000, .address = "0.0.0.0", }, &global); + defer server.deinit(); + + // now that our server is up, we register our intent to handle SIGINT + try std.posix.sigaction(std.posix.SIG.INT, &.{ + .handler = .{.handler = shutdown}, + .mask = std.posix.empty_sigset, + .flags = 0, + }, null); + + var router = server.router(); + router.get("/json", endpoints.json); + router.get("/plaintext", endpoints.plaintext); + router.get("/db", endpoints.db); + router.get("/fortunes", endpoints.fortune); + + std.debug.print("Httpz listening at 0.0.0.0:{d}\n", .{3000}); + + try server.listen(); +} + +fn shutdown(_: c_int) callconv(.C) void { + // this will unblock the server.listen() + server.stop(); +} + +fn notFound(_: *httpz.Request, res: *httpz.Response) !void { + res.status = 404; + + // you can set the body directly to a []u8, but note that the memory + // must be valid beyond your handler. Use the res.arena if you need to allocate + // memory for the body. + res.body = "Not Found"; +} + +// note that the error handler return `void` and not `!void` +fn errorHandler(req: *httpz.Request, res: *httpz.Response, err: anyerror) void { + res.status = 500; + res.body = "Internal Server Error"; + std.log.warn("httpz: unhandled exception for request: {s}\nErr: {}", .{req.url.raw, err}); +} \ No newline at end of file diff --git a/frameworks/Zig/httpz/src/pool.zig b/frameworks/Zig/httpz/src/pool.zig new file mode 100644 index 00000000000..c41cb329540 --- /dev/null +++ b/frameworks/Zig/httpz/src/pool.zig @@ -0,0 +1,87 @@ +const std = @import("std"); +const regex = @import("regex"); +const pg = @import("pg"); + +const Allocator = std.mem.Allocator; +const Pool = pg.Pool; +const ArrayList = std.ArrayList; + +pub fn initPool(allocator: Allocator) !*pg.Pool { + const info = try parsePostgresConnStr(allocator); + //std.debug.print("Connection: {s}:{s}@{s}:{d}/{s}\n", .{ info.username, info.password, info.hostname, info.port, info.database }); + + const pg_pool = try Pool.init(allocator, .{ + .size = 28, + .connect = .{ + .port = info.port, + .host = info.hostname, + }, + .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(allocator: Allocator) !ConnectionInfo { + const pg_port = try getEnvVar(allocator, "PG_PORT", "5432"); + // std.debug.print("tfb port {s}\n", .{pg_port}); + var port = try std.fmt.parseInt(u16, pg_port, 0); + + if (port == 0) { + port = 5432; + } + + return ConnectionInfo{ + .username = try getEnvVar(allocator, "PG_USER", "benchmarkdbuser"), + .password = try getEnvVar(allocator, "PG_PASS", "benchmarkdbpass"), + .hostname = try getEnvVar(allocator, "PG_HOST", "localhost"), + .port = port, + .database = try getEnvVar(allocator, "PG_DB", "hello_world"), + }; +} + +fn getEnvVar(allocator: Allocator, name: []const u8, default: []const u8) ![]const u8 { + const env_var = std.process.getEnvVarOwned(allocator, name) catch |err| switch (err) { + error.EnvironmentVariableNotFound => return default, + error.OutOfMemory => return err, + error.InvalidWtf8 => return err, + }; + + if (env_var.len == 0) return default; + + return env_var; +} From 7ccad708d0941c82bc7b4972a7c8ca554edee9a2 Mon Sep 17 00:00:00 2001 From: walkor Date: Tue, 22 Oct 2024 22:47:20 +0800 Subject: [PATCH 0867/1766] [php] Enable jit for workerman and webman (#9258) * Enable jit and remove unnecessary files * Remove reusePort * Add maintainers walkor * Use the latest event extension * Use event-3.1.4 * Add without jit tests * Fix dockerfile name * Add space to display_name * save * Reuseport --- frameworks/PHP/webman/benchmark_config.json | 22 ++++- frameworks/PHP/webman/config.toml | 18 +++++ frameworks/PHP/webman/config/server.php | 3 +- frameworks/PHP/webman/php.ini | 6 +- frameworks/PHP/webman/webman-pgsql.dockerfile | 26 ++++++ frameworks/PHP/webman/webman.dockerfile | 9 ++- .../PHP/workerman/benchmark_config.json | 50 ++++++++---- frameworks/PHP/workerman/config.toml | 25 +++++- frameworks/PHP/workerman/php-jit.ini | 6 +- frameworks/PHP/workerman/php.ini | 2 +- frameworks/PHP/workerman/server-async.php | 80 ------------------- frameworks/PHP/workerman/server.php | 23 ++++-- ...nc.dockerfile => workerman-jit.dockerfile} | 12 +-- .../workerman/workerman-mysql-jit.dockerfile | 26 ++++++ ...kerfile => workerman-pgsql-jit.dockerfile} | 11 +-- .../PHP/workerman/workerman-pgsql.dockerfile | 10 +-- frameworks/PHP/workerman/workerman.dockerfile | 7 +- 17 files changed, 194 insertions(+), 142 deletions(-) create mode 100644 frameworks/PHP/webman/webman-pgsql.dockerfile delete mode 100644 frameworks/PHP/workerman/server-async.php rename frameworks/PHP/workerman/{workerman-async.dockerfile => workerman-jit.dockerfile} (65%) create mode 100644 frameworks/PHP/workerman/workerman-mysql-jit.dockerfile rename frameworks/PHP/workerman/{workerman-php8-jit.dockerfile => workerman-pgsql-jit.dockerfile} (66%) diff --git a/frameworks/PHP/webman/benchmark_config.json b/frameworks/PHP/webman/benchmark_config.json index 864deacb0bf..7e185ce1b24 100644 --- a/frameworks/PHP/webman/benchmark_config.json +++ b/frameworks/PHP/webman/benchmark_config.json @@ -1,9 +1,29 @@ { "framework": "webman", + "maintainers": ["walkor"], "tests": [{ "default": { + "dockerfile": "webman.dockerfile", "json_url": "/json", "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "webman", + "language": "PHP", + "flavor": "PHP7", + "orm": "Raw", + "platform": "workerman", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "webman", + "notes": "", + "versus": "workerman" + }, + "pgsql": { + "dockerfile": "webman-pgsql.dockerfile", "db_url": "/db", "query_url": "/queries/", "update_url": "/updates/", @@ -20,7 +40,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "webman", + "display_name": "webman-pgsql", "notes": "", "versus": "workerman" } diff --git a/frameworks/PHP/webman/config.toml b/frameworks/PHP/webman/config.toml index b4cfc7e64d6..3aa7a920672 100644 --- a/frameworks/PHP/webman/config.toml +++ b/frameworks/PHP/webman/config.toml @@ -17,3 +17,21 @@ orm = "Raw" platform = "workerman" webserver = "None" versus = "workerman" + + +[pgsql] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "workerman" +webserver = "None" +versus = "workerman" \ No newline at end of file diff --git a/frameworks/PHP/webman/config/server.php b/frameworks/PHP/webman/config/server.php index 39f256488ef..a9e2686c8dc 100644 --- a/frameworks/PHP/webman/config/server.php +++ b/frameworks/PHP/webman/config/server.php @@ -17,9 +17,10 @@ 'transport' => 'tcp', 'context' => [], 'name' => 'webman', - 'count' => cpu_count() * 4, + 'count' => cpu_count() * ( getenv('TEST_TYPE') === 'default' ? 1 : 4 ), 'user' => '', 'group' => '', + 'reuse_port' => true, 'pid_file' => runtime_path() . '/webman.pid', 'status_file' => runtime_path() . '/webman.status', 'stdout_file' => runtime_path() . '/logs/stdout.log', diff --git a/frameworks/PHP/webman/php.ini b/frameworks/PHP/webman/php.ini index f0c616f9fb2..f4817cc9e3a 100644 --- a/frameworks/PHP/webman/php.ini +++ b/frameworks/PHP/webman/php.ini @@ -1,13 +1,11 @@ +zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.validate_timestamps=0 opcache.save_comments=0 opcache.enable_file_override=1 opcache.huge_code_pages=1 - mysqlnd.collect_statistics = Off - memory_limit = 512M - opcache.jit_buffer_size=128M -opcache.jit=tracing +opcache.jit=tracing \ No newline at end of file diff --git a/frameworks/PHP/webman/webman-pgsql.dockerfile b/frameworks/PHP/webman/webman-pgsql.dockerfile new file mode 100644 index 00000000000..491396785ea --- /dev/null +++ b/frameworks/PHP/webman/webman-pgsql.dockerfile @@ -0,0 +1,26 @@ +FROM ubuntu:24.04 + +ENV TEST_TYPE pgsql + +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 > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /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.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini + +ADD ./ /webman +WORKDIR /webman + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php.ini /etc/php/8.3/cli/conf.d/10-opcache.ini + +EXPOSE 8080 + +CMD php /webman/start.php start diff --git a/frameworks/PHP/webman/webman.dockerfile b/frameworks/PHP/webman/webman.dockerfile index 5b64cd4aa16..20ef9d61064 100644 --- a/frameworks/PHP/webman/webman.dockerfile +++ b/frameworks/PHP/webman/webman.dockerfile @@ -1,4 +1,6 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 + +ENV TEST_TYPE default ARG DEBIAN_FRONTEND=noninteractive @@ -11,14 +13,13 @@ 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.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.1.3 > /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 +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini ADD ./ /webman WORKDIR /webman RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php.ini /etc/php/8.3/cli/conf.d/10-opcache.ini EXPOSE 8080 diff --git a/frameworks/PHP/workerman/benchmark_config.json b/frameworks/PHP/workerman/benchmark_config.json index 68ce09ced79..bcb286db6d8 100644 --- a/frameworks/PHP/workerman/benchmark_config.json +++ b/frameworks/PHP/workerman/benchmark_config.json @@ -1,13 +1,11 @@ { "framework": "workerman", + "maintainers": ["walkor"], "tests": [{ "default": { + "dockerfile": "workerman-jit.dockerfile", "json_url": "/json", "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/query?q=", - "update_url": "/update?q=", - "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Platform", @@ -20,11 +18,12 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "workerman", + "display_name": "workerman [jit]", "notes": "", "versus": "php" }, "pgsql": { + "dockerfile": "workerman-pgsql-jit.dockerfile", "db_url": "/db", "query_url": "/query?q=", "update_url": "/update?q=", @@ -41,12 +40,15 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "workerman-postgres", + "display_name": "workerman [jit, pgsql]", "notes": "", "versus": "php" }, - "async": { + "mysql": { + "dockerfile": "workerman-mysql-jit.dockerfile", "db_url": "/db", + "query_url": "/query?q=", + "update_url": "/update?q=", "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", @@ -54,22 +56,38 @@ "database": "MySQL", "framework": "workerman", "language": "PHP", - "flavor": "PHP7", + "flavor": "PHP8", "orm": "Raw", "platform": "workerman", "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "workerman-async-db", + "display_name": "workerman [jit, mysql]", "notes": "", - "versus": "php", - "tags": [ - "broken" - ] + "versus": "php" }, - "php8-jit": { + "without-jit": { + "dockerfile": "workerman.dockerfile", "json_url": "/json", "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "MySQL", + "framework": "workerman", + "language": "PHP", + "flavor": "PHP8", + "orm": "Raw", + "platform": "workerman", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "workerman", + "notes": "", + "versus": "php" + }, + "pgsql-without-jit": { + "dockerfile": "workerman-pgsql.dockerfile", "db_url": "/db", "query_url": "/query?q=", "update_url": "/update?q=", @@ -86,8 +104,8 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "workerman-php8-jit", - "notes": "php8 jit", + "display_name": "workerman [pgsql]", + "notes": "", "versus": "php" } }] diff --git a/frameworks/PHP/workerman/config.toml b/frameworks/PHP/workerman/config.toml index 2f3bbffd22c..b2f50bda1a0 100644 --- a/frameworks/PHP/workerman/config.toml +++ b/frameworks/PHP/workerman/config.toml @@ -33,7 +33,7 @@ platform = "workerman" webserver = "None" versus = "php" -[php8-jit] +[mysql] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -50,8 +50,12 @@ platform = "workerman" webserver = "None" versus = "php" -[async] +[without-jit] +urls.plaintext = "/plaintext" +urls.json = "/json" urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" urls.fortune = "/fortunes" approach = "Realistic" classification = "Platform" @@ -62,3 +66,20 @@ orm = "Raw" platform = "workerman" webserver = "None" versus = "php" + +[pgsql-without-jit] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "workerman" +webserver = "None" +versus = "php" \ No newline at end of file diff --git a/frameworks/PHP/workerman/php-jit.ini b/frameworks/PHP/workerman/php-jit.ini index f0c616f9fb2..f4817cc9e3a 100644 --- a/frameworks/PHP/workerman/php-jit.ini +++ b/frameworks/PHP/workerman/php-jit.ini @@ -1,13 +1,11 @@ +zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.validate_timestamps=0 opcache.save_comments=0 opcache.enable_file_override=1 opcache.huge_code_pages=1 - mysqlnd.collect_statistics = Off - memory_limit = 512M - opcache.jit_buffer_size=128M -opcache.jit=tracing +opcache.jit=tracing \ No newline at end of file diff --git a/frameworks/PHP/workerman/php.ini b/frameworks/PHP/workerman/php.ini index e12bbd2fb0c..f6be852042e 100644 --- a/frameworks/PHP/workerman/php.ini +++ b/frameworks/PHP/workerman/php.ini @@ -7,4 +7,4 @@ opcache.huge_code_pages=1 mysqlnd.collect_statistics = Off -memory_limit = 512M +memory_limit = 512M \ No newline at end of file diff --git a/frameworks/PHP/workerman/server-async.php b/frameworks/PHP/workerman/server-async.php deleted file mode 100644 index ce468df5cd6..00000000000 --- a/frameworks/PHP/workerman/server-async.php +++ /dev/null @@ -1,80 +0,0 @@ -count = (int) shell_exec('nproc') * 2; -$http_worker->onWorkerStart = static function() { - global $mysql; - - $loop = Worker::getEventLoop(); - - $mysql = new React\MySQL\Connection($loop, [ - 'host' => 'tfb-database', - 'dbname' => 'hello_world', - 'user' => 'benchmarkdbuser', - 'passwd' => 'benchmarkdbpass' - ]); - - $mysql->on('error', function($e){ - echo $e; - }); - - $mysql->connect(function ($e) {}); -}; - -$http_worker->onMessage = static function ($connection, $request) { - - global $mysql; - - switch ($request->path()) { - case '/db': - $mysql->query('SELECT id,randomNumber FROM World WHERE id='.mt_rand(1, 10000), - static function ($command) use ($connection) { - $connection->send(new Response(200, ['Content-Type' => 'application/json', 'Date' => gmdate('D, d M Y H:i:s').' GMT'], json_encode($command->resultRows, JSON_NUMERIC_CHECK))); - } - ); - return; - - case '/fortunes': - // By default use 'Content-Type: text/html; charset=utf-8'; - $mysql->query('SELECT id,message FROM Fortune', - static function ($command) use ($connection) { - $arr = $command->resultRows; - foreach ($arr as $row) { - $fortune[$row['id']] = htmlspecialchars($row['message'], ENT_QUOTES, 'UTF-8'); - } - $fortune[0] = 'Additional fortune added at request time.'; - asort($fortune); - - $html = 'Fortunes'; - foreach ($fortune as $id => $message) { - $html .= ""; - } - - $connection->send(new Response(200, ['Date' => gmdate('D, d M Y H:i:s').' GMT'], $html.'
      idmessage
      $id$message
      ')); - - } - ); - return; - - //case '/update': - // Http::header('Content-Type: application/json'); - // return $connection->send(update()); - - //case '/info': - // Http::header('Content-Type: text/plain'); - // ob_start(); - // phpinfo(); - // return $connection->send(ob_get_clean()); - - default: - $connection->send(new Response(200, [], 'Error 404')); - - } -}; - -Worker::runAll(); diff --git a/frameworks/PHP/workerman/server.php b/frameworks/PHP/workerman/server.php index 5a38cf1e0fc..f856790efa9 100644 --- a/frameworks/PHP/workerman/server.php +++ b/frameworks/PHP/workerman/server.php @@ -1,29 +1,38 @@ count = (int) shell_exec('nproc') * 4; -$http_worker->onWorkerStart = static function () { +$http_worker->reusePort = true; +$http_worker->count = $process_count; +$http_worker->onWorkerStart = static function () use ($test_type) { 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'; }); - init(); + if ($test_type === 'pgsql') { + DbRaw::init(); + } else { + init(); + } }; $http_worker->onMessage = static function ($connection, $request) { - $connection->send(router($request)); - }; Worker::runAll(); - class Header { public static $date = null; } diff --git a/frameworks/PHP/workerman/workerman-async.dockerfile b/frameworks/PHP/workerman/workerman-jit.dockerfile similarity index 65% rename from frameworks/PHP/workerman/workerman-async.dockerfile rename to frameworks/PHP/workerman/workerman-jit.dockerfile index 3730d43e58e..c90794ab9be 100644 --- a/frameworks/PHP/workerman/workerman-async.dockerfile +++ b/frameworks/PHP/workerman/workerman-jit.dockerfile @@ -1,26 +1,26 @@ FROM ubuntu:24.04 +ENV TEST_TYPE default + 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 > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.3-cli php8.3-mysql > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini - -COPY --link php.ini /etc/php/8.3/cli/php.ini + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . -RUN composer require react/mysql "^0.6" --quiet RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini EXPOSE 8080 -CMD php /workerman/server-async.php start +CMD php /workerman/server.php start diff --git a/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile b/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile new file mode 100644 index 00000000000..7d8fd9e238d --- /dev/null +++ b/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile @@ -0,0 +1,26 @@ +FROM ubuntu:24.04 + +ENV TEST_TYPE mysql + +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 > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null + +RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null + +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini + +WORKDIR /workerman +COPY --link . . + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini + +EXPOSE 8080 + +CMD php /workerman/server.php start diff --git a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile b/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile similarity index 66% rename from frameworks/PHP/workerman/workerman-php8-jit.dockerfile rename to frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile index 528a5c312f6..6c4af626cc0 100644 --- a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile @@ -1,5 +1,7 @@ FROM ubuntu:24.04 +ENV TEST_TYPE pgsql + ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null @@ -11,18 +13,13 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini - -COPY --link php-jit.ini /etc/php/8.3/cli/php.ini + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . -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.3/cli/conf.d/10-opcache.ini - RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini EXPOSE 8080 diff --git a/frameworks/PHP/workerman/workerman-pgsql.dockerfile b/frameworks/PHP/workerman/workerman-pgsql.dockerfile index 826a6a39383..9b1552d354e 100644 --- a/frameworks/PHP/workerman/workerman-pgsql.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql.dockerfile @@ -1,5 +1,7 @@ FROM ubuntu:24.04 +ENV TEST_TYPE pgsql + ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null @@ -11,17 +13,13 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini - -COPY --link php.ini /etc/php/8.3/cli/php.ini + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . -RUN sed -i "s|'/app.php|'/app-pg.php|g" server.php -RUN sed -i "s|init()|DbRaw::init()|g" server.php - RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php.ini /etc/php/8.3/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/workerman/workerman.dockerfile b/frameworks/PHP/workerman/workerman.dockerfile index 5d09ee6362a..a4d9602019e 100644 --- a/frameworks/PHP/workerman/workerman.dockerfile +++ b/frameworks/PHP/workerman/workerman.dockerfile @@ -1,5 +1,7 @@ FROM ubuntu:24.04 +ENV TEST_TYPE default + ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null @@ -11,14 +13,13 @@ RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini - -COPY --link php-jit.ini /etc/php/8.3/cli/php.ini + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php.ini /etc/php/8.3/cli/php.ini EXPOSE 8080 From 42acadfb4143d9a92fef09660503af6495f3d52c Mon Sep 17 00:00:00 2001 From: "James R. Perkins" Date: Tue, 22 Oct 2024 07:47:50 -0700 Subject: [PATCH 0868/1766] Update WildFly to Jakarta EE 10 and the latest version of WildFly. (#9266) Signed-off-by: James R. Perkins --- frameworks/Java/wildfly-ee/pom.xml | 163 +++++++++++------- .../{bootable-jar.cli => wildfly-setup.cli} | 0 .../{ee7 => ee}/jpa/PersistenceResources.java | 8 +- .../{ee7 => ee}/model/Fortune.java | 14 +- .../techempower/{ee7 => ee}/model/World.java | 10 +- .../rest/CatchAllExceptionMapper.java | 8 +- .../{ee7 => ee}/rest/MyApplication.java | 4 +- .../{ee7 => ee}/tests/Fortunes.java | 10 +- .../{ee7 => ee}/tests/JsonSerialization.java | 8 +- .../{ee7 => ee}/tests/MultipleQueries.java | 14 +- .../{ee7 => ee}/tests/PlainText.java | 8 +- .../{ee7 => ee}/tests/SingleQuery.java | 12 +- .../{ee7 => ee}/tests/TestActions.java | 8 +- .../{ee7 => ee}/tests/Updates.java | 12 +- .../techempower/{ee7 => ee}/util/Helpers.java | 0 .../main/resources/META-INF/persistence.xml | 1 - .../src/main/webapp/WEB-INF/web.xml | 6 +- .../Java/wildfly-ee/wildfly-ee.dockerfile | 5 +- 18 files changed, 159 insertions(+), 132 deletions(-) rename frameworks/Java/wildfly-ee/scripts/{bootable-jar.cli => wildfly-setup.cli} (100%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/jpa/PersistenceResources.java (56%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/model/Fortune.java (76%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/model/World.java (74%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/rest/CatchAllExceptionMapper.java (62%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/rest/MyApplication.java (59%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/tests/Fortunes.java (79%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/tests/JsonSerialization.java (81%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/tests/MultipleQueries.java (78%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/tests/PlainText.java (78%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/tests/SingleQuery.java (64%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/tests/TestActions.java (73%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/tests/Updates.java (81%) rename frameworks/Java/wildfly-ee/src/main/java/com/techempower/{ee7 => ee}/util/Helpers.java (100%) diff --git a/frameworks/Java/wildfly-ee/pom.xml b/frameworks/Java/wildfly-ee/pom.xml index c2e6472f6e3..bd77be766bb 100644 --- a/frameworks/Java/wildfly-ee/pom.xml +++ b/frameworks/Java/wildfly-ee/pom.xml @@ -13,27 +13,69 @@ 17 3.9.0 3.3.2 - 8.0 - 26.0.1.Final - 7.0.0.Final - 2.0.6.Final + 10.0.0 + 5.0.1.Final + 8.0.1.Final
      - + + + + jakarta.platform + jakarta.jakartaee-bom + ${version.jakarta.ee} + import + pom + + + + - javax - javaee-api - ${version.javaee.api} + jakarta.annotation + jakarta.annotation-api + provided + + + jakarta.enterprise + jakarta.enterprise.cdi-api provided - - org.glassfish.jaxb - jaxb-runtime - 2.4.0-b180830.0438 + jakarta.enterprise.concurrent + jakarta.enterprise.concurrent-api + provided + + + jakarta.inject + jakarta.inject-api + provided + + + jakarta.json + jakarta.json-api + provided + + + jakarta.persistence + jakarta.persistence-api + provided + + + jakarta.transaction + jakarta.transaction-api + provided + + + jakarta.validation + jakarta.validation-api + provided + + + jakarta.ws.rs + jakarta.ws.rs-api + provided - @@ -50,63 +92,50 @@ maven-compiler-plugin ${version.compiler.plugin} - ${java.version} - ${java.version} ${java.version} + + org.wildfly.plugins + wildfly-maven-plugin + ${version.wildfly-maven-plugin} + + ROOT.war + + + + org.wildfly + wildfly-ee-galleon-pack + + + org.wildfly + wildfly-datasources-galleon-pack + ${version.wildfly.galleon.datasources.feature.pack} + + + + + + org.wildfly.channels + wildfly-ee + + + + + jaxrs-server + jpa + jsf + mysql-driver + + + + + + + + + + - - - - bootable-jar - - false - - - - - org.wildfly.plugins - wildfly-jar-maven-plugin - ${version.wildfly.maven.jar.plugin} - - - - wildfly@maven(org.jboss.universe:community-universe)#${version.wildfly.bootable} - - - org.wildfly - wildfly-datasources-galleon-pack - ${version.wildfly.galleon.datasources.feature.pack} - - - - jaxrs-server - jsf - mysql-driver - - - deployment-scanner - - - - - - - - - - - - - package - - - - - - - - diff --git a/frameworks/Java/wildfly-ee/scripts/bootable-jar.cli b/frameworks/Java/wildfly-ee/scripts/wildfly-setup.cli similarity index 100% rename from frameworks/Java/wildfly-ee/scripts/bootable-jar.cli rename to frameworks/Java/wildfly-ee/scripts/wildfly-setup.cli diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/jpa/PersistenceResources.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/jpa/PersistenceResources.java similarity index 56% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/jpa/PersistenceResources.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/jpa/PersistenceResources.java index fcdc4aafa0d..aa580b31f68 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/jpa/PersistenceResources.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/jpa/PersistenceResources.java @@ -1,9 +1,9 @@ package com.techempower.ee7.jpa; -import javax.enterprise.context.Dependent; -import javax.enterprise.inject.Produces; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.enterprise.context.Dependent; +import jakarta.enterprise.inject.Produces; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; public class PersistenceResources { diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/model/Fortune.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/model/Fortune.java similarity index 76% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/model/Fortune.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/model/Fortune.java index dce49416f75..7648c05b539 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/model/Fortune.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/model/Fortune.java @@ -2,13 +2,13 @@ import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.NamedQuery; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.NamedQuery; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; @NamedQuery(name = "allFortunes", query = "SELECT f FROM Fortune f") @Entity diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/model/World.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/model/World.java similarity index 74% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/model/World.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/model/World.java index 44fd914aee7..1ee3ae0e97a 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/model/World.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/model/World.java @@ -2,11 +2,11 @@ import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.validation.constraints.NotNull; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.NotNull; @Entity public class World implements Serializable { diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/rest/CatchAllExceptionMapper.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/rest/CatchAllExceptionMapper.java similarity index 62% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/rest/CatchAllExceptionMapper.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/rest/CatchAllExceptionMapper.java index 0beb6e85c3d..bc287fda07a 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/rest/CatchAllExceptionMapper.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/rest/CatchAllExceptionMapper.java @@ -1,9 +1,9 @@ package com.techempower.ee7.rest; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; @Provider public class CatchAllExceptionMapper implements ExceptionMapper { diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/rest/MyApplication.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/rest/MyApplication.java similarity index 59% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/rest/MyApplication.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/rest/MyApplication.java index 5c82e49f3b9..c1f912ec17d 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/rest/MyApplication.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/rest/MyApplication.java @@ -1,7 +1,7 @@ package com.techempower.ee7.rest; -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; @ApplicationPath("rest") public class MyApplication extends Application { diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/Fortunes.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/Fortunes.java similarity index 79% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/Fortunes.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/Fortunes.java index 6bbff0fead8..8bd06ae545c 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/Fortunes.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/Fortunes.java @@ -3,11 +3,11 @@ import java.util.Collections; import java.util.List; -import javax.annotation.PostConstruct; -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; import com.techempower.ee7.model.Fortune; diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/JsonSerialization.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/JsonSerialization.java similarity index 81% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/JsonSerialization.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/JsonSerialization.java index ad5d947b042..019afc50fc7 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/JsonSerialization.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/JsonSerialization.java @@ -1,9 +1,9 @@ package com.techempower.ee7.tests; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; @Path("/json") public class JsonSerialization { diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/MultipleQueries.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/MultipleQueries.java similarity index 78% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/MultipleQueries.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/MultipleQueries.java index 936ddfb4b04..fbd764af7ee 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/MultipleQueries.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/MultipleQueries.java @@ -3,13 +3,13 @@ import java.util.ArrayList; import java.util.List; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; import com.techempower.ee7.model.World; import com.techempower.ee7.util.Helpers; diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/PlainText.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/PlainText.java similarity index 78% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/PlainText.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/PlainText.java index f40da2ab7da..7ce9f37f3b9 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/PlainText.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/PlainText.java @@ -1,9 +1,9 @@ package com.techempower.ee7.tests; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; @Path("/plaintext") public class PlainText { diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/SingleQuery.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/SingleQuery.java similarity index 64% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/SingleQuery.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/SingleQuery.java index 30279ae4295..517ad710f45 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/SingleQuery.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/SingleQuery.java @@ -1,11 +1,11 @@ package com.techempower.ee7.tests; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import com.techempower.ee7.model.World; import com.techempower.ee7.util.Helpers; diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/TestActions.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/TestActions.java similarity index 73% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/TestActions.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/TestActions.java index 9302373516c..d3847c9b661 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/TestActions.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/TestActions.java @@ -1,9 +1,9 @@ package com.techempower.ee7.tests; -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.transaction.Transactional; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; import com.techempower.ee7.model.World; import com.techempower.ee7.util.Helpers; diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/Updates.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/Updates.java similarity index 81% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/Updates.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/Updates.java index b041f24c939..5c3879bc363 100644 --- a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/tests/Updates.java +++ b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/tests/Updates.java @@ -3,12 +3,12 @@ import java.util.ArrayList; import java.util.List; -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; import com.techempower.ee7.model.World; import com.techempower.ee7.util.Helpers; diff --git a/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/util/Helpers.java b/frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/util/Helpers.java similarity index 100% rename from frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee7/util/Helpers.java rename to frameworks/Java/wildfly-ee/src/main/java/com/techempower/ee/util/Helpers.java diff --git a/frameworks/Java/wildfly-ee/src/main/resources/META-INF/persistence.xml b/frameworks/Java/wildfly-ee/src/main/resources/META-INF/persistence.xml index 2ac545e5dde..ff728916fe5 100644 --- a/frameworks/Java/wildfly-ee/src/main/resources/META-INF/persistence.xml +++ b/frameworks/Java/wildfly-ee/src/main/resources/META-INF/persistence.xml @@ -6,7 +6,6 @@ NONE - diff --git a/frameworks/Java/wildfly-ee/src/main/webapp/WEB-INF/web.xml b/frameworks/Java/wildfly-ee/src/main/webapp/WEB-INF/web.xml index 96378e310c9..126c5588694 100644 --- a/frameworks/Java/wildfly-ee/src/main/webapp/WEB-INF/web.xml +++ b/frameworks/Java/wildfly-ee/src/main/webapp/WEB-INF/web.xml @@ -8,7 +8,7 @@ Faces Servlet - javax.faces.webapp.FacesServlet + jakarta.faces.webapp.FacesServlet 1 @@ -18,12 +18,12 @@ - javax.faces.STATE_SAVING_METHOD + jakarta.faces.STATE_SAVING_METHOD client - javax.faces.PROJECT_STAGE + jakarta.faces.PROJECT_STAGE Production diff --git a/frameworks/Java/wildfly-ee/wildfly-ee.dockerfile b/frameworks/Java/wildfly-ee/wildfly-ee.dockerfile index ec4a1c6e063..b04e261e64d 100644 --- a/frameworks/Java/wildfly-ee/wildfly-ee.dockerfile +++ b/frameworks/Java/wildfly-ee/wildfly-ee.dockerfile @@ -1,9 +1,8 @@ FROM maven:3-openjdk-17 WORKDIR /wildfly EXPOSE 8080 -ENV MAVEN_OPTS="--add-exports=java.xml/com.sun.org.apache.xerces.internal.parsers=ALL-UNNAMED --add-exports=java.xml/com.sun.org.apache.xerces.internal.util=ALL-UNNAMED" COPY src src COPY scripts scripts COPY pom.xml pom.xml -RUN mvn clean package -P bootable-jar -CMD java -Djava.net.preferIPv4Stack=true -XX:SoftMaxHeapSize=18g -Xmx24g -XX:+UseZGC -jar target/wildfly-ee-bootable.jar +RUN mvn clean package wildfly:package +CMD JAVA_OPTS="-Djava.net.preferIPv4Stack=true -XX:SoftMaxHeapSize=18g -Xmx24g -XX:+UseZGC" ./target/server/bin/standalone.sh From 3d7db350d2b6aa138f0d56a4b7cb57f9781acdce Mon Sep 17 00:00:00 2001 From: DravenK Date: Tue, 22 Oct 2024 22:48:11 +0800 Subject: [PATCH 0869/1766] Add Zig Zinc framework (#9289) * Adding Zinc framework * Update num_threads and fixed headers * Update dependency * Update build command * Update Zinc documentation * Run workflow * Update Zinc approach * Update zinc Allocator and plaintext test * Update zinc dependencies * bug fix * Fixed zinc dependencies and port --- frameworks/Zig/zinc/.gitignore | 2 + frameworks/Zig/zinc/README.md | 32 ++++++++++ frameworks/Zig/zinc/benchmark_config.json | 26 ++++++++ frameworks/Zig/zinc/build.zig | 78 +++++++++++++++++++++++ frameworks/Zig/zinc/build.zig.zon | 27 ++++++++ frameworks/Zig/zinc/run.sh | 3 + frameworks/Zig/zinc/src/main.zig | 43 +++++++++++++ frameworks/Zig/zinc/zinc.dockerfile | 21 ++++++ 8 files changed, 232 insertions(+) create mode 100644 frameworks/Zig/zinc/.gitignore create mode 100755 frameworks/Zig/zinc/README.md create mode 100755 frameworks/Zig/zinc/benchmark_config.json create mode 100644 frameworks/Zig/zinc/build.zig create mode 100644 frameworks/Zig/zinc/build.zig.zon create mode 100644 frameworks/Zig/zinc/run.sh create mode 100644 frameworks/Zig/zinc/src/main.zig create mode 100644 frameworks/Zig/zinc/zinc.dockerfile diff --git a/frameworks/Zig/zinc/.gitignore b/frameworks/Zig/zinc/.gitignore new file mode 100644 index 00000000000..170dc0f1403 --- /dev/null +++ b/frameworks/Zig/zinc/.gitignore @@ -0,0 +1,2 @@ +zig-cache/**/*', +zig-out: 'zig-out/**/*', diff --git a/frameworks/Zig/zinc/README.md b/frameworks/Zig/zinc/README.md new file mode 100755 index 00000000000..acf0f93bbcb --- /dev/null +++ b/frameworks/Zig/zinc/README.md @@ -0,0 +1,32 @@ +# [Zinc](https://zinc.zon.dev) web framework + +## Description + +Zinc is a web framework written in pure Zig with a focus on high performance, usability, security, and extensibility. + +* [Documentation](https://zinc.zon.dev/) + +### Some features are: +- **Fast** +- **Custom allocator** +- **Multithreading** +- **Middleware** +- **Routes grouping** +- **Rendering built-in** +- **Extensible** +- **Suite of unit tests** +- **Usability** + +## Important Libraries +The tests were run with: +* [Software](https://zinc.zon.dev/) +* [Example](https://github.com/zon-dev/zinc-examples) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Zig/zinc/benchmark_config.json b/frameworks/Zig/zinc/benchmark_config.json new file mode 100755 index 00000000000..2e2e874ba2d --- /dev/null +++ b/frameworks/Zig/zinc/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "zinc", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 3000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "None", + "framework": "Zinc", + "language": "Zig", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Zinc", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Zig/zinc/build.zig b/frameworks/Zig/zinc/build.zig new file mode 100644 index 00000000000..e5be63940e5 --- /dev/null +++ b/frameworks/Zig/zinc/build.zig @@ -0,0 +1,78 @@ +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 not + // set a preferred release mode, allowing the user to decide how to optimize. + const optimize = b.standardOptimizeOption(.{}); + + const exe = b.addExecutable(.{ + .name = "zinc", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + const zinc = b.dependency("zinc", .{ + .target = target, + .optimize = optimize, + }); + exe.root_module.addImport("zinc", zinc.module("zinc")); + + const datetime = b.dependency("zig-datetime", .{ + .target = target, + .optimize = optimize, + }); + exe.root_module.addImport("datetime", datetime.module("zig-datetime")); + + // 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); + + const exe_unit_tests = b.addTest(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + const run_exe_unit_tests = b.addRunArtifact(exe_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_exe_unit_tests.step); +} diff --git a/frameworks/Zig/zinc/build.zig.zon b/frameworks/Zig/zinc/build.zig.zon new file mode 100644 index 00000000000..9a4c8f302cf --- /dev/null +++ b/frameworks/Zig/zinc/build.zig.zon @@ -0,0 +1,27 @@ +.{ + .name = "zinc", + .version = "0.1.0", + .dependencies = .{ + .zinc = .{ + .url = "https://github.com/zon-dev/zinc/archive/refs/tags/0.1.0-beta.5.tar.gz", + .hash = "12201444aa36b4a83f262f319e7c17ccdcff9fbde2efbeb5fc94f1a07eda0d99428e", + }, + .@"zig-datetime" = .{ + .url = "git+https://github.com/frmdstryr/zig-datetime#70aebf28fb3e137cd84123a9349d157a74708721", + .hash = "122077215ce36e125a490e59ec1748ffd4f6ba00d4d14f7308978e5360711d72d77f", + }, + .pg = .{ + .url = "git+https://github.com/karlseguin/pg.zig#21db2306aff657802f9cb10a1e7f8fe9c33e7990", + .hash = "1220df8995ceea78a4a37a505fc779ded75725d0606c33fded26103953524dde1619", + }, + .mustache = .{ + .url = "git+https://github.com/batiati/mustache-zig#ac358646ab9e6123285b90c947ecd40f7966d531", + .hash = "1220cd6e1b49bdd0a568682957dab9a6864554755908f7de990ec7c050f58cf41da2", + }, + }, + .paths = .{ + "build.zig", + "build.zig.zon", + "src", + }, +} diff --git a/frameworks/Zig/zinc/run.sh b/frameworks/Zig/zinc/run.sh new file mode 100644 index 00000000000..639c542fc3e --- /dev/null +++ b/frameworks/Zig/zinc/run.sh @@ -0,0 +1,3 @@ +echo "Waiting for Zinc framework to start..." + +zinc \ No newline at end of file diff --git a/frameworks/Zig/zinc/src/main.zig b/frameworks/Zig/zinc/src/main.zig new file mode 100644 index 00000000000..f06104dc4f1 --- /dev/null +++ b/frameworks/Zig/zinc/src/main.zig @@ -0,0 +1,43 @@ +const std = @import("std"); +const zinc = @import("zinc"); +const Datetime = @import("datetime").datetime.Datetime; + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{ .thread_safe = true }){}; + defer _ = gpa.deinit(); + const allocator = gpa.allocator(); + + var z = try zinc.init(.{ + .port = 3000, + .allocator = allocator, + .num_threads = 16 * @as(u8, @intCast(std.Thread.getCpuCount() catch 1)), + }); + defer z.deinit(); + + var router = z.getRouter(); + try router.use(&.{setupHeader}); + try router.get("/json", json); + try router.get("/plaintext", plaintext); + + try z.run(); +} + +fn plaintext(ctx: *zinc.Context) anyerror!void { + try ctx.setHeader("Content-Type", "text/plain; charset=utf-8"); + try ctx.setBody("Hello, world!"); +} + +fn json(ctx: *zinc.Context) anyerror!void { + try ctx.json(.{ .message = "Hello, World!" }, .{}); +} + +fn setupHeader(ctx: *zinc.Context) anyerror!void { + try ctx.setHeader("Server", "Zinc"); + + const now = Datetime.now(); + const now_str = try now.formatHttp(ctx.allocator); + // defer ctx.allocator.free(now_str); + + // The time is now: Fri, 20 Dec 2019 22:03:02 UTC + try ctx.setHeader("date", now_str); +} diff --git a/frameworks/Zig/zinc/zinc.dockerfile b/frameworks/Zig/zinc/zinc.dockerfile new file mode 100644 index 00000000000..11b64881d2c --- /dev/null +++ b/frameworks/Zig/zinc/zinc.dockerfile @@ -0,0 +1,21 @@ +FROM fedora:40 AS build + +WORKDIR /zinc + +COPY src src +COPY run.sh run.sh + +COPY build.zig.zon build.zig.zon +COPY build.zig build.zig + +RUN dnf install -y zig +RUN zig version +RUN zig build -Doptimize=ReleaseFast +RUN cp /zinc/zig-out/bin/zinc /usr/local/bin + +EXPOSE 3000 +ARG BENCHMARK_ENV +ARG TFB_TEST_DATABASE +ARG TFB_TEST_NAME + +CMD ["sh", "run.sh"] From 03c56d5f144d9080b5cb070d1fbd9f8b2e8aaf32 Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Sun, 27 Oct 2024 18:27:19 +0200 Subject: [PATCH 0870/1766] [mORMot] - upgrade to mORmot@2.3.stable + CMem (#9350) Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/setup_and_build.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 8f2d533127f..62bd68746f8 100755 --- a/frameworks/Pascal/mormot/setup_and_build.sh +++ b/frameworks/Pascal/mormot/setup_and_build.sh @@ -27,7 +27,7 @@ rm -rf ./libs mkdir -p ./libs/mORMot/static # echo "Getting the latest pre-release URL..." # USED_TAG=$(wget -qO- https://api.github.com/repos/synopse/mORMot2/releases/latest | jq -r '.tag_name') -USED_TAG="2.2.stable" +USED_TAG="2.3.stable" echo "Used release tag $USED_TAG" URL="https://github.com/synopse/mORMot2/releases/download/$USED_TAG/mormot2static.tgz" @@ -35,8 +35,8 @@ 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/6dc09ceca456931384857b383ed61b63f11f3be7 -#URL="https://api.github.com/repos/synopse/mORMot2/tarball/$USED_TAG" +#URL=https://github.com/synopse/mORMot2/tarball/6dc09ceca456931384857b383ed61b63f11f3be7 +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 @@ -80,7 +80,7 @@ fpc -MDelphi -Sci -Ci -O3 -g -gl -gw2 -Xg -k'-rpath=$ORIGIN' -k-L$BIN \ -Fu"$MSRC/core" -Fu"$MSRC/db" -Fu"$MSRC/rest" -Fu"$MSRC/crypt" \ -Fu"$MSRC/app" -Fu"$MSRC/net" -Fu"$MSRC/lib" -Fu"$MSRC/orm" -Fu"$MSRC/soa" \ -FU"$BIN/fpc-$ARCH_TG/.dcu" -FE"$BIN/fpc-$ARCH_TG" -o"$BIN/fpc-$ARCH_TG/$dest_fn" \ - -dFPC_X64MM -dFPCMM_SERVER \ + -dFPC_LIBCMM -dFPC_LIBCMM_NOMSIZE \ -B -Se1 "./src/raw.pas" | grep "[Warning|Error|Fatal]:" script_successful \ No newline at end of file From 7caeea0d2c060e08d0fe7306887fe852e31805c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Mon, 28 Oct 2024 00:27:38 +0800 Subject: [PATCH 0871/1766] [Java] Update Solon Version To 3.0.2 (#9351) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Version To 2.9.2 * Add Solon-Virtual * Remove solon-virtual * Update Solon Version To 3.0.2 --- frameworks/Java/solon/README.md | 2 +- frameworks/Java/solon/pom.xml | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frameworks/Java/solon/README.md b/frameworks/Java/solon/README.md index f2370ab2305..49d4aef9fe8 100644 --- a/frameworks/Java/solon/README.md +++ b/frameworks/Java/solon/README.md @@ -10,7 +10,7 @@ This is the solon portion of a [benchmarking test suite](../) comparing a variet ## Versions * [Java OpenJDK 21](http://openjdk.java.net/) -* [solon 2.9.1](https://github.com/noear/solon) +* [solon 3.0.2](https://github.com/noear/solon) ## Test URLs diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index 035ad60951a..0c9d8d570ce 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -5,7 +5,7 @@ org.noear solon-parent - 2.9.2 + 3.0.2 hello @@ -20,14 +20,12 @@ org.noear - solon.boot.smarthttp - ${solon.version} + solon-boot-smarthttp org.noear - solon.serialization.fastjson2 - ${solon.version} + solon-serialization-snack3 From 4c793a6af8f146de97058380380f4c5af184c070 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Sun, 27 Oct 2024 17:27:59 +0100 Subject: [PATCH 0872/1766] [ruby/sinatra-sequel] Remove some test variations (#9359) Don't run every permutation as there isn't a lot of variation. Limit to running: - Puma with MySQL (the default) - Puma with Postgres - Unicorn with Postgres - Passenger with Postgres This remove the following variations which were slower that their Postgres alternative: - Unicorn with MySQL - Passenger with MySQL --- .../Ruby/sinatra-sequel/benchmark_config.json | 40 ------------------- .../sinatra-sequel-passenger-mri.dockerfile | 26 ------------ .../sinatra-sequel-unicorn-mri.dockerfile | 19 --------- 3 files changed, 85 deletions(-) delete mode 100644 frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile delete mode 100644 frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile diff --git a/frameworks/Ruby/sinatra-sequel/benchmark_config.json b/frameworks/Ruby/sinatra-sequel/benchmark_config.json index c16da1e0e26..9a267813727 100644 --- a/frameworks/Ruby/sinatra-sequel/benchmark_config.json +++ b/frameworks/Ruby/sinatra-sequel/benchmark_config.json @@ -42,26 +42,6 @@ "versus": "rack-sequel-postgres-puma-mri", "notes": "" }, - "passenger-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Passenger", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-sequel-passenger-mri", - "versus": "rack-sequel-passenger-mri", - "notes": "" - }, "postgres-passenger-mri": { "db_url": "/db", "query_url": "/queries?queries=", @@ -82,26 +62,6 @@ "versus": "rack-sequel-postgres-passenger-mri", "notes": "" }, - "unicorn-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-sequel-unicorn-mri", - "versus": "rack-sequel-unicorn-mri", - "notes": "" - }, "postgres-unicorn-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile deleted file mode 100644 index 39bd11758da..00000000000 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM ruby:3.3 - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra-sequel -WORKDIR /sinatra-sequel - -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=mysql - -RUN ruby -r /sinatra-sequel/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile deleted file mode 100644 index c3e2bc7de13..00000000000 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM ruby:3.4-rc - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra-sequel -WORKDIR /sinatra-sequel - -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile - -ENV DBTYPE=mysql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production From e3bd32520f45b6310062ec532bbcf2e84984d2dc Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Sun, 27 Oct 2024 17:28:07 +0100 Subject: [PATCH 0873/1766] [ruby/sinatra] Remove some test variations (#9361) Don't run every permutation as there isn't a lot of variation. Limit to running: - Puma with MySQL (the default) - Puma with Postgres - Unicorn with Postgres - Passenger with Postgres This remove the following variations which were slower that their Postgres alternative: - Unicorn with MySQL - Passenger with MySQL --- frameworks/Ruby/sinatra/benchmark_config.json | 44 ------------------- .../sinatra/sinatra-passenger-mri.dockerfile | 26 ----------- .../sinatra/sinatra-unicorn-mri.dockerfile | 19 -------- 3 files changed, 89 deletions(-) delete mode 100644 frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile delete mode 100644 frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile diff --git a/frameworks/Ruby/sinatra/benchmark_config.json b/frameworks/Ruby/sinatra/benchmark_config.json index 166a2e9e2bf..2c0be64ed47 100644 --- a/frameworks/Ruby/sinatra/benchmark_config.json +++ b/frameworks/Ruby/sinatra/benchmark_config.json @@ -44,28 +44,6 @@ "versus": "rack-postgres-puma-mri", "notes": "" }, - "passenger-mri": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Passenger", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-passenger-mri", - "versus": "rack-passenger-mri", - "notes": "" - }, "postgres-passenger-mri": { "db_url": "/db", "query_url": "/queries?queries=", @@ -86,28 +64,6 @@ "versus": "rack-postgres-passenger-mri", "notes": "" }, - "unicorn-mri": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-unicorn-mri", - "versus": "rack-unicorn-mri", - "notes": "" - }, "postgres-unicorn-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile deleted file mode 100644 index eb07d7b5ba7..00000000000 --- a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM ruby:3.3 - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra -WORKDIR /sinatra - -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=mysql - -RUN ruby -r /sinatra/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production diff --git a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile deleted file mode 100644 index f0dede838aa..00000000000 --- a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM ruby:3.4-rc - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra -WORKDIR /sinatra - -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile - -ENV DBTYPE=mysql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production From 157bbff3780caa5c2eb5abbeabb7459d7910ae2b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Sun, 27 Oct 2024 17:28:15 +0100 Subject: [PATCH 0874/1766] [ruby/roda-sequel] Remove some test variations (#9362) Don't run every permutation as there isn't a lot of variation. Limit to running: - Puma with MySQL (the default) - Puma with Postgres - Unicorn with Postgres - Passenger with Postgres This remove the following variations which were slower that their Postgres alternative: - Unicorn with MySQL - Passenger with MySQL --- .../Ruby/roda-sequel/benchmark_config.json | 44 ------------------- .../roda-sequel-passenger-mri.dockerfile | 27 ------------ .../roda-sequel-unicorn-mri.dockerfile | 20 --------- 3 files changed, 91 deletions(-) delete mode 100644 frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile delete mode 100644 frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile diff --git a/frameworks/Ruby/roda-sequel/benchmark_config.json b/frameworks/Ruby/roda-sequel/benchmark_config.json index 27db92a9b59..2ca8400a156 100644 --- a/frameworks/Ruby/roda-sequel/benchmark_config.json +++ b/frameworks/Ruby/roda-sequel/benchmark_config.json @@ -44,28 +44,6 @@ "versus": "rack-sequel-postgres-puma-mri", "notes": "" }, - "passenger-mri": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "roda-sequel", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Passenger", - "os": "Linux", - "database_os": "Linux", - "display_name": "roda-sequel-passenger-mri", - "versus": "rack-sequel-passenger-mri", - "notes": "" - }, "postgres-passenger-mri": { "db_url": "/db", "query_url": "/queries?queries=", @@ -86,28 +64,6 @@ "versus": "rack-sequel-postgres-passenger-mri", "notes": "" }, - "unicorn-mri": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "roda-sequel", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "roda-sequel-unicorn-mri", - "versus": "rack-sequel-unicorn-mri", - "notes": "" - }, "postgres-unicorn-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile deleted file mode 100644 index e25f21e20d9..00000000000 --- a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM ruby:3.3 - -ADD ./ /roda-sequel -WORKDIR /roda-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle install --jobs=8 - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=mysql - -RUN ruby -r /roda-sequel/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile deleted file mode 100644 index d0cd81077bb..00000000000 --- a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM ruby:3.4-rc - -ADD ./ /roda-sequel -WORKDIR /roda-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle install --jobs=8 - -ENV DBTYPE=mysql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production From 668341f74d7404f998ca65716e1ca1fdc9c085d6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Sun, 27 Oct 2024 17:28:23 +0100 Subject: [PATCH 0875/1766] [rails] Test with agoo server (#9363) --- frameworks/Ruby/rails/Gemfile | 29 ++++++++++++++++++--- frameworks/Ruby/rails/Gemfile.lock | 9 +++++++ frameworks/Ruby/rails/benchmark_config.json | 24 +++++++++++++++++ frameworks/Ruby/rails/config/agoo.rb | 0 frameworks/Ruby/rails/rails-agoo.dockerfile | 27 +++++++++++++++++++ 5 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 frameworks/Ruby/rails/config/agoo.rb create mode 100644 frameworks/Ruby/rails/rails-agoo.dockerfile diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index e5d6e743679..b188913327b 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -1,10 +1,31 @@ source 'https://rubygems.org' gem 'oj', '~> 3.16' -gem 'pg', '~> 1.5', group: :postgresql -gem 'puma', '~> 6.4', require: false -gem 'falcon', '~> 0.47', require: false gem 'rails', '~> 7.2.0' gem 'redis', '~> 5.0' -gem 'trilogy', '~> 2.8.1', group: :mysql gem 'tzinfo-data' + +group :mysql do + gem 'trilogy', '~> 2.8.1' +end + +group :postgresql do + gem 'pg', '~> 1.5' +end + +group :falcon do + gem 'falcon', '~> 0.47', require: false +end + +group :puma do + gem 'puma', '~> 6.4', require: false +end + +group :unicorn do + gem 'unicorn', '~> 6.1', require: false +end + +group :agoo do + gem 'agoo', require: false + gem 'rackup' +end diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 311ffc7f814..9773df3e123 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -71,6 +71,7 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + agoo (2.15.13) async (2.17.0) console (~> 1.26) fiber-annotation @@ -137,6 +138,7 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.7.2) + kgio (2.11.4) localhost (1.3.1) logger (1.6.1) loofah (2.22.0) @@ -232,6 +234,7 @@ GEM rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) + raindrops (0.20.1) rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) @@ -254,6 +257,9 @@ GEM concurrent-ruby (~> 1.0) tzinfo-data (1.2024.2) tzinfo (>= 1.0.0) + unicorn (6.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) useragent (0.16.10) webrick (1.8.2) websocket-driver (0.7.6) @@ -267,14 +273,17 @@ PLATFORMS x86_64-linux DEPENDENCIES + agoo falcon (~> 0.47) oj (~> 3.16) pg (~> 1.5) puma (~> 6.4) + rackup rails (~> 7.2.0) redis (~> 5.0) trilogy (~> 2.8.1) tzinfo-data + unicorn (~> 6.1) BUNDLED WITH 2.3.3 diff --git a/frameworks/Ruby/rails/benchmark_config.json b/frameworks/Ruby/rails/benchmark_config.json index c5562485d6f..f663c793a3d 100644 --- a/frameworks/Ruby/rails/benchmark_config.json +++ b/frameworks/Ruby/rails/benchmark_config.json @@ -52,6 +52,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "plaintext_url": "/plaintext", + "cached_query_url": "/cached?queries=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -66,6 +67,29 @@ "display_name": "rails-falcon", "notes": "", "versus": "rack-falcon-mri" + }, + "agoo": { + "db_url": "/db", + "json_url": "/json", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "cached_query_url": "/cached?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "rails", + "language": "Ruby", + "orm": "Full", + "platform": "Rack", + "webserver": "Agoo", + "os": "Linux", + "database_os": "Linux", + "display_name": "rails-agoo", + "notes": "", + "versus": "" } }] } diff --git a/frameworks/Ruby/rails/config/agoo.rb b/frameworks/Ruby/rails/config/agoo.rb new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/Ruby/rails/rails-agoo.dockerfile b/frameworks/Ruby/rails/rails-agoo.dockerfile new file mode 100644 index 00000000000..7160fe32f84 --- /dev/null +++ b/frameworks/Ruby/rails/rails-agoo.dockerfile @@ -0,0 +1,27 @@ +FROM ruby:3.4-rc + +RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server + +EXPOSE 8080 +WORKDIR /rails + +# ENV RUBY_YJIT_ENABLE=1 YJIT is enabled in config/initializers/enable_yjit.rb + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +COPY ./Gemfile* /rails/ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +ENV BUNDLE_WITHOUT=trilogy +RUN bundle install --jobs=8 + +COPY . /rails/ + +ENV RAILS_ENV=production_postgresql +ENV PORT=8080 +ENV REDIS_URL=redis://localhost:6379/0 +CMD service redis-server start +CMD RACK_ENV=production bundle exec rackup -r agoo -s agoo -p 8080 -q -O workers=$(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From 961322177427764e65b6a9c2b69757d64e9f71dc Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Mon, 28 Oct 2024 00:28:32 +0800 Subject: [PATCH 0876/1766] update swoole version to 5.1.5 (#9364) --- frameworks/PHP/swoole/10-opcache.ini | 3 ++- frameworks/PHP/swoole/swoole-async-mysql.dockerfile | 7 +++---- frameworks/PHP/swoole/swoole-async-postgres.dockerfile | 7 +++---- frameworks/PHP/swoole/swoole-server.php | 3 ++- frameworks/PHP/swoole/swoole-sync-mysql.dockerfile | 7 +++---- frameworks/PHP/swoole/swoole-sync-postgres.dockerfile | 7 +++---- 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/frameworks/PHP/swoole/10-opcache.ini b/frameworks/PHP/swoole/10-opcache.ini index 3e65df6b191..bc77a43761e 100644 --- a/frameworks/PHP/swoole/10-opcache.ini +++ b/frameworks/PHP/swoole/10-opcache.ini @@ -6,4 +6,5 @@ opcache.save_comments=0 opcache.enable_file_override=1 opcache.huge_code_pages=1 opcache.jit_buffer_size=128M -opcache.jit=1225 +mysqlnd.collect_statistics = Off +opcache.jit=tracing diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index 9e5e1882565..786f80c88cd 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.4 +ENV SWOOLE_VERSION 5.1.5 ENV ENABLE_COROUTINE 1 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql @@ -16,11 +16,10 @@ RUN apt update -yqq > /dev/null \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure > /dev/null \ - && make -j8 > /dev/null \ + && make -j "$(nproc)" > /dev/null \ && make install > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ - && php -m + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini WORKDIR /swoole diff --git a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile index d431e125b3b..b658f569f0e 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.4 +ENV SWOOLE_VERSION 5.1.5 ENV ENABLE_COROUTINE 1 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER pgsql @@ -16,11 +16,10 @@ RUN apt update -yqq > /dev/null \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure --enable-swoole-pgsql > /dev/null \ - && make -j8 > /dev/null \ + && make -j "$(nproc)" > /dev/null \ && make install > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ - && php -m + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini WORKDIR /swoole diff --git a/frameworks/PHP/swoole/swoole-server.php b/frameworks/PHP/swoole/swoole-server.php index 13050d75ebb..38a4152476f 100644 --- a/frameworks/PHP/swoole/swoole-server.php +++ b/frameworks/PHP/swoole/swoole-server.php @@ -12,7 +12,8 @@ 'worker_num' => swoole_cpu_num() * ((int) getenv('CPU_MULTIPLES')), 'log_file' => '/dev/null', 'enable_coroutine' => $enableCoroutine, - 'enable_reuse_port' => true + 'enable_reuse_port' => true, + 'http_compression' => false ]; if ($enableCoroutine) { diff --git a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile index c35d26cdc81..86304d151fc 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.4 +ENV SWOOLE_VERSION 5.1.5 ENV ENABLE_COROUTINE 0 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql @@ -16,11 +16,10 @@ RUN apt update -yqq > /dev/null \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure > /dev/null \ - && make -j8 > /dev/null \ + && make -j "$(nproc)" > /dev/null \ && make install > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ - && php -m + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini WORKDIR /swoole diff --git a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile index a2661c7c010..8054b66912b 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.4 +ENV SWOOLE_VERSION 5.1.5 ENV ENABLE_COROUTINE 0 ENV CPU_MULTIPLES 4 ENV DATABASE_DRIVER pgsql @@ -16,11 +16,10 @@ RUN apt update -yqq > /dev/null \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure > /dev/null \ - && make -j8 > /dev/null \ + && make -j "$(nproc)" > /dev/null \ && make install > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini \ - && php -m + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini WORKDIR /swoole From 05ae280b83abd8c11a7b864cd660e89f47044a3c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:40:36 +0000 Subject: [PATCH 0877/1766] Bump rexml from 3.3.6 to 3.3.9 in /frameworks/Ruby/rack Bumps [rexml](https://github.com/ruby/rexml) from 3.3.6 to 3.3.9. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.3.6...v3.3.9) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rack/Gemfile.lock | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index cf785ab1792..ee579e13085 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -86,8 +86,7 @@ GEM rainbow (3.1.1) raindrops (0.20.1) regexp_parser (2.9.2) - rexml (3.3.6) - strscan + rexml (3.3.9) rubocop (1.64.1) json (~> 2.3) language_server-protocol (>= 3.17.0) @@ -110,7 +109,6 @@ GEM sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) - strscan (3.1.0) traces (0.11.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) From 97f4f7d215ee0d48a4da4527287d87d432c34893 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Wed, 30 Oct 2024 09:27:02 +0100 Subject: [PATCH 0878/1766] Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 12 ++++++------ .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index d1f77b2b178..c33d231f630 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,6 +1,6 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.0.20" apply false + id "org.jetbrains.kotlin.jvm" version "2.0.21" apply false id "org.graalvm.buildtools.native" version "0.10.3" apply false } @@ -9,11 +9,11 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.7.0" - jettyVersion = "12.0.13" - nettyVersion = "4.1.113.Final" + hexagonVersion = "3.7.2" + jettyVersion = "12.0.14" + nettyVersion = "4.1.114.Final" - hikariVersion = "5.1.0" + hikariVersion = "6.0.0" postgresqlVersion = "42.7.4" vertxVersion = "4.5.10" cache2kVersion = "2.6.1.Final" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.10" + gradleVersion = "8.10.2" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 3990 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 diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 9355b415575..df97d72b8b9 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.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From a65d01af3cf32f9a6d5bcd870ee6de4ba28ca2a6 Mon Sep 17 00:00:00 2001 From: walkor Date: Tue, 5 Nov 2024 02:38:54 +0800 Subject: [PATCH 0879/1766] [PHP] Add Swoole and Swow as event-driven stress tests for Workerman. (#9382) * Add Swoole and Swow as event-driven stress tests for Workerman. * Text and json requests using Select event-driven --- frameworks/PHP/workerman/Date.php | 15 ++ frameworks/PHP/workerman/Mysql.php | 82 ++++++++++ frameworks/PHP/workerman/MysqlSwoole.php | 91 +++++++++++ frameworks/PHP/workerman/MysqlSwow.php | 12 ++ frameworks/PHP/workerman/Pgsql.php | 65 ++++++++ frameworks/PHP/workerman/PgsqlSwoole.php | 61 ++++++++ frameworks/PHP/workerman/PgsqlSwow.php | 12 ++ frameworks/PHP/workerman/Pool.php | 29 ++++ frameworks/PHP/workerman/app-pg.php | 122 --------------- frameworks/PHP/workerman/app.php | 145 ------------------ .../PHP/workerman/benchmark_config.json | 88 +++++++++++ frameworks/PHP/workerman/composer.json | 5 + frameworks/PHP/workerman/config.toml | 60 ++++++++ frameworks/PHP/workerman/dbraw.php | 88 ----------- frameworks/PHP/workerman/server.php | 97 ++++++++---- .../PHP/workerman/workerman-jit.dockerfile | 1 + .../workerman/workerman-mysql-jit.dockerfile | 1 + .../workerman-mysql-swoole-jit.dockerfile | 34 ++++ .../workerman-mysql-swow-jit.dockerfile | 33 ++++ .../workerman/workerman-pgsql-jit.dockerfile | 1 + .../workerman-pgsql-swoole-jit.dockerfile | 34 ++++ .../workerman-pgsql-swow-jit.dockerfile | 33 ++++ .../PHP/workerman/workerman-pgsql.dockerfile | 1 + frameworks/PHP/workerman/workerman.dockerfile | 1 + 24 files changed, 730 insertions(+), 381 deletions(-) create mode 100644 frameworks/PHP/workerman/Date.php create mode 100644 frameworks/PHP/workerman/Mysql.php create mode 100644 frameworks/PHP/workerman/MysqlSwoole.php create mode 100644 frameworks/PHP/workerman/MysqlSwow.php create mode 100644 frameworks/PHP/workerman/Pgsql.php create mode 100644 frameworks/PHP/workerman/PgsqlSwoole.php create mode 100644 frameworks/PHP/workerman/PgsqlSwow.php create mode 100644 frameworks/PHP/workerman/Pool.php delete mode 100644 frameworks/PHP/workerman/app-pg.php delete mode 100644 frameworks/PHP/workerman/app.php delete mode 100644 frameworks/PHP/workerman/dbraw.php create mode 100644 frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile create mode 100644 frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile create mode 100644 frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile create mode 100644 frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile diff --git a/frameworks/PHP/workerman/Date.php b/frameworks/PHP/workerman/Date.php new file mode 100644 index 00000000000..d09638da713 --- /dev/null +++ b/frameworks/PHP/workerman/Date.php @@ -0,0 +1,15 @@ +date = gmdate('D, d M Y H:i:s').' GMT'; + Timer::add(1, function() { + $this->date = gmdate('D, d M Y H:i:s').' GMT'; + }); + } +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/Mysql.php b/frameworks/PHP/workerman/Mysql.php new file mode 100644 index 00000000000..9c1cdcf0a53 --- /dev/null +++ b/frameworks/PHP/workerman/Mysql.php @@ -0,0 +1,82 @@ +pdo = new PDO( + 'mysql:host=tfb-database;dbname=hello_world', + 'benchmarkdbuser', + 'benchmarkdbpass', + [ + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false + ] + ); + $this->world = $this->pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $this->fortune = $this->pdo->prepare('SELECT id,message FROM Fortune'); + $this->update = $this->pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?'); + } + + function db(): array + { + $this->world->execute([mt_rand(1, 10000)]); + return $this->world->fetch(); + } + + function query($request): array + { + $query_count = 1; + $q = (int)$request->get('q'); + if ($q > 1) { + $query_count = min($q, 500); + } + $arr = []; + while ($query_count--) { + $this->world->execute([mt_rand(1, 10000)]); + $arr[] = $this->world->fetch(); + } + return $arr; + } + + function update($request): array + { + $query_count = 1; + $q = (int)$request->get('q'); + if ($q > 1) { + $query_count = min($q, 500); + } + $arr = []; + while ($query_count--) { + $id = mt_rand(1, 10000); + $this->world->execute([$id]); + $item = $this->world->fetch(); + $this->update->execute( + [$item['randomNumber'] = mt_rand(1, 10000), $id] + ); + $arr[] = $item; + } + return $arr; + } + + function fortune(): string + { + $this->fortune->execute(); + $arr = $this->fortune->fetchAll(PDO::FETCH_KEY_PAIR); + $arr[0] = 'Additional fortune added at request time.'; + asort($arr); + $html = ''; + foreach ($arr as $id => $message) { + $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); + $html .= "$id$message"; + } + return "Fortunes$html
      idmessage
      "; + } + +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/MysqlSwoole.php b/frameworks/PHP/workerman/MysqlSwoole.php new file mode 100644 index 00000000000..ff290648fa1 --- /dev/null +++ b/frameworks/PHP/workerman/MysqlSwoole.php @@ -0,0 +1,91 @@ +withDriver('mysql') + ->withHost('tfb-database') + ->withPort(3306) + ->withDbName('hello_world') + ->withUsername('benchmarkdbuser') + ->withPassword('benchmarkdbpass'); + $this->pool = new PDOPool($config, $size); + } + + function db(): array + { + $pdo = $this->pool->get(); + $stmt = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $stmt->execute([mt_rand(1, 10000)]); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + $this->pool->put($pdo); + return $result; + } + + function query($request): array + { + $query_count = 1; + $q = (int)$request->get('q'); + if ($q > 1) { + $query_count = min($q, 500); + } + $pdo = $this->pool->get(); + $stmt = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $arr = []; + while ($query_count--) { + $stmt->execute([mt_rand(1, 10000)]); + $arr[] = $stmt->fetch(PDO::FETCH_ASSOC); + } + $this->pool->put($pdo); + return $arr; + } + + function update($request): array + { + $query_count = 1; + $q = (int)$request->get('q'); + if ($q > 1) { + $query_count = min($q, 500); + } + $arr = []; + $pdo = $this->pool->get(); + $world = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $update = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?'); + while ($query_count--) { + $id = mt_rand(1, 10000); + $world->execute([$id]); + $item = $world->fetch(PDO::FETCH_ASSOC); + $update->execute( + [$item['randomNumber'] = mt_rand(1, 10000), $id] + ); + $arr[] = $item; + } + $this->pool->put($pdo); + return $arr; + } + + function fortune(): string + { + $pdo = $this->pool->get(); + $stmt = $pdo->prepare('SELECT id,message FROM Fortune'); + $stmt->execute(); + $arr = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); + $this->pool->put($pdo); + $arr[0] = 'Additional fortune added at request time.'; + asort($arr); + $html = ''; + foreach ($arr as $id => $message) { + $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); + $html .= "$id$message"; + } + return "Fortunes$html
      idmessage
      "; + } + +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/MysqlSwow.php b/frameworks/PHP/workerman/MysqlSwow.php new file mode 100644 index 00000000000..81cb8534c2a --- /dev/null +++ b/frameworks/PHP/workerman/MysqlSwow.php @@ -0,0 +1,12 @@ +pool = new Pool("mysql:host=tfb-database;dbname=hello_world", 'benchmarkdbuser', 'benchmarkdbpass', $size); + } + +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/Pgsql.php b/frameworks/PHP/workerman/Pgsql.php new file mode 100644 index 00000000000..f86dc6364af --- /dev/null +++ b/frameworks/PHP/workerman/Pgsql.php @@ -0,0 +1,65 @@ +pdo = new PDO( + 'pgsql:host=tfb-database;dbname=hello_world', + 'benchmarkdbuser', + 'benchmarkdbpass', + [ + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_EMULATE_PREPARES => false + ] + ); + $this->world = $this->random = $this->pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $this->fortune = $this->pdo->prepare('SELECT id,message FROM Fortune'); + $this->update = $this->pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?'); + } + + function update($request): array + { + $query_count = 1; + $q = (int)$request->get('q'); + if ($q > 1) { + $query_count = min($q, 500); + } + $worlds = []; + while ($query_count--) { + $this->random->execute([\mt_rand(1, 10000)]); + $world = $this->random->fetch(); + $world['randomNumber'] = \mt_rand(1, 10000); + $worlds[] = $world; + } + $rows = count($worlds); + + if (!isset($this->updates[$rows])) { + $sql = 'UPDATE world SET randomNumber = CASE id' + . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) + . 'END WHERE id IN (' + . str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)'; + + $this->updates[$rows] = $this->pdo->prepare($sql); + } + + $val = []; + $keys = []; + foreach ($worlds as $world) { + $val[] = $keys[] = $world['id']; + $val[] = $world['randomNumber']; + } + + $this->updates[$rows]->execute([...$val, ...$keys]); + return $worlds; + } + +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/PgsqlSwoole.php b/frameworks/PHP/workerman/PgsqlSwoole.php new file mode 100644 index 00000000000..1a999aac982 --- /dev/null +++ b/frameworks/PHP/workerman/PgsqlSwoole.php @@ -0,0 +1,61 @@ +withDriver('pgsql') + ->withHost('tfb-database') + ->withPort(5432) + ->withDbName('hello_world') + ->withUsername('benchmarkdbuser') + ->withPassword('benchmarkdbpass'); + + $this->pool = new PDOPool($config, $size); + } + + + function update($request): array + { + $query_count = 1; + $q = (int)$request->get('q'); + if ($q > 1) { + $query_count = min($q, 500); + } + $worlds = []; + $pdo = $this->pool->get(); + $random = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + while ($query_count--) { + $random->execute([mt_rand(1, 10000)]); + $world = $random->fetch(PDO::FETCH_ASSOC); + $world['randomNumber'] = mt_rand(1, 10000); + $worlds[] = $world; + } + $rows = count($worlds); + + $sql = 'UPDATE world SET randomNumber = CASE id' + . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) + . 'END WHERE id IN (' + . str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)'; + + $update = $pdo->prepare($sql); + + $val = []; + $keys = []; + foreach ($worlds as $world) { + $val[] = $keys[] = $world['id']; + $val[] = $world['randomNumber']; + } + + $update->execute([...$val, ...$keys]); + $this->pool->put($pdo); + return $worlds; + } + +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/PgsqlSwow.php b/frameworks/PHP/workerman/PgsqlSwow.php new file mode 100644 index 00000000000..c2a2d3cc4aa --- /dev/null +++ b/frameworks/PHP/workerman/PgsqlSwow.php @@ -0,0 +1,12 @@ +pool = new Pool("pgsql:host=tfb-database;dbname=hello_world", 'benchmarkdbuser', 'benchmarkdbpass', $size); + } + +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/Pool.php b/frameworks/PHP/workerman/Pool.php new file mode 100644 index 00000000000..522ad7afed2 --- /dev/null +++ b/frameworks/PHP/workerman/Pool.php @@ -0,0 +1,29 @@ +push(new PDO($dsn, $username, $password,[ + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC + ])); + } + } + + public function get(): PDO + { + return static::$channel->pop(); + } + + public function put(PDO $pdo) + { + return static::$channel->push($pdo); + } +} \ No newline at end of file diff --git a/frameworks/PHP/workerman/app-pg.php b/frameworks/PHP/workerman/app-pg.php deleted file mode 100644 index b92809d2787..00000000000 --- a/frameworks/PHP/workerman/app-pg.php +++ /dev/null @@ -1,122 +0,0 @@ -path()) { - '/plaintext' => text(), - '/json' => json(), - '/db' => db(), - '/fortunes' => fortune(), - '/query' => query($request), - '/update' => updateraw($request), - // '/info' => info(), - default => new Response(404, [], 'Error 404'), - }; -} - -function text() -{ - return new Response(200, [ - 'Content-Type' => 'text/plain', - 'Date' => Header::$date - ], 'Hello, World!'); -} - -function json() -{ - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode(['message' => 'Hello, World!'])); -} - -function db() -{ - DbRaw::$random->execute([mt_rand(1, 10000)]); - - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode(DbRaw::$random->fetch())); -} - -function query($request) -{ - $random = DbRaw::$random; - - $query_count = 1; - $q = (int) $request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } - - while ($query_count--) { - $random->execute([mt_rand(1, 10000)]); - $arr[] = $random->fetch(); - } - - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode($arr)); -} - -function updateraw($request) -{ - $random = DbRaw::$random; - - $query_count = 1; - $q = (int) $request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } - - while ($query_count--) { - - $random->execute([mt_rand(1, 10000)]); - $row = $random->fetch(); - $row['randomNumber'] = mt_rand(1, 10000); - - $worlds[] = $row; - } - - DbRaw::update($worlds); - - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode($worlds)); -} - -function fortune() -{ - DbRaw::$fortune->execute(); - - $arr = DbRaw::$fortune->fetchAll(PDO::FETCH_KEY_PAIR); - $arr[0] = 'Additional fortune added at request time.'; - asort($arr); - - $html = ''; - foreach ($arr as $id => $message) { - $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); - $html .= "$id$message"; - } - - return new Response(200, [ - 'Date' => Header::$date - ], "Fortunes$html
      idmessage
      " - ); -} - -/* function info() -{ - ob_start(); - phpinfo(); - return new Response(200, ['Content-Type' => 'text/plain'], ob_get_clean()); -} - */ diff --git a/frameworks/PHP/workerman/app.php b/frameworks/PHP/workerman/app.php deleted file mode 100644 index ad6b7997efc..00000000000 --- a/frameworks/PHP/workerman/app.php +++ /dev/null @@ -1,145 +0,0 @@ - PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false - ] - ); - $world = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); - $fortune = $pdo->prepare('SELECT id,message FROM Fortune'); - $update = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?'); -} - -function router(Request $request) -{ - return match($request->path()) { - '/plaintext' => text(), - '/json' => json(), - '/db' => db(), - '/fortunes' => fortune(), - '/query' => query($request), - '/update' => updateraw($request), - // '/info' => info(), - default => new Response(404, [], 'Error 404'), - }; -} - -function text() -{ - return new Response(200, [ - 'Content-Type' => 'text/plain', - 'Date' => Header::$date - ], 'Hello, World!'); -} - -function json() -{ - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode(['message' => 'Hello, World!'])); -} - -function db() -{ - global $world; - - $world->execute([mt_rand(1, 10000)]); - - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode($world->fetch())); -} - -function query($request) -{ - global $world; - - $query_count = 1; - $q = (int) $request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } - - while ($query_count--) { - $world->execute([mt_rand(1, 10000)]); - $arr[] = $world->fetch(); - } - - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode($arr)); -} - -function updateraw($request) -{ - global $world, $update; - - $query_count = 1; - $q = (int) $request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } - - while ($query_count--) { - $id = mt_rand(1, 10000); - $world->execute([$id]); - $item = $world->fetch(); - $update->execute( - [$item['randomNumber'] = mt_rand(1, 10000), $id] - ); - - $arr[] = $item; - } - - // $pdo->beginTransaction(); - // foreach($arr as $world) { - // $update->execute([$world['randomNumber'], $world['id']]); - // } - // $pdo->commit(); - return new Response(200, [ - 'Content-Type' => 'application/json', - 'Date' => Header::$date - ], json_encode($arr)); -} - -function fortune() -{ - global $fortune; - - $fortune->execute(); - - $arr = $fortune->fetchAll(PDO::FETCH_KEY_PAIR); - $arr[0] = 'Additional fortune added at request time.'; - asort($arr); - - $html = ''; - foreach ($arr as $id => $message) { - $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); - $html .= "$id$message"; - } - - return new Response(200, [ - 'Date' => Header::$date - ], "Fortunes$html
      idmessage
      " - ); -} - -/* function info() -{ - ob_start(); - phpinfo(); - return new Response(200, ['Content-Type' => 'text/plain'], ob_get_clean()); -} - */ \ No newline at end of file diff --git a/frameworks/PHP/workerman/benchmark_config.json b/frameworks/PHP/workerman/benchmark_config.json index bcb286db6d8..a2077767b43 100644 --- a/frameworks/PHP/workerman/benchmark_config.json +++ b/frameworks/PHP/workerman/benchmark_config.json @@ -107,6 +107,94 @@ "display_name": "workerman [pgsql]", "notes": "", "versus": "php" + }, + "pgsql-swow": { + "dockerfile": "workerman-pgsql-swow-jit.dockerfile", + "db_url": "/db", + "query_url": "/query?q=", + "update_url": "/update?q=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "workerman", + "language": "PHP", + "flavor": "PHP8", + "orm": "Raw", + "platform": "workerman", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "workerman [jit, pgsql, swow, async]", + "notes": "", + "versus": "php" + }, + "mysql-swow": { + "dockerfile": "workerman-mysql-swow-jit.dockerfile", + "db_url": "/db", + "query_url": "/query?q=", + "update_url": "/update?q=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "MySQL", + "framework": "workerman", + "language": "PHP", + "flavor": "PHP8", + "orm": "Raw", + "platform": "workerman", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "workerman [jit, mysql, swow, async]", + "notes": "", + "versus": "php" + }, + "pgsql-swoole": { + "dockerfile": "workerman-pgsql-swoole-jit.dockerfile", + "db_url": "/db", + "query_url": "/query?q=", + "update_url": "/update?q=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "workerman", + "language": "PHP", + "flavor": "PHP8", + "orm": "Raw", + "platform": "workerman", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "workerman [jit, pgsql, swoole, async]", + "notes": "", + "versus": "php" + }, + "mysql-swoole": { + "dockerfile": "workerman-mysql-swoole-jit.dockerfile", + "db_url": "/db", + "query_url": "/query?q=", + "update_url": "/update?q=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "MySQL", + "framework": "workerman", + "language": "PHP", + "flavor": "PHP8", + "orm": "Raw", + "platform": "workerman", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "workerman [jit, mysql, swoole, async]", + "notes": "", + "versus": "php" } }] } diff --git a/frameworks/PHP/workerman/composer.json b/frameworks/PHP/workerman/composer.json index 7e6c8b1f088..d0c8ca7e678 100644 --- a/frameworks/PHP/workerman/composer.json +++ b/frameworks/PHP/workerman/composer.json @@ -1,5 +1,10 @@ { "require": { "workerman/workerman": "dev-master" + }, + "autoload": { + "psr-4": { + "": "./" + } } } diff --git a/frameworks/PHP/workerman/config.toml b/frameworks/PHP/workerman/config.toml index b2f50bda1a0..791e9502688 100644 --- a/frameworks/PHP/workerman/config.toml +++ b/frameworks/PHP/workerman/config.toml @@ -82,4 +82,64 @@ os = "Linux" orm = "Raw" platform = "workerman" webserver = "None" +versus = "php" + +[pgsql-swow] +urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "workerman" +webserver = "None" +versus = "php" + +[mysql-swow] +urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "MySQL" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "workerman" +webserver = "None" +versus = "php" + +[pgsql-swoole] +urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "workerman" +webserver = "None" +versus = "php" + +[mysql-swoole] +urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "MySQL" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "workerman" +webserver = "None" versus = "php" \ No newline at end of file diff --git a/frameworks/PHP/workerman/dbraw.php b/frameworks/PHP/workerman/dbraw.php deleted file mode 100644 index 2a7c8d355c1..00000000000 --- a/frameworks/PHP/workerman/dbraw.php +++ /dev/null @@ -1,88 +0,0 @@ - PDO::FETCH_ASSOC, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_EMULATE_PREPARES => false - ] - ); - - self::$fortune = $pdo->prepare('SELECT id,message FROM Fortune'); - self::$random = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?'); - self::$instance = $pdo; - } - - /** - * Postgres bulk update - * - * @param array $worlds - * @return void - */ - public static function update(array $worlds) - { - $rows = count($worlds); - - if (!isset(self::$update[$rows])) { - $sql = 'UPDATE world SET randomNumber = CASE id' - . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) - . 'END WHERE id IN (' - . str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)'; - - self::$update[$rows] = self::$instance->prepare($sql); - } - - $val = []; - $keys = []; - foreach ($worlds as $world) { - $val[] = $keys[] = $world['id']; - $val[] = $world['randomNumber']; - } - - self::$update[$rows]->execute([...$val, ...$keys]); - } - - /** - * Alternative bulk update in Postgres - * - * @param array $worlds - * @return void - */ - public static function update2(array $worlds) - { - $rows = count($worlds); - - if (!isset(self::$update[$rows])) { - $sql = 'UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ' - . implode(', ', array_fill(0, $rows, '(?::INTEGER, ?::INTEGER)')) . - ' ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id'; - - self::$update[$rows] = self::$instance->prepare($sql); - } - - $val = []; - foreach ($worlds as $world) { - $val[] = $world['id']; - $val[] = $world['randomNumber']; - //$update->bindParam(++$i, $world['id'], PDO::PARAM_INT); - } - - self::$update[$rows]->execute($val); - } -} diff --git a/frameworks/PHP/workerman/server.php b/frameworks/PHP/workerman/server.php index f856790efa9..a8499e4f538 100644 --- a/frameworks/PHP/workerman/server.php +++ b/frameworks/PHP/workerman/server.php @@ -2,37 +2,82 @@ require_once __DIR__.'/vendor/autoload.php'; use Workerman\Worker; -use Workerman\Timer; +use Workerman\Events\Swow; +use Workerman\Events\Swoole; +use Workerman\Events\Select; +use Workerman\Protocols\Http\Response; $test_type = getenv('TEST_TYPE') ?: 'default'; -if ($test_type === 'pgsql') { - require_once __DIR__.'/app-pg.php'; -} else { - require_once __DIR__.'/app.php'; -} -$process_count = (int) shell_exec('nproc') * ($test_type === 'default' ? 1 : 4); +$process = getenv('PROCESS_MULTIPLIER') ?: 1; +$pool_size = getenv('POOL_SIZE') ?: 2; +$process_count = (int) shell_exec('nproc') * $process; -$http_worker = new Worker('http://0.0.0.0:8080'); -$http_worker->reusePort = true; -$http_worker->count = $process_count; -$http_worker->onWorkerStart = static function () use ($test_type) { - 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'; - }); - if ($test_type === 'pgsql') { - DbRaw::init(); - } else { - init(); - } +$db = $date = null; +$http_worker = new Worker('http://0.0.0.0:8080'); +//$http_worker->reusePort = true; +$http_worker->count = $process_count; +$http_worker->onWorkerStart = static function () use ($test_type, $pool_size, &$db, &$date) { + $db = match ($test_type) { + 'pgsql' => new Pgsql(), + 'mysql' => new Mysql(), + 'pgsql-swow' => new PgsqlSwow($pool_size), + 'mysql-swow' => new MysqlSwow($pool_size), + 'pgsql-swoole' => new PgsqlSwoole($pool_size), + 'mysql-swoole' => new MysqlSwoole($pool_size), + 'default' => new Mysql(), + }; + $date = new Date(); }; +if ($test_type === 'default') { + Worker::$eventLoopClass = Select::class; +} elseif (in_array($test_type, ['pgsql-swow', 'mysql-swow'])) { + Worker::$eventLoopClass = Swow::class; +} elseif (in_array($test_type, ['pgsql-swoole', 'mysql-swoole'])) { + Worker::$eventLoopClass = Swoole::class; +} -$http_worker->onMessage = static function ($connection, $request) { - $connection->send(router($request)); +$http_worker->onMessage = static function ($connection, $request) use (&$db, &$date) { + switch ($request->path()) { + case '/plaintext': + $connection->headers = [ + 'Content-Type' => 'text/plain', + 'Date' => $date->date + ]; + return $connection->send('Hello, World!'); + case '/json': + $connection->headers = [ + 'Content-Type' => 'application/json', + 'Date' => $date->date + ]; + return $connection->send(json_encode(['message' => 'Hello, World!'])); + case '/db': + $connection->headers = [ + 'Content-Type' => 'application/json', + 'Date' => $date->date + ]; + return $connection->send(json_encode($db->db())); + case '/fortunes': + $connection->headers = [ + 'Date' => $date->date + ]; + return $connection->send($db->fortune()); + case '/query': + $connection->headers = [ + 'Content-Type' => 'application/json', + 'Date' => $date->date + ]; + return $connection->send(json_encode($db->query($request))); + case '/update': + $connection->headers = [ + 'Content-Type' => 'application/json', + 'Date' => $date->date + ]; + return $connection->send(json_encode($db->update($request))); + } + return $connection->send(new Response(404, [ + 'Content-Type' => 'text/plain', + 'Date' => $date->date + ], '404 Not Found')); }; Worker::runAll(); - -class Header { - public static $date = null; -} diff --git a/frameworks/PHP/workerman/workerman-jit.dockerfile b/frameworks/PHP/workerman/workerman-jit.dockerfile index c90794ab9be..6ff432c60b8 100644 --- a/frameworks/PHP/workerman/workerman-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-jit.dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE default +ENV PROCESS_MULTIPLIER 1 ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile b/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile index 7d8fd9e238d..33ad3879954 100644 --- a/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE mysql +ENV PROCESS_MULTIPLIER 4 ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile b/frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile new file mode 100644 index 00000000000..eb88aae9c88 --- /dev/null +++ b/frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile @@ -0,0 +1,34 @@ +FROM ubuntu:24.04 + +ENV TEST_TYPE mysql-swoole +ENV SWOOLE_VERSION 5.1.5 +ENV PROCESS_MULTIPLIER 1 +ENV POOL_SIZE 4 + +ARG DEBIAN_FRONTEND=noninteractive + +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 libbrotli-dev php8.3-cli php8.3-pdo-mysql php8.3-dev php8.3-mbstring git -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 -j "$(nproc)" > /dev/null \ + && make install > /dev/null \ + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini + +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +WORKDIR /workerman +COPY --link . . + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini + +EXPOSE 8080 + +CMD php /workerman/server.php start diff --git a/frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile b/frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile new file mode 100644 index 00000000000..2e3e571dbce --- /dev/null +++ b/frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile @@ -0,0 +1,33 @@ +FROM ubuntu:24.04 + +ENV TEST_TYPE mysql-swow +ENV PROCESS_MULTIPLIER 1 +ENV POOL_SIZE 4 + +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 > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null + +RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null + +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +RUN apt-get install -y php-pear php8.3-dev git > /dev/null + + +WORKDIR /workerman +COPY --link . . + + +RUN composer require swow/swow > /dev/null +RUN ./vendor/bin/swow-builder --install > /dev/null +RUN echo extension=swow.so > /etc/php/8.3/cli/conf.d/20-swow.ini +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini + +EXPOSE 8080 + + +CMD php /workerman/server.php start diff --git a/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile b/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile index 6c4af626cc0..dcd2ce482e9 100644 --- a/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE pgsql +ENV PROCESS_MULTIPLIER 4 ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile b/frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile new file mode 100644 index 00000000000..fbc563d68f9 --- /dev/null +++ b/frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile @@ -0,0 +1,34 @@ +FROM ubuntu:24.04 + +ENV TEST_TYPE pgsql-swoole +ENV SWOOLE_VERSION 5.1.5 +ENV PROCESS_MULTIPLIER 2 +ENV POOL_SIZE 16 + +ARG DEBIAN_FRONTEND=noninteractive + +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 libbrotli-dev php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev php8.3-mbstring git -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 -j "$(nproc)" > /dev/null \ + && make install > /dev/null \ + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini + +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +WORKDIR /workerman +COPY --link . . + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini + +EXPOSE 8080 + +CMD php /workerman/server.php start diff --git a/frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile b/frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile new file mode 100644 index 00000000000..d58d7b4865d --- /dev/null +++ b/frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile @@ -0,0 +1,33 @@ +FROM ubuntu:24.04 + +ENV TEST_TYPE pgsql-swow +ENV PROCESS_MULTIPLIER 2 +ENV POOL_SIZE 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 > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null + +RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null + +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +RUN apt-get install -y php-pear php8.3-dev git > /dev/null + + +WORKDIR /workerman +COPY --link . . + + +RUN composer require swow/swow > /dev/null +RUN ./vendor/bin/swow-builder --install > /dev/null +RUN echo extension=swow.so > /etc/php/8.3/cli/conf.d/20-swow.ini +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini + +EXPOSE 8080 + + +CMD php /workerman/server.php start diff --git a/frameworks/PHP/workerman/workerman-pgsql.dockerfile b/frameworks/PHP/workerman/workerman-pgsql.dockerfile index 9b1552d354e..fc12352dd8f 100644 --- a/frameworks/PHP/workerman/workerman-pgsql.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql.dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE pgsql +ENV PROCESS_MULTIPLIER 4 ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman.dockerfile b/frameworks/PHP/workerman/workerman.dockerfile index a4d9602019e..6cff7987f3a 100644 --- a/frameworks/PHP/workerman/workerman.dockerfile +++ b/frameworks/PHP/workerman/workerman.dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE default +ENV PROCESS_MULTIPLIER 1 ARG DEBIAN_FRONTEND=noninteractive From aecc2a43c4d014eda04573f265019800cfc361bc Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 4 Nov 2024 19:39:05 +0100 Subject: [PATCH 0880/1766] [crystal/lucky] Fix tests and update dependencies (#9380) Reduce connection pool size to avoid connection errors like: psycopg2.OperationalError: connection to server at "10.0.0.2", port 5432 failed: FATAL: sorry, too many clients already --- frameworks/Crystal/lucky/lucky.dockerfile | 4 ++-- frameworks/Crystal/lucky/shard.lock | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Crystal/lucky/lucky.dockerfile b/frameworks/Crystal/lucky/lucky.dockerfile index 8309958ace4..1f352cf53bd 100644 --- a/frameworks/Crystal/lucky/lucky.dockerfile +++ b/frameworks/Crystal/lucky/lucky.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.12.1 +FROM crystallang/crystal:1.14.0 WORKDIR /lucky COPY shard.lock shard.lock @@ -14,7 +14,7 @@ ENV LUCKY_ENV production RUN shards build bench --release --no-debug -ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_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 EXPOSE 8080 diff --git a/frameworks/Crystal/lucky/shard.lock b/frameworks/Crystal/lucky/shard.lock index 86720033909..34f8bfcfea6 100644 --- a/frameworks/Crystal/lucky/shard.lock +++ b/frameworks/Crystal/lucky/shard.lock @@ -2,7 +2,7 @@ version: 2.0 shards: avram: git: https://github.com/luckyframework/avram.git - version: 1.2.0 + version: 1.3.0 backtracer: git: https://github.com/sija/backtracer.cr.git @@ -30,7 +30,7 @@ shards: habitat: git: https://github.com/luckyframework/habitat.git - version: 0.4.8 + version: 0.4.9 lucky: git: https://github.com/luckyframework/lucky.git @@ -66,7 +66,7 @@ shards: splay_tree_map: git: https://github.com/wyhaines/splay_tree_map.cr.git - version: 0.2.2 + version: 0.3.0 wordsmith: git: https://github.com/luckyframework/wordsmith.git From 992475cec3f7011d570a1131c83ad8e07e95bec9 Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:39:33 +0000 Subject: [PATCH 0881/1766] Axum perf improvements (#9379) * perf: switch plaintext and json to one runtime per thread, improving performance. * perf: remove need for additional vec * perf: reduce length of query parameter * perf: increase strength of inlining hint * perf: reduce query length * perf: shorten path and use references * bug: increased length of route in line with requirements --- frameworks/Rust/axum/benchmark_config.json | 18 +++++++++--------- frameworks/Rust/axum/src/common/mod.rs | 4 ++-- frameworks/Rust/axum/src/common/utils.rs | 5 +++-- frameworks/Rust/axum/src/main.rs | 9 ++++++--- frameworks/Rust/axum/src/main_sqlx.rs | 10 ++++++---- frameworks/Rust/axum/src/pg/database.rs | 17 +++++++---------- 6 files changed, 33 insertions(+), 30 deletions(-) diff --git a/frameworks/Rust/axum/benchmark_config.json b/frameworks/Rust/axum/benchmark_config.json index ade60875389..c33a1edad78 100755 --- a/frameworks/Rust/axum/benchmark_config.json +++ b/frameworks/Rust/axum/benchmark_config.json @@ -28,7 +28,7 @@ "docker_cmd": "/app/axum-sqlx", "db_url": "/db", "fortune_url": "/fortunes", - "cached_query_url": "/cached-queries?queries=", + "cached_query_url": "/cached-queries?q=", "port": 8000, "approach": "Realistic", "classification": "Fullstack", @@ -50,8 +50,8 @@ "docker_cmd": "/app/axum-pg", "db_url": "/db", "fortune_url": "/fortunes", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", + "query_url": "/queries?q=", + "update_url": "/updates?q=", "port": 8000, "approach": "Realistic", "classification": "Fullstack", @@ -72,8 +72,8 @@ "dockerfile": "axum.dockerfile", "docker_cmd": "/app/axum-pg-pool", "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", + "query_url": "/queries?q=", + "update_url": "/updates?q=", "fortune_url": "/fortunes", "port": 8000, "approach": "Realistic", @@ -95,9 +95,9 @@ "dockerfile": "axum.dockerfile", "docker_cmd": "/app/axum-mongo", "db_url": "/db", - "query_url": "/queries?queries=", + "query_url": "/queries?q=", "fortune_url": "/fortunes", - "update_url": "/updates?queries=", + "update_url": "/updates?q=", "port": 8000, "approach": "Realistic", "classification": "Fullstack", @@ -118,8 +118,8 @@ "dockerfile": "axum.dockerfile", "docker_cmd": "/app/axum-mongo-raw", "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", + "query_url": "/queries?q=", + "update_url": "/updates?q=", "port": 8000, "approach": "Realistic", "classification": "Fullstack", diff --git a/frameworks/Rust/axum/src/common/mod.rs b/frameworks/Rust/axum/src/common/mod.rs index d55958155f1..808b2a70eeb 100644 --- a/frameworks/Rust/axum/src/common/mod.rs +++ b/frameworks/Rust/axum/src/common/mod.rs @@ -36,14 +36,14 @@ where /// Generate a single integer in the range 1 to 10,000 (inclusive) #[allow(dead_code)] -#[inline] +#[inline(always)] pub fn random_id(rng: &mut SmallRng) -> i32 { rng.gen_range(1..10_001) } /// Generate vector of integers in the range 1 to 10,000 (inclusive) #[allow(dead_code)] -#[inline] +#[inline(always)] pub fn random_ids(rng: &mut SmallRng, count: usize) -> Vec { rng.sample_iter(Uniform::new(1, 10_001)) .take(count) diff --git a/frameworks/Rust/axum/src/common/utils.rs b/frameworks/Rust/axum/src/common/utils.rs index 063411f3da7..0da86151e62 100644 --- a/frameworks/Rust/axum/src/common/utils.rs +++ b/frameworks/Rust/axum/src/common/utils.rs @@ -7,13 +7,14 @@ use serde::Deserialize; #[derive(Debug, Deserialize)] pub struct Params { - queries: Option, + q: Option, } #[allow(dead_code)] +#[inline(always)] pub fn parse_params(params: Params) -> usize { params - .queries + .q .and_then(|q| q.parse().ok()) .unwrap_or(1) .clamp(1, 500) diff --git a/frameworks/Rust/axum/src/main.rs b/frameworks/Rust/axum/src/main.rs index 70858e27ddc..0b33fb7edcb 100644 --- a/frameworks/Rust/axum/src/main.rs +++ b/frameworks/Rust/axum/src/main.rs @@ -26,13 +26,16 @@ pub async fn json() -> impl IntoResponse { (StatusCode::OK, Json(message)) } -#[tokio::main] -async fn main() { +fn main() { dotenv().ok(); + server::start_tokio(serve_app) +} + +async fn serve_app() { let app = Router::new() .route("/plaintext", get(plaintext)) .route("/json", get(json)); server::serve_hyper(app, Some(8000)).await -} +} \ No newline at end of file diff --git a/frameworks/Rust/axum/src/main_sqlx.rs b/frameworks/Rust/axum/src/main_sqlx.rs index 163372b83d8..b3a7937841b 100644 --- a/frameworks/Rust/axum/src/main_sqlx.rs +++ b/frameworks/Rust/axum/src/main_sqlx.rs @@ -1,6 +1,8 @@ mod common; mod sqlx; +use std::sync::Arc; + use ::sqlx::PgPool; use axum::{ extract::{Query, State}, @@ -56,7 +58,7 @@ async fn queries( let ids = random_ids(&mut rng, count); let mut worlds: Vec = Vec::with_capacity(count); - for id in ids { + for id in &ids { let world: World = ::sqlx::query_as(common::SELECT_WORLD_BY_ID) .bind(id) .fetch_one(&mut *db.acquire().await.unwrap()) @@ -96,7 +98,7 @@ async fn cache( ) -> impl IntoResponse { let count = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let mut worlds: Vec> = Vec::with_capacity(count); + let mut worlds: Vec>> = Vec::with_capacity(count); for id in random_ids(&mut rng, count) { worlds.push(cache.get(&id).await); @@ -113,7 +115,7 @@ async fn preload_cache(AppState { db, cache }: &AppState) { .expect("error loading worlds"); for world in worlds { - cache.insert(world.id, world).await; + cache.insert(world.id, Arc::new(world)).await; } } @@ -121,7 +123,7 @@ async fn preload_cache(AppState { db, cache }: &AppState) { #[derive(Clone)] struct AppState { db: PgPool, - cache: Cache, + cache: Cache>, } #[tokio::main] diff --git a/frameworks/Rust/axum/src/pg/database.rs b/frameworks/Rust/axum/src/pg/database.rs index bc78b2ba5c8..b9cff086c5a 100644 --- a/frameworks/Rust/axum/src/pg/database.rs +++ b/frameworks/Rust/axum/src/pg/database.rs @@ -90,21 +90,18 @@ impl PgConnection { } pub async fn update_worlds(&self, num: usize) -> Result, PgError> { - let worlds = self.fetch_random_worlds(num).await?; + let mut worlds = self.fetch_random_worlds(num).await?; // Update the worlds with new random numbers let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); let mut ids = Vec::with_capacity(num); let mut nids = Vec::with_capacity(num); - let worlds: Vec = worlds - .into_iter() - .map(|mut w| { - w.randomnumber = random_id(&mut rng); - ids.push(w.id); - nids.push(w.randomnumber); - w - }) - .collect(); + + for w in &mut worlds { + w.randomnumber = random_id(&mut rng); + ids.push(w.id); + nids.push(w.randomnumber); + } // Update the random worlds in the database. self.client From edeb2d8794e4aa14ed55975709ebf37e31ae95ff Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Mon, 4 Nov 2024 13:40:05 -0500 Subject: [PATCH 0882/1766] Some improvements to Db tests (#9378) * New updates logic. Signed-off-by: Santiago Pericas-Geertsen * Set pipelining. Signed-off-by: Santiago Pericas-Geertsen --------- Signed-off-by: Santiago Pericas-Geertsen --- .../benchmark/nima/models/DbRepository.java | 8 -- .../nima/models/HikariJdbcRepository.java | 9 -- .../nima/models/PgClientRepository.java | 124 ++++++------------ .../helidon/benchmark/nima/models/World.java | 14 -- .../nima/src/main/resources/application.yaml | 4 - 5 files changed, 43 insertions(+), 116 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java index d1f75b558c3..41af9c03b8e 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/DbRepository.java @@ -1,23 +1,15 @@ package io.helidon.benchmark.nima.models; -import java.util.Collections; import java.util.List; import java.util.concurrent.ThreadLocalRandom; -import jakarta.json.Json; -import jakarta.json.JsonBuilderFactory; - public interface DbRepository { - JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap()); - World getWorld(int id); List getWorlds(int count); - World updateWorld(World world); - List updateWorlds(int count); List getFortunes(); diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java index fd9760939df..7bf7e8c72b8 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/HikariJdbcRepository.java @@ -80,15 +80,6 @@ public List getWorlds(int count) { } } - @Override - public World updateWorld(World world) { - try (Connection c = getConnection()) { - return updateWorld(world, c); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - @Override public List updateWorlds(int count) { try (Connection c = getConnection()) { diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java index e5166b10fbc..291131eca17 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java @@ -2,17 +2,13 @@ import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.logging.Logger; import io.helidon.config.Config; - +import io.vertx.core.Future; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; -import io.vertx.core.Future; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgPool; import io.vertx.sqlclient.PoolOptions; @@ -26,45 +22,40 @@ public class PgClientRepository implements DbRepository { private static final Logger LOGGER = Logger.getLogger(PgClientRepository.class.getName()); + private static final int UPDATE_QUERIES = 500; - private final SqlClient queryPool; private final SqlClient updatePool; - private final int batchSize; - private final long updateTimeout; - private final int maxRetries; - private final PreparedQuery> getFortuneQuery; private final PreparedQuery> getWorldQuery; - private final PreparedQuery> updateWorldQuery; + private final PreparedQuery>[] updateWorldSingleQuery; + @SuppressWarnings("unchecked") public PgClientRepository(Config config) { - Vertx vertx = Vertx.vertx(new VertxOptions() - .setPreferNativeTransport(true)); + Vertx vertx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(true)); PgConnectOptions connectOptions = new PgConnectOptions() .setPort(config.get("port").asInt().orElse(5432)) .setCachePreparedStatements(config.get("cache-prepared-statements").asBoolean().orElse(true)) .setHost(config.get("host").asString().orElse("tfb-database")) .setDatabase(config.get("db").asString().orElse("hello_world")) .setUser(config.get("username").asString().orElse("benchmarkdbuser")) - .setPassword(config.get("password").asString().orElse("benchmarkdbpass")); + .setPassword(config.get("password").asString().orElse("benchmarkdbpass")) + .setPipeliningLimit(100000); int sqlPoolSize = config.get("sql-pool-size").asInt().orElse(64); PoolOptions clientOptions = new PoolOptions().setMaxSize(sqlPoolSize); LOGGER.info("sql-pool-size is " + sqlPoolSize); - batchSize = config.get("update-batch-size").asInt().orElse(20); - LOGGER.info("update-batch-size is " + batchSize); - updateTimeout = config.get("update-timeout-millis").asInt().orElse(5000); - LOGGER.info("update-timeout-millis is " + updateTimeout); - maxRetries = config.get("update-max-retries").asInt().orElse(3); - LOGGER.info("update-max-retries is " + maxRetries); - - queryPool = PgPool.client(vertx, connectOptions, clientOptions); + + SqlClient queryPool = PgPool.client(vertx, connectOptions, clientOptions); updatePool = PgPool.client(vertx, connectOptions, clientOptions); getWorldQuery = queryPool.preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1"); - updateWorldQuery = queryPool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2"); getFortuneQuery = queryPool.preparedQuery("SELECT id, message FROM fortune"); + + updateWorldSingleQuery = new PreparedQuery[UPDATE_QUERIES]; + for (int i = 0; i < UPDATE_QUERIES; i++) { + updateWorldSingleQuery[i] = queryPool.preparedQuery(singleUpdate(i + 1)); + } } @Override @@ -97,60 +88,11 @@ public List getWorlds(int count) { } } - @Override - public World updateWorld(World world) { - try { - return updateWorldQuery.execute(Tuple.of(world.id, world.id)) - .toCompletionStage() - .thenApply(rows -> world) - .toCompletableFuture().get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - @Override public List updateWorlds(int count) { List worlds = getWorlds(count); - if (batchSize > 1) { // batching updates - for (World w : worlds) { - w.randomNumber = randomWorldNumber(); - } - if (count <= batchSize) { - LOGGER.finest(() -> "Updating single batch of size " + count); - updateWorldsRetry(worlds, 0, 0); - } else { - int batches = count / batchSize + (count % batchSize == 0 ? 0 : 1); - for (int i = 0; i < batches; i++) { - final int from = i * batchSize; - LOGGER.finest(() -> "Updating batch from " + from + " to " + (from + batchSize)); - updateWorldsRetry(worlds, from, 0); - } - } - } else { // no batching for size 1 - for (World w : worlds) { - w.randomNumber = randomWorldNumber(); - updateWorld(w); - } - } - return worlds; - } - - private List updateWorldsRetry(List worlds, int from, int retries) { - if (retries > maxRetries) { - throw new RuntimeException("Too many transaction retries"); - } - CompletableFuture> cf = null; try { - cf = updateWorlds(worlds, from, updatePool); - cf.get(updateTimeout, TimeUnit.MILLISECONDS); - return worlds; - } catch (ExecutionException | TimeoutException e) { - cf.cancel(true); - retries++; - final int finalRetries = retries; - LOGGER.fine(() -> "Retrying batch update after cancellation (retries=" + finalRetries + ")"); - return updateWorldsRetry(worlds, from, retries); // retry + return updateWorlds(worlds, count, updatePool); } catch (Exception e) { throw new RuntimeException(e); } @@ -172,16 +114,36 @@ public List getFortunes() { } } - private CompletableFuture> updateWorlds(List worlds, int from, SqlClient pool) { - List tuples = new ArrayList<>(); - int to = Math.min(from + batchSize, worlds.size()); - for (int i = from; i < to; i++) { - World w = worlds.get(i); - tuples.add(Tuple.of(w.randomNumber, w.id)); + private List updateWorlds(List worlds, int count, SqlClient pool) + throws ExecutionException, InterruptedException { + int size = worlds.size(); + List updateParams = new ArrayList<>(size * 2); + for (World world : worlds) { + updateParams.add(world.id); + world.randomNumber = randomWorldNumber(); + updateParams.add(world.randomNumber); } - return updateWorldQuery.executeBatch(tuples) + return updateWorldSingleQuery[count - 1].execute(Tuple.wrap(updateParams)) .toCompletionStage() .thenApply(rows -> worlds) - .toCompletableFuture(); + .toCompletableFuture() + .get(); + } + + private static String singleUpdate(int count) { + StringBuilder sql = new StringBuilder(); + sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); + for (int i = 0; i < count; i++) { + int k = i * 2 + 1; + sql.append(" WHEN $").append(k).append(" THEN $").append(k + 1); + } + sql.append(" ELSE RANDOMNUMBER"); + sql.append(" END WHERE ID IN ($1"); + for (int i = 1; i < count; i++) { + int k = i * 2 + 1; + sql.append(",$").append(k); + } + sql.append(")"); + return sql.toString(); } } \ No newline at end of file diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java index 39deafea11b..dbcba61a8ca 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/World.java @@ -1,18 +1,8 @@ package io.helidon.benchmark.nima.models; -import java.util.Collections; - -import jakarta.json.Json; -import jakarta.json.JsonBuilderFactory; -import jakarta.json.JsonObject; - public final class World { - static final String ID_KEY = "id"; - static final String ID_RANDOM_NUMBER = "randomNumber"; - static final JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap()); - public int id; public int randomNumber; @@ -20,8 +10,4 @@ public World(int id, int randomNumber) { this.id = id; this.randomNumber = randomNumber; } - - public JsonObject toJson() { - return JSON.createObjectBuilder().add(ID_KEY, id).add(ID_RANDOM_NUMBER, randomNumber).build(); - } } diff --git a/frameworks/Java/helidon/nima/src/main/resources/application.yaml b/frameworks/Java/helidon/nima/src/main/resources/application.yaml index 41f4d64ec12..d2d8e8943b4 100644 --- a/frameworks/Java/helidon/nima/src/main/resources/application.yaml +++ b/frameworks/Java/helidon/nima/src/main/resources/application.yaml @@ -39,7 +39,3 @@ password: benchmarkdbpass sql-pool-size: 300 db-repository: "pgclient" # "pgclient" (default) or "hikari" -# The following for pgclient only -update-batch-size: 4 -update-timeout-millis: 10000 -update-max-retries: 3 From d91f0176a733252c75e054ec24eda2c183d5db86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Mon, 4 Nov 2024 10:40:34 -0800 Subject: [PATCH 0883/1766] Update dotnet version (#9376) --- .../CSharp/aspnetcore/appsettings.postgresql.json | 2 +- .../CSharp/aspnetcore/aspnetcore-aot.dockerfile | 6 +++--- .../aspnetcore/aspnetcore-minimal.dockerfile | 7 +++++-- .../CSharp/aspnetcore/aspnetcore-mvc.dockerfile | 7 +++++-- .../CSharp/aspnetcore/aspnetcore-mysql.dockerfile | 7 +++++-- frameworks/CSharp/aspnetcore/aspnetcore.dockerfile | 9 ++++++--- .../CSharp/aspnetcore/src/Minimal/Minimal.csproj | 8 ++++---- .../CSharp/aspnetcore/src/Minimal/Program.cs | 14 ++++++-------- .../Minimal/{Templates => Slices}/Fortunes.cshtml | 0 .../{Templates => Slices}/_ViewImports.cshtml | 0 frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj | 6 +++--- .../CSharp/aspnetcore/src/Platform/Platform.csproj | 8 ++++---- .../CSharp/aspnetcore/src/Platform/Program.cs | 1 - 13 files changed, 42 insertions(+), 33 deletions(-) rename frameworks/CSharp/aspnetcore/src/Minimal/{Templates => Slices}/Fortunes.cshtml (100%) rename frameworks/CSharp/aspnetcore/src/Minimal/{Templates => Slices}/_ViewImports.cshtml (100%) diff --git a/frameworks/CSharp/aspnetcore/appsettings.postgresql.json b/frameworks/CSharp/aspnetcore/appsettings.postgresql.json index abc42e6ce8a..423af4d19b0 100644 --- a/frameworks/CSharp/aspnetcore/appsettings.postgresql.json +++ b/frameworks/CSharp/aspnetcore/appsettings.postgresql.json @@ -1,4 +1,4 @@ { - "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000", + "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=512;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4", "Database": "postgresql" } diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile index a114ee58727..a7396e3b919 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile @@ -1,12 +1,12 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.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 +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime +ENV URLS=http://+:8080 WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile index 5ab25aa2bb9..24893c9717a 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile @@ -1,10 +1,13 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /app COPY src/Minimal . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime ENV URLS http://+:8080 +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile index b0d126973cb..6922a53bf2a 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile @@ -1,10 +1,13 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /app COPY src/Mvc . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime ENV URLS http://+:8080 +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile index 505414aa173..ecc0a8331c3 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile @@ -1,10 +1,13 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.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 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime ENV URLS http://+:8080 +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile index 5a846103428..64510ffe786 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile @@ -1,10 +1,13 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.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 AS runtime -ENV URLS http://+:8080 +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime +ENV URLS=http://+:8080 +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj index 783ec88ff32..01ed70de876 100644 --- a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj +++ b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable latest @@ -9,9 +9,9 @@ - - - + + + diff --git a/frameworks/CSharp/aspnetcore/src/Minimal/Program.cs b/frameworks/CSharp/aspnetcore/src/Minimal/Program.cs index 9ac63edcca2..7aaac6db1ac 100644 --- a/frameworks/CSharp/aspnetcore/src/Minimal/Program.cs +++ b/frameworks/CSharp/aspnetcore/src/Minimal/Program.cs @@ -1,13 +1,11 @@ // 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. -using System.Text.Encodings.Web; -using System.Text.Unicode; -using Microsoft.AspNetCore.Http.HttpResults; -using RazorSlices; using Minimal; using Minimal.Database; using Minimal.Models; +using System.Text.Encodings.Web; +using System.Text.Unicode; var builder = WebApplication.CreateBuilder(args); @@ -36,14 +34,14 @@ app.MapGet("/db", async (Db db) => await db.LoadSingleQueryRow()); -var createFortunesTemplate = RazorSlice.ResolveSliceFactory>("/Templates/Fortunes.cshtml"); var htmlEncoder = CreateHtmlEncoder(); app.MapGet("/fortunes", async (HttpContext context, Db db) => { var fortunes = await db.LoadFortunesRows(); - var template = (RazorSliceHttpResult>)createFortunesTemplate(fortunes); - template.HtmlEncoder = htmlEncoder; - return template; + var result = Results.Extensions.RazorSlice>(fortunes); + result.HtmlEncoder = htmlEncoder; + + return result; }); app.MapGet("/queries/{count?}", async (Db db, string? count) => await db.LoadMultipleQueriesRows(count)); diff --git a/frameworks/CSharp/aspnetcore/src/Minimal/Templates/Fortunes.cshtml b/frameworks/CSharp/aspnetcore/src/Minimal/Slices/Fortunes.cshtml similarity index 100% rename from frameworks/CSharp/aspnetcore/src/Minimal/Templates/Fortunes.cshtml rename to frameworks/CSharp/aspnetcore/src/Minimal/Slices/Fortunes.cshtml diff --git a/frameworks/CSharp/aspnetcore/src/Minimal/Templates/_ViewImports.cshtml b/frameworks/CSharp/aspnetcore/src/Minimal/Slices/_ViewImports.cshtml similarity index 100% rename from frameworks/CSharp/aspnetcore/src/Minimal/Templates/_ViewImports.cshtml rename to frameworks/CSharp/aspnetcore/src/Minimal/Slices/_ViewImports.cshtml diff --git a/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj b/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj index 5bffd479c0f..83105ed34be 100644 --- a/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj +++ b/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable latest @@ -9,8 +9,8 @@ - - + + diff --git a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj index 548e446ee0a..ef14e44b865 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj +++ b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 true true preview @@ -19,9 +19,9 @@
      - - - + + + diff --git a/frameworks/CSharp/aspnetcore/src/Platform/Program.cs b/frameworks/CSharp/aspnetcore/src/Platform/Program.cs index 9b22d3f5b40..28fc5d757dd 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/Program.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/Program.cs @@ -52,7 +52,6 @@ public static IWebHost BuildWebHost(string[] args) #if DEBUG .AddUserSecrets() #endif - .AddEnvironmentVariables() .AddEnvironmentVariables() .AddCommandLine(args) .Build(); From de4bda3ab71cd1fb44a1362cb0df1976873ea27c Mon Sep 17 00:00:00 2001 From: Shreck Ye Date: Tue, 5 Nov 2024 02:42:01 +0800 Subject: [PATCH 0884/1766] Use the new Exposed SELECT DSL in the "ktor-exposed" benchmarks, and bump the Exposed version to the latest (#9375) Add `--no-daemon` to the Dockerfile Gradle commands BTW. --- frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile | 2 +- frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile | 2 +- frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts | 2 +- .../Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt | 9 ++++++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile b/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile index e12a664f8dc..10f2ed2180d 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile @@ -3,7 +3,7 @@ FROM gradle:jdk17 WORKDIR /ktor-exposed COPY ktor-exposed/settings.gradle.kts settings.gradle.kts COPY ktor-exposed/app app -RUN gradle shadowJar +RUN gradle --no-daemon shadowJar EXPOSE 8080 diff --git a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile index f65069e6b78..5d05b4494ce 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile @@ -3,7 +3,7 @@ FROM gradle:jdk17 WORKDIR /ktor-exposed COPY ktor-exposed/settings.gradle.kts settings.gradle.kts COPY ktor-exposed/app app -RUN gradle shadowJar +RUN gradle --no-daemon shadowJar EXPOSE 8080 diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts index 60f4dab3b17..f57ded6c314 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts @@ -11,7 +11,7 @@ repositories { val ktorVersion = "2.3.12" val kotlinxSerializationVersion = "1.6.3" -val exposedVersion = "0.52.0" +val exposedVersion = "0.56.0" dependencies { implementation("io.ktor:ktor-server-core:$ktorVersion") diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt b/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt index c284ecd7b17..513a20b7ab7 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt @@ -19,9 +19,12 @@ import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.IdTable -import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.Database +import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.Transaction import org.jetbrains.exposed.sql.transactions.transaction +import org.jetbrains.exposed.sql.update import java.util.concurrent.ThreadLocalRandom @Serializable @@ -82,7 +85,7 @@ fun Application.module(exposedMode: ExposedMode) { routing { fun selectWorldsWithIdQuery(id: Int) = - WorldTable.slice(WorldTable.id, WorldTable.randomNumber).select(WorldTable.id eq id) + WorldTable.select(WorldTable.id, WorldTable.randomNumber).where(WorldTable.id eq id) fun ResultRow.toWorld() = World(this[WorldTable.id].value, this[WorldTable.randomNumber]) @@ -129,7 +132,7 @@ fun Application.module(exposedMode: ExposedMode) { get("/fortunes") { val result = withDatabaseContextAndTransaction { when (exposedMode) { - Dsl -> FortuneTable.slice(FortuneTable.id, FortuneTable.message).selectAll() + Dsl -> FortuneTable.select(FortuneTable.id, FortuneTable.message) .asSequence().map { it.toFortune() } Dao -> FortuneDao.all().asSequence().map { it.toFortune() } From fed744bee12c697ece997c5dba71fa9b036291ee Mon Sep 17 00:00:00 2001 From: Shreck Ye Date: Tue, 5 Nov 2024 02:42:14 +0800 Subject: [PATCH 0885/1766] Revamp the Kotlin Vert.x portions "vertx-web-kotlinx" and "vertx-web-kotlin-coroutines" (#9374) * Revamp the "vertx-web-kotlinx" portion project Changes: 1. bump the Gradle versions and the dependency versions to the latest 1. bump the JVM version to 21 with the new `jvmToolchain` DSL 1. resolve deprecations 1. update the dockerfile to use the `installDist` Gradle task so the time for archiving and unarchiving is saved * Run the revamped benchmark There are no build or runtime errors. Single query performance seems to have been improved by 2% with the bumped versions (I think most likely due to Java 21). Vagrant reduces performance by about 20% compared to running directly with Docker. * Enable io_uring and run the benchmark The single query performance is improved by 5% - 10%. * Try fixing the performance issues of the "vertx-web-kotlinx" portion in the "single query" and "JSON serialization" tests in the [Continuous Benchmarking results](https://tfb-status.techempower.com/) by using static kotlinx.serialization serializers The "vertx-web-kotlinx" results in the Continuous Benchmarking results are much lower than those of the "vertx-web-kotlin-coroutines" portion. See [the latest results](https://www.techempower.com/benchmarks/#section=test&runid=592cab59-a9db-463b-a9c9-33d2f9484e92&hw=ph&test=db) for example. Looking at the "single query" results, I first suspected that it was caused by there being not enough memory for the JVM runtime, so I added some logging code that prints the memory usage using `Runtime.totalMemory` and `Runtime.maxMemory`. It showed that there was about 7 GB max memory available during the benchmark runs, and the program only used 400 MB to 1 GB. I then tried allocating a 4 GB array during the run to ensure that the memory was usable and it worked with no problem. Then looking at the "JSON serialization" results again, I saw that "vertx-web-kotlinx" performs a lot worse in this test too, and decided that this is more likely to be the bottleneck. Therefore, the static serializers are provided explicitly and the performance is improved slightly as tested on my machine. (Also, see commit 315b4e359cde7909810a6a842ae3c7d49233291f for an attempt before.) I then copied the "JSON serialization" test code from "vertx-web-kotlin-coroutines" and ran the benchmark to see if there were other factors, such as project configuration differences, affecting the performance, and the answer was no. On my machine, the "JSON serialization" performance of "vertx-web-kotlinx" is about 80% - 85% of that of "vertx-web-kotlin-coroutines". And I think the bottleneck possibly lies in kotlinx.serialization serializing an object to a byte array first and then copying it to a Vert.x buffer. Remove the broken tag in "vertx-web-kotlin-coroutines" BTW, which was added in commit e53e0260e522106b316d8fce2e378a056d866356, for the benchmark runs without problems now as I tested. * Update README.md correspondingly * Add `--no-daemon` to the Gradle command in the Dockerfiles * Update the "Connection reset" exception to the io_uring one that's ignored in logging * Use `encodeToBufferedSink` in "kotlinx-serialization-json-okio" with a custom-implemented `VertxBufferSink` in JSON serialization The "JSON serialization" performance is on par with using `io.vertx.core.json.Json.encodeToBuffer` as tested on my machine after this change. * Replace Okio with kotlinx-io and remove unneeded code The "JSON serialization" performance seems to be slightly less. * Rename 2 classes to clarify * Use to the new Vert.x coroutine APIs introduced in https://github.com/vert-x3/vertx-lang-kotlin/pull/253 / https://github.com/vert-x3/vertx-lang-kotlin/commit/e841975ef50b6be9b516d27498821096a3ad462e There is no noticeable performance degradation in the "plaintext" and "JSON serialization" tests. * Simply the code introduced in the previous commit by making `MainVerticle` implement `CoroutineRouterSupport` I didn't go through [the docs](https://vertx.io/docs/vertx-lang-kotlin-coroutines/kotlin/#_vert_x_web) thoroughly before implementing this. * Revamp the "vertx-web-kotlin-coroutines" portion project too following the changes made to the "vertx-web-kotlinx" portion The "gradlew" script somehow had incorrect access permissions and is fixed by bumping the Gradle wrapper. To keep the dependencies consistent with the "vert-web" portion, some dependencies are not updated to the latest versions. Remove 2 useless `COPY`s in "vertx-web-kotlin-coroutines-postgres.dockerfile" BTW. * Remove unneeded and incorrect comments Wrapping something as a Vert.x `Buffer` by implementing the `Buffer` interface is not viable because `BufferImpl` contains casts from a `Buffer` to a `BufferImpl`. --- .../benchmark_config.json | 3 +- .../build.gradle.kts | 25 ++--- .../gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../vertx-web-kotlin-coroutines/gradlew | 34 +++--- .../vertx-web-kotlin-coroutines/gradlew.bat | 22 ++-- ...-web-kotlin-coroutines-postgres.dockerfile | 4 +- .../vertx-web-kotlin-coroutines.dockerfile | 2 +- frameworks/Kotlin/vertx-web-kotlinx/README.md | 3 +- .../Kotlin/vertx-web-kotlinx/build.gradle.kts | 27 ++--- .../gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- frameworks/Kotlin/vertx-web-kotlinx/gradlew | 34 +++--- .../Kotlin/vertx-web-kotlinx/gradlew.bat | 22 ++-- .../src/main/kotlin/KotlinxIo.kt | 47 ++++++++ .../vertx-web-kotlinx/src/main/kotlin/Main.kt | 6 +- .../src/main/kotlin/MainVerticle.kt | 100 +++++++++++------- .../src/main/kotlin/Serializers.kt | 7 ++ .../src/main/kotlin/VertxCoroutine.kt | 5 +- .../vertx-web-kotlinx-postgresql.dockerfile | 7 +- .../vertx-web-kotlinx.dockerfile | 7 +- 21 files changed, 231 insertions(+), 130 deletions(-) mode change 100644 => 100755 frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew create mode 100644 frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/KotlinxIo.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Serializers.kt diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json b/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json index d2bab14abb7..2b8ebd26c83 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json @@ -18,8 +18,7 @@ "database_os": "Linux", "display_name": "vertx-web-kotlin-coroutines", "notes": "", - "versus": "vertx-web", - "tags": ["broken"] + "versus": "vertx-web" }, "postgres": { "db_url": "/db", diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/build.gradle.kts b/frameworks/Kotlin/vertx-web-kotlin-coroutines/build.gradle.kts index 584f6102956..973bf6d8116 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/build.gradle.kts +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/build.gradle.kts @@ -1,34 +1,37 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile tasks.wrapper { distributionType = Wrapper.DistributionType.ALL } plugins { - kotlin("jvm") version "1.8.10" + kotlin("jvm") version "2.0.21" application id("nu.studer.rocker") version "3.0.4" - id("com.github.johnrengelman.shadow") version "7.1.2" + id("com.gradleup.shadow") version "8.3.4" } group = "io.vertx" -version = "4.3.8" +version = "4.3.8" // 4.5.10 is available, but this is not updated to be kept consistent with the "vert-web" portion repositories { mavenCentral() } dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0") implementation(platform("io.vertx:vertx-stack-depchain:$version")) implementation("io.vertx:vertx-core") - implementation("com.fasterxml.jackson.module:jackson-module-blackbird:2.14.2") + implementation("com.fasterxml.jackson.module:jackson-module-blackbird:2.14.2") // 2.18.1 is available, but this is not updated to be kept consistent with the "vert-web" portion implementation("io.vertx:vertx-web") implementation("io.vertx:vertx-pg-client") implementation("io.vertx:vertx-web-templ-rocker") - implementation("io.netty", "netty-transport-native-epoll", classifier = "linux-x86_64") + runtimeOnly("io.netty", "netty-transport-native-epoll", classifier = "linux-x86_64") + // not used to make the project consistent with the "vert-web" portion + /* + runtimeOnly("io.vertx:vertx-io_uring-incubator") + runtimeOnly("io.netty.incubator:netty-incubator-transport-native-io_uring:0.0.25.Final:linux-x86_64") + */ implementation("io.vertx:vertx-lang-kotlin") implementation("io.vertx:vertx-lang-kotlin-coroutines") } @@ -38,14 +41,12 @@ rocker { create("main") { templateDir.set(file("src/main/resources")) optimize.set(true) - javaVersion.set("17") + javaVersion.set("17") // kept consistent with the "vert-web" portion } } } -tasks.withType { - compilerOptions.jvmTarget.set(JvmTarget.JVM_17) -} +kotlin.jvmToolchain(17) // kept consistent with the "vert-web" portion // content below copied from the project generated by the app generator diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 61574 zcmb6AV{~QRwml9f72CFLyJFk6ZKq;e729@pY}>YNR8p1vbMJH7ubt# zZR`2@zJD1Ad^Oa6Hk1{VlN1wGR-u;_dyt)+kddaNpM#U8qn@6eX;fldWZ6BspQIa= zoRXcQk)#ENJ`XiXJuK3q0$`Ap92QXrW00Yv7NOrc-8ljOOOIcj{J&cR{W`aIGXJ-` z`ez%Mf7qBi8JgIb{-35Oe>Zh^GIVe-b^5nULQhxRDZa)^4+98@`hUJe{J%R>|LYHA z4K3~Hjcp8_owGF{d~lZVKJ;kc48^OQ+`_2migWY?JqgW&))70RgSB6KY9+&wm<*8 z_{<;(c;5H|u}3{Y>y_<0Z59a)MIGK7wRMX0Nvo>feeJs+U?bt-++E8bu7 zh#_cwz0(4#RaT@xy14c7d<92q-Dd}Dt<*RS+$r0a^=LGCM{ny?rMFjhgxIG4>Hc~r zC$L?-FW0FZ((8@dsowXlQq}ja%DM{z&0kia*w7B*PQ`gLvPGS7M}$T&EPl8mew3In z0U$u}+bk?Vei{E$6dAYI8Tsze6A5wah?d(+fyP_5t4ytRXNktK&*JB!hRl07G62m_ zAt1nj(37{1p~L|m(Bsz3vE*usD`78QTgYIk zQ6BF14KLzsJTCqx&E!h>XP4)bya|{*G7&T$^hR0(bOWjUs2p0uw7xEjbz1FNSBCDb@^NIA z$qaq^0it^(#pFEmuGVS4&-r4(7HLmtT%_~Xhr-k8yp0`$N|y>#$Ao#zibzGi*UKzi zhaV#@e1{2@1Vn2iq}4J{1-ox;7K(-;Sk{3G2_EtV-D<)^Pk-G<6-vP{W}Yd>GLL zuOVrmN@KlD4f5sVMTs7c{ATcIGrv4@2umVI$r!xI8a?GN(R;?32n0NS(g@B8S00-=zzLn z%^Agl9eV(q&8UrK^~&$}{S(6-nEXnI8%|hoQ47P?I0Kd=woZ-pH==;jEg+QOfMSq~ zOu>&DkHsc{?o&M5`jyJBWbfoPBv9Y#70qvoHbZXOj*qRM(CQV=uX5KN+b>SQf-~a8 ziZg}@&XHHXkAUqr)Q{y`jNd7`1F8nm6}n}+_She>KO`VNlnu(&??!(i#$mKOpWpi1 z#WfWxi3L)bNRodhPM~~?!5{TrrBY_+nD?CIUupkwAPGz-P;QYc-DcUoCe`w(7)}|S zRvN)9ru8b)MoullmASwsgKQo1U6nsVAvo8iKnbaWydto4y?#-|kP^%e6m@L`88KyDrLH`=EDx*6>?r5~7Iv~I zr__%SximG(izLKSnbTlXa-ksH@R6rvBrBavt4)>o3$dgztLt4W=!3=O(*w7I+pHY2(P0QbTma+g#dXoD7N#?FaXNQ^I0*;jzvjM}%=+km`YtC%O#Alm| zqgORKSqk!#^~6whtLQASqiJ7*nq?38OJ3$u=Tp%Y`x^eYJtOqTzVkJ60b2t>TzdQ{I}!lEBxm}JSy7sy8DpDb zIqdT%PKf&Zy--T^c-;%mbDCxLrMWTVLW}c=DP2>Td74)-mLl|70)8hU??(2)I@Zyo z2i`q5oyA!!(2xV~gahuKl&L(@_3SP012#x(7P!1}6vNFFK5f*A1xF({JwxSFwA|TM z&1z}!*mZKcUA-v4QzLz&5wS$7=5{M@RAlx@RkJaA4nWVqsuuaW(eDh^LNPPkmM~Al zwxCe@*-^4!ky#iNv2NIIU$CS+UW%ziW0q@6HN3{eCYOUe;2P)C*M`Bt{~-mC%T3%# zEaf)lATO1;uF33x>Hr~YD0Ju*Syi!Jz+x3myVvU^-O>C*lFCKS&=Tuz@>&o?68aF& zBv<^ziPywPu#;WSlTkzdZ9`GWe7D8h<1-v0M*R@oYgS5jlPbgHcx)n2*+!+VcGlYh?;9Ngkg% z=MPD+`pXryN1T|%I7c?ZPLb3bqWr7 zU4bfG1y+?!bw)5Iq#8IqWN@G=Ru%Thxf)#=yL>^wZXSCC8we@>$hu=yrU;2=7>h;5 zvj_pYgKg2lKvNggl1ALnsz2IlcvL;q79buN5T3IhXuJvy@^crqWpB-5NOm{7UVfxmPJ>`?;Tn@qHzF+W!5W{8Z&ZAnDOquw6r4$bv*jM#5lc%3v|c~^ zdqo4LuxzkKhK4Q+JTK8tR_|i6O(x#N2N0Fy5)!_trK&cn9odQu#Vlh1K~7q|rE z61#!ZPZ+G&Y7hqmY;`{XeDbQexC2@oFWY)Nzg@lL3GeEVRxWQlx@0?Zt`PcP0iq@6 zLgc)p&s$;*K_;q0L(mQ8mKqOJSrq$aQYO-Hbssf3P=wC6CvTVHudzJH-Jgm&foBSy zx0=qu$w477lIHk);XhaUR!R-tQOZ;tjLXFH6;%0)8^IAc*MO>Q;J={We(0OHaogG0 zE_C@bXic&m?F7slFAB~x|n#>a^@u8lu;=!sqE*?vq zu4`(x!Jb4F#&3+jQ|ygldPjyYn#uCjNWR)%M3(L!?3C`miKT;~iv_)dll>Q6b+I&c zrlB04k&>mSYLR7-k{Od+lARt~3}Bv!LWY4>igJl!L5@;V21H6dNHIGr+qV551e@yL z`*SdKGPE^yF?FJ|`#L)RQ?LJ;8+={+|Cl<$*ZF@j^?$H%V;jqVqt#2B0yVr}Nry5R z5D?S9n+qB_yEqvdy9nFc+8WxK$XME$3ftSceLb+L(_id5MMc*hSrC;E1SaZYow%jh zPgo#1PKjE+1QB`Of|aNmX?}3TP;y6~0iN}TKi3b+yvGk;)X&i3mTnf9M zuv3qvhErosfZ%Pb-Q>|BEm5(j-RV6Zf^$icM=sC-5^6MnAvcE9xzH@FwnDeG0YU{J zi~Fq?=bi0;Ir=hfOJu8PxC)qjYW~cv^+74Hs#GmU%Cw6?3LUUHh|Yab`spoqh8F@_ zm4bCyiXPx-Cp4!JpI~w!ShPfJOXsy>f*|$@P8L8(oeh#~w z-2a4IOeckn6}_TQ+rgl_gLArS3|Ml(i<`*Lqv6rWh$(Z5ycTYD#Z*&-5mpa}a_zHt z6E`Ty-^L9RK-M*mN5AasoBhc|XWZ7=YRQSvG)3$v zgr&U_X`Ny0)IOZtX}e$wNUzTpD%iF7Rgf?nWoG2J@PsS-qK4OD!kJ?UfO+1|F*|Bo z1KU`qDA^;$0*4mUJ#{EPOm7)t#EdX=Yx1R2T&xlzzThfRC7eq@pX&%MO&2AZVO%zw zS;A{HtJiL=rfXDigS=NcWL-s>Rbv|=)7eDoOVnVI>DI_8x>{E>msC$kXsS}z?R6*x zi(yO`$WN)_F1$=18cbA^5|f`pZA+9DG_Zu8uW?rA9IxUXx^QCAp3Gk1MSdq zBZv;_$W>*-zLL)F>Vn`}ti1k!%6{Q=g!g1J*`KONL#)M{ZC*%QzsNRaL|uJcGB7jD zTbUe%T(_x`UtlM!Ntp&-qu!v|mPZGcJw$mdnanY3Uo>5{oiFOjDr!ZznKz}iWT#x& z?*#;H$`M0VC|a~1u_<(}WD>ogx(EvF6A6S8l0%9U<( zH||OBbh8Tnzz*#bV8&$d#AZNF$xF9F2{_B`^(zWNC}af(V~J+EZAbeC2%hjKz3V1C zj#%d%Gf(uyQ@0Y6CcP^CWkq`n+YR^W0`_qkDw333O<0FoO9()vP^!tZ{`0zsNQx~E zb&BcBU>GTP2svE2Tmd;~73mj!_*V8uL?ZLbx}{^l9+yvR5fas+w&0EpA?_g?i9@A$j*?LnmctPDQG|zJ`=EF}Vx8aMD^LrtMvpNIR*|RHA`ctK*sbG= zjN7Q)(|dGpC}$+nt~bupuKSyaiU}Ws{?Tha@$q}cJ;tvH>+MuPih+B4d$Zbq9$Y*U z)iA(-dK?Ov@uCDq48Zm%%t5uw1GrnxDm7*ITGCEF!2UjA`BqPRiUR`yNq^zz|A3wU zG(8DAnY-GW+PR2&7@In{Sla(XnMz5Rk^*5u4UvCiDQs@hvZXoiziv{6*i?fihVI|( zPrY8SOcOIh9-AzyJ*wF4hq%ojB&Abrf;4kX@^-p$mmhr}xxn#fVU?ydmD=21&S)s*v*^3E96(K1}J$6bi8pyUr-IU)p zcwa$&EAF$0Aj?4OYPcOwb-#qB=kCEDIV8%^0oa567_u6`9+XRhKaBup z2gwj*m#(}=5m24fBB#9cC?A$4CCBj7kanaYM&v754(b%Vl!gg&N)ZN_gO0mv(jM0# z>FC|FHi=FGlEt6Hk6H3!Yc|7+q{&t%(>3n#>#yx@*aS+bw)(2!WK#M0AUD~wID>yG z?&{p66jLvP1;!T7^^*_9F322wJB*O%TY2oek=sA%AUQT75VQ_iY9`H;ZNKFQELpZd z$~M`wm^Y>lZ8+F0_WCJ0T2td`bM+b`)h3YOV%&@o{C#|t&7haQfq#uJJP;81|2e+$ z|K#e~YTE87s+e0zCE2X$df`o$`8tQhmO?nqO?lOuTJ%GDv&-m_kP9X<5GCo1=?+LY z?!O^AUrRb~3F!k=H7Aae5W0V1{KlgH379eAPTwq=2+MlNcJ6NM+4ztXFTwI)g+)&Q7G4H%KH_(}1rq%+eIJ*3$?WwnZxPZ;EC=@`QS@|-I zyl+NYh&G>k%}GL}1;ap8buvF>x^yfR*d+4Vkg7S!aQ++_oNx6hLz6kKWi>pjWGO5k zlUZ45MbA=v(xf>Oeqhg8ctl56y{;uDG?A9Ga5aEzZB80BW6vo2Bz&O-}WAq>(PaV;*SX0=xXgI_SJ< zYR&5HyeY%IW}I>yKu^?W2$~S!pw?)wd4(#6;V|dVoa}13Oiz5Hs6zA zgICc;aoUt$>AjDmr0nCzeCReTuvdD1{NzD1wr*q@QqVW*Wi1zn;Yw1dSwLvTUwg#7 zpp~Czra7U~nSZZTjieZxiu~=}!xgV68(!UmQz@#w9#$0Vf@y%!{uN~w^~U_d_Aa&r zt2l>)H8-+gA;3xBk?ZV2Cq!L71;-tb%7A0FWziYwMT|#s_Ze_B>orZQWqDOZuT{|@ zX04D%y&8u@>bur&*<2??1KnaA7M%%gXV@C3YjipS4|cQH68OSYxC`P#ncvtB%gnEI z%fxRuH=d{L70?vHMi>~_lhJ@MC^u#H66=tx?8{HG;G2j$9@}ZDYUuTetwpvuqy}vW)kDmj^a|A%z(xs7yY2mU0#X2$un&MCirr|7 z%m?8+9aekm0x5hvBQ2J+>XeAdel$cy>J<6R3}*O^j{ObSk_Ucv$8a3_WPTd5I4HRT z(PKP5!{l*{lk_19@&{5C>TRV8_D~v*StN~Pm*(qRP+`1N12y{#w_fsXrtSt={0hJw zQ(PyWgA;;tBBDql#^2J(pnuv;fPn(H>^d<6BlI%00ylJZ?Evkh%=j2n+|VqTM~EUh zTx|IY)W;3{%x(O{X|$PS&x0?z#S2q-kW&G}7#D?p7!Q4V&NtA_DbF~v?cz6_l+t8e zoh1`dk;P-%$m(Ud?wnoZn0R=Ka$`tnZ|yQ-FN!?!9Wmb^b(R!s#b)oj9hs3$p%XX9DgQcZJE7B_dz0OEF6C zx|%jlqj0WG5K4`cVw!19doNY+(;SrR_txAlXxf#C`uz5H6#0D>SzG*t9!Fn|^8Z8; z1w$uiQzufUzvPCHXhGma>+O327SitsB1?Rn6|^F198AOx}! zfXg22Lm0x%=gRvXXx%WU2&R!p_{_1H^R`+fRO2LT%;He@yiekCz3%coJ=8+Xbc$mN zJ;J7*ED|yKWDK3CrD?v#VFj|l-cTgtn&lL`@;sMYaM1;d)VUHa1KSB5(I54sBErYp z>~4Jz41?Vt{`o7T`j=Se{-kgJBJG^MTJ}hT00H%U)pY-dy!M|6$v+-d(CkZH5wmo1 zc2RaU`p3_IJ^hf{g&c|^;)k3zXC0kF1>rUljSxd}Af$!@@R1fJWa4g5vF?S?8rg=Z z4_I!$dap>3l+o|fyYy(sX}f@Br4~%&&#Z~bEca!nMKV zgQSCVC!zw^j<61!7#T!RxC6KdoMNONcM5^Q;<#~K!Q?-#6SE16F*dZ;qv=`5 z(kF|n!QIVd*6BqRR8b8H>d~N@ab+1+{3dDVPVAo>{mAB#m&jX{usKkCg^a9Fef`tR z?M79j7hH*;iC$XM)#IVm&tUoDv!(#f=XsTA$)(ZE37!iu3Gkih5~^Vlx#<(M25gr@ zOkSw4{l}6xI(b0Gy#ywglot$GnF)P<FQt~9ge1>qp8Q^k;_Dm1X@Tc^{CwYb4v_ld}k5I$&u}avIDQ-D(_EP zhgdc{)5r_iTFiZ;Q)5Uq=U73lW%uYN=JLo#OS;B0B=;j>APk?|!t{f3grv0nv}Z%` zM%XJk^#R69iNm&*^0SV0s9&>cl1BroIw*t3R0()^ldAsq)kWcI=>~4!6fM#0!K%TS ziZH=H%7-f=#-2G_XmF$~Wl~Um%^9%AeNSk)*`RDl##y+s)$V`oDlnK@{y+#LNUJp1^(e89sed@BB z^W)sHm;A^9*RgQ;f(~MHK~bJRvzezWGr#@jYAlXIrCk_iiUfC_FBWyvKj2mBF=FI;9|?0_~=E<)qnjLg9k*Qd!_ zl}VuSJB%#M>`iZm*1U^SP1}rkkI};91IRpZw%Hb$tKmr6&H5~m?A7?+uFOSnf)j14 zJCYLOYdaRu>zO%5d+VeXa-Ai7{7Z}iTn%yyz7hsmo7E|{ z@+g9cBcI-MT~2f@WrY0dpaC=v{*lDPBDX}OXtJ|niu$xyit;tyX5N&3pgmCxq>7TP zcOb9%(TyvOSxtw%Y2+O&jg39&YuOtgzn`uk{INC}^Na_-V;63b#+*@NOBnU{lG5TS zbC+N-qt)u26lggGPcdrTn@m+m>bcrh?sG4b(BrtdIKq3W<%?WuQtEW0Z)#?c_Lzqj*DlZ zVUpEV3~mG#DN$I#JJp3xc8`9ex)1%Il7xKwrpJt)qtpq}DXqI=5~~N}N?0g*YwETZ z(NKJO5kzh?Os`BQ7HYaTl>sXVr!b8>(Wd&PU*3ivSn{;q`|@n*J~-3tbm;4WK>j3&}AEZ*`_!gJ3F4w~4{{PyLZklDqWo|X}D zbZU_{2E6^VTCg#+6yJt{QUhu}uMITs@sRwH0z5OqM>taO^(_+w1c ztQ?gvVPj<_F_=(ISaB~qML59HT;#c9x(;0vkCi2#Zp`;_r@+8QOV1Ey2RWm6{*J&9 zG(Dt$zF^7qYpo9Ne}ce5re^j|rvDo*DQ&1Be#Fvo#?m4mfFrNZb1#D4f`Lf(t_Fib zwxL3lx(Zp(XVRjo_ocElY#yS$LHb6yl;9;Ycm1|5y_praEcGUZxLhS%7?b&es2skI z9l!O)b%D=cXBa@v9;64f^Q9IV$xOkl;%cG6WLQ`_a7I`woHbEX&?6NJ9Yn&z+#^#! zc8;5=jt~Unn7!cQa$=a7xSp}zuz#Lc#Q3-e7*i`Xk5tx_+^M~!DlyBOwVEq3c(?`@ zZ_3qlTN{eHOwvNTCLOHjwg0%niFYm({LEfAieI+k;U2&uTD4J;Zg#s`k?lxyJN<$mK6>j?J4eOM@T*o?&l@LFG$Gs5f4R*p*V1RkTdCfv9KUfa< z{k;#JfA3XA5NQJziGd%DchDR*Dkld&t;6i9e2t7{hQPIG_uDXN1q0T;IFCmCcua-e z`o#=uS2_en206(TuB4g-!#=rziBTs%(-b1N%(Bl}ea#xKK9zzZGCo@<*i1ZoETjeC zJ)ll{$mpX7Eldxnjb1&cB6S=7v@EDCsmIOBWc$p^W*;C0i^Hc{q(_iaWtE{0qbLjxWlqBe%Y|A z>I|4)(5mx3VtwRBrano|P))JWybOHUyOY67zRst259tx;l(hbY@%Z`v8Pz^0Sw$?= zwSd^HLyL+$l&R+TDnbV_u+h{Z>n$)PMf*YGQ}1Df@Nr{#Gr+@|gKlnv?`s1rm^$1+ zic`WeKSH?{+E}0^#T<&@P;dFf;P5zCbuCOijADb}n^{k=>mBehDD6PtCrn5ZBhh2L zjF$TbzvnwT#AzGEG_Rg>W1NS{PxmL9Mf69*?YDeB*pK!&2PQ7!u6eJEHk5e(H~cnG zZQ?X_rtws!;Tod88j=aMaylLNJbgDoyzlBv0g{2VYRXObL=pn!n8+s1s2uTwtZc

      YH!Z*ZaR%>WTVy8-(^h5J^1%NZ$@&_ZQ)3AeHlhL~=X9=fKPzFbZ;~cS**=W-LF1 z5F82SZ zG8QZAet|10U*jK*GVOA(iULStsUDMjhT$g5MRIc4b8)5q_a?ma-G+@xyNDk{pR*YH zjCXynm-fV`*;}%3=+zMj**wlCo6a{}*?;`*j%fU`t+3Korws%dsCXAANKkmVby*eJ z6`2%GB{+&`g2;snG`LM9S~>#^G|nZ|JMnWLgSmJ4!kB->uAEF0sVn6km@s=#_=d)y zzld%;gJY>ypQuE z!wgqqTSPxaUPoG%FQ()1hz(VHN@5sfnE68of>9BgGsQP|9$7j zGqN{nxZx4CD6ICwmXSv6&RD<-etQmbyTHIXn!Q+0{18=!p))>To8df$nCjycnW07Q zsma_}$tY#Xc&?#OK}-N`wPm)+2|&)9=9>YOXQYfaCI*cV1=TUl5({a@1wn#V?y0Yn z(3;3-@(QF|0PA}|w4hBWQbTItc$(^snj$36kz{pOx*f`l7V8`rZK}82pPRuy zxwE=~MlCwOLRC`y%q8SMh>3BUCjxLa;v{pFSdAc7m*7!}dtH`MuMLB)QC4B^Uh2_? zApl6z_VHU}=MAA9*g4v-P=7~3?Lu#ig)cRe90>@B?>})@X*+v&yT6FvUsO=p#n8p{ zFA6xNarPy0qJDO1BPBYk4~~LP0ykPV ztoz$i+QC%Ch%t}|i^(Rb9?$(@ijUc@w=3F1AM}OgFo1b89KzF6qJO~W52U_;R_MsB zfAC29BNUXpl!w&!dT^Zq<__Hr#w6q%qS1CJ#5Wrb*)2P1%h*DmZ?br)*)~$^TExX1 zL&{>xnM*sh=@IY)i?u5@;;k6+MLjx%m(qwDF3?K3p>-4c2fe(cIpKq#Lc~;#I#Wwz zywZ!^&|9#G7PM6tpgwA@3ev@Ev_w`ZZRs#VS4}<^>tfP*(uqLL65uSi9H!Gqd59C&=LSDo{;#@Isg3caF1X+4T}sL2B+Q zK*kO0?4F7%8mx3di$B~b&*t7y|{x%2BUg4kLFXt`FK;Vi(FIJ+!H zW;mjBrfZdNT>&dDfc4m$^f@k)mum{DioeYYJ|XKQynXl-IDs~1c(`w{*ih0-y_=t$ zaMDwAz>^CC;p*Iw+Hm}%6$GN49<(rembdFvb!ZyayLoqR*KBLc^OIA*t8CXur+_e0 z3`|y|!T>7+jdny7x@JHtV0CP1jI^)9){!s#{C>BcNc5#*hioZ>OfDv)&PAM!PTjS+ zy1gRZirf>YoGpgprd?M1k<;=SShCMn406J>>iRVnw9QxsR|_j5U{Ixr;X5n$ih+-=X0fo(Oga zB=uer9jc=mYY=tV-tAe@_d-{aj`oYS%CP@V3m6Y{)mZ5}b1wV<9{~$`qR9 zEzXo|ok?1fS?zneLA@_C(BAjE_Bv7Dl2s?=_?E9zO5R^TBg8Be~fpG?$9I; zDWLH9R9##?>ISN8s2^wj3B?qJxrSSlC6YB}Yee{D3Ex8@QFLZ&zPx-?0>;Cafcb-! zlGLr)wisd=C(F#4-0@~P-C&s%C}GvBhb^tTiL4Y_dsv@O;S56@?@t<)AXpqHx9V;3 zgB!NXwp`=%h9!L9dBn6R0M<~;(g*nvI`A@&K!B`CU3^FpRWvRi@Iom>LK!hEh8VjX z_dSw5nh-f#zIUDkKMq|BL+IO}HYJjMo=#_srx8cRAbu9bvr&WxggWvxbS_Ix|B}DE zk!*;&k#1BcinaD-w#E+PR_k8I_YOYNkoxw5!g&3WKx4{_Y6T&EV>NrnN9W*@OH+niSC0nd z#x*dm=f2Zm?6qhY3}Kurxl@}d(~ z<}?Mw+>%y3T{!i3d1%ig*`oIYK|Vi@8Z~*vxY%Od-N0+xqtJ*KGrqo*9GQ14WluUn z+%c+og=f0s6Mcf%r1Be#e}&>1n!!ZxnWZ`7@F9ymfVkuFL;m6M5t%6OrnK#*lofS{ z=2;WPobvGCu{(gy8|Mn(9}NV99Feps6r*6s&bg(5aNw$eE ztbYsrm0yS`UIJ?Kv-EpZT#76g76*hVNg)L#Hr7Q@L4sqHI;+q5P&H{GBo1$PYkr@z zFeVdcS?N1klRoBt4>fMnygNrDL!3e)k3`TXoa3#F#0SFP(Xx^cc)#e2+&z9F=6{qk z%33-*f6=+W@baq){!d_;ouVthV1PREX^ykCjD|%WUMnNA2GbA#329aEihLk~0!!}k z)SIEXz(;0lemIO{|JdO{6d|-9LePs~$}6vZ>`xYCD(ODG;OuwOe3jeN;|G$~ml%r* z%{@<9qDf8Vsw581v9y+)I4&te!6ZDJMYrQ*g4_xj!~pUu#er`@_bJ34Ioez)^055M$)LfC|i*2*3E zLB<`5*H#&~R*VLYlNMCXl~=9%o0IYJ$bY+|m-0OJ-}6c@3m<~C;;S~#@j-p?DBdr<><3Y92rW-kc2C$zhqwyq09;dc5;BAR#PPpZxqo-@e_s9*O`?w5 zMnLUs(2c-zw9Pl!2c#+9lFpmTR>P;SA#Id;+fo|g{*n&gLi}7`K)(=tcK|?qR4qNT z%aEsSCL0j9DN$j8g(a+{Z-qPMG&O)H0Y9!c*d?aN0tC&GqC+`%(IFY$ll~!_%<2pX zuD`w_l)*LTG%Qq3ZSDE)#dt-xp<+n=3&lPPzo}r2u~>f8)mbcdN6*r)_AaTYq%Scv zEdwzZw&6Ls8S~RTvMEfX{t@L4PtDi{o;|LyG>rc~Um3;x)rOOGL^Bmp0$TbvPgnwE zJEmZ>ktIfiJzdW5i{OSWZuQWd13tz#czek~&*?iZkVlLkgxyiy^M~|JH(?IB-*o6% zZT8+svJzcVjcE0UEkL_5$kNmdrkOl3-`eO#TwpTnj?xB}AlV2`ks_Ua9(sJ+ok|%b z=2n2rgF}hvVRHJLA@9TK4h#pLzw?A8u31&qbr~KA9;CS7aRf$^f1BZ5fsH2W8z}FU zC}Yq76IR%%g|4aNF9BLx6!^RMhv|JYtoZW&!7uOskGSGL+}_>L$@Jg2Vzugq-NJW7 zzD$7QK7cftU1z*Fxd@}wcK$n6mje}=C|W)tm?*V<<{;?8V9hdoi2NRm#~v^#bhwlc z5J5{cSRAUztxc6NH>Nwm4yR{(T>0x9%%VeU&<&n6^vFvZ{>V3RYJ_kC9zN(M(` zp?1PHN>f!-aLgvsbIp*oTZv4yWsXM2Q=C}>t7V(iX*N8{aoWphUJ^(n3k`pncUt&` ze+sYjo)>>=I?>X}1B*ZrxYu`|WD0J&RIb~ zPA_~u)?&`}JPwc1tu=OlKlJ3f!9HXa)KMb|2%^~;)fL>ZtycHQg`j1Vd^nu^XexYkcae@su zOhxk8ws&Eid_KAm_<}65zbgGNzwshR#yv&rQ8Ae<9;S^S}Dsk zubzo?l{0koX8~q*{uA%)wqy*Vqh4>_Os7PPh-maB1|eT-4 zK>*v3q}TBk1QlOF!113XOn(Kzzb5o4Dz@?q3aEb9%X5m{xV6yT{;*rnLCoI~BO&SM zXf=CHLI>kaSsRP2B{z_MgbD;R_yLnd>^1g`l;uXBw7|)+Q_<_rO!!VaU-O+j`u%zO z1>-N8OlHDJlAqi2#z@2yM|Dsc$(nc>%ZpuR&>}r(i^+qO+sKfg(Ggj9vL%hB6 zJ$8an-DbmKBK6u6oG7&-c0&QD#?JuDYKvL5pWXG{ztpq3BWF)e|7aF-(91xvKt047 zvR{G@KVKz$0qPNXK*gt*%qL-boz-*E;7LJXSyj3f$7;%5wj)2p8gvX}9o_u}A*Q|7 z)hjs?k`8EOxv1zahjg2PQDz5pYF3*Cr{%iUW3J+JU3P+l?n%CwV;`noa#3l@vd#6N zc#KD2J;5(Wd1BP)`!IM;L|(d9m*L8QP|M7W#S7SUF3O$GFnWvSZOwC_Aq~5!=1X+s z6;_M++j0F|x;HU6kufX-Ciy|du;T%2@hASD9(Z)OSVMsJg+=7SNTAjV<8MYN-zX5U zVp~|N&{|#Z)c6p?BEBBexg4Q((kcFwE`_U>ZQotiVrS-BAHKQLr87lpmwMCF_Co1M z`tQI{{7xotiN%Q~q{=Mj5*$!{aE4vi6aE$cyHJC@VvmemE4l_v1`b{)H4v7=l5+lm^ ztGs>1gnN(Vl+%VuwB+|4{bvdhCBRxGj3ady^ zLxL@AIA>h@eP|H41@b}u4R`s4yf9a2K!wGcGkzUe?!21Dk)%N6l+#MP&}B0%1Ar*~ zE^88}(mff~iKMPaF+UEp5xn(gavK(^9pvsUQT8V;v!iJt|7@&w+_va`(s_57#t?i6 zh$p!4?BzS9fZm+ui`276|I307lA-rKW$-y^lK#=>N|<-#?WPPNs86Iugsa&n{x%*2 zzL_%$#TmshCw&Yo$Ol?^|hy{=LYEUb|bMMY`n@#(~oegs-nF){0ppwee|b{ca)OXzS~01a%cg&^ zp;}mI0ir3zapNB)5%nF>Sd~gR1dBI!tDL z&m24z9sE%CEv*SZh1PT6+O`%|SG>x74(!d!2xNOt#C5@I6MnY%ij6rK3Y+%d7tr3&<^4XU-Npx{^`_e z9$-|@$t`}A`UqS&T?cd@-+-#V7n7tiZU!)tD8cFo4Sz=u65?f#7Yj}MDFu#RH_GUQ z{_-pKVEMAQ7ljrJ5Wxg4*0;h~vPUI+Ce(?={CTI&(RyX&GVY4XHs>Asxcp%B+Y9rK z5L$q94t+r3=M*~seA3BO$<0%^iaEb2K=c7((dIW$ggxdvnC$_gq~UWy?wljgA0Dwd`ZsyqOC>)UCn-qU5@~!f znAWKSZeKRaq#L$3W21fDCMXS;$X(C*YgL7zi8E|grQg%Jq8>YTqC#2~ys%Wnxu&;ZG<`uZ1L<53jf2yxYR3f0>a;%=$SYI@zUE*g7f)a{QH^<3F?%({Gg)yx^zsdJ3^J2 z#(!C3qmwx77*3#3asBA(jsL`86|OLB)j?`0hQIh>v;c2A@|$Yg>*f+iMatg8w#SmM z<;Y?!$L--h9vH+DL|Wr3lnfggMk*kyGH^8P48or4m%K^H-v~`cBteWvnN9port02u zF;120HE2WUDi@8?&Oha6$sB20(XPd3LhaT~dRR2_+)INDTPUQ9(-370t6a!rLKHkIA`#d-#WUcqK%pMcTs6iS2nD?hln+F-cQPUtTz2bZ zq+K`wtc1;ex_iz9?S4)>Fkb~bj0^VV?|`qe7W02H)BiibE9=_N8=(5hQK7;(`v7E5Mi3o? z>J_)L`z(m(27_&+89P?DU|6f9J*~Ih#6FWawk`HU1bPWfdF?02aY!YSo_!v$`&W znzH~kY)ll^F07=UNo|h;ZG2aJ<5W~o7?*${(XZ9zP0tTCg5h-dNPIM=*x@KO>a|Bk zO13Cbnbn7+_Kj=EEMJh4{DW<))H!3)vcn?_%WgRy=FpIkVW>NuV`knP`VjT78dqzT z>~ay~f!F?`key$EWbp$+w$8gR1RHR}>wA8|l9rl7jsT+>sQLqs{aITUW{US&p{Y)O zRojdm|7yoA_U+`FkQkS?$4$uf&S52kOuUaJT9lP@LEqjKDM)iqp9aKNlkpMyJ76eb zAa%9G{YUTXa4c|UE>?CCv(x1X3ebjXuL&9Dun1WTlw@Wltn3zTareM)uOKs$5>0tR zDA~&tM~J~-YXA<)&H(ud)JyFm+d<97d8WBr+H?6Jn&^Ib0<{6ov- ze@q`#Y%KpD?(k{if5-M(fO3PpK{Wjqh)7h+ojH ztb=h&vmy0tn$eA8_368TlF^DKg>BeFtU%3|k~3lZAp(C$&Qjo9lR<#rK{nVn$)r*y z#58_+t=UJm7tp|@#7}6M*o;vn7wM?8Srtc z3ZFlKRDYc^HqI!O9Z*OZZ8yo-3ie9i8C%KDYCfE?`rjrf(b&xBXub!54yaZY2hFi2w2asEOiO8;Hru4~KsqQZMrs+OhO8WMX zFN0=EvME`WfQ85bmsnPFp|RU;GP^&Ik#HV(iR1B}8apb9W9)Nv#LwpED~%w67o;r! zVzm@zGjsl)loBy6p>F(G+#*b|7BzZbV#E0Pi`02uAC}D%6d12TzOD19-9bhZZT*GS zqY|zxCTWn+8*JlL3QH&eLZ}incJzgX>>i1dhff}DJ=qL{d?yv@k33UhC!}#hC#31H zOTNv5e*ozksj`4q5H+75O70w4PoA3B5Ea*iGSqA=v)}LifPOuD$ss*^W}=9kq4qqd z6dqHmy_IGzq?j;UzFJ*gI5)6qLqdUL;G&E*;lnAS+ZV1nO%OdoXqw(I+*2-nuWjwM-<|XD541^5&!u2 z1XflFJp(`^D|ZUECbaoqT5$#MJ=c23KYpBjGknPZ7boYRxpuaO`!D6C_Al?T$<47T zFd@QT%860pwLnUwer$BspTO9l1H`fknMR|GC?@1Wn`HscOe4mf{KbVio zahne0&hJd0UL#{Xyz=&h@oc>E4r*T|PHuNtK6D279q!2amh%r#@HjaN_LT4j>{&2I z?07K#*aaZ?lNT6<8o85cjZoT~?=J&Xd35I%JJom{P=jj?HQ5yfvIR8bd~#7P^m%B-szS{v<)7i?#at=WA+}?r zwMlc-iZv$GT};AP4k2nL70=Q-(+L_CYUN{V?dnvG-Av+%)JxfwF4-r^Z$BTwbT!Jh zG0YXK4e8t`3~){5Qf6U(Ha0WKCKl^zlqhqHj~F}DoPV#yHqLu+ZWlv2zH29J6}4amZ3+-WZkR7(m{qEG%%57G!Yf&!Gu~FDeSYmNEkhi5nw@#6=Bt& zOKT!UWVY-FFyq1u2c~BJ4F`39K7Vw!1U;aKZw)2U8hAb&7ho|FyEyP~D<31{_L>RrCU>eEk-0)TBt5sS5?;NwAdRzRj5qRSD?J6 ze9ueq%TA*pgwYflmo`=FnGj2r_u2!HkhE5ZbR_Xf=F2QW@QTLD5n4h(?xrbOwNp5` zXMEtm`m52{0^27@=9VLt&GI;nR9S)p(4e+bAO=e4E;qprIhhclMO&7^ThphY9HEko z#WfDFKKCcf%Bi^umN({q(avHrnTyPH{o=sXBOIltHE?Q65y_At<9DsN*xWP|Q=<|R z{JfV?B5dM9gsXTN%%j;xCp{UuHuYF;5=k|>Q=;q zU<3AEYawUG;=%!Igjp!FIAtJvoo!*J^+!oT%VI4{P=XlbYZl;Dc467Nr*3j zJtyn|g{onj!_vl)yv)Xv#}(r)@25OHW#|eN&q7_S4i2xPA<*uY9vU_R7f};uqRgVb zM%<_N3ys%M;#TU_tQa#6I1<+7Bc+f%mqHQ}A@(y^+Up5Q*W~bvS9(21FGQRCosvIX zhmsjD^OyOpae*TKs=O?(_YFjSkO`=CJIb*yJ)Pts1egl@dX6-YI1qb?AqGtIOir&u zyn>qxbJhhJi9SjK+$knTBy-A)$@EfzOj~@>s$M$|cT5V!#+|X`aLR_gGYmNuLMVH4 z(K_Tn;i+fR28M~qv4XWqRg~+18Xb?!sQ=Dy)oRa)Jkl{?pa?66h$YxD)C{F%EfZt| z^qWFB2S_M=Ryrj$a?D<|>-Qa5Y6RzJ$6Yp`FOy6p2lZSjk%$9guVsv$OOT*6V$%TH zMO}a=JR(1*u`MN8jTn|OD!84_h${A)_eFRoH7WTCCue9X73nbD282V`VzTH$ckVaC zalu%ek#pHxAx=0migDNXwcfbK3TwB7@T7wx2 zGV7rS+2g9eIT9>uWfao+lW2Qi9L^EBu#IZSYl0Q~A^KYbQKwNU(YO4Xa1XH_>ml1v z#qS;P!3Lt%2|U^=++T`A!;V-!I%upi?<#h~h!X`p7eP!{+2{7DM0$yxi9gBfm^W?M zD1c)%I7N>CG6250NW54T%HoCo^ud#`;flZg_4ciWuj4a884oWUYV(#VW`zO1T~m(_ zkayymAJI)NU9_0b6tX)GU+pQ3K9x=pZ-&{?07oeb1R7T4RjYYbfG^>3Y>=?dryJq& zw9VpqkvgVB?&aK}4@m78NQhTqZeF=zUtBkJoz8;6LO<4>wP7{UPEs1tP69;v919I5 zzCqXUhfi~FoK5niVU~hQqAksPsD@_|nwH4avOw67#fb@Z5_OS=$eP%*TrPU%HG<-A z`9)Y3*SAdfiqNTJ2eKj8B;ntdqa@U46)B+odlH)jW;U{A*0sg@z>-?;nN}I=z3nEE@Bf3kh1B zdqT{TWJvb#AT&01hNsBz8v(OwBJSu#9}A6Y!lv|`J#Z3uVK1G`0$J&OH{R?3YVfk% z9P3HGpo<1uy~VRCAe&|c4L!SR{~^0*TbVtqej3ARx(Okl5c>m~|H9ZwKVHc_tCe$hsqA`l&h7qPP5xBgtwu!; zzQyUD<6J!M5fsV-9P?C9P49qnXR+iXt#G_AS2N<6!HZ(eS`|-ndb|y!(0Y({2 z4aF~GO8bHM7s+wnhPz>sa!Z%|!qWk*DGr)azB}j6bLe#FQXV4aO>Eo7{v`0x=%5SY zy&{kY+VLXni6pPJYG_Sa*9hLy-s$79$zAhkF)r?9&?UaNGmY9F$uf>iJ~u@Q;sydU zQaN7B>4B*V;rtl^^pa3nFh$q*c&sx^Um}I)Z)R&oLEoWi3;Yv6za?;7m?fZe>#_mS z-EGInS^#UHdOzCaMRSLh7Mr0}&)WCuw$4&K^lx{;O+?Q1p5PD8znQ~srGrygJ?b~Q5hIPt?Wf2)N?&Dae4%GRcRKL(a-2koctrcvxSslXn-k9cYS|<-KJ#+$Wo>}yKKh*3Q zHsK(4-Jv!9R3*FKmN$Z#^aZcACGrlGjOe^#Z&DfPyS-1bT9OIX~-I-5lN6Y>M}dvivbs2BcbPcaNH%25-xMkT$>*soDJ) z27;};8oCYHSLF0VawZFn8^H;hIN=J457@eoI6s2P87QN6O`q8coa;PN$mRZ>2Vv+! zQj1}Tvp8?>yyd_U>dnhx%q~k*JR`HO=43mB?~xKAW9Z}Vh2b0<(T89%eZ z57kGs@{NUHM>|!+QtqI@vE8hp`IIGc`A9Y{p?c;@a!zJFmdaCJ;JmzOJ8)B1x{yZp zi!U{Wh-h+u6vj`2F+(F6gTv*cRX7MR z9@?>is`MSS1L#?PaW6BWEd#EX4+O1x6WdU~LZaQ^Quow~ybz*aAu{ZMrQ;yQ8g)-qh>x z^}@eFu1u7+3C0|hRMD1{MEn(JOmJ|wYHqGyn*xt-Y~J3j@nY56i)sgNjS4n@Q&p@@^>HQjzNaw#C9=TbwzDtiMr2a^}bX< zZE%HU^|CnS`WYVcs}D)+fP#bW0+Q#l#JC+!`OlhffKUCN8M-*CqS;VQX`If78$as0 z=$@^NFcDpTh~45heE63=x5nmP@4hBaFn(rmTY2Yj{S&k;{4W!0Nu9O5pK30}oxM7{ z>l4cKb~9D?N#u_AleD<~8XD@23sY^rt&fN%Q0L=Ti2bV#px`RhM$}h*Yg-iC4A+rI zV~@yY7!1}-@onsZ)@0tUM23cN-rXrZYWF#!V-&>vds8rP+w0t{?~Q zT^LN*lW==+_ifPb+-yMh9JhfcYiXo_zWa`ObRP9_En3P))Qyu0qPJ3*hiFSu>Vt-j z<*HWbiP2#BK@nt<g|pe3 zfBKS@i;ISkorx@cOIx9}p^d8Gis%$)))%ByVYU^KG#eE+j1p;^(Y1ndHnV&YuQZm~ zj;f+mf>0ru!N`)_p@Ls<& z`t+JDx7}R568Q|8`4A}G@t8Wc?SOXunyW5C-AWoB@P>r}uwFY*=?=!K@J(!t@#xOuPXhFS@FTf6-7|%k;nw2%Z+iHl219Ho1!bv(Ee0|ao!Rs%Jl0@3suGrOsb_@VM;(xzrf^Cbd;CK3b%a|ih-fG)`Rd00O74=sQYW~Ve z#fl!*(fo~SIQ5-Sl?1@o7-E*|SK|hoVEKzxeg!$KmQLSTN=5N`rYeh$AH&x}JMR+5dq|~FUy&Oj%QIy;HNr;V*7cQC+ka>LAwdU)?ubI@W z={eg%A&7D**SIj$cu=CN%vN^(_JeIHMUyejCrO%C3MhOcVL~Niu;8WYoN}YVhb+=- zR}M3p|H0`E2Id99y#03r`8$s0t*iD>`^7EPm1~guC)L~uW#O~>I85Q3Nj8(sG<@T| zL^e~XQt9O0AXQ^zkMdgzk5bdYttP~nf-<831zulL>>ghTFii$lg3^80t8Gb*x1w5| zN{kZuv`^8Fj=t(T*46M=S$6xY@0~AvWaGOYOBTl0?}KTkplmGn-*P(X=o-v^48OY} zi11-+Y}y)fdy_tI;*W(>#qzvgQZ52t!nrGsJEy!c86TKIN(n|!&ucCduG$XaIapI z{(Z9gZANsI={A=5Aorgq2H25Dd}H5@-5=j=s{f`%^>6b5qkm_2|3g>r-^amf=B_xV zXg*>aqxXZ6=VUI4$})ypDMy$IKkgJ;V>077T9o#OhpFhKtHP_4mnjS5QCgGe<;~Xe zt<2ZhL7?JL6Mi|U_w?;?@4OD@=4EB2op_s)N-ehm#7`zSU#7itU$#%^ncqjc`9HCG zfj;O1T+*oTkzRi-6NN`oS3w3$7ZB37L>PcN$C$L^qqHfiYO4_>0_qCw0r@FEMj=>}}%q_`d#pUT;c?=gI zqTGpiY4Z;Q(B~#hXIVBFbi#dO=cOdmOqD0|An?7nMdrm2^C>yw*dQ=#lf8)@DvXK; z$MXp}QZgnE!&L73x0LZX_bCdD4lRY$$^?9dt1RwCng{lIpbb%Ej%yOh{@76yEyb}K zXZy%^656Sk3BLKbalcc>Dt5iDzo^tj2!wnDL(X;urJfpkWrab!frFSC6Q7m zuoqN!(t=L&+Ov&~9mz(yEB`MK%RPXS>26Ww5(F;aZ zR@tPAw~=q2ioOiynxgBqE&3-R-@6yCo0*mE;#I^c!=g~HyyjGA6}|<(0EseKDTM4w z94YnCO^VYIUY@}x8kr;;El-cFHVO<$6;-UdmUB|J8R*Wf$a37gVgYT|w5^KkYe=(i zMkA$%7;^a*$V+}e%S~&*^^O;AX9NLt@cIPc*v!lKZ)(zahAsUj%PJot19ErFU=Uk( z9Hw;Lb`V+BzVpMu;TGB9}y~ff)^mbEmF?g{{7_0SR zPgp*n)l{?>7-Ji;eWG{ln$)Bro+UJAQo6W2-23d@SI=HiFV3hR2OUcAq_9q~ye)o@ zq8WZvhg`H(?1AUZ-NM%_Cuj}eb{4wOCnqs^E1G9U4HKjqaw@4dsXWP#$wx^}XPZ0F zywsJ0aJHA>AHc^q#nhQjD3!KDFT6FaDioJ#HsZU7Wo?8WH19TJ%OMDz$XH5J4Cjdt z@crE;#JNG`&1H8ekB(R4?QiiZ55kztsx}pQti}gG0&8`dP=d(8aCLOExd*Sw^WL`Q zHvZ(u`5A58h?+G&GVsA;pQNNPFI)U@O`#~RjaG(6Y<=gKT2?1 z*pCUGU)f??VlyP64P@uT`qh?L03ZQyLOBn?EKwH+IG{XvTh5|NldaSV_n~DK&F1aa znq~C_lCQHMfW6xib%a2m!h&%J)aXb{%-0!HCcW|kzaoSwPMhJ6$KL|F~Sx(tctbwfkgV;#KZlEmJN5&l5XF9eD;Kqb<| z>os)CqC^qF8$be|v;)LY{Gh@c0?a??k7M7&9CH+-B)t&T$xeSzCs30sf8O-+I#rq} z&kZj5&i>UyK9lDjI<*TLZ3USVwwpiE5x8<|{Db z3`HX3+Tt>1hg?+uY{^wC$|Tb7ud@3*Ub?=2xgztgv6OOz0G z-4VRyIChHfegUak^-)-P;VZY@FT64#xyo=+jG<48n2%wcx`ze6yd51(!NclmN=$*kY=#uu#>=yAU-u4I9Bt0n_6ta?&9jN+tM_5_3RH);I zxTN4n$EhvKH%TmOh5mq|?Cx$m>$Ed?H7hUEiRW^lnW+}ZoN#;}aAuy_n189qe1Juk z6;QeZ!gdMAEx4Na;{O*j$3F3e?FLAYuJ2iuMbWf8Ub6(nDo?zI5VNhN@ib6Yw_4P)GY^0M7TJwat z2S*2AcP}e0tibZ@k&htTD&yxT9QRG0CEq$;obfgV^&6YVX9B9|VJf`1aS_#Xk>DFo zwhk?~)>XlP5(u~UW0hP7dWZuCuN4QM24Td&j^7~)WQ6YeCg)njG*ri}tTcG-NxX}p zNB>kcxd5ipW@tN3=6r@Jgm#rgrK*dXA!gxy6fAvP7$)8)Vc~PPQ|`( zPy|bG1sUz958-!zW^j(8ILV%QC@x`~PDFczboZqWjvSU<9O3!TQ&xYi%?Y0AiVBLV z%R?#1L#G&xw*RZPsrwF?)B5+MSM(b$L;GLnRsSU!_$N;6pD97~H}`c>0F`&E_FCNE z_)Q*EA1%mOp`z>+h&aqlLKUD9*w?D>stDeBRdR*AS9)u;ABm7w1}eE|>YH>YtMyBR z^e%rPeZzBx_hj?zhJVNRM_PX(O9N#^ngmIJ0W@A)PRUV7#2D!#3vyd}ADuLry;jdn zSsTsHfQ@6`lH z^GWQf?ANJS>bBO-_obBL$Apvakhr1e5}l3axEgcNWRN$4S6ByH+viK#CnC1|6Xqj& z*_i7cullAJKy9GBAkIxUIzsmN=M|(4*WfBhePPHp?55xfF}yjeBld7+A7cQPX8PE-|Pe_xqboE;2AJb5ifrEfr86k&F0+y!r`-urW}OXSkfz2;E``UTrGSt^B)7&#RSLTQitk=mmPKUKP`uGQ4)vp_^$^U`2Jjq zeul!ptEpa%aJo0S(504oXPGdWM7dAA9=o9s4-{>z*pP zJ31L#|L?YR;^%+>YRJrLrFC=5vc;0{hcxDKF z!ntmgO>rVDaGmRpMI7-+mv(j~;s_LARvcpkXj|{GHu1c<1 zKI)#7RE~Dizu1lG>p-PcY2jX#)!oJlBA$LHnTUWX=lu``E)vhf9h4tYL-juZ`e|Kb z=F?C;Ou)h^cxB;M-8@$ZSH0jkVD>x-XS$ePV1vlU8&CG))4NgU(=XFH=Jb1IB7dBysS+94}Y>sjS(&YcJwhn zifzA|g$D5rW89vkJSv()I+Th4R&C$g-!CB30xkh%aw4po3$@DK2fW>}enE2YPt&{C~j}`>RYICK{ zYAPfZ&%`R}u6MYo<>d`^O#Q(dM{3>T^%J{Vu;lr#Utg4x9!Z9J%iXs(j+dn&SS1_2 zzxGtMnu^`d%K4Xq4Ms-ErG3_7n?c(3T!?rvyW=G<7_XKDv*ox`zN*^BVwUoqh{D7o zdEiq;Zp6}k_mCIAVTUcMdH|fo%L#qkN19X$%b1#Oko|u4!M*oRqdBa3z98{H#g=d%5X&D#NXhLh`nUjxi8@3oo(AgeItdJ zIrt9ieHI1GiwHiU4Cba-*nK@eHI4uj^LVmVIntU@Gwf^t6i3{;SfLMCs#L;s;P4s5oqd^}8Uil!NssP>?!K z07nAH>819U=^4H6l-Dhy`^Q6DV^}B9^aR0B%4AH=D&+dowt9N}zCK+xHnXb-tsKaV6kjf;Wdp#uIZ_QsI4ralE>MWP@%_5eN=MApv92( z09SSB#%eE|2atm9P~X2W2F-zJD+#{q9@1}L2fF|Lzu@1CAJq*d6gA8*Jjb;<+Asih zctE|7hdr5&b-hRhVe}PN z$0G{~;pz1yhkbwuLkfbvnX=<7?b(1PhxAmefKn$VS6Sv)t-UypwhEs3?*E=(pc%Dlul1V~OdWvdf z{WBX?lhfO_g$$X~hm^Bhl@U0t<|beYgT)2L_C(z@B^-63c9Ak2*Aa)iOMylfl|qyNQdO#yoJ?m2FOkhZ1ou@G%+^m z#!#(gTv8nx^34(HddDp|dcFl@&eh+&FFJc@^FL3fV2?u&9Wt|Yp3&MS)e+ez0g~Ys zY7d0n^)+ z0@K^GJTLN?XAV(0F6e>o>HCGJU5(8WsSFErs0FsO=O1u$=T~xx7HYK{7C>-IGB8U+ z&G^Vy>uY}Bq7HX-X`U^nNh+11GjG-)N1l_tG<^4Tu4+4X9KO9IrdH+eXGk|G6Tc(U zU~g7BoO!{elBk>;uN-`rGQP-7qIf9lQhj-=_~0Qyszu>s$s0FrJatSylv!ol&{29~ z7S4fv&-UBOF&cR@xpuW*{x9$R;c_ALt?{+dI&HoBKG-!EY{yE=>aWhlmNhHlCXc(B zuA-zI*?Z9ohO$i8s*SEIHzVvyEF$65b5m=H*fQ)hi*rX8 zKlPqjD*Ix1tPzfR_Z3bO^n32iQ#vhjWDwj6g@4S?_2GyjiGdZZRs3MLM zTfl0_Dsn=CvL`zRey?yi)&4TpF&skAi|)+`N-wrB_%I_Osi~)9`X+`Z^03whrnP7f z?T`*4Id`J@1x#T~L(h5^5z%Cok~U|&g&GpCF%E4sB#i3xAe>6>24%Kuu=)=HRS;Pu2wghgTFa zHqm#sa{7-~{w_039gH0vrOm&KPMiPmuPRpAQTm5fkPTZVT&9eKuu%Riu%-oMQl2X6 z{Bnx`3ro^Z$}rVzvUZsk9T)pX|4%sY+j0i)If_z-9;a^vr1YN>=D(I7PX){_JTJ&T zPS6~9iDT{TFPn}%H=QS!Tc$I9FPgI<0R7?Mu`{FTP~rRq(0ITmP1yrJdy|m;nWmDelF-V^y7*UEVvbxNv0sHR?Q=PVYRuZinR(;RjVAG zm&qlSYvaiIbVEqBwyDaJ8LVmiCi{6ESF4pO?U&7pk&CASm6vuB;n-RauPFzdr!C%1 z8pjdSUts7EbA4Kg(01zK!ZU<-|d zU&jWswHnSLIg&mTR;!=-=~z(#!UsXt%NJR|^teM8kG@8Qg_0^6Jqfn&(eENtP8D7K zvnll3Y%7yh1Ai~0+l6dAG|lEGe~Oa+3hO>K2}{ulO?Vf*R{o2feaRBolc;SJg)HXHn4qtzomq^EM zb)JygZ=_4@I_T=Xu$_;!Q`pv6l)4E%bV%37)RAba{sa4T*cs%C!zK?T8(cPTqE`bJ zrBWY`04q&+On`qH^KrAQT7SD2j@C>aH7E8=9U*VZPN-(x>2a++w7R$!sHH+wlze2X)<<=zC_JJvTdY7h&Jum?s?VRV)JU`T;vjdi7N-V)_QCBzI zcWqZT{RI4(lYU~W0N}tdOY@dYO8Rx5d7DF1Ba5*U7l$_Er$cO)R4dV zE#ss{Dl`s#!*MdLfGP>?q2@GSNboVP!9ZcHBZhQZ>TJ85(=-_i4jdX5A-|^UT}~W{CO^Lt4r;<1ps@s|K7A z90@6x1583&fobrg9-@p&`Gh+*&61N!$v2He2fi9pk9W2?6|)ng7Y~pJT3=g~DjTcYWjY9gtZ5hk*1Qf!y2$ot@0St$@r8|9^GMWEE>iB~etL zXYxn#Rvc`DV&y93@U$Z91md1qVtGY*M(=uCc}@STDOry@58JNx`bUH}EIb(n6I}i? zSYJOZ2>B6&Payu+@V!gxb;)_zh-{~qtgVwQ-V;vK7e0^Ag_$3+g+{xSVudVOY_p-R z$sXhpFSk7je2lk5)7Y2;Z847E1<;5?;z(I)55YFtgF!J;NT|eVi}q^*2sM}zyM{+s zD0phl+J>k1E7cZEGmP?1-3~RE;R$q(I5}m?MX8xi?6@0f#rD8Cjkpv1GmL5HVbTnM zAQ&4-rbkpdaoLp~?ZoW>^+t0t1t%GO2B;ZD4?{qeP+qsjOm{1%!oy1OfmX?_POQJ4 zGwvChl|uE;{zGoO?9B_m{c8p(-;_yq?b^jA({}iQG35?7H7`1cm`BGyfuq7z1s~T| zm88HpS{z54T{jxC=>kZ=Z#8G@uya3tt0$xST5V$-V<;6MA66VFg}`LLU8L=q3DmkU z)P^X8pg`ndMY*>gr{6~ur^Q@Z8LNQf*6wkP03K<|M*+cDc#XKZ`Z0$1FkI-IDRw#| za52W4MyHlDABs~AQu7Duebjgc}02W;1jgBx&I@TMDXU`LJutQ?@r%1z`W zlB8G-U$q37G1ob>Er8j0$q@OU3IwG#8HsvJM#)j=Y%~#zY`jaG%5;!(kY3*a^t>(qf6>I zpAJpF%;FQ?BhDSsVG27tQEG*CmWhl4)Ngp%}D?U0!nb1=)1M==^B)^$8Li$boCY$S4U;G^A!?24nSYHra{< zSNapX#G+0BTac|xh`w&}K!);$sA3ay%^a2f?+^*9Ev8ONilfwYUaDTMvhqz2Ue2<81uuB71 zAl|VEOy%GQ7zxAJ&;V^h6HOrAzF=q!s4x)Mdlmp{WWI=gZRk(;4)saI0cpWJw$2TJcyc2hWG=|v^1CAkKYp;s_QmU?A;Yj!VQ1m-ugzkaJA(wQ_ zah00eSuJg<5Nd#OWWE?|GrmWr+{-PpE_Dbqs&2`BI=<%ggbwK^8VcGiwC-6x`x|ZY z1&{Vj*XIF2$-2Lx?KC3UNRT z&=j7p1B(akO5G)SjxXOjEzujDS{s?%o*k{Ntu4*X z;2D|UsC@9Wwk5%)wzTrR`qJX!c1zDZXG>-Q<3Z)7@=8Y?HAlj_ZgbvOJ4hPlcH#Iw z!M-f`OSHF~R5U`p(3*JY=kgBZ{Gk;0;bqEu%A;P6uvlZ0;BAry`VUoN(*M9NJ z%CU2_w<0(mSOqG;LS4@`p(3*Z7jC|Khm5-i>FcYr87};_J9)XKlE}(|HSfnA(I3)I zfxNYZhs#E6k5W(z9TI2)qGY&++K@Z?bd;H%B@^!>e2Wi@gLk)wC)T93gTxdRPU7uh z)`$-m(G2I5AuK52aj!fMJR|d^H?0X~+4xSpw zqNRtq5r8hic*{eAwUT<=gI5uXLg)o5mg4XnO^T+Rd+{l)<$Aqp{+RxhNYuX^45W0k z5$t%+7R;dX$`s6CYQYcims>5bNt+k&l_t%C9D-6sYVm%Y8SRC#kgRh*%2kqMg2ewb zp_X*$NFU%#$PuQ@ULP>h9Xw`cJ>J-ma8lU`n*9PcWFpE%x0^}(DvOVe2jz@ z0^2QOi0~t!ov?jI{#bw~`Aj5ymQW@eruRg`ZNJ5IT5_5AHbQ?|C>_7rwREf2e2x&L zlV8xdOkp_*+wdaqE?6bmdrFfaGepcj=0AI<+c=Tg^WB9BhFx?SvwoVdTEm&zPy@Vs zPs2mVPiw1n_h?Xi6!+w)ypsFXXuM>gIY(J+1N6r!sJ{+r1%BzRF20!D;bN>L^?O8n z(5|x2p^Q6X`!pm3!MMFET5`nJXn>tK`fFAj5Eo&t6;F>TU_4G93YGyzvF2_fB& zfE8(dq?R@@&Wh8~%G~rDt1+e)96O5)by_%;G~Zv`TpmZ)vY@BkAan*zEy(s`*{-@U z;$WPjoNx~m?`6Z;^O=K3SBL3LrIxfU{&g)edERkPQZK!mVYU-zHuV0ENDq^e<-?^U zGyRcrPDZZw*wxK(1SPUR$0t0Wc^*u_gb*>qEOP102FX|`^U%n*7z=wM@pOmYa6Z=-)T%!{tAFELY2`dTl3$&w! z7sgKXCTU(h3+8)H#Qov19%85Xo+oQh?C-q0zaM_X2twSCz|j_u!te3J2zLV#Ut_q7 zl+5LGx#{I`(9FzE$0==km|?%m?g~HB#BSz2vHynf1x14mEX^~pej*dhzD|6gMgOJ_ z8F_<>&OIz;`NSqrel?HI-K(|ypxwz}NtX!CF3&T(CkuYOnKS&%lUSU44KsgS`L>!w zl{MoT4`t=+p8>@88)Ea%*hOIkxt#b4RfrwRMr91UF_Ic~kV;|+dRW0a8Vl725+gsvtHr5 z>?3fai&9NmU|3;-nAu8OB|<(-2Kfub4MX&1i}dDd=R~Dk=U-Vr=@&lfEIYU~xtHHO z4TKt=wze`qm=69lD)sOOkZ;$9=0B#*g@X6xPM-%zG*rCXkN%eRDEUp$gAaEd29t&T zRTAg##Sk+TAYaa(LyTD__zL3?Z+45^+1o}(&f<~lQ*-z7`Um^>v@PKqOunTE#OyKFY^q&L^fqZgplhXQ>P3?BMaq6%rO5hfsiln7TppJ z>nG9|2MmL|lShn4-yz0qH>+o;Fe`V!-e*R0M|q~31B=EC$(bQZTW^!PrHCPE4i|>e zyAFK!@P}u>@hqwf%<#uv*jen5xEL|v!VQEK!F`SIz_H8emZfn#Hg}}@SuqPv+gJ@- zf3a`DT_Q#)DnHv+XVXX`H}At zmQwW2K`t@(k%ULJrBe6ln9|W8+3B*pJ#-^9P?21%mOk(W1{t#h?|j0ZrRi_dwGh#*eBd?fy(UBXWqAt5I@L3=@QdaiK`B_NQ$ zLXzm{0#6zh2^M zfu>HFK^d`&v|x&xxa&M|pr))A4)gFw<_X@eN`B1X%C^a{$39fq`(mOG!~22h)DYut z(?MONP1>xp4@dIN^rxtMp&a^yeGc8gmcajyuXhgaB;3}vFCQFa!pTDht9ld9`&ql`2&(dwNl5FZqedD^BP zf5K1`(_&i7x-&rD=^zkFD87idQrk(Y?E;-j^DMCht`A8Qa5J-46@G_*Y3J+&l{$}*QCATEc9zuzaQGHR8B;y*>eWuv)E##?Ba3w= zZ|v(l{EB`XzD#|ncVm#Wy?#Nzm3bS1!FJ70e{DGe$EgNDg7<_ic^mJSh&Xc|aTwCrTv;XkW~UlS&G%KyLklCn}F^i(YP(f z{cqH%5q9ND_S;l$HRP$Q@`D=F*_1$CXIA5X@|V&Vir$NQ$vCx!b&LGCR<-2y)m%HI zxeeyQIjiWcf4uD9+FP+EJ`&$oJ%$R(#w~GjqP|aTQj#d(;l#rq$vcM&Y4ZQ_i{Kpx z?k2BtoKb?+1-EVmG^ne-W%8+y?i#J5N5g8f^qpH5(ZZp7$u+?I9GB+&MREX?TmVV$ zA}Ps=^CkD^sD9N;tNtN!a>@D^&940cTETu*DUZlJO*z7BBy`Rl;$-D@8$6PFq@tz0 z=_2JMmq-JRSvx`;!XM|kO!|DENI-5ke8WR*Zj#vy#Nf1;mW-{6>_sCO8?sVWOKDM| zR(iaZrBrzlRatUzp_Y|2nOXnY2G%WLGXCo9*)th_RnXvXV=q;WNAimI98!A54|$&OCCG%$4m{%E&o?S|Qx<4K~YGmM1CS!vZAzLN%d znbZsw6ql=XkiwSbNofNeA42q8#LH6Rk(u@z172O#6K>Sb{#`t#GUgpd{2;D(9@I_9 zwsY(6Go7RmOThs2rM3|Z#Vbs}CHPLgBK6gE8;XkJQDx~p5wJ?XkE(0<^hwnt6;$~R zXCAzMfK@`myzdkkpv*ZbarVwCi&{-O#rswrb-#x4zRkxfVCq;mJLic|*C92T?0CYv z)FCqY$xA(QZmggPocZqQj0Rc?=Afna`@fpSn)&nSqtI}?;cLphqEF3F9^OZfW9@HDunc^2{_H)1D9(O}4e zJMi_4(&$CD{Jf5&u|7#Iq*F~)l!8pAzNrX^<&wfEu~}Ipslzx=g^ff2?B9SnV=!$ zv&K0`hMN6BVIusHNX-lr`#K?OG1S*S4rCQaI3ea(!gCl7YjxJ3YQ)7-b&N*D8k><*x|47s3; z4f~WTWuk|Qd*d*DICV}Vb0YSzFZp5|%s4}@jvtTfm&`|(jNpajge zD}@CMaUBs+b?Yu6&c#18=TxzMCLE76#Dy=DLiq_a_knQX4Uxk$&@3ORoBFK_&a>`QKaWu^)Hzrqz{5)?h3B_`4AOn{fG9k zEwnjQb>8XRq!k?rmCd6E**1cY#b9yczN4mD%GLCeRk}{TmR1*!dTNzY;(f!B0yVuk zSjRyf;9i@2>bdGSZJ=FNrnxOExb075;gB z*7&YR|4ZraFO#45-4h%8z8U}jdt?83AmU3)Ln#m3GT!@hYdzqqDrkeHW zU#R`Z8RHq996HR=mC}SRGtsz07;-C-!n*ALpwwBe~loM)YqMH)Um$sH0RbTTzxFd)h1=-w5Yl3k|3nQ zZG>=_yZ7Lsn=b8_MZI+LSHLGYSSCc?ht~7cv#39>Moz6AS}5 zus?xge0PGdFd2FpXgIscWOyG}oxATgd$yl0Ugf_&J_vwt`)XWx!p*gE_cWU(tUTnz zQS}!bMxJyi3KWh^W9m zxLcy``V@EfJzYjK@$e7Yk=q!kL8cd3E-zpc*wwvGJ62O!V;N zFG7Y?sJ+^a%H1;rdDZRu2JmGn6<&ERKes=Pwx)GG-nt73&M78+>SOy!^#=gvLB)2H zjv!J0O`-zft|0Jv$3k5wScY)XB+9leZgR5%3~HtZA=bCg7=Dn+F}>2lf;!*1+vBtf z9jhmqlH=t5XW{0MC7Y~O7jaju&2`p!ZDLGlgnd~%+EJ%A#pIByi-+EOmoLVoK&ow8 zTDjB%0hxhiRv+O3c2*y00rMA=)s|3-ev7emcbT43#izku7dvaDXy1IMV0ahjB9yzi z9C9fN+I2Mzt1*{`a6B?+PdWHiJ5fH}rb2t>q)~3RfCxmyK^y5jN7Pn(9DFh61GO%p zuBErj=m|bDn_L8SINU)Z&@K*AgGz+SUYO_RUeJt=E0M+eh&kqK;%Y1psBNU<4-s9# ziHFr7QP6Ew=-2CdfA#Bf|EsctH;<&=Hsd>)Ma8NvHB$cpVY@}TV!UN}3?9o@CS5kw zx%nXo%y|r5`YOWoZi#hE(3+rNKLZ2g5^(%Z99nSVt$2TeU2zD%$Q(=$Y;%@QyT5Rq zRI#b><}zztscQaTiFbsu2+%O~sd`L+oKYy5nkF4Co6p88i0pmJN9In`zg*Q;&u#uK zj#>lsuWWH14-2iG z&4w{6QN8h$(MWPNu84w1m{Qg0I31ra?jdyea*I~Xk(+A5bz{x%7+IL}vFDUI-Rf{! zE^&Dau9QxA2~)M98b42(D6Q}2PUum0%g>B?JS?o~VrP+Go2&c-7hIf7(@o1*7k$zS zy@o5MEe8DoX$Ie(%SZByyf9Xf9n8xkoX}s6RiO1sg*kAV^6EAAz$>*x^OmIy!*?1k zG+UQ|aIWDEl%)#;k{>-(w9UE7oKM#2AvQud}sby=D7$l6{$}SE8O9WgHM_+ zJ?tHeu@Pi93{AuwVF^)N(B~0?#V*6z;zY)wtgqF7Nx7?YQdD^s+f8T0_;mFV9r<+C z4^NloIJIir%}ptEpDk!z`l+B z5h(k$0bO$VV(i$E@(ngVG^YAjdieHWwMrz6DvNGM*ydHGU#ZG{HG5YGTT&SIqub@) z=U)hR_)Q@#!jck+V`$X5itp9&PGiENo(yT5>4erS<|Rh#mbCA^aO2rw+~zR&2N6XP z5qAf^((HYO2QQQu2j9fSF)#rRAwpbp+o=X>au|J5^|S@(vqun`du;1_h-jxJU-%v| z_#Q!izX;$3%BBE8Exh3ojXC?$Rr6>dqXlxIGF?_uY^Z#INySnWam=5dV`v_un`=G*{f$51(G`PfGDBJNJfg1NRT2&6E^sG%z8wZyv|Yuj z%#)h~7jGEI^U&-1KvyxIbHt2%zb|fa(H0~Qwk7ED&KqA~VpFtQETD^AmmBo54RUhi z=^Xv>^3L^O8~HO`J_!mg4l1g?lLNL$*oc}}QDeh!w@;zex zHglJ-w>6cqx3_lvZ_R#`^19smw-*WwsavG~LZUP@suUGz;~@Cj9E@nbfdH{iqCg>! zD7hy1?>dr^ynOw|2(VHK-*e%fvU0AoKxsmReM7Uy{qqUVvrYc5Z#FK&Z*XwMNJ$TJ zW1T**U1Vfvq1411ol1R?nE)y%NpR?4lVjqZL`J}EWT0m7r>U{2BYRVVzAQamN#wiT zu*A`FGaD=fz|{ahqurK^jCapFS^2e>!6hSQTh87V=OjzVZ}ShM3vHX+5IY{f^_uFp zIpKBGq)ildb_?#fzJWy)MLn#ov|SvVOA&2|y;{s;Ym4#as?M^K}L_g zDkd`3GR+CuH0_$s*Lm6j)6@N;L7Vo@R=W3~a<#VxAmM&W33LiEioyyVpsrtMBbON+ zX^#%iKHM;ueExK@|t3fX`R+vO(C zucU#Xf>OjSH0Kd%521=Sz%5Y!O(ug(?gRH@K>IUayFU~ntx`Wdm27dB-2s@)J=jf_ zjI-o;hKnjQ|Lg~GKX!*OHB69xvuDU zuG-H48~inKa)^r539a{F)OS`*4GShX>%BR)LU~a-|6+sx&FYsrS1}_b)xSNOzH|Kv zq>+1-cSc0`99EsUz(XWcoRO)|shn>TqKoQBHE)w8i8K`*Xy6(ls%WN_#d}YC^)NJ; zzl8!Zduz^Gg8*f0tCWnLEzw6k5Fv!QWC1x4)3r}+x~@#O8_)0>lP-@3(kFwLl%%Mz(TpATVnL5Pl2Gahw45QXI~>Hrw))CcEs@PP?}4^zkM$ z@(?H6^`Jl?A=(&Ue;W0`*a8&fR7vde@^q^AzX^H#gd~96`Ay^_A%?;?@q@t7l7iGn zWms#2J|To4;o1?3g3L!K_chdtmbEg~>U>$5{WO@Ip~YE&H($(^X6y_OBuNHkd0wu= z4rXGy#-@vZ?>M<_gpE8+W-{#ZJeAfgE#yIDSS?M?K(oY@A|FaS3P;OjMNOG% zGWyZWS(}LJCPaGi9=5b%sq$i!6x@o(G}wwfpI5|yJe24d_V}cT1{^(Qe$KEMZ;>I@ zuE6ee%FLgem>CKEN8SeY)fpK#>*lGcH~71)T4p|9jWT;vwM@N!gL}nCW=Oi6+_>K2 zl4sWXeM1U}RETA~hp=o3tCk+?Zwl#*QA>Wwd|FlUF0)U;rEGPD1s0Syluo zfW9L(F>q9li8YKwKXZrp*t)N9E;?&Hdbm-AZp2BcDTHO6q=tzVkZsozEIXjIH`tm} zo2-UleNm*Lj7zgvhBph_|1IggkSuW~S(9ueZEfao8BuzqlF(a+pRivTv(Zb zXFaHwcuovdM#d+!rjV7F<^VW&@}=5|xj!OUF)s0zh|8yzC)7!9CZB+TLnycoGBsDF z$u&j={5c(4A$iik;x6_S96Krw8--+9pGY+*oSVTIuq;$z8*)W8B~rMX_(U6uM}!Gc`T;WfEKwI84%)-e7j}>NA(O_)3Vn9 zjXxY1Fnx3Fx%CFpUHVu0xjvxgZv}F9@!vC!lD|05#ew3eJ}@!V&urwRKH`1f{0e^o zWvM1S@NbI6pHdzm33pza_q;#?s%J*$4>10uYi4l%5qi|j5qh+D=oqSJR=7QwkQh>>c$|uJ#Z@lK6PMHs@ zyvnnoOSkGQkYz#g>||xN&1fV)aJb*y--Y`UQV~lt!u8yTUG59ns1l7u>CX2F>9fl; zB)zH3z^XHmSU{F_jlvESvaNL&nj^;j)29~1LcTYw>(6}>bt0hiRooqm0@qTj%A&P9 zKmexPwyXG@Rs1i+8>AJ;=?&7RHC7Mn%nO>@+l?Qj~+lD376O2rp)>tlVHn8MKq zwop1KRLhUjZ|+6ecGIAftSPT*3i94=QzYCi_ay+5J&O(%^IsqZ!$w-^bmd7ds$^!q z;AkC;5mTAU>l0S$6NSyG30Ej?KPq@#T)^x#x?@U~fl2m$Ffk)s6u|iPr!)-j0BlA7p3E*A|My8S#KH;8i-IQq7Q*F4*ZVPe<{^SWz_ zr?!6cS+@|C#-P~d#=W1n7acn8_pg#W-lcyf+41zwR+BU6`jUkP^`*wgX)FxEaXzoi z8)?FE*97Yqz|b@fR1(r{QD363t260rQ(F||dt9^xABi+{C*_HL9Zt5T;fq|#*b}=K zo5yj_cZB(oydMAL&X(W6yKf>ui?!%(HhiHJ83EA|#k0hQ!gpVd( zVSqRR&ado+v4BP9mzamKtSsV<|0U-Fe2HP5{{x&K>NxWLIT+D^7md{%>D1Z-5lwS~ z6Q<1`Hfc+0G{4-84o-6dr@)>5;oTt|P6jt9%a43^wGCslQtONH)7QXJEYa!c~39 zWJpTL@bMYhtem1de>svLvOUa*DL7+Ah0(_~2|ng`!Z!qiN}6xL;F}<%M8qWv&52-Y zG*1A&ZKlp~{UFV%Hb_*Re({93f7W*jJZMV-Yn|<+l3SPN+%GuPl=+tSZxxr%?6SEc zntb0~hcK691wwxlQz_jSY+V_h+0o`X!Vm{;qYK$n?6ib1G{q>a%UejzOfk6q<=8oM z6Izkn2%JA2E)aRZbel(M#gI45(Fo^O=F=W26RA8Qb0X;m(IPD{^Wd|Q;#jgBg}e( z+zY(c!4nxoIWAE4H*_ReTm|0crMv8#RLSDwAv<+|fsaqT)3}g=|0_CJgxKZo7MhUiYc8Dy7B~kohCQ$O6~l#1*#v4iWZ=7AoNuXkkVVrnARx?ZW^4-%1I8 zEdG1%?@|KmyQ}tploH>5@&8Cp{`)CxVQOss&x|Z7@gGL3=tCVNDG!N9`&;N$gu^MDk|`rRm=lhnXAJ5v1T)WTz)qvz|Dw zR?{}W4VB(O6#9%o9Z^kFZZV*PDTAWqkQ8TH!rti8QIcR&>zcg3qG}&A( zwH^K8=`1C1lRfhrX{IvNn9R9!$UMC%k(;;VH%`S0h_on|Gh6qDSH&#}*m-u{;p~WB zF$_I~xx!RxVrxNQdr@3T>{F#^D{@N9OYC9LsV62F_Z1KYQ5yk*C5WQ4&q}Kz(I{9UWWf?LIcCZicB1EO_FUH*a9QKS(4IR%#D5DTi_@M}Q_-4)J4d zz@!vR0}5MPAOK(#uL+$7XOcP$5SS#*EK9Rt6XN%}HB7@`8S^gNRk!HLv(CvCjX4o= z>9scPwWbE!F8T=@x9^;s-OF2!eO(!gL9$-AmzUiDnu&QS4If5ea2T070n1-IyNhck z9$J8b!he3@q5qB-cQ;5ymVIXXn46kK0sqKZV+3s3^mac=3~BrCW})WNrrRs1KtMmg zLzwXYC?@_H#s3W4D$W0rh%WL|G<1$$uYdptPbxy0ke!c%v#x9I=2?S)YVkg1X$W^cB!i>B{e9wXlm8AcCT8|verIZQngj>{%W%~W0J%N`Q($h z^u3}p|HyHk?(ls7?R`a&&-q@R<94fI30;ImG3jARzFz<(!K|o9@lqB@Va+on`X2G) zegCM8$vvJ$kUwXlM8df|r^GQXr~2q*Zepf&Mc%kgWGTf;=Wx%7e{&KId-{G}r22lI zmq%L6Y-M*T$xf8 z#kWOBg2TF1cwcd{<$B)AZmD%h-a6>j z%I=|#ir#iEkj3t4UhHy)cRB$3-K12y!qH^1Z%g*-t;RK z6%Mjb*?GGROZSHSRVY1Ip=U_V%(GNfjnUkhk>q%&h!xjFvh69W8Mzg)7?UM=8VHS* zx|)6Ew!>6-`!L+uS+f0xLQC^brt2b(8Y9|5j=2pxHHlbdSN*J1pz(#O%z*W-5WSf# z6EW5Nh&r<;$<3o1b013?U$#Y!jXY)*QiGFt|M58sO45TBGPiHl4PKqZhJ|VRX=AOO zsFz-=3$~g#t4Ji9c;GFS9L~}~bzgCqnYuJ-60AMDdN7HZt8_$~Of{oXaD3HVn9zkH z`>#xQNe=YpWTq_LcOoy}R`L<_4il7w4)QH4rl?AUk%?fH##I>`1_mnp&=$-%SutYT zs}sSNMWo;(a&D()U$~PG0MvZ#1lmsF&^P4l_oN#_NORD-GSmR{h_NbJ^ZdY#R9#qW zKAC%V*?y~}V1Zh#d|-z1Z8sy5A+}*cOq$xk@Pn&{QffzG-9ReyPeEhqF%~Z3@|r(s z3(wA&)dV~fELW*&*=!~l9M=7wq8xE(<@)BjjN8bUiS8@N9E{wi+Dd!V1AtT;Nl}9> zTz`2ge2Jn#Dlg1kC%oFlOe<>?jYC`Asr^%i4hH;S`*qZTPRan2a9Kjj=0aq{iVi2Z z87PZt$d(LAm_{92kl+2Z%k3KGV;~gsp;C>k?gMYZrVIzaI|0D+fka9G_4v>N96*8T zI(C8bj?A7l%V&U?H_IpSeCvf7@y1e?b>G7cN382GVO0qAMQ93(T*<*9c_;%P1}x2l zi8S$s<=e_8ww%DaBAf4oIQ7}U7_48$eYpo}Fb+F|K|43IAPR1y9xbqPPg6er{I7xj|=>-c%pGBRLn1~=5KbAb1mJAx=z(loN!w{49VkEthF>*OX z)=gqXyZB5%5lIWYPWh~{!5pSt43-)-@L@x=pmiuKP-3Cwq8qSxGNwaTT4->BWEjxk zUjr)z7WrBZB5u3iV>Y_>*i~*!vRYL)iAh5hMqNzVq1eeq=&d9Ye!26jks{f~6Ru&c zg$D;^4ui#kC`rSxx`fP!zZ^6&qSneQzZRq0F*V4QvKYKB<9FC%t#)Tik%Zq*G*IOW z3*`2!4d)!3oH>GxVcXlorJDt+JnH)p{~olYBPq|>_V@8=l#(f*diW=L+%>rfWCcPQ z#H^ksQt15Z5Uc4ODq8_JwD5^H&OGqyH6E@MabJQO>s`?bqgA6}J_QpytW{2jH#eCN z8k7y*TFZ2lj2B|1CB(@QZedFfPhX|IQbKMI;$YK>9Zla0fsU7}an6(kP;sXpBWLR` zJ#z_kk!`JJC7h(1J!+G)gL2WB2&0*~Q!%s??}GH?=`hU@03xOwU} z6s7?tGySLz!%(MwxQRiF)2(vR2wQX`YB}u&I-S+RR)LQcyH407#-{*pWLJJR?X|5 zsAl2k{&0N-?JArn@)9YTo-5+gl}R~XkbZM*5AOjPrcikpE3P?p0oN^?H+5+n)}Qxe z*RQ!-eu0RxPyF8B=}xnseNpQMXFU$d^=(G%kUd&|!BHSm7bXoGR$WA+%yjuA{|S>u z?9N6JDhS+ui~rd?wY_t7`p)|qKIMM>6jz%$jv4hc_YUDjF6-%5muq|SNuoji2)|qK zNY5+oWMe+5vu{I*grk6xlVk;(J)uuy13G`VDbj(~Vz9lA)_;$aj?=-cmd#h~N0mn{ z9EIS_d4C=L3H;Pl^;vcpb&-B+)8vt%#?gn5z>#;G{1L&8u8cXJYADMUsm9>%*%)&F zsi&I{Y=VUsV82+)hdNgDWh^M7^hMs|TA0M269^|RIGfdX1MetV2z`Ycb&_Mn4iRI! zeI6O}O9mOhN6pzfs5IfMz#Gxl`C{(111okA8M4gijgb~5s7QTyh84zUiZZ^sr1^ps z1GO`$eOS@k@XP^OVH|8)n}Wx)fKHoGwL&5;W?qEf5Jdsd!3hf7L`%QNwN0gGBm^2= z@WI+qJMJG1w2AS9d@Dt$sj_P$+S2kh7+M72^SfcdBjQEtWQ5?PT&a~G9hOo6CtS>h zoghqoR;sk{X)`ZK-M|lu{M}0>Mrs^ZW@ngC?c$26_vYKDBK^n7sFiod_xV#XcPL!^ zRPyqD{w^9u{oA3y73IW0 zH;%xop$r(Q=bq=JaLT%myEKD_2&?L@s6TzsUwE#g^OkiU6{lN)(7I?%a;_%r5_^@d zS-Z)Q-2o|~?F~f`sHlhNhiZk;!CW;3Ma6{xPlBjJx8PXc!Oq{uTo$p*tyH~ka`g<` z;3?wLhLg5pfL)2bYZTd)jP%f+N7|vIi?c491#Kv57sE3fQh(ScM?+ucH2M>9Rqj?H zY^d!KezBk6rQ|p{^RNn2dRt(9)VN_j#O!3TV`AGl-@jbbBAW$!3S$LXS0xNMr}S%f z%K9x%MRp(D2uO90(0||EOzFc6DaLm((mCe9Hy2 z-59y8V)5(K^{B0>YZUyNaQD5$3q41j-eX))x+REv|TIckJ+g#DstadNn_l~%*RBSss_jV3XS&>yNBc8H2jo(lwcLz-PuYp< z7>)~}zl$Ts0+RFxnYj7-UMpmFcw_H zYrsXM>8icD)@Iauiu_(Y#~Iyl)|pj@kHkWvg2N$kGG(W>Y)nfNn%z2xvTLwk1O2GQ zb^5KAW?c%5;VM4RWBy}`JVCBFOGQWoA9|+bgn7^fY3tSk1MSZccs9&Fy6{8F>_K@? zK(z=zgmq1R#jGE^eGV`<`>SP9SEBx!_-Ao|VZq6)-rUpd^<2GgVN&uHiM{0zA9kI( z<1^1%*uE$?4mXV@?W8}fvnBOpfwCo^?(a0E402!pZi&Kd5pp$oV%2Ofx<}YC-1mynB3X|BzWC_ufrmaH1F&VrU&Gs+5>uixj*OJ*f=gs9VR8k^7HRR$Ns|DYBc*Slz>hGK5B1}U+}#j0{ohGC zE80>WClD5FP+nUS?1qa}ENOPb2`P4ccI<9j;k?hqEe|^#jE4gguHYz-$_BCovNqIb zMUrsU;Fq%n$Ku_wB{Ny>%(B&x9$pr=Anti@#U%DgKX|HzC^=21<5Fn6EKc#~g!Mcj zJrI(gW+aK+3BWVFPWEF*ntHX5;aabHqRgU-Nr2t++%JRPP7-6$XS|M8o&YSgf3a9A zLW*tSJxoe1?#T4EocApa*+1kUIgy7oA%Ig9n@)AdY%)p_FWgF-Kxx{6vta)2X1O5y z#+%KQlxETmcIz@64y`mrSk2Z17~}k1n{=>d#$AVMbp>_60Jc&$ILCg-DTN~kM8)#o$M#Fk~<10{bQ>_@gU2uZE z*eN~mqqQC*wh{CI(!xvRQ^{jyUcvE~8N)S0bMA^SK@v;b7|xUOi63X~3Qc>2UNSD1) z7moi9K3QN_iW5KmKH>1ijU41PO>BvA6f1;kL)6io%^r>?YQ#+bB;)Rzad5;{XAJGeAT#FnDV0$w2>v|JeFIB zZ>8vmz?WVs78PuCDiHfb@D0Yi;2#%){*#?bY4dpta6dSjquGLcOw?Z{nxg98mN^4* zj&^!WMUQ_zFp+}B|G0vcNsk8(2u9(LAPk5ogKt%zgQ4^1#UCd;`-W#X8v{YyQ_m9g z8`jydw>>@1J{Q*q#5^cHVA~xR9LR3Hl@^bx)`IBKmj+Gmye36;xwL0>sS|mV+$~%b zC;2wEm&Ht3#6P|2Y0XQ+5t-aI)jn{o%&ZHWvjzEtSojFgXxNKO^e(RmM`gsJ4GrR8 zKhBtBoRjnH`mD$kT;-8ttq|iw?*`7iTF_AX<^Qe3=h8L^tqz$w$#Z@Z$`C579Jeeu ztr0z~HEazU&htfG@`HW!201!N(70hCd{%~@Wv)G*uKnJZ8>hFx`9LnYs;T>8p!`5T zx#aXXU?}B{QTV_Ux(EMzDhl-a^y^f5tRU;xnOQoN)pThr4M>-HU)As8nQ34-0*sab&z<2ye-D_3m&Q`KJJ|ZEZbaDrE%j>yQ(LM#N845j zNYrP)@)md;&r5|;JA?<~l^<=F1VRGFM93c=6@MJ`tDO_7E7Ru zW{ShCijJ?yHl63Go)-YlOW2n3W*x%w||iw(Cy>@dBJHdQl){bBVg{wmRt{#oXb9kaWqe{bJPmGE$$ z_0=cmD9dVzh<8&oyM8rK9F^bufW$Bj2cFhw&f*oKKyu$H{PI=Aqe^NL6B=dkMEAk& zE3y&F=x;e|!7kMn%(UX>G!OE$Y$@UyME#d;#d+WLmm@W@y!sboiIox^DZPB|EN<>7 z57xm5YWlFUGyF|{<*;b&Cqm+|DC8{rB9R@2EFHGL^NX*l#AcDpw6}bCmhY7!(Gv{s zm^eYNvzyJLQA#GhmL*oSt^Uulb5&ZYBuGJTC>Vm9yGaZ=Vd--pMUoDRaV_^3hE9b*Pby#Ubl65U!VBm7sV}coY)m zn1Ag^jPPLT93J{wpK%>8TnkNp;=a@;`sA7{Q}JmmS1bEK5=d@hQEWl;k$9M-PYX~S zayGm;P(Wwk23}JR7XM~kNqba`6!Z+Wt2|5K>g_j3ajhR>+;HF?88GBN!P; zr6sQ8YYpn%r^gbi8yYK7qx6U5^Tf<|VfcR$jCo`$VMVh_&(9w@O?|o3eRHq*e*#P z8-==G)D?vB3Zo~b-dkx8lg0^=gn`9FUy?ZzAfWQd>>@cyqF!sHQ_S&@$r&tTB~Lxq zAjAZTK~?J{A|L3)8K>S{`Qf%131B>?<~t=w!D{;olQ>#31R#{go`a9DOy+H*q5t+; z^*Ka!r@#8tk?~tQbylaG-$n#wP2VzIm3vjrZjcmTL zl`{6mhBhMKbSWoGqi;g3z1@G0q!ib`(Zz_o8HG_*vr8U5G|vhZn26h`f~bO&)RY0; zw(CWk*a_{ji_=O9U}66lI` zCm32)SEcAo5)5k>{<8DLI@Zz)*R29BB!^wF;WZRF9sAi39BGObmZzg?$lUn6w1rYPHSB^L4^AN zLObEaUh7TXpt6)hWck#6AZV(2`lze<`urGFre|>LUF+j5;9z%=K@&BPXCM)P$>;Xc z!tRA4j0grcS%E!urO^lsH-Ey*XY4m&9lK(;gJOyKk*#l!y7$BaBC)xHc|3i~e^bpR zz5E-=BX_5n8|<6hLj(W67{mWk@Bfc){NGAX z5-O3SP^38wjh6dCEDLB#0((3`g4rl}@I(&E8V2yDB=wYhSxlxB4&!sRy>NTh#cVvv z=HyRrf9dVK&3lyXel+#=R6^hf`;lF$COPUYG)Bq4`#>p z@u%=$28dn8+?|u94l6)-ay7Z!8l*6?m}*!>#KuZ1rF??R@Zd zrRXSfn3}tyD+Z0WOeFnKEZi^!az>x zDgDtgv>Hk-xS~pZRq`cTQD(f=kMx3Mfm2AVxtR(u^#Ndd6xli@n1(c6QUgznNTseV z_AV-qpfQ0#ZIFIccG-|a+&{gSAgtYJ{5g!ane(6mLAs5z?>ajC?=-`a5p8%b*r*mOk}?)zMfus$+W~k z{Tmz9p5$wsX1@q`aNMukq-jREu;;A6?LA(kpRut+jX?Tt?}4HGQr}7>+8z4miohO2 zU4fQ?Y8ggl%cj&>+M+)TTjn8(?^%`~!oAt#ri8gIbzIig$y#d7o##077fM9sCu%N9 zOIsq4vyox6`itu*j{eOD<$gTZd-$JuyM^cM>{?v<8# zS1yN%R0zRy&>+D*Gv-&S80?JF+Y|c^^IJWDnfy06MI2{NFO-x4JXsb@3Qp;EnL!a{ zJwKwV@mO zYVGvNmeJ!;+ce+@j@oo-+`DaPJX|h@7@4BD`QEdP?NKkYzdIa3KrZt%VUSsR+{b+| zk?dSd#9NnVl?&Y$A{-OtZ>wk%mWVF5)bf`)AA2{EFapIS4jil69Xan>*J^6Juou&`oJx|7-&|@8z?$ z2V#jm!UHstCE*qM{OGtqYY8q+x%SL6&aGY!a>@d=_G~^0;+7dY9P`oJ*)67*9Kx*O zKitC5V3g5;&L-fa37?eN=;V_c^L-ph_uKv5)Q`&!Z!RPlDWA2{J%a2q@_*?-cn@bH zIt)+mA@HaJj2RV+-MNc#y#Vji*N~m!ZyrYyg-7UK4PYK4F7Y$3Y%@Lk6iPp=I96N> z!;ih(KtZMB23*v{`5cJ}^4D*P!k1&OfU&1%borv_q|7jfaV7fL+wwx8Zp*b}B_O>NRSeJeM zpvw3M`=vSYjFYQ11kx1xqOnJ@degPh&SyXnWz-l719EiW17Yo?c~Bh~;R$MOl+jzV zM1yTq-1**x-=AVR;p0;IPi`#=E!G5qIT>EFE`Bn<7o*8!aVd7?(CZT=U9^Gi3rmWUQG z0|GaP9s$^4t_oLCs!fInyCoB(d?=tZ%%Bb2Y+X&7gvQ6~C4kU%e$W_H;-%XSM;&*HYYnLI z>%{5x_RtSUC~PI4C0H^>O%FixKYVubA>#72wexd}Cgwuw5ZYTvcN2ywVP(dO=5975 zCjo)mOa2Bo&ucEsaq8wi1{h*brT(H=XrTOy*P>?0%VV1QDr09X+Je!T)JT`02?gjX zT@B8}h|;4lH35Guq2gKZT?ags-~Ts~S=poPnQ_T1*?U|{$jaur_PjQ6WmF_(XLFG)d#|iiBC=&B zp}1eOQvQ!3UpL?K`=8hAzMkv#a^COr`J8i}d!BPX&*xp-LL#qse~mOtxI-}{yPRNV zJNTL1{7A55F~K>0e&Os%MwQ~?n1>QV=j!8o_`^-&*E|Q-L9DNr%#6sw8kQVE3E|*}$aAoO$@27ei1w=+zU%?AA!;mf#!%IV*w_D=u516!Kz1F0-WnyVB`I6F1Pc3r1=0iT<_(pCyk>@22z1$w$@M>7AIuk6+ zRG&MFVQ_7>5DLoR5HeOa$?2SA(v2u!#8;5I(ss%=x9U#R zU62n~&)22RTTsp${}6C&$+l&0skFVX%ACgc$(iQ#DVRRz!`Y+b>E?;ib(TH#6Wa=} zs(q_;SA|fhyEo7Ix%rAY9j=Ul^Rzd`3ABf+yO@~h@Rh=wo`?;8PdHE1AUo34r7izy znAr`;VavQueSu7bD5r^nXTERcW(P-{2SOSfF1x0cW1Nczvj0}@!!upORN1%_-b2bh zGt#zokJz&SveJRzlUK4DruxR(YuHEAmB%F}buU`*pAzJ7Mbgs4sg;H@&6x*wxvGm6 z>KH@ilsvvdl@CGfm4T+$agodrB=md8ygG!|O=r@FY>S_zX%*)mqf?XBX*chhQ9uPP z-(T(24)})vWD*{bQM5_hy3CD8C>anuNtCXMkG7T?Yew^>=PK!~Hlr0{-0h0cNAJ8> zRMzLFz7aJv)Yh)_s)^L&L*nDV@qfeg>_<`z1z(?s}}3tE4h|7_taB> zPfmmOCFZ8%>`gyf1@|7t3;e~mwBRCDDw(Rrt>@O}obs#1?!W((+9>d$b7t!{&wR!P ziQbn0@j=&sw={`s##Uc@uS^(tbShjtsk=qrU1LW0lu}BplIfzv{fwxNsSaG~b|ryo zTQ}YXfp6o?^sSHW>s~m;l@h6wFbIPw{Z(IqO1u){{hEZgrTdF0o$n;hYIm`h5ejym zWt^w~#8p1J)FtfY6LvGmNQ~#n>4#mN4B^ zjrQk)Zt%k}GBRD>l`<~og6N_{6HYKDtsAtd%y?KbXCQR(sW8O(v_)kwYMz|(OW zsFz6A1^abSklOl`wLC-KYI8x=oMD^qZBs}}JVW@YY|3&k&IZ_n2Ia@5WiK>buV!E- zOsYcS4dFPE7vzj%_?5i2!XY`TiPd*jy>#C`i^XG8h?f35`=)s`0EhQBN!+YrXbpt( z-bwg_Jen`w<+6&B`hldU%rr&Xdgtze>rKuJ61AI12ja-eDZZX-+u1H>Sa|7pCine9 z&MEhmT7nq`P!pPK>l?I8cjuPpN<7(hqH~beChC*YMR+p;;@6#0j2k$=onUM`IXW3> z`dtX8`|@P|Ep-_0>)@&7@aLeg$jOd4G`eIW=^dQQ*^cgKeWAsSHOY?WEOsrtnG|^yeQ3lSd`pKAR}kzgIiEk@OvQb>DS*pGidh`E=BHYepHXbV)SV6pE2dx6 zkND~nK}2qjDVX3Z`H;2~lUvar>zT7u%x8LZa&rp7YH@n@GqQ65Cv+pkxI1OU6(g`b z?>)NcE7>j@p>V0mFk-5Rpi`W}oQ!tUU&Yn8m0OWYFj|~`?aVFOx;e`M)Q!YSokY)3 zV6l-;hK6?j=mp2#1e5cCn7P6n_7)n^+MdRw@5pvkOA>|&B8`QZ32|ynqaf}Kcdro= zzQchCYM0^)7$;m2iZnMbE$!}hwk&AVvN`iX3A9mB&`*BDmLV-m`OMvd`sJ?;%U`p~ zmwow{y6sPbcZNQPZ#GQS0&mzy?s%>_p>ZM|sCXVAUlST;rQ-3#Iu!-bpFSV4g7?-l zGfX>Z#hR+i;9B};^CO@7<<#MGFeY)SC&;a{!` zf;yaQo%{bjSa8KT~@?O$cK z(DGnm7w>cG1hH#*J%X}%Y%~+nLT*{aP08@l&Nu}>!-j|!8lSqt_xUNF+Y}SQmupyb zPua2PI;@1YaIsRF*knA^rJv84Tc=7?J2}!1kMfHSO$d$+PK*u?OI%=P7;`PHxMB0k zau~T0Wk)rPEGJ$NiXW~kfPA#m%Sr|7=$tHelF9A6rFLa$^g{6)8GSW*6}#~Zb^qk% zg=pLwC!SkY+&Gne((9`TCy`i`a#eCS{A2yMi>J>p*NS*!V~aAgK;wnSOHPULqzyj- z-q4BPXqXn))iRnMF*WZj17wUYjC!h43tI7uScHLf1|WJfA7^5O9`%lH>ga`cmpiz( zs|I8nTUD4?d{CQ-vwD!2uwGU_Ts&{1_mvqY`@A{j^b?n&WbPhb418NY1*Otz19`1w zc9rn?0e_*En&8?OWii89x+jaqRVzlL!QUCg^qU&+WERycV&1+fcsJ%ExEPjiQWRTU zCJpu*1dXyvrJJcH`+OKn7;q`X#@Gmy3U?5ZAV~mXjQhBJOCMw>o@2kznF>*?qOW;D z6!GTcM)P-OY-R`Yd>FeX%UyL%dY%~#^Yl!c42;**WqdGtGwTfB9{2mf2h@#M8YyY+!Q(4}X^+V#r zcZXYE$-hJyYzq%>$)k8vSQU` zIpxU*yy~naYp=IocRp5no^PeFROluibl( zmaKkWgSWZHn(`V_&?hM{%xl3TBWCcr59WlX6Q{j45)`A^-kUv4!qM=OdcwpsGB)l} z&-_U+8S8bQ!RDc&Y3~?w5NwLNstoUYqPYs(y+lj!HFqIZ7FA>WsxAE7vB=20K zn_&y{2)Uaw4b^NCFNhJXd&XrhA4E~zD7Ue7X^f98=&5!wn_r=6qAwDkd>g#2+*ahd zaV|_P_8e%jiHh7W;cl(d=&-r-C}_Ov?bts8s^rKUWQ|XkuW!ToSwe}Z{4|kl+q&&W zn%iW48c5*ft#*m)+xSps+j(B5bPh&u0&m6=@WgwBf_QfJJzg2Qdz89HwcV`5kZ#5z zw;W&H8>5R(>KRwvd0gh30wJHA>|2N(im;~wy1HTv_}Ue%qb)>5qL^$hIyPvoT(nk_<`7F;#nS8;q!cqKspvBc<%xMsQj*h|>`Z)F6LDxue@to))OIbs2X+zY2L9#2UNrR^)?c8&PFc?j*&Q-r|C%7a$)ZRQ->#|?rEj&M4spQfNt;J^ntwf(d+q;tt)C`d{*|t)czD4x-qw{Chm0vuKp8axqy5`Yz z1756|;JX1q(lEieR=uT;%havqflgv+`5i!Z`R}(JNV~&`x}I9Lmm;aB7Bnc^UC?>W zu)(J7@fs}pL=Y-4aLq&Z*lO$e^0(bOW z3gWbcvb^gjEfhV=6Lgu2aX{(zjq|NH*fSgm&kBj?6dFqD2MWk5@eHt@_&^ZTX$b?o}S<9BGaCZIm6Hz)Qkruacn!qv*>La|#%j*XFp(*;&v3h4 zcjPbZWzv|cOypb@XDnd}g%(@f7A>w2Nseo|{KdeVQu)mN=W=Q`N?ID%J_SXUr0Rl# z3X;tO*^?41^%c!H;ia@hX``kWS3TR|CJ4_9j-?l6RjC=n?}r&sr>m%58&~?$JJV6{ zDq5h#m4S_BPiibQQaPGg6LIHVCc`9w3^3ZVWP$n>p7 z5dIEH-W9e;$Id8>9?wh%WnWf>4^1U<%vn=<4oNFhVl9zVk+jn;WtQUQ)ZeEjKYy8C z3g#tIb28thR1nZdKrN}(r zJdy-Y3Rvr5D3D|msZbmE;FLePbiM0ZjwTIQQHk)8G+sB$iwmEa2kQv&9Vs9m#$_8j zNKz}(x$Wc(M)a9H-Pn?5(Lk-CmOS(&+EVLOfsiq>e3ru6P?Lp>FOwPt>0o=j8UyF^ zO{(vf#MGx^y~WaOKnt%I78s}60(O#jFx0^47^Ikh$QTar(Dg$c=0KR|rRD|6s zz?tEX0_=(Hm0jWl;QOu!-k)mV?^i(Etl=Lg-{ z0G}CBprLX60zgAUz-fS^&m#o;erEC5TU+mn_Wj(zL$zqMo!e`D>s7X&;E zFz}}}puI+c%xq0uTpWS3RBlIS2jH0)W(9FU1>6PLcj|6O>=y)l`*%P`6K4}U2p}a0 zvInj%$AmqzkNLy%azH|_f7x$lYxSG=-;7BViUN(&0HPUobDixM1RVBzWhv8LokKI2 zjDwvWu=S~8We)+K{oMd-_cuXNO&+{eUaA8Ope3MxME0?PD+0a)99N>WZ66*;sn(N++hjPyz5z0RC{- z$pcSs{|)~a_h?w)y}42A6fg|nRnYUjMaBqg=68&_K%h3eboQ=%i083nfIVZZ04qOp%d*)*hNJA_foPjiW z$1r8ZZiRSvJT3zhK>iR@8_+TTJ!tlNLdL`e0=yjzv3Ie80h#wSfS3$>DB!!@JHxNd z0Mvd0Vqq!zfDy$?goY+|h!e(n3{J2;Ag=b)eLq{F0W*O?j&@|882U5?hUVIw_v3aV8tMn`8jPa5pSxzaZe{z}z|}$zM$o=3-mQ0Zgd?ZtaI> zQVHP1W3v1lbw>|?z@2MO(Ex!5KybKQ@+JRAg1>nzpP-!@3!th3rV=o?eiZ~fQRWy_ zfA!U9^bUL+z_$VJI=ic;{epla<&J@W-QMPZm^kTQ8a^2TX^TDpza*^tOu!WZ=T!PT z+0lJ*HuRnNGobNk0PbPT?i;^h{&0u+-fejISNv#9&j~Ep2;dYspntgzwR6<$@0dTQ z!qLe3Ztc=Ozy!btCcx!G$U7FlBRe}-L(E|RpH%_gt4m_LJllX3!iRYJEPvxcJ>C76 zfBy0_zKaYn{3yG6@;}S&+BeJk5X}$Kchp<Ea-=>VDg&zi*8xM0-ya!{ zcDN@>%H#vMwugU&1KN9pqA6-?Q8N@Dz?VlJ3IDfz#i#_RxgQS*>K+|Q@bek+s7#Qk z(5NZ-4xs&$j)X=@(1(hLn)vPj&pP>Nyu)emQ1MW6)g0hqXa5oJ_slh@(5MMS4xnG= z{0aK#F@_p=e}FdAa3tEl!|+j?h8h`t0CvCmNU%dOwEq<+jmm-=n|r|G^7QX4N4o(v zPU!%%w(Cet)Zev3QA?;TMm_aEK!5(~Nc6pJlp|sQP@z%JI}f0_`u+rc`1Df^j0G&s ScNgau(U?ep-K_E5zy1%ZQTdPn diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradle/wrapper/gradle-wrapper.properties index 2b22d057a07..79eb9d003fe 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew b/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew old mode 100644 new mode 100755 index 65dcd68d65c..f5feea6d6b1 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,10 +85,9 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +134,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew.bat b/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew.bat index 93e3f59f135..9d21a21834d 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew.bat +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,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 +59,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/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines-postgres.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines-postgres.dockerfile index 0703722b599..dfcc87cb4bb 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines-postgres.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines-postgres.dockerfile @@ -1,10 +1,8 @@ -FROM gradle:7.6-jdk17 as gradle +FROM gradle:8.10.2-jdk17 as gradle WORKDIR /vertx-web-kotlin-coroutines -COPY gradle gradle COPY src src COPY build.gradle.kts build.gradle.kts COPY gradle.properties gradle.properties -COPY gradlew gradlew COPY settings.gradle.kts settings.gradle.kts RUN gradle shadowJar diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines.dockerfile index 5c9e6378404..dfcc87cb4bb 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/vertx-web-kotlin-coroutines.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:7.6-jdk17 as gradle +FROM gradle:8.10.2-jdk17 as gradle WORKDIR /vertx-web-kotlin-coroutines COPY src src COPY build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/vertx-web-kotlinx/README.md b/frameworks/Kotlin/vertx-web-kotlinx/README.md index 6c1d6caa252..b9fe8d87eef 100755 --- a/frameworks/Kotlin/vertx-web-kotlinx/README.md +++ b/frameworks/Kotlin/vertx-web-kotlinx/README.md @@ -2,7 +2,7 @@ Vert.x-Web in Kotlin with request handling implemented as much with official kotlinx libraries as possible. -Code is written from scratch to be as concise as possible with common code extracted into common (possibly inline) functions. SQL client implementation details and JVM Options are adapted referring to [the vertx-web portion](../../Java/vertx-web) and [the vertx portion](../../Java/vertx). All requests are handled in coroutines and suspend `await`s are used instead of future compositions. Compared to [the vertx-web-kotlin-coroutines portion](../vertx-web-kotlin-coroutines), besides adopting the Kotlinx libraries, this project simplifies the code by using more built-in Coroutine functions and avoids mutability as much as possible. JSON serialization is implemented with kotlinx.serialization and Fortunes with kotlinx.html. The benchmark is run on the latest LTS version of JVM, 17. +Code is written from scratch to be as concise as possible with common code extracted into common (possibly inline) functions. SQL client implementation details and JVM Options are adapted referring to [the vertx-web portion](../../Java/vertx-web) and [the vertx portion](../../Java/vertx). All requests are handled in coroutines and suspend `await`s are used instead of future compositions. Compared to [the vertx-web-kotlin-coroutines portion](../vertx-web-kotlin-coroutines), besides adopting the Kotlinx libraries, this project simplifies the code by using more built-in Coroutine functions and avoids mutability as much as possible. JSON serialization is implemented with kotlinx.serialization and Fortunes with kotlinx.html. The benchmark is run on the latest LTS version of JVM, 21. ## Test Type Implementation Source Code @@ -27,6 +27,7 @@ The tests were run with: * [Vert.x Reactive PostgreSQL Client](https://vertx.io/docs/vertx-pg-client/java/) * [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) +* [kotlinx-io](https://github.com/Kotlin/kotlinx-io) * [kotlinx.html](https://github.com/Kotlin/kotlinx.html) ## Test URLs diff --git a/frameworks/Kotlin/vertx-web-kotlinx/build.gradle.kts b/frameworks/Kotlin/vertx-web-kotlinx/build.gradle.kts index 232eadaf821..2e0035ab3e7 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/build.gradle.kts +++ b/frameworks/Kotlin/vertx-web-kotlinx/build.gradle.kts @@ -1,12 +1,9 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - tasks.wrapper { distributionType = Wrapper.DistributionType.ALL } plugins { - val kotlinVersion = "1.8.10" + val kotlinVersion = "2.0.21" kotlin("jvm") version kotlinVersion kotlin("plugin.serialization") version kotlinVersion application @@ -16,7 +13,8 @@ repositories { mavenCentral() } -val vertxVersion = "4.3.8" +val vertxVersion = "4.5.10" +val kotlinxSerializationVersion = "1.7.3" dependencies { implementation(platform("io.vertx:vertx-stack-depchain:$vertxVersion")) implementation("io.vertx:vertx-web") @@ -24,15 +22,20 @@ dependencies { implementation("io.netty", "netty-transport-native-epoll", classifier = "linux-x86_64") implementation("io.vertx:vertx-lang-kotlin") implementation("io.vertx:vertx-lang-kotlin-coroutines") + runtimeOnly("io.vertx:vertx-io_uring-incubator") + // This dependency has to be added for io_uring to work. + runtimeOnly("io.netty.incubator:netty-incubator-transport-native-io_uring:0.0.25.Final:linux-x86_64") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1") - implementation("org.jetbrains.kotlinx:kotlinx-html:0.8.0") - //implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") -} + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0") -tasks.withType { - compilerOptions.jvmTarget.set(JvmTarget.JVM_17) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxSerializationVersion") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-io:$kotlinxSerializationVersion") + implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.5.4") + + implementation("org.jetbrains.kotlinx:kotlinx-html:0.11.0") + //implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") // the latest version is 0.6.1 } +kotlin.jvmToolchain(21) + application.mainClass.set("MainKt") diff --git a/frameworks/Kotlin/vertx-web-kotlinx/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/vertx-web-kotlinx/gradle/wrapper/gradle-wrapper.jar index ccebba7710deaf9f98673a68957ea02138b60d0a..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 61608 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 diff --git a/frameworks/Kotlin/vertx-web-kotlinx/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/vertx-web-kotlinx/gradle/wrapper/gradle-wrapper.properties index 284897427bc..79eb9d003fe 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/vertx-web-kotlinx/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/vertx-web-kotlinx/gradlew b/frameworks/Kotlin/vertx-web-kotlinx/gradlew index 79a61d421cc..f5feea6d6b1 100755 --- a/frameworks/Kotlin/vertx-web-kotlinx/gradlew +++ b/frameworks/Kotlin/vertx-web-kotlinx/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,10 +85,9 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +134,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/frameworks/Kotlin/vertx-web-kotlinx/gradlew.bat b/frameworks/Kotlin/vertx-web-kotlinx/gradlew.bat index 93e3f59f135..9d21a21834d 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/gradlew.bat +++ b/frameworks/Kotlin/vertx-web-kotlinx/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,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 +59,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/vertx-web-kotlinx/src/main/kotlin/KotlinxIo.kt b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/KotlinxIo.kt new file mode 100644 index 00000000000..6427b91e85e --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/KotlinxIo.kt @@ -0,0 +1,47 @@ +import io.vertx.core.streams.WriteStream +import io.vertx.kotlin.coroutines.coAwait +import kotlinx.coroutines.runBlocking +import kotlinx.io.RawSink +import kotlinx.io.readByteArray +import io.vertx.core.buffer.Buffer as VertxBuffer +import kotlinx.io.Buffer as KotlinxIoBuffer + +@Suppress("NOTHING_TO_INLINE") +private inline fun Long.toIntOrThrow(): Int { + require(this in Int.MIN_VALUE.toLong()..Int.MAX_VALUE.toLong()) + return toInt() +} + +@JvmInline +value class VertxBufferWriteStreamRawSink(val writeStream: WriteStream) : RawSink { + override fun write(source: KotlinxIoBuffer, byteCount: Long) { + runBlocking { + writeStream.write(VertxBuffer.buffer(source.readByteArray(byteCount.toIntOrThrow()))).coAwait() + } + } + + override fun flush() {} + + override fun close() { + writeStream.end() + } +} + +// not used currently +fun WriteStream.toRawSink(): RawSink = + VertxBufferWriteStreamRawSink(this) + + +@JvmInline +value class VertxBufferRawSink(val vertxBuffer: VertxBuffer) : RawSink { + override fun write(source: KotlinxIoBuffer, byteCount: Long) { + vertxBuffer.appendBytes(source.readByteArray(byteCount.toIntOrThrow())) + } + + override fun flush() {} + + override fun close() {} +} + +fun VertxBuffer.toRawSink(): RawSink = + VertxBufferRawSink(this) diff --git a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Main.kt b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Main.kt index 75cbd79e3cd..987c22162b3 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Main.kt +++ b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Main.kt @@ -2,10 +2,10 @@ import io.vertx.core.Vertx import io.vertx.core.impl.cpu.CpuCoreSensor import io.vertx.kotlin.core.deploymentOptionsOf import io.vertx.kotlin.core.vertxOptionsOf -import io.vertx.kotlin.coroutines.await +import io.vertx.kotlin.coroutines.coAwait import java.util.logging.Logger -const val SERVER_NAME = "Vert.x-Web Kotlinx Benchmark" +const val SERVER_NAME = "Vert.x-Web Kotlinx Benchmark server" val logger = Logger.getLogger("Vert.x-Web Kotlinx Benchmark") suspend fun main(args: Array) { @@ -19,6 +19,6 @@ suspend fun main(args: Array) { it.printStackTrace() } vertx.deployVerticle({ MainVerticle(hasDb) }, deploymentOptionsOf(instances = CpuCoreSensor.availableProcessors())) - .await() + .coAwait() logger.info("$SERVER_NAME started.") } diff --git a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt index 9d16710709e..2bd701fa083 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt +++ b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt @@ -1,4 +1,5 @@ import io.netty.channel.unix.Errors.NativeIoException +import io.vertx.core.buffer.Buffer import io.vertx.core.http.HttpHeaders import io.vertx.core.http.HttpServer import io.vertx.core.http.HttpServerRequest @@ -7,39 +8,28 @@ import io.vertx.ext.web.Route import io.vertx.ext.web.Router import io.vertx.ext.web.RoutingContext import io.vertx.kotlin.core.http.httpServerOptionsOf +import io.vertx.kotlin.coroutines.CoroutineRouterSupport import io.vertx.kotlin.coroutines.CoroutineVerticle -import io.vertx.kotlin.coroutines.await +import io.vertx.kotlin.coroutines.coAwait import io.vertx.kotlin.pgclient.pgConnectOptionsOf import io.vertx.pgclient.PgConnection import io.vertx.sqlclient.PreparedQuery import io.vertx.sqlclient.Row import io.vertx.sqlclient.RowSet import io.vertx.sqlclient.Tuple -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers import kotlinx.html.* import kotlinx.html.stream.appendHTML +import kotlinx.io.buffered +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString +import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.json.Json -import java.net.SocketException +import kotlinx.serialization.json.io.encodeToSink import java.time.ZonedDateTime import java.time.format.DateTimeFormatter -class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { - inline fun Route.checkedCoroutineHandlerUnconfined(crossinline requestHandler: suspend (RoutingContext) -> Unit): Route = - handler { ctx -> - /* Some conclusions from the Plaintext test results with trailing `await()`s: - 1. `launch { /*...*/ }` < `launch(start = CoroutineStart.UNDISPATCHED) { /*...*/ }` < `launch(Dispatchers.Unconfined) { /*...*/ }`. - 1. `launch { /*...*/ }` without `context` or `start` lead to `io.netty.channel.StacklessClosedChannelException` and `io.netty.channel.unix.Errors$NativeIoException: sendAddress(..) failed: Connection reset by peer`. */ - launch(Dispatchers.Unconfined) { - try { - requestHandler(ctx) - } catch (t: Throwable) { - ctx.fail(t) - } - } - } - +class MainVerticle(val hasDb: Boolean) : CoroutineVerticle(), CoroutineRouterSupport { // `PgConnection`s as used in the "vertx" portion offers better performance than `PgPool`s. lateinit var pgConnection: PgConnection lateinit var date: String @@ -68,7 +58,7 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { cachePreparedStatements = true, pipeliningLimit = 100000 ) - ).await() + ).coAwait() selectWorldQuery = pgConnection.preparedQuery(SELECT_WORLD_SQL) selectFortuneQuery = pgConnection.preparedQuery(SELECT_FORTUNE_SQL) @@ -81,15 +71,19 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { .requestHandler(Router.router(vertx).apply { routes() }) .exceptionHandler { // wrk resets the connections when benchmarking is finished. - if ((it is NativeIoException && it.message == "recvAddress(..) failed: Connection reset by peer") - || (it is SocketException && it.message == "Connection reset") + if ( + // for epoll + /*(it is NativeIoException && it.message == "recvAddress(..) failed: Connection reset by peer") + || (it is SocketException && it.message == "Connection reset")*/ + // for io_uring + it is NativeIoException && it.message == "io_uring read(..) failed: Connection reset by peer" ) return@exceptionHandler logger.info("Exception in HttpServer: $it") it.printStackTrace() } - .listen().await() + .listen().coAwait() } @@ -110,14 +104,46 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { putHeader(HttpHeaders.CONTENT_TYPE, "application/json") } - inline fun Route.jsonResponseHandler(crossinline requestHandler: suspend (RoutingContext) -> @Serializable T) = - checkedCoroutineHandlerUnconfined { + + fun Route.coHandlerUnconfined(requestHandler: suspend (RoutingContext) -> Unit): Route = + /* Some conclusions from the Plaintext test results with trailing `await()`s: + 1. `launch { /*...*/ }` < `launch(start = CoroutineStart.UNDISPATCHED) { /*...*/ }` < `launch(Dispatchers.Unconfined) { /*...*/ }`. + 1. `launch { /*...*/ }` without `context` or `start` lead to `io.netty.channel.StacklessClosedChannelException` and `io.netty.channel.unix.Errors$NativeIoException: sendAddress(..) failed: Connection reset by peer`. */ + coHandler(Dispatchers.Unconfined, requestHandler) + + inline fun Route.jsonResponseCoHandler( + serializer: SerializationStrategy, + crossinline requestHandler: suspend (RoutingContext) -> @Serializable T + ) = + coHandlerUnconfined { it.response().run { putJsonResponseHeader() - end(Json.encodeToString(requestHandler(it)))/*.await()*/ + + /* + // approach 1 + end(Json.encodeToString(serializer, requestHandler(it)))/*.coAwait()*/ + */ + + /* + // approach 2 + // java.lang.IllegalStateException: You must set the Content-Length header to be the total size of the message body BEFORE sending any data if you are not using HTTP chunked encoding. + toRawSink().buffered().use { bufferedSink -> + @OptIn(ExperimentalSerializationApi::class) + Json.encodeToSink(serializer, requestHandler(it), bufferedSink) + } + */ + + // approach 3 + end(Buffer.buffer().apply { + toRawSink().buffered().use { bufferedSink -> + @OptIn(ExperimentalSerializationApi::class) + Json.encodeToSink(serializer, requestHandler(it), bufferedSink) + } + }) } } + suspend fun selectRandomWorlds(queries: Int): List { val rowSets = List(queries) { selectWorldQuery.execute(Tuple.of(randomIntBetween1And10000())) @@ -126,23 +152,23 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { } fun Router.routes() { - get("/json").jsonResponseHandler { + get("/json").jsonResponseCoHandler(Serializers.message) { jsonSerializationMessage } - get("/db").jsonResponseHandler { - val rowSet = selectWorldQuery.execute(Tuple.of(randomIntBetween1And10000())).await() + get("/db").jsonResponseCoHandler(Serializers.world) { + val rowSet = selectWorldQuery.execute(Tuple.of(randomIntBetween1And10000())).coAwait() rowSet.single().toWorld() } - get("/queries").jsonResponseHandler { + get("/queries").jsonResponseCoHandler(Serializers.worlds) { val queries = it.request().getQueries() selectRandomWorlds(queries) } - get("/fortunes").checkedCoroutineHandlerUnconfined { + get("/fortunes").coHandlerUnconfined { val fortunes = mutableListOf() - selectFortuneQuery.execute().await() + selectFortuneQuery.execute().coAwait() .mapTo(fortunes) { it.toFortune() } fortunes.add(Fortune(0, "Additional fortune added at request time.")) @@ -173,11 +199,11 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { it.response().run { putCommonHeaders() putHeader(HttpHeaders.CONTENT_TYPE, "text/html; charset=utf-8") - end(htmlString)/*.await()*/ + end(htmlString)/*.coAwait()*/ } } - get("/updates").jsonResponseHandler { + get("/updates").jsonResponseCoHandler(Serializers.worlds) { val queries = it.request().getQueries() val worlds = selectRandomWorlds(queries) val updatedWorlds = worlds.map { it.copy(randomNumber = randomIntBetween1And10000()) } @@ -185,7 +211,7 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { // Approach 1 // The updated worlds need to be sorted first to avoid deadlocks. updateWordQuery - .executeBatch(updatedWorlds.sortedBy { it.id }.map { Tuple.of(it.randomNumber, it.id) }).await() + .executeBatch(updatedWorlds.sortedBy { it.id }.map { Tuple.of(it.randomNumber, it.id) }).coAwait() /* // Approach 2, worse performance @@ -197,11 +223,11 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle() { updatedWorlds } - get("/plaintext").checkedCoroutineHandlerUnconfined { + get("/plaintext").coHandlerUnconfined { it.response().run { putCommonHeaders() putHeader(HttpHeaders.CONTENT_TYPE, "text/plain") - end("Hello, World!")/*.await()*/ + end("Hello, World!")/*.coAwait()*/ } } } diff --git a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Serializers.kt b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Serializers.kt new file mode 100644 index 00000000000..c975fc07fdd --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Serializers.kt @@ -0,0 +1,7 @@ +import kotlinx.serialization.serializer + +object Serializers { + val message = serializer() + val world = serializer() + val worlds = serializer>() +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/VertxCoroutine.kt b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/VertxCoroutine.kt index bb8d419d399..d6230fef7f7 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/VertxCoroutine.kt +++ b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/VertxCoroutine.kt @@ -1,6 +1,5 @@ -import io.vertx.core.CompositeFuture import io.vertx.core.Future -import io.vertx.kotlin.coroutines.await +import io.vertx.kotlin.coroutines.coAwait suspend fun List>.awaitAll(): List = - CompositeFuture.all(this).await().list() + Future.all(this).coAwait().list() diff --git a/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx-postgresql.dockerfile b/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx-postgresql.dockerfile index 55c7c2c6803..17b43ebcb5c 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx-postgresql.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx-postgresql.dockerfile @@ -1,12 +1,11 @@ -FROM gradle:8.0-jdk17 +FROM gradle:8.10.2-jdk21 WORKDIR /vertx-web-kotlinx COPY build.gradle.kts build.gradle.kts COPY settings.gradle.kts settings.gradle.kts COPY gradle.properties gradle.properties COPY src src -RUN gradle assembleDist -RUN tar -xf build/distributions/vertx-web-kotlinx-benchmark.tar +RUN gradle --no-daemon installDist EXPOSE 8080 @@ -25,4 +24,4 @@ CMD export JAVA_OPTS=" \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ " && \ - vertx-web-kotlinx-benchmark/bin/vertx-web-kotlinx-benchmark true + build/install/vertx-web-kotlinx-benchmark/bin/vertx-web-kotlinx-benchmark true diff --git a/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx.dockerfile b/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx.dockerfile index 63d2d4a68ad..4bdc993707d 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlinx/vertx-web-kotlinx.dockerfile @@ -1,12 +1,11 @@ -FROM gradle:8.0-jdk17 +FROM gradle:8.10.2-jdk21 WORKDIR /vertx-web-kotlinx COPY build.gradle.kts build.gradle.kts COPY settings.gradle.kts settings.gradle.kts COPY gradle.properties gradle.properties COPY src src -RUN gradle assembleDist -RUN tar -xf build/distributions/vertx-web-kotlinx-benchmark.tar +RUN gradle --no-daemon installDist EXPOSE 8080 @@ -25,4 +24,4 @@ CMD export JAVA_OPTS=" \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ " && \ - vertx-web-kotlinx-benchmark/bin/vertx-web-kotlinx-benchmark false + build/install/vertx-web-kotlinx-benchmark/bin/vertx-web-kotlinx-benchmark false From 59df50871130a25ad4b176dceca7e60b99591fba Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 4 Nov 2024 19:42:27 +0100 Subject: [PATCH 0886/1766] [ruby/rack] Use java_tune.sh script for rack-jruby (#9372) This should improve `rack-jruby` performance. Also remove `java_tune.sh` from frameworks that no longer test with JRuby. --- .../{rack-sequel => rack}/config/java_tune.sh | 0 frameworks/Ruby/rack/rack-jruby.dockerfile | 2 ++ .../Ruby/sinatra-sequel/config/java_tune.sh | 18 ------------------ 3 files changed, 2 insertions(+), 18 deletions(-) rename frameworks/Ruby/{rack-sequel => rack}/config/java_tune.sh (100%) delete mode 100644 frameworks/Ruby/sinatra-sequel/config/java_tune.sh diff --git a/frameworks/Ruby/rack-sequel/config/java_tune.sh b/frameworks/Ruby/rack/config/java_tune.sh similarity index 100% rename from frameworks/Ruby/rack-sequel/config/java_tune.sh rename to frameworks/Ruby/rack/config/java_tune.sh diff --git a/frameworks/Ruby/rack/rack-jruby.dockerfile b/frameworks/Ruby/rack/rack-jruby.dockerfile index ab06ae132ed..c280cca6ac8 100644 --- a/frameworks/Ruby/rack/rack-jruby.dockerfile +++ b/frameworks/Ruby/rack/rack-jruby.dockerfile @@ -13,4 +13,6 @@ COPY . . EXPOSE 8080 +CMD config/java_tune.sh + CMD bundle exec puma -C config/puma.rb -b tcp://0.0.0.0:8080 -e production diff --git a/frameworks/Ruby/sinatra-sequel/config/java_tune.sh b/frameworks/Ruby/sinatra-sequel/config/java_tune.sh deleted file mode 100644 index 412b1e74fdc..00000000000 --- a/frameworks/Ruby/sinatra-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 fb4a84fbcd7ed849e8f7d1eb0b315fb33578d436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Tue, 5 Nov 2024 02:42:55 +0800 Subject: [PATCH 0887/1766] [java] Add solon-vertx (#9371) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Version To 2.9.2 * Add Solon-Virtual * Remove solon-virtual * Update Solon Version To 3.0.2 * Add Solon-Vertx * Tweak description * Tweak the dockerfile * Tweak the dockerfile * Tweak config * Tweak dockefile name * Add FilterImpl * Add FilterImpl * The json plugin is changed to jackson * Update Solon Jdk To 23 * Update Solon-Vertx Jdk To 23 * Solon-vertx is restored to jdk 21 * Solon is restored to jdk 21 * Solon-vertx adjusts the Date output format * Solon is restored to jdk 21 --- frameworks/Java/solon-vertx/README.md | 23 +++++++ .../Java/solon-vertx/benchmark_config.json | 26 ++++++++ frameworks/Java/solon-vertx/config.toml | 15 +++++ frameworks/Java/solon-vertx/pom.xml | 61 +++++++++++++++++++ .../Java/solon-vertx/solon-vertx.dockerfile | 13 ++++ .../solon-vertx/src/main/java/hello/Main.java | 13 ++++ .../java/hello/controller/FilterImpl.java | 23 +++++++ .../hello/controller/HelloController.java | 25 ++++++++ .../src/main/java/hello/model/Message.java | 21 +++++++ .../src/main/resources/app.properties | 1 + frameworks/Java/solon/pom.xml | 2 +- 11 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 frameworks/Java/solon-vertx/README.md create mode 100644 frameworks/Java/solon-vertx/benchmark_config.json create mode 100644 frameworks/Java/solon-vertx/config.toml create mode 100644 frameworks/Java/solon-vertx/pom.xml create mode 100644 frameworks/Java/solon-vertx/solon-vertx.dockerfile create mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/Main.java create mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java create mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java create mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java create mode 100644 frameworks/Java/solon-vertx/src/main/resources/app.properties diff --git a/frameworks/Java/solon-vertx/README.md b/frameworks/Java/solon-vertx/README.md new file mode 100644 index 00000000000..40b8ab3b2cf --- /dev/null +++ b/frameworks/Java/solon-vertx/README.md @@ -0,0 +1,23 @@ +# solon-vertx Benchmarking Test + + +This is the solon-vertx portion of a [benchmarking test suite](../) comparing a variety of web development platforms. + +### JSON Encoding Test +* [JSON test source](src/main/java/hello/Main.java) +* [Plaintext test source](src/main/java/hello/Main.java) + +## Versions + +* [Java OpenJDK 21](http://openjdk.java.net/) +* [solon 3.0.2](https://github.com/noear/solon) + +## Test URLs + +### JSON Encoding Test + + http://localhost:8080/json + +### Plaintext Encoding Test + + http://localhost:8080/plaintext \ No newline at end of file diff --git a/frameworks/Java/solon-vertx/benchmark_config.json b/frameworks/Java/solon-vertx/benchmark_config.json new file mode 100644 index 00000000000..3b7de26f5d4 --- /dev/null +++ b/frameworks/Java/solon-vertx/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "solon-vertx", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "None", + "framework": "solon", + "language": "Java", + "flavor": "None", + "orm": "Micro", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "solon-vertx", + "notes": "", + "versus": "solon" + } + } + ] +} diff --git a/frameworks/Java/solon-vertx/config.toml b/frameworks/Java/solon-vertx/config.toml new file mode 100644 index 00000000000..8306ab94cd1 --- /dev/null +++ b/frameworks/Java/solon-vertx/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "solon-vertx" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Micro" +platform = "Netty" +webserver = "None" +versus = "solon" diff --git a/frameworks/Java/solon-vertx/pom.xml b/frameworks/Java/solon-vertx/pom.xml new file mode 100644 index 00000000000..2546baecf35 --- /dev/null +++ b/frameworks/Java/solon-vertx/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + + + org.noear + solon-parent + 3.0.2 + + + hello + hello-solon + 1.0 + jar + + + 21 + + + + + org.noear + solon-boot-vertx + + + + org.noear + solon-serialization-jackson + + + + + ${project.artifactId} + + + + org.apache.maven.plugins + maven-assembly-plugin + + + jar-with-dependencies + + + + hello.Main + + + + + + make-assembly + package + + single + + + + + + + diff --git a/frameworks/Java/solon-vertx/solon-vertx.dockerfile b/frameworks/Java/solon-vertx/solon-vertx.dockerfile new file mode 100644 index 00000000000..c387938661c --- /dev/null +++ b/frameworks/Java/solon-vertx/solon-vertx.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3.9.7-amazoncorretto-21 as maven +WORKDIR /solon +COPY pom.xml pom.xml +COPY src src +RUN mvn compile assembly:single -q + +FROM openjdk:21-jdk-slim +WORKDIR /solon +COPY --from=maven /solon/target/hello-solon.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-cp", "app.jar", "hello.Main"] \ No newline at end of file diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/Main.java b/frameworks/Java/solon-vertx/src/main/java/hello/Main.java new file mode 100644 index 00000000000..bc6467e87af --- /dev/null +++ b/frameworks/Java/solon-vertx/src/main/java/hello/Main.java @@ -0,0 +1,13 @@ +package hello; + +import org.noear.solon.Solon; + +/** + * @author noear + * @version V1.0 + */ +public class Main { + public static void main(String[] args) { + Solon.start(Main.class, args); + } +} diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java b/frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java new file mode 100644 index 00000000000..7fb22e497f8 --- /dev/null +++ b/frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java @@ -0,0 +1,23 @@ +package hello.controller; + +import org.noear.solon.annotation.Component; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Filter; +import org.noear.solon.core.handle.FilterChain; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class FilterImpl implements Filter { + private static DateFormat DATE_FORMAT = new SimpleDateFormat("EEE, d MMM yyyyy HH:mm:ss z"); + + @Override + public void doFilter(Context ctx, FilterChain chain) throws Throwable { + String dateString = DATE_FORMAT.format(new Date()); + ctx.headerSet("Date", dateString); + ctx.headerSet("Server", "solon-boot-vertx"); + chain.doFilter(ctx); + } +} diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java b/frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java new file mode 100644 index 00000000000..77049043e97 --- /dev/null +++ b/frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java @@ -0,0 +1,25 @@ +package hello.controller; + +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Get; +import org.noear.solon.annotation.Mapping; +import hello.model.Message; + +/** + * @author noear + * @version V1.0 + */ +@Controller +public class HelloController { + @Get + @Mapping("plaintext") + public String plaintext() { + return "Hello, World!"; + } + + @Get + @Mapping("json") + public Message json() { + return new Message("Hello, World!"); + } +} diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java b/frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java new file mode 100644 index 00000000000..235dd2d86dd --- /dev/null +++ b/frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java @@ -0,0 +1,21 @@ +package hello.model; + +/** + * @author noear + * @version V1.0 + */ +public class Message { + private String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/frameworks/Java/solon-vertx/src/main/resources/app.properties b/frameworks/Java/solon-vertx/src/main/resources/app.properties new file mode 100644 index 00000000000..26a5df70351 --- /dev/null +++ b/frameworks/Java/solon-vertx/src/main/resources/app.properties @@ -0,0 +1 @@ +server.http.ioBound=false \ No newline at end of file diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index 0c9d8d570ce..428d95b35b7 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -25,7 +25,7 @@ org.noear - solon-serialization-snack3 + solon-serialization-jackson From 180eba8f3a766202bc5c7d0a2e59a78db5a4971c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 4 Nov 2024 19:46:04 +0100 Subject: [PATCH 0888/1766] [crystal/kemal] Update crystal and Kemal (#9368) --- frameworks/Crystal/kemal/kemal.dockerfile | 2 +- frameworks/Crystal/kemal/shard.lock | 2 +- frameworks/Crystal/kemal/shard.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Crystal/kemal/kemal.dockerfile b/frameworks/Crystal/kemal/kemal.dockerfile index baafb59538e..d5890857891 100644 --- a/frameworks/Crystal/kemal/kemal.dockerfile +++ b/frameworks/Crystal/kemal/kemal.dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.12.1 +FROM crystallang/crystal:1.14.0 WORKDIR /kemal COPY views views diff --git a/frameworks/Crystal/kemal/shard.lock b/frameworks/Crystal/kemal/shard.lock index c7bf83e3078..9340b31d88b 100644 --- a/frameworks/Crystal/kemal/shard.lock +++ b/frameworks/Crystal/kemal/shard.lock @@ -18,7 +18,7 @@ shards: kemal: git: https://github.com/kemalcr/kemal.git - version: 1.5.0 + version: 1.6.0 pg: git: https://github.com/will/crystal-pg.git diff --git a/frameworks/Crystal/kemal/shard.yml b/frameworks/Crystal/kemal/shard.yml index 2277be2b8b7..6ab59c26264 100644 --- a/frameworks/Crystal/kemal/shard.yml +++ b/frameworks/Crystal/kemal/shard.yml @@ -9,7 +9,7 @@ dependencies: version: 0.28.0 kemal: github: kemalcr/kemal - version: 1.5.0 + version: 1.6.0 redis: github: stefanwille/crystal-redis version: 2.8.0 From 09bd0281be2c77dcc0a1a1e06f300803c182e6ad Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 4 Nov 2024 19:46:25 +0100 Subject: [PATCH 0889/1766] [ruby] Update Passenger 6.0.23 and run on ruby:3.4-rc (#9366) --- frameworks/Ruby/rack-sequel/Gemfile | 17 +++++++++-------- frameworks/Ruby/rack-sequel/README.md | 2 +- .../rack-sequel-passenger-mri.dockerfile | 2 +- ...ack-sequel-postgres-passenger-mri.dockerfile | 2 +- frameworks/Ruby/roda-sequel/Gemfile | 1 + frameworks/Ruby/roda-sequel/README.md | 2 +- ...oda-sequel-postgres-passenger-mri.dockerfile | 2 +- ...tra-sequel-postgres-passenger-mri.dockerfile | 2 +- .../sinatra-postgres-passenger-mri.dockerfile | 2 +- 9 files changed, 17 insertions(+), 15 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 22e0dd418b8..12b60ef57cf 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -1,20 +1,21 @@ source 'https://rubygems.org' +gem 'base64' # required by passenger on Ruby 3.4 gem 'json', '~> 2.0' gem 'oj', '~> 3.14', platforms: %i[ruby mswin] -gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false -gem 'puma', '~> 6.4', :require=>false +gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false +gem 'puma', '~> 6.4', require: false gem 'sequel', '~> 5.0' gem 'rack', '~> 3.0' -gem 'unicorn', '~> 6.1', :platforms=>[:ruby, :mswin], :require=>false +gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false group :mysql do - gem 'jdbc-mysql', '~> 5.1', :platforms=>:jruby, :require=>'jdbc/mysql' - gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] + gem 'jdbc-mysql', '~> 5.1', platforms: :jruby, require: 'jdbc/mysql' + gem 'mysql2', '~> 0.4', platforms: [:ruby, :mswin] end group :postgresql do - gem 'jdbc-postgres', '~> 9.4', :platforms=>:jruby, :require=>'jdbc/postgres' - gem 'pg', '~> 1.5', :platforms=>[:ruby, :mswin] - gem 'sequel_pg', '~> 1.6', :platforms=>:ruby, :require=>false + gem 'jdbc-postgres', '~> 9.4', platforms: :jruby, require: 'jdbc/postgres' + gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] + gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false end diff --git a/frameworks/Ruby/rack-sequel/README.md b/frameworks/Ruby/rack-sequel/README.md index 11563d8ffeb..b3a02d90b91 100644 --- a/frameworks/Ruby/rack-sequel/README.md +++ b/frameworks/Ruby/rack-sequel/README.md @@ -14,7 +14,7 @@ The tests will be run with: * [Ruby 3.3](http://www.ruby-lang.org) * [Puma 6](http://puma.io) -* [Passenger 5](https://www.phusionpassenger.com) +* [Passenger 6](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) * [Rack 2](http://rack.rubyforge.org) * [Sequel 5](http://sequel.jeremyevans.net) diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index 9482a004540..c0de276d2ce 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 +FROM ruby:3.4-rc 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 2765c0c4f89..0346a44eb1b 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 +FROM ruby:3.4-rc ADD ./ /rack-sequel diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index e511bb3d848..c5dd09c3375 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -1,5 +1,6 @@ source "https://rubygems.org" +gem 'base64' # required by passenger on Ruby 3.4 gem "erubi", "~> 1.12" gem "passenger", "~> 6.0", platforms: %i[ruby mswin], require: false gem "puma", "~> 6.2", require: false diff --git a/frameworks/Ruby/roda-sequel/README.md b/frameworks/Ruby/roda-sequel/README.md index 1ca9c7b55a9..a409974a10f 100644 --- a/frameworks/Ruby/roda-sequel/README.md +++ b/frameworks/Ruby/roda-sequel/README.md @@ -14,7 +14,7 @@ The tests will be run with: * [Ruby 3.3](http://www.ruby-lang.org) * [Puma 6](http://puma.io) -* [Passenger 5](https://www.phusionpassenger.com) +* [Passenger 6](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) * [Roda 3](http://roda.jeremyevans.net) * [Sequel 5](http://sequel.jeremyevans.net) 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 b3f87e9c742..e060497ea57 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 +FROM ruby:3.4-rc ADD ./ /roda-sequel WORKDIR /roda-sequel 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 5651c491808..a7080367514 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 +FROM ruby:3.4-rc 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 2a09b22aeba..5d1f93bcb10 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 +FROM ruby:3.4-rc ENV RUBY_YJIT_ENABLE=1 From 7a110fbf19c66af2d3bcf6b3f9f4be8efc2f7d22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 10:47:48 -0800 Subject: [PATCH 0890/1766] Bump io.undertow:undertow-core in /frameworks/Java/light-java (#9365) Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.15.Final to 2.3.17.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.15.Final...2.3.17.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- 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 787dc1253bb..bead4b9f0e9 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -25,7 +25,7 @@ 11 2.0.1 1.3.12 - 2.3.15.Final + 2.3.17.Final 3.3.1 8.0.28 42.7.2 From 67f6e4a9ecf60f7c06d16e6ffded5c181560c80c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 23:48:16 +0000 Subject: [PATCH 0891/1766] Bump github.com/golang-jwt/jwt/v4 in /frameworks/Go/goravel/src/gin Bumps [github.com/golang-jwt/jwt/v4](https://github.com/golang-jwt/jwt) from 4.5.0 to 4.5.1. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v4.5.0...v4.5.1) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/goravel/src/gin/go.mod | 2 +- frameworks/Go/goravel/src/gin/go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frameworks/Go/goravel/src/gin/go.mod b/frameworks/Go/goravel/src/gin/go.mod index 93ac7f3ec4e..e010a6645c6 100644 --- a/frameworks/Go/goravel/src/gin/go.mod +++ b/frameworks/Go/goravel/src/gin/go.mod @@ -65,7 +65,7 @@ require ( github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang-migrate/migrate/v4 v4.17.1 // indirect github.com/golang-module/carbon/v2 v2.3.12 // indirect diff --git a/frameworks/Go/goravel/src/gin/go.sum b/frameworks/Go/goravel/src/gin/go.sum index 92b222fbcbb..fefa43c5558 100644 --- a/frameworks/Go/goravel/src/gin/go.sum +++ b/frameworks/Go/goravel/src/gin/go.sum @@ -287,8 +287,9 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= From cb32cca9ce6926cb7913b6d2d380d199b8fb0666 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 18:04:37 +0000 Subject: [PATCH 0892/1766] Bump org.hibernate.validator:hibernate-validator Bumps [org.hibernate.validator:hibernate-validator](https://github.com/hibernate/hibernate-validator) from 6.0.20.Final to 6.2.0.Final. - [Changelog](https://github.com/hibernate/hibernate-validator/blob/6.2.0.Final/changelog.txt) - [Commits](https://github.com/hibernate/hibernate-validator/compare/6.0.20.Final...6.2.0.Final) --- updated-dependencies: - dependency-name: org.hibernate.validator:hibernate-validator dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/ninja-standalone/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/ninja-standalone/pom.xml b/frameworks/Java/ninja-standalone/pom.xml index b4af584038f..1c3aaafb7ee 100644 --- a/frameworks/Java/ninja-standalone/pom.xml +++ b/frameworks/Java/ninja-standalone/pom.xml @@ -20,7 +20,7 @@ 2.2.220 5.4.24.Final - 6.0.20.Final + 6.2.0.Final 2.3.0 9.4.18.v20190429 8.0.28 From 10d4b281ca9b483f9fad980bea4b573decc0f855 Mon Sep 17 00:00:00 2001 From: redkale Date: Sat, 9 Nov 2024 09:40:52 +0800 Subject: [PATCH 0893/1766] Update redkale-pgclient --- frameworks/Java/redkale/redkale-pgclient.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/redkale/redkale-pgclient.dockerfile b/frameworks/Java/redkale/redkale-pgclient.dockerfile index af47b952c72..761368ba604 100644 --- a/frameworks/Java/redkale/redkale-pgclient.dockerfile +++ b/frameworks/Java/redkale/redkale-pgclient.dockerfile @@ -12,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dvertx.disableURIValidation=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file From 75844297ee70379ecd306da382c3de5671eded84 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Mon, 11 Nov 2024 14:00:19 +0800 Subject: [PATCH 0894/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 4 ++-- .../src/main/java/org/smartboot/http/JsonUtil.java | 2 +- .../main/java/org/smartboot/servlet/Bootstrap.java | 12 ++++++++---- .../org/smartboot/servlet/HelloWorldServlet.java | 9 +++++---- .../main/java/org/smartboot/servlet/JsonServlet.java | 8 ++++---- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 239721f8cba..39a47cc3c1e 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 1.5-SNAPSHOT + 2.3 5.0.0 0.9.23 @@ -23,7 +23,7 @@ 0.1-SNAPSHOT - org.smartboot.servlet + tech.smartboot.servlet servlet-core ${smartservlet.version} 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 5c46d0ca5ef..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 @@ -4,9 +4,9 @@ import com.jsoniter.output.JsonStreamPool; import com.jsoniter.spi.JsonException; 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; /** 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 b6691bfd359..f4458e0a6e6 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 @@ -1,10 +1,14 @@ package org.smartboot.servlet; + import org.smartboot.http.server.HttpBootstrap; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; import org.smartboot.http.server.HttpServerHandler; -import org.smartboot.servlet.conf.ServletInfo; +import tech.smartboot.servlet.Container; +import tech.smartboot.servlet.ServletContextRuntime; +import tech.smartboot.servlet.conf.ServletInfo; +import tech.smartboot.servlet.conf.ServletMappingInfo; import java.util.concurrent.CompletableFuture; @@ -15,7 +19,7 @@ public class Bootstrap { public static void main(String[] args) throws Throwable { - ContainerRuntime containerRuntime = new ContainerRuntime(); + Container containerRuntime = new Container(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); applicationRuntime.setVendorProvider(response -> { @@ -24,15 +28,15 @@ public static void main(String[] args) throws Throwable { ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); - plainTextServletInfo.addMapping("/plaintext"); + applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(plainTextServletInfo.getServletName(), "/plaintext")); applicationRuntime.getDeploymentInfo().addServlet(plainTextServletInfo); // json ServletInfo jsonServletInfo = new ServletInfo(); jsonServletInfo.setServletName("json"); jsonServletInfo.setServletClass(JsonServlet.class.getName()); - jsonServletInfo.addMapping("/json"); applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); + applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(jsonServletInfo.getServletName(), "/json")); containerRuntime.addRuntime(applicationRuntime); int cpuNum = Runtime.getRuntime().availableProcessors(); 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 6ac97cc7606..3d0d8bd1d2a 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,10 +1,11 @@ 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; /** 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 e484da19fc3..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; /** From d96eb20360055409e4ea17012bd4afb4d0d2b61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Tue, 12 Nov 2024 00:37:29 +0800 Subject: [PATCH 0895/1766] Remove java solon-vertx (#9393) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Version To 2.9.2 * Add Solon-Virtual * Remove solon-virtual * Update Solon Version To 3.0.2 * Add Solon-Vertx * Tweak description * Tweak the dockerfile * Tweak the dockerfile * Tweak config * Tweak dockefile name * Add FilterImpl * Add FilterImpl * The json plugin is changed to jackson * Update Solon Jdk To 23 * Update Solon-Vertx Jdk To 23 * Solon-vertx is restored to jdk 21 * Solon is restored to jdk 21 * Solon-vertx adjusts the Date output format * Solon is restored to jdk 21 * Remove solon-vertx From 7728841c4a4a67b87db0e14077720a5a3d91216a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Tue, 12 Nov 2024 00:37:49 +0800 Subject: [PATCH 0896/1766] update smart-servlet to 2.3 (#9392) 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 * upgrade smart-servlet to 1.0-SNAPSHOT * upgrade smart-servlet to 1.4 * upgrade smart-servlet to 1.5-SNAPSHOT * 启用虚拟线程 * 启用虚拟线程 * 适配最新版 --- frameworks/Java/smart-socket/pom.xml | 4 ++-- .../src/main/java/org/smartboot/http/JsonUtil.java | 2 +- .../main/java/org/smartboot/servlet/Bootstrap.java | 12 ++++++++---- .../org/smartboot/servlet/HelloWorldServlet.java | 9 +++++---- .../main/java/org/smartboot/servlet/JsonServlet.java | 8 ++++---- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 239721f8cba..39a47cc3c1e 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 1.5-SNAPSHOT + 2.3 5.0.0 0.9.23 @@ -23,7 +23,7 @@ 0.1-SNAPSHOT - org.smartboot.servlet + tech.smartboot.servlet servlet-core ${smartservlet.version} 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 5c46d0ca5ef..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 @@ -4,9 +4,9 @@ import com.jsoniter.output.JsonStreamPool; import com.jsoniter.spi.JsonException; 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; /** 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 b6691bfd359..f4458e0a6e6 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 @@ -1,10 +1,14 @@ package org.smartboot.servlet; + import org.smartboot.http.server.HttpBootstrap; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; import org.smartboot.http.server.HttpServerHandler; -import org.smartboot.servlet.conf.ServletInfo; +import tech.smartboot.servlet.Container; +import tech.smartboot.servlet.ServletContextRuntime; +import tech.smartboot.servlet.conf.ServletInfo; +import tech.smartboot.servlet.conf.ServletMappingInfo; import java.util.concurrent.CompletableFuture; @@ -15,7 +19,7 @@ public class Bootstrap { public static void main(String[] args) throws Throwable { - ContainerRuntime containerRuntime = new ContainerRuntime(); + Container containerRuntime = new Container(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); applicationRuntime.setVendorProvider(response -> { @@ -24,15 +28,15 @@ public static void main(String[] args) throws Throwable { ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); - plainTextServletInfo.addMapping("/plaintext"); + applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(plainTextServletInfo.getServletName(), "/plaintext")); applicationRuntime.getDeploymentInfo().addServlet(plainTextServletInfo); // json ServletInfo jsonServletInfo = new ServletInfo(); jsonServletInfo.setServletName("json"); jsonServletInfo.setServletClass(JsonServlet.class.getName()); - jsonServletInfo.addMapping("/json"); applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); + applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(jsonServletInfo.getServletName(), "/json")); containerRuntime.addRuntime(applicationRuntime); int cpuNum = Runtime.getRuntime().availableProcessors(); 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 6ac97cc7606..3d0d8bd1d2a 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,10 +1,11 @@ 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; /** 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 e484da19fc3..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; /** From fb17d2ab8ee83fe2923e986ea0a4f29522857b94 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Nov 2024 17:38:54 +0100 Subject: [PATCH 0897/1766] [rails] Use regular json serializer (#9389) The regular json serializer should be about as fast as OJ, after some recent performance improvements: https://github.com/ruby/json/blob/master/CHANGES.md --- frameworks/Ruby/rails/Gemfile | 1 - frameworks/Ruby/rails/Gemfile.lock | 7 +------ frameworks/Ruby/rails/app/controllers/json_controller.rb | 2 +- frameworks/Ruby/rails/config/initializers/oj.rb | 1 - 4 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 frameworks/Ruby/rails/config/initializers/oj.rb diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index b188913327b..3ec7067d123 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -1,6 +1,5 @@ source 'https://rubygems.org' -gem 'oj', '~> 3.16' gem 'rails', '~> 7.2.0' gem 'redis', '~> 5.0' gem 'tzinfo-data' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 9773df3e123..de6ba5433a9 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -137,7 +137,7 @@ GEM irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) - json (2.7.2) + json (2.8.1) kgio (2.11.4) localhost (1.3.1) logger (1.6.1) @@ -172,11 +172,7 @@ GEM racc (~> 1.4) nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) - oj (3.16.6) - bigdecimal (>= 3.0) - ostruct (>= 0.2) openssl (3.2.0) - ostruct (0.6.0) pg (1.5.8) process-metrics (0.3.0) console (~> 1.8) @@ -275,7 +271,6 @@ PLATFORMS DEPENDENCIES agoo falcon (~> 0.47) - oj (~> 3.16) pg (~> 1.5) puma (~> 6.4) rackup diff --git a/frameworks/Ruby/rails/app/controllers/json_controller.rb b/frameworks/Ruby/rails/app/controllers/json_controller.rb index e7234f692f3..1a87495f93c 100644 --- a/frameworks/Ruby/rails/app/controllers/json_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/json_controller.rb @@ -4,6 +4,6 @@ class JsonController < ApplicationControllerMetal def index add_headers self.content_type = 'application/json' - self.response_body = Oj.dump({ 'message' => 'Hello, World!' }) + self.response_body = { 'message' => 'Hello, World!' }.to_json end end diff --git a/frameworks/Ruby/rails/config/initializers/oj.rb b/frameworks/Ruby/rails/config/initializers/oj.rb deleted file mode 100644 index 8c00f0456ff..00000000000 --- a/frameworks/Ruby/rails/config/initializers/oj.rb +++ /dev/null @@ -1 +0,0 @@ -Oj.optimize_rails From 44e7de6c703db22a07b8a24e60dde0511b31b203 Mon Sep 17 00:00:00 2001 From: Redkale Date: Tue, 12 Nov 2024 00:39:05 +0800 Subject: [PATCH 0898/1766] Update redkale-pgclient (#9387) --- frameworks/Java/redkale/redkale-pgclient.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/redkale/redkale-pgclient.dockerfile b/frameworks/Java/redkale/redkale-pgclient.dockerfile index af47b952c72..761368ba604 100644 --- a/frameworks/Java/redkale/redkale-pgclient.dockerfile +++ b/frameworks/Java/redkale/redkale-pgclient.dockerfile @@ -12,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dvertx.disableURIValidation=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file From e13a3b5752b14082684760950c3920e2b4d17eea Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Nov 2024 17:39:14 +0100 Subject: [PATCH 0899/1766] [ruby/roda] Use regular json serializer (#9385) The regular json serializer should be about as fast as RapidJSON, after some recent performance improvements: https://github.com/ruby/json/blob/master/CHANGES.md --- frameworks/Ruby/roda-sequel/Gemfile | 2 +- frameworks/Ruby/roda-sequel/boot.rb | 1 - frameworks/Ruby/roda-sequel/hello_world.rb | 8 ++++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index c5dd09c3375..73b6ee99edc 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -2,13 +2,13 @@ source "https://rubygems.org" gem 'base64' # required by passenger on Ruby 3.4 gem "erubi", "~> 1.12" +gem "json", "~> 2.8" gem "passenger", "~> 6.0", platforms: %i[ruby mswin], require: false gem "puma", "~> 6.2", require: false gem "sequel", "~> 5.67" gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" gem "unicorn", "~> 6.1", platforms: %i[ruby mswin], require: false -gem "rapidjson" group :mysql do gem "mysql2", "~> 0.5", platforms: %i[ruby mswin] diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index bc7277e2362..5d852e9e80c 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "bundler/setup" require "time" -require "rapidjson" MAX_PK = 10_000 QUERY_RANGE = (1..MAX_PK).freeze ALL_IDS = QUERY_RANGE.to_a diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 458e1a7c687..c05354e2097 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -22,13 +22,13 @@ def rand1 # Test type 1: JSON serialization r.is "json" do response[CONTENT_TYPE] = JSON_TYPE - RapidJSON.encode({ message: "Hello, World!" }) + { message: "Hello, World!" }.to_json end # Test type 2: Single database query r.is "db" do response[CONTENT_TYPE] = JSON_TYPE - RapidJSON.encode(World.with_pk(rand1).values) + World.with_pk(rand1).values.to_json end # Test type 3: Multiple database queries @@ -40,7 +40,7 @@ def rand1 World.with_pk(id).values end end - RapidJSON.encode(worlds) + worlds.to_json end # Test type 4: Fortunes @@ -70,7 +70,7 @@ def rand1 end World.batch_update(worlds) end - RapidJSON.encode(worlds.map!(&:values)) + worlds.map!(&:values).to_json end # Test type 6: Plaintext From a7b33c36b2b7d1cf7766db4df554bacbfc351141 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Nov 2024 17:39:21 +0100 Subject: [PATCH 0900/1766] [ruby/sinatra] Use regular json serializer (#9384) The regular json serializer should be about as fast as OJ, after some recent performance improvements: https://github.com/ruby/json/blob/master/CHANGES.md --- frameworks/Ruby/sinatra-sequel/Gemfile | 2 +- frameworks/Ruby/sinatra-sequel/boot.rb | 3 --- frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/boot.rb | 3 --- 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 4aace641277..7a750a78aff 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'oj' +gem 'json', '~> 2.8' gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index b91ea6e1317..655e88dce7d 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'bundler/setup' require 'time' -require 'oj' MAX_PK = 10_000 ID_RANGE = (1..MAX_PK).freeze @@ -24,8 +23,6 @@ Bundler.require(:default) # Load core modules -Oj.mimic_JSON - def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 95fe5743580..7fc8bdb1a0d 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' gem 'activerecord', '~> 7.2', require: 'active_record' -gem 'oj' +gem 'json', '~> 2.8' gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false gem 'puma', '~> 6.4', require: false gem 'sinatra', '~> 4.0', require: 'sinatra/base' diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index 97fa0c40bdb..f8cc4be86c3 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'bundler/setup' require 'time' -require 'oj' MAX_PK = 10_000 ID_RANGE = (1..MAX_PK).freeze @@ -23,8 +22,6 @@ Bundler.require(:default) # Load core modules -Oj.mimic_JSON - def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules From f897d20573b0ba4ea9015bcdbe16c74d5506bc90 Mon Sep 17 00:00:00 2001 From: cclilshy Date: Tue, 12 Nov 2024 00:39:34 +0800 Subject: [PATCH 0901/1766] [PHP/ripple] Added ripple coroutine engine. (#9377) * [PHP/ripple] Added ripple coroutine engine. * [PHP/ripple] Update dependent version --- frameworks/PHP/ripple/README.md | 75 ++++++++ frameworks/PHP/ripple/benchmark_config.json | 29 +++ frameworks/PHP/ripple/composer.json | 9 + frameworks/PHP/ripple/fortunes.php | 18 ++ frameworks/PHP/ripple/ripple.dockerfile | 32 ++++ frameworks/PHP/ripple/server.php | 200 ++++++++++++++++++++ 6 files changed, 363 insertions(+) create mode 100644 frameworks/PHP/ripple/README.md create mode 100644 frameworks/PHP/ripple/benchmark_config.json create mode 100644 frameworks/PHP/ripple/composer.json create mode 100644 frameworks/PHP/ripple/fortunes.php create mode 100644 frameworks/PHP/ripple/ripple.dockerfile create mode 100644 frameworks/PHP/ripple/server.php diff --git a/frameworks/PHP/ripple/README.md b/frameworks/PHP/ripple/README.md new file mode 100644 index 00000000000..ce4d89d0bc2 --- /dev/null +++ b/frameworks/PHP/ripple/README.md @@ -0,0 +1,75 @@ +

      +Logo +

      +

      +Build Status +Download statistics +Stable version +License +

      +

      +Ripple is a modern, high-performance native PHP coroutine engine designed to solve PHP's challenges in high concurrency, complex network communication and data operations. +The engine uses an innovative architecture and efficient programming model to provide powerful and flexible backend support for modern web and web applications. +By using ripple, you will experience the advantages of managing tasks from a global view of the system and efficiently handling network traffic and data.

      + +## Install + +````bash +composer require cloudtay/ripple +```` + +## Latest documentation + +You can visit `ripple`’s [documentation](https://ripple.cloudtay.com/) to start reading + +We recommend that you start with [Manual Installation](https://ripple.cloudtay.com/docs/install/professional) to better +understand the workflow of ripple + +If you want to quickly deploy and use `ripple` services, you can directly +visit [Quick Deployment](https://ripple.cloudtay.com/docs/install/server) + +## Appendix + +### Applicable component library + +> We allow users to choose applicable component libraries by themselves. All components can be used as described in the +> document without additional configuration. + +**🚀 [Guzzle](https://docs.guzzlephp.org/en/stable/)** +PHP is the most widely used HTTP client + +**🔥 [AmPHP](https://amphp.org/)** +Provides rich PHP asynchronous components for users to encapsulate by themselves + +**🚀 [Driver](https://github.com/cloudtay/ripple-driver)** +The official high-performance driver library provides seamless access to your traditional applications. + +**🚀 [Webman-coroutine](https://github.com/workbunny/webman-coroutine)** +The workbunny team's integrated webman coroutine extension provides coroutine support for Webman. + +**🟢[ripple](https://github.com/cloudtay/ripple)** +Provides standard coroutine architecture and tools for rapid development or packaging of traditional applications + +### Event Library Guide + +| Extension Types | Recommended Use | Compatibility | Description | +|:---------------:|:---------------:|:-------------:|:--------------------------------------------------------------------------------------------------------------------:| +| `libev` | 🏅️ | 🟢️ | `Ev` is a more efficient event extension that performs consistently in various systems and is recommended to be used | +| `Native` | ️ | 🟢 | Support the use of PHP's built-in select mechanism | +| `event` | | 🌗 | The event characteristics under different systems are not uniform, and their use is not recommended | + +## Special thanks + + + jetbrains + + +[Jetbrains](https://www.jetbrains.com/?from=ripple) provides free development tools for this project + +### Contact information + +`Email` jingnigg@gmail.com + +`WeChat` jingnigg + +--- diff --git a/frameworks/PHP/ripple/benchmark_config.json b/frameworks/PHP/ripple/benchmark_config.json new file mode 100644 index 00000000000..4c625c29bbe --- /dev/null +++ b/frameworks/PHP/ripple/benchmark_config.json @@ -0,0 +1,29 @@ +{ + "framework": "ripple", + "tests": [ + { + "default": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "ripple", + "language": "PHP", + "flavor": "PHP8.3", + "orm": "Raw", + "platform": "ripple", + "os": "Linux", + "database_os": "Linux", + "display_name": "ripple", + "notes": "", + "versus": "php" + } + } + ] +} diff --git a/frameworks/PHP/ripple/composer.json b/frameworks/PHP/ripple/composer.json new file mode 100644 index 00000000000..679f58c8cd2 --- /dev/null +++ b/frameworks/PHP/ripple/composer.json @@ -0,0 +1,9 @@ +{ + "require": { + "ext-pdo": "*", + "cloudtay/ripple-http": "^1.0", + "cloudtay/ripple": "^1.0" + }, + "minimum-stability": "beta", + "prefer-stable": true +} diff --git a/frameworks/PHP/ripple/fortunes.php b/frameworks/PHP/ripple/fortunes.php new file mode 100644 index 00000000000..32f765eabb6 --- /dev/null +++ b/frameworks/PHP/ripple/fortunes.php @@ -0,0 +1,18 @@ + + +Fortunes + + + + + + + + + + + + +
      idmessage
      + + diff --git a/frameworks/PHP/ripple/ripple.dockerfile b/frameworks/PHP/ripple/ripple.dockerfile new file mode 100644 index 00000000000..fb521c874f4 --- /dev/null +++ b/frameworks/PHP/ripple/ripple.dockerfile @@ -0,0 +1,32 @@ +FROM php:8.3-cli + +RUN apt-get update -yqq >> /dev/null +RUN apt-get install -y libevent-dev \ + libssl-dev \ + pkg-config \ + build-essential \ + unzip >> /dev/null + +RUN docker-php-ext-install pdo_mysql \ + opcache \ + posix \ + pcntl \ + sockets >> /dev/null + +RUN pecl install event >> /dev/null + +RUN docker-php-ext-enable posix pcntl sockets +RUN docker-php-ext-enable --ini-name zz-event.ini event + +COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer + +# Initialize +WORKDIR /ripple +COPY --link . . + +# Configure +RUN composer install --quiet + +# Start +EXPOSE 8080 +ENTRYPOINT ["php","server.php"] diff --git a/frameworks/PHP/ripple/server.php b/frameworks/PHP/ripple/server.php new file mode 100644 index 00000000000..8a615fb91c5 --- /dev/null +++ b/frameworks/PHP/ripple/server.php @@ -0,0 +1,200 @@ +format('D, d M Y H:i:s T'); + } + + + /** + * @return int + */ + public static function randomInt(): int + { + try { + return \random_int(1, 10000); + } catch (Throwable $e) { + return mt_rand(1, 10000); + } + } + + /** + * @param mixed $value + * + * @return int + */ + public static function clamp(mixed $value): int + { + if (!\is_numeric($value) || $value < 1) { + return 1; + } + if ($value > 500) { + return 500; + } + return \intval($value); + } + + /** + * @param string $template + * @param array $data + * + * @return string + */ + public static function render(string $template, array $data = []): string + { + foreach ($data as $key => $value) { + $$key = $value; + } + + \ob_start(); + include $template; + return \ob_get_clean(); + } +} + +$manager = new Manager(); +$worker = new class() extends \Ripple\Worker { + /*** @var \Ripple\Http\Server */ + public Server $server; + + /** + * @param \Ripple\Worker\Manager $manager + * + * @return void + */ + public function register(Manager $manager): void + { + $this->count = 64; + $this->server = new Server('http://0.0.0.0:8080'); + } + + /** + * @return void + */ + public function boot(): void + { + Setup::dateRefresh(); + repeat(static fn () => Setup::dateRefresh(), 1); + + Setup::$pdo = new \PDO( + 'mysql:host=tfb-database;port=3306;dbname=hello_world', + 'benchmarkdbuser', + 'benchmarkdbpass', + [ + \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, + \PDO::ATTR_EMULATE_PREPARES => false, + \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, + ] + ); + + Setup::$queryWorldWhereID = Setup::$pdo->prepare('SELECT id, randomNumber FROM World WHERE id = ?'); + Setup::$updateWorldRandomNumber = Setup::$pdo->prepare('UPDATE World SET randomNumber = ? WHERE id = ?'); + Setup::$queryFortune = Setup::$pdo->prepare('SELECT * FROM `Fortune`'); + $this->server->onRequest(fn (Server\Request $request) => $this->onRequest($request)); + $this->server->listen(); + } + + /** + * @param \Ripple\Http\Server\Request $request + * + * @return void + */ + public function onRequest(Server\Request $request): void + { + switch ($request->SERVER['REQUEST_URI']) { + case '/json': + $request->respondJson( + ['message' => 'Hello, World!'], + ['Date' => Setup::$dateFormatted] + ); + break; + + case '/db': + $statement = Setup::$queryWorldWhereID; + $statement->execute([Setup::randomInt()]); + $request->respondJson($statement->fetch(), ['Date' => Setup::$dateFormatted]); + break; + + case '/queries': + $queries = Setup::clamp($request->GET['queries'] ?? 1); + $results = []; + $statement = Setup::$queryWorldWhereID; + while ($queries--) { + $statement->execute([Setup::randomInt()]); + $results[] = $statement->fetch(); + } + $request->respondJson($results, ['Date' => Setup::$dateFormatted]); + + break; + case '/fortunes': + $rows = Setup::$pdo->query('SELECT * FROM `Fortune`')?->fetchAll(); + $rows[] = ['id' => 0, 'message' => 'Additional fortune added at request time.']; + \usort($rows, function ($a, $b) { + return $a['message'] <=> $b['message']; + }); + + $request->respondHtml( + Setup::render('fortunes.php', ['rows' => $rows]), + [ + 'Date' => Setup::$dateFormatted, + 'Content-Type' => 'text/html; charset=UTF-8' + ] + ); + break; + + case '/updates': + $queries = Setup::clamp($request->GET['queries'] ?? 1); + $results = []; + $statement = Setup::$queryWorldWhereID; + $update = Setup::$updateWorldRandomNumber; + while ($queries--) { + $statement->execute([Setup::randomInt()]); + $row = $statement->fetch(); + $row['randomNumber'] = Setup::randomInt(); + $results[] = $row; + $update->execute([$row['randomNumber'], $row['id']]); + } + $request->respondJson($results, ['Date' => Setup::$dateFormatted]); + break; + + case '/plaintext': + $request->respond( + 'Hello, World!', + [ + 'Content-Type' => 'text/plain; charset=utf-8', + 'Date' => Setup::$dateFormatted + ] + ); + break; + + default: + $request->respond('Not Found', [], 404); + } + } +}; + +$manager->addWorker($worker); +$manager->run(); +wait(); From 1f3fb16bc37c1bb0f691c89bf12599115870bb35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 11 Nov 2024 17:39:46 +0100 Subject: [PATCH 0902/1766] [spring] Batch update and Java 23 (#9370) The commit: - Use batch update in spring-webflux - Upgrade Java 21 to Java 23 - Increase the connection pool from 256 to 512 - Upgrade to Spring Boot 3.3.5 --- frameworks/Java/spring-webflux/pom.xml | 4 +- .../spring-webflux-mongo.dockerfile | 2 +- .../spring-webflux/spring-webflux.dockerfile | 2 +- .../benchmark/repository/DbRepository.java | 4 +- .../repository/MongoDbRepository.java | 17 ++++----- .../repository/R2dbcDbRepository.java | 37 ++++++++++--------- .../main/java/benchmark/web/DbHandler.java | 13 ++++++- .../src/main/resources/application.yml | 2 +- frameworks/Java/spring/pom.xml | 2 +- .../Java/spring/spring-mongo.dockerfile | 2 +- frameworks/Java/spring/spring.dockerfile | 2 +- .../spring/src/main/resources/application.yml | 2 +- 12 files changed, 50 insertions(+), 39 deletions(-) diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index 7e1b6865d2d..af60e1f7c7e 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -13,14 +13,12 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.5 21 1.3.6 - 1.0.2.RELEASE - 1.0.7.RELEASE diff --git a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile index d565d1556c3..514a1db96df 100644 --- a/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile @@ -4,7 +4,7 @@ COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM bellsoft/liberica-openjre-debian:21 +FROM bellsoft/liberica-openjre-debian:23 WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar # See https://docs.spring.io/spring-boot/reference/packaging/efficient.html diff --git a/frameworks/Java/spring-webflux/spring-webflux.dockerfile b/frameworks/Java/spring-webflux/spring-webflux.dockerfile index e1cee08ff31..60c2229b795 100644 --- a/frameworks/Java/spring-webflux/spring-webflux.dockerfile +++ b/frameworks/Java/spring-webflux/spring-webflux.dockerfile @@ -4,7 +4,7 @@ COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM bellsoft/liberica-openjre-debian:21 +FROM bellsoft/liberica-openjre-debian:23 WORKDIR /spring COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar # See https://docs.spring.io/spring-boot/reference/packaging/efficient.html diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java index 54b6d0d9d02..2eea6d41049 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java @@ -1,5 +1,7 @@ package benchmark.repository; +import java.util.List; + import benchmark.model.Fortune; import benchmark.model.World; import reactor.core.publisher.Flux; @@ -9,7 +11,7 @@ public interface DbRepository { Mono getWorld(int id); - Mono findAndUpdateWorld(int id, int randomNumber); + Mono updateWorlds(List worlds); Flux fortunes(); } \ No newline at end of file diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java index df777dd2d8e..4fff0eb2c5d 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java @@ -1,16 +1,16 @@ package benchmark.repository; +import java.util.List; + import benchmark.model.Fortune; import benchmark.model.World; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + import org.springframework.context.annotation.Profile; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import static org.springframework.data.mongodb.core.FindAndModifyOptions.options; import static org.springframework.data.mongodb.core.query.Criteria.where; import static org.springframework.data.mongodb.core.query.Query.query; import static org.springframework.data.mongodb.core.query.Update.update; @@ -31,12 +31,11 @@ public Mono getWorld(int id) { } @Override - public Mono findAndUpdateWorld(int id, int randomNumber) { - return operations.findAndModify( - query(where("id").is(id)), - update("randomNumber", randomNumber), - options().returnNew(true), - World.class); + public Mono updateWorlds(List worlds) { + return Flux.fromIterable(worlds).flatMap(world -> operations.findAndModify( + query(where("id").is(world.id)), + update("randomNumber", world.randomnumber), + World.class)).then(); } @Override diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java index c2524f07862..c8f1cdbc0c2 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java @@ -1,11 +1,17 @@ package benchmark.repository; +import java.util.List; + import org.springframework.context.annotation.Profile; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.stereotype.Component; import benchmark.model.Fortune; import benchmark.model.World; +import io.r2dbc.spi.Connection; +import io.r2dbc.spi.ConnectionFactory; +import io.r2dbc.spi.Result; +import io.r2dbc.spi.Statement; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -23,28 +29,25 @@ public R2dbcDbRepository(DatabaseClient databaseClient) { public Mono getWorld(int id) { return databaseClient .sql("SELECT id, randomnumber FROM world WHERE id = $1") - .bind("$1", id) + .bind(0, id) .mapProperties(World.class) .first(); } - private Mono updateWorld(World world) { - return databaseClient - .sql("UPDATE world SET randomnumber=$2 WHERE id = $1") - .bind("$1", world.id) - .bind("$2", world.randomnumber) - .fetch() - .rowsUpdated() - .map(count -> world); - } - - @Override - public Mono findAndUpdateWorld(int id, int randomNumber) { - return getWorld(id).flatMap(world -> { - world.randomnumber = randomNumber; - return updateWorld(world); - }); + public Mono updateWorlds(List worlds) { + return databaseClient.inConnectionMany(con -> { + Statement statement = con.createStatement("UPDATE world SET randomnumber=$2 WHERE id = $1"); + for (int i = 0; i < worlds.size(); i++) { + World world = worlds.get(i); + statement.bind(0, world.randomnumber) + .bind(1, world.id); + if (i < worlds.size() - 1) { + statement.add(); + } + } + return Flux.from(statement.execute()); + }).flatMap(Result::getRowsUpdated).then(); } @Override diff --git a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java index e85d9c5be15..03f90652f69 100644 --- a/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java +++ b/frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java @@ -1,5 +1,6 @@ package benchmark.web; +import java.util.Comparator; import java.util.List; import benchmark.Utils; @@ -68,8 +69,16 @@ public Mono updates(ServerRequest request) { int queries = parseQueryCount(request.queryParams().getFirst("queries")); Mono> worlds = Flux.fromStream(Utils.randomWorldNumbers().limit(queries).boxed()) - .flatMap(i -> dbRepository.findAndUpdateWorld(i, Utils.randomWorldNumber())) - .collectList(); + .flatMap(id -> dbRepository.getWorld(id).map(world -> { + int randomNumber; + do { + randomNumber = Utils.randomWorldNumber(); + } while (randomNumber == world.randomnumber); + world.randomnumber = randomNumber; + return world; + })) + .collectSortedList(Comparator.comparingInt(w -> w.id)) + .flatMap(list -> dbRepository.updateWorlds(list).thenReturn(list)); return ServerResponse.ok() .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) diff --git a/frameworks/Java/spring-webflux/src/main/resources/application.yml b/frameworks/Java/spring-webflux/src/main/resources/application.yml index 45ca20c7d80..27d2309566f 100755 --- a/frameworks/Java/spring-webflux/src/main/resources/application.yml +++ b/frameworks/Java/spring-webflux/src/main/resources/application.yml @@ -17,7 +17,7 @@ spring: password: ${database.password} url: r2dbc:postgresql://${database.host}:${database.port}/${database.name}?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable pool: - max-size: 256 + max-size: 512 --- spring: diff --git a/frameworks/Java/spring/pom.xml b/frameworks/Java/spring/pom.xml index 6c9341fed54..3271ab04f03 100644 --- a/frameworks/Java/spring/pom.xml +++ b/frameworks/Java/spring/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.5 diff --git a/frameworks/Java/spring/spring-mongo.dockerfile b/frameworks/Java/spring/spring-mongo.dockerfile index e700a21cabd..cc51f6c844c 100644 --- a/frameworks/Java/spring/spring-mongo.dockerfile +++ b/frameworks/Java/spring/spring-mongo.dockerfile @@ -4,7 +4,7 @@ COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM bellsoft/liberica-openjre-debian:21 +FROM bellsoft/liberica-openjre-debian:23 WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar # See https://docs.spring.io/spring-boot/reference/packaging/efficient.html diff --git a/frameworks/Java/spring/spring.dockerfile b/frameworks/Java/spring/spring.dockerfile index f52c1f36df1..1f102057b99 100644 --- a/frameworks/Java/spring/spring.dockerfile +++ b/frameworks/Java/spring/spring.dockerfile @@ -4,7 +4,7 @@ COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM bellsoft/liberica-openjre-debian:21 +FROM bellsoft/liberica-openjre-debian:23 WORKDIR /spring COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar # See https://docs.spring.io/spring-boot/reference/packaging/efficient.html diff --git a/frameworks/Java/spring/src/main/resources/application.yml b/frameworks/Java/spring/src/main/resources/application.yml index efde83cda61..16a76fe321a 100644 --- a/frameworks/Java/spring/src/main/resources/application.yml +++ b/frameworks/Java/spring/src/main/resources/application.yml @@ -15,7 +15,7 @@ spring: username: ${database.username} password: ${database.password} hikari: - maximum-pool-size: 256 + maximum-pool-size: 512 database: name: hello_world host: tfb-database From b2f4de7d1aa29fd943bacb93ebe2dbf9294ef91a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 21:22:48 +0000 Subject: [PATCH 0903/1766] Bump mimalloc from 0.1.28 to 0.1.39 in /frameworks/Rust/astra Bumps [mimalloc](https://github.com/purpleprotocol/mimalloc_rust) from 0.1.28 to 0.1.39. - [Release notes](https://github.com/purpleprotocol/mimalloc_rust/releases) - [Commits](https://github.com/purpleprotocol/mimalloc_rust/compare/v0.1.28...v0.1.39) --- updated-dependencies: - dependency-name: mimalloc dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Rust/astra/Cargo.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frameworks/Rust/astra/Cargo.lock b/frameworks/Rust/astra/Cargo.lock index 3eb313f1e71..de8ed1f1b7d 100644 --- a/frameworks/Rust/astra/Cargo.lock +++ b/frameworks/Rust/astra/Cargo.lock @@ -268,11 +268,12 @@ checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libmimalloc-sys" -version = "0.1.24" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7705fc40f6ed493f73584abbb324e74f96b358ff60dfe5659a0f8fc12c590a69" +checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" dependencies = [ "cc", + "libc", ] [[package]] @@ -292,9 +293,9 @@ checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "mimalloc" -version = "0.1.28" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0dfa131390c2f6bdb3242f65ff271fcdaca5ff7b6c08f28398be7f2280e3926" +checksum = "fa01922b5ea280a911e323e4d2fd24b7fe5cc4042e0d2cda3c40775cdc4bdc9c" dependencies = [ "libmimalloc-sys", ] From 6673e73aaa3e47ced699c6b90ce6d3c583228fb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 21:46:11 +0000 Subject: [PATCH 0904/1766] Bump github.com/golang-jwt/jwt/v4 in /frameworks/Go/goravel/src/fiber Bumps [github.com/golang-jwt/jwt/v4](https://github.com/golang-jwt/jwt) from 4.5.0 to 4.5.1. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v4.5.0...v4.5.1) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/goravel/src/fiber/go.mod | 2 +- frameworks/Go/goravel/src/fiber/go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frameworks/Go/goravel/src/fiber/go.mod b/frameworks/Go/goravel/src/fiber/go.mod index b31a4b9ba88..87ba6260420 100644 --- a/frameworks/Go/goravel/src/fiber/go.mod +++ b/frameworks/Go/goravel/src/fiber/go.mod @@ -65,7 +65,7 @@ require ( github.com/gofiber/template v1.8.3 // indirect github.com/gofiber/template/html/v2 v2.1.1 // indirect github.com/gofiber/utils v1.1.0 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang-migrate/migrate/v4 v4.17.1 // indirect github.com/golang-module/carbon/v2 v2.3.12 // indirect diff --git a/frameworks/Go/goravel/src/fiber/go.sum b/frameworks/Go/goravel/src/fiber/go.sum index e036eea01cf..2106df44b89 100644 --- a/frameworks/Go/goravel/src/fiber/go.sum +++ b/frameworks/Go/goravel/src/fiber/go.sum @@ -285,8 +285,9 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= From 729b21659af1d4138d3370e4af420e27fdfab472 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:22:36 +0000 Subject: [PATCH 0905/1766] Bump aiohttp from 3.10.2 to 3.10.11 in /frameworks/Python/api_hour Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.10.2 to 3.10.11. - [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.10.2...v3.10.11) --- 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 19dcab407ab..9045239a633 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.10.2 +aiohttp==3.10.11 -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 b105eb7987a6e4d59a8d850bfb9b8b431fc71d14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 20:41:25 +0000 Subject: [PATCH 0906/1766] Bump tornado from 4.5.3 to 6.4.2 in /frameworks/Python/bottle Bumps [tornado](https://github.com/tornadoweb/tornado) from 4.5.3 to 6.4.2. - [Changelog](https://github.com/tornadoweb/tornado/blob/v6.4.2/docs/releases.rst) - [Commits](https://github.com/tornadoweb/tornado/compare/v4.5.3...v6.4.2) --- updated-dependencies: - dependency-name: tornado dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/bottle/requirements-pypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/bottle/requirements-pypy.txt b/frameworks/Python/bottle/requirements-pypy.txt index c42dadb2ef0..7cfbf108e30 100644 --- a/frameworks/Python/bottle/requirements-pypy.txt +++ b/frameworks/Python/bottle/requirements-pypy.txt @@ -3,4 +3,4 @@ bottle-sqlalchemy==0.4.3 gunicorn==19.9.0 PyMySQL==0.8.0 SQLAlchemy==1.3.0 -tornado==4.5.3 +tornado==6.4.2 From 52b7d3031404caa58a540d7a65de56908db65222 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 25 Nov 2024 17:59:15 +0100 Subject: [PATCH 0907/1766] [ruby/roda-sequel] Update puma to 6.5.0 (#9424) Also add Gemfile.lock. Lock files make test runs more deterministic and predictable. --- frameworks/Ruby/roda-sequel/Gemfile.lock | 56 ++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 frameworks/Ruby/roda-sequel/Gemfile.lock diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock new file mode 100644 index 00000000000..c701d602394 --- /dev/null +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -0,0 +1,56 @@ +GEM + remote: https://rubygems.org/ + specs: + base64 (0.2.0) + bigdecimal (3.1.8) + erubi (1.13.0) + json (2.8.1) + kgio (2.11.4) + mysql2 (0.5.6) + nio4r (2.7.4) + passenger (6.0.23) + rack (>= 1.6.13) + rackup + rake (>= 12.3.3) + pg (1.5.8) + puma (6.5.0) + nio4r (~> 2.0) + rack (3.1.8) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + raindrops (0.20.1) + rake (13.2.1) + roda (3.85.0) + rack + sequel (5.85.0) + bigdecimal + sequel_pg (1.17.1) + pg (>= 0.18.0, != 1.2.0) + sequel (>= 4.38.0) + tilt (2.4.0) + unicorn (6.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) + webrick (1.8.2) + +PLATFORMS + ruby + x86_64-darwin-22 + +DEPENDENCIES + base64 + erubi (~> 1.12) + json (~> 2.8) + mysql2 (~> 0.5) + passenger (~> 6.0) + pg (~> 1.4) + puma (~> 6.2) + roda (~> 3.66) + sequel (~> 5.67) + sequel_pg (~> 1.17) + tilt (~> 2.1) + unicorn (~> 6.1) + +BUNDLED WITH + 2.5.10 From 5452df9e7c758abe7e8e1e6ce450a447eabc77e9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 25 Nov 2024 17:59:25 +0100 Subject: [PATCH 0908/1766] [ruby/sinatra] Update puma to 6.5.0 (#9423) Also add Gemfile.lock files. Lock files make test runs more deterministic and predictable. --- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 64 +++++++++++++++ frameworks/Ruby/sinatra/Gemfile.lock | 86 +++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 frameworks/Ruby/sinatra-sequel/Gemfile.lock create mode 100644 frameworks/Ruby/sinatra/Gemfile.lock diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock new file mode 100644 index 00000000000..8f868632e82 --- /dev/null +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -0,0 +1,64 @@ +GEM + remote: https://rubygems.org/ + specs: + base64 (0.2.0) + bigdecimal (3.1.8) + json (2.8.2) + kgio (2.11.4) + mustermann (3.0.3) + ruby2_keywords (~> 0.0.1) + mysql2 (0.5.6) + nio4r (2.7.4) + passenger (6.0.23) + rack (>= 1.6.13) + rackup + rake (>= 12.3.3) + pg (1.5.8) + puma (6.5.0) + nio4r (~> 2.0) + rack (3.1.8) + rack-protection (4.0.0) + base64 (>= 0.1.0) + rack (>= 3.0.0, < 4) + rack-session (2.0.0) + rack (>= 3.0.0) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + raindrops (0.20.1) + rake (13.2.1) + ruby2_keywords (0.0.5) + sequel (5.85.0) + bigdecimal + sequel_pg (1.17.1) + pg (>= 0.18.0, != 1.2.0) + sequel (>= 4.38.0) + sinatra (4.0.0) + mustermann (~> 3.0) + rack (>= 3.0.0, < 4) + rack-protection (= 4.0.0) + rack-session (>= 2.0.0, < 3) + tilt (~> 2.0) + tilt (2.4.0) + unicorn (6.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) + webrick (1.8.2) + +PLATFORMS + ruby + x86_64-darwin-23 + +DEPENDENCIES + json (~> 2.8) + mysql2 (~> 0.5) + passenger (~> 6.0) + pg (~> 1.5) + puma (~> 6.4) + sequel (~> 5.0) + sequel_pg (~> 1.6) + sinatra (~> 4.0) + unicorn (~> 6.1) + +BUNDLED WITH + 2.5.16 diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock new file mode 100644 index 00000000000..db7773ad559 --- /dev/null +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -0,0 +1,86 @@ +GEM + remote: https://rubygems.org/ + specs: + activemodel (7.2.1.1) + activesupport (= 7.2.1.1) + activerecord (7.2.1.1) + activemodel (= 7.2.1.1) + activesupport (= 7.2.1.1) + timeout (>= 0.4.0) + activesupport (7.2.1.1) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + base64 (0.2.0) + bigdecimal (3.1.8) + concurrent-ruby (1.3.4) + connection_pool (2.4.1) + drb (2.2.1) + i18n (1.14.6) + concurrent-ruby (~> 1.0) + json (2.8.1) + kgio (2.11.4) + logger (1.6.1) + minitest (5.25.1) + mustermann (3.0.3) + ruby2_keywords (~> 0.0.1) + mysql2 (0.5.6) + nio4r (2.7.4) + passenger (6.0.23) + rack (>= 1.6.13) + rackup + rake (>= 12.3.3) + pg (1.5.8) + puma (6.5.0) + nio4r (~> 2.0) + rack (3.1.8) + rack-protection (4.0.0) + base64 (>= 0.1.0) + rack (>= 3.0.0, < 4) + rack-session (2.0.0) + rack (>= 3.0.0) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + raindrops (0.20.1) + rake (13.2.1) + ruby2_keywords (0.0.5) + securerandom (0.3.1) + sinatra (4.0.0) + mustermann (~> 3.0) + rack (>= 3.0.0, < 4) + rack-protection (= 4.0.0) + rack-session (>= 2.0.0, < 3) + tilt (~> 2.0) + tilt (2.4.0) + timeout (0.4.1) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicorn (6.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) + webrick (1.8.2) + +PLATFORMS + ruby + x86_64-darwin-23 + +DEPENDENCIES + activerecord (~> 7.2) + json (~> 2.8) + mysql2 (~> 0.5) + passenger (~> 6.0) + pg (~> 1.5) + puma (~> 6.4) + sinatra (~> 4.0) + unicorn (~> 6.1) + +BUNDLED WITH + 2.5.16 From fd9ed23d14d037b161d871b45c0847bb8078f757 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 25 Nov 2024 17:59:34 +0100 Subject: [PATCH 0909/1766] [ruby/rack] Update puma to 6.5.0 (#9422) Also add Gemfile.lock for rack-sequel. Lock files make test runs more deterministic and predictable. --- frameworks/Ruby/rack-sequel/Gemfile.lock | 57 ++++++++++++++++++++++++ frameworks/Ruby/rack/Gemfile.lock | 9 ++-- 2 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 frameworks/Ruby/rack-sequel/Gemfile.lock diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock new file mode 100644 index 00000000000..72c1f6c0d47 --- /dev/null +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -0,0 +1,57 @@ +GEM + remote: https://rubygems.org/ + specs: + base64 (0.2.0) + bigdecimal (3.1.8) + json (2.8.2) + kgio (2.11.4) + mysql2 (0.5.6) + nio4r (2.7.4) + oj (3.16.7) + bigdecimal (>= 3.0) + ostruct (>= 0.2) + ostruct (0.6.1) + passenger (6.0.23) + rack (>= 1.6.13) + rackup + rake (>= 12.3.3) + pg (1.5.8) + puma (6.5.0) + nio4r (~> 2.0) + rack (3.1.8) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + raindrops (0.20.1) + rake (13.2.1) + sequel (5.85.0) + bigdecimal + sequel_pg (1.17.1) + pg (>= 0.18.0, != 1.2.0) + sequel (>= 4.38.0) + unicorn (6.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) + webrick (1.8.2) + +PLATFORMS + ruby + x86_64-darwin-22 + +DEPENDENCIES + base64 + jdbc-mysql (~> 5.1) + jdbc-postgres (~> 9.4) + json (~> 2.0) + mysql2 (~> 0.4) + oj (~> 3.14) + passenger (~> 6.0) + pg (~> 1.5) + puma (~> 6.4) + rack (~> 3.0) + sequel (~> 5.0) + sequel_pg (~> 1.6) + unicorn (~> 6.1) + +BUNDLED WITH + 2.5.10 diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index ee579e13085..e64bca08304 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -50,12 +50,12 @@ GEM io-endpoint (0.11.0) io-event (1.6.5) io-stream (0.4.0) - json (2.7.2) + json (2.8.2) kgio (2.11.4) language_server-protocol (3.17.0.3) localhost (1.3.1) mapping (1.1.1) - nio4r (2.7.3) + nio4r (2.7.4) oj (3.16.4) bigdecimal (>= 3.0) openssl (3.2.0) @@ -77,7 +77,7 @@ GEM protocol-rack (0.6.0) protocol-http (~> 0.23) rack (>= 1.0) - puma (6.4.3) + puma (6.5.0) nio4r (~> 2.0) racc (1.8.0) rack (3.1.6) @@ -120,8 +120,7 @@ GEM raindrops (~> 0.7) PLATFORMS - x86_64-darwin-20 - x86_64-darwin-22 + x86_64-darwin-23 x86_64-linux DEPENDENCIES From 61ee574fb9ef9cf0a1d8382fb289c3befb1cd1cb Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 25 Nov 2024 17:59:46 +0100 Subject: [PATCH 0910/1766] [rails] Update puma to 6.5.0 (#9421) --- 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 de6ba5433a9..83bcc1a1582 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -164,7 +164,7 @@ GEM timeout net-smtp (0.5.0) net-protocol - nio4r (2.7.3) + nio4r (2.7.4) nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) @@ -190,7 +190,7 @@ GEM rack (>= 1.0) psych (5.1.2) stringio - puma (6.4.3) + puma (6.5.0) nio4r (~> 2.0) racc (1.8.1) rack (3.1.8) From c086685b30c7fdbe25c58163b7d24fd6ad37a9cf Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 25 Nov 2024 18:00:31 +0100 Subject: [PATCH 0911/1766] [php] Workeman update to PHP 8.4 (#9417) * Remove pgsql tests for swoole and swow * Code optimization * Update workerman.dockerfile to PHP/8. * Update workerman-jit.dockerfile to PHP/8.4 * Update workerman-mysql-jit.dockerfile to PHP/8.4 * Update workerman-pgsql-jit.dockerfile to PHP/8.4 #9408 * Update workerman-pgsql.dockerfile to PHP/8.4 #9408 --------- Co-authored-by: walkor --- frameworks/PHP/workerman/Mysql.php | 16 ++----- frameworks/PHP/workerman/MysqlSwoole.php | 16 ++----- frameworks/PHP/workerman/Pgsql.php | 42 ++++++------------ frameworks/PHP/workerman/PgsqlSwoole.php | 8 +--- .../PHP/workerman/benchmark_config.json | 44 ------------------- frameworks/PHP/workerman/server.php | 14 +++--- .../PHP/workerman/workerman-jit.dockerfile | 9 ++-- .../workerman/workerman-mysql-jit.dockerfile | 9 ++-- .../workerman-mysql-swoole-jit.dockerfile | 1 + .../workerman-mysql-swow-jit.dockerfile | 1 + .../workerman/workerman-pgsql-jit.dockerfile | 9 ++-- .../workerman-pgsql-swoole-jit.dockerfile | 1 + .../workerman-pgsql-swow-jit.dockerfile | 1 + .../PHP/workerman/workerman-pgsql.dockerfile | 9 ++-- frameworks/PHP/workerman/workerman.dockerfile | 9 ++-- 15 files changed, 59 insertions(+), 130 deletions(-) diff --git a/frameworks/PHP/workerman/Mysql.php b/frameworks/PHP/workerman/Mysql.php index 9c1cdcf0a53..c8dcd0ff40a 100644 --- a/frameworks/PHP/workerman/Mysql.php +++ b/frameworks/PHP/workerman/Mysql.php @@ -32,13 +32,9 @@ function db(): array function query($request): array { - $query_count = 1; - $q = (int)$request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } + $count = min(max((int) $request->get('q'), 1), 500); $arr = []; - while ($query_count--) { + while ($count--) { $this->world->execute([mt_rand(1, 10000)]); $arr[] = $this->world->fetch(); } @@ -47,13 +43,9 @@ function query($request): array function update($request): array { - $query_count = 1; - $q = (int)$request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } + $count = min(max((int) $request->get('q'), 1), 500); $arr = []; - while ($query_count--) { + while ($count--) { $id = mt_rand(1, 10000); $this->world->execute([$id]); $item = $this->world->fetch(); diff --git a/frameworks/PHP/workerman/MysqlSwoole.php b/frameworks/PHP/workerman/MysqlSwoole.php index ff290648fa1..d294afae62d 100644 --- a/frameworks/PHP/workerman/MysqlSwoole.php +++ b/frameworks/PHP/workerman/MysqlSwoole.php @@ -31,15 +31,11 @@ function db(): array function query($request): array { - $query_count = 1; - $q = (int)$request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } + $count = min(max((int) $request->get('q'), 1), 500); $pdo = $this->pool->get(); $stmt = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); $arr = []; - while ($query_count--) { + while ($count--) { $stmt->execute([mt_rand(1, 10000)]); $arr[] = $stmt->fetch(PDO::FETCH_ASSOC); } @@ -49,16 +45,12 @@ function query($request): array function update($request): array { - $query_count = 1; - $q = (int)$request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } + $count = min(max((int) $request->get('q'), 1), 500); $arr = []; $pdo = $this->pool->get(); $world = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); $update = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?'); - while ($query_count--) { + while ($count--) { $id = mt_rand(1, 10000); $world->execute([$id]); $item = $world->fetch(PDO::FETCH_ASSOC); diff --git a/frameworks/PHP/workerman/Pgsql.php b/frameworks/PHP/workerman/Pgsql.php index f86dc6364af..4f4be58fe44 100644 --- a/frameworks/PHP/workerman/Pgsql.php +++ b/frameworks/PHP/workerman/Pgsql.php @@ -28,37 +28,21 @@ public function __construct() function update($request): array { - $query_count = 1; - $q = (int)$request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); + $queries = $request->get('q'); + $worlds = $keys = $values = []; + $count = min(max((int) $queries, 1), 500); + for ($i = 0; $i < $count; ++ $i) { + $values[] = $keys[] = $id = mt_rand(1, 10000); + $this->random->execute([$id]); + $row = $this->random->fetch(); + $values[] = $row['randomNumber'] = mt_rand(1, 10000); + $worlds[] = $row; } - $worlds = []; - while ($query_count--) { - $this->random->execute([\mt_rand(1, 10000)]); - $world = $this->random->fetch(); - $world['randomNumber'] = \mt_rand(1, 10000); - $worlds[] = $world; + if (!isset($this->updates[$count])) { + $sql = 'UPDATE World SET randomNumber = CASE id' . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $count) . 'END WHERE id IN (' . str_repeat('?::INTEGER,', $count - 1) . '?::INTEGER)'; + $this->updates[$count] = $this->pdo->prepare($sql); } - $rows = count($worlds); - - if (!isset($this->updates[$rows])) { - $sql = 'UPDATE world SET randomNumber = CASE id' - . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) - . 'END WHERE id IN (' - . str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)'; - - $this->updates[$rows] = $this->pdo->prepare($sql); - } - - $val = []; - $keys = []; - foreach ($worlds as $world) { - $val[] = $keys[] = $world['id']; - $val[] = $world['randomNumber']; - } - - $this->updates[$rows]->execute([...$val, ...$keys]); + $this->updates[$count]->execute([...$values, ...$keys]); return $worlds; } diff --git a/frameworks/PHP/workerman/PgsqlSwoole.php b/frameworks/PHP/workerman/PgsqlSwoole.php index 1a999aac982..0a8b99dfc18 100644 --- a/frameworks/PHP/workerman/PgsqlSwoole.php +++ b/frameworks/PHP/workerman/PgsqlSwoole.php @@ -23,15 +23,11 @@ public function __construct($size) function update($request): array { - $query_count = 1; - $q = (int)$request->get('q'); - if ($q > 1) { - $query_count = min($q, 500); - } + $count = min(max((int) $request->get('q'), 1), 500); $worlds = []; $pdo = $this->pool->get(); $random = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); - while ($query_count--) { + while ($count--) { $random->execute([mt_rand(1, 10000)]); $world = $random->fetch(PDO::FETCH_ASSOC); $world['randomNumber'] = mt_rand(1, 10000); diff --git a/frameworks/PHP/workerman/benchmark_config.json b/frameworks/PHP/workerman/benchmark_config.json index a2077767b43..8e79f1b124c 100644 --- a/frameworks/PHP/workerman/benchmark_config.json +++ b/frameworks/PHP/workerman/benchmark_config.json @@ -108,28 +108,6 @@ "notes": "", "versus": "php" }, - "pgsql-swow": { - "dockerfile": "workerman-pgsql-swow-jit.dockerfile", - "db_url": "/db", - "query_url": "/query?q=", - "update_url": "/update?q=", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "workerman", - "language": "PHP", - "flavor": "PHP8", - "orm": "Raw", - "platform": "workerman", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "workerman [jit, pgsql, swow, async]", - "notes": "", - "versus": "php" - }, "mysql-swow": { "dockerfile": "workerman-mysql-swow-jit.dockerfile", "db_url": "/db", @@ -152,28 +130,6 @@ "notes": "", "versus": "php" }, - "pgsql-swoole": { - "dockerfile": "workerman-pgsql-swoole-jit.dockerfile", - "db_url": "/db", - "query_url": "/query?q=", - "update_url": "/update?q=", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "workerman", - "language": "PHP", - "flavor": "PHP8", - "orm": "Raw", - "platform": "workerman", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "workerman [jit, pgsql, swoole, async]", - "notes": "", - "versus": "php" - }, "mysql-swoole": { "dockerfile": "workerman-mysql-swoole-jit.dockerfile", "db_url": "/db", diff --git a/frameworks/PHP/workerman/server.php b/frameworks/PHP/workerman/server.php index a8499e4f538..8f845329bf2 100644 --- a/frameworks/PHP/workerman/server.php +++ b/frameworks/PHP/workerman/server.php @@ -1,6 +1,7 @@ reusePort = true; +$http_worker->reusePort = true; $http_worker->count = $process_count; $http_worker->onWorkerStart = static function () use ($test_type, $pool_size, &$db, &$date) { $db = match ($test_type) { @@ -28,12 +30,10 @@ }; $date = new Date(); }; -if ($test_type === 'default') { - Worker::$eventLoopClass = Select::class; -} elseif (in_array($test_type, ['pgsql-swow', 'mysql-swow'])) { - Worker::$eventLoopClass = Swow::class; -} elseif (in_array($test_type, ['pgsql-swoole', 'mysql-swoole'])) { - Worker::$eventLoopClass = Swoole::class; + +Worker::$eventLoopClass = "Workerman\\Events\\$event_loop"; +if ($event_loop === 'Swoole') { + Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]); } $http_worker->onMessage = static function ($connection, $request) use (&$db, &$date) { diff --git a/frameworks/PHP/workerman/workerman-jit.dockerfile b/frameworks/PHP/workerman/workerman-jit.dockerfile index 6ff432c60b8..47ae11800d2 100644 --- a/frameworks/PHP/workerman/workerman-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-jit.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE default ENV PROCESS_MULTIPLIER 1 +ENV EVENT_LOOP Select ARG DEBIAN_FRONTEND=noninteractive @@ -9,18 +10,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 > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-mysql php8.4-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY php-jit.ini /etc/php/8.4/cli/conf.d/10-opcache.ini EXPOSE 8080 diff --git a/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile b/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile index 33ad3879954..8992f918a0d 100644 --- a/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-mysql-jit.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE mysql ENV PROCESS_MULTIPLIER 4 +ENV EVENT_LOOP Event ARG DEBIAN_FRONTEND=noninteractive @@ -9,18 +10,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 > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-mysql php8.4-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY php-jit.ini /etc/php/8.4/cli/conf.d/10-opcache.ini EXPOSE 8080 diff --git a/frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile b/frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile index eb88aae9c88..54440a5a047 100644 --- a/frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile @@ -4,6 +4,7 @@ ENV TEST_TYPE mysql-swoole ENV SWOOLE_VERSION 5.1.5 ENV PROCESS_MULTIPLIER 1 ENV POOL_SIZE 4 +ENV EVENT_LOOP Swoole ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile b/frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile index 2e3e571dbce..ffab87c078d 100644 --- a/frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile @@ -3,6 +3,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE mysql-swow ENV PROCESS_MULTIPLIER 1 ENV POOL_SIZE 4 +ENV EVENT_LOOP Swow ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile b/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile index dcd2ce482e9..f1e84f54011 100644 --- a/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE pgsql ENV PROCESS_MULTIPLIER 4 +ENV EVENT_LOOP Event ARG DEBIAN_FRONTEND=noninteractive @@ -9,18 +10,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 > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY php-jit.ini /etc/php/8.4/cli/conf.d/10-opcache.ini EXPOSE 8080 diff --git a/frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile b/frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile index fbc563d68f9..09a6026a853 100644 --- a/frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile @@ -4,6 +4,7 @@ ENV TEST_TYPE pgsql-swoole ENV SWOOLE_VERSION 5.1.5 ENV PROCESS_MULTIPLIER 2 ENV POOL_SIZE 16 +ENV EVENT_LOOP Swoole ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile b/frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile index d58d7b4865d..72557d22306 100644 --- a/frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile @@ -3,6 +3,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE pgsql-swow ENV PROCESS_MULTIPLIER 2 ENV POOL_SIZE 16 +ENV EVENT_LOOP Swow ARG DEBIAN_FRONTEND=noninteractive diff --git a/frameworks/PHP/workerman/workerman-pgsql.dockerfile b/frameworks/PHP/workerman/workerman-pgsql.dockerfile index fc12352dd8f..f8209fb7d00 100644 --- a/frameworks/PHP/workerman/workerman-pgsql.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE pgsql ENV PROCESS_MULTIPLIER 4 +ENV EVENT_LOOP Event ARG DEBIAN_FRONTEND=noninteractive @@ -9,18 +10,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 > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php.ini /etc/php/8.3/cli/php.ini +COPY php.ini /etc/php/8.4/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/workerman/workerman.dockerfile b/frameworks/PHP/workerman/workerman.dockerfile index 6cff7987f3a..8d93101166f 100644 --- a/frameworks/PHP/workerman/workerman.dockerfile +++ b/frameworks/PHP/workerman/workerman.dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:24.04 ENV TEST_TYPE default ENV PROCESS_MULTIPLIER 1 +ENV EVENT_LOOP Select ARG DEBIAN_FRONTEND=noninteractive @@ -9,18 +10,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 > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-mysql php8.4-xml > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \ - pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \ + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini WORKDIR /workerman COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php.ini /etc/php/8.3/cli/php.ini +COPY php.ini /etc/php/8.4/cli/php.ini EXPOSE 8080 From c4a097c8d51d00e13237c20c05ca5b7b2a0d7df1 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 25 Nov 2024 18:00:47 +0100 Subject: [PATCH 0912/1766] [php] Wolff update to PHP 8.4 (#9415) --- frameworks/PHP/wolff/wolff.dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/PHP/wolff/wolff.dockerfile b/frameworks/PHP/wolff/wolff.dockerfile index a22a0ceb76c..d3dfc84bfad 100644 --- a/frameworks/PHP/wolff/wolff.dockerfile +++ b/frameworks/PHP/wolff/wolff.dockerfile @@ -1,26 +1,26 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-dev php8.3-curl > /dev/null + php8.4-fpm php8.4-mysql php8.4-xml php8.4-mbstring php8.4-intl php8.4-dev php8.4-curl > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /wolff WORKDIR /wolff +COPY --link . . 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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /wolff EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /wolff/deploy/nginx.conf 2>&1 > /dev/stderr From 121b08e983dd0c3d5b8359f8d1ec2af14ff59578 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 25 Nov 2024 18:00:56 +0100 Subject: [PATCH 0913/1766] [php] Mark update to PHP 8.4 (#9414) --- frameworks/PHP/mark/mark.dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/PHP/mark/mark.dockerfile b/frameworks/PHP/mark/mark.dockerfile index 1785231f315..7f6b8180969 100644 --- a/frameworks/PHP/mark/mark.dockerfile +++ b/frameworks/PHP/mark/mark.dockerfile @@ -1,24 +1,24 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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 php8.3-cli php8.3-pgsql php8.3-xml > /dev/null + apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY php.ini /etc/php/8.3/cli/php.ini +COPY php.ini /etc/php/8.4/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.3/cli/conf.d/10-opcache.ini +RUN sed -i "s|opcache.jit=off|opcache.jit=tracing|g" /etc/php/8.4/cli/conf.d/10-opcache.ini EXPOSE 8080 From 258ea16a3423db46ac3c7edeac055a4a82085735 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 25 Nov 2024 18:01:09 +0100 Subject: [PATCH 0914/1766] [php] Duck update to PHP 8.4 (#9413) --- frameworks/PHP/duckphp/duckphp.dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/PHP/duckphp/duckphp.dockerfile b/frameworks/PHP/duckphp/duckphp.dockerfile index f81fcdb546f..ae97dfc8cf6 100644 --- a/frameworks/PHP/duckphp/duckphp.dockerfile +++ b/frameworks/PHP/duckphp/duckphp.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.3-cli php8.3-fpm php8.3-mysql php8.3-dev > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql php8.4-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /duckphp WORKDIR /duckphp +COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /duckphp/deploy/nginx.conf From b70bdad3d17a1fa06b428d8d0bf617b59ee66b06 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 25 Nov 2024 18:01:18 +0100 Subject: [PATCH 0915/1766] [php] Comet update to PHP-8.4 (#9412) --- frameworks/PHP/comet/comet.dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/comet/comet.dockerfile b/frameworks/PHP/comet/comet.dockerfile index b210108832e..2cfbc0935c6 100644 --- a/frameworks/PHP/comet/comet.dockerfile +++ b/frameworks/PHP/comet/comet.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-xml php8.4-mbstring > /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.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null +RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY php.ini /etc/php/8.3/cli/php.ini +COPY php.ini /etc/php/8.4/cli/php.ini ADD ./ /comet WORKDIR /comet From cff810230ed23bf422f5363d5befec5bd6db48c8 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 25 Nov 2024 18:01:27 +0100 Subject: [PATCH 0916/1766] [php] CakePHP update to PHP-8.4 (#9411) #9408 --- frameworks/PHP/cakephp/cakephp.dockerfile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/PHP/cakephp/cakephp.dockerfile b/frameworks/PHP/cakephp/cakephp.dockerfile index 438d467b820..3ebafcb9d8c 100644 --- a/frameworks/PHP/cakephp/cakephp.dockerfile +++ b/frameworks/PHP/cakephp/cakephp.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-dev php8.3-curl php-xdebug > /dev/null + php8.4-fpm php8.4-mysql php8.4-xml php8.4-mbstring php8.4-intl php8.4-dev php8.4-curl php-xdebug > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ -COPY deploy/conf/* /etc/php/8.3/cli/ +COPY deploy/conf/* /etc/php/8.4/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/fpm/php-fpm.conf ; fi; -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN chmod -R 777 /cakephp -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /cakephp/deploy/nginx.conf From e571749c550aed7ee0bb4e8a2573339082fd85e5 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 25 Nov 2024 18:01:39 +0100 Subject: [PATCH 0917/1766] Php-8.4 (#9410) * [toolset] Postgresql update to v17 * [php] Update to v8.4 --- frameworks/PHP/php/php-caddy.dockerfile | 12 ++++++------ frameworks/PHP/php/php-eloquent.dockerfile | 11 +++++------ frameworks/PHP/php/php-h2o.dockerfile | 4 ++-- .../PHP/php/php-laravel-query-builder.dockerfile | 10 +++++----- frameworks/PHP/php/php-pgsql-raw.dockerfile | 10 +++++----- frameworks/PHP/php/php-pools.dockerfile | 12 ++++++------ frameworks/PHP/php/php-raw7-tcp.dockerfile | 14 +++++++------- frameworks/PHP/php/php.dockerfile | 12 ++++++------ 8 files changed, 42 insertions(+), 43 deletions(-) diff --git a/frameworks/PHP/php/php-caddy.dockerfile b/frameworks/PHP/php/php-caddy.dockerfile index e148b16570f..0f75378cccf 100644 --- a/frameworks/PHP/php/php-caddy.dockerfile +++ b/frameworks/PHP/php/php-caddy.dockerfile @@ -1,15 +1,15 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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 > /dev/null && \ - apt-get update -yqq > /dev/null && apt-get upgrade -yqq + apt-get update -yqq > /dev/null && apt-get upgrade -yqq RUN apt-get install -yqq git unzip curl \ - php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-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 615f0a10072..ea2e74e1c9a 100644 --- a/frameworks/PHP/php/php-eloquent.dockerfile +++ b/frameworks/PHP/php/php-eloquent.dockerfile @@ -1,20 +1,20 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/fpm/php-fpm.conf ; fi; COPY deploy/eloquent/composer* ./ RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -23,6 +23,5 @@ RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-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 3de194e526b..f61bbdbcea6 100644 --- a/frameworks/PHP/php/php-h2o.dockerfile +++ b/frameworks/PHP/php/php-h2o.dockerfile @@ -44,7 +44,7 @@ RUN apt-get -yqq update && \ FROM "ubuntu:${UBUNTU_VERSION}" -ARG PHP_VERSION=8.3 +ARG PHP_VERSION=8.4 ENV TZ=America/Los_Angeles @@ -75,5 +75,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.3-fpm start && \ + service php8.4-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 2ca94a15881..ea2e74e1c9a 100644 --- a/frameworks/PHP/php/php-laravel-query-builder.dockerfile +++ b/frameworks/PHP/php/php-laravel-query-builder.dockerfile @@ -1,20 +1,20 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/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.3-fpm start && \ +CMD service php8.4-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 374656d40b9..c3d3c922718 100644 --- a/frameworks/PHP/php/php-pgsql-raw.dockerfile +++ b/frameworks/PHP/php/php-pgsql-raw.dockerfile @@ -1,13 +1,13 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-pgsql > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-pgsql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-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 b62917e0ec3..e217f448e88 100644 --- a/frameworks/PHP/php/php-pools.dockerfile +++ b/frameworks/PHP/php/php-pools.dockerfile @@ -1,23 +1,23 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ ADD ./ /php WORKDIR /php -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; +COPY deploy/conf/php-fpm-pools.conf /etc/php/8.4/fpm/php-fpm.conf +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 512|pm.max_children = 256|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-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 c8cd5eb855c..2dde7c65ee0 100644 --- a/frameworks/PHP/php/php-raw7-tcp.dockerfile +++ b/frameworks/PHP/php/php-raw7-tcp.dockerfile @@ -1,25 +1,25 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/fpm/php-fpm.conf +RUN sed -i "s|listen = /run/php/php-fpm.sock|listen = 127.0.0.1:9001|g" /etc/php/8.4/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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.3-fpm start && \ - nginx -c /php/deploy/nginx7.conf -g "daemon off;" \ No newline at end of file +CMD service php8.4-fpm start && \ + nginx -c /php/deploy/nginx7.conf -g "daemon off;" diff --git a/frameworks/PHP/php/php.dockerfile b/frameworks/PHP/php/php.dockerfile index 5ad4298427f..495e54b5631 100644 --- a/frameworks/PHP/php/php.dockerfile +++ b/frameworks/PHP/php/php.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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 RUN apt-get install -yqq nginx git unzip \ - php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; +RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.4/fpm/conf.d/10-opcache.ini RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /php/deploy/nginx7.conf -g "daemon off;" From 97891cd12cdcfc00ba8b0f2c92f119f1c473b48a Mon Sep 17 00:00:00 2001 From: walkor Date: Tue, 26 Nov 2024 01:01:53 +0800 Subject: [PATCH 0918/1766] [PHP] Remove pgsql tests for swoole and swow from workerman (#9409) * Remove pgsql tests for swoole and swow * Code optimization From bb5e72afbb57cc105b8df96a70273de4c2708561 Mon Sep 17 00:00:00 2001 From: walkor Date: Tue, 26 Nov 2024 01:02:54 +0800 Subject: [PATCH 0919/1766] [php] Webman update to PHP 8.4 (#9425) * [php] Webman update to PHP 8.4 * Remove maintainers --- frameworks/PHP/webman/app/controller/Index.php | 12 ++++++------ frameworks/PHP/webman/benchmark_config.json | 1 - frameworks/PHP/webman/composer.json | 10 ++++++---- frameworks/PHP/webman/webman-pgsql.dockerfile | 12 ++++++------ frameworks/PHP/webman/webman.dockerfile | 12 ++++++------ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/frameworks/PHP/webman/app/controller/Index.php b/frameworks/PHP/webman/app/controller/Index.php index 947e85a0d0b..1b27503762f 100644 --- a/frameworks/PHP/webman/app/controller/Index.php +++ b/frameworks/PHP/webman/app/controller/Index.php @@ -9,7 +9,7 @@ class Index { - public function plaintext($request) + public function plaintext() { return new Response(200, [ 'Content-Type' => 'text/plain', @@ -18,7 +18,7 @@ public function plaintext($request) } - public function json($request) + public function json() { return new Response(200, [ 'Content-Type' => 'application/json', @@ -26,7 +26,7 @@ public function json($request) ], json_encode(['message' => 'Hello, World!'])); } - public function db($request) + public function db() { $statement = Db::$random; $statement->execute([\mt_rand(1, 10000)]); @@ -37,7 +37,7 @@ public function db($request) ], json_encode($statement->fetch())); } - public function fortunes($request) + public function fortunes() { $fortune = Db::$fortune; @@ -59,7 +59,7 @@ public function fortunes($request) ); } - public function queries($request, $q = 1) + public function queries(Request $request, $q = 1) { $statement = Db::$random; @@ -80,7 +80,7 @@ public function queries($request, $q = 1) ], json_encode($arr)); } - public function updates($request, $q = 1) + public function updates(Request $request, $q = 1) { $random = Db::$random; diff --git a/frameworks/PHP/webman/benchmark_config.json b/frameworks/PHP/webman/benchmark_config.json index 7e185ce1b24..5c2a7f4d4bf 100644 --- a/frameworks/PHP/webman/benchmark_config.json +++ b/frameworks/PHP/webman/benchmark_config.json @@ -1,6 +1,5 @@ { "framework": "webman", - "maintainers": ["walkor"], "tests": [{ "default": { "dockerfile": "webman.dockerfile", diff --git a/frameworks/PHP/webman/composer.json b/frameworks/PHP/webman/composer.json index 73af23714b2..317e6598381 100644 --- a/frameworks/PHP/webman/composer.json +++ b/frameworks/PHP/webman/composer.json @@ -25,9 +25,10 @@ }, "require": { "php": ">=7.2", - "workerman/webman-framework": "^1.0", + "workerman/webman-framework": "dev-master", "monolog/monolog": "^2.0", - "vlucas/phpdotenv": ">=4.1,<6.0" + "vlucas/phpdotenv": ">=4.1,<6.0", + "workerman/workerman": "dev-master" }, "suggest": { "ext-event": "For better performance. " @@ -51,5 +52,6 @@ "pre-package-uninstall": [ "support\\Plugin::uninstall" ] - } -} + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/frameworks/PHP/webman/webman-pgsql.dockerfile b/frameworks/PHP/webman/webman-pgsql.dockerfile index 491396785ea..2fe12ba3529 100644 --- a/frameworks/PHP/webman/webman-pgsql.dockerfile +++ b/frameworks/PHP/webman/webman-pgsql.dockerfile @@ -8,19 +8,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 php8.3-cli php8.3-pgsql php8.3-xml > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-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.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini +RUN apt-get update -yqq && apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini -ADD ./ /webman WORKDIR /webman +COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY php.ini /etc/php/8.4/cli/conf.d/10-opcache.ini EXPOSE 8080 -CMD php /webman/start.php start +CMD php /webman/start.php start \ No newline at end of file diff --git a/frameworks/PHP/webman/webman.dockerfile b/frameworks/PHP/webman/webman.dockerfile index 20ef9d61064..6020fed75ed 100644 --- a/frameworks/PHP/webman/webman.dockerfile +++ b/frameworks/PHP/webman/webman.dockerfile @@ -8,19 +8,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 php8.3-cli php8.3-pgsql php8.3-xml > /dev/null +RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-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.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini +RUN apt-get update -yqq && apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini -ADD ./ /webman WORKDIR /webman +COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY php.ini /etc/php/8.4/cli/conf.d/10-opcache.ini EXPOSE 8080 -CMD php /webman/start.php start +CMD php /webman/start.php start \ No newline at end of file From d078293effd0c3df5ce321a26482e8c8c807e6a0 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Mon, 25 Nov 2024 09:03:04 -0800 Subject: [PATCH 0920/1766] ntex optimizations (#9406) * cpu affinity * ntex optimizations * remove smallvec * wip --- frameworks/Rust/ntex/Cargo.toml | 18 +++--- frameworks/Rust/ntex/src/db.rs | 67 +++++++++++---------- frameworks/Rust/ntex/src/main.rs | 31 +++++++--- frameworks/Rust/ntex/src/main_db.rs | 19 +++++- frameworks/Rust/ntex/src/main_plt.rs | 32 +++++++--- frameworks/Rust/ntex/src/utils.rs | 36 ++++++++++- frameworks/Rust/ntex/templates/fortune.hbs | 6 +- frameworks/Rust/ntex/templates/fortune.html | 12 ---- frameworks/Rust/ntex/templates/fortune.stpl | 10 --- 9 files changed, 149 insertions(+), 82 deletions(-) delete mode 100644 frameworks/Rust/ntex/templates/fortune.html delete mode 100644 frameworks/Rust/ntex/templates/fortune.stpl diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index ec2173e26e3..3bbf3dffa0f 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -34,11 +34,11 @@ default = [] tokio = ["ntex/tokio"] # compio runtime -compio = ["ntex/compio", ] +compio = ["ntex/compio"] [dependencies] -ntex = "2.4" -ntex-compio = "0.1.2" +ntex = "2.8" +ntex-compio = "0.2" 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"] } @@ -47,16 +47,18 @@ buf-min = { version = "0.7", features = ["ntex-bytes"] } env_logger = "0.11" nanorand = { version = "0.7", default-features = false, features = ["std", "wyrand", "tls"] } atoi = "2.0" -num_cpus = "1.16" -smallvec = "1.13" +core_affinity = "0.8" futures = "0.3" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" +sonic-rs = "0.3.16" +serde = { version = "1", features = ["derive"] } +serde_json = "1" log = { version = "0.4", features = ["release_max_level_off"] } -compio-driver = { version = "0.4", features = ["io-uring", "io-uring-socket"]} tok_io = {version = "1", package = "tokio" } tokio-postgres = { git="https://github.com/fafhrd91/postgres.git", branch="ntex-2" } +[target.'cfg(target_os = "linux")'.dependencies] +compio-driver = { version = "*", features = ["io-uring"]} + [profile.release] opt-level = 3 codegen-units = 1 diff --git a/frameworks/Rust/ntex/src/db.rs b/frameworks/Rust/ntex/src/db.rs index c5d525eb6de..cd4443f3c00 100644 --- a/frameworks/Rust/ntex/src/db.rs +++ b/frameworks/Rust/ntex/src/db.rs @@ -2,26 +2,31 @@ use std::{borrow::Cow, cell::RefCell, fmt::Write as FmtWrite}; use nanorand::{Rng, WyRand}; -use ntex::util::{BufMut, Bytes, BytesMut}; -use smallvec::SmallVec; +use ntex::util::{Bytes, BytesMut}; use tokio_postgres::types::ToSql; use tokio_postgres::{connect, Client, Statement}; -use yarte::{ywrite_html, Serialize}; +use yarte::TemplateBytesTrait; use super::utils; -#[derive(Copy, Clone, Serialize, Debug)] +#[derive(Copy, Clone, Debug, sonic_rs::Serialize)] pub struct World { pub id: i32, pub randomnumber: i32, } -#[derive(Serialize, Debug)] +#[derive(Debug, sonic_rs::Serialize)] pub struct Fortune { pub id: i32, pub message: Cow<'static, str>, } +#[derive(yarte::TemplateBytes)] +#[template(path = "fortune.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + /// Postgres interface pub struct PgConnection { cl: Client, @@ -30,6 +35,7 @@ pub struct PgConnection { rng: WyRand, updates: Vec, buf: RefCell, + fbuf: RefCell>, } impl PgConnection { @@ -69,6 +75,7 @@ impl PgConnection { updates, rng: WyRand::new(), buf: RefCell::new(BytesMut::with_capacity(10 * 1024 * 1024)), + fbuf: RefCell::new(Vec::with_capacity(64)), } } } @@ -81,23 +88,26 @@ impl PgConnection { let mut body = self.buf.borrow_mut(); utils::reserve(&mut body, 1024); - World { - id: row.get(0), - randomnumber: row.get(1), - } - .to_bytes_mut(&mut *body); + sonic_rs::to_writer( + utils::BytesWriter(&mut body), + &World { + id: row.get(0), + randomnumber: row.get(1), + }, + ) + .unwrap(); body.split().freeze() } pub async fn get_worlds(&self, num: usize) -> Bytes { let mut rng = self.rng.clone(); - let mut queries = SmallVec::<[_; 32]>::new(); + let mut queries = Vec::with_capacity(num); (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; queries.push(self.cl.query_one(&self.world, &[&w_id])); }); - let mut worlds = SmallVec::<[_; 32]>::new(); + let mut worlds = Vec::with_capacity(num); for fut in queries { let row = fut.await.unwrap(); worlds.push(World { @@ -108,25 +118,19 @@ impl PgConnection { let mut body = self.buf.borrow_mut(); utils::reserve(&mut body, 2 * 1024); - body.put_u8(b'['); - worlds.iter().for_each(|w| { - w.to_bytes_mut(&mut *body); - body.put_u8(b','); - }); - let idx = body.len() - 1; - body[idx] = b']'; + sonic_rs::to_writer(utils::BytesWriter(&mut body), &worlds[..]).unwrap(); body.split().freeze() } pub async fn update(&self, num: usize) -> Bytes { let mut rng = nanorand::tls_rng(); - let mut queries = SmallVec::<[_; 32]>::new(); + let mut queries = Vec::with_capacity(num); (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; queries.push(self.cl.query_one(&self.world, &[&w_id])); }); - let mut worlds = SmallVec::<[_; 32]>::new(); + let mut worlds = Vec::with_capacity(num); for fut in queries.into_iter() { let row = fut.await.unwrap(); worlds.push(World { @@ -147,23 +151,18 @@ impl PgConnection { let mut body = self.buf.borrow_mut(); utils::reserve(&mut body, 2 * 1024); - body.put_u8(b'['); - worlds.iter().for_each(|w| { - w.to_bytes_mut(&mut *body); - body.put_u8(b','); - }); - let idx = body.len() - 1; - body[idx] = b']'; + sonic_rs::to_writer(utils::BytesWriter(&mut body), &worlds[..]).unwrap(); body.split().freeze() } pub async fn tell_fortune(&self) -> Bytes { let rows = self.cl.query_raw(&self.fortune, &[]).await.unwrap(); - let mut fortunes: SmallVec<[_; 32]> = smallvec::smallvec![Fortune { + let mut fortunes = self.fbuf.borrow_mut(); + fortunes.push(Fortune { id: 0, message: Cow::Borrowed("Additional fortune added at request time."), - }]; + }); fortunes.extend(rows.iter().map(|row| Fortune { id: row.get(0), message: Cow::Owned(row.get(1)), @@ -172,7 +171,13 @@ impl PgConnection { let mut body = std::mem::replace(&mut *self.buf.borrow_mut(), BytesMut::new()); utils::reserve(&mut body, 4 * 1024); - ywrite_html!(body, "{{> fortune }}"); + + FortunesTemplate { + fortunes: &*fortunes, + } + .write_call(&mut body); + fortunes.clear(); + let result = body.split().freeze(); let _ = std::mem::replace(&mut *self.buf.borrow_mut(), body); result diff --git a/frameworks/Rust/ntex/src/main.rs b/frameworks/Rust/ntex/src/main.rs index 218ed03c727..5210d85863f 100644 --- a/frameworks/Rust/ntex/src/main.rs +++ b/frameworks/Rust/ntex/src/main.rs @@ -2,8 +2,8 @@ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; use ntex::http::header::{CONTENT_TYPE, SERVER}; -use ntex::{http, time::Seconds, util::BytesMut, util::PoolId, web}; -use yarte::Serialize; +use ntex::{http, time::Seconds, util::BytesMut, util::PoolId, util::Ready, web}; +use sonic_rs::Serialize; mod utils; @@ -15,10 +15,13 @@ pub struct Message { #[web::get("/json")] async fn json() -> web::HttpResponse { let mut body = BytesMut::with_capacity(utils::SIZE); - Message { - message: "Hello, World!", - } - .to_bytes_mut(&mut body); + sonic_rs::to_writer( + utils::BytesWriter(&mut body), + &Message { + message: "Hello, World!", + }, + ) + .unwrap(); let mut response = web::HttpResponse::with_body(http::StatusCode::OK, body.into()); response.headers_mut().insert(SERVER, utils::HDR_SERVER); @@ -45,6 +48,10 @@ async fn plaintext() -> web::HttpResponse { async fn main() -> std::io::Result<()> { println!("Started http server: 127.0.0.1:8080"); + let cores = core_affinity::get_core_ids().unwrap(); + let total_cores = cores.len(); + let cores = std::sync::Arc::new(std::sync::Mutex::new(cores)); + // start http server ntex::server::build() .backlog(1024) @@ -60,7 +67,17 @@ async fn main() -> std::io::Result<()> { .payload_read_rate(Seconds::ZERO, Seconds::ZERO, 0) .h1(web::App::new().service(json).service(plaintext).finish()) })? - .workers(num_cpus::get()) + .configure(move |cfg| { + let cores = cores.clone(); + cfg.on_worker_start(move |_| { + if let Some(core) = cores.lock().unwrap().pop() { + core_affinity::set_for_current(core); + } + Ready::<_, &str>::Ok(()) + }); + Ok(()) + })? + .workers(total_cores) .run() .await } diff --git a/frameworks/Rust/ntex/src/main_db.rs b/frameworks/Rust/ntex/src/main_db.rs index 78c21fa7132..4197322bc13 100644 --- a/frameworks/Rust/ntex/src/main_db.rs +++ b/frameworks/Rust/ntex/src/main_db.rs @@ -1,13 +1,12 @@ #[cfg(not(target_os = "macos"))] #[global_allocator] static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; -// static GLOBAL: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc; 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::PoolId}; +use ntex::{time::Seconds, util::PoolId, util::Ready}; mod db; mod utils; @@ -83,6 +82,10 @@ impl ServiceFactory for AppFactory { async fn main() -> std::io::Result<()> { println!("Starting http server: 127.0.0.1:8080"); + let cores = core_affinity::get_core_ids().unwrap(); + let total_cores = cores.len(); + let cores = std::sync::Arc::new(std::sync::Mutex::new(cores)); + ntex::server::build() .backlog(1024) .bind("techempower", "0.0.0.0:8080", |cfg| { @@ -97,7 +100,17 @@ async fn main() -> std::io::Result<()> { .payload_read_rate(Seconds::ZERO, Seconds::ZERO, 0) .h1(AppFactory) })? - .workers(num_cpus::get()) + .configure(move |cfg| { + let cores = cores.clone(); + cfg.on_worker_start(move |_| { + if let Some(core) = cores.lock().unwrap().pop() { + core_affinity::set_for_current(core); + } + Ready::<_, &str>::Ok(()) + }); + Ok(()) + })? + .workers(total_cores) .run() .await } diff --git a/frameworks/Rust/ntex/src/main_plt.rs b/frameworks/Rust/ntex/src/main_plt.rs index b6c435f6773..9cc80ac9952 100644 --- a/frameworks/Rust/ntex/src/main_plt.rs +++ b/frameworks/Rust/ntex/src/main_plt.rs @@ -3,8 +3,9 @@ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; use std::{future::Future, io, pin::Pin, task::Context, task::Poll}; -use ntex::{fn_service, http::h1, io::Io, io::RecvError, util::ready, util::PoolId}; -use yarte::Serialize; +use ntex::util::{ready, PoolId, Ready}; +use ntex::{fn_service, http::h1, io::Io, io::RecvError}; +use sonic_rs::Serialize; mod utils; @@ -42,10 +43,13 @@ impl Future for App { buf.extend_from_slice(JSON); this.codec.set_date_header(buf); - Message { - message: "Hello, World!", - } - .to_bytes_mut(buf); + sonic_rs::to_writer( + utils::BytesWriter(buf), + &Message { + message: "Hello, World!", + }, + ) + .unwrap(); } "/plaintext" => { buf.extend_from_slice(PLAIN); @@ -75,6 +79,10 @@ impl Future for App { async fn main() -> io::Result<()> { println!("Started http server: 127.0.0.1:8080"); + let cores = core_affinity::get_core_ids().unwrap(); + let total_cores = cores.len(); + let cores = std::sync::Arc::new(std::sync::Mutex::new(cores)); + // start http server ntex::server::build() .backlog(1024) @@ -88,7 +96,17 @@ async fn main() -> io::Result<()> { codec: h1::Codec::default(), }) })? - .workers(num_cpus::get()) + .configure(move |cfg| { + let cores = cores.clone(); + cfg.on_worker_start(move |_| { + if let Some(core) = cores.lock().unwrap().pop() { + core_affinity::set_for_current(core); + } + Ready::<_, &str>::Ok(()) + }); + Ok(()) + })? + .workers(total_cores) .run() .await } diff --git a/frameworks/Rust/ntex/src/utils.rs b/frameworks/Rust/ntex/src/utils.rs index 719d5962dd4..7a2e6bf1df1 100644 --- a/frameworks/Rust/ntex/src/utils.rs +++ b/frameworks/Rust/ntex/src/utils.rs @@ -1,8 +1,9 @@ #![allow(dead_code)] -use std::cmp; +use std::{cmp, io, io::Write, mem::MaybeUninit, slice::from_raw_parts_mut}; use atoi::FromRadix10; use ntex::{http::header::HeaderValue, util::BufMut, util::Bytes, util::BytesMut}; +use sonic_rs::writer::WriteExt; pub const HDR_SERVER: HeaderValue = HeaderValue::from_static("N"); pub const HDR_JSON_CONTENT_TYPE: HeaderValue = HeaderValue::from_static("application/json"); @@ -30,3 +31,36 @@ pub fn reserve(buf: &mut BytesMut, lw: usize) { buf.reserve(HW); } } + +pub struct BytesWriter<'a>(pub &'a mut BytesMut); + +impl<'a> Write for BytesWriter<'a> { + fn write(&mut self, src: &[u8]) -> Result { + self.0.extend_from_slice(src); + Ok(src.len()) + } + + fn flush(&mut self) -> Result<(), io::Error> { + Ok(()) + } +} + +impl<'a> WriteExt for BytesWriter<'a> { + #[inline(always)] + fn reserve_with(&mut self, additional: usize) -> Result<&mut [MaybeUninit], io::Error> { + self.0.reserve(additional); + + unsafe { + let ptr = self.0.as_mut_ptr().add(self.0.len()) as *mut MaybeUninit; + Ok(from_raw_parts_mut(ptr, additional)) + } + } + + #[inline(always)] + unsafe fn flush_len(&mut self, additional: usize) { + unsafe { + let new_len = self.0.len() + additional; + self.0.set_len(new_len); + } + } +} diff --git a/frameworks/Rust/ntex/templates/fortune.hbs b/frameworks/Rust/ntex/templates/fortune.hbs index b9e25a52a8e..499ac5ae966 100644 --- a/frameworks/Rust/ntex/templates/fortune.hbs +++ b/frameworks/Rust/ntex/templates/fortune.hbs @@ -1,5 +1,5 @@ Fortunes - {{~# each fortunes ~}} - - {{~/each ~}} +{{~# each fortunes ~}} + +{{~/each ~}}
      idmessage
      {{id}}{{message}}
      {{id}}{{message}}
      diff --git a/frameworks/Rust/ntex/templates/fortune.html b/frameworks/Rust/ntex/templates/fortune.html deleted file mode 100644 index 7c448b9d999..00000000000 --- a/frameworks/Rust/ntex/templates/fortune.html +++ /dev/null @@ -1,12 +0,0 @@ - - - Fortunes - - - - {% for item in items %} - - {% endfor %} -
      idmessage
      {{item.id}}{{item.message}}
      - - diff --git a/frameworks/Rust/ntex/templates/fortune.stpl b/frameworks/Rust/ntex/templates/fortune.stpl deleted file mode 100644 index 238f470a43d..00000000000 --- a/frameworks/Rust/ntex/templates/fortune.stpl +++ /dev/null @@ -1,10 +0,0 @@ - - - Fortunes - - - - <% for item in items { %><% } %> -
      idmessage
      <%= item.id %><%= &*item.message %>
      - - From 22d66743e206639fc20fda3cddd7d1539d04f5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=B0=8F=E9=A9=AC?= <1417262058@qq.com> Date: Tue, 26 Nov 2024 01:03:12 +0800 Subject: [PATCH 0921/1766] [java] Add hserver and hserver-business (#9405) 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 * Update pom.xml * Update StartApp.java * 1 * 1 * 1 * update jdk version * update version * update version * update version * Update app.properties * Update config.toml * Update benchmark_config.json * Update benchmark_config.json * Update config.toml * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * update version * add hserver-business test --------- Co-authored-by: 黑小马 --- frameworks/Java/hserver-business/README.md | 39 +++++ .../hserver-business/benchmark_config.json | 31 ++++ frameworks/Java/hserver-business/config.toml | 17 +++ .../Java/hserver-business/hserver.dockerfile | 13 ++ frameworks/Java/hserver-business/pom.xml | 52 +++++++ .../main/java/com/test/hserver/StartApp.java | 18 +++ .../java/com/test/hserver/bean/Fortune.java | 24 ++++ .../java/com/test/hserver/bean/Message.java | 13 ++ .../java/com/test/hserver/bean/World.java | 24 ++++ .../hserver/controller/TestController.java | 136 ++++++++++++++++++ .../com/test/hserver/db/DataSourceConfig.java | 25 ++++ .../com/test/hserver/db/PostgresConfig.java | 57 ++++++++ .../java/com/test/hserver/task/TimeAdd.java | 15 ++ .../java/com/test/hserver/util/DateUtil.java | 25 ++++ .../main/java/com/test/hserver/util/Util.java | 18 +++ .../src/main/resources/app.properties | 6 + .../src/main/resources/template/fortunes.ftl | 20 +++ frameworks/Java/hserver/benchmark_config.json | 10 +- frameworks/Java/hserver/config.toml | 6 +- frameworks/Java/hserver/hserver.dockerfile | 6 +- frameworks/Java/hserver/pom.xml | 2 +- .../hserver/controller/TestController.java | 11 +- 22 files changed, 552 insertions(+), 16 deletions(-) create mode 100644 frameworks/Java/hserver-business/README.md create mode 100644 frameworks/Java/hserver-business/benchmark_config.json create mode 100644 frameworks/Java/hserver-business/config.toml create mode 100644 frameworks/Java/hserver-business/hserver.dockerfile create mode 100644 frameworks/Java/hserver-business/pom.xml create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Fortune.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Message.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/World.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/DateUtil.java create mode 100644 frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/Util.java create mode 100644 frameworks/Java/hserver-business/src/main/resources/app.properties create mode 100644 frameworks/Java/hserver-business/src/main/resources/template/fortunes.ftl diff --git a/frameworks/Java/hserver-business/README.md b/frameworks/Java/hserver-business/README.md new file mode 100644 index 00000000000..e7b3ed7ff3f --- /dev/null +++ b/frameworks/Java/hserver-business/README.md @@ -0,0 +1,39 @@ +# HServer Benchmarking Test +This is the HServer portion of a [benchmarking test suite](../) comparing a variety of web development platforms. + +### Tests +* [JSON test source](src/main/java/com/test/hserver/controller/TestController.java) +* [Plaintext test source](src/main/java/com/test/hserver/controller/TestController.java) +* [Data-Store test source](src/main/java/com/test/hserver/controller/TestController.java) +* [Data-Update test source](src/main/java/com/test/hserver/controller/TestController.java) +* [Fortunes test source](src/main/java/com/test/hserver/controller/TestController.java) + +## Infrastructure Software Versions + +* [HServer](https://gitee.com/HServer/HServer) +* [Java OpenJDK 1.8](http://openjdk.java.net/) + +## Test URLs + +### JSON Encoding Test + +http://localhost:8888/json + +### Plain Text Test + +http://localhost:8888/plaintext + +### Data-Store/Database Mapping Test + +http://localhost:8888/db?queries=2 + +### Update Test + +http://localhost:8888/updates?queries=2 + +### Fortunes Test + +http://localhost:8888/fortunes + +### Query Test +http://localhost:8888/queries?queries=2 diff --git a/frameworks/Java/hserver-business/benchmark_config.json b/frameworks/Java/hserver-business/benchmark_config.json new file mode 100644 index 00000000000..3ddb2633a15 --- /dev/null +++ b/frameworks/Java/hserver-business/benchmark_config.json @@ -0,0 +1,31 @@ + +{ + "framework": "hserver", + "tests": [ + { + "default": { + "db_url": "/db", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "json_url": "/json", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "port": 8888, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "hserver", + "language": "Java", + "flavor": "None", + "orm": "Full", + "platform": "hserver", + "webserver": "hserver", + "os": "Linux", + "database_os": "Linux", + "display_name": "hserver-business", + "notes": "", + "versus": "hserver" + } + } + ] +} diff --git a/frameworks/Java/hserver-business/config.toml b/frameworks/Java/hserver-business/config.toml new file mode 100644 index 00000000000..73c489afa9e --- /dev/null +++ b/frameworks/Java/hserver-business/config.toml @@ -0,0 +1,17 @@ +[framework] +name = "hserver-business" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Fullstack" +os = "Linux" +orm = "Full" +platform = "hserver" +webserver = "hserver" +versus = "hserver" diff --git a/frameworks/Java/hserver-business/hserver.dockerfile b/frameworks/Java/hserver-business/hserver.dockerfile new file mode 100644 index 00000000000..372cd10a98d --- /dev/null +++ b/frameworks/Java/hserver-business/hserver.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3.8.4-openjdk-17-slim as maven +WORKDIR /hserver +COPY pom.xml pom.xml +COPY src src +RUN mvn package + +FROM openjdk:17.0.2 +WORKDIR /hserver +COPY --from=maven /hserver/target/hserver-1.0.jar app.jar + +EXPOSE 8888 + +CMD ["java", "-jar", "app.jar"] diff --git a/frameworks/Java/hserver-business/pom.xml b/frameworks/Java/hserver-business/pom.xml new file mode 100644 index 00000000000..70d6e1b0c12 --- /dev/null +++ b/frameworks/Java/hserver-business/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + com.test.hserver + hserver + 1.0 + + + hserver-parent + cn.hserver + 3.6.0 + + + UTF-8 + 3.3.1 + 42.7.2 + + + + + + hserver + cn.hserver + + + + hserver-plugin-web + cn.hserver + + + com.zaxxer + HikariCP + ${version.hikaricp} + + + org.postgresql + postgresql + ${version.postgres} + + + + + + hserver-plugin-maven + cn.hserver + + + + diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java new file mode 100644 index 00000000000..b4e215081da --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java @@ -0,0 +1,18 @@ +package com.test.hserver; + + +import cn.hserver.HServerApplication; +import cn.hserver.core.ioc.annotation.HServerBoot; +import cn.hserver.core.server.context.ConstConfig; + + +/** + * @author hxm + */ +@HServerBoot +public class StartApp { + + public static void main(String[] args) { + HServerApplication.run(StartApp.class, 8888, args); + } +} diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Fortune.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Fortune.java new file mode 100644 index 00000000000..ce67c19ea45 --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Fortune.java @@ -0,0 +1,24 @@ +package com.test.hserver.bean; + +public final class Fortune implements Comparable { + public final int id; + + public final String message; + + public Fortune(int id, String message) { + this.id = id; + this.message = message; + } + @Override + public int compareTo(Fortune other) { + return message.compareTo(other.message); + } + + public int getId() { + return id; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Message.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Message.java new file mode 100644 index 00000000000..ec823bfb974 --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Message.java @@ -0,0 +1,13 @@ +package com.test.hserver.bean; + +public class Message { + private String message = "Hello, World!"; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/World.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/World.java new file mode 100644 index 00000000000..206846abcc3 --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/World.java @@ -0,0 +1,24 @@ +package com.test.hserver.bean; + +public class World implements Comparable { + private final int id; + + private final int randomNumber; + + public World(int id, int randomNumber) { + this.id = id; + this.randomNumber = randomNumber; + } + + public int getId() { + return id; + } + + public int getRandomNumber() { + return randomNumber; + } + + @Override public int compareTo(World o) { + return id - o.id; + } +} \ No newline at end of file diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java new file mode 100644 index 00000000000..c4bc3b4b0fb --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java @@ -0,0 +1,136 @@ +package com.test.hserver.controller; + +import cn.hserver.core.ioc.annotation.Autowired; +import cn.hserver.plugin.web.annotation.Controller; +import cn.hserver.plugin.web.annotation.GET; +import cn.hserver.plugin.web.interfaces.HttpRequest; +import cn.hserver.plugin.web.interfaces.HttpResponse; +import com.test.hserver.bean.Fortune; +import com.test.hserver.bean.Message; +import com.test.hserver.bean.World; +import com.test.hserver.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +import static com.test.hserver.util.Util.getQueries; +import static com.test.hserver.util.Util.randomWorld; + +/** + * @author hxm + */ +@Controller +public class TestController { + private static final String HELLO = "Hello, World!"; + private static final String SELECT_WORLD = "select * from world where id=?"; + + @Autowired + private DataSource dataSource; + + @GET("/json") + public Message json(HttpResponse response) { + response.setHeader("Date", DateUtil.getTime()); + return new Message(); + } + + @GET("/plaintext") + public String plaintext(HttpResponse response) { + response.setHeader("Date", DateUtil.getTime()); + return HELLO; + } + + @GET("/db") + public void db(HttpResponse response) throws SQLException { + World result; + try (Connection conn = dataSource.getConnection()) { + try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) { + statement.setInt(1, randomWorld()); + try (ResultSet rs = statement.executeQuery()) { + rs.next(); + result = new World(rs.getInt("id"), rs.getInt("randomNumber")); + } + } + } + response.setHeader("Date", DateUtil.getTime()); + response.sendJson(result); + } + + @GET("/queries") + public void queries(HttpRequest request,HttpResponse response) throws Exception { + World[] result = new World[getQueries(request.query("queries"))]; + try (Connection conn = dataSource.getConnection()) { + for (int i = 0; i < result.length; i++) { + try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) { + statement.setInt(1, randomWorld()); + try (ResultSet rs = statement.executeQuery()) { + rs.next(); + result[i] = new World(rs.getInt("id"), rs.getInt("randomNumber")); + } + } + } + } + response.setHeader("Date", DateUtil.getTime()); + response.sendJson(result); + } + + + @GET("/updates") + public void updates(HttpRequest request,HttpResponse response) throws Exception { + World[] result = new World[getQueries(request.query("queries"))]; + StringJoiner updateSql = new StringJoiner( + ", ", + "UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ", + " ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id"); + + try (Connection connection = dataSource.getConnection()) { + try (PreparedStatement statement = connection.prepareStatement(SELECT_WORLD)) { + for (int i = 0; i < result.length; i++) { + statement.setInt(1, randomWorld()); + try (ResultSet rs = statement.executeQuery()) { + rs.next(); + result[i] = new World(rs.getInt("id"), randomWorld()); + } + // prepare update query + updateSql.add("(?, ?)"); + } + } + + try (PreparedStatement statement = connection.prepareStatement(updateSql.toString())) { + int i = 0; + for (World world : result) { + statement.setInt(++i, world.getRandomNumber()); + statement.setInt(++i, world.getRandomNumber()); + } + statement.executeUpdate(); + } + } + response.setHeader("Date", DateUtil.getTime()); + response.sendJson(result); + } + + @GET("/fortunes") + public void fortunes(HttpResponse response) throws Exception { + List fortunes = new ArrayList<>(); + try (Connection connection = dataSource.getConnection()) { + try (PreparedStatement stt = connection.prepareStatement("select * from fortune")) { + try (ResultSet rs = stt.executeQuery()) { + while (rs.next()) { + fortunes.add(new Fortune(rs.getInt("id"), rs.getString("message"))); + } + } + } + } + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + Collections.sort(fortunes); + response.setHeader("Date", DateUtil.getTime()); + Map data=new HashMap<>(); + data.put("data",fortunes); + response.sendTemplate("fortunes.ftl",data); + } +} diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java new file mode 100644 index 00000000000..0fee7b56b1c --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java @@ -0,0 +1,25 @@ +package com.test.hserver.db; + +import cn.hserver.core.ioc.annotation.Autowired; +import cn.hserver.core.ioc.annotation.Bean; +import cn.hserver.core.ioc.annotation.Configuration; +import com.zaxxer.hikari.HikariDataSource; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + + @Autowired + private PostgresConfig postgresConfig; + + @Bean + public DataSource initDataSource() { + HikariDataSource ds = new HikariDataSource(); + ds.setJdbcUrl(postgresConfig.getJdbcUrl()); + ds.setUsername(postgresConfig.getUsername()); + ds.setPassword(postgresConfig.getPassword()); + ds.setMaximumPoolSize(postgresConfig.getMaximumPoolSize()); + return ds; + } +} diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java new file mode 100644 index 00000000000..57c08ea4b25 --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java @@ -0,0 +1,57 @@ +package com.test.hserver.db; + + +import cn.hserver.core.ioc.annotation.ConfigurationProperties; + +@ConfigurationProperties +public class PostgresConfig { + private String jdbcUrl; + private String username; + private String password; + private int maximumPoolSize; + + public PostgresConfig() { + } + + public String getJdbcUrl() { + return jdbcUrl; + } + + public void setJdbcUrl(String jdbcUrl) { + this.jdbcUrl = jdbcUrl; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public int getMaximumPoolSize() { + return maximumPoolSize; + } + + public void setMaximumPoolSize(int maximumPoolSize) { + this.maximumPoolSize = maximumPoolSize; + } + + @Override + public String toString() { + return "PostgresConfig{" + + "jdbcUrl='" + jdbcUrl + '\'' + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", maximumPoolSize=" + maximumPoolSize + + '}'; + } +} \ No newline at end of file diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java new file mode 100644 index 00000000000..a1f866b2d89 --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java @@ -0,0 +1,15 @@ +package com.test.hserver.task; + +import cn.hserver.core.ioc.annotation.Bean; +import cn.hserver.core.ioc.annotation.Task; +import com.test.hserver.util.DateUtil; + +@Bean +public class TimeAdd { + + @Task(name = "时间计算", time = "1000") + public void add() { + DateUtil.time = DateUtil.getNow(); + } + +} diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/DateUtil.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/DateUtil.java new file mode 100644 index 00000000000..0874b9bd9eb --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/DateUtil.java @@ -0,0 +1,25 @@ +package com.test.hserver.util; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +/** + * @author hxm + */ +public class DateUtil { + private static final DateTimeFormatter GMT_FMT = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); + private static final ZoneId zoneId = ZoneId.of("GMT"); + public static String getNow() { + return GMT_FMT.format(LocalDateTime.now().atZone(zoneId)); + } + public static String time; + public static String getTime(){ + if (time==null){ + time=getNow(); + return time; + } + return time; + } +} diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/Util.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/Util.java new file mode 100644 index 00000000000..775f4f8f0f6 --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/Util.java @@ -0,0 +1,18 @@ +package com.test.hserver.util; + +import java.util.concurrent.ThreadLocalRandom; + +public class Util { + public static int randomWorld() { + return 1 + ThreadLocalRandom.current().nextInt(10000); + } + + public static int getQueries(String queries) { + try { + int count = Integer.parseInt(queries); + return Math.min(500, Math.max(1, count)); + } catch (Exception e) { + return 1; + } + } +} \ No newline at end of file diff --git a/frameworks/Java/hserver-business/src/main/resources/app.properties b/frameworks/Java/hserver-business/src/main/resources/app.properties new file mode 100644 index 00000000000..11b8d560772 --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/resources/app.properties @@ -0,0 +1,6 @@ +jdbcUrl= jdbc:postgresql://tfb-database:5432/hello_world +username= benchmarkdbuser +password= benchmarkdbpass +maximumPoolSize= 256 + +log=info diff --git a/frameworks/Java/hserver-business/src/main/resources/template/fortunes.ftl b/frameworks/Java/hserver-business/src/main/resources/template/fortunes.ftl new file mode 100644 index 00000000000..233927248fa --- /dev/null +++ b/frameworks/Java/hserver-business/src/main/resources/template/fortunes.ftl @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + <#list data as fortune> + + + + + +
      idmessage
      ${fortune.id?html}${fortune.message?html}
      + + \ No newline at end of file diff --git a/frameworks/Java/hserver/benchmark_config.json b/frameworks/Java/hserver/benchmark_config.json index 87397f30d93..035eae68c9c 100644 --- a/frameworks/Java/hserver/benchmark_config.json +++ b/frameworks/Java/hserver/benchmark_config.json @@ -5,11 +5,11 @@ { "default": { "db_url": "/db", - "query_url": "/queries?queries=", "fortune_url": "/fortunes", "plaintext_url": "/plaintext", - "update_url": "/updates?queries=", "json_url": "/json", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", "port": 8888, "approach": "Realistic", "classification": "Fullstack", @@ -18,8 +18,8 @@ "language": "Java", "flavor": "None", "orm": "Full", - "platform": "None", - "webserver": "None", + "platform": "hserver", + "webserver": "hserver", "os": "Linux", "database_os": "Linux", "display_name": "hserver", @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/frameworks/Java/hserver/config.toml b/frameworks/Java/hserver/config.toml index db5b6ff47a1..6979faa03a0 100644 --- a/frameworks/Java/hserver/config.toml +++ b/frameworks/Java/hserver/config.toml @@ -12,6 +12,6 @@ approach = "Realistic" classification = "Fullstack" os = "Linux" orm = "Full" -platform = "None" -webserver = "None" -versus = "hserver" \ No newline at end of file +platform = "hserver" +webserver = "hserver" +versus = "hserver" diff --git a/frameworks/Java/hserver/hserver.dockerfile b/frameworks/Java/hserver/hserver.dockerfile index 483485da30f..372cd10a98d 100644 --- a/frameworks/Java/hserver/hserver.dockerfile +++ b/frameworks/Java/hserver/hserver.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.3-openjdk-8-slim as maven +FROM maven:3.8.4-openjdk-17-slim as maven WORKDIR /hserver COPY pom.xml pom.xml COPY src src RUN mvn package -FROM openjdk:8u275-jdk-slim +FROM openjdk:17.0.2 WORKDIR /hserver COPY --from=maven /hserver/target/hserver-1.0.jar app.jar EXPOSE 8888 -CMD ["java", "-jar", "app.jar"] \ No newline at end of file +CMD ["java", "-jar", "app.jar"] diff --git a/frameworks/Java/hserver/pom.xml b/frameworks/Java/hserver/pom.xml index b841cbd60ab..70d6e1b0c12 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -11,7 +11,7 @@ hserver-parent cn.hserver - 3.5.M2 + 3.6.0 UTF-8 diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java index 9ab5d958039..c4bc3b4b0fb 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java @@ -3,11 +3,14 @@ import cn.hserver.core.ioc.annotation.Autowired; import cn.hserver.plugin.web.annotation.Controller; import cn.hserver.plugin.web.annotation.GET; +import cn.hserver.plugin.web.interfaces.HttpRequest; import cn.hserver.plugin.web.interfaces.HttpResponse; import com.test.hserver.bean.Fortune; import com.test.hserver.bean.Message; import com.test.hserver.bean.World; import com.test.hserver.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.sql.DataSource; import java.sql.Connection; @@ -59,8 +62,8 @@ public void db(HttpResponse response) throws SQLException { } @GET("/queries") - public void queries(String queries,HttpResponse response) throws Exception { - World[] result = new World[getQueries(queries)]; + public void queries(HttpRequest request,HttpResponse response) throws Exception { + World[] result = new World[getQueries(request.query("queries"))]; try (Connection conn = dataSource.getConnection()) { for (int i = 0; i < result.length; i++) { try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) { @@ -78,8 +81,8 @@ public void queries(String queries,HttpResponse response) throws Exception { @GET("/updates") - public void updates(String queries,HttpResponse response) throws Exception { - World[] result = new World[getQueries(queries)]; + public void updates(HttpRequest request,HttpResponse response) throws Exception { + World[] result = new World[getQueries(request.query("queries"))]; StringJoiner updateSql = new StringJoiner( ", ", "UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ", From 771117c1d6aca021d8ede7d2327a19970c573a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Mon, 25 Nov 2024 18:03:21 +0100 Subject: [PATCH 0922/1766] [genhttp] Update to Version 9 (#9404) * Switch to .NET 9 but still on old GenHTTP version * Actually also switch the docker version * Migrate to GenHTTP 9 * Re-enable real data on fortunes * Switch to ASP.NET framework * one should compile before pushing .. * Another try * Use other docker file style * Encode HTML in fortunes * Assign ID 0 to additional cookie --- .../genhttp/Benchmarks/Benchmarks.csproj | 74 +++++----- .../Benchmarks/Model/DatabaseContext.cs | 55 ++++---- .../genhttp/Benchmarks/Model/Fortune.cs | 28 ++-- .../CSharp/genhttp/Benchmarks/Model/World.cs | 21 ++- .../CSharp/genhttp/Benchmarks/Program.cs | 47 +++---- .../Benchmarks/Resources/Fortunes.html | 7 - .../Benchmarks/Resources/Template.html | 19 ++- .../genhttp/Benchmarks/Tests/CacheResource.cs | 108 +++++++-------- .../genhttp/Benchmarks/Tests/DbResource.cs | 28 ++-- .../Benchmarks/Tests/FortuneHandler.cs | 127 +++++++----------- .../genhttp/Benchmarks/Tests/JsonResource.cs | 23 ++-- .../genhttp/Benchmarks/Tests/QueryResource.cs | 57 ++++---- .../Benchmarks/Tests/UpdateResource.cs | 80 ++++++----- .../Benchmarks/Utilities/ServerHeader.cs | 12 +- .../Utilities/ServerHeaderConcern.cs | 59 ++++---- .../Utilities/ServerHeaderConcernBuilder.cs | 16 +-- frameworks/CSharp/genhttp/README.md | 4 +- .../CSharp/genhttp/benchmark_config.json | 2 +- frameworks/CSharp/genhttp/config.toml | 2 +- frameworks/CSharp/genhttp/genhttp.dockerfile | 26 ++-- 20 files changed, 347 insertions(+), 448 deletions(-) delete mode 100644 frameworks/CSharp/genhttp/Benchmarks/Resources/Fortunes.html diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index 9b49099c3bb..b96158a711b 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -1,40 +1,38 @@  - - - - net8.0 - 10.0 - - GenHTTP Benchmarks - Test suite to be executed with TechEmpower FrameworkBenchmarks. - - Benchmarks.Program - Exe - - true - true - - - - - - - - - - - - - - - - - - - - - - - - + + + + net9.0 + 13.0 + true + Exe + + GenHTTP Benchmarks + Test suite to be executed with TechEmpower FrameworkBenchmarks. + + true + true + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frameworks/CSharp/genhttp/Benchmarks/Model/DatabaseContext.cs b/frameworks/CSharp/genhttp/Benchmarks/Model/DatabaseContext.cs index 2bc6ca7ed0d..f27f1d8e245 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Model/DatabaseContext.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Model/DatabaseContext.cs @@ -1,52 +1,43 @@ using Microsoft.EntityFrameworkCore; -namespace Benchmarks.Model +namespace Benchmarks.Model; + +public sealed class DatabaseContext : DbContext { + private static DbContextOptions _options; - public sealed class DatabaseContext : DbContext - { - private static DbContextOptions _Options; + private static DbContextOptions _noTrackingOptions; - private static DbContextOptions _NoTrackingOptions; + #region Factory - #region Factory + public static DatabaseContext Create() => new(_options ??= GetOptions(true)); - public static DatabaseContext Create() - { - return new DatabaseContext(_Options ??= GetOptions(true)); - } - - public static DatabaseContext CreateNoTracking() - { - return new DatabaseContext(_NoTrackingOptions ??= GetOptions(false)); - } + public static DatabaseContext CreateNoTracking() => new(_noTrackingOptions ??= GetOptions(false)); - private static DbContextOptions GetOptions(bool tracking) - { - var optionsBuilder = new DbContextOptionsBuilder(); - - optionsBuilder.UseNpgsql("Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4"); + private static DbContextOptions GetOptions(bool tracking) + { + var optionsBuilder = new DbContextOptionsBuilder(); - if (!tracking) - { - optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); - } + optionsBuilder.UseNpgsql("Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=512;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4"); - return optionsBuilder.Options; + if (!tracking) + { + optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); } - private DatabaseContext(DbContextOptions options) : base(options) { } + return optionsBuilder.Options; + } - #endregion + private DatabaseContext(DbContextOptions options) : base(options) { } - #region Entities + #endregion - public DbSet World { get; set; } + #region Entities - public DbSet Fortune { get; set; } + public DbSet World { get; set; } - #endregion + public DbSet Fortune { get; set; } - } + #endregion } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Model/Fortune.cs b/frameworks/CSharp/genhttp/Benchmarks/Model/Fortune.cs index c3ca5d1d6a7..919f997e01b 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Model/Fortune.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Model/Fortune.cs @@ -1,25 +1,17 @@ -using System; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace Benchmarks.Model -{ - - [Table("fortune")] - public class Fortune : IComparable, IComparable - { - - [Column("id")] - public int ID { get; set; } +namespace Benchmarks.Model; - [Column("message")] - [StringLength(2048)] - public string Message { get; set; } - - public int CompareTo(object obj) => CompareTo((Fortune)obj); +[Table("fortune")] +public class Fortune +{ - public int CompareTo(Fortune other) => string.CompareOrdinal(Message, other.Message); + [Column("id")] + public int Id { get; set; } - } + [Column("message")] + [StringLength(2048)] + public string Message { get; set; } } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Model/World.cs b/frameworks/CSharp/genhttp/Benchmarks/Model/World.cs index ec19183f331..45da4ab828d 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Model/World.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Model/World.cs @@ -1,18 +1,15 @@ using System.ComponentModel.DataAnnotations.Schema; -namespace Benchmarks.Model -{ - - [Table("world")] - public class World - { +namespace Benchmarks.Model; - [Column("id")] - public int Id { get; set; } +[Table("world")] +public class World +{ - [Column("randomnumber")] - public int RandomNumber { get; set; } + [Column("id")] + public int Id { get; set; } - } + [Column("randomnumber")] + public int RandomNumber { get; set; } -} +} \ No newline at end of file diff --git a/frameworks/CSharp/genhttp/Benchmarks/Program.cs b/frameworks/CSharp/genhttp/Benchmarks/Program.cs index efd8a162ac9..aa2eb68938a 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Program.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Program.cs @@ -1,35 +1,20 @@ -using GenHTTP.Engine; - +using Benchmarks.Tests; +using Benchmarks.Utilities; +using GenHTTP.Engine.Kestrel; using GenHTTP.Modules.IO; using GenHTTP.Modules.Layouting; using GenHTTP.Modules.Webservices; -using Benchmarks.Tests; -using Benchmarks.Utilities; - -namespace Benchmarks -{ - - public static class Program - { - - public static int Main(string[] args) - { - var tests = Layout.Create() - .Add("plaintext", Content.From(Resource.FromString("Hello, World!"))) - .Add("fortunes", new FortuneHandlerBuilder()) - .AddService("json") - .AddService("db") - .AddService("queries") - .AddService("updates") - .AddService("cached-worlds") - .Add(ServerHeader.Create()); - - return Host.Create() - .Handler(tests) - .Run(); - } - - } - -} +var tests = Layout.Create() + .Add("plaintext", Content.From(Resource.FromString("Hello, World!"))) + .Add("fortunes", new FortuneHandler()) + .AddService("json") + .AddService("db") + .AddService("queries") + .AddService("updates") + .AddService("cached-worlds") + .Add(ServerHeader.Create()); + +return await Host.Create() + .Handler(tests) + .RunAsync(); diff --git a/frameworks/CSharp/genhttp/Benchmarks/Resources/Fortunes.html b/frameworks/CSharp/genhttp/Benchmarks/Resources/Fortunes.html deleted file mode 100644 index b7e0d81eb8a..00000000000 --- a/frameworks/CSharp/genhttp/Benchmarks/Resources/Fortunes.html +++ /dev/null @@ -1,7 +0,0 @@ - - - @foreach (var cookie in Model.Cookies) - { - - } -
      idmessage
      @cookie.ID@HttpUtility.HtmlEncode(cookie.Message)
      \ No newline at end of file diff --git a/frameworks/CSharp/genhttp/Benchmarks/Resources/Template.html b/frameworks/CSharp/genhttp/Benchmarks/Resources/Template.html index 7b521ecb334..90bf1592593 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Resources/Template.html +++ b/frameworks/CSharp/genhttp/Benchmarks/Resources/Template.html @@ -1,9 +1,22 @@  - @Model.Meta.Title + Fortunes - @Model.Content + + + + + + + {for cookie in cookies: + + + + + } +
      idmessage
      { cookie.id }{ cookie.message }
      + - \ No newline at end of file + diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/CacheResource.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/CacheResource.cs index c5c91258a94..e0e4bc50d91 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/CacheResource.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/CacheResource.cs @@ -1,84 +1,84 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - +using Benchmarks.Model; +using GenHTTP.Modules.Webservices; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; -using Benchmarks.Model; - -using GenHTTP.Modules.Webservices; +namespace Benchmarks.Tests; -namespace Benchmarks.Tests +public sealed class CacheResource { + private static readonly Random Random = new(); - public sealed class CacheResource + private static readonly MemoryCache Cache = new(new MemoryCacheOptions { - private static readonly Random _Random = new Random(); - - private static readonly MemoryCache _Cache = new MemoryCache(new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromMinutes(60) }); - - private static readonly object[] _CacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray(); - - public sealed class CacheKey : IEquatable - { - private readonly int _value; - - public CacheKey(int value) => _value = value; + ExpirationScanFrequency = TimeSpan.FromMinutes(60) + }); - public bool Equals(CacheKey key) => key._value == _value; + private static readonly object[] CacheKeys = Enumerable.Range(0, 10001).Select(i => new CacheKey(i)).ToArray(); - public override bool Equals(object obj) => ReferenceEquals(obj, this); + [ResourceMethod(":queries")] + public ValueTask> GetWorldsFromPath(string queries) => GetWorlds(queries); - public override int GetHashCode() => _value; + [ResourceMethod] + public async ValueTask> GetWorlds(string queries) + { + var count = 1; - public override string ToString() => _value.ToString(); + int.TryParse(queries, out count); + if (count < 1) + { + count = 1; } + else if (count > 500) + { + count = 500; + } + + var result = new List(count); - [ResourceMethod(":queries")] - public ValueTask> GetWorldsFromPath(string queries) => GetWorlds(queries); + await using var context = DatabaseContext.CreateNoTracking(); - [ResourceMethod] - public async ValueTask> GetWorlds(string queries) + for (var i = 0; i < count; i++) { - var count = 1; + var id = Random.Next(1, 10001); - int.TryParse(queries, out count); + var key = CacheKeys[id]; - if (count < 1) count = 1; - else if (count > 500) count = 500; + var data = Cache.Get(key); - var result = new List(count); + if (data != null) + { + result.Add(data); + } + else + { + var resolved = await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false); - using var context = DatabaseContext.CreateNoTracking(); + Cache.Set(key, resolved); - for (var i = 0; i < count; i++) - { - var id = _Random.Next(1, 10001); + result.Add(resolved); + } + } - var key = _CacheKeys[id]; + return result; + } - var data = _Cache.Get(key); + public sealed class CacheKey : IEquatable + { + private readonly int _value; - if (data != null) - { - result.Add(data); - } - else - { - var resolved = await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false); + public CacheKey(int value) + { + _value = value; + } - _Cache.Set(key, resolved); + public bool Equals(CacheKey key) => key._value == _value; - result.Add(resolved); - } - } + public override bool Equals(object obj) => ReferenceEquals(obj, this); - return result; - } + public override int GetHashCode() => _value; + public override string ToString() => _value.ToString(); } - } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/DbResource.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/DbResource.cs index 64256d0a215..ac33808fdfd 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/DbResource.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/DbResource.cs @@ -1,29 +1,21 @@ -using System; -using System.Threading.Tasks; - -using Microsoft.EntityFrameworkCore; - +using Benchmarks.Model; using GenHTTP.Modules.Webservices; +using Microsoft.EntityFrameworkCore; -using Benchmarks.Model; +namespace Benchmarks.Tests; -namespace Benchmarks.Tests +public sealed class DbResource { + private static readonly Random Random = new(); - public sealed class DbResource + [ResourceMethod] + public async ValueTask GetRandomWorld() { - private static readonly Random _Random = new(); - - [ResourceMethod] - public async ValueTask GetRandomWorld() - { - var id = _Random.Next(1, 10001); - - using var context = DatabaseContext.CreateNoTracking(); + var id = Random.Next(1, 10001); - return await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false); - } + await using var context = DatabaseContext.CreateNoTracking(); + return await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false); } } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs index 6add5edbaeb..c7a488f5e78 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs @@ -1,116 +1,85 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Linq; -using System.Web; -using System.IO; - -using Microsoft.EntityFrameworkCore; - +using System.Web; +using Benchmarks.Model; +using Cottle; using GenHTTP.Api.Content; -using GenHTTP.Api.Content.Templating; using GenHTTP.Api.Protocol; using GenHTTP.Modules.IO; -using GenHTTP.Modules.Razor; - -using Benchmarks.Model; +using GenHTTP.Modules.Pages; +using GenHTTP.Modules.Pages.Rendering; -namespace Benchmarks.Tests -{ +using Microsoft.EntityFrameworkCore; - #region Factory +namespace Benchmarks.Tests; - public class FortuneHandlerBuilder : IHandlerBuilder - { +public class FortuneHandler : IHandler +{ - public IHandler Build(IHandler parent) - { - return new FortuneHandler(parent); - } + #region Get-/Setters - } + private TemplateRenderer Template { get; } #endregion - #region Supporting data structures + #region Initialization - public sealed class FortuneModel : BasicModel + public FortuneHandler() { + var resource = Resource.FromAssembly("Template.html").Build(); - public List Cookies { get; } - - public FortuneModel(IRequest request, IHandler handler, List cookies) : base(request, handler) - { - Cookies = cookies; - } - + Template = Renderer.From(resource); } #endregion - public class FortuneHandler : IHandler, IPageRenderer - { - - #region Get-/Setters - - public IHandler Parent { get; } + #region Functionality - private IHandler Page { get; } + public ValueTask PrepareAsync() => new(); - private IRenderer Template { get; } - - #endregion - - #region Initialization - - public FortuneHandler(IHandler parent) + public async ValueTask HandleAsync(IRequest request) + { + var data = new Dictionary { - Parent = parent; + ["cookies"] = Value.FromEnumerable(await GetFortunes()) + }; - Page = ModRazor.Page(Resource.FromAssembly("Fortunes.html"), (r, h) => GetFortunes(r, h)) - .Title("Fortunes") - .AddAssemblyReference() - .AddUsing("System.Web") - .Build(this); + return request.GetPage(await Template.RenderAsync(data)).Build(); + } - Template = ModRazor.Template(Resource.FromAssembly("Template.html")).Build(); - } + private static async ValueTask> GetFortunes() + { + await using var context = DatabaseContext.CreateNoTracking(); - #endregion + var fortunes = await context.Fortune.ToListAsync().ConfigureAwait(false); - #region Functionality + var result = new List(fortunes.Count + 1); - public async ValueTask PrepareAsync() + foreach (var fortune in fortunes) { - await Page.PrepareAsync(); - await Template.PrepareAsync(); + result.Add(Value.FromDictionary(new Dictionary() + { + ["id"] = fortune.Id, + ["message"] = HttpUtility.HtmlEncode(fortune.Message) + })); } - public ValueTask CalculateChecksumAsync() => new(17); - - public IAsyncEnumerable GetContentAsync(IRequest request) => AsyncEnumerable.Empty(); - - public ValueTask RenderAsync(TemplateModel model) => Template.RenderAsync(model); - - public ValueTask RenderAsync(TemplateModel model, Stream target) => Template.RenderAsync(model, target); - - public ValueTask HandleAsync(IRequest request) => Page.HandleAsync(request); - - private static async ValueTask GetFortunes(IRequest request, IHandler handler) + result.Add(Value.FromDictionary(new Dictionary() { - using var context = DatabaseContext.CreateNoTracking(); - - var fortunes = await context.Fortune.ToListAsync().ConfigureAwait(false); - - fortunes.Add(new Fortune() { Message = "Additional fortune added at request time." }); - - fortunes.Sort(); + ["id"] = 0, + ["message"] = "Additional fortune added at request time." + })); - return new FortuneModel(request, handler, fortunes); - } + result.Sort((one, two) => + { + var firstMessage = one.Fields["message"].AsString; + var secondMessage = two.Fields["message"].AsString; - #endregion + return string.Compare(firstMessage, secondMessage, StringComparison.Ordinal); + }); + return result; } + #endregion + } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs index 8158b3acd0d..1fae7c88922 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs @@ -1,21 +1,20 @@ using GenHTTP.Modules.Webservices; -namespace Benchmarks.Tests -{ +namespace Benchmarks.Tests; - public sealed class JsonResult - { +public sealed class JsonResult +{ - public string Message { get; set; } + public string Message { get; set; } +} - } +public sealed class JsonResource +{ - public sealed class JsonResource + [ResourceMethod] + public JsonResult GetMessage() => new() { - - [ResourceMethod] - public JsonResult GetMessage() => new() { Message = "Hello, World!" }; - - } + Message = "Hello, World!" + }; } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/QueryResource.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/QueryResource.cs index 52a4b4994e1..592d9083242 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/QueryResource.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/QueryResource.cs @@ -1,47 +1,44 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - +using Benchmarks.Model; +using GenHTTP.Modules.Webservices; using Microsoft.EntityFrameworkCore; -using Benchmarks.Model; - -using GenHTTP.Modules.Webservices; +namespace Benchmarks.Tests; -namespace Benchmarks.Tests +public sealed class QueryResource { + private static readonly Random Random = new(); + + [ResourceMethod(":queries")] + public ValueTask> GetWorldsFromPath(string queries) => GetWorlds(queries); - public sealed class QueryResource + [ResourceMethod] + public async ValueTask> GetWorlds(string queries) { - private static readonly Random _Random = new Random(); + var count = 1; - [ResourceMethod(":queries")] - public ValueTask> GetWorldsFromPath(string queries) => GetWorlds(queries); + int.TryParse(queries, out count); - [ResourceMethod] - public async ValueTask> GetWorlds(string queries) + if (count < 1) { - var count = 1; - - int.TryParse(queries, out count); - - if (count < 1) count = 1; - else if (count > 500) count = 500; - - var result = new List(count); + count = 1; + } + else if (count > 500) + { + count = 500; + } - using var context = DatabaseContext.CreateNoTracking(); + var result = new List(count); - for (int _ = 0; _ < count; _++) - { - var id = _Random.Next(1, 10001); + using var context = DatabaseContext.CreateNoTracking(); - result.Add(await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false)); - } + for (var _ = 0; _ < count; _++) + { + var id = Random.Next(1, 10001); - return result; + result.Add(await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false)); } + return result; } -} +} \ No newline at end of file diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/UpdateResource.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/UpdateResource.cs index dcb697333a0..9b2ce8e270c 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/UpdateResource.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/UpdateResource.cs @@ -1,66 +1,64 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - +using Benchmarks.Model; +using GenHTTP.Modules.Webservices; using Microsoft.EntityFrameworkCore; -using Benchmarks.Model; +namespace Benchmarks.Tests; -using GenHTTP.Modules.Webservices; - -namespace Benchmarks.Tests +public sealed class UpdateResource { + private static readonly Random Random = new(); + + [ResourceMethod(":queries")] + public ValueTask> UpdateWorldsFromPath(string queries) => UpdateWorlds(queries); - public sealed class UpdateResource + [ResourceMethod] + public async ValueTask> UpdateWorlds(string queries) { - private static Random _Random = new Random(); + var count = 1; - [ResourceMethod(":queries")] - public ValueTask> UpdateWorldsFromPath(string queries) => UpdateWorlds(queries); + int.TryParse(queries, out count); - [ResourceMethod] - public async ValueTask> UpdateWorlds(string queries) + if (count < 1) { - var count = 1; - - int.TryParse(queries, out count); - - if (count < 1) count = 1; - else if (count > 500) count = 500; + count = 1; + } + else if (count > 500) + { + count = 500; + } - var result = new List(count); + var result = new List(count); - var ids = Enumerable.Range(1, 10000).Select(x => _Random.Next(1, 10001)).Distinct().Take(count).ToArray(); + var ids = Enumerable.Range(1, 10000).Select(x => Random.Next(1, 10001)).Distinct().Take(count).ToArray(); - using (var context = DatabaseContext.Create()) + using (var context = DatabaseContext.Create()) + { + foreach (var id in ids) { - foreach (var id in ids) - { - var record = await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false); + var record = await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false); - var old = record.RandomNumber; + var old = record.RandomNumber; - var current = old; + var current = old; - for (int i = 0; i < 5; i++) - { - current = _Random.Next(1, 10001); + for (var i = 0; i < 5; i++) + { + current = Random.Next(1, 10001); - if (current != old) break; + if (current != old) + { + break; } + } - record.RandomNumber = current; + record.RandomNumber = current; - result.Add(record); + result.Add(record); - await context.SaveChangesAsync(); - } + await context.SaveChangesAsync(); } - - return result; } + return result; } - -} +} \ No newline at end of file diff --git a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeader.cs b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeader.cs index 7fff879379e..5b0a8b090d9 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeader.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeader.cs @@ -1,11 +1,7 @@ -namespace Benchmarks.Utilities -{ - - public static class ServerHeader - { +namespace Benchmarks.Utilities; - public static ServerHeaderConcernBuilder Create() => new ServerHeaderConcernBuilder(); - - } +public static class ServerHeader +{ + public static ServerHeaderConcernBuilder Create() => new(); } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs index 28b3bee2ba7..3536a8c8988 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs @@ -1,55 +1,42 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using GenHTTP.Api.Content; +using GenHTTP.Api.Content; using GenHTTP.Api.Protocol; -namespace Benchmarks.Utilities -{ - - public sealed class ServerHeaderConcern : IConcern - { +namespace Benchmarks.Utilities; - #region Get-/Setters +public sealed class ServerHeaderConcern : IConcern +{ - public IHandler Content { get; } + #region Initialization - public IHandler Parent { get; } + public ServerHeaderConcern(IHandler content) + { + Content = content; + } - #endregion + #endregion - #region Initialization + #region Get-/Setters - public ServerHeaderConcern(IHandler parent, Func contentFactory) - { - Parent = parent; - Content = contentFactory(this); - } + public IHandler Content { get; } - #endregion + #endregion - #region Functionality + #region Functionality - public IAsyncEnumerable GetContentAsync(IRequest request) => Content.GetContentAsync(request); + public ValueTask PrepareAsync() => Content.PrepareAsync(); - public ValueTask PrepareAsync() => Content.PrepareAsync(); + public async ValueTask HandleAsync(IRequest request) + { + var response = await Content.HandleAsync(request); - public async ValueTask HandleAsync(IRequest request) + if (response != null) { - var response = await Content.HandleAsync(request); - - if (response != null) - { - response.Headers.Add("Server", "TFB"); - } - - return response; + response.Headers.Add("Server", "TFB"); } - #endregion - + return response; } + #endregion + } diff --git a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcernBuilder.cs b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcernBuilder.cs index b935ac66553..1f96404b09a 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcernBuilder.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcernBuilder.cs @@ -1,18 +1,10 @@ -using System; +using GenHTTP.Api.Content; -using GenHTTP.Api.Content; +namespace Benchmarks.Utilities; -namespace Benchmarks.Utilities +public sealed class ServerHeaderConcernBuilder : IConcernBuilder { - public sealed class ServerHeaderConcernBuilder : IConcernBuilder - { - - public IConcern Build(IHandler parent, Func contentFactory) - { - return new ServerHeaderConcern(parent, contentFactory); - } - - } + public IConcern Build(IHandler content) => new ServerHeaderConcern(content); } diff --git a/frameworks/CSharp/genhttp/README.md b/frameworks/CSharp/genhttp/README.md index fcdb7ce9100..9c5c5d1199a 100644 --- a/frameworks/CSharp/genhttp/README.md +++ b/frameworks/CSharp/genhttp/README.md @@ -6,11 +6,11 @@ See the [GenHTTP website](https://genhttp.org) for more information. **Language** -* C# 8.0 +* C# 13.0 **Platforms** -* .NET Core +* .NET 8/9 **Web Servers** diff --git a/frameworks/CSharp/genhttp/benchmark_config.json b/frameworks/CSharp/genhttp/benchmark_config.json index 3d8304e5dc6..bf1780e753a 100644 --- a/frameworks/CSharp/genhttp/benchmark_config.json +++ b/frameworks/CSharp/genhttp/benchmark_config.json @@ -17,7 +17,7 @@ "language": "C#", "orm": "Raw", "platform": ".NET", - "webserver": "GenHTTP", + "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", "display_name": "GenHTTP", diff --git a/frameworks/CSharp/genhttp/config.toml b/frameworks/CSharp/genhttp/config.toml index a70294262d8..f984318f53b 100644 --- a/frameworks/CSharp/genhttp/config.toml +++ b/frameworks/CSharp/genhttp/config.toml @@ -16,5 +16,5 @@ database_os = "Linux" os = "Linux" orm = "Raw" platform = ".NET" -webserver = "GenHTTP" +webserver = "Kestrel" versus = "None" diff --git a/frameworks/CSharp/genhttp/genhttp.dockerfile b/frameworks/CSharp/genhttp/genhttp.dockerfile index 4331fd966f8..202df7ddedf 100644 --- a/frameworks/CSharp/genhttp/genhttp.dockerfile +++ b/frameworks/CSharp/genhttp/genhttp.dockerfile @@ -1,19 +1,19 @@ -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/sdk:9.0-alpine AS build +WORKDIR /source -FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime -ENV DOTNET_SYSTEM_NET_SOCKETS_INLINE_COMPLETIONS 1 +# copy csproj and restore as distinct layers +COPY Benchmarks/*.csproj . +RUN dotnet restore -r linux-musl-x64 -# Full PGO -ENV DOTNET_TieredPGO 1 -ENV DOTNET_TC_QuickJitForLoops 1 -ENV DOTNET_ReadyToRun 0 +# copy and publish app and libraries +COPY Benchmarks/ . +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained +# final stage/image +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine WORKDIR /app -COPY --from=build /app/out ./ +COPY --from=build /app . -EXPOSE 8080 +ENTRYPOINT ["./Benchmarks"] -ENTRYPOINT ["dotnet", "Benchmarks.dll"] \ No newline at end of file +EXPOSE 8080 From 56e54982cd519b89255a800c32773a2ceaa40302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=81=D1=82=D1=8F=20=D0=A2=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8F=D0=BA?= Date: Mon, 25 Nov 2024 19:03:31 +0200 Subject: [PATCH 0923/1766] refactor(javascript/fastify): upgrade deps, removed mongodb (failed with updates). (#9402) --- frameworks/JavaScript/fastify/README.md | 30 ----------- .../JavaScript/fastify/benchmark_config.json | 9 +--- frameworks/JavaScript/fastify/config.toml | 5 -- .../JavaScript/fastify/create-server.js | 5 ++ frameworks/JavaScript/fastify/db/mongo.js | 47 ---------------- frameworks/JavaScript/fastify/db/mysql.js | 52 ++++++++---------- frameworks/JavaScript/fastify/db/postgres.js | 53 +++++++++---------- .../fastify/fastify-mysql.dockerfile | 6 ++- .../fastify/fastify-postgres.dockerfile | 6 ++- .../JavaScript/fastify/fastify.dockerfile | 3 +- frameworks/JavaScript/fastify/handlers.js | 20 +++---- frameworks/JavaScript/fastify/helper.js | 6 +-- frameworks/JavaScript/fastify/package.json | 12 ++--- 13 files changed, 84 insertions(+), 170 deletions(-) delete mode 100644 frameworks/JavaScript/fastify/db/mongo.js diff --git a/frameworks/JavaScript/fastify/README.md b/frameworks/JavaScript/fastify/README.md index 705c282aee8..fe63567a9d5 100644 --- a/frameworks/JavaScript/fastify/README.md +++ b/frameworks/JavaScript/fastify/README.md @@ -19,33 +19,3 @@ Information about Fastify can be found at https://github.com/fastify/fastify ### JSON Encoding Test http://TFB-server:8080/json - -### Data-Store/Database Mapping Test - -MongoDB: -http://TFB-server:8080/mongoose/ - -MySQL: -http://TFB-server:8080/mysql-orm/ - -### Variable Query Test - -MongoDB: -http://TFB-server:8080/mongoose/2 - -MySQL: -http://TFB-server:8080/mysql-orm/2 - -### Fortune Test - -MySQL: -http://TFB-server:8080/fortune - -### Database Update Test - -MongoDB: -http://TFB-server:8080/mongoose-update/2 - -MySQL: -http://TFB-server:8080/mysql-orm-update/2 - diff --git a/frameworks/JavaScript/fastify/benchmark_config.json b/frameworks/JavaScript/fastify/benchmark_config.json index 944ae63a3ed..b4203ea43b9 100644 --- a/frameworks/JavaScript/fastify/benchmark_config.json +++ b/frameworks/JavaScript/fastify/benchmark_config.json @@ -5,14 +5,9 @@ "default": { "json_url": "/json", "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", "classification": "Micro", - "database": "MongoDB", "framework": "fastify", "language": "JavaScript", "flavor": "NodeJS", @@ -42,7 +37,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "fastify", + "display_name": "fastify [mysql]", "notes": "", "versus": "nodejs" }, @@ -63,7 +58,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "fastify", + "display_name": "fastify [postgres]", "notes": "", "versus": "nodejs" } diff --git a/frameworks/JavaScript/fastify/config.toml b/frameworks/JavaScript/fastify/config.toml index c512a025989..d47b5822fa4 100644 --- a/frameworks/JavaScript/fastify/config.toml +++ b/frameworks/JavaScript/fastify/config.toml @@ -4,13 +4,8 @@ name = "fastify" [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 = "MongoDB" database_os = "Linux" os = "Linux" orm = "Raw" diff --git a/frameworks/JavaScript/fastify/create-server.js b/frameworks/JavaScript/fastify/create-server.js index 5680ef31f04..fd0833223db 100644 --- a/frameworks/JavaScript/fastify/create-server.js +++ b/frameworks/JavaScript/fastify/create-server.js @@ -1,6 +1,11 @@ const fastify = require("fastify")(); const handlers = require("./handlers"); +fastify.setErrorHandler((error, request, reply) => { + console.log(error) + reply.status(500).send({ ok: false }) +}) + fastify.register(require("@fastify/view"), { engine: { handlebars: require("handlebars") diff --git a/frameworks/JavaScript/fastify/db/mongo.js b/frameworks/JavaScript/fastify/db/mongo.js deleted file mode 100644 index 666dd49d412..00000000000 --- a/frameworks/JavaScript/fastify/db/mongo.js +++ /dev/null @@ -1,47 +0,0 @@ -const { MongoClient } = require("mongodb"); - -const mongoUrl = "mongodb://tfb-database:27017"; -const dbName = "hello_world"; - -let client; - -async function getCollection(name) { - if (!client) { - client = await new MongoClient(mongoUrl).connect(); - } - - const db = client.db(dbName); - - return db.collection(name); -} - -async function allFortunes() { - const collection = await getCollection("fortune"); - const fortunes = await collection.find({}, { projection: { _id: 0 } }); - - return fortunes.toArray(); -} - -async function getWorld(id) { - const collection = await getCollection("world"); - - return collection.findOne({ id }, { projection: { _id: 0 } }); -} - -async function saveWorlds(worlds) { - const collection = await getCollection("world"); - - const bulk = collection.initializeUnorderedBulkOp(); - - worlds.forEach(world => { - bulk.find({ id: world.id }).updateOne(world); - }); - - return bulk.execute(); -} - -module.exports = { - getWorld, - saveWorlds, - allFortunes -}; diff --git a/frameworks/JavaScript/fastify/db/mysql.js b/frameworks/JavaScript/fastify/db/mysql.js index 3887cc20dd1..ed2c26b44a4 100644 --- a/frameworks/JavaScript/fastify/db/mysql.js +++ b/frameworks/JavaScript/fastify/db/mysql.js @@ -1,41 +1,35 @@ -const knex = require("knex")({ - client: "mysql2", - connection: { - host: "tfb-database", - user: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world" - } -}); +const { createPool } = require("mariadb"); + +const clientOpts = { + host: process.env.MYSQL_HOST, + user: process.env.MYSQL_USER, + password: process.env.MYSQL_PSWD, + database: process.env.MYSQL_DBNAME, +}; + +const pool = createPool({ ...clientOpts, connectionLimit: 1 }); +const execute = (text, values) => pool.execute(text, values || undefined); async function allFortunes() { - return knex("Fortune").select("*"); + return execute("select id, message from fortune", []); } async function getWorld(id) { - return knex("World") - .first() - .where({ id }); + return execute("select id, randomNumber from world where id = ?", [id]).then( + (arr) => arr[0] + ); } -async function saveWorlds(worlds) { - const updates = []; - - worlds.forEach(world => { - const { id, randomNumber } = world; - - updates.push( - knex("World") - .update({ randomNumber }) - .where({ id }) - ); - }); - - return Promise.all(updates); +async function bulkUpdate(worlds) { + const sql = "update world set randomNumber = ? where id = ?"; + const values = worlds + .map((world) => [world.randomnumber, world.id]) + .sort((a, b) => (a[0] < b[0] ? -1 : 1)); + return pool.batch(sql, values); } module.exports = { getWorld, - saveWorlds, - allFortunes + bulkUpdate, + allFortunes, }; diff --git a/frameworks/JavaScript/fastify/db/postgres.js b/frameworks/JavaScript/fastify/db/postgres.js index 1d5820eeeac..45f62c5eee4 100644 --- a/frameworks/JavaScript/fastify/db/postgres.js +++ b/frameworks/JavaScript/fastify/db/postgres.js @@ -1,41 +1,38 @@ -const knex = require("knex")({ - client: "pg", - connection: { - host: "tfb-database", - user: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world" - } -}); +const postgres = require("postgres"); + +const clientOpts = { + host: process.env.PG_HOST, + user: process.env.PG_USER, + password: process.env.PG_PSWD, + database: process.env.PG_DBNAME, +}; + +const sql = postgres({ ...clientOpts, max: 1 }); async function allFortunes() { - return knex("Fortune").select("*"); + return sql`select id, message from fortune`; } async function getWorld(id) { - return knex("World") - .first() - .where({ id }); + return sql`select id, randomNumber from world where id = ${id}`.then( + (arr) => arr[0] + ); } -async function saveWorlds(worlds) { - const updates = []; - - worlds.forEach(world => { - const { id, randomNumber } = world; - - updates.push( - knex("World") - .update({ randomnumber: randomNumber }) - .where({ id }) - ); - }); +async function bulkUpdate(worlds) { + const values = sql( + worlds + .map((world) => [world.id, world.randomnumber]) + .sort((a, b) => (a[0] < b[0] ? -1 : 1)) + ); - return Promise.all(updates); + return sql`update world set randomNumber = (update_data.randomNumber)::int + from (values ${values}) as update_data (id, randomNumber) + where world.id = (update_data.id)::int`; } module.exports = { getWorld, - saveWorlds, - allFortunes + bulkUpdate, + allFortunes, }; diff --git a/frameworks/JavaScript/fastify/fastify-mysql.dockerfile b/frameworks/JavaScript/fastify/fastify-mysql.dockerfile index a77917aceb0..8da0cc484d0 100644 --- a/frameworks/JavaScript/fastify/fastify-mysql.dockerfile +++ b/frameworks/JavaScript/fastify/fastify-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-alpine +FROM node:20.16-slim COPY ./ ./ @@ -6,6 +6,10 @@ RUN npm install ENV NODE_ENV production ENV DATABASE mysql +ENV MYSQL_HOST tfb-database +ENV MYSQL_USER benchmarkdbuser +ENV MYSQL_PSWD benchmarkdbpass +ENV MYSQL_DBNAME hello_world EXPOSE 8080 diff --git a/frameworks/JavaScript/fastify/fastify-postgres.dockerfile b/frameworks/JavaScript/fastify/fastify-postgres.dockerfile index 069b66c250a..e5b63795e13 100644 --- a/frameworks/JavaScript/fastify/fastify-postgres.dockerfile +++ b/frameworks/JavaScript/fastify/fastify-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-alpine +FROM node:20.16-slim COPY ./ ./ @@ -6,6 +6,10 @@ RUN npm install ENV NODE_ENV production ENV DATABASE postgres +ENV PG_HOST tfb-database +ENV PG_USER benchmarkdbuser +ENV PG_PSWD benchmarkdbpass +ENV PG_DBNAME hello_world EXPOSE 8080 diff --git a/frameworks/JavaScript/fastify/fastify.dockerfile b/frameworks/JavaScript/fastify/fastify.dockerfile index 48a7611a848..ec726dd2800 100644 --- a/frameworks/JavaScript/fastify/fastify.dockerfile +++ b/frameworks/JavaScript/fastify/fastify.dockerfile @@ -1,11 +1,10 @@ -FROM node:20.12.2-alpine +FROM node:20.16-slim COPY ./ ./ RUN npm install ENV NODE_ENV production -ENV DATABASE mongo EXPOSE 8080 diff --git a/frameworks/JavaScript/fastify/handlers.js b/frameworks/JavaScript/fastify/handlers.js index df2d37fc378..5032b4b829d 100644 --- a/frameworks/JavaScript/fastify/handlers.js +++ b/frameworks/JavaScript/fastify/handlers.js @@ -4,7 +4,7 @@ const h = require("./helper"); * @param databaseLayer * @returns {{singleQuery: function(*), multipleQueries: function(*), fortunes: function(*), updates: function(*)}} */ -module.exports = databaseLayer => ({ +module.exports = (databaseLayer) => ({ singleQuery: async (req, reply) => { const world = await databaseLayer.getWorld(h.randomTfbNumber()); @@ -34,29 +34,29 @@ module.exports = databaseLayer => ({ }, updates: async (req, reply) => { - const queries = h.getQueries(req.query.queries); + const num = h.getQueries(req.query.queries); const worldPromises = []; - for (let i = 0; i < queries; i++) { - worldPromises.push(databaseLayer.getWorld(h.randomTfbNumber())); + for (let i = 0; i < num; i++) { + const id = h.randomTfbNumber(); + worldPromises.push(databaseLayer.getWorld(id)); } const worlds = await Promise.all(worldPromises); - const worldsToUpdate = worlds.map(world => { - world.randomNumber = h.randomTfbNumber(); + const worldsToUpdate = worlds.map((world) => { + world.randomnumber = h.randomTfbNumber(); return world; }); - await databaseLayer.saveWorlds(worldsToUpdate); - + await databaseLayer.bulkUpdate(worldsToUpdate); reply.send(worldsToUpdate); - } + }, }); // faster than localeCompare function compare(a, b) { - if(a.message < b.message){ + if (a.message < b.message) { return -1; } else if (a.message > b.message) { return 1; diff --git a/frameworks/JavaScript/fastify/helper.js b/frameworks/JavaScript/fastify/helper.js index 8ed4447dbc4..6369564b902 100644 --- a/frameworks/JavaScript/fastify/helper.js +++ b/frameworks/JavaScript/fastify/helper.js @@ -1,12 +1,12 @@ module.exports = { randomTfbNumber: () => Math.floor(Math.random() * 10000) + 1, - getQueries: queries => { + getQueries: (queries) => { return Math.min(Math.max(parseInt(queries) || 1, 1), 500); }, additionalFortune: { id: 0, - message: "Additional fortune added at request time." - } + message: "Additional fortune added at request time.", + }, }; diff --git a/frameworks/JavaScript/fastify/package.json b/frameworks/JavaScript/fastify/package.json index c1a261a4328..4de1056bfe7 100644 --- a/frameworks/JavaScript/fastify/package.json +++ b/frameworks/JavaScript/fastify/package.json @@ -5,12 +5,10 @@ "main": "app.js", "private": true, "dependencies": { - "@fastify/view": "7.4.1", - "fastify": "4.13.0", - "handlebars": "4.7.6", - "knex": "2.4.2", - "mongodb": "6.5.0", - "mysql2": "3.9.7", - "pg": "8.5.1" + "@fastify/view": "^10.0.1", + "fastify": "^5.1.0", + "handlebars": "4.7.8", + "mariadb": "^3.4.0", + "postgres": "^3.4.5" } } From 8c007fa705f9f2951c24b7dafac882d072feb2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Tue, 26 Nov 2024 01:03:44 +0800 Subject: [PATCH 0924/1766] [Java] Update Solon Version To 3.0.3 (#9401) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Version To 2.9.2 * Add Solon-Virtual * Remove solon-virtual * Update Solon Version To 3.0.2 * Add Solon-Vertx * Tweak description * Tweak the dockerfile * Tweak the dockerfile * Tweak config * Tweak dockefile name * Add FilterImpl * Add FilterImpl * The json plugin is changed to jackson * Update Solon Jdk To 23 * Update Solon-Vertx Jdk To 23 * Solon-vertx is restored to jdk 21 * Solon is restored to jdk 21 * Solon-vertx adjusts the Date output format * Solon is restored to jdk 21 * Remove solon-vertx * [Java] Update Solon Version To 3.0.3 --- frameworks/Java/solon/pom.xml | 50 ++++++++++++++- .../Java/solon/src/main/java/hello/Main.java | 4 -- .../Java/solon/src/main/java/hello/Utils.java | 17 ++++++ .../hello/controller/HelloController.java | 25 -------- .../src/main/java/hello/model/Fortune.java | 16 +++++ .../src/main/java/hello/model/Message.java | 21 ------- .../src/main/java/hello/model/World.java | 12 ++++ .../java/hello/repository/DbRepository.java | 15 +++++ .../hello/repository/JdbcDbRepository.java | 46 ++++++++++++++ .../src/main/java/hello/web/DbHandler.java | 61 +++++++++++++++++++ .../src/main/java/hello/web/Fortunes.java | 10 +++ .../src/main/java/hello/web/JsonHandler.java | 27 ++++++++ .../src/main/java/hello/web/TextHandler.java | 25 ++++++++ .../src/main/java/hello/web/WebmvcRouter.java | 29 +++++++++ .../solon/src/main/resources/app.properties | 1 - .../Java/solon/src/main/resources/app.yml | 23 +++++++ .../src/main/resources/fortunes.mustache | 20 ++++++ 17 files changed, 349 insertions(+), 53 deletions(-) create mode 100644 frameworks/Java/solon/src/main/java/hello/Utils.java delete mode 100644 frameworks/Java/solon/src/main/java/hello/controller/HelloController.java create mode 100644 frameworks/Java/solon/src/main/java/hello/model/Fortune.java delete mode 100644 frameworks/Java/solon/src/main/java/hello/model/Message.java create mode 100644 frameworks/Java/solon/src/main/java/hello/model/World.java create mode 100644 frameworks/Java/solon/src/main/java/hello/repository/DbRepository.java create mode 100644 frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java create mode 100644 frameworks/Java/solon/src/main/java/hello/web/DbHandler.java create mode 100644 frameworks/Java/solon/src/main/java/hello/web/Fortunes.java create mode 100644 frameworks/Java/solon/src/main/java/hello/web/JsonHandler.java create mode 100644 frameworks/Java/solon/src/main/java/hello/web/TextHandler.java create mode 100644 frameworks/Java/solon/src/main/java/hello/web/WebmvcRouter.java delete mode 100644 frameworks/Java/solon/src/main/resources/app.properties create mode 100644 frameworks/Java/solon/src/main/resources/app.yml create mode 100644 frameworks/Java/solon/src/main/resources/fortunes.mustache diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index 428d95b35b7..b3485e353e9 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -5,7 +5,7 @@ org.noear solon-parent - 3.0.2 + 3.0.3 hello @@ -15,24 +15,70 @@ 21 + 1.3.6 org.noear - solon-boot-smarthttp + solon-web org.noear solon-serialization-jackson + + + org.noear + solon-data-sqlutils + + + + io.jstach + jstachio + ${jstachio.version} + + + + io.jstach + jstachio-apt + ${jstachio.version} + provided + true + + + + com.zaxxer + HikariCP + 6.0.0 + + + + org.postgresql + postgresql + 42.7.4 + ${project.artifactId} + + org.apache.maven.plugins + maven-compiler-plugin + + + + io.jstach + jstachio-apt + ${jstachio.version} + + + + + org.apache.maven.plugins maven-assembly-plugin diff --git a/frameworks/Java/solon/src/main/java/hello/Main.java b/frameworks/Java/solon/src/main/java/hello/Main.java index 0746f86be45..75fd11bfc36 100644 --- a/frameworks/Java/solon/src/main/java/hello/Main.java +++ b/frameworks/Java/solon/src/main/java/hello/Main.java @@ -2,10 +2,6 @@ import org.noear.solon.Solon; -/** - * @author pmg1991 - * @version V1.0 - */ public class Main { public static void main(String[] args) { Solon.start(Main.class, args); diff --git a/frameworks/Java/solon/src/main/java/hello/Utils.java b/frameworks/Java/solon/src/main/java/hello/Utils.java new file mode 100644 index 00000000000..162f89cc79c --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/Utils.java @@ -0,0 +1,17 @@ +package hello; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +abstract public class Utils { + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; + + public static int randomWorldNumber() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); + } + + public static IntStream randomWorldNumbers() { + return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE).distinct(); + } +} diff --git a/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java b/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java deleted file mode 100644 index 77049043e97..00000000000 --- a/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java +++ /dev/null @@ -1,25 +0,0 @@ -package hello.controller; - -import org.noear.solon.annotation.Controller; -import org.noear.solon.annotation.Get; -import org.noear.solon.annotation.Mapping; -import hello.model.Message; - -/** - * @author noear - * @version V1.0 - */ -@Controller -public class HelloController { - @Get - @Mapping("plaintext") - public String plaintext() { - return "Hello, World!"; - } - - @Get - @Mapping("json") - public Message json() { - return new Message("Hello, World!"); - } -} diff --git a/frameworks/Java/solon/src/main/java/hello/model/Fortune.java b/frameworks/Java/solon/src/main/java/hello/model/Fortune.java new file mode 100644 index 00000000000..f7b5769ef28 --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/model/Fortune.java @@ -0,0 +1,16 @@ +package hello.model; + +public final class Fortune implements Comparable{ + public final int id; + public final String message; + + public Fortune(int id, String message) { + this.id = id; + this.message = message; + } + + @Override + public int compareTo(final Fortune other) { + return message.compareTo(other.message); + } +} diff --git a/frameworks/Java/solon/src/main/java/hello/model/Message.java b/frameworks/Java/solon/src/main/java/hello/model/Message.java deleted file mode 100644 index 1df5276ca8d..00000000000 --- a/frameworks/Java/solon/src/main/java/hello/model/Message.java +++ /dev/null @@ -1,21 +0,0 @@ -package hello.model; - -/** - * @author pmg1991 - * @version V1.0 - */ -public class Message { - private String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/frameworks/Java/solon/src/main/java/hello/model/World.java b/frameworks/Java/solon/src/main/java/hello/model/World.java new file mode 100644 index 00000000000..ec6fc5b3abf --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/model/World.java @@ -0,0 +1,12 @@ +package hello.model; + + +public final class World { + public int id; + public int randomNumber; + public World(int id, int randomNumber) { + this.id = id; + this.randomNumber = randomNumber; + } + +} \ No newline at end of file diff --git a/frameworks/Java/solon/src/main/java/hello/repository/DbRepository.java b/frameworks/Java/solon/src/main/java/hello/repository/DbRepository.java new file mode 100644 index 00000000000..e5445184077 --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/repository/DbRepository.java @@ -0,0 +1,15 @@ +package hello.repository; + +import hello.model.Fortune; +import hello.model.World; + +import java.util.List; + +public interface DbRepository { + + World getWorld(int id) throws Exception; + + void updateWorlds(List worlds) throws Exception; + + List fortunes() throws Exception; +} diff --git a/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java b/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java new file mode 100644 index 00000000000..6e58090c32a --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java @@ -0,0 +1,46 @@ +package hello.repository; + +import hello.model.Fortune; +import hello.model.World; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.data.sql.SqlUtils; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@Component +public class JdbcDbRepository implements DbRepository { + @Inject + SqlUtils sqlUtils; + + @Override + public World getWorld(int id) { + try { + return sqlUtils.sql("SELECT id, randomnumber FROM world WHERE id = ?", id) + .queryRow() + .toBean(World.class, (r, t) -> new World((int) r.getObject(1), (int) r.getObject(2))); + } catch (Exception e) { + return null; + } + } + + @Override + public void updateWorlds(List worlds) throws SQLException { + List values = new ArrayList<>(); + for (World w : worlds) { + values.add(new Object[]{w.randomNumber, w.id}); + } + + sqlUtils.sql("UPDATE world SET randomnumber = ? WHERE id = ?") + .updateBatch(values); + } + + @Override + public List fortunes() throws SQLException { + return sqlUtils.sql("SELECT id, message FROM fortune") + .queryRowList() + .toBeanList(Fortune.class, (r, t) -> new Fortune((int) r.getObject(1), (String) r.getObject(2))); + } +} diff --git a/frameworks/Java/solon/src/main/java/hello/web/DbHandler.java b/frameworks/Java/solon/src/main/java/hello/web/DbHandler.java new file mode 100644 index 00000000000..9163c94e3c9 --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/web/DbHandler.java @@ -0,0 +1,61 @@ +package hello.web; + +import hello.Utils; +import hello.model.Fortune; +import hello.model.World; +import hello.repository.JdbcDbRepository; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.handle.Context; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +@Component +public class DbHandler { + @Inject + JdbcDbRepository dbRepository; + + public void db(Context ctx) throws Throwable { + ctx.render(dbRepository.getWorld(Utils.randomWorldNumber())); + } + + public void queries(Context ctx) throws Throwable { + int queries = ctx.paramAsInt("queries", 0); + + World[] worlds = Utils.randomWorldNumbers() + .mapToObj(dbRepository::getWorld).limit(queries) + .toArray(World[]::new); + + ctx.render(worlds); + } + + public void updates(Context ctx) throws Throwable { + int queries = ctx.paramAsInt("queries", 0); + + List worlds = Utils.randomWorldNumbers() + .mapToObj(id -> { + World world = dbRepository.getWorld(id); + int randomNumber; + do { + randomNumber = Utils.randomWorldNumber(); + } while (randomNumber == world.randomNumber); + world.randomNumber = randomNumber; + return world; + }).limit(queries) + .sorted(Comparator.comparingInt(w -> w.id)) + .toList(); + dbRepository.updateWorlds(worlds); + + ctx.render(worlds); + } + + public void fortunes(Context ctx) throws Throwable { + List fortunes = dbRepository.fortunes(); + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + Collections.sort(fortunes); + + ctx.render(new Fortunes(fortunes)); + } +} diff --git a/frameworks/Java/solon/src/main/java/hello/web/Fortunes.java b/frameworks/Java/solon/src/main/java/hello/web/Fortunes.java new file mode 100644 index 00000000000..a5416ec07bc --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/web/Fortunes.java @@ -0,0 +1,10 @@ +package hello.web; + +import hello.model.Fortune; +import io.jstach.jstache.JStache; + +import java.util.List; + +@JStache(path = "fortunes.mustache") +public record Fortunes(List fortunes) { +} diff --git a/frameworks/Java/solon/src/main/java/hello/web/JsonHandler.java b/frameworks/Java/solon/src/main/java/hello/web/JsonHandler.java new file mode 100644 index 00000000000..c65bb73ab74 --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/web/JsonHandler.java @@ -0,0 +1,27 @@ +package hello.web; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; +import org.noear.solon.annotation.Component; +import org.noear.solon.boot.web.MimeType; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Handler; + +import java.util.Map; + +@Component +public class JsonHandler implements Handler { + private final ObjectWriter writer; + + public JsonHandler() { + this.writer = new ObjectMapper().writerFor(Map.class); + } + + @Override + public void handle(Context ctx) throws Throwable { + byte[] body = this.writer.writeValueAsBytes(Map.of("message", "Hello, world!")); + ctx.contentLength(body.length); + ctx.contentType(MimeType.APPLICATION_JSON_VALUE); + ctx.output(body); + } +} diff --git a/frameworks/Java/solon/src/main/java/hello/web/TextHandler.java b/frameworks/Java/solon/src/main/java/hello/web/TextHandler.java new file mode 100644 index 00000000000..96d68e6e7df --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/web/TextHandler.java @@ -0,0 +1,25 @@ +package hello.web; + +import org.noear.solon.annotation.Component; +import org.noear.solon.boot.web.MimeType; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Handler; + +import java.nio.charset.StandardCharsets; + +@Component +public class TextHandler implements Handler { + private static final byte[] TEXT_BODY = "Hello, World!".getBytes(StandardCharsets.UTF_8); + + private static final String TEXT_BODY_LENGTH = String.valueOf(TEXT_BODY.length); + private static final String CONTENT_LENGTH = "Content-Length"; + private static final String CONTENT_TYPE = "Content-Type"; + + @Override + public void handle(Context ctx) throws Throwable { + ctx.headerSet(CONTENT_LENGTH, TEXT_BODY_LENGTH); + ctx.headerSet(CONTENT_TYPE, MimeType.TEXT_PLAIN_VALUE); + ctx.output("Hello, World!".getBytes()); + } +} + diff --git a/frameworks/Java/solon/src/main/java/hello/web/WebmvcRouter.java b/frameworks/Java/solon/src/main/java/hello/web/WebmvcRouter.java new file mode 100644 index 00000000000..6024ddcc548 --- /dev/null +++ b/frameworks/Java/solon/src/main/java/hello/web/WebmvcRouter.java @@ -0,0 +1,29 @@ +package hello.web; + +import org.noear.solon.SolonApp; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; + +@Configuration +public class WebmvcRouter { + @Bean + public void initRouter(SolonApp app, + DbHandler dbHandler, + JsonHandler jsonHandler, + TextHandler textHandler) { + app.handler().prev(ctx -> { + ctx.setHandled(true); + ctx.headerSet("Server", "Solon"); + + switch (ctx.path()) { + case "/plaintext" -> textHandler.handle(ctx); + case "/json" -> jsonHandler.handle(ctx); + case "/db" -> dbHandler.db(ctx); + case "/queries" -> dbHandler.queries(ctx); + case "/updates" -> dbHandler.updates(ctx); + case "/fortunes" -> dbHandler.fortunes(ctx); + default -> ctx.status(404); + } + }); + } +} diff --git a/frameworks/Java/solon/src/main/resources/app.properties b/frameworks/Java/solon/src/main/resources/app.properties deleted file mode 100644 index 26a5df70351..00000000000 --- a/frameworks/Java/solon/src/main/resources/app.properties +++ /dev/null @@ -1 +0,0 @@ -server.http.ioBound=false \ No newline at end of file diff --git a/frameworks/Java/solon/src/main/resources/app.yml b/frameworks/Java/solon/src/main/resources/app.yml new file mode 100644 index 00000000000..cbd9e850625 --- /dev/null +++ b/frameworks/Java/solon/src/main/resources/app.yml @@ -0,0 +1,23 @@ +database: + name: hello_world + host: tfb-database + port: 5432 + username: benchmarkdbuser + password: benchmarkdbpass + +server.http: + ioBound: false + +solon.threads: + virtual: + enabled: true + +solon.dataSources: + test!: + class: "com.zaxxer.hikari.HikariDataSource" + driverClassName: "org.postgresql.Driver" + url: jdbc:postgresql://${database.host}:${database.port}/${database.name}?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable + username: ${database.username} + password: ${database.password} + hikari: + maximum-pool-size: 256 \ No newline at end of file diff --git a/frameworks/Java/solon/src/main/resources/fortunes.mustache b/frameworks/Java/solon/src/main/resources/fortunes.mustache new file mode 100644 index 00000000000..3043546205b --- /dev/null +++ b/frameworks/Java/solon/src/main/resources/fortunes.mustache @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + {{#fortunes}} + + + + + {{/fortunes}} +
      idmessage
      {{id}}{{message}}
      + + From f8a7664cb4829a49cb8884f0ead90ab1dbad84c0 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Tue, 26 Nov 2024 00:03:55 +0700 Subject: [PATCH 0925/1766] Updated ktor and kotlin to latest versions (#9400) * updated ktor and kotlin * upgraded to jvm21, since other java frameworks already use it --- frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile | 2 +- frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile | 2 +- .../Kotlin/ktor/ktor-exposed/app/build.gradle.kts | 10 +++++----- frameworks/Kotlin/ktor/ktor.dockerfile | 4 ++-- frameworks/Kotlin/ktor/ktor/pom.xml | 12 ++++++------ 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile b/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile index 10f2ed2180d..417c0358735 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-exposed-dao.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:jdk17 +FROM gradle:jdk21 WORKDIR /ktor-exposed COPY ktor-exposed/settings.gradle.kts settings.gradle.kts diff --git a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile index 5d05b4494ce..495b8b6c0e6 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile @@ -1,4 +1,4 @@ -FROM gradle:jdk17 +FROM gradle:jdk21 WORKDIR /ktor-exposed COPY ktor-exposed/settings.gradle.kts settings.gradle.kts diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts index f57ded6c314..80a9debfa16 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts @@ -1,6 +1,6 @@ plugins { application - kotlin("jvm") version "1.9.22" + kotlin("jvm") version "2.0.21" kotlin("plugin.serialization") version "2.0.0" id("com.github.johnrengelman.shadow") version "8.1.0" } @@ -9,8 +9,8 @@ repositories { mavenCentral() } -val ktorVersion = "2.3.12" -val kotlinxSerializationVersion = "1.6.3" +val ktorVersion = "3.0.1" +val kotlinxSerializationVersion = "1.7.3" val exposedVersion = "0.56.0" dependencies { @@ -25,8 +25,8 @@ dependencies { implementation("org.jetbrains.exposed:exposed-dao:$exposedVersion") implementation("org.jetbrains.exposed:exposed-jdbc:$exposedVersion") - implementation("org.postgresql:postgresql:42.5.4") - implementation("com.zaxxer:HikariCP:5.0.1") + implementation("org.postgresql:postgresql:42.7.4") + implementation("com.zaxxer:HikariCP:5.1.0") runtimeOnly("org.slf4j:slf4j-simple:1.7.36") } diff --git a/frameworks/Kotlin/ktor/ktor.dockerfile b/frameworks/Kotlin/ktor/ktor.dockerfile index 1558d312736..076a51a1416 100644 --- a/frameworks/Kotlin/ktor/ktor.dockerfile +++ b/frameworks/Kotlin/ktor/ktor.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.9.7-amazoncorretto-17-debian as maven +FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as maven WORKDIR /ktor COPY ktor/pom.xml pom.xml COPY ktor/src src RUN mvn clean package -q -FROM amazoncorretto:17.0.11-al2023-headless +FROM amazoncorretto:21-al2023-headless WORKDIR /ktor COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-netty-bundle.jar app.jar diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index a794bb59fe3..9ded4780572 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -12,15 +12,15 @@ org.jetbrains.ktor tech-empower-framework-benchmark - 1.9.22 - 2.3.11 - 1.6.3 + 2.0.21 + 3.0.1 + 1.7.3 0.11.0 UTF-8 - 5.0.0 + 5.1.0 1.2.13 - 8.0.28 - 42.7.2 + 8.0.33 + 42.7.4 From 496a8ec2b6eeddb31bcb890b107e1fa2e13eacc4 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Tue, 26 Nov 2024 01:04:03 +0800 Subject: [PATCH 0926/1766] [xitca-web] strict thread-per-core (#9399) * use core affinity for static thread per core * use strict thread per core pattern * dep update * dep update --- frameworks/Rust/xitca-web/Cargo.lock | 98 ++++++++++------ frameworks/Rust/xitca-web/Cargo.toml | 20 ++-- frameworks/Rust/xitca-web/src/main.rs | 14 +-- .../Rust/xitca-web/src/main_unrealistic.rs | 108 +++++++++--------- 4 files changed, 133 insertions(+), 107 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 070a2e67550..a3f4e7a02cd 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -66,9 +66,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bb8" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10cf871f3ff2ce56432fddc2615ac7acc3aa22ca321f8fea800846fbb32f188" +checksum = "d89aabfae550a5c44b43ab941844ffcd2e993cb6900b342debf59e9ea74acdb8" dependencies = [ "async-trait", "futures-util", @@ -111,15 +111,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cc" -version = "1.1.30" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ "shlex", ] @@ -130,11 +130,22 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "core_affinity" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622892f5635ce1fc38c8f16dfc938553ed64af482edb5e150bf4caedbfcb2304" +dependencies = [ + "libc", + "num_cpus", + "winapi", +] + [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] @@ -429,9 +440,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "7a73e9fe3c49d7afb2ace819fa181a287ce54a0983eda4e0eb05c22f82ffe534" [[package]] name = "itoap" @@ -450,9 +461,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.159" +version = "0.2.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" [[package]] name = "libmimalloc-sys" @@ -534,6 +545,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.36.5" @@ -598,9 +619,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -657,9 +678,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -757,12 +778,11 @@ dependencies = [ [[package]] name = "scoped-futures" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1473e24c637950c9bd38763220bea91ec3e095a89f672bbd7a10d03e77ba467" +checksum = "1b24aae2d0636530f359e9d5ef0c04669d11c5e756699b27a6a6d845d8329091" dependencies = [ - "cfg-if", - "pin-utils", + "pin-project-lite", ] [[package]] @@ -773,18 +793,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", @@ -793,9 +813,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -907,9 +927,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.79" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -933,8 +953,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" -source = "git+https://github.com/tokio-rs/tokio.git?rev=512e9de#512e9decfb683d22f4a145459142542caa0894c9" +version = "1.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -1031,9 +1052,9 @@ checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -1248,7 +1269,7 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "xitca-codegen" version = "0.4.0" -source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" +source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" dependencies = [ "quote", "syn", @@ -1257,7 +1278,7 @@ dependencies = [ [[package]] name = "xitca-http" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" +source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" dependencies = [ "futures-core", "http", @@ -1307,7 +1328,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" +source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" dependencies = [ "fallible-iterator", "futures-core", @@ -1345,7 +1366,7 @@ dependencies = [ [[package]] name = "xitca-server" version = "0.5.0" -source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" +source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" dependencies = [ "socket2 0.5.7", "tokio", @@ -1359,7 +1380,7 @@ dependencies = [ [[package]] name = "xitca-service" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" +source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" [[package]] name = "xitca-unsafe-collection" @@ -1375,6 +1396,7 @@ name = "xitca-web" version = "0.1.0" dependencies = [ "atoi", + "core_affinity", "diesel", "diesel-async", "futures-core", @@ -1400,7 +1422,7 @@ dependencies = [ [[package]] name = "xitca-web" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=1de8d9c#1de8d9c079e73f7fd9ba953741302d87e50d831a" +source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" dependencies = [ "futures-core", "pin-project-lite", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index c547c16de48..acae496a4f2 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -46,7 +46,7 @@ template = ["dep:sailfish"] # io-uring optional io-uring = ["dep:tokio-uring", "xitca-http/io-uring", "xitca-server/io-uring"] # unrealistic performance optimization -perf = ["dep:mimalloc", "tokio/parking_lot"] +perf = ["dep:core_affinity", "dep:mimalloc", "tokio/parking_lot"] [dependencies] xitca-http = "0.7" @@ -81,13 +81,14 @@ sailfish = { version = "0.9", default-features = false, features = ["perf-inline tokio-uring = { version = "0.5", optional = true } # perf optional +core_affinity = { version = "0.8.1", optional = true } mimalloc = { version = "0.1", default-features = false, 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 } rand = { version = "0.8", features = ["small_rng"] } -tokio = "1" +tokio = "1.41" [profile.release] lto = true @@ -100,11 +101,10 @@ xitca-postgres-diesel = { git = "https://github.com/fakeshadow/xitca-postgres-di diesel-async = { git = "https://github.com/weiznich/diesel_async", rev = "5b8262b" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } -tokio = { git = "https://github.com/tokio-rs/tokio.git", rev = "512e9de" } - -xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } -xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } -xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } -xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } -xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } -xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "1de8d9c" } + +xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } +xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } +xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } +xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } +xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } +xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index b7389fbb821..abe665f3715 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -51,14 +51,12 @@ where #[cold] #[inline(never)] fn error_handler(e: RouterError) -> Response { - match e { - RouterError::Match(_) => error_response(StatusCode::NOT_FOUND), - RouterError::NotAllowed(_) => error_response(StatusCode::METHOD_NOT_ALLOWED), - RouterError::Service(e) => { - println!("{e}"); - error_response(StatusCode::INTERNAL_SERVER_ERROR) - } - } + let status = match e { + RouterError::Match(_) => StatusCode::NOT_FOUND, + RouterError::NotAllowed(_) => StatusCode::METHOD_NOT_ALLOWED, + RouterError::Service(_) => StatusCode::INTERNAL_SERVER_ERROR, + }; + error_response(status) } async fn plain_text(ctx: Ctx<'_>) -> HandleResult { diff --git a/frameworks/Rust/xitca-web/src/main_unrealistic.rs b/frameworks/Rust/xitca-web/src/main_unrealistic.rs index e291799408c..a4f9223ba44 100644 --- a/frameworks/Rust/xitca-web/src/main_unrealistic.rs +++ b/frameworks/Rust/xitca-web/src/main_unrealistic.rs @@ -10,14 +10,13 @@ mod db; mod ser; mod util; -use std::{convert::Infallible, io}; +use std::io; use xitca_http::{ bytes::BufMutWriter, h1::dispatcher_unreal::{Dispatcher, Request, Response}, http::StatusCode, }; -use xitca_io::net::TcpStream; use xitca_service::Service; use self::{ @@ -30,49 +29,57 @@ fn main() -> io::Result<()> { let cores = std::thread::available_parallelism().map(|num| num.get()).unwrap_or(56); + let mut ids = core_affinity::get_core_ids().unwrap(); + + let worker = move |id: Option| { + if let Some(id) = id { + let _ = core_affinity::set_for_current(id); + } + + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build_local(&Default::default()) + .unwrap() + .block_on(async { + let socket = tokio::net::TcpSocket::new_v4()?; + socket.set_reuseaddr(true)?; + // unrealistic due to following reason: + // 1. this only works good on unix system. + // 2. no resource distribution adjustment between sockets on different threads. causing uneven workload + // where some threads are idle while others busy. resulting in overall increased latency + socket.set_reuseport(true)?; + socket.bind(addr)?; + let listener = socket.listen(1024)?; + + let client = db::create().await.unwrap(); + + // unrealistic http dispatcher. no spec check. no security feature. + let service = Dispatcher::new(handler, State::new(client)); + + loop { + match listener.accept().await { + Ok((stream, _)) => { + let service = service.clone(); + tokio::task::spawn_local(async move { + let _ = service.call(stream.into()).await; + }); + } + Err(e) => return Err(e), + }; + } + }) + }; + let handle = core::iter::repeat_with(|| { - std::thread::spawn(move || { - tokio::runtime::Builder::new_current_thread() - .enable_all() - .build_local(&Default::default()) - .unwrap() - .block_on(async { - let socket = tokio::net::TcpSocket::new_v4()?; - socket.set_reuseaddr(true)?; - // unrealistic due to following reason: - // 1. this only works good on unix system. - // 2. no resource distribution adjustment between sockets on different threads. causing uneven workload - // where some threads are idle while others busy. resulting in overall increased latency - socket.set_reuseport(true)?; - socket.bind(addr)?; - let listener = socket.listen(1024)?; - - let client = db::create().await.unwrap(); - - // unrealistic http dispatcher. no spec check. no security feature. - let service = Dispatcher::new(handler, State::new(client)); - - loop { - match listener.accept().await { - Ok((stream, _)) => { - let stream = stream.into_std()?; - let stream = TcpStream::from_std(stream)?; - let service = service.clone(); - tokio::task::spawn_local(async move { - let _ = service.call(stream).await; - }); - } - Err(e) => return Err(e), - }; - } - }) - }) + let id = ids.pop(); + std::thread::spawn(move || worker(id)) }) - .take(cores) + .take(cores - 1) .collect::>(); // unrealistic due to no signal handling, not shutdown handling. when killing this process all resources that // need clean async shutdown will be leaked. + worker(ids.pop())?; for handle in handle { handle.join().unwrap()?; } @@ -80,7 +87,7 @@ fn main() -> io::Result<()> { Ok(()) } -async fn handler<'h>(req: Request<'h>, res: Response<'h>, state: &State) -> Response<'h, 3> { +async fn handler<'h>(req: Request<'h, State>, res: Response<'h>) -> Response<'h, 3> { // unrealistic due to no http method check match req.path { // unrealistic due to no dynamic path matching @@ -91,8 +98,7 @@ async fn handler<'h>(req: Request<'h>, res: Response<'h>, state: &State(buf.extend_from_slice(b"Hello, World!"))) - .unwrap() + .body_writer(|buf| buf.extend_from_slice(b"Hello, World!")) } "/json" => res .status(StatusCode::OK) @@ -100,12 +106,12 @@ async fn handler<'h>(req: Request<'h>, res: Response<'h>, state: &State { use sailfish::TemplateOnce; - let fortunes = state.client.tell_fortune().await.unwrap().render_once().unwrap(); + let fortunes = req.ctx.client.tell_fortune().await.unwrap().render_once().unwrap(); res.status(StatusCode::OK) .header("content-type", "text/html; charset=utf-8") .header("server", "X") @@ -114,18 +120,18 @@ async fn handler<'h>(req: Request<'h>, res: Response<'h>, state: &State { // unrealistic due to no error handling. any db/serialization error will cause process crash. // the same goes for all following unwraps on database related functions. - let world = state.client.get_world().await.unwrap(); - json_response(res, state, &world) + let world = req.ctx.client.get_world().await.unwrap(); + json_response(res, req.ctx, &world) } p if p.starts_with("/q") => { let num = p["/queries?q=".len()..].parse_query(); - let worlds = state.client.get_worlds(num).await.unwrap(); - json_response(res, state, &worlds) + let worlds = req.ctx.client.get_worlds(num).await.unwrap(); + json_response(res, req.ctx, &worlds) } p if p.starts_with("/u") => { let num = p["/updates?q=".len()..].parse_query(); - let worlds = state.client.update(num).await.unwrap(); - json_response(res, state, &worlds) + let worlds = req.ctx.client.update(num).await.unwrap(); + json_response(res, req.ctx, &worlds) } _ => res.status(StatusCode::NOT_FOUND).header("server", "X").body(&[]), } From e91044219ce0b31401047d5a1acd44cc110e5959 Mon Sep 17 00:00:00 2001 From: LLT21 <43903768+LLT21@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:04:11 +0100 Subject: [PATCH 0927/1766] Upgrade appMpower to .NET 9 and use Razor slices (#9398) * Dotnet 9.0 * Using razor slices * System.Data.Odbc version 9.0.0 * Return to System.Data.Odbc because version 9 misses file libodbc.so * Solution for System.Data.Odbc version 9.0.0 ? --------- Co-authored-by: LLT21 <> --- .../appmpower/appmpower-odbc-my.dockerfile | 8 +- .../appmpower/appmpower-odbc-pg.dockerfile | 10 +- .../CSharp/appmpower/appmpower.dockerfile | 4 +- .../src/appMpower.Orm/NativeMethods.cs | 59 +++++++++ .../Serializers/FortunesSerializer.cs | 24 ++++ .../src/appMpower.Orm/appMpower.Orm.csproj | 4 +- .../Middleware/FortunesMiddleware.cs | 115 ++++++++++++++++++ .../src/appMpower/Objects/Fortune.cs | 22 ++++ .../src/appMpower/Slices/Fortunes.cshtml | 2 + .../src/appMpower/Slices/_ViewImports.cshtml | 10 ++ .../appmpower/src/appMpower/appMpower.csproj | 3 +- 11 files changed, 250 insertions(+), 11 deletions(-) create mode 100644 frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/FortunesSerializer.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Objects/Fortune.cs create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Slices/Fortunes.cshtml create mode 100644 frameworks/CSharp/appmpower/src/appMpower/Slices/_ViewImports.cshtml diff --git a/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile b/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile index a5bbf22ae6f..9df17020863 100644 --- a/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0.100 AS build RUN apt-get update RUN apt-get -yqq install clang zlib1g-dev RUN apt-get update @@ -8,12 +8,12 @@ COPY src . RUN dotnet publish -c Release -o out /p:Database=mysql # Construct the actual image that will run -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0.0 AS runtime RUN apt-get update # The following installs standard versions unixodbc and pgsqlodbc # unixodbc still needs to be installed even if compiled locally -RUN apt-get install -y unixodbc wget curl +RUN apt-get install -y unixodbc-dev unixodbc wget curl RUN apt-get update WORKDIR /odbc @@ -45,6 +45,8 @@ WORKDIR /app COPY --from=build /app/out ./ RUN cp /usr/lib/libm* /app +#RUN cp /usr/lib/aarch64-linux-gnu/libodbc* /app +RUN cp /usr/lib/x86_64-linux-gnu/libodbc* /app EXPOSE 8080 diff --git a/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile b/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile index 4080684bab6..ebeab3b6186 100644 --- a/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0.100 AS build RUN apt-get update RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5 @@ -7,10 +7,10 @@ COPY src . RUN dotnet publish -c Release -o out /p:Database=postgresql # Construct the actual image that will run -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0.0 AS runtime RUN apt-get update -RUN apt-get install -y unixodbc odbc-postgresql +RUN apt-get install -y unixodbc-dev unixodbc odbc-postgresql # unixodbc still needs to be installed even if compiled locally ENV PATH=/usr/local/unixODBC/bin:$PATH @@ -27,6 +27,10 @@ ENV ASPNETCORE_URLS http://+:8080 WORKDIR /app COPY --from=build /app/out ./ +#RUN cp /usr/lib/aarch64-linux-gnu/libodbc* /app +RUN cp /usr/lib/x86_64-linux-gnu/libodbc* /app + + EXPOSE 8080 ENTRYPOINT ["./appMpower"] \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/appmpower.dockerfile b/frameworks/CSharp/appmpower/appmpower.dockerfile index 3d521c490d8..d10a8ad3c2e 100644 --- a/frameworks/CSharp/appmpower/appmpower.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0.100 AS build RUN apt-get update RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5 @@ -8,7 +8,7 @@ COPY src . RUN dotnet publish -c Release -o out # Construct the actual image that will run -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0.0 AS runtime # Full PGO ENV DOTNET_TieredPGO 1 ENV DOTNET_TC_QuickJitForLoops 1 diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs index 64337e6269e..6c20aded37a 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/NativeMethods.cs @@ -17,6 +17,9 @@ public static class NativeMethods private readonly static WorldSerializer _worldSerializer = new WorldSerializer(); private readonly static WorldsSerializer _worldsSerializer = new WorldsSerializer(); + private readonly static FortunesSerializer _fortunesSerializer = new FortunesSerializer(); + private static readonly byte[] _delimiter = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }; + [UnmanagedCallersOnly(EntryPoint = "Dbms")] public static void Dbms(int dbms) @@ -66,6 +69,7 @@ public static unsafe IntPtr Db(int* length, IntPtr* handlePointer) */ } + /* [UnmanagedCallersOnly(EntryPoint = "Fortunes")] public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer) { @@ -81,6 +85,61 @@ public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer) return byteArrayPointer; } + */ + + [UnmanagedCallersOnly(EntryPoint = "Fortunes")] + public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer) + { + List fortunes = RawDb.LoadFortunesRows().GetAwaiter().GetResult(); + + int totalSize = 0; + + foreach (var fortune in fortunes) + { + totalSize += sizeof(int) // for Id + + Encoding.UTF8.GetByteCount(fortune.Message ?? "") // for Message + + _delimiter.Length; // for delimiter + } + + // Allocate the total buffer + byte[] buffer = new byte[totalSize]; + int offset = 0; + + // Write each object to the buffer + foreach (var fortune in fortunes) + { + // Write Id + BitConverter.TryWriteBytes(buffer.AsSpan(offset, sizeof(int)), fortune.Id); + offset += sizeof(int); + + // Write Message + int descriptionLength = Encoding.UTF8.GetBytes(fortune.Message ?? "", buffer.AsSpan(offset)); + offset += descriptionLength; + + // Write Delimiter + _delimiter.CopyTo(buffer, offset); + offset += _delimiter.Length; + } + + byte[] byteArray = buffer.ToArray(); + *length = byteArray.Length; + + /* + var memoryStream = new MemoryStream(); + using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions); + + _fortunesSerializer.Serialize(utf8JsonWriter, fortunes); + + byte[] byteArray = memoryStream.ToArray(); + *length = (int)utf8JsonWriter.BytesCommitted; + */ + + GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); + IntPtr byteArrayPointer = handle.AddrOfPinnedObject(); + *handlePointer = GCHandle.ToIntPtr(handle); + + return byteArrayPointer; + } [UnmanagedCallersOnly(EntryPoint = "Query")] public static unsafe IntPtr Query(int queries, int* length, IntPtr* handlePointer) diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/FortunesSerializer.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/FortunesSerializer.cs new file mode 100644 index 00000000000..d1697c0c0cc --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Serializers/FortunesSerializer.cs @@ -0,0 +1,24 @@ +using System.Text.Json; +using appMpower.Orm.Objects; + +namespace appMpower.Orm.Serializers +{ + public class FortunesSerializer : IJsonSerializer> + { + public void Serialize(Utf8JsonWriter utf8JsonWriter, List fortunes) + { + utf8JsonWriter.WriteStartArray(); + + foreach (Fortune fortune in fortunes) + { + utf8JsonWriter.WriteStartObject(); + utf8JsonWriter.WriteNumber("id", fortune.Id); + utf8JsonWriter.WriteString("message", fortune.Message); + utf8JsonWriter.WriteEndObject(); + } + + utf8JsonWriter.WriteEndArray(); + utf8JsonWriter.Flush(); + } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj b/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj index dd9c929f19f..858f6f66ae4 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable true @@ -36,7 +36,7 @@ - + diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs index 2acf9af1716..6321d515887 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs @@ -2,7 +2,11 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Unicode; using System.Threading.Tasks; +using appMpower.Objects; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; @@ -11,11 +15,21 @@ namespace appMpower; public class FortunesMiddleware { + static readonly HtmlEncoder htmlEncoder = CreateHtmlEncoder(); + static HtmlEncoder CreateHtmlEncoder() + { + var settings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Katakana, UnicodeRanges.Hiragana); + settings.AllowCharacter('\u2014'); // allow EM DASH through + return HtmlEncoder.Create(settings); + } + private readonly static KeyValuePair _headerServer = new KeyValuePair("Server", new StringValues("k")); private readonly static KeyValuePair _headerContentType = new KeyValuePair("Content-Type", new StringValues("text/html; charset=UTF-8")); + private static readonly byte[] _delimiter = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }; + private readonly RequestDelegate _next; public FortunesMiddleware(RequestDelegate next) @@ -27,6 +41,66 @@ public unsafe Task Invoke(HttpContext httpContext) { if (httpContext.Request.Path.StartsWithSegments("/fortunes", StringComparison.Ordinal)) { + int payloadLength; + IntPtr handlePointer; + + IntPtr bytePointer = NativeMethods.Fortunes(out payloadLength, out handlePointer); + + /* + byte[] json = new byte[payloadLength]; + Marshal.Copy(bytePointer, json, 0, payloadLength); + NativeMethods.FreeHandlePointer(handlePointer); + + string s = Encoding.UTF8.GetString(json, 0, json.Length); + + var options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + + List fortunes = JsonSerializer.Deserialize>(s, options); + + var response = httpContext.Response; + response.Headers.Add(_headerServer); + + var result = Results.Extensions.RazorSlice>(fortunes); + result.HtmlEncoder = htmlEncoder; + + return result.ExecuteAsync(httpContext); + */ + + byte[] byteArray = new byte[payloadLength]; + Marshal.Copy(bytePointer, byteArray, 0, payloadLength); + + List fortunes = new List(); + + // Convert the byte array into segments split by the delimiter + int delimiterLength = _delimiter.Length; + int start = 0; + int index; + + while ((index = FindDelimiterIndex(byteArray, _delimiter, start)) >= 0) + { + // Use a span over the segment of bytes for the current object + var objectDataSpan = new ReadOnlySpan(byteArray, start, index - start); + Fortune fortune = ConvertBytesToObject(objectDataSpan); + fortunes.Add(fortune); + + // Move past the delimiter + start = index + delimiterLength; + } + + NativeMethods.FreeHandlePointer(handlePointer); + + var response = httpContext.Response; + response.Headers.Add(_headerServer); + + var result = Results.Extensions.RazorSlice>(fortunes); + result.HtmlEncoder = htmlEncoder; + + return result.ExecuteAsync(httpContext); + + /* var response = httpContext.Response; response.Headers.Add(_headerServer); response.Headers.Add(_headerContentType); @@ -43,10 +117,51 @@ public unsafe Task Invoke(HttpContext httpContext) new KeyValuePair("Content-Length", payloadLength.ToString())); return response.Body.WriteAsync(json, 0, payloadLength); + */ } return _next(httpContext); } + + private static int FindDelimiterIndex(byte[] array, byte[] delimiter, int startIndex) + { + int endIndex = array.Length - delimiter.Length; + + for (int i = startIndex; i <= endIndex; i++) + { + bool isMatch = true; + + for (int j = 0; j < delimiter.Length; j++) + { + if (array[i + j] != delimiter[j]) + { + isMatch = false; + break; + } + } + + if (isMatch) + { + return i; + } + } + + return -1; + } + + private static Fortune ConvertBytesToObject(ReadOnlySpan data) + { + int offset = 0; + + // Read Id + int id = BitConverter.ToInt32(data.Slice(offset, sizeof(int))); + offset += sizeof(int); + + // Read Message (remaining bytes in the span) + string message = Encoding.UTF8.GetString(data.Slice(offset)); + + return new Fortune(id, message); + } } public static class FortunesMiddlewareExtensions diff --git a/frameworks/CSharp/appmpower/src/appMpower/Objects/Fortune.cs b/frameworks/CSharp/appmpower/src/appMpower/Objects/Fortune.cs new file mode 100644 index 00000000000..187a3c06980 --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Objects/Fortune.cs @@ -0,0 +1,22 @@ +using System; + +namespace appMpower.Objects +{ + public struct Fortune : IComparable, IComparable + { + public Fortune(int id, string message) + { + Id = id; + Message = message; + } + + public int Id { get; set; } + + public string Message { get; set; } + + public int CompareTo(object obj) => throw new InvalidOperationException("The non-generic CompareTo should not be used"); + + // Performance critical, using culture insensitive comparison + public int CompareTo(Fortune other) => string.CompareOrdinal(Message, other.Message); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/Slices/Fortunes.cshtml b/frameworks/CSharp/appmpower/src/appMpower/Slices/Fortunes.cshtml new file mode 100644 index 00000000000..ebf2c38d5ec --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Slices/Fortunes.cshtml @@ -0,0 +1,2 @@ +@inherits RazorSliceHttpResult> +Fortunes@foreach (var item in Model){}
      idmessage
      @WriteNumber(item.Id, default, CultureInfo.InvariantCulture, false)@item.Message
      \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/Slices/_ViewImports.cshtml b/frameworks/CSharp/appmpower/src/appMpower/Slices/_ViewImports.cshtml new file mode 100644 index 00000000000..98a692ef65a --- /dev/null +++ b/frameworks/CSharp/appmpower/src/appMpower/Slices/_ViewImports.cshtml @@ -0,0 +1,10 @@ +@inherits RazorSliceHttpResult + +@using System.Globalization; +@using Microsoft.AspNetCore.Razor; +@using Microsoft.AspNetCore.Http.HttpResults; +@using RazorSlices; +@using appMpower.Objects; + +@tagHelperPrefix __disable_tagHelpers__: +@removeTagHelper *, Microsoft.AspNetCore.Mvc.Razor \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj b/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj index 5661d01ce61..ba6fe6f7059 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj +++ b/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 Exe true @@ -24,6 +24,7 @@ + From 1975428f3053ad96126c2daf6d219bb79d46ba22 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 25 Nov 2024 18:04:51 +0100 Subject: [PATCH 0928/1766] [rails] Only install used servers (#9388) When testing with puma we don't need to install falcon. Unicorn is no longer tested so we can remove it from the Gemfile. --- frameworks/Ruby/rails/Gemfile | 4 ---- frameworks/Ruby/rails/Gemfile.lock | 6 ------ frameworks/Ruby/rails/README.md | 2 +- frameworks/Ruby/rails/rails-agoo.dockerfile | 2 +- frameworks/Ruby/rails/rails-falcon.dockerfile | 3 ++- frameworks/Ruby/rails/rails-mysql.dockerfile | 5 +++-- frameworks/Ruby/rails/rails.dockerfile | 5 +++-- frameworks/Ruby/rails/run-with-redis.sh | 3 --- 8 files changed, 10 insertions(+), 20 deletions(-) delete mode 100755 frameworks/Ruby/rails/run-with-redis.sh diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 3ec7067d123..846b2777d7e 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -20,10 +20,6 @@ group :puma do gem 'puma', '~> 6.4', require: false end -group :unicorn do - gem 'unicorn', '~> 6.1', require: false -end - group :agoo do gem 'agoo', require: false gem 'rackup' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 83bcc1a1582..1c9ebb93a72 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -138,7 +138,6 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.8.1) - kgio (2.11.4) localhost (1.3.1) logger (1.6.1) loofah (2.22.0) @@ -230,7 +229,6 @@ GEM rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) - raindrops (0.20.1) rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) @@ -253,9 +251,6 @@ GEM concurrent-ruby (~> 1.0) tzinfo-data (1.2024.2) tzinfo (>= 1.0.0) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) useragent (0.16.10) webrick (1.8.2) websocket-driver (0.7.6) @@ -278,7 +273,6 @@ DEPENDENCIES redis (~> 5.0) trilogy (~> 2.8.1) tzinfo-data - unicorn (~> 6.1) BUNDLED WITH 2.3.3 diff --git a/frameworks/Ruby/rails/README.md b/frameworks/Ruby/rails/README.md index 564df6d6479..de1ba2aacf0 100644 --- a/frameworks/Ruby/rails/README.md +++ b/frameworks/Ruby/rails/README.md @@ -13,7 +13,7 @@ comparing a variety of web platforms. The tests were run with: - [Ruby 3.3](http://www.ruby-lang.org/) -- [Rails 7.1](http://rubyonrails.org/) +- [Rails 7.2](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-agoo.dockerfile b/frameworks/Ruby/rails/rails-agoo.dockerfile index 7160fe32f84..3eb3c4afbbe 100644 --- a/frameworks/Ruby/rails/rails-agoo.dockerfile +++ b/frameworks/Ruby/rails/rails-agoo.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=trilogy +ENV BUNDLE_WITHOUT=mysql:falcon:puma RUN bundle install --jobs=8 COPY . /rails/ diff --git a/frameworks/Ruby/rails/rails-falcon.dockerfile b/frameworks/Ruby/rails/rails-falcon.dockerfile index 3244b73aa02..c2aeaa32997 100644 --- a/frameworks/Ruby/rails/rails-falcon.dockerfile +++ b/frameworks/Ruby/rails/rails-falcon.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=mysql +ENV BUNDLE_WITHOUT=mysql:agoo:puma RUN bundle install --jobs=8 COPY . /rails/ @@ -23,4 +23,5 @@ COPY . /rails/ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 +CMD service redis-server start CMD bundle exec falcon host diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index b14a3b75af6..877a1e67fb5 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=postgresql +ENV BUNDLE_WITHOUT=postgresql:agoo:falcon RUN bundle install --jobs=8 COPY . /rails/ @@ -23,4 +23,5 @@ COPY . /rails/ ENV RAILS_ENV=production_mysql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 -CMD ./run-with-redis.sh +CMD service redis-server start +CMD rails server diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 8eb53c4dbd2..0d168f735f0 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=mysql +ENV BUNDLE_WITHOUT=mysql:agoo:falcon RUN bundle install --jobs=8 COPY . /rails/ @@ -23,4 +23,5 @@ COPY . /rails/ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 -CMD ./run-with-redis.sh +CMD service redis-server start +CMD rails server diff --git a/frameworks/Ruby/rails/run-with-redis.sh b/frameworks/Ruby/rails/run-with-redis.sh deleted file mode 100755 index 036224f0df5..00000000000 --- a/frameworks/Ruby/rails/run-with-redis.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -service redis-server start -bundle exec falcon host From f4660681766660e68af9ce915c7f33798a47c632 Mon Sep 17 00:00:00 2001 From: Bryan Mwangi <62949543+BryanMwangi@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:05:01 +0100 Subject: [PATCH 0929/1766] Added Go Pine framework (#9358) --- frameworks/Go/pine/README.md | 11 ++++++++++ frameworks/Go/pine/benchmark_config.json | 26 ++++++++++++++++++++++ frameworks/Go/pine/pine.dockerfile | 10 +++++++++ frameworks/Go/pine/src/go.mod | 5 +++++ frameworks/Go/pine/src/go.sum | 2 ++ frameworks/Go/pine/src/main.go | 28 ++++++++++++++++++++++++ 6 files changed, 82 insertions(+) create mode 100755 frameworks/Go/pine/README.md create mode 100755 frameworks/Go/pine/benchmark_config.json create mode 100644 frameworks/Go/pine/pine.dockerfile create mode 100644 frameworks/Go/pine/src/go.mod create mode 100644 frameworks/Go/pine/src/go.sum create mode 100644 frameworks/Go/pine/src/main.go diff --git a/frameworks/Go/pine/README.md b/frameworks/Go/pine/README.md new file mode 100755 index 00000000000..1307a047c2c --- /dev/null +++ b/frameworks/Go/pine/README.md @@ -0,0 +1,11 @@ +# Pine Benchmarking Test + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Go/pine/benchmark_config.json b/frameworks/Go/pine/benchmark_config.json new file mode 100755 index 00000000000..6c605348103 --- /dev/null +++ b/frameworks/Go/pine/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "pine", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Pine", + "language": "Go", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Pine", + "notes": "", + "versus": "go" + } + } + ] +} diff --git a/frameworks/Go/pine/pine.dockerfile b/frameworks/Go/pine/pine.dockerfile new file mode 100644 index 00000000000..4517e2bd98d --- /dev/null +++ b/frameworks/Go/pine/pine.dockerfile @@ -0,0 +1,10 @@ +FROM docker.io/golang:1.23 + +COPY ./src /pine +WORKDIR /pine + +RUN go mod download + +EXPOSE 8080 + +CMD go run . diff --git a/frameworks/Go/pine/src/go.mod b/frameworks/Go/pine/src/go.mod new file mode 100644 index 00000000000..6b8dddc4972 --- /dev/null +++ b/frameworks/Go/pine/src/go.mod @@ -0,0 +1,5 @@ +module pine + +go 1.23.0 + +require github.com/BryanMwangi/pine v1.0.6 diff --git a/frameworks/Go/pine/src/go.sum b/frameworks/Go/pine/src/go.sum new file mode 100644 index 00000000000..f28dc6678fd --- /dev/null +++ b/frameworks/Go/pine/src/go.sum @@ -0,0 +1,2 @@ +github.com/BryanMwangi/pine v1.0.6 h1:35JN1FQkStoCikeVQJ2423mO5STLNEPkA/AgnjslAmg= +github.com/BryanMwangi/pine v1.0.6/go.mod h1:j6+gT+N2HeeJHc9Z60rUOnEmNC+s/Gdmh2e9oB/eScI= diff --git a/frameworks/Go/pine/src/main.go b/frameworks/Go/pine/src/main.go new file mode 100644 index 00000000000..2f263adebcc --- /dev/null +++ b/frameworks/Go/pine/src/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "log" + + "github.com/BryanMwangi/pine" +) + +func plaintextHandler(c *pine.Ctx) error { + c.Set("Server", "Pine") + return c.SendString("Hello, World!") +} + +func jsonHandler(c *pine.Ctx) error { + c.Set("Server", "Pine") + return c.JSON(map[string]string{ + "message": "Hello, World!", + }) +} + +func main() { + app := pine.New() + app.Get("/plaintext", plaintextHandler) + app.Get("/json", jsonHandler) + + // Start the server on port 3000 + log.Fatal(app.Start(":8080")) +} From c0164be4be7c5ffca6b799b81e03eff6559bbb7a Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Mon, 25 Nov 2024 09:05:09 -0800 Subject: [PATCH 0930/1766] [F#/Oxpecker] Improved "update" and "fortunes" benchmarks (#9357) --- frameworks/FSharp/oxpecker/src/App/App.fsproj | 10 ++--- frameworks/FSharp/oxpecker/src/App/Common.fs | 6 ++- frameworks/FSharp/oxpecker/src/App/Db.fs | 31 ++++++++------- frameworks/FSharp/oxpecker/src/App/Program.fs | 39 +++++++------------ .../FSharp/oxpecker/src/App/RenderHelpers.fs | 29 +++++++++----- 5 files changed, 60 insertions(+), 55 deletions(-) diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index e9aa702a5a1..48564a7779b 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -13,10 +13,10 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frameworks/FSharp/oxpecker/src/App/Common.fs b/frameworks/FSharp/oxpecker/src/App/Common.fs index 47a63e2108e..8d21c46aa64 100644 --- a/frameworks/FSharp/oxpecker/src/App/Common.fs +++ b/frameworks/FSharp/oxpecker/src/App/Common.fs @@ -9,7 +9,7 @@ module Common = [] [] type JsonMessage = { - message : string + message: string } [] @@ -26,7 +26,9 @@ module Common = } [] - let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3" + let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false" + [] + let MultiplexedConnectionString = ConnectionString + ";Max Auto Prepare=3;Multiplexing=true" let FortuneComparer = { new IComparer with diff --git a/frameworks/FSharp/oxpecker/src/App/Db.fs b/frameworks/FSharp/oxpecker/src/App/Db.fs index 2c471bada1d..65b3062a8e9 100644 --- a/frameworks/FSharp/oxpecker/src/App/Db.fs +++ b/frameworks/FSharp/oxpecker/src/App/Db.fs @@ -2,8 +2,7 @@ namespace App open System open System.Data -open System.Data.Common -open System.Text +open Microsoft.Extensions.ObjectPool open Npgsql @@ -15,6 +14,7 @@ module Db = use db = new NpgsqlConnection(ConnectionString) use cmd = db.CreateCommand(CommandText = "SELECT id, message FROM fortune") do! db.OpenAsync() + do! cmd.PrepareAsync() use! rdr = cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection) while! rdr.ReadAsync() do result.Add { id = rdr.GetInt32(0); message = rdr.GetString(1) } @@ -31,7 +31,7 @@ module Db = TypedValue = Random.Shared.Next(1, 10001) ) cmd.Parameters.Add(id) |> ignore - cmd + struct(cmd, id) let private readSingleRow (cmd: NpgsqlCommand) = task { @@ -43,41 +43,46 @@ module Db = let loadSingleRow () = task { use db = new NpgsqlConnection(ConnectionString) + let struct(cmd', _) = createReadCommand db + use cmd = cmd' do! db.OpenAsync() - use cmd = createReadCommand db + do! cmd.PrepareAsync() return! readSingleRow cmd } let private readMultipleRows (count: int) (conn: NpgsqlConnection) = let result = Array.zeroCreate count task { - use cmd = createReadCommand conn + let struct(cmd', idParam) = createReadCommand conn + use cmd = cmd' for i in 0..result.Length-1 do - cmd.Parameters["@Id"].Value <- Random.Shared.Next(1, 10001) let! row = readSingleRow cmd result[i] <- row + idParam.TypedValue <- Random.Shared.Next(1, 10001) return result } let loadMultipleRows (count: int) = task { - use db = new NpgsqlConnection(ConnectionString) + use db = new NpgsqlConnection(MultiplexedConnectionString) do! db.OpenAsync() return! readMultipleRows count db } let private maxBatch = 500 let private queries = Array.zeroCreate (maxBatch + 1) + let private stringBuilderPool = DefaultObjectPoolProvider().CreateStringBuilderPool() let private batchUpdateString batchSize = match queries[batchSize] with | null -> let lastIndex = batchSize - 1 - let sb = StringBuilder() + let sb = stringBuilderPool.Get() sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ") |> ignore for i in 0..lastIndex-1 do sb.AppendFormat("(@Id_{0}, @Rn_{0}), ", i) |> ignore sb.AppendFormat("(@Id_{0}, @Rn_{0}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id", lastIndex) |> ignore let result = sb.ToString() + stringBuilderPool.Return(sb) queries[batchSize] <- result result | q -> @@ -95,15 +100,15 @@ module Db = for i in 0..results.Length-1 do let randomNumber = Random.Shared.Next(1, 10001) let struct(rnParamName, idParamName) = paramNames[i] - let random = NpgsqlParameter(ParameterName = rnParamName, DbType = DbType.Int32, TypedValue = randomNumber) - command.Parameters.Add(random) |> ignore - let id = NpgsqlParameter(ParameterName = idParamName, DbType = DbType.Int32, TypedValue = results[i].id) - command.Parameters.Add(id) |> ignore + command.Parameters.Add(NpgsqlParameter( + ParameterName = rnParamName, DbType = DbType.Int32, TypedValue = randomNumber)) |> ignore + command.Parameters.Add(NpgsqlParameter( + ParameterName = idParamName, DbType = DbType.Int32, TypedValue = results[i].id)) |> ignore results[i] <- { results[i] with randomnumber = randomNumber } let doMultipleUpdates (count: int) = task { - use conn = new NpgsqlConnection(ConnectionString) + use conn = new NpgsqlConnection(MultiplexedConnectionString) do! conn.OpenAsync() let! results = readMultipleRows count conn use cmd = conn.CreateCommand(CommandText = batchUpdateString count) diff --git a/frameworks/FSharp/oxpecker/src/App/Program.fs b/frameworks/FSharp/oxpecker/src/App/Program.fs index 895c54c9693..ce301a87b89 100644 --- a/frameworks/FSharp/oxpecker/src/App/Program.fs +++ b/frameworks/FSharp/oxpecker/src/App/Program.fs @@ -2,13 +2,21 @@ namespace App open System open Oxpecker -open System.Runtime.InteropServices [] -module HtmlViews = +module HttpHandlers = + open System.Text + open Microsoft.AspNetCore.Http + open SpanJson open Oxpecker.ViewEngine - let private head, tail = + let private extra = + { + id = 0 + message = "Additional fortune added at request time." + } + + let private fortunesHeadAndTail = (fun (content: HtmlElement) -> html() { head() { @@ -26,32 +34,11 @@ module HtmlViews = } :> HtmlElement ) |> RenderHelpers.prerender - let fortunes (fortunesData: ResizeArray) = - let fragment = __() - for fortune in CollectionsMarshal.AsSpan fortunesData do - tr() { - td() { raw <| string fortune.id } - td() { fortune.message } - } - |> fragment.AddChild - RenderHelpers.combine head tail fragment - -[] -module HttpHandlers = - open System.Text - open Microsoft.AspNetCore.Http - open SpanJson - - let private extra = - { - id = 0 - message = "Additional fortune added at request time." - } - let rec private renderFortunes (ctx: HttpContext) (data: ResizeArray) = data.Add extra data.Sort FortuneComparer - data |> HtmlViews.fortunes |> ctx.WriteHtmlViewChunked + RenderHelpers.CombinedElement(fortunesHeadAndTail, data) + |> ctx.WriteHtmlViewChunked let fortunes : EndpointHandler = fun ctx -> diff --git a/frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs b/frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs index 003fc09d8ce..7a94b2552ba 100644 --- a/frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs +++ b/frameworks/FSharp/oxpecker/src/App/RenderHelpers.fs @@ -1,8 +1,27 @@ module RenderHelpers open System.Text + open App open Oxpecker.ViewEngine + type HeadAndTail = + { + Head: string + Tail: string + } + + [] + type CombinedElement(ht: HeadAndTail, fortunesData: ResizeArray) = + interface HtmlElement with + member this.Render(sb) = + sb.Append(ht.Head) |> ignore + for fortune in fortunesData do + (tr() { + td() { raw <| string fortune.id } + td() { fortune.message } + }).Render(sb) + sb.Append(ht.Tail) |> ignore + let prerender (view: HtmlElement -> HtmlElement) = let sb = StringBuilder() let mutable head = "" @@ -13,12 +32,4 @@ sb.Clear() |> ignore } let readyView = view fakeHole readyView.Render(sb) - (head, sb.ToString()) - - let inline combine (head: string) (tail: string) (hole: HtmlElement) = - { new HtmlElement with - member this.Render(sb) = - sb.Append(head) |> ignore - hole.Render(sb) - sb.Append(tail) |> ignore - } \ No newline at end of file + { Head = head; Tail = sb.ToString() } \ No newline at end of file From 8ce95456d2bbbb9013ad4d8890836c3fea17376c Mon Sep 17 00:00:00 2001 From: Rudi Visser Date: Mon, 2 Dec 2024 17:40:09 +0200 Subject: [PATCH 0931/1766] Csharp/Reaper - Update to .NET 9 / Latest Version (#9432) * Update reaper to latest version * Correct default log level --- frameworks/CSharp/reaper/reaper.dockerfile | 4 ++-- .../CSharp/reaper/src/Benchmark/Benchmark.csproj | 6 +++--- .../CSharp/reaper/src/Benchmark/JsonEndpoint.cs | 5 +++-- .../CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs | 5 +++-- frameworks/CSharp/reaper/src/Benchmark/Program.cs | 11 +---------- .../reaper/src/Benchmark/appsettings.Development.json | 2 +- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/frameworks/CSharp/reaper/reaper.dockerfile b/frameworks/CSharp/reaper/reaper.dockerfile index 1e8171b8dd4..7da5d03009f 100644 --- a/frameworks/CSharp/reaper/reaper.dockerfile +++ b/frameworks/CSharp/reaper/reaper.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /src COPY src . RUN apt-get update \ @@ -7,7 +7,7 @@ RUN apt-get update \ WORKDIR "/src/Benchmark" RUN dotnet publish "Benchmark.csproj" -c Release -o /app/publish -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final WORKDIR /app EXPOSE 8080 COPY --from=build /app/publish . diff --git a/frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj b/frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj index e0e1ed8ee20..b0e9fd09211 100644 --- a/frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj +++ b/frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable Linux @@ -18,8 +18,8 @@ - - + + diff --git a/frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs b/frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs index 26fba3b743f..f2ba38be4ca 100644 --- a/frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs +++ b/frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs @@ -11,9 +11,10 @@ public class JsonResponse [ReaperRoute(HttpVerbs.Get, "/json")] public class JsonEndpoint : ReaperEndpointXR { - public override Task HandleAsync() + public override Task ExecuteAsync() { Context.Response.ContentLength = 27; - return Task.FromResult(new JsonResponse { Message = "Hello, World!" }); + Result = new JsonResponse { Message = "Hello, World!" }; + return Task.CompletedTask; } } \ No newline at end of file diff --git a/frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs b/frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs index a316a55b6b4..eb88ca8bd58 100644 --- a/frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs +++ b/frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs @@ -6,11 +6,12 @@ namespace Benchmark; [ReaperRoute(HttpVerbs.Get, "/plaintext")] public class PlainTextEndpoint : ReaperEndpointXR { - public override Task HandleAsync() + public override Task ExecuteAsync() { Context.Response.StatusCode = 200; Context.Response.ContentType = "text/plain"; Context.Response.ContentLength = 13; - return Task.FromResult("Hello, World!"); + Result = "Hello, World!"; + return Task.CompletedTask; } } \ No newline at end of file diff --git a/frameworks/CSharp/reaper/src/Benchmark/Program.cs b/frameworks/CSharp/reaper/src/Benchmark/Program.cs index 7a44cf047bd..1c109c2ee8b 100644 --- a/frameworks/CSharp/reaper/src/Benchmark/Program.cs +++ b/frameworks/CSharp/reaper/src/Benchmark/Program.cs @@ -1,14 +1,8 @@ -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(); @@ -16,7 +10,4 @@ app.UseReaperMiddleware(); app.MapReaperEndpoints(); -app.Run(); - -[JsonSerializable(typeof(JsonResponse))] -internal partial class SourceGenerationContext : JsonSerializerContext { } \ No newline at end of file +app.Run(); \ No newline at end of file diff --git a/frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json b/frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json index 0c208ae9181..1b2d3bafd88 100644 --- a/frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json +++ b/frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json @@ -5,4 +5,4 @@ "Microsoft.AspNetCore": "Warning" } } -} +} \ No newline at end of file From 9d90d29dadb3380e5fdb44b94f3b338fc8e82c85 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Mon, 2 Dec 2024 16:40:18 +0100 Subject: [PATCH 0932/1766] Update Scala SNUnit (#9431) --- frameworks/Scala/snunit/build.sbt | 6 +- .../Scala/snunit/project/build.properties | 2 +- frameworks/Scala/snunit/project/plugins.sbt | 2 +- frameworks/Scala/snunit/snunit.dockerfile | 14 ++-- .../Scala/snunit/src/main/scala/Main.scala | 72 +++++++++---------- 5 files changed, 45 insertions(+), 51 deletions(-) diff --git a/frameworks/Scala/snunit/build.sbt b/frameworks/Scala/snunit/build.sbt index 5573cd526ec..e77aab72639 100644 --- a/frameworks/Scala/snunit/build.sbt +++ b/frameworks/Scala/snunit/build.sbt @@ -1,9 +1,9 @@ import scala.scalanative.build._ -scalaVersion := "2.13.10" +scalaVersion := "3.5.2" -val snunitVersion = "0.3.0" -val jsoniterScalaVersion = "2.20.6" +val snunitVersion = "0.10.2" +val jsoniterScalaVersion = "2.31.3" libraryDependencies ++= Seq( "com.github.lolgab" %%% "snunit" % snunitVersion, diff --git a/frameworks/Scala/snunit/project/build.properties b/frameworks/Scala/snunit/project/build.properties index 8b9a0b0ab03..db1723b0862 100644 --- a/frameworks/Scala/snunit/project/build.properties +++ b/frameworks/Scala/snunit/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.0 +sbt.version=1.10.5 diff --git a/frameworks/Scala/snunit/project/plugins.sbt b/frameworks/Scala/snunit/project/plugins.sbt index d1565a95c3a..2f7a1e7541a 100644 --- a/frameworks/Scala/snunit/project/plugins.sbt +++ b/frameworks/Scala/snunit/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.9") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.6") diff --git a/frameworks/Scala/snunit/snunit.dockerfile b/frameworks/Scala/snunit/snunit.dockerfile index bbadb49027e..f83e84354c2 100644 --- a/frameworks/Scala/snunit/snunit.dockerfile +++ b/frameworks/Scala/snunit/snunit.dockerfile @@ -1,12 +1,12 @@ -FROM debian:bullseye-slim as builder +FROM debian:bookworm-slim as builder RUN apt-get update && apt-get install -y curl gnupg && \ - echo "deb https://repo.scala-sbt.org/scalasbt/debian /" > /etc/apt/sources.list.d/sbt.list && \ + echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list && \ curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | apt-key add - && \ curl -sL https://nginx.org/keys/nginx_signing.key | apt-key add - && \ - echo "deb https://packages.nginx.org/unit/debian/ bullseye unit" > /etc/apt/sources.list.d/unit.list && \ - echo "deb-src https://packages.nginx.org/unit/debian/ bullseye unit" >> /etc/apt/sources.list.d/unit.list && \ - apt-get update && apt-get install -y clang unit-dev=1.29* openjdk-11-jdk sbt && \ + echo "deb https://packages.nginx.org/unit/debian/ bookworm unit" > /etc/apt/sources.list.d/unit.list && \ + echo "deb-src https://packages.nginx.org/unit/debian/ bookworm unit" >> /etc/apt/sources.list.d/unit.list && \ + apt-get update && apt-get install -y clang unit-dev=1.33* openjdk-17-jdk sbt=1.10.5 && \ apt-get purge -y gnupg WORKDIR /workdir @@ -15,9 +15,9 @@ COPY . . RUN sbt nativeLink -FROM nginx/unit:1.29.1-minimal +FROM unit:1.33.0-minimal COPY /config.sh /docker-entrypoint.d/ -COPY --from=builder /workdir/target/scala-2.13/workdir-out /app/example +COPY --from=builder /workdir/target/scala-3.5.2/workdir /app/example EXPOSE 8080 diff --git a/frameworks/Scala/snunit/src/main/scala/Main.scala b/frameworks/Scala/snunit/src/main/scala/Main.scala index a6a6c54ae00..4fe53ab5d3c 100644 --- a/frameworks/Scala/snunit/src/main/scala/Main.scala +++ b/frameworks/Scala/snunit/src/main/scala/Main.scala @@ -1,43 +1,37 @@ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ -import snunit._ +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* +import snunit.* -final case class Message(message: String) +final case class Message(message: String) derives ConfiguredJsonValueCodec -object Message { - implicit final val codec: JsonValueCodec[Message] = JsonCodecMaker.make -} +final val applicationJson = Headers("Content-Type" -> "application/json") +final val textPlain = Headers("Content-Type" -> "text/plain") -object Main { - val applicationJson = Seq("Content-Type" -> "application/json") - val textPlain = Seq("Content-Type" -> "text/plain") +inline def notFound(req: Request) = req.send( + statusCode = StatusCode.NotFound, + content = "Not found", + headers = textPlain +) - @inline - private def notFound(req: Request) = req.send( - statusCode = StatusCode.NotFound, - content = "Not found", - headers = textPlain - ) - - def main(args: Array[String]): Unit = { - SyncServerBuilder - .build(req => - if (req.method == Method.GET) { - if(req.target == "/plaintext") - req.send( - statusCode = StatusCode.OK, - content = "Hello, World!", - headers = textPlain - ) - else if(req.target == "/json") - req.send( - statusCode = StatusCode.OK, - content = writeToArray(Message("Hello, World!")), - headers = applicationJson - ) - else notFound(req) - } else notFound(req) - ) - .listen() - } -} +@main +def main = + SyncServerBuilder + .setRequestHandler(req => + if (req.method == Method.GET) { + if(req.target == "/plaintext") + req.send( + statusCode = StatusCode.OK, + content = "Hello, World!", + headers = textPlain + ) + else if(req.target == "/json") + req.send( + statusCode = StatusCode.OK, + content = writeToArray(Message("Hello, World!")), + headers = applicationJson + ) + else notFound(req) + } else notFound(req) + ) + .build() + .listen() From 400a993a2d37790618415f7f7e0451630e129089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Mon, 2 Dec 2024 16:40:30 +0100 Subject: [PATCH 0933/1766] [CSharp] Match AOT settings with JIT settings (#9430) * [CSharp] Match AOT settings with JIT settings JIT disables threadpool hillclimbing here: https://github.com/TechEmpower/FrameworkBenchmarks/blob/c0164be4be7c5ffca6b799b81e03eff6559bbb7a/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile#L10C12-L10C32. AOT uses a different mechanism. * Update Platform.csproj --- frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj index ef14e44b865..fa716bda4c7 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj +++ b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj @@ -28,5 +28,8 @@ $(MSBuildThisFileDirectory)Templates/**;$(DefaultItemExcludes) + + + From a4126447337313991356557e663e630fc3ff2b0c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 2 Dec 2024 16:40:41 +0100 Subject: [PATCH 0934/1766] [rails] Make sure redis has started before starting app server (#9429) If redis hasn't completed starting, Rails won't be able to connect to it. --- frameworks/Ruby/rails/rails-agoo.dockerfile | 4 ++-- frameworks/Ruby/rails/rails-falcon.dockerfile | 4 ++-- frameworks/Ruby/rails/rails-mysql.dockerfile | 4 ++-- frameworks/Ruby/rails/rails.dockerfile | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/rails/rails-agoo.dockerfile b/frameworks/Ruby/rails/rails-agoo.dockerfile index 3eb3c4afbbe..507077565bb 100644 --- a/frameworks/Ruby/rails/rails-agoo.dockerfile +++ b/frameworks/Ruby/rails/rails-agoo.dockerfile @@ -23,5 +23,5 @@ COPY . /rails/ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 -CMD service redis-server start -CMD RACK_ENV=production bundle exec rackup -r agoo -s agoo -p 8080 -q -O workers=$(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) +CMD service redis-server start && \ + RACK_ENV=production bundle exec rackup -r agoo -s agoo -p 8080 -q -O workers=$(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) diff --git a/frameworks/Ruby/rails/rails-falcon.dockerfile b/frameworks/Ruby/rails/rails-falcon.dockerfile index c2aeaa32997..2e0c659e34b 100644 --- a/frameworks/Ruby/rails/rails-falcon.dockerfile +++ b/frameworks/Ruby/rails/rails-falcon.dockerfile @@ -23,5 +23,5 @@ COPY . /rails/ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 -CMD service redis-server start -CMD bundle exec falcon host +CMD service redis-server start && \ + bundle exec falcon host diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index 877a1e67fb5..9e7083a1f4d 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -23,5 +23,5 @@ COPY . /rails/ ENV RAILS_ENV=production_mysql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 -CMD service redis-server start -CMD rails server +CMD service redis-server start && \ + rails server diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 0d168f735f0..451a4e5bfac 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -23,5 +23,5 @@ COPY . /rails/ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 -CMD service redis-server start -CMD rails server +CMD service redis-server start && \ + rails server From dae5a7965769a6f2c9e49f93412a4f83956b1ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 2 Dec 2024 16:40:52 +0100 Subject: [PATCH 0935/1766] [spring] Bring back the connection pool size to 256 (#9427) Due to some performance regressions detected on the continuous benchmarking results. --- .../Java/spring-webflux/src/main/resources/application.yml | 2 +- frameworks/Java/spring/src/main/resources/application.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/spring-webflux/src/main/resources/application.yml b/frameworks/Java/spring-webflux/src/main/resources/application.yml index 27d2309566f..45ca20c7d80 100755 --- a/frameworks/Java/spring-webflux/src/main/resources/application.yml +++ b/frameworks/Java/spring-webflux/src/main/resources/application.yml @@ -17,7 +17,7 @@ spring: password: ${database.password} url: r2dbc:postgresql://${database.host}:${database.port}/${database.name}?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable pool: - max-size: 512 + max-size: 256 --- spring: diff --git a/frameworks/Java/spring/src/main/resources/application.yml b/frameworks/Java/spring/src/main/resources/application.yml index 16a76fe321a..efde83cda61 100644 --- a/frameworks/Java/spring/src/main/resources/application.yml +++ b/frameworks/Java/spring/src/main/resources/application.yml @@ -15,7 +15,7 @@ spring: username: ${database.username} password: ${database.password} hikari: - maximum-pool-size: 512 + maximum-pool-size: 256 database: name: hello_world host: tfb-database From 7b79969fd59f6dc570c659c901bce99838f52795 Mon Sep 17 00:00:00 2001 From: Kayden <143221653+Kayden1412@users.noreply.github.com> Date: Mon, 2 Dec 2024 22:41:33 +0700 Subject: [PATCH 0936/1766] improvement (#9407) --- frameworks/Zig/httpz/.gitignore | 4 +-- frameworks/Zig/httpz/build.zig | 25 ----------------- frameworks/Zig/httpz/src/endpoints.zig | 37 ++++++++++---------------- frameworks/Zig/httpz/src/main.zig | 26 +++++++++--------- 4 files changed, 29 insertions(+), 63 deletions(-) diff --git a/frameworks/Zig/httpz/.gitignore b/frameworks/Zig/httpz/.gitignore index 170dc0f1403..d8c8979f82c 100644 --- a/frameworks/Zig/httpz/.gitignore +++ b/frameworks/Zig/httpz/.gitignore @@ -1,2 +1,2 @@ -zig-cache/**/*', -zig-out: 'zig-out/**/*', +.zig-cache +zig-out diff --git a/frameworks/Zig/httpz/build.zig b/frameworks/Zig/httpz/build.zig index 5978de7c6aa..510dfbecfa2 100644 --- a/frameworks/Zig/httpz/build.zig +++ b/frameworks/Zig/httpz/build.zig @@ -1,48 +1,23 @@ const std = @import("std"); -const ModuleMap = std.StringArrayHashMap(*std.Build.Module); -var gpa = std.heap.GeneralPurposeAllocator(.{}){}; -const allocator = gpa.allocator(); -// 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 dep_opts = .{ .target = target, .optimize = optimize }; const exe = b.addExecutable(.{ .name = "httpz", - // 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 = b.path("src/main.zig"), .target = target, .optimize = optimize, }); - var modules = ModuleMap.init(allocator); - defer modules.deinit(); - const httpz_module = b.dependency("httpz", dep_opts).module("httpz"); const pg_module = b.dependency("pg", dep_opts).module("pg"); const datetimez_module = b.dependency("datetimez", dep_opts).module("zig-datetime"); const mustache_module = b.dependency("mustache", dep_opts).module("mustache"); - try modules.put("httpz", httpz_module); - try modules.put("pg", pg_module); - try modules.put("datetimez", datetimez_module); - try modules.put("mustache", mustache_module); - - // // Expose this as a module that others can import exe.root_module.addImport("httpz", httpz_module); exe.root_module.addImport("pg", pg_module); exe.root_module.addImport("datetimez", datetimez_module); diff --git a/frameworks/Zig/httpz/src/endpoints.zig b/frameworks/Zig/httpz/src/endpoints.zig index 0ee22b274de..97d18c822be 100644 --- a/frameworks/Zig/httpz/src/endpoints.zig +++ b/frameworks/Zig/httpz/src/endpoints.zig @@ -4,7 +4,6 @@ const pg = @import("pg"); const datetimez = @import("datetimez"); const mustache = @import("mustache"); -const Allocator = std.mem.Allocator; const Thread = std.Thread; const Mutex = Thread.Mutex; const template = "Fortunes{{#fortunes}}{{/fortunes}}
      idmessage
      {{id}}{{message}}
      "; @@ -12,14 +11,9 @@ const template = "Fortunes Date: Mon, 2 Dec 2024 16:41:41 +0100 Subject: [PATCH 0937/1766] [ruby/rack] Use regular json serializer (#9394) The regular json serializer should be about as fast as OJ, after some recent performance improvements: https://github.com/ruby/json/blob/master/CHANGES.md --- frameworks/Ruby/rack-sequel/Gemfile | 20 ++-- frameworks/Ruby/rack-sequel/hello_world.rb | 3 - .../rack-sequel-passenger-mri.dockerfile | 1 + ...k-sequel-postgres-passenger-mri.dockerfile | 1 + ...ack-sequel-postgres-unicorn-mri.dockerfile | 1 + .../rack-sequel-postgres.dockerfile | 1 + .../rack-sequel-unicorn-mri.dockerfile | 1 + .../Ruby/rack-sequel/rack-sequel.dockerfile | 1 + frameworks/Ruby/rack/Gemfile | 3 +- frameworks/Ruby/rack/Gemfile.lock | 98 +++++++++---------- frameworks/Ruby/rack/hello_world.rb | 4 +- 11 files changed, 71 insertions(+), 63 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 12b60ef57cf..d427bd4ef4e 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -1,13 +1,8 @@ source 'https://rubygems.org' -gem 'base64' # required by passenger on Ruby 3.4 -gem 'json', '~> 2.0' -gem 'oj', '~> 3.14', platforms: %i[ruby mswin] -gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false -gem 'puma', '~> 6.4', require: false +gem 'json', '~> 2.8' gem 'sequel', '~> 5.0' gem 'rack', '~> 3.0' -gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false group :mysql do gem 'jdbc-mysql', '~> 5.1', platforms: :jruby, require: 'jdbc/mysql' @@ -19,3 +14,16 @@ group :postgresql do gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false end + +group :passenger do + gem 'base64' # required by passenger on Ruby 3.4 + gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false +end + +group :puma do + gem 'puma', '~> 6.4', require: false +end + +group :unicorn do + gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false +end diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 6fc3a787975..dbda8902f90 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -1,8 +1,5 @@ # frozen_string_literal: true -require 'oj' -Oj.mimic_JSON - # Our Rack application to be executed by rackup class HelloWorld DEFAULT_HEADERS = {}.tap do |h| diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index c0de276d2ce..d451ea776d6 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN bundle config set without 'postgresql puma unicorn' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 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 0346a44eb1b..c201cad91e1 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN bundle config set without 'mysql puma unicorn' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 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 37ce2662e7b..35cc8145a10 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN bundle config set without 'mysql passenger puma' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index 37634239c37..f0ab2e5981b 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN bundle config set without 'mysql passenger unicorn' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile index 67ef3768e71..f8385fbb8df 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN bundle config set without 'postgresql passenger puma' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index 2c7ee155a56..b83995deda1 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN bundle config set without 'postgresql passenger unicorn' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index ab7f29130b7..5b34822d7e0 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -5,8 +5,7 @@ source 'https://rubygems.org' gem 'rack', '~> 3.0' gem 'connection_pool', '~> 2.4' 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 'json', '~> 2.8' gem 'pg', '~> 1.5', platforms: %i[ruby mswin] gem 'sequel' gem 'sequel_pg', platforms: %i[ruby mswin] diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index e64bca08304..b3ef3cbda2d 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -2,119 +2,120 @@ GEM remote: https://rubygems.org/ specs: ast (2.4.2) - async (2.12.1) - console (~> 1.25, >= 1.25.2) + async (2.20.0) + console (~> 1.29) fiber-annotation io-event (~> 1.6, >= 1.6.5) - async-container (0.18.2) + async-container (0.18.3) async (~> 2.10) - async-http (0.69.0) + async-http (0.83.1) async (>= 2.10.2) - async-pool (~> 0.7) - io-endpoint (~> 0.11) - io-stream (~> 0.4) - protocol-http (~> 0.26) - protocol-http1 (~> 0.19) - protocol-http2 (~> 0.18) - traces (>= 0.10) - async-http-cache (0.4.3) + async-pool (~> 0.9) + io-endpoint (~> 0.14) + io-stream (~> 0.6) + metrics (~> 0.12) + protocol-http (~> 0.43) + protocol-http1 (>= 0.28.1) + protocol-http2 (~> 0.19) + traces (~> 0.10) + async-http-cache (0.4.4) async-http (~> 0.56) - async-pool (0.7.0) + async-pool (0.10.1) async (>= 1.25) + traces async-service (0.12.0) async async-container (~> 0.16) bigdecimal (3.1.8) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) - console (1.25.2) + console (1.29.0) fiber-annotation fiber-local (~> 1.1) json - falcon (0.47.7) + falcon (0.48.3) async async-container (~> 0.18) - async-http (~> 0.66, >= 0.66.3) - async-http-cache (~> 0.4.0) + async-http (~> 0.75) + async-http-cache (~> 0.4) async-service (~> 0.10) bundler localhost (~> 1.1) openssl (~> 3.0) - process-metrics (~> 0.2.0) - protocol-rack (~> 0.5) + process-metrics (~> 0.2) + protocol-http (~> 0.31) + protocol-rack (~> 0.7) samovar (~> 2.3) fiber-annotation (0.2.0) fiber-local (1.1.0) fiber-storage - fiber-storage (0.1.2) - io-endpoint (0.11.0) - io-event (1.6.5) - io-stream (0.4.0) + fiber-storage (1.0.0) + io-endpoint (0.14.0) + io-event (1.7.3) + io-stream (0.6.1) json (2.8.2) kgio (2.11.4) language_server-protocol (3.17.0.3) localhost (1.3.1) mapping (1.1.1) + metrics (0.12.1) nio4r (2.7.4) - oj (3.16.4) - bigdecimal (>= 3.0) openssl (3.2.0) - parallel (1.25.1) - parser (3.3.3.0) + parallel (1.26.3) + parser (3.3.6.0) ast (~> 2.4.1) racc - pg (1.5.6) - process-metrics (0.2.1) + pg (1.5.9) + process-metrics (0.3.0) console (~> 1.8) + json (~> 2) samovar (~> 2.1) - protocol-hpack (1.4.3) - protocol-http (0.26.6) - protocol-http1 (0.19.1) + protocol-hpack (1.5.1) + protocol-http (0.43.0) + protocol-http1 (0.28.1) protocol-http (~> 0.22) - protocol-http2 (0.18.0) + protocol-http2 (0.20.0) protocol-hpack (~> 1.4) protocol-http (~> 0.18) - protocol-rack (0.6.0) - protocol-http (~> 0.23) + protocol-rack (0.11.0) + protocol-http (~> 0.43) rack (>= 1.0) puma (6.5.0) nio4r (~> 2.0) - racc (1.8.0) - rack (3.1.6) + racc (1.8.1) + rack (3.1.8) rack-test (2.1.0) rack (>= 1.3) rainbow (3.1.1) raindrops (0.20.1) regexp_parser (2.9.2) - rexml (3.3.9) - rubocop (1.64.1) + rubocop (1.68.0) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.31.1, < 2.0) + regexp_parser (>= 2.4, < 3.0) + rubocop-ast (>= 1.32.2, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.3) + rubocop-ast (1.35.0) parser (>= 3.3.1.0) ruby-progressbar (1.13.0) samovar (2.3.0) console (~> 1.0) mapping (~> 1.0) - sequel (5.82.0) + sequel (5.86.0) bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) - traces (0.11.1) + traces (0.14.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2023.3) tzinfo (>= 1.0.0) - unicode-display_width (2.5.0) + unicode-display_width (2.6.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) @@ -127,8 +128,7 @@ DEPENDENCIES connection_pool (~> 2.4) falcon (~> 0.47) jdbc-postgres (~> 42.2) - json (~> 2.6) - oj (~> 3.14) + json (~> 2.8) pg (~> 1.5) puma (~> 6.4) rack (~> 3.0) diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index 050b6eac801..f2884f3ad1b 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -5,13 +5,11 @@ require_relative 'pg_db' require_relative 'config/auto_tune' require 'rack' +require 'json' if RUBY_PLATFORM == 'java' - require 'json' DEFAULT_DATABASE_URL = 'jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass' else - require 'oj' - Oj.mimic_JSON DEFAULT_DATABASE_URL = 'postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass' end From 553c6991435eedb127fc53cddf08a6405524c74a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 22:07:30 +0000 Subject: [PATCH 0938/1766] Bump rails-html-sanitizer from 1.6.0 to 1.6.1 in /frameworks/Ruby/rails Bumps [rails-html-sanitizer](https://github.com/rails/rails-html-sanitizer) from 1.6.0 to 1.6.1. - [Release notes](https://github.com/rails/rails-html-sanitizer/releases) - [Changelog](https://github.com/rails/rails-html-sanitizer/blob/main/CHANGELOG.md) - [Commits](https://github.com/rails/rails-html-sanitizer/compare/v1.6.0...v1.6.1) --- updated-dependencies: - dependency-name: rails-html-sanitizer dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 1c9ebb93a72..2d348650520 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -140,7 +140,7 @@ GEM json (2.8.1) localhost (1.3.1) logger (1.6.1) - loofah (2.22.0) + loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -152,7 +152,7 @@ GEM marcel (1.0.4) metrics (0.12.0) mini_mime (1.1.5) - mini_portile2 (2.8.7) + mini_portile2 (2.8.8) minitest (5.25.1) net-imap (0.4.17) date @@ -164,12 +164,12 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.4) - nokogiri (1.16.7) + nokogiri (1.16.8) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.7-arm64-darwin) + nokogiri (1.16.8-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.7-x86_64-linux) + nokogiri (1.16.8-x86_64-linux) racc (~> 1.4) openssl (3.2.0) pg (1.5.8) @@ -218,9 +218,9 @@ GEM activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.0) + rails-html-sanitizer (1.6.1) loofah (~> 2.21) - nokogiri (~> 1.14) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) railties (7.2.1.1) actionpack (= 7.2.1.1) activesupport (= 7.2.1.1) From 119778160327cea305a2c9f1ceafb44b0c110d20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 01:24:45 +0000 Subject: [PATCH 0939/1766] Bump mongoose from 5.13.20 to 8.8.3 in /frameworks/JavaScript/hapi Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.13.20 to 8.8.3. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/5.13.20...8.8.3) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/hapi/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/hapi/package.json b/frameworks/JavaScript/hapi/package.json index 6a6c23a897b..d38a23b49c9 100644 --- a/frameworks/JavaScript/hapi/package.json +++ b/frameworks/JavaScript/hapi/package.json @@ -8,7 +8,7 @@ "async": "2.1.5", "bluebird": "3.4.7", "handlebars": "4.3.0", - "mongoose": "5.13.20", + "mongoose": "8.8.3", "mysql": "2.16.0", "mysql2": "3.9.8", "pg": "8.5.1", From b68eb97afcfd8ac985aa745d580e04998c6afc53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 01:32:25 +0000 Subject: [PATCH 0940/1766] Bump mongoose from 8.3.2 to 8.8.3 in /frameworks/JavaScript/express Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.3.2 to 8.8.3. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/8.3.2...8.8.3) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 09723c74dd8..5655ae91033 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -7,7 +7,7 @@ "dateformat": "3.0.3", "escape-html": "1.0.3", "express": "4.18.2", - "mongoose": "8.3.2", + "mongoose": "8.8.3", "mysql2": "3.9.8", "pg": "8.5.0", "pg-promise": "10.7.3", From 13476012724f8f98ad2b8b8d2630fb6d8b29b156 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sat, 7 Dec 2024 13:41:34 +0800 Subject: [PATCH 0941/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 2 +- .../java/org/smartboot/http/Bootstrap.java | 4 +-- .../java/org/smartboot/servlet/Bootstrap.java | 29 +++---------------- 3 files changed, 6 insertions(+), 29 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 39a47cc3c1e..1ea12004111 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.3 + 2.4 5.0.0 0.9.23
      diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 06753113440..74ec542ae44 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -53,9 +53,7 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio .threadNum(cpuNum) .headerLimiter(0) .readBufferSize(1024 * 4) - .writeBufferSize(1024 * 4) - .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum); + .writeBufferSize(1024 * 4); bootstrap.httpHandler(routeHandle).setPort(8080).start(); } 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 f4458e0a6e6..7130017de5b 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 @@ -1,17 +1,11 @@ package org.smartboot.servlet; -import org.smartboot.http.server.HttpBootstrap; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; import tech.smartboot.servlet.Container; import tech.smartboot.servlet.ServletContextRuntime; import tech.smartboot.servlet.conf.ServletInfo; import tech.smartboot.servlet.conf.ServletMappingInfo; -import java.util.concurrent.CompletableFuture; - /** * @author 三刀(zhengjunweimail@163.com) * @version V1.0 , 2020/12/22 @@ -38,26 +32,11 @@ public static void main(String[] args) throws Throwable { applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(jsonServletInfo.getServletName(), "/json")); containerRuntime.addRuntime(applicationRuntime); - int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - HttpBootstrap bootstrap = new HttpBootstrap(); - bootstrap.configuration() - .threadNum(cpuNum) - .bannerEnabled(false) - .headerLimiter(0) - .readBufferSize(1024 * 4) - .writeBufferSize(1024 * 4) - .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum); - containerRuntime.start(bootstrap.configuration()); - bootstrap.setPort(8080) - .httpHandler(new HttpServerHandler() { - @Override - public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws Throwable { - containerRuntime.doHandle(request, response, completableFuture); - } - }) - .start(); + containerRuntime.getConfiguration() + .setThreadNum(cpuNum) + .setReadBufferSize(1024 * 4); + containerRuntime.start(); } } From 6794849a7c224bc8bd97e12a58aa2de1180c6dec Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sat, 7 Dec 2024 13:49:55 +0800 Subject: [PATCH 0942/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java/smart-socket/benchmark_config.json | 3 -- .../java/org/smartboot/http/Bootstrap.java | 37 +++++++------------ 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/frameworks/Java/smart-socket/benchmark_config.json b/frameworks/Java/smart-socket/benchmark_config.json index f69d7a43eb7..7a26d71ed56 100755 --- a/frameworks/Java/smart-socket/benchmark_config.json +++ b/frameworks/Java/smart-socket/benchmark_config.json @@ -5,9 +5,6 @@ "default": { "json_url": "/json", "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", "classification": "Platform", diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 74ec542ae44..9dda965e0be 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -18,34 +18,11 @@ import org.smartboot.http.server.handler.HttpRouteHandler; import javax.sql.DataSource; -import java.io.IOException; public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); public static void main(String[] args) { - HttpRouteHandler routeHandle = new HttpRouteHandler(); - routeHandle - .route("/plaintext", new HttpServerHandler() { - - - @Override - public void handle(HttpRequest request, HttpResponse response) throws IOException { - response.setContentLength(body.length); - response.setContentType("text/plain; charset=UTF-8"); - response.write(body); - } - }) - .route("/json", new HttpServerHandler() { - - @Override - public void handle(HttpRequest request, HttpResponse response) throws IOException { - - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); - } - }); - initDB(routeHandle); int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); @@ -54,7 +31,19 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4); - bootstrap.httpHandler(routeHandle).setPort(8080).start(); + bootstrap.httpHandler(new HttpServerHandler() { + @Override + public void handle(HttpRequest request, HttpResponse response) throws Throwable { + if ("/plaintext".equals(request.getRequestURI())) { + response.setContentLength(body.length); + response.setContentType("text/plain; charset=UTF-8"); + response.write(body); + } else if ("/json".equals(request.getRequestURI())) { + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); + } + } + }).setPort(8080).start(); } private static void initDB(HttpRouteHandler routeHandle) { From dde7fce23d1d0955a9d056dfb9ffa3b61f69cd53 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sat, 7 Dec 2024 14:02:40 +0800 Subject: [PATCH 0943/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/smartboot/servlet/Bootstrap.java | 2 + .../resources/smart-servlet/License.shield | Bin 0 -> 967 bytes .../resources/smart-servlet/smart-servlet.pem | 55 ++++++++++++++++++ .../smart-servlet/smart-servlet.properties | 15 +++++ 4 files changed, 72 insertions(+) create mode 100644 frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield create mode 100644 frameworks/Java/smart-socket/src/main/resources/smart-servlet/smart-servlet.pem create mode 100644 frameworks/Java/smart-socket/src/main/resources/smart-servlet/smart-servlet.properties 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 7130017de5b..96c3bf7ed10 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 @@ -13,6 +13,7 @@ public class Bootstrap { public static void main(String[] args) throws Throwable { + System.setProperty("smart-servlet-spring-boot-starter","true"); Container containerRuntime = new Container(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); @@ -37,6 +38,7 @@ public static void main(String[] args) throws Throwable { containerRuntime.getConfiguration() .setThreadNum(cpuNum) .setReadBufferSize(1024 * 4); + containerRuntime.initialize(); containerRuntime.start(); } } diff --git a/frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield b/frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield new file mode 100644 index 0000000000000000000000000000000000000000..f970f023915e0e46165f8a833528edbaedc9f2d4 GIT binary patch literal 967 zcmV;&133J1ZDDeBEo^CHWo~n20004vtF8&P0004%2!md50000WF=aM2W;kOxWimKo zWil`{W@Ip8W@Tk!G-5DhIA$<30001@FoB;i4F(A+hDe6@4FLfG1potqjQ}u#i2{Lv z0Im+;3edJ8Payh|6C%}?uc~+yP(n}f0096101tC*VRCe0Z*O$vo1*EMp8x;= z7kX%AZf9zBZg*vAZDDC_KruEmE@N+P0000UfTfKld*FI7uZ*^!beU~viOp#F^)n091{Eq+b7g1Tcj5w;p!QXn>kqFT(a%=l%iUH< z-UGd($|u}tG!4X_i`wxf`Z8wAz#=DD`HJR#mKMTNz=_x>Unm9);v<|-Jvd!kc_et zxhF9nDJZ)ER5p;cD;yb(D(_Jg(&&_h@QxY@ECj0`t{qNQ$l#fwylYq<{8<=;`_bSm zj})_cAKPnFAEf;AS5PPb00000000btoj|#S?KXUr-WMN%kFQt;cp%9wwr3mz=;bU3 zK~r;Ov#R+3Is9T}Iv;Iuo$I$~4Kdk5Wj!O8$k8L{sKghuaV~Hiv{~Y;mtIg3w`UxU ztnkvE*UES*O=TWr?+`MXcgt{fkCr)O8DVX^RU-`em!x*IX%11FZm!6@@z`2x00000 z0000GfM)Uhl>BQ>;V!(IYdBCHp;M-2zY63MGj+BrE+@#wwX8>441_E$K;mOrme0F{ z`@k;AVA+S`YaTLoyz0(zMTA&kX5grbR_gHjb)Tjq-0YW*=$L1(v>Lb*d!0 Date: Sat, 7 Dec 2024 14:22:46 +0800 Subject: [PATCH 0944/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 1ea12004111..a4107b3d3e8 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.4 + 2.5 5.0.0 0.9.23 From 050644450545da7b7dd174a0a6c488421cf81d7a Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sat, 7 Dec 2024 14:30:22 +0800 Subject: [PATCH 0945/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/smartboot/servlet/Bootstrap.java | 1 + 1 file changed, 1 insertion(+) 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 96c3bf7ed10..f3caa038cbe 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 @@ -40,5 +40,6 @@ public static void main(String[] args) throws Throwable { .setReadBufferSize(1024 * 4); containerRuntime.initialize(); containerRuntime.start(); + } } From cbc6db646c11589c6a2640a60e49e73b4f75765d Mon Sep 17 00:00:00 2001 From: Kyle L Date: Mon, 9 Dec 2024 10:55:52 -0500 Subject: [PATCH 0946/1766] [C++/poco] Upgrade to Latest Version and Increase Max Connections (#9433) * Upgrade docker image, g++ version, c++ standard, and poco version. * Increasing max connections, thread priority, and disabling blocking. * Adding README file. --- frameworks/C++/poco/README.md | 15 +++++++++++++++ frameworks/C++/poco/benchmark.cpp | 11 ++++++++++- frameworks/C++/poco/poco.dockerfile | 12 ++++++------ 3 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 frameworks/C++/poco/README.md diff --git a/frameworks/C++/poco/README.md b/frameworks/C++/poco/README.md new file mode 100644 index 00000000000..54086c5e482 --- /dev/null +++ b/frameworks/C++/poco/README.md @@ -0,0 +1,15 @@ +# POCO C++ Libraries Benchmarking Test + +- [POCO Github Repository](https://github.com/pocoproject/poco) +- [POCO Website](https://pocoproject.org/) + +## Software Versions + +- [buildpack-deps noble](https://hub.docker.com/_/buildpack-deps) +- [g++ 14](https://gcc.gnu.org/gcc-14/) +- [c++17](https://en.cppreference.com/w/cpp/17) +- [POCO 1.13.1](https://pocoproject.org/releases/poco-1.13.1/poco-1.13.1-all.zip) + +## Test URLs + +- `PLAINTEXT` - [http://127.0.0.1:8080/plaintext](http://127.0.0.1:8080/plaintext) diff --git a/frameworks/C++/poco/benchmark.cpp b/frameworks/C++/poco/benchmark.cpp index 4032a08f9f5..9277b02b4d1 100644 --- a/frameworks/C++/poco/benchmark.cpp +++ b/frameworks/C++/poco/benchmark.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include @@ -15,7 +17,9 @@ #define PLAIN_CONTENT_TYPE "text/plain" #define RES_BODY "Hello, World!" #define SERVER_NAME "poco" +#define MAX_CONNECTIONS 16384 +using namespace Poco; using namespace Poco::Net; using namespace Poco::Util; using namespace std; @@ -58,7 +62,12 @@ class MyServerApp : public ServerApplication { HTTPServerParams* hsp = new HTTPServerParams; hsp->setMaxThreads(stoi(args[1])); hsp->setKeepAlive(true); - HTTPServer s(new MyRequestHandlerFactory, ServerSocket(stoi(args[0]), 4000), hsp); + hsp->setMaxKeepAliveRequests(MAX_CONNECTIONS); + hsp->setMaxQueued(MAX_CONNECTIONS); + hsp->setThreadPriority(Thread::PRIO_HIGHEST); + ServerSocket socket(stoi(args[0]), MAX_CONNECTIONS); + socket.setBlocking(false); + HTTPServer s(new MyRequestHandlerFactory, socket, hsp); s.start(); waitForTerminationRequest(); s.stop(); diff --git a/frameworks/C++/poco/poco.dockerfile b/frameworks/C++/poco/poco.dockerfile index 1f592e48872..53aef0a5650 100644 --- a/frameworks/C++/poco/poco.dockerfile +++ b/frameworks/C++/poco/poco.dockerfile @@ -1,11 +1,11 @@ -FROM buildpack-deps:xenial +FROM buildpack-deps:noble RUN apt-get update -yqq && apt-get install -yqq software-properties-common unzip cmake -RUN apt-get install -yqq g++-4.8 libjson0-dev -RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 +RUN apt-get install -yqq g++-14 +RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-14 50 -ENV POCO_VERSION 1.6.1 +ENV POCO_VERSION 1.13.3 ENV POCO_HOME /poco WORKDIR ${POCO_HOME} @@ -20,10 +20,10 @@ ENV LD_LIBRARY_PATH ${POCO_HOME}/lib/Linux/x86_64 COPY benchmark.cpp benchmark.cpp -RUN g++-4.8 \ +RUN g++-14 \ -O3 \ -DNDEBUG \ - -std=c++0x \ + -std=c++17 \ -o \ poco \ benchmark.cpp \ From b747ccf5a93b67d3bf818aa5b85c955205140cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=B0=8F=E9=A9=AC?= <1417262058@qq.com> Date: Mon, 9 Dec 2024 23:57:14 +0800 Subject: [PATCH 0947/1766] [java] Update hserver and hserver-business version (#9451) 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 * Update pom.xml * Update StartApp.java * 1 * 1 * 1 * update jdk version * update version * update version * update version * Update app.properties * Update config.toml * Update benchmark_config.json * Update benchmark_config.json * Update config.toml * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * update version * add hserver-business test * [java] Update hserver and hserver-business version * [java] Update hserver and hserver-business version --------- Co-authored-by: 黑小马 --- frameworks/Java/hserver-business/README.md | 2 +- .../Java/hserver-business/benchmark_config.json | 10 +++++----- frameworks/Java/hserver-business/config.toml | 6 +++--- .../hserver-business/hserver-business.dockerfile | 14 ++++++++++++++ .../Java/hserver-business/hserver.dockerfile | 13 ------------- frameworks/Java/hserver-business/pom.xml | 4 ++-- frameworks/Java/hserver/hserver.dockerfile | 6 +++--- frameworks/Java/hserver/pom.xml | 2 +- .../test/hserver/controller/TestController.java | 7 +++++++ 9 files changed, 36 insertions(+), 28 deletions(-) create mode 100644 frameworks/Java/hserver-business/hserver-business.dockerfile delete mode 100644 frameworks/Java/hserver-business/hserver.dockerfile diff --git a/frameworks/Java/hserver-business/README.md b/frameworks/Java/hserver-business/README.md index e7b3ed7ff3f..4e033e0d570 100644 --- a/frameworks/Java/hserver-business/README.md +++ b/frameworks/Java/hserver-business/README.md @@ -1,4 +1,4 @@ -# HServer Benchmarking Test +# hserver-business Benchmarking Test This is the HServer portion of a [benchmarking test suite](../) comparing a variety of web development platforms. ### Tests diff --git a/frameworks/Java/hserver-business/benchmark_config.json b/frameworks/Java/hserver-business/benchmark_config.json index 3ddb2633a15..bd9e4a47600 100644 --- a/frameworks/Java/hserver-business/benchmark_config.json +++ b/frameworks/Java/hserver-business/benchmark_config.json @@ -1,6 +1,6 @@ { - "framework": "hserver", + "framework": "hserver-business", "tests": [ { "default": { @@ -14,17 +14,17 @@ "approach": "Realistic", "classification": "Fullstack", "database": "Postgres", - "framework": "hserver", + "framework": "hserver-business", "language": "Java", "flavor": "None", "orm": "Full", - "platform": "hserver", - "webserver": "hserver", + "platform": "hserver-business", + "webserver": "hserver-business", "os": "Linux", "database_os": "Linux", "display_name": "hserver-business", "notes": "", - "versus": "hserver" + "versus": "hserver-business" } } ] diff --git a/frameworks/Java/hserver-business/config.toml b/frameworks/Java/hserver-business/config.toml index 73c489afa9e..ef213a045ff 100644 --- a/frameworks/Java/hserver-business/config.toml +++ b/frameworks/Java/hserver-business/config.toml @@ -12,6 +12,6 @@ approach = "Realistic" classification = "Fullstack" os = "Linux" orm = "Full" -platform = "hserver" -webserver = "hserver" -versus = "hserver" +platform = "hserver-business" +webserver = "hserver-business" +versus = "hserver-business" diff --git a/frameworks/Java/hserver-business/hserver-business.dockerfile b/frameworks/Java/hserver-business/hserver-business.dockerfile new file mode 100644 index 00000000000..da3207049f6 --- /dev/null +++ b/frameworks/Java/hserver-business/hserver-business.dockerfile @@ -0,0 +1,14 @@ +FROM maven:3.6.1-jdk-11-slim as maven +WORKDIR /hserver-business +COPY pom.xml pom.xml +COPY src src +RUN mvn package + +FROM openjdk:11.0.3-jdk-slim +WORKDIR /hserver-business +COPY --from=maven /hserver-business/target/hserver-business-1.0.jar app.jar + +EXPOSE 8888 + +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.iouring.iosqeAsyncThreshold=32000", "-jar", "app.jar"] + diff --git a/frameworks/Java/hserver-business/hserver.dockerfile b/frameworks/Java/hserver-business/hserver.dockerfile deleted file mode 100644 index 372cd10a98d..00000000000 --- a/frameworks/Java/hserver-business/hserver.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM maven:3.8.4-openjdk-17-slim as maven -WORKDIR /hserver -COPY pom.xml pom.xml -COPY src src -RUN mvn package - -FROM openjdk:17.0.2 -WORKDIR /hserver -COPY --from=maven /hserver/target/hserver-1.0.jar app.jar - -EXPOSE 8888 - -CMD ["java", "-jar", "app.jar"] diff --git a/frameworks/Java/hserver-business/pom.xml b/frameworks/Java/hserver-business/pom.xml index 70d6e1b0c12..2d72e90fb48 100644 --- a/frameworks/Java/hserver-business/pom.xml +++ b/frameworks/Java/hserver-business/pom.xml @@ -5,13 +5,13 @@ 4.0.0 com.test.hserver - hserver + hserver-business 1.0 hserver-parent cn.hserver - 3.6.0 + 3.6.M3 UTF-8 diff --git a/frameworks/Java/hserver/hserver.dockerfile b/frameworks/Java/hserver/hserver.dockerfile index 372cd10a98d..4f9bb7649b9 100644 --- a/frameworks/Java/hserver/hserver.dockerfile +++ b/frameworks/Java/hserver/hserver.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.8.4-openjdk-17-slim as maven +FROM maven:3.6.1-jdk-11-slim as maven WORKDIR /hserver COPY pom.xml pom.xml COPY src src RUN mvn package -FROM openjdk:17.0.2 +FROM openjdk:11.0.3-jdk-slim WORKDIR /hserver COPY --from=maven /hserver/target/hserver-1.0.jar app.jar EXPOSE 8888 -CMD ["java", "-jar", "app.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.iouring.iosqeAsyncThreshold=32000", "-jar", "app.jar"] diff --git a/frameworks/Java/hserver/pom.xml b/frameworks/Java/hserver/pom.xml index 70d6e1b0c12..1183e3a8567 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -11,7 +11,7 @@ hserver-parent cn.hserver - 3.6.0 + 3.6.M3 UTF-8 diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java index c4bc3b4b0fb..8055d476a55 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java @@ -33,6 +33,13 @@ public class TestController { @Autowired private DataSource dataSource; + + @GET("/jso2n") + private Message jso2n(long ud,int a,HttpResponse response) { + response.setHeader("Date", DateUtil.getTime()); + return new Message(); + } + @GET("/json") public Message json(HttpResponse response) { response.setHeader("Date", DateUtil.getTime()); From c784b9ab2f173b8782e78a404ed8c89a9d6471fd Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Mon, 9 Dec 2024 07:57:28 -0800 Subject: [PATCH 0948/1766] [F#/Oxpecker] Update to .NET 9 (#9449) * [F#/Oxpecker] Updated to .NET 9 * [F#/Oxpecker] Fixed dockerfile --- frameworks/FSharp/oxpecker/oxpecker.dockerfile | 6 ++++-- frameworks/FSharp/oxpecker/src/App/App.fsproj | 4 ++-- frameworks/FSharp/oxpecker/src/App/Db.fs | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frameworks/FSharp/oxpecker/oxpecker.dockerfile b/frameworks/FSharp/oxpecker/oxpecker.dockerfile index 4f6676892c3..6424bcad50c 100644 --- a/frameworks/FSharp/oxpecker/oxpecker.dockerfile +++ b/frameworks/FSharp/oxpecker/oxpecker.dockerfile @@ -1,11 +1,13 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime +ENV DOTNET_GCDynamicAdaptationMode=0 ENV DOTNET_ReadyToRun 0 +ENV DOTNET_HillClimbing_Disable=1 ENV ASPNETCORE_hostBuilder__reloadConfigOnChange false ENV URLS http://+:8080 diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index 48564a7779b..d54b0983e8b 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 false @@ -14,7 +14,7 @@ - + diff --git a/frameworks/FSharp/oxpecker/src/App/Db.fs b/frameworks/FSharp/oxpecker/src/App/Db.fs index 65b3062a8e9..532695a0335 100644 --- a/frameworks/FSharp/oxpecker/src/App/Db.fs +++ b/frameworks/FSharp/oxpecker/src/App/Db.fs @@ -64,7 +64,7 @@ module Db = let loadMultipleRows (count: int) = task { - use db = new NpgsqlConnection(MultiplexedConnectionString) + use db = new NpgsqlConnection(ConnectionString) do! db.OpenAsync() return! readMultipleRows count db } From 990721ff79bb4cd6afb9d2bc9e8b5d24ba216552 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 9 Dec 2024 16:57:35 +0100 Subject: [PATCH 0949/1766] [php] Flight update to PHP 8.4 (#9448) #9408 --- frameworks/PHP/flight/flight.dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/PHP/flight/flight.dockerfile b/frameworks/PHP/flight/flight.dockerfile index 07dbf7670c9..60b2b3ebc7a 100644 --- a/frameworks/PHP/flight/flight.dockerfile +++ b/frameworks/PHP/flight/flight.dockerfile @@ -1,16 +1,16 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /flight WORKDIR /flight +COPY --link . . ENV FLIGHT_DIR="/flight/src" @@ -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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /flight EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /flight/deploy/nginx.conf From cd14f4af869c222e952ecaedb2a3bb2bb5aeee77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=81=D1=82=D1=8F=20=D0=A2=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8F=D0=BA?= Date: Mon, 9 Dec 2024 17:57:48 +0200 Subject: [PATCH 0950/1766] chore: set `keepAliveTimeout = 0` and upgrade docker image to `node:20.16-slim` for express, fastify, hapi, koa, nest. (#9447) --- frameworks/JavaScript/express/app.js | 3 ++- frameworks/JavaScript/express/express-chakra.dockerfile | 2 +- frameworks/JavaScript/express/express-mongodb.dockerfile | 2 +- frameworks/JavaScript/express/express-mysql.dockerfile | 2 +- frameworks/JavaScript/express/express-postgres.dockerfile | 2 +- frameworks/JavaScript/express/express-postgresjs.dockerfile | 2 +- frameworks/JavaScript/express/express.dockerfile | 2 +- frameworks/JavaScript/fastify/create-server.js | 2 +- frameworks/JavaScript/hapi/create-server.js | 1 + frameworks/JavaScript/hapi/hapi-mysql.dockerfile | 2 +- frameworks/JavaScript/hapi/hapi-postgres.dockerfile | 2 +- frameworks/JavaScript/hapi/hapi.dockerfile | 2 +- frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile | 2 +- frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile | 2 +- frameworks/TypeScript/nest/nestjs-fastify.dockerfile | 2 +- frameworks/TypeScript/nest/nestjs-mongo.dockerfile | 2 +- frameworks/TypeScript/nest/nestjs-mysql.dockerfile | 2 +- frameworks/TypeScript/nest/nestjs.dockerfile | 2 +- frameworks/TypeScript/nest/src/main.ts | 3 +++ 19 files changed, 22 insertions(+), 17 deletions(-) diff --git a/frameworks/JavaScript/express/app.js b/frameworks/JavaScript/express/app.js index c8614691135..9f1039e2179 100755 --- a/frameworks/JavaScript/express/app.js +++ b/frameworks/JavaScript/express/app.js @@ -41,5 +41,6 @@ if (cluster.isPrimary) { app.get('/plaintext', (req, res) => res.header('Content-Type', 'text/plain').send('Hello, World!')); - app.listen(8080); + const server = app.listen(8080); + server.keepAliveTimeout = 0; } diff --git a/frameworks/JavaScript/express/express-chakra.dockerfile b/frameworks/JavaScript/express/express-chakra.dockerfile index 7d179c4fc6a..ec726dd2800 100644 --- a/frameworks/JavaScript/express/express-chakra.dockerfile +++ b/frameworks/JavaScript/express/express-chakra.dockerfile @@ -1,4 +1,4 @@ -FROM node:chakracore +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express-mongodb.dockerfile b/frameworks/JavaScript/express/express-mongodb.dockerfile index b9f22ed1162..fdd130d3195 100644 --- a/frameworks/JavaScript/express/express-mongodb.dockerfile +++ b/frameworks/JavaScript/express/express-mongodb.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express-mysql.dockerfile b/frameworks/JavaScript/express/express-mysql.dockerfile index c34740fb009..f446c93d2f4 100644 --- a/frameworks/JavaScript/express/express-mysql.dockerfile +++ b/frameworks/JavaScript/express/express-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express-postgres.dockerfile b/frameworks/JavaScript/express/express-postgres.dockerfile index 7f6367401fc..46cf427d0a2 100644 --- a/frameworks/JavaScript/express/express-postgres.dockerfile +++ b/frameworks/JavaScript/express/express-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express-postgresjs.dockerfile b/frameworks/JavaScript/express/express-postgresjs.dockerfile index d9a5e1b35ba..bc570d57faf 100644 --- a/frameworks/JavaScript/express/express-postgresjs.dockerfile +++ b/frameworks/JavaScript/express/express-postgresjs.dockerfile @@ -1,4 +1,4 @@ -FROM node:21.1.0-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/express/express.dockerfile b/frameworks/JavaScript/express/express.dockerfile index c78d8648283..ec726dd2800 100644 --- a/frameworks/JavaScript/express/express.dockerfile +++ b/frameworks/JavaScript/express/express.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/fastify/create-server.js b/frameworks/JavaScript/fastify/create-server.js index fd0833223db..a20ba97e6e8 100644 --- a/frameworks/JavaScript/fastify/create-server.js +++ b/frameworks/JavaScript/fastify/create-server.js @@ -1,4 +1,4 @@ -const fastify = require("fastify")(); +const fastify = require("fastify")({ logger: false, keepAliveTimeout: 0 }); const handlers = require("./handlers"); fastify.setErrorHandler((error, request, reply) => { diff --git a/frameworks/JavaScript/hapi/create-server.js b/frameworks/JavaScript/hapi/create-server.js index 6286264fd2e..db3c86b3f19 100644 --- a/frameworks/JavaScript/hapi/create-server.js +++ b/frameworks/JavaScript/hapi/create-server.js @@ -13,6 +13,7 @@ const options = { }; const server = new Hapi.server(options); +server.listener.keepAliveTimeout = 0; const provision = async () => { diff --git a/frameworks/JavaScript/hapi/hapi-mysql.dockerfile b/frameworks/JavaScript/hapi/hapi-mysql.dockerfile index 695bacf9e1e..f902c839a26 100644 --- a/frameworks/JavaScript/hapi/hapi-mysql.dockerfile +++ b/frameworks/JavaScript/hapi/hapi-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/hapi/hapi-postgres.dockerfile b/frameworks/JavaScript/hapi/hapi-postgres.dockerfile index ee4e9251ee8..e9c8fb0e9a9 100644 --- a/frameworks/JavaScript/hapi/hapi-postgres.dockerfile +++ b/frameworks/JavaScript/hapi/hapi-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/JavaScript/hapi/hapi.dockerfile b/frameworks/JavaScript/hapi/hapi.dockerfile index 23b09a88995..233cd3c53b0 100644 --- a/frameworks/JavaScript/hapi/hapi.dockerfile +++ b/frameworks/JavaScript/hapi/hapi.dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile b/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile index c7d40f6c6ab..d55bacee6a7 100644 --- a/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-fastify-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile b/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile index d5e7f4a0165..40b0da005c4 100644 --- a/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-fastify-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/nest/nestjs-fastify.dockerfile b/frameworks/TypeScript/nest/nestjs-fastify.dockerfile index 1b3dc806754..485c360794e 100644 --- a/frameworks/TypeScript/nest/nestjs-fastify.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-fastify.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/nest/nestjs-mongo.dockerfile b/frameworks/TypeScript/nest/nestjs-mongo.dockerfile index 09fab943ed3..a59ac0c9e14 100644 --- a/frameworks/TypeScript/nest/nestjs-mongo.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/nest/nestjs-mysql.dockerfile b/frameworks/TypeScript/nest/nestjs-mysql.dockerfile index 80147df547d..9ff806b92a8 100644 --- a/frameworks/TypeScript/nest/nestjs-mysql.dockerfile +++ b/frameworks/TypeScript/nest/nestjs-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/nest/nestjs.dockerfile b/frameworks/TypeScript/nest/nestjs.dockerfile index d2382bf8999..1ea6fd1581e 100644 --- a/frameworks/TypeScript/nest/nestjs.dockerfile +++ b/frameworks/TypeScript/nest/nestjs.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.16-slim COPY ./ ./ diff --git a/frameworks/TypeScript/nest/src/main.ts b/frameworks/TypeScript/nest/src/main.ts index 82fa61ea07d..a095bfb746b 100644 --- a/frameworks/TypeScript/nest/src/main.ts +++ b/frameworks/TypeScript/nest/src/main.ts @@ -23,6 +23,7 @@ async function bootstrapExpress() { app = await NestFactory.create(SqlModule, { logger: false, }); + app.getHttpServer().keepAliveTimeout = 0; } app.setBaseViewsDir(join(__dirname, '..', 'views')); @@ -40,12 +41,14 @@ async function bootstrapFastify() { new FastifyAdapter(), { logger: false }, ); + app.getHttpServer().keepAliveTimeout = 0; } else { app = await NestFactory.create( SqlModule, new FastifyAdapter(), { logger: false }, ); + app.getHttpServer().keepAliveTimeout = 0; } app.setViewEngine({ From 6d43b7efb516a240a268003c70fa3754032ed018 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 9 Dec 2024 16:58:06 +0100 Subject: [PATCH 0951/1766] [rails] Upgrade to Rails 8. (#9446) --- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 175 +++++++++--------- .../rails/config/environments/development.rb | 29 +-- .../rails/config/environments/production.rb | 41 ++-- .../Ruby/rails/config/environments/test.rb | 15 +- .../initializers/filter_parameter_logging.rb | 6 +- 6 files changed, 127 insertions(+), 141 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 846b2777d7e..9b7458ae417 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'rails', '~> 7.2.0' +gem 'rails', '~> 8.0.0' gem 'redis', '~> 5.0' gem 'tzinfo-data' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 2d348650520..010270b9617 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,67 +1,67 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.2.1.1) - actionpack (= 7.2.1.1) - activesupport (= 7.2.1.1) + actioncable (8.0.0) + actionpack (= 8.0.0) + activesupport (= 8.0.0) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.2.1.1) - actionpack (= 7.2.1.1) - activejob (= 7.2.1.1) - activerecord (= 7.2.1.1) - activestorage (= 7.2.1.1) - activesupport (= 7.2.1.1) + actionmailbox (8.0.0) + actionpack (= 8.0.0) + activejob (= 8.0.0) + activerecord (= 8.0.0) + activestorage (= 8.0.0) + activesupport (= 8.0.0) mail (>= 2.8.0) - actionmailer (7.2.1.1) - actionpack (= 7.2.1.1) - actionview (= 7.2.1.1) - activejob (= 7.2.1.1) - activesupport (= 7.2.1.1) + actionmailer (8.0.0) + actionpack (= 8.0.0) + actionview (= 8.0.0) + activejob (= 8.0.0) + activesupport (= 8.0.0) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.1.1) - actionview (= 7.2.1.1) - activesupport (= 7.2.1.1) + actionpack (8.0.0) + actionview (= 8.0.0) + activesupport (= 8.0.0) nokogiri (>= 1.8.5) - racc - rack (>= 2.2.4, < 3.2) + rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (7.2.1.1) - actionpack (= 7.2.1.1) - activerecord (= 7.2.1.1) - activestorage (= 7.2.1.1) - activesupport (= 7.2.1.1) + actiontext (8.0.0) + actionpack (= 8.0.0) + activerecord (= 8.0.0) + activestorage (= 8.0.0) + activesupport (= 8.0.0) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.2.1.1) - activesupport (= 7.2.1.1) + actionview (8.0.0) + activesupport (= 8.0.0) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.1.1) - activesupport (= 7.2.1.1) + activejob (8.0.0) + activesupport (= 8.0.0) globalid (>= 0.3.6) - activemodel (7.2.1.1) - activesupport (= 7.2.1.1) - activerecord (7.2.1.1) - activemodel (= 7.2.1.1) - activesupport (= 7.2.1.1) + activemodel (8.0.0) + activesupport (= 8.0.0) + activerecord (8.0.0) + activemodel (= 8.0.0) + activesupport (= 8.0.0) timeout (>= 0.4.0) - activestorage (7.2.1.1) - actionpack (= 7.2.1.1) - activejob (= 7.2.1.1) - activerecord (= 7.2.1.1) - activesupport (= 7.2.1.1) + activestorage (8.0.0) + actionpack (= 8.0.0) + activejob (= 8.0.0) + activerecord (= 8.0.0) + activesupport (= 8.0.0) marcel (~> 1.0) - activesupport (7.2.1.1) + activesupport (8.0.0) base64 + benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) @@ -71,14 +71,15 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) agoo (2.15.13) - async (2.17.0) - console (~> 1.26) + async (2.19.0) + console (~> 1.29) fiber-annotation io-event (~> 1.6, >= 1.6.5) async-container (0.18.3) async (~> 2.10) - async-http (0.82.1) + async-http (0.82.3) async (>= 2.10.2) async-pool (~> 0.9) io-endpoint (~> 0.14) @@ -97,16 +98,17 @@ GEM async async-container (~> 0.16) base64 (0.2.0) + benchmark (0.4.0) bigdecimal (3.1.8) builder (3.3.0) concurrent-ruby (1.3.4) connection_pool (2.4.1) - console (1.27.0) + console (1.29.0) fiber-annotation fiber-local (~> 1.1) json crass (1.0.6) - date (3.3.4) + date (3.4.1) drb (2.2.1) erubi (1.13.0) falcon (0.48.3) @@ -130,16 +132,16 @@ GEM activesupport (>= 6.1) i18n (1.14.6) concurrent-ruby (~> 1.0) - io-console (0.7.2) + io-console (0.8.0) io-endpoint (0.14.0) - io-event (1.7.2) - io-stream (0.6.0) + io-event (1.7.3) + io-stream (0.6.1) irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.8.1) localhost (1.3.1) - logger (1.6.1) + logger (1.6.2) loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -150,11 +152,11 @@ GEM net-smtp mapping (1.1.1) marcel (1.0.4) - metrics (0.12.0) + metrics (0.12.1) mini_mime (1.1.5) mini_portile2 (2.8.8) - minitest (5.25.1) - net-imap (0.4.17) + minitest (5.25.4) + net-imap (0.5.1) date net-protocol net-pop (0.1.2) @@ -167,27 +169,29 @@ GEM nokogiri (1.16.8) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.8-arm64-darwin) + nokogiri (1.16.8-x86_64-darwin) racc (~> 1.4) nokogiri (1.16.8-x86_64-linux) racc (~> 1.4) openssl (3.2.0) - pg (1.5.8) + pg (1.5.9) process-metrics (0.3.0) console (~> 1.8) json (~> 2) samovar (~> 2.1) protocol-hpack (1.5.1) - protocol-http (0.40.0) + protocol-http (0.42.0) protocol-http1 (0.28.1) protocol-http (~> 0.22) - protocol-http2 (0.19.3) + protocol-http2 (0.19.4) protocol-hpack (~> 1.4) protocol-http (~> 0.18) + traces protocol-rack (0.10.1) protocol-http (~> 0.37) rack (>= 1.0) - psych (5.1.2) + psych (5.2.1) + date stringio puma (6.5.0) nio4r (~> 2.0) @@ -197,23 +201,22 @@ GEM rack (>= 3.0.0) rack-test (2.1.0) rack (>= 1.3) - rackup (2.1.0) + rackup (2.2.1) rack (>= 3) - webrick (~> 1.8) - rails (7.2.1.1) - actioncable (= 7.2.1.1) - actionmailbox (= 7.2.1.1) - actionmailer (= 7.2.1.1) - actionpack (= 7.2.1.1) - actiontext (= 7.2.1.1) - actionview (= 7.2.1.1) - activejob (= 7.2.1.1) - activemodel (= 7.2.1.1) - activerecord (= 7.2.1.1) - activestorage (= 7.2.1.1) - activesupport (= 7.2.1.1) + rails (8.0.0) + actioncable (= 8.0.0) + actionmailbox (= 8.0.0) + actionmailer (= 8.0.0) + actionpack (= 8.0.0) + actiontext (= 8.0.0) + actionview (= 8.0.0) + activejob (= 8.0.0) + activemodel (= 8.0.0) + activerecord (= 8.0.0) + activestorage (= 8.0.0) + activesupport (= 8.0.0) bundler (>= 1.15.0) - railties (= 7.2.1.1) + railties (= 8.0.0) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -221,46 +224,46 @@ GEM rails-html-sanitizer (1.6.1) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (7.2.1.1) - actionpack (= 7.2.1.1) - activesupport (= 7.2.1.1) + railties (8.0.0) + actionpack (= 8.0.0) + activesupport (= 8.0.0) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.7.0) + rdoc (6.8.1) psych (>= 4.0.0) redis (5.3.0) redis-client (>= 0.22.0) redis-client (0.22.2) connection_pool - reline (0.5.10) + reline (0.5.12) io-console (~> 0.5) samovar (2.3.0) console (~> 1.0) mapping (~> 1.0) - securerandom (0.3.1) - stringio (3.1.1) + securerandom (0.4.0) + stringio (3.1.2) thor (1.3.2) - timeout (0.4.1) - traces (0.13.1) + timeout (0.4.2) + traces (0.14.1) trilogy (2.8.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2024.2) tzinfo (>= 1.0.0) - useragent (0.16.10) - webrick (1.8.2) + uri (1.0.2) + useragent (0.16.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.7.0) + zeitwerk (2.7.1) PLATFORMS - arm64-darwin-20 ruby + x86_64-darwin-22 x86_64-linux DEPENDENCIES @@ -269,10 +272,10 @@ DEPENDENCIES pg (~> 1.5) puma (~> 6.4) rackup - rails (~> 7.2.0) + rails (~> 8.0.0) redis (~> 5.0) trilogy (~> 2.8.1) tzinfo-data BUNDLED WITH - 2.3.3 + 2.5.16 diff --git a/frameworks/Ruby/rails/config/environments/development.rb b/frameworks/Ruby/rails/config/environments/development.rb index 6a2306dbabc..ab2b0a86d2f 100644 --- a/frameworks/Ruby/rails/config/environments/development.rb +++ b/frameworks/Ruby/rails/config/environments/development.rb @@ -3,9 +3,7 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # In the development environment your application's code is reloaded any time - # it changes. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. + # Make code changes take effect immediately without server restart. config.enable_reloading = true # Do not eager load code on boot. @@ -17,35 +15,31 @@ # Enable server timing. config.server_timing = true - # Enable/disable caching. By default caching is disabled. - # Run rails dev:cache to toggle caching. + # Enable/disable Action Controller caching. By default Action Controller caching is disabled. + # Run rails dev:cache to toggle Action Controller caching. if Rails.root.join("tmp/caching-dev.txt").exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true - - config.cache_store = :memory_store - config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{2.days.to_i}" } + config.public_file_server.headers = { "cache-control" => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false - - config.cache_store = :null_store end + # Change to :null_store to avoid any caching. + config.cache_store = :memory_store + # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log - # Raise exceptions for disallowed deprecations. - config.active_support.disallowed_deprecation = :raise - - # Tell Active Support which deprecation messages to disallow. - config.active_support.disallowed_deprecation_warnings = [] - # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true + # Append comments with runtime information tags to SQL queries in logs. + config.active_record.query_log_tags_enabled = true + # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true @@ -54,7 +48,4 @@ # Raise error when a before_action's only/except options reference missing actions. config.action_controller.raise_on_missing_callback_actions = true - - # Apply autocorrection by RuboCop to files generated by `bin/rails generate`. - # config.generators.apply_rubocop_autocorrect_after_generate! end diff --git a/frameworks/Ruby/rails/config/environments/production.rb b/frameworks/Ruby/rails/config/environments/production.rb index c6594e5d17d..331a2687e8f 100644 --- a/frameworks/Ruby/rails/config/environments/production.rb +++ b/frameworks/Ruby/rails/config/environments/production.rb @@ -6,19 +6,17 @@ # Code is not reloaded between requests. config.enable_reloading = false - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. + # Eager load code on boot for better performance and memory savings (ignored by Rake tasks). config.eager_load = true - # Full error reports are disabled and caching is turned on. + # Full error reports are disabled. config.consider_all_requests_local = false + + # Turn on fragment caching in view templates. config.action_controller.perform_caching = true - # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment - # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files). - # config.require_master_key = true + # Cache assets for far-future expiry since they are all digest stamped. + config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" } # Disable serving static files from `public/`, relying on NGINX/Apache to do so instead. # This disables the ActionDispatch::Static middleware. @@ -27,12 +25,7 @@ # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.asset_host = "http://assets.example.com" - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache - # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX - # Assume all access to the app is happening through a SSL-terminating reverse proxy. - # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies. # config.assume_ssl = true # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. @@ -41,14 +34,19 @@ # Skip http-to-https redirect for the default health check endpoint. # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } } - # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] + # Log to STDOUT with the current request id as a default log tag. + # config.log_tags = [ :request_id ] + config.logger = ActiveSupport::TaggedLogging.logger(STDOUT) - # "info" includes generic and useful information about system operation, but avoids logging too much - # information to avoid inadvertent exposure of personally identifiable information (PII). If you - # want to log everything, set the level to "debug". + # Change to "debug" to log everything (including potentially personally-identifiable information!) config.log_level = :fatal + # Prevent health checks from clogging up the logs. + config.silence_healthcheck_path = "/up" + + # Don't log any deprecations. + config.active_support.report_deprecations = false + # Use a different cache store in production. config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], @@ -66,17 +64,18 @@ # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true - # Don't log any deprecations. - config.active_support.report_deprecations = false - # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false + # Only use :id for inspections in production. + config.active_record.attributes_for_inspect = [ :id ] + # Enable DNS rebinding protection and other `Host` header attacks. # config.hosts = [ # "example.com", # Allow requests from example.com # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` # ] + # # Skip DNS rebinding protection for the default health check endpoint. # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } end diff --git a/frameworks/Ruby/rails/config/environments/test.rb b/frameworks/Ruby/rails/config/environments/test.rb index 999db7091ef..14bc29e0659 100644 --- a/frameworks/Ruby/rails/config/environments/test.rb +++ b/frameworks/Ruby/rails/config/environments/test.rb @@ -1,5 +1,3 @@ -require "active_support/core_ext/integer/time" - # The test environment is used exclusively to run your application's # test suite. You never need to work with it otherwise. Remember that # your test database is "scratch space" for the test suite and is wiped @@ -17,12 +15,11 @@ # loading is working properly before deploying your code. config.eager_load = ENV["CI"].present? - # Configure public file server for tests with Cache-Control for performance. - config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{1.hour.to_i}" } + # Configure public file server for tests with cache-control for performance. + config.public_file_server.headers = { "cache-control" => "public, max-age=3600" } - # Show full error reports and disable caching. + # Show full error reports. config.consider_all_requests_local = true - config.action_controller.perform_caching = false config.cache_store = :null_store # Render exception templates for rescuable exceptions and raise for other exceptions. @@ -34,12 +31,6 @@ # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr - # Raise exceptions for disallowed deprecations. - config.active_support.disallowed_deprecation = :raise - - # Tell Active Support which deprecation messages to disallow. - config.active_support.disallowed_deprecation_warnings = [] - # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true diff --git a/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb b/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb index 4b34a036689..c0b717f7ecb 100644 --- a/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb +++ b/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb @@ -1,6 +1,8 @@ # Be sure to restart your server when you modify this file. -# Configure sensitive parameters which will be filtered from the log file. +# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. +# Use this to limit dissemination of sensitive information. +# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. Rails.application.config.filter_parameters += [ - :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn + :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc ] From cda709d99efb483fb05deed5248873a8253047e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 9 Dec 2024 23:58:33 +0800 Subject: [PATCH 0952/1766] upgrade smart-servlet to 2.4 (#9445) 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 * upgrade smart-servlet to 1.0-SNAPSHOT * upgrade smart-servlet to 1.4 * upgrade smart-servlet to 1.5-SNAPSHOT * 启用虚拟线程 * 启用虚拟线程 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 --- .../Java/smart-socket/benchmark_config.json | 3 - frameworks/Java/smart-socket/pom.xml | 2 +- .../java/org/smartboot/http/Bootstrap.java | 41 +++++-------- .../java/org/smartboot/servlet/Bootstrap.java | 32 +++------- .../resources/smart-servlet/License.shield | Bin 0 -> 967 bytes .../resources/smart-servlet/smart-servlet.pem | 55 ++++++++++++++++++ .../smart-servlet/smart-servlet.properties | 15 +++++ 7 files changed, 92 insertions(+), 56 deletions(-) create mode 100644 frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield create mode 100644 frameworks/Java/smart-socket/src/main/resources/smart-servlet/smart-servlet.pem create mode 100644 frameworks/Java/smart-socket/src/main/resources/smart-servlet/smart-servlet.properties diff --git a/frameworks/Java/smart-socket/benchmark_config.json b/frameworks/Java/smart-socket/benchmark_config.json index f69d7a43eb7..7a26d71ed56 100755 --- a/frameworks/Java/smart-socket/benchmark_config.json +++ b/frameworks/Java/smart-socket/benchmark_config.json @@ -5,9 +5,6 @@ "default": { "json_url": "/json", "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", "classification": "Platform", diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 39a47cc3c1e..a4107b3d3e8 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.3 + 2.5 5.0.0 0.9.23 diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 06753113440..9dda965e0be 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -18,34 +18,11 @@ import org.smartboot.http.server.handler.HttpRouteHandler; import javax.sql.DataSource; -import java.io.IOException; public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); public static void main(String[] args) { - HttpRouteHandler routeHandle = new HttpRouteHandler(); - routeHandle - .route("/plaintext", new HttpServerHandler() { - - - @Override - public void handle(HttpRequest request, HttpResponse response) throws IOException { - response.setContentLength(body.length); - response.setContentType("text/plain; charset=UTF-8"); - response.write(body); - } - }) - .route("/json", new HttpServerHandler() { - - @Override - public void handle(HttpRequest request, HttpResponse response) throws IOException { - - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); - } - }); - initDB(routeHandle); int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpBootstrap bootstrap = new HttpBootstrap(); @@ -53,10 +30,20 @@ public void handle(HttpRequest request, HttpResponse response) throws IOExceptio .threadNum(cpuNum) .headerLimiter(0) .readBufferSize(1024 * 4) - .writeBufferSize(1024 * 4) - .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum); - bootstrap.httpHandler(routeHandle).setPort(8080).start(); + .writeBufferSize(1024 * 4); + bootstrap.httpHandler(new HttpServerHandler() { + @Override + public void handle(HttpRequest request, HttpResponse response) throws Throwable { + if ("/plaintext".equals(request.getRequestURI())) { + response.setContentLength(body.length); + response.setContentType("text/plain; charset=UTF-8"); + response.write(body); + } else if ("/json".equals(request.getRequestURI())) { + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); + } + } + }).setPort(8080).start(); } private static void initDB(HttpRouteHandler routeHandle) { 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 f4458e0a6e6..f3caa038cbe 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 @@ -1,17 +1,11 @@ package org.smartboot.servlet; -import org.smartboot.http.server.HttpBootstrap; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; import tech.smartboot.servlet.Container; import tech.smartboot.servlet.ServletContextRuntime; import tech.smartboot.servlet.conf.ServletInfo; import tech.smartboot.servlet.conf.ServletMappingInfo; -import java.util.concurrent.CompletableFuture; - /** * @author 三刀(zhengjunweimail@163.com) * @version V1.0 , 2020/12/22 @@ -19,6 +13,7 @@ public class Bootstrap { public static void main(String[] args) throws Throwable { + System.setProperty("smart-servlet-spring-boot-starter","true"); Container containerRuntime = new Container(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); @@ -38,26 +33,13 @@ public static void main(String[] args) throws Throwable { applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(jsonServletInfo.getServletName(), "/json")); containerRuntime.addRuntime(applicationRuntime); - int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - HttpBootstrap bootstrap = new HttpBootstrap(); - bootstrap.configuration() - .threadNum(cpuNum) - .bannerEnabled(false) - .headerLimiter(0) - .readBufferSize(1024 * 4) - .writeBufferSize(1024 * 4) - .readMemoryPool(16384 * 1024 * 4) - .writeMemoryPool(10 * 1024 * 1024 * cpuNum, cpuNum); - containerRuntime.start(bootstrap.configuration()); - bootstrap.setPort(8080) - .httpHandler(new HttpServerHandler() { - @Override - public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws Throwable { - containerRuntime.doHandle(request, response, completableFuture); - } - }) - .start(); + containerRuntime.getConfiguration() + .setThreadNum(cpuNum) + .setReadBufferSize(1024 * 4); + containerRuntime.initialize(); + containerRuntime.start(); + } } diff --git a/frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield b/frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield new file mode 100644 index 0000000000000000000000000000000000000000..f970f023915e0e46165f8a833528edbaedc9f2d4 GIT binary patch literal 967 zcmV;&133J1ZDDeBEo^CHWo~n20004vtF8&P0004%2!md50000WF=aM2W;kOxWimKo zWil`{W@Ip8W@Tk!G-5DhIA$<30001@FoB;i4F(A+hDe6@4FLfG1potqjQ}u#i2{Lv z0Im+;3edJ8Payh|6C%}?uc~+yP(n}f0096101tC*VRCe0Z*O$vo1*EMp8x;= z7kX%AZf9zBZg*vAZDDC_KruEmE@N+P0000UfTfKld*FI7uZ*^!beU~viOp#F^)n091{Eq+b7g1Tcj5w;p!QXn>kqFT(a%=l%iUH< z-UGd($|u}tG!4X_i`wxf`Z8wAz#=DD`HJR#mKMTNz=_x>Unm9);v<|-Jvd!kc_et zxhF9nDJZ)ER5p;cD;yb(D(_Jg(&&_h@QxY@ECj0`t{qNQ$l#fwylYq<{8<=;`_bSm zj})_cAKPnFAEf;AS5PPb00000000btoj|#S?KXUr-WMN%kFQt;cp%9wwr3mz=;bU3 zK~r;Ov#R+3Is9T}Iv;Iuo$I$~4Kdk5Wj!O8$k8L{sKghuaV~Hiv{~Y;mtIg3w`UxU ztnkvE*UES*O=TWr?+`MXcgt{fkCr)O8DVX^RU-`em!x*IX%11FZm!6@@z`2x00000 z0000GfM)Uhl>BQ>;V!(IYdBCHp;M-2zY63MGj+BrE+@#wwX8>441_E$K;mOrme0F{ z`@k;AVA+S`YaTLoyz0(zMTA&kX5grbR_gHjb)Tjq-0YW*=$L1(v>Lb*d!0 Date: Mon, 9 Dec 2024 22:58:46 +0700 Subject: [PATCH 0953/1766] Ktor optimize and update (#9444) * fixed batch writes * upgraded Ktor to latest --------- Co-authored-by: Ilya Nemtsev --- frameworks/Kotlin/ktor/ktor/pom.xml | 2 +- .../org/jetbrains/ktor/benchmarks/Hello.kt | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 9ded4780572..74d725ca6fa 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -13,7 +13,7 @@ 2.0.21 - 3.0.1 + 3.0.2 1.7.3 0.11.0 UTF-8 diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index 82bdd34bc66..b44808fba40 100644 --- a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -19,6 +19,7 @@ import org.jetbrains.ktor.benchmarks.Constants.UPDATE_QUERY import org.jetbrains.ktor.benchmarks.Constants.WORLD_QUERY import java.sql.Connection import java.util.concurrent.ThreadLocalRandom +import kotlin.random.Random @Serializable data class Message(val message: String) @@ -49,7 +50,7 @@ fun Application.main() { } get("/db") { - val random = ThreadLocalRandom.current() + val random = Random.Default val world = withContext(databaseDispatcher) { pool.connection.use { connection -> @@ -67,7 +68,7 @@ fun Application.main() { call.respondText(Json.encodeToString(world), ContentType.Application.Json) } - fun Connection.selectWorlds(queries: Int, random: ThreadLocalRandom): List { + fun Connection.selectWorlds(queries: Int, random: Random): List { val result = ArrayList(queries) prepareStatement(WORLD_QUERY).use { statement -> repeat(queries) { @@ -85,7 +86,7 @@ fun Application.main() { get("/queries") { val queries = call.queries() - val random = ThreadLocalRandom.current() + val random = Random.Default val result = withContext(databaseDispatcher) { pool.connection.use { it.selectWorlds(queries, random) } @@ -130,7 +131,7 @@ fun Application.main() { get("/updates") { val queries = call.queries() - val random = ThreadLocalRandom.current() + val random = Random.Default val result: List withContext(databaseDispatcher) { @@ -139,14 +140,14 @@ fun Application.main() { result.forEach { it.randomNumber = random.nextInt(dbRows) + 1 } - connection.prepareStatement(UPDATE_QUERY) - .use { updateStatement -> + connection.prepareStatement(UPDATE_QUERY).use { updateStatement -> for ((id, randomNumber) in result) { updateStatement.setInt(1, randomNumber) updateStatement.setInt(2, id) - - updateStatement.executeUpdate() + updateStatement.addBatch() } + + updateStatement.executeBatch() } } } From 40b1ad68d55718364782326b98c23cd8b093a6fd Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Mon, 9 Dec 2024 16:59:25 +0100 Subject: [PATCH 0954/1766] Bump Micronaut version (#9441) --- frameworks/Java/micronaut/buildSrc/build.gradle | 2 +- frameworks/Java/micronaut/common/build.gradle | 3 +-- frameworks/Java/micronaut/gradle.properties | 2 +- .../Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile | 2 +- .../Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile | 2 +- .../Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/frameworks/Java/micronaut/buildSrc/build.gradle b/frameworks/Java/micronaut/buildSrc/build.gradle index 386638337fe..c30089f453e 100644 --- a/frameworks/Java/micronaut/buildSrc/build.gradle +++ b/frameworks/Java/micronaut/buildSrc/build.gradle @@ -8,6 +8,6 @@ repositories { } dependencies { - implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.4.2" + implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.4.4" implementation "com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1" } \ No newline at end of file diff --git a/frameworks/Java/micronaut/common/build.gradle b/frameworks/Java/micronaut/common/build.gradle index 8153fd5d8ea..61c68255503 100644 --- a/frameworks/Java/micronaut/common/build.gradle +++ b/frameworks/Java/micronaut/common/build.gradle @@ -34,8 +34,7 @@ dependencies { transitive = false } - // Switch to BOM version after https://github.com/micronaut-projects/micronaut-views/issues/876 - implementation("gg.jte:jte-runtime:3.1.12") + implementation("io.micronaut.views:micronaut-views-jte") runtimeOnly("ch.qos.logback:logback-classic") runtimeOnly("org.yaml:snakeyaml") diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index 8ce6479ffe6..264330f5525 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion=4.6.1 +micronautVersion=4.7.1 diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile index 8d7377b166d..f0b0a8a1cd7 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:21 +FROM container-registry.oracle.com/graalvm/native-image:23 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile index f0b28e5bcf3..003ace5e920 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:21 +FROM container-registry.oracle.com/graalvm/native-image:23 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile index 614967b3379..740abd93847 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:21 +FROM container-registry.oracle.com/graalvm/native-image:23 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src From aea3a4f2fa6e91fcf03dbbeb57b9038f862afbac Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 9 Dec 2024 16:59:34 +0100 Subject: [PATCH 0955/1766] [ruby/sinatra] Don't install unused servers (#9439) For example, don't install unicorn when testing puma. --- frameworks/Ruby/sinatra-sequel/Gemfile | 15 ++++++++++++--- .../sinatra-sequel/sinatra-sequel-base.dockerfile | 13 ------------- ...natra-sequel-postgres-passenger-mri.dockerfile | 1 + ...sinatra-sequel-postgres-unicorn-mri.dockerfile | 1 + .../sinatra-sequel-postgres.dockerfile | 1 + .../Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 1 + frameworks/Ruby/sinatra/Gemfile | 15 ++++++++++++--- .../sinatra-postgres-passenger-mri.dockerfile | 1 + .../sinatra-postgres-unicorn-mri.dockerfile | 1 + .../Ruby/sinatra/sinatra-postgres.dockerfile | 1 + frameworks/Ruby/sinatra/sinatra.dockerfile | 1 + 11 files changed, 32 insertions(+), 19 deletions(-) delete mode 100644 frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 7a750a78aff..23f21663480 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -1,11 +1,8 @@ source 'https://rubygems.org' gem 'json', '~> 2.8' -gem 'passenger', '~> 6.0', :platforms=>[:ruby, :mswin], :require=>false -gem 'puma', '~> 6.4', :require=>false gem 'sequel', '~> 5.0' gem 'sinatra', '~> 4.0', :require=>'sinatra/base' -gem 'unicorn', '~> 6.1', :platforms=>[:ruby, :mswin], :require=>false group :mysql do gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] @@ -15,3 +12,15 @@ group :postgresql do gem 'pg', '~> 1.5', :platforms=>[:ruby, :mswin] gem 'sequel_pg', '~> 1.6', :platforms=>:ruby, :require=>false end + +group :passenger do + gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false +end + +group :puma do + gem 'puma', '~> 6.4', require: false +end + +group :unicorn do + gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false +end diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile deleted file mode 100644 index 942d363b75c..00000000000 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM ruby:3.4-rc - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra-sequel -WORKDIR /sinatra-sequel - -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile 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 a7080367514..88f3d9dbfa3 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel +ENV BUNDLE_WITHOUT=mysql:puma:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 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 4d03257046a..b23651b44fc 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel +ENV BUNDLE_WITHOUT=mysql:passenger:puma RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index eee06752667..aff4f5d206a 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel +ENV BUNDLE_WITHOUT=mysql:passenger:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index 80198c299ab..d446161f602 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel +ENV BUNDLE_WITHOUT=postgresql:passenger:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 7fc8bdb1a0d..c6346471ce2 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -2,10 +2,7 @@ source 'https://rubygems.org' gem 'activerecord', '~> 7.2', require: 'active_record' gem 'json', '~> 2.8' -gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false -gem 'puma', '~> 6.4', require: false gem 'sinatra', '~> 4.0', require: 'sinatra/base' -gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false group :mysql do gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] @@ -14,3 +11,15 @@ end group :postgresql do gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] end + +group :passenger do + gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false +end + +group :puma do + gem 'puma', '~> 6.4', require: false +end + +group :unicorn do + gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false +end diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile index 5d1f93bcb10..672444b4dae 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra +ENV BUNDLE_WITHOUT=mysql:puma:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile index 027a5593040..882d124c895 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra +ENV BUNDLE_WITHOUT=mysql:passenger:puma RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 6258ac08c7d..62b6c607bb4 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra +ENV BUNDLE_WITHOUT=mysql:passenger:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 8e204def810..4de24d6bae2 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -10,6 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra +ENV BUNDLE_WITHOUT=postgresql:passenger:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=mysql From 3bbbb594020f1c8eccf49cd0e45008c7c06792fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Mon, 9 Dec 2024 23:59:46 +0800 Subject: [PATCH 0956/1766] [Java] Update Solon Version To 3.0.4 (#9438) * Update Solon Version To 2.9.1 * Update Solon Version To 2.9.1 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Jdk To 21 * Update Solon Version To 2.9.2 * Add Solon-Virtual * Remove solon-virtual * Update Solon Version To 3.0.2 * Add Solon-Vertx * Tweak description * Tweak the dockerfile * Tweak the dockerfile * Tweak config * Tweak dockefile name * Add FilterImpl * Add FilterImpl * The json plugin is changed to jackson * Update Solon Jdk To 23 * Update Solon-Vertx Jdk To 23 * Solon-vertx is restored to jdk 21 * Solon is restored to jdk 21 * Solon-vertx adjusts the Date output format * Solon is restored to jdk 21 * Remove solon-vertx * [Java] Update Solon Version To 3.0.3 * [Java] Update Solon Version To 3.0.4 * [Java] remove solon-vertx * [Java] Update Solon Version To 3.0.4 * [Java] Update Solon Version To 3.0.4 * [Java] Update Solon Version To 3.0.4 * [Java] Update Solon Version To 3.0.4 --- frameworks/Java/solon-vertx/README.md | 23 ------- .../Java/solon-vertx/benchmark_config.json | 26 -------- frameworks/Java/solon-vertx/config.toml | 15 ----- frameworks/Java/solon-vertx/pom.xml | 61 ------------------- .../Java/solon-vertx/solon-vertx.dockerfile | 13 ---- .../solon-vertx/src/main/java/hello/Main.java | 13 ---- .../java/hello/controller/FilterImpl.java | 23 ------- .../hello/controller/HelloController.java | 25 -------- .../src/main/java/hello/model/Message.java | 21 ------- .../src/main/resources/app.properties | 1 - frameworks/Java/solon/benchmark_config.json | 6 +- frameworks/Java/solon/config.toml | 4 +- frameworks/Java/solon/pom.xml | 2 +- .../hello/repository/JdbcDbRepository.java | 17 ++---- 14 files changed, 12 insertions(+), 238 deletions(-) delete mode 100644 frameworks/Java/solon-vertx/README.md delete mode 100644 frameworks/Java/solon-vertx/benchmark_config.json delete mode 100644 frameworks/Java/solon-vertx/config.toml delete mode 100644 frameworks/Java/solon-vertx/pom.xml delete mode 100644 frameworks/Java/solon-vertx/solon-vertx.dockerfile delete mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/Main.java delete mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java delete mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java delete mode 100644 frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java delete mode 100644 frameworks/Java/solon-vertx/src/main/resources/app.properties diff --git a/frameworks/Java/solon-vertx/README.md b/frameworks/Java/solon-vertx/README.md deleted file mode 100644 index 40b8ab3b2cf..00000000000 --- a/frameworks/Java/solon-vertx/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# solon-vertx Benchmarking Test - - -This is the solon-vertx portion of a [benchmarking test suite](../) comparing a variety of web development platforms. - -### JSON Encoding Test -* [JSON test source](src/main/java/hello/Main.java) -* [Plaintext test source](src/main/java/hello/Main.java) - -## Versions - -* [Java OpenJDK 21](http://openjdk.java.net/) -* [solon 3.0.2](https://github.com/noear/solon) - -## Test URLs - -### JSON Encoding Test - - http://localhost:8080/json - -### Plaintext Encoding Test - - http://localhost:8080/plaintext \ No newline at end of file diff --git a/frameworks/Java/solon-vertx/benchmark_config.json b/frameworks/Java/solon-vertx/benchmark_config.json deleted file mode 100644 index 3b7de26f5d4..00000000000 --- a/frameworks/Java/solon-vertx/benchmark_config.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "framework": "solon-vertx", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "None", - "framework": "solon", - "language": "Java", - "flavor": "None", - "orm": "Micro", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "solon-vertx", - "notes": "", - "versus": "solon" - } - } - ] -} diff --git a/frameworks/Java/solon-vertx/config.toml b/frameworks/Java/solon-vertx/config.toml deleted file mode 100644 index 8306ab94cd1..00000000000 --- a/frameworks/Java/solon-vertx/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "solon-vertx" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "Netty" -webserver = "None" -versus = "solon" diff --git a/frameworks/Java/solon-vertx/pom.xml b/frameworks/Java/solon-vertx/pom.xml deleted file mode 100644 index 2546baecf35..00000000000 --- a/frameworks/Java/solon-vertx/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - 4.0.0 - - - org.noear - solon-parent - 3.0.2 - - - hello - hello-solon - 1.0 - jar - - - 21 - - - - - org.noear - solon-boot-vertx - - - - org.noear - solon-serialization-jackson - - - - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-assembly-plugin - - - jar-with-dependencies - - - - hello.Main - - - - - - make-assembly - package - - single - - - - - - - diff --git a/frameworks/Java/solon-vertx/solon-vertx.dockerfile b/frameworks/Java/solon-vertx/solon-vertx.dockerfile deleted file mode 100644 index c387938661c..00000000000 --- a/frameworks/Java/solon-vertx/solon-vertx.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM maven:3.9.7-amazoncorretto-21 as maven -WORKDIR /solon -COPY pom.xml pom.xml -COPY src src -RUN mvn compile assembly:single -q - -FROM openjdk:21-jdk-slim -WORKDIR /solon -COPY --from=maven /solon/target/hello-solon.jar app.jar - -EXPOSE 8080 - -CMD ["java", "-server", "-cp", "app.jar", "hello.Main"] \ No newline at end of file diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/Main.java b/frameworks/Java/solon-vertx/src/main/java/hello/Main.java deleted file mode 100644 index bc6467e87af..00000000000 --- a/frameworks/Java/solon-vertx/src/main/java/hello/Main.java +++ /dev/null @@ -1,13 +0,0 @@ -package hello; - -import org.noear.solon.Solon; - -/** - * @author noear - * @version V1.0 - */ -public class Main { - public static void main(String[] args) { - Solon.start(Main.class, args); - } -} diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java b/frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java deleted file mode 100644 index 7fb22e497f8..00000000000 --- a/frameworks/Java/solon-vertx/src/main/java/hello/controller/FilterImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package hello.controller; - -import org.noear.solon.annotation.Component; -import org.noear.solon.core.handle.Context; -import org.noear.solon.core.handle.Filter; -import org.noear.solon.core.handle.FilterChain; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; - -@Component -public class FilterImpl implements Filter { - private static DateFormat DATE_FORMAT = new SimpleDateFormat("EEE, d MMM yyyyy HH:mm:ss z"); - - @Override - public void doFilter(Context ctx, FilterChain chain) throws Throwable { - String dateString = DATE_FORMAT.format(new Date()); - ctx.headerSet("Date", dateString); - ctx.headerSet("Server", "solon-boot-vertx"); - chain.doFilter(ctx); - } -} diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java b/frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java deleted file mode 100644 index 77049043e97..00000000000 --- a/frameworks/Java/solon-vertx/src/main/java/hello/controller/HelloController.java +++ /dev/null @@ -1,25 +0,0 @@ -package hello.controller; - -import org.noear.solon.annotation.Controller; -import org.noear.solon.annotation.Get; -import org.noear.solon.annotation.Mapping; -import hello.model.Message; - -/** - * @author noear - * @version V1.0 - */ -@Controller -public class HelloController { - @Get - @Mapping("plaintext") - public String plaintext() { - return "Hello, World!"; - } - - @Get - @Mapping("json") - public Message json() { - return new Message("Hello, World!"); - } -} diff --git a/frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java b/frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java deleted file mode 100644 index 235dd2d86dd..00000000000 --- a/frameworks/Java/solon-vertx/src/main/java/hello/model/Message.java +++ /dev/null @@ -1,21 +0,0 @@ -package hello.model; - -/** - * @author noear - * @version V1.0 - */ -public class Message { - private String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/frameworks/Java/solon-vertx/src/main/resources/app.properties b/frameworks/Java/solon-vertx/src/main/resources/app.properties deleted file mode 100644 index 26a5df70351..00000000000 --- a/frameworks/Java/solon-vertx/src/main/resources/app.properties +++ /dev/null @@ -1 +0,0 @@ -server.http.ioBound=false \ No newline at end of file diff --git a/frameworks/Java/solon/benchmark_config.json b/frameworks/Java/solon/benchmark_config.json index 70a0c1cfc10..52c9fd8be8c 100644 --- a/frameworks/Java/solon/benchmark_config.json +++ b/frameworks/Java/solon/benchmark_config.json @@ -3,16 +3,16 @@ "tests": [ { "default": { - "json_url": "/json", "plaintext_url": "/plaintext", + "json_url": "/json", "port": 8080, "approach": "Realistic", "classification": "Fullstack", - "database": "None", + "database": "Postgres", "framework": "solon", "language": "Java", "flavor": "None", - "orm": "Full", + "orm": "Micro", "platform": "solon", "webserver": "smarthttp", "os": "Linux", diff --git a/frameworks/Java/solon/config.toml b/frameworks/Java/solon/config.toml index c806ddfb0bf..83bd6e72946 100644 --- a/frameworks/Java/solon/config.toml +++ b/frameworks/Java/solon/config.toml @@ -6,10 +6,10 @@ urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" classification = "Platform" -database = "None" +database = "Postgres" database_os = "Linux" os = "Linux" -orm = "Raw" +orm = "Micro" platform = "solon" webserver = "smarthttp" versus = "None" diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index b3485e353e9..d483a51b397 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -5,7 +5,7 @@ org.noear solon-parent - 3.0.3 + 3.0.4 hello diff --git a/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java b/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java index 6e58090c32a..5fb83f9a68e 100644 --- a/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java +++ b/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java @@ -7,7 +7,6 @@ import org.noear.solon.data.sql.SqlUtils; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; @Component @@ -19,8 +18,7 @@ public class JdbcDbRepository implements DbRepository { public World getWorld(int id) { try { return sqlUtils.sql("SELECT id, randomnumber FROM world WHERE id = ?", id) - .queryRow() - .toBean(World.class, (r, t) -> new World((int) r.getObject(1), (int) r.getObject(2))); + .queryRow((rs) -> new World(rs.getInt(1), rs.getInt(2))); } catch (Exception e) { return null; } @@ -28,19 +26,16 @@ public World getWorld(int id) { @Override public void updateWorlds(List worlds) throws SQLException { - List values = new ArrayList<>(); - for (World w : worlds) { - values.add(new Object[]{w.randomNumber, w.id}); - } - sqlUtils.sql("UPDATE world SET randomnumber = ? WHERE id = ?") - .updateBatch(values); + .updateBatch(worlds, (ps, w) -> { + ps.setInt(1, w.randomNumber); + ps.setInt(2, w.id); + }); } @Override public List fortunes() throws SQLException { return sqlUtils.sql("SELECT id, message FROM fortune") - .queryRowList() - .toBeanList(Fortune.class, (r, t) -> new Fortune((int) r.getObject(1), (String) r.getObject(2))); + .queryRowList((r) -> new Fortune(r.getInt(1), r.getString(2))); } } From f7bba3f9e8401a17dbc115987a38381c6a56f54d Mon Sep 17 00:00:00 2001 From: Aaron Tavistock Date: Mon, 9 Dec 2024 08:00:11 -0800 Subject: [PATCH 0957/1766] [Elixir/Phoenix] Fixes plaintext test (#9443) * Verified that cowboy works as expected * Remove GetText and PlugCowboy from imports * After a ton of debugging figured out the issue in plaintext with much support from @mtudel * Return accepts plug just for fortunes * Return accepts plug just for fortunes * Use public release of bandit with bug fix merged --- frameworks/Elixir/phoenix/config/dev.exs | 22 +++++++------- frameworks/Elixir/phoenix/config/prod.exs | 5 +++- frameworks/Elixir/phoenix/lib/hello_web.ex | 3 -- .../hello_web/controllers/page_controller.ex | 2 +- .../Elixir/phoenix/lib/hello_web/gettext.ex | 24 --------------- frameworks/Elixir/phoenix/mix.exs | 4 +-- frameworks/Elixir/phoenix/mix.lock | 29 +++++++------------ frameworks/Elixir/phoenix/phoenix.dockerfile | 2 ++ 8 files changed, 31 insertions(+), 60 deletions(-) delete mode 100644 frameworks/Elixir/phoenix/lib/hello_web/gettext.ex diff --git a/frameworks/Elixir/phoenix/config/dev.exs b/frameworks/Elixir/phoenix/config/dev.exs index fef1a0e3888..ad06286bc58 100644 --- a/frameworks/Elixir/phoenix/config/dev.exs +++ b/frameworks/Elixir/phoenix/config/dev.exs @@ -1,13 +1,15 @@ import Config -# For development, we disable any cache and enable -# debugging and code reloading. -# -# The watchers configuration can be used to run external -# watchers to your application. For example, we use it -# with brunch.io to recompile .js and .css sources. config :hello, HelloWeb.Endpoint, - http: [port: 8080], + adapter: Bandit.PhoenixAdapter, + http: [ + port: 4000, + ip: {0, 0, 0, 0}, + http_options: [ + compress: false, + log_protocol_errors: :verbose + ], + ], debug_errors: true, code_reloader: true, cache_static_lookup: false @@ -23,10 +25,10 @@ config :hello, HelloWeb.Endpoint, ] config :hello, Hello.Repo, - username: "benchmarkdbuser", - password: "benchmarkdbpass", + username: "postgres", + password: "postgres", database: "hello_world", - hostname: "tfb-database" + hostname: "localhost" # Do not include metadata nor timestamps in development logs config :logger, :console, format: "[$level] $message\n" diff --git a/frameworks/Elixir/phoenix/config/prod.exs b/frameworks/Elixir/phoenix/config/prod.exs index c920950ee04..e2c578f4656 100755 --- a/frameworks/Elixir/phoenix/config/prod.exs +++ b/frameworks/Elixir/phoenix/config/prod.exs @@ -8,7 +8,10 @@ config :hello, HelloWeb.Endpoint, http_options: [ compress: false, log_protocol_errors: false - ] + ], + thousand_island_options: [ + transport_options: [ backlog: 8192 ] + ], ], compress: false, check_origin: false, diff --git a/frameworks/Elixir/phoenix/lib/hello_web.ex b/frameworks/Elixir/phoenix/lib/hello_web.ex index 1114ed22e51..e3411588296 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web.ex @@ -29,7 +29,6 @@ defmodule HelloWeb do log: false import Plug.Conn - import HelloWeb.Gettext unquote(verified_routes()) end @@ -39,8 +38,6 @@ defmodule HelloWeb do quote do use Phoenix.Component - import HelloWeb.Gettext - # Routes generation with the ~p sigil unquote(verified_routes()) end diff --git a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex index 59f2f5c2f35..fe03f3337c1 100644 --- a/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex +++ b/frameworks/Elixir/phoenix/lib/hello_web/controllers/page_controller.ex @@ -78,7 +78,7 @@ defmodule HelloWeb.PageController do json(conn, world_updates) end - def plaintext(conn, _params) do + def plaintext(conn, _params) do conn |> put_resp_header("content-type", "text/plain") |> send_resp(200, "Hello, World!") diff --git a/frameworks/Elixir/phoenix/lib/hello_web/gettext.ex b/frameworks/Elixir/phoenix/lib/hello_web/gettext.ex deleted file mode 100644 index a5bacc56875..00000000000 --- a/frameworks/Elixir/phoenix/lib/hello_web/gettext.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule HelloWeb.Gettext do - @moduledoc """ - A module providing Internationalization with a gettext-based API. - - By using [Gettext](https://hexdocs.pm/gettext), - your module gains a set of macros for translations, for example: - - import HelloWeb.Gettext - - # Simple translation - gettext("Here is the string to translate") - - # Plural translation - ngettext("Here is the string to translate", - "Here are the strings to translate", - 3) - - # Domain-based translation - dgettext("errors", "Here is the error message to translate") - - See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. - """ - use Gettext, otp_app: :hello -end diff --git a/frameworks/Elixir/phoenix/mix.exs b/frameworks/Elixir/phoenix/mix.exs index c11d586e566..8e2e600c889 100755 --- a/frameworks/Elixir/phoenix/mix.exs +++ b/frameworks/Elixir/phoenix/mix.exs @@ -29,15 +29,13 @@ defmodule Hello.Mixfile do # Type `mix help deps` for examples and options defp deps do [ - {:bandit, "1.5.7"}, - {:gettext, "~> 0.20"}, + {:bandit, "~> 1.6.1"}, {:ecto_sql, "~> 3.10"}, {:jason, "~> 1.2"}, {:phoenix, "~> 1.7"}, {:phoenix_live_view, "~> 0.18"}, {:phoenix_ecto, "~> 4.4"}, {:phoenix_html, "~> 4.1"}, - {:plug_cowboy, "~> 2.5"}, {:postgrex, ">= 0.0.0"}, {:nebulex, "~> 2.6"} ] diff --git a/frameworks/Elixir/phoenix/mix.lock b/frameworks/Elixir/phoenix/mix.lock index 0c47cab2458..5fd905d6784 100644 --- a/frameworks/Elixir/phoenix/mix.lock +++ b/frameworks/Elixir/phoenix/mix.lock @@ -1,32 +1,25 @@ %{ - "bandit": {:hex, :bandit, "1.5.7", "6856b1e1df4f2b0cb3df1377eab7891bec2da6a7fd69dc78594ad3e152363a50", [:mix], [{:hpax, "~> 1.0.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "f2dd92ae87d2cbea2fa9aa1652db157b6cba6c405cb44d4f6dd87abba41371cd"}, - "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, - "cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"}, - "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, - "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, + "bandit": {:hex, :bandit, "1.6.1", "9e01b93d72ddc21d8c576a704949e86ee6cde7d11270a1d3073787876527a48f", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "5a904bf010ea24b67979835e0507688e31ac873d4ffc8ed0e5413e8d77455031"}, + "castore": {:hex, :castore, "1.0.10", "43bbeeac820f16c89f79721af1b3e092399b3a1ecc8df1a472738fd853574911", [:mix], [], "hexpm", "1b0b7ea14d889d9ea21202c43a4fa015eb913021cb535e8ed91946f4b77a8848"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, - "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, + "decimal": {:hex, :decimal, "2.2.0", "df3d06bb9517e302b1bd265c1e7f16cda51547ad9d99892049340841f3e15836", [:mix], [], "hexpm", "af8daf87384b51b7e611fb1a1f2c4d4876b65ef968fa8bd3adf44cff401c7f21"}, + "ecto": {:hex, :ecto, "3.12.5", "4a312960ce612e17337e7cefcf9be45b95a3be6b36b6f94dfb3d8c361d631866", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6eb18e80bef8bb57e17f5a7f068a1719fbda384d40fc37acb8eb8aeca493b6ea"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, - "expo": {:hex, :expo, "1.0.0", "647639267e088717232f4d4451526e7a9de31a3402af7fcbda09b27e9a10395a", [:mix], [], "hexpm", "18d2093d344d97678e8a331ca0391e85d29816f9664a25653fd7e6166827827c"}, - "gettext": {:hex, :gettext, "0.25.0", "98a95a862a94e2d55d24520dd79256a15c87ea75b49673a2e2f206e6ebc42e5d", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "38e5d754e66af37980a94fb93bb20dcde1d2361f664b0a19f01e87296634051f"}, - "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, + "hpax": {:hex, :hpax, "1.0.1", "c857057f89e8bd71d97d9042e009df2a42705d6d690d54eca84c8b29af0787b0", [:mix], [], "hexpm", "4e2d5a4f76ae1e3048f35ae7adb1641c36265510a2d4638157fbcb53dda38445"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, - "nebulex": {:hex, :nebulex, "2.6.3", "78af348ed9f8a338871b41e0b6de718c1808e627ce03fbe86598cbda2bdda2f5", [:mix], [{:decorator, "~> 1.4", [hex: :decorator, repo: "hexpm", optional: true]}, {:shards, "~> 1.1", [hex: :shards, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "09cdcbb62f8463ffcec7cae4936425ce91e25d92a6cd37e48b5dda7c851958d5"}, - "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, - "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.2", "3b83b24ab5a2eb071a20372f740d7118767c272db386831b2e77638c4dcc606d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "3f94d025f59de86be00f5f8c5dd7b5965a3298458d21ab1c328488be3b5fcd59"}, + "nebulex": {:hex, :nebulex, "2.6.4", "4b00706e0e676474783d988962abf74614480e13c0a32645acb89bb32b660e09", [:mix], [{:decorator, "~> 1.4", [hex: :decorator, repo: "hexpm", optional: true]}, {:shards, "~> 1.1", [hex: :shards, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "25bdabf3fb86035c8151bba60bda20f80f96ae0261db7bd4090878ff63b03581"}, + "phoenix": {:hex, :phoenix, "1.7.17", "2fcdceecc6fb90bec26fab008f96abbd0fd93bc9956ec7985e5892cf545152ca", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "50e8ad537f3f7b0efb1509b2f75b5c918f697be6a45d48e49a30d3b7c0e464c9"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"}, "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.7.1", "87677ffe3b765bc96a89be7960f81703223fe2e21efa42c125fcd0127dd9d6b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "02dbd5f9ab571b864ae39418db7811618506256f6d13b4a45037e5fe78dc5de3"}, "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, - "postgrex": {:hex, :postgrex, "0.19.0", "f7d50e50cb42e0a185f5b9a6095125a9ab7e4abccfbe2ab820ab9aa92b71dbab", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "dba2d2a0a8637defbf2307e8629cb2526388ba7348f67d04ec77a5d6a72ecfae"}, - "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, + "postgrex": {:hex, :postgrex, "0.19.3", "a0bda6e3bc75ec07fca5b0a89bffd242ca209a4822a9533e7d3e84ee80707e19", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d31c28053655b78f47f948c85bb1cf86a9c1f8ead346ba1aa0d0df017fa05b61"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, - "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, + "thousand_island": {:hex, :thousand_island, "1.3.7", "1da7598c0f4f5f50562c097a3f8af308ded48cd35139f0e6f17d9443e4d0c9c5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0139335079953de41d381a6134d8b618d53d084f558c734f2662d1a72818dd12"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, - "websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"}, } diff --git a/frameworks/Elixir/phoenix/phoenix.dockerfile b/frameworks/Elixir/phoenix/phoenix.dockerfile index dcf8df3dd20..4de857bbec4 100644 --- a/frameworks/Elixir/phoenix/phoenix.dockerfile +++ b/frameworks/Elixir/phoenix/phoenix.dockerfile @@ -9,6 +9,8 @@ FROM ${BUILDER_IMAGE} AS builder ARG MIX_ENV="prod" +RUN apk add --no-cache git + RUN mix local.hex --force && \ mix local.rebar --force From 6007c64ae5ba71eb19b49756601d355aa66e2e01 Mon Sep 17 00:00:00 2001 From: Chrislearn Young Date: Tue, 10 Dec 2024 00:00:21 +0800 Subject: [PATCH 0958/1766] [Salvo] Upgrade to 0.74 (#9437) * [Salvo] Upgrade to 0.74 * rust 1.83 * docker update --- frameworks/Rust/salvo/Cargo.toml | 8 ++++---- 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 +- frameworks/Rust/salvo/src/main_diesel.rs | 2 +- frameworks/Rust/salvo/src/main_lru.rs | 2 +- frameworks/Rust/salvo/src/main_mongo.rs | 4 ++-- frameworks/Rust/salvo/src/main_mongo_raw.rs | 4 ++-- frameworks/Rust/salvo/src/main_pg.rs | 2 +- frameworks/Rust/salvo/src/main_pg_pool.rs | 2 +- frameworks/Rust/salvo/src/main_sqlx.rs | 2 +- 16 files changed, 21 insertions(+), 21 deletions(-) diff --git a/frameworks/Rust/salvo/Cargo.toml b/frameworks/Rust/salvo/Cargo.toml index a7795fc6636..58fa4a6a315 100644 --- a/frameworks/Rust/salvo/Cargo.toml +++ b/frameworks/Rust/salvo/Cargo.toml @@ -43,13 +43,13 @@ diesel = { version = "2", features = ["postgres", "r2d2"] } deadpool = { version = "0.12", features = ["rt_tokio_1", "serde", "managed"] } deadpool-postgres = "0.14" futures-util = "0.3" -lru = "0.12.0" +lru = "0.12" markup = "0.15" # mimalloc = { version = "0.1", default-features = false } -mongodb = { version = "2.4.0", features = ["zstd-compression", "snappy-compression", "zlib-compression"] } +mongodb = { version = "2", features = ["zstd-compression", "snappy-compression", "zlib-compression"] } once_cell = "1" rand = { version = "0.8", features = ["min_const_gen", "small_rng"] } -salvo = { version = "0.68", default-features = false, features = ["anyhow", "server", "http1", "affix"] } +salvo = { version = "0.74", default-features = false, features = ["anyhow", "server", "http1", "affix-state"] } serde = { version = "1", features = ["derive"] } serde_json = "1" # smallvec = "1" @@ -60,7 +60,7 @@ tokio-pg-mapper = "0.2.0" tokio-pg-mapper-derive = "0.2.0" tokio-postgres = "0.7" v_htmlescape = "0.15" -dotenv = "0.15.0" +dotenvy = "0.15" [profile.release] lto = true diff --git a/frameworks/Rust/salvo/salvo-diesel.dockerfile b/frameworks/Rust/salvo/salvo-diesel.dockerfile index 1577e454443..0943b3af73a 100644 --- a/frameworks/Rust/salvo/salvo-diesel.dockerfile +++ b/frameworks/Rust/salvo/salvo-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 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 5f668adaf76..4dd1d4511be 100644 --- a/frameworks/Rust/salvo/salvo-lru.dockerfile +++ b/frameworks/Rust/salvo/salvo-lru.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 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 2fb904eb558..2f15faea13c 100644 --- a/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 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 e8a454910c1..2eccf7dd4be 100644 --- a/frameworks/Rust/salvo/salvo-mongo.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 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 8ef7fc1eeda..bb4f4dba212 100644 --- a/frameworks/Rust/salvo/salvo-pg-pool.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg-pool.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 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 70deda13cd6..da1009087e1 100644 --- a/frameworks/Rust/salvo/salvo-pg.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 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 7d88a5d20d9..6da69983675 100644 --- a/frameworks/Rust/salvo/salvo-sqlx.dockerfile +++ b/frameworks/Rust/salvo/salvo-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 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 8f0d750dcee..11553801801 100644 --- a/frameworks/Rust/salvo/salvo.dockerfile +++ b/frameworks/Rust/salvo/salvo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.78-buster +FROM rust:1.83 ADD ./ /salvo WORKDIR /salvo diff --git a/frameworks/Rust/salvo/src/main_diesel.rs b/frameworks/Rust/salvo/src/main_diesel.rs index 7e2e9f8b36a..12e8bdc283a 100644 --- a/frameworks/Rust/salvo/src/main_diesel.rs +++ b/frameworks/Rust/salvo/src/main_diesel.rs @@ -15,7 +15,7 @@ use std::thread::available_parallelism; use anyhow::Error; use diesel::prelude::*; use diesel::r2d2::{ConnectionManager, Pool, PoolError, PooledConnection}; -use dotenv::dotenv; +use dotenvy::dotenv; use once_cell::sync::OnceCell; use rand::rngs::SmallRng; use rand::{Rng, SeedableRng}; diff --git a/frameworks/Rust/salvo/src/main_lru.rs b/frameworks/Rust/salvo/src/main_lru.rs index 77186e58ba9..0f4abcceefc 100644 --- a/frameworks/Rust/salvo/src/main_lru.rs +++ b/frameworks/Rust/salvo/src/main_lru.rs @@ -10,7 +10,7 @@ use std::thread::available_parallelism; use anyhow::Error; use bytes::Bytes; -use dotenv::dotenv; +use dotenvy::dotenv; use lru::LruCache; use once_cell::sync::OnceCell; use rand::rngs::SmallRng; diff --git a/frameworks/Rust/salvo/src/main_mongo.rs b/frameworks/Rust/salvo/src/main_mongo.rs index 372fc5bd7b8..54dfca1b183 100644 --- a/frameworks/Rust/salvo/src/main_mongo.rs +++ b/frameworks/Rust/salvo/src/main_mongo.rs @@ -10,7 +10,7 @@ use std::time::Duration; use anyhow::Error; use bytes::Bytes; -use dotenv::dotenv; +use dotenvy::dotenv; use mongodb::{ options::{ClientOptions, Compressor}, Client, Database, @@ -177,7 +177,7 @@ async fn serve() { let database = client.database("hello_world"); let router = Router::new() - .hoop(salvo::affix::inject(database)) + .hoop(salvo::affix_state::inject(database)) .push(Router::with_path("db").get(world_row)) .push(Router::with_path("fortunes").get(fortunes)) .push(Router::with_path("queries").get(queries)) diff --git a/frameworks/Rust/salvo/src/main_mongo_raw.rs b/frameworks/Rust/salvo/src/main_mongo_raw.rs index 8c4e5af5efb..ba575dc33bc 100644 --- a/frameworks/Rust/salvo/src/main_mongo_raw.rs +++ b/frameworks/Rust/salvo/src/main_mongo_raw.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::Error; use bytes::Bytes; -use dotenv::dotenv; +use dotenvy::dotenv; use mongodb::{ options::{ClientOptions, Compressor}, Client, Database, @@ -140,7 +140,7 @@ async fn serve() { let database = client.database("hello_world"); let router = Router::new() - .hoop(salvo::affix::inject(database)) + .hoop(salvo::affix_state::inject(database)) .push(Router::with_path("db").get(world_row)) .push(Router::with_path("queries").get(queries)) .push(Router::with_path("updates").get(updates)); diff --git a/frameworks/Rust/salvo/src/main_pg.rs b/frameworks/Rust/salvo/src/main_pg.rs index dfa6be4ef9f..af04bf4b718 100644 --- a/frameworks/Rust/salvo/src/main_pg.rs +++ b/frameworks/Rust/salvo/src/main_pg.rs @@ -9,7 +9,7 @@ use std::thread::available_parallelism; use async_trait::async_trait; use bytes::Bytes; -use dotenv::dotenv; +use dotenvy::dotenv; use salvo::conn::tcp::TcpAcceptor; use salvo::http::header::{self, HeaderValue}; use salvo::http::ResBody; diff --git a/frameworks/Rust/salvo/src/main_pg_pool.rs b/frameworks/Rust/salvo/src/main_pg_pool.rs index f72f1c64a09..1e5d6c0b6ec 100644 --- a/frameworks/Rust/salvo/src/main_pg_pool.rs +++ b/frameworks/Rust/salvo/src/main_pg_pool.rs @@ -11,7 +11,7 @@ use std::thread::available_parallelism; use anyhow::Error; use bytes::Bytes; use deadpool_postgres::Pool; -use dotenv::dotenv; +use dotenvy::dotenv; use futures_util::{stream::FuturesUnordered, TryStreamExt}; use once_cell::sync::OnceCell; use rand::rngs::SmallRng; diff --git a/frameworks/Rust/salvo/src/main_sqlx.rs b/frameworks/Rust/salvo/src/main_sqlx.rs index 6fc8f72c922..ca52a8e6b61 100644 --- a/frameworks/Rust/salvo/src/main_sqlx.rs +++ b/frameworks/Rust/salvo/src/main_sqlx.rs @@ -9,7 +9,7 @@ use std::thread::available_parallelism; use anyhow::Error; use bytes::Bytes; -use dotenv::dotenv; +use dotenvy::dotenv; use once_cell::sync::OnceCell; use rand::rngs::SmallRng; use rand::{Rng, SeedableRng}; From 761127ae7ad0a0648b39af7ed6e8f5ad75f2272c Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 10 Dec 2024 01:25:00 +0100 Subject: [PATCH 0959/1766] [java] hserver and hserver-business.dockerfile quiet option [ci skip] (#9455) * Update hserver-business.dockerfile quiet option * Update hserver.dockerfile quiet [ci skip] --- frameworks/Java/hserver-business/hserver-business.dockerfile | 2 +- frameworks/Java/hserver/hserver.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/hserver-business/hserver-business.dockerfile b/frameworks/Java/hserver-business/hserver-business.dockerfile index da3207049f6..d58e8b83ffa 100644 --- a/frameworks/Java/hserver-business/hserver-business.dockerfile +++ b/frameworks/Java/hserver-business/hserver-business.dockerfile @@ -2,7 +2,7 @@ FROM maven:3.6.1-jdk-11-slim as maven WORKDIR /hserver-business COPY pom.xml pom.xml COPY src src -RUN mvn package +RUN mvn package --quiet FROM openjdk:11.0.3-jdk-slim WORKDIR /hserver-business diff --git a/frameworks/Java/hserver/hserver.dockerfile b/frameworks/Java/hserver/hserver.dockerfile index 4f9bb7649b9..67095536752 100644 --- a/frameworks/Java/hserver/hserver.dockerfile +++ b/frameworks/Java/hserver/hserver.dockerfile @@ -2,7 +2,7 @@ FROM maven:3.6.1-jdk-11-slim as maven WORKDIR /hserver COPY pom.xml pom.xml COPY src src -RUN mvn package +RUN mvn package --quiet FROM openjdk:11.0.3-jdk-slim WORKDIR /hserver From 347909d05534494cf91d53002d8d97f0b290ec1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:19:39 +0000 Subject: [PATCH 0960/1766] Bump golang.org/x/crypto in /frameworks/Go/fiber/src Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.27.0 to 0.31.0. - [Commits](https://github.com/golang/crypto/compare/v0.27.0...v0.31.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/fiber/src/go.mod | 8 ++++---- frameworks/Go/fiber/src/go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index 36e65622cc4..30a1e290884 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -23,8 +23,8 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.55.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.27.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 62741e5425b..dd7b67f4e56 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -44,16 +44,16 @@ github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdq github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 9847c501c248c72ca19270ad94b925fd62d090b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:25:35 +0000 Subject: [PATCH 0961/1766] Bump cookie and hyper-express in /frameworks/JavaScript/hyperexpress Bumps [cookie](https://github.com/jshttp/cookie) to 1.0.2 and updates ancestor dependency [hyper-express](https://github.com/kartikk221/hyper-express). These dependencies need to be updated together. Updates `cookie` from 0.4.2 to 1.0.2 - [Release notes](https://github.com/jshttp/cookie/releases) - [Commits](https://github.com/jshttp/cookie/compare/v0.4.2...v1.0.2) Updates `hyper-express` from 6.8.5 to 6.17.3 - [Release notes](https://github.com/kartikk221/hyper-express/releases) - [Commits](https://github.com/kartikk221/hyper-express/compare/6.8.5...6.17.3) --- updated-dependencies: - dependency-name: cookie dependency-type: indirect - dependency-name: hyper-express dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../JavaScript/hyperexpress/package-lock.json | 275 +++--------------- .../JavaScript/hyperexpress/package.json | 2 +- 2 files changed, 34 insertions(+), 243 deletions(-) diff --git a/frameworks/JavaScript/hyperexpress/package-lock.json b/frameworks/JavaScript/hyperexpress/package-lock.json index cbaea996902..7e4af63b97f 100644 --- a/frameworks/JavaScript/hyperexpress/package-lock.json +++ b/frameworks/JavaScript/hyperexpress/package-lock.json @@ -9,120 +9,17 @@ "version": "0.0.1", "license": "MIT", "dependencies": { - "hyper-express": "^6.8.5", + "hyper-express": "^6.17.3", "lru-cache": "^10.0.1", "mariadb": "^3.2.0", "postgres": "^3.3.5" } }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/busboy": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-0.3.2.tgz", - "integrity": "sha512-iEvdm9Z9KdSs/ozuh1Z7ZsXrOl8F4M/CLMXPZHr3QuJ4d6Bjn+HBMC5EMKpwpAo8oi8iK9GZfFoHaIMrrZgwVw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "16.18.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", - "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -135,11 +32,11 @@ } }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "engines": { - "node": ">= 0.6" + "node": ">=18" } }, "node_modules/cookie-signature": { @@ -159,22 +56,19 @@ } }, "node_modules/hyper-express": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/hyper-express/-/hyper-express-6.8.5.tgz", - "integrity": "sha512-tlHCGg0xKRHRheqY3Fgb8FvuvluCqIf6tJXiiyadsQh108g/givMqKt0XBYV+Rw0vstmmROuJ3cHXiUkQoddgg==", + "version": "6.17.3", + "resolved": "https://registry.npmjs.org/hyper-express/-/hyper-express-6.17.3.tgz", + "integrity": "sha512-fNFrRVEAIqjADtAq2F5wFRBlpo3G63QgK9PsNklsKLpM2S3fNlFaojafv926mlEW+C4zZ1VI8Tm5PCJOaIWJMQ==", "dependencies": { - "@types/busboy": "^0.3.1", - "@types/express": "^4.17.13", - "@types/node": "^16.11.6", - "accepts": "^1.3.7", - "busboy": "^1.0.0", - "cookie": "^0.4.1", - "cookie-signature": "^1.1.0", - "mime-types": "^2.1.33", + "busboy": "^1.6.0", + "cookie": "^1.0.1", + "cookie-signature": "^1.2.1", + "mime-types": "^2.1.35", + "negotiator": "^1.0.0", "range-parser": "^1.2.1", "type-is": "^1.6.18", "typed-emitter": "^2.1.0", - "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.31.0" + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.51.0" } }, "node_modules/iconv-lite": { @@ -252,9 +146,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "engines": { "node": ">= 0.6" } @@ -330,111 +224,11 @@ } }, "dependencies": { - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/busboy": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-0.3.2.tgz", - "integrity": "sha512-iEvdm9Z9KdSs/ozuh1Z7ZsXrOl8F4M/CLMXPZHr3QuJ4d6Bjn+HBMC5EMKpwpAo8oi8iK9GZfFoHaIMrrZgwVw==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, - "@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "16.18.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", - "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -444,9 +238,9 @@ } }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" }, "cookie-signature": { "version": "1.2.1", @@ -459,22 +253,19 @@ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "hyper-express": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/hyper-express/-/hyper-express-6.8.5.tgz", - "integrity": "sha512-tlHCGg0xKRHRheqY3Fgb8FvuvluCqIf6tJXiiyadsQh108g/givMqKt0XBYV+Rw0vstmmROuJ3cHXiUkQoddgg==", + "version": "6.17.3", + "resolved": "https://registry.npmjs.org/hyper-express/-/hyper-express-6.17.3.tgz", + "integrity": "sha512-fNFrRVEAIqjADtAq2F5wFRBlpo3G63QgK9PsNklsKLpM2S3fNlFaojafv926mlEW+C4zZ1VI8Tm5PCJOaIWJMQ==", "requires": { - "@types/busboy": "^0.3.1", - "@types/express": "^4.17.13", - "@types/node": "^16.11.6", - "accepts": "^1.3.7", - "busboy": "^1.0.0", - "cookie": "^0.4.1", - "cookie-signature": "^1.1.0", - "mime-types": "^2.1.33", + "busboy": "^1.6.0", + "cookie": "^1.0.1", + "cookie-signature": "^1.2.1", + "mime-types": "^2.1.35", + "negotiator": "^1.0.0", "range-parser": "^1.2.1", "type-is": "^1.6.18", "typed-emitter": "^2.1.0", - "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.31.0" + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.51.0" } }, "iconv-lite": { @@ -533,9 +324,9 @@ } }, "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" }, "postgres": { "version": "3.3.5", @@ -591,7 +382,7 @@ }, "uWebSockets.js": { "version": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#e6ecc2102d68d99dc35969b0898fbd201e0f252b", - "from": "uWebSockets.js@github:uNetworking/uWebSockets.js#v20.31.0" + "from": "uWebSockets.js@github:uNetworking/uWebSockets.js#v20.51.0" } } } diff --git a/frameworks/JavaScript/hyperexpress/package.json b/frameworks/JavaScript/hyperexpress/package.json index ba3cacbd893..a2500fe07a5 100644 --- a/frameworks/JavaScript/hyperexpress/package.json +++ b/frameworks/JavaScript/hyperexpress/package.json @@ -8,7 +8,7 @@ "author": "", "license": "MIT", "dependencies": { - "hyper-express": "^6.8.5", + "hyper-express": "^6.17.3", "lru-cache": "^10.0.1", "mariadb": "^3.2.0", "postgres": "^3.3.5" From 6bc92fd9921c6e1e069e13a14bcb38be42da6148 Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Fri, 13 Dec 2024 03:28:25 +0200 Subject: [PATCH 0962/1766] [mORMot] - mORmot@2.3.9138 + refactoring (#9457) * [mORMot] - mORmot@2.3.9138 + refactoring * [mORMot] - fixed regression for async tests --------- Co-authored-by: pavel.mash --- .../Pascal/mormot/benchmark_config.json | 22 --- frameworks/Pascal/mormot/setup_and_build.sh | 4 +- frameworks/Pascal/mormot/src/raw.pas | 169 ++++++++---------- 3 files changed, 80 insertions(+), 115 deletions(-) diff --git a/frameworks/Pascal/mormot/benchmark_config.json b/frameworks/Pascal/mormot/benchmark_config.json index def2b2c2b17..378b0a6d9a0 100644 --- a/frameworks/Pascal/mormot/benchmark_config.json +++ b/frameworks/Pascal/mormot/benchmark_config.json @@ -71,28 +71,6 @@ "display_name": "mormot [async]", "notes": "", "versus": "None" - }, - "postgres-async2": { - "dockerfile": "mormot.dockerfile", - "db_url": "/asyncdb", - "query_url": "/asyncqueries?queries=", - "fortune_url": "/asyncfortunes", - "update_url": "/asyncupdates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "postgres", - "framework": "mormot", - "language": "Pascal", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "mormot [async,nopin]", - "notes": "", - "versus": "None" } } ] diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 62bd68746f8..c19884f9e1b 100755 --- a/frameworks/Pascal/mormot/setup_and_build.sh +++ b/frameworks/Pascal/mormot/setup_and_build.sh @@ -35,8 +35,8 @@ 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/6dc09ceca456931384857b383ed61b63f11f3be7 -URL="https://api.github.com/repos/synopse/mORMot2/tarball/$USED_TAG" +URL=https://github.com/synopse/mORMot2/tarball/2017bddac17a838c9584763e4bd7538aa6f8a529 +#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 fa53c7fd038..1f24df7173d 100644 --- a/frameworks/Pascal/mormot/src/raw.pas +++ b/frameworks/Pascal/mormot/src/raw.pas @@ -85,14 +85,14 @@ TRawAsyncServer = class(TSynPersistent) fModel: TOrmModel; fStore: TRestServerDB; fTemplate: TSynMustache; - fCachedWorldsTable: POrmCacheTable; + fOrmCache: POrmCacheTable; fRawCache: TOrmWorlds; fDbPool: TSqlDBPostgresConnectionProperties; - procedure OnAsyncDb(Statement: TSqlDBPostgresAsyncStatement; Context: TObject); - procedure OnAsyncFortunes(Statement: TSqlDBPostgresAsyncStatement; Context: TObject); + procedure OnAsyncDb(Statement: TSqlDBPostgresAsyncStatement; Context: PtrInt); + procedure OnAsyncFortunes(Statement: TSqlDBPostgresAsyncStatement; Context: PtrInt); // pipelined reading as used by /rawqueries and /rawupdates function GetRawRandomWorlds(cnt: PtrInt; out res: TWorlds): boolean; - function ComputeRawFortunes(stmt: TSqlDBStatement; ctxt: THttpServerRequest): integer; + function ComputeRawFortunes(stmt: TSqlDBStatement): RawUtf8; public constructor Create(threadCount: integer; flags: THttpServerOptions; pin2Core: integer); reintroduce; @@ -170,7 +170,7 @@ constructor TRawAsyncServer.Create( inherited Create; fDbPool := TSqlDBPostgresConnectionProperties.Create( 'tfb-database:5432', 'hello_world', 'benchmarkdbuser', 'benchmarkdbpass'); - fDbPool.ArrayParamsAsBinary := true; + // fDbPool.ArrayParamsAsBinary := true; // seems not really faster // customize JSON serialization for TFB expectations TOrmWorld.OrmProps.Fields.JsonRenameProperties([ 'ID', 'id', @@ -188,10 +188,10 @@ constructor TRawAsyncServer.Create( fStore := TRestServerDB.Create(fModel, SQLITE_MEMORY_DATABASE_NAME); fStore.NoAjaxJson := true; fStore.Server.CreateMissingTables; // create SQlite3 virtual tables - // pre-fill the ORM + // ORM and raw caches warmup if fStore.Server.Cache.SetCache(TOrmCachedWorld) then fStore.Server.Cache.FillFromQuery(TOrmCachedWorld, '', []); - fCachedWorldsTable := fStore.Orm.Cache.Table(TOrmCachedWorld); + fOrmCache := fStore.Orm.Cache.Table(TOrmCachedWorld); fStore.Orm.RetrieveListObjArray(fRawCache, TOrmCachedWorld, 'order by id', []); // initialize the mustache template for /fortunes fTemplate := TSynMustache.Parse(FORTUNES_TPL); @@ -277,8 +277,7 @@ function FortuneCompareByMessage(const A, B): integer; result := StrComp(pointer(TFortune(A).message), pointer(TFortune(B).message)); end; -function TRawAsyncServer.ComputeRawFortunes( - stmt: TSqlDBStatement; ctxt: THttpServerRequest): integer; +function TRawAsyncServer.ComputeRawFortunes(stmt: TSqlDBStatement): RawUtf8; var list: TFortunes; arr: TDynArray; @@ -286,7 +285,7 @@ function TRawAsyncServer.ComputeRawFortunes( f: ^TFortune; mus: TSynMustacheContextData; begin - result := HTTP_BADREQUEST; + result := ''; if stmt = nil then exit; arr.Init(TypeInfo(TFortunes), list, @n); @@ -303,9 +302,7 @@ function TRawAsyncServer.ComputeRawFortunes( mus := stmt.Connection.GetThreadOwned(TSynMustacheContextData); if mus = nil then mus := stmt.Connection.SetThreadOwned(fTemplate.NewMustacheContextData); - ctxt.OutContent := mus.RenderArray(arr); - ctxt.OutContentType := HTML_CONTENT_TYPE; - result := HTTP_SUCCESS; + result := mus.RenderArray(arr); end; // following methods implement the server endpoints @@ -363,7 +360,7 @@ function TRawAsyncServer.cached_queries(ctxt: THttpServerRequest): cardinal; SetLength(res, GetQueriesParamValue(ctxt, 'COUNT=')); gen := Lecuyer; for i := 0 to length(res) - 1 do - res[i] := fCachedWorldsTable.Get(ComputeRandomWorld(gen)); + res[i] := fOrmCache.Get(ComputeRandomWorld(gen)); ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); result := HTTP_SUCCESS; end; @@ -479,7 +476,9 @@ function TRawAsyncServer.rawfortunes(ctxt: THttpServerRequest): cardinal; conn := fDbPool.ThreadSafeConnection; stmt := conn.NewStatementPrepared(FORTUNES_SQL, true, true); stmt.ExecutePrepared; - result := ComputeRawFortunes(stmt.Instance, ctxt); + ctxt.OutContent := ComputeRawFortunes(stmt.Instance); + ctxt.OutContentType := HTML_CONTENT_TYPE; + result := HTTP_SUCCESS; end; var @@ -519,7 +518,7 @@ function TRawAsyncServer.rawupdates(ctxt: THttpServerRequest): cardinal; var cnt, i: PtrInt; res: TWorlds; - ids, nums: TInt64DynArray; + params: TInt64DynArray; gen: PLecuyer; conn: TSqlDBConnection; stmt: ISqlDBStatement; @@ -536,16 +535,14 @@ function TRawAsyncServer.rawupdates(ctxt: THttpServerRequest): cardinal; if cnt > 20 then begin // fill parameters arrays for update with nested select (PostgreSQL only) - setLength(ids{%H-}, cnt); - setLength(nums{%H-}, cnt); - for i := 0 to cnt - 1 do - begin - ids[i] := res[i].id; - nums[i] := res[i].randomNumber; - end; stmt := conn.NewStatementPrepared(WORLD_UPDATE_SQLN, false, true); - stmt.BindArray(1, ids); - stmt.BindArray(2, nums); + SetLength(params{%H-}, cnt); + for i := 0 to cnt - 1 do + params[i] := res[i].id; + stmt.BindArray(1, params); + for i := 0 to cnt - 1 do + params[i] := res[i].randomNumber; + stmt.BindArray(2, params); end else begin @@ -573,47 +570,43 @@ function TRawAsyncServer.asyncdb(ctxt: THttpServerRequest): cardinal; with fDbPool.Async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT) do try Bind(1, ComputeRandomWorld(Lecuyer)); - ExecuteAsync(ctxt, OnAsyncDb); + ExecuteAsync(ctxt.AsyncHandle, OnAsyncDb); finally UnLock; end; - result := ctxt.SetAsyncResponse; + result := HTTP_ASYNCRESPONSE; end; procedure TRawAsyncServer.OnAsyncDb(Statement: TSqlDBPostgresAsyncStatement; - Context: TObject); -var - ctxt: THttpServerRequest absolute Context; + Context: PtrInt); begin if (Statement = nil) or not Statement.Step then - ctxt.ErrorMessage := 'asyncdb failed' + fHttpServer.AsyncResponseError(Context, 'asyncdb failed') else - ctxt.SetOutJson('{"id":%,"randomNumber":%}', + fHttpServer.AsyncResponseFmt(Context, '{"id":%,"randomNumber":%}', [Statement.ColumnInt(0), Statement.ColumnInt(1)]); - ctxt.OnAsyncResponse(ctxt); end; function TRawAsyncServer.asyncfortunes(ctxt: THttpServerRequest): cardinal; begin fDbPool.Async.PrepareLocked(FORTUNES_SQL, {res=}true, ASYNC_OPT). - ExecuteAsyncNoParam(ctxt, OnAsyncFortunes); - result := ctxt.SetAsyncResponse; + ExecuteAsyncNoParam(ctxt.AsyncHandle, OnAsyncFortunes); + result := HTTP_ASYNCRESPONSE; end; procedure TRawAsyncServer.OnAsyncFortunes(Statement: TSqlDBPostgresAsyncStatement; - Context: TObject); -var - ctxt: THttpServerRequest absolute Context; + Context: PtrInt); begin - ctxt.OnAsyncResponse(ctxt, ComputeRawFortunes(Statement, ctxt)); + fHttpServer.AsyncResponse(Context, ComputeRawFortunes(Statement), HTML_CONTENT_TYPE); end; type // simple state machine used for /asyncqueries and /asyncupdates TAsyncWorld = class public - request: THttpServerRequest; + http: THttpAsyncServer; + connection: TConnectionAsyncHandle; res: TWorlds; count, current: integer; update: TSqlDBPostgresAsyncStatement; // prepared before any callback @@ -621,8 +614,8 @@ TAsyncWorld = class function Queries(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal; function Updates(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal; procedure DoUpdates; - procedure OnQueries(Statement: TSqlDBPostgresAsyncStatement; Context: TObject); - procedure OnRes({%H-}Statement: TSqlDBPostgresAsyncStatement; Context: TObject); + procedure OnQueries(Statement: TSqlDBPostgresAsyncStatement; Context: PtrInt); + procedure OnRes({%H-}Statement: TSqlDBPostgresAsyncStatement; Context: PtrInt); end; function TRawAsyncServer.asyncqueries(ctxt: THttpServerRequest): cardinal; @@ -645,7 +638,8 @@ function TAsyncWorld.Queries(server: TRawAsyncServer; ctxt: THttpServerRequest): gen: PLecuyer; select: TSqlDBPostgresAsyncStatement; begin - request := ctxt; + http := server.fHttpServer; + connection := ctxt.AsyncHandle; if async = nil then async := server.fDbPool.Async; if count = 0 then @@ -656,26 +650,26 @@ function TAsyncWorld.Queries(server: TRawAsyncServer; ctxt: THttpServerRequest): n := count; gen := Lecuyer; repeat - dec(n); select.Bind(1, ComputeRandomWorld(gen)); + dec(n); if n = 0 then // last item should include asoForceConnectionFlush (if set) opt := ASYNC_OPT; - select.ExecuteAsync(ctxt, OnQueries, @opt); + select.ExecuteAsync(connection, OnQueries, @opt); until n = 0; select.UnLock; - result := ctxt.SetAsyncResponse; + result := HTTP_ASYNCRESPONSE; end; function TAsyncWorld.Updates(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal; begin async := server.fDbPool.Async; count := getQueriesParamValue(ctxt); - update := async.Prepare(WORLD_UPDATE_SQLN, false, ASYNC_OPT); - result := Queries(server, ctxt); + update := async.Prepare(WORLD_UPDATE_SQLN, false, ASYNC_OPT); // to trigger DoUpdates + result := Queries(server, ctxt); // will set http and connection fields end; procedure TAsyncWorld.OnQueries(Statement: TSqlDBPostgresAsyncStatement; - Context: TObject); + Context: PtrInt); begin if (Statement <> nil) and Statement.Step then @@ -708,14 +702,13 @@ procedure TAsyncWorld.DoUpdates; for i := 0 to count - 1 do params[i] := res[i].randomNumber; update.BindArrayInt32(2, params); - update.ExecuteAsync(request, OnRes); + update.ExecuteAsync(connection, OnRes); end; procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; - Context: TObject); + Context: PtrInt); begin - request.SetOutJson(@res, TypeInfo(TWorlds)); - request.OnAsyncResponse(Context as THttpServerRequest); + http.AsyncResponseJson(Context, @res, TypeInfo(TWorlds)); Free; // we don't need this state machine any more end; @@ -733,6 +726,9 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; TSynLog.Family.HighResolutionTimestamp := true; TSynLog.Family.PerThreadLog := ptIdentifiedInOneFile; TSynLog.Family.AutoFlushTimeOut := 1; + TSynLog.Family.RotateFileCount := 10; + TSynLog.Family.RotateFileSizeKB := 500000; + LogCompressAlgo := nil; // keep 10 x 512MB uncompressed files {$else} SynDBLog := nil; // slightly faster: no need to check log level {$endif WITH_LOGS} @@ -745,27 +741,20 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; // compute default execution context from HW information cpuCount := CurrentCpuSet(cpuMask); // may run from a "taskset" command - if cpuCount >= 6 then + if GetEnvironmentVariable('TFB_TEST_NAME') = 'mormot-postgres-async' then + begin + // asynchronous tests do not require several listeners + servers := 1; + threads := cpucount * 4; + pinServers2Cores := false; + end + else if cpuCount >= 6 then begin // high-end CPU would scale better using several listeners (one per core) // see https://synopse.info/forum/viewtopic.php?pid=39263#p39263 servers := cpuCount; threads := 8; pinServers2Cores := true; - if GetEnvironmentVariable('TFB_TEST_NAME') = 'mormot-postgres-async' then - begin - // asynchronus test - servers := cpuCount; - threads := 8; - end - else - if GetEnvironmentVariable('TFB_TEST_NAME') = 'mormot-postgres-async2' then - begin - // asynchronus test with single listener socket and no CPU pinning - servers := 1; - threads := cpuCount * 4; - pinServers2Cores := false; - end; end else begin @@ -778,13 +767,12 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; // parse command line parameters with Executable.Command do begin - ExeDescription := 'TFB Server using mORMot 2'; - if Option(['p', 'pin'], 'pin each server to a CPU') then + if Option('&pin', 'pin each server to a CPU') then pinServers2Cores := true; if Option('nopin', 'disable the CPU pinning') then pinServers2Cores := false; // no option would keep the default boolean - Get(['s', 'servers'], servers, '#count of servers (listener sockets)', servers); - Get(['t', 'threads'], threads, 'per-server thread pool #size', threads); + Get('&servers', servers, '#count of servers (listener sockets)', servers); + Get('&threads', threads, 'per-server thread pool #size', threads); if ConsoleHelpFailed('TFB Server using mORMot 2') then exit; end; @@ -809,42 +797,41 @@ procedure TAsyncWorld.OnRes(Statement: TSqlDBPostgresAsyncStatement; if GetBit(cpuMask, cpuIdx) then dec(k); until k = -1; - writeln('Pin #', i, ' server to #', cpuIdx, ' CPU'); + ConsoleWrite(['Pin #', i, ' server to #', cpuIdx, ' CPU']); end; rawServers[i] := TRawAsyncServer.Create(threads, flags, cpuIdx) end; try // display some information and wait for SIGTERM - writeln; - writeln(rawServers[0].fHttpServer.ClassName, - ' running on localhost:', rawServers[0].fHttpServer.SockPort); - writeln(' num servers=', servers, - ', threads per server=', threads, - ', total threads=', threads * servers, - ', total CPU=', SystemInfo.dwNumberOfProcessors, - ', accessible CPU=', cpuCount, - ', pinned=', pinServers2Cores, - ', db=', rawServers[0].fDbPool.DbmsEngineName); - writeln(' options=', GetSetName(TypeInfo(THttpServerOptions), flags)); - writeln('Press [Enter] or Ctrl+C or send SIGTERM to terminate'); + ConsoleWrite([CRLF, rawServers[0].fHttpServer.ClassName, + ' running on localhost:', rawServers[0].fHttpServer.SockPort], ccWhite); + ConsoleWrite([' num servers=', servers, + ', threads per server=', threads, + ', total threads=', threads * servers, + ', total CPU=', SystemInfo.dwNumberOfProcessors, + ', accessible CPU=', cpuCount, + ', pinned=', pinServers2Cores, + ', db=', rawServers[0].fDbPool.DbmsEngineName, CRLF, + ' options=', GetSetName(TypeInfo(THttpServerOptions), flags), CRLF]); + ConsoleWrite('Press [Enter] or Ctrl+C or send SIGTERM to terminate', ccWhite); ConsoleWaitForEnterKey; //TSynLog.Family.Level := LOG_VERBOSE; // enable shutdown logs for debug if servers = 1 then - writeln(ObjectToJsonDebug(rawServers[0].fHttpServer)) + ConsoleObject(rawServers[0].fHttpServer) else begin - writeln('Per-server accepted connections:'); + ConsoleWrite('Per-server accepted connections:'); for i := 0 to servers - 1 do - write(' ', rawServers[i].fHttpServer.Async.Accepted); - writeln(#10'Please wait: Shutdown ', servers, ' servers and ', - threads * servers, ' threads'); + ConsoleWrite([' ', rawServers[i].fHttpServer.Async.Accepted], ccLightGray, true); + ConsoleWrite([#10'Please wait: Shutdown ', servers, ' servers and ', + threads * servers, ' threads']); end; finally // clear all server instance(s) ObjArrayClear(rawServers); end; - write('Shutdown complete'#10); + ConsoleWrite('Shutdown complete'#10); {$ifdef FPC_X64MM} WriteHeapStatus(' ', 16, 8, {compileflags=}true); {$endif FPC_X64MM} From 4056dc9e72a564763d0ce889b38de3b5aa689653 Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Thu, 12 Dec 2024 17:29:03 -0800 Subject: [PATCH 0963/1766] [F#/Oxpecker] Returned back command auto-prepare (#9454) --- frameworks/FSharp/oxpecker/src/App/Common.fs | 4 ++-- frameworks/FSharp/oxpecker/src/App/Db.fs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/frameworks/FSharp/oxpecker/src/App/Common.fs b/frameworks/FSharp/oxpecker/src/App/Common.fs index 8d21c46aa64..d8b3e407d74 100644 --- a/frameworks/FSharp/oxpecker/src/App/Common.fs +++ b/frameworks/FSharp/oxpecker/src/App/Common.fs @@ -26,9 +26,9 @@ module Common = } [] - let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false" + let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4" [] - let MultiplexedConnectionString = ConnectionString + ";Max Auto Prepare=3;Multiplexing=true" + let MultiplexedConnectionString = ConnectionString + ";Multiplexing=true" let FortuneComparer = { new IComparer with diff --git a/frameworks/FSharp/oxpecker/src/App/Db.fs b/frameworks/FSharp/oxpecker/src/App/Db.fs index 532695a0335..e4466dc08c8 100644 --- a/frameworks/FSharp/oxpecker/src/App/Db.fs +++ b/frameworks/FSharp/oxpecker/src/App/Db.fs @@ -14,7 +14,6 @@ module Db = use db = new NpgsqlConnection(ConnectionString) use cmd = db.CreateCommand(CommandText = "SELECT id, message FROM fortune") do! db.OpenAsync() - do! cmd.PrepareAsync() use! rdr = cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection) while! rdr.ReadAsync() do result.Add { id = rdr.GetInt32(0); message = rdr.GetString(1) } @@ -46,7 +45,6 @@ module Db = let struct(cmd', _) = createReadCommand db use cmd = cmd' do! db.OpenAsync() - do! cmd.PrepareAsync() return! readSingleRow cmd } From f786fb570f0fe054fd446f3603b45ef719536c90 Mon Sep 17 00:00:00 2001 From: Dragos Varovici Date: Thu, 12 Dec 2024 18:29:35 -0700 Subject: [PATCH 0964/1766] Httpz improvements (#9452) --- frameworks/Zig/httpz/run.sh | 2 +- frameworks/Zig/httpz/src/main.zig | 109 ++++++++++++++++++++++++++++-- frameworks/Zig/httpz/src/pool.zig | 2 +- 3 files changed, 106 insertions(+), 7 deletions(-) diff --git a/frameworks/Zig/httpz/run.sh b/frameworks/Zig/httpz/run.sh index 582c2ad0228..a849756041d 100644 --- a/frameworks/Zig/httpz/run.sh +++ b/frameworks/Zig/httpz/run.sh @@ -1,3 +1,3 @@ echo "Waiting for Httpz framework to start..." -httpz \ No newline at end of file +httpz 3000 \ No newline at end of file diff --git a/frameworks/Zig/httpz/src/main.zig b/frameworks/Zig/httpz/src/main.zig index 3775a27339a..ed37e709d25 100644 --- a/frameworks/Zig/httpz/src/main.zig +++ b/frameworks/Zig/httpz/src/main.zig @@ -31,10 +31,109 @@ pub fn main() !void { .prng = &prng, }; - server = try httpz.ServerApp(*endpoints.Global).init(allocator, .{ .port = 3000, .address = "0.0.0.0", .workers = .{ - .count = @truncate(cpu_count), - .max_conn = 4096, - }, .thread_pool = .{ .count = @truncate(cpu_count * 2) } }, &global); + var httpz_port: []u8 = undefined; + var arg_string = try std.fmt.allocPrint(allocator, "{s}", .{"0"}); + defer allocator.free(arg_string); + + var args = try std.process.argsWithAllocator(allocator); + defer args.deinit(); + while (args.next()) |arg| { + arg_string = try std.fmt.allocPrint(allocator, "{s}", .{arg}); + + httpz_port = arg_string; // use arg + } + + var port = try std.fmt.parseInt(u16,httpz_port, 0); + + if (port == 0) { + port = 3000; + } + + const workers = @as(u16, @intCast(16 * cpu_count)); + + server = try httpz.ServerApp(*endpoints.Global).init(allocator, .{ + .port = port, + .address = "0.0.0.0", + .workers = .{ + // Number of worker threads + // (blocking mode: handled differently) + .count = workers, + + // Maximum number of concurrent connection each worker can handle + // (blocking mode: currently ignored) + .max_conn = 8_192, + + // Minimum number of connection states each worker should maintain + // (blocking mode: currently ignored) + .min_conn = 64, + + // A pool of larger buffers that can be used for any data larger than configured + // static buffers. For example, if response headers don't fit in in + // $response.header_buffer_size, a buffer will be pulled from here. + // This is per-worker. + .large_buffer_count = 16, + + // The size of each large buffer. + .large_buffer_size = 65536, + + // Size of bytes retained for the connection arena between use. This will + // result in up to `count * min_conn * retain_allocated_bytes` of memory usage. + .retain_allocated_bytes = 4096, + }, + + // configures the threadpool which processes requests. The threadpool is + // where your application code runs. + .thread_pool = .{ + // Number threads. If you're handlers are doing a lot of i/o, a higher + // number might provide better throughput + // (blocking mode: handled differently) + .count = 256, + + // The maximum number of pending requests that the thread pool will accept + // This applies back pressure to the above workers and ensures that, under load + // pending requests get precedence over processing new requests. + .backlog = 2048, + + // Size of the static buffer to give each thread. Memory usage will be + // `count * buffer_size`. If you're making heavy use of either `req.arena` or + // `res.arena`, this is likely the single easiest way to gain performance. + .buffer_size = 8192, + }, + .request = .{ + // Maximum request body size that we'll process. We can allocate up + // to this much memory per request for the body. Internally, we might + // keep this memory around for a number of requests as an optimization. + .max_body_size = 1_048_576, + + // This memory is allocated upfront. The request header _must_ fit into + // this space, else the request will be rejected. + .buffer_size = 4_096, + + // Maximum number of headers to accept. + // Additional headers will be silently ignored. + .max_header_count = 32, + + // Maximum number of URL parameters to accept. + // Additional parameters will be silently ignored. + .max_param_count = 10, + + // Maximum number of query string parameters to accept. + // Additional parameters will be silently ignored. + .max_query_count = 32, + + // Maximum number of x-www-form-urlencoded fields to support. + // Additional parameters will be silently ignored. This must be + // set to a value greater than 0 (the default) if you're going + // to use the req.formData() method. + .max_form_count = 0, + + // Maximum number of multipart/form-data fields to support. + // Additional parameters will be silently ignored. This must be + // set to a value greater than 0 (the default) if you're going + // to use the req.multiFormData() method. + .max_multiform_count = 0, + }, + }, &global); defer server.deinit(); // now that our server is up, we register our intent to handle SIGINT @@ -50,7 +149,7 @@ pub fn main() !void { router.get("/db", endpoints.db); router.get("/fortunes", endpoints.fortune); - std.debug.print("Httpz listening at 0.0.0.0:{d}\n", .{3000}); + std.debug.print("Httpz using {d} workers listening at 0.0.0.0:{d}\n", .{ workers, port }); try server.listen(); } diff --git a/frameworks/Zig/httpz/src/pool.zig b/frameworks/Zig/httpz/src/pool.zig index c41cb329540..91867be7906 100644 --- a/frameworks/Zig/httpz/src/pool.zig +++ b/frameworks/Zig/httpz/src/pool.zig @@ -11,7 +11,7 @@ pub fn initPool(allocator: Allocator) !*pg.Pool { //std.debug.print("Connection: {s}:{s}@{s}:{d}/{s}\n", .{ info.username, info.password, info.hostname, info.port, info.database }); const pg_pool = try Pool.init(allocator, .{ - .size = 28, + .size = 56, .connect = .{ .port = info.port, .host = info.hostname, From f749c9fa3732909aca7ad8217d529b8e05f742b0 Mon Sep 17 00:00:00 2001 From: Pho3niX90 Date: Fri, 13 Dec 2024 03:31:21 +0200 Subject: [PATCH 0965/1766] feat: add ultimate express (#9390) * feat: add ultimate express * feat: add ultimate express * refactor(express): simplify response handling by removing writeResponse helper - removed writeResponse function and headerTypes constant for direct header and response handling - refactored routes to set headers and send responses inline, making code more declarative - improved readability and reduced abstraction in response handling for each route * fix: unique display names * fix: names * fix: add db/query/update/fortune urls * fix: missing orm value * fixes * fixes * fixes * full refactor * fix etag and disable x-powered-by * generate json dynamically * fix space * use fjs --------- Co-authored-by: dimden <26517362+dimdenGD@users.noreply.github.com> --- .../JavaScript/ultimate-express/README.md | 60 ++ frameworks/JavaScript/ultimate-express/app.js | 157 ++++ .../ultimate-express/benchmark_config.json | 70 ++ .../JavaScript/ultimate-express/clustered.js | 15 + .../JavaScript/ultimate-express/config.js | 8 + .../ultimate-express/database/mysql.js | 15 + .../ultimate-express/database/postgres.js | 14 + .../ultimate-express/package-lock.json | 766 ++++++++++++++++++ .../JavaScript/ultimate-express/package.json | 18 + .../ultimate-express-mysql.dockerfile | 18 + .../ultimate-express-postgres.dockerfile | 18 + .../ultimate-express.dockerfile | 16 + 12 files changed, 1175 insertions(+) create mode 100644 frameworks/JavaScript/ultimate-express/README.md create mode 100755 frameworks/JavaScript/ultimate-express/app.js create mode 100644 frameworks/JavaScript/ultimate-express/benchmark_config.json create mode 100644 frameworks/JavaScript/ultimate-express/clustered.js create mode 100644 frameworks/JavaScript/ultimate-express/config.js create mode 100644 frameworks/JavaScript/ultimate-express/database/mysql.js create mode 100644 frameworks/JavaScript/ultimate-express/database/postgres.js create mode 100644 frameworks/JavaScript/ultimate-express/package-lock.json create mode 100644 frameworks/JavaScript/ultimate-express/package.json create mode 100644 frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile create mode 100644 frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile create mode 100644 frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile diff --git a/frameworks/JavaScript/ultimate-express/README.md b/frameworks/JavaScript/ultimate-express/README.md new file mode 100644 index 00000000000..5580806833d --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/README.md @@ -0,0 +1,60 @@ +# UltimateExpress Benchmarking Test + +The Ultimate Express. Fastest http server with full Express compatibility, based on [µWebSockets](https://github.com/uNetworking/uWebSockets.js). + +## Important Libraries + +The tests were run with: + +- [ultimate-express](https://github.com/dimdenGD/ultimate-express) +- [postgres](https://github.com/porsager/postgres) +- [mariadb](https://github.com/mariadb-corporation/mariadb-connector-nodejs) +- [lru-cache](https://github.com/isaacs/node-lru-cache) + +## Database + +There are individual handlers for each DB approach. The logic for each of them are found here: + +- [Postgres](database/postgres.js) +- [MySQL](database/mysql.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 +$ DATABASE=mysql 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/queries?queries=2 +$ curl localhost:8080/queries?queries=0 +$ curl localhost:8080/queries?queries=foo +$ curl localhost:8080/queries?queries=501 +$ curl localhost:8080/queries?queries= + +$ curl localhost:8080/updates?queries=2 +$ curl localhost:8080/updates?queries=0 +$ curl localhost:8080/updates?queries=foo +$ curl localhost:8080/updates?queries=501 +$ curl localhost:8080/updates?queries= + +$ curl localhost:8080/cached-worlds?count=2 +$ curl localhost:8080/cached-worlds?count=0 +$ curl localhost:8080/cached-worlds?count=foo +$ curl localhost:8080/cached-worlds?count=501 +$ curl localhost:8080/cached-worlds?count= +``` diff --git a/frameworks/JavaScript/ultimate-express/app.js b/frameworks/JavaScript/ultimate-express/app.js new file mode 100755 index 00000000000..1914abf8d17 --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/app.js @@ -0,0 +1,157 @@ +import express from 'ultimate-express'; +import { LRUCache } from 'lru-cache'; +import cluster, { isWorker } from 'node:cluster'; +import { maxQuery, maxRows } from './config.js'; +import fjs from 'fast-json-stringify'; + +const { DATABASE } = process.env; +const db = DATABASE ? await import(`./database/${DATABASE}.js`) : null; + +const jsonSerializer = fjs({ + type: 'object', + properties: { + message: { + type: 'string', + format: 'unsafe', + } + } +}); + +const generateRandomNumber = () => Math.floor(Math.random() * maxRows) + 1; + +const parseQueries = (i) => Math.min(parseInt(i) || 1, maxQuery); + +const escapeHTMLRules = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/' }; + +const unsafeHTMLMatcher = /[&<>"'\/]/g; + +const escapeHTMLCode = (text) => unsafeHTMLMatcher.test(text) ? text.replace(unsafeHTMLMatcher, function (m) { return escapeHTMLRules[m] || m; }) : text; + +const cache = new LRUCache({ + max: maxRows +}); + +const app = express(); +app.set("etag", false); +app.set("x-powered-by", false); + +app.get('/plaintext', (req, res) => { + res.setHeader('Server', 'UltimateExpress'); + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello, World!'); +}); + +app.get('/json', (req, res) => { + res.setHeader('Server', 'UltimateExpress'); + res.setHeader('Content-Type', 'application/json'); + res.end(jsonSerializer({ message: "Hello, World!" })); +}); + +if (db) { + app.get('/db', async (req, res) => { + res.setHeader('Server', 'UltimateExpress'); + + try { + const world = await db.find(generateRandomNumber()); + res.json(world); + } catch (error) { + throw error; + } + }); + + app.get('/queries', async (req, res) => { + res.setHeader('Server', 'UltimateExpress'); + + try { + const queries = parseQueries(req.query.queries); + const worldPromises = new Array(queries); + + for (let i = 0; i < queries; i++) { + worldPromises[i] = db.find(generateRandomNumber()); + } + + const worlds = await Promise.all(worldPromises); + + res.json(worlds); + } catch (error) { + throw error; + } + }) + + app.get('/updates', async (req, res) => { + res.setHeader('Server', 'UltimateExpress'); + + try { + const queries = parseQueries(req.query.queries); + const worldPromises = new Array(queries); + + for (let i = 0; i < queries; i++) { + worldPromises[i] = db.find(generateRandomNumber()); + } + + const worlds = await Promise.all(worldPromises); + + for (let i = 0; i < queries; i++) { + worlds[i].randomNumber = generateRandomNumber(); + } + + await db.bulkUpdate(worlds); + + res.json(worlds); + } catch (error) { + throw error; + } + }) + + app.get('/fortunes', async (req, res) => { + res.setHeader('Server', 'UltimateExpress'); + + try { + const fortunes = await db.fortunes() + + fortunes.push({ id: 0, message: 'Additional fortune added at request time.' }); + + fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1); + + const n = fortunes.length + + let i = 0, html = '' + for (; i < n; i++) html += `${fortunes[i].id}${escapeHTMLCode(fortunes[i].message)}` + + res + .header('Content-Type', 'text/html; charset=utf-8') + .end(`Fortunes${html}
      idmessage
      `); + } catch (error) { + throw error; + } + }) + + let isCachePopulated = false + app.get('/cached-worlds', async (req, res) => { + res.setHeader('Server', 'UltimateExpress'); + + try { + if (!isCachePopulated) { + const worlds = await db.getAllWorlds(); + for (let i = 0; i < worlds.length; i++) { + cache.set(worlds[i].id, worlds[i]); + } + isCachePopulated = true; + } + const count = parseQueries(req.query.count); + const worlds = new Array(count); + + for (let i = 0; i < count; i++) { + worlds[i] = cache.get(generateRandomNumber()); + } + + res.json(worlds); + } catch (error) { + throw error; + } + }); +} + +app.listen(8080, () => { + console.log(`${isWorker ? `${cluster.worker.id}: ` : ''}Successfully bound to http://0.0.0.0:8080`); +}); \ No newline at end of file diff --git a/frameworks/JavaScript/ultimate-express/benchmark_config.json b/frameworks/JavaScript/ultimate-express/benchmark_config.json new file mode 100644 index 00000000000..c477aa24007 --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/benchmark_config.json @@ -0,0 +1,70 @@ +{ + "framework": "ultimate-express", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "ultimate-express", + "language": "JavaScript", + "flavor": "None", + "orm": "Raw", + "platform": "NodeJS", + "webserver": "µws", + "os": "Linux", + "database_os": "Linux", + "display_name": "ultimate-express", + "notes": "", + "versus": "nodejs" + }, + "postgres": { + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "cached_query_url": "/cached-worlds?count=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "ultimate-express", + "language": "JavaScript", + "flavor": "None", + "orm": "Raw", + "platform": "NodeJS", + "webserver": "µws", + "os": "Linux", + "database_os": "Linux", + "display_name": "ultimate-express-postgres", + "notes": "", + "versus": "nodejs" + }, + "mysql": { + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "cached_query_url": "/cached-worlds?count=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "MySQL", + "framework": "ultimate-express", + "language": "JavaScript", + "flavor": "None", + "orm": "Raw", + "platform": "NodeJS", + "webserver": "µws", + "os": "Linux", + "database_os": "Linux", + "display_name": "ultimate-express-mysql", + "notes": "", + "versus": "nodejs" + } + } + ] +} diff --git a/frameworks/JavaScript/ultimate-express/clustered.js b/frameworks/JavaScript/ultimate-express/clustered.js new file mode 100644 index 00000000000..6bf96c8a57f --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/clustered.js @@ -0,0 +1,15 @@ +import cluster, { isPrimary, setupPrimary, fork } from 'node:cluster' +import { cpus } from 'node:os' + +if (isPrimary) { + setupPrimary({ + exec: 'app.js', + }) + cluster.on('exit', (worker) => { + console.log(`worker ${worker.process.pid} died`) + process.exit(1) + }) + for (let i = 0; i < cpus().length; i++) { + fork() + } +} \ No newline at end of file diff --git a/frameworks/JavaScript/ultimate-express/config.js b/frameworks/JavaScript/ultimate-express/config.js new file mode 100644 index 00000000000..b85d510b405 --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/config.js @@ -0,0 +1,8 @@ +export const maxQuery = 500 +export const maxRows = 10000 +export const clientOpts = { + host: 'tfb-database', + user: 'benchmarkdbuser', + password: 'benchmarkdbpass', + database: 'hello_world', +} \ No newline at end of file diff --git a/frameworks/JavaScript/ultimate-express/database/mysql.js b/frameworks/JavaScript/ultimate-express/database/mysql.js new file mode 100644 index 00000000000..5e7949997e7 --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/database/mysql.js @@ -0,0 +1,15 @@ +import { createPool } from 'mariadb' +import { cpus } from 'node:os' +import { clientOpts } from '../config.js' + +const pool = createPool({ ...clientOpts, connectionLimit: cpus().length }) + +const execute = (text, values) => pool.execute(text, values || undefined) + +export const fortunes = () => execute('SELECT id, message FROM fortune') + +export const find = (id) => execute('SELECT id, randomNumber FROM world WHERE id = ?', [id]).then(arr => arr[0]) + +export const getAllWorlds = () => execute('SELECT id, randomNumber FROM world') + +export const bulkUpdate = (worlds) => pool.batch('UPDATE world SET randomNumber = ? WHERE id = ?', worlds.map(world => [world.randomNumber, world.id]).sort((a, b) => (a[1] < b[1]) ? -1 : 1)) \ No newline at end of file diff --git a/frameworks/JavaScript/ultimate-express/database/postgres.js b/frameworks/JavaScript/ultimate-express/database/postgres.js new file mode 100644 index 00000000000..5bfad8e13ad --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/database/postgres.js @@ -0,0 +1,14 @@ +import postgres from 'postgres' +import { clientOpts } from '../config.js' + +const sql = postgres({ ...clientOpts, max: 1 }) + +export const fortunes = async () => sql`SELECT id, message FROM fortune` + +export const find = async (id) => sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then((arr) => arr[0]) + +export const getAllWorlds = async () => sql`SELECT id, randomNumber FROM world` + +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`; \ No newline at end of file diff --git a/frameworks/JavaScript/ultimate-express/package-lock.json b/frameworks/JavaScript/ultimate-express/package-lock.json new file mode 100644 index 00000000000..f8bd80e2dd1 --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/package-lock.json @@ -0,0 +1,766 @@ +{ + "name": "ultimate-express", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ultimate-express", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^6.0.0", + "lru-cache": "^10.0.1", + "mariadb": "^3.2.0", + "postgres": "^3.3.5", + "ultimate-express": "^1.3.9" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cookie": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.1.tgz", + "integrity": "sha512-Xd8lFX4LM9QEEwxQpF9J9NTUh8pmdJO0cyRJhFiDoLTk2eH8FXlRv2IFGYVadZpqI3j8fhNrSdKCeYPxiAhLXw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.0.tgz", + "integrity": "sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==", + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.1", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.3.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "license": "MIT" + }, + "node_modules/fast-zlib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-zlib/-/fast-zlib-2.0.1.tgz", + "integrity": "sha512-DCoYgNagM2Bt1VIpXpdGnRx4LzqJeYG0oh6Nf/7cWo6elTXkFGMw9CrRCYYUIapYNrozYMoyDRflx9mgT3Awyw==", + "license": "MIT", + "funding": { + "type": "patreon", + "url": "https://patreon.com/timotejroiko" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/mariadb": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.0.tgz", + "integrity": "sha512-hdRPcAzs+MTxK5VG1thBW18gGTlw6yWBe9YnLB65GLo7q0fO5DWsgomIevV/pXSaWRmD3qi6ka4oSFRTExRiEQ==", + "license": "LGPL-2.1-or-later", + "dependencies": { + "@types/geojson": "^7946.0.14", + "@types/node": "^22.5.4", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.3.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postgres": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.5.tgz", + "integrity": "sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==", + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tseep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tseep/-/tseep-1.3.1.tgz", + "integrity": "sha512-ZPtfk1tQnZVyr7BPtbJ93qaAh2lZuIOpTMjhrYa4XctT8xe7t4SAW9LIxrySDuYMsfNNayE51E/WNGrNVgVicQ==", + "license": "MIT" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ultimate-express": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/ultimate-express/-/ultimate-express-1.3.9.tgz", + "integrity": "sha512-jr4TMDsQM2nlG/1VMkesy70kTLIVecUeX8dzkh0JoSQ2wilhUaVbCM3I6qvKCNHD+UsYXI6QFhgKmSum1k19hw==", + "license": "Apache-2.0", + "dependencies": { + "@types/express": "^4.0.0", + "accepts": "^1.3.8", + "acorn": "^8.12.1", + "bytes": "^3.1.2", + "cookie": "^1.0.1", + "cookie-signature": "^1.2.1", + "encodeurl": "^2.0.0", + "etag": "^1.8.1", + "fast-querystring": "^1.1.2", + "fast-zlib": "^2.0.1", + "fresh": "^0.5.2", + "mime-types": "^2.1.35", + "ms": "^2.1.3", + "proxy-addr": "^2.0.7", + "qs": "^6.13.0", + "range-parser": "^1.2.1", + "statuses": "^2.0.1", + "tseep": "^1.2.2", + "type-is": "^1.6.18", + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.49.0", + "vary": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/uWebSockets.js": { + "version": "20.49.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#442087c0a01bf146acb7386910739ec81df06700", + "license": "Apache-2.0" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/frameworks/JavaScript/ultimate-express/package.json b/frameworks/JavaScript/ultimate-express/package.json new file mode 100644 index 00000000000..552f0bbf287 --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/package.json @@ -0,0 +1,18 @@ +{ + "name": "ultimate-express", + "version": "0.0.1", + "main": "app.js", + "scripts": { + "start": "node clustered.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^6.0.0", + "lru-cache": "^10.0.1", + "mariadb": "^3.2.0", + "postgres": "^3.3.5", + "ultimate-express": "^1.3.9" + }, + "type": "module" +} diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile new file mode 100644 index 00000000000..30c2079f2ab --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile @@ -0,0 +1,18 @@ +# syntax=docker/dockerfile:1 +FROM node:20-slim + +WORKDIR /app + +COPY --chown=node:node . . + +ENV NODE_ENV production + +RUN npm install + +ENV DATABASE mysql + +USER node + +EXPOSE 8080 + +CMD ["node", "clustered.js"] \ No newline at end of file diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile new file mode 100644 index 00000000000..ebf6591a379 --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile @@ -0,0 +1,18 @@ +# syntax=docker/dockerfile:1 +FROM node:20-slim + +WORKDIR /app + +COPY --chown=node:node . . + +ENV NODE_ENV production + +RUN npm install + +ENV DATABASE postgres + +USER node + +EXPOSE 8080 + +CMD ["node", "clustered.js"] \ No newline at end of file diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile new file mode 100644 index 00000000000..3defb8423fb --- /dev/null +++ b/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile @@ -0,0 +1,16 @@ +# syntax=docker/dockerfile:1 +FROM node:20-slim + +WORKDIR /app + +COPY --chown=node:node . . + +ENV NODE_ENV production + +RUN npm install + +USER node + +EXPOSE 8080 + +CMD ["node", "clustered.js"] \ No newline at end of file From 6778dbc4c3a7bcd0c79a700a90b5dc1722dbe446 Mon Sep 17 00:00:00 2001 From: Kayden <143221653+Kayden1412@users.noreply.github.com> Date: Tue, 17 Dec 2024 01:46:14 +0700 Subject: [PATCH 0966/1766] httpz improvements (#9462) --- frameworks/Zig/httpz/src/endpoints.zig | 4 +-- frameworks/Zig/httpz/src/main.zig | 36 +++++++------------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/frameworks/Zig/httpz/src/endpoints.zig b/frameworks/Zig/httpz/src/endpoints.zig index 97d18c822be..a0f4476dab6 100644 --- a/frameworks/Zig/httpz/src/endpoints.zig +++ b/frameworks/Zig/httpz/src/endpoints.zig @@ -10,7 +10,7 @@ const template = "Fortunes 1) try std.fmt.parseInt(u16, args[1], 0) else 3000; const workers = @as(u16, @intCast(16 * cpu_count)); @@ -100,7 +84,7 @@ pub fn main() !void { .buffer_size = 8192, }, .request = .{ - // Maximum request body size that we'll process. We can allocate up + // Maximum request body size that we'll process. We can allocate up // to this much memory per request for the body. Internally, we might // keep this memory around for a number of requests as an optimization. .max_body_size = 1_048_576, @@ -109,17 +93,17 @@ pub fn main() !void { // this space, else the request will be rejected. .buffer_size = 4_096, - // Maximum number of headers to accept. + // Maximum number of headers to accept. // Additional headers will be silently ignored. .max_header_count = 32, // Maximum number of URL parameters to accept. // Additional parameters will be silently ignored. - .max_param_count = 10, + .max_param_count = 0, // Maximum number of query string parameters to accept. // Additional parameters will be silently ignored. - .max_query_count = 32, + .max_query_count = 0, // Maximum number of x-www-form-urlencoded fields to support. // Additional parameters will be silently ignored. This must be @@ -132,7 +116,7 @@ pub fn main() !void { // set to a value greater than 0 (the default) if you're going // to use the req.multiFormData() method. .max_multiform_count = 0, - }, + }, }, &global); defer server.deinit(); From ce782ff78ce8b610f41e6ab92f6a7e5a5b529e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=81=D1=82=D1=8F=20=D0=A2=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8F=D0=BA?= Date: Mon, 16 Dec 2024 20:47:31 +0200 Subject: [PATCH 0967/1766] chore(JavaScript): removed obsolete benchmarks for "node-chakracore". (#9461) --- .../JavaScript/express/benchmark_config.json | 16 ---------------- frameworks/JavaScript/express/config.toml | 11 ----------- .../JavaScript/express/express-chakra.dockerfile | 11 ----------- 3 files changed, 38 deletions(-) delete mode 100644 frameworks/JavaScript/express/express-chakra.dockerfile diff --git a/frameworks/JavaScript/express/benchmark_config.json b/frameworks/JavaScript/express/benchmark_config.json index 0c8a91678cc..9f04d0dd56e 100644 --- a/frameworks/JavaScript/express/benchmark_config.json +++ b/frameworks/JavaScript/express/benchmark_config.json @@ -17,22 +17,6 @@ "display_name": "express", "versus": "nodejs" }, - "chakra": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "framework": "express", - "language": "JavaScript", - "flavor": "node-chakracore", - "platform": "nodejs", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "express", - "versus": "nodejs" - }, "mongodb": { "db_url": "/mongoose", "query_url": "/mongooseq?queries=", diff --git a/frameworks/JavaScript/express/config.toml b/frameworks/JavaScript/express/config.toml index d5c8a111c67..a18c6244628 100644 --- a/frameworks/JavaScript/express/config.toml +++ b/frameworks/JavaScript/express/config.toml @@ -56,14 +56,3 @@ orm = "Full" platform = "nodejs" webserver = "None" versus = "nodejs" - -[chakra] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database_os = "Linux" -os = "Linux" -platform = "nodejs" -webserver = "None" -versus = "nodejs" diff --git a/frameworks/JavaScript/express/express-chakra.dockerfile b/frameworks/JavaScript/express/express-chakra.dockerfile deleted file mode 100644 index ec726dd2800..00000000000 --- a/frameworks/JavaScript/express/express-chakra.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM node:20.16-slim - -COPY ./ ./ - -RUN npm install - -ENV NODE_ENV production - -EXPOSE 8080 - -CMD ["node", "app.js"] From bdd37c180812ab224944b1485d0ed65112e19b03 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Tue, 17 Dec 2024 13:16:35 -0500 Subject: [PATCH 0968/1766] Update Ubuntu version for Ur/Web (#9463) * Baseline Ur/Web configuration now works building the Ur/Web compiler and runtime from source * Update Ur/Web MySQL baseline * Get current version of Ur/Web cached queries unbroken (and tag myself as maintainer) * For Ur/Web caching tests, switch to building Ur/Web from source * Update Ubuntu version for Ur/Web * Change Ur/Web's Ubuntu version to latest LTS --- frameworks/Ur/urweb/README.md | 2 -- frameworks/Ur/urweb/urweb-cache.dockerfile | 2 +- frameworks/Ur/urweb/urweb-mysql-cache.dockerfile | 2 +- frameworks/Ur/urweb/urweb-mysql.dockerfile | 2 +- frameworks/Ur/urweb/urweb.dockerfile | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frameworks/Ur/urweb/README.md b/frameworks/Ur/urweb/README.md index e529333fe96..534c52cbc18 100644 --- a/frameworks/Ur/urweb/README.md +++ b/frameworks/Ur/urweb/README.md @@ -19,5 +19,3 @@ To compile a standalone executable running on port 8080, run `urweb bench`. See `bench.ur` is the main source file. `bench.urs` is the signature file describing the module's exported functions. `bench.urp` is the project file giving compilation directives. `benchmark_config.json` includes metadata for the framework comparison. - -`__init__.py` and `setup.py` are for starting and stopping the Ur/Web server. `setup_mysql.py` is a variant using MySQL instead of PostgreSQL. diff --git a/frameworks/Ur/urweb/urweb-cache.dockerfile b/frameworks/Ur/urweb/urweb-cache.dockerfile index 69bfbafd60e..f4acd21176c 100644 --- a/frameworks/Ur/urweb/urweb-cache.dockerfile +++ b/frameworks/Ur/urweb/urweb-cache.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:23.10 +FROM ubuntu:24.04 ADD ./ /urweb WORKDIR /urweb diff --git a/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile b/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile index 4bec91de9d8..2a21638a218 100644 --- a/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile +++ b/frameworks/Ur/urweb/urweb-mysql-cache.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:23.10 +FROM ubuntu:24.04 ADD ./ /urweb WORKDIR /urweb diff --git a/frameworks/Ur/urweb/urweb-mysql.dockerfile b/frameworks/Ur/urweb/urweb-mysql.dockerfile index bee66b290b0..3559a0ce988 100644 --- a/frameworks/Ur/urweb/urweb-mysql.dockerfile +++ b/frameworks/Ur/urweb/urweb-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:23.10 +FROM ubuntu:24.04 ADD ./ /urweb WORKDIR /urweb diff --git a/frameworks/Ur/urweb/urweb.dockerfile b/frameworks/Ur/urweb/urweb.dockerfile index 6bbba474104..8976e26a1c6 100644 --- a/frameworks/Ur/urweb/urweb.dockerfile +++ b/frameworks/Ur/urweb/urweb.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:23.10 +FROM ubuntu:24.04 ADD ./ /urweb WORKDIR /urweb From 01a72bb351f58b41374132ecd72f604660469087 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 17 Dec 2024 19:16:58 +0100 Subject: [PATCH 0969/1766] [toolset] Mongodb update to v8 (#9453) * [php] Flight update to PHP 8.4 #9408 * [toolset] Update Mongodb to v8 --- 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 4fe163b8070..11480684535 100644 --- a/toolset/databases/mongodb/mongodb.dockerfile +++ b/toolset/databases/mongodb/mongodb.dockerfile @@ -1,4 +1,4 @@ -FROM mongo:7.0 +FROM mongo:8.0 ENV MONGO_INITDB_DATABASE=hello_world From 491de7311f566e20be5f112833379945a3377ff6 Mon Sep 17 00:00:00 2001 From: Damian Edwards Date: Tue, 17 Dec 2024 10:17:15 -0800 Subject: [PATCH 0970/1766] Update aspnetcore Platform to use latest Razor Slices (#9464) * Update aspnetcore Platform to use latest Razor Slices This allows enabling native AOT too * Update README.md * Update ChunkedPipeWriter.cs * Update Npgsql & seal classes * Update ChunkedPipeWriter.cs --- frameworks/CSharp/aspnetcore/README.md | 2 +- .../CSharp/aspnetcore/benchmark_config.json | 1 + .../aspnetcore/src/Minimal/Minimal.csproj | 2 +- .../CSharp/aspnetcore/src/Mvc/Mvc.csproj | 4 +- .../Platform/BenchmarkApplication.Caching.cs | 2 +- .../Platform/BenchmarkApplication.Fortunes.cs | 15 +++---- .../BenchmarkApplication.HttpConnection.cs | 8 ++-- .../src/Platform/BenchmarkApplication.Json.cs | 2 +- .../BenchmarkApplication.MultipleQueries.cs | 2 +- .../BenchmarkApplication.Plaintext.cs | 2 +- .../BenchmarkApplication.SingleQuery.cs | 2 +- .../Platform/BenchmarkApplication.Updates.cs | 2 +- .../src/Platform/BenchmarkApplication.cs | 19 +++----- ...edBufferWriter.cs => ChunkedPipeWriter.cs} | 43 +++++++++++++++---- .../aspnetcore/src/Platform/Platform.csproj | 8 +--- 15 files changed, 66 insertions(+), 48 deletions(-) rename frameworks/CSharp/aspnetcore/src/Platform/{ChunkedBufferWriter.cs => ChunkedPipeWriter.cs} (85%) diff --git a/frameworks/CSharp/aspnetcore/README.md b/frameworks/CSharp/aspnetcore/README.md index 2e0ddeab3b4..00092de375d 100644 --- a/frameworks/CSharp/aspnetcore/README.md +++ b/frameworks/CSharp/aspnetcore/README.md @@ -6,5 +6,5 @@ See [.NET Core](http://dot.net) and [ASP.NET Core](https://github.com/dotnet/asp **Language** -* C# 8.0 +* C# 13.0 diff --git a/frameworks/CSharp/aspnetcore/benchmark_config.json b/frameworks/CSharp/aspnetcore/benchmark_config.json index 426f94ea5f7..831a9f27d81 100644 --- a/frameworks/CSharp/aspnetcore/benchmark_config.json +++ b/frameworks/CSharp/aspnetcore/benchmark_config.json @@ -30,6 +30,7 @@ "json_url": "/json", "db_url": "/db", "query_url": "/queries/", + "fortune_url": "/fortunes", "update_url": "/updates/", "cached_query_url": "/cached-worlds/", "port": 8080, diff --git a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj index 01ed70de876..12f3446d8b7 100644 --- a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj +++ b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj @@ -9,7 +9,7 @@ - + diff --git a/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj b/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj index 83105ed34be..68c70002683 100644 --- a/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj +++ b/frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Caching.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Caching.cs index eb5fff0199e..a99586c96e2 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Caching.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Caching.cs @@ -6,7 +6,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication +public sealed partial class BenchmarkApplication { private static async Task Caching(PipeWriter pipeWriter, int count) { diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs index 52a0939559c..0279754a128 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs @@ -1,7 +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; using System.IO.Pipelines; using System.Runtime.CompilerServices; using System.Threading.Tasks; @@ -9,7 +9,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication +public sealed partial class BenchmarkApplication { private async Task FortunesRaw(PipeWriter pipeWriter) { @@ -19,7 +19,7 @@ await RawDb.LoadFortunesRows(), FortunesTemplateFactory); } - private ValueTask OutputFortunes(PipeWriter pipeWriter, TModel model, SliceFactory templateFactory) + private ValueTask OutputFortunes(PipeWriter pipeWriter, TModel model, Func> templateFactory) { // Render headers var preamble = """ @@ -39,7 +39,7 @@ private ValueTask OutputFortunes(PipeWriter pipeWriter, TModel model, Sl // Kestrel PipeWriter span size is 4K, headers above already written to first span & template output is ~1350 bytes, // so 2K chunk size should result in only a single span and chunk being used. var chunkedWriter = GetChunkedWriter(pipeWriter, chunkSizeHint: 2048); - var renderTask = template.RenderAsync(chunkedWriter, null, HtmlEncoder); + var renderTask = template.RenderAsync(chunkedWriter, HtmlEncoder); if (renderTask.IsCompletedSuccessfully) { @@ -51,18 +51,17 @@ private ValueTask OutputFortunes(PipeWriter pipeWriter, TModel model, Sl return AwaitTemplateRenderTask(renderTask, chunkedWriter, template); } - private static async ValueTask AwaitTemplateRenderTask(ValueTask renderTask, ChunkedBufferWriter chunkedWriter, RazorSlice template) + private static async ValueTask AwaitTemplateRenderTask(ValueTask renderTask, ChunkedPipeWriter chunkedWriter, RazorSlice template) { await renderTask; EndTemplateRendering(chunkedWriter, template); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void EndTemplateRendering(ChunkedBufferWriter chunkedWriter, RazorSlice template) + private static void EndTemplateRendering(ChunkedPipeWriter chunkedWriter, RazorSlice template) { - chunkedWriter.End(); + chunkedWriter.Complete(); ReturnChunkedWriter(chunkedWriter); template.Dispose(); } } -#endif diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.HttpConnection.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.HttpConnection.cs index cbd375cb61b..892ecc48457 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.HttpConnection.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.HttpConnection.cs @@ -12,7 +12,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication : IHttpConnection +public sealed partial class BenchmarkApplication : IHttpConnection { private State _state; @@ -193,15 +193,15 @@ private static BufferWriter GetWriter(PipeWriter pipeWriter, int => new(new(pipeWriter), sizeHint); [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static ChunkedBufferWriter GetChunkedWriter(PipeWriter pipeWriter, int chunkSizeHint) + private static ChunkedPipeWriter GetChunkedWriter(PipeWriter pipeWriter, int chunkSizeHint) { var writer = ChunkedWriterPool.Get(); - writer.SetOutput(new WriterAdapter(pipeWriter), chunkSizeHint); + writer.SetOutput(pipeWriter, chunkSizeHint); return writer; } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void ReturnChunkedWriter(ChunkedBufferWriter writer) => ChunkedWriterPool.Return(writer); + private static void ReturnChunkedWriter(ChunkedPipeWriter writer) => ChunkedWriterPool.Return(writer); private struct WriterAdapter : IBufferWriter { diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Json.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Json.cs index 5babe2b61eb..dbfea6b0454 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Json.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Json.cs @@ -9,7 +9,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication +public sealed partial class BenchmarkApplication { private readonly static uint _jsonPayloadSize = (uint)JsonSerializer.SerializeToUtf8Bytes( new JsonMessage { message = "Hello, World!" }, diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.MultipleQueries.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.MultipleQueries.cs index 0541e20de1f..82ea5a4a8a2 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.MultipleQueries.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.MultipleQueries.cs @@ -8,7 +8,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication +public sealed partial class BenchmarkApplication { private static async Task MultipleQueries(PipeWriter pipeWriter, int count) { diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Plaintext.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Plaintext.cs index 6e4c4eec1c8..57c90e64e92 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Plaintext.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Plaintext.cs @@ -7,7 +7,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication +public sealed partial class BenchmarkApplication { private static ReadOnlySpan _plaintextPreamble => "HTTP/1.1 200 OK\r\n"u8 + diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.SingleQuery.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.SingleQuery.cs index 350eb43ad13..dd8add86fab 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.SingleQuery.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.SingleQuery.cs @@ -7,7 +7,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication +public sealed partial class BenchmarkApplication { private static async Task SingleQuery(PipeWriter pipeWriter) { diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Updates.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Updates.cs index 6962aa0cf2c..66bfdba1858 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Updates.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Updates.cs @@ -7,7 +7,7 @@ namespace PlatformBenchmarks; -public partial class BenchmarkApplication +public sealed partial class BenchmarkApplication { private static async Task Updates(PipeWriter pipeWriter, int count) { diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs index e256e958c75..2db511586a3 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs @@ -10,9 +10,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http; using Microsoft.Extensions.ObjectPool; -#if !AOT +using Platform.Templates; using RazorSlices; -#endif namespace PlatformBenchmarks { @@ -42,26 +41,24 @@ public sealed partial class BenchmarkApplication public static RawDb RawDb { get; set; } - private static readonly DefaultObjectPool> ChunkedWriterPool + private static readonly DefaultObjectPool ChunkedWriterPool = new(new ChunkedWriterObjectPolicy()); - private sealed class ChunkedWriterObjectPolicy : IPooledObjectPolicy> + private sealed class ChunkedWriterObjectPolicy : IPooledObjectPolicy { - public ChunkedBufferWriter Create() => new(); + public ChunkedPipeWriter Create() => new(); - public bool Return(ChunkedBufferWriter writer) + public bool Return(ChunkedPipeWriter writer) { writer.Reset(); return true; } } -#if !AOT #if NPGSQL - private readonly static SliceFactory> FortunesTemplateFactory = RazorSlice.ResolveSliceFactory>("/Templates/FortunesUtf8.cshtml"); + private readonly static Func, RazorSlice>> FortunesTemplateFactory = FortunesUtf8.Create; #else - private readonly static SliceFactory> FortunesTemplateFactory = RazorSlice.ResolveSliceFactory>("/Templates/FortunesUtf16.cshtml"); -#endif + private readonly static Func, RazorSlice>> FortunesTemplateFactory = FortunesUtf16.Create; #endif [ThreadStatic] @@ -167,9 +164,7 @@ 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/ChunkedBufferWriter.cs b/frameworks/CSharp/aspnetcore/src/Platform/ChunkedPipeWriter.cs similarity index 85% rename from frameworks/CSharp/aspnetcore/src/Platform/ChunkedBufferWriter.cs rename to frameworks/CSharp/aspnetcore/src/Platform/ChunkedPipeWriter.cs index 700519edb58..5a1dd80c678 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/ChunkedBufferWriter.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/ChunkedPipeWriter.cs @@ -5,35 +5,40 @@ using System.Buffers; using System.Buffers.Text; using System.Diagnostics; +using System.IO.Pipelines; using System.Numerics; using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; namespace PlatformBenchmarks; -internal sealed class ChunkedBufferWriter : IBufferWriter where TWriter : IBufferWriter +internal sealed class ChunkedPipeWriter : PipeWriter { private const int DefaultChunkSizeHint = 2048; private static readonly StandardFormat DefaultHexFormat = GetHexFormat(DefaultChunkSizeHint); private static ReadOnlySpan ChunkTerminator => "\r\n"u8; - private TWriter _output; + private PipeWriter _output; private int _chunkSizeHint; private StandardFormat _hexFormat = DefaultHexFormat; private Memory _currentFullChunk; private Memory _currentChunk; private int _buffered; + private long _unflushedBytes; private bool _ended = false; public Memory Memory => _currentChunk; - public TWriter Output => _output; + public PipeWriter Output => _output; public int Buffered => _buffered; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void SetOutput(TWriter output, int chunkSizeHint = DefaultChunkSizeHint) + public void SetOutput(PipeWriter output, int chunkSizeHint = DefaultChunkSizeHint) { _buffered = 0; + _unflushedBytes = 0; _chunkSizeHint = chunkSizeHint; _output = output; @@ -44,6 +49,7 @@ public void SetOutput(TWriter output, int chunkSizeHint = DefaultChunkSizeHint) public void Reset() { _buffered = 0; + _unflushedBytes = 0; _output = default; _ended = false; _hexFormat = DefaultHexFormat; @@ -51,16 +57,21 @@ public void Reset() _currentChunk = default; } + public override bool CanGetUnflushedBytes => true; + + public override long UnflushedBytes => _unflushedBytes; + [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Advance(int count) + public override void Advance(int count) { ThrowIfEnded(); _buffered += count; + _unflushedBytes += count; _currentChunk = _currentChunk[count..]; } - public Memory GetMemory(int sizeHint = 0) + public override Memory GetMemory(int sizeHint = 0) { ThrowIfEnded(); @@ -71,9 +82,14 @@ public Memory GetMemory(int sizeHint = 0) return _currentChunk; } - public Span GetSpan(int sizeHint = 0) => GetMemory(sizeHint).Span; + public override Span GetSpan(int sizeHint = 0) => GetMemory(sizeHint).Span; + + public override void CancelPendingFlush() + { + _output.CancelPendingFlush(); + } - public void End() + public override void Complete(Exception exception = null) { ThrowIfEnded(); @@ -82,6 +98,17 @@ public void End() _ended = true; } + public override ValueTask FlushAsync(CancellationToken cancellationToken = default) + { + CommitCurrentChunk(isFinal: false); + + var flushTask = _output.FlushAsync(cancellationToken); + + _unflushedBytes = 0; + + return flushTask; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static StandardFormat GetHexFormat(int maxValue) { diff --git a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj index fa716bda4c7..7db51dc3ec7 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj +++ b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj @@ -6,7 +6,6 @@ true preview 38063504-d08c-495a-89c9-daaad2f60f31 - AOT;$(DefineConstants) @@ -19,15 +18,12 @@ - + - + - - $(MSBuildThisFileDirectory)Templates/**;$(DefaultItemExcludes) - From a18e7379198b5fee98c5e0a6e644d3efedb5fed3 Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Wed, 18 Dec 2024 02:17:30 +0800 Subject: [PATCH 0971/1766] update php and swoole version (#9465) --- frameworks/PHP/swoole/swoole-async-mysql.dockerfile | 10 +++++----- frameworks/PHP/swoole/swoole-async-postgres.dockerfile | 10 +++++----- frameworks/PHP/swoole/swoole-sync-mysql.dockerfile | 10 +++++----- frameworks/PHP/swoole/swoole-sync-postgres.dockerfile | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index 786f80c88cd..494b15844d3 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.5 +ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 1 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql @@ -11,22 +11,22 @@ 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 libbrotli-dev php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \ + && apt install libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-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 -j "$(nproc)" > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini + && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini WORKDIR /swoole ADD ./swoole-server.php /swoole ADD ./database.php /swoole -COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY 10-opcache.ini /etc/php/8.4/cli/conf.d/10-opcache.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 b658f569f0e..7050668fe56 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.5 +ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 1 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER pgsql @@ -11,22 +11,22 @@ 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 libbrotli-dev php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \ + && apt install libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-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 -j "$(nproc)" > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini + && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini WORKDIR /swoole ADD ./swoole-server.php /swoole ADD ./database.php /swoole -COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY 10-opcache.ini /etc/php/8.4/cli/conf.d/10-opcache.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 86304d151fc..a97871cea8c 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.5 +ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 0 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql @@ -11,22 +11,22 @@ 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 libbrotli-dev php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \ + && apt install libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-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 -j "$(nproc)" > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini + && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini WORKDIR /swoole ADD ./swoole-server.php /swoole ADD ./database.php /swoole -COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY 10-opcache.ini /etc/php/8.4/cli/conf.d/10-opcache.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 8054b66912b..e45b90683df 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 5.1.5 +ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 0 ENV CPU_MULTIPLES 4 ENV DATABASE_DRIVER pgsql @@ -11,22 +11,22 @@ 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 libbrotli-dev php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \ + && apt install libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-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 -j "$(nproc)" > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.3/cli/php.ini + && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini WORKDIR /swoole ADD ./swoole-server.php /swoole ADD ./database.php /swoole -COPY 10-opcache.ini /etc/php/8.3/cli/conf.d/10-opcache.ini +COPY 10-opcache.ini /etc/php/8.4/cli/conf.d/10-opcache.ini EXPOSE 8080 CMD php /swoole/swoole-server.php From 36a565afbc8d3b6c8fd7e6b774f05dc98e004074 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 17 Dec 2024 19:17:43 +0100 Subject: [PATCH 0972/1766] [ruby/rack] Don't use async_thread_pool (#9466) Not using async_thread_pool seems faster: +-------------------------+---------+------+------+-----+-----+-------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|weighted_score| +-------------------------+---------+------+------+-----+-----+-------+--------------+ | master| 101265| 13921|113730|33371|24701| 28719| 1794| |disable-async-thread-pool| 102381| 13441|126911|40248|28379| 43834| 1928| --- frameworks/Ruby/rack/pg_db.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/frameworks/Ruby/rack/pg_db.rb b/frameworks/Ruby/rack/pg_db.rb index e8c8634c60c..0851ee2acfe 100644 --- a/frameworks/Ruby/rack/pg_db.rb +++ b/frameworks/Ruby/rack/pg_db.rb @@ -19,11 +19,7 @@ class PgDb def initialize(connection_string = nil, max_connections = 512) @connection = Sequel.connect(connection_string, max_connections: max_connections, sql_log_level: :warning) - if defined?(Falcon) - Sequel.extension :fiber_concurrency if defined?(Falcon) - else - @connection.extension :async_thread_pool - end + Sequel.extension :fiber_concurrency if defined?(Falcon) prepare_statements end From 98ebe4d250073eb85efddf9d1a84fd433c3a0129 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Fri, 20 Dec 2024 21:31:26 +0100 Subject: [PATCH 0973/1766] [Python] Bump Granian to 1.7 (#9469) --- frameworks/Python/granian/granian-rsgi.dockerfile | 2 +- frameworks/Python/granian/granian-wrk.dockerfile | 2 +- frameworks/Python/granian/granian-wsgi.dockerfile | 2 +- frameworks/Python/granian/granian.dockerfile | 2 +- frameworks/Python/granian/requirements.txt | 2 +- frameworks/Python/granian/run.py | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Python/granian/granian-rsgi.dockerfile b/frameworks/Python/granian/granian-rsgi.dockerfile index d84b713044b..315493dc7ca 100644 --- a/frameworks/Python/granian/granian-rsgi.dockerfile +++ b/frameworks/Python/granian/granian-rsgi.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim +FROM python:3.10-slim ADD ./ /granian diff --git a/frameworks/Python/granian/granian-wrk.dockerfile b/frameworks/Python/granian/granian-wrk.dockerfile index 2f56af92d53..533a5bc722a 100644 --- a/frameworks/Python/granian/granian-wrk.dockerfile +++ b/frameworks/Python/granian/granian-wrk.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim +FROM python:3.10-slim ADD ./ /granian diff --git a/frameworks/Python/granian/granian-wsgi.dockerfile b/frameworks/Python/granian/granian-wsgi.dockerfile index f178eb4b618..9ddcee211ff 100644 --- a/frameworks/Python/granian/granian-wsgi.dockerfile +++ b/frameworks/Python/granian/granian-wsgi.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim +FROM python:3.10-slim ADD ./ /granian diff --git a/frameworks/Python/granian/granian.dockerfile b/frameworks/Python/granian/granian.dockerfile index 883c433f3f0..828808b1009 100644 --- a/frameworks/Python/granian/granian.dockerfile +++ b/frameworks/Python/granian/granian.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim +FROM python:3.10-slim ADD ./ /granian diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index 90c02f2c8d4..1d8e4322ee2 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.29.0 -granian>=1.6.0,<1.7.0 +granian>=1.7.0,<1.8.0 jinja2==3.1.4 orjson==3.10.2 diff --git a/frameworks/Python/granian/run.py b/frameworks/Python/granian/run.py index ef0724fad2f..11bdee8d453 100644 --- a/frameworks/Python/granian/run.py +++ b/frameworks/Python/granian/run.py @@ -10,8 +10,8 @@ workers = multiprocessing.cpu_count() if interface == "rsgi": - #: split cores between the two loops - workers = round(workers / 2) + #: leave 25% cpu to the Rust runtime + workers = round(workers * 0.75) blocking_threads = None if interface == "wsgi": From 0f37fbababbf7a2a433793203f2867e50dd4ff49 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 20 Dec 2024 21:31:42 +0100 Subject: [PATCH 0974/1766] [ruby/sinatra] Add agoo server (#9468) Agoo should should improve sinatra results: +------------+---------+------+------+-----+-----+-------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|weighted_score| +------------+---------+------+------+-----+-----+-------+--------------+ | master| 92523| 9634| 92989|38761|14495| 22834| 1242| |sinatra/agoo| 120585| 11097|125360|48105|42945| 18494| 1996| +------------+---------+------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/sinatra-sequel/boot.rb | 11 +++++----- frameworks/Ruby/sinatra/Gemfile | 13 +++++++---- frameworks/Ruby/sinatra/Gemfile.lock | 3 +++ frameworks/Ruby/sinatra/benchmark_config.json | 22 +++++++++++++++++++ frameworks/Ruby/sinatra/boot.rb | 11 +++++----- .../sinatra-postgres-agoo-mri.dockerfile | 20 +++++++++++++++++ .../sinatra-postgres-passenger-mri.dockerfile | 2 +- .../sinatra-postgres-unicorn-mri.dockerfile | 2 +- .../Ruby/sinatra/sinatra-postgres.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra.dockerfile | 2 +- 10 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index 655e88dce7d..966bb4ed617 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -11,14 +11,13 @@ SERVER_STRING = if defined?(PhusionPassenger) - [ - PhusionPassenger::SharedConstants::SERVER_TOKEN_NAME, - PhusionPassenger::VERSION_STRING - ].join('/').freeze + 'passenger' elsif defined?(Puma) - Puma::Const::PUMA_SERVER_STRING + 'puma' elsif defined?(Unicorn) - Unicorn::HttpParser::DEFAULTS['SERVER_SOFTWARE'] + 'unicorn' + elsif defined?(Agoo) + 'agoo' end Bundler.require(:default) # Load core modules diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index c6346471ce2..88720bf547b 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -4,22 +4,27 @@ gem 'activerecord', '~> 7.2', require: 'active_record' gem 'json', '~> 2.8' gem 'sinatra', '~> 4.0', require: 'sinatra/base' -group :mysql do +group :mysql, optional: true do gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] end -group :postgresql do +group :postgresql, optional: true do gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] end -group :passenger do +group :passenger, optional: true do gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false end -group :puma do +group :puma, optional: true do gem 'puma', '~> 6.4', require: false end group :unicorn do gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false end + +group :agoo, optional: true do + gem 'agoo', require: false + gem 'rackup' +end diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index db7773ad559..ddfcc1fb8be 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -18,6 +18,7 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + agoo (2.15.13) base64 (0.2.0) bigdecimal (3.1.8) concurrent-ruby (1.3.4) @@ -74,11 +75,13 @@ PLATFORMS DEPENDENCIES activerecord (~> 7.2) + agoo json (~> 2.8) mysql2 (~> 0.5) passenger (~> 6.0) pg (~> 1.5) puma (~> 6.4) + rackup sinatra (~> 4.0) unicorn (~> 6.1) diff --git a/frameworks/Ruby/sinatra/benchmark_config.json b/frameworks/Ruby/sinatra/benchmark_config.json index 2c0be64ed47..3e318c9aa58 100644 --- a/frameworks/Ruby/sinatra/benchmark_config.json +++ b/frameworks/Ruby/sinatra/benchmark_config.json @@ -44,6 +44,28 @@ "versus": "rack-postgres-puma-mri", "notes": "" }, + "postgres-agoo-mri": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "sinatra", + "language": "Ruby", + "orm": "Full", + "platform": "Rack", + "webserver": "Agoo", + "os": "Linux", + "database_os": "Linux", + "display_name": "sinatra-postgres-agoo-mri", + "versus": "rack-postgres-agoo-mri", + "notes": "" + }, "postgres-passenger-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index f8cc4be86c3..261e12f1145 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -10,14 +10,13 @@ SERVER_STRING = if defined?(PhusionPassenger) - [ - PhusionPassenger::SharedConstants::SERVER_TOKEN_NAME, - PhusionPassenger::VERSION_STRING - ].join('/').freeze + 'passenger' elsif defined?(Puma) - Puma::Const::PUMA_SERVER_STRING + 'puma' elsif defined?(Unicorn) - Unicorn::HttpParser::DEFAULTS['SERVER_SOFTWARE'] + 'unicorn' + elsif defined?(Agoo) + 'agoo' end Bundler.require(:default) # Load core modules diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile new file mode 100644 index 00000000000..c6f2f33c4a1 --- /dev/null +++ b/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile @@ -0,0 +1,20 @@ +FROM ruby:3.4-rc + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +ADD ./ /sinatra +WORKDIR /sinatra + +ENV BUNDLE_WITH=postgresql:agoo +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile + +ENV DBTYPE=postgresql + +EXPOSE 8080 + +CMD RACK_ENV=production bundle exec rackup -r agoo -s agoo -p 8080 -q -O workers=$(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile index 672444b4dae..78bbf09f2a6 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -ENV BUNDLE_WITHOUT=mysql:puma:unicorn +ENV BUNDLE_WITH=postgresql:passenger RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile index 882d124c895..4ca88527522 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -ENV BUNDLE_WITHOUT=mysql:passenger:puma +ENV BUNDLE_WITH=postgresql:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 62b6c607bb4..2162bc12caa 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -ENV BUNDLE_WITHOUT=mysql:passenger:unicorn +ENV BUNDLE_WITH=postgresql:puma RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 4de24d6bae2..19a64c836a6 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra WORKDIR /sinatra -ENV BUNDLE_WITHOUT=postgresql:passenger:unicorn +ENV BUNDLE_WITH=mysql:puma RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=mysql From 6d5e7601e465a8b12ea2c3c86ae0966550d98e39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:47:35 -0800 Subject: [PATCH 0975/1766] Bump golang.org/x/crypto from 0.17.0 to 0.31.0 in /frameworks/Go/hertz (#9459) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.17.0 to 0.31.0. - [Commits](https://github.com/golang/crypto/compare/v0.17.0...v0.31.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/hertz/go.mod | 8 ++++---- frameworks/Go/hertz/go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frameworks/Go/hertz/go.mod b/frameworks/Go/hertz/go.mod index b04b09619ce..ef35c591ff5 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.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 + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.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 0d3f782c63b..c1251e56bc9 100644 --- a/frameworks/Go/hertz/go.sum +++ b/frameworks/Go/hertz/go.sum @@ -77,20 +77,20 @@ 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.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= 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= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 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 efa1fb8ad0f918241bb64b2d5e6adeab857411b9 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 24 Dec 2024 09:37:05 +0100 Subject: [PATCH 0976/1766] Update dependencies and batch sql --- frameworks/Kotlin/hexagon/build.gradle | 12 ++++++------ .../hexagon/hexagon-helidon-pgclient.dockerfile | 4 ++-- frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile | 4 ++-- frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- .../store_sql/src/main/kotlin/BenchmarkSqlStore.kt | 6 +++++- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index c33d231f630..f739a6f3418 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,7 +1,7 @@ plugins { id "org.jetbrains.kotlin.jvm" version "2.0.21" apply false - id "org.graalvm.buildtools.native" version "0.10.3" apply false + id "org.graalvm.buildtools.native" version "0.10.4" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.7.2" - jettyVersion = "12.0.14" - nettyVersion = "4.1.114.Final" + hexagonVersion = "3.7.3" + jettyVersion = "12.0.16" + nettyVersion = "4.1.116.Final" - hikariVersion = "6.0.0" + hikariVersion = "6.2.1" postgresqlVersion = "42.7.4" - vertxVersion = "4.5.10" + vertxVersion = "4.5.11" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index f11c4e7b2bd..2ad89ca5713 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/bellsoft/liberica-runtime-container:jdk-all-22-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-22-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 27177de5eb9..632cc8720b5 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-22-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-22-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index 42f28071128..dfc6c521a1d 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test war # # RUNTIME # -FROM docker.io/tomcat:11.0.0-jre21-temurin-noble +FROM docker.io/tomcat:11-jre21-temurin-noble ARG MODULE=/hexagon/hexagon_tomcat_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt index 501a4d9ce34..0d854baec40 100644 --- a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt @@ -62,6 +62,7 @@ class BenchmarkSqlStore( override fun replaceWorlds(worlds: List) { dataSource.connection.use { con: Connection -> + con.autoCommit = false val stmtSelect = con.prepareStatement(SELECT_WORLD) val stmtUpdate = con.prepareStatement(UPDATE_WORLD) @@ -76,8 +77,11 @@ class BenchmarkSqlStore( stmtUpdate.setInt(1, newRandomNumber) stmtUpdate.setInt(2, worldId) - stmtUpdate.executeUpdate() +// stmtUpdate.executeUpdate() + stmtUpdate.addBatch() } + stmtUpdate.executeBatch() + con.commit() } } From bbf0585b15a01c8f1e2dc594764ac00b1bd0d006 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 25 Dec 2024 04:29:46 +0100 Subject: [PATCH 0977/1766] [php] Update Flight to v3 (#9470) * Update Flight to v3 * Fix plaintext --- frameworks/PHP/flight/composer.json | 4 ++-- frameworks/PHP/flight/index.php | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/flight/composer.json b/frameworks/PHP/flight/composer.json index 87ce7604b0a..0f94353da88 100644 --- a/frameworks/PHP/flight/composer.json +++ b/frameworks/PHP/flight/composer.json @@ -1,5 +1,5 @@ { "require": { - "mikecao/flight": "^2.0" + "mikecao/flight": "^3.0" } -} \ No newline at end of file +} diff --git a/frameworks/PHP/flight/index.php b/frameworks/PHP/flight/index.php index 48c77996905..8d954fa369e 100644 --- a/frameworks/PHP/flight/index.php +++ b/frameworks/PHP/flight/index.php @@ -13,9 +13,8 @@ // Plaintext test Flight::route('/plaintext', function() { Flight::response() - ->header('Content-Type', 'text/plain') - ->write('Hello, World!') - ->send(); + ->header('Content-Type', 'text/plain'); + echo 'Hello, World!'; }); // DB test From bd5a0ee29882d054d22ea5672c58709be36e3983 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 25 Dec 2024 04:29:51 +0100 Subject: [PATCH 0978/1766] [ruby] Upgrade json gem to latest (#9471) The latest version has multiple performance improvements. --- frameworks/Ruby/rack-sequel/Gemfile.lock | 9 ++------- frameworks/Ruby/rack/Gemfile.lock | 2 +- frameworks/Ruby/rails/Gemfile.lock | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 2 +- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 72c1f6c0d47..77bdf0415e0 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -3,14 +3,10 @@ GEM specs: base64 (0.2.0) bigdecimal (3.1.8) - json (2.8.2) + json (2.9.1) kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) - oj (3.16.7) - bigdecimal (>= 3.0) - ostruct (>= 0.2) - ostruct (0.6.1) passenger (6.0.23) rack (>= 1.6.13) rackup @@ -42,9 +38,8 @@ DEPENDENCIES base64 jdbc-mysql (~> 5.1) jdbc-postgres (~> 9.4) - json (~> 2.0) + json (~> 2.8) mysql2 (~> 0.4) - oj (~> 3.14) passenger (~> 6.0) pg (~> 1.5) puma (~> 6.4) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index b3ef3cbda2d..0c5027553b4 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -53,7 +53,7 @@ GEM io-endpoint (0.14.0) io-event (1.7.3) io-stream (0.6.1) - json (2.8.2) + json (2.9.1) kgio (2.11.4) language_server-protocol (3.17.0.3) localhost (1.3.1) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 010270b9617..8db47000927 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -139,7 +139,7 @@ GEM irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) - json (2.8.1) + json (2.9.1) localhost (1.3.1) logger (1.6.2) loofah (2.23.1) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index c701d602394..63f88b647fa 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -4,7 +4,7 @@ GEM base64 (0.2.0) bigdecimal (3.1.8) erubi (1.13.0) - json (2.8.1) + json (2.9.1) kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index ddfcc1fb8be..b289296bfb6 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -26,7 +26,7 @@ GEM drb (2.2.1) i18n (1.14.6) concurrent-ruby (~> 1.0) - json (2.8.1) + json (2.9.1) kgio (2.11.4) logger (1.6.1) minitest (5.25.1) From 6a920c60e5a85a7ce06f3e5c4a3074488282929d Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 25 Dec 2024 04:29:58 +0100 Subject: [PATCH 0979/1766] [ruby/sinatra] Upgrade to ActiveRecord 8.0 (#9472) --- frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 46 +++++++++++++++------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 88720bf547b..c80246d6a35 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'activerecord', '~> 7.2', require: 'active_record' +gem 'activerecord', '~> 8.0', require: 'active_record' gem 'json', '~> 2.8' gem 'sinatra', '~> 4.0', require: 'sinatra/base' diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index b289296bfb6..76b66f8fedd 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -1,14 +1,15 @@ GEM remote: https://rubygems.org/ specs: - activemodel (7.2.1.1) - activesupport (= 7.2.1.1) - activerecord (7.2.1.1) - activemodel (= 7.2.1.1) - activesupport (= 7.2.1.1) + activemodel (8.0.1) + activesupport (= 8.0.1) + activerecord (8.0.1) + activemodel (= 8.0.1) + activesupport (= 8.0.1) timeout (>= 0.4.0) - activesupport (7.2.1.1) + activesupport (8.0.1) base64 + benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) @@ -18,8 +19,10 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) agoo (2.15.13) base64 (0.2.0) + benchmark (0.4.0) bigdecimal (3.1.8) concurrent-ruby (1.3.4) connection_pool (2.4.1) @@ -28,53 +31,54 @@ GEM concurrent-ruby (~> 1.0) json (2.9.1) kgio (2.11.4) - logger (1.6.1) - minitest (5.25.1) + logger (1.6.4) + minitest (5.25.4) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.23) + passenger (6.0.24) rack (>= 1.6.13) - rackup + rackup (>= 2.0.0) rake (>= 12.3.3) - pg (1.5.8) + pg (1.5.9) puma (6.5.0) nio4r (~> 2.0) rack (3.1.8) - rack-protection (4.0.0) + rack-protection (4.1.1) base64 (>= 0.1.0) + logger (>= 1.6.0) rack (>= 3.0.0, < 4) rack-session (2.0.0) rack (>= 3.0.0) - rackup (2.1.0) + rackup (2.2.1) rack (>= 3) - webrick (~> 1.8) raindrops (0.20.1) rake (13.2.1) ruby2_keywords (0.0.5) - securerandom (0.3.1) - sinatra (4.0.0) + securerandom (0.4.1) + sinatra (4.1.1) + logger (>= 1.6.0) mustermann (~> 3.0) rack (>= 3.0.0, < 4) - rack-protection (= 4.0.0) + rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - tilt (2.4.0) - timeout (0.4.1) + tilt (2.5.0) + timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) - webrick (1.8.2) + uri (1.0.2) PLATFORMS ruby x86_64-darwin-23 DEPENDENCIES - activerecord (~> 7.2) + activerecord (~> 8.0) agoo json (~> 2.8) mysql2 (~> 0.5) From 082b5737138b39d27b54b004dc7a812236a4438b Mon Sep 17 00:00:00 2001 From: walkor Date: Wed, 25 Dec 2024 11:30:07 +0800 Subject: [PATCH 0980/1766] [php] Simplify the code for Webman Workerman (#9474) * Code optimization * Remove maintainers --- .../PHP/webman/app/controller/Index.php | 48 ++++++++++--------- .../PHP/webman/support/bootstrap/db/Raw.php | 33 ------------- frameworks/PHP/workerman/Mysql.php | 13 +++-- frameworks/PHP/workerman/Pgsql.php | 5 +- .../PHP/workerman/benchmark_config.json | 1 - 5 files changed, 36 insertions(+), 64 deletions(-) diff --git a/frameworks/PHP/webman/app/controller/Index.php b/frameworks/PHP/webman/app/controller/Index.php index 1b27503762f..5d40b24b0ed 100644 --- a/frameworks/PHP/webman/app/controller/Index.php +++ b/frameworks/PHP/webman/app/controller/Index.php @@ -5,7 +5,10 @@ use support\bootstrap\Date; use support\bootstrap\db\Raw as Db; use support\Response; -use PDO; +use function json_encode; +use function max; +use function min; +use function mt_rand; class Index { @@ -29,7 +32,7 @@ public function json() public function db() { $statement = Db::$random; - $statement->execute([\mt_rand(1, 10000)]); + $statement->execute([mt_rand(1, 10000)]); return new Response(200, [ 'Content-Type' => 'application/json', @@ -63,14 +66,11 @@ public function queries(Request $request, $q = 1) { $statement = Db::$random; - $query_count = 1; - if ((int) $q > 1) { - $query_count = \min($q, 500); - } + $query_count = min(max((int) $q, 1), 500); $arr = []; while ($query_count--) { - $statement->execute([\mt_rand(1, 10000)]); + $statement->execute([mt_rand(1, 10000)]); $arr[] = $statement->fetch(); } @@ -82,29 +82,31 @@ public function queries(Request $request, $q = 1) public function updates(Request $request, $q = 1) { - $random = Db::$random; + static $updates = []; - $query_count = 1; - if ((int) $q > 1) { - $query_count = \min($q, 500); + $random = Db::$random; + $pdo = Db::$pdo; + $count = min(max((int) $q, 1), 500); + + $worlds = $keys = $values = []; + for ($i = 0; $i < $count; ++ $i) { + $values[] = $keys[] = $id = mt_rand(1, 10000); + $random->execute([$id]); + $row = $random->fetch(); + $values[] = $row['randomNumber'] = mt_rand(1, 10000); + $worlds[] = $row; } - - $worlds = []; - - while ($query_count--) { - $random->execute([\mt_rand(1, 10000)]); - $world = $random->fetch(); - $world['randomNumber'] = \mt_rand(1, 10000); - - $worlds[] = $world; + if (!isset($updates[$count])) { + $sql = 'UPDATE World SET randomNumber = CASE id' . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $count) . 'END WHERE id IN (' . str_repeat('?::INTEGER,', $count - 1) . '?::INTEGER)'; + $updates[$count] = $pdo->prepare($sql); } - - Db::update($worlds); + $updates[$count]->execute([...$values, ...$keys]); return new Response(200, [ 'Content-Type' => 'application/json', 'Date' => Date::$date - ], \json_encode($worlds)); + ], json_encode($worlds)); + } diff --git a/frameworks/PHP/webman/support/bootstrap/db/Raw.php b/frameworks/PHP/webman/support/bootstrap/db/Raw.php index d27d846bb3c..5c4389c2347 100644 --- a/frameworks/PHP/webman/support/bootstrap/db/Raw.php +++ b/frameworks/PHP/webman/support/bootstrap/db/Raw.php @@ -31,11 +31,6 @@ class Raw implements Bootstrap public static PDOStatement $random; - /** - * @var PDOStatement[] - */ - public static array $update; - /** * @param Worker $worker * @@ -53,32 +48,4 @@ public static function start($worker) self::$pdo = $pdo; } - /** - * Postgres bulk update - * - * @param array $worlds - * @return void - */ - public static function update(array $worlds) - { - $rows = count($worlds); - - if (!isset(self::$update[$rows])) { - $sql = 'UPDATE world SET randomNumber = CASE id' - . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) - . 'END WHERE id IN (' - . str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)'; - - self::$update[$rows] = self::$pdo->prepare($sql); - } - - $val = []; - $keys = []; - foreach ($worlds as $world) { - $val[] = $keys[] = $world['id']; - $val[] = $world['randomNumber']; - } - - self::$update[$rows]->execute([...$val, ...$keys]); - } } diff --git a/frameworks/PHP/workerman/Mysql.php b/frameworks/PHP/workerman/Mysql.php index c8dcd0ff40a..968ffcfef80 100644 --- a/frameworks/PHP/workerman/Mysql.php +++ b/frameworks/PHP/workerman/Mysql.php @@ -34,9 +34,10 @@ function query($request): array { $count = min(max((int) $request->get('q'), 1), 500); $arr = []; + $world = $this->world; while ($count--) { - $this->world->execute([mt_rand(1, 10000)]); - $arr[] = $this->world->fetch(); + $world->execute([mt_rand(1, 10000)]); + $arr[] = $world->fetch(); } return $arr; } @@ -45,11 +46,13 @@ function update($request): array { $count = min(max((int) $request->get('q'), 1), 500); $arr = []; + $world = $this->world; + $update = $this->update; while ($count--) { $id = mt_rand(1, 10000); - $this->world->execute([$id]); - $item = $this->world->fetch(); - $this->update->execute( + $world->execute([$id]); + $item = $world->fetch(); + $update->execute( [$item['randomNumber'] = mt_rand(1, 10000), $id] ); $arr[] = $item; diff --git a/frameworks/PHP/workerman/Pgsql.php b/frameworks/PHP/workerman/Pgsql.php index 4f4be58fe44..637497eb03e 100644 --- a/frameworks/PHP/workerman/Pgsql.php +++ b/frameworks/PHP/workerman/Pgsql.php @@ -31,10 +31,11 @@ function update($request): array $queries = $request->get('q'); $worlds = $keys = $values = []; $count = min(max((int) $queries, 1), 500); + $random = $this->random; for ($i = 0; $i < $count; ++ $i) { $values[] = $keys[] = $id = mt_rand(1, 10000); - $this->random->execute([$id]); - $row = $this->random->fetch(); + $random->execute([$id]); + $row = $random->fetch(); $values[] = $row['randomNumber'] = mt_rand(1, 10000); $worlds[] = $row; } diff --git a/frameworks/PHP/workerman/benchmark_config.json b/frameworks/PHP/workerman/benchmark_config.json index 8e79f1b124c..0d4b57bad54 100644 --- a/frameworks/PHP/workerman/benchmark_config.json +++ b/frameworks/PHP/workerman/benchmark_config.json @@ -1,6 +1,5 @@ { "framework": "workerman", - "maintainers": ["walkor"], "tests": [{ "default": { "dockerfile": "workerman-jit.dockerfile", From 989d88d1b3a449bedd6454f52e6bf83de72f8c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=81=D1=82=D1=8F=20=D0=A2=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8F=D0=BA?= Date: Wed, 25 Dec 2024 05:30:16 +0200 Subject: [PATCH 0981/1766] refactor(TypeScript/ditsmod): upgrade to v3. (#9475) --- .../TypeScript/ditsmod/benchmark_config.json | 12 ++++----- frameworks/TypeScript/ditsmod/package.json | 4 +-- .../TypeScript/ditsmod/src/app/app.module.ts | 6 ++--- .../ditsmod/src/app/init.extension.ts | 16 ++++------- .../ditsmod/src/app/one.controller.ts | 27 +++++++++---------- frameworks/TypeScript/ditsmod/src/main.ts | 2 +- 6 files changed, 28 insertions(+), 39 deletions(-) diff --git a/frameworks/TypeScript/ditsmod/benchmark_config.json b/frameworks/TypeScript/ditsmod/benchmark_config.json index 11704b96a53..39c4bce56cf 100755 --- a/frameworks/TypeScript/ditsmod/benchmark_config.json +++ b/frameworks/TypeScript/ditsmod/benchmark_config.json @@ -18,7 +18,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "ditsmod", + "display_name": "ditsmod v3.0", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "nodejs" }, @@ -41,7 +41,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "ditsmod [postgres]", + "display_name": "ditsmod v3.0 [postgres]", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "nodejs" }, @@ -64,7 +64,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "ditsmod [mysql]", + "display_name": "ditsmod v3.0 [mysql]", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "nodejs" }, @@ -84,7 +84,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "ditsmod on bun", + "display_name": "ditsmod-bun v3.0", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "bun" }, @@ -107,7 +107,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "ditsmod on bun [postgres]", + "display_name": "ditsmod-bun v3.0 [postgres]", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "bun" }, @@ -130,7 +130,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "ditsmod on bun [mysql]", + "display_name": "ditsmod-bun v3.0 [mysql]", "notes": "Simplified use of Dependency Injection (no request level injector).", "versus": "bun" } diff --git a/frameworks/TypeScript/ditsmod/package.json b/frameworks/TypeScript/ditsmod/package.json index a4d1ec09851..a0a1298ef86 100755 --- a/frameworks/TypeScript/ditsmod/package.json +++ b/frameworks/TypeScript/ditsmod/package.json @@ -14,8 +14,8 @@ "author": "Костя Третяк", "license": "MIT", "dependencies": { - "@ditsmod/core": "~2.55.0", - "@ditsmod/routing": "~2.3.0", + "@ditsmod/core": "^3.0.0-alpha.2", + "@ditsmod/routing": "^3.0.0-alpha.2", "handlebars": "^4.7.8", "lru-cache": "^11.0.0", "mariadb": "^3.3.1", diff --git a/frameworks/TypeScript/ditsmod/src/app/app.module.ts b/frameworks/TypeScript/ditsmod/src/app/app.module.ts index 34bfc4357cf..d50e72d1557 100644 --- a/frameworks/TypeScript/ditsmod/src/app/app.module.ts +++ b/frameworks/TypeScript/ditsmod/src/app/app.module.ts @@ -2,15 +2,13 @@ import { Providers, rootModule } from '@ditsmod/core'; import { PRE_ROUTER_EXTENSIONS, RoutingModule } from '@ditsmod/routing'; import { OneController } from './one.controller.js'; -import { DbService } from './db.service.js'; import { InitExtension } from './init.extension.js'; import { DB_INIT_EXTENSIONS } from './tokens.js'; -import { ModelService } from './types.js'; @rootModule({ imports: [RoutingModule], - providersPerApp: new Providers().passThrough(DbService).passThrough(ModelService).useLogConfig({ level: 'off' }), - extensions: [{ extension: InitExtension, groupToken: DB_INIT_EXTENSIONS, nextToken: PRE_ROUTER_EXTENSIONS }], + providersPerApp: new Providers().useLogConfig({ level: 'off' }), + extensions: [{ extension: InitExtension, group: DB_INIT_EXTENSIONS, beforeGroup: PRE_ROUTER_EXTENSIONS }], controllers: [OneController], }) export class AppModule {} diff --git a/frameworks/TypeScript/ditsmod/src/app/init.extension.ts b/frameworks/TypeScript/ditsmod/src/app/init.extension.ts index 45ae1da68ed..7775328edfa 100644 --- a/frameworks/TypeScript/ditsmod/src/app/init.extension.ts +++ b/frameworks/TypeScript/ditsmod/src/app/init.extension.ts @@ -5,18 +5,12 @@ import { ModelService } from './types.js'; @injectable() export class InitExtension implements Extension { - #inited: boolean; - constructor( private perAppService: PerAppService, private logger: Logger, ) {} - async init(): Promise { - if (this.#inited) { - return; - } - + async stage1(): Promise { const dbType = process.env.DATABASE as 'mysql' | 'postgres'; if (dbType == 'mysql') { @@ -28,13 +22,13 @@ export class InitExtension implements Extension { } else { this.logger.log('warn', `Unknown database "${dbType}"`); } - - this.#inited = true; } protected async setDbService(useClass: Class) { - const injector = this.perAppService.injector.resolveAndCreateChild([{ token: ModelService, useClass }]); - const dbService = injector.pull(DbService) as DbService; + const dbService = this.perAppService.injector + .resolveAndCreateChild([DbService, { token: ModelService, useClass }]) + .get(DbService) as DbService; + await dbService.setWorldsToCache(); this.perAppService.providers.push({ token: DbService, useValue: dbService }); } diff --git a/frameworks/TypeScript/ditsmod/src/app/one.controller.ts b/frameworks/TypeScript/ditsmod/src/app/one.controller.ts index 09615c93598..d4ba84464b0 100644 --- a/frameworks/TypeScript/ditsmod/src/app/one.controller.ts +++ b/frameworks/TypeScript/ditsmod/src/app/one.controller.ts @@ -1,4 +1,5 @@ -import { AnyObj, controller, RequestContext, SingletonRequestContext, route } from '@ditsmod/core'; +import { AnyObj, controller, RequestContext, SingletonRequestContext, optional } from '@ditsmod/core'; +import { route } from '@ditsmod/routing'; import Handlebars from 'handlebars'; import { DbService } from './db.service.js'; @@ -27,9 +28,9 @@ const tmpl = Handlebars.compile( ].join(''), ); -@controller({ isSingleton: true }) +@controller({ scope: 'module' }) export class OneController { - constructor(private dbService: DbService) {} + constructor(@optional() private dbService: DbService) {} @route('GET', 'db') async getSingleQuery(ctx: RequestContext) { @@ -61,28 +62,24 @@ export class OneController { const fortunes = await this.dbService.findAllFortunes(); fortunes.push(additionalFortune); fortunes.sort(compare); - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'text/html; charset=utf-8'); - ctx.nodeRes.end(tmpl({ fortunes })); + ctx.rawRes.setHeader('Server', 'Ditsmod'); + ctx.rawRes.setHeader('Content-Type', 'text/html; charset=utf-8'); + ctx.rawRes.end(tmpl({ fortunes })); } @route('GET', 'plaintext') getHello(ctx: SingletonRequestContext) { - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'text/plain; charset=utf-8'); - ctx.nodeRes.end('Hello, World!'); + ctx.rawRes.setHeader('Server', 'Ditsmod'); + ctx.rawRes.setHeader('Content-Type', 'text/plain; charset=utf-8'); + ctx.rawRes.end('Hello, World!'); } @route('GET', 'json') getJson(ctx: SingletonRequestContext) { - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'application/json; charset=utf-8'); - ctx.nodeRes.end(JSON.stringify({ message: 'Hello, World!' })); + this.sendJson(ctx, { message: 'Hello, World!' }); } protected sendJson(ctx: RequestContext, value: AnyObj) { - ctx.nodeRes.setHeader('Server', 'Ditsmod'); - ctx.nodeRes.setHeader('Content-Type', 'application/json; charset=utf-8'); - ctx.nodeRes.end(JSON.stringify(value)); + ctx.setHeader('Server', 'Ditsmod').sendJson(value); } } diff --git a/frameworks/TypeScript/ditsmod/src/main.ts b/frameworks/TypeScript/ditsmod/src/main.ts index 46f535f2c75..b42ba0a5b64 100644 --- a/frameworks/TypeScript/ditsmod/src/main.ts +++ b/frameworks/TypeScript/ditsmod/src/main.ts @@ -13,6 +13,6 @@ if (numCpus > 1 && cluster.isPrimary) { } } else { const serverOptions: ServerOptions = { keepAlive: true, keepAliveTimeout: 0 }; - const app = await new Application().bootstrap(AppModule, { serverOptions }); + const app = await Application.create(AppModule, { serverOptions }); app.server.listen(8080, '0.0.0.0'); } From 05975805fb5499c500070c60daf9b2f1cdc842f0 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Tue, 24 Dec 2024 17:31:01 -1000 Subject: [PATCH 0982/1766] Tio server (#8659) * add tio-server * add simple docker file * fix docker file * chage log level to info * add template and activate record * add cache * update reupadme.md * update cache query * test on windows * chage to EnviormentUtils * add java run with jdb info * add EnviormentUtils * change to JDBC_URL * add mysql run cmd * update dockerfile add jdbc info * fix jdbc info error * fix Unterminated quoted string on dockerfile * fix jdb_user error * add "database": "MySQL", * chage in to Integer of Fortune * add #escape to avoid xxs * remove caffeine and add ehcache * failed to test native * change to cached_query_url * add native arg * remove unused file for tio-http-server * add dockerignore * update jar name to tio-http-server-benchmark * update version * fix all query * update docker file * update docker file and plugin * update docker file * update dockerfile * update tio-http-server version * remove native support * update tio-http-server version * update jdbc info * update docker file --------- Co-authored-by: litongjava --- frameworks/Java/tio-http-server/.dockerignore | 19 ++ frameworks/Java/tio-http-server/.gitignore | 3 + frameworks/Java/tio-http-server/README.md | 114 +++++++++ .../api/tio-server-benchmark.md | 227 ++++++++++++++++++ .../tio-http-server/benchmark_config.json | 29 +++ frameworks/Java/tio-http-server/config.toml | 19 ++ frameworks/Java/tio-http-server/pom.xml | 209 ++++++++++++++++ .../litongjava/tio/http/server/MainApp.java | 66 +++++ .../server/config/EhCachePluginConfig.java | 12 + .../http/server/config/EnjoyEngineConfig.java | 22 ++ .../tio/http/server/config/MysqlDbConfig.java | 31 +++ .../server/controller/CacheController.java | 41 ++++ .../http/server/controller/DbController.java | 127 ++++++++++ .../server/controller/IndexController.java | 40 +++ .../tio/http/server/model/Fortune.java | 23 ++ .../tio/http/server/model/Message.java | 12 + .../tio/http/server/model/World.java | 32 +++ .../tio/http/server/services/CacheName.java | 50 ++++ .../server/services/CacheNameService.java | 17 ++ .../http/server/utils/BeanConverterUtils.java | 31 +++ .../tio/http/server/utils/RandomUtils.java | 36 +++ .../src/main/resources/app.properties | 9 + .../src/main/resources/ehcache.xml | 9 + .../src/main/resources/logback.xml | 52 ++++ .../main/resources/templates/fortunes.html | 20 ++ .../tio/http/server/MainAppTest.java | 15 ++ .../tio-server-native.dockerfile | 9 + .../tio-http-server/tio-server.dockerfile | 19 ++ 28 files changed, 1293 insertions(+) create mode 100644 frameworks/Java/tio-http-server/.dockerignore create mode 100644 frameworks/Java/tio-http-server/.gitignore create mode 100644 frameworks/Java/tio-http-server/README.md create mode 100644 frameworks/Java/tio-http-server/api/tio-server-benchmark.md create mode 100644 frameworks/Java/tio-http-server/benchmark_config.json create mode 100644 frameworks/Java/tio-http-server/config.toml create mode 100644 frameworks/Java/tio-http-server/pom.xml create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/IndexController.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Fortune.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Message.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/World.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheName.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java create mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java create mode 100644 frameworks/Java/tio-http-server/src/main/resources/app.properties create mode 100644 frameworks/Java/tio-http-server/src/main/resources/ehcache.xml create mode 100644 frameworks/Java/tio-http-server/src/main/resources/logback.xml create mode 100644 frameworks/Java/tio-http-server/src/main/resources/templates/fortunes.html create mode 100644 frameworks/Java/tio-http-server/src/test/java/com/litongjava/tio/http/server/MainAppTest.java create mode 100644 frameworks/Java/tio-http-server/tio-server-native.dockerfile create mode 100644 frameworks/Java/tio-http-server/tio-server.dockerfile diff --git a/frameworks/Java/tio-http-server/.dockerignore b/frameworks/Java/tio-http-server/.dockerignore new file mode 100644 index 00000000000..cba5dfe3c3b --- /dev/null +++ b/frameworks/Java/tio-http-server/.dockerignore @@ -0,0 +1,19 @@ +.github +.git +.DS_Store +docs +kubernetes +node_modules +/.svelte-kit +/package +.env +.env.* +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +__pycache__ +.env +_old +uploads +.ipynb_checkpoints +**/*.db +_test \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/.gitignore b/frameworks/Java/tio-http-server/.gitignore new file mode 100644 index 00000000000..2f089945614 --- /dev/null +++ b/frameworks/Java/tio-http-server/.gitignore @@ -0,0 +1,3 @@ +/target/ +logs +.settings \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/README.md b/frameworks/Java/tio-http-server/README.md new file mode 100644 index 00000000000..bb1539e7db1 --- /dev/null +++ b/frameworks/Java/tio-http-server/README.md @@ -0,0 +1,114 @@ +# t-io Benchmarking Test + +This is the tio-server portion of a [benchmarking test suite](../) comparing a variety of web development platforms. + +## Controller + +These implementations use the tio-server's controller. + +### Plaintext Test + +* [Plaintext test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + +### JSON Serialization Test + +* [JSON test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + +### Database Query Test + +* [Database Query test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Database Queries Test + +* [Database Queries test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Database Update Test + +* [Database Update test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Template rendering Test + +* [Template rendering test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Cache Query Test +* [Cache query test source](src/main/java/com/litongjava/tio/http/server/controller/CacheController.java)) + + +## Versions +3.7.3.v20231218-RELEASE (https://gitee.com/litongjava/t-io) + +## Test URLs + +All implementations use the same URLs. + +### Plaintext Test + + http://localhost:8080/plaintext + +### JSON Encoding Test + + http://localhost:8080/json + +### Database Query Test + + http://localhost:8080/db + +### Database Queries Test + + http://localhost:8080/queries?queries=5 + +### Cache Query Test + + http://localhost:8080/cacheQuery?queries=10000 + +### Template rendering Test + + http://localhost:8080/fortunes + +### Database Update Test + + http://localhost:8080/updates?queries=5 + + ## Hot to run + ### install mysql 8 + - 1.please instal mysql 8.0.32,example cmd + ``` + docker run --restart=always -d --name mysql_8 --hostname mysql \ +-p 3306:3306 \ +-e 'MYSQL_ROOT_PASSWORD=robot_123456#' -e 'MYSQL_ROOT_HOST=%' -e 'MYSQL_DATABASE=hello_world' \ +mysql/mysql-server:8.0.32 \ +--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1 + ``` + - 2.create database schema hello_world + - 3.create tablle,[example](sql/hello_world.sql) + - 4.import data + + ### docker + ``` + docker build -t tio-server-benchmark -f tio-server.dockerfile . +``` +The run is to specify the mysql database +``` +docker run --rm -p 8080:8080 \ +-e JDBC_URL="jdbc:mysql://192.168.3.9/hello_world" \ +-e JDBC_USER="root" \ +-e JDBC_PSWD="robot_123456#" \ +tio-server-benchmark +``` + +### windows + +-windows +``` +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar --JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false --JDBC_USER=root --JDBC_PSWD=robot_123456# +``` +or +``` +set JDBC_URL=jdbc:mysql://192.168.3.9/hello_world +set jdbc.user=root +set JDBC_PSWD=robot_123456# +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar +``` + + + diff --git a/frameworks/Java/tio-http-server/api/tio-server-benchmark.md b/frameworks/Java/tio-http-server/api/tio-server-benchmark.md new file mode 100644 index 00000000000..1d302df2d5d --- /dev/null +++ b/frameworks/Java/tio-http-server/api/tio-server-benchmark.md @@ -0,0 +1,227 @@ +--- +title: tio-server-benchmark v1.0.0 +language_tabs: + - shell: Shell + - http: HTTP + - javascript: JavaScript + - ruby: Ruby + - python: Python + - php: PHP + - java: Java + - go: Go +toc_footers: [] +includes: [] +search: true +code_clipboard: true +highlight_theme: darkula +headingLevel: 2 +generator: "@tarslib/widdershins v4.0.17" + +--- + +# tio-server-benchmark + +> v1.0.0 + +Base URLs: + +# Authentication + +# Default + +## GET plaintext + +GET /plaintext + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET json + +GET /json + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET db + +GET /db + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|id|query|string| 否 |none| + +> 返回示例 + +> 200 Response + +```json +{ + "id": 0, + "randomNumber": 0 +} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|true|none||none| +|» randomNumber|integer|true|none||none| + +## GET updates + +GET /updates + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|queries|query|string| 否 |none| + +> 返回示例 + +> 成功 + +```json +[ + { + "id": 28, + "randomNumber": 5399, + "randomnumber": 1498 + } +] +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|false|none||none| +|» randomNumber|integer|false|none||none| +|» randomnumber|integer|false|none||none| + +## GET fortunes + +GET /fortunes + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET cacheQuery + +GET /cacheQuery + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|queries|query|string| 否 |none| + +> 返回示例 + +> 200 Response + +```json +[ + { + "id": 0, + "randomNumber": 0 + } +] +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|false|none||none| +|» randomNumber|integer|false|none||none| + +## GET cacheList + +GET /cacheList + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +# 数据模型 + diff --git a/frameworks/Java/tio-http-server/benchmark_config.json b/frameworks/Java/tio-http-server/benchmark_config.json new file mode 100644 index 00000000000..5cd4c92b275 --- /dev/null +++ b/frameworks/Java/tio-http-server/benchmark_config.json @@ -0,0 +1,29 @@ +{ + "framework": "tio-server", + "tests": [{ + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "cached_query_url" : "/cachedQuery?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "MySQL", + "framework": "tio-server", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "t-io", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "tio-server", + "notes": "tio-server", + "versus": "t-io" + } + }] +} diff --git a/frameworks/Java/tio-http-server/config.toml b/frameworks/Java/tio-http-server/config.toml new file mode 100644 index 00000000000..93dddb241c9 --- /dev/null +++ b/frameworks/Java/tio-http-server/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "t-io" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cachedQuery?queries=" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "t-io" +webserver = "None" +versus = "t-io" diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml new file mode 100644 index 00000000000..60c75e68fd5 --- /dev/null +++ b/frameworks/Java/tio-http-server/pom.xml @@ -0,0 +1,209 @@ + + 4.0.0 + com.litongjava + tio-http-server-benchmark + 1.0 + ${project.artifactId} + + UTF-8 + 1.8 + ${java.version} + ${java.version} + 23.1.1 + com.litongjava.tio.http.server.MainApp + + + + com.litongjava + tio-http-server + 3.7.3.v20240919-RELEASE + + + com.litongjava + java-db + 1.2.6 + + + junit + junit + 4.12 + test + + + + + + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.52 + + + + net.sf.ehcache + ehcache-core + 2.6.11 + + + + mysql + mysql-connector-java + 5.1.46 + + + + com.zaxxer + HikariCP + 4.0.3 + + + + + + + development + + true + + + + ch.qos.logback + logback-classic + 1.2.3 + + + + + + + production + + + ch.qos.logback + logback-classic + 1.2.3 + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.4 + + ${main.class} + org.projectlombok + + + + + + repackage + + + + + + + + + + assembly + + + ch.qos.logback + logback-classic + 1.2.3 + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.1 + + + + ${main.class} + + + + jar-with-dependencies + + false + + + + make-assembly + package + + single + + + + + + + + + native + + + + org.slf4j + slf4j-jdk14 + 1.7.31 + + + + org.graalvm.sdk + graal-sdk + ${graalvm.version} + provided + + + + ${project.artifactId} + + + org.graalvm.nativeimage + native-image-maven-plugin + 21.2.0 + + + + native-image + + package + + + + false + ${project.artifactId} + ${main.class} + + -H:+RemoveSaturatedTypeFlows + --allow-incomplete-classpath + --no-fallback + + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java new file mode 100644 index 00000000000..43a6bfc5804 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java @@ -0,0 +1,66 @@ +package com.litongjava.tio.http.server; + +import com.litongjava.tio.http.common.HttpConfig; +import com.litongjava.tio.http.common.handler.ITioHttpRequestHandler; +import com.litongjava.tio.http.server.config.EhCachePluginConfig; +import com.litongjava.tio.http.server.config.EnjoyEngineConfig; +import com.litongjava.tio.http.server.config.MysqlDbConfig; +import com.litongjava.tio.http.server.controller.CacheController; +import com.litongjava.tio.http.server.controller.DbController; +import com.litongjava.tio.http.server.controller.IndexController; +import com.litongjava.tio.http.server.handler.DefaultHttpRequestDispatcher; +import com.litongjava.tio.http.server.router.DefaultHttpReqeustRouter; +import com.litongjava.tio.http.server.router.HttpRequestRouter; +import com.litongjava.tio.server.ServerTioConfig; +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MainApp { + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + EnvUtils.load(); + // add route + IndexController controller = new IndexController(); + + HttpRequestRouter simpleHttpRoutes = new DefaultHttpReqeustRouter(); + simpleHttpRoutes.add("/", controller::index); + simpleHttpRoutes.add("/plaintext", controller::plaintext); + simpleHttpRoutes.add("/json", controller::json); + + DbController dbQueryController = new DbController(); + simpleHttpRoutes.add("/db", dbQueryController::db); + simpleHttpRoutes.add("/queries", dbQueryController::queries); + simpleHttpRoutes.add("/updates", dbQueryController::updates); + simpleHttpRoutes.add("/fortunes", dbQueryController::fortunes); + + CacheController cacheController = new CacheController(); + simpleHttpRoutes.add("/cachedQuery", cacheController::cachedQuery); + + // config server + HttpConfig httpConfig = new HttpConfig(8080, null, null, null); + httpConfig.setUseSession(false); + httpConfig.setWelcomeFile(null); + httpConfig.setCheckHost(false); + httpConfig.setCompatible1_0(false); + + ITioHttpRequestHandler requestHandler = new DefaultHttpRequestDispatcher(httpConfig, simpleHttpRoutes); + HttpServerStarter httpServerStarter = new HttpServerStarter(httpConfig, requestHandler); + ServerTioConfig serverTioConfig = httpServerStarter.getServerTioConfig(); + // close Heartbeat + serverTioConfig.setHeartbeatTimeout(0); + serverTioConfig.statOn = false; + // start server + try { + new MysqlDbConfig().init(); + new EnjoyEngineConfig().engine(); + new EhCachePluginConfig().ehCachePlugin(); + httpServerStarter.start(); + long end = System.currentTimeMillis(); + System.out.println((end - start) + "ms"); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + + } +} \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java new file mode 100644 index 00000000000..f949432cd5b --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java @@ -0,0 +1,12 @@ + package com.litongjava.tio.http.server.config; + +import com.litongjava.ehcache.EhCachePlugin; + +public class EhCachePluginConfig { + + public EhCachePlugin ehCachePlugin() { + EhCachePlugin ehCachePlugin = new EhCachePlugin(); + ehCachePlugin.start(); + return ehCachePlugin; + } +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java new file mode 100644 index 00000000000..b40c74c448d --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java @@ -0,0 +1,22 @@ +package com.litongjava.tio.http.server.config; + +import com.jfinal.template.Engine; + +public class EnjoyEngineConfig { + + private final String RESOURCE_BASE_PATH = "/templates/"; + + public Engine engine() { + Engine engine = Engine.use(); + engine.setBaseTemplatePath(RESOURCE_BASE_PATH); + engine.setToClassPathSourceFactory(); + // 支持模板热加载,绝大多数生产环境下也建议配置成 true,除非是极端高性能的场景 + // engine.setDevMode(true); + // 配置极速模式,性能提升 13% + Engine.setFastMode(true); + // jfinal 4.9.02 新增配置:支持中文表达式、中文变量名、中文方法名、中文模板函数名 + Engine.setChineseExpression(true); + return engine; + } + +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java new file mode 100644 index 00000000000..8a547854783 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java @@ -0,0 +1,31 @@ +package com.litongjava.tio.http.server.config; + +import com.litongjava.db.activerecord.ActiveRecordPlugin; +import com.litongjava.db.activerecord.OrderedFieldContainerFactory; +import com.litongjava.db.hikaricp.HikariCpPlugin; +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MysqlDbConfig { + + public void init() { + // start active recored + String jdbcUrl = EnvUtils.get("JDBC_URL"); + // String jdbcUrl = "jdbc:mysql://192.168.3.9/hello_world"; + + String jdbcUser = EnvUtils.get("JDBC_USER"); + // String jdbcUser = "root"; + + String jdbcPswd = EnvUtils.get("JDBC_PSWD"); + // String jdbcPswd = "robot_123456#"; + HikariCpPlugin hikariCpPlugin = new HikariCpPlugin(jdbcUrl, jdbcUser, jdbcPswd); + + ActiveRecordPlugin arp = new ActiveRecordPlugin(hikariCpPlugin); + arp.setContainerFactory(new OrderedFieldContainerFactory()); + + // arp.setShowSql(true); + + hikariCpPlugin.start(); + boolean start = arp.start(); + System.out.println("db started:" + start); + } +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java new file mode 100644 index 00000000000..6ecd7664ac1 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java @@ -0,0 +1,41 @@ +package com.litongjava.tio.http.server.controller; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.fastjson2.JSON; +import com.litongjava.db.activerecord.Db; +import com.litongjava.db.activerecord.Record; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.utils.RandomUtils; + +public class CacheController { + // private Logger log = LoggerFactory.getLogger(this.getClass()); + + public HttpResponse cachedQuery(HttpRequest request) { + String queries = request.getParam("queries"); + List> recordMaps = RandomUtils.randomWorldNumbers() + // limit + .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 + .mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象 + .filter(Objects::nonNull) // 过滤掉 null 值 + .map(Record::toMap) // 将每个 Record 对象转换为 Map + .collect(Collectors.toList()); // 收集到 List + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(recordMaps)); + return httpResponse; + + } + + private Record findByIdWithCache(String tableName, int id) { + String sql = "SELECT id, randomNumber FROM world WHERE id = ?"; + return Db.findFirstByCache(tableName, id, sql, id); + } +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java new file mode 100644 index 00000000000..699b313bd69 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java @@ -0,0 +1,127 @@ +package com.litongjava.tio.http.server.controller; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.fastjson2.JSON; +import com.jfinal.template.Engine; +import com.jfinal.template.Template; +import com.litongjava.db.activerecord.Db; +import com.litongjava.db.activerecord.Record; +import com.litongjava.ehcache.EhCache; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.model.Fortune; +import com.litongjava.tio.http.server.util.Resps; +import com.litongjava.tio.http.server.utils.BeanConverterUtils; +import com.litongjava.tio.http.server.utils.RandomUtils; + +public class DbController { + + public HttpResponse db(HttpRequest request) { + Integer id = request.getInt("id"); + if (id == null) { + id = RandomUtils.randomWorldNumber(); + } + + //System.out.println("id:" + id); + HttpResponse httpResponse = new HttpResponse(request); + + // int id = 11; + // String sql="SELECT id, randomNumber FROM world WHERE id = ?"; + + Record recored = Db.findById("world", id); + if (recored != null) { + httpResponse.setBody(JSON.toJSONBytes(recored.toMap())); + } else { + httpResponse.setBody("{}".getBytes()); + } + + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + + return httpResponse; + } + + // @GetMapping("/queries") + public HttpResponse queries(HttpRequest request) { + String queries = request.getParam("queries"); + List> recordMaps = RandomUtils.randomWorldNumbers() + // limit + .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 + .mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象 + .filter(Objects::nonNull) // 过滤掉 null 值 + .map(Record::toMap) // 将每个 Record 对象转换为 Map + .collect(Collectors.toList()); // 收集到 List + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(recordMaps)); + return httpResponse; + } + +//@GetMapping("/updates") + public HttpResponse updates(HttpRequest request) { + String queries = request.getParam("queries"); + + EhCache.removeAll("world"); + + List> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers + // limit + .limit(RandomUtils.parseQueryCount(queries)) + // map + .mapToObj(id -> Db.findById("world", id)) + // not null + .filter(Objects::nonNull).map(record -> { + int currentRandomNumber = record.getInt("randomNumber"); // "randomnumber" + int newRandomNumber; + do { + newRandomNumber = RandomUtils.randomWorldNumber(); + } while (newRandomNumber == currentRandomNumber); + + record.set("randomnumber", newRandomNumber); + Db.update("world", "id", record); // update + return record; + }) + // tomap + .map(Record::toMap) + // to List + .collect(Collectors.toList()); + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(updatedRecords)); + return httpResponse; + } + + public HttpResponse fortunes(HttpRequest request) throws IllegalAccessException, InstantiationException { + List records = Db.find("SELECT * FROM fortune"); + + List fortunes = new ArrayList<>(records.size()); + for (Record record : records) { + fortunes.add(BeanConverterUtils.toBean(record.toMap(), Fortune.class)); + } + // 添加额外的 Fortune + fortunes.add(new Fortune(0L, "Additional fortune added at request time.")); + + // 按照消息排序 + fortunes.sort(Comparator.comparing(Fortune::getMessage)); + + Map viewData = new HashMap<>(); + viewData.put("fortunes", fortunes); + + // 转换为 HTML + Engine engine = Engine.use(); + String filename = "fortunes.html"; + Template template = engine.getTemplate(filename); + String html = template.renderToString(viewData); + + return Resps.html(request, html); + } +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/IndexController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/IndexController.java new file mode 100644 index 00000000000..cf87426dda3 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/IndexController.java @@ -0,0 +1,40 @@ +package com.litongjava.tio.http.server.controller; + +import com.alibaba.fastjson2.JSON; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.model.Message; +import com.litongjava.tio.http.server.util.Resps; + +/** + * ab -k -n1000000 -c10 http://127.0.0.1:8080/json + * ab -k -n1000000 -c10 http://127.0.0.1:8080/plaintext + */ +public class IndexController { + private static final String HELLO_WORLD = "Hello, World!"; + + private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD.getBytes(); + + public HttpResponse index(HttpRequest request) { + return Resps.txt(request, "tio-server"); + } + + public HttpResponse plaintext(HttpRequest request) { + // 更高性能的写法 + HttpResponse ret = new HttpResponse(request); + ret.setBody(HELLO_WORLD_BYTES); + ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT); + return ret; + } + + // 在IndexController中添加 + public HttpResponse json(HttpRequest request) { + // 更高性能的写法 + HttpResponse ret = new HttpResponse(request); + ret.setBody(JSON.toJSONString(new Message(HELLO_WORLD)).getBytes()); + ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + return ret; + } +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Fortune.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Fortune.java new file mode 100644 index 00000000000..728db88b837 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Fortune.java @@ -0,0 +1,23 @@ +package com.litongjava.tio.http.server.model; + +public final class Fortune { + + public Long id; + public String message; + + public Fortune() { + } + + public Fortune(Long id, String message) { + this.id = id; + this.message = message; + } + + public Long getId() { + return id; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Message.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Message.java new file mode 100644 index 00000000000..2ad66214e0f --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/Message.java @@ -0,0 +1,12 @@ +package com.litongjava.tio.http.server.model; +public final class Message { + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/World.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/World.java new file mode 100644 index 00000000000..06c4ed9a22b --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/model/World.java @@ -0,0 +1,32 @@ +package com.litongjava.tio.http.server.model; + +public final class World { + + public int id; + public int randomnumber; + + protected World() { + } + + public World(int id, int randomnumber) { + this.id = id; + this.randomnumber = randomnumber; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getRandomnumber() { + return randomnumber; + } + + public void setRandomnumber(int randomnumber) { + this.randomnumber = randomnumber; + } + +} \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheName.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheName.java new file mode 100644 index 00000000000..5707d4f05d4 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheName.java @@ -0,0 +1,50 @@ +package com.litongjava.tio.http.server.services; + +public class CacheName { + // `cacheName`(缓存名称) + private String name; + // `timeToLiveSeconds`(生存时间)和`timeToIdleSeconds`(闲置时间)。 + private Long timeToLiveSeconds; + private Long timeToIdleSeconds; + + public CacheName() { + } + + public CacheName(String name, Long timeToLiveSeconds, Long timeToIdleSeconds) { + super(); + this.name = name; + this.timeToLiveSeconds = timeToLiveSeconds; + this.timeToIdleSeconds = timeToIdleSeconds; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getTimeToLiveSeconds() { + return timeToLiveSeconds; + } + + public void setTimeToLiveSeconds(Long timeToLiveSeconds) { + this.timeToLiveSeconds = timeToLiveSeconds; + } + + public Long getTimeToIdleSeconds() { + return timeToIdleSeconds; + } + + public void setTimeToIdleSeconds(Long timeToIdleSeconds) { + this.timeToIdleSeconds = timeToIdleSeconds; + } + + @Override + public String toString() { + return "CacheName [name=" + name + ", timeToLiveSeconds=" + timeToLiveSeconds + ", timeToIdleSeconds=" + + timeToIdleSeconds + "]"; + } + +} \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java new file mode 100644 index 00000000000..5ab5d7e58e6 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java @@ -0,0 +1,17 @@ +package com.litongjava.tio.http.server.services; + +import java.util.ArrayList; +import java.util.List; + +import com.litongjava.model.time.Time; + +public class CacheNameService { + private CacheName demo = new CacheName("world", null, Time.MINUTE_1 * 10); + + public List cacheNames() { + List list = new ArrayList<>(); + list.add(demo); + return list; + } + +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java new file mode 100644 index 00000000000..11796feeb0f --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java @@ -0,0 +1,31 @@ +package com.litongjava.tio.http.server.utils; + +import java.lang.reflect.Field; +import java.util.Map; + +public class BeanConverterUtils { + + /** + * Map to to bean + */ + public static T toBean(Map map, Class beanClass) + throws IllegalAccessException, InstantiationException { + + T bean = beanClass.newInstance(); // 创建 Bean 的实例 + + for (Field field : beanClass.getDeclaredFields()) { + field.setAccessible(true); // 确保私有字段也可以访问 + + if (map.containsKey(field.getName())) { + Object value = map.get(field.getName()); + + // 如果字段类型与值类型兼容,则设置字段的值 + if (value != null && field.getType().isAssignableFrom(value.getClass())) { + field.set(bean, value); + } + } + } + + return bean; + } +} diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java new file mode 100644 index 00000000000..e18e98ef880 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java @@ -0,0 +1,36 @@ +package com.litongjava.tio.http.server.utils; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +public class RandomUtils { + + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; +// private static final int MAX_WORLD_NUMBER_PLUS_ONE = 30; + + public static int randomWorldNumber() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); + } + + public static IntStream randomWorldNumbers() { + return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE) + // distinct() allows us to avoid using Hibernate's first-level cache in + // the JPA-based implementation. Using a cache like that would bypass + // querying the database, which would violate the test requirements. + .distinct(); + } + + public static int parseQueryCount(String textValue) { + if (textValue == null) { + return 1; + } + int parsedValue; + try { + parsedValue = Integer.parseInt(textValue); + } catch (NumberFormatException e) { + return 1; + } + return Math.min(500, Math.max(1, parsedValue)); + } +} diff --git a/frameworks/Java/tio-http-server/src/main/resources/app.properties b/frameworks/Java/tio-http-server/src/main/resources/app.properties new file mode 100644 index 00000000000..b73b6ff144d --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/resources/app.properties @@ -0,0 +1,9 @@ +http.response.header.showServer=true + +#JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false&allowPublicKeyRetrieval=true +#JDBC_USER=root +#JDBC_PSWD=robot_123456# + +JDBC_URL=jdbc:mysql://tfb-database/hello_world +JDBC_USER=benchmarkdbuser +JDBC_PSWD=benchmarkdbpass \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/resources/ehcache.xml b/frameworks/Java/tio-http-server/src/main/resources/ehcache.xml new file mode 100644 index 00000000000..79b79e49479 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/resources/ehcache.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/frameworks/Java/tio-http-server/src/main/resources/logback.xml b/frameworks/Java/tio-http-server/src/main/resources/logback.xml new file mode 100644 index 00000000000..aff0c711191 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/resources/logback.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + ${LOG_HOME}/project-name-%d{yyyy-MM-dd}.log + + 180 + + + + 10MB + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/resources/templates/fortunes.html b/frameworks/Java/tio-http-server/src/main/resources/templates/fortunes.html new file mode 100644 index 00000000000..1f6817df007 --- /dev/null +++ b/frameworks/Java/tio-http-server/src/main/resources/templates/fortunes.html @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + #for(fortune : fortunes) + + + + + #end +
      idmessage
      #(fortune.id)#escape(fortune.message)
      + + diff --git a/frameworks/Java/tio-http-server/src/test/java/com/litongjava/tio/http/server/MainAppTest.java b/frameworks/Java/tio-http-server/src/test/java/com/litongjava/tio/http/server/MainAppTest.java new file mode 100644 index 00000000000..e469fa256ef --- /dev/null +++ b/frameworks/Java/tio-http-server/src/test/java/com/litongjava/tio/http/server/MainAppTest.java @@ -0,0 +1,15 @@ +package com.litongjava.tio.http.server; + +import org.junit.Test; + +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MainAppTest { + + @Test + public void test() { + boolean boolean1 = EnvUtils.getBoolean("native", false); + System.out.println(boolean1); + } + +} diff --git a/frameworks/Java/tio-http-server/tio-server-native.dockerfile b/frameworks/Java/tio-http-server/tio-server-native.dockerfile new file mode 100644 index 00000000000..8dd0f012ea0 --- /dev/null +++ b/frameworks/Java/tio-http-server/tio-server-native.dockerfile @@ -0,0 +1,9 @@ +FROM litongjava/maven:3.8.8-graalvm-jdk-21-slim +WORKDIR /t-io +COPY pom.xml pom.xml +COPY src src +RUN mvn package -Pnative -q + +EXPOSE 8080 + +CMD ["/t-io/target/tio-http-server-benchmark", " --native=true"] diff --git a/frameworks/Java/tio-http-server/tio-server.dockerfile b/frameworks/Java/tio-http-server/tio-server.dockerfile new file mode 100644 index 00000000000..e9218a84790 --- /dev/null +++ b/frameworks/Java/tio-http-server/tio-server.dockerfile @@ -0,0 +1,19 @@ +FROM litongjava/maven:3.8.8-jdk8u391 AS builder +WORKDIR /app + +COPY pom.xml pom.xml +RUN mvn dependency:go-offline -q + +COPY src src +RUN mvn package -Passembly -q +RUN ls -l && ls -l target + +FROM litongjava/jre:8u391-stable-slim + +WORKDIR /app + +COPY --from=builder /app/target/tio-http-server-benchmark-1.0.jar /app/target/tio-http-server-benchmark-1.0.jar + +EXPOSE 8080 + +CMD ["java","-jar", "/app/target/tio-http-server-benchmark-1.0.jar"] \ No newline at end of file From c9cea2fc0108a2e8b20f62cbca4dc61084844e1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Dec 2024 03:32:43 +0000 Subject: [PATCH 0983/1766] Bump ch.qos.logback:logback-classic in /frameworks/Java/tio-http-server Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.2.3 to 1.2.13. - [Commits](https://github.com/qos-ch/logback/compare/v_1.2.3...v_1.2.13) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/tio-http-server/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index 60c75e68fd5..2b16997b60e 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -77,7 +77,7 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.13 @@ -89,7 +89,7 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.13 @@ -121,7 +121,7 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.13 From 2efa84ebc6579f804596cb67ed0ae2940eed6e9f Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Wed, 25 Dec 2024 14:30:49 +0800 Subject: [PATCH 0984/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 2 +- .../src/main/java/org/smartboot/http/Bootstrap.java | 12 ++++++------ .../src/main/java/org/smartboot/http/JsonUtil.java | 2 +- .../org/smartboot/http/MultipleQueriesHandler.java | 9 +++++---- .../java/org/smartboot/http/SingleQueryHandler.java | 7 ++++--- .../main/java/org/smartboot/http/UpdateHandler.java | 9 +++++---- 6 files changed, 22 insertions(+), 19 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index a4107b3d3e8..48ef8c57303 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.5 + 2.6.1-dev 5.0.0 0.9.23
      diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 9dda965e0be..920970055f4 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -11,11 +11,11 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.smartboot.Message; -import org.smartboot.http.server.HttpBootstrap; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; -import org.smartboot.http.server.handler.HttpRouteHandler; +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServer; +import tech.smartboot.feat.core.server.HttpServerHandler; +import tech.smartboot.feat.core.server.handler.HttpRouteHandler; import javax.sql.DataSource; @@ -25,7 +25,7 @@ public class Bootstrap { public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - HttpBootstrap bootstrap = new HttpBootstrap(); + HttpServer bootstrap = new HttpServer(); bootstrap.configuration() .threadNum(cpuNum) .headerLimiter(0) 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 b20525ec571..31a7d546119 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 @@ -5,7 +5,7 @@ import com.jsoniter.spi.JsonException; import com.jsoniter.spi.Slice; import jakarta.servlet.http.HttpServletResponse; -import org.smartboot.http.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpResponse; import java.io.IOException; diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index 61b9f66b344..ac4807a9284 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -1,9 +1,10 @@ package org.smartboot.http; -import org.smartboot.http.common.utils.NumberUtils; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; + +import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index b69495d1a5e..52a96b9ca57 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -1,8 +1,9 @@ package org.smartboot.http; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; + +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index 065bed5a9a6..3217adea343 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -1,9 +1,10 @@ package org.smartboot.http; -import org.smartboot.http.common.utils.NumberUtils; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; + +import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; From 0e9ad232a2a176c417d0bd3e772792eba3c4bbd4 Mon Sep 17 00:00:00 2001 From: "pavel.mash" Date: Wed, 25 Dec 2024 14:31:04 +0200 Subject: [PATCH 0985/1766] [mORMot] - upgrade to mORMot@2.3.9262 with HTTP pipelining mode improvements --- frameworks/Pascal/mormot/setup_and_build.sh | 2 +- frameworks/Pascal/mormot/src/raw.pas | 24 +++++++-------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index c19884f9e1b..5c16c908799 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/2017bddac17a838c9584763e4bd7538aa6f8a529 +URL=https://github.com/synopse/mORMot2/tarball/53bee75f81062db0700c97dfa9dfb5e9ce408679 #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 1f24df7173d..2ea5735327e 100644 --- a/frameworks/Pascal/mormot/src/raw.pas +++ b/frameworks/Pascal/mormot/src/raw.pas @@ -319,8 +319,7 @@ function TRawAsyncServer.json(ctxt: THttpServerRequest): cardinal; msgRec: TMessageRec; begin msgRec.message := pointer(HELLO_WORLD); - ctxt.SetOutJson(@msgRec, TypeInfo(TMessageRec)); - result := HTTP_SUCCESS; + result := ctxt.SetOutJson(@msgRec, TypeInfo(TMessageRec)); end; function TRawAsyncServer.db(ctxt: THttpServerRequest): cardinal; @@ -329,8 +328,7 @@ function TRawAsyncServer.db(ctxt: THttpServerRequest): cardinal; begin w := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld(Lecuyer)); try - ctxt.SetOutJson(w); - result := HTTP_SUCCESS; + result := ctxt.SetOutJson(w); finally w.Free; end; @@ -346,9 +344,8 @@ function TRawAsyncServer.queries(ctxt: THttpServerRequest): cardinal; gen := Lecuyer; for i := 0 to length(res) - 1 do res[i] := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld(gen)); - ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); + result := ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); ObjArrayClear(res); - result := HTTP_SUCCESS; end; function TRawAsyncServer.cached_queries(ctxt: THttpServerRequest): cardinal; @@ -361,8 +358,7 @@ function TRawAsyncServer.cached_queries(ctxt: THttpServerRequest): cardinal; gen := Lecuyer; for i := 0 to length(res) - 1 do res[i] := fOrmCache.Get(ComputeRandomWorld(gen)); - ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); - result := HTTP_SUCCESS; + result := ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); end; function OrmFortuneCompareByMessage(const A, B): integer; @@ -436,9 +432,8 @@ function TRawAsyncServer.rawdb(ctxt: THttpServerRequest): cardinal; stmt.ExecutePrepared; if stmt.Step then begin - ctxt.SetOutJson( + result := ctxt.SetOutJson( '{"id":%,"randomNumber":%}', [stmt.ColumnInt(0), stmt.ColumnInt(1)]); - result := HTTP_SUCCESS; stmt.ReleaseRows; end; stmt := nil; @@ -450,8 +445,7 @@ function TRawAsyncServer.rawqueries(ctxt: THttpServerRequest): cardinal; begin if not GetRawRandomWorlds(GetQueriesParamValue(ctxt), res) then exit(HTTP_SERVERERROR); - ctxt.SetOutJson(@res, TypeInfo(TWorlds)); - result := HTTP_SUCCESS; + result := ctxt.SetOutJson(@res, TypeInfo(TWorlds)); end; function TRawAsyncServer.rawcached(ctxt: THttpServerRequest): cardinal; @@ -464,8 +458,7 @@ function TRawAsyncServer.rawcached(ctxt: THttpServerRequest): cardinal; gen := Lecuyer; for i := 0 to length(res) - 1 do res[i] := fRawCache[ComputeRandomWorld(gen) - 1]; - ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); - result := HTTP_SUCCESS; + result := ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds)); end; function TRawAsyncServer.rawfortunes(ctxt: THttpServerRequest): cardinal; @@ -555,8 +548,7 @@ function TRawAsyncServer.rawupdates(ctxt: THttpServerRequest): cardinal; end; end; stmt.ExecutePrepared; - ctxt.SetOutJson(@res, TypeInfo(TWorlds)); - result := HTTP_SUCCESS; + result := ctxt.SetOutJson(@res, TypeInfo(TWorlds)); end; // asynchronous PostgreSQL pipelined DB access From cc05c876111d0430ecc9ba208a9e3afd8beaee51 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Sun, 29 Dec 2024 17:39:33 +0800 Subject: [PATCH 0986/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 2 +- .../src/main/java/org/smartboot/http/Bootstrap.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 48ef8c57303..afdeea27141 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.6.1-dev + 2.7 5.0.0 0.9.23 diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 920970055f4..4875d68c8d8 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -27,7 +27,7 @@ public static void main(String[] args) { // 定义服务器接受的消息类型以及各类消息对应的处理器 HttpServer bootstrap = new HttpServer(); bootstrap.configuration() - .threadNum(cpuNum) + .threadNum(cpuNum + 1) .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4); From 7286bd06d2e92f46e0016c9b30ecaef82eb30821 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Mon, 30 Dec 2024 21:17:32 +0700 Subject: [PATCH 0987/1766] added r2dbc --- frameworks/Kotlin/ktor/benchmark_config.json | 23 +++ .../ktor/ktor-exposed/app/build.gradle.kts | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile | 13 ++ frameworks/Kotlin/ktor/ktor-r2dbc/README.md | 50 ++++++ frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml | 163 +++++++++++++++++ .../src/main/assembly/cio-bundle.xml | 30 ++++ .../src/main/assembly/jetty-bundle.xml | 30 ++++ .../src/main/assembly/netty-bundle.xml | 29 +++ .../org/jetbrains/ktor/benchmarks/Hello.kt | 169 ++++++++++++++++++ .../ktor/benchmarks/models/Fortune.kt | 6 + .../ktor/benchmarks/models/Message.kt | 6 + .../jetbrains/ktor/benchmarks/models/World.kt | 6 + .../src/main/resources/application.conf | 20 +++ .../ktor-r2dbc/src/main/resources/logback.xml | 21 +++ frameworks/Kotlin/ktor/ktor/README.md | 6 +- frameworks/Kotlin/ktor/ktor/pom.xml | 2 +- .../org/jetbrains/ktor/benchmarks/Hello.kt | 2 +- 18 files changed, 573 insertions(+), 7 deletions(-) create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/README.md create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/netty-bundle.xml create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml diff --git a/frameworks/Kotlin/ktor/benchmark_config.json b/frameworks/Kotlin/ktor/benchmark_config.json index 3a213a240ba..5a9b1816736 100644 --- a/frameworks/Kotlin/ktor/benchmark_config.json +++ b/frameworks/Kotlin/ktor/benchmark_config.json @@ -25,6 +25,29 @@ "notes": "http://ktor.io/", "versus": "netty" }, + "r2dbc": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + + "port": 9090, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "ktor", + "language": "Kotlin", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ktor-netty-r2dbc", + "notes": "http://ktor.io/", + "versus": "netty" + }, "jetty": { "plaintext_url": "/plaintext", "json_url": "/json", diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts index 80a9debfa16..5d6db161d20 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts @@ -9,7 +9,7 @@ repositories { mavenCentral() } -val ktorVersion = "3.0.1" +val ktorVersion = "3.0.3" val kotlinxSerializationVersion = "1.7.3" val exposedVersion = "0.56.0" diff --git a/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties index bdc9a83b1e6..4eaec467050 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile b/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile new file mode 100644 index 00000000000..076a51a1416 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as maven +WORKDIR /ktor +COPY ktor/pom.xml pom.xml +COPY ktor/src src +RUN mvn clean package -q + +FROM amazoncorretto:21-al2023-headless +WORKDIR /ktor +COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-netty-bundle.jar app.jar + +EXPOSE 9090 + +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/README.md b/frameworks/Kotlin/ktor/ktor-r2dbc/README.md new file mode 100644 index 00000000000..5b758d68dbd --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/README.md @@ -0,0 +1,50 @@ +# Ktor + +Ktor is a framework for building servers and clients in connected systems using Kotlin programming language. +More information is available at [ktor.io](http://ktor.io). + +# Setup + +* Java 21 +* Postgres server + +# Requirements + +* Maven 3 +* JDK 21 +* Kotlin +* ktor +* netty +* R2DBC + +Maven is downloaded automatically via Maven Wrapper script (`mvnw`), add dependencies are specified in `pom.xml` so will be downloaded automatically from maven central and jcenter repositories. + +# Deployment + +Run maven to build a bundle + +```bash +./mvnw package +``` + +Once bundle build complete and mysql server is running you can launch the application + +```bash +java -jar target/tech-empower-framework-benchmark-1.0-SNAPSHOT.jar +``` + +Please note that the server holds tty so you may need nohup. See `setup.sh` for details. + +# Contact + +[Leonid Stashevsky](https://github.com/e5l) + +[Sergey Mashkov](https://github.com/cy6erGn0m) + +[Ilya Ryzhenkov](https://github.com/orangy) + +[Ilya Nemtsev](https://github.com/inemtsev) + +Slack ktor channel https://kotlinlang.slack.com/messages/ktor (you need an [invite](http://slack.kotlinlang.org/) to join) + + diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml new file mode 100644 index 00000000000..9590236be6c --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml @@ -0,0 +1,163 @@ + + + + 4.0.0 + + org.jetbrains.ktor + tech-empower-framework-benchmark + 1.0-SNAPSHOT + jar + + org.jetbrains.ktor tech-empower-framework-benchmark + + + 2.0.21 + 1.10.1 + 3.0.3 + 1.7.3 + 0.11.0 + UTF-8 + 1.2.13 + 42.7.4 + 1.0.7.RELEASE + + + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.jetbrains.kotlinx + kotlinx-serialization-core + ${serialization.version} + + + org.jetbrains.kotlinx + kotlinx-serialization-json + ${serialization.version} + + + org.jetbrains.kotlinx + kotlinx-html-jvm + ${kotlinx.html.version} + + + org.jetbrains.kotlinx + kotlinx-coroutines-core + ${kotlin.coroutines.version} + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + ${kotlin.coroutines.version} + + + io.ktor + ktor-server-default-headers-jvm + ${ktor.version} + + + io.ktor + ktor-server-html-builder-jvm + ${ktor.version} + + + + org.postgresql + r2dbc-postgresql + ${r2dbc.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + io.ktor + ktor-server-netty-jvm + ${ktor.version} + + + + + src/main/kotlin + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + kotlinx-serialization + + + + + org.jetbrains.kotlin + kotlin-maven-serialization + ${kotlin.version} + + + + + maven-jar-plugin + + true + + + + default-jar + none + + + + + maven-assembly-plugin + 3.0.0 + + + + netty + + single + + + package + + + + src/main/assembly/netty-bundle.xml + + + + io.ktor.server.netty.EngineMain + + + + + + + + + diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml new file mode 100644 index 00000000000..8b515de6096 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml @@ -0,0 +1,30 @@ + + cio-bundle + + jar + + + false + + + + true + runtime + + true + + + *:ktor-server-netty + *:ktor-server-jetty + + + + + + + ${project.build.outputDirectory} + / + + + \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml new file mode 100644 index 00000000000..8b55f09e7ef --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml @@ -0,0 +1,30 @@ + + jetty-bundle + + jar + + + false + + + + true + runtime + + true + + + *:ktor-server-netty + *:ktor-server-cio + + + + + + + ${project.build.outputDirectory} + / + + + \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/netty-bundle.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/netty-bundle.xml new file mode 100644 index 00000000000..58ff7cff593 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/netty-bundle.xml @@ -0,0 +1,29 @@ + + netty-bundle + + + jar + + + false + + + + true + runtime + + + *:ktor-server-jetty + *:ktor-server-cio + + + + + + + ${project.build.outputDirectory} + / + + + \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt new file mode 100644 index 00000000000..bac39bd6a7e --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -0,0 +1,169 @@ +package org.jetbrains.ktor.benchmarks + +import io.ktor.http.* +import io.ktor.http.content.* +import io.ktor.server.application.* +import io.ktor.server.config.* +import io.ktor.server.html.* +import io.ktor.server.plugins.defaultheaders.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import io.r2dbc.spi.ConnectionFactories +import io.r2dbc.spi.ConnectionFactory +import io.r2dbc.spi.ConnectionFactoryOptions +import kotlinx.coroutines.* +import kotlinx.coroutines.reactive.awaitFirstOrNull +import kotlinx.html.* +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.jetbrains.ktor.benchmarks.Constants.DB_ROWS +import org.jetbrains.ktor.benchmarks.Constants.FORTUNES_QUERY +import org.jetbrains.ktor.benchmarks.Constants.UPDATE_QUERY +import org.jetbrains.ktor.benchmarks.Constants.WORLD_QUERY +import org.jetbrains.ktor.benchmarks.models.Fortune +import org.jetbrains.ktor.benchmarks.models.Message +import org.jetbrains.ktor.benchmarks.models.World +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono +import kotlin.random.Random + +fun Application.main() { + val config = ApplicationConfig("application.conf") + val dbConnFactory = configurePostgresR2DBC(config) + + install(DefaultHeaders) + + val helloWorldContent = TextContent("Hello, World!", ContentType.Text.Plain) + + routing { + get("/plaintext") { + call.respond(helloWorldContent) + } + + get("/json") { + call.respondText(Json.encodeToString(Message("Hello, world!")), ContentType.Application.Json) + } + + get("/db") { + val random = Random.Default + val request = getWorld(dbConnFactory, random) + val result = request.awaitFirstOrNull() + + call.respondText(Json.encodeToString(result), ContentType.Application.Json) + } + + suspend fun selectWorlds(queries: Int, random: Random): List = coroutineScope { + val result = ArrayList>(queries) + + repeat(queries) { + val deferred = async { + getWorld(dbConnFactory, random).awaitFirstOrNull() + } + result.add(deferred) + } + + result.awaitAll().filterNotNull() + } + + get("/queries") { + val queries = call.queries() + val random = Random.Default + + val result = selectWorlds(queries, random) + + call.respondText(Json.encodeToString(result), ContentType.Application.Json) + } + + get("/fortunes") { + val result = mutableListOf() + + val request = Flux.usingWhen(dbConnFactory.create(), { connection -> + Flux.from(connection.createStatement(FORTUNES_QUERY).execute()).flatMap { r -> + Flux.from(r.map { row, _ -> + Fortune( + row.get(0, Int::class.java)!!, row.get(1, String::class.java)!! + ) + }) + } + }, { connection -> connection.close() }) + + request.collectList().awaitFirstOrNull()?.let { result.addAll(it) } + + result.add(Fortune(0, "Additional fortune added at request time.")) + result.sortBy { it.message } + call.respondHtml { + head { title { +"Fortunes" } } + body { + table { + tr { + th { +"id" } + th { +"message" } + } + for (fortune in result) { + tr { + td { +fortune.id.toString() } + td { +fortune.message } + } + } + } + } + } + } + + get("/updates") { + val queries = call.queries() + val random = Random.Default + + val result = coroutineScope { + val worlds = selectWorlds(queries, random) + + worlds.forEach { it.randomNumber = random.nextInt(DB_ROWS) + 1 } + + val updateRequests = worlds.map { world -> + Mono.usingWhen(dbConnFactory.create(), { connection -> + Mono.from( + connection.createStatement(UPDATE_QUERY).bind(0, world.randomNumber).bind(1, world.id) + .execute() + ).flatMap { Mono.from(it.rowsUpdated) } + }, { connection -> connection.close() }) + } + + Flux.merge(updateRequests).collectList().awaitFirstOrNull() + worlds + } + + call.respondText(Json.encodeToString(result), ContentType.Application.Json) + } + } +} + +private fun getWorld( + dbConnFactory: ConnectionFactory, random: Random +): Mono = Mono.usingWhen(dbConnFactory.create(), { connection -> + Mono.from(connection.createStatement(WORLD_QUERY).bind(0, random.nextInt(DB_ROWS) + 1).execute()).flatMap { r -> + Mono.from(r.map { row, _ -> + World( + row.get(0, Int::class.java)!!, row.get(1, Int::class.java)!! + ) + }) + } +}, { connection -> connection.close() }) + +private fun configurePostgresR2DBC(config: ApplicationConfig): ConnectionFactory { + val options = ConnectionFactoryOptions.builder().option(ConnectionFactoryOptions.DRIVER, "database.driver") + .option(ConnectionFactoryOptions.DATABASE, config.property("database.url").getString()) + .option(ConnectionFactoryOptions.USER, config.property("database.user").getString()) + .option(ConnectionFactoryOptions.PASSWORD, config.property("database.password").getString()).build() + + return ConnectionFactories.get(options) +} + +private fun ApplicationCall.queries() = request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 + + +object Constants { + const val WORLD_QUERY = "SELECT id, randomNumber FROM World WHERE id = ?" + const val FORTUNES_QUERY = "SELECT id, message FROM fortune" + const val UPDATE_QUERY = "UPDATE World SET randomNumber = ? WHERE id = ?" + const val DB_ROWS = 10000 +} diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt new file mode 100644 index 00000000000..40b75ef4354 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt @@ -0,0 +1,6 @@ +package org.jetbrains.ktor.benchmarks.models + +import kotlinx.serialization.Serializable + +@Serializable +class Fortune(val id: Int, var message: String) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt new file mode 100644 index 00000000000..fc9bd1fada1 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt @@ -0,0 +1,6 @@ +package org.jetbrains.ktor.benchmarks.models + +import kotlinx.serialization.Serializable + +@Serializable +class Message(val message: String) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt new file mode 100644 index 00000000000..0c35be5c969 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt @@ -0,0 +1,6 @@ +package org.jetbrains.ktor.benchmarks.models + +import kotlinx.serialization.Serializable + +@Serializable +class World(val id: Int, var randomNumber: Int) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf new file mode 100644 index 00000000000..a253814ac55 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf @@ -0,0 +1,20 @@ +ktor { + deployment { + port = 9090 + autoreload = false + watch = [ ] + shareWorkGroup = true + } + + application { + modules = [ org.jetbrains.ktor.benchmarks.HelloKt.main ] + } +} + +database { + driver = "org.postgresql.Driver" + url = "url: r2dbc:pool://tfb-database:5432/hello_world?loggerLevel=OFF&sslmode=disable" + poolsize = 512 + username = "benchmarkdbuser" + password = "benchmarkdbpass" +} diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml new file mode 100644 index 00000000000..9fd0f518971 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml @@ -0,0 +1,21 @@ + + + + %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + true + + + + + + + + + + + + diff --git a/frameworks/Kotlin/ktor/ktor/README.md b/frameworks/Kotlin/ktor/ktor/README.md index e3c141a70e0..31f2755e24c 100644 --- a/frameworks/Kotlin/ktor/ktor/README.md +++ b/frameworks/Kotlin/ktor/ktor/README.md @@ -5,13 +5,13 @@ More information is available at [ktor.io](http://ktor.io). # Setup -* Java 17 -* MySQL server +* Java 21 +* Postgres server # Requirements * Maven 3 -* JDK 17 +* JDK 21 * Kotlin * ktor * netty diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 74d725ca6fa..670b77cdf51 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -13,7 +13,7 @@ 2.0.21 - 3.0.2 + 3.0.3 1.7.3 0.11.0 UTF-8 diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index b44808fba40..a83a16f326b 100644 --- a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -38,7 +38,7 @@ fun Application.main() { install(DefaultHeaders) - val helloWorldContent = TextContent("Hello, World!", ContentType.Text.Plain).also { it.contentLength } + val helloWorldContent = TextContent("Hello, World!", ContentType.Text.Plain) routing { get("/plaintext") { From f91d4cc1936435ed1ff45d037c20c4fe3504f588 Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Tue, 31 Dec 2024 02:27:41 +0800 Subject: [PATCH 0988/1766] [rust/viz] Upgrade to v0.10.0 (#9486) --- frameworks/Rust/viz/Cargo.toml | 11 +++++++---- frameworks/Rust/viz/src/main.rs | 14 ++++++++++---- frameworks/Rust/viz/viz-diesel.dockerfile | 4 +--- frameworks/Rust/viz/viz-pg.dockerfile | 4 +--- frameworks/Rust/viz/viz-sqlx.dockerfile | 4 +--- frameworks/Rust/viz/viz.dockerfile | 4 +--- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index b2e90cb4836..a1daab27b7f 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -24,13 +24,16 @@ path = "src/main_diesel.rs" required-features = ["diesel", "diesel-async", "sailfish"] [dependencies] -viz = "0.9" -hyper = "1.4" +viz = "0.10" +hyper = "1.5" hyper-util = "0.1" +http-body-util = "0.1" atoi = "2.0" serde = { version = "1.0", features = ["derive"] } +serde_json = "1" +mime = "0.3" rand = { version = "0.8", features = ["small_rng"] } -thiserror = "1.0" +thiserror = "2.0" futures-util = "0.3" [target.'cfg(not(unix))'.dependencies] @@ -50,7 +53,7 @@ sqlx = { version = "0.8", features = [ diesel = { version = "2.2", default-features = false, features = [ "i-implement-a-third-party-backend-and-opt-into-breaking-changes", ], optional = true } -diesel-async = { git = "https://github.com/weiznich/diesel_async.git", rev = "74867bd", version = "0.4", default-features = false, features = [ +diesel-async = { version = "0.5", default-features = false, features = [ "postgres", "bb8", ], optional = true } diff --git a/frameworks/Rust/viz/src/main.rs b/frameworks/Rust/viz/src/main.rs index 1813ac62a22..0bde892034a 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, + Bytes, Error, Request, Response, ResponseExt, Result, Router, }; mod server; @@ -22,9 +22,15 @@ async fn plaintext(_: Request) -> Result { } async fn json(_: Request) -> Result { - let mut res = Response::json(Message { - message: "Hello, World!", - })?; + let mut res = Response::with( + http_body_util::Full::new(Bytes::from( + serde_json::to_vec(&Message { + message: "Hello, World!", + }) + .unwrap(), + )), + mime::APPLICATION_JSON.as_ref(), + ); res.headers_mut() .insert(SERVER, HeaderValue::from_static("Viz")); Ok(res) diff --git a/frameworks/Rust/viz/viz-diesel.dockerfile b/frameworks/Rust/viz/viz-diesel.dockerfile index d37e0af9130..62eec4e7ebd 100644 --- a/frameworks/Rust/viz/viz-diesel.dockerfile +++ b/frameworks/Rust/viz/viz-diesel.dockerfile @@ -1,6 +1,4 @@ -FROM rust:1.79 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ +FROM rust:1.83 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz-pg.dockerfile b/frameworks/Rust/viz/viz-pg.dockerfile index 326f10a3bc6..e45d0db4402 100644 --- a/frameworks/Rust/viz/viz-pg.dockerfile +++ b/frameworks/Rust/viz/viz-pg.dockerfile @@ -1,6 +1,4 @@ -FROM rust:1.79 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ +FROM rust:1.83 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz-sqlx.dockerfile b/frameworks/Rust/viz/viz-sqlx.dockerfile index 76104544be0..62bd3cac1d8 100644 --- a/frameworks/Rust/viz/viz-sqlx.dockerfile +++ b/frameworks/Rust/viz/viz-sqlx.dockerfile @@ -1,6 +1,4 @@ -FROM rust:1.79 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ +FROM rust:1.83 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz.dockerfile b/frameworks/Rust/viz/viz.dockerfile index d6fd457b66e..16abf430a9f 100644 --- a/frameworks/Rust/viz/viz.dockerfile +++ b/frameworks/Rust/viz/viz.dockerfile @@ -1,6 +1,4 @@ -FROM rust:1.79 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ +FROM rust:1.83 ADD ./ /viz WORKDIR /viz From 30f48766c26d159aae1912be4052e4309548cb0a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 30 Dec 2024 19:28:02 +0100 Subject: [PATCH 0989/1766] [rails] Render fortune explicit (#9485) This should be slightly faster than deducing how to render. --- frameworks/Ruby/rails/app/controllers/hello_world_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index bdd96953ce8..9e9ce8b8327 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -30,6 +30,7 @@ def fortune @fortunes = Fortune.all.to_a @fortunes << Fortune.new(id: 0, message: 'Additional fortune added at request time.') @fortunes.sort_by!(&:message) + render :fortune end def update From 4454a766eeb9ea9de0b7108ff02a30f5627e5420 Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Mon, 30 Dec 2024 18:28:20 +0000 Subject: [PATCH 0990/1766] [rust/axum] Axum performance improvements (#9484) * perf: switch plaintext and json to one runtime per thread, improving performance. * perf: remove need for additional vec * perf: reduce length of query parameter * perf: increase strength of inlining hint * perf: reduce query length * perf: shorten path and use references * bug: increased length of route in line with requirements * build: upgraded dependencies * bug: increased mongodb pool size * perf: replacement of moka with quick_cache * perf: simplification of mass update query * perf: improvements to random number generation * build: upgrade rust version * fix: re-added ordering to remove deadlocks * perf: use of mimalloc --- frameworks/Rust/axum/Cargo.lock | 1401 +++++++++-------- frameworks/Rust/axum/Cargo.toml | 39 +- frameworks/Rust/axum/README.md | 8 +- frameworks/Rust/axum/axum.dockerfile | 4 +- frameworks/Rust/axum/src/common/mod.rs | 14 +- frameworks/Rust/axum/src/main.rs | 4 + frameworks/Rust/axum/src/main_mongo.rs | 18 +- frameworks/Rust/axum/src/main_mongo_raw.rs | 20 +- frameworks/Rust/axum/src/main_pg.rs | 4 + frameworks/Rust/axum/src/main_pg_pool.rs | 4 + frameworks/Rust/axum/src/main_sqlx.rs | 24 +- frameworks/Rust/axum/src/mongo/database.rs | 14 +- .../Rust/axum/src/mongo_raw/database.rs | 12 +- 13 files changed, 828 insertions(+), 738 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 8f756182439..7871df00e8c 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -1,22 +1,16 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -47,9 +41,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -76,26 +70,15 @@ dependencies = [ "yansi-term", ] -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener 5.3.1", - "event-listener-strategy", - "pin-project-lite", -] - [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", ] [[package]] @@ -115,15 +98,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.6" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", @@ -145,18 +128,18 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", - "tower 0.5.1", + "tower", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -167,7 +150,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper", "tower-layer", "tower-service", ] @@ -186,39 +169,40 @@ dependencies = [ "futures-util", "hyper", "hyper-util", + "mimalloc", "mime", - "moka", "mongodb", "num_cpus", + "quick_cache", "rand", "serde", "serde_json", "serde_path_to_error", "simd-json", - "socket2 0.5.7", + "socket2", "sqlx", "tokio", "tokio-pg-mapper", "tokio-pg-mapper-derive", "tokio-postgres", - "tower 0.5.1", + "tower", "tower-http", "yarte", ] [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -283,15 +267,15 @@ dependencies = [ [[package]] name = "bson" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a88e82b9106923b5c4d6edfca9e7db958d4e98a478ec115022e81b9b38e2c8" +checksum = "068208f2b6fcfa27a7f1ee37488d2bb8ba2640f68f5475d08e1d9130696aba59" dependencies = [ "ahash", "base64 0.13.1", "bitvec", "hex", - "indexmap", + "indexmap 2.7.0", "js-sys", "once_cell", "rand", @@ -316,15 +300,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.13" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", @@ -339,13 +323,14 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", + "serde", "windows-targets 0.52.6", ] @@ -378,9 +363,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -409,38 +394,20 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -454,9 +421,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -464,27 +431,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "darling_macro" -version = "0.13.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -507,9 +474,9 @@ dependencies = [ [[package]] name = "deadpool-postgres" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab8a4ea925ce79678034870834602a2980f4b88c09e97feb266496dbb4493d2" +checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" dependencies = [ "async-trait", "deadpool", @@ -547,17 +514,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "derive-where" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -569,8 +537,8 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 2.0.75", + "rustc_version", + "syn 2.0.91", ] [[package]] @@ -585,6 +553,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "dotenv" version = "0.15.0" @@ -614,14 +593,14 @@ dependencies = [ [[package]] name = "enum-as-inner" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -632,12 +611,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -651,12 +630,6 @@ dependencies = [ "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 = "5.3.1" @@ -668,16 +641,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener 5.3.1", - "pin-project-lite", -] - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -686,34 +649,34 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.0.32" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0596c1eac1f9e04ed902702e9878208b336edc9d6fddc8a48387349bab3666" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] name = "float-cmp" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" dependencies = [ "num-traits", ] [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", @@ -743,9 +706,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -758,9 +721,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -768,15 +731,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -796,38 +759,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -866,15 +829,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -882,7 +845,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -895,10 +858,16 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", "serde", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.5" @@ -909,23 +878,26 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", ] [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -939,6 +911,51 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-proto" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "hkdf" version = "0.12.4" @@ -959,11 +976,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -979,9 +996,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1013,9 +1030,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1025,9 +1042,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -1045,9 +1062,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-util", @@ -1056,15 +1073,14 @@ dependencies = [ "hyper", "pin-project-lite", "tokio", - "tower 0.4.13", "tower-service", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1084,174 +1100,251 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] [[package]] -name = "idna" -version = "0.2.3" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "idna" -version = "0.5.0" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "indexmap" -version = "2.4.0" +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ - "equivalent", - "hashbrown", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", ] [[package]] -name = "ipconfig" -version = "0.3.2" +name = "icu_normalizer_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ - "socket2 0.5.7", - "widestring", - "windows-sys 0.48.0", - "winreg", + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "ipnet" -version = "2.9.0" +name = "icu_properties_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] -name = "itoa" -version = "1.0.11" +name = "icu_provider" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] [[package]] -name = "jobserver" -version = "0.1.32" +name = "icu_provider_macros" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ - "libc", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "js-sys" -version = "0.3.70" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "wasm-bindgen", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "spin", + "icu_normalizer", + "icu_properties", ] [[package]] -name = "lexical-core" -version = "0.8.5" +name = "indexmap" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", + "autocfg", + "hashbrown 0.12.3", + "serde", ] [[package]] -name = "lexical-parse-float" -version = "0.8.5" +name = "indexmap" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ - "lexical-parse-integer", - "lexical-util", - "static_assertions", + "equivalent", + "hashbrown 0.15.2", + "serde", ] [[package]] -name = "lexical-parse-integer" -version = "0.8.6" +name = "ipconfig" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "lexical-util", - "static_assertions", + "socket2", + "widestring", + "windows-sys 0.48.0", + "winreg", ] [[package]] -name = "lexical-util" -version = "0.8.5" +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jobserver" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "static_assertions", + "libc", ] [[package]] -name = "lexical-write-float" -version = "0.8.5" +name = "js-sys" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ - "lexical-util", - "lexical-write-integer", - "static_assertions", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "lexical-write-integer" -version = "0.8.5" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "lexical-util", - "static_assertions", + "spin", ] [[package]] name = "libc" -version = "0.2.158" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" +dependencies = [ + "cc", + "libc", +] [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "cc", "pkg-config", @@ -1270,6 +1363,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -1301,12 +1400,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.7.3" @@ -1329,6 +1422,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mimalloc" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633" +dependencies = [ + "libmimalloc-sys", +] + [[package]] name = "mime" version = "0.3.17" @@ -1343,70 +1445,36 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", ] -[[package]] -name = "moka" -version = "0.12.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cf62eb4dd975d2dde76432fb1075c49e3ee2331cf36f1f8fd4b66550d32b6f" -dependencies = [ - "async-lock", - "async-trait", - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "event-listener 5.3.1", - "futures-util", - "once_cell", - "parking_lot", - "quanta", - "rustc_version 0.4.0", - "smallvec", - "tagptr", - "thiserror", - "triomphe", - "uuid", -] - [[package]] name = "mongodb" -version = "2.8.2" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef206acb1b72389b49bc9985efe7eb1f8a9bb18e5680d262fac26c07f44025f1" +checksum = "ff1f6edf7fe8828429647a2200f684681ca6d5a33b45edc3140c81390d852301" dependencies = [ "async-trait", "base64 0.13.1", "bitflags 1.3.2", "bson", "chrono", - "derivative", + "derive-where", "derive_more", "flate2", "futures-core", @@ -1414,22 +1482,25 @@ dependencies = [ "futures-io", "futures-util", "hex", + "hickory-proto", + "hickory-resolver", "hmac", - "lazy_static", "md-5", + "mongodb-internal-macros", + "once_cell", "pbkdf2", "percent-encoding", "rand", "rustc_version_runtime", - "rustls", - "rustls-pemfile", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_bytes", "serde_with", "sha-1", "sha2", "snap", - "socket2 0.4.10", + "socket2", "stringprep", "strsim", "take_mut", @@ -1437,14 +1508,23 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-util", - "trust-dns-proto", - "trust-dns-resolver", "typed-builder", "uuid", - "webpki-roots", + "webpki-roots 0.25.4", "zstd", ] +[[package]] +name = "mongodb-internal-macros" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b07bfd601af78e39384707a8e80041946c98260e3e0190e294ee7435823e6bf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "nom" version = "7.1.3" @@ -1520,24 +1600,24 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -1557,7 +1637,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -1610,31 +1690,11 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.75", -] - [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1665,9 +1725,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "postgres-protocol" @@ -1689,9 +1749,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02048d9e032fb3cc3413bbf7b83a15d84a5d419778e2628751896d856498eee9" +checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" dependencies = [ "bytes", "fallible-iterator", @@ -1725,39 +1785,36 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] -[[package]] -name = "quanta" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi", -] - [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick_cache" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d7c94f8935a9df96bb6380e8592c70edf497a643f94bd23b2f76b399385dbf4" +dependencies = [ + "ahash", + "equivalent", + "hashbrown 0.14.5", + "parking_lot", +] + [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1785,42 +1842,24 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "raw-cpuid" -version = "11.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" -dependencies = [ - "bitflags 2.6.0", + "ppv-lite86", + "rand_core", ] [[package]] -name = "redox_syscall" -version = "0.4.1" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "bitflags 1.3.2", + "getrandom", ] [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] @@ -1842,14 +1881,14 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1859,9 +1898,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1870,9 +1909,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "resolv-conf" @@ -1901,9 +1940,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest", @@ -1927,43 +1966,34 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver", ] [[package]] name = "rustc_version_runtime" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d31b7153270ebf48bf91c65ae5b0c00e749c4cfad505f66530ac74950249582f" +checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" dependencies = [ - "rustc_version 0.2.3", - "semver 0.9.0", + "rustc_version", + "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1974,10 +2004,24 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -1987,6 +2031,21 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -1997,11 +2056,22 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -2027,30 +2097,15 @@ dependencies = [ [[package]] name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "semver-parser" -version = "0.7.0" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.208" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] @@ -2066,22 +2121,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ - "indexmap", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -2112,24 +2167,32 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.14.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.0", "serde", + "serde_derive", + "serde_json", "serde_with_macros", + "time", ] [[package]] name = "serde_with_macros" -version = "1.5.2" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -2192,13 +2255,12 @@ dependencies = [ [[package]] name = "simd-json" -version = "0.13.10" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570c430b3d902ea083097e853263ae782dfe40857d93db019a12356c8e8143fa" +checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" dependencies = [ "getrandom", "halfbrown", - "lexical-core", "ref-cast", "serde", "serde_json", @@ -2208,9 +2270,9 @@ dependencies = [ [[package]] name = "simdutf8" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "siphasher" @@ -2232,6 +2294,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "snap" @@ -2241,19 +2306,9 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.4.10" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2280,9 +2335,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ "nom", "unicode_categories", @@ -2290,9 +2345,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2303,33 +2358,33 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" dependencies = [ - "ahash", "atoi", "byteorder", "bytes", "crc", "crossbeam-queue", "either", - "event-listener 2.5.3", + "event-listener", "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", + "hashbrown 0.14.5", "hashlink", "hex", - "indexmap", + "indexmap 2.7.0", "log", "memchr", "once_cell", "paste", "percent-encoding", - "rustls", - "rustls-pemfile", + "rustls 0.23.20", + "rustls-pemfile 2.2.0", "serde", "serde_json", "sha2", @@ -2340,27 +2395,27 @@ dependencies = [ "tokio-stream", "tracing", "url", - "webpki-roots", + "webpki-roots 0.26.7", ] [[package]] name = "sqlx-macros" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "sqlx-macros-core" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" dependencies = [ "dotenvy", "either", @@ -2376,7 +2431,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 1.0.109", + "syn 2.0.91", "tempfile", "tokio", "url", @@ -2384,12 +2439,12 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.6.0", "byteorder", "bytes", @@ -2426,12 +2481,12 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.6.0", "byteorder", "crc", @@ -2464,9 +2519,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" dependencies = [ "atoi", "flume", @@ -2479,17 +2534,17 @@ dependencies = [ "log", "percent-encoding", "serde", + "serde_urlencoded", "sqlx-core", "tracing", "url", - "urlencoding", ] [[package]] -name = "static_assertions" -version = "1.1.0" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stringprep" @@ -2504,9 +2559,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -2527,9 +2582,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.75" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -2538,21 +2593,20 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] -name = "tagptr" -version = "0.2.0" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] [[package]] name = "take_mut" @@ -2568,9 +2622,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -2581,29 +2635,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -2622,19 +2676,29 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -2647,9 +2711,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -2658,7 +2722,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2", "tokio-macros", "windows-sys 0.52.0", ] @@ -2671,7 +2735,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", ] [[package]] @@ -2696,9 +2760,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03adcf0147e203b6032c0b2d30be1415ba03bc348901f3ff1cc0df6a733e60c3" +checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" dependencies = [ "async-trait", "byteorder", @@ -2714,7 +2778,7 @@ dependencies = [ "postgres-protocol", "postgres-types", "rand", - "socket2 0.5.7", + "socket2", "tokio", "tokio-util", "whoami", @@ -2726,15 +2790,15 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -2743,9 +2807,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -2766,29 +2830,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -2796,15 +2845,13 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ "bitflags 2.6.0", "bytes", "http", - "http-body", - "http-body-util", "pin-project-lite", "tower-layer", "tower-service", @@ -2824,9 +2871,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -2836,75 +2883,24 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] -[[package]] -name = "triomphe" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" - -[[package]] -name = "trust-dns-proto" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "log", - "rand", - "smallvec", - "thiserror", - "tinyvec", - "tokio", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" -dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "parking_lot", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "trust-dns-proto", -] - [[package]] name = "typed-builder" version = "0.10.0" @@ -2924,48 +2920,42 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unicode_categories" @@ -2981,26 +2971,32 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", ] [[package]] -name = "urlencoding" -version = "2.1.3" +name = "utf16_iter" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "serde", @@ -3024,9 +3020,9 @@ checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" [[package]] name = "value-trait" -version = "0.8.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad8db98c1e677797df21ba03fca7d3bf9bec3ca38db930954e4fe6e1ea27eb4" +checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" dependencies = [ "float-cmp", "halfbrown", @@ -3060,9 +3056,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -3071,24 +3067,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3096,28 +3091,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -3129,13 +3124,22 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall", "wasite", "web-sys", ] @@ -3335,6 +3339,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -3438,6 +3454,30 @@ dependencies = [ "yarte_helpers", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -3456,7 +3496,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.91", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", ] [[package]] @@ -3465,6 +3526,28 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "zstd" version = "0.11.2+zstd.1.5.2" diff --git a/frameworks/Rust/axum/Cargo.toml b/frameworks/Rust/axum/Cargo.toml index a47514726c7..335a3b7f451 100644 --- a/frameworks/Rust/axum/Cargo.toml +++ b/frameworks/Rust/axum/Cargo.toml @@ -39,48 +39,49 @@ simd-json = [ ] [dependencies] -axum = { version = "0.7.6", default-features = false, features = [ +axum = { version = "0.7.9", default-features = false, features = [ "json", "query", "http1", "tokio", ] } deadpool = { version = "0.12.1", features = ["rt_tokio_1", "serde", "managed"] } -deadpool-postgres = { version = "0.14.0", features = ["rt_tokio_1", "serde"] } +deadpool-postgres = { version = "0.14.1", features = ["rt_tokio_1", "serde"] } dotenv = "0.15.0" -futures = "0.3.30" -futures-util = "0.3.30" -mongodb = { version = "2.8.0", features = [ +futures = "0.3.31" +futures-util = "0.3.31" +mongodb = { version = "3.1.1", features = [ "zstd-compression", "snappy-compression", "zlib-compression", ] } num_cpus = "1.16.0" rand = { version = "0.8.5", features = ["small_rng"] } -serde = { version = "1.0.196", features = ["derive"] } -serde_json = "1.0.127" -sqlx = { version = "0.7.3", features = [ +serde = { version = "1.0.216", features = ["derive"] } +serde_json = "1.0.134" +sqlx = { version = "0.8.2", features = [ "postgres", "macros", "runtime-tokio", "tls-rustls", ] } -tokio = { version = "1.39.3", features = ["full"] } +tokio = { version = "1.42.0", features = ["full"] } tokio-pg-mapper = { version = "0.2.0" } tokio-pg-mapper-derive = { version = "0.2.0" } -tokio-postgres = { version = "0.7.11" } -tower = { version = "0.5.0", features = ["util"] } -tower-http = { version = "0.5.2", features = ["set-header"] } +tokio-postgres = { version = "0.7.12" } +tower = { version = "0.5.2", features = ["util"] } +tower-http = { version = "0.6.2", features = ["set-header"] } yarte = "0.15.7" -simd-json = { version = "0.13.8", optional = true } -axum-core = { version = "0.4.3", optional = true } +simd-json = { version = "0.14.3", optional = true } +axum-core = { version = "0.4.5", optional = true } mime = { version = "0.3.17", optional = true } -bytes = { version = "1.5.0", optional = true } -serde_path_to_error = { version = "0.1.15", optional = true } -moka = { version = "0.12.8", features = ["future"] } -socket2 = "0.5.7" -hyper = { version = "1.4", features = ["server", "http1"] } +bytes = { version = "1.9.0", optional = true } +serde_path_to_error = { version = "0.1.16", optional = true } +socket2 = "0.5.8" +hyper = { version = "1.5", features = ["server", "http1"] } hyper-util = { version = "0.1", features = ["tokio", "server-auto", "http1"] } +quick_cache = "0.6.9" +mimalloc = "0.1.43" [profile.release] diff --git a/frameworks/Rust/axum/README.md b/frameworks/Rust/axum/README.md index 59979fe441d..eb1e4ff594c 100755 --- a/frameworks/Rust/axum/README.md +++ b/frameworks/Rust/axum/README.md @@ -27,10 +27,11 @@ built with Tokio, Tower, and Hyper. ## Notable Points (both performance and build) - Use of `async`. -- Use of most recent versions of Rust, `axum` and dependencies. +- Use of the most recent versions of Rust, `axum` and dependencies. - (Disabled by default) Compile-time swap-in of `simd-json` instead of `serde_json` for faster JSON serialization. - Release binaries are stripped and compiled with CPU native. -- Sockets configured with TCP_NODELAY and to support an increased number of pending connections. +- Sockets configured with `TCP_NODELAY` and to support an increased number of pending connections. +- For very simple benchmarks, use of a separate, single-threaded Tokio runtime for each thread. - Server configured to serve HTTP/1 only, with no need for websockets. - Separation of build and deployment containers using multi-stage builds. - Deployment into Google's minimal `distroless-cc` container. @@ -39,8 +40,5 @@ built with Tokio, Tower, and Hyper. - Use of PostgreSQL prepared statements cache (where supported). - Use of PostgreSQL arrays to execute multi-row database updates with a single `UPDATE` query. - This is permitted by the [test requirements](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates), step (ix). -- In version 0.7.6 (as yet unreleased), a native API to set TCP_NODELAY will be included. - - https://github.com/tokio-rs/axum/pull/2653/ - - https://github.com/tokio-rs/axum/issues/2521 - More performance improvements are to be expected in version 0.8: - https://github.com/tokio-rs/axum/issues/1827 diff --git a/frameworks/Rust/axum/axum.dockerfile b/frameworks/Rust/axum/axum.dockerfile index 044e68bbf02..1bfb8fdf9c1 100644 --- a/frameworks/Rust/axum/axum.dockerfile +++ b/frameworks/Rust/axum/axum.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/rust:1.80-slim-bookworm AS builder +FROM docker.io/rust:1.83-slim-bookworm AS builder RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config libssl-dev \ @@ -18,7 +18,7 @@ ENV POSTGRES_MIN_POOL_SIZE=56 ENV POSTGRES_MAX_POOL_SIZE=56 ENV MONGODB_URL=mongodb://tfb-database:27017 ENV MONGODB_MIN_POOL_SIZE=28 -ENV MONGODB_MAX_POOL_SIZE=14 +ENV MONGODB_MAX_POOL_SIZE=28 COPY --from=builder /build/target/release/axum* /app/ EXPOSE 8000 CMD ["/app/axum"] diff --git a/frameworks/Rust/axum/src/common/mod.rs b/frameworks/Rust/axum/src/common/mod.rs index 808b2a70eeb..cae34d182cf 100644 --- a/frameworks/Rust/axum/src/common/mod.rs +++ b/frameworks/Rust/axum/src/common/mod.rs @@ -17,10 +17,9 @@ pub const SELECT_WORLD_BY_ID: &str = pub const SELECT_ALL_CACHED_WORLDS: &str = "SELECT id, randomnumber FROM world ORDER BY id"; #[allow(dead_code)] -pub const UPDATE_WORLDS: &str = "WITH vals AS (SELECT * FROM UNNEST($1::int[], $2::int[]) AS v(id, rnum)) - UPDATE world SET randomnumber = new.rnum FROM - (SELECT w.id, v.rnum FROM world w INNER JOIN vals v ON v.id = w.id ORDER BY w.id FOR UPDATE) AS new - WHERE world.id = new.id"; +pub const UPDATE_WORLDS: &str = r#"UPDATE world SET randomnumber = new.rnum FROM + (SELECT * FROM UNNEST($1::int[], $2::int[]) AS v(id, rnum) ORDER BY 1) AS new +WHERE world.id = new.id"#; /// Return the value of an environment variable. #[allow(dead_code)] @@ -41,11 +40,10 @@ pub fn random_id(rng: &mut SmallRng) -> i32 { rng.gen_range(1..10_001) } -/// Generate vector of integers in the range 1 to 10,000 (inclusive) +/// Generate an iterator of integers in the range 1 to 10,000 (inclusive) #[allow(dead_code)] #[inline(always)] -pub fn random_ids(rng: &mut SmallRng, count: usize) -> Vec { +pub fn random_ids(rng: &mut SmallRng, count: usize) -> impl Iterator + use<'_> { rng.sample_iter(Uniform::new(1, 10_001)) .take(count) - .collect() -} +} \ No newline at end of file diff --git a/frameworks/Rust/axum/src/main.rs b/frameworks/Rust/axum/src/main.rs index 0b33fb7edcb..ccbb4588eb9 100644 --- a/frameworks/Rust/axum/src/main.rs +++ b/frameworks/Rust/axum/src/main.rs @@ -4,6 +4,10 @@ mod server; use axum::{http::StatusCode, response::IntoResponse, routing::get, Router}; use common::models::Message; use dotenv::dotenv; +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; #[cfg(not(feature = "simd-json"))] use axum::Json; diff --git a/frameworks/Rust/axum/src/main_mongo.rs b/frameworks/Rust/axum/src/main_mongo.rs index 6d301189b9a..f15e0f521fb 100644 --- a/frameworks/Rust/axum/src/main_mongo.rs +++ b/frameworks/Rust/axum/src/main_mongo.rs @@ -14,8 +14,7 @@ use axum::Json; #[cfg(feature = "simd-json")] use common::simd_json::Json; use common::{ - models::{FortuneInfo, World}, - random_ids, + models::{FortuneInfo, World}, random_id }; use dotenv::dotenv; use mongodb::{ @@ -24,6 +23,10 @@ use mongodb::{ }; use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; use yarte::Template; +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; use common::{ get_env, @@ -58,9 +61,7 @@ async fn queries( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let ids = random_ids(&mut rng, q); - - let worlds = find_worlds(db, ids).await; + let worlds = find_worlds(db, &mut rng, q).await; let results = worlds.expect("worlds could not be retrieved"); (StatusCode::OK, Json(results)) @@ -73,17 +74,14 @@ async fn updates( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let ids = random_ids(&mut rng, q); - let worlds = find_worlds(db.clone(), ids) + let worlds = find_worlds(db.clone(), &mut rng, q) .await .expect("worlds could not be retrieved"); let mut updated_worlds: Vec = Vec::with_capacity(q); for mut world in worlds { - let random_number = (rng.gen::() % 10_000 + 1) as i32; - - world.random_number = random_number; + world.random_number = random_id(&mut rng); updated_worlds.push(world); } diff --git a/frameworks/Rust/axum/src/main_mongo_raw.rs b/frameworks/Rust/axum/src/main_mongo_raw.rs index 0d2735ad3bb..b36dd2d8030 100644 --- a/frameworks/Rust/axum/src/main_mongo_raw.rs +++ b/frameworks/Rust/axum/src/main_mongo_raw.rs @@ -2,7 +2,7 @@ mod common; mod mongo_raw; mod server; -use common::{models::World, random_id, random_ids}; +use common::{models::World, random_id}; use mongo_raw::database::{ find_world_by_id, find_worlds, update_worlds, DatabaseConnection, }; @@ -17,6 +17,11 @@ use axum::{ extract::Query, http::StatusCode, response::IntoResponse, routing::get, Router, }; +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + #[cfg(not(feature = "simd-json"))] use axum::Json; #[cfg(feature = "simd-json")] @@ -27,7 +32,7 @@ use mongodb::{ options::{ClientOptions, Compressor}, Client, }; -use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; +use rand::{rngs::SmallRng, thread_rng, SeedableRng}; async fn db(DatabaseConnection(db): DatabaseConnection) -> impl IntoResponse { let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); @@ -48,9 +53,7 @@ async fn queries( let q = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let ids = random_ids(&mut rng, q); - - let worlds = find_worlds(db, ids).await; + let worlds = find_worlds(db, &mut rng, q).await; let results = worlds.expect("worlds could not be retrieved"); (StatusCode::OK, Json(results)) @@ -64,16 +67,13 @@ async fn updates( let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let ids = random_ids(&mut rng, q); - let worlds = find_worlds(db.clone(), ids) + let worlds = find_worlds(db.clone(), &mut rng, q) .await .expect("worlds could not be retrieved"); let mut updated_worlds: Vec = Vec::with_capacity(q); for mut world in worlds { - let random_number = (rng.gen::() % 10_000 + 1) as i32; - - world.random_number = random_number; + world.random_number = random_id(&mut rng); updated_worlds.push(world); } diff --git a/frameworks/Rust/axum/src/main_pg.rs b/frameworks/Rust/axum/src/main_pg.rs index be691f9720c..94788bbd254 100644 --- a/frameworks/Rust/axum/src/main_pg.rs +++ b/frameworks/Rust/axum/src/main_pg.rs @@ -7,6 +7,10 @@ use axum::{ use dotenv::dotenv; use rand::{rngs::SmallRng, thread_rng, SeedableRng}; use yarte::Template; +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; #[cfg(not(feature = "simd-json"))] use axum::Json; diff --git a/frameworks/Rust/axum/src/main_pg_pool.rs b/frameworks/Rust/axum/src/main_pg_pool.rs index d4b7754cba8..a6d5764748e 100644 --- a/frameworks/Rust/axum/src/main_pg_pool.rs +++ b/frameworks/Rust/axum/src/main_pg_pool.rs @@ -15,6 +15,10 @@ use dotenv::dotenv; use futures_util::{stream::FuturesUnordered, TryStreamExt}; use rand::{rngs::SmallRng, thread_rng, SeedableRng}; use yarte::Template; +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; mod server; diff --git a/frameworks/Rust/axum/src/main_sqlx.rs b/frameworks/Rust/axum/src/main_sqlx.rs index b3a7937841b..7c8f90d6807 100644 --- a/frameworks/Rust/axum/src/main_sqlx.rs +++ b/frameworks/Rust/axum/src/main_sqlx.rs @@ -12,10 +12,14 @@ use axum::{ Router, }; use dotenv::dotenv; -use moka::future::Cache; +use quick_cache::sync::Cache; use rand::{rngs::SmallRng, thread_rng, SeedableRng}; use sqlx::models::World; use yarte::Template; +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; #[cfg(not(feature = "simd-json"))] use axum::Json; @@ -55,10 +59,9 @@ async fn queries( ) -> impl IntoResponse { let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); let count = parse_params(params); - let ids = random_ids(&mut rng, count); let mut worlds: Vec = Vec::with_capacity(count); - for id in &ids { + for id in random_ids(&mut rng, count) { let world: World = ::sqlx::query_as(common::SELECT_WORLD_BY_ID) .bind(id) .fetch_one(&mut *db.acquire().await.unwrap()) @@ -98,10 +101,10 @@ async fn cache( ) -> impl IntoResponse { let count = parse_params(params); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let mut worlds: Vec>> = Vec::with_capacity(count); - + let mut worlds: Vec> = Vec::with_capacity(count); + for id in random_ids(&mut rng, count) { - worlds.push(cache.get(&id).await); + worlds.push(cache.get(&id)); } (StatusCode::OK, Json(worlds)) @@ -115,7 +118,7 @@ async fn preload_cache(AppState { db, cache }: &AppState) { .expect("error loading worlds"); for world in worlds { - cache.insert(world.id, Arc::new(world)).await; + cache.insert(world.id, world); } } @@ -123,7 +126,7 @@ async fn preload_cache(AppState { db, cache }: &AppState) { #[derive(Clone)] struct AppState { db: PgPool, - cache: Cache>, + cache: Arc>, } #[tokio::main] @@ -136,10 +139,7 @@ async fn main() { let state = AppState { db: create_pool(database_url, max_pool_size, min_pool_size).await, - cache: Cache::builder() - .initial_capacity(10000) - .max_capacity(10000) - .build() + cache: Arc::new(Cache::new(10_000)) }; // Prime the cache with CachedWorld objects diff --git a/frameworks/Rust/axum/src/mongo/database.rs b/frameworks/Rust/axum/src/mongo/database.rs index 28c55d25c01..be581e4505c 100644 --- a/frameworks/Rust/axum/src/mongo/database.rs +++ b/frameworks/Rust/axum/src/mongo/database.rs @@ -3,8 +3,9 @@ use std::{convert::Infallible, io}; use axum::{async_trait, extract::FromRequestParts, http::request::Parts}; use futures_util::{stream::FuturesUnordered, StreamExt, TryStreamExt}; use mongodb::{bson::doc, Database}; +use rand::rngs::SmallRng; -use crate::common::models::{Fortune, World}; +use crate::common::{models::{Fortune, World}, random_ids}; pub struct DatabaseConnection(pub Database); @@ -45,17 +46,17 @@ pub async fn find_world_by_id(db: Database, id: i32) -> Result) -> Result, MongoError> { +pub async fn find_worlds(db: Database, rng: &mut SmallRng, count: usize) -> Result, MongoError> { let future_worlds = FuturesUnordered::new(); - for id in ids { + for id in random_ids(rng, count) { future_worlds.push(find_world_by_id(db.clone(), id)); } @@ -67,7 +68,7 @@ pub async fn fetch_fortunes(db: Database) -> Result, MongoError> { let fortune_collection = db.collection::("fortune"); let mut fortune_cursor = fortune_collection - .find(None, None) + .find(doc! {}) .await .expect("fortunes could not be loaded"); @@ -99,8 +100,7 @@ pub async fn update_worlds( } db.run_command( - doc! {"update": "world", "updates": updates, "ordered": false}, - None, + doc! {"update": "world", "updates": updates, "ordered": false} ) .await .expect("could not update worlds"); diff --git a/frameworks/Rust/axum/src/mongo_raw/database.rs b/frameworks/Rust/axum/src/mongo_raw/database.rs index 638c590c9fa..22b113ce68c 100644 --- a/frameworks/Rust/axum/src/mongo_raw/database.rs +++ b/frameworks/Rust/axum/src/mongo_raw/database.rs @@ -6,8 +6,9 @@ use mongodb::{ bson::{doc, RawDocumentBuf}, Database, }; +use rand::rngs::SmallRng; -use crate::common::models::World; +use crate::common::{models::World, random_ids}; pub struct DatabaseConnection(pub Database); @@ -48,7 +49,7 @@ pub async fn find_world_by_id(db: Database, id: i32) -> Result Result) -> Result, MongoError> { +pub async fn find_worlds(db: Database, rng: &mut SmallRng, count: usize) -> Result, MongoError> { let future_worlds = FuturesUnordered::new(); - for id in ids { + for id in random_ids(rng, count) { future_worlds.push(find_world_by_id(db.clone(), id)); } @@ -93,8 +94,7 @@ pub async fn update_worlds( } db.run_command( - doc! {"update": "world", "updates": updates, "ordered": false}, - None, + doc! {"update": "world", "updates": updates, "ordered": false} ) .await .expect("could not update worlds"); From 7d7d34796134750271120da31340b44cb94a963f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E4=B8=9C?= Date: Tue, 31 Dec 2024 02:28:34 +0800 Subject: [PATCH 0991/1766] [Java] Update Solon Version To 3.0.5 (#9482) --- frameworks/Java/solon/pom.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index d483a51b397..30701fd2661 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -5,7 +5,7 @@ org.noear solon-parent - 3.0.4 + 3.0.5 hello @@ -21,7 +21,12 @@ org.noear - solon-web + solon-lib + + + + org.noear + solon-boot-smarthttp From ef9353723495c07ef8d40ca13f3523702941c94d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Tue, 31 Dec 2024 02:28:57 +0800 Subject: [PATCH 0992/1766] change smart-http to feat (#9479) 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 * upgrade smart-servlet to 1.0-SNAPSHOT * upgrade smart-servlet to 1.4 * upgrade smart-servlet to 1.5-SNAPSHOT * 启用虚拟线程 * 启用虚拟线程 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 --- frameworks/Java/smart-socket/pom.xml | 2 +- .../main/java/org/smartboot/http/Bootstrap.java | 14 +++++++------- .../src/main/java/org/smartboot/http/JsonUtil.java | 2 +- .../org/smartboot/http/MultipleQueriesHandler.java | 9 +++++---- .../org/smartboot/http/SingleQueryHandler.java | 7 ++++--- .../java/org/smartboot/http/UpdateHandler.java | 9 +++++---- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index a4107b3d3e8..afdeea27141 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.5 + 2.7 5.0.0 0.9.23 diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 9dda965e0be..4875d68c8d8 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -11,11 +11,11 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.smartboot.Message; -import org.smartboot.http.server.HttpBootstrap; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; -import org.smartboot.http.server.handler.HttpRouteHandler; +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServer; +import tech.smartboot.feat.core.server.HttpServerHandler; +import tech.smartboot.feat.core.server.handler.HttpRouteHandler; import javax.sql.DataSource; @@ -25,9 +25,9 @@ public class Bootstrap { public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - HttpBootstrap bootstrap = new HttpBootstrap(); + HttpServer bootstrap = new HttpServer(); bootstrap.configuration() - .threadNum(cpuNum) + .threadNum(cpuNum + 1) .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4); 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 b20525ec571..31a7d546119 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 @@ -5,7 +5,7 @@ import com.jsoniter.spi.JsonException; import com.jsoniter.spi.Slice; import jakarta.servlet.http.HttpServletResponse; -import org.smartboot.http.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpResponse; import java.io.IOException; diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index 61b9f66b344..ac4807a9284 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -1,9 +1,10 @@ package org.smartboot.http; -import org.smartboot.http.common.utils.NumberUtils; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; + +import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index b69495d1a5e..52a96b9ca57 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -1,8 +1,9 @@ package org.smartboot.http; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; + +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index 065bed5a9a6..3217adea343 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -1,9 +1,10 @@ package org.smartboot.http; -import org.smartboot.http.common.utils.NumberUtils; -import org.smartboot.http.server.HttpRequest; -import org.smartboot.http.server.HttpResponse; -import org.smartboot.http.server.HttpServerHandler; + +import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.server.HttpRequest; +import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.core.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; From 2ed435c454d123aa0cea31d86f037c1cdbcaa908 Mon Sep 17 00:00:00 2001 From: SaltyAom Date: Tue, 31 Dec 2024 01:29:17 +0700 Subject: [PATCH 0993/1766] [Elysia] Update Elysia to 1.2 (#9481) * fix(elysia): native static response not setting headers conflict with recent Bun version * fix(elysia): remove lockfile * fix(elysia): update lockfile * fix(elysia): update elysia version * fix(elysia): update lockfile * :broom: chore(elysia) update Elysia to 1.2 * :broom: chore(elysia) update Elysia to 1.2 * :broom: chore(elysia) update Elysia to 1.2 * fix(elysia): incorrect /update * fix(elysia): incorrect /update * fix(elysia): incorrect /update * fix(elysia): update lock file --- frameworks/TypeScript/elysia/bun.lockb | Bin 3513 -> 5662 bytes frameworks/TypeScript/elysia/package.json | 7 +- .../TypeScript/elysia/src/db-handlers.ts | 122 ++++++++---------- frameworks/TypeScript/elysia/src/postgres.ts | 43 +++--- 4 files changed, 87 insertions(+), 85 deletions(-) diff --git a/frameworks/TypeScript/elysia/bun.lockb b/frameworks/TypeScript/elysia/bun.lockb index 5d4cdb0b97af1c97b83aa10bf44cc1db342ee378..8b08fa7e91bbb929515544883dbb6414cc2ddfd4 100755 GIT binary patch literal 5662 zcmeHL2~ZSg7H)7v1w|l;F)lhl)bf~~VP-g#%WF3=8Wj&zJmN4m*f7kD(+wgqIx0|j zf*bKbjDi;e9;j&45KTmlM?4}Mg$)t~Pt=X58+R>r-|Oig+awB>Ra&kZ5N84Amx?Z2Nq#aBGakeR{!JCz*9jl1UGU1MbJ*5J)2Qf zYtU!J>jT!+Jh~K8k?O6!S9r0X_YiX4wt97q?~=*W-*;_R(qomex66R^qEm~T}wiGw=xAE zy%nB)VExIJGuFobz}lf>Zy*?T6n8iRVI8m>N(M)BIGQ2^KLjRg0gwLRHHcA@gy0Xs z>;Zs>SW?J=el$f0z8Qe}03I>q+Uwv$03Rv(k2v(9DMDh*JILN${fbTE* z?+qZx%_a%KcYr}K;Bnttz(KAzMndL|hJnAheq4LQ1Jnos!7qbBkObeQ5gfTq@HH^N z{lh%O9C%&(-63K6iR*t4@UNS{v4F?@!-|5~rp6zpQuw^!fr8or4y+p}ucI;UP*a4x zL;KQwzuarbkuC?f4Xr90^-knax49ADTrgYmQtl;=UA*UN;Ht6CBmQ=!(}7OK?VKgNB(H>c zjabiTSoWokJ8#^-v(8Cf=p5F5`NYWKgWkRWFwXOM{3%&x{_Z39qy+$pX?8gXYH0ZD+jFZ9_$t(p>!@HuvFDm%IK&KOH}G zFXd|YdBtnK+Owy<`RBn!bNt=9r9CNpmZ$X?*X?$Xh4*iM$4Pie{s{iIZZrDA$mKh> ztX$&I;eB0DRu8$ z*2UwP-Pb=zc%{#QY;3+`r1PYa9nVcMc>FTHIzIQY9iLnA?bA!4pQsGws$LPYHC1C0 z4~!2}S3J8r;Dfy_Hg3v2`)e+pv{)PBIqExa2`}b25!r)+XBqQKZlr9#uj-eQ?R~lA z^yKnd_gw`amX^2n?6!Dj{|Og%Exw&ql#|vwZt|=%w<-sf%%djEoZaJsm&3ZFbdH1< zYZnpOw5uN#%2TY0f7KRgcRf)Y|7VCs<03ELnYs36M?;^e#8oHu`i#lwRhk`FKYHBO zbdLv(Rh7>> zmo)DC(?5GQuyRYxcK`Wz*pr*b`|uZcggmM5=*mv;Tp=H_=}G^zg|j5Q()XM!FKcXi z_|~B4wdX2+Z2n`!@*YkOi$?I8eFgL1i&I}NJaTq-^mzS(vDNj{^hYPoel+k<+-l<& zWm~gu1bmYF_ijaH5?)d_1b>~jF$Xu#*={-0MK`X}Np+%l)qPfFz8YH|}Ux>(xj~~8X&Q1g_7UTGbc z>hJ$RDBsr5{ok)Qj=)Os=V6hk9fLWGo@R|4uQM2E(p=J`EDRGWSF7Y4o6MM^d&#wO zoq>%pnxcjB`t+Gi&>gHZ7e%(#ZEX%Z1}A9Lp#b`0xbS-ne`nxt0wly|7T>q{Zp8N( zzH_kNVr@kJK#`Yk0zbZ25Rd%$tRWxrB0t(eo9I2-MQ&mTb-u_?Lj#NA7(8C>KQSQ? zLgC-A7T*^_VVg%$R?>I2w43Bh!=F}I8CbEB&J^zW(E+rYYUr&=k86(@HQoDpw@tcW zxTB%9v>(ubCG4w7zYBL%v_?z&YDnizI%0uMg?319PI_kXjxR+O02_AWq^lO#)U=AC zNPkcIZp5fzL7LyK$K5V8MD9ncXcg)0NzZL>hau1eP!#FzN!M*}H!G0#qkUBr`3^w( zbGV~c(O@c&d>J4eJKXW3)&8{h4=_E1_)}DpxMN?6`o+BFnD|7-LjO65XDmjYVI*&1 zjWMBe-{+ee*s!TQrx!R6J$Bz{S(fRJA7JoW+e_<%?|M$#&vP7O0k(sH|SW4675Hs zlA?7Sub9H}f`wJ+P4Q-vkumb|OuUJ;fI}uTW7L^hh2ZcjY`!oLOuulhuw_*v zZa3Hjc*9r$$qi}u>IJ`a8Nl??dk_}L!A6*E&l}L#1_DOi2(qY$CSqWc delta 1325 zcmbQIvr~G4p5|xvxQ6$S8|PZCudFP6c7D24_zNK?wv6hWkB3+Da3r45=c!2hu=Q4axcW*_o+e)eKw{-%4u;ICrc$b9j-6{9L97 zCPG`D^WUHS*sw35eDdWbPYi?Kvd&j+(9v#9O`4p*=po1j)Mx=Tg&9b*fbir*M)k=H z7&!!;fIL&63?q;RVF8#7(>jL9tC;KrIe?--MGZhX1_dBif-CT1oUFxU$J+~3U;gVa!_|KH@ptXU3+2tv`B&TUX`X$fzf8CBj*Zc`cg9O&zd5N(3Eof>FQ4S-bJxx9?H0oe zRmKSnUO(d6+aFBMWs~sPKE+Jh`2Mke`8th?NTq8sjh9RcKK)&M%Co-w+8LhBj|(#| zgm3Yfc2sT6^8REC<<#xQ(j0G2b3YCKd@1?X)ODcnVr2No{|`trPi|xnpRB>o>yuqp ze(IX)OZk8A!V8c4@mojB&GHeOTK{LM)y55fELJ^|Q7kxWJHxLybmPZ0*Jinzy*$o! zFY!ZR`ttd1>&+OroRADdk+_hzIpWY3KgxPq8Y^y7ISDFP6_(LhiYy?AGO*7k#KN@H)R*zZ}U>c2E>R0gGuq zvuJx(dDCjPs!_TWUtgU+f6Y{#U3aeK zcX$4)woAM9F80As$oHsE&Ie1kiJk!u4q{*Q1>PT;dqfLQbIKLmhyAlpAc z74dLR-o|Gn21>@@#08`+IDrHZM1Z7}v_PtvfEeg}1~woDDFZ17r67=*9Wdowlk51k z>VcV~0hU`h7~@R!O!a{2IW?!UI5Uxf!Fj>sANOo;wlXos8R`L{8ACySaY=enYO#{h z$JI9+m3)9Q#(E|oJ+Mp)%Y#4}13fc60|o|IHiqR=kZDFh&p#>3_O{s;Qg5l%|{E}QHl?AEA$wiq3C6gIN zq$i6DNidpBRuq<>>@OrF3JM6llJu(lg4Ddkf=peo;>j68T41#f!cmjY3Cpv9d;!*S cSjc(uEMWmwaA-{aDD28^re_4w4@?I$06h(Nk^lez diff --git a/frameworks/TypeScript/elysia/package.json b/frameworks/TypeScript/elysia/package.json index fa95e553bc3..9d38195023f 100644 --- a/frameworks/TypeScript/elysia/package.json +++ b/frameworks/TypeScript/elysia/package.json @@ -3,7 +3,8 @@ "version": "0.0.1", "module": "src/index.js", "devDependencies": { - "typescript": "^5.5.4" + "@types/bun": "^1.1.14", + "typescript": "^5.7.2" }, "scripts": { "dev": "bun run --watch src/index.ts", @@ -12,7 +13,7 @@ "compile": "bun build --compile --minify --target bun --outfile server src/index.ts" }, "dependencies": { - "elysia": "^1.1.16", - "postgres": "^3.4.4" + "elysia": "^1.2.9", + "postgres": "^3.4.5" } } diff --git a/frameworks/TypeScript/elysia/src/db-handlers.ts b/frameworks/TypeScript/elysia/src/db-handlers.ts index b75ccfdea60..6674829bfd9 100644 --- a/frameworks/TypeScript/elysia/src/db-handlers.ts +++ b/frameworks/TypeScript/elysia/src/db-handlers.ts @@ -2,74 +2,66 @@ import { Elysia, t } from "elysia"; import * as db from "./postgres"; import { Fortune } from "./types"; -function rand() { - return Math.ceil(Math.random() * 10000); +export function rand() { + return Math.ceil(Math.random() * 10000); } function parseQueriesNumber(q?: string) { - return Math.min(parseInt(q || "1") || 1, 500); -} - -function renderTemplate(fortunes: Fortune[]) { - const n = fortunes.length; - - let html = ""; - for (let i = 0; i < n; i++) { - html += `${fortunes[i].id}${Bun.escapeHTML( - fortunes[i].message, - )}`; - } - - return `Fortunes${html}
      idmessage
      `; + // NaN is falsy, fallback to one. + return Math.min(+q! || 1, 500); } export const dbHandlers = new Elysia() - .headers({ - server: "Elysia", - }) - .get("/db", () => db.find(rand())) - .get("/fortunes", async (c) => { - const fortunes = await db.fortunes(); - - fortunes.push({ - id: 0, - message: "Additional fortune added at request time.", - }); - - fortunes.sort((a, b) => { - if (a.message < b.message) return -1; - - return 1; - }); - - c.set.headers["content-type"] = "text/html; charset=utf-8"; - - return renderTemplate(fortunes); - }) - .get("/queries", (c) => { - const num = parseQueriesNumber(c.query.queries); - const worldPromises = new Array(num); - - for (let i = 0; i < num; i++) { - worldPromises[i] = db.find(rand()); - } - - return Promise.all(worldPromises); - }) - .get("/updates", async (c) => { - const num = parseQueriesNumber(c.query.queries); - const worldPromises = new Array(num); - - for (let i = 0; i < num; i++) { - worldPromises[i] = db.find(rand()); - } - - const worlds = await Promise.all(worldPromises); - - for (let i = 0; i < num; i++) { - worlds[i].randomNumber = rand(); - } - - await db.bulkUpdate(worlds); - return worlds; - }); + .headers({ + server: "Elysia", + }) + // ? Mark as async for Promise result to prevent double Elysia's mapResponse execution + .get("/db", async () => db.find(rand())) + .get("/fortunes", async (c) => { + const fortunes = await db.fortunes(); + + fortunes.push({ + id: 0, + message: "Additional fortune added at request time.", + }); + + fortunes.sort((a, b) => { + if (a.message < b.message) return -1; + + return 1; + }); + + c.set.headers["content-type"] = "text/html; charset=utf-8"; + + const n = fortunes.length; + + let html = ""; + for (let i = 0; i < n; i++) { + html += `${fortunes[i].id}${Bun.escapeHTML( + fortunes[i].message, + )}`; + } + + return `Fortunes${html}
      idmessage
      `; + }) + // ? Mark as async for Promise result to prevent double Elysia's mapResponse execution + .get("/queries", async (c) => { + const num = parseQueriesNumber(c.query.queries); + const worldPromises = new Array(num); + + for (let i = 0; i < num; i++) worldPromises[i] = db.find(rand()); + + return Promise.all(worldPromises); + }) + .get("/updates", async (c) => { + const num = parseQueriesNumber(c.query.queries); + const worldPromises = new Array(num); + + for (let i = 0; i < num; i++) + worldPromises[i] = db.findThenRand(rand()); + + const worlds = await Promise.all(worldPromises); + + await db.bulkUpdate(worlds); + return worlds; + }); diff --git a/frameworks/TypeScript/elysia/src/postgres.ts b/frameworks/TypeScript/elysia/src/postgres.ts index cc6d4389a02..33db0497fcc 100644 --- a/frameworks/TypeScript/elysia/src/postgres.ts +++ b/frameworks/TypeScript/elysia/src/postgres.ts @@ -1,30 +1,39 @@ import postgres from "postgres"; -import { Fortune, World } from "./types"; +import { rand } from "./db-handlers"; +import type { Fortune, World } from "./types"; const sql = postgres({ - host: "tfb-database", - user: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world", - max: 1, + host: "tfb-database", + user: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", + max: 1, }); export const fortunes = () => sql`SELECT id, message FROM fortune`; export const find = (id: number) => - sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( - (arr) => arr[0], - ); + sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( + (arr) => arr[0], + ); + +export const findThenRand = (id: number) => + sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( + (arr) => { + arr[0].randomNumber = rand(); + return arr[0]; + }, + ); export const bulkUpdate = (worlds: World[]) => { - worlds = worlds.toSorted((a, b) => a.id - b.id); + worlds = worlds.toSorted((a, b) => a.id - b.id); - const values = new Array(worlds.length); - for (let i = 0; i < worlds.length; i++) { - values[i] = [worlds[i].id, worlds[i].randomNumber]; - } + const values = new Array(worlds.length); + for (let i = 0; i < worlds.length; i++) { + values[i] = [worlds[i].id, worlds[i].randomNumber]; + } - return sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int - FROM (VALUES ${sql(values)}) AS update_data (id, randomNumber) - WHERE world.id = (update_data.id)::int`; + return sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int + FROM (VALUES ${sql(values)}) AS update_data (id, randomNumber) + WHERE world.id = (update_data.id)::int`; }; From 83abea6d2a0df54f3c46cf5e16ab9d9971d8fc75 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Tue, 31 Dec 2024 03:06:39 +0700 Subject: [PATCH 0994/1766] fixed test and some perf bugs --- frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile | 10 +- frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml | 17 ++- .../org/jetbrains/ktor/benchmarks/Hello.kt | 45 +++++-- .../NioClientEventLoopResources.java | 123 ++++++++++++++++++ .../src/main/resources/application.conf | 14 +- 5 files changed, 187 insertions(+), 22 deletions(-) create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/NioClientEventLoopResources.java diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile b/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile index 076a51a1416..9281f4974ac 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile @@ -1,12 +1,12 @@ FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as maven -WORKDIR /ktor -COPY ktor/pom.xml pom.xml -COPY ktor/src src +WORKDIR /ktor-r2dbc +COPY ktor-r2dbc/pom.xml pom.xml +COPY ktor-r2dbc/src src RUN mvn clean package -q FROM amazoncorretto:21-al2023-headless -WORKDIR /ktor -COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-netty-bundle.jar app.jar +WORKDIR /ktor-r2dbc +COPY --from=maven /ktor-r2dbc/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-netty-bundle.jar app.jar EXPOSE 9090 diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml index 9590236be6c..092e8ab9559 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml @@ -18,9 +18,12 @@ 1.7.3 0.11.0 UTF-8 - 1.2.13 + 1.5.12 + 3.7.1 42.7.4 1.0.7.RELEASE + 1.0.2.RELEASE + @@ -64,13 +67,21 @@ ktor-server-html-builder-jvm ${ktor.version} - org.postgresql r2dbc-postgresql ${r2dbc.version} - + + io.r2dbc + r2dbc-pool + ${r2dbc.pool.version} + + + io.projectreactor + reactor-core + ${reactor.version} + ch.qos.logback logback-classic diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index bac39bd6a7e..053e2d90ea0 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -8,6 +8,14 @@ import io.ktor.server.html.* import io.ktor.server.plugins.defaultheaders.* import io.ktor.server.response.* import io.ktor.server.routing.* +import io.r2dbc.pool.ConnectionPool +import io.r2dbc.pool.ConnectionPoolConfiguration +import io.r2dbc.pool.PoolingConnectionFactoryProvider +import io.r2dbc.postgresql.PostgresqlConnectionConfiguration +import io.r2dbc.postgresql.PostgresqlConnectionFactory +import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider +import io.r2dbc.postgresql.client.SSLMode +import io.r2dbc.spi.Connection import io.r2dbc.spi.ConnectionFactories import io.r2dbc.spi.ConnectionFactory import io.r2dbc.spi.ConnectionFactoryOptions @@ -25,6 +33,8 @@ import org.jetbrains.ktor.benchmarks.models.Message import org.jetbrains.ktor.benchmarks.models.World import reactor.core.publisher.Flux import reactor.core.publisher.Mono +import reactor.netty.resources.LoopResources +import java.time.Duration import kotlin.random.Random fun Application.main() { @@ -125,7 +135,7 @@ fun Application.main() { connection.createStatement(UPDATE_QUERY).bind(0, world.randomNumber).bind(1, world.id) .execute() ).flatMap { Mono.from(it.rowsUpdated) } - }, { connection -> connection.close() }) + }, Connection::close) } Flux.merge(updateRequests).collectList().awaitFirstOrNull() @@ -147,23 +157,38 @@ private fun getWorld( ) }) } -}, { connection -> connection.close() }) +}, Connection::close) private fun configurePostgresR2DBC(config: ApplicationConfig): ConnectionFactory { - val options = ConnectionFactoryOptions.builder().option(ConnectionFactoryOptions.DRIVER, "database.driver") - .option(ConnectionFactoryOptions.DATABASE, config.property("database.url").getString()) - .option(ConnectionFactoryOptions.USER, config.property("database.user").getString()) - .option(ConnectionFactoryOptions.PASSWORD, config.property("database.password").getString()).build() - - return ConnectionFactories.get(options) + val cfo = PostgresqlConnectionConfiguration.builder() + .host(config.property("db.host").getString()) + .port(config.property("db.port").getString().toInt()) + .database(config.property("db.database").getString()) + .username(config.property("db.username").getString()) + .password(config.property("db.password").getString()) + .loopResources { NioClientEventLoopResources(Runtime.getRuntime().availableProcessors()).cacheLoops() } + .sslMode(SSLMode.DISABLE) + .tcpKeepAlive(true) + .tcpNoDelay(true) + .build() + + val cf = PostgresqlConnectionFactory(cfo) + + val cp = ConnectionPoolConfiguration.builder(cf) + .initialSize(config.property("db.initPoolSize").getString().toInt()) + .maxSize(config.property("db.maxPoolSize").getString().toInt()) + //.maxLifeTime(Duration.ofMillis(Long.MAX_VALUE)) + .build() + + return ConnectionPool(cp) } private fun ApplicationCall.queries() = request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 object Constants { - const val WORLD_QUERY = "SELECT id, randomNumber FROM World WHERE id = ?" + const val WORLD_QUERY = "SELECT id, randomnumber FROM world WHERE id = $1" const val FORTUNES_QUERY = "SELECT id, message FROM fortune" - const val UPDATE_QUERY = "UPDATE World SET randomNumber = ? WHERE id = ?" + const val UPDATE_QUERY = "UPDATE world SET randomnumber = $1 WHERE id = $2" const val DB_ROWS = 10000 } diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/NioClientEventLoopResources.java b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/NioClientEventLoopResources.java new file mode 100644 index 00000000000..d0e03bb6b5e --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/NioClientEventLoopResources.java @@ -0,0 +1,123 @@ +package org.jetbrains.ktor.benchmarks; + +import io.netty.channel.Channel; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.DatagramChannel; +import io.netty.channel.socket.ServerSocketChannel; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioDatagramChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.util.concurrent.DefaultThreadFactory; +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.ThreadPerTaskExecutor; +import reactor.core.publisher.Mono; +import reactor.netty.FutureMono; +import reactor.netty.resources.LoopResources; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Copied from GitHub issue comment: https://github.com/r2dbc/r2dbc-pool/issues/190#issuecomment-1566845190 + */ +public class NioClientEventLoopResources implements LoopResources { + public static final String THREAD_PREFIX = "prefix-"; + final int threads; + final AtomicReference loops = new AtomicReference<>(); + final AtomicBoolean running; + + NioClientEventLoopResources(int threads) { + this.running = new AtomicBoolean(true); + this.threads = threads; + } + + + @Override + @SuppressWarnings("unchecked") + public Mono disposeLater(Duration quietPeriod, Duration timeout) { + return Mono.defer(() -> { + long quietPeriodMillis = quietPeriod.toMillis(); + long timeoutMillis = timeout.toMillis(); + EventLoopGroup serverLoopsGroup = loops.get(); + Mono slMono = Mono.empty(); + if (running.compareAndSet(true, false)) { + if (serverLoopsGroup != null) { + slMono = FutureMono.from((Future) serverLoopsGroup.shutdownGracefully( + quietPeriodMillis, timeoutMillis, TimeUnit.MILLISECONDS)); + } + } + return Mono.when(slMono); + }); + } + + @Override + public boolean isDisposed() { + return !running.get(); + } + + @Override + public EventLoopGroup onClient(boolean useNative) { + return cacheLoops(); + } + + @Override + public EventLoopGroup onServer(boolean useNative) { + throw new UnsupportedOperationException("This event loop is designed only for client DB calls."); + } + + @Override + public EventLoopGroup onServerSelect(boolean useNative) { + throw new UnsupportedOperationException("This event loop is designed only for client DB calls."); + } + + @Override + public CHANNEL onChannel(Class channelType, EventLoopGroup group) { + if (channelType.equals(SocketChannel.class)) { + return (CHANNEL) new NioSocketChannel(); + } + if (channelType.equals(ServerSocketChannel.class)) { + return (CHANNEL) new NioServerSocketChannel(); + } + if (channelType.equals(DatagramChannel.class)) { + return (CHANNEL) new NioDatagramChannel(); + } + throw new IllegalArgumentException("Unsupported channel type: " + channelType.getSimpleName()); + } + + @Override + public Class onChannelClass(Class channelType, + EventLoopGroup group) { + if (channelType.equals(SocketChannel.class)) { + return (Class) NioSocketChannel.class; + } + if (channelType.equals(ServerSocketChannel.class)) { + return (Class) NioServerSocketChannel.class; + } + if (channelType.equals(DatagramChannel.class)) { + return (Class) NioDatagramChannel.class; + } + throw new IllegalArgumentException("Unsupported channel type: " + channelType.getSimpleName()); + } + + @SuppressWarnings("FutureReturnValueIgnored") + EventLoopGroup cacheLoops() { + EventLoopGroup eventLoopGroup = loops.get(); + if (null == eventLoopGroup) { + EventLoopGroup newEventLoopGroup = createNewEventLoopGroup(); + if (!loops.compareAndSet(null, newEventLoopGroup)) { + //"FutureReturnValueIgnored" this is deliberate + newEventLoopGroup.shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + } + eventLoopGroup = cacheLoops(); + } + return eventLoopGroup; + } + + private NioEventLoopGroup createNewEventLoopGroup() { + return new NioEventLoopGroup(threads, new ThreadPerTaskExecutor(new DefaultThreadFactory(THREAD_PREFIX))); + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf index a253814ac55..fe2031a7699 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf @@ -11,10 +11,16 @@ ktor { } } -database { - driver = "org.postgresql.Driver" - url = "url: r2dbc:pool://tfb-database:5432/hello_world?loggerLevel=OFF&sslmode=disable" - poolsize = 512 +db { + driver = "pool" + protocol = "postgresql" + ssl = "false" + host = "tfb-database" + port = 5432 + database = "hello_world" + initPoolSize = 512 + maxPoolSize = 512 username = "benchmarkdbuser" password = "benchmarkdbpass" + //url = "r2dbc:postgresql://"${db.host}":"${db.port}"/"${db.database}"?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable&maxSize="${db.poolSize} } From 15a1faac30332d36ab48cd94e8278613d412a116 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Tue, 31 Dec 2024 03:42:14 +0700 Subject: [PATCH 0995/1766] improved updated/queries via Flows --- .../org/jetbrains/ktor/benchmarks/Hello.kt | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index 053e2d90ea0..1715b0c643c 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -20,6 +20,9 @@ import io.r2dbc.spi.ConnectionFactories import io.r2dbc.spi.ConnectionFactory import io.r2dbc.spi.ConnectionFactoryOptions import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.reactive.asFlow +import kotlinx.coroutines.reactive.awaitFirst import kotlinx.coroutines.reactive.awaitFirstOrNull import kotlinx.html.* import kotlinx.serialization.encodeToString @@ -62,24 +65,21 @@ fun Application.main() { call.respondText(Json.encodeToString(result), ContentType.Application.Json) } - suspend fun selectWorlds(queries: Int, random: Random): List = coroutineScope { - val result = ArrayList>(queries) - + fun selectWorlds(queries: Int, random: Random): Flow = flow { repeat(queries) { - val deferred = async { - getWorld(dbConnFactory, random).awaitFirstOrNull() - } - result.add(deferred) + emit(getWorld(dbConnFactory, random).awaitFirst()) } - - result.awaitAll().filterNotNull() } get("/queries") { val queries = call.queries() val random = Random.Default - val result = selectWorlds(queries, random) + val result = buildList { + selectWorlds(queries, random).collect { + add(it) + } + } call.respondText(Json.encodeToString(result), ContentType.Application.Json) } @@ -127,9 +127,14 @@ fun Application.main() { val result = coroutineScope { val worlds = selectWorlds(queries, random) - worlds.forEach { it.randomNumber = random.nextInt(DB_ROWS) + 1 } + val worldsUpdated = buildList { + worlds.collect { + it.randomNumber = random.nextInt(DB_ROWS) + 1 + add(it) + } + } - val updateRequests = worlds.map { world -> + val updateRequests = worldsUpdated.map { world -> Mono.usingWhen(dbConnFactory.create(), { connection -> Mono.from( connection.createStatement(UPDATE_QUERY).bind(0, world.randomNumber).bind(1, world.id) @@ -138,8 +143,8 @@ fun Application.main() { }, Connection::close) } - Flux.merge(updateRequests).collectList().awaitFirstOrNull() - worlds + Flux.merge(updateRequests).collectList().awaitFirst() + worldsUpdated } call.respondText(Json.encodeToString(result), ContentType.Application.Json) From 34125b7402f94d442dce5d8120321721f29ac761 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 31 Dec 2024 13:27:14 +0100 Subject: [PATCH 0996/1766] Improve SQL --- .../src/main/kotlin/BenchmarkPgClientStore.kt | 8 ++++---- .../store_sql/src/main/kotlin/BenchmarkSqlStore.kt | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt index 510abda0295..2b09d73f6f5 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt +++ b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt @@ -19,9 +19,10 @@ class BenchmarkPgClientStore( ) : BenchmarkStore(settings) { companion object { - private const val SELECT_WORLD: String = "select * from world where id = $1" + private const val LOAD_WORLDS: String = "select id, randomNumber from world" + private const val SELECT_WORLD: String = "select id, randomNumber from world where id = $1" private const val UPDATE_WORLD: String = "update world set randomNumber = $1 where id = $2" - private const val SELECT_ALL_FORTUNES: String = "select * from fortune" + private const val SELECT_ALL_FORTUNES: String = "select id, message from fortune" } private val connectOptions: PgConnectOptions by lazy { @@ -81,13 +82,12 @@ class BenchmarkPgClientStore( .toCompletionStage() .toCompletableFuture() .get() - } } override fun initWorldsCache(cache: Cache) { dataSource - .preparedQuery("select * from world") + .preparedQuery(LOAD_WORLDS) .execute() .map { rowSet -> rowSet.map { row -> diff --git a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt index 0d854baec40..895f550fb7a 100644 --- a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt @@ -16,9 +16,10 @@ class BenchmarkSqlStore( ) : BenchmarkStore(settings) { companion object { - private const val SELECT_WORLD: String = "select * from world where id = ?" + private const val LOAD_WORLDS: String = "select id, randomNumber from world" + private const val SELECT_WORLD: String = "select id, randomNumber from world where id = ?" private const val UPDATE_WORLD: String = "update world set randomNumber = ? where id = ?" - private const val SELECT_ALL_FORTUNES: String = "select * from fortune" + private const val SELECT_ALL_FORTUNES: String = "select id, message from fortune" } private val dataSource: HikariDataSource by lazy { @@ -87,7 +88,7 @@ class BenchmarkSqlStore( override fun initWorldsCache(cache: Cache) { dataSource.connection.use { con: Connection -> - val stmtSelect = con.prepareStatement("select * from world") + val stmtSelect = con.prepareStatement(LOAD_WORLDS) val rs = stmtSelect.executeQuery() while (rs.next()) { From 215a4d48451b58e9dc7df94ee98d360d6db8542e Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 31 Dec 2024 15:27:37 +0100 Subject: [PATCH 0997/1766] Improve SQL --- .../src/main/kotlin/BenchmarkSqlStore.kt | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt index 895f550fb7a..a133e407874 100644 --- a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt @@ -63,26 +63,22 @@ class BenchmarkSqlStore( override fun replaceWorlds(worlds: List) { dataSource.connection.use { con: Connection -> - con.autoCommit = false val stmtSelect = con.prepareStatement(SELECT_WORLD) - val stmtUpdate = con.prepareStatement(UPDATE_WORLD) - worlds.forEach { - val worldId = it.id - val newRandomNumber = it.randomNumber - - stmtSelect.setInt(1, worldId) + stmtSelect.setInt(1, it.id) val rs = stmtSelect.executeQuery() rs.next() rs.getInt(2) // Read 'randomNumber' to comply with Test type 5, point 6 + } - stmtUpdate.setInt(1, newRandomNumber) - stmtUpdate.setInt(2, worldId) -// stmtUpdate.executeUpdate() - stmtUpdate.addBatch() + val stmtUpdate = con.prepareStatement(UPDATE_WORLD) + worlds.forEach { + stmtUpdate.setInt(1, it.randomNumber) + stmtUpdate.setInt(2, it.id) + stmtUpdate.executeUpdate() +// stmtUpdate.addBatch() } - stmtUpdate.executeBatch() - con.commit() +// stmtUpdate.executeBatch() } } From 936f941d3d332580817d19030c76aeb3827c4d23 Mon Sep 17 00:00:00 2001 From: jaguililla Date: Tue, 31 Dec 2024 17:25:53 +0100 Subject: [PATCH 0998/1766] Improve SQL --- .../hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt index a133e407874..14558b1a2bd 100644 --- a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt @@ -76,9 +76,7 @@ class BenchmarkSqlStore( stmtUpdate.setInt(1, it.randomNumber) stmtUpdate.setInt(2, it.id) stmtUpdate.executeUpdate() -// stmtUpdate.addBatch() } -// stmtUpdate.executeBatch() } } From 57dfce007e44a9bc55202a8265115f11c4c226ab Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 1 Jan 2025 13:07:08 +0800 Subject: [PATCH 0999/1766] paozhu update --- frameworks/C++/paozhu/paozhu.dockerfile | 43 +- .../paozhu/paozhu_benchmark/CMakeLists.txt | 145 +- .../common/autocontrolmethod.hpp | 10 + .../common/autorestfulpaths.hpp | 40 + .../paozhu_benchmark/common/cost_define.h | 9 + .../paozhu_benchmark/common/httphook.cpp | 39 + .../common/json_reflect_headers.h | 0 .../common/websockets_method_reg.hpp | 19 + .../paozhu/paozhu_benchmark/conf/server.conf | 10 +- .../paozhu_benchmark/models/Fortune.cpp | 16 + .../paozhu/paozhu_benchmark/models/World.cpp | 16 + .../paozhu_benchmark/models/include/Fortune.h | 16 + .../paozhu_benchmark/models/include/World.h | 16 + .../orm/include/fortunebase.h | 2687 +++++++++++++++++ .../paozhu_benchmark/orm/include/worldbase.h | 2509 +++++++++++++++ .../C++/paozhu/paozhu_benchmark/orm/orm.h | 4 + .../view/techempower/fortunes.html | 5 + .../viewsrc/include/regviewmethod.hpp | 26 + .../viewsrc/include/viewsrc.h | 26 + .../viewsrc/view/techempower/fortunes.cpp | 50 + .../websockets/include/loopwebsockets.hpp | 66 + .../websockets/include/mywebsockets.hpp | 83 + 22 files changed, 5796 insertions(+), 39 deletions(-) create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp mode change 100644 => 100755 frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/websockets/include/loopwebsockets.hpp create mode 100755 frameworks/C++/paozhu/paozhu_benchmark/websockets/include/mywebsockets.hpp diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 8086f6eafe6..480d726d314 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -20,23 +20,40 @@ RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller RUN rm -Rf ./paozhu/libs -RUN mkdir ./paozhu/libs -RUN mkdir ./paozhu/libs/types +RUN rm -Rf ./paozhu/view +RUN rm -Rf ./paozhu/viewsrc +RUN rm -Rf ./paozhu/orm +RUN rm -Rf ./paozhu/models +RUN rm -Rf ./paozhu/common -RUN mkdir ./paozhu/controller -RUN mkdir ./paozhu/controller/include -RUN mkdir ./paozhu/controller/src -COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ -COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ +COPY ./paozhu_benchmark/controller ./paozhu/ +COPY ./paozhu_benchmark/libs ./paozhu/ +COPY ./paozhu_benchmark/view ./paozhu/ +COPY ./paozhu_benchmark/viewsrc ./paozhu/ -COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ -COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ +COPY ./paozhu_benchmark/orm ./paozhu/ +COPY ./paozhu_benchmark/models ./paozhu/ +COPY ./paozhu_benchmark/common ./paozhu/ -COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ + +# RUN mkdir ./paozhu/libs +# RUN mkdir ./paozhu/libs/types + +# RUN mkdir ./paozhu/controller +# RUN mkdir ./paozhu/controller/include +# RUN mkdir ./paozhu/controller/src + +# COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +# COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ + +# COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +# COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ + +# COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index b8bf972dbc2..a4fabfb1ae6 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -117,13 +117,11 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) -if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) - file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) -endif () -#EXECUTE_PROCESS(COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty) +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre) + file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre) +endif() set(PAOZHU_PRE paozhu_pre) add_executable(${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autopickmethod.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/md5.cpp) -add_executable(paozhu_empty ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autoemptymethod.cpp) @@ -138,6 +136,22 @@ file(GLOB_RECURSE src_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) foreach(cppfile IN LISTS controller_list) string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/controller/src/" "" cppfilename ${cppfile}) + string(FIND ${cppfilename} "/" strpos) + if(${strpos} GREATER_EQUAL "0" ) + string(REGEX MATCHALL "([A-Za-z0-9._-]+)/" npaths ${cppfilename} ) + set(fullpaths "") + string(APPEND fullpaths "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/") + foreach(onepathname ${npaths}) + string(REPLACE "/" "" toucpath ${onepathname}) + string(APPEND fullpaths ${toucpath}) + if (IS_DIRECTORY "${fullpaths}") + else() + message("mkdir ${fullpaths}") + file(MAKE_DIRECTORY "${fullpaths}") + endif() + string(APPEND fullpaths "/") + endforeach() + endif() string(REGEX REPLACE ".cpp" "" cppbasename ${cppfilename}) # message(${cppbasename}) if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h") @@ -175,21 +189,18 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) - add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testbenchmark.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testdaemon.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) else() add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) endif() if (ENABLE_WIN_VCPKG STREQUAL "ON") -else () +else() add_custom_command( - TARGET paozhu_empty paozhu - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre - PRE_BUILD + TARGET paozhu_pre POST_BUILD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ COMMAND echo "-- controls method --" COMMAND ${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/ - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty ) endif() @@ -265,7 +276,7 @@ else () if(USE_STANDALONE_ASIO) if(CMAKE_SYSTEM_NAME MATCHES "Darwin") -set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include") +set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include" "/opt/homebrew/opt/asio" ${CMAKE_CURRENT_SOURCE_DIR}/asio) else() set(ASIO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/asio "/usr/include") endif() @@ -324,19 +335,54 @@ if(ZLIB_FOUND) target_link_libraries(paozhu z) endif() -find_path(MYSQL_ROOT_DIR mysql) + +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + if (IS_DIRECTORY "/usr/local/mysql/include") + MESSAGE( STATUS "/usr/local/mysql") + set(MYSQL_INCLUDE_DIR "/usr/local/mysql/include") + include_sub_directories_recursively(/usr/local/mysql/include) + endif() + + if (IS_DIRECTORY "/usr/local/opt/mysql-client") + MESSAGE( STATUS "/usr/local/opt/mysql-client") + set(MYSQL_INCLUDE_DIR "/usr/local/opt/mysql-client/include") + include_sub_directories_recursively(/usr/local/opt/mysql-client/include) + endif() + + if (IS_DIRECTORY "/opt/homebrew/opt/mysql") + MESSAGE( STATUS "/opt/homebrew/opt/mysql") + set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql/include") + include_sub_directories_recursively(/opt/homebrew/opt/mysql/include) + endif() + + + if (IS_DIRECTORY "/opt/homebrew/opt/mysql-client") + MESSAGE( STATUS "/opt/homebrew/opt/mysql-client") + set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql-client/include") + include_sub_directories_recursively(/opt/homebrew/opt/mysql-client/include) + endif() + MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +else() + find_path(MYSQL_ROOT_DIR mysql) +endif() + + +FIND_PATH(MYSQL_INCLUDE_DIR NAMES mysql.h + PATHS /usr/local/include/mysql /usr/include/mysql /opt/homebrew/opt/mysql/include /usr/local/opt/mysql-client/include /opt/homebrew/opt/mysql-client/include +) + MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) -FIND_PATH(MYSQL_INCLUDE_DIR mysql.h - /usr/local/include/mysql - /usr/include/mysql - /usr/local/mysql/include -) + +if(NOT MYSQL_INCLUDE_DIR) + message(STATUS "Could not find \"mysql.h\" from searching ") +endif() + SET(MYSQL_NAMES mysqlclient) FIND_LIBRARY(MYSQL_LIBRARY NAMES ${MYSQL_NAMES} - PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib + PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib /usr/local/opt/mysql/lib /opt/homebrew/opt/mysql/lib /opt/homebrew/opt/mysql-client/lib PATH_SUFFIXES mysql ) @@ -371,7 +417,17 @@ if(ENABLE_GD STREQUAL "ON") message("---ENABLE_GD-----") if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(GD_ROOT_DIR "/usr/local/opt/gd/lib") + + if (IS_DIRECTORY "/usr/local/opt/gd/lib") + MESSAGE( STATUS "/usr/local/opt/gd/lib") + set(GD_ROOT_DIR "/usr/local/opt/gd/lib") + include_sub_directories_recursively(/usr/local/opt/gd/include) + endif() + if (IS_DIRECTORY "/opt/homebrew/opt/gd/lib") + MESSAGE( STATUS "/opt/homebrew/opt/gd/lib") + set(GD_ROOT_DIR "/opt/homebrew/opt/gd/lib") + include_sub_directories_recursively(/opt/homebrew/opt/gd/include) + endif() else() set(GD_ROOT_DIR "${sys_so_path}") endif() @@ -393,7 +449,18 @@ endif() message(STATUS "GD Graphics Library at: ${GD_LIB_DIR}") if(CMAKE_SYSTEM_NAME MATCHES "Darwin") -set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib") + + if (IS_DIRECTORY "/usr/local/opt/qrencode/lib") + MESSAGE( STATUS "/usr/local/opt/qrencode/lib") + set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib") + include_sub_directories_recursively(/usr/local/opt/qrencode/include) + endif() + if (IS_DIRECTORY "/opt/homebrew/opt/qrencode/lib") + MESSAGE( STATUS "/opt/homebrew/opt/qrencode/lib") + set(QR_ROOT_DIR "/opt/homebrew/opt/qrencode/lib") + include_sub_directories_recursively(/opt/homebrew/opt/qrencode/include) + endif() + else() set(QR_ROOT_DIR "${sys_so_path}") endif() @@ -422,7 +489,18 @@ target_link_libraries(paozhu ${GD_LIB_DIR}) target_link_libraries(paozhu ${QR_LIB_DIR}) if(CMAKE_SYSTEM_NAME MATCHES "Darwin") -set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib") + + if (IS_DIRECTORY "/usr/local/opt/libpng/lib") + MESSAGE( STATUS "/usr/local/opt/libpng/lib") + set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib") + include_sub_directories_recursively(/usr/local/opt/libpng/include) + endif() + if (IS_DIRECTORY "/opt/homebrew/opt/libpng/lib") + MESSAGE( STATUS "/opt/homebrew/opt/libpng/lib") + set(PNG_ROOT_DIR "/opt/homebrew/opt/libpng/lib") + include_sub_directories_recursively(/opt/homebrew/opt/libpng/include) + endif() + else() set(PNG_ROOT_DIR "${sys_so_path}") endif() @@ -435,7 +513,18 @@ find_library(PNG_LIB_DIR target_link_libraries(paozhu ${PNG_LIB_DIR}) if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib") + + if (IS_DIRECTORY "/usr/local/opt/freetype/lib") + MESSAGE( STATUS "/usr/local/opt/freetype/lib") + set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib") + include_sub_directories_recursively(/usr/local/opt/freetype/include) + endif() + if (IS_DIRECTORY "/opt/homebrew/opt/freetype/lib") + MESSAGE( STATUS "/opt/homebrew/opt/freetype/lib") + set(FREETYPE_ROOT_DIR "/opt/homebrew/opt/freetype/lib") + include_sub_directories_recursively(/opt/homebrew/opt/freetype/include) + endif() + else() set(FREETYPE_ROOT_DIR "${sys_so_path}") endif() @@ -450,7 +539,15 @@ target_link_libraries(paozhu ${FREETYPE_LIB_DIR}) endif() if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(BROTLI_ROOT_DIR "/usr/local/opt/brotli/lib") + if (IS_DIRECTORY "/usr/local/opt/brotli/lib") + set(BROTLI_ROOT_DIR "/usr/local/opt/brotli/lib") + INCLUDE_DIRECTORIES("/usr/local/opt/brotli/include") + endif() +# set(BROTLI_ROOT_DIR "/usr/local/opt/brotli/lib") + if (IS_DIRECTORY "/opt/homebrew/opt/brotli/lib") + set(BROTLI_ROOT_DIR "/opt/homebrew/opt/brotli/lib") + INCLUDE_DIRECTORIES("/opt/homebrew/opt/brotli/include") + endif() else() set(BROTLI_ROOT_DIR "${sys_so_path}") endif() diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp index faddf242daa..46d8979692a 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp @@ -44,6 +44,16 @@ namespace http } + + void _initauto_domain_httpmethodregto(std::map> &domain_methodcallback) + { + struct regmethold_t temp; + std::map methodcallback; + std::map>::iterator domain_iterator; + + + } + } #endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp new file mode 100755 index 00000000000..dabbdbda827 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/autorestfulpaths.hpp @@ -0,0 +1,40 @@ + +#ifndef __HTTP_AUTO_REG_CONTROL_HTTPRESTFUL_HPP +#define __HTTP_AUTO_REG_CONTROL_HTTPRESTFUL_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "httppeer.h" + + + +namespace http +{ + void _initauto_control_httprestful_paths(std::map> &restfulmethod) + { + + + if(restfulmethod.size()) + {} + + + } + + void _initauto_domain_httprestful_paths(std::map>> &restfulmethod) + { + std::map> temp_path; + std::map>>::iterator domain_iterator; + + domain_iterator=restfulmethod.begin(); + temp_path.clear(); + + + } + +} + +#endif + + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h new file mode 100755 index 00000000000..47fb182f0e0 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h @@ -0,0 +1,9 @@ +#pragma once +#ifndef _CONST_DEFINE_FUNC_H +#define _CONST_DEFINE_FUNC_H + +#define CONST_MONEY_PART 1000000 +#define CONST_HTTP_HEADER_BODY_SIZE 16384 +#define CONST_PHP_BODY_POST_SIZE 16777216 + +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp new file mode 100755 index 00000000000..3440c23f84b --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "httppeer.h" +namespace http +{ +std::map _block_ip_tables; +std::map _block_host_tables; +bool check_blockip(const std::string &client_ip) +{ + if (client_ip.size() > 0) + { + return false; + } + return false; +} +bool hook_host_http1(std::shared_ptr peer) +{ + if (peer->host.size() > 0) + { + return false; + } + return false; +} +bool hook_host_http2(std::shared_ptr peer) +{ + if (peer->host.size() > 0) + { + return false; + } + return false; +} +}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h b/frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h old mode 100644 new mode 100755 diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp new file mode 100755 index 00000000000..b8e9c718ea9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/websockets_method_reg.hpp @@ -0,0 +1,19 @@ +#pragma once +#include +#include "httppeer.h" +#include "websockets.h" +#include "mywebsockets.hpp" +#include "websockets_callback.h" +namespace http +{ +void _initwebsocketmethodregto(WEBSOCKET_REG &methodcallback) +{ + + methodcallback.emplace("wstest", [](std::weak_ptr p) -> std::shared_ptr + { return http::mywebsockets::create(p); }); + // methodcallback.emplace("looptest",[](std::weak_ptr p)->std::shared_ptr{ + // return http::loopwebsockets::create(p); + // }); +} + +}// namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf index e76a18093e9..9013265e678 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf @@ -3,7 +3,7 @@ threadmax=1024 threadmin=5 httpport=8888 httpsport=4430 -cothreadnum=8 ;Coroutines run on thread num +cothreadnum=16 ;Coroutines run on thread num http2_enable=0 debug_enable=1 @@ -13,6 +13,9 @@ certificate_chain_file=localhost.pem private_key_file=localhost.key tmp_dh_file=dh4096.pem reboot_password=e10adc3949ba59abbe56e057f20f883e ;md5(md5("123456")+"rand_char"+md5("123456")) +reboot_cron =w1h5 ;MDSW+Hhours reboot process M month D day S season (1 4 7 10) W week +clean_cron =m5t600 ;5-minute interval clean 600 seconds ago inactive connection +links_restart_process =n9998877ts1te5 ;More than 15000 connections, restart the process from 1:00 am to 5:00 am session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve static_file_compress_cache=1 ;1 enable, Cache static file compress(gzip,br) content to cache directory modelspath=/root/benchmark/models @@ -39,4 +42,7 @@ method_after= show_visitinfo=0 upload_max_size=16777216 - +siteid=0 +groupid=0 +alias_domain= +init_func= \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp new file mode 100755 index 00000000000..160924992af --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp @@ -0,0 +1,16 @@ +#include "mysqlmodel.hpp" +#include "fortunebase.h" +#include "Fortune.h" + +/* 如果此文件存在不会自动覆盖,没有则会自动生成。 +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + + + namespace orm{ + + + Fortune::Fortune(std::string dbtag):mysqlclientDB(dbtag){} + Fortune::Fortune():mysqlclientDB(){} + + + } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp new file mode 100755 index 00000000000..aa18f46cab6 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp @@ -0,0 +1,16 @@ +#include "mysqlmodel.hpp" +#include "worldbase.h" +#include "World.h" + +/* 如果此文件存在不会自动覆盖,没有则会自动生成。 +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + + + namespace orm{ + + + World::World(std::string dbtag):mysqlclientDB(dbtag){} + World::World():mysqlclientDB(){} + + + } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h new file mode 100755 index 00000000000..27865161b32 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h @@ -0,0 +1,16 @@ +#ifndef ORM_DEFAULT_FORTUNE_H +#define ORM_DEFAULT_FORTUNE_H +#include "mysqlmodel.hpp" +#include "fortunebase.h" + +/* 如果此文件存在不会自动覆盖,没有则会自动生成。 +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + + namespace orm { + class Fortune : public mysqlclientDB{ + public: + Fortune(std::string dbtag); + Fortune(); + }; +}; +#endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h new file mode 100755 index 00000000000..ba44dee7888 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h @@ -0,0 +1,16 @@ +#ifndef ORM_DEFAULT_WORLD_H +#define ORM_DEFAULT_WORLD_H +#include "mysqlmodel.hpp" +#include "worldbase.h" + +/* 如果此文件存在不会自动覆盖,没有则会自动生成。 +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + + namespace orm { + class World : public mysqlclientDB{ + public: + World(std::string dbtag); + World(); + }; +}; +#endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h new file mode 100755 index 00000000000..8a09ecc4564 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -0,0 +1,2687 @@ +#ifndef ORM_DEFAULT_FORTUNEBASEMATA_H +#define ORM_DEFAULT_FORTUNEBASEMATA_H +/* +*This file is auto create from cli +*本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT +***/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mysql.h" +namespace orm { + + +struct fortunebase +{ + struct meta{ + unsigned int id= 0; // + std::string message=""; // + } data; + std::vector record; +std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . +std::vector _keypos{0x00}; +MYSQL_ROW _row; +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } +const std::array colnames={"id","message"}; +const std::array colnamestype= {3,253}; +std::string tablename="fortune"; +std::string modelname="Fortune"; + + unsigned char findcolpos(const std::string &coln){ + if(coln.size()==0) + { + return 255; + } + unsigned char bi=coln[0]; + + + if(bi<91&&bi>64){ + bi+=32; + } + switch(coln[0]){ + + + case 'i': + return 0; +break; +case 'm': + return 1; +break; + + } + return 255; + } + + int size(){ return record.size(); } + + std::string getPKname(){ + return "id"; +} + + void record_reset() + { + record.clear(); + } + void data_reset(){ + fortunebase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ + std::string temp; + + return temp; + } + void _setColnamevalue() + { + for(unsigned char i=0;i<_keypos.size();i++) + { + switch(_keypos[i]){ + case 0: + try{ + data.id=std::stoul(_row[i]); + }catch (...) { + data.id=0; + } + break; + case 1: + try{ + data.message.append((_row[i]==NULL?"":_row[i])); + }catch (...) { + data.message.clear(); + } + break; + default: + { } + + + } + + if(i>210){ + break; + } + } + } + void _addnewrowvalue(){ + fortunebase::meta metatemp; + + for(unsigned char i=0;i<_keypos.size();i++){ + + switch(_keypos[i]){ + + case 0: + try{ + metatemp.id=std::stoul(_row[i]); + }catch (...) { + metatemp.id=0; + } + break; + case 1: + try{ + metatemp.message.append((_row[i]==NULL?"":_row[i])); + }catch (...) { + metatemp.message.clear(); + } + break; + default: + { } + + + } + if(i>210){ + break; + } + } + record.emplace_back(std::move(metatemp)); + } + + inline std::string stringaddslash(std::string &content){ + std::string temp; + for(unsigned int i=0;i0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(data.id==0){ +tempsql<<"null"; + }else{ + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(insert_data.id==0){ +tempsql<<"null"; + }else{ + tempsql< &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES "; + + for(unsigned int i=0;i0) + { + tempsql<<","; + } + tempsql<<"("; + + + if(insert_data[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< keypos; + for(;jj0){ + unsigned char bpos_i=findcolpos(keyname); + #ifdef DEBUG + if (bpos_i == 254) + { + std::cout << "\033[1m\033[31m-----------\n" + << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" + << std::endl; + } +#endif + keypos.emplace_back(bpos_i); + keyname.clear(); + } + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"`id`=0"; + }else{ + tempsql<<"`id`="<0){ tempsql<<","; } +tempsql<<"`message`='"< 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql<0){ + for(;jj0) + { + tempsql<<","; + } + tempsql<0){ + if(findcolpos(keyname)<255) + { + if(j>0) + { + tempsql<<","; + } + tempsql< data_toarray(std::string fileld=""){ + std::vector temparray; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj data_tomap(std::string fileld=""){ + std::map tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< list_content; + for(;json_offset0) + { + data=metatemp; + } + if(json_offset>=json_content.size()) + { + break; + } + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset1) + { + data=record[0]; + } + } + else + { + if(json_content[json_offset]=='{') + { + json_offset+=1; + std::string json_key_name,json_value_name; + + + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< func,std::string fileld=""){ + std::ostringstream tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< getRecord(){ + return record; +} + + + template::value,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="message") + { + return data.message; + } + return nullptr; + } + + + template,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="id") + { + return data.id; + } + return nullptr; + } + + + template,bool>::type = true > + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + case 0: + a.emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + return a; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + case 0: + return data.id; + break; + } + return 0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] fortunebase::meta & iter,[[maybe_unused]] std::string keyname) + { + + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + case 0: + return iter.id; + break; + + } + + return 0; + } + + template,bool>::type = true > + T getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + + + return 0.0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + } + + + + return 0.0; + } + + template::value,bool>::type = true > + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + case 1: + return data.message; + break; + + } + return ""; + } + + template::value,bool>::type = true > + std::string getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + case 1: + return iter.message; + break; + + } + + + + return ""; + } + + template::value,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + a.emplace_back(iter.message); + break; + } + } + + return a; + } + + std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) + { + std::ostringstream a; + + unsigned char kpos; + kpos=findcolpos(keyname); + int j=0; + if(isyinhao&&record.size()>0) + { + a<<'"'; + } + for(auto &iter:record) + { + if(j>0) + { + if(isyinhao) + { + a<<"\",\""; + }else{ + a<<','; + } + } + switch(kpos) + { + + case 0: + a<0){ + a<<'"'; + } + + return a.str(); + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp,vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + + return a; + } + + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + std::string vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace(iter.id,iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + a.emplace(iter.message,iter); + break; + + } + //a.emplace(ktemp,iter); + } + + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ +case 1: + vtemp=iter.message; + break; + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace_back(iter.id,iter); + break; + + } + } + + return a; + } + template::value,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + a.emplace_back(iter.message,iter); + break; + + } + } + + + return a; + } + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } + + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + a[ktemp].emplace_back(iter.message); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + + } + } + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + a[ktemp].emplace_back(iter.message); + break; + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + + } + } + + return a; + } + + template,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a[iter.id].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + a[iter.message].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; + + } + } + + return a; + } + + }; + + +} +#endif + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h new file mode 100755 index 00000000000..2bba08096e2 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -0,0 +1,2509 @@ +#ifndef ORM_DEFAULT_WORLDBASEMATA_H +#define ORM_DEFAULT_WORLDBASEMATA_H +/* +*This file is auto create from cli +*本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT +***/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mysql.h" +namespace orm { + + +struct worldbase +{ + struct meta{ + unsigned int id= 0; // + int randomnumber= 0; // + } data; + std::vector record; +std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . +std::vector _keypos{0x00}; +MYSQL_ROW _row; +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } +const std::array colnames={"id","randomnumber"}; +const std::array colnamestype= {3,3}; +std::string tablename="world"; +std::string modelname="World"; + + unsigned char findcolpos(const std::string &coln){ + if(coln.size()==0) + { + return 255; + } + unsigned char bi=coln[0]; + + + if(bi<91&&bi>64){ + bi+=32; + } + switch(coln[0]){ + + + case 'i': + return 0; +break; +case 'r': + return 1; +break; + + } + return 255; + } + + int size(){ return record.size(); } + + std::string getPKname(){ + return "id"; +} + + void record_reset() + { + record.clear(); + } + void data_reset(){ + worldbase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ + std::string temp; + + return temp; + } + void _setColnamevalue() + { + for(unsigned char i=0;i<_keypos.size();i++) + { + switch(_keypos[i]){ + case 0: + try{ + data.id=std::stoul(_row[i]); + }catch (...) { + data.id=0; + } + break; + case 1: + try{ + data.randomnumber=std::stoi(_row[i]); + }catch (...) { + data.randomnumber=0; + } + break; + default: + { } + + + } + + if(i>210){ + break; + } + } + } + void _addnewrowvalue(){ + worldbase::meta metatemp; + + for(unsigned char i=0;i<_keypos.size();i++){ + + switch(_keypos[i]){ + + case 0: + try{ + metatemp.id=std::stoul(_row[i]); + }catch (...) { + metatemp.id=0; + } + break; + case 1: + try{ + metatemp.randomnumber=std::stoi(_row[i]); + }catch (...) { + metatemp.randomnumber=0; + } + break; + default: + { } + + + } + if(i>210){ + break; + } + } + record.emplace_back(std::move(metatemp)); + } + + inline std::string stringaddslash(std::string &content){ + std::string temp; + for(unsigned int i=0;i0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(data.id==0){ +tempsql<<"null"; + }else{ + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(insert_data.id==0){ +tempsql<<"null"; + }else{ + tempsql< &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES "; + + for(unsigned int i=0;i0) + { + tempsql<<","; + } + tempsql<<"("; + + + if(insert_data[i].id==0){ + tempsql<<"null"; + }else{ + tempsql<0){ + unsigned char bpos_i=findcolpos(keyname); + #ifdef DEBUG + if (bpos_i == 254) + { + std::cout << "\033[1m\033[31m-----------\n" + << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" + << std::endl; + } +#endif + keypos.emplace_back(bpos_i); + keyname.clear(); + } + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"`id`=0"; + }else{ + tempsql<<"`id`="<0){ tempsql<<","; } +if(data.randomnumber==0){ + tempsql<<"`randomnumber`=0"; + }else{ + tempsql<<"`randomnumber`="< 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql<0){ + for(;jj0) + { + tempsql<<","; + } + tempsql<0){ + if(findcolpos(keyname)<255) + { + if(j>0) + { + tempsql<<","; + } + tempsql< data_toarray(std::string fileld=""){ + std::vector temparray; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj data_tomap(std::string fileld=""){ + std::map tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(data.randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< list_content; + for(;json_offset0) + { + data=metatemp; + } + if(json_offset>=json_content.size()) + { + break; + } + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset1) + { + data=record[0]; + } + } + else + { + if(json_content[json_offset]=='{') + { + json_offset+=1; + std::string json_key_name,json_value_name; + + + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(record[n].randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< func,std::string fileld=""){ + std::ostringstream tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(record[n].randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< getRecord(){ + return record; +} + + + template::value,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + + template,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="id") + { + return data.id; + } + if(key_name=="randomnumber") + { + return data.randomnumber; + } + return nullptr; + } + + + template,bool>::type = true > + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + case 0: + a.emplace_back(iter.id); + break; + case 1: + a.emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + return a; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + case 0: + return data.id; + break; + case 1: + return data.randomnumber; + break; + } + return 0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] worldbase::meta & iter,[[maybe_unused]] std::string keyname) + { + + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + case 0: + return iter.id; + break; + case 1: + return iter.randomnumber; + break; + + } + + return 0; + } + + template,bool>::type = true > + T getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + + + return 0.0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + } + + + + return 0.0; + } + + template::value,bool>::type = true > + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + return ""; + } + + template::value,bool>::type = true > + std::string getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + + } + + + + return ""; + } + + template::value,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + + return a; + } + + std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) + { + std::ostringstream a; + + unsigned char kpos; + kpos=findcolpos(keyname); + int j=0; + if(isyinhao&&record.size()>0) + { + a<<'"'; + } + for(auto &iter:record) + { + if(j>0) + { + if(isyinhao) + { + a<<"\",\""; + }else{ + a<<','; + } + } + switch(kpos) + { + + case 0: + a<0){ + a<<'"'; + } + + return a.str(); + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; +case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + std::string vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace(iter.id,iter); + break; + case 1: + a.emplace(iter.randomnumber,iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + + switch(kpos) + { + + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + return a; + } + + template,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a.emplace_back(iter.id,iter); + break; +case 1: + a.emplace_back(iter.randomnumber,iter); + break; + + } + } + + return a; + } + template::value,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + + return a; + } + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + } + + switch(dpos){ + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + } + + switch(dpos){ + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + return a; + } + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; + + } + } + + return a; + } + + template,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + a[iter.id].emplace_back(iter); + break; + case 1: + a[iter.randomnumber].emplace_back(iter); + break; + + } + } + + return a; + } + + template::value,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; + + } + } + + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; + + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + + } + } + + return a; + } + + }; + + +} +#endif + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h new file mode 100755 index 00000000000..816b9ae4dc9 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/orm.h @@ -0,0 +1,4 @@ +/*build this file time Tue, 20 Dec 2022 11:40:56 GMT*/ + +#include "Fortune.h" +#include "World.h" diff --git a/frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html b/frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html new file mode 100755 index 00000000000..b9079541143 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html @@ -0,0 +1,5 @@ +Fortunes<%c + for(auto &a:obj["list"].as_array()){ +%><%c + } +%>
      idmessage
      <%c echo<<%c echo<
      \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp new file mode 100755 index 00000000000..98a52eeada1 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp @@ -0,0 +1,26 @@ +#ifndef __HTTP_REG_VIEW_METHOD_HPP +#define __HTTP_REG_VIEW_METHOD_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include +#include +#include +#include "request.h" +#include "viewso_param.h" +#include "viewmethold_reg.h" +#include "viewsrc.h" + +namespace http +{ + void _initview_method_regto(VIEW_REG &_viewmetholdreg) + { + //create time: Mon, 30 Dec 2024 15:45:45 GMT + + _viewmetholdreg.emplace("techempower/fortunes",http::view::techempower::fortunes); + + } +} +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h new file mode 100755 index 00000000000..8991765bf19 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h @@ -0,0 +1,26 @@ +#ifndef __HTTP_VIEWSRC_ALL_METHOD_H +#define __HTTP_VIEWSRC_ALL_METHOD_H + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include +#include +#include +#include "request.h" +#include "viewso_param.h" + +namespace http { +namespace view { + +namespace techempower{ + + std::string fortunes(const struct view_param &vinfo,http::OBJ_VALUE &obj); +} + + +} + +} +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp new file mode 100755 index 00000000000..b29f89356b5 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "request.h" +#include "datetime.h" +#include "cookie.h" +#include "urlcode.h" +#include "loadviewso.h" +#include "viewso_param.h" +#include "http_so_common_api.h" +#include "viewsrc.h" +//g++ viewsrc/view/techempower/fortunes.cpp +namespace http { + +namespace view { + namespace techempower{ + std::string fortunes([[maybe_unused]] const struct view_param &vinfo,[[maybe_unused]] http::OBJ_VALUE &obj) + { + + std::ostringstream echo; + + + echo<<"Fortunes"; + + for(auto &a:obj["list"].as_array()){ + + echo<<""; + + } + + echo<<"
      idmessage
      "; + echo<"; + echo<
      "; + + return echo.str(); + } + + } + } + } + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/websockets/include/loopwebsockets.hpp b/frameworks/C++/paozhu/paozhu_benchmark/websockets/include/loopwebsockets.hpp new file mode 100755 index 00000000000..388449b6a33 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/websockets/include/loopwebsockets.hpp @@ -0,0 +1,66 @@ +#include +#include +#include + +#include "orm.h" +#include "httppeer.h" +#include "websockets.h" + +namespace http +{ + +class loopwebsockets : public websockets_api +{ + public: + unsigned int outcount = 0; + loopwebsockets(std::weak_ptr p) : websockets_api(4, 0, p) {} + ~loopwebsockets() { std::cout << "~loopwebsockets" << std::endl; } + + public: + void onopen() { std::cout << "onopen" << std::endl; } + void onclose() { std::cout << "onclose" << std::endl; } + void onpong() {} + void pushloop() + { + std::shared_ptr peer = weakpeer.lock(); + if (peer) + { + std::cout << "timeloop:" << std::endl; + std::string aa = "looptests"; + std::string outhello; + peer->ws->makeWSText(aa, outhello); + peer->send(outhello); + + // peer->send(aa); + if (outcount == 4) + { + timeloop_num = 0; + outcount = 0; + return; + } + outcount++; + } + else + { + std::cout << "peer is die!" << std::endl; + } + } + void onfiles(std::string_view filename) { std::cout << "--------onfiles:--------" << filename << std::endl; } + void onmessage(std::string_view data) + { + std::cout << "onmessage:" << data << std::endl; + std::shared_ptr peer = weak_peer.lock(); + if (peer) + { + std::string outhello; + peer->ws->makeWSText(data, outhello); + peer->send(outhello); + } + } + static std::shared_ptr create(std::weak_ptr p) + { + return std::make_shared(p); + } +}; + +}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/websockets/include/mywebsockets.hpp b/frameworks/C++/paozhu/paozhu_benchmark/websockets/include/mywebsockets.hpp new file mode 100755 index 00000000000..4ebd42b88f3 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/websockets/include/mywebsockets.hpp @@ -0,0 +1,83 @@ +#include +#include +#include + +#include "orm.h" +#include "httppeer.h" +#include "websockets.h" +#include "terminal_color.h" +// g++ -shared -fPIC mywebsockets.cpp -o mywebsockets.so +namespace http +{ + +class mywebsockets : public websockets_api +{ + public: + // unsigned int timeloop_num; + // unsigned char state; + unsigned int outcount = 0; + mywebsockets(std::weak_ptr p) : websockets_api(4, 0, p) {} + ~mywebsockets() { DEBUG_LOG(" ~mywebsockets "); } + + public: + void onopen() { DEBUG_LOG(" onopen "); } + void onclose() { DEBUG_LOG(" onclose "); } + void onpong() {} + void pushloop() + { + std::shared_ptr peer = weak_peer.lock(); + if (peer) + { + DEBUG_LOG(" timeloop "); + std::string aa = "This server push msg or subscribe msg"; + std::string outhello; + peer->ws->makeWSText(aa.data(), aa.length(), outhello); + peer->send(outhello); + + // peer->send(aa); + if (outcount == 4) + { + timeloop_num = 0; + outcount = 0; + return; + } + outcount++; + } + else + { + DEBUG_LOG(" peer is die! "); + } + } + + void onfiles([[maybe_unused]] std::string_view filename) { DEBUG_LOG("onfiles %zu", filename.size()); } + void onmessage(std::string_view data) + { + std::ostringstream oss; + oss << std::this_thread::get_id(); + oss << " onmessage:" << data << std::endl; + std::string temp = oss.str(); + DEBUG_LOG("%s", temp.c_str()); + std::shared_ptr peer = weak_peer.lock(); + if (peer) + { + std::string outhello; + if(data=="html") + { + std::string html_data="

      Websocket test 测试h3

      "; + peer->ws->makeWSText(html_data, outhello); + } + else + { + peer->ws->makeWSText(data, outhello); + } + + peer->send(outhello); + } + } + static std::shared_ptr create(std::weak_ptr p) + { + return std::make_shared(p); + } +}; + +}// namespace http \ No newline at end of file From 4b78e4b3be9c486242fb187e4ae3ecdb8d8a8708 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 1 Jan 2025 14:20:00 +0800 Subject: [PATCH 1000/1766] paozhu update --- .../paozhu/paozhu_benchmark/CMakeLists.txt | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index a4fabfb1ae6..4f4dc54b963 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -7,21 +7,27 @@ set(ENABLE_BOOST OFF CACHE BOOL "choose ON to enable") set(ENABLE_GD OFF CACHE BOOL "choose ON to enable") set(ENABLE_WIN_VCPKG OFF CACHE BOOL "choose ON to enable") -if (ENABLE_GD STREQUAL "ON") - list(FIND VCPKG_MANIFEST_FEATURES "gd" index) - if (index EQUAL -1) - message(STATUS "Auto append features: gd") - list(APPEND VCPKG_MANIFEST_FEATURES "gd") - endif () -endif () +if(ENABLE_VCPKG) + set(vcpkg_root $ENV{VCPKG_ROOT}) + if(NOT DEFINED CMAKE_TOOLCHAIN_FILE AND vcpkg_root) + set(CMAKE_TOOLCHAIN_FILE "${vcpkg_root}/scripts/buildsystems/vcpkg.cmake") + endif() +endif() -if (ENABLE_BOOST STREQUAL "ON") - list(FIND VCPKG_MANIFEST_FEATURES "boost" index) - if (index EQUAL -1) - message(STATUS "Auto append features: boost") - list(APPEND VCPKG_MANIFEST_FEATURES "boost") - endif () -endif () +macro(auto_enable_vcpkg_feature opt feature) + if(${opt}) + list(FIND VCPKG_MANIFEST_FEATURES ${feature} index) + if(index EQUAL -1) + message(STATUS "Auto append features: ${feature}") + list(APPEND VCPKG_MANIFEST_FEATURES ${feature}) + endif() + endif() +endmacro() + +if(ENABLE_VCPKG) + auto_enable_vcpkg_feature(ENABLE_GD "gd") + auto_enable_vcpkg_feature(ENABLE_BOOST "boost") +endif() PROJECT(Paozhu_web_framework) set(CMAKE_CXX_STANDARD 20) @@ -602,4 +608,4 @@ endif () if (CMAKE_SYSTEM_NAME MATCHES "Windows") target_link_libraries(paozhu ws2_32) target_link_libraries(paozhu_cli ws2_32) -endif () \ No newline at end of file +endif () From 2c2bfde62613291366d20988ec31d45020c25281 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 1 Jan 2025 14:25:20 +0800 Subject: [PATCH 1001/1766] paozhu update --- frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index 4f4dc54b963..4d2779800a0 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -189,6 +189,7 @@ include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/models) include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/controller/include) include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs) include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include) +include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/common) add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) From 04ab8f4906e9627b2f74335d4527e0e5c5f00fb5 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 1 Jan 2025 14:49:36 +0800 Subject: [PATCH 1002/1766] paozhu update --- frameworks/C++/paozhu/paozhu.dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 480d726d314..05823528df3 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -36,7 +36,7 @@ COPY ./paozhu_benchmark/orm ./paozhu/ COPY ./paozhu_benchmark/models ./paozhu/ COPY ./paozhu_benchmark/common ./paozhu/ - +RUN ls -l ./paozhu/common # RUN mkdir ./paozhu/libs # RUN mkdir ./paozhu/libs/types @@ -54,6 +54,7 @@ COPY ./paozhu_benchmark/common ./paozhu/ # COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ # COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ # COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf From 61d1364566483a16d4e92de8a0a151747d2d8e32 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 1 Jan 2025 15:07:48 +0800 Subject: [PATCH 1003/1766] paozhu update --- frameworks/C++/paozhu/paozhu.dockerfile | 67 +++++++++++++++++++------ 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 05823528df3..68b78055ddc 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -27,6 +27,7 @@ RUN rm -Rf ./paozhu/models RUN rm -Rf ./paozhu/common + COPY ./paozhu_benchmark/controller ./paozhu/ COPY ./paozhu_benchmark/libs ./paozhu/ COPY ./paozhu_benchmark/view ./paozhu/ @@ -36,30 +37,68 @@ COPY ./paozhu_benchmark/orm ./paozhu/ COPY ./paozhu_benchmark/models ./paozhu/ COPY ./paozhu_benchmark/common ./paozhu/ -RUN ls -l ./paozhu/common -# RUN mkdir ./paozhu/libs -# RUN mkdir ./paozhu/libs/types +RUN ls -l ./paozhu + +RUN mkdir ./paozhu/common +RUN mkdir ./paozhu/libs +RUN mkdir ./paozhu/libs/types +COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -# RUN mkdir ./paozhu/controller -# RUN mkdir ./paozhu/controller/include -# RUN mkdir ./paozhu/controller/src +RUN mkdir ./paozhu/controller +RUN mkdir ./paozhu/controller/include +RUN mkdir ./paozhu/controller/src -# COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ -# COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ +COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ -# COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ -# COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -# COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ + COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt +RUN mkdir ./paozhu/view +RUN mkdir ./paozhu/view/techempower + +COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ + +RUN mkdir ./paozhu/viewsrc +RUN mkdir ./paozhu/viewsrc/include +RUN mkdir ./paozhu/viewsrc/view +RUN mkdir ./paozhu/viewsrc/view/techempower + +COPY ./paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp ./paozhu/viewsrc/view/techempower/ +COPY ./paozhu_benchmark/viewsrc/include/viewsrc.h ./paozhu/viewsrc/include/ +COPY ./paozhu_benchmark/viewsrc/include/regviewmethod.hpp ./paozhu/viewsrc/include/ + + + +RUN mkdir ./paozhu/orm +RUN mkdir ./paozhu/orm/include + + +COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ +COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ + +RUN mkdir ./paozhu/models +RUN mkdir ./paozhu/models/include + +COPY ./paozhu_benchmark/models/include/Fortune.h ./paozhu/models/include/ +COPY ./paozhu_benchmark/models/include/World.h ./paozhu/models/include/ +COPY ./paozhu_benchmark/models/World.cpp ./paozhu/models/ +COPY ./paozhu_benchmark/models/Fortune.cpp ./paozhu/models/ + WORKDIR /paozhu RUN unzip asio.zip From 5c339e5ef5dfd06af60c1ac6f5ebad79b0813422 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 1 Jan 2025 15:18:35 +0800 Subject: [PATCH 1004/1766] paozhu update --- frameworks/C++/paozhu/paozhu.dockerfile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 68b78055ddc..e4c3e01f6d6 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -28,14 +28,14 @@ RUN rm -Rf ./paozhu/common -COPY ./paozhu_benchmark/controller ./paozhu/ -COPY ./paozhu_benchmark/libs ./paozhu/ -COPY ./paozhu_benchmark/view ./paozhu/ -COPY ./paozhu_benchmark/viewsrc ./paozhu/ - -COPY ./paozhu_benchmark/orm ./paozhu/ -COPY ./paozhu_benchmark/models ./paozhu/ -COPY ./paozhu_benchmark/common ./paozhu/ +# COPY ./paozhu_benchmark/controller ./paozhu/ +# COPY ./paozhu_benchmark/libs ./paozhu/ +# COPY ./paozhu_benchmark/view ./paozhu/ +# COPY ./paozhu_benchmark/viewsrc ./paozhu/ + +# COPY ./paozhu_benchmark/orm ./paozhu/ +# COPY ./paozhu_benchmark/models ./paozhu/ +# COPY ./paozhu_benchmark/common ./paozhu/ RUN ls -l ./paozhu From 20402da95165ec61bf844443b589e1779091ff37 Mon Sep 17 00:00:00 2001 From: hzq Date: Wed, 1 Jan 2025 15:31:51 +0800 Subject: [PATCH 1005/1766] paozhu update --- frameworks/C++/paozhu/paozhu.dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index e4c3e01f6d6..49094ed13fd 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -105,6 +105,8 @@ RUN unzip asio.zip RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build +RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release +RUN cmake --build build EXPOSE 8888 From 3cc613cebd28c78eab929df8429d169a407e498d Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Wed, 1 Jan 2025 16:23:07 +0700 Subject: [PATCH 1006/1766] some refactor --- .../org/jetbrains/ktor/benchmarks/Hello.kt | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index 1715b0c643c..9dbef8bbd3b 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -124,30 +124,25 @@ fun Application.main() { val queries = call.queries() val random = Random.Default - val result = coroutineScope { - val worlds = selectWorlds(queries, random) + val worlds = selectWorlds(queries, random) - val worldsUpdated = buildList { - worlds.collect { - it.randomNumber = random.nextInt(DB_ROWS) + 1 - add(it) - } - } + val worldsUpdated = buildList { + worlds.collect { world -> + world.randomNumber = random.nextInt(DB_ROWS) + 1 + add(world) - val updateRequests = worldsUpdated.map { world -> Mono.usingWhen(dbConnFactory.create(), { connection -> Mono.from( - connection.createStatement(UPDATE_QUERY).bind(0, world.randomNumber).bind(1, world.id) + connection.createStatement(UPDATE_QUERY) + .bind(0, world.randomNumber) + .bind(1, world.id) .execute() ).flatMap { Mono.from(it.rowsUpdated) } - }, Connection::close) + }, Connection::close).awaitFirstOrNull() } - - Flux.merge(updateRequests).collectList().awaitFirst() - worldsUpdated } - call.respondText(Json.encodeToString(result), ContentType.Application.Json) + call.respondText(Json.encodeToString(worldsUpdated), ContentType.Application.Json) } } } @@ -182,7 +177,6 @@ private fun configurePostgresR2DBC(config: ApplicationConfig): ConnectionFactory val cp = ConnectionPoolConfiguration.builder(cf) .initialSize(config.property("db.initPoolSize").getString().toInt()) .maxSize(config.property("db.maxPoolSize").getString().toInt()) - //.maxLifeTime(Duration.ofMillis(Long.MAX_VALUE)) .build() return ConnectionPool(cp) From fd62a31476793f50894bdf95d8fae6a99cf0b799 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Wed, 1 Jan 2025 18:25:27 +0700 Subject: [PATCH 1007/1766] update jvm to be version 21 across all Ktor versions for consistency --- frameworks/Kotlin/ktor/ktor-cio.dockerfile | 4 +-- frameworks/Kotlin/ktor/ktor-jetty.dockerfile | 4 +-- .../src/main/assembly/cio-bundle.xml | 30 ------------------- .../src/main/assembly/jetty-bundle.xml | 30 ------------------- 4 files changed, 4 insertions(+), 64 deletions(-) delete mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml delete mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml diff --git a/frameworks/Kotlin/ktor/ktor-cio.dockerfile b/frameworks/Kotlin/ktor/ktor-cio.dockerfile index 33059ec9fd4..07f8c268f64 100644 --- a/frameworks/Kotlin/ktor/ktor-cio.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-cio.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.9.7-amazoncorretto-17-debian as maven +FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as maven WORKDIR /ktor COPY ktor/pom.xml pom.xml COPY ktor/src src RUN mvn clean package -q -FROM amazoncorretto:17.0.11-al2023-headless +FROM amazoncorretto:21-al2023-headless WORKDIR /ktor COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-cio-bundle.jar app.jar diff --git a/frameworks/Kotlin/ktor/ktor-jetty.dockerfile b/frameworks/Kotlin/ktor/ktor-jetty.dockerfile index e753d7cc442..08e13edc189 100644 --- a/frameworks/Kotlin/ktor/ktor-jetty.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-jetty.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.9.7-amazoncorretto-17-debian as maven +FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as maven WORKDIR /ktor COPY ktor/pom.xml pom.xml COPY ktor/src src RUN mvn clean package -q -FROM amazoncorretto:17.0.11-al2023-headless +FROM amazoncorretto:21-al2023-headless WORKDIR /ktor COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-jetty-bundle.jar app.jar diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml deleted file mode 100644 index 8b515de6096..00000000000 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/cio-bundle.xml +++ /dev/null @@ -1,30 +0,0 @@ - - cio-bundle - - jar - - - false - - - - true - runtime - - true - - - *:ktor-server-netty - *:ktor-server-jetty - - - - - - - ${project.build.outputDirectory} - / - - - \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml deleted file mode 100644 index 8b55f09e7ef..00000000000 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/assembly/jetty-bundle.xml +++ /dev/null @@ -1,30 +0,0 @@ - - jetty-bundle - - jar - - - false - - - - true - runtime - - true - - - *:ktor-server-netty - *:ktor-server-cio - - - - - - - ${project.build.outputDirectory} - / - - - \ No newline at end of file From 61970eb87036c37792542ef42c06c19d4a5c3217 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Wed, 1 Jan 2025 18:35:01 +0700 Subject: [PATCH 1008/1766] update jvm settings to be same for all ktor tests --- frameworks/Kotlin/ktor/ktor-cio.dockerfile | 2 +- frameworks/Kotlin/ktor/ktor-jetty.dockerfile | 2 +- .../kotlin/org/jetbrains/ktor/benchmarks/Hello.kt | 11 ++--------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-cio.dockerfile b/frameworks/Kotlin/ktor/ktor-cio.dockerfile index 07f8c268f64..7443aed952f 100644 --- a/frameworks/Kotlin/ktor/ktor-cio.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-cio.dockerfile @@ -10,4 +10,4 @@ COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-cio EXPOSE 9090 -CMD ["java", "-jar", "app.jar"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] diff --git a/frameworks/Kotlin/ktor/ktor-jetty.dockerfile b/frameworks/Kotlin/ktor/ktor-jetty.dockerfile index 08e13edc189..52855ab4a55 100644 --- a/frameworks/Kotlin/ktor/ktor-jetty.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-jetty.dockerfile @@ -10,4 +10,4 @@ COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-jet EXPOSE 9090 -CMD ["java", "-jar", "app.jar"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index 9dbef8bbd3b..461c6e303e8 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -10,18 +10,13 @@ import io.ktor.server.response.* import io.ktor.server.routing.* import io.r2dbc.pool.ConnectionPool import io.r2dbc.pool.ConnectionPoolConfiguration -import io.r2dbc.pool.PoolingConnectionFactoryProvider import io.r2dbc.postgresql.PostgresqlConnectionConfiguration import io.r2dbc.postgresql.PostgresqlConnectionFactory -import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider import io.r2dbc.postgresql.client.SSLMode import io.r2dbc.spi.Connection -import io.r2dbc.spi.ConnectionFactories import io.r2dbc.spi.ConnectionFactory -import io.r2dbc.spi.ConnectionFactoryOptions -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* -import kotlinx.coroutines.reactive.asFlow +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.reactive.awaitFirst import kotlinx.coroutines.reactive.awaitFirstOrNull import kotlinx.html.* @@ -36,8 +31,6 @@ import org.jetbrains.ktor.benchmarks.models.Message import org.jetbrains.ktor.benchmarks.models.World import reactor.core.publisher.Flux import reactor.core.publisher.Mono -import reactor.netty.resources.LoopResources -import java.time.Duration import kotlin.random.Random fun Application.main() { From 1f9313599eef7251b59212bea34b25da459a4dec Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Wed, 1 Jan 2025 18:49:53 +0700 Subject: [PATCH 1009/1766] updated old docker files --- frameworks/Kotlin/ktor/ktor-jasync.dockerfile | 4 ++-- frameworks/Kotlin/ktor/ktor-pgclient.dockerfile | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile index 8c66e81ea4e..32c273fa129 100644 --- a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.7-amazoncorretto-17-debian +FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as maven WORKDIR /app COPY ktor-asyncdb/gradle gradle COPY ktor-asyncdb/build.gradle.kts build.gradle.kts @@ -10,4 +10,4 @@ RUN /app/gradlew --no-daemon shadowJar EXPOSE 9090 -CMD ["java", "-server", "-XX:+UseParallelGC", "-Xms2G","-Xmx2G", "-jar", "/app/build/libs/bench.jar", "jasync-sql"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "/app/build/libs/bench.jar", "jasync-sql"] diff --git a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile index 0cf012e7596..58f087f6bc8 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.7-amazoncorretto-17-debian as build +FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as build WORKDIR /app COPY ktor-pgclient/gradle gradle COPY ktor-pgclient/build.gradle.kts build.gradle.kts @@ -6,10 +6,10 @@ COPY ktor-pgclient/gradlew gradlew COPY ktor-pgclient/src src RUN /app/gradlew --no-daemon shadowJar -FROM amazoncorretto:17.0.11-al2023-headless +FROM amazoncorretto:21-al2023-headless WORKDIR /app COPY --from=build /app/build/libs/ktor-pgclient.jar ktor-pgclient.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:MaxRAMFraction=1", "-XX:-UseBiasedLocking", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "ktor-pgclient.jar"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "ktor-pgclient.jar"] From 724f7a4b3ee90c7ccf3732cfb2d35e6a8d590b31 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Thu, 2 Jan 2025 16:30:18 +0700 Subject: [PATCH 1010/1766] fixed pgclient test --- .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/ktor/ktor-jasync.dockerfile | 15 ++++++--------- frameworks/Kotlin/ktor/ktor-pgclient.dockerfile | 2 +- .../Kotlin/ktor/ktor-pgclient/build.gradle.kts | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties index 3d66c176054..aae61b4adc9 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip diff --git a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile index 32c273fa129..8bda3725d0d 100644 --- a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile @@ -1,13 +1,10 @@ -FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as maven -WORKDIR /app -COPY ktor-asyncdb/gradle gradle -COPY ktor-asyncdb/build.gradle.kts build.gradle.kts -COPY ktor-asyncdb/gradle.properties gradle.properties -COPY ktor-asyncdb/gradlew gradlew +FROM gradle:jdk21 + +WORKDIR /ktor-asyncdb COPY ktor-asyncdb/settings.gradle settings.gradle -COPY ktor-asyncdb/src src -RUN /app/gradlew --no-daemon shadowJar +COPY ktor-asyncdb/app app +RUN gradle --no-daemon shadowJar EXPOSE 9090 -CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "/app/build/libs/bench.jar", "jasync-sql"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "/app/build/libs/bench.jar", "jasync-sql"] diff --git a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile index 58f087f6bc8..301f5e55c31 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-amazoncorretto-21-debian-bookworm as build +FROM gradle:jdk21 as build WORKDIR /app COPY ktor-pgclient/gradle gradle COPY ktor-pgclient/build.gradle.kts build.gradle.kts diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts index f080b64d69f..a9c2a02417a 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts @@ -29,7 +29,7 @@ dependencies { } tasks.withType().configureEach { - kotlinOptions.jvmTarget = "17" + kotlinOptions.jvmTarget = "21" } tasks.shadowJar { diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties index e1bef7e873c..81aa1c0448a 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/ktor/ktor-pgclient/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 981a75bd698c76627755cb5397f41042a3c75e91 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Fri, 3 Jan 2025 11:35:42 +0700 Subject: [PATCH 1011/1766] fixed older variants --- .../Kotlin/ktor/ktor-asyncdb/build.gradle.kts | 15 ++++++++++----- .../Kotlin/ktor/ktor-asyncdb/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 1 - .../Kotlin/ktor/ktor-asyncdb/settings.gradle | 14 -------------- .../ktor/ktor-asyncdb/settings.gradle.kts | 1 + frameworks/Kotlin/ktor/ktor-jasync.dockerfile | 17 +++++++++++------ .../Kotlin/ktor/ktor-pgclient/build.gradle.kts | 17 ++++++++++------- 7 files changed, 33 insertions(+), 34 deletions(-) delete mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle create mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle.kts diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts index 61cedf013ce..029a0973171 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts @@ -1,6 +1,6 @@ plugins { application - kotlin("jvm") version "1.9.22" + kotlin("jvm") version "2.0.21" kotlin("plugin.serialization") version "2.0.0" id("com.github.johnrengelman.shadow") version "8.1.0" } @@ -17,8 +17,7 @@ application { } val ktor_version = "2.3.12" -val kotlinx_serialization_version = "1.6.3" -val vertx_pg_client = "4.5.8" +val kotlinx_serialization_version = "1.7.3" dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version") @@ -26,11 +25,17 @@ dependencies { implementation("io.ktor:ktor-server-netty:$ktor_version") implementation("io.ktor:ktor-server-default-headers:$ktor_version") implementation("io.ktor:ktor-server-html-builder:$ktor_version") - implementation("com.github.jasync-sql:jasync-postgresql:2.2.0") + implementation("com.github.jasync-sql:jasync-postgresql:2.2.4") +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } tasks.shadowJar { - archiveBaseName.set("bench") + archiveBaseName.set("ktor-asyncdb") archiveClassifier.set("") archiveVersion.set("") } diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties index 5790d58ceda..9408f64fb4d 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle.properties @@ -1,4 +1,4 @@ kotlin.code.style=official -kotlin_version=1.9.22 +kotlin_version=2.0.21 ktor_version=2.3.12 diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties index aae61b4adc9..c6a2952d3c1 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,3 @@ -#Fri Dec 07 21:01:17 MST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle b/frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle deleted file mode 100644 index d58b02872bf..00000000000 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - resolutionStrategy { - eachPlugin { - if (requested.id.id == "org.jetbrains.kotlin.jvm") { - useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") - } - if (requested.id.id == "kotlinx-serialization") { - useModule("org.jetbrains.kotlin:kotlin-serialization:$kotlin_version") - } - } - } -} - -rootProject.name = 'tech-empower-framework-benchmark' \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle.kts b/frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle.kts new file mode 100644 index 00000000000..fd565dc83c5 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "tech-empower-framework-benchmark" \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile index 8bda3725d0d..be5f6dd4606 100644 --- a/frameworks/Kotlin/ktor/ktor-jasync.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-jasync.dockerfile @@ -1,10 +1,15 @@ -FROM gradle:jdk21 +FROM gradle:jdk21 as build +WORKDIR /app +COPY ktor-asyncdb/gradle gradle +COPY ktor-asyncdb/build.gradle.kts build.gradle.kts +COPY ktor-asyncdb/gradlew gradlew +COPY ktor-asyncdb/src src +RUN /app/gradlew --no-daemon shadowJar -WORKDIR /ktor-asyncdb -COPY ktor-asyncdb/settings.gradle settings.gradle -COPY ktor-asyncdb/app app -RUN gradle --no-daemon shadowJar +FROM amazoncorretto:21-al2023-headless +WORKDIR /app +COPY --from=build /app/build/libs/ktor-asyncdb.jar ktor-asyncdb.jar EXPOSE 9090 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "/app/build/libs/bench.jar", "jasync-sql"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "ktor-asyncdb.jar", "jasync-sql"] diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts index a9c2a02417a..60524844558 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts @@ -1,6 +1,6 @@ plugins { application - kotlin("jvm") version "1.9.22" + kotlin("jvm") version "2.0.21" kotlin("plugin.serialization") version "2.0.0" id("com.github.johnrengelman.shadow") version "8.1.0" } @@ -17,19 +17,22 @@ application { } val ktor_version = "2.3.12" +val vertx_version = "4.5.11" dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") implementation("io.ktor:ktor-server-netty:$ktor_version") implementation("io.ktor:ktor-server-html-builder-jvm:$ktor_version") implementation("io.ktor:ktor-server-default-headers-jvm:$ktor_version") - implementation("io.vertx:vertx-pg-client:4.5.8") - implementation("io.vertx:vertx-lang-kotlin:4.5.8") - implementation("io.vertx:vertx-lang-kotlin-coroutines:4.5.8") + implementation("io.vertx:vertx-pg-client:$vertx_version") + implementation("io.vertx:vertx-lang-kotlin:$vertx_version") + implementation("io.vertx:vertx-lang-kotlin-coroutines:$vertx_version") } -tasks.withType().configureEach { - kotlinOptions.jvmTarget = "21" +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } tasks.shadowJar { From 712aefeb26a36b30fa790001358d4ca0d95e8628 Mon Sep 17 00:00:00 2001 From: robert engels Date: Sat, 4 Jan 2025 18:23:30 -0600 Subject: [PATCH 1012/1766] Update pom.xml upgrade httpserver version --- frameworks/Java/httpserver-robaho/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/httpserver-robaho/pom.xml b/frameworks/Java/httpserver-robaho/pom.xml index ce9dc2cd27e..2888eba5693 100644 --- a/frameworks/Java/httpserver-robaho/pom.xml +++ b/frameworks/Java/httpserver-robaho/pom.xml @@ -40,7 +40,7 @@ io.github.robaho httpserver - 1.0.6 + 1.0.17 compile
      From 19fa4153d506b87d775d7dcb75ec1a3d969aa77f Mon Sep 17 00:00:00 2001 From: Petrik Date: Fri, 3 Jan 2025 20:44:09 +0100 Subject: [PATCH 1013/1766] [rails] Add Iodine server +-------------+---------+------+------+------+------+-------+------------+--------------+ | name|plaintext|update| json| db| query|fortune|cached-query|weighted_score| +-------------+---------+------+------+------+------+-------+------------+--------------+ | rails| 24599| 10016| 84462| 24975| 15127| 15241| 16647| 1207| | rails-iodine| 176699| 15306|116194| 32006| 25107| 18626| 31326| 1868| --- frameworks/Ruby/rails/Gemfile | 22 ++++++++------- frameworks/Ruby/rails/Gemfile.lock | 2 ++ frameworks/Ruby/rails/README.md | 6 +++-- frameworks/Ruby/rails/benchmark_config.json | 25 ++++++++++++++++- frameworks/Ruby/rails/rails-agoo.dockerfile | 2 +- frameworks/Ruby/rails/rails-falcon.dockerfile | 2 +- frameworks/Ruby/rails/rails-iodine.dockerfile | 27 +++++++++++++++++++ frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 2 +- 9 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 frameworks/Ruby/rails/rails-iodine.dockerfile diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 9b7458ae417..0afad6b04cc 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -4,23 +4,27 @@ gem 'rails', '~> 8.0.0' gem 'redis', '~> 5.0' gem 'tzinfo-data' -group :mysql do +group :mysql, optional: true do gem 'trilogy', '~> 2.8.1' end -group :postgresql do +group :postgresql, optional: true do gem 'pg', '~> 1.5' end -group :falcon do - gem 'falcon', '~> 0.47', require: false +group :agoo, optional: true do + gem 'agoo', require: false + gem 'rackup' end -group :puma do - gem 'puma', '~> 6.4', require: false +group :iodine, optional: true do + gem 'iodine', '~> 0.7', require: false end -group :agoo do - gem 'agoo', require: false - gem 'rackup' +group :falcon, optional: true do + gem 'falcon', '~> 0.47', require: false +end + +group :puma, optional: true do + gem 'puma', '~> 6.4', require: false end diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 8db47000927..18ecc70ac8e 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -136,6 +136,7 @@ GEM io-endpoint (0.14.0) io-event (1.7.3) io-stream (0.6.1) + iodine (0.7.58) irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) @@ -269,6 +270,7 @@ PLATFORMS DEPENDENCIES agoo falcon (~> 0.47) + iodine (~> 0.7) pg (~> 1.5) puma (~> 6.4) rackup diff --git a/frameworks/Ruby/rails/README.md b/frameworks/Ruby/rails/README.md index de1ba2aacf0..674c60b402f 100644 --- a/frameworks/Ruby/rails/README.md +++ b/frameworks/Ruby/rails/README.md @@ -12,9 +12,11 @@ comparing a variety of web platforms. The tests were run with: -- [Ruby 3.3](http://www.ruby-lang.org/) -- [Rails 7.2](http://rubyonrails.org/) +- [Ruby 3.4](http://www.ruby-lang.org/) +- [Rails 8.0](http://rubyonrails.org/) - [Puma 6.4](http://puma.io/) +- [Iodine](https://github.com/boazsegev/iodine) +- [Falcon](https://github.com/socketry/falcon) - [MySQL](https://dev.mysql.com/) - [PostgreSQL](https://www.postgresql.org/) - [Redis 6](https://redis.io) diff --git a/frameworks/Ruby/rails/benchmark_config.json b/frameworks/Ruby/rails/benchmark_config.json index f663c793a3d..3571ea8ca5c 100644 --- a/frameworks/Ruby/rails/benchmark_config.json +++ b/frameworks/Ruby/rails/benchmark_config.json @@ -66,7 +66,30 @@ "database_os": "Linux", "display_name": "rails-falcon", "notes": "", - "versus": "rack-falcon-mri" + "versus": "rack-falcon-mri-sequel-raw" + }, + "iodine": { + "db_url": "/db", + "json_url": "/json", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "cached_query_url": "/cached?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "rails", + "language": "Ruby", + "orm": "Full", + "platform": "Rack", + "webserver": "Iodine", + "os": "Linux", + "database_os": "Linux", + "display_name": "rails-iodine", + "notes": "", + "versus": "rack-iodine-mri-sequel-raw" }, "agoo": { "db_url": "/db", diff --git a/frameworks/Ruby/rails/rails-agoo.dockerfile b/frameworks/Ruby/rails/rails-agoo.dockerfile index 507077565bb..539bac5ac20 100644 --- a/frameworks/Ruby/rails/rails-agoo.dockerfile +++ b/frameworks/Ruby/rails/rails-agoo.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=mysql:falcon:puma +ENV BUNDLE_WITH=postgresql:agoo RUN bundle install --jobs=8 COPY . /rails/ diff --git a/frameworks/Ruby/rails/rails-falcon.dockerfile b/frameworks/Ruby/rails/rails-falcon.dockerfile index 2e0c659e34b..06501a4cff2 100644 --- a/frameworks/Ruby/rails/rails-falcon.dockerfile +++ b/frameworks/Ruby/rails/rails-falcon.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=mysql:agoo:puma +ENV BUNDLE_WITH=postgresql:falcon RUN bundle install --jobs=8 COPY . /rails/ diff --git a/frameworks/Ruby/rails/rails-iodine.dockerfile b/frameworks/Ruby/rails/rails-iodine.dockerfile new file mode 100644 index 00000000000..ffa3b078dd0 --- /dev/null +++ b/frameworks/Ruby/rails/rails-iodine.dockerfile @@ -0,0 +1,27 @@ +FROM ruby:3.4 + +RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server + +EXPOSE 8080 +WORKDIR /rails + +# ENV RUBY_YJIT_ENABLE=1 YJIT is enabled in config/initializers/enable_yjit.rb + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +COPY ./Gemfile* /rails/ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +ENV BUNDLE_WITH=postgresql:iodine +RUN bundle install --jobs=8 + +COPY . /rails/ + +ENV RAILS_ENV=production_postgresql +ENV PORT=8080 +ENV REDIS_URL=redis://localhost:6379/0 +CMD service redis-server start && \ + bundle exec iodine diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index 9e7083a1f4d..3477cc7640f 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=postgresql:agoo:falcon +ENV BUNDLE_WITH=mysql:puma RUN bundle install --jobs=8 COPY . /rails/ diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 451a4e5bfac..64f44ef0ea6 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITHOUT=mysql:agoo:falcon +ENV BUNDLE_WITH=postgresql:puma RUN bundle install --jobs=8 COPY . /rails/ From 1f29a038e35f0b31fcce3e0da3a4c9cd538761ec Mon Sep 17 00:00:00 2001 From: Petrik Date: Fri, 3 Jan 2025 17:43:21 +0100 Subject: [PATCH 1014/1766] [ruby/rack] Add Iodine server +-------------------------------+---------+------+------+-----+-----+-------+--------------+ | name|plaintext|update| json| db|query|fortune|weighted_score| +-------------------------------+---------+------+------+-----+-----+-------+--------------+ | rack| 102678| 16547|149247|48456|28472| 41675| 2170| | rack-iodine| 351213| 38250|295618|87024|71838| 80948| 5011| +-------------------------------+---------+------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/rack/Gemfile | 12 +++++++---- frameworks/Ruby/rack/Gemfile.lock | 2 ++ frameworks/Ruby/rack/README.md | 8 +++---- frameworks/Ruby/rack/benchmark_config.json | 21 +++++++++++++++++++ frameworks/Ruby/rack/hello_world.rb | 2 ++ frameworks/Ruby/rack/rack-falcon.dockerfile | 2 +- frameworks/Ruby/rack/rack-iodine.dockerfile | 22 ++++++++++++++++++++ frameworks/Ruby/rack/rack-jruby.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 2 +- frameworks/Ruby/rack/rack.dockerfile | 2 +- 10 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 frameworks/Ruby/rack/rack-iodine.dockerfile diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index 5b34822d7e0..83ef0486ea3 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -11,19 +11,23 @@ gem 'sequel' gem 'sequel_pg', platforms: %i[ruby mswin] gem 'tzinfo-data', '1.2023.3' -group :falcon do +group :falcon, optional: true do gem 'falcon', '~> 0.47', platforms: %i[ruby mswin] end -group :puma do +group :iodine, optional: true do + gem 'iodine', '~> 0.7', platforms: %i[ruby mswin] +end + +group :puma, optional: true do gem 'puma', '~> 6.4' end -group :unicorn do +group :unicorn, optional: true do gem 'unicorn', '~> 6.1', platforms: %i[ruby mswin] end -group :development do +group :development, optional: true do gem 'rack-test' gem 'rubocop', platforms: %i[ruby mswin] end diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 0c5027553b4..e15a39ea4cf 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -53,6 +53,7 @@ GEM io-endpoint (0.14.0) io-event (1.7.3) io-stream (0.6.1) + iodine (0.7.58) json (2.9.1) kgio (2.11.4) language_server-protocol (3.17.0.3) @@ -127,6 +128,7 @@ PLATFORMS DEPENDENCIES connection_pool (~> 2.4) falcon (~> 0.47) + iodine (~> 0.7) jdbc-postgres (~> 42.2) json (~> 2.8) pg (~> 1.5) diff --git a/frameworks/Ruby/rack/README.md b/frameworks/Ruby/rack/README.md index 1f4c0a3ad45..65783108d2e 100644 --- a/frameworks/Ruby/rack/README.md +++ b/frameworks/Ruby/rack/README.md @@ -11,16 +11,16 @@ comparing a variety of web servers. ## Infrastructure Software Versions The tests were run with: -* [Ruby 3.3](http://www.ruby-lang.org/) +* [Ruby 3.4](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/) -* [Puma 6.2.1](http://puma.io/) -* [Falcon 0.42.3](https://github.com/socketry/falcon) +* [Puma 6.4](http://puma.io/) +* [Iodine](https://github.com/boazsegev/iodine) +* [Falcon](https://github.com/socketry/falcon) * [Sequel 5.68.0](https://sequel.jeremyevans.net/) - ## Paths & Source for Tests * Routing and controller logic is in hello_world.rb diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index 8e2f5884387..97227d81e36 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -23,6 +23,27 @@ "display_name": "rack-puma-mri-sequel-raw", "notes": "" }, + "iodine": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Stripped", + "classification": "Micro", + "orm": "raw", + "database": "Postgres", + "framework": "rack", + "language": "Ruby", + "platform": "Mri", + "webserver": "Iodine", + "os": "Linux", + "database_os": "Linux", + "display_name": "rack-iodine-mri-sequel-raw", + "notes": "" + }, "unicorn": { "json_url": "/json", "plaintext_url": "/plaintext", diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index f2884f3ad1b..ec6655c2f2c 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -29,6 +29,8 @@ class HelloWorld 'Passenger' elsif defined?(Puma) 'Puma' + elsif defined?(Iodine) + 'Iodine' elsif defined?(Unicorn) 'Unicorn' elsif defined?(Falcon) diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index f030cd54177..e1640c67328 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -12,7 +12,7 @@ WORKDIR /rack COPY Gemfile ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set without 'development test puma unicorn' +RUN bundle config set with 'falcon' RUN bundle install --jobs=8 COPY . . diff --git a/frameworks/Ruby/rack/rack-iodine.dockerfile b/frameworks/Ruby/rack/rack-iodine.dockerfile new file mode 100644 index 00000000000..999eb9fc6e7 --- /dev/null +++ b/frameworks/Ruby/rack/rack-iodine.dockerfile @@ -0,0 +1,22 @@ +FROM ruby:3.4 + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +WORKDIR /rack + +COPY Gemfile ./ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'iodine' +RUN bundle install --jobs=8 + +COPY . . + +EXPOSE 8080 + +CMD bundle exec iodine -p 8080 diff --git a/frameworks/Ruby/rack/rack-jruby.dockerfile b/frameworks/Ruby/rack/rack-jruby.dockerfile index c280cca6ac8..f310f8cf62f 100644 --- a/frameworks/Ruby/rack/rack-jruby.dockerfile +++ b/frameworks/Ruby/rack/rack-jruby.dockerfile @@ -6,7 +6,7 @@ WORKDIR /rack COPY Gemfile ./ -RUN bundle config set without 'development test falcon unicorn' +RUN bundle config set with 'puma' RUN bundle install --jobs=8 COPY . . diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index 74b3e82041c..ce64116cd9d 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -12,7 +12,7 @@ WORKDIR /rack COPY Gemfile ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set without 'development test falcon puma' +RUN bundle config set with 'unicorn' RUN bundle install --jobs=8 COPY . . diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 615775cf9ea..72871103b7e 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -13,7 +13,7 @@ WORKDIR /rack COPY Gemfile ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set without 'development test falcon unicorn' +RUN bundle config set with 'puma' RUN bundle install --jobs=8 COPY . . From 6359f3f00a598ed2d7151c8be91639879180a31a Mon Sep 17 00:00:00 2001 From: Petrik Date: Fri, 3 Jan 2025 18:56:26 +0100 Subject: [PATCH 1015/1766] [ruby/roda] Add Iodine server Remove passenger as it is the slowest and it doesn't differtiate that much. +-------------------------------+---------+------+------+-----+-----+-------+--------------+ | name|plaintext|update| json| db|query|fortune|weighted_score| +-------------------------------+---------+------+------+-----+-----+-------+--------------+ | roda-sequel| 119224| 12026|148144|51593|20795| 41334| 1700| |roda-sequel-postgres-iodine-mri| 288192| 41591|264512|85073|68951| 61828| 5053| +-------------------------------+---------+------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/roda-sequel/Gemfile | 15 ++++++++--- frameworks/Ruby/roda-sequel/Gemfile.lock | 10 ------- frameworks/Ruby/roda-sequel/README.md | 6 ++--- .../Ruby/roda-sequel/benchmark_config.json | 10 ++++--- frameworks/Ruby/roda-sequel/boot.rb | 13 ++++----- ...roda-sequel-postgres-iodine-mri.dockerfile | 21 +++++++++++++++ ...a-sequel-postgres-passenger-mri.dockerfile | 27 ------------------- ...oda-sequel-postgres-unicorn-mri.dockerfile | 1 + .../roda-sequel-postgres.dockerfile | 1 + .../Ruby/roda-sequel/roda-sequel.dockerfile | 1 + 10 files changed, 50 insertions(+), 55 deletions(-) create mode 100644 frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile delete mode 100644 frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 73b6ee99edc..5e391a9907a 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -3,12 +3,9 @@ source "https://rubygems.org" gem 'base64' # required by passenger on Ruby 3.4 gem "erubi", "~> 1.12" gem "json", "~> 2.8" -gem "passenger", "~> 6.0", platforms: %i[ruby mswin], require: false -gem "puma", "~> 6.2", require: false gem "sequel", "~> 5.67" gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" -gem "unicorn", "~> 6.1", platforms: %i[ruby mswin], require: false group :mysql do gem "mysql2", "~> 0.5", platforms: %i[ruby mswin] @@ -18,3 +15,15 @@ group :postgresql do gem "pg", "~> 1.4", platforms: %i[ruby mswin] gem "sequel_pg", "~> 1.17", platforms: :ruby, require: false end + +group :iodine, optional: true do + gem "iodine", "~> 0.7", require: false +end + +group :puma, optional: true do + gem "puma", "~> 6.2", require: false +end + +group :unicorn, optional: true do + gem "unicorn", "~> 6.1", platforms: %i[ruby mswin], require: false +end diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 63f88b647fa..4313d0850a9 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -8,19 +8,11 @@ GEM kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.23) - rack (>= 1.6.13) - rackup - rake (>= 12.3.3) pg (1.5.8) puma (6.5.0) nio4r (~> 2.0) rack (3.1.8) - rackup (2.1.0) - rack (>= 3) - webrick (~> 1.8) raindrops (0.20.1) - rake (13.2.1) roda (3.85.0) rack sequel (5.85.0) @@ -32,7 +24,6 @@ GEM unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) - webrick (1.8.2) PLATFORMS ruby @@ -43,7 +34,6 @@ DEPENDENCIES erubi (~> 1.12) json (~> 2.8) mysql2 (~> 0.5) - passenger (~> 6.0) pg (~> 1.4) puma (~> 6.2) roda (~> 3.66) diff --git a/frameworks/Ruby/roda-sequel/README.md b/frameworks/Ruby/roda-sequel/README.md index a409974a10f..19f16452518 100644 --- a/frameworks/Ruby/roda-sequel/README.md +++ b/frameworks/Ruby/roda-sequel/README.md @@ -12,10 +12,10 @@ comparing a variety of web platforms. The tests will be run with: -* [Ruby 3.3](http://www.ruby-lang.org) +* [Ruby 3.4](http://www.ruby-lang.org) * [Puma 6](http://puma.io) -* [Passenger 6](https://www.phusionpassenger.com) -* [Unicorn 5](https://bogomips.org/unicorn/) +* [Unicorn 6](https://bogomips.org/unicorn/) +* [Iodine](https://github.com/boazsegev/iodine) * [Roda 3](http://roda.jeremyevans.net) * [Sequel 5](http://sequel.jeremyevans.net) * [Erubi 1](https://github.com/jeremyevans/erubi) diff --git a/frameworks/Ruby/roda-sequel/benchmark_config.json b/frameworks/Ruby/roda-sequel/benchmark_config.json index 2ca8400a156..3108af70328 100644 --- a/frameworks/Ruby/roda-sequel/benchmark_config.json +++ b/frameworks/Ruby/roda-sequel/benchmark_config.json @@ -44,11 +44,13 @@ "versus": "rack-sequel-postgres-puma-mri", "notes": "" }, - "postgres-passenger-mri": { + "postgres-iodine-mri": { + "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", "classification": "Micro", @@ -57,11 +59,11 @@ "language": "Ruby", "orm": "Full", "platform": "Rack", - "webserver": "Passenger", + "webserver": "Iodine", "os": "Linux", "database_os": "Linux", - "display_name": "roda-sequel-postgres-passenger-mri", - "versus": "rack-sequel-postgres-passenger-mri", + "display_name": "roda-sequel-postgres-iodine-mri", + "versus": "rack-sequel-postgres-iodine-mri", "notes": "" }, "postgres-unicorn-mri": { diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index 5d852e9e80c..bf22232abd7 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -9,15 +9,12 @@ SEQUEL_NO_ASSOCIATIONS = true SERVER_STRING = - if defined?(PhusionPassenger) - [ - PhusionPassenger::SharedConstants::SERVER_TOKEN_NAME, - PhusionPassenger::VERSION_STRING - ].join("/").freeze + if defined?(Iodine) + "Iodine" elsif defined?(Puma) - Puma::Const::PUMA_SERVER_STRING + "Puma" elsif defined?(Unicorn) - Unicorn::HttpParser::DEFAULTS["SERVER_SOFTWARE"] + "Unicorn" end Bundler.require(:default) # Load core modules @@ -48,7 +45,7 @@ def connect(dbtype) (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor opts[:pool_timeout] = 10 - else + elsif defined?(Unicorn) Sequel.single_threaded = true end diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile new file mode 100644 index 00000000000..05851b9f9f1 --- /dev/null +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile @@ -0,0 +1,21 @@ +FROM ruby:3.4 + +ADD ./ /roda-sequel +WORKDIR /roda-sequel + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'iodine' +RUN bundle install --jobs=8 + +ENV DBTYPE=postgresql + +EXPOSE 8080 + +CMD bundle exec iodine -p 8080 diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile deleted file mode 100644 index e060497ea57..00000000000 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM ruby:3.4-rc - -ADD ./ /roda-sequel -WORKDIR /roda-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle install --jobs=8 - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=postgresql - -RUN ruby -r /roda-sequel/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production 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 4865d5feebd..4fab37fd4bd 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'unicorn' RUN bundle install --jobs=8 ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile index d71a4b28a78..45738369e8b 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'puma' RUN bundle install --jobs=8 ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index 382f31291a1..f7f4850c771 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -11,6 +11,7 @@ RUN apt-get update && \ ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'puma' RUN bundle install --jobs=8 ENV DBTYPE=mysql From 80b0a7f2770000cb9babe18138d5a310c8a7d57d Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 5 Jan 2025 14:52:08 +0100 Subject: [PATCH 1016/1766] [ruby/sinatra-sequel] Add Iodine server +---------------------+------+-----+-----+-------+--------------+ | branch_name|update| db|query|fortune|weighted_score| +---------------------+------+-----+-----+-------+--------------+ | master| 10712|42587|18920| 30587| 1342| |sinatra-sequel/iodine| 36294|70876|51271| 9335| 3757| +---------------------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/sinatra-sequel/Gemfile | 15 +++++++++----- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 10 +++++----- .../Ruby/sinatra-sequel/benchmark_config.json | 20 +++++++++++++++++++ frameworks/Ruby/sinatra-sequel/boot.rb | 6 +++--- ...atra-sequel-postgres-iodine-mri.dockerfile | 20 +++++++++++++++++++ ...a-sequel-postgres-passenger-mri.dockerfile | 2 +- ...tra-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../sinatra-sequel-postgres.dockerfile | 2 +- .../sinatra-sequel/sinatra-sequel.dockerfile | 2 +- 9 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 23f21663480..3395ce7f853 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -4,23 +4,28 @@ gem 'json', '~> 2.8' gem 'sequel', '~> 5.0' gem 'sinatra', '~> 4.0', :require=>'sinatra/base' -group :mysql do +group :mysql, optional: true do gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] end -group :postgresql do +group :postgresql, optional: true do gem 'pg', '~> 1.5', :platforms=>[:ruby, :mswin] gem 'sequel_pg', '~> 1.6', :platforms=>:ruby, :require=>false end -group :passenger do + +group :iodine, optional: true do + gem 'iodine', '~> 0.7', platforms: [:ruby, :mswin], require: false +end + +group :passenger, optional: true do gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false end -group :puma do +group :puma, optional: true do gem 'puma', '~> 6.4', require: false end -group :unicorn do +group :unicorn, optional: true do gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false end diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 8f868632e82..27bc79c00d6 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -3,15 +3,16 @@ GEM specs: base64 (0.2.0) bigdecimal (3.1.8) + iodine (0.7.58) json (2.8.2) kgio (2.11.4) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.23) + passenger (6.0.24) rack (>= 1.6.13) - rackup + rackup (>= 2.0.0) rake (>= 12.3.3) pg (1.5.8) puma (6.5.0) @@ -22,9 +23,8 @@ GEM rack (>= 3.0.0, < 4) rack-session (2.0.0) rack (>= 3.0.0) - rackup (2.1.0) + rackup (2.2.1) rack (>= 3) - webrick (~> 1.8) raindrops (0.20.1) rake (13.2.1) ruby2_keywords (0.0.5) @@ -43,13 +43,13 @@ GEM unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) - webrick (1.8.2) PLATFORMS ruby x86_64-darwin-23 DEPENDENCIES + iodine (~> 0.7) json (~> 2.8) mysql2 (~> 0.5) passenger (~> 6.0) diff --git a/frameworks/Ruby/sinatra-sequel/benchmark_config.json b/frameworks/Ruby/sinatra-sequel/benchmark_config.json index 9a267813727..94ffb819bb1 100644 --- a/frameworks/Ruby/sinatra-sequel/benchmark_config.json +++ b/frameworks/Ruby/sinatra-sequel/benchmark_config.json @@ -42,6 +42,26 @@ "versus": "rack-sequel-postgres-puma-mri", "notes": "" }, + "postgres-iodine-mri": { + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "sinatra", + "language": "Ruby", + "orm": "Full", + "platform": "Rack", + "webserver": "Iodine", + "os": "Linux", + "database_os": "Linux", + "display_name": "sinatra-sequel-postgres-iodine-mri", + "versus": "rack-sequel-postgres-iodine-mri", + "notes": "" + }, "postgres-passenger-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index 966bb4ed617..c86f4fb9f34 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -16,8 +16,8 @@ 'puma' elsif defined?(Unicorn) 'unicorn' - elsif defined?(Agoo) - 'agoo' + elsif defined?(Iodine) + 'iodine' end Bundler.require(:default) # Load core modules @@ -39,7 +39,7 @@ def connect(dbtype) elsif defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor opts[:pool_timeout] = 10 - else + elsif defined?(Unicorn) || defined?(Passenger) Sequel.single_threaded = true end diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile new file mode 100644 index 00000000000..3f1bfb24b79 --- /dev/null +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile @@ -0,0 +1,20 @@ +FROM ruby:3.4 + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +ADD ./ /sinatra-sequel +WORKDIR /sinatra-sequel + +ENV BUNDLE_WITH=postgresql:iodine +RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile + +ENV DBTYPE=postgresql + +EXPOSE 8080 + +CMD bundle exec iodine -p 8080 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 88f3d9dbfa3..11345a6eea4 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -ENV BUNDLE_WITHOUT=mysql:puma:unicorn +ENV BUNDLE_WITH=postgresql:passenger RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 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 b23651b44fc..795cc69f67b 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -ENV BUNDLE_WITHOUT=mysql:passenger:puma +ENV BUNDLE_WITH=postgresql:unicorn RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index aff4f5d206a..e406d312486 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -ENV BUNDLE_WITHOUT=mysql:passenger:unicorn +ENV BUNDLE_WITH=postgresql:puma RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index d446161f602..37059f815aa 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 ADD ./ /sinatra-sequel WORKDIR /sinatra-sequel -ENV BUNDLE_WITHOUT=postgresql:passenger:unicorn +ENV BUNDLE_WITH=mysql:puma RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV DBTYPE=mysql From e9d5895d67d4ba1bb839bad0ac38534a49b44363 Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 5 Jan 2025 16:41:12 +0100 Subject: [PATCH 1017/1766] [rails] Update puma to 6.5 and auto config workers +--------------+---------+------+------+-----+-----+-------+------------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|cached-query|weighted_score| +--------------+---------+------+------+-----+-----+-------+------------+--------------+ | master| 24599| 10016| 84462|24975|15127| 15241| 16647| 1207| |rails/puma-6.5| 20084| 10768| 74156|27255|17746| 18156| 17960| 1320| +--------------+---------+------+------+-----+-----+-------+------------+--------------+ --- frameworks/Ruby/rails/config/puma.rb | 3 --- frameworks/Ruby/rails/rails-mysql.dockerfile | 1 + frameworks/Ruby/rails/rails.dockerfile | 1 + 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rails/config/puma.rb b/frameworks/Ruby/rails/config/puma.rb index b513db258e6..7a8e1da62e5 100644 --- a/frameworks/Ruby/rails/config/puma.rb +++ b/frameworks/Ruby/rails/config/puma.rb @@ -30,9 +30,6 @@ # Specifies the `port` that Puma will listen on to receive requests; default is 3000. port ENV.fetch("PORT", 3000) -tuned_num_workers, tuned_num_threads = auto_tune -workers tuned_num_workers - # Allow puma to be restarted by `bin/rails restart` command. plugin :tmp_restart diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index 9e7083a1f4d..8ffbccc1b49 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -20,6 +20,7 @@ RUN bundle install --jobs=8 COPY . /rails/ +ENV WEB_CONCURRENCY=auto ENV RAILS_ENV=production_mysql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 451a4e5bfac..f35d50b8e0e 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -20,6 +20,7 @@ RUN bundle install --jobs=8 COPY . /rails/ +ENV WEB_CONCURRENCY=auto ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 From 0cc5300363fdc18fac60dbc49383e0a5cd48e298 Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 15:21:10 +0800 Subject: [PATCH 1018/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 100 ++++++++++++------------ 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 49094ed13fd..ccfdd71bc75 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -18,13 +18,13 @@ WORKDIR / # RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip -RUN rm -Rf ./paozhu/controller -RUN rm -Rf ./paozhu/libs -RUN rm -Rf ./paozhu/view -RUN rm -Rf ./paozhu/viewsrc -RUN rm -Rf ./paozhu/orm -RUN rm -Rf ./paozhu/models -RUN rm -Rf ./paozhu/common +# RUN rm -Rf ./paozhu/controller +# RUN rm -Rf ./paozhu/libs +# RUN rm -Rf ./paozhu/view +# RUN rm -Rf ./paozhu/viewsrc +# RUN rm -Rf ./paozhu/orm +# RUN rm -Rf ./paozhu/models +# RUN rm -Rf ./paozhu/common @@ -37,67 +37,67 @@ RUN rm -Rf ./paozhu/common # COPY ./paozhu_benchmark/models ./paozhu/ # COPY ./paozhu_benchmark/common ./paozhu/ -RUN ls -l ./paozhu +# RUN ls -l ./paozhu +# RUN pwd +# RUN mkdir ./paozhu/common +# RUN mkdir ./paozhu/libs +# RUN mkdir ./paozhu/libs/types +# COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +# COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -RUN mkdir ./paozhu/common -RUN mkdir ./paozhu/libs -RUN mkdir ./paozhu/libs/types -COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ -COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ +# RUN mkdir ./paozhu/controller +# RUN mkdir ./paozhu/controller/include +# RUN mkdir ./paozhu/controller/src -RUN mkdir ./paozhu/controller -RUN mkdir ./paozhu/controller/include -RUN mkdir ./paozhu/controller/src +# COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +# COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ -COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ -COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ +# COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ -COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ - -COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ -COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ -COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ +# COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ +# COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf -COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt +# COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt -RUN mkdir ./paozhu/view -RUN mkdir ./paozhu/view/techempower +# RUN mkdir ./paozhu/view +# RUN mkdir ./paozhu/view/techempower -COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ +# COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ -RUN mkdir ./paozhu/viewsrc -RUN mkdir ./paozhu/viewsrc/include -RUN mkdir ./paozhu/viewsrc/view -RUN mkdir ./paozhu/viewsrc/view/techempower +# RUN mkdir ./paozhu/viewsrc +# RUN mkdir ./paozhu/viewsrc/include +# RUN mkdir ./paozhu/viewsrc/view +# RUN mkdir ./paozhu/viewsrc/view/techempower -COPY ./paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp ./paozhu/viewsrc/view/techempower/ -COPY ./paozhu_benchmark/viewsrc/include/viewsrc.h ./paozhu/viewsrc/include/ -COPY ./paozhu_benchmark/viewsrc/include/regviewmethod.hpp ./paozhu/viewsrc/include/ +# COPY ./paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp ./paozhu/viewsrc/view/techempower/ +# COPY ./paozhu_benchmark/viewsrc/include/viewsrc.h ./paozhu/viewsrc/include/ +# COPY ./paozhu_benchmark/viewsrc/include/regviewmethod.hpp ./paozhu/viewsrc/include/ -RUN mkdir ./paozhu/orm -RUN mkdir ./paozhu/orm/include +# RUN mkdir ./paozhu/orm +# RUN mkdir ./paozhu/orm/include -COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ -COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ -COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ +# COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ +# COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ +# COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ -RUN mkdir ./paozhu/models -RUN mkdir ./paozhu/models/include +# RUN mkdir ./paozhu/models +# RUN mkdir ./paozhu/models/include -COPY ./paozhu_benchmark/models/include/Fortune.h ./paozhu/models/include/ -COPY ./paozhu_benchmark/models/include/World.h ./paozhu/models/include/ -COPY ./paozhu_benchmark/models/World.cpp ./paozhu/models/ -COPY ./paozhu_benchmark/models/Fortune.cpp ./paozhu/models/ +# COPY ./paozhu_benchmark/models/include/Fortune.h ./paozhu/models/include/ +# COPY ./paozhu_benchmark/models/include/World.h ./paozhu/models/include/ +# COPY ./paozhu_benchmark/models/World.cpp ./paozhu/models/ +# COPY ./paozhu_benchmark/models/Fortune.cpp ./paozhu/models/ WORKDIR /paozhu RUN unzip asio.zip @@ -105,8 +105,6 @@ RUN unzip asio.zip RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build -RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release -RUN cmake --build build EXPOSE 8888 From feed59233b7307d935b68bc42b5e240b55e3447b Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 15:47:19 +0800 Subject: [PATCH 1019/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index ccfdd71bc75..a454457d967 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -105,7 +105,7 @@ RUN unzip asio.zip RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release RUN cmake --build build - EXPOSE 8888 CMD ./bin/paozhu +RUN pstree -aup \ No newline at end of file From 375ce980f1607b080aea50f20c23aa8774109b01 Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 16:02:12 +0800 Subject: [PATCH 1020/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index a454457d967..b0825f148d7 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 RUN apt-get update -yqq && apt-get install -yqq apt-utils software-properties-common wget unzip cmake git RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales @@ -6,6 +6,7 @@ RUN apt-get -y install brotli libbrotli-dev RUN apt-get -y install libreadline-dev RUN apt-get -y install mysql-client RUN apt-get -y install libmysqlclient-dev +RUN apt-get -y install pstree RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From f99723be32306cd86a87850351b3ece78281182d Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 16:09:27 +0800 Subject: [PATCH 1021/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index b0825f148d7..888df1f0cb5 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -6,7 +6,6 @@ RUN apt-get -y install brotli libbrotli-dev RUN apt-get -y install libreadline-dev RUN apt-get -y install mysql-client RUN apt-get -y install libmysqlclient-dev -RUN apt-get -y install pstree RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 @@ -109,4 +108,4 @@ RUN cmake --build build EXPOSE 8888 CMD ./bin/paozhu -RUN pstree -aup \ No newline at end of file +RUN ps aux | less \ No newline at end of file From eab8b13bf136fe5e4a1155af733964838ed23022 Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 16:22:36 +0800 Subject: [PATCH 1022/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 888df1f0cb5..f1f63c31e3c 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -6,6 +6,7 @@ RUN apt-get -y install brotli libbrotli-dev RUN apt-get -y install libreadline-dev RUN apt-get -y install mysql-client RUN apt-get -y install libmysqlclient-dev +RUN apt-get -y install psmisc RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 @@ -107,5 +108,6 @@ RUN cmake --build build EXPOSE 8888 -CMD ./bin/paozhu -RUN ps aux | less \ No newline at end of file +# CMD ./bin/paozhu +CMD /paozhu/bin/paozhu +RUN pstree -aup \ No newline at end of file From eac6f8ca77fc540aeba9b2341fb4737032e130eb Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 16:36:09 +0800 Subject: [PATCH 1023/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index f1f63c31e3c..21ebf144dc1 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -110,4 +110,4 @@ EXPOSE 8888 # CMD ./bin/paozhu CMD /paozhu/bin/paozhu -RUN pstree -aup \ No newline at end of file +RUN ps aux \ No newline at end of file From c39169f00d6bd6521947ee9e8a95d00ed92e042d Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 16:44:26 +0800 Subject: [PATCH 1024/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 4 +--- frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 21ebf144dc1..5d20846a2ae 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -108,6 +108,4 @@ RUN cmake --build build EXPOSE 8888 -# CMD ./bin/paozhu -CMD /paozhu/bin/paozhu -RUN ps aux \ No newline at end of file +CMD ./bin/paozhu \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index 4d2779800a0..f893e890146 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -196,7 +196,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) - add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testdaemon.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testbenchmark.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) else() add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) endif() From 608a5bff151deeca32888f70ce7b3bce9b0778d1 Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 16:44:55 +0800 Subject: [PATCH 1025/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 5d20846a2ae..dc841ec2a24 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -66,7 +66,7 @@ RUN git clone https://github.com/hggq/paozhu COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf -# COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt +COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt # RUN mkdir ./paozhu/view # RUN mkdir ./paozhu/view/techempower From 5238fd7a6196defbd8483be0a23c6a06b743bc37 Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 6 Jan 2025 17:03:40 +0800 Subject: [PATCH 1026/1766] update [Paozhu] --- frameworks/C++/paozhu/paozhu.dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index dc841ec2a24..4419e8e0cb8 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -66,6 +66,8 @@ RUN git clone https://github.com/hggq/paozhu COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf + +# must use testbenchmark.cpp to test benchmark COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt # RUN mkdir ./paozhu/view From 4ccf5c9cd71cfb4dd810b09abbda19268a4c109a Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 5 Jan 2025 14:03:56 +0100 Subject: [PATCH 1027/1766] [ruby] Use Ruby 3.4 As 3.4 has been released, there is no reason to use the release candidate version. --- frameworks/Ruby/agoo/agoo.dockerfile | 2 +- frameworks/Ruby/rack-sequel/README.md | 2 +- .../Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile | 2 +- .../rack-sequel/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 +- frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 2 +- frameworks/Ruby/rack/rack-falcon.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 2 +- frameworks/Ruby/rack/rack.dockerfile | 2 +- frameworks/Ruby/rage/rage.dockerfile | 2 +- frameworks/Ruby/rails/rails-agoo.dockerfile | 2 +- frameworks/Ruby/rails/rails-falcon.dockerfile | 2 +- frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 2 +- .../roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/README.md | 2 +- .../sinatra-sequel-postgres-passenger-mri.dockerfile | 2 +- .../sinatra-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra/README.md | 2 +- frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile | 2 +- .../Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-postgres.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra.dockerfile | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/frameworks/Ruby/agoo/agoo.dockerfile b/frameworks/Ruby/agoo/agoo.dockerfile index c8c08141281..39047b6c150 100644 --- a/frameworks/Ruby/agoo/agoo.dockerfile +++ b/frameworks/Ruby/agoo/agoo.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 RUN apt-get update -q \ && apt-get install --no-install-recommends -q -y \ diff --git a/frameworks/Ruby/rack-sequel/README.md b/frameworks/Ruby/rack-sequel/README.md index b3a02d90b91..7208afbae55 100644 --- a/frameworks/Ruby/rack-sequel/README.md +++ b/frameworks/Ruby/rack-sequel/README.md @@ -12,7 +12,7 @@ a variety of web platforms. The tests will be run with: -* [Ruby 3.3](http://www.ruby-lang.org) +* [Ruby 3.4](http://www.ruby-lang.org) * [Puma 6](http://puma.io) * [Passenger 6](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index d451ea776d6..9b862f3f239 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.4-rc +FROM ruby:3.4 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 c201cad91e1..b8352b5dcdc 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.4-rc +FROM ruby:3.4 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 35cc8145a10..ba8425fd1bc 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.4-rc +FROM ruby:3.4 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index f0ab2e5981b..26018f4bc3a 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.4-rc +FROM ruby:3.4 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 f8385fbb8df..c602df71030 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.4-rc +FROM ruby:3.4 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index b83995deda1..d283076458f 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index e1640c67328..90abab433ad 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index ce64116cd9d..ed1df927dc1 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 72871103b7e..0964890b059 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 ENV RUBY_MN_THREADS=1 diff --git a/frameworks/Ruby/rage/rage.dockerfile b/frameworks/Ruby/rage/rage.dockerfile index 6c65b51fba4..4cc3098ae77 100644 --- a/frameworks/Ruby/rage/rage.dockerfile +++ b/frameworks/Ruby/rage/rage.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 EXPOSE 8080 WORKDIR /rage diff --git a/frameworks/Ruby/rails/rails-agoo.dockerfile b/frameworks/Ruby/rails/rails-agoo.dockerfile index 539bac5ac20..01254ad42b3 100644 --- a/frameworks/Ruby/rails/rails-agoo.dockerfile +++ b/frameworks/Ruby/rails/rails-agoo.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server diff --git a/frameworks/Ruby/rails/rails-falcon.dockerfile b/frameworks/Ruby/rails/rails-falcon.dockerfile index 06501a4cff2..7940230ea33 100644 --- a/frameworks/Ruby/rails/rails-falcon.dockerfile +++ b/frameworks/Ruby/rails/rails-falcon.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index 3477cc7640f..4a356b0427f 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 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 64f44ef0ea6..679e84fec32 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server 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 4fab37fd4bd..9e3156a0594 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.4-rc +FROM ruby:3.4 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 45738369e8b..1aee2de12a7 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.4-rc +FROM ruby:3.4 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 f7f4850c771..eba22e96477 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ADD ./ /roda-sequel WORKDIR /roda-sequel diff --git a/frameworks/Ruby/sinatra-sequel/README.md b/frameworks/Ruby/sinatra-sequel/README.md index 9f382526d82..5c150595ff9 100644 --- a/frameworks/Ruby/sinatra-sequel/README.md +++ b/frameworks/Ruby/sinatra-sequel/README.md @@ -12,7 +12,7 @@ comparing a variety of web platforms. The tests will be run with: -* [Ruby 3.3](http://www.ruby-lang.org) +* [Ruby 3.4](http://www.ruby-lang.org) * [JRuby 9.4](http://jruby.org) * [Puma 6](http://puma.io) * [Passenger 6](https://www.phusionpassenger.com) 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 88f3d9dbfa3..55e8e6c447a 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.4-rc +FROM ruby:3.4 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 b23651b44fc..313beccec74 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.4-rc +FROM ruby:3.4 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 aff4f5d206a..221116dafa2 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.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index d446161f602..78730847f77 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/README.md b/frameworks/Ruby/sinatra/README.md index e0f14b9a171..311b5d21a69 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](http://www.ruby-lang.org) +* [Ruby 3.4](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-postgres-agoo-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile index c6f2f33c4a1..a612c06fc73 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 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 78bbf09f2a6..b7860ac22f5 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.4-rc +FROM ruby:3.4 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 4ca88527522..4cc75bd9383 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.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 2162bc12caa..338fd9d04d4 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 19a64c836a6..db9fccb2d5a 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4-rc +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 From bb36f68ca0f503609d65e58320413ec3201bd8d8 Mon Sep 17 00:00:00 2001 From: Petrik Date: Mon, 25 Nov 2024 21:21:47 +0100 Subject: [PATCH 1028/1766] [rails] Enable config.api_only `config.api_only` disables a lot of middleware like Cookies and Session. These aren't used by any of the tests. --- frameworks/Ruby/rails/config/application.rb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/rails/config/application.rb b/frameworks/Ruby/rails/config/application.rb index 291c4f983ae..d6be2b4b4e4 100644 --- a/frameworks/Ruby/rails/config/application.rb +++ b/frameworks/Ruby/rails/config/application.rb @@ -30,26 +30,19 @@ class Application < Rails::Application config.action_dispatch.default_headers.merge!('Server' => 'WebServer') + config.api_only = true + config.middleware.delete ActionDispatch::Callbacks - config.middleware.delete ActionDispatch::ContentSecurityPolicy::Middleware - config.middleware.delete ActionDispatch::Cookies config.middleware.delete ActionDispatch::DebugExceptions config.middleware.delete ActionDispatch::Executor - config.middleware.delete ActionDispatch::Flash - config.middleware.delete ActionDispatch::PermissionsPolicy::Middleware - config.middleware.delete ActionDispatch::Reloader config.middleware.delete ActionDispatch::RemoteIp config.middleware.delete ActionDispatch::RequestId - config.middleware.delete ActionDispatch::Session::CookieStore config.middleware.delete ActionDispatch::ShowExceptions - config.middleware.delete ActiveRecord::Migration::CheckPending config.middleware.delete Rack::ConditionalGet config.middleware.delete Rack::ETag config.middleware.delete Rack::Head - config.middleware.delete Rack::MethodOverride config.middleware.delete Rack::Runtime config.middleware.delete Rack::Sendfile - config.middleware.delete Rack::TempfileReaper config.middleware.delete Rails::Rack::Logger config.active_support.isolation_level = :fiber if defined?(Falcon) From f5660e3121a4b05113c6cba425de175883283bf0 Mon Sep 17 00:00:00 2001 From: KostyaTretyak Date: Wed, 8 Jan 2025 06:13:10 +0200 Subject: [PATCH 1029/1766] chore(TypeScript/ditsmod): upgrade and fix version of some deps --- frameworks/TypeScript/ditsmod/package.json | 10 +++++----- .../TypeScript/ditsmod/src/app/app.module.ts | 5 ++--- .../ditsmod/src/app/one.controller.ts | 18 ++++++++++-------- .../TypeScript/ditsmod/src/app/tokens.ts | 6 ------ 4 files changed, 17 insertions(+), 22 deletions(-) delete mode 100644 frameworks/TypeScript/ditsmod/src/app/tokens.ts diff --git a/frameworks/TypeScript/ditsmod/package.json b/frameworks/TypeScript/ditsmod/package.json index a0a1298ef86..99f331cf416 100755 --- a/frameworks/TypeScript/ditsmod/package.json +++ b/frameworks/TypeScript/ditsmod/package.json @@ -14,12 +14,12 @@ "author": "Костя Третяк", "license": "MIT", "dependencies": { - "@ditsmod/core": "^3.0.0-alpha.2", - "@ditsmod/routing": "^3.0.0-alpha.2", + "@ditsmod/core": "3.0.0-alpha.3", + "@ditsmod/routing": "3.0.0-alpha.3", "handlebars": "^4.7.8", - "lru-cache": "^11.0.0", - "mariadb": "^3.3.1", - "postgres": "^3.4.4" + "lru-cache": "^11.0.2", + "mariadb": "^3.4.0", + "postgres": "^3.4.5" }, "devDependencies": { "@types/eslint": "^8.44.2", diff --git a/frameworks/TypeScript/ditsmod/src/app/app.module.ts b/frameworks/TypeScript/ditsmod/src/app/app.module.ts index d50e72d1557..36d599d9698 100644 --- a/frameworks/TypeScript/ditsmod/src/app/app.module.ts +++ b/frameworks/TypeScript/ditsmod/src/app/app.module.ts @@ -1,14 +1,13 @@ -import { Providers, rootModule } from '@ditsmod/core'; +import { InjectionToken, Providers, rootModule } from '@ditsmod/core'; import { PRE_ROUTER_EXTENSIONS, RoutingModule } from '@ditsmod/routing'; import { OneController } from './one.controller.js'; import { InitExtension } from './init.extension.js'; -import { DB_INIT_EXTENSIONS } from './tokens.js'; @rootModule({ imports: [RoutingModule], providersPerApp: new Providers().useLogConfig({ level: 'off' }), - extensions: [{ extension: InitExtension, group: DB_INIT_EXTENSIONS, beforeGroup: PRE_ROUTER_EXTENSIONS }], + extensions: [{ extension: InitExtension, group: new InjectionToken('test'), beforeGroups: [PRE_ROUTER_EXTENSIONS] }], controllers: [OneController], }) export class AppModule {} diff --git a/frameworks/TypeScript/ditsmod/src/app/one.controller.ts b/frameworks/TypeScript/ditsmod/src/app/one.controller.ts index d4ba84464b0..72adaa1f616 100644 --- a/frameworks/TypeScript/ditsmod/src/app/one.controller.ts +++ b/frameworks/TypeScript/ditsmod/src/app/one.controller.ts @@ -1,4 +1,4 @@ -import { AnyObj, controller, RequestContext, SingletonRequestContext, optional } from '@ditsmod/core'; +import { AnyObj, controller, RequestContext, optional } from '@ditsmod/core'; import { route } from '@ditsmod/routing'; import Handlebars from 'handlebars'; @@ -28,7 +28,7 @@ const tmpl = Handlebars.compile( ].join(''), ); -@controller({ scope: 'module' }) +@controller({ scope: 'ctx' }) export class OneController { constructor(@optional() private dbService: DbService) {} @@ -40,19 +40,19 @@ export class OneController { } @route('GET', 'queries') - async getMultiQueries(ctx: SingletonRequestContext) { + async getMultiQueries(ctx: RequestContext) { const result = await this.dbService.getMultiQueries(ctx.queryParams!.queries); this.sendJson(ctx, result); } @route('GET', 'cached-queries') - async getCachedWorlds(ctx: SingletonRequestContext) { + async getCachedWorlds(ctx: RequestContext) { const result = await this.dbService.getMultiQueries(ctx.queryParams!.count, false); this.sendJson(ctx, result); } @route('GET', 'updates') - async getUpdates(ctx: SingletonRequestContext) { + async getUpdates(ctx: RequestContext) { const worlds = await this.dbService.saveWorlds(ctx.queryParams!.queries); this.sendJson(ctx, worlds); } @@ -68,18 +68,20 @@ export class OneController { } @route('GET', 'plaintext') - getHello(ctx: SingletonRequestContext) { + getHello(ctx: RequestContext) { ctx.rawRes.setHeader('Server', 'Ditsmod'); ctx.rawRes.setHeader('Content-Type', 'text/plain; charset=utf-8'); ctx.rawRes.end('Hello, World!'); } @route('GET', 'json') - getJson(ctx: SingletonRequestContext) { + getJson(ctx: RequestContext) { this.sendJson(ctx, { message: 'Hello, World!' }); } protected sendJson(ctx: RequestContext, value: AnyObj) { - ctx.setHeader('Server', 'Ditsmod').sendJson(value); + ctx.rawRes.setHeader('Server', 'Ditsmod'); + ctx.rawRes.setHeader('Content-Type', 'application/json; charset=utf-8'); + ctx.rawRes.end(JSON.stringify(value)); } } diff --git a/frameworks/TypeScript/ditsmod/src/app/tokens.ts b/frameworks/TypeScript/ditsmod/src/app/tokens.ts deleted file mode 100644 index 2eac6cb9303..00000000000 --- a/frameworks/TypeScript/ditsmod/src/app/tokens.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Extension, InjectionToken } from '@ditsmod/core'; - -/** - * A group of extensions intended for preparatory work for the database module. - */ -export const DB_INIT_EXTENSIONS = new InjectionToken[]>('DB_INIT_EXTENSIONS'); From 8b7e55641ef4aebf4660735916adb0a7b6ee917c Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 26 May 2024 22:00:31 +0200 Subject: [PATCH 1030/1766] [crystal/spider-gazelle] Fix tests and update dependencies Reduce connection pool size to avoid connection errors like: psycopg2.OperationalError: connection to server at "10.0.0.2", port 5432 failed: FATAL: sorry, too many clients already --- frameworks/Crystal/spider-gazelle/shard.lock | 30 ++++++++----------- .../spider-gazelle/spider-gazelle.dockerfile | 5 ++-- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/frameworks/Crystal/spider-gazelle/shard.lock b/frameworks/Crystal/spider-gazelle/shard.lock index 5069278751c..a73d29d085c 100644 --- a/frameworks/Crystal/spider-gazelle/shard.lock +++ b/frameworks/Crystal/spider-gazelle/shard.lock @@ -2,11 +2,11 @@ version: 2.0 shards: action-controller: git: https://github.com/spider-gazelle/action-controller.git - version: 5.6.2 + version: 7.4.3 active-model: git: https://github.com/spider-gazelle/active-model.git - version: 4.2.3 + version: 4.3.2 backtracer: git: https://github.com/sija/backtracer.cr.git @@ -14,27 +14,23 @@ shards: db: git: https://github.com/crystal-lang/crystal-db.git - version: 0.11.0 + version: 0.13.1 eventbus: git: https://github.com/spider-gazelle/eventbus.git - version: 0.9.9+git.commit.086b2ba92475b88e8481b0387eb56c735cbfd7bd + version: 1.0.0+git.commit.af63536d718348885a553dc4aa6debccc2946289 exception_page: git: https://github.com/crystal-loot/exception_page.git - version: 0.3.0 - - future: - git: https://github.com/crystal-community/future.cr.git - version: 1.0.0 + version: 0.5.0 habitat: git: https://github.com/luckyframework/habitat.git - version: 0.4.7 + version: 0.4.9 hot_topic: git: https://github.com/jgaskins/hot_topic.git - version: 0.1.0+git.commit.c4577d949221d535f29162343bf503b578308954 + version: 0.1.0+git.commit.3c901e77b6e000930398738260a2944b6f5785dc http-params-serializable: git: https://github.com/place-labs/http-params-serializable.git @@ -42,7 +38,7 @@ shards: json-schema: git: https://github.com/spider-gazelle/json-schema.git - version: 1.3.0 + version: 1.3.1 kilt: git: https://github.com/jeromegn/kilt.git @@ -50,21 +46,21 @@ shards: lucky_router: git: https://github.com/luckyframework/lucky_router.git - version: 0.5.2 + version: 0.6.0 pg: git: https://github.com/will/crystal-pg.git - version: 0.26.0 + version: 0.28.0 pg-orm: git: https://github.com/spider-gazelle/pg-orm.git - version: 1.0.0+git.commit.2bbafec9579f175880281279d33168360176540c + version: 1.1.2+git.commit.9b340ee269cd4a10ed6c5b51235cbaf45fc380e1 pool: git: https://github.com/ysbaddaden/pool.git - version: 0.3.0 + version: 0.2.4 redis: git: https://github.com/stefanwille/crystal-redis.git - version: 2.8.3 + version: 2.9.1 diff --git a/frameworks/Crystal/spider-gazelle/spider-gazelle.dockerfile b/frameworks/Crystal/spider-gazelle/spider-gazelle.dockerfile index 5962a201dc1..c836b434c44 100644 --- a/frameworks/Crystal/spider-gazelle/spider-gazelle.dockerfile +++ b/frameworks/Crystal/spider-gazelle/spider-gazelle.dockerfile @@ -1,5 +1,4 @@ -FROM 84codes/crystal:1.7.2-alpine -RUN apk add --update --no-cache bash gmp-dev +FROM crystallang/crystal:1.14.0 WORKDIR /usr/src/app @@ -10,7 +9,7 @@ COPY run.sh run.sh # Build App RUN shards build --release --no-debug -ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=56&max_idle_pool_size=56 +ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=5&max_idle_pool_size=5 ENV SG_ENV production From 2e5370153059eb8ad2828d3669977af3815d6924 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 17:35:36 +0100 Subject: [PATCH 1031/1766] [php] Yii2 update to PHP8.4 --- frameworks/PHP/yii2/composer.json | 2 +- frameworks/PHP/yii2/deploy/conf/cli-php.ini | 2 +- frameworks/PHP/yii2/yii2-workerman.dockerfile | 12 ++++++------ frameworks/PHP/yii2/yii2.dockerfile | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/frameworks/PHP/yii2/composer.json b/frameworks/PHP/yii2/composer.json index 695b189d305..03260f5041e 100755 --- a/frameworks/PHP/yii2/composer.json +++ b/frameworks/PHP/yii2/composer.json @@ -2,7 +2,7 @@ "require": { "yidas/yii2-composer-bower-skip": "~2.0.13", "yiisoft/yii2": "~2.0.49", - "joanhey/adapterman": "^0.6" + "joanhey/adapterman": "^0.7" }, "config": { "allow-plugins": { diff --git a/frameworks/PHP/yii2/deploy/conf/cli-php.ini b/frameworks/PHP/yii2/deploy/conf/cli-php.ini index ea3b9e510ae..82a3aec2efa 100644 --- a/frameworks/PHP/yii2/deploy/conf/cli-php.ini +++ b/frameworks/PHP/yii2/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,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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/yii2/yii2-workerman.dockerfile b/frameworks/PHP/yii2/yii2-workerman.dockerfile index 48c840c6f69..481276b13ca 100644 --- a/frameworks/PHP/yii2/yii2-workerman.dockerfile +++ b/frameworks/PHP/yii2/yii2-workerman.dockerfile @@ -1,21 +1,21 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3-cli php8.3-mysql php8.3-mbstring php8.3-xml > /dev/null + apt-get install -yqq git php8.4-cli php8.4-mysql php8.4-mbstring php8.4-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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini -ADD ./ /yii2 WORKDIR /yii2 +COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet diff --git a/frameworks/PHP/yii2/yii2.dockerfile b/frameworks/PHP/yii2/yii2.dockerfile index b7af0a36511..cfb0bf78a38 100644 --- a/frameworks/PHP/yii2/yii2.dockerfile +++ b/frameworks/PHP/yii2/yii2.dockerfile @@ -1,24 +1,24 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /yii2 WORKDIR /yii2 +COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /yii2/deploy/nginx.conf From 062171c7eb1834dce760032f177d1d8d4b81c9b3 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 17:41:03 +0100 Subject: [PATCH 1032/1766] [php] Update plain PHP-Workerman to PHP8.4 --- frameworks/PHP/php/deploy/workerman/cli-php.ini | 2 +- .../PHP/php/deploy/workerman/composer.json | 4 ++-- frameworks/PHP/php/php-workerman.dockerfile | 16 ++++++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/frameworks/PHP/php/deploy/workerman/cli-php.ini b/frameworks/PHP/php/deploy/workerman/cli-php.ini index a6c32d06f07..9f0f3171834 100644 --- a/frameworks/PHP/php/deploy/workerman/cli-php.ini +++ b/frameworks/PHP/php/deploy/workerman/cli-php.ini @@ -13,4 +13,4 @@ memory_limit = 512M opcache.jit_buffer_size=128M opcache.jit=tracing -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 \ No newline at end of file +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/php/deploy/workerman/composer.json b/frameworks/PHP/php/deploy/workerman/composer.json index 75b75e2d5ec..0cf52f71ab3 100644 --- a/frameworks/PHP/php/deploy/workerman/composer.json +++ b/frameworks/PHP/php/deploy/workerman/composer.json @@ -1,5 +1,5 @@ { "require": { - "joanhey/adapterman": "^0.6" + "joanhey/adapterman": "^0.7" } -} \ No newline at end of file +} diff --git a/frameworks/PHP/php/php-workerman.dockerfile b/frameworks/PHP/php/php-workerman.dockerfile index bd257c3883c..b23e8c3249b 100644 --- a/frameworks/PHP/php/php-workerman.dockerfile +++ b/frameworks/PHP/php/php-workerman.dockerfile @@ -1,26 +1,26 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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 > /dev/null && \ - apt-get update -yqq > /dev/null && apt-get upgrade -yqq + apt-get update -yqq > /dev/null && apt-get upgrade -yqq RUN apt-get install -yqq git unzip \ - php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -RUN apt-get install -y php-pear php8.3-dev php8.3-xml libevent-dev > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev php8.4-xml libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/workerman/cli-php.ini /etc/php/8.3/cli/php.ini +COPY deploy/workerman/cli-php.ini /etc/php/8.4/cli/php.ini COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -ADD ./ /php WORKDIR /php +COPY --link . . COPY deploy/workerman/composer.json ./ -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev COPY deploy/workerman/start.php ./ From 710731695c7304403c859259ecca1a0dcac0d222 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 17:49:22 +0100 Subject: [PATCH 1033/1766] [php] Kumbia update to PHP8.4 --- frameworks/PHP/kumbiaphp/composer.json | 2 +- frameworks/PHP/kumbiaphp/deploy/conf/cliphp.ini | 2 +- frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile | 10 +++++----- .../kumbiaphp/kumbiaphp-workerman-mysql.dockerfile | 10 +++++----- .../PHP/kumbiaphp/kumbiaphp-workerman.dockerfile | 10 +++++----- frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile | 12 ++++++------ 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/frameworks/PHP/kumbiaphp/composer.json b/frameworks/PHP/kumbiaphp/composer.json index 0f573ad0f3d..aae7511e9ab 100644 --- a/frameworks/PHP/kumbiaphp/composer.json +++ b/frameworks/PHP/kumbiaphp/composer.json @@ -1,5 +1,5 @@ { "require": { - "joanhey/adapterman": "^0.6" + "joanhey/adapterman": "^0.7" } } diff --git a/frameworks/PHP/kumbiaphp/deploy/conf/cliphp.ini b/frameworks/PHP/kumbiaphp/deploy/conf/cliphp.ini index 26dcfc4f8f3..9f0f3171834 100644 --- a/frameworks/PHP/kumbiaphp/deploy/conf/cliphp.ini +++ b/frameworks/PHP/kumbiaphp/deploy/conf/cliphp.ini @@ -13,4 +13,4 @@ memory_limit = 512M opcache.jit_buffer_size=128M opcache.jit=tracing -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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile index b30a5ad25fe..f97c728e4c9 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-raw.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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 \ - php8.3-fpm php8.3-mysql > /dev/null + php8.4-fpm php8.4-mysql > /dev/null -COPY --link deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /kumbiaphp COPY --link . . RUN git clone -b v1.2.1 --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.3/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.4/fpm/php-fpm.conf ; fi; EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-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 6c17e29857b..fa4069b3455 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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 git php8.3-cli php8.3-mysql php8.3-xml > /dev/null +RUN apt-get install -yqq git php8.4-cli php8.4-mysql php8.4-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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/cliphp.ini /etc/php/8.4/cli/php.ini ADD ./ /kumbiaphp WORKDIR /kumbiaphp diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile index 541ff1fb00d..fe1c8ced5ea 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile @@ -1,18 +1,18 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3-cli php8.3-pgsql php8.3-xml > /dev/null + apt-get install -yqq git php8.4-cli php8.4-pgsql php8.4-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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/cliphp.ini /etc/php/8.4/cli/php.ini ADD ./ /kumbiaphp WORKDIR /kumbiaphp diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile index 3f8edde3e2f..960100a6347 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,18 +7,18 @@ 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.3-fpm php8.3-mysql > /dev/null + php8.4-fpm php8.4-mysql > /dev/null -COPY --link deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /kumbiaphp COPY --link . . RUN git clone -b v1.2.1 --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 git clone -b master --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.3/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.4/fpm/php-fpm.conf ; fi; EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /kumbiaphp/deploy/nginx.conf From 7f84497e6d12a3ff0b8196b89a12e278942e8ed9 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Wed, 8 Jan 2025 10:28:04 -0600 Subject: [PATCH 1034/1766] Relax HTML validation for Fortunes test Some frameworks, such as Next.js, automatically inject ``, ``, and `", + "", "", + "", "", + ) + def __init__(self): HTMLParser.__init__(self, convert_charrefs=False) + self.ignore_content = False self.body = [] valid_fortune = ''' @@ -41,7 +50,7 @@ def handle_decl(self, decl): # and since we did not specify xml compliance (where # incorrect casing would throw a syntax error), we must # allow all casings. We will lower for our normalization. - self.body.append("".format(d=decl.lower())) + self.append("".format(d=decl.lower())) def handle_charref(self, name): ''' @@ -63,37 +72,37 @@ def handle_charref(self, name): # equality. if val == "34" or val == "034" or val == "x22": # Append our normalized entity reference to our body. - self.body.append(""") + self.append(""") # "'" is a valid escaping of "-", but it is not # required, so we normalize for equality checking. if val == "39" or val == "039" or val == "x27": - self.body.append("'") + self.append("'") # Again, "+" is a valid escaping of the "+", but # it is not required, so we need to normalize for out # final parse and equality check. if val == "43" or val == "043" or val == "x2b": - self.body.append("+") + self.append("+") # Again, ">" is a valid escaping of ">", but we # need to normalize to ">" for equality checking. if val == "62" or val == "062" or val == "x3e": - self.body.append(">") + self.append(">") # Again, "<" is a valid escaping of "<", but we # need to normalize to "<" for equality checking. if val == "60" or val == "060" or val == "x3c": - self.body.append("<") + self.append("<") # Not sure why some are escaping '/' if val == "47" or val == "047" or val == "x2f": - self.body.append("/") + self.append("/") # "(" is a valid escaping of "(", but # it is not required, so we need to normalize for out # final parse and equality check. if val == "40" or val == "040" or val == "x28": - self.body.append("(") + self.append("(") # ")" is a valid escaping of ")", but # it is not required, so we need to normalize for out # final parse and equality check. if val == "41" or val == "041" or val == "x29": - self.body.append(")") + self.append(")") def handle_entityref(self, name): ''' @@ -101,20 +110,20 @@ def handle_entityref(self, name): need to normalize to "—" for equality checking. ''' if name == "mdash": - self.body.append("—") + self.append("—") else: - self.body.append("&{n};".format(n=name)) + self.append("&{n};".format(n=name)) def handle_starttag(self, tag, attrs): ''' This is called every time a tag is opened. We append each one wrapped in "<" and ">". ''' - self.body.append("<{t}>".format(t=tag)) + self.append("<{t}>".format(t=tag)) # Append a newline after the and if tag.lower() == 'table' or tag.lower() == 'html': - self.body.append(os.linesep) + self.append(os.linesep) def handle_data(self, data): ''' @@ -146,18 +155,24 @@ def handle_data(self, data): data = data.replace('"', '"') data = data.replace('>', '>') - self.body.append("{d}".format(d=data)) + self.append("{d}".format(d=data)) def handle_endtag(self, tag): ''' This is called every time a tag is closed. We append each one wrapped in "". ''' - self.body.append("".format(t=tag)) + self.append("".format(t=tag)) # Append a newline after each and if tag.lower() == 'tr' or tag.lower() == 'head': - self.body.append(os.linesep) + self.append(os.linesep) + + def append(self, item): + self.ignore_content = item == "") + + if not (self.ignore_content or item in self.IGNORED_TAGS): + self.body.append(item) def isValidFortune(self, name, out): ''' From d2efb7c55642ec942ebe89f0e0316f721acd459d Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 19:30:40 +0100 Subject: [PATCH 1035/1766] [php] Symfony update to PHP8.4 --- frameworks/PHP/symfony/composer.json | 5 +++-- frameworks/PHP/symfony/deploy/conf/cli-php.ini | 2 +- frameworks/PHP/symfony/symfony-mysql.dockerfile | 16 ++++++++-------- frameworks/PHP/symfony/symfony-raw.dockerfile | 16 ++++++++-------- frameworks/PHP/symfony/symfony-swoole.dockerfile | 2 +- .../PHP/symfony/symfony-workerman.dockerfile | 10 +++++----- frameworks/PHP/symfony/symfony.dockerfile | 16 ++++++++-------- 7 files changed, 34 insertions(+), 33 deletions(-) diff --git a/frameworks/PHP/symfony/composer.json b/frameworks/PHP/symfony/composer.json index bfee2e6ed58..fbdcf32cb1c 100644 --- a/frameworks/PHP/symfony/composer.json +++ b/frameworks/PHP/symfony/composer.json @@ -13,7 +13,7 @@ "symfony/orm-pack": "^2", "symfony/twig-bundle": "^7", "symfony/yaml": "^7", - "joanhey/adapterman": "^0.6" + "joanhey/adapterman": "^0.7" }, "minimum-stability": "dev", "prefer-stable": true, @@ -45,7 +45,8 @@ "symfony/polyfill-php73": "*", "symfony/polyfill-php74": "*", "symfony/polyfill-php80": "*", - "symfony/polyfill-php81": "*" + "symfony/polyfill-php81": "*", + "symfony/polyfill-php82": "*" }, "scripts": { "auto-scripts": { diff --git a/frameworks/PHP/symfony/deploy/conf/cli-php.ini b/frameworks/PHP/symfony/deploy/conf/cli-php.ini index bcccffbc63b..e03b6e352a9 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,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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/symfony/symfony-mysql.dockerfile b/frameworks/PHP/symfony/symfony-mysql.dockerfile index a394aea7152..157a9179660 100644 --- a/frameworks/PHP/symfony/symfony-mysql.dockerfile +++ b/frameworks/PHP/symfony/symfony-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,27 +7,27 @@ 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.3-cli php8.3-fpm php8.3-mysql \ - php8.3-mbstring php8.3-xml php8.3-curl php8.3-dev > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql \ + php8.4-mbstring php8.4-xml php8.4-curl php8.4-dev > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY --link deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /symfony COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet 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.3/fpm/php.ini +RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.4/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.3/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.4/fpm/php-fpm.conf RUN mkdir -p /run/php -CMD service php8.3-fpm start && \ +CMD service php8.4-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 7af272bbef1..a2622d5a397 100644 --- a/frameworks/PHP/symfony/symfony-raw.dockerfile +++ b/frameworks/PHP/symfony/symfony-raw.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,27 +7,27 @@ 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.3-cli php8.3-fpm php8.3-pgsql \ - php8.3-mbstring php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-fpm php8.4-pgsql \ + php8.4-mbstring php8.4-xml php8.4-curl > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY --link deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /symfony COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet 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.3/fpm/php.ini +RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.4/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.3/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.4/fpm/php-fpm.conf RUN mkdir -p /run/php -CMD service php8.3-fpm start && \ +CMD service php8.4-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 e8fda091bb3..c9d32159b13 100644 --- a/frameworks/PHP/symfony/symfony-swoole.dockerfile +++ b/frameworks/PHP/symfony/symfony-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:php8.4 RUN apt-get update -yqq && \ apt-get install -yqq libpq-dev libicu-dev > /dev/null && \ diff --git a/frameworks/PHP/symfony/symfony-workerman.dockerfile b/frameworks/PHP/symfony/symfony-workerman.dockerfile index fec8e3bdd5e..ecf697d198f 100644 --- a/frameworks/PHP/symfony/symfony-workerman.dockerfile +++ b/frameworks/PHP/symfony/symfony-workerman.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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 unzip \ - php8.3-cli php8.3-pgsql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-pgsql php8.4-mbstring php8.4-xml php8.4-curl > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null && \ - pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null && \ + pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini WORKDIR /symfony COPY --link . . @@ -20,7 +20,7 @@ COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear -COPY --link deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/symfony/symfony.dockerfile b/frameworks/PHP/symfony/symfony.dockerfile index 8c3606087e6..b9abd5c8361 100644 --- a/frameworks/PHP/symfony/symfony.dockerfile +++ b/frameworks/PHP/symfony/symfony.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,28 +7,28 @@ 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.3-cli php8.3-fpm php8.3-pgsql \ - php8.3-mbstring php8.3-xml php8.3-curl php8.3-dev > /dev/null + php8.4-cli php8.4-fpm php8.4-pgsql \ + php8.4-mbstring php8.4-xml php8.4-curl php8.4-dev > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY --link deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /symfony COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet 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.3/fpm/php.ini +RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.4/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.3/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.4/fpm/php-fpm.conf RUN mkdir -p /run/php -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /symfony/deploy/nginx.conf \ No newline at end of file From cbb69522b6b9c51d3be3d2a220e54374f89fda1e Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 19:34:38 +0100 Subject: [PATCH 1036/1766] Remove polyfills --- frameworks/PHP/symfony/composer.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frameworks/PHP/symfony/composer.json b/frameworks/PHP/symfony/composer.json index fbdcf32cb1c..f6bfbca31d6 100644 --- a/frameworks/PHP/symfony/composer.json +++ b/frameworks/PHP/symfony/composer.json @@ -46,7 +46,9 @@ "symfony/polyfill-php74": "*", "symfony/polyfill-php80": "*", "symfony/polyfill-php81": "*", - "symfony/polyfill-php82": "*" + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php84": "*" }, "scripts": { "auto-scripts": { From ccd87b851fde69794c7179712eb72a0a3202f233 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 20:43:30 +0100 Subject: [PATCH 1037/1766] [php] Laravel update to PHP8.4 --- frameworks/PHP/laravel/benchmark_config.json | 3 ++- frameworks/PHP/laravel/deploy/conf/cli-php.ini | 2 +- frameworks/PHP/laravel/laravel-laravel-s.dockerfile | 2 +- frameworks/PHP/laravel/laravel-swoole.dockerfile | 2 +- frameworks/PHP/laravel/laravel-workerman.dockerfile | 8 ++++---- frameworks/PHP/laravel/laravel.dockerfile | 10 +++++----- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/frameworks/PHP/laravel/benchmark_config.json b/frameworks/PHP/laravel/benchmark_config.json index 053534b12fa..716cbea52a7 100644 --- a/frameworks/PHP/laravel/benchmark_config.json +++ b/frameworks/PHP/laravel/benchmark_config.json @@ -160,7 +160,8 @@ "database_os": "Linux", "display_name": "laravel-ripple", "notes": "", - "versus": "php" + "versus": "php", + "tags": ["broken"] } }] } diff --git a/frameworks/PHP/laravel/deploy/conf/cli-php.ini b/frameworks/PHP/laravel/deploy/conf/cli-php.ini index bcccffbc63b..e03b6e352a9 100644 --- a/frameworks/PHP/laravel/deploy/conf/cli-php.ini +++ b/frameworks/PHP/laravel/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,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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile index c353ef28b4f..e6804935087 100644 --- a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile +++ b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile @@ -1,4 +1,4 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:php8.4 RUN docker-php-ext-install pcntl opcache curl > /dev/null diff --git a/frameworks/PHP/laravel/laravel-swoole.dockerfile b/frameworks/PHP/laravel/laravel-swoole.dockerfile index 52308a4dd5e..d8d9881c82f 100644 --- a/frameworks/PHP/laravel/laravel-swoole.dockerfile +++ b/frameworks/PHP/laravel/laravel-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:php8.4 RUN docker-php-ext-install pcntl opcache curl > /dev/null diff --git a/frameworks/PHP/laravel/laravel-workerman.dockerfile b/frameworks/PHP/laravel/laravel-workerman.dockerfile index 34ee2de30a5..eda02b9b70d 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.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl > /dev/null COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini WORKDIR /laravel COPY --link . . @@ -26,7 +26,7 @@ RUN mkdir -p bootstrap/cache \ RUN composer require joanhey/adapterman --update-no-dev --no-scripts --quiet RUN php artisan optimize -COPY --link deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/laravel/laravel.dockerfile b/frameworks/PHP/laravel/laravel.dockerfile index 455d2e6d60f..9b79ea86854 100644 --- a/frameworks/PHP/laravel/laravel.dockerfile +++ b/frameworks/PHP/laravel/laravel.dockerfile @@ -7,15 +7,15 @@ 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.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl > /dev/null COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer -COPY --link deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /laravel COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN mkdir -p bootstrap/cache \ storage/logs \ @@ -29,7 +29,7 @@ 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.3/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.4/fpm/php-fpm.conf -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /laravel/deploy/nginx.conf From bd6d98b6a56c5af41bc94e00661eab3fb555cb38 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 23:40:54 +0100 Subject: [PATCH 1038/1766] [php] Lumen update to PHP/8.4 --- frameworks/PHP/lumen/deploy/conf/cli-php.ini | 2 +- frameworks/PHP/lumen/lumen-laravel-s.dockerfile | 2 +- frameworks/PHP/lumen/lumen-swoole.dockerfile | 2 +- frameworks/PHP/lumen/lumen-workerman.dockerfile | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/PHP/lumen/deploy/conf/cli-php.ini b/frameworks/PHP/lumen/deploy/conf/cli-php.ini index bcccffbc63b..e03b6e352a9 100644 --- a/frameworks/PHP/lumen/deploy/conf/cli-php.ini +++ b/frameworks/PHP/lumen/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,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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile index 9c2df7afaef..15b5544d1d2 100644 --- a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile +++ b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile @@ -1,4 +1,4 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:php8.4 RUN docker-php-ext-install pcntl opcache curl > /dev/null diff --git a/frameworks/PHP/lumen/lumen-swoole.dockerfile b/frameworks/PHP/lumen/lumen-swoole.dockerfile index 0f4f3434e37..b146bb5c926 100644 --- a/frameworks/PHP/lumen/lumen-swoole.dockerfile +++ b/frameworks/PHP/lumen/lumen-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:php8.4 RUN docker-php-ext-install pcntl opcache curl > /dev/null diff --git a/frameworks/PHP/lumen/lumen-workerman.dockerfile b/frameworks/PHP/lumen/lumen-workerman.dockerfile index decfe424411..6d837ace26f 100644 --- a/frameworks/PHP/lumen/lumen-workerman.dockerfile +++ b/frameworks/PHP/lumen/lumen-workerman.dockerfile @@ -7,19 +7,19 @@ 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.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-dev > /dev/null + php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-dev > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini WORKDIR /lumen COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN composer require joanhey/adapterman:^0.6 --quiet +RUN composer require joanhey/adapterman:^0.7 --quiet RUN mkdir -p storage \ storage/framework/sessions \ From a42b0a160cde02fc58ff566fa5d3206b49e094e2 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Wed, 8 Jan 2025 23:46:13 +0100 Subject: [PATCH 1039/1766] Update also Lumen --- frameworks/PHP/lumen/lumen.dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/PHP/lumen/lumen.dockerfile b/frameworks/PHP/lumen/lumen.dockerfile index 9d11da427af..57b45fe86a9 100644 --- a/frameworks/PHP/lumen/lumen.dockerfile +++ b/frameworks/PHP/lumen/lumen.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 \ - php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-dev > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml php8.4-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /lumen COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -30,5 +30,5 @@ RUN chmod -R 777 /lumen EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /lumen/deploy/nginx.conf From 2f74dafb4c89fba9104fd85386d8310e8b2ff316 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Thu, 9 Jan 2025 00:32:36 +0100 Subject: [PATCH 1040/1766] [php] Ubiquity update to PHP/8.4 --- .../PHP/ubiquity/ubiquity-ngx-micro.dockerfile | 8 ++++---- .../PHP/ubiquity/ubiquity-ngx-raw.dockerfile | 8 ++++---- frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile | 8 ++++---- .../PHP/ubiquity/ubiquity-swoole-mysql.dockerfile | 4 ++-- frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile | 4 ++-- .../ubiquity/ubiquity-workerman-mysql.dockerfile | 14 +++++++------- .../PHP/ubiquity/ubiquity-workerman-raw.dockerfile | 14 +++++++------- .../PHP/ubiquity/ubiquity-workerman.dockerfile | 14 +++++++------- frameworks/PHP/ubiquity/ubiquity.dockerfile | 12 ++++++------ 9 files changed, 43 insertions(+), 43 deletions(-) diff --git a/frameworks/PHP/ubiquity/ubiquity-ngx-micro.dockerfile b/frameworks/PHP/ubiquity/ubiquity-ngx-micro.dockerfile index 47da95aeff8..ee3a1c88326 100644 --- a/frameworks/PHP/ubiquity/ubiquity-ngx-micro.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-ngx-micro.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -8,14 +8,14 @@ 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 \ + zlib1g-dev libpcre3-dev libargon2-dev libsodium-dev \ 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 ./ ./ +COPY ./ ./ -ENV NGINX_VERSION=1.25.3 +ENV NGINX_VERSION=1.27.3 RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null diff --git a/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile b/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile index 81109dc94fb..582c7f402fd 100644 --- a/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -8,14 +8,14 @@ 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 \ + zlib1g-dev libpcre3-dev libargon2-dev libsodium-dev \ 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 ./ ./ +COPY ./ ./ -ENV NGINX_VERSION=1.25.3 +ENV NGINX_VERSION=1.27.3 RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null diff --git a/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile b/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile index 014e12b9415..58cf9c98fe9 100644 --- a/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -8,14 +8,14 @@ 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 \ + zlib1g-dev libpcre3-dev libargon2-dev libsodium-dev \ 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 ./ ./ +COPY ./ ./ -ENV NGINX_VERSION=1.25.3 +ENV NGINX_VERSION=1.27.3 RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null diff --git a/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile b/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile index 7a99706faaf..94bb6c98809 100644 --- a/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile @@ -1,11 +1,11 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:php8.4 RUN docker-php-ext-install pcntl opcache > /dev/null COPY deploy/conf/php-async.ini /usr/local/etc/php/php.ini WORKDIR /ubiquity -ADD --link . . +COPY --link . . RUN chmod -R 777 /ubiquity diff --git a/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile b/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile index d4807c4a8ad..4f37f5f954f 100644 --- a/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:php8.4 RUN apt-get install -y libpq-dev \ && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ @@ -7,7 +7,7 @@ RUN apt-get install -y libpq-dev \ COPY deploy/conf/php-async.ini /usr/local/etc/php/php.ini WORKDIR /ubiquity -ADD --link . . +COPY --link . . RUN chmod -R 777 /ubiquity diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile index f27f630c898..a797a6a6da3 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile @@ -1,18 +1,18 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.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.3-cli php8.3-mysql php8.3-xml php8.3-mbstring > /dev/null + apt-get install -yqq git php8.4-cli php8.4-mysql php8.4-xml php8.4-mbstring > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.4/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.3/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.4/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.4/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile index da49301a7e2..ead124fa0b1 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile @@ -1,18 +1,18 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.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.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /dev/null + apt-get install -yqq git php8.4-cli php8.4-pgsql php8.4-xml php8.4-mbstring > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.4/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.3/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php\n" >> /etc/php/8.4/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.4/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile index d98b0f46ae4..379edd9cdd8 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile @@ -1,18 +1,18 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.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.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /dev/null + apt-get install -yqq git php8.4-cli php8.4-pgsql php8.4-xml php8.4-mbstring > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.4/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.3/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=function\n" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php\n" >> /etc/php/8.4/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=function\n" >> /etc/php/8.4/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity.dockerfile b/frameworks/PHP/ubiquity/ubiquity.dockerfile index 239d849f9b4..f757732149c 100644 --- a/frameworks/PHP/ubiquity/ubiquity.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity.dockerfile @@ -1,20 +1,20 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-dev > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/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.3/fpm/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.4/fpm/php.ini EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /ubiquity/deploy/nginx.conf -g "daemon off;" From 90a7bb1ae0b708423299c49397c7b096e7954d1d Mon Sep 17 00:00:00 2001 From: Petrik Date: Thu, 9 Jan 2025 10:22:17 +0100 Subject: [PATCH 1041/1766] [rails] Reduce headers to required headers only. +----------------------+-------+--------------+ | branch_name|fortune|weighted_score| +----------------------+-------+--------------+ | master| 14884| 60| |reduce-default-headers| 15730| 64| +----------------------+-------+--------------+ --- frameworks/Ruby/rails/config/application.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/Ruby/rails/config/application.rb b/frameworks/Ruby/rails/config/application.rb index d6be2b4b4e4..963357fb4e6 100644 --- a/frameworks/Ruby/rails/config/application.rb +++ b/frameworks/Ruby/rails/config/application.rb @@ -28,7 +28,8 @@ class Application < Rails::Application # Common ones are `templates`, `generators`, or `middleware`, for example. config.autoload_lib(ignore: %w[assets tasks]) - config.action_dispatch.default_headers.merge!('Server' => 'WebServer') + # Only use headers required by TechEmpower. + config.action_dispatch.default_headers = {'Server' => 'Rails'} config.api_only = true From 4d19d4527a6d59ebbcbd66882093ef6d8ad8f7a2 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Thu, 9 Jan 2025 10:47:09 +0100 Subject: [PATCH 1042/1766] [php] Slim update to PHP/8.4 --- frameworks/PHP/slim/composer.json | 2 +- frameworks/PHP/slim/deploy/conf/cli-php.ini | 2 +- .../PHP/slim/slim-workerman-pgsql.dockerfile | 12 ++++++------ frameworks/PHP/slim/slim-workerman.dockerfile | 14 +++++++------- frameworks/PHP/slim/slim.dockerfile | 12 ++++++------ 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/frameworks/PHP/slim/composer.json b/frameworks/PHP/slim/composer.json index 78202c96223..2969d6f9fbd 100644 --- a/frameworks/PHP/slim/composer.json +++ b/frameworks/PHP/slim/composer.json @@ -4,7 +4,7 @@ "slim/php-view": "3.2.0", "slim/psr7": "1.*", "slim/http": "1.*", - "php-di/php-di": "^6.4" + "php-di/php-di": "^7" }, "autoload": { "psr-4": { diff --git a/frameworks/PHP/slim/deploy/conf/cli-php.ini b/frameworks/PHP/slim/deploy/conf/cli-php.ini index bcccffbc63b..e03b6e352a9 100644 --- a/frameworks/PHP/slim/deploy/conf/cli-php.ini +++ b/frameworks/PHP/slim/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,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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile index b1326f40cac..2c2088a9d05 100644 --- a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile +++ b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -8,17 +8,17 @@ 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.3-cli php8.3-pgsql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-pgsql php8.4-mbstring php8.4-xml php8.4-curl > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini -ADD ./ /slim WORKDIR /slim +COPY --link . . EXPOSE 8080 diff --git a/frameworks/PHP/slim/slim-workerman.dockerfile b/frameworks/PHP/slim/slim-workerman.dockerfile index c7029637156..9f8806bc7bd 100644 --- a/frameworks/PHP/slim/slim-workerman.dockerfile +++ b/frameworks/PHP/slim/slim-workerman.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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 update -yqq > /dev/null && apt-get install -yqq git \ - php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini -ADD ./ /slim WORKDIR /slim +COPY --link . . EXPOSE 8080 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN composer require joanhey/adapterman:^0.6 --quiet +RUN composer require joanhey/adapterman:^0.7 --quiet RUN sed -i 's|$app->run(); //| //$app->run(); //|g' index.php diff --git a/frameworks/PHP/slim/slim.dockerfile b/frameworks/PHP/slim/slim.dockerfile index 90c81c6deb6..c81bf1e051f 100644 --- a/frameworks/PHP/slim/slim.dockerfile +++ b/frameworks/PHP/slim/slim.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl > /dev/null + php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-xml php8.4-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /slim WORKDIR /slim +COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/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.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /slim/deploy/nginx.conf From 8a34263a2bc82dafcf09cd3cf96b6a65f9a72e2f Mon Sep 17 00:00:00 2001 From: francesco Date: Thu, 9 Jan 2025 16:34:38 +0100 Subject: [PATCH 1043/1766] Update package.json --- frameworks/JavaScript/ultimate-express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/ultimate-express/package.json b/frameworks/JavaScript/ultimate-express/package.json index 552f0bbf287..292933b7185 100644 --- a/frameworks/JavaScript/ultimate-express/package.json +++ b/frameworks/JavaScript/ultimate-express/package.json @@ -12,7 +12,7 @@ "lru-cache": "^10.0.1", "mariadb": "^3.2.0", "postgres": "^3.3.5", - "ultimate-express": "^1.3.9" + "ultimate-express": "^1.3.17" }, "type": "module" } From 56e48107f506304007c8799d728a742b498d3573 Mon Sep 17 00:00:00 2001 From: francesco Date: Thu, 9 Jan 2025 16:35:08 +0100 Subject: [PATCH 1044/1766] Update package-lock.json --- .../ultimate-express/package-lock.json | 261 ++++++++++-------- 1 file changed, 148 insertions(+), 113 deletions(-) diff --git a/frameworks/JavaScript/ultimate-express/package-lock.json b/frameworks/JavaScript/ultimate-express/package-lock.json index f8bd80e2dd1..4ed9fc0efb1 100644 --- a/frameworks/JavaScript/ultimate-express/package-lock.json +++ b/frameworks/JavaScript/ultimate-express/package-lock.json @@ -13,7 +13,7 @@ "lru-cache": "^10.0.1", "mariadb": "^3.2.0", "postgres": "^3.3.5", - "ultimate-express": "^1.3.9" + "ultimate-express": "^1.3.17" } }, "node_modules/@fastify/merge-json-schemas": { @@ -201,17 +201,25 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://npm.acca.it/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://npm.acca.it/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -221,10 +229,9 @@ } }, "node_modules/cookie": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.1.tgz", - "integrity": "sha512-Xd8lFX4LM9QEEwxQpF9J9NTUh8pmdJO0cyRJhFiDoLTk2eH8FXlRv2IFGYVadZpqI3j8fhNrSdKCeYPxiAhLXw==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://npm.acca.it/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "engines": { "node": ">=18" } @@ -238,23 +245,6 @@ "node": ">=6.6.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -264,6 +254,19 @@ "node": ">=0.10" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://npm.acca.it/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -274,22 +277,28 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://npm.acca.it/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "resolved": "https://npm.acca.it/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://npm.acca.it/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { "node": ">= 0.4" } @@ -375,24 +384,27 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "resolved": "https://npm.acca.it/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", + "version": "1.2.7", + "resolved": "https://npm.acca.it/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -401,35 +413,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { + "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", + "resolved": "https://npm.acca.it/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dependencies": { - "get-intrinsic": "^1.1.3" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://npm.acca.it/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { "node": ">= 0.4" }, @@ -438,10 +437,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://npm.acca.it/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -451,9 +449,8 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "resolved": "https://npm.acca.it/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -519,6 +516,14 @@ "node": ">= 14" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://npm.acca.it/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -566,9 +571,8 @@ }, "node_modules/object-inspect": { "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "resolved": "https://npm.acca.it/object-inspect/-/object-inspect-1.13.3.tgz", "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -603,10 +607,9 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "version": "6.13.1", + "resolved": "https://npm.acca.it/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dependencies": { "side-channel": "^1.0.6" }, @@ -647,33 +650,66 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://npm.acca.it/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "define-data-property": "^1.1.4", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "license": "MIT", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://npm.acca.it/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://npm.acca.it/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://npm.acca.it/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -711,17 +747,16 @@ } }, "node_modules/ultimate-express": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/ultimate-express/-/ultimate-express-1.3.9.tgz", - "integrity": "sha512-jr4TMDsQM2nlG/1VMkesy70kTLIVecUeX8dzkh0JoSQ2wilhUaVbCM3I6qvKCNHD+UsYXI6QFhgKmSum1k19hw==", - "license": "Apache-2.0", + "version": "1.3.17", + "resolved": "https://npm.acca.it/ultimate-express/-/ultimate-express-1.3.17.tgz", + "integrity": "sha512-LRqSl+wE9xtuP+S03wSZXmYoQwyCXohGzL8zy3aQs4CChfnbDOQ9tbZwz4iCineUGwp7LFj7h5Oi1eqWiB6XGw==", "dependencies": { "@types/express": "^4.0.0", "accepts": "^1.3.8", - "acorn": "^8.12.1", + "acorn": "^8.14.0", "bytes": "^3.1.2", - "cookie": "^1.0.1", - "cookie-signature": "^1.2.1", + "cookie": "^1.0.2", + "cookie-signature": "^1.2.2", "encodeurl": "^2.0.0", "etag": "^1.8.1", "fast-querystring": "^1.1.2", @@ -730,12 +765,12 @@ "mime-types": "^2.1.35", "ms": "^2.1.3", "proxy-addr": "^2.0.7", - "qs": "^6.13.0", + "qs": "^6.13.1", "range-parser": "^1.2.1", "statuses": "^2.0.1", - "tseep": "^1.2.2", + "tseep": "^1.3.1", "type-is": "^1.6.18", - "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.49.0", + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.51.0", "vary": "^1.1.2" }, "engines": { From 1641fb2e10b49cea8388875120411232e4564f0f Mon Sep 17 00:00:00 2001 From: francesco Date: Thu, 9 Jan 2025 16:35:23 +0100 Subject: [PATCH 1045/1766] Update ultimate-express-mysql.dockerfile --- .../ultimate-express/ultimate-express-mysql.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile index 30c2079f2ab..37d0fe86351 100644 --- a/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile +++ b/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM node:20-slim +FROM node:22-slim WORKDIR /app @@ -15,4 +15,4 @@ USER node EXPOSE 8080 -CMD ["node", "clustered.js"] \ No newline at end of file +CMD ["node", "clustered.js"] From 2567c06cd6a7a92d28eff0f1395ee1649c8921f3 Mon Sep 17 00:00:00 2001 From: francesco Date: Thu, 9 Jan 2025 16:35:33 +0100 Subject: [PATCH 1046/1766] Update ultimate-express-postgres.dockerfile --- .../ultimate-express/ultimate-express-postgres.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile index ebf6591a379..6212cefbf1d 100644 --- a/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile +++ b/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM node:20-slim +FROM node:22-slim WORKDIR /app @@ -15,4 +15,4 @@ USER node EXPOSE 8080 -CMD ["node", "clustered.js"] \ No newline at end of file +CMD ["node", "clustered.js"] From ffdf2505b175d5e5c16241fe858ee9bba8c290ef Mon Sep 17 00:00:00 2001 From: francesco Date: Thu, 9 Jan 2025 16:35:42 +0100 Subject: [PATCH 1047/1766] Update ultimate-express.dockerfile --- .../JavaScript/ultimate-express/ultimate-express.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile index 3defb8423fb..52aa5a3ea55 100644 --- a/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile +++ b/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM node:20-slim +FROM node:22-slim WORKDIR /app @@ -13,4 +13,4 @@ USER node EXPOSE 8080 -CMD ["node", "clustered.js"] \ No newline at end of file +CMD ["node", "clustered.js"] From 881b3a2cdc42e90b36f084f9fbef8bf3b1eb6289 Mon Sep 17 00:00:00 2001 From: Seth Tucker Date: Thu, 9 Jan 2025 11:31:37 -0500 Subject: [PATCH 1048/1766] Updates to the README and small change to improve the connection pool based on the number of CPUs --- frameworks/Crystal/amber/README.md | 13 +++------ .../amber/config/initializers/database.cr | 4 +-- frameworks/Crystal/amber/shard.lock | 28 ++----------------- frameworks/Crystal/amber/shard.yml | 16 ----------- 4 files changed, 8 insertions(+), 53 deletions(-) diff --git a/frameworks/Crystal/amber/README.md b/frameworks/Crystal/amber/README.md index 470813e8c34..3bb70081119 100644 --- a/frameworks/Crystal/amber/README.md +++ b/frameworks/Crystal/amber/README.md @@ -8,17 +8,12 @@ This is the [Amber](https://amberframework.org) test of the Framework Benchmarks The purpose of Amber is not to create yet another framework, but to take advantage of the beautiful Crystal language capabilities and provide engineers an efficient, cohesive, and well maintain web framework for the crystal community that embraces the language philosophies, conventions, and guides. -Amber Crystal borrows concepts that already have been battle tested, successful, and embrace new concepts through team and community collaboration and analysis, that aligns with Crystal philosophies. +Amber borrows concepts that already have been battle tested, successful, and embrace new concepts through team and community collaboration and analysis, that aligns with Crystal philosophies. -## Contributors +Updated for Amber 1.4.1 and Crystal 1.14.0 -- Dru Jensen [drujensen](https://github.com/drujensen) -- Elias Perez [eliasjpr](https://github.com/eliasjpr) -- Isaac Sloan [elorest](https://github.com/elorest) -- Faustino Aguilar [faustinoaq](https://github.com/faustinoaq) -- Nick Franken [fridgerator](https://github.com/fridgerator) -- Mark Siemers [marksiemers](https://github.com/marksiemers) -- Robert Carpenter [robacarp](https://github.com/robacarp) +## Contributors +- Seth Tucker [crimson-knight](https://github.com/crimson-knight) See more [Amber contributors](https://github.com/amberframework/amber/graphs/contributors) diff --git a/frameworks/Crystal/amber/config/initializers/database.cr b/frameworks/Crystal/amber/config/initializers/database.cr index 04240c59a66..cf60c82de5a 100644 --- a/frameworks/Crystal/amber/config/initializers/database.cr +++ b/frameworks/Crystal/amber/config/initializers/database.cr @@ -1,7 +1,7 @@ require "granite/adapter/pg" -cpu_count = System.cpu_count -pool_size = 56 // cpu_count +cpu_count = System.cpu_count - 1 # Always leave 1 core for the system +pool_size = cpu_count * 4 # 4x the number of cores, should be plenty of room for concurrency database_url = ENV["DATABASE_URL"] url = "#{database_url}?initial_pool_size=#{pool_size}&max_idle_pool_size=#{pool_size}" diff --git a/frameworks/Crystal/amber/shard.lock b/frameworks/Crystal/amber/shard.lock index 635edcb60c1..4fb6d6ef1e4 100644 --- a/frameworks/Crystal/amber/shard.lock +++ b/frameworks/Crystal/amber/shard.lock @@ -28,10 +28,6 @@ shards: 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 @@ -44,22 +40,10 @@ shards: 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: 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 @@ -74,7 +58,7 @@ shards: micrate: git: https://github.com/amberframework/micrate.git - version: 0.15.0 + version: 0.15.1 mysql: git: https://github.com/crystal-lang/crystal-mysql.git @@ -82,7 +66,7 @@ shards: optarg: git: https://github.com/amberframework/optarg.git - version: 0.9.3 + version: 0.9.5 pg: git: https://github.com/will/crystal-pg.git @@ -96,10 +80,6 @@ shards: 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: git: https://github.com/luckyframework/shell-table.cr.git version: 0.9.3 @@ -116,10 +96,6 @@ shards: 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 c48994d4d4e..4b75672f88d 100644 --- a/frameworks/Crystal/amber/shard.yml +++ b/frameworks/Crystal/amber/shard.yml @@ -15,26 +15,10 @@ dependencies: github: amberframework/amber 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.23.3 From 88d99788d48082d60a60559417d72c26f2e00fa5 Mon Sep 17 00:00:00 2001 From: francesco Date: Thu, 9 Jan 2025 17:33:30 +0100 Subject: [PATCH 1049/1766] Update package-lock.json --- .../ultimate-express/package-lock.json | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/frameworks/JavaScript/ultimate-express/package-lock.json b/frameworks/JavaScript/ultimate-express/package-lock.json index 4ed9fc0efb1..8359c81b60a 100644 --- a/frameworks/JavaScript/ultimate-express/package-lock.json +++ b/frameworks/JavaScript/ultimate-express/package-lock.json @@ -203,7 +203,7 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.1", - "resolved": "https://npm.acca.it/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dependencies": { "es-errors": "^1.3.0", @@ -215,7 +215,7 @@ }, "node_modules/call-bound": { "version": "1.0.3", - "resolved": "https://npm.acca.it/call-bound/-/call-bound-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -230,7 +230,7 @@ }, "node_modules/cookie": { "version": "1.0.2", - "resolved": "https://npm.acca.it/cookie/-/cookie-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "engines": { "node": ">=18" @@ -256,7 +256,7 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://npm.acca.it/dunder-proto/-/dunder-proto-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -278,7 +278,7 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://npm.acca.it/es-define-property/-/es-define-property-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" @@ -286,7 +286,7 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://npm.acca.it/es-errors/-/es-errors-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "engines": { "node": ">= 0.4" @@ -294,7 +294,7 @@ }, "node_modules/es-object-atoms": { "version": "1.0.0", - "resolved": "https://npm.acca.it/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dependencies": { "es-errors": "^1.3.0" @@ -384,7 +384,7 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://npm.acca.it/function-bind/-/function-bind-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -392,7 +392,7 @@ }, "node_modules/get-intrinsic": { "version": "1.2.7", - "resolved": "https://npm.acca.it/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -415,7 +415,7 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://npm.acca.it/get-proto/-/get-proto-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dependencies": { "dunder-proto": "^1.0.1", @@ -427,7 +427,7 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://npm.acca.it/gopd/-/gopd-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { "node": ">= 0.4" @@ -438,7 +438,7 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://npm.acca.it/has-symbols/-/has-symbols-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" @@ -449,7 +449,7 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://npm.acca.it/hasown/-/hasown-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" @@ -518,7 +518,7 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://npm.acca.it/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "engines": { "node": ">= 0.4" @@ -571,7 +571,7 @@ }, "node_modules/object-inspect": { "version": "1.13.3", - "resolved": "https://npm.acca.it/object-inspect/-/object-inspect-1.13.3.tgz", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "engines": { "node": ">= 0.4" @@ -608,7 +608,7 @@ }, "node_modules/qs": { "version": "6.13.1", - "resolved": "https://npm.acca.it/qs/-/qs-6.13.1.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dependencies": { "side-channel": "^1.0.6" @@ -652,7 +652,7 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://npm.acca.it/side-channel/-/side-channel-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { "es-errors": "^1.3.0", @@ -670,7 +670,7 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://npm.acca.it/side-channel-list/-/side-channel-list-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dependencies": { "es-errors": "^1.3.0", @@ -685,7 +685,7 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://npm.acca.it/side-channel-map/-/side-channel-map-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dependencies": { "call-bound": "^1.0.2", @@ -702,7 +702,7 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://npm.acca.it/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dependencies": { "call-bound": "^1.0.2", @@ -748,7 +748,7 @@ }, "node_modules/ultimate-express": { "version": "1.3.17", - "resolved": "https://npm.acca.it/ultimate-express/-/ultimate-express-1.3.17.tgz", + "resolved": "https://registry.npmjs.org/ultimate-express/-/ultimate-express-1.3.17.tgz", "integrity": "sha512-LRqSl+wE9xtuP+S03wSZXmYoQwyCXohGzL8zy3aQs4CChfnbDOQ9tbZwz4iCineUGwp7LFj7h5Oi1eqWiB6XGw==", "dependencies": { "@types/express": "^4.0.0", From 0004564fa3ea7bab5c920e597c1eacfff8004b3d Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 10 Jan 2025 10:48:17 +0800 Subject: [PATCH 1050/1766] add BENCHMARK tag remove log record --- frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index f893e890146..611a71394bb 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -65,7 +65,7 @@ endif () if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) if(CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN}") if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") @@ -73,20 +73,20 @@ if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) endif () else() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) endif () message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) if (CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -O3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -DBENCHMARK -O3") if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread") endif () else () set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -DBENCHMARK -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) file(MAKE_DIRECTORY /usr/local/etc/paozhu) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/) endif () @@ -95,7 +95,7 @@ elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) else() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") From 6470a4e8766bc78ee4a389b0dc32232e74356496 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 10 Jan 2025 10:56:28 +0800 Subject: [PATCH 1051/1766] add BENCHMARK tag remove log record --- frameworks/C++/paozhu/paozhu.dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 4419e8e0cb8..7381d0e9ac9 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -6,7 +6,6 @@ RUN apt-get -y install brotli libbrotli-dev RUN apt-get -y install libreadline-dev RUN apt-get -y install mysql-client RUN apt-get -y install libmysqlclient-dev -RUN apt-get -y install psmisc RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From b92239ac24092bdba3631307eb25edf332a15af4 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Mon, 6 Jan 2025 14:34:15 -0600 Subject: [PATCH 1052/1766] Benchmark Next.js This adds benchmark tests for the Next.js framework. --- frameworks/TypeScript/nextjs/.dockerignore | 7 + frameworks/TypeScript/nextjs/.gitignore | 41 + frameworks/TypeScript/nextjs/README.md | 47 + .../nextjs/app/cached-queries/route.ts | 18 + frameworks/TypeScript/nextjs/app/db/route.ts | 6 + frameworks/TypeScript/nextjs/app/favicon.ico | Bin 0 -> 25931 bytes .../TypeScript/nextjs/app/fortunes/page.tsx | 31 + .../TypeScript/nextjs/app/json/route.ts | 3 + frameworks/TypeScript/nextjs/app/layout.tsx | 13 + frameworks/TypeScript/nextjs/app/page.tsx | 3 + .../TypeScript/nextjs/app/plaintext/route.ts | 3 + .../TypeScript/nextjs/app/queries/route.ts | 15 + .../TypeScript/nextjs/app/updates/route.ts | 26 + .../TypeScript/nextjs/benchmark_config.json | 30 + frameworks/TypeScript/nextjs/lib/db.ts | 27 + frameworks/TypeScript/nextjs/lib/schema.ts | 22 + frameworks/TypeScript/nextjs/middleware.ts | 7 + frameworks/TypeScript/nextjs/next.config.ts | 7 + .../TypeScript/nextjs/nextjs.dockerfile | 20 + .../TypeScript/nextjs/package-lock.json | 1198 +++++++++++++++++ frameworks/TypeScript/nextjs/package.json | 25 + frameworks/TypeScript/nextjs/public/.keep | 0 frameworks/TypeScript/nextjs/tsconfig.json | 27 + 23 files changed, 1576 insertions(+) create mode 100644 frameworks/TypeScript/nextjs/.dockerignore create mode 100644 frameworks/TypeScript/nextjs/.gitignore create mode 100644 frameworks/TypeScript/nextjs/README.md create mode 100644 frameworks/TypeScript/nextjs/app/cached-queries/route.ts create mode 100644 frameworks/TypeScript/nextjs/app/db/route.ts create mode 100644 frameworks/TypeScript/nextjs/app/favicon.ico create mode 100644 frameworks/TypeScript/nextjs/app/fortunes/page.tsx create mode 100644 frameworks/TypeScript/nextjs/app/json/route.ts create mode 100644 frameworks/TypeScript/nextjs/app/layout.tsx create mode 100644 frameworks/TypeScript/nextjs/app/page.tsx create mode 100644 frameworks/TypeScript/nextjs/app/plaintext/route.ts create mode 100644 frameworks/TypeScript/nextjs/app/queries/route.ts create mode 100644 frameworks/TypeScript/nextjs/app/updates/route.ts create mode 100644 frameworks/TypeScript/nextjs/benchmark_config.json create mode 100644 frameworks/TypeScript/nextjs/lib/db.ts create mode 100644 frameworks/TypeScript/nextjs/lib/schema.ts create mode 100644 frameworks/TypeScript/nextjs/middleware.ts create mode 100644 frameworks/TypeScript/nextjs/next.config.ts create mode 100644 frameworks/TypeScript/nextjs/nextjs.dockerfile create mode 100644 frameworks/TypeScript/nextjs/package-lock.json create mode 100644 frameworks/TypeScript/nextjs/package.json create mode 100644 frameworks/TypeScript/nextjs/public/.keep create mode 100644 frameworks/TypeScript/nextjs/tsconfig.json diff --git a/frameworks/TypeScript/nextjs/.dockerignore b/frameworks/TypeScript/nextjs/.dockerignore new file mode 100644 index 00000000000..db6a874b260 --- /dev/null +++ b/frameworks/TypeScript/nextjs/.dockerignore @@ -0,0 +1,7 @@ +*.dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git diff --git a/frameworks/TypeScript/nextjs/.gitignore b/frameworks/TypeScript/nextjs/.gitignore new file mode 100644 index 00000000000..5ef6a520780 --- /dev/null +++ b/frameworks/TypeScript/nextjs/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/frameworks/TypeScript/nextjs/README.md b/frameworks/TypeScript/nextjs/README.md new file mode 100644 index 00000000000..c6cb986eac7 --- /dev/null +++ b/frameworks/TypeScript/nextjs/README.md @@ -0,0 +1,47 @@ +# Next.js Benchmarking Test + +## Test source files and URLs + +| Test | Source Code | URL | +| --- | --- | --- | +| [JSON Serialization][] | [`app/json/route.ts`][] | http://localhost:3000/json | +| [Single Database Query][] | [`app/db/route.ts`][] | http://localhost:3000/db | +| [Multiple Database Queries][] | [`app/queries/route.ts`][] | http://localhost:3000/queries?queries= | +| [Fortunes][] | [`app/fortunes/page.tsx`][] | http://localhost:3000/fortunes | +| [Database Updates][] | [`app/updates/route.ts`][] | http://localhost:3000/updates?queries= | +| [Plaintext][] | [`app/plaintext/route.ts`][] | http://localhost:3000/plaintext | +| [Caching][] | [`app/cached-queries/route.ts`][] | http://localhost:3000/cached-queries?queries= | + +[JSON Serialization]: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#json-serialization +[Single Database Query]: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#single-database-query +[Multiple Database Queries]: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#multiple-database-queries +[Fortunes]: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes +[Database Updates]: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates +[Plaintext]: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#plaintext +[Caching]: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#caching + +[`app/json/route.ts`]: ./app/json/route.ts +[`app/db/route.ts`]: ./app/db/route.ts +[`app/queries/route.ts`]: ./app/queries/route.ts +[`app/fortunes/page.tsx`]: ./app/fortunes/page.tsx +[`app/updates/route.ts`]: ./app/updates/route.ts +[`app/plaintext/route.ts`]: ./app/plaintext/route.ts +[`app/cached-queries/route.ts`]: ./app/cached-queries/route.ts + +## TODO + +The Fortunes test is currently disabled because the benchmark expects exact HTML output — see [TechEmpower/FrameworkBenchmarks#9505](https://github.com/TechEmpower/FrameworkBenchmarks/pull/9505). After that issue is resolved, the Fortunes test can be re-enabled by applying the following diff: + +```diff +--- a/frameworks/TypeScript/nextjs/benchmark_config.json ++++ b/frameworks/TypeScript/nextjs/benchmark_config.json +@@ -20,7 +20,7 @@ + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", +- "TEMPORARILY DISABLED fortune_url": "/fortunes", ++ "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "cached_query_url": "/cached-queries?queries=" +``` diff --git a/frameworks/TypeScript/nextjs/app/cached-queries/route.ts b/frameworks/TypeScript/nextjs/app/cached-queries/route.ts new file mode 100644 index 00000000000..148891d3249 --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/cached-queries/route.ts @@ -0,0 +1,18 @@ +import { findWorld as uncached_findWorld, World } from "@/lib/db" +import { unstable_cache } from "next/cache" +import { NextRequest } from "next/server" + +const findWorld = unstable_cache(uncached_findWorld) + +export async function GET(request: NextRequest) { + const queriesParam = request.nextUrl.searchParams.get("queries") + const queriesCount = Math.min(Math.max(Number(queriesParam) || 1, 1), 500) + const results = Array(queriesCount) + + for (let i = 0; i < queriesCount; i += 1) { + const id = 1 + Math.floor(Math.random() * 10000) + results[i] = await findWorld(id) + } + + return Response.json(results) +} diff --git a/frameworks/TypeScript/nextjs/app/db/route.ts b/frameworks/TypeScript/nextjs/app/db/route.ts new file mode 100644 index 00000000000..1ff5e98fe72 --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/db/route.ts @@ -0,0 +1,6 @@ +import { findWorld } from "@/lib/db" + +export async function GET() { + const id = 1 + Math.floor(Math.random() * 10000) + return Response.json(await findWorld(id)) +} diff --git a/frameworks/TypeScript/nextjs/app/favicon.ico b/frameworks/TypeScript/nextjs/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/frameworks/TypeScript/nextjs/app/fortunes/page.tsx b/frameworks/TypeScript/nextjs/app/fortunes/page.tsx new file mode 100644 index 00000000000..95f2633e9b7 --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/fortunes/page.tsx @@ -0,0 +1,31 @@ +import { db } from "@/lib/db" + +// Prevent database queries during build phase. +export const dynamic = "force-dynamic" + +export default async function Page() { + const fortunes = await db.selectFrom("Fortune").selectAll().execute() + fortunes.push({ id: 0, message: "Additional fortune added at request time." }) + fortunes.sort((a, b) => a.message.localeCompare(b.message)) + + return <> + Fortunes + +
      + + + + + + + + {fortunes.map(fortune => + + + + + )} + +
      idmessage
      {fortune.id}{fortune.message}
      + +} diff --git a/frameworks/TypeScript/nextjs/app/json/route.ts b/frameworks/TypeScript/nextjs/app/json/route.ts new file mode 100644 index 00000000000..c4b7c31fba3 --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/json/route.ts @@ -0,0 +1,3 @@ +export async function GET() { + return Response.json({ message: "Hello, World!" }) +} diff --git a/frameworks/TypeScript/nextjs/app/layout.tsx b/frameworks/TypeScript/nextjs/app/layout.tsx new file mode 100644 index 00000000000..0703997a627 --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/layout.tsx @@ -0,0 +1,13 @@ +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/frameworks/TypeScript/nextjs/app/page.tsx b/frameworks/TypeScript/nextjs/app/page.tsx new file mode 100644 index 00000000000..b772bfb7bbc --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/page.tsx @@ -0,0 +1,3 @@ +export default function Home() { + return +} diff --git a/frameworks/TypeScript/nextjs/app/plaintext/route.ts b/frameworks/TypeScript/nextjs/app/plaintext/route.ts new file mode 100644 index 00000000000..62ee50bc6ce --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/plaintext/route.ts @@ -0,0 +1,3 @@ +export function GET() { + return new Response("Hello, World!") +} diff --git a/frameworks/TypeScript/nextjs/app/queries/route.ts b/frameworks/TypeScript/nextjs/app/queries/route.ts new file mode 100644 index 00000000000..bea89efb67b --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/queries/route.ts @@ -0,0 +1,15 @@ +import { findWorld, World } from "@/lib/db" +import { NextRequest } from "next/server" + +export async function GET(request: NextRequest) { + const queriesParam = request.nextUrl.searchParams.get("queries") + const queriesCount = Math.min(Math.max(Number(queriesParam) || 1, 1), 500) + const promises = Array>(queriesCount) + + for (let i = 0; i < queriesCount; i += 1) { + const id = 1 + Math.floor(Math.random() * 10000) + promises[i] = findWorld(id) + } + + return Response.json(await Promise.all(promises)) +} diff --git a/frameworks/TypeScript/nextjs/app/updates/route.ts b/frameworks/TypeScript/nextjs/app/updates/route.ts new file mode 100644 index 00000000000..4eebbc71ffe --- /dev/null +++ b/frameworks/TypeScript/nextjs/app/updates/route.ts @@ -0,0 +1,26 @@ +import { db, findWorld, upsertWorlds, World } from "@/lib/db" +import { NextRequest } from "next/server" + +export async function GET(request: NextRequest) { + const queriesParam = request.nextUrl.searchParams.get("queries") + const queriesCount = Math.min(Math.max(Number(queriesParam) || 1, 1), 500) + + const ids = new Set() + while (ids.size < queriesCount) { + ids.add(1 + Math.floor(Math.random() * 10000)) + } + + const promises = new Array>() + for (const id of ids) { + promises.push(findWorld(id)) + } + + const results = await Promise.all(promises) as World[] + for (const result of results) { + result.randomNumber = 1 + Math.floor(Math.random() * 10000) + } + + await upsertWorlds(results) + + return Response.json(results) +} diff --git a/frameworks/TypeScript/nextjs/benchmark_config.json b/frameworks/TypeScript/nextjs/benchmark_config.json new file mode 100644 index 00000000000..d0853b96419 --- /dev/null +++ b/frameworks/TypeScript/nextjs/benchmark_config.json @@ -0,0 +1,30 @@ +{ + "framework": "nextjs", + "tests": [ + { + "default": { + "display_name": "Next.js", + "versus": "nodejs", + "classification": "Platform", + "language": "TypeScript", + "platform": "nodejs", + "framework": "nextjs", + "os": "Linux", + "webserver": "None", + "database": "postgres", + "database_os": "Linux", + "orm": "Micro", + "approach": "Realistic", + "notes": "", + "port": 3000, + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "TEMPORARILY DISABLED fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "cached_query_url": "/cached-queries?queries=" + } + } + ] +} diff --git a/frameworks/TypeScript/nextjs/lib/db.ts b/frameworks/TypeScript/nextjs/lib/db.ts new file mode 100644 index 00000000000..5552ab826c9 --- /dev/null +++ b/frameworks/TypeScript/nextjs/lib/db.ts @@ -0,0 +1,27 @@ +import { Kysely, PostgresDialect } from "kysely" +import { Pool } from "pg" +import { Database, WorldRow } from "./schema.js" + +export const db = new Kysely({ + dialect: new PostgresDialect({ + pool: new Pool({ connectionString: process.env.DATABASE_URL }), + }), +}) + +export type World = { + [key in keyof WorldRow as key extends "randomnumber" ? "randomNumber" : key]: WorldRow[key] +} + +export async function findWorld(id: number): Promise { + return db.selectFrom("World"). + where("id", "=", id). + select(["id", "randomnumber as randomNumber"]). + executeTakeFirst() +} + +export async function upsertWorlds(worlds: World[]) { + const values = worlds.map(world => ({ id: world.id, randomnumber: world.randomNumber })) + return db.insertInto("World").values(values).onConflict(oc => + oc.column("id").doUpdateSet({ randomnumber: eb => eb.ref("excluded.randomnumber") }) + ).execute() +} diff --git a/frameworks/TypeScript/nextjs/lib/schema.ts b/frameworks/TypeScript/nextjs/lib/schema.ts new file mode 100644 index 00000000000..990108f8d24 --- /dev/null +++ b/frameworks/TypeScript/nextjs/lib/schema.ts @@ -0,0 +1,22 @@ +import { Generated, Insertable, Selectable, Updateable } from "kysely" + +export interface Database { + World: WorldTable + Fortune: FortuneTable +} + +export interface WorldTable { + id: Generated + randomnumber: number +} + +export type WorldRow = Selectable +export type NewWorld = Insertable +export type WorldUpdate = Updateable + +export interface FortuneTable { + id: Generated + message: string +} + +export type Fortune = Selectable diff --git a/frameworks/TypeScript/nextjs/middleware.ts b/frameworks/TypeScript/nextjs/middleware.ts new file mode 100644 index 00000000000..7983b8a3673 --- /dev/null +++ b/frameworks/TypeScript/nextjs/middleware.ts @@ -0,0 +1,7 @@ +import { NextRequest, NextResponse } from "next/server" + +export function middleware(request: NextRequest) { + const response = NextResponse.next() + response.headers.set("Server", "Next.js") + return response +} diff --git a/frameworks/TypeScript/nextjs/next.config.ts b/frameworks/TypeScript/nextjs/next.config.ts new file mode 100644 index 00000000000..68a6c64d279 --- /dev/null +++ b/frameworks/TypeScript/nextjs/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: "standalone", +}; + +export default nextConfig; diff --git a/frameworks/TypeScript/nextjs/nextjs.dockerfile b/frameworks/TypeScript/nextjs/nextjs.dockerfile new file mode 100644 index 00000000000..9f68f27e4b1 --- /dev/null +++ b/frameworks/TypeScript/nextjs/nextjs.dockerfile @@ -0,0 +1,20 @@ +FROM node:22-slim + +ENV NEXT_TELEMETRY_DISABLED="1" +ENV DATABASE_URL="postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world" + +EXPOSE 3000 + +WORKDIR /nextjs + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY ./ ./ +RUN npm run build \ + && cp -r public .next/standalone/ \ + && cp -r .next/static .next/standalone/.next/ + +ENV NODE_ENV="production" + +CMD ["node", ".next/standalone/server.js"] diff --git a/frameworks/TypeScript/nextjs/package-lock.json b/frameworks/TypeScript/nextjs/package-lock.json new file mode 100644 index 00000000000..66e3d67f8a2 --- /dev/null +++ b/frameworks/TypeScript/nextjs/package-lock.json @@ -0,0 +1,1198 @@ +{ + "name": "next-techempower-benchmarks", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "next-techempower-benchmarks", + "version": "0.1.0", + "dependencies": { + "kysely": "^0.27.5", + "next": "^15.1.3", + "pg": "^8.13.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/pg": "^8.11.10", + "@types/react": "^19", + "@types/react-dom": "^19", + "typescript": "^5" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@next/env": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.3.tgz", + "integrity": "sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz", + "integrity": "sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz", + "integrity": "sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz", + "integrity": "sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz", + "integrity": "sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz", + "integrity": "sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz", + "integrity": "sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz", + "integrity": "sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz", + "integrity": "sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/node": { + "version": "20.17.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.11.tgz", + "integrity": "sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/pg": { + "version": "8.11.10", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.10.tgz", + "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/pg/node_modules/pg-types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", + "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", + "dev": true, + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/pg/node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/pg/node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/pg/node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/pg/node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/react": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz", + "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz", + "integrity": "sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT", + "optional": true + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/kysely": { + "version": "0.27.5", + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.27.5.tgz", + "integrity": "sha512-s7hZHcQeSNKpzCkHRm8yA+0JPLjncSWnjb+2TIElwS2JAqYr+Kv3Ess+9KFfJS0C1xcQ1i9NkNHpWwCYpHMWsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.1.3.tgz", + "integrity": "sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==", + "license": "MIT", + "dependencies": { + "@next/env": "15.1.3", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.1.3", + "@next/swc-darwin-x64": "15.1.3", + "@next/swc-linux-arm64-gnu": "15.1.3", + "@next/swc-linux-arm64-musl": "15.1.3", + "@next/swc-linux-x64-gnu": "15.1.3", + "@next/swc-linux-x64-musl": "15.1.3", + "@next/swc-win32-arm64-msvc": "15.1.3", + "@next/swc-win32-x64-msvc": "15.1.3", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", + "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.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==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", + "license": "MIT" + }, + "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==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-pool": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-range": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", + "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/frameworks/TypeScript/nextjs/package.json b/frameworks/TypeScript/nextjs/package.json new file mode 100644 index 00000000000..bc87525a493 --- /dev/null +++ b/frameworks/TypeScript/nextjs/package.json @@ -0,0 +1,25 @@ +{ + "name": "next-techempower-benchmarks", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "kysely": "^0.27.5", + "next": "^15.1.3", + "pg": "^8.13.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/pg": "^8.11.10", + "@types/react": "^19", + "@types/react-dom": "^19", + "typescript": "^5" + } +} diff --git a/frameworks/TypeScript/nextjs/public/.keep b/frameworks/TypeScript/nextjs/public/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/TypeScript/nextjs/tsconfig.json b/frameworks/TypeScript/nextjs/tsconfig.json new file mode 100644 index 00000000000..d8b93235f20 --- /dev/null +++ b/frameworks/TypeScript/nextjs/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From 8b34594ec6b7cbc77727b1c6fee56ccec9381a47 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 13 Jan 2025 17:49:52 +0100 Subject: [PATCH 1053/1766] [php] Ngx-php update to PHP/8.4 (#9524) --- frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile | 10 +++++----- frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile | 8 ++++---- frameworks/PHP/php-ngx/php-ngx.dockerfile | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile index 8c93d9d3fd1..2eb076f20d9 100644 --- a/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile @@ -10,11 +10,11 @@ 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-dev libsodium-dev libkrb5-dev \ - php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql > /dev/null + php8.4-cli php8.4-dev libphp8.4-embed php8.4-mysql > /dev/null -ENV NGINX_VERSION 1.26.0 +ENV NGINX_VERSION 1.27.3 -RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.30 --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 > /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 +RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.4/embed/conf.d/10-opcache.ini COPY --link . . @@ -36,4 +36,4 @@ RUN export WORKERS=$(( 4 * $(nproc) )) && \ EXPOSE 8080 -CMD /nginx/sbin/nginx -c /deploy/nginx.conf +CMD /nginx/sbin/nginx -c /deploy/nginx.conf diff --git a/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile index ab6d1e4f5df..9d943180852 100644 --- a/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile @@ -10,11 +10,11 @@ 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-dev libsodium-dev libkrb5-dev \ - php8.3-cli php8.3-dev libphp8.3-embed php8.3-pgsql > /dev/null + php8.4-cli php8.4-dev libphp8.4-embed php8.4-pgsql > /dev/null -ENV NGINX_VERSION 1.26.0 +ENV NGINX_VERSION 1.27.3 -RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.30 --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 > /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 +RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.4/embed/conf.d/10-opcache.ini COPY --link . . diff --git a/frameworks/PHP/php-ngx/php-ngx.dockerfile b/frameworks/PHP/php-ngx/php-ngx.dockerfile index 60d488d6649..3979f852433 100644 --- a/frameworks/PHP/php-ngx/php-ngx.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx.dockerfile @@ -10,16 +10,16 @@ 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-dev libsodium-dev libkrb5-dev \ - php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql > /dev/null + php8.4-cli php8.4-dev libphp8.4-embed php8.4-mysql > /dev/null -ENV NGINX_VERSION 1.26.0 +ENV NGINX_VERSION 1.27.3 -RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.30 --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 && \ cd nginx-${NGINX_VERSION} && \ - export PHP_LIB=/usr/lib && \ + export PHP_LIB=/usr/lib && \ ./configure --user=www --group=www \ --prefix=/nginx \ --with-ld-opt="-Wl,-rpath,$PHP_LIB" \ @@ -27,10 +27,10 @@ RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ --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 +RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.4/embed/conf.d/10-opcache.ini COPY --link . . EXPOSE 8080 -CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf +CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf From 05166707892801160d9141dad4b77f6da0c9f9f7 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Mon, 13 Jan 2025 16:50:04 +0000 Subject: [PATCH 1054/1766] H2O: Track connection load across the worker threads (#9520) --- frameworks/C/h2o/src/event_loop.c | 29 +++++++++++++++++++++++++++++ frameworks/C/h2o/src/event_loop.h | 5 +++++ 2 files changed, 34 insertions(+) diff --git a/frameworks/C/h2o/src/event_loop.c b/frameworks/C/h2o/src/event_loop.c index d5e138348de..5e49f246d60 100644 --- a/frameworks/C/h2o/src/event_loop.c +++ b/frameworks/C/h2o/src/event_loop.c @@ -32,13 +32,16 @@ #include #include #include +#include #include #include "error.h" #include "event_loop.h" #include "global_data.h" #include "thread.h" +#include "utility.h" +#define CONN_NUM_SAMPLE_PERIOD 2500 #define DEFAULT_TCP_FASTOPEN_QUEUE_LEN 4096 static void accept_connection(h2o_socket_t *listener, const char *err); @@ -72,6 +75,7 @@ static void accept_connection(h2o_socket_t *listener, const char *err) if (!sock) break; + ctx->event_loop.accepted_conn_num++; ctx->event_loop.conn_num++; sock->on_close.cb = on_close_connection; sock->on_close.data = &ctx->event_loop.conn_num; @@ -277,11 +281,36 @@ static void start_accept_polling(const config_t *config, void event_loop(struct thread_context_t *ctx) { + uint64_t last_sample = 0; + while (!ctx->shutdown || ctx->event_loop.conn_num) { h2o_evloop_run(ctx->event_loop.h2o_ctx.loop, INT32_MAX); process_messages(&ctx->global_thread_data->h2o_receiver, &ctx->event_loop.local_messages); + + const uint64_t now = h2o_now(ctx->event_loop.h2o_ctx.loop); + + if (now - last_sample > CONN_NUM_SAMPLE_PERIOD || last_sample > now) { + const size_t i = ctx->event_loop.conn_num_sample_idx; + + ctx->event_loop.conn_num_sample[i] = ctx->event_loop.conn_num; + ctx->event_loop.conn_num_sample_idx = + (i + 1) % ARRAY_SIZE(ctx->event_loop.conn_num_sample); + last_sample = now; + } } + + flockfile(stdout); + printf("Thread %ld statistics:\nAccepted connections: %zu\nConnection number samples: %zu", + syscall(SYS_gettid), + ctx->event_loop.accepted_conn_num, + *ctx->event_loop.conn_num_sample); + + for (size_t i = 1; i < ARRAY_SIZE(ctx->event_loop.conn_num_sample); i++) + printf(",%zu", ctx->event_loop.conn_num_sample[i]); + + putc_unlocked('\n', stdout); + funlockfile(stdout); } void free_event_loop(event_loop_t *event_loop, h2o_multithread_receiver_t *h2o_receiver) diff --git a/frameworks/C/h2o/src/event_loop.h b/frameworks/C/h2o/src/event_loop.h index cff091154c7..41a1f3b920f 100644 --- a/frameworks/C/h2o/src/event_loop.h +++ b/frameworks/C/h2o/src/event_loop.h @@ -27,6 +27,8 @@ #include "global_data.h" +#define CONN_NUM_SAMPLES 512 + typedef enum { SHUTDOWN, TASK @@ -41,6 +43,9 @@ typedef struct { h2o_accept_ctx_t h2o_accept_ctx; h2o_context_t h2o_ctx; h2o_linklist_t local_messages; + size_t accepted_conn_num; + size_t conn_num_sample[CONN_NUM_SAMPLES]; + size_t conn_num_sample_idx; } event_loop_t; typedef struct { From db4831a670813b6e4bf53a255c4bd3931dbb9654 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Mon, 13 Jan 2025 17:50:19 +0100 Subject: [PATCH 1055/1766] Update SNUnuit NGINX Unit and try to fix startup errors (#9522) * Update SNUnuit NGINX Unit and try to fix startup errors * Try remove the `broken` tag --- frameworks/Scala/snunit/.dockerignore | 2 +- frameworks/Scala/snunit/benchmark_config.json | 3 +-- frameworks/Scala/snunit/build.sbt | 4 +-- frameworks/Scala/snunit/conf.json | 20 ++++++++++++++ frameworks/Scala/snunit/config.sh | 26 ------------------- frameworks/Scala/snunit/snunit.dockerfile | 13 +++++++--- 6 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 frameworks/Scala/snunit/conf.json delete mode 100755 frameworks/Scala/snunit/config.sh diff --git a/frameworks/Scala/snunit/.dockerignore b/frameworks/Scala/snunit/.dockerignore index e4a162e5e02..2a371592c0f 100644 --- a/frameworks/Scala/snunit/.dockerignore +++ b/frameworks/Scala/snunit/.dockerignore @@ -3,7 +3,7 @@ # Allow files and directories !/build.sbt -!/config.sh +!/conf.json !/project/build.properties !/project/plugins.sbt !/src diff --git a/frameworks/Scala/snunit/benchmark_config.json b/frameworks/Scala/snunit/benchmark_config.json index 7711ab00316..f46cf29e0d8 100755 --- a/frameworks/Scala/snunit/benchmark_config.json +++ b/frameworks/Scala/snunit/benchmark_config.json @@ -19,8 +19,7 @@ "database_os": "Linux", "display_name": "SNUnit", "notes": "", - "versus": "", - "tags": ["broken"] + "versus": "" } } ] diff --git a/frameworks/Scala/snunit/build.sbt b/frameworks/Scala/snunit/build.sbt index e77aab72639..c44785e96c8 100644 --- a/frameworks/Scala/snunit/build.sbt +++ b/frameworks/Scala/snunit/build.sbt @@ -2,8 +2,8 @@ import scala.scalanative.build._ scalaVersion := "3.5.2" -val snunitVersion = "0.10.2" -val jsoniterScalaVersion = "2.31.3" +val snunitVersion = "0.10.3" +val jsoniterScalaVersion = "2.33.0" libraryDependencies ++= Seq( "com.github.lolgab" %%% "snunit" % snunitVersion, diff --git a/frameworks/Scala/snunit/conf.json b/frameworks/Scala/snunit/conf.json new file mode 100644 index 00000000000..0a6c3954949 --- /dev/null +++ b/frameworks/Scala/snunit/conf.json @@ -0,0 +1,20 @@ +{ + "listeners": { + "*:8080": { + "pass": "applications/example" + } + }, + "applications": { + "example": { + "type": "external", + "processes": { + "spare": 2, + "max": 20 + }, + "executable": "/app/example", + "environment": { + "SCALANATIVE_GC_THREADS": "2" + } + } + } +} diff --git a/frameworks/Scala/snunit/config.sh b/frameworks/Scala/snunit/config.sh deleted file mode 100755 index 12f0a511a10..00000000000 --- a/frameworks/Scala/snunit/config.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -processes=$(("$(nproc)" / 2)) - -config='{' -config+=' "listeners": {' -config+=' "*:8080": {' -config+=' "pass": "applications/example"' -config+=' }' -config+=' },' -config+=' "applications": {' -config+=' "example": {' -config+=' "type": "external",' -config+=' "processes": '"$processes"',' -config+=' "executable": "/app/example",' -config+=' "environment": {' -config+=' "SCALANATIVE_GC_THREADS": "2"' -config+=' }' -config+=' }' -config+=' }' -config+='}' - -curl -X PUT \ - --data-binary "$config" \ - --unix-socket /var/run/control.unit.sock \ - http://localhost/config diff --git a/frameworks/Scala/snunit/snunit.dockerfile b/frameworks/Scala/snunit/snunit.dockerfile index f83e84354c2..699c3c714f8 100644 --- a/frameworks/Scala/snunit/snunit.dockerfile +++ b/frameworks/Scala/snunit/snunit.dockerfile @@ -6,18 +6,25 @@ RUN apt-get update && apt-get install -y curl gnupg && \ curl -sL https://nginx.org/keys/nginx_signing.key | apt-key add - && \ echo "deb https://packages.nginx.org/unit/debian/ bookworm unit" > /etc/apt/sources.list.d/unit.list && \ echo "deb-src https://packages.nginx.org/unit/debian/ bookworm unit" >> /etc/apt/sources.list.d/unit.list && \ - apt-get update && apt-get install -y clang unit-dev=1.33* openjdk-17-jdk sbt=1.10.5 && \ + apt-get update && apt-get install -y clang unit-dev=1.34* openjdk-17-jdk sbt=1.10.5 && \ apt-get purge -y gnupg WORKDIR /workdir +RUN sbt version + COPY . . RUN sbt nativeLink -FROM unit:1.33.0-minimal +FROM unit:1.34.0-minimal + +WORKDIR /workdir -COPY /config.sh /docker-entrypoint.d/ +COPY conf.json statedir/ +COPY --from=builder /usr/sbin/unitd /usr/sbin/unitd COPY --from=builder /workdir/target/scala-3.5.2/workdir /app/example EXPOSE 8080 + +ENTRYPOINT [ "unitd", "--no-daemon", "--statedir", "/workdir/statedir", "--log", "/dev/stdout" ] From 82b2fc4d6f222757310074f17c132f9c04f0acf7 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 13 Jan 2025 17:50:32 +0100 Subject: [PATCH 1056/1766] [ruby/sinatra] Don't use `JSON.fast_generate` (#9521) It's not faster for small payloads. +--------------------+------+-----+-----+-------+--------------+ | branch_name|update| db|query|fortune|weighted_score| +--------------------+------+-----+-----+-------+--------------+ | master| 8301|36433|15826| 28025| 1089| |remove-fast-generate| 8897|38895|16317| 27660| 1143| +--------------------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra-sequel/hello_world.rb | 2 +- frameworks/Ruby/sinatra/hello_world.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 27bc79c00d6..4f084bcd3b9 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -4,7 +4,7 @@ GEM base64 (0.2.0) bigdecimal (3.1.8) iodine (0.7.58) - json (2.8.2) + json (2.9.1) kgio (2.11.4) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index 822ceb5979c..5a4630585f9 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -22,7 +22,7 @@ def bounded_queries def json(data) content_type :json - JSON.fast_generate(data) + data.to_json end # Return a random number between 1 and MAX_PK diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index dad43a41c20..1a6b2c55c4c 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -22,7 +22,7 @@ def bounded_queries def json(data) content_type :json - JSON.fast_generate(data) + data.to_json end # Return a random number between 1 and MAX_PK From 1d193b2f26f4318d4aebe9f7ffc3f676e3b44e37 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 13 Jan 2025 17:54:23 +0100 Subject: [PATCH 1057/1766] [rails] Don't filter any parameters (#9519) +----------------------------+---------+------+------+-----+-----+-------+------------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|cached-query|weighted_score| +----------------------------+---------+------+------+-----+-----+-------+------------+--------------+ | master| 19856| 8736| 58300|22475|15399| 15217| 15521| 1094| | rails/empty-param-filters| 20338| 9586| 58739|23154|15566| 16374| 16798| 1162| +----------------------------+---------+------+------+-----+-----+-------+------------+--------------+ --- .../rails/config/initializers/filter_parameter_logging.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb b/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb index c0b717f7ecb..e058dbb3656 100644 --- a/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb +++ b/frameworks/Ruby/rails/config/initializers/filter_parameter_logging.rb @@ -3,6 +3,4 @@ # Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. # Use this to limit dissemination of sensitive information. # See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. -Rails.application.config.filter_parameters += [ - :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc -] +Rails.application.config.filter_parameters = [] From 7c0e406860c9936a8cfd8e80bf7a929713693ba4 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 13 Jan 2025 17:54:34 +0100 Subject: [PATCH 1058/1766] [php] Yii2 raw update to PHP/8.4 (#9518) --- frameworks/PHP/yii2/yii2-raw.dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/PHP/yii2/yii2-raw.dockerfile b/frameworks/PHP/yii2/yii2-raw.dockerfile index b7af0a36511..cfb0bf78a38 100644 --- a/frameworks/PHP/yii2/yii2-raw.dockerfile +++ b/frameworks/PHP/yii2/yii2-raw.dockerfile @@ -1,24 +1,24 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /yii2 WORKDIR /yii2 +COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /yii2/deploy/nginx.conf From 0a9ab06df80bf06583c36964c3b7957a73dae2c4 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 13 Jan 2025 17:54:43 +0100 Subject: [PATCH 1059/1766] [php] Fat-free update to PHP/8.4 (#9517) * [php] Fat-free update to PHP/8.4 * Fix ubuntu version * Update composer.json --- frameworks/PHP/fat-free/composer.json | 4 ++-- frameworks/PHP/fat-free/fat-free-raw.dockerfile | 12 ++++++------ frameworks/PHP/fat-free/fat-free.dockerfile | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/frameworks/PHP/fat-free/composer.json b/frameworks/PHP/fat-free/composer.json index db779e5a04b..ba4b6413103 100644 --- a/frameworks/PHP/fat-free/composer.json +++ b/frameworks/PHP/fat-free/composer.json @@ -1,5 +1,5 @@ { "require": { - "bcosca/fatfree-core": "3.8.0" + "bcosca/fatfree-core": "^3.8" } -} \ 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 799ab3ccf3c..9038161bb87 100644 --- a/frameworks/PHP/fat-free/fat-free-raw.dockerfile +++ b/frameworks/PHP/fat-free/fat-free-raw.dockerfile @@ -1,16 +1,16 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /fat-free WORKDIR /fat-free +COPY --link . . ENV F3DIR="/fat-free/src" @@ -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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /fat-free EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-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 a6df3aca401..3a91f8cc194 100644 --- a/frameworks/PHP/fat-free/fat-free.dockerfile +++ b/frameworks/PHP/fat-free/fat-free.dockerfile @@ -1,16 +1,16 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /fat-free WORKDIR /fat-free +COPY --link . . ENV F3DIR="/fat-free/src" @@ -19,11 +19,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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /fat-free EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /fat-free/deploy/nginx.conf From e53161275f517f0046d168d74f3a0d5e6edd0c5d Mon Sep 17 00:00:00 2001 From: Joanhey Date: Tue, 14 Jan 2025 01:28:03 +0100 Subject: [PATCH 1060/1766] [php] Reactphp update to PHP/8.4 --- frameworks/PHP/reactphp/benchmark_config.json | 4 --- frameworks/PHP/reactphp/reactphp.dockerfile | 26 +++++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frameworks/PHP/reactphp/benchmark_config.json b/frameworks/PHP/reactphp/benchmark_config.json index 8da2a6e62f9..fb29ad3c207 100644 --- a/frameworks/PHP/reactphp/benchmark_config.json +++ b/frameworks/PHP/reactphp/benchmark_config.json @@ -3,10 +3,6 @@ "tests": [{ "default": { "json_url": "/json", - "db_url": "/db", - "query_url": "/query?q=", - "fortune_url": "/fortunes", - "update_url": "/update?q=", "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", diff --git a/frameworks/PHP/reactphp/reactphp.dockerfile b/frameworks/PHP/reactphp/reactphp.dockerfile index 05f9d138a16..a46c613938f 100644 --- a/frameworks/PHP/reactphp/reactphp.dockerfile +++ b/frameworks/PHP/reactphp/reactphp.dockerfile @@ -1,29 +1,33 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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 LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq git unzip wget curl build-essential \ - php8.3-cli php8.3-mbstring php8.3-dev php8.3-xml > /dev/null + php8.4-cli php8.4-mbstring php8.4-dev php8.4-xml > /dev/null # An extension is required! # We deal with concurrencies over 1k, which stream_select doesn't support. -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 +# libuv +# RUN apt-get install -yqq libuv1-dev > /dev/null \ +# && pecl install uv-beta > /dev/null \ +# && echo "extension=uv.so" > /etc/php/8.4/cli/conf.d/uv.ini + +# libevent +RUN apt-get install -y libevent-dev > /dev/null \ + && pecl install event-3.1.4 > /dev/null \ + && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/cli/conf.d/ +COPY --link deploy/conf/* /etc/php/8.4/cli/conf.d/ WORKDIR /reactphp +COPY --link . . -COPY composer.json . -RUN composer install --prefer-dist --optimize-autoloader --no-dev --quiet - -COPY . . +RUN composer install --prefer-dist --optimize-autoloader --no-dev EXPOSE 8080 From 7113d24eec037f4600c29128e2a3362f95cb8197 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Tue, 14 Jan 2025 17:58:17 +0100 Subject: [PATCH 1061/1766] [php] Nette update to PHP/8.4 --- frameworks/PHP/nette/composer.json | 15 +++++++-------- frameworks/PHP/nette/nette.dockerfile | 13 ++++++------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/frameworks/PHP/nette/composer.json b/frameworks/PHP/nette/composer.json index 6a455dafc6b..ce416979668 100644 --- a/frameworks/PHP/nette/composer.json +++ b/frameworks/PHP/nette/composer.json @@ -6,18 +6,17 @@ "license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"], "require": { "php": ">= 7.2", - "nette/application": "^3.1", - "nette/bootstrap": "^3.1", - "nette/caching": "^3.1", - "nette/database": "^3.1", + "nette/application": "^3.2", + "nette/bootstrap": "^3.2", + "nette/caching": "^3.3", + "nette/database": "^3.2", "nette/di": "^3.0", - "nette/finder": "^2.5", + "nette/finder": "^3.0", "nette/forms": "^3.1", "nette/http": "^3.1", - "nette/mail": "^3.1", - "nette/robot-loader": "^3.3", + "nette/mail": "^4.0", "nette/security": "^3.1", - "nette/utils": "^3.2", + "nette/utils": "^4.0", "latte/latte": "^2.11 || ^3.0", "tracy/tracy": "^2.8" }, diff --git a/frameworks/PHP/nette/nette.dockerfile b/frameworks/PHP/nette/nette.dockerfile index fc917b9ca49..0e66d630510 100644 --- a/frameworks/PHP/nette/nette.dockerfile +++ b/frameworks/PHP/nette/nette.dockerfile @@ -1,28 +1,27 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-dev php8.3-curl > /dev/null + php8.4-fpm php8.4-mysql php8.4-xml php8.4-mbstring php8.4-intl php8.4-dev php8.4-curl > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -ADD ./ /nette WORKDIR /nette - +COPY --link . . #ENV NETTE_DIR="/nette/src" 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.3/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.4/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /nette EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /nette/deploy/nginx.conf 2>&1 > /dev/stderr From 679a06af91f86546c5e3ec12ec4fdd175bde8733 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Tue, 14 Jan 2025 18:05:38 +0100 Subject: [PATCH 1062/1766] [php] Leaf update to PHP/8.4 --- frameworks/PHP/leaf/leaf.dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/PHP/leaf/leaf.dockerfile b/frameworks/PHP/leaf/leaf.dockerfile index 52a4c2f704c..1ebe23e5735 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.3-cli php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl php8.3-zip > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql php8.4-xml php8.4-curl php8.4-zip > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY --link deploy/conf/* /etc/php/8.3/fpm/ +COPY --link deploy/conf/* /etc/php/8.4/fpm/ WORKDIR /leaf COPY --link . . -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/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.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /leaf/deploy/nginx.conf From 90837f309f735f4b22b8000e617adb649b217946 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Tue, 14 Jan 2025 19:20:21 +0100 Subject: [PATCH 1063/1766] Update also for Workerman --- frameworks/PHP/leaf/deploy/conf/cli-php.ini | 2 +- frameworks/PHP/leaf/leaf-workerman.dockerfile | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/PHP/leaf/deploy/conf/cli-php.ini b/frameworks/PHP/leaf/deploy/conf/cli-php.ini index bcccffbc63b..e03b6e352a9 100644 --- a/frameworks/PHP/leaf/deploy/conf/cli-php.ini +++ b/frameworks/PHP/leaf/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,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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/leaf/leaf-workerman.dockerfile b/frameworks/PHP/leaf/leaf-workerman.dockerfile index ddcc5dc928c..f26d9c999ba 100644 --- a/frameworks/PHP/leaf/leaf-workerman.dockerfile +++ b/frameworks/PHP/leaf/leaf-workerman.dockerfile @@ -7,15 +7,15 @@ 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.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip > /dev/null + php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl php8.4-zip > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y libevent-dev php8.3-dev > /dev/null \ +RUN apt-get install -y libevent-dev php8.4-dev > /dev/null \ && pecl install event-3.1.4 > /dev/null \ - && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini + && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY --link deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini WORKDIR /leaf COPY --link . . @@ -23,7 +23,7 @@ COPY --link . . EXPOSE 8080 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN composer require joanhey/adapterman:^0.6 --quiet +RUN composer require joanhey/adapterman:^0.7 --quiet RUN sed -i 's|app()->run(); //| //$app->run(); //|g' index.php From 725a2ce35c7a3197b89ebd24492d4be9866efd70 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Tue, 14 Jan 2025 20:31:32 +0100 Subject: [PATCH 1064/1766] [php] Amp update to PHP/8.4 --- frameworks/PHP/amp/amp.dockerfile | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/frameworks/PHP/amp/amp.dockerfile b/frameworks/PHP/amp/amp.dockerfile index 066337e6302..9ec0336801d 100644 --- a/frameworks/PHP/amp/amp.dockerfile +++ b/frameworks/PHP/amp/amp.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -6,20 +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 RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq git unzip wget curl build-essential \ - php8.3-cli php8.3-mbstring php8.3-dev php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-mbstring php8.4-dev php8.4-xml php8.4-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.3/cli/conf.d/uv.ini -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +#RUN pecl install uv-0.2.4 > /dev/null && echo "extension=uv.so" > /etc/php/8.4/cli/conf.d/uv.ini +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -ADD ./ /amp WORKDIR /amp - -COPY deploy/conf/* /etc/php/8.3/cli/conf.d/ +COPY --link . . +COPY deploy/conf/* /etc/php/8.4/cli/conf.d/ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer From 8ac6fdbfa7040b5356faf66f788acd39ef1e7a51 Mon Sep 17 00:00:00 2001 From: Joanhey Date: Tue, 14 Jan 2025 20:34:19 +0100 Subject: [PATCH 1065/1766] Quiet composer install --- frameworks/PHP/amp/amp.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/amp/amp.dockerfile b/frameworks/PHP/amp/amp.dockerfile index 9ec0336801d..240db763cec 100644 --- a/frameworks/PHP/amp/amp.dockerfile +++ b/frameworks/PHP/amp/amp.dockerfile @@ -22,7 +22,7 @@ COPY deploy/conf/* /etc/php/8.4/cli/conf.d/ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN composer install --prefer-dist --optimize-autoloader --no-dev +RUN composer install --prefer-dist --optimize-autoloader --no-dev --quiet EXPOSE 8080 From f3fcbdfc663175d519eac817a7c6ba43cc679696 Mon Sep 17 00:00:00 2001 From: "pavel.mash" Date: Wed, 15 Jan 2025 14:31:12 +0200 Subject: [PATCH 1066/1766] [mORMot] - upgrade to mORMot@2.3.93 before Round 23 --- frameworks/Pascal/mormot/setup_and_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 5c16c908799..af1a30ef7dc 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/53bee75f81062db0700c97dfa9dfb5e9ce408679 +URL=https://github.com/synopse/mORMot2/tarball/e5ece53ec4ac4788d356f17d2d32ea16379a65a9 #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 From e23312dfc91330da507540add07f40bf59bf789b Mon Sep 17 00:00:00 2001 From: Ajay Kidave Date: Wed, 15 Jan 2025 11:37:20 -0800 Subject: [PATCH 1067/1766] Add Clace framework --- frameworks/Python/clace/.dockerignore | 2 ++ frameworks/Python/clace/README.md | 11 +++++++++ frameworks/Python/clace/app.star | 6 +++++ frameworks/Python/clace/benchmark_config.json | 23 +++++++++++++++++++ frameworks/Python/clace/clace.dockerfile | 11 +++++++++ frameworks/Python/clace/run.sh | 19 +++++++++++++++ 6 files changed, 72 insertions(+) create mode 100644 frameworks/Python/clace/.dockerignore create mode 100755 frameworks/Python/clace/README.md create mode 100644 frameworks/Python/clace/app.star create mode 100755 frameworks/Python/clace/benchmark_config.json create mode 100644 frameworks/Python/clace/clace.dockerfile create mode 100755 frameworks/Python/clace/run.sh diff --git a/frameworks/Python/clace/.dockerignore b/frameworks/Python/clace/.dockerignore new file mode 100644 index 00000000000..9fce104ae8c --- /dev/null +++ b/frameworks/Python/clace/.dockerignore @@ -0,0 +1,2 @@ +.venv +README.md diff --git a/frameworks/Python/clace/README.md b/frameworks/Python/clace/README.md new file mode 100755 index 00000000000..f510c5c8f54 --- /dev/null +++ b/frameworks/Python/clace/README.md @@ -0,0 +1,11 @@ +# Introduction + +[Clace](https://github.com/claceio/clace) is a platform for developing and deploying internal tools. + +Clace is implemented in Go. Clace apps are written in [Starlark](https://starlark-lang.org/). Starlark is a thread-safe language with Python syntax, designed for embedding. Clace uses the [Starlark Go](https://github.com/google/starlark-go) implementation. Since apps are developed using a python like syntax, the benchmark is added under the Python category. + +# Benchmarking + +The JSON and plaintext tests are implemented. Clace supports SQLite database only currently, so the database tests are not implemented. + +The Dockerfile starts the Clace server and creates a single app which implements the benchmark apis (app.star). diff --git a/frameworks/Python/clace/app.star b/frameworks/Python/clace/app.star new file mode 100644 index 00000000000..86c0dd68346 --- /dev/null +++ b/frameworks/Python/clace/app.star @@ -0,0 +1,6 @@ +app = ace.app("testapp", + routes = [ + ace.api("/json", lambda req: {'message': 'Hello, world!'}, type=ace.JSON), + ace.api("/plaintext", lambda req: 'Hello, world!', type=ace.TEXT) + ] +) diff --git a/frameworks/Python/clace/benchmark_config.json b/frameworks/Python/clace/benchmark_config.json new file mode 100755 index 00000000000..c836299e939 --- /dev/null +++ b/frameworks/Python/clace/benchmark_config.json @@ -0,0 +1,23 @@ +{ + "framework": "clace", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "Clace", + "language": "python", + "flavor": "Starlark", + "platform": "None", + "webserver": "Clace", + "os": "Linux", + "display_name": "Clace", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Python/clace/clace.dockerfile b/frameworks/Python/clace/clace.dockerfile new file mode 100644 index 00000000000..40c8c69608b --- /dev/null +++ b/frameworks/Python/clace/clace.dockerfile @@ -0,0 +1,11 @@ +FROM python:3.11 +WORKDIR /clace/ + +RUN curl -L https://clace.io/install.sh | bash +ENV CL_HOME="/root/clhome" +ENV PATH="/root/clhome/bin:$PATH" + +COPY . . + +EXPOSE 8080 +CMD /clace/run.sh diff --git a/frameworks/Python/clace/run.sh b/frameworks/Python/clace/run.sh new file mode 100755 index 00000000000..d5dc87d345e --- /dev/null +++ b/frameworks/Python/clace/run.sh @@ -0,0 +1,19 @@ +#!/bin/sh +cd /root + +cat < /root/clhome/clace.toml +[logging] +console = false +file = false +access_logging = false + +[http] +host = "0.0.0.0" +port = 8080 +EOF + + +clace server start & +sleep 2 +clace app create --auth=none --approve /clace tfb-server:/ +tail -f /dev/null From fb6834a55b92ed740d54051e47317cc741e830b2 Mon Sep 17 00:00:00 2001 From: Roman Samoilov <2270393+rsamoilov@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:54:17 +0000 Subject: [PATCH 1068/1766] Add rage-sequel --- frameworks/Ruby/rage-sequel/Gemfile | 7 ++ frameworks/Ruby/rage-sequel/Gemfile.lock | 37 +++++++++ frameworks/Ruby/rage-sequel/README.md | 47 +++++++++++ frameworks/Ruby/rage-sequel/Rakefile | 1 + .../app/controllers/application_controller.rb | 2 + .../app/controllers/benchmarks_controller.rb | 79 +++++++++++++++++++ .../rage-sequel/app/views/fortunes.html.erb | 12 +++ .../Ruby/rage-sequel/benchmark_config.json | 30 +++++++ frameworks/Ruby/rage-sequel/config.ru | 3 + .../Ruby/rage-sequel/config/application.rb | 14 ++++ .../config/environments/development.rb | 4 + .../config/environments/production.rb | 3 + .../rage-sequel/config/initializers/sequel.rb | 43 ++++++++++ frameworks/Ruby/rage-sequel/config/routes.rb | 10 +++ frameworks/Ruby/rage-sequel/lib/.keep | 0 .../Ruby/rage-sequel/rage-sequel.dockerfile | 13 +++ 16 files changed, 305 insertions(+) create mode 100644 frameworks/Ruby/rage-sequel/Gemfile create mode 100644 frameworks/Ruby/rage-sequel/Gemfile.lock create mode 100755 frameworks/Ruby/rage-sequel/README.md create mode 100644 frameworks/Ruby/rage-sequel/Rakefile create mode 100644 frameworks/Ruby/rage-sequel/app/controllers/application_controller.rb create mode 100644 frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb create mode 100644 frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb create mode 100755 frameworks/Ruby/rage-sequel/benchmark_config.json create mode 100644 frameworks/Ruby/rage-sequel/config.ru create mode 100644 frameworks/Ruby/rage-sequel/config/application.rb create mode 100644 frameworks/Ruby/rage-sequel/config/environments/development.rb create mode 100644 frameworks/Ruby/rage-sequel/config/environments/production.rb create mode 100644 frameworks/Ruby/rage-sequel/config/initializers/sequel.rb create mode 100644 frameworks/Ruby/rage-sequel/config/routes.rb create mode 100644 frameworks/Ruby/rage-sequel/lib/.keep create mode 100644 frameworks/Ruby/rage-sequel/rage-sequel.dockerfile diff --git a/frameworks/Ruby/rage-sequel/Gemfile b/frameworks/Ruby/rage-sequel/Gemfile new file mode 100644 index 00000000000..4ee2e620f6e --- /dev/null +++ b/frameworks/Ruby/rage-sequel/Gemfile @@ -0,0 +1,7 @@ +source "https://rubygems.org" + +gem "rage-rb", "~> 1.10" + +gem "pg", "~> 1.0" +gem 'sequel', '~> 5.0' +gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock new file mode 100644 index 00000000000..d1ad00bb988 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -0,0 +1,37 @@ +GEM + remote: https://rubygems.org/ + specs: + bigdecimal (3.1.9) + pg (1.5.9) + rack (2.2.10) + rack-test (2.2.0) + rack (>= 1.3) + rage-iodine (4.0.0) + rage-rb (1.11.0) + rack (~> 2.0) + rack-test (~> 2.1) + rage-iodine (~> 4.0) + rake (>= 12.0) + thor (~> 1.0) + zeitwerk (~> 2.6) + rake (13.2.1) + sequel (5.88.0) + bigdecimal + sequel_pg (1.17.1) + pg (>= 0.18.0, != 1.2.0) + sequel (>= 4.38.0) + thor (1.3.2) + zeitwerk (2.7.1) + +PLATFORMS + ruby + x86_64-darwin-20 + +DEPENDENCIES + pg (~> 1.0) + rage-rb (~> 1.10) + sequel (~> 5.0) + sequel_pg (~> 1.6) + +BUNDLED WITH + 2.5.6 diff --git a/frameworks/Ruby/rage-sequel/README.md b/frameworks/Ruby/rage-sequel/README.md new file mode 100755 index 00000000000..d299d0834ba --- /dev/null +++ b/frameworks/Ruby/rage-sequel/README.md @@ -0,0 +1,47 @@ +# Rage Benchmarking Test + +Rage is a fast web framework compatible with Rails. It uses an event-driven architecture and implements a lightweight, cooperative concurrency model based on Ruby Fibers. + +https://github.com/rage-rb/rage + +### Test Type Implementation Source Code + +* [JSON](app/controllers/benchmarks_controller.rb) +* [PLAINTEXT](app/controllers/benchmarks_controller.rb) +* [DB](app/controllers/benchmarks_controller.rb) +* [QUERY](app/controllers/benchmarks_controller.rb) +* [UPDATE](app/controllers/benchmarks_controller.rb) +* [FORTUNES](app/controllers/benchmarks_controller.rb) + +## Important Libraries + +The tests were run with: + +* [Sequel](https://rubygems.org/gems/sequel) +* [PG](https://rubygems.org/gems/pg) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/queries?queries= + +### UPDATE + +http://localhost:8080/updates?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Ruby/rage-sequel/Rakefile b/frameworks/Ruby/rage-sequel/Rakefile new file mode 100644 index 00000000000..046f1fcbd8d --- /dev/null +++ b/frameworks/Ruby/rage-sequel/Rakefile @@ -0,0 +1 @@ +require_relative "config/application" diff --git a/frameworks/Ruby/rage-sequel/app/controllers/application_controller.rb b/frameworks/Ruby/rage-sequel/app/controllers/application_controller.rb new file mode 100644 index 00000000000..c3238c52392 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < RageController::API +end diff --git a/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb b/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb new file mode 100644 index 00000000000..b02e2d19416 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +class BenchmarksController < ApplicationController + ALL_DB_IDS = (1..10_000).to_a + FORTUNES_TEMPLATE = ERB.new(Rage.root.join("app/views/fortunes.html.erb").read) + + before_action do + headers["server"] = "rage" + end + + def json + render json: { message: "Hello, World!" } + end + + def plaintext + render plain: "Hello, World!" + end + + def db + render json: World.with_pk(random_id).values + end + + def queries + worlds = DB.synchronize do + requested_ids.map do |id| + World.with_pk(id) + end + end + + render json: worlds.map!(&:values) + end + + def fortunes + records = Fortune.all + + records << Fortune.new(id: 0, message: "Additional fortune added at request time.") + records.sort_by!(&:message) + + render plain: FORTUNES_TEMPLATE.result(binding) + headers["content-type"] = "text/html; charset=utf-8" + end + + def updates + worlds = nil + + DB.synchronize do + worlds = requested_ids.map do |id| + world = World.with_pk(id) + new_value = random_id + new_value = random_id while new_value == world.randomnumber + world.randomnumber = new_value + + world + end + + World.batch_update(worlds) + end + + render json: worlds.map!(&:values) + end + + private + + def requested_ids + num = params[:queries].to_i + + if num > 500 + num = 500 + elsif num < 1 + num = 1 + end + + ALL_DB_IDS.sample(num) + end + + def random_id + Random.rand(9_999) + 1 + end +end diff --git a/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb new file mode 100644 index 00000000000..2614ca7a7b2 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb @@ -0,0 +1,12 @@ + + + Fortunes + + + + <% records.each do |record| %> + + <% end %> +
      idmessage
      <%= record.id %><%= CGI.escape_html(record.message) %>
      + + diff --git a/frameworks/Ruby/rage-sequel/benchmark_config.json b/frameworks/Ruby/rage-sequel/benchmark_config.json new file mode 100755 index 00000000000..e4324c06062 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/benchmark_config.json @@ -0,0 +1,30 @@ +{ + "framework": "rage-sequel", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "postgres", + "framework": "Rage", + "language": "Ruby", + "flavor": "None", + "orm": "Full", + "platform": "Rack", + "webserver": "Rage-Iodine", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rage-Sequel", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Ruby/rage-sequel/config.ru b/frameworks/Ruby/rage-sequel/config.ru new file mode 100644 index 00000000000..049a1ad509d --- /dev/null +++ b/frameworks/Ruby/rage-sequel/config.ru @@ -0,0 +1,3 @@ +require_relative "config/application" + +run Rage.application diff --git a/frameworks/Ruby/rage-sequel/config/application.rb b/frameworks/Ruby/rage-sequel/config/application.rb new file mode 100644 index 00000000000..9af142340b3 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/config/application.rb @@ -0,0 +1,14 @@ +require "bundler/setup" +require "rage" +Bundler.require(*Rage.groups) + +require "rage/all" + +Rage.configure do + # use this to add settings that are constant across all environments +end + +require "erb" +require "cgi" + +require "rage/setup" diff --git a/frameworks/Ruby/rage-sequel/config/environments/development.rb b/frameworks/Ruby/rage-sequel/config/environments/development.rb new file mode 100644 index 00000000000..35d9e7ae7d6 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/config/environments/development.rb @@ -0,0 +1,4 @@ +Rage.configure do + config.server.workers_count = -1 + config.logger = Rage::Logger.new(STDOUT) +end diff --git a/frameworks/Ruby/rage-sequel/config/environments/production.rb b/frameworks/Ruby/rage-sequel/config/environments/production.rb new file mode 100644 index 00000000000..0189c7742fa --- /dev/null +++ b/frameworks/Ruby/rage-sequel/config/environments/production.rb @@ -0,0 +1,3 @@ +Rage.configure do + config.logger = nil +end diff --git a/frameworks/Ruby/rage-sequel/config/initializers/sequel.rb b/frameworks/Ruby/rage-sequel/config/initializers/sequel.rb new file mode 100644 index 00000000000..1a2e070e9d7 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/config/initializers/sequel.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require "etc" + +SEQUEL_NO_ASSOCIATIONS = true +Sequel.extension :fiber_concurrency + +# Determine thread pool size and timeout +opts = { + max_connections: (2 * Math.log(256 / Etc.nprocessors)).floor, + pool_timeout: 10 +} + +DB = Sequel.connect \ + '%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}' % { + :adapter=>'postgres', + :host=>'tfb-database', + :database=>'hello_world', + :user=>'benchmarkdbuser', + :password=>'benchmarkdbpass' + }, opts + +# Define ORM models +class World < Sequel::Model(:World) + def self.batch_update(worlds) + ids = [] + sql = String.new("UPDATE world SET randomnumber = CASE id ") + worlds.each do |world| + sql << "when #{world.id} then #{world.randomnumber} " + ids << world.id + end + sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})" + DB.run(sql) + end +end + +class Fortune < Sequel::Model(:Fortune) + # Allow setting id to zero (0) per benchmark requirements + unrestrict_primary_key +end + +[World, Fortune].each(&:freeze) +DB.freeze diff --git a/frameworks/Ruby/rage-sequel/config/routes.rb b/frameworks/Ruby/rage-sequel/config/routes.rb new file mode 100644 index 00000000000..98def92a7e7 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/config/routes.rb @@ -0,0 +1,10 @@ +Rage.routes.draw do + root to: ->(env) { [200, {}, "It works!"] } + + get "json", to: "benchmarks#json" + get "plaintext", to: "benchmarks#plaintext" + get "db", to: "benchmarks#db" + get "queries", to: "benchmarks#queries" + get "fortunes", to: "benchmarks#fortunes" + get "updates", to: "benchmarks#updates" +end diff --git a/frameworks/Ruby/rage-sequel/lib/.keep b/frameworks/Ruby/rage-sequel/lib/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/Ruby/rage-sequel/rage-sequel.dockerfile b/frameworks/Ruby/rage-sequel/rage-sequel.dockerfile new file mode 100644 index 00000000000..096b256fe18 --- /dev/null +++ b/frameworks/Ruby/rage-sequel/rage-sequel.dockerfile @@ -0,0 +1,13 @@ +FROM ruby:3.4 + +EXPOSE 8080 +WORKDIR /rage-sequel + +COPY Gemfile* /rage-sequel/ +RUN bundle install --jobs=8 +COPY . /rage-sequel + +ENV RUBY_YJIT_ENABLE=1 +ENV BUNDLE_FORCE_RUBY_PLATFORM=true + +CMD bundle exec rage s -b 0.0.0.0 -p 8080 -e production From 74b3ad96fa70d6c30d7abddfe45b476dce220e4c Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Thu, 16 Jan 2025 17:32:14 +0800 Subject: [PATCH 1069/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/config.toml | 10 +-- frameworks/Java/smart-socket/pom.xml | 2 +- .../java/org/smartboot/http/Bootstrap.java | 83 +++++++++---------- .../http/MultipleQueriesHandler.java | 7 +- .../smartboot/http/SingleQueryHandler.java | 7 +- .../org/smartboot/http/UpdateHandler.java | 9 +- 6 files changed, 57 insertions(+), 61 deletions(-) diff --git a/frameworks/Java/smart-socket/config.toml b/frameworks/Java/smart-socket/config.toml index fbebc43a6a3..54e7e13d9d7 100644 --- a/frameworks/Java/smart-socket/config.toml +++ b/frameworks/Java/smart-socket/config.toml @@ -1,12 +1,12 @@ [framework] -name = "smart-socket" +name = "feat" [main] urls.plaintext = "/plaintext" urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" +#urls.db = "/db" +#urls.query = "/queries?queries=" +#urls.update = "/updates?queries=" approach = "Realistic" classification = "Platform" database = "Postgres" @@ -15,7 +15,7 @@ os = "Linux" orm = "Raw" platform = "smartboot" webserver = "None" -versus = "smart-socket" +versus = "feat" [smart-servlet] urls.plaintext = "/plaintext" diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index afdeea27141..4fe3e7a155f 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.7 + 2.8 5.0.0 0.9.23 diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 4875d68c8d8..396b6d02900 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -8,16 +8,12 @@ package org.smartboot.http; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; import org.smartboot.Message; +import tech.smartboot.feat.core.Feat; +import tech.smartboot.feat.core.common.enums.HeaderValueEnum; +import tech.smartboot.feat.core.server.HttpHandler; import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; -import tech.smartboot.feat.core.server.HttpServer; -import tech.smartboot.feat.core.server.HttpServerHandler; -import tech.smartboot.feat.core.server.handler.HttpRouteHandler; - -import javax.sql.DataSource; public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); @@ -25,45 +21,42 @@ public class Bootstrap { public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - HttpServer bootstrap = new HttpServer(); - bootstrap.configuration() - .threadNum(cpuNum + 1) - .headerLimiter(0) - .readBufferSize(1024 * 4) - .writeBufferSize(1024 * 4); - bootstrap.httpHandler(new HttpServerHandler() { - @Override - public void handle(HttpRequest request, HttpResponse response) throws Throwable { - if ("/plaintext".equals(request.getRequestURI())) { - response.setContentLength(body.length); - response.setContentType("text/plain; charset=UTF-8"); - response.write(body); - } else if ("/json".equals(request.getRequestURI())) { - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); - } + Feat.createHttpServer(options -> { + options.threadNum(cpuNum + 1) + .headerLimiter(0) + .readBufferSize(1024 * 4) + .writeBufferSize(1024 * 4); + }).httpHandler(request -> { + HttpResponse response = request.getResponse(); + if ("/plaintext".equals(request.getRequestURI())) { + response.setContentLength(body.length); + response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); + response.write(body); + } else if ("/json".equals(request.getRequestURI())) { + response.setContentType("application/json"); + JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); } - }).setPort(8080).start(); + }).listen(8080); } - private static void initDB(HttpRouteHandler routeHandle) { - try { - Class.forName("org.postgresql.Driver"); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - HikariConfig config = new HikariConfig(); - config.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world"); - config.setUsername("benchmarkdbuser"); - config.setPassword("benchmarkdbpass"); - config.setMaximumPoolSize(64); - config.addDataSourceProperty("cachePrepStmts", "true"); - config.addDataSourceProperty("prepStmtCacheSize", "250"); - config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - DataSource dataSource = new HikariDataSource(config); - routeHandle.route("/db", new SingleQueryHandler(dataSource)) - .route("/queries", new MultipleQueriesHandler(dataSource)) - .route("/updates", new UpdateHandler(dataSource)); -// .route("/fortunes", new FortunesHandler(dataSource)); - } +// private static void initDB(HttpRouteHandler routeHandle) { +// try { +// Class.forName("org.postgresql.Driver"); +// } catch (ClassNotFoundException e) { +// e.printStackTrace(); +// } +// HikariConfig config = new HikariConfig(); +// config.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world"); +// config.setUsername("benchmarkdbuser"); +// config.setPassword("benchmarkdbpass"); +// config.setMaximumPoolSize(64); +// config.addDataSourceProperty("cachePrepStmts", "true"); +// config.addDataSourceProperty("prepStmtCacheSize", "250"); +// config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); +// DataSource dataSource = new HikariDataSource(config); +// routeHandle.route("/db", new SingleQueryHandler(dataSource)) +// .route("/queries", new MultipleQueriesHandler(dataSource)) +// .route("/updates", new UpdateHandler(dataSource)); +//// .route("/fortunes", new FortunesHandler(dataSource)); +// } } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index ac4807a9284..f9b6b4faa5b 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -4,7 +4,7 @@ import tech.smartboot.feat.core.common.utils.NumberUtils; import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; -import tech.smartboot.feat.core.server.HttpServerHandler; +import tech.smartboot.feat.core.server.handler.BaseHttpHandler; import javax.sql.DataSource; import java.io.IOException; @@ -19,7 +19,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class MultipleQueriesHandler extends HttpServerHandler { +public class MultipleQueriesHandler extends BaseHttpHandler { private DataSource dataSource; public MultipleQueriesHandler(DataSource dataSource) { @@ -27,7 +27,8 @@ public MultipleQueriesHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { + public void handle(HttpRequest httpRequest, CompletableFuture completableFuture) throws IOException { + HttpResponse response = httpRequest.getResponse(); Thread.startVirtualThread(() -> { try { int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index 52a96b9ca57..12898f62b7d 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -3,7 +3,7 @@ import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; -import tech.smartboot.feat.core.server.HttpServerHandler; +import tech.smartboot.feat.core.server.handler.BaseHttpHandler; import javax.sql.DataSource; import java.io.IOException; @@ -18,7 +18,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class SingleQueryHandler extends HttpServerHandler { +public class SingleQueryHandler extends BaseHttpHandler { private DataSource dataSource; public SingleQueryHandler(DataSource dataSource) { @@ -26,7 +26,8 @@ public SingleQueryHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture completableFuture) throws IOException { + public void handle(HttpRequest httpRequest, CompletableFuture completableFuture) throws IOException { + HttpResponse response = httpRequest.getResponse(); Thread.startVirtualThread(() -> { try { World world = new World(); diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index 3217adea343..b2b37a5f424 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -2,9 +2,9 @@ import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.server.HttpHandler; import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; -import tech.smartboot.feat.core.server.HttpServerHandler; import javax.sql.DataSource; import java.io.IOException; @@ -19,7 +19,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class UpdateHandler extends HttpServerHandler { +public class UpdateHandler implements HttpHandler { private DataSource dataSource; public UpdateHandler(DataSource dataSource) { @@ -27,8 +27,9 @@ public UpdateHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException { - int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); + public void handle(HttpRequest request) throws IOException { + HttpResponse response = request.getResponse(); + int queries = Math.min(Math.max(NumberUtils.toInt(request.getParameter("queries"), 1), 1), 500); World[] worlds = new World[queries]; StringJoiner updateSql = new StringJoiner( ", ", From 8434091cb8f3719471b116d644d6d3109910ef9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 17:02:59 +0000 Subject: [PATCH 1070/1766] Bump mongoose from 8.8.3 to 8.9.5 in /frameworks/JavaScript/hapi Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.8.3 to 8.9.5. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/8.8.3...8.9.5) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/hapi/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/hapi/package.json b/frameworks/JavaScript/hapi/package.json index d38a23b49c9..1865dffe88e 100644 --- a/frameworks/JavaScript/hapi/package.json +++ b/frameworks/JavaScript/hapi/package.json @@ -8,7 +8,7 @@ "async": "2.1.5", "bluebird": "3.4.7", "handlebars": "4.3.0", - "mongoose": "8.8.3", + "mongoose": "8.9.5", "mysql": "2.16.0", "mysql2": "3.9.8", "pg": "8.5.1", From 3eed80e98219d4b73722f654602446c3db5de303 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 17:03:15 +0000 Subject: [PATCH 1071/1766] Bump mongoose from 8.8.3 to 8.9.5 in /frameworks/JavaScript/express Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.8.3 to 8.9.5. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/8.8.3...8.9.5) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 5655ae91033..9f022f3ac69 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -7,7 +7,7 @@ "dateformat": "3.0.3", "escape-html": "1.0.3", "express": "4.18.2", - "mongoose": "8.8.3", + "mongoose": "8.9.5", "mysql2": "3.9.8", "pg": "8.5.0", "pg-promise": "10.7.3", From 9b0e1c3eacb365fb09b9d013481a6a1632dd724f Mon Sep 17 00:00:00 2001 From: Roman Samoilov <2270393+rsamoilov@users.noreply.github.com> Date: Thu, 16 Jan 2025 18:12:12 +0000 Subject: [PATCH 1072/1766] Update connections count --- frameworks/Ruby/rage-sequel/config/initializers/sequel.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/config/initializers/sequel.rb b/frameworks/Ruby/rage-sequel/config/initializers/sequel.rb index 1a2e070e9d7..273694b7b15 100644 --- a/frameworks/Ruby/rage-sequel/config/initializers/sequel.rb +++ b/frameworks/Ruby/rage-sequel/config/initializers/sequel.rb @@ -1,13 +1,11 @@ # frozen_string_literal: true -require "etc" - SEQUEL_NO_ASSOCIATIONS = true Sequel.extension :fiber_concurrency # Determine thread pool size and timeout opts = { - max_connections: (2 * Math.log(256 / Etc.nprocessors)).floor, + max_connections: 512, pool_timeout: 10 } From 111728fe7646dd8f531414f6021acd71289008f3 Mon Sep 17 00:00:00 2001 From: Petrik Date: Thu, 16 Jan 2025 19:14:46 +0100 Subject: [PATCH 1073/1766] [ruby/roda-sequel] Detect workers for Iodine +------------------------------+---------+------+------+-----+-----+-------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|weighted_score| +------------------------------+---------+------+------+-----+-----+-------+--------------+ | master| 227545| 22971|213942|52774|37141| 49660| 2923| |roda-sequel/iodine-set-workers| 327473| 25126|276279|89255|81149| 63912| 4227| +------------------------------+---------+------+------+-----+-----+-------+--------------+ --- .../Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile index 05851b9f9f1..c7f9fe856d1 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile @@ -18,4 +18,4 @@ ENV DBTYPE=postgresql EXPOSE 8080 -CMD bundle exec iodine -p 8080 +CMD bundle exec iodine -p 8080 -w $(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From bf45c1d47390a5c8f15bf504e0c1debcfd592ae8 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Tue, 14 Jan 2025 22:42:30 +0100 Subject: [PATCH 1074/1766] [ReactPHP] Add WyriHaximus as maintainer --- frameworks/PHP/reactphp/benchmark_config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/PHP/reactphp/benchmark_config.json b/frameworks/PHP/reactphp/benchmark_config.json index fb29ad3c207..eb04329ba1a 100644 --- a/frameworks/PHP/reactphp/benchmark_config.json +++ b/frameworks/PHP/reactphp/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "reactphp", + "maintainers": ["WyriHaximus"], "tests": [{ "default": { "json_url": "/json", From 4541529762fe4dd3ff89d835f6762cb652bcfbf4 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Wed, 15 Jan 2025 22:59:13 +0100 Subject: [PATCH 1075/1766] [ReactPHP] Handle uncaught errors by sending their error message as response back --- frameworks/PHP/reactphp/app.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frameworks/PHP/reactphp/app.php b/frameworks/PHP/reactphp/app.php index 4f9dd816652..bea0c65038d 100644 --- a/frameworks/PHP/reactphp/app.php +++ b/frameworks/PHP/reactphp/app.php @@ -10,6 +10,7 @@ use React\Promise\PromiseInterface; use function React\Promise\all; +use function React\Promise\resolve; /** @return Closure(Request):ResponseInterface */ function requestHandler(): Closure @@ -29,7 +30,7 @@ function requestHandler(): Closure }; return static function (Request $request) use ($world, $fortune, $update): ResponseInterface | PromiseInterface { - return match($request->getUri()->getPath()) { + return resolve((match($request->getUri()->getPath()) { '/plaintext' => Response::plaintext('Hello, World!'), '/json' => Response::json(['message' => 'Hello, World!']), '/db' => db($world), @@ -38,7 +39,9 @@ function requestHandler(): Closure '/update' => updateraw(queryCount($request), $world, $update), // '/info' => info(), default => new Response(404, [], 'Error 404'), - }; + }))->catch( + static fn (Throwable $error): PromiseInterface => resolve(Response::plaintext($error->getMessage())->withStatus(500)), + ); }; } From b84d8aea9d5094562a7d0f73c4282d0c588b3894 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 17 Jan 2025 15:36:24 +0800 Subject: [PATCH 1076/1766] update new test --- frameworks/C++/paozhu/paozhu.dockerfile | 28 +- .../common/autocontrolmethod.hpp | 27 +- .../controller/include/techempower.h | 20 +- .../controller/src/techempower.cpp | 389 +- .../paozhu_benchmark/models/Fortune.cpp | 20 +- .../paozhu/paozhu_benchmark/models/World.cpp | 20 +- .../paozhu_benchmark/models/include/Fortune.h | 18 +- .../paozhu_benchmark/models/include/World.h | 18 +- .../orm/include/fortunebase.h | 4811 +++++++++-------- .../paozhu_benchmark/orm/include/worldbase.h | 4649 ++++++++-------- 10 files changed, 5140 insertions(+), 4860 deletions(-) mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 7381d0e9ac9..6b91336fdaa 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -18,24 +18,24 @@ WORKDIR / # RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip -# RUN rm -Rf ./paozhu/controller -# RUN rm -Rf ./paozhu/libs -# RUN rm -Rf ./paozhu/view -# RUN rm -Rf ./paozhu/viewsrc -# RUN rm -Rf ./paozhu/orm -# RUN rm -Rf ./paozhu/models -# RUN rm -Rf ./paozhu/common +RUN rm -Rf ./paozhu/controller +RUN rm -Rf ./paozhu/libs +RUN rm -Rf ./paozhu/view +RUN rm -Rf ./paozhu/viewsrc +RUN rm -Rf ./paozhu/orm +RUN rm -Rf ./paozhu/models +RUN rm -Rf ./paozhu/common -# COPY ./paozhu_benchmark/controller ./paozhu/ -# COPY ./paozhu_benchmark/libs ./paozhu/ -# COPY ./paozhu_benchmark/view ./paozhu/ -# COPY ./paozhu_benchmark/viewsrc ./paozhu/ +COPY ./paozhu_benchmark/controller ./paozhu/ +COPY ./paozhu_benchmark/libs ./paozhu/ +COPY ./paozhu_benchmark/view ./paozhu/ +COPY ./paozhu_benchmark/viewsrc ./paozhu/ -# COPY ./paozhu_benchmark/orm ./paozhu/ -# COPY ./paozhu_benchmark/models ./paozhu/ -# COPY ./paozhu_benchmark/common ./paozhu/ +COPY ./paozhu_benchmark/orm ./paozhu/ +COPY ./paozhu_benchmark/models ./paozhu/ +COPY ./paozhu_benchmark/common ./paozhu/ # RUN ls -l ./paozhu # RUN pwd diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp index 46d8979692a..b793d7f8d5e 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp @@ -9,14 +9,21 @@ #include "httppeer.h" #include "techempower.h" + +namespace http +{ + + void _initauto_control_httpmethodregto(std::map &methodcallback) + { + struct regmethold_t temp; -namespace http -{ - void _initauto_control_httpmethodregto(std::map &methodcallback) - { - struct regmethold_t temp; + } + + void _initauto_co_control_httpmethodregto(std::map &methodcallback) + { + struct regmethold_co_t temp; temp.pre = nullptr; temp.regfun = techempowerplaintext; methodcallback.emplace("plaintext",temp); @@ -54,8 +61,16 @@ namespace http } -} + void _initauto_co_domain_httpmethodregto(std::map> &domain_methodcallback) + { + struct regmethold_co_t temp; + std::map methodcallback; + std::map>::iterator domain_iterator; + + } + +} #endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h old mode 100755 new mode 100644 index f1697f616b9..ce43babe19f --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h @@ -5,15 +5,13 @@ #include "httppeer.h" namespace http -{ - - - std::string techempowerplaintext(std::shared_ptr peer); - std::string techempowerjson(std::shared_ptr peer); - std::string techempowerdb(std::shared_ptr peer); - std::string techempowerqueries(std::shared_ptr peer); - std::string techempowerfortunes(std::shared_ptr peer); - std::string techempowerupdates(std::shared_ptr peer); - std::string techempowercached_queries(std::shared_ptr peer); - std::string techempowercached_db(std::shared_ptr peer); +{ + asio::awaitable techempowerplaintext(std::shared_ptr peer); + asio::awaitable techempowerjson(std::shared_ptr peer); + asio::awaitable techempowerdb(std::shared_ptr peer); + asio::awaitable techempowerqueries(std::shared_ptr peer); + asio::awaitable techempowerfortunes(std::shared_ptr peer); + asio::awaitable techempowerupdates(std::shared_ptr peer); + asio::awaitable techempowercached_queries(std::shared_ptr peer); + asio::awaitable techempowercached_db(std::shared_ptr peer); } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index f8dfe230acd..f3111732864 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -6,236 +6,245 @@ #include #include "httppeer.h" #include "techempower.h" +#include "techempower_json.h" #include "datetime.h" #include "func.h" #include "pzcache.h" #include "json_reflect_headers.h" -#include "techempower_json.h" namespace http { - //@urlpath(null,plaintext) - std::string techempowerplaintext(std::shared_ptr peer) +//@urlpath(null,plaintext) +asio::awaitable techempowerplaintext(std::shared_ptr peer) +{ + peer->type("text/plain; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + peer->output = "Hello, World!"; + co_return ""; +} + +//@urlpath(null,json) +asio::awaitable techempowerjson(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + struct techempower_outjson_t a; + a.message = "Hello, World!"; + peer->output = json_encode(a); + co_return ""; +} + +//@urlpath(null,db) +asio::awaitable techempowerdb(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + auto myworld = orm::World(); + unsigned int rd_num = rand_range(1, 10000); + myworld.where("id", rd_num); + myworld.limit(1); + co_await myworld.async_fetch_one(); + peer->output = myworld.data_tojson(); + co_return ""; +} + +//@urlpath(null,queries) +asio::awaitable techempowerqueries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + unsigned int get_num = peer->get["queries"].to_int(); + if (get_num == 0) { - peer->type("text/plain; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - peer->output = "Hello, World!"; - return ""; + get_num = 1; } - - //@urlpath(null,json) - std::string techempowerjson(std::shared_ptr peer) + else if (get_num > 500) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - struct techempower_outjson_t a; - a.message = "Hello, World!"; - peer->output = json_encode(a); - return ""; + get_num = 500; } - - //@urlpath(null,db) - std::string techempowerdb(std::shared_ptr peer) + auto myworld = orm::World(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - auto myworld = orm::World(); + myworld.wheresql.clear(); unsigned int rd_num = rand_range(1, 10000); - myworld.get_one(rd_num); - - peer->output = myworld.data_tojson(); - return ""; + myworld.where("id", rd_num); + co_await myworld.async_fetch_append(); } - //@urlpath(null,queries) - std::string techempowerqueries(std::shared_ptr peer) - { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); + peer->output = myworld.to_json(); + co_return ""; +} - unsigned int get_num = peer->get["queries"].to_int(); - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) - { - myworld.wheresql.clear(); - unsigned int rd_num = rand_range(1, 10000); - myworld.where("id", rd_num).fetch_append(); - } - - peer->output = myworld.to_json(); - return ""; +//@urlpath(null,fortunes) +asio::awaitable techempowerfortunes(std::shared_ptr peer) +{ + peer->type("text/html; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + auto myfortune = orm::Fortune(); + co_await myfortune.async_fetch(); + myfortune.data.id = 0; + myfortune.data.message = "Additional fortune added at request time."; + myfortune.record.push_back(myfortune.data); + + std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) + { return lhs.message < rhs.message; }); + peer->val["list"].set_array(); + OBJ_ARRAY item; + for (unsigned int i = 0; i < myfortune.record.size(); i++) + { + item["id"] = myfortune.record[i].id; + item["message"] = html_encode(myfortune.record[i].message); + peer->val["list"].push(item); } + peer->view("techempower/fortunes"); + // peer->output = "Fortunes"; + // for (unsigned int i = 0; i < myfortune.record.size(); i++) + // { + // peer->output += ""; + // } + // peer->output += "
      idmessage
      " + std::to_string(myfortune.record[i].id) + "" + html_encode(myfortune.record[i].message) + "
      "; + co_return ""; +} + +//@urlpath(null,updates) +asio::awaitable techempowerupdates(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + unsigned int get_num = peer->get["queries"].to_int(); - //@urlpath(null,fortunes) - std::string techempowerfortunes(std::shared_ptr peer) + if (get_num == 0) { - peer->type("text/html; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - - auto myfortune = orm::Fortune(); - myfortune.fetch(); - myfortune.data.id = 0; - myfortune.data.message = "Additional fortune added at request time."; - myfortune.record.push_back(myfortune.data); - - std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) - { return lhs.message < rhs.message; }); - peer->val["list"].set_array(); - OBJ_ARRAY item; - for (unsigned int i = 0; i < myfortune.record.size(); i++) - { - item["id"] = myfortune.record[i].id; - item["message"] = html_encode(myfortune.record[i].message); - peer->val["list"].push(item); - } - - peer->view("techempower/fortunes"); - return ""; + get_num = 1; } - - //@urlpath(null,updates) - std::string techempowerupdates(std::shared_ptr peer) + else if (get_num > 500) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - unsigned int get_num = peer->get["queries"].to_int(); - - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - myworld.record.clear(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.clear(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + myworld.where("id", rand_range(1, 10000)); + co_await myworld.async_fetch_append(); + if (myworld.effect() > 0) { - myworld.wheresql.clear(); - myworld.where("id", rand_range(1, 10000)).fetch_append(); - if (myworld.effect() > 0) - { - unsigned int j = myworld.record.size() - 1; - myworld.data.randomnumber = rand_range(1, 10000); - myworld.record[j].randomnumber = myworld.data.randomnumber; - myworld.update("randomnumber"); - } + unsigned int j = myworld.record.size() - 1; + myworld.data.randomnumber = rand_range(1, 10000); + myworld.record[j].randomnumber = myworld.data.randomnumber; + co_await myworld.async_update("randomnumber"); } - peer->output = myworld.to_json(); - return ""; } + peer->output = myworld.to_json(); + co_return ""; +} - //@urlpath(null,cached-queries) - std::string techempowercached_queries(std::shared_ptr peer) - { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); +//@urlpath(null,cached-queries) +asio::awaitable techempowercached_queries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "alldatacache"; + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "alldatacache"; - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); - std::vector allcachedata_array; - allcachedata_array.reserve(10000); - // create rand data to cache - if (temp_cache.check(mycacheid) > -1) - { - allcachedata_array = temp_cache.get(mycacheid); - } - else - { - allcachedata_array.resize(10000); - for (unsigned int i = 0; i < 10000; i++) - { - allcachedata_array[i].id = i + 1; - allcachedata_array[i].randomnumber = rand_range(1, 10000); - } - temp_cache.save(mycacheid, allcachedata_array, 120); - } - // get rand data from cache - mycacheid = "my" + std::to_string(get_num); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) + std::vector allcachedata_array; + allcachedata_array.reserve(10000); + //create rand data to cache + if (temp_cache.check(mycacheid) > -1) + { + allcachedata_array = temp_cache.get(mycacheid); + } + else + { + allcachedata_array.resize(10000); + for (unsigned int i = 0; i < 10000; i++) { - myworld.record = temp_cache.get(mycacheid); + allcachedata_array[i].id = i + 1; + allcachedata_array[i].randomnumber = rand_range(1, 10000); } - else + temp_cache.save(mycacheid, allcachedata_array, 360); + } + //get rand data from cache + mycacheid = "my" + std::to_string(get_num); + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + if (allcachedata_array.size() == 10000) { - if (allcachedata_array.size() == 10000) + for (unsigned int i = 0; i < get_num; i++) { - for (unsigned int i = 0; i < get_num; i++) - { - unsigned int temp_rid = rand_range(0, 9999); - myworld.record.push_back(allcachedata_array[temp_rid]); - } + unsigned int temp_rid = rand_range(0, 9999); + myworld.record.push_back(allcachedata_array[temp_rid]); } - temp_cache.save(mycacheid, myworld.record, 120); } - - peer->output = myworld.to_json(); - return ""; + temp_cache.save(mycacheid, myworld.record, 360); } - //@urlpath(null,cached-db) - std::string techempowercached_db(std::shared_ptr peer) + peer->output = myworld.to_json(); + co_return ""; +} + +//@urlpath(null,cached-db) +asio::awaitable techempowercached_db(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + //this test from database to cache + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - // this test from database to cache - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "my" + std::to_string(get_num); + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "my" + std::to_string(get_num); - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) - { - myworld.record = temp_cache.get(mycacheid); - } - else + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + std::vector cacheid; + for (unsigned int i = 0; i < get_num; i++) { - std::vector cacheid; - for (unsigned int i = 0; i < get_num; i++) - { - cacheid.push_back(rand_range(1, 10000)); - } - - std::string sqlstr = array_to_sql(cacheid); - myworld.whereIn("id", sqlstr).fetch(); - temp_cache.save(mycacheid, myworld.record, 120); + cacheid.push_back(rand_range(1, 10000)); } - peer->output = myworld.to_json(); - return ""; + std::string sqlstr = array_to_sql(cacheid); + myworld.whereIn("id", sqlstr); + co_await myworld.async_fetch(); + temp_cache.save(mycacheid, myworld.record, 360); } -} // namespace http \ No newline at end of file + peer->output = myworld.to_json(); + co_return ""; +} + +}// namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp index 160924992af..361a81acb35 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp @@ -1,16 +1,14 @@ -#include "mysqlmodel.hpp" +#include "mysqlorm.hpp" #include "fortunebase.h" #include "Fortune.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 -*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ - - namespace orm{ - - - Fortune::Fortune(std::string dbtag):mysqlclientDB(dbtag){} - Fortune::Fortune():mysqlclientDB(){} - - - } +namespace orm +{ + +Fortune::Fortune(std::string dbtag) : mysql_orm(dbtag) {} +Fortune::Fortune() : mysql_orm() {} + +}// namespace orm diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp index aa18f46cab6..8dc5de8396a 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp @@ -1,16 +1,14 @@ -#include "mysqlmodel.hpp" +#include "mysqlorm.hpp" #include "worldbase.h" #include "World.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 -*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ - - namespace orm{ - - - World::World(std::string dbtag):mysqlclientDB(dbtag){} - World::World():mysqlclientDB(){} - - - } +namespace orm +{ + +World::World(std::string dbtag) : mysql_orm(dbtag) {} +World::World() : mysql_orm() {} + +}// namespace orm diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h index 27865161b32..548dbed843a 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h @@ -1,16 +1,18 @@ #ifndef ORM_DEFAULT_FORTUNE_H #define ORM_DEFAULT_FORTUNE_H -#include "mysqlmodel.hpp" +#include "mysqlorm.hpp" #include "fortunebase.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 -*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ - namespace orm { - class Fortune : public mysqlclientDB{ - public: - Fortune(std::string dbtag); - Fortune(); - }; +namespace orm +{ +class Fortune : public mysql_orm +{ + public: + Fortune(std::string dbtag); + Fortune(); }; +};// namespace orm #endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h index ba44dee7888..15ae378052a 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h @@ -1,16 +1,18 @@ #ifndef ORM_DEFAULT_WORLD_H #define ORM_DEFAULT_WORLD_H -#include "mysqlmodel.hpp" +#include "mysqlorm.hpp" #include "worldbase.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 -*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ + *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ - namespace orm { - class World : public mysqlclientDB{ - public: - World(std::string dbtag); - World(); - }; +namespace orm +{ +class World : public mysql_orm +{ + public: + World(std::string dbtag); + World(); }; +};// namespace orm #endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h index 8a09ecc4564..544034baf9d 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -1,378 +1,213 @@ #ifndef ORM_DEFAULT_FORTUNEBASEMATA_H #define ORM_DEFAULT_FORTUNEBASEMATA_H /* -*This file is auto create from cli -*本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT -***/ + *This file is auto create from cli + *本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT + ***/ #include #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include -#include "mysql.h" -namespace orm { - - + +namespace orm +{ + struct fortunebase { - struct meta{ - unsigned int id= 0; // - std::string message=""; // - } data; - std::vector record; -std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . -std::vector _keypos{0x00}; -MYSQL_ROW _row; -std::vector::iterator begin(){ return record.begin(); } -std::vector::iterator end(){ return record.end(); } -std::vector::const_iterator begin() const{ return record.begin(); } -std::vector::const_iterator end() const{ return record.end(); } -const std::array colnames={"id","message"}; -const std::array colnamestype= {3,253}; -std::string tablename="fortune"; -std::string modelname="Fortune"; - - unsigned char findcolpos(const std::string &coln){ - if(coln.size()==0) - { - return 255; - } - unsigned char bi=coln[0]; - - - if(bi<91&&bi>64){ - bi+=32; - } - switch(coln[0]){ - - - case 'i': - return 0; -break; -case 'm': - return 1; -break; - - } - return 255; - } - - int size(){ return record.size(); } - - std::string getPKname(){ - return "id"; -} - - void record_reset() - { - record.clear(); - } - void data_reset(){ - fortunebase::meta metatemp; - data = metatemp; - } - - std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ - std::string temp; - - return temp; - } - void _setColnamevalue() - { - for(unsigned char i=0;i<_keypos.size();i++) - { - switch(_keypos[i]){ - case 0: - try{ - data.id=std::stoul(_row[i]); - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.message.append((_row[i]==NULL?"":_row[i])); - }catch (...) { - data.message.clear(); - } - break; - default: - { } - - - } - - if(i>210){ - break; - } - } - } - void _addnewrowvalue(){ - fortunebase::meta metatemp; - - for(unsigned char i=0;i<_keypos.size();i++){ - - switch(_keypos[i]){ - - case 0: - try{ - metatemp.id=std::stoul(_row[i]); - }catch (...) { - metatemp.id=0; - } - break; - case 1: - try{ - metatemp.message.append((_row[i]==NULL?"":_row[i])); - }catch (...) { - metatemp.message.clear(); - } - break; - default: - { } - - - } - if(i>210){ - break; - } - } - record.emplace_back(std::move(metatemp)); - } - - inline std::string stringaddslash(std::string &content){ + struct meta + { + unsigned int id = 0; // + std::string message = "";// + } data; + std::vector record; + std::string _rmstag = "default";//this value must be default or tag value, tag in mysqlconnect config file . + std::vector _keypos{0x00}; + + std::vector::iterator begin() { return record.begin(); } + std::vector::iterator end() { return record.end(); } + std::vector::const_iterator begin() const { return record.begin(); } + std::vector::const_iterator end() const { return record.end(); } + const std::array colnames = {"id", "message"}; + const std::array colnamestype = {3, 253}; + std::string tablename = "fortune"; + std::string modelname = "Fortune"; + + unsigned char findcolpos(const std::string &coln) + { + if (coln.size() == 0) + { + return 255; + } + unsigned char bi = coln[0]; + + if (bi < 91 && bi > 64) + { + bi += 32; + } + switch (coln[0]) + { + + case 'i': + return 0; + break; + case 'm': + return 1; + break; + } + return 255; + } + + int size() { return record.size(); } + + void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, meta &data_temp) + { + /* + unsigned int id = 0; // + std::string message = "";// + */ + //bool is_minus = false; + switch (index_pos) + { + case 0: + data_temp.id = 0; + for (size_t i = 0; i < value_size; i++) + { + if (result_temp_data[i] >= '0' && result_temp_data[i] <= '9') + { + data_temp.id = data_temp.id * 10 + (result_temp_data[i] - '0'); + } + } + break; + case 1: + + data_temp.message.clear(); + data_temp.message.resize(value_size); + for (size_t i = 0; i < value_size; i++) + { + data_temp.message[i] = result_temp_data[i]; + } + break; + default: + break; + } + } + + std::string getPKname() + { + return "id"; + } + + void record_reset() + { + record.clear(); + } + void data_reset() + { + fortunebase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql) + { + std::string temp; + + return temp; + } + + inline std::string stringaddslash(std::string &content) + { std::string temp; - for(unsigned int i=0;i0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(data.id==0){ -tempsql<<"null"; - }else{ - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(insert_data.id==0){ -tempsql<<"null"; - }else{ - tempsql< &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES "; - - for(unsigned int i=0;i0) - { - tempsql<<","; - } - tempsql<<"("; - - - if(insert_data[i].id==0){ - tempsql<<"null"; - }else{ - tempsql< keypos; - for(;jj 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES ("; - } - if(keyname.size()>0){ - unsigned char bpos_i=findcolpos(keyname); - #ifdef DEBUG - if (bpos_i == 254) - { - std::cout << "\033[1m\033[31m-----------\n" - << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" - << std::endl; - } -#endif - keypos.emplace_back(bpos_i); - keyname.clear(); - } - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"`id`=0"; - }else{ - tempsql<<"`id`="<0){ tempsql<<","; } -tempsql<<"`message`='"< 0) - { - tempsql << ",\n"; - } - tempsql << "("; - if(record[i].id==0){ - tempsql<<"null"; - }else{ - tempsql< &insert_data) { unsigned int j = 0; std::ostringstream tempsql; @@ -437,2251 +267,2528 @@ tempsql<<"`message`='"< 0) { - tempsql << ",\n"; + tempsql << ","; } tempsql << "("; - if(record[i].id==0){ - tempsql<<"null"; - }else{ - tempsql<0){ - for(;jj0) - { - tempsql<<","; - } - tempsql<0){ - if(findcolpos(keyname)<255) - { - if(j>0) - { - tempsql<<","; - } - tempsql< data_toarray(std::string fileld=""){ - std::vector temparray; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj data_tomap(std::string fileld=""){ - std::map tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -tempsql<<"\"message\":\""< list_content; - for(;json_offset keypos; + for (; jj < fileld.size(); jj++) { - for(;json_offset0) - { - data=metatemp; - } - if(json_offset>=json_content.size()) + if (fileld[jj] == 0x20) { - break; + + continue; } - for(;json_offset 0) + { + unsigned char bpos_i = findcolpos(keyname); +#ifdef DEBUG + if (bpos_i == 254) { - - if(json_content[json_offset]==0x20||json_content[json_offset]==0x0A||json_content[json_offset]==0x0D||json_content[json_offset]=='\t') - { - continue; - } - else - { - if(json_content[json_offset]==0x22) - { - unsigned int temp_offset=json_offset; - json_key_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - for(;json_offset=json_content.size()) - { - break; - } - json_value_name.clear(); - if(json_content[json_offset]==0x22) - { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - } - else - { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') - { - for(;json_offset1) + for (jj = 0; jj < keypos.size(); jj++) { - data=record[0]; + switch (keypos[jj]) + { + + case 0: + if (jj > 0) + { + tempsql << ","; + } + if (data.id == 0) + { + tempsql << "`id`=0"; + } + else + { + tempsql << "`id`=" << std::to_string(data.id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + tempsql << "`message`='" << stringaddslash(data.message) << "'"; + break; + + default:; + } } } - else + + return tempsql.str(); + } + + std::string _make_replace_into_sql() + { + unsigned int j = 0; + std::ostringstream tempsql; + tempsql << "REPLACE INTO "; + tempsql << tablename; + tempsql << " ("; + for (; j < colnames.size(); j++) { - if(json_content[json_offset]=='{') + if (j > 0) { - json_offset+=1; - std::string json_key_name,json_value_name; - - - for(;json_offset 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if (record[i].id == 0) + { + tempsql << "null"; + } + else + { + tempsql << std::to_string(record[i].id); + } + tempsql << ",'" << stringaddslash(record[i].message) << "'"; + tempsql << ")"; + } + return tempsql.str(); + } + + std::string _make_insert_into_sql(const std::string &fileld) + { + unsigned int j = 0; + std::ostringstream tempsql; + tempsql << "INSERT INTO "; + tempsql << tablename; + tempsql << " ("; + for (; j < colnames.size(); j++) + { + if (j > 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if (record[i].id == 0) + { + tempsql << "null"; + } + else + { + tempsql << std::to_string(record[i].id); + } + tempsql << ",'" << stringaddslash(record[i].message) << "'"; + tempsql << ")"; + } + tempsql << " as new ON DUPLICATE KEY UPDATE "; + + std::string keyname; + unsigned char jj = 0; + j = 0; + if (fileld.size() > 0) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') { - - if(json_content[json_offset]==0x20||json_content[json_offset]==0x0A||json_content[json_offset]==0x0D||json_content[json_offset]=='\t') + if (findcolpos(keyname) < 255) + { + if (j > 0) { - continue; + tempsql << ","; } - else + tempsql << keyname; + tempsql << "=new."; + tempsql << keyname; + } + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + if (findcolpos(keyname) < 255) + { + if (j > 0) + { + tempsql << ","; + } + tempsql << keyname; + tempsql << "=new."; + tempsql << keyname; + } + } + } + + return tempsql.str(); + } + + std::vector data_toarray(std::string fileld = "") + { + std::vector temparray; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 1) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (data.id == 0) + { + temparray.push_back("0"); + } + else + { + temparray.push_back(std::to_string(data.id)); + } + break; + case 1: + temparray.push_back(data.message); + break; + + default:; + } + } + + return temparray; + } + + std::map data_tomap(std::string fileld = "") + { + std::map tempsql; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 1) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (data.id == 0) + { + tempsql.insert({"id", "0"}); + } + else + { + tempsql.insert({"id", std::to_string(data.id)}); + } + break; + case 1: + tempsql.insert({"message", data.message}); + break; + + default:; + } + } + + return tempsql; + } + + std::string data_tojson() + { + std::ostringstream tempsql; + + tempsql << "{"; + if (data.id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(data.id); + } + tempsql << ",\"message\":\"" << http::utf8_to_jsonstring(data.message); + tempsql << "\""; + tempsql << "}"; + + return tempsql.str(); + } + + std::string data_tojson(std::string fileld) + { + std::ostringstream tempsql; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 0) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + tempsql << "{"; + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (jj > 0) + { + tempsql << ","; + } + if (data.id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(data.id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + tempsql << "\"message\":\"" << http::utf8_to_jsonstring(data.message) << "\""; + break; + + default:; + } + } + tempsql << "}"; + return tempsql.str(); + } + + void from_json(const std::string &json_content) + { + record.clear(); + fortunebase::meta metatemp; + data = metatemp; + unsigned int json_offset = 0; + bool isarray = false; + //std::vector list_content; + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == '{') + { + break; + } + if (json_content[json_offset] == '[') + { + isarray = true; + break; + } + } + if (isarray) + { + json_offset += 1; + std::string json_key_name, json_value_name; + for (; json_offset < json_content.size(); json_offset++) + { + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == '{') + { + json_offset += 1; + break; + } + } + if (record.size() > 0) + { + data = metatemp; + } + if (json_offset >= json_content.size()) + { + break; + } + for (; json_offset < json_content.size(); json_offset++) + { + + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + else + { + if (json_content[json_offset] == 0x22) { - if(json_content[json_offset]==0x22) + unsigned int temp_offset = json_offset; + json_key_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) { - unsigned int temp_offset=json_offset; - json_key_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - for(;json_offset=json_content.size()) + break; + } + if (json_content[json_offset] != ':') + { + break; + } + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') { - break; + continue; } - json_value_name.clear(); - if(json_content[json_offset]==0x22) + break; + } + json_offset += 1; + if (json_offset >= json_content.size()) + { + break; + } + json_value_name.clear(); + if (json_content[json_offset] == 0x22) + { + + temp_offset = json_offset; + json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } + json_offset += 1; } - else + } + else + { + if (json_content[json_offset] != '{' && json_content[json_offset] != ']') { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + for (; json_offset < json_content.size(); json_offset++) { - for(;json_offset 1) + { + data = record[0]; + } + } + else + { + if (json_content[json_offset] == '{') + { + json_offset += 1; + std::string json_key_name, json_value_name; + + for (; json_offset < json_content.size(); json_offset++) + { + + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + else + { + if (json_content[json_offset] == 0x22) + { + unsigned int temp_offset = json_offset; + json_key_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) + { + json_offset += 1; + } + for (; json_offset < json_content.size(); json_offset++) + { + + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + break; + } + if (json_content[json_offset] != ':') + { + break; + } + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + break; + } + json_offset += 1; + if (json_offset >= json_content.size()) { break; } + json_value_name.clear(); + if (json_content[json_offset] == 0x22) + { + + temp_offset = json_offset; + json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) + { + json_offset += 1; + } + } + else + { + if (json_content[json_offset] != '{' && json_content[json_offset] != ']') + { + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == 0x5D || json_content[json_offset] == 0x7D || json_content[json_offset] == 0x22 || json_content[json_offset] == 0x2C || json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + if (json_content[json_offset] == 0x7D) + { + json_offset -= 1; + } + break; + } + json_value_name.push_back(json_content[json_offset]); + } + } + } + ////////////////////////// + set_val(json_key_name, json_value_name); + continue; + } + else + { + break; } - + } } record.emplace_back(data); - } - } - } - - void set_val(const std::string& set_key_name,const std::string& set_value_name) - { - switch(findcolpos(set_key_name)) - { - case 0: - try{ - data.id=std::stoul(set_value_name); - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.message.append(set_value_name); - }catch (...) { - data.message.clear(); - } - break; - default: - { } - - - - } - } - - void set_val(const std::string& set_key_name,const long long set_value_name) - { - switch(findcolpos(set_key_name)) - { - case 0: - try{ - data.id=set_value_name; - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.message=std::to_string(set_value_name); - }catch (...) { - data.message.clear(); - } - break; - default: - { } - - - - } - } - - void set_val(const std::string& set_key_name,const double set_value_name) - { - switch(findcolpos(set_key_name)) - { - case 0: - try{ - data.id=(unsigned int)set_value_name; - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.message=std::to_string(set_value_name); - }catch (...) { - data.message.clear(); - } - break; - default: - { } - - - - } - } - - std::string to_json(std::string fileld=""){ - std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj keypos; + if (fileld.size() > 0) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + tempsql << "["; + for (size_t n = 0; n < record.size(); n++) + { + if (n > 0) + { + tempsql << ",{"; + } + else + { + tempsql << "{"; + } + + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (jj > 0) + { + tempsql << ","; + } + if (record[n].id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(record[n].id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + tempsql << "\"message\":\"" << http::utf8_to_jsonstring(record[n].message) << "\""; + break; + + default:; + } + } + tempsql << "}"; + } + tempsql << "]"; + return tempsql.str(); + } + + std::string to_json(std::function func, std::string fileld = "") + { + std::ostringstream tempsql; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 0) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + tempsql << "["; + for (size_t n = 0; n < record.size(); n++) + { + keyname.clear(); + if (func(keyname, record[n])) + { + if (n > 0) + { + tempsql << ",{"; + } + else + { + tempsql << "{"; + } + tempsql << keyname; + } + else + { + continue; + } + + for (jj = 0; jj < keypos.size(); jj++) + { + + switch (keypos[jj]) + { + case 0: + if (jj > 0) + { + tempsql << ","; + } + if (record[n].id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(record[n].id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + tempsql << "\"message\":\"" << http::utf8_to_jsonstring(record[n].message) << "\""; + break; + + default:; + } + } + tempsql << "}"; + } + tempsql << "]"; + return tempsql.str(); + } + long long getPK() { return data.id; } + void setPK(long long val) { data.id = val; } + unsigned int getId() { return data.id; } + void setId(unsigned int val) { data.id = val; } + + std::string getMessage() { return data.message; } + std::string &getRefMessage() { return std::ref(data.message); } + void setMessage(std::string &val) { data.message = val; } + void setMessage(std::string_view val) { data.message = val; } + + fortunebase::meta getnewData() + { + struct meta newdata; + return newdata; + } + fortunebase::meta getData() + { + return data; + } + std::vector getRecord() + { + return record; + } + + template ::value, bool>::type = true> + T &ref_meta([[maybe_unused]] std::string key_name) + { + if (key_name == "message") + { + return data.message; + } + return nullptr; + } + + template , bool>::type = true> + T &ref_meta([[maybe_unused]] std::string key_name) + { + if (key_name == "id") + { + return data.id; + } + return nullptr; + } + + template , bool>::type = true> + T &ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template , bool>::type = true> + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { + case 0: + a.emplace_back(iter.id); + break; + } + } + + return a; + } + + template , bool>::type = true> + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + return a; + } + + template , bool>::type = true> + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos = findcolpos(keyname); + switch (kpos) + { + + case 0: + return data.id; + break; + } + return 0; + } + + template , bool>::type = true> + T getVal([[maybe_unused]] fortunebase::meta &iter, [[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos = findcolpos(keyname); + switch (kpos) + { + case 0: + return iter.id; + break; + } + + return 0; + } + + template , bool>::type = true> + T getVal(std::string keyname) + { + unsigned char kpos; + kpos = findcolpos(keyname); + + switch (kpos) + { + } + + return 0.0; + } + + template , bool>::type = true> + T getVal([[maybe_unused]] fortunebase::meta &iter, std::string keyname) + { + unsigned char kpos; + kpos = findcolpos(keyname); + switch (kpos) + { + } + + return 0.0; + } + + template ::value, bool>::type = true> + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos = findcolpos(keyname); + + switch (kpos) + { + + case 1: + return data.message; + break; + } + return ""; + } + + template ::value, bool>::type = true> + std::string getVal([[maybe_unused]] fortunebase::meta &iter, std::string keyname) + { + + unsigned char kpos; + kpos = findcolpos(keyname); + + switch (kpos) + { + + case 1: + return iter.message; + break; + } + + return ""; + } + + template ::value, bool>::type = true> + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { + + case 1: + a.emplace_back(iter.message); + break; + } + } + + return a; + } + + std::string getstrCol(std::string keyname, [[maybe_unused]] bool isyinhao = false) + { + std::ostringstream a; + + unsigned char kpos; + kpos = findcolpos(keyname); + int j = 0; + if (isyinhao && record.size() > 0) + { + a << '"'; + } + for (auto &iter : record) + { + if (j > 0) + { + if (isyinhao) + { + a << "\",\""; + } + else + { + a << ','; + } + } + switch (kpos) + { + + case 0: + a << std::to_string(iter.id); + break; + case 1: + if (isyinhao) + { + a << jsonaddslash(iter.message); + } + else + { + a << iter.message; + } + break; + } + j++; + } + if (isyinhao && j > 0) + { + a << '"'; + } + + return a.str(); + } + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + std::string ktemp, vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 1: + ktemp = iter.message; + break; + } + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + std::string ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 1: + ktemp = iter.message; + break; + } + switch (vpos) + { + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } + switch (vpos) + { + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + std::string vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + std::string ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 1: + ktemp = iter.message; + break; + } + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template , bool>::type = true> + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + a.emplace(iter.id, iter); + break; + } + } + + return a; + } + + template ::value, bool>::type = true> + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { + + case 1: + a.emplace(iter.message, iter); + break; + } + //a.emplace(ktemp,iter); + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + std::string ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 1: + ktemp = iter.message; + break; + } + switch (vpos) + { + } + + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } + switch (vpos) + { + } + + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } + + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + + switch (kpos) + { + + case 1: + ktemp = iter.message; + break; + } + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; - } - if(keyname.size()>0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - - for(jj=0;jj0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -tempsql<<"\"message\":\""< func,std::string fileld=""){ - std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - tempsql<0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -tempsql<<"\"message\":\""< getRecord(){ - return record; -} - - - template::value,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - if(key_name=="message") - { - return data.message; - } - return nullptr; - } - - - template,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - if(key_name=="id") - { - return data.id; - } - return nullptr; - } - - - template,bool>::type = true > - T& ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { - case 0: - a.emplace_back(iter.id); - break; + return a; + } - } - } - - return a; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - return a; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; - case 0: - return data.id; - break; - } - return 0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] fortunebase::meta & iter,[[maybe_unused]] std::string keyname) + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) { + switch (kpos) + { - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) + case 1: + ktemp = iter.message; + break; + } + switch (vpos) { - case 0: - return iter.id; - break; + case 1: + vtemp = iter.message; + break; + } - } + a.emplace_back(ktemp, vtemp); + } - return 0; - } - - template,bool>::type = true > - T getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { + return a; + } - - } - - - return 0.0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - - } - - - - return 0.0; - } - - template::value,bool>::type = true > - std::string getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { + template , bool>::type = true> + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; - case 1: - return data.message; - break; + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { - } - return ""; - } - - template::value,bool>::type = true > - std::string getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) - { + case 0: + a.emplace_back(iter.id, iter); + break; + } + } - case 1: - return iter.message; - break; + return a; + } + template ::value, bool>::type = true> + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; - } - - - - return ""; - } - - template::value,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { - case 1: - a.emplace_back(iter.message); - break; - } - } + case 1: + a.emplace_back(iter.message, iter); + break; + } + } return a; } - - std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) + template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + for (auto &iter : record) { - std::ostringstream a; - - unsigned char kpos; - kpos=findcolpos(keyname); - int j=0; - if(isyinhao&&record.size()>0) + switch (kpos) { - a<<'"'; + + case 0: + ktemp = iter.id; + break; } - for(auto &iter:record) + + switch (vpos) { - if(j>0) - { - if(isyinhao) - { - a<<"\",\""; - }else{ - a<<','; - } - } - switch(kpos) - { + case 0: + vtemp = iter.id; + break; + } - case 0: - a<0){ - a<<'"'; - } - - return a.str(); - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp,vtemp; - for(auto &iter:record) - { - switch(kpos) - { + return a; + } - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 1: - vtemp=iter.message; - break; + template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - - return a; - } - - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + } + } - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - return a; - } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - std::string vtemp; - for(auto &iter:record) - { - switch(kpos) - { + } - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 1: - vtemp=iter.message; - break; + template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + + switch (dpos) + { + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + } + } - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + } - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; + template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for (auto &iter : record) + { - case 0: - a.emplace(iter.id,iter); - break; + switch (kpos) + { - } - } - - return a; - } - - template::value,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { + case 0: + ktemp = iter.id; + break; + } - case 1: - a.emplace(iter.message,iter); - break; + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } - } - //a.emplace(ktemp,iter); - } - + switch (dpos) + { + } + } return a; } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for (auto &iter : record) { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) + switch (kpos) { - switch(kpos) - { - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - - } - - a.emplace_back(ktemp,vtemp); - } - - - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + case 0: + ktemp = iter.id; + break; + } - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } - } + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + } + } - a.emplace_back(ktemp,vtemp); - } + return a; + } + template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + for (auto &iter : record) { - std::vector> a; + switch (kpos) + { - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + case 0: + ktemp = iter.id; + break; + } - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 1: - vtemp=iter.message; - break; - - } - - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - - switch(kpos) - { + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + switch (dpos) + { + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + } + } - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + return a; + } - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ -case 1: - vtemp=iter.message; - break; - - } - - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 1: + ktemp = iter.message; + break; + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + + switch (dpos) + { + } + } - case 0: - a.emplace_back(iter.id,iter); - break; + return a; + } + + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for (auto &iter : record) + { + + switch (kpos) + { + + case 1: + ktemp = iter.message; + break; + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + } + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - } - } - - return a; - } - template::value,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) + for (auto &iter : record) { - std::vector> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) + + switch (kpos) { - switch(kpos) - { - case 1: - a.emplace_back(iter.message,iter); - break; + case 1: + ktemp = iter.message; + break; + } - } - } - + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + } + + switch (dpos) + { + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; + } + } return a; } - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } - - switch(dpos){ + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - } - } + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + for (auto &iter : record) { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for(auto &iter:record) + switch (kpos) { - switch(kpos) - { - case 0: - ktemp=iter.id; - break; - } + case 1: + ktemp = iter.message; + break; + } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; + switch (dpos) + { + } + } - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { + return a; + } + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - case 0: - ktemp=iter.id; - break; - } + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } + for (auto &iter : record) + { - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; + switch (kpos) + { - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { + case 1: + ktemp = iter.message; + break; + } - case 0: - ktemp=iter.id; - break; - } + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + } + } - switch(dpos){ + return a; + } - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) { - std::map>> a; + std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); T ktemp; U vtemp; - // D dtemp; + // D dtemp; - for(auto &iter:record) - { - switch(kpos) + for (auto &iter : record) + { + switch (kpos) { - case 0: - ktemp=iter.id; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } + case 1: + ktemp = iter.message; + break; + } - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; + switch (vpos) + { + case 1: + vtemp = iter.message; + break; + } + switch (dpos) + { + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; } - } - + } + return a; } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - case 0: - ktemp=iter.id; - break; - } + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; + for (auto &iter : record) + { + switch (kpos) + { - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for(auto &iter:record) - { - switch(kpos) - { + case 1: + ktemp = iter.message; + break; + } - case 1: - ktemp=iter.message; - break; - } + switch (vpos) + { + case 1: + a[ktemp].emplace_back(iter.message); + break; + } + } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } + return a; + } - switch(dpos){ + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - } - } - + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + for (auto &iter : record) { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for(auto &iter:record) + switch (kpos) { - - switch(kpos) - { - case 1: - ktemp=iter.message; - break; - } + case 1: + ktemp = iter.message; + break; + } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } + switch (vpos) + { + } + } - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; + return a; + } - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) { - std::map>> a; + std::map> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { + //U vtemp; - case 1: - ktemp=iter.message; - break; - } + for (auto &iter : record) + { - switch(vpos){ - case 0: - vtemp=iter.id; - break; - } + switch (kpos) + { - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; + case 1: + ktemp = iter.message; + break; + } + switch (vpos) + { + case 0: + a[ktemp].emplace_back(iter.id); + break; } - } - - return a; } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; + + for (auto &iter : record) { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - for(auto &iter:record) + switch (kpos) { - switch(kpos) - { - case 1: - ktemp=iter.message; - break; - } + case 0: + ktemp = iter.id; + break; + } + + switch (vpos) + { + case 1: + a[ktemp].emplace_back(iter.message); + break; + } + } - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } + return a; + } - switch(dpos){ + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - } - } + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; - - return a; - } - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + for (auto &iter : record) { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - for(auto &iter:record) + switch (kpos) { - - switch(kpos) - { - case 1: - ktemp=iter.message; - break; - } - - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; + case 0: + ktemp = iter.id; + break; + } - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { + switch (vpos) + { + } + } - case 1: - ktemp=iter.message; - break; - } + return a; + } - switch(vpos){ - case 1: - vtemp=iter.message; - break; - } + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - switch(dpos){ - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + for (auto &iter : record) { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + } - for(auto &iter:record) + switch (vpos) { - switch(kpos) - { + case 0: + a[ktemp].emplace_back(iter.id); + break; + } + } + + return a; + } - case 1: - ktemp=iter.message; - break; - } + template , bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; - switch(vpos){ - case 1: - a[ktemp].emplace_back(iter.message); - break; + unsigned char kpos; + kpos = findcolpos(keyname); - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + for (auto &iter : record) { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) + switch (kpos) { - switch(kpos) - { - case 1: - ktemp=iter.message; - break; - } + case 0: + a[iter.id].emplace_back(iter); + break; + } + } + + return a; + } - switch(vpos){ + template ::value, bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; - } - } + unsigned char kpos; + kpos = findcolpos(keyname); - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + for (auto &iter : record) { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - for(auto &iter:record) + switch (kpos) { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; - - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { + case 1: + a[iter.message].emplace_back(iter); + break; + } + } - case 0: - ktemp=iter.id; - break; - } + return a; + } - switch(vpos){ - case 1: - a[ktemp].emplace_back(iter.message); - break; + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - } - } + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + for (auto &iter : record) { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - for(auto &iter:record) + switch (kpos) { - - switch(kpos) - { - case 0: - ktemp=iter.id; - break; - } + case 1: + ktemp = iter.message; + break; + } - switch(vpos){ + switch (vpos) + { + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; + } + } - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { + return a; + } - case 0: - ktemp=iter.id; - break; - } + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; - } - } - - return a; - } - - template,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) + for (auto &iter : record) { - std::map> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) + switch (kpos) { - switch(kpos) - { - case 0: - a[iter.id].emplace_back(iter); - break; + case 1: + ktemp = iter.message; + break; + } - } - } - - return a; + switch (vpos) + { + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + } } - - template::value,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - - switch(kpos) - { + return a; + } - case 1: - a[iter.message].emplace_back(iter); - break; + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + + for (auto &iter : record) { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - for(auto &iter:record) + switch (kpos) { - - switch(kpos) - { - - case 1: - ktemp=iter.message; - break; - } - switch(vpos){ - case 1: - a[ktemp][iter.message].emplace_back(iter); - break; - - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { + case 0: + ktemp = iter.id; + break; + } - case 1: - ktemp=iter.message; - break; - } + switch (vpos) + { + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + } + } - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; + return a; + } - } - } + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - } - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { + for (auto &iter : record) + { - case 0: - ktemp=iter.id; - break; - } + switch (kpos) + { - switch(vpos){ - case 1: - a[ktemp][iter.message].emplace_back(iter); - break; + case 0: + ktemp = iter.id; + break; + } - } - } - - return a; + switch (vpos) + { + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; + } } - - }; - -} + return a; + } +}; + +}// namespace orm #endif - \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h index 2bba08096e2..dc44d63a6a0 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -1,398 +1,235 @@ #ifndef ORM_DEFAULT_WORLDBASEMATA_H #define ORM_DEFAULT_WORLDBASEMATA_H /* -*This file is auto create from cli -*本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT -***/ + *This file is auto create from cli + *本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT + ***/ #include #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include -#include "mysql.h" -namespace orm { - - + +namespace orm +{ + struct worldbase { - struct meta{ - unsigned int id= 0; // - int randomnumber= 0; // - } data; - std::vector record; -std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . -std::vector _keypos{0x00}; -MYSQL_ROW _row; -std::vector::iterator begin(){ return record.begin(); } -std::vector::iterator end(){ return record.end(); } -std::vector::const_iterator begin() const{ return record.begin(); } -std::vector::const_iterator end() const{ return record.end(); } -const std::array colnames={"id","randomnumber"}; -const std::array colnamestype= {3,3}; -std::string tablename="world"; -std::string modelname="World"; - - unsigned char findcolpos(const std::string &coln){ - if(coln.size()==0) - { - return 255; - } - unsigned char bi=coln[0]; - - - if(bi<91&&bi>64){ - bi+=32; - } - switch(coln[0]){ - - - case 'i': - return 0; -break; -case 'r': - return 1; -break; - - } - return 255; - } - - int size(){ return record.size(); } - - std::string getPKname(){ - return "id"; -} - - void record_reset() - { - record.clear(); - } - void data_reset(){ - worldbase::meta metatemp; - data = metatemp; - } - - std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ - std::string temp; - - return temp; - } - void _setColnamevalue() - { - for(unsigned char i=0;i<_keypos.size();i++) - { - switch(_keypos[i]){ - case 0: - try{ - data.id=std::stoul(_row[i]); - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.randomnumber=std::stoi(_row[i]); - }catch (...) { - data.randomnumber=0; - } - break; - default: - { } - - - } - - if(i>210){ - break; - } - } - } - void _addnewrowvalue(){ - worldbase::meta metatemp; - - for(unsigned char i=0;i<_keypos.size();i++){ - - switch(_keypos[i]){ - - case 0: - try{ - metatemp.id=std::stoul(_row[i]); - }catch (...) { - metatemp.id=0; - } - break; - case 1: - try{ - metatemp.randomnumber=std::stoi(_row[i]); - }catch (...) { - metatemp.randomnumber=0; - } - break; - default: - { } - - - } - if(i>210){ - break; - } - } - record.emplace_back(std::move(metatemp)); - } - - inline std::string stringaddslash(std::string &content){ + struct meta + { + unsigned int id = 0;// + int randomnumber = 0;// + } data; + std::vector record; + std::string _rmstag = "default";//this value must be default or tag value, tag in mysqlconnect config file . + std::vector _keypos{0x00}; + + std::vector::iterator begin() { return record.begin(); } + std::vector::iterator end() { return record.end(); } + std::vector::const_iterator begin() const { return record.begin(); } + std::vector::const_iterator end() const { return record.end(); } + const std::array colnames = {"id", "randomnumber"}; + const std::array colnamestype = {3, 3}; + std::string tablename = "world"; + std::string modelname = "World"; + + unsigned char findcolpos(const std::string &coln) + { + if (coln.size() == 0) + { + return 255; + } + unsigned char bi = coln[0]; + + if (bi < 91 && bi > 64) + { + bi += 32; + } + switch (coln[0]) + { + + case 'i': + return 0; + break; + case 'r': + return 1; + break; + } + return 255; + } + + int size() { return record.size(); } + + void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, meta &data_temp) + { + /* + unsigned int id = 0;// + int randomnumber = 0;// + */ + bool is_minus = false; + switch (index_pos) + { + case 0: + data_temp.id = 0; + for (size_t i = 0; i < value_size; i++) + { + if (result_temp_data[i] >= '0' && result_temp_data[i] <= '9') + { + data_temp.id = data_temp.id * 10 + (result_temp_data[i] - '0'); + } + } + break; + case 1: + + data_temp.randomnumber = 0; + + is_minus = false; + if (value_size > 0) + { + if (result_temp_data[0] == '-') + { + is_minus = true; + } + } + for (std::size_t i = 0; i < value_size; i++) + { + if (result_temp_data[i] >= '0' && result_temp_data[i] <= '9') + { + data_temp.randomnumber = data_temp.randomnumber * 10 + (result_temp_data[i] - '0'); + } + } + if (is_minus) + { + data_temp.randomnumber = ~(data_temp.randomnumber - 1); + } + break; + default: + break; + } + } + + std::string getPKname() + { + return "id"; + } + + void record_reset() + { + record.clear(); + } + void data_reset() + { + worldbase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql) + { std::string temp; - for(unsigned int i=0;i0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(data.id==0){ -tempsql<<"null"; - }else{ - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; - - if(insert_data.id==0){ -tempsql<<"null"; - }else{ - tempsql< &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES "; - - for(unsigned int i=0;i0) - { - tempsql<<","; - } - tempsql<<"("; - - - if(insert_data[i].id==0){ - tempsql<<"null"; - }else{ - tempsql< 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES ("; - } - if(keyname.size()>0){ - unsigned char bpos_i=findcolpos(keyname); - #ifdef DEBUG - if (bpos_i == 254) - { - std::cout << "\033[1m\033[31m-----------\n" - << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" - << std::endl; - } -#endif - keypos.emplace_back(bpos_i); - keyname.clear(); - } - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"`id`=0"; - }else{ - tempsql<<"`id`="<0){ tempsql<<","; } -if(data.randomnumber==0){ - tempsql<<"`randomnumber`=0"; - }else{ - tempsql<<"`randomnumber`="< 0) - { - tempsql << ",\n"; - } - tempsql << "("; - if(record[i].id==0){ - tempsql<<"null"; - }else{ - tempsql< &insert_data) { unsigned int j = 0; std::ostringstream tempsql; @@ -461,2049 +296,2365 @@ if(data.randomnumber==0){ } tempsql << ") VALUES "; - for (unsigned int i = 0; i < record.size(); i++) + for (unsigned int i = 0; i < insert_data.size(); i++) { if (i > 0) { - tempsql << ",\n"; + tempsql << ","; } tempsql << "("; - if(record[i].id==0){ - tempsql<<"null"; - }else{ - tempsql<0){ - for(;jj0) - { - tempsql<<","; - } - tempsql<0){ - if(findcolpos(keyname)<255) - { - if(j>0) - { - tempsql<<","; - } - tempsql< data_toarray(std::string fileld=""){ - std::vector temparray; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj data_tomap(std::string fileld=""){ - std::map tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ tempsql<<","; } -if(data.id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -if(data.randomnumber==0){ - tempsql<<"\"randomnumber\":0"; - }else{ - tempsql<<"\"randomnumber\":"< list_content; - for(;json_offset0) + if (fileld[jj] == 0x20) { - data=metatemp; + + continue; } - if(json_offset>=json_content.size()) + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + unsigned char bpos_i = findcolpos(keyname); +#ifdef DEBUG + if (bpos_i == 254) { - break; + std::cout << "\033[1m\033[31m-----------\n" + << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" + << std::endl; } - for(;json_offset=json_content.size()) - { - break; - } - json_value_name.clear(); - if(json_content[json_offset]==0x22) - { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - } - else - { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') - { - for(;json_offset 0) + { + tempsql << ","; + } + if (data.id == 0) + { + tempsql << "`id`=0"; + } + else + { + tempsql << "`id`=" << std::to_string(data.id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + if (data.randomnumber == 0) + { + tempsql << "`randomnumber`=0"; + } + else + { + tempsql << "`randomnumber`=" << std::to_string(data.randomnumber); + } + break; + + default:; } - record.emplace_back(data); - - json_offset+=1; } - if(record.size()>1) + } + + return tempsql.str(); + } + + std::string _make_replace_into_sql() + { + unsigned int j = 0; + std::ostringstream tempsql; + tempsql << "REPLACE INTO "; + tempsql << tablename; + tempsql << " ("; + for (; j < colnames.size(); j++) + { + if (j > 0) + { + tempsql << "`,`"; + } + else { - data=record[0]; + tempsql << "`"; } + tempsql << colnames[j]; } - else + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if (record[i].id == 0) + { + tempsql << "null"; + } + else + { + tempsql << std::to_string(record[i].id); + } + if (record[i].randomnumber == 0) + { + tempsql << ",0"; + } + else + { + tempsql << "," << std::to_string(record[i].randomnumber); + } + tempsql << ")"; + } + return tempsql.str(); + } + + std::string _make_insert_into_sql(const std::string &fileld) + { + unsigned int j = 0; + std::ostringstream tempsql; + tempsql << "INSERT INTO "; + tempsql << tablename; + tempsql << " ("; + for (; j < colnames.size(); j++) + { + if (j > 0) + { + tempsql << "`,`"; + } + else + { + tempsql << "`"; + } + tempsql << colnames[j]; + } + if (j > 0) + { + tempsql << "`"; + } + tempsql << ") VALUES "; + + for (unsigned int i = 0; i < record.size(); i++) + { + if (i > 0) + { + tempsql << ",\n"; + } + tempsql << "("; + if (record[i].id == 0) + { + tempsql << "null"; + } + else + { + tempsql << std::to_string(record[i].id); + } + if (record[i].randomnumber == 0) + { + tempsql << ",0"; + } + else + { + tempsql << "," << std::to_string(record[i].randomnumber); + } + tempsql << ")"; + } + tempsql << " as new ON DUPLICATE KEY UPDATE "; + + std::string keyname; + unsigned char jj = 0; + j = 0; + if (fileld.size() > 0) { - if(json_content[json_offset]=='{') + for (; jj < fileld.size(); jj++) { - json_offset+=1; - std::string json_key_name,json_value_name; - - - for(;json_offset 0) { - if(json_content[json_offset]==0x22) - { - unsigned int temp_offset=json_offset; - json_key_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - for(;json_offset=json_content.size()) - { - break; - } - json_value_name.clear(); - if(json_content[json_offset]==0x22) - { - - temp_offset=json_offset; - json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); - json_offset=temp_offset; - if(json_content[json_offset]==0x22) - { - json_offset+=1; - } - } - else - { - if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') - { - for(;json_offset keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); + tempsql << keyname; + tempsql << "=new."; + tempsql << keyname; } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - - for(jj=0;jj0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -if(record[n].randomnumber==0){ - tempsql<<"\"randomnumber\":0"; - }else{ - tempsql<<"\"randomnumber\":"< func,std::string fileld=""){ - std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - tempsql<0){ tempsql<<","; } -if(record[n].id==0){ - tempsql<<"\"id\":0"; - }else{ - tempsql<<"\"id\":"<0){ tempsql<<","; } -if(record[n].randomnumber==0){ - tempsql<<"\"randomnumber\":0"; - }else{ - tempsql<<"\"randomnumber\":"< getRecord(){ - return record; -} - - - template::value,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - - template,bool>::type = true> - T& ref_meta([[maybe_unused]] std::string key_name) - { - if(key_name=="id") - { - return data.id; - } - if(key_name=="randomnumber") - { - return data.randomnumber; - } - return nullptr; - } - - - template,bool>::type = true > - T& ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + if (findcolpos(keyname) < 255) { - switch(kpos) + if (j > 0) { - case 0: - a.emplace_back(iter.id); - break; - case 1: - a.emplace_back(iter.randomnumber); - break; - + tempsql << ","; } + tempsql << keyname; + tempsql << "=new."; + tempsql << keyname; } - - return a; - } - - template,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - - return a; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { + } + } - case 0: - return data.id; - break; - case 1: - return data.randomnumber; - break; - } - return 0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] worldbase::meta & iter,[[maybe_unused]] std::string keyname) - { - - - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) - { - case 0: - return iter.id; - break; - case 1: - return iter.randomnumber; - break; - - } + return tempsql.str(); + } - return 0; - } - - template,bool>::type = true > - T getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) + std::vector data_toarray(std::string fileld = "") + { + std::vector temparray; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 1) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) { - - } - - - return 0.0; - } - - template,bool>::type = true > - T getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - switch(kpos) + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (data.id == 0) { - + temparray.push_back("0"); } - - - - return 0.0; - } - - template::value,bool>::type = true > - std::string getVal(std::string keyname) - { - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) + else { - - + temparray.push_back(std::to_string(data.id)); } - return ""; - } - - template::value,bool>::type = true > - std::string getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) - { - - unsigned char kpos; - kpos=findcolpos(keyname); - - switch(kpos) + break; + case 1: + if (data.randomnumber == 0) { - - + temparray.push_back("0"); } - - - - return ""; - } - - template::value,bool>::type = true > - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; + else + { + temparray.push_back(std::to_string(data.randomnumber)); + } + break; - + default:; + } + } - return a; + return temparray; } - - std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) + + std::map data_tomap(std::string fileld = "") + { + std::map tempsql; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 1) { - std::ostringstream a; - - unsigned char kpos; - kpos=findcolpos(keyname); - int j=0; - if(isyinhao&&record.size()>0) + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) { - a<<'"'; + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } - for(auto &iter:record) + } + else + { + for (jj = 0; jj < colnames.size(); jj++) { - if(j>0) - { - if(isyinhao) - { - a<<"\",\""; - }else{ - a<<','; - } - } - switch(kpos) - { - - case 0: - a<0){ - a<<'"'; - } - - return a.str(); - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - return a; - } - - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (data.id == 0) + { + tempsql.insert({"id", "0"}); + } + else + { + tempsql.insert({"id", std::to_string(data.id)}); + } + break; + case 1: + if (data.randomnumber == 0) + { + tempsql.insert({"randomnumber", "0"}); + } + else { - - case 0: - ktemp=iter.id; - break; -case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ + tempsql.insert({"randomnumber", std::to_string(data.randomnumber)}); + } + break; + + default:; + } + } + + return tempsql; + } + + std::string data_tojson() + { + std::ostringstream tempsql; + + tempsql << "{"; + if (data.id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(data.id); + } + if (data.randomnumber == 0) + { + tempsql << ",\"randomnumber\":0"; + } + else + { + tempsql << ",\"randomnumber\":" << std::to_string(data.randomnumber); + } + tempsql << "}"; + + return tempsql.str(); + } + + std::string data_tojson(std::string fileld) + { + std::ostringstream tempsql; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 0) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + tempsql << "{"; + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (jj > 0) + { + tempsql << ","; + } + if (data.id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(data.id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + if (data.randomnumber == 0) + { + tempsql << "\"randomnumber\":0"; + } + else + { + tempsql << "\"randomnumber\":" << std::to_string(data.randomnumber); + } + break; + + default:; + } + } + tempsql << "}"; + return tempsql.str(); + } + + void from_json(const std::string &json_content) + { + record.clear(); + worldbase::meta metatemp; + data = metatemp; + unsigned int json_offset = 0; + bool isarray = false; + //std::vector list_content; + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == '{') + { + break; + } + if (json_content[json_offset] == '[') + { + isarray = true; + break; + } + } + if (isarray) + { + json_offset += 1; + std::string json_key_name, json_value_name; + for (; json_offset < json_content.size(); json_offset++) + { + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == '{') + { + json_offset += 1; + break; + } + } + if (record.size() > 0) + { + data = metatemp; + } + if (json_offset >= json_content.size()) + { + break; + } + for (; json_offset < json_content.size(); json_offset++) + { + + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + else + { + if (json_content[json_offset] == 0x22) + { + unsigned int temp_offset = json_offset; + json_key_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) + { + json_offset += 1; + } + for (; json_offset < json_content.size(); json_offset++) + { + + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + break; + } + if (json_content[json_offset] != ':') + { + break; + } + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + break; + } + json_offset += 1; + if (json_offset >= json_content.size()) + { + break; + } + json_value_name.clear(); + if (json_content[json_offset] == 0x22) + { + + temp_offset = json_offset; + json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) + { + json_offset += 1; + } + } + else + { + if (json_content[json_offset] != '{' && json_content[json_offset] != ']') + { + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == 0x5D || json_content[json_offset] == 0x7D || json_content[json_offset] == 0x22 || json_content[json_offset] == 0x2C || json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + if (json_content[json_offset] == 0x7D) + { + json_offset -= 1; + } + break; + } + json_value_name.push_back(json_content[json_offset]); + } + } + } + ////////////////////////// + set_val(json_key_name, json_value_name); + continue; + } + else + { + break; + } + } + } + record.emplace_back(data); + + json_offset += 1; + } + if (record.size() > 1) + { + data = record[0]; + } + } + else + { + if (json_content[json_offset] == '{') + { + json_offset += 1; + std::string json_key_name, json_value_name; + + for (; json_offset < json_content.size(); json_offset++) + { + + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + else + { + if (json_content[json_offset] == 0x22) + { + unsigned int temp_offset = json_offset; + json_key_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) + { + json_offset += 1; + } + for (; json_offset < json_content.size(); json_offset++) + { + + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + break; + } + if (json_content[json_offset] != ':') + { + break; + } + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + continue; + } + break; + } + json_offset += 1; + if (json_offset >= json_content.size()) + { + break; + } + json_value_name.clear(); + if (json_content[json_offset] == 0x22) + { + + temp_offset = json_offset; + json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); + json_offset = temp_offset; + if (json_content[json_offset] == 0x22) + { + json_offset += 1; + } + } + else + { + if (json_content[json_offset] != '{' && json_content[json_offset] != ']') + { + for (; json_offset < json_content.size(); json_offset++) + { + if (json_content[json_offset] == 0x5D || json_content[json_offset] == 0x7D || json_content[json_offset] == 0x22 || json_content[json_offset] == 0x2C || json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + { + if (json_content[json_offset] == 0x7D) + { + json_offset -= 1; + } + break; + } + json_value_name.push_back(json_content[json_offset]); + } + } + } + ////////////////////////// + set_val(json_key_name, json_value_name); + continue; + } + else + { + break; + } + } + } + record.emplace_back(data); + } + } + } + + void set_val(const std::string &set_key_name, const std::string &set_value_name) + { + switch (findcolpos(set_key_name)) + { + case 0: + try + { + data.id = std::stoul(set_value_name); + } + catch (...) + { + data.id = 0; + } + break; + case 1: + try + { + data.randomnumber = std::stoi(set_value_name); + } + catch (...) + { + data.randomnumber = 0; + } + break; + default: + { + } + } + } + + void set_val(const std::string &set_key_name, const long long set_value_name) + { + switch (findcolpos(set_key_name)) + { + case 0: + try + { + data.id = set_value_name; + } + catch (...) + { + data.id = 0; + } + break; + case 1: + try + { + data.randomnumber = set_value_name; + } + catch (...) + { + data.randomnumber = 0; + } + break; + default: + { + } + } + } + + void set_val(const std::string &set_key_name, const double set_value_name) + { + switch (findcolpos(set_key_name)) + { + case 0: + try + { + data.id = (unsigned int)set_value_name; + } + catch (...) + { + data.id = 0; + } + break; + case 1: + try + { + data.randomnumber = (int)set_value_name; + } + catch (...) + { + data.randomnumber = 0; + } + break; + default: + { + } + } + } + + std::string to_json(std::string fileld = "") + { + std::ostringstream tempsql; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 0) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + tempsql << "["; + for (size_t n = 0; n < record.size(); n++) + { + if (n > 0) + { + tempsql << ",{"; + } + else + { + tempsql << "{"; + } + + for (jj = 0; jj < keypos.size(); jj++) + { + switch (keypos[jj]) + { + case 0: + if (jj > 0) + { + tempsql << ","; + } + if (record[n].id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(record[n].id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + if (record[n].randomnumber == 0) + { + tempsql << "\"randomnumber\":0"; + } + else + { + tempsql << "\"randomnumber\":" << std::to_string(record[n].randomnumber); + } + break; + + default:; + } + } + tempsql << "}"; + } + tempsql << "]"; + return tempsql.str(); + } + + std::string to_json(std::function func, std::string fileld = "") + { + std::ostringstream tempsql; + std::string keyname; + unsigned char jj = 0; + std::vector keypos; + if (fileld.size() > 0) + { + for (; jj < fileld.size(); jj++) + { + if (fileld[jj] == ',') + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + continue; + } + if (fileld[jj] == 0x20) + { + + continue; + } + keyname.push_back(fileld[jj]); + } + if (keyname.size() > 0) + { + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + } + else + { + for (jj = 0; jj < colnames.size(); jj++) + { + keypos.emplace_back(jj); + } + } + tempsql << "["; + for (size_t n = 0; n < record.size(); n++) + { + keyname.clear(); + if (func(keyname, record[n])) + { + if (n > 0) + { + tempsql << ",{"; + } + else + { + tempsql << "{"; + } + tempsql << keyname; + } + else + { + continue; + } + + for (jj = 0; jj < keypos.size(); jj++) + { + + switch (keypos[jj]) + { + case 0: + if (jj > 0) + { + tempsql << ","; + } + if (record[n].id == 0) + { + tempsql << "\"id\":0"; + } + else + { + tempsql << "\"id\":" << std::to_string(record[n].id); + } + break; + case 1: + if (jj > 0) + { + tempsql << ","; + } + if (record[n].randomnumber == 0) + { + tempsql << "\"randomnumber\":0"; + } + else + { + tempsql << "\"randomnumber\":" << std::to_string(record[n].randomnumber); + } + break; + + default:; + } + } + tempsql << "}"; + } + tempsql << "]"; + return tempsql.str(); + } + long long getPK() { return data.id; } + void setPK(long long val) { data.id = val; } + unsigned int getId() { return data.id; } + void setId(unsigned int val) { data.id = val; } + + int getRandomnumber() { return data.randomnumber; } + void setRandomnumber(int val) { data.randomnumber = val; } + + worldbase::meta getnewData() + { + struct meta newdata; + return newdata; + } + worldbase::meta getData() + { + return data; + } + std::vector getRecord() + { + return record; + } + + template ::value, bool>::type = true> + T &ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template , bool>::type = true> + T &ref_meta([[maybe_unused]] std::string key_name) + { + if (key_name == "id") + { + return data.id; + } + if (key_name == "randomnumber") + { + return data.randomnumber; + } + return nullptr; + } + + template , bool>::type = true> + T &ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template , bool>::type = true> + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { + case 0: + a.emplace_back(iter.id); + break; + case 1: + a.emplace_back(iter.randomnumber); + break; + } + } + + return a; + } + + template , bool>::type = true> + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + return a; + } + + template , bool>::type = true> + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos = findcolpos(keyname); + switch (kpos) + { + + case 0: + return data.id; + break; + case 1: + return data.randomnumber; + break; + } + return 0; + } + + template , bool>::type = true> + T getVal([[maybe_unused]] worldbase::meta &iter, [[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos = findcolpos(keyname); + switch (kpos) + { + case 0: + return iter.id; + break; + case 1: + return iter.randomnumber; + break; + } + + return 0; + } + + template , bool>::type = true> + T getVal(std::string keyname) + { + unsigned char kpos; + kpos = findcolpos(keyname); + + switch (kpos) + { + } + + return 0.0; + } + + template , bool>::type = true> + T getVal([[maybe_unused]] worldbase::meta &iter, std::string keyname) + { + unsigned char kpos; + kpos = findcolpos(keyname); + switch (kpos) + { + } + + return 0.0; + } + + template ::value, bool>::type = true> + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos = findcolpos(keyname); + + switch (kpos) + { + } + return ""; + } + + template ::value, bool>::type = true> + std::string getVal([[maybe_unused]] worldbase::meta &iter, std::string keyname) + { + + unsigned char kpos; + kpos = findcolpos(keyname); + + switch (kpos) + { + } + + return ""; + } + + template ::value, bool>::type = true> + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + return a; + } + + std::string getstrCol(std::string keyname, [[maybe_unused]] bool isyinhao = false) + { + std::ostringstream a; + + unsigned char kpos; + kpos = findcolpos(keyname); + int j = 0; + if (isyinhao && record.size() > 0) + { + a << '"'; + } + for (auto &iter : record) + { + if (j > 0) + { + if (isyinhao) + { + a << "\",\""; + } + else + { + a << ','; + } + } + switch (kpos) + { + + case 0: + a << std::to_string(iter.id); + break; + case 1: + a << std::to_string(iter.randomnumber); + break; + } + j++; + } + if (isyinhao && j > 0) + { + a << '"'; + } + + return a.str(); + } + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + switch (vpos) + { + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + std::string vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + switch (vpos) + { + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + std::string ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + } + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + if (ktemp.size() > 0) + { + a.emplace(ktemp, vtemp); + } + } + + return a; + } + + template , bool>::type = true> + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + a.emplace(iter.id, iter); + break; + case 1: + a.emplace(iter.randomnumber, iter); + break; + } + } + + return a; + } + + template ::value, bool>::type = true> + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + switch (vpos) + { + } + + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + switch (vpos) + { + } + + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + + switch (kpos) + { + } + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + a.emplace_back(ktemp, vtemp); + } + + return a; + } + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::vector> a; + + return a; + } + + template , bool>::type = true> + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos = findcolpos(keyname); + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + a.emplace_back(iter.id, iter); + break; + case 1: + a.emplace_back(iter.randomnumber, iter); + break; + } + } + + return a; + } + template ::value, bool>::type = true> + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + return a; + } + template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + + switch (dpos) + { + } + } + + return a; + } + + template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + } + } + + return a; + } + + template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + + switch (dpos) + { + } + } + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for (auto &iter : record) + { + + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + + switch (vpos) + { + } + + switch (dpos) + { + } + } + + return a; + } + + template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + + switch (vpos) + { + } + + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + } + } + + return a; + } + template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for (auto &iter : record) + { + switch (kpos) + { + + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } + + switch (vpos) + { + } + + switch (dpos) + { + } + } - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - return a; - } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - std::string vtemp; - for(auto &iter:record) - { - switch(kpos) - { + } - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - std::string ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for (auto &iter : record) + { + switch (kpos) + { + } - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + switch (dpos) + { + } + } - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; + return a; + } - } - if(ktemp.size()>0) - { - a.emplace(ktemp,vtemp); - } - } - - return a; - } - - template,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - case 0: - a.emplace(iter.id,iter); - break; - case 1: - a.emplace(iter.randomnumber,iter); - break; + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; - } - } - - return a; - } - - template::value,bool>::type = true > - std::map getmapRows([[maybe_unused]] std::string keyname) + for (auto &iter : record) { - std::map a; - + switch (kpos) + { + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } + + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + } + } return a; } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - - } - - a.emplace_back(ktemp,vtemp); - } - - - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - - } - - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - - switch(kpos) - { + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { + for (auto &iter : record) + { - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - - } - a.emplace_back(ktemp,vtemp); - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::vector> a; - - return a; - } - - template,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) - { - switch(kpos) - { + switch (kpos) + { + } + + switch (vpos) + { + case 0: + vtemp = iter.id; + break; + case 1: + vtemp = iter.randomnumber; + break; + } - case 0: - a.emplace_back(iter.id,iter); - break; -case 1: - a.emplace_back(iter.randomnumber,iter); - break; + switch (dpos) + { + } + } - } - } - return a; } - template::value,bool>::type = true > - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - + + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; return a; } - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - for(auto &iter:record) - { - switch(kpos) - { - - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - } - } + unsigned char kpos, vpos, dpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + dpos = findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + for (auto &iter : record) { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for(auto &iter:record) + switch (kpos) { - switch(kpos) - { + } - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; + switch (vpos) + { + } - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { + switch (dpos) + { + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; + } + } - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ + return a; + } - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - - switch(kpos) - { + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + { + std::map>> a; - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } + return a; + } - switch(vpos){ - } + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - switch(dpos){ + return a; + } - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) { - std::map>> a; + std::map> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; + return a; + } - for(auto &iter:record) - { - switch(kpos) - { + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; - switch(vpos){ - } + for (auto &iter : record) + { - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; + switch (kpos) + { + } + switch (vpos) + { + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; } - } - + } + return a; } - template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for(auto &iter:record) - { - switch(kpos) - { - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - switch(vpos){ - } + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; - switch(dpos){ + for (auto &iter : record) + { - } - } - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for(auto &iter:record) - { - switch(kpos) - { + switch (kpos) + { - } + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } + switch (vpos) + { + } + } - switch(dpos){ + return a; + } - } - } - + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; + + for (auto &iter : record) { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for(auto &iter:record) + switch (kpos) { - - switch(kpos) - { - } - - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } - - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } - } - } - - return a; + switch (vpos) + { + } } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; + return a; + } - for(auto &iter:record) - { - - switch(kpos) - { + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map> a; - } + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; + //U vtemp; - switch(vpos){ - case 0: - vtemp=iter.id; - break; - case 1: - vtemp=iter.randomnumber; - break; - } + for (auto &iter : record) + { - switch(dpos){ + switch (kpos) + { + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - return a; - } - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos,vpos,dpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - dpos=findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - for(auto &iter:record) + switch (vpos) { - - switch(kpos) - { + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; + } + } - } + return a; + } - switch(vpos){ - } + template , bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; - switch(dpos){ - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; + unsigned char kpos; + kpos = findcolpos(keyname); - } - } - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) - { - std::map>> a; - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + for (auto &iter : record) { - std::map> a; + switch (kpos) + { - - return a; - } - - template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - return a; + case 0: + a[iter.id].emplace_back(iter); + break; + case 1: + a[iter.randomnumber].emplace_back(iter); + break; + } } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - for(auto &iter:record) - { - - switch(kpos) - { + return a; + } - } + template ::value, bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; - case 1: - a[ktemp].emplace_back(iter.randomnumber); - break; + return a; + } - } - } - - return a; - } - - template,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { + template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } + return a; + } - switch(vpos){ + template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - } - } + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + for (auto &iter : record) { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - for(auto &iter:record) + switch (kpos) { - - switch(kpos) - { + } - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } + switch (vpos) + { + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; + } + } - switch(vpos){ + return a; + } - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - //U vtemp; - - for(auto &iter:record) - { - - switch(kpos) - { + template , bool>::type = true, typename std::enable_if, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - a[ktemp].emplace_back(iter.id); - break; - case 1: - a[ktemp].emplace_back(iter.randomnumber); - break; + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); + T ktemp; - } - } - - return a; - } - - template,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) + for (auto &iter : record) { - std::map> a; - - unsigned char kpos; - kpos=findcolpos(keyname); - for(auto &iter:record) + switch (kpos) { - switch(kpos) - { - - case 0: - a[iter.id].emplace_back(iter); - break; - case 1: - a[iter.randomnumber].emplace_back(iter); - break; - } - } - - return a; - } - - template::value,bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; - - return a; - } - - template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - return a; - } - - template::value,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } - } + switch (vpos) + { + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; + } + } - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - case 1: - a[ktemp][iter.randomnumber].emplace_back(iter); - break; + return a; + } - } - } + template , bool>::type = true, typename std::enable_if::value, bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + { + std::map>> a; - - return a; - } - - template,bool>::type = true,typename std::enable_if,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); + unsigned char kpos, vpos; + kpos = findcolpos(keyname); + vpos = findcolpos(valname); T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } - - switch(vpos){ - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - case 1: - a[ktemp][iter.randomnumber].emplace_back(iter); - break; - - } - } - - return a; - } - - template,bool>::type = true,typename std::enable_if::value,bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) - { - std::map>> a; - - - unsigned char kpos,vpos; - kpos=findcolpos(keyname); - vpos=findcolpos(valname); - T ktemp; - - for(auto &iter:record) - { - - switch(kpos) - { + for (auto &iter : record) + { - case 0: - ktemp=iter.id; - break; - case 1: - ktemp=iter.randomnumber; - break; - } + switch (kpos) + { - switch(vpos){ + case 0: + ktemp = iter.id; + break; + case 1: + ktemp = iter.randomnumber; + break; + } - } - } - - return a; + switch (vpos) + { + } } - - }; - -} + return a; + } +}; + +}// namespace orm #endif - \ No newline at end of file From fc9852ce3abac634fd358376f62c922327420251 Mon Sep 17 00:00:00 2001 From: Petrik Date: Thu, 16 Jan 2025 21:50:58 +0100 Subject: [PATCH 1077/1766] [ruby/rack] Detect workers for Iodine +------------------------+---------+------+------+-----+-----+-------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|weighted_score| +------------------------+---------+------+------+-----+-----+-------+--------------+ | master| 259715| 20822|230636|54927|21659| 49761| 2465| |rack/iodine-set-workers2| 259700| 20056|265800|98671|60333| 50916| 3370| +------------------------+---------+------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/rack/rack-iodine.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rack/rack-iodine.dockerfile b/frameworks/Ruby/rack/rack-iodine.dockerfile index 999eb9fc6e7..9b4908fb177 100644 --- a/frameworks/Ruby/rack/rack-iodine.dockerfile +++ b/frameworks/Ruby/rack/rack-iodine.dockerfile @@ -19,4 +19,4 @@ COPY . . EXPOSE 8080 -CMD bundle exec iodine -p 8080 +CMD bundle exec iodine -p 8080 -w $(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From 9efccbd363ec7a3b8fc8ef53e140f514c6e45297 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 17 Jan 2025 16:09:21 +0800 Subject: [PATCH 1078/1766] update new test --- frameworks/C++/paozhu/paozhu.dockerfile | 78 ++++++++++++------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 6b91336fdaa..a6eab1e0235 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -39,29 +39,29 @@ COPY ./paozhu_benchmark/common ./paozhu/ # RUN ls -l ./paozhu # RUN pwd -# RUN mkdir ./paozhu/common -# RUN mkdir ./paozhu/libs -# RUN mkdir ./paozhu/libs/types -# COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ -# COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ +RUN mkdir ./paozhu/common +RUN mkdir ./paozhu/libs +RUN mkdir ./paozhu/libs/types +COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -# RUN mkdir ./paozhu/controller -# RUN mkdir ./paozhu/controller/include -# RUN mkdir ./paozhu/controller/src +RUN mkdir ./paozhu/controller +RUN mkdir ./paozhu/controller/include +RUN mkdir ./paozhu/controller/src -# COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ -# COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ +COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ -# COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ -# COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ -# COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf @@ -69,37 +69,37 @@ COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf # must use testbenchmark.cpp to test benchmark COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt -# RUN mkdir ./paozhu/view -# RUN mkdir ./paozhu/view/techempower +RUN mkdir ./paozhu/view +RUN mkdir ./paozhu/view/techempower -# COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ +COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ -# RUN mkdir ./paozhu/viewsrc -# RUN mkdir ./paozhu/viewsrc/include -# RUN mkdir ./paozhu/viewsrc/view -# RUN mkdir ./paozhu/viewsrc/view/techempower +RUN mkdir ./paozhu/viewsrc +RUN mkdir ./paozhu/viewsrc/include +RUN mkdir ./paozhu/viewsrc/view +RUN mkdir ./paozhu/viewsrc/view/techempower -# COPY ./paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp ./paozhu/viewsrc/view/techempower/ -# COPY ./paozhu_benchmark/viewsrc/include/viewsrc.h ./paozhu/viewsrc/include/ -# COPY ./paozhu_benchmark/viewsrc/include/regviewmethod.hpp ./paozhu/viewsrc/include/ +COPY ./paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp ./paozhu/viewsrc/view/techempower/ +COPY ./paozhu_benchmark/viewsrc/include/viewsrc.h ./paozhu/viewsrc/include/ +COPY ./paozhu_benchmark/viewsrc/include/regviewmethod.hpp ./paozhu/viewsrc/include/ -# RUN mkdir ./paozhu/orm -# RUN mkdir ./paozhu/orm/include +RUN mkdir ./paozhu/orm +RUN mkdir ./paozhu/orm/include -# COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ -# COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ -# COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ +COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ -# RUN mkdir ./paozhu/models -# RUN mkdir ./paozhu/models/include +RUN mkdir ./paozhu/models +RUN mkdir ./paozhu/models/include -# COPY ./paozhu_benchmark/models/include/Fortune.h ./paozhu/models/include/ -# COPY ./paozhu_benchmark/models/include/World.h ./paozhu/models/include/ -# COPY ./paozhu_benchmark/models/World.cpp ./paozhu/models/ -# COPY ./paozhu_benchmark/models/Fortune.cpp ./paozhu/models/ +COPY ./paozhu_benchmark/models/include/Fortune.h ./paozhu/models/include/ +COPY ./paozhu_benchmark/models/include/World.h ./paozhu/models/include/ +COPY ./paozhu_benchmark/models/World.cpp ./paozhu/models/ +COPY ./paozhu_benchmark/models/Fortune.cpp ./paozhu/models/ WORKDIR /paozhu RUN unzip asio.zip From 657adc066be7e1c15566130eef23c947a318801e Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 17 Jan 2025 16:34:44 +0800 Subject: [PATCH 1079/1766] fix directory error --- frameworks/C++/paozhu/paozhu.dockerfile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index a6eab1e0235..af820de7002 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -20,7 +20,7 @@ RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip RUN rm -Rf ./paozhu/controller RUN rm -Rf ./paozhu/libs -RUN rm -Rf ./paozhu/view +# RUN rm -Rf ./paozhu/view RUN rm -Rf ./paozhu/viewsrc RUN rm -Rf ./paozhu/orm RUN rm -Rf ./paozhu/models @@ -28,14 +28,14 @@ RUN rm -Rf ./paozhu/common -COPY ./paozhu_benchmark/controller ./paozhu/ -COPY ./paozhu_benchmark/libs ./paozhu/ -COPY ./paozhu_benchmark/view ./paozhu/ -COPY ./paozhu_benchmark/viewsrc ./paozhu/ +# COPY ./paozhu_benchmark/controller ./paozhu/ +# COPY ./paozhu_benchmark/libs ./paozhu/ +# COPY ./paozhu_benchmark/view ./paozhu/ +# COPY ./paozhu_benchmark/viewsrc ./paozhu/ -COPY ./paozhu_benchmark/orm ./paozhu/ -COPY ./paozhu_benchmark/models ./paozhu/ -COPY ./paozhu_benchmark/common ./paozhu/ +# COPY ./paozhu_benchmark/orm ./paozhu/ +# COPY ./paozhu_benchmark/models ./paozhu/ +# COPY ./paozhu_benchmark/common ./paozhu/ # RUN ls -l ./paozhu # RUN pwd @@ -69,10 +69,10 @@ COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf # must use testbenchmark.cpp to test benchmark COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt -RUN mkdir ./paozhu/view -RUN mkdir ./paozhu/view/techempower +# RUN mkdir ./paozhu/view +# RUN mkdir ./paozhu/view/techempower -COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ +# COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ RUN mkdir ./paozhu/viewsrc RUN mkdir ./paozhu/viewsrc/include From 18e6cef68e82241b0f9b122360c1db09cac0361a Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 17 Jan 2025 17:40:37 +0800 Subject: [PATCH 1080/1766] fix db update error --- .../paozhu/paozhu_benchmark/conf/server.conf | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf index 9013265e678..265e2193570 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf @@ -18,19 +18,19 @@ clean_cron =m5t600 ;5-minute interval clean 600 seconds ago inactive connection links_restart_process =n9998877ts1te5 ;More than 15000 connections, restart the process from 1:00 am to 5:00 am session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve static_file_compress_cache=1 ;1 enable, Cache static file compress(gzip,br) content to cache directory -modelspath=/root/benchmark/models -serverpath=/root/benchmark -viewpath=/root/benchmark/view -viewsopath=/root/benchmark/module/view +modelspath=/paozhu/models +serverpath=/paozhu +viewpath=/paozhu/view +viewsopath=/paozhu/module/view -controlpath=/root/benchmark/controller -controlsopath=/root/benchmark/module/controller +controlpath=/paozhu/controller +controlsopath=/paozhu/module/controller -temppath=/root/benchmark/temp -logpath=/root/benchmark/log -wwwpath=/root/benchmark/www/default -pluginspath=/root/benchmark/plugins -libspath=/root/benchmark/libs +temppath=/paozhu/temp +logpath=/paozhu/log +wwwpath=/paozhu/www/default +pluginspath=/paozhu/plugins +libspath=/paozhu/libs directorylist=0 index=index.html ;usehtmlcache=1 From 1b12a50087d5bd8e93c2122502508fd40ea4a858 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 17 Jan 2025 18:19:59 +0800 Subject: [PATCH 1081/1766] fix db update error --- frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf index 1700d25a66e..a2a992d9361 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf @@ -6,7 +6,8 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=5 +maxpool=120 +minpool=20 dbtype=mysql type=second @@ -16,5 +17,6 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=20 +maxpool=120 +minpool=20 dbtype=mysql From 0665a5b5bf6bceb9572057c27af50033eaa00d79 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 17 Jan 2025 22:29:26 +0800 Subject: [PATCH 1082/1766] fix db update error --- .../controller/src/techempower.cpp | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index f3111732864..706d1db0edc 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -42,7 +42,12 @@ asio::awaitable techempowerdb(std::shared_ptr peer) unsigned int rd_num = rand_range(1, 10000); myworld.where("id", rd_num); myworld.limit(1); - co_await myworld.async_fetch_one(); + std::size_t n = co_await myworld.async_fetch_one(); + if (n == 0) + { + n = co_await myworld.async_fetch_one(); + } + peer->output = myworld.data_tojson(); co_return ""; } @@ -69,7 +74,11 @@ asio::awaitable techempowerqueries(std::shared_ptr peer) myworld.wheresql.clear(); unsigned int rd_num = rand_range(1, 10000); myworld.where("id", rd_num); - co_await myworld.async_fetch_append(); + std::size_t n = co_await myworld.async_fetch_append(); + if (n == 0) + { + n = co_await myworld.async_fetch_append(); + } } peer->output = myworld.to_json(); @@ -83,7 +92,12 @@ asio::awaitable techempowerfortunes(std::shared_ptr peer) peer->set_header("Date", get_gmttime()); auto myfortune = orm::Fortune(); - co_await myfortune.async_fetch(); + std::size_t n = co_await myfortune.async_fetch(); + if (n == 0) + { + n = co_await myfortune.async_fetch(); + } + myfortune.data.id = 0; myfortune.data.message = "Additional fortune added at request time."; myfortune.record.push_back(myfortune.data); @@ -130,13 +144,22 @@ asio::awaitable techempowerupdates(std::shared_ptr peer) { myworld.wheresql.clear(); myworld.where("id", rand_range(1, 10000)); - co_await myworld.async_fetch_append(); + std::size_t n = co_await myworld.async_fetch_append(); + if (n == 0) + { + n = co_await myworld.async_fetch_append(); + } if (myworld.effect() > 0) { unsigned int j = myworld.record.size() - 1; myworld.data.randomnumber = rand_range(1, 10000); myworld.record[j].randomnumber = myworld.data.randomnumber; - co_await myworld.async_update("randomnumber"); + + n = co_await myworld.async_update("randomnumber"); + if (n == 0) + { + n = co_await myworld.async_update("randomnumber"); + } } } peer->output = myworld.to_json(); From 25f0f394bb080e418abe5c49590e8b3881882a37 Mon Sep 17 00:00:00 2001 From: hzq Date: Fri, 17 Jan 2025 22:56:30 +0800 Subject: [PATCH 1083/1766] fix db update error --- .../C++/paozhu/paozhu_benchmark/conf/orm.conf | 8 ++--- .../controller/src/techempower.cpp | 33 +++---------------- 2 files changed, 9 insertions(+), 32 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf index a2a992d9361..8d3e8dd66ae 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf @@ -6,8 +6,8 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=120 -minpool=20 +maxpool=220 +minpool=30 dbtype=mysql type=second @@ -17,6 +17,6 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=120 -minpool=20 +maxpool=220 +minpool=30 dbtype=mysql diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index 706d1db0edc..f3111732864 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -42,12 +42,7 @@ asio::awaitable techempowerdb(std::shared_ptr peer) unsigned int rd_num = rand_range(1, 10000); myworld.where("id", rd_num); myworld.limit(1); - std::size_t n = co_await myworld.async_fetch_one(); - if (n == 0) - { - n = co_await myworld.async_fetch_one(); - } - + co_await myworld.async_fetch_one(); peer->output = myworld.data_tojson(); co_return ""; } @@ -74,11 +69,7 @@ asio::awaitable techempowerqueries(std::shared_ptr peer) myworld.wheresql.clear(); unsigned int rd_num = rand_range(1, 10000); myworld.where("id", rd_num); - std::size_t n = co_await myworld.async_fetch_append(); - if (n == 0) - { - n = co_await myworld.async_fetch_append(); - } + co_await myworld.async_fetch_append(); } peer->output = myworld.to_json(); @@ -92,12 +83,7 @@ asio::awaitable techempowerfortunes(std::shared_ptr peer) peer->set_header("Date", get_gmttime()); auto myfortune = orm::Fortune(); - std::size_t n = co_await myfortune.async_fetch(); - if (n == 0) - { - n = co_await myfortune.async_fetch(); - } - + co_await myfortune.async_fetch(); myfortune.data.id = 0; myfortune.data.message = "Additional fortune added at request time."; myfortune.record.push_back(myfortune.data); @@ -144,22 +130,13 @@ asio::awaitable techempowerupdates(std::shared_ptr peer) { myworld.wheresql.clear(); myworld.where("id", rand_range(1, 10000)); - std::size_t n = co_await myworld.async_fetch_append(); - if (n == 0) - { - n = co_await myworld.async_fetch_append(); - } + co_await myworld.async_fetch_append(); if (myworld.effect() > 0) { unsigned int j = myworld.record.size() - 1; myworld.data.randomnumber = rand_range(1, 10000); myworld.record[j].randomnumber = myworld.data.randomnumber; - - n = co_await myworld.async_update("randomnumber"); - if (n == 0) - { - n = co_await myworld.async_update("randomnumber"); - } + co_await myworld.async_update("randomnumber"); } } peer->output = myworld.to_json(); From 651b1bc312df91f9e2644398f5ca21ed3cf96fef Mon Sep 17 00:00:00 2001 From: Roman Samoilov <2270393+rsamoilov@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:46:00 +0000 Subject: [PATCH 1084/1766] Remove json and plaintext tests to reduce test time --- .../rage-sequel/app/controllers/benchmarks_controller.rb | 8 -------- frameworks/Ruby/rage-sequel/benchmark_config.json | 2 -- frameworks/Ruby/rage-sequel/config/routes.rb | 2 -- 3 files changed, 12 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb b/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb index b02e2d19416..082905ccda8 100644 --- a/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb +++ b/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb @@ -8,14 +8,6 @@ class BenchmarksController < ApplicationController headers["server"] = "rage" end - def json - render json: { message: "Hello, World!" } - end - - def plaintext - render plain: "Hello, World!" - end - def db render json: World.with_pk(random_id).values end diff --git a/frameworks/Ruby/rage-sequel/benchmark_config.json b/frameworks/Ruby/rage-sequel/benchmark_config.json index e4324c06062..4cbe6d248f4 100755 --- a/frameworks/Ruby/rage-sequel/benchmark_config.json +++ b/frameworks/Ruby/rage-sequel/benchmark_config.json @@ -3,8 +3,6 @@ "tests": [ { "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", diff --git a/frameworks/Ruby/rage-sequel/config/routes.rb b/frameworks/Ruby/rage-sequel/config/routes.rb index 98def92a7e7..c03b04a7f52 100644 --- a/frameworks/Ruby/rage-sequel/config/routes.rb +++ b/frameworks/Ruby/rage-sequel/config/routes.rb @@ -1,8 +1,6 @@ Rage.routes.draw do root to: ->(env) { [200, {}, "It works!"] } - get "json", to: "benchmarks#json" - get "plaintext", to: "benchmarks#plaintext" get "db", to: "benchmarks#db" get "queries", to: "benchmarks#queries" get "fortunes", to: "benchmarks#fortunes" From 087496e98cf2c956eedafc49403f77ea85814ec6 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Mon, 13 Jan 2025 23:26:55 +0100 Subject: [PATCH 1085/1766] [ReactPHP] Show any errors while handling requests --- frameworks/PHP/reactphp/server.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frameworks/PHP/reactphp/server.php b/frameworks/PHP/reactphp/server.php index ddfb5a07145..278208b6291 100644 --- a/frameworks/PHP/reactphp/server.php +++ b/frameworks/PHP/reactphp/server.php @@ -8,6 +8,9 @@ require_once __DIR__.'/app.php'; $server = new HttpServer(requestHandler()); +$server->on('error', function (\Throwable $error) { + echo $error->getMessage(), PHP_EOL; +}); $socket = new SocketServer('0.0.0.0:8080'); $server->listen($socket); From d0343383abb58d6bfce4dbfd5e00613927c4c72e Mon Sep 17 00:00:00 2001 From: vividsnow Date: Sat, 18 Jan 2025 02:12:38 +0300 Subject: [PATCH 1086/1766] [perl/feersum] bump dependency to fix pipelined plaintext test --- frameworks/Perl/feersum/cpanfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Perl/feersum/cpanfile b/frameworks/Perl/feersum/cpanfile index 9b868f48ffe..12b329a825a 100644 --- a/frameworks/Perl/feersum/cpanfile +++ b/frameworks/Perl/feersum/cpanfile @@ -1,4 +1,4 @@ -requires 'Feersum', '== 1.503'; +requires 'Feersum', '== 1.504'; requires 'JSON::XS', '== 4.03'; requires 'DBD::MariaDB', '== 1.23'; requires 'DBD::Pg', '== 3.18.0'; From 17cb029df46347a453c77ba8d7f43501e03c65d3 Mon Sep 17 00:00:00 2001 From: "a.stecher" Date: Sat, 18 Jan 2025 01:00:42 +0100 Subject: [PATCH 1087/1766] Remove unnecessary file-exists checks. --- .../PHP/laravel/deploy/franken/Caddyfile | 24 +++++++++++++++++++ .../laravel-octane-frankenphp.dockerfile | 3 +-- frameworks/PHP/php/deploy/franken/Caddyfile | 7 ++++-- frameworks/PHP/symfony/deploy/Caddyfile | 17 +++++-------- .../PHP/symfony/symfony-franken.dockerfile | 1 - 5 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 frameworks/PHP/laravel/deploy/franken/Caddyfile diff --git a/frameworks/PHP/laravel/deploy/franken/Caddyfile b/frameworks/PHP/laravel/deploy/franken/Caddyfile new file mode 100644 index 00000000000..6c4cc54627c --- /dev/null +++ b/frameworks/PHP/laravel/deploy/franken/Caddyfile @@ -0,0 +1,24 @@ +{ + {$CADDY_GLOBAL_OPTIONS} + + admin {$CADDY_SERVER_ADMIN_HOST}:{$CADDY_SERVER_ADMIN_PORT} + + frankenphp { + worker "{$APP_PUBLIC_PATH}/frankenphp-worker.php" {$CADDY_SERVER_WORKER_COUNT} + } +} + +{$CADDY_SERVER_SERVER_NAME} { + route { + # Mercure configuration is injected here... + {$CADDY_SERVER_EXTRA_DIRECTIVES} + + # FrankenPHP! + # disable static files for this benchmark + # by using php instead of php_server + rewrite frankenphp-worker.php + php { + root "{$APP_PUBLIC_PATH}" + } + } +} diff --git a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile index 2ad30a612e3..c21eeeacf8a 100644 --- a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile +++ b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile @@ -1,7 +1,6 @@ FROM dunglas/frankenphp RUN install-php-extensions \ - intl \ opcache \ pcntl \ pdo_mysql \ @@ -26,4 +25,4 @@ RUN frankenphp -v EXPOSE 8080 -ENTRYPOINT ["php", "artisan", "octane:frankenphp", "--port=8080"] +ENTRYPOINT ["php", "artisan", "octane:frankenphp", "--port=8080", "--caddyfile=/app/deploy/franken/Caddyfile"] diff --git a/frameworks/PHP/php/deploy/franken/Caddyfile b/frameworks/PHP/php/deploy/franken/Caddyfile index b6aa805f871..72400a7e489 100644 --- a/frameworks/PHP/php/deploy/franken/Caddyfile +++ b/frameworks/PHP/php/deploy/franken/Caddyfile @@ -11,11 +11,14 @@ :8080 route { - root * /php # FrankenPHP! + # disable static files for this benchmark + # by using php instead of php_server @phpFiles path *.php - php @phpFiles + php @phpFiles { + root /php + } respond 404 } \ No newline at end of file diff --git a/frameworks/PHP/symfony/deploy/Caddyfile b/frameworks/PHP/symfony/deploy/Caddyfile index f794fd3d647..6faa66909af 100644 --- a/frameworks/PHP/symfony/deploy/Caddyfile +++ b/frameworks/PHP/symfony/deploy/Caddyfile @@ -11,18 +11,13 @@ :8080 route { - root * /symfony/public - # If the requested file does not exist, try index files - @indexFiles file { - try_files {path} {path}/runtime.php runtime.php - split_path .php + # FrankenPHP! + # disable static files for this benchmark + # by using php instead of php_server + rewrite runtime.php + php { + root /symfony/public } - rewrite @indexFiles {http.matchers.file.relative} - - # FrankenPHP! - @phpFiles path *.php - php @phpFiles - respond 404 } diff --git a/frameworks/PHP/symfony/symfony-franken.dockerfile b/frameworks/PHP/symfony/symfony-franken.dockerfile index 967b9370514..05b8267409b 100644 --- a/frameworks/PHP/symfony/symfony-franken.dockerfile +++ b/frameworks/PHP/symfony/symfony-franken.dockerfile @@ -2,7 +2,6 @@ FROM dunglas/frankenphp # add additional extensions here: RUN install-php-extensions \ - intl \ opcache \ pdo_pgsql \ zip > /dev/null From 7789fb6f15c1ebcb4cbea2b8da70236d4b45ca2d Mon Sep 17 00:00:00 2001 From: Joanhey Date: Sat, 18 Jan 2025 11:41:08 +0100 Subject: [PATCH 1088/1766] [php] Reactphp add libuv variant --- frameworks/PHP/reactphp/benchmark_config.json | 19 ++++++++++ .../PHP/reactphp/reactphp-libuv.dockerfile | 35 +++++++++++++++++++ frameworks/PHP/reactphp/reactphp.dockerfile | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 frameworks/PHP/reactphp/reactphp-libuv.dockerfile diff --git a/frameworks/PHP/reactphp/benchmark_config.json b/frameworks/PHP/reactphp/benchmark_config.json index eb04329ba1a..e73762276f2 100644 --- a/frameworks/PHP/reactphp/benchmark_config.json +++ b/frameworks/PHP/reactphp/benchmark_config.json @@ -20,6 +20,25 @@ "display_name": "reactphp", "notes": "", "versus": "php" + }, + "libuv": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "framework": "reactphp", + "language": "PHP", + "flavor": "PHP8", + "database": "MySQL", + "orm": "Raw", + "platform": "reactphp", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "reactphp [libuv]", + "notes": "", + "versus": "reactphp" } }] } diff --git a/frameworks/PHP/reactphp/reactphp-libuv.dockerfile b/frameworks/PHP/reactphp/reactphp-libuv.dockerfile new file mode 100644 index 00000000000..48126b5c59c --- /dev/null +++ b/frameworks/PHP/reactphp/reactphp-libuv.dockerfile @@ -0,0 +1,35 @@ +FROM ubuntu:24.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 > /dev/null +RUN apt-get update -yqq > /dev/null && \ + apt-get install -yqq git unzip wget curl build-essential \ + php8.4-cli php8.4-mbstring php8.4-dev php8.4-xml > /dev/null + +# An extension is required! +# We deal with concurrencies over 1k, which stream_select doesn't support. +# libuv +RUN apt-get install -yqq libuv1-dev > /dev/null \ + && pecl install uv-beta > /dev/null \ + && echo "extension=uv.so" > /etc/php/8.4/cli/conf.d/uv.ini + +# libevent +# RUN apt-get install -y libevent-dev > /dev/null \ +# && pecl install event-3.1.4 > /dev/null \ +# && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +COPY --link deploy/conf/* /etc/php/8.4/cli/conf.d/ + +WORKDIR /reactphp +COPY --link . . + +RUN composer install --prefer-dist --optimize-autoloader --no-dev --quiet + +EXPOSE 8080 + +ENTRYPOINT ["/usr/bin/php"] +CMD ["server.php"] diff --git a/frameworks/PHP/reactphp/reactphp.dockerfile b/frameworks/PHP/reactphp/reactphp.dockerfile index a46c613938f..0ecb546a1c3 100644 --- a/frameworks/PHP/reactphp/reactphp.dockerfile +++ b/frameworks/PHP/reactphp/reactphp.dockerfile @@ -27,7 +27,7 @@ COPY --link deploy/conf/* /etc/php/8.4/cli/conf.d/ WORKDIR /reactphp COPY --link . . -RUN composer install --prefer-dist --optimize-autoloader --no-dev +RUN composer install --prefer-dist --optimize-autoloader --no-dev --quiet EXPOSE 8080 From 8825d8caa466081b74bbf9799ce76e3e213ae863 Mon Sep 17 00:00:00 2001 From: hzq Date: Sat, 18 Jan 2025 20:48:26 +0800 Subject: [PATCH 1089/1766] fix paozhu --- frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf index 8d3e8dd66ae..b8eae8460ab 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf @@ -6,7 +6,7 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=220 +maxpool=120 minpool=30 dbtype=mysql @@ -17,6 +17,6 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=220 +maxpool=120 minpool=30 dbtype=mysql From 2c512a2000044475549dc9bc1fce21f1c79a750b Mon Sep 17 00:00:00 2001 From: root Date: Sun, 19 Jan 2025 03:06:47 +0800 Subject: [PATCH 1090/1766] add a framework php/cyberphp --- frameworks/PHP/cyberphp/CyberPHP.jpg | Bin 0 -> 79155 bytes frameworks/PHP/cyberphp/README.md | 26 ++ frameworks/PHP/cyberphp/app/config.php | 61 +++++ .../PHP/cyberphp/app/controller/Index.php | 76 ++++++ frameworks/PHP/cyberphp/app/helpers.php | 84 +++++++ frameworks/PHP/cyberphp/app/route.php | 12 + .../cyberphp/app/views/errors/exception.html | 62 +++++ frameworks/PHP/cyberphp/benchmark_config.json | 30 +++ frameworks/PHP/cyberphp/bootstrap.php | 41 ++++ frameworks/PHP/cyberphp/composer.json | 32 +++ frameworks/PHP/cyberphp/cyberphp.dockerfile | 26 ++ .../cyberphp/extend/DemoExtension/Demo.php | 12 + frameworks/PHP/cyberphp/php.ini | 11 + frameworks/PHP/cyberphp/public/favicon.ico | Bin 0 -> 16958 bytes frameworks/PHP/cyberphp/public/index.php | 23 ++ frameworks/PHP/cyberphp/public/logo.png | Bin 0 -> 123860 bytes frameworks/PHP/cyberphp/server.php | 85 +++++++ frameworks/PHP/cyberphp/src/App.php | 201 +++++++++++++++ frameworks/PHP/cyberphp/src/Middleware.php | 48 ++++ frameworks/PHP/cyberphp/src/Request.php | 232 ++++++++++++++++++ frameworks/PHP/cyberphp/src/Response.php | 218 ++++++++++++++++ frameworks/PHP/cyberphp/src/Route.php | 61 +++++ frameworks/PHP/cyberphp/src/Utility.php | 47 ++++ 23 files changed, 1388 insertions(+) create mode 100644 frameworks/PHP/cyberphp/CyberPHP.jpg create mode 100755 frameworks/PHP/cyberphp/README.md create mode 100644 frameworks/PHP/cyberphp/app/config.php create mode 100644 frameworks/PHP/cyberphp/app/controller/Index.php create mode 100644 frameworks/PHP/cyberphp/app/helpers.php create mode 100644 frameworks/PHP/cyberphp/app/route.php create mode 100644 frameworks/PHP/cyberphp/app/views/errors/exception.html create mode 100755 frameworks/PHP/cyberphp/benchmark_config.json create mode 100644 frameworks/PHP/cyberphp/bootstrap.php create mode 100644 frameworks/PHP/cyberphp/composer.json create mode 100644 frameworks/PHP/cyberphp/cyberphp.dockerfile create mode 100644 frameworks/PHP/cyberphp/extend/DemoExtension/Demo.php create mode 100644 frameworks/PHP/cyberphp/php.ini create mode 100644 frameworks/PHP/cyberphp/public/favicon.ico create mode 100644 frameworks/PHP/cyberphp/public/index.php create mode 100644 frameworks/PHP/cyberphp/public/logo.png create mode 100644 frameworks/PHP/cyberphp/server.php create mode 100644 frameworks/PHP/cyberphp/src/App.php create mode 100644 frameworks/PHP/cyberphp/src/Middleware.php create mode 100644 frameworks/PHP/cyberphp/src/Request.php create mode 100644 frameworks/PHP/cyberphp/src/Response.php create mode 100644 frameworks/PHP/cyberphp/src/Route.php create mode 100644 frameworks/PHP/cyberphp/src/Utility.php diff --git a/frameworks/PHP/cyberphp/CyberPHP.jpg b/frameworks/PHP/cyberphp/CyberPHP.jpg new file mode 100644 index 0000000000000000000000000000000000000000..638b6fb15285614dbf79ab9878e50ffb124ae44d GIT binary patch literal 79155 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%0DSZ{dE1i^2Wu{81okV%K|=;ZPg2o&Yx) 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⪻!Pd@0Dq!t5thk2 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 'Cyber', + // Request middleware runs after obtaining request body and before parsing route + // Mainly used for blacklist, whitelist, system maintenance, request filtering, data access, etc. + 'request_middleware' => [ + // \app\common\middleware\IpBlacklistMiddleware::class,// IP blacklist middleware + // \app\middleware\RateLimitMiddleware::class,// Rate limit middleware + // \app\middleware\SecurityMiddleware::class, // Security protection (CSRF/XSS filtering/SQL injection) middleware + ], + // Business middleware runs after parsing route and before executing controller method + // Mainly used for common business such as user authentication + 'middleware' => [ + // \app\common\middleware\Route1Middleware::class, + // \app\common\middleware\Route2Middleware::class, + ], + 'orm' => 'pdo', + 'pdo' => [ + 'dsn' => 'pgsql:host=tfb-database;dbname=hello_world', + 'username' => 'benchmarkdbuser', + 'password' => 'benchmarkdbpass', + 'options' => [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ] + ], + 'eloquent' => [ + 'driver' => 'mysql', + 'host' => '127.0.0.1', + 'database' => 'lavaman', + 'username' => 'root', + 'password' => 'root', + 'charset' => 'utf8mb4', + 'prefix' => '', + ], + 'thinkorm' => [ + 'default' => 'mysql', + 'connections' => [ + 'mysql' => [ + 'type' => 'mysql', // Database type + 'hostname' => '127.0.0.1',// Server address + 'database' => 'lavaman',// Database name + 'username' => 'root',// Database username + 'password' => 'root',// Database password + 'hostport' => '',// Database connection port + 'params' => [], + 'charset' => 'utf8mb4',// Database encoding default utf8 + 'prefix' => '',// Table prefix + ], + ], + ], + 'cookie' => [ + 'expires' => 0, + 'path' => '/', + 'domain' => '', + 'secure' => true, + 'httponly' => true, + 'samesite' => 'Lax' // None, Lax, Strict + ] +]; \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/app/controller/Index.php b/frameworks/PHP/cyberphp/app/controller/Index.php new file mode 100644 index 00000000000..717dec13973 --- /dev/null +++ b/frameworks/PHP/cyberphp/app/controller/Index.php @@ -0,0 +1,76 @@ + 'Hello, World!']); + } + + public function plaintext() + { + return Response::text('Hello, World!'); + } + + public function db() + { + $prepare = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $prepare->execute([mt_rand(1, 10000)]); + return Response::json($prepare->fetch()); + } + public function fortunes() + { + $fortune = app()->db->prepare('SELECT id,message FROM Fortune'); + $fortune->execute(); + $arr = $fortune->fetchAll(\PDO::FETCH_KEY_PAIR); + $arr[0] = 'Additional fortune added at request time.'; + \asort($arr); + $html = ''; + foreach ($arr as $id => $message) { + $message = \htmlspecialchars($message, \ENT_QUOTES, 'UTF-8'); + $html .= "$id$message"; + } + return Response::html("Fortunes$html
      idmessage
      "); + } + + public function queries($q = 1) + { + $statement = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $query_count = min(max((int) $q, 1), 500); + $arr = []; + while ($query_count--) { + $statement->execute([mt_rand(1, 10000)]); + $arr[] = $statement->fetch(); + } + return Response::json($arr); + } + + public function updates($q = 1) + { + static $updates = []; + + $random = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $count = min(max((int) $q, 1), 500); + + $worlds = $keys = $values = []; + for ($i = 0; $i < $count; ++ $i) { + $values[] = $keys[] = $id = mt_rand(1, 10000); + $random->execute([$id]); + $row = $random->fetch(); + $values[] = $row['randomNumber'] = mt_rand(1, 10000); + $worlds[] = $row; + } + if (!isset($updates[$count])) { + $sql = 'UPDATE World SET randomNumber = CASE id' . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $count) . 'END WHERE id IN (' . str_repeat('?::INTEGER,', $count - 1) . '?::INTEGER)'; + $updates[$count] = app()->db->prepare($sql); + } + $updates[$count]->execute([...$values, ...$keys]); + + return Response::json($worlds); + } +} \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/app/helpers.php b/frameworks/PHP/cyberphp/app/helpers.php new file mode 100644 index 00000000000..0b55349f7e3 --- /dev/null +++ b/frameworks/PHP/cyberphp/app/helpers.php @@ -0,0 +1,84 @@ +getConfig($key) ?? $default; + } +} + +function renderExceptionPage($e, $debug = true, $templateFile = ''): string +{ + // Determine template path + $templateFile = !empty($templateFile) ? $templateFile : __DIR__ . '/views/errors/exception.html'; + // Prepare template variables + $data = [ + 'code' => $e->getCode(), + 'message' => $debug ? $e->getMessage() : 'The current server is experiencing an error, please contact the administrator or try again later.', + 'error' => $e->getMessage(), + ]; + // Add more information in debug mode + if ($debug) { + $data['trace'] = []; + $data['file'] = $e->getFile(); + $data['line'] = $e->getLine(); + $traceFiles = $e->getTrace(); + array_unshift($traceFiles, ['file' => $data['file'], 'line' => $data['line']]); + foreach ($traceFiles as $v) { + try { + if (isset($v['file']) && isset($v['line'])) { + $startline = max(1, $v['line'] - 10); + $contents = file($v['file']); + $data['trace'][] = [ + 'file' => $v['file'], + 'line' => $v['line'], + 'source0' => $contents ? array_slice($contents, 0, 1) : '', + 'source' => [ + 'startline' => $startline, + 'content' => array_slice($contents, $startline - 1, 16) + ] + ]; + } + } catch (\Throwable $e) { + continue; + } + } + } + // Render error page + if (!file_exists($templateFile)) { + $msg = '

      Error ' . $data['code'] . '

      '; + $msg .= '
      Sorry, the server encountered an error
      '; + $msg .= '

      ' . htmlspecialchars($data['message']) . '

      '; + $msg .= '
      '; + return $msg; + } + extract($data); + ob_start(); + include $templateFile; + return ob_get_clean(); +} \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/app/route.php b/frameworks/PHP/cyberphp/app/route.php new file mode 100644 index 00000000000..a60a0dfec4c --- /dev/null +++ b/frameworks/PHP/cyberphp/app/route.php @@ -0,0 +1,12 @@ + + + + + + + An Error Occurred + + + +
      +

      Error

      +

      Sorry, an error occurred

      +
      + + + $v) { ?> +
      +
      # Line
      +
      +
    1. '.htmlentities($v['source0'][0]).'
    2. '; + } + if (!empty($v['source'])) { + echo '
        '; + foreach ((array) $v['source']['content'] as $key => $value) { + if (($key + $v['source']['startline']) == $v['line']) { + echo '
      1. '.htmlentities($value).'
      2. '; + } else { + echo '
      3. '.htmlentities($value).'
      4. '; + } + } + echo '
      '; + } + ?>
      +
      +
      + + + Return to Home + + + \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/benchmark_config.json b/frameworks/PHP/cyberphp/benchmark_config.json new file mode 100755 index 00000000000..689f889ef03 --- /dev/null +++ b/frameworks/PHP/cyberphp/benchmark_config.json @@ -0,0 +1,30 @@ +{ + "framework": "cyberphp", + "tests": [ + { + "default": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "fortune_url": "/fortunes", + "update_url": "/updates/", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "cyberphp", + "language": "PHP", + "flavor": "PHP8", + "orm": "Raw", + "platform": "workerman", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "cyberphp", + "notes": "", + "versus": "workerman" + } + } + ] +} diff --git a/frameworks/PHP/cyberphp/bootstrap.php b/frameworks/PHP/cyberphp/bootstrap.php new file mode 100644 index 00000000000..f9d1a350d25 --- /dev/null +++ b/frameworks/PHP/cyberphp/bootstrap.php @@ -0,0 +1,41 @@ + __DIR__ .'/app/route.php', + + // Application configuration file location can be modified freely + + // Key represents the name of the sub-application; sub-applications not listed cannot be accessed + 'config' => [ + // Default configuration + '' => require 'app/config.php', + // If a sub-application does not mention a configuration, the content of the default configuration file will be used + // 'admin'=> (require 'app/admin/config.php') + (require 'app/config.php'), + + // Or only use the default configuration + // 'phone'=> require 'app/config.php', + + // Or do not use the default configuration, directly use your custom sub-application configuration, you can change the name freely + // 'phone'=> require 'app/config_phone.php', + + // Or this way, each configuration item is introduced separately + // 'admin'=> [ + // 'app_name' => 'admin', + // 'request_middleware' => require 'app/admin/config_request_middleware.php', + // 'middleware' => require 'app/admin/config_middleware.php', + // 'database' => require 'app/admin/config_database.php', + // 'cookie' => require 'app/admin/config_cookie.php', + // 'database' => require 'app/admin/config_database.php', + // ], + ], + + // Create route manager + 'Route' => \DI\create(\Cyber\Route::class), + 'Middleware' => \DI\create(\Cyber\Middleware::class), + + // Create request object for handling HTTP requests + 'Request' => \DI\create(\Cyber\Request::class), + // Create response object for generating HTTP responses + 'Response' => \DI\create(\Cyber\Response::class), +]; \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/composer.json b/frameworks/PHP/cyberphp/composer.json new file mode 100644 index 00000000000..ef9c00160ac --- /dev/null +++ b/frameworks/PHP/cyberphp/composer.json @@ -0,0 +1,32 @@ +{ + "name": "eoioer/cyberphp", + "authors": [ + { + "name": "eoioer", + "email": "eoioer@qq.com" + } + ], + "type": "project", + "description": "The Fastest and Smallest PHP Framework", + "license": "MIT", + "require": { + "php": ">=8.3", + "php-di/php-di": "^7.0", + "nikic/fast-route": "^1.3", + "workerman/workerman": "^4.1", + "illuminate/database": "^11.37", + "topthink/think-orm": "^3.0" + }, + "autoload": { + "psr-4": { + "app\\": "app/", + "Cyber\\": "src/", + "": "extend/" + }, + "files": [ + "app/helpers.php" + ] + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/frameworks/PHP/cyberphp/cyberphp.dockerfile b/frameworks/PHP/cyberphp/cyberphp.dockerfile new file mode 100644 index 00000000000..e1c91791a05 --- /dev/null +++ b/frameworks/PHP/cyberphp/cyberphp.dockerfile @@ -0,0 +1,26 @@ +FROM ubuntu:24.04 + +ENV TEST_TYPE default + +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 > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null + +RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-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.4-dev libevent-dev git > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini + +WORKDIR /cyberphp +COPY --link . . + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +COPY php.ini /etc/php/8.4/cli/conf.d/10-opcache.ini + +EXPOSE 8080 + +CMD php /cyberphp/server.php start \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/extend/DemoExtension/Demo.php b/frameworks/PHP/cyberphp/extend/DemoExtension/Demo.php new file mode 100644 index 00000000000..a40d12dfd84 --- /dev/null +++ b/frameworks/PHP/cyberphp/extend/DemoExtension/Demo.php @@ -0,0 +1,12 @@ +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 + if (!$response instanceof Response) { + $response = Response::html($response ?? ''); + } + echo $response->send(); +} catch (Exception $e) { + echo renderExceptionPage($e); +} catch (Throwable $e) { + echo renderExceptionPage($e); +} diff --git a/frameworks/PHP/cyberphp/public/logo.png b/frameworks/PHP/cyberphp/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4108bd5cd3e3c9feafddcc53788c0d03daf8e427 GIT binary patch literal 123860 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 |4g9jk0R#aG2ns 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

      cD zLNEG)6{;Z}xs(Ej{nQHT9bctZBz0fBotx81FaHHD9iBK@*&do$|50NS3zDrtx^lRn zT%Ju;eXG)X;^9{`B4Ioy|EGW4IC=ZZhXc(sEq@$e8aLiABqX8 zq0@eW=(Oi-x3ta&yZCb3*sW-oKb?Z`i7Qk8J1YX9KVBU3yWPuD;4ynlsC(M{USDAE zQxrqAWB%!;;_3b3U7enJFwxj!6H?di)zDO|JR_yb>tiiJgH3L-+Tznz!`SxAk{=$F zn{^dm-;-s?z!<1LlT4kkhR_$*eS(NqzSoSVO~v9L_R+x$kg3r9x3e_CbT3gC<%ygr z&r)v9!-TWy!u6e%!LBg~`3ApI!)bA%!+dP!%4>_0#>qgTJvH(_;Q#<^(Eaxt-Km%^zIc0QDIJCV)q(`xdYW0whiCew zC^aCs`#{EWsJLr~PA}Z31(J`7(eu;7RsZ!{SpgaA4O9J4u9iRtbLm?Iv6@b`n+(`4 z<$=;`$rp})UzLYhf6yPkU`vf2=MSBCmw=Wh`syvrqXjC3Np>w~5J=+^);1N&sTA3bjd!>PeAv)-|!#-#jfw#+twfdX5>Rm(4ZbrN27 zN)+;kyYg}ZPwEB%_mgPJLE?jKzOBg5DU`K*2Bf>Bc20zVL>yF`tdopA&!mKz2TnuU zamoCs-DOvWt=^DL)tLnbOep+(r=8|BRo+sO#nIT$8M3Xfuo6yAtYAG%;u<&m;JJ;( zy1(8p@TPLDvJ*Y+=u&DDy8|w2iATM+j~#-RvumS}O}G8pk_0r>L+mJ^&T*N9?awzq z`=2UdTw*E^Vt`@YheX(t0iAh!5<-){r9dDI(ml1J%V;;1Fxh!>@%(+dD$PrB|Axn3 z(9c^BL!!;&&}Cytk+M^+h+w%;CM>pmbZLzob`?hvctQ)N1aXs#(4|bXhC$>)$vOK~ zLlQRPsQby)@!!y&w&&`Y2R_cT{i~QfpRdP}^x?1{#{zDHJZ)OlX{?mLka!-UPt#Y0 zTdwv%d>_XSsjdgm#QzXy!!+by-HY!Ye2P}a(pNry2rWAC=vphE8C^+^r-rHl0^ZBe zuqRC}#@iA~8=Np0R=B0Ndu_pqMPjJaTc2s;bI|%nZgmUj^*Id}Z1;cSB1EYnWy32x zV$cl{{Lnc)3RYhZ{?kL8q0Xs_zlfsa(F{#fK*KUit>UslLw*~54OG>CW^0E7+?>@2pOUESz@AIMaDND5}&*IcR56{8awW zw4Ruu*GIp1C91l-Jmjp(9CcUh!nF=+pxW{63;UqiAtD()Sg3vEN5r!`R4)<(nH^;| z7Np@`D4dw^;KN|mA@=8{vObUWe{K&I>3q*87oKFj9C*N0Xq_ATRDCaWFfu zbPqc7Z#IXuEj3~mhnR^%-K%G~pj6E2znP_=@%g9&qb36_ z-nN}9NT+w(5PBQl^`m({p-inpx+08rPQ!SqkNvTel26lk@2LV=6rqL`C)ca?j z&P7a0*8;5o*bNR0*0$W7i_s?3^_W2wAYac~yk0@%WbpX&1)7CX)$a@TXpSzOCz0cr z+Ts*jxjxKDBIa!%FyJqRI#n6mW4oYa49(!nl<~32JGh5yqVQ8UZ0>^E3lrDRWTcyA zjhr7LYM2uZ2jnk$xXnd!WRDOukJ29;3}tT@Hf=PrftcG!3hE7Si_5>VH0YL`wJ@EU zlho`X?8)MLM*~;DinWgH5*BgH!wZgK#(jvOT2W%1v5sS;6d;xeii#g=!4qVp{>k-A zM!37;ZJBg^Z-O$>ZoDQHdwUf0Z1*v#VcY;;p1mc6SCN^Gt?)XUyK6a^_aU;iCrq&7 z-rJH-R0a3%ht31Gb%?6mhP%aM90cQJk5e4O^Kte92ADu&kIY9Z_6qF9bq^9Iy=_Yg z1>Ivb?k%wHomqMA;kH3Ix{<~WM?^8Z5s6*}GVc}xk>XJg)BCx&jv$eRVY|Ol=~>w@ zQIV9X#EZ|U>}RACwWT@0tJZOhFgOgZfa_!Su6bp5e4K0}K?L0NvEuPy;|-OByIcmP zA7polf~-lc!pWLNmF)2mrfQe=3nqXnhUyCBjJP#Lr{V{tiF5{+kPByPw_FW$HMdOYo z;y)7Tk4ChAo=JT<9Z}yHJ9F@zLwY1ArfgbBTPdE~>hQ$6@ym#c>yakO>H=_tkUYSr z^AqE7Frrah?vciqtd)yB-0g(0eKbT}w8;PCQ3A()*n>kL3N)N}a{lGa4y40v({Bvn z{7`b{=VFgDq4j@%&2eE#MN|>LP8h&6kWc9oF2gWOEpp@B{Hf!@gw{+)%0x+>1p#!H z-g8_D^VvrA%RdMYyJBs?L2df8fOyCU#IU#c>GF%$JyFGZ@8pJA1nK; zQ0G-+_dHyY0~@$ni=rUG)TMK#MY`2l?PAtc#o|uc_1xuxlwiJbFafSY&J~*!Zm)?vpBIJpACuPl{ zEkMjE*>R%8&Fi5H&x~p)3Vaiz&kLDUNwASh0lS^Pu8$`nOE}*Z~*-7*t{ah(r1Z7WR6-9B)zT# zzj`PN=!6h1-zlskB`D^4Y1_{Z*q7_3@c|y~uj;lc`35)hto>T>1UNIP1!?-h%%C_nuH?=3D6e?u7y>$ze4FZo_-A{c$3>B?N_TWm>5j!Bymw%pr!HW1(0-d7pp1iW{%h;zLor)WJKexA@>R>!59p z5V-0|8IRt^n+3Ih^~y@heOEQZPx}Yqp;)xmB+D>t+hSEYqlbo;F@5mOqUU7mXW0!L z@T5NIo1717zde-SlH>PiR|7C{3_|~HfR1n_l(Fh1bG{*9c3clE+P`o1fp8_vPNI?D zDnBKsz)R8C2J<|Zr{gB-+nU??VWj^01YlGqjDFh>PT5@64}6`g889s`GMqiy-z65CTr6d_i60E> zphx~rK<16n>L#Pqr8Gv&wdh#&>2?#{eJgSFGj|Z!niY2#Pd$exBOCCS>+z{ z8xnrA#!Es~8lsCy|J9|L*E{3sp{~5dK4azt1WcnwBL;_YZoA|*coi`XcIVT~6Be=v zxbIJ`B=FWpveCa7Mz;bOW4d%hg_C4FjBcqL3O zq~-j|hlhB3iA^l6bwm|)!SG$Ar`Xw<>y9_Bqwar9AcWLxhZna)r zKF87Xw&mD69}grRY&pUU)SMA{=8s^=m&DIK+wd9cC!B`}T*a-i`uLv;A8hSjZ&eJ; zv%f}z>F1onP7P#U2mjlI7+|94qv8+PDc~p5&`AkKnRpQzNIzX)lxpI|*}^IUsgMWA zTp#-fwC%0f&;itF|5fBq13eyY111nFR3U9F!)4rGd4zqoPc%vsC(2Ddo$YI6Oc;b! z;ff^z`G#FXz{#^M9jjE*@zHNU+f#mjLi5Y+W1jNVw@-6DbuzXj6#g?IljjFiuhN;@^=8?^BkWRupzG_S0|-dy35x zG~?$kj~J0-&kf;5O@8w{3c#c%C*isK)U}o|MWuLrp`|Y zOk|Yk#rTZiQ3qAf%K@1mM5{%CCR%f<;!dbAMcA+E1NF|;(3NNqkBN*kXlp6-kv_G6 z3#&4EDNstn3lzTgz*z2d>om-wdf&~+huqWetQ#mj?k%}`azH%G**(V4sI zh8v?GwPK$R+xu|V-;~wl6SL0b$)@_p(athsS4snQv3Rq(%m~=4LO!I4e+<-7xIBx) zvWBg8EZmO7O^WdFvfq=pkNR#+t)5pr3!vAKUEoVtxe(HAZb^FDO-PREgc>?dP%KlA zYbB!TXM^^Fp@oso4Q2V&Uz2MC`sZuzrs&In+*mdgsJ?j65*|B3xcvljJK_79v(p%tTL zozihYU$zp*`3|B8Q(t;pTLp+0eGtxgbsL99fMaKJ>~mRd#60+DP&ld;oP0Rx>9{2S zBPP+dfvwz=gUL$Bw(~dUqab5ov*V+n{RX(2bEZcVW$e^;jVf#oL)Zy3a5Mw+J2 z{l@qR5VC05gx%R|eqTfhD@L-_HR zI4n{h^=7JeK2lHEXMgt*skd70z>*S!#FR)KET^A}8(#5jH_sbDg5$@86FdfWy1^LN zJ$||AYl)c99QGMu(Y4!A(Vi!-)$KHgduue|236r_=~FU9e2se?J(boC=V;KcDI?9+ zTxxJbR5B{etX0-9M$5oJqKU0aX0q@k@faH=@BJmok_t$awmPdKJ9AZJ-Q`Y)r-Z_& zcD$x=OZ4hf_}X3(4;226+{TOh0-eyQXw6Cbq*YvOV{-e{IgeqVS}KRId#y#Mp{^rJ&jtHbyQp~`>Is_VQH|@7dZW~YVX))uE{K|eWTSxo6KRTan{}r zb88VdG4~79Jpb)VhX+AY4Bw*b@aQ!ojn`dXeMR55Z1=UQKt)!uXp#tE%c*4S?S~WJ zXXq6a+cZ)&LufbvOWsWCN<|sEO?$t$e?Hb>D^Byl;OJfo!#n*N7lek3wy#Ye%t#Cy=^(2 z#6N1JHDz~7eDraD%elt0t((qwat4D~bvD1Q=uF~|E5UR=d%KAaeJR2W+~PKJjP*eh2GD1u+}aX;G^+E3X6- zUajHtsM#$x+(>}s8_9iGI#_MojRNh^C-*sYG!7t;U-i4*E_A%M9qL``19x@CZk zb7<)`fR^PQ2pY-S#9Hi@$wNi3$sHxbCe}tt_~dX)N43L> zm8;OeeQnzl002g3lq%@!hw0A8GdAEWaJ6be@u%fOzt41SI{^4}0_nqR65;Pcn5jwA z316H{{WY3opwVdLm)~);&1(!QRTZv~3eFoM5hHV(YNhyMhA?Yk5;q0!a* zMh*HHm_7B&*ccDNKd2{c1{9*M0v*jW*b_S4c9CLG=*3XsPPtm;OnmeJqitH&M354| zl_DL3<6;7*th4sVTn-y$2xxIrw@U$J35AnR6+jJ#j%d;nrz8ysO@}1l z$|368giMe=T$d#@)>pUs2!MwHlu&Y3zj10|5qMPH#F#aT12 zUTSQkZIaK*LtoPOP;o1#Iwn8;?F(?_236(28xx}EGZma&gz*_VD~_Lw>lw1o7~$k6 z{v_667b~}T=8FvkKeI@jZ6eE(ls#O1S!MqTWFi#(y_nLSHyAC#I)`F4g7$0fW}uJW zqVVzY@1FJTBq_e`dJMASOOa9UOX>~XQXJVo0ts|q-hI8pkc6IN^x@RFhAE6gJ&hbK zgo9fA9_b=Xdl` zMSK-xFI8||^aU%yT(@l1E&8yWCv+WwiuKmH6ZKr7nIOd=o(kRIV1(dYC5Adw>0 z*LV?@T#H)qZ4zEJujs}MK2jvh25x@6&zbvM1Dkl&T@)hwXMK0n^1mo2IT8b~Tp@eT z`1z%=Mlc2uVzZYh6HVn33T!(*IZ4oY`3o{#2!RZQgiY5pgrmRx5uXG%%K#K&o9|If zA~7OJxis>Eh1S+6$mpp*we~NQ&feruMfx(MC?NpV z88^=@MkT(4>lZdv0?bhgXEg)s9w0uQ->73LIF{p7s6%O)5o4W7P)%w*C#}Wo{_+f~ zZ`x5vYqEdrGDqk@TR%bTNcP>V^07@3zQscWoVJFJHmv;8p~l|{y9EzbQHLJi?Wmgp zbT~b4cL_!dlK}{|z9+Qh?4k}w`ZINj3QYKuL=o}0HRJvahKpc=ku8P0oQb__Y4Y?W8-!o+;FB&wET)|KOsgX!Yciej{ zX7G<2>ecWGq-Q+4(10jWozaGPIu4zA=gx1uP33d1YS3n^HD^n4>00oEJJ7ZCU6enz zDkN|xGxC>WmW6AOl#neD<@$X^XEInj?%T3zHS0*diksevV%#5fz|_|@F3uguoH;hn z-{+WIAKot4tloP_$nzml&N?Rb{f3QeUSH*8hwGnvmdx*ef5XjA#WZ5MT8o5=jmHsz zoX;!lIDb|)zEGCi^?leVVMp&N{po)-U3WMe-1kTAR%@4_T8i3x1vP3DD@MhrQiO<7 zdlgl!6{BXN_J~apTU$z~JraAgs69&TqCfBZ{k`|k``qW8^PF@4IOp8Yxu57bvF!}; zvEn)pq{uFbEW&TZF)fV@&&a*Kfg7D48`$slJ(7c%$Xi<>A2c-Jsa^%t?|E1zrf$_; zw`l)q&A3^x;%4Y?1Na^aOBnr=>s`-$)H-I;WH%f@Y>x&dD<=;ZSA-)G&x0cow#7OqMxM9ws{)dxPJfnSL$O{O~Ef8?JoY_ z6isWoj}=_$dFK3O(*5OiV*HQFYkrki9sFF00*{`vK|aSCF|bw&XtVZ_VsG&r7P}1{ zQck2ydWvlPXX1{^_^;DRP1Q8HJI_Ced=s#FD=%?fXZH2M!ng8;uL-`sAG(qHwRWFYG#(_}7qQDl#($>5b$snK3D@ zHK|=6F~k)TP5&tlsjaj`Kdv;*8V{vkDwF4Eq8I9N6Pj3MJ^=Urzx!;Yzq;CjS}xYvBMJ~6$u36HOQCZAtb*yn$Dp49!qpbKues;&LqW?^^knJPM zpwxx_j)=j~3bdsrx`s(xPKlUpJ;%p15vfw)#$D}clwA07tn*Y?~P}W`K#D~{XDXI0CM1~7M zo_a~|G;#+<$?N{-%hoKk3S^K(q^y?vhnC3gnS1v&R!XOol zsW9xr8*eF1jk2f$G59W-4yEobT8lXgpFjBqT6Sjnp5}~j8K#hvOv(^7-Vt-=$z;q%EUf>x@Q) z#pOlL;l7pk*DVsUj`WQXWf!8HswLLqvw6r7->CnmXf;4JY@wQ|&ys(lI16Bh{HUs(Bmc&dow}lRhNJ)aA!so=2 ztwOdwXssIWXlIaBTT4S*&`f7aF>_|<W)Nx1DbKS4}VJ>cw~UU{p)o z;CwFeizTAgT2A%jhUO7&D9;@_ltR{*7upuAL6FPR@8;PP^|R|9acevL^+!k;Thow7 zpOfQ_VzgkI?|D@5m)CR$Y|9iV;Lx~xfaRRTiI=#hB)8xY3n0`A;(9H%-Q9CYgmk&( zmtlz>nOJ@I1(Ke8Bz`EzO!R&%2_+q=X23k0S@%9!Dc*{|2*n3EcUu3=316>2F^FJP zCq_wsg1!JJ<`SjbfwqgON&k45uSq)`$avH9Wjn+oq+R}cH>!$e!&)LI2WZj_mfN8h z54H}KC*z4GI!_m-*fwHHw46D9&+KBd?3QFg_aX+sy8)$k!~VtA$zmnui{^ry+8Uxv+ls%^k2Hms|DL+px(Ee#;}XVl(|YU{Fy2Vf3k4VStoAI@v@&o+Wh=l{hS74D_-OsV z90-oNQr2`vpMW$wX$wO@d|RAmR*9h2bHUauk;d%1?dZ){tRTqoXJ^uA?~Y((U+hVf(n20^{F}zQOe1tnTZAo6eIgzeo?HR*ABAoe=6dRtrkI1Fm?Tb_k9lWN zn9}<;!}mD^ejn3PORJagD~0zdaG_)rSWHy)Q5<79&xD%GO|%nb&`ifvFbUA{s~paj znK*HOJds%~C{^AN+4pU#0!qKE730EFj%a5(8~(00lk6+>x|bkh z9}0BL(SzMXtjTVDGd#2OIl~gtjXkoC({QHhRn8M}V#3)Zo7bOgio5*0a6WpI{7Kly zvjD8*3uF==-9`&i^CZv@`*R*QD;zX?d&{9op1H7}N{I?QDF}K{^eKms=c60(ba~W^ zdr89zL{~g=w^6%8#Ou0PE{%`9I}B95tMMN5Ns~{H9&1Tmys$V&TikH&EqN2kyj`wN z3VoX&R;%P^MNT?_^(yRkvCj`oV+M1)NgFm$(n69OMOV1lQoUGvKR>5kk)>%~?yBa! z%n+sJw0hbhiR#FUOokcDnX>H}g01=WyrhOGR?VwMd%xLbOTP40+Z7MH^`%6H*MFyv z4!>L|MYiyJ{ilQ{R4V1G&o$5tu`<~l|BBp{NF7~snIL2Y*kXr!PZWhVR(Xz`B`eXb z(|2IQSNFJpYXC&yY_GN60|&T@b>|^~8P3jxng}PMbl~esEBgqB@LlsWp}v|I@Oq8G z97BZ%Ig)&DVV9S+5J}wn%824G9qKCSns;PSUJI5JJ`kI+H;+!Aro6D%89fCQZtexx ze;;@S0ceN$lm0P%Z+asx$vsczJya-b^j5M6>TgHb-`?M&Z_Y8JXlY4A75I~m&+xM7 zJ)}kHZ~qsUcs~P4*B+@tkNp=o6*O`DHQV+Zb({6C!x>Hdy(+OlSr?Ia+$eAFwDP*~ z>9w(x6TX2P1vlS_WMp%_e9s4k8GGfQB`3Ii?lB}~DyT3iah`{&bvW&}C+sR{9CVa_ z-_E|eAjXsb);{U+fg}M4$xydbpS~w)8oS+3>npBQs3N!Wr=F3xF0*lBrt9WJ$DM@9 zFgMI@u4%+jc5VKY+j*zOO zt7bNli3UlVxInn>ujEl^n2`Kfz8BLZI!j3ES9==u6WNnH96RI_bi)GyyV%XJ63_ek zY_oymQ)-j2KwF0`TdjjLso5v@W{d6$TNdefOezL9mSqBu?vLphsBmQJNlLz%>18#p z2T%uv9l@ZA_EWFnxSZ6rYy+U9(&m5!70l#=OV~@zq|t3Gbq?5eRu6%Az5tjM_?DNP z)Ghy>&^F*kh)VM2G>Zr~$axy8kIHd|v^e56_)r`b4^WB(>~IH88_H~B&1xiZH$aooL-;pvr92vm{vLpG;ON%}w> znd07`)yoF?;4%$m`kUoE#9~Kvh+U^LuiItj-90T``4D#oKvq03kPI*22v%qU4VL~2 zKN`T)6oCqxue+F$fD;37Sdn?RU0r^-RPEKwLVEn#VfuGFA&;t6&WufdKe*E8!L7-D z7u^SE^&v6PH`7Sw!ug)^hnv{9=B$5sZjV}ae{isTD|1sFJt#UmDW?&|ko%J7%R6zj z&%_05!mW`M{vw8;8W~wPNKLv(Z@@USrt;2N-ATi!v(aL!L3E)>e@L}Wif?&PvHfkE z)3;#Eimx1lbv3hM3AO>bc1)SLc^Z_#kf#T1#|LtRax&#~XdZ`@3~(1FAxB#lApfBeuLRj_Gu1;*6xn+~_1e813m zN*b;22MqWtb>Tg~Ii1>G8$xdO?V6d2Px~qNq{%Tc*|HB_*Xi47u0xkXoQD_yvBx7R zUv)0edM3~6dzTLFmMSQPg_ZoGpeq4|d(J>oDbDT5VejdY9%x@5Hh%Tva(|Xfzd}14 zsOU7@Usa<~7aXA}u!7}U)YYqOpC&YrJVn5U2rb_9jYIS*Zhn&eoGSeq)u?O}ujT64 zR;s#8khkv7G-9(E6Be(+MDw0+8$0Zm8$;<0@#d8hN@%$44)qWN<(&Og$W7yt?!2Z^ z?dOEA8L26iMYJYN2N`XQqb8*TMa?l~2wC`?NT0o}7p%bgfn-|GjE8s0`^y4s^6<2B9gh&fE;#w4oxlx zmY=sbEkJwj1!v~lm*v}z1#(rtTCX^`nDMr)a98{(zEN?t@o9VbFj8uMw(27_Tz$_} zfg|Cpn!BE-(`C~^xb?aIjr7>;#frf=6|e&$wqs=*r0Bytq3l$hHx;NpfBL5ouqea! zrI2x&e%UHiq-r%yZFScscI~p)261U%z7Ua#;IG@{Pe(qh`x|ei5!CWH5kYIxSRZSU zSzTUDs0!vVvA3*l|^>$C5Au1SAG{6uw}=&UWjT5_?aJgH@yFvB~k_48|MDu z;|j{1kcQ2;S`M-NX~uVecdY^n4gHbBW`BcldSzQj{-rc|aMSvL`AYR=O|WcoX53gU z=>pK1;O>g_9g$1g90hoptq%OPJdqpx!>N|vF`Z2`;0dcL&?Z=-5T2roN&VvV<2>WhVP#@v}&#a4>K*V_al z*I!1|77xakUeR=xaom9ub#%SA5mSMaJC`#!y8Edz0V|T~3U53Y(opf50clY(m)HdQ z?iWvdZqKu9Qa~Kpw|(_`VGSfTmqtrSL)E;y^js8fqkx~8ahGoL*3|_ncFiKa;(_mD z%3nw<4&&PZL88&qm`*0Yu?|h~e(@?S>fJ=O z@aiLz+#f>pYnz0oQ2wpcK5S;HN~6IxYB(}nznl3^jvhf~>q)eedS&tEb`gLsOZE$N z^HTawUo*_^!f0Ve#GUMP<}pd`0_3B=HS~pKiTsCcFMYk9M<$^0+F|!YR)eaahuz?) zJ4`#R>X~%yj7f}m;p#i6Z#U}Y&L3ZTm{#x90qu{AijRhUK7IYRbh78KoN=S7p>|ES z$8my1n9%IJL-)3u=id15M{sc-Ic34Ii|kMS=ObO`EYTyvA)-<~bLm=7!Bt-*$|m@C z0~(JkR^~!WZGptw<_HcwySFZK(BKMcj{RV^1k)Zx41eV*q3x=VAyvxK9z%--yN_RB zy635O`K2CZ^C{Nz+hfM>TI-5p1dEVZ1xZ+9k5Y1=8+O<39dnLMQ@05?*`Vl8w&6Fi z%2_9fwiR2&?5d5ZyU~ayO&?{=hb~p#%DdR5!7#;jEwioyF7sU9duP4m%00uZdTvY2qtCJc%m8(BqWEGybdJ=Pt1 zv{1zBG9L(Z1u*zZQp4EBCIy((lfgkXvVfFuKRQoRAG`feTC5q!OrE{t)q z;~jMc_8D|XmIG6dcYwgi#wbV>V)NGKyJ_Q8nXQjKVOPOu^wlXL++=AVyf?#3U4Rp( zK^NG!!7M2hkZ|KT8OX>}9CAj(%vn9TI1BSs1u*zjr7PN){l0<8pu>E=&baCKs2ZQ* z?2$t(Gv0;uHbemO*k=yq$bu`8E%c0>I5T)T`-4t)@*&pIsoT%AmhpKVUYSZXAy>7c zO4y~lK+3AFw7@9CUYw%;kW5_HVCo7(Q2InF2c^!1vCZg}Hdl(*2^}=m%qKW!w3KsQ)-Y0fxE05^P%IB~ z+YE7y;M3RY{9UKb2lFUM-iVT?piOFsxh1q`IUZ+>S|Nr#YlXz}CC3U@=n5$8z8L!0 zIy1%4v#IVA3u0AQbhz}{515fhfG3~z@6@=yNi^R0w2zb8@OEx7d*QabmREG5Qgj^O zS>b7`->byAZAN%EON=>g3Tss4Tno9;?%LLC8_Y*yOd%^)1F-C(JMXm(&hJM4HFMx1Y4hudUHjK zL1(FS!kXInKURJ540r z-+Z)dLYgu-n!Ev!B&03(hNr2WU47XorGk4X!P|YEIwOi*w&$hp#$#qF(qd}{1#ji( ze;LE|4xgfm_$m4(R-G)IJA^1)VGhYe9<71%8&b?bQEDoo!c3^2)2NAomBlr23kfT? zYI=;R<(6UIPH*1bkOecg>P-~ZQ&=hcoKOY)i79e36(7{w+I+{`hD%k%=+3jGYEq%H zg!|c{1;&{TB=P-$X)8(Zx~Q$Tthe-CklnUp)WV_!E;`* zHW&dhqrhU#7+sf*ONX-v-vA=1J2j125tXJ)t6`$9K*>QsXQ8l=l>;p2*cy9-qkN!p z1J;^t73%{_56%ftgdnI)_506W;`@F?m51$F67VYQnXxsWMX< z%M4Q`S%)gGOmJYhFf)Yf?qF*YajY)JUPd~dHlwYhA0nBK~F zMKiP^67re+ca}~|Q&^3+VD}DTII+^jT0}A3iTzFCbN9h1M&b45puZAB;LM>Tjg48C zu1bPyU}HVw4`~a8Goucl^Ec*4q2^?A*HmnA?fsl?Rz6X`3ecs#-UrsaT#Ve6k&@bB z&bJM~=WkaF&Rst645}TT-O(2?#*Lcy1_bM6B&8MTp1drLE+u^CWO8I?dZ<*d`#aF` zpgrl&vsVr;3*ITLHWuFSFIP{26X8$aja4~3(Ue*4=AV8?(msR@?su#4l6|)KSj@yH zi~4k}D$9wNwVo2{dh`ihmnc!ZS)#xD(ri<^KRJBthovOzb&2EM9>Xe`uE1ueR8 z;G`%mkkVy4eq4dbCx~~uz0%1{!pIMk`bb1BccC&wE0kVd4UqH1vX__Lc7OMFK&s(V zrz~PxW6Dg^sW2*_3U{Dud@`!{{Z@3Iju^I%Ju!d~+P6>*ebz6N1@&XK!E5|@br!X& zIR9l|^OJ^jPyZOd&(O?5l%2t1TXDj$z=_zI&}Pe~lX{aj04xB^6UNYn%lb@1V<=Qh zX6Ui)RyP&Kq9_R^VN>h5>nuG5GJ6PKa3b)PAjte1w)2^Nu+R1{Aea9HV=M7g506CJ z7&F^s6q~SAF`z=Y(*o!Ig!^q0k^Yw0ERNZogKe2?6wSNpcEs*P@WHEC@_A<0+lX78 z*%U<3)u$}vkvS-D1rw?|lK}NRvfnK?MjI^in}0{M zv_#g@aV&<8&n=TT8Eg}SBS+A~C&*#Hk8znLpE%u^){Vd)9Q$&mRiDVZ^2N9qtWM3r zNxi5S+R1<6K2$lpfD*NpWEJ^U8NdWYC`sCTl~-Be;DCA*Ctug|z&{G}kmsqz;TCEt}Nx?VaO2I^I6c5nU< DOz{_t literal 0 HcmV?d00001 diff --git a/frameworks/PHP/cyberphp/server.php b/frameworks/PHP/cyberphp/server.php new file mode 100644 index 00000000000..e9a354b2ce9 --- /dev/null +++ b/frameworks/PHP/cyberphp/server.php @@ -0,0 +1,85 @@ +count = 4; + +// Initialize ThinkPHP application +$app = \Cyber\App::bootstrap(__DIR__.'/bootstrap.php'); + +/** + * Callback function to handle HTTP requests + * @param TcpConnection $connection Client connection object + * @param WorkermanRequest $request HTTP request object + */ +$http_worker->onMessage = function(TcpConnection $connection, WorkermanRequest $request) use ($app) { + // Initialize request object + $_GET = $request->get(); // Get GET parameters + $_POST = $request->post(); // Get POST parameters + $_FILES = $request->file(); // Get file uploads + $_COOKIE = $request->cookie(); // Get COOKIE + + // Merge server variables + $_SERVER = array_merge($_SERVER, [ + 'RAW_BODY' => $request->rawBody(), // Raw request body + 'REQUEST_METHOD' => $request->method(), // Request method + 'REQUEST_URI' => $request->uri(), // Request URI + 'QUERY_STRING' => $request->queryString(), // Query string + 'REMOTE_ADDR' => $connection->getRemoteIp(), // Client IP + 'REMOTE_PORT' => $connection->getRemotePort(), // Client port + 'SERVER_PROTOCOL' => 'HTTP/'.$request->protocolVersion(), // Protocol version + ]); + + // Handle request headers + foreach ($request->header() as $key => $value) { + $_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $key))] = $value; + } + + try { + ob_start(); // Start output buffering + $response = $app->run(); // Run ThinkPHP application + + // Handle response + if(!$response instanceof Response){ + // If not a Response object, directly output content + echo $response; + $content = ob_get_clean(); + $connection->send($content); + }else{ + // If it is a Response object, send HTTP response + echo $response->send(); + $content = ob_get_clean(); + $connection->send(new Workerman\Protocols\Http\Response( + $response->getStatusCode(), // Status code + $response->getHeaders(), // Response headers + $content // Response content + )); + } + } catch (Exception $e) { + // Catch exceptions and render error page + $connection->send(renderExceptionPage($e)); + } catch (Throwable $e) { + // Catch all errors + $connection->send(renderExceptionPage($e)); + } +}; + +/** + * Run all Worker instances + * This method will block the current process until all Workers stop + */ +Worker::runAll(); diff --git a/frameworks/PHP/cyberphp/src/App.php b/frameworks/PHP/cyberphp/src/App.php new file mode 100644 index 00000000000..30a64d3f1d0 --- /dev/null +++ b/frameworks/PHP/cyberphp/src/App.php @@ -0,0 +1,201 @@ +start_time = time(); + /* Check PHP environment version | extension */ + Utility::checkPHPenv(); + + /* Build container instance */ + $this->container = new Container($containerConfig); + + /* Load route configuration */ + $routes = require_once $this->container->get('route_path'); + /* Create route manager */ + $this->route = $this->container->get('Route'); + /* Call route dispatcher */ + $this->route->dispatcher($routes); + + /* Configuration */ + $this->config = $this->container->get('config'); + /* Request object */ + $this->request = $this->container->get('Request'); + + /* Response object */ + $this->response = $this->container->get('Response'); + + /* Middleware */ + $this->middleware = $this->container->get('Middleware'); + + /* Database */ + $this->db = $this->setDb(); + + } + /** + * Run application + */ + public function run() + { + $this->timestamps = time(); + /* cli mode maintains database connection */ + $this->cliMaintainDatabaseConnection($this->getConfig('orm')); + + /* Get application name */ + $this->appName = $this->request->getAppName(); + + /* Request object middleware list */ + $requestMiddlewares = $this->getConfig('request_middleware'); + + /* Execute request object middleware */ + $this->request = $this->middleware->handleRequest($requestMiddlewares); + + /* Parse route and return the closure to be executed */ + $handleRoute = $this->route->handleRoute(); + /* Middleware list */ + $Middlewares = $this->getConfig('middleware'); + /* Execute middleware */ + $response = $this->middleware->handle($Middlewares,function() use ($handleRoute) { + return $handleRoute; + }); + /* Return response */ + return $response; + } + + // cli mode maintains database connection every 600 seconds + public function cliMaintainDatabaseConnection($ormName) + { + if (php_sapi_name() === 'cli' and time() - $this->start_time > 600) { + $this->start_time = time(); + if($ormName=='pdo'){ + // Close the existing connection and recreate the PDO instance + $this->db = null; + $this->db = new PDO(...$this->getConfig('pdo')); + }elseif($ormName=='thinkorm'){ + // Close the existing connection and reconnect to Thinkorm + $this->db::close(); + $this->db::connect('mysql',true); + } + } + } + public function setDb() + { + if($this->getConfig('orm')=='pdo'){ + return new PDO(...$this->getConfig('pdo')); + }elseif($this->getConfig('orm')=='eloquent'){ + $EloquentDb = new EloquentDb; + $EloquentDb->addConnection($this->getConfig('eloquent')); + $EloquentDb->setAsGlobal(); + $EloquentDb->bootEloquent(); + return $EloquentDb; + }elseif($this->getConfig('orm')=='thinkorm'){ + ThinkormDb::setConfig($this->getConfig('thinkorm')); + return ThinkormDb::class; + } + } + /** + * Get the current application configuration + * $app->getConfig(); // Returns the entire configuration content of the current application + * $app->getConfig('app_name'); // Get the value of ['app_name'] in the current application configuration + * $app->getConfig('cookie.expires'); // Get the value of ['cookie']['expires'] + * $app->getConfig(null, 'admin'); // Returns the entire configuration content of the admin application + * $app->getConfig('app_name', 'admin'); // Get the value of ['app_name'] in the admin application configuration + * $app->getConfig('cookie.expires','admin'); // Get the value of ['cookie']['expires'] in the admin application configuration + */ + public function getConfig($key = null, $appName = null): mixed + { + $appName = $appName ?? $this->appName ?? ''; + $config = $this->config[$appName] ?? null; + // Get the entire application configuration + if ($key === null) { + return $config; + } + // Split the key into an array + $keys = explode('.', $key); + // Traverse the key array and get the configuration layer by layer + foreach ($keys as $k) { + if (is_array($config) && array_key_exists($k, $config)) { + $config = $config[$k]; + } else { + return null; // If a layer does not exist, return null + } + } + return $config; // Return the final configuration value + } + /** + * Initialize the application + * @param string $bootstrap Configuration file + * @return self + */ + public static function bootstrap($bootstrap = null): self + { + if (!$bootstrap) { + throw new \Exception('App::bootstrap parameter does not exist'); + } + if (self::$instance === null) { + /* Load container configuration file */ + if (!file_exists($bootstrap) || !is_readable($bootstrap)) { + throw new \Exception("App::bootstrap parameter {$bootstrap} path error"); + } + $containerConfig = require_once $bootstrap; + self::$instance = new self($containerConfig); + return self::$instance; + }else{ + throw new \Exception('Application has started'); + } + } + /** + * Get the application singleton instance + * @return self + */ + public static function getInstance(): self + { + if (self::$instance === null) { + throw new \Exception('Application has not started'); + } + return self::$instance; + } +} diff --git a/frameworks/PHP/cyberphp/src/Middleware.php b/frameworks/PHP/cyberphp/src/Middleware.php new file mode 100644 index 00000000000..c482ebe1347 --- /dev/null +++ b/frameworks/PHP/cyberphp/src/Middleware.php @@ -0,0 +1,48 @@ +request; + foreach ($requestMiddlewares as $middleware) { + if (!class_exists($middleware)) { + throw new \Exception("The parameter class {$middleware} for processing the request middleware does not exist"); + } + $instance = app()->container->get($middleware); + if (!method_exists($instance, 'handle')) { + throw new \Exception("The parameter class {$middleware} for processing the request middleware does not have a handle method"); + } + /* Call the handle method of the request data middleware */ + $request = $instance->handle($request); + } + return $request; + } + + public function handle(array $Middlewares, callable $finalHandler) + { + $request = app()->request; + $container = app()->container; + // Start wrapping the handler from the last middleware layer by layer + $response = array_reduce( + array_reverse($Middlewares), + function($next, $middleware) use ($request,$container) { + if (!class_exists($middleware)) { + throw new \Exception("The middleware parameter class {$middleware} does not exist"); + } + $instance = $container->get($middleware); + if (!method_exists($instance, 'handle')) { + throw new \Exception("The middleware parameter class {$middleware} does not have a handle method"); + } + return function() use ($instance, $request, $next) { + return $instance->handle($request, $next); + }; + }, + $finalHandler + ); + // Execute the middleware chain + return $response(); + } +} \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/src/Request.php b/frameworks/PHP/cyberphp/src/Request.php new file mode 100644 index 00000000000..ec54d88b94c --- /dev/null +++ b/frameworks/PHP/cyberphp/src/Request.php @@ -0,0 +1,232 @@ + $value) { + if (strpos($key, 'HTTP_') === 0) { + $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($key, 5))))); + $headers[$key] = $value; + } + } + ksort($headers); + return $headers; + } + return $_SERVER['HTTP_'.strtoupper(str_replace('-', '_', $key))] ?? $default; + } + /** + * Set request header + * @param string $key Header information name + * @param string $value Header information value + * @return void + */ + public function setHeader(string $key, string $value): void + { + if(is_array($key)){ + foreach ($key as $k => $v) { + $_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $k))] = $v; + } + }else{ + $_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $key))] = $value; + } + } +} diff --git a/frameworks/PHP/cyberphp/src/Response.php b/frameworks/PHP/cyberphp/src/Response.php new file mode 100644 index 00000000000..7e6698231e1 --- /dev/null +++ b/frameworks/PHP/cyberphp/src/Response.php @@ -0,0 +1,218 @@ + 'OK', + 201 => 'Created', + 204 => 'No Content', + + // 3xx Redirection + 301 => 'Moved Permanently', + 302 => 'Found', + 304 => 'Not Modified', + + // 4xx Client Errors + 400 => 'Bad Request', + 401 => 'Unauthorized', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 408 => 'Request Timeout', + 422 => 'Unprocessable Entity', + 429 => 'Too Many Requests', + + // 5xx Server Errors + 500 => 'Internal Server Error', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout' + ]; + + protected string $content = ''; + protected int $statusCode = 200; + protected array $headers = []; + protected bool $sent = false; + + public function __construct(string $content = '', int $statusCode = 200, array $headers = []) + { + $this->content = $content; + $this->statusCode = $statusCode; + $this->headers = $headers; + } + + /** + * Get status code description + */ + public function getStatusText(): string + { + return self::HTTP_STATUS[$this->statusCode]; + } + /** + * Get response body + */ + public function getStatusCode(): int + { + return $this->statusCode; + } + /** + * Get response body + */ + public function getContent(): string + { + return $this->content; + } + + /** + * Get all response headers + */ + public function getHeaders(): array + { + return $this->headers; + } + + /** + * Add response header + * + * @throws Exception + */ + public function withHeader(string $name, string|array $value): static + { + // Validate header name legality + if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/', $name)) { + throw new Exception('Header name can only contain letters, numbers, and special characters'); + } + if (empty($name)) { + throw new Exception('Header name cannot be empty'); + } + + $clone = clone $this; + $clone->headers[$name] = is_array($value) ? $value : [$value]; + return $clone; + } + + /** + * Add multiple response headers + */ + public function withHeaders(array $headers): static + { + $clone = clone $this; + foreach ($headers as $name => $value) { + $clone = $clone->withHeader($name, $value); + } + return $clone; + } + + /** + * Create JSON response + * + * @throws Exception + */ + public static function json(mixed $data, int $status = 200, array $headers = []): static + { + try { + $json = json_encode($data, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); + } catch (\JsonException $e) { + throw new Exception('Unable to encode data to JSON', 0, $e); + } + + $headers['Content-Type'] = 'application/json; charset=utf-8'; + $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + return new static($json, $status, $headers); + } + + /** + * Create HTML response + */ + public static function html(string $html, int $status = 200, array $headers = []): static + { + $headers['Content-Type'] = 'text/html; charset=utf-8'; + $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + return new static($html, $status, $headers); + } + + /** + * Create text response + */ + public static function text(string $text, int $status = 200, array $headers = []): static + { + $headers['Content-Type'] = 'text/plain; charset=utf-8'; + $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + return new static($text, $status, $headers); + } + /** + * Create file response + */ + public static function file(string $file, string $filename, int $status = 200, array $headers = []): static + { + $headers['Content-Type'] = 'application/octet-stream'; + $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + $headers['Content-Disposition'] = 'attachment; filename="' . $filename . '"'; + return new static(file_get_contents($file), $status, $headers); + } + + /** + * Create redirect response + * + * @throws Exception + */ + public static function redirect(string $url, int $status = 302, array $headers = []): static + { + if (!filter_var($url, FILTER_VALIDATE_URL) && !str_starts_with($url, '/')) { + throw new Exception('Invalid URL format'); + } + return new static('', $status, array_merge($headers, ['Location' => $url])); + } + + /** + * Send response + * + * @throws Exception + */ + public function send(): void + { + if ($this->isSent()) { + throw new Exception('Response already sent'); + } + if (!headers_sent()) { + // // 发送状态码 + http_response_code($this->statusCode); + + // // 确保有 Content-Type 头 + if (!isset($this->headers['Content-Type'])) { + $this->headers['Content-Type'] = ['text/html; charset=utf-8']; + } + + // // 发送响应头 + foreach ($this->headers as $name => $values) { + $values = (array) $values; + foreach ($values as $value) { + header($name . ': ' . $value, false); + } + } + } + + // // 发送响应内容 + echo $this->content; + + // $this->sent = true; + } + + /** + * Check if the response has been sent + */ + public function isSent(): bool + { + return $this->sent; + } +} diff --git a/frameworks/PHP/cyberphp/src/Route.php b/frameworks/PHP/cyberphp/src/Route.php new file mode 100644 index 00000000000..735d1d632e2 --- /dev/null +++ b/frameworks/PHP/cyberphp/src/Route.php @@ -0,0 +1,61 @@ +dispatcher = FastRoute\simpleDispatcher(function (RouteCollector $r) use ($routes) { + foreach ($routes as $route) { + // Check the number of array members. Three members indicate a single route configuration. + if (count($route) == 3) { + $r->addRoute(preg_split('/\s*,\s*/', $route[1]), $route[0], $route[2]); + // Two members indicate a group route. + } elseif (count($route) == 2) { + $r->addGroup($route[0], function (RouteCollector $r) use ($route) { + foreach ($route[1] as $childRoute) { + $r->addRoute(preg_split('/\s*,\s*/', trim($childRoute[1])), $childRoute[0], $childRoute[2]); + } + }); + } + } + }); + } + public function handleRoute() + { + $request = app()->request; + $container = app()->container; + // Parse the current route + $routeInfo = $this->dispatcher->dispatch($request->getMethod(), $request->getPathInfo()); + if ($routeInfo[0] == 0) { + throw new \Exception('Page not found', 404); + } elseif ($routeInfo[0] == 2) { + throw new \Exception('Request method error', 405); + } elseif ($routeInfo[0] == 1) { + $handler = $routeInfo[1]; + $vars = $routeInfo[2]; + $parameters = [$request, ...array_values($vars)]; + + // Create a closure to pass to your middleware to execute the final handler + $finalHandler = function() use ($handler, $parameters, $container) { + // If handler is a string (controller@method) + if (is_string($handler)) { + list($controller, $method) = explode('@', $handler); + $class = $container->get($controller); + return $class->$method(...$parameters); + } elseif (is_callable($handler)) { + return $handler(...$parameters); + } else { + throw new \Exception('Route handler configuration error'); + } + }; + return $finalHandler(); + } + } +} \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/src/Utility.php b/frameworks/PHP/cyberphp/src/Utility.php new file mode 100644 index 00000000000..17ab3948176 --- /dev/null +++ b/frameworks/PHP/cyberphp/src/Utility.php @@ -0,0 +1,47 @@ + 'Handling JSON data', + 'mbstring' => 'Handling multibyte strings', + 'pdo' => 'Database connection', + 'pdo_mysql' => 'MySQL database support', + 'openssl' => 'Encryption and HTTPS support' + ]; + // Check required extensions + $missingExtensions = []; + foreach ($requiredExtensions as $extension => $purpose) { + if (!extension_loaded($extension)) { + $missingExtensions[] = sprintf( + "- %s (%s)", + $extension, + $purpose + ); + } + } + // If there are missing required extensions, throw an exception + if (!empty($missingExtensions)) { + throw new \Exception(sprintf( + "Missing required PHP extensions:\n%s\nPlease install these extensions before running the program.", + implode("\n", $missingExtensions) + )); + } + return true; + } +} From a614fcf4e8cd420de83fbc1e0e9186008552c5bd Mon Sep 17 00:00:00 2001 From: Joanhey Date: Sat, 18 Jan 2025 20:22:39 +0100 Subject: [PATCH 1091/1766] Add libevent --- frameworks/PHP/reactphp/benchmark_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/reactphp/benchmark_config.json b/frameworks/PHP/reactphp/benchmark_config.json index e73762276f2..e53c029d748 100644 --- a/frameworks/PHP/reactphp/benchmark_config.json +++ b/frameworks/PHP/reactphp/benchmark_config.json @@ -17,7 +17,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "reactphp", + "display_name": "reactphp [libevent]", "notes": "", "versus": "php" }, From 0e431e4386232bdb219ba47ec2f42782f1b0e18f Mon Sep 17 00:00:00 2001 From: root Date: Sun, 19 Jan 2025 04:16:51 +0800 Subject: [PATCH 1092/1766] add a framework php/cyberphp --- frameworks/PHP/cyberphp/README.md | 4 ++-- frameworks/PHP/cyberphp/app/config.php | 6 +++--- frameworks/PHP/cyberphp/app/controller/Index.php | 8 ++++---- frameworks/PHP/cyberphp/src/App.php | 14 ++++++++++---- frameworks/PHP/cyberphp/src/Route.php | 4 ++-- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/frameworks/PHP/cyberphp/README.md b/frameworks/PHP/cyberphp/README.md index 689afe6d561..bc25c16fc20 100755 --- a/frameworks/PHP/cyberphp/README.md +++ b/frameworks/PHP/cyberphp/README.md @@ -15,11 +15,11 @@ http://localhost:8080/db ### QUERY -http://localhost:8080/query/[count] +http://localhost:8080/queries/[count] ### UPDATE -http://localhost:8080/update/[count] +http://localhost:8080/updates/[count] ### FORTUNES diff --git a/frameworks/PHP/cyberphp/app/config.php b/frameworks/PHP/cyberphp/app/config.php index cf331c45ea5..9faf6d86060 100644 --- a/frameworks/PHP/cyberphp/app/config.php +++ b/frameworks/PHP/cyberphp/app/config.php @@ -16,9 +16,9 @@ ], 'orm' => 'pdo', 'pdo' => [ - 'dsn' => 'pgsql:host=tfb-database;dbname=hello_world', - 'username' => 'benchmarkdbuser', - 'password' => 'benchmarkdbpass', + 'dsn' => 'mysql:host=127.0.0.1;dbname=hello_world', + 'username' => 'root', + 'password' => 'root', 'options' => [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, diff --git a/frameworks/PHP/cyberphp/app/controller/Index.php b/frameworks/PHP/cyberphp/app/controller/Index.php index 717dec13973..bb96ceb8b2a 100644 --- a/frameworks/PHP/cyberphp/app/controller/Index.php +++ b/frameworks/PHP/cyberphp/app/controller/Index.php @@ -38,10 +38,10 @@ public function fortunes() return Response::html("Fortunes$html
      idmessage
      "); } - public function queries($q = 1) + public function queries($q=1) { $statement = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); - $query_count = min(max((int) $q, 1), 500); + $query_count = max(min(intval($q), 500), 1); $arr = []; while ($query_count--) { $statement->execute([mt_rand(1, 10000)]); @@ -50,12 +50,12 @@ public function queries($q = 1) return Response::json($arr); } - public function updates($q = 1) + public function updates($q=1) { static $updates = []; $random = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); - $count = min(max((int) $q, 1), 500); + $count = max(min(intval($q), 500), 1); $worlds = $keys = $values = []; for ($i = 0; $i < $count; ++ $i) { diff --git a/frameworks/PHP/cyberphp/src/App.php b/frameworks/PHP/cyberphp/src/App.php index 30a64d3f1d0..85a632d4421 100644 --- a/frameworks/PHP/cyberphp/src/App.php +++ b/frameworks/PHP/cyberphp/src/App.php @@ -91,16 +91,22 @@ public function run() $requestMiddlewares = $this->getConfig('request_middleware'); /* Execute request object middleware */ - $this->request = $this->middleware->handleRequest($requestMiddlewares); + if(!empty($requestMiddlewares)){ + $this->request = $this->middleware->handleRequest($requestMiddlewares); + } /* Parse route and return the closure to be executed */ $handleRoute = $this->route->handleRoute(); /* Middleware list */ $Middlewares = $this->getConfig('middleware'); /* Execute middleware */ - $response = $this->middleware->handle($Middlewares,function() use ($handleRoute) { - return $handleRoute; - }); + if(!empty($Middlewares)){ + $response = $this->middleware->handle($Middlewares,function() use ($handleRoute) { + return $handleRoute; + }); + }else{ + $response = $handleRoute; + } /* Return response */ return $response; } diff --git a/frameworks/PHP/cyberphp/src/Route.php b/frameworks/PHP/cyberphp/src/Route.php index 735d1d632e2..95181591f2d 100644 --- a/frameworks/PHP/cyberphp/src/Route.php +++ b/frameworks/PHP/cyberphp/src/Route.php @@ -40,14 +40,14 @@ public function handleRoute() } elseif ($routeInfo[0] == 1) { $handler = $routeInfo[1]; $vars = $routeInfo[2]; - $parameters = [$request, ...array_values($vars)]; + $parameters = [...array_values($vars)]; // Create a closure to pass to your middleware to execute the final handler $finalHandler = function() use ($handler, $parameters, $container) { // If handler is a string (controller@method) if (is_string($handler)) { list($controller, $method) = explode('@', $handler); - $class = $container->get($controller); + $class = new $controller(); return $class->$method(...$parameters); } elseif (is_callable($handler)) { return $handler(...$parameters); From 9a5a3449a3f225abf80974ecee707ff08d41ca74 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 19 Jan 2025 04:19:26 +0800 Subject: [PATCH 1093/1766] add a framework php/cyberphp --- frameworks/PHP/cyberphp/app/config.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/PHP/cyberphp/app/config.php b/frameworks/PHP/cyberphp/app/config.php index 9faf6d86060..cf331c45ea5 100644 --- a/frameworks/PHP/cyberphp/app/config.php +++ b/frameworks/PHP/cyberphp/app/config.php @@ -16,9 +16,9 @@ ], 'orm' => 'pdo', 'pdo' => [ - 'dsn' => 'mysql:host=127.0.0.1;dbname=hello_world', - 'username' => 'root', - 'password' => 'root', + 'dsn' => 'pgsql:host=tfb-database;dbname=hello_world', + 'username' => 'benchmarkdbuser', + 'password' => 'benchmarkdbpass', 'options' => [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, From 22db03850fb6110c5515c88e844ba1180cc89168 Mon Sep 17 00:00:00 2001 From: eoioer Date: Sun, 19 Jan 2025 04:26:43 +0800 Subject: [PATCH 1094/1766] Remove source code unrelated to testing --- frameworks/PHP/cyberphp/app/controller/Index.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/frameworks/PHP/cyberphp/app/controller/Index.php b/frameworks/PHP/cyberphp/app/controller/Index.php index bb96ceb8b2a..d1a7f261f70 100644 --- a/frameworks/PHP/cyberphp/app/controller/Index.php +++ b/frameworks/PHP/cyberphp/app/controller/Index.php @@ -3,9 +3,6 @@ use Cyber\Response; class Index { - public function hello() { - return 'Hello, CyberPHP'; - } public function json() { @@ -73,4 +70,4 @@ public function updates($q=1) return Response::json($worlds); } -} \ No newline at end of file +} From 2441f1f654adb5bfe3ad669ca9ef7133c2573100 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 19 Jan 2025 04:36:54 +0800 Subject: [PATCH 1095/1766] Remove files unrelated to benchmark --- frameworks/PHP/cyberphp/CyberPHP.jpg | Bin 79155 -> 0 bytes .../PHP/cyberphp/extend/DemoExtension/Demo.php | 12 ------------ frameworks/PHP/cyberphp/public/logo.png | Bin 123860 -> 0 bytes 3 files changed, 12 deletions(-) delete mode 100644 frameworks/PHP/cyberphp/CyberPHP.jpg delete mode 100644 frameworks/PHP/cyberphp/extend/DemoExtension/Demo.php delete mode 100644 frameworks/PHP/cyberphp/public/logo.png diff --git a/frameworks/PHP/cyberphp/CyberPHP.jpg b/frameworks/PHP/cyberphp/CyberPHP.jpg deleted file mode 100644 index 638b6fb15285614dbf79ab9878e50ffb124ae44d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79155 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
      fhm$ad`(fs5{s;E-+ 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%0DSZ{dE1i^2Wu{81okV%K|=;ZPg2o&Yx) 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⪻!Pd@0Dq!t5thk2 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 |4g9jk0R#aG2ns zd^=gpk}>eftX|Dy?!nGhLsO$Av(#t=p475S#TPMstN{u{MNJ1QY3(?KZ(s2O)@JK1 zCN6w|JLZS@xzoN6Z_*F3Qn5QZ+3};`=PALGk`*)<_RU&!qy#ZB(+Y`RVQ0SE+VS(f zzm5x9Tdc@25F@5@PRZ+#`c199=uqD?M77Dm&Ov@*`)_ko`wqrr4DVf^o~R1Zn^5gj z=PZ(H>uwIPspJLEVG=((56VuY%B?0GZ>apqU7eCw7~E0ToNGE z2HU#Z8D^-wAGHk{J(UwIn+O|^lWgxj&RNYf(v+FjW0jz)h!=t?XSU8P6|hlid3eP{ zJW;r$c_y!3^NOTJr7+>gMBvav;qnDO^ zpHjKIh8Bg0H;tcEC_UbJoSZHVvXj1l)O4l3F@2{gx>uTymTb*)0aDs_xr(Cufcz81 z5;0A&cS^gwe$9WfsnUgye@@_eE1$!2S3k#OKwRGwkpBTTM z5jTo2jFmOufLuIT47CjcohpU?afkQ{l)aJ*9qsRB$9kh<{n@e9P8VbY85c)wfn3qr zlK2IS5L^m`0&(o_?V~|6jeHmV@+4ijoF&ck{w7sx&mGhEaz^t^lTe7}w>Q57E*ak@ z+q&6E5eY78o@0}KM&y+`tYQiannLwBa)0MRd=NsWwX|{O3(<%w`+E~M9aaFKKwrOn zW~l|iN<;V7<}IW_RPZzl3CrU=evih0m%dcZbH}cxWc@F25R63DHP%s9lVas+XJ;)PloyOV-3abtKAlnmB(-!$3}H{x)DFS%Py7Fs z|GWR6(~yGMLMdvft>LDI+C7y3gxPlQWr1!kU5E&AMC}Cg}w4}GotsduxFsvr^aE6HZS+Ol`kua z^NSIRC25+Z1V(am5(tU+6y{P0TI8P?k`QkUHgO(}7Zz)w&?TdF>!QSBl3jQ>e`MaT z9SB@HbRkhvOA~cT9zkaM+Rg6^IMbHPAS%D|`0w#xcN;A?1kvFnnh&8QluHvW#>IG2 zz?72~2lUANW+vxq=9zW8PM@2Zp)t@494iT1&_|(Znnp!fo2^cVW@%2j2sb}E9&PU^ z9qNM-JpFQhRmTa3HuDah)?VL$m3GOi#03SXJJmCR?RN}jf`ufqz&-uES=&tk|8 znQvmjFP#6bj#8k#=^%_TaBKVi1n4ZG`4C?!HrrsnP>T|}sxMhxD*d+Z*3Nd~KqPko z%@B!1a;_P>Dkbqy3xYWagySS7SB2eE>L|MIDa2WJ|Z-KsdV#`S6^yY@j zX}1^)Ao-I`>SSfyd^xkKGr=;68OFmDJG(n^(G#t*sv$xqri&@6Up#zqLO%!OuM`Ju zA;MlHLTborH}?4cwXfy$*6Hc@VlpDu0j+SfDnX$3fh)R3dFb$S+kd~<0Og+4ps0&A ztZoH7-!$?}Vj+lW$Xp#kUc{NPb_(3v^IaU$c3Cwqg`k?yrGy?hEtHSk{0Z)rq&y|u zebRg{#(~y{;1Eget}V?oIJdz~p%*)JSqNyHD)imOJUWu)~apK4lg zg0lq9vA?^I$9j7PlzGw0B(wEB%mV7-##zbtvm7W<`?dNcY6|0>ZJkH?-93Lr6v2zP zu?3uU#t??gvgdoSb1{gSW$@%n&P>A@;=lRB;#1eqbnWYQDw7RPY)eP z1w3sOqbZx|vP$x{BYK<&Yup&$v+n;hR6$IiZE!1|!lz3~t!K30_9Zjqk01Orw@u%h zw5lDDM?zs)QQM}|BzB0}fI+(Vb+iaX3!@^zsc^^i{fHA>l!2eYLMK?N(ACu1E%Pnv zN$^YbikOO0OP;6Vp@Ck$un1CBzGcO=v|NU2A^W8k$-IZ*$)GV^( zNU-3k3?0PT@knK$PTpMq?h3)bB>8^iv_P4a$;_XA@)c%0j)i5sJny)Sf*|9*e zn%Xj=;lgXcEMJR*AgC19HIA=M-9=6!tJX3}qlM|5M>HZ)xMFxqN__@|_^UJ&v8u46 zIp4eXm27UEiG-q+9t&2fDg6&pVQT3oC@OZSI}UdD@dx|i{Sl&+S`aHV38Yvt0+I8Yn@t|XlGvIY8j_){#}(GF zB0S#SOGErX2~rW}dPL4_oskeN$*MHHeL9ui4Ba>f9T4n=Gva2eAaqR)%EW8|^PD3* z6ASG_@wGts%h$=hd<6Ak3AAH>JjCwa-pWMR{1Z4VxD_eQ)gw;>!oX&}i9h44UE_%Y ztK0}bxc>ENQoI!8ETFQIjWs~}W>aS3lO~O%F(jt-VTB=kPf4!i7-?BP*glB zu%)??m5r5)vc5ll_&Vc-27IMhbju0)(Q}`9{#|!G2&~}0sae$YIao7o4;NY&t2k8p z26eGNKq$)y){~%aKnl$jQ8F^_YTsEzr&?6H6HCHoRo;Epakvm z-D|#$GltGfhp-g#)-ko&Tw%65$ds6Q^{FC036$>a?&4hsK1@?G$^i?pcAi<;h}6TO za0r(SU0Rau9X`>?#6hfw16PobZ=brC20~^U(a|r7)rUh^+gg`&h(ydXC)86oDxk^l zFtw!vk9W6QJJ}8J*VFoa@z`^LJV}hGNvSW#zePx}%$L$e*>9h|jYjY`^yCKEU#Z=m zkp@^Kq`!4}^8!=!bLLp!-K|ygwJ8(vFRgI730}(qm z#Gvn!q3Uj92Q)n_pF{gKz zOn+l^^^n|AE@+))WV2HnFjoS8lA@@cwerHSectwla=n zE*eF-?(j_}hfu=-q6t;%^PC)Ovb85v8i<dXmXdtIlHt8&rk1qoA<0*y=U zth!o+#hc&Ld59nks2{X=SFSl1HqRndBnebpO=jS;yvqdc?>?M7cn5rfLEwzW2KxQm za~WuMiw_oL<8NaUmAUq~%v8O$n8NkvmI5n^X_f-6QYt>x|} z&SbG?H9fmx;!%VhVP{E&aMqFXg}cD=@iij}E;x2&_ihft`&^=;W!|KzKntQN!AdBU zmI9hbWMVQ~V9qLfsgleWhv44-NX}Y5EXsRFNhIuZTW8}4-~^{GY38_Ph`x?zE8c zf1mh9BF~o-153avN1>yUb=f+LhiQs183orM(~$1A-Ou!luRnYXS!o`7?8^rsSLM9n za}z3RiF{onKBaNJXwkS$_B_)6+)wQc%cXlEkq4$8WM|lKR7*D?he=FVP0F)25IJx7 z>{^CMq%f_Q!iq^NldEvY^!>&ai{-qJ+Nh4oa*MD;oGLC0Qc0X<)`|mI2x>}f`&K#5 z4g4tkoGV$hB_fn~ipMX3SU9~K(lX98JGwj5 zv|JqroQ6cGRsnLx+z9PKWde+=745)%+33|=*1VV`2UrKfW7^mv+&XzP|L@>uY4|2V z>Js9NrQVbnF}i4rsR%C`dq(PV28Tp%bxUf$*Rs3C0X=s0_OLVGiwANO6k7@;TT$it zW0#Y;W?CbWL~yr5b>6QZrSzn92)lZ_*`a$A4mk)(+6imiFsrgv={dR78VuB{gzq$f zYnZ-Tte6eQr}mF!C5{H4Kl~LMWa&vtG#7+HYK&Mhz;djVQ8s1kjY~J*^;@9xuH;NR zf;~LP=MR6QYJs z5h~z6CD3T{?48n(?Ui{X2sSJ_?r&T?7&m zJw&xcyo%sG|9zW6&b`z3l1WBTK_sLEZwbVA70)-Vcus1Ms)A(c9%-yiTv!Yh6OG*0 zz7MA@q8luBibS40e0ge7lLTfd+PU;h!ppR_rnJo+-3Kd3nxJu!{DV)qN?!+heuIEe zaDwx_)q|uT^!sp`EJ~ttq@}=OL}*2bv)-UjbsD~TsU-Is?_Zup(vh2jO$ZRmGVI6Ve^bjhqnXbQh=~jdB)IX<()~R zls54fYIwjd3Bneha1V92QXPsu{>KZP-8|C>$*$zaiV2R^Q$mWhmeOG@ND|C-0%T9| zp9T)$mZ{sgyZbOmUOvl#RP>~8^_*s5A}<=d%1}aI%j1&@LY5F{58`;dvx7`??)2R%$?)G2=9|6rvzSw-Vh|+TI@k=}Zn2rl%nh{0GqSTnaYw<;hE_nh*0(s2Y z(mKn~5h{YO)HXyS>WCV+t9@TtkT`V(;ozjNzb-v489FZ|_y{Vwc}|*$_k8bs1aX;7 zp=Eq|;#PzlhbI?3ZjvAIoYy)dwaZm4;rI3&!~EADg+Ok4R%n1m!%Xa!<5LkJ-oO8& zG-)JHTp}4Ts272fIDN%v)RjY*($~$aqk6KUK#LY&N~9iYKR`1!C<*XZ%&HBH>9P~b zOu%NqTx2e8R`KV>KeH1_j*bxfT;#ymH(E{tfKG%(({UGriHW>?^f}xzeP0R5O2KDY zzUC3W(vysmJj`=RT&Fua4>KL78FoYS+d77h70690K9zHtn~8%AqiUMEIm@5Me_r<* zB0ZdD=`RME_X#WrpB=xRuTI~=s0^5#s zZOc01oaaBrZ$w210xg6?vcNwES2L8bhx^ZtB@;Tb7myMO9_-nIKf6#?C+?&Z`Gz4EW)*Cmp3 z%m^;fzzx(uQH_Y{*%bpH=eN#DZCJ_Y-6rf?NZW~6%Kj-gwQt8oNl3AAr`1#fmWK!j z&pl@6K}WOGss4FZCJ#Dyc2>3&45g{I22~d~D5|E3Cof8`+oRRYY%*#QT9XpeB38!* z&GXA}<8_I&I8N~^79{UzBA$toMMrx)-rdOsL+8%_1aWEdRIP$T9Svy=oB*{6yms}s zu->mlHBZxJH3{8z!!*CS<6R8P2ud&U#iAQXCHh3`1c-=wa)}6@Ye%n0!V)pbO`v5O zTANOly2#$%9vHGy?Dhnw4~9m@JaXH#ZUz>=5gO+$|0TOq0UzJ z#X~sBz(E$>@!Pzat4rs^ihwtLgcE6vvY?gtD5G1n7 zjU};A$r7==K>m)iK+5Ss0Vf&LVTw(yjkOgPDGa%?tCP&;JviY@hi@UeV!*;g!!2$( z0?{OYm#-%X`j~uA$#1PJg{-LRtC=t&CG1&3=9L$i4V#vAu~uHi$hrMZTLS_rl+zEp zd;2)6u`!7tFT&bT8>beO%SJDtqk*RJ6RL#Zq`?T z{fMs)b@8}KwiFK$Q_eR3u(O(HS#_6QqYwjB(}7BwF=-JGOM|zr`_G^~Yxe|u-vQ8E zk<@k(pU9`qFuMqN&p+<_I5)TNq2(K>nOu8O6PTR;67R3kSV4Uq9^uN?C23d9P+XZ~ zVs~Ee?|5W-8<|TLzatW@U|AgWH^n4p@pTW4`;>pULpKAPURCNaXNdH_RhWWe>GtBP>z-hTOk~p$DK7aVD70V;- zJ2@Zc8g|3>+0q9*`VsI%_FuX`)~L7XRgYiRNID`$shs#dcPd2bPiubb=yOVGmO7qc zK_`$BFH7k9zTSSO=#bfQmWfMhUlzQ&x;~wtE;1e__`=jp6y%ra22bGP zLh{rKx<_T&%>^|<*yZ?E#|Cgl*Ni9^3|*McjoRpKYK4oNL4mk``XRh5&j~)^yE+H2 zs)}6A_1~%qnmgjf3S(#U$yscjtE0nr9*x0NXN5iCP~Qh?F{&&vYal0}Jzl=@h2->V z=g2%|i^D1hFjj_*6>jU?$Fz2=IIvVqH6=iff!a68_Mob`p4R&M)*6CY^N1=AM-*o* zfP{PniM(v|8m=6^tR#wx9l`@wfTBnYrZ3bmiwa>!dnbRf=O1Xv5K&X(%sCUWRiQ4Y zPjA6IC8MsCV>rv7&N{z#5egLHqldqYSP|xn*iw*f7x-#KHN*NOdy(#c4gzmp`$|N7 z8n7t1QpO7ttw%^%VgQsortV}<*nb4&;iMlV#rS^ZaA>*a@`PD!_t%nqB3^_o!{_(! zdp$bBGh&V6P#3s;`raks^?3?HSaT#zbC<0gA=r8h9V}H%jN>QpOcquLOKh|>ea1(^ zqjp%$2hKZ@`|fa(yuWact4E*C1=$%CoQ36UewV8(T2b@TvaD-DI&AOmvit0rsW>uV zRj;Xp)Rd{dw{BNw}Q-{NGTl;R72i%`nf~Bf6 z+IzFr+EwRvvgya`SrXJq=gFA>p)9e*na~AmE^yn_-6;yD6LV2+d?X^#p*V*85N}@l z9RxxxRxZm|AIa#GcGEu_n(=V^0UJs0lQPAo0tb^w5MrsP6(JTHFpjH6E-oi&qbM#$ z#0kOv?8>1FdA5lHx?lwOvf|g&>N{?Q=?Xy3bhCs#VF&L&@NpWxftMumDb69$l|1vr z+o_|#EtKeExr^w%xN!qT`FSsSDQ4tpQilY7bz*w}G9p5r~Z6c3r zz?oNKET*x_qpu#b>pTWNdiaZ=X==;OGT%PA$BOMGHU6OpD_LpE{>#y+t^`X(c;@g0 zjAUcUB_O)G!lzLy)T~xh+4q&H+iFqze=46#M+b1^C@7cCOt54Ijv!A6ojTHsr|!jB zOnE8l;Fk9NC_VeQaZz?hEOcUG0F8X-+LzN5zdYhvW8IMSS!PbKxggv!eMc#=Fw@{$ z2CD#FN>;>a$-zl47TDC-lqNnj+WRXSGendQ9e#Ynn;CM$miXn#QbuDrB|8uWOC%|7 z7uF`~`JG+wW`8)8Nc5%+1>n(H(?vCS;T7HV%H39hi-)%?%IbZv^H2)<1+__>3G^X(l_7h)uu&~6=Bwpxd$c$OlOz1=>p*O zcq>OFTuw-0nQAB3+=Q(qFlS)XHfgFSvZJ?`J^29^Q)<{-aJEu`Gn;4d+LhlzPI%HU zvBP1KwssaU!Rk-&sd4LE3I0T`o4DB|F)9gF?2|eN3P37_q;`pzIRYEA^{C-n3Asq` z>|$iSU(G95eTyY`Vy&K{g&9lfgF!w)EHs}4?wh)of7thLG>gMs`%`5J5OsazMe5r_ zQ4+D*sS=2689HZCT0r-99!is;HlgOUKg^(uuzw2nofIOS3hVt!p0nbaeP2_JDS0NM zV#$`wuxx$emvemJ;KyjHOFSiu zR8mZ{)&Wr)2S8Mk5je^{llS6jEF+K$mSoLLu+mVL%&O~)5#i#X5-G*AW(Q|E+Qy_p zkDO&rTi3&tQjbVbZP1{}os;)k_P+>I5|-GRkdEDB$J;i%g-o1{HoFSHrk}7bg#cCR zb(9s8X_OVyCsth*|G9W>qQaqYnAfa&370g_C1@h+7M_81r`|KyOCffv+&29nUF{$m z`o(~l8Sfx1;v_^(id zGMUl}LOa+E5HjadQdYzksnIITWFL~yuQN2H!P8q8Qao0besZd&9~Nb~g*Z@t9g|Ci zqMX@0y`;RP$@ChAD4;T34MgGg_Wc7HQ7>QBAf_|AaiuS3dDb1t!BU<16r>{K;R?gh zK_1}oAMipZIKFZ?By#cH?fYso!X5PfN4y1}^cgN1zJ%{y{VF=zg`yHKY*`G6SqcT9 zPjxv+#FdDPtHgJ;eHqLD6g6jm80Wj!zKY*E{ipclP5+gKI%edMc6iS}K=fVdMP?m! zDoilV!_$u$soa_LdtnnY!1`4v#kGuIBPO)BI$LGQvEszqRw87Q@jdJRGcks$!a@ZT zo7Js6-T`a~%1x6u@h^uypZJc_Pj+V}m|9uybzwM^VyXe<8ABJ)bVIf6+;XLBwYqb3 zw9Oq;52WP4xsvN9THurmze7qi6p-jy?N{=H8{Uwl4@xs@DT|Nt*$zy5=p#T?_7;{@ z-!So2_T>i>TBvE1LCOMWu)l|}|5IfiEa7wWCCyKoX&_l zg;aT&!JQ~NQcNkSER>`}S|%}qNDjdD6E`RC=S51g((qL@6siTUOua33`M3tZ1@K%23%%9_&k@I-f>X-BS zH7}pMlM7w_7`Y`Th_7l;j9dsYs3Ho)|0;u4-{v zDeTHtkhKPjpA$a7!KQE)GPR6}0IY)I_{!8RO!p=h^#O<$!ISd9T;JTtFK+rlTCtHV zP&Dy|R1zw(6l}Z#ibQW4+xN$V)g?7@O-YB3o{2cgX1AJO+Wceu&KduMwSJvt=8m7) z^ut_~ok4C3$w+*QaXxZi_x_Yn6`m)?YZypqwwOZ~L7f@Lm?qMYth836q$xrbCSsc( z-}v32TF*qS3J%BDCvM>j6F1^qhT7*|%=4)-OUD(%m!?Fht{z>n4qPM}%o!!HwX+pm z;Hrx!Xn&&SjIKS8aKj^Zg>+KbK_sddV+IIgD_H{qt*_6r28;mn7G-J`!pPp zz^=iuizqN9ZTd9k8O@4%KED-V5D_!6zjEXXhG~!mpZx8dq0A*xw|sgJgrI6l@V|NV zD%0{Sbunt0BorIZm6$kK2fKUOk?#ZZgIK;!49GcN@>R{5W+ut51YSg}w{o;BdNze? z24YoFGcBt?H)j%8QUX&t$Yr@amG*bwvFGP5}BA=GO3)= zJd4EiBe3YA$P`%eXi62i!1=8+j}uf*sPyQUdu6*faoTR1 zx{ItJwF^XNdOgPNSqwL{qLA#wHs81Yb*yi0PI4G3$@_8M&)06OxYC9x-4(}s_kEaQ zKUB659p2i}7KGyfLb*5|@9e^v0l1pvhDfX_zmhWfL%pGIkxkhqUNHJ}dOnn{2IVSeoJQliJL2F zdZG!@LT@vXELp@FG2h|&^u%?rXhc453pw^%g=D57CfFxO)S4%A zp*V>p^5)gxP3s#Sj%~(#i|=3eI^Mqd7x<2KuYwT!XNTcnXpiq$_icRV%5S0@a^fOc zX+)G;+V?Y=PnZn^rQM54HqhcM3V~$Sn*QA>Y-p~bM^fn*g|2q_+0%Xik53BUH9S9Y zj!zu?5B_8F=Cbk^pIStVwmQrgOMy{oa#r(nYMa2Vm|~-npm7DK8DE(AhN-9v(X`8) zCd6Cq-xs4miZO6e^DKUJ!*_$`mN&Ys$F789mXJ&0ppZx?@e@ZanZP0=7olIn=6 zNw;W_S6AVV_C1!oCB#At3skKmK~Ay(5K%8cW;~(D4{mq^)3H;U;mQnaHMfk940L}J za(hARJma}}qtn%6)?M)16OG03K=)ys?R8leiXHqms?HiZkfZ+Ij9e+sl{X!S9Xw+o zvGSLz53KqoM_VU#JYX^JvM7nRS3ubxIrKS#b{BqwL}!aPSUmHUd!N4ehUR*H^NgS2 zn&zcU(@kQ6)Z-;L|IeS$v`i&&e=JGu5*g1YdGYWw`K3+&l|MN17uhm&9)!H&@GYhN zo?4~*vm5^_7d6jFsK{a{*{jlY4Ib`ptwfW-&Fpj*Y9+-aq|uQ#`n3s4mz;~6XYu^8 z=NcFjz|CJqU^-6n$9w;tmC~xzL@}Wli;$p-rfOMZGSj}YbsjA@Qe%5JmNFJ;y(Df| zSG(NSxxX)VSRhwX&DeW!%8!W9RL?J*_Cu`9R#{?BspvoN%T@VTCMP4F_wN1>d%{7y zMw1m08`m$o1A|dAM3o!cchk`+Gi6qiHf>D_jz+|s23&|XC7krwUOe^!p3%HG9X@5e zcO~a;`2Zhec?dlXT+-N5PIE_-1Ccsf)Y3l_5x8sWo@9@;tkU>Is#P{?23EGkyOe6#tThP1T!VoHIr4XopDv z0@tj%ir+lrr@3nQ5~jlxYFvgTuxb(#qk~ z;wfpYOr>b5YORVrYxrD#cGLGU6($#jLn9&(9S=@#1u_#xx5RIN1f}m@pf)TP`z;QX ztA;MdA#_#wkqvKT$Pblm5ScGRAfA8P_b=Sqx!?G1t~{usEK&fhByxiCoRO!Sy1B2Z z#gukPk}0v$LL=LII~dn?|JKKZ^b|4$!s4_rI-$cG*S(V0uKBi7cgq_AUFv|a)F)1z zAxvJBeVsl0)&7stv{^2-XYFi&%-fnCWCb{sgJGJTy`2VAR7&8Q5D<|<#zgHyI*Lxg z&u{txCUn}Y%FG4O$A^(aM#>;H$MaiK>&;QCDYqrhhih-4_~K=d(|>e-4g%rGC^|B>Vw#tbP{ z`eWC1SX~r}hLNmi*q}R`GKgr%xn}j%{PyWT&9$S?uadAUW6n~^MsEQ+vRT_YOy}kU=?)Nb)jj|mjhV-C|L(vnI;1h}^ zI4&EyAfa=$?O9KW2Ue=M2dB5<@MVxMlPMF8Jy8vy+0qy?;~UPbCW}9B$1Yb7UBoY) z@nhh;Y4v4b)5vwTXjEKEAT?R;ym#+EvNMi@#6*4dRdGFQIr>qJgsO4^(W6}`Q6Q9`IUo62lM^h(S59Rnpn<% zPiz;=HgTR&KcA`^Uv_Q)vv&5WIDF3qEPzM zto<N3ahMzv|d-(m$ zzrgoz{BD}rNZ-)blmw;FM=LhJsc_@^p9eg@bH>kcreB}NgSDuCHC4k>J@)1gu`9x- zCclD+CfzD*8b@@X_*~xC>a(*$?)2s+daAr})yr7vR~i!Ga1sXm1~Ti^H#En2{$|gI zxIf>X-m}yg>d%77q9|=9G|p*i6P`DG4o(wMT3t;X5c^Jr62FM!uJ(QQ{lt{)#nx}3 zsHmu`}T!Gi!~Qqq@z7HyEXjQ=AUM@UuO~o#bAULYq5?vmG_Y_5f1eB z@t*x3PF7mcl2027id2P@2U}n1zD901e2XPO-eO%n2XujO&aiGNT36=L_y=eHJm)n} zr=y+piCkZ3w=aOAvx?4o#89=c$+G+Cq+b9QD)gy48%s1tQF0AT#%Tm)jT`H8XKYw% zW+}9Ams2>mbxuOCo$t5voYs=yS0x4RnZBQYvaj-2$4_;@;ObEdab0qS3Z-Ot5e+gVHr~FczA||!( zK}gWGRe<(6V~?kgK8-&;`+xG&>)*;{t#cWVZ91Bx8c^~yp=M-QPqJ_k3ml0MZ0)S* z%_A+@8buMD=~PLjU7%(TtO`LRA~`+nG8w0E8u_M?tNF9x4{`14Yt!?z7K%zl)myx%VTw>ZLh>lZ!8>-pkDd8}nj|31T1ep2hriO7 zfGCC)-6A+yXyBreOZb(IKg342CTZbm#0vz8DOtCqQKL=AS&O|6okB70UUUVjTqtR$ zb&%piM8x4@q>D1G9YiB98M}&~TK`twu=?dGW{67@>8=>WSorfRit@CPOZuju>e3oU z(m62i)5knq9X!~6#N<~D!CTI+YOYoFnE$(aW&Qr*%xrBgLRYog(WnExL7fRqQR^1w zxVc2K=x|Q?i@hJ<6>GjF1)C5JebE&3ScC-2Dr3cHi^|G=lX zW%3pt>^_b-Pg7bcv?oFl-Z}`P*#9shG%j@(teR8}cpw)+d{GT2DTSV)RlV2)&Dq>I zohyeg=9xnm@VZss&c!P(GD$JDLop*te%v6F@|kE!mbdO!y1(DE;SGH3(C7Ke^sQvl z!i$hc$W#a}LD%!OgD6aBhiS02^9Yv>U1n9YGY;JRUVpV8<2zTph|NQ1nuue84tNu` zJ>Ki513q!K3LcB{7mvS}9q|B7X`JlR%$x||qUPDG$ySv!0<|G%(L^exn2r=KZ(Yd8 z$G=RMHZ9jQ^gWjE?R*^Q04M|#ohyWO3Ad(w*VQg(__h4(#vkC#r@g_n zhmuYZJ|dwgRHFHt&U1a@(mIg_54RuYFZO(hrf(3m9ul)Eh!gJWZe>SjC#SbI7_y{j zEoLhNte>EK=epN$D4*nacDTXx)S+Q#0ep$0g;3f zCu&P>yvklaNi%Elf{|zNypd<|U29&>#iN(<$n-<}$^H*ACZnhZg7|WZdZDkbC|8VJ zVg;BpgOw%b!+Q^@ux|N$IZ|AD9r`ZU8Fmn0gm_aA!gT6(+_f2=Rqby8z-I&PlJY$O+i8q>Ig0!T27T?QtGR*Iu z`SbkehkuOyVG4~QfdWDC2zd=WTv3;rs-is5d6dhBFQXhZkioeuN4uUid)&K97qQQ~Dq8W5^t>JOK81=TtsA@i_Re=PEgf3wlNC>02)-(rb6hv^ zWnMr0+EO)NV!ojK*A&SVCjnx{_n!79RN$R^|B*Y}_cQ8-&4SA)1twRK;WDrVtl|!=wsiYq_2iJzC3jsRbScVYrYB7@qbTbF4HSHHnejz zhP<8xVL36~m_lv4pnw;8Mni6h-`V|cJ~Z+t=66<%@%wUgdf`jFXsy+(-*yv+N)91o z*bnm^>%N^=ul-MaW&8&IWAY~Mn|_!*;Q-rv+qtK^olMil^BTYlE;@ohrb^J1GUg~6 z6vzo7P%#{@SoFp2UxMB=f3HOVU?h+i_oNw5_Dtp zbnB8wOG3pgU8136$D5#a7(#C}FX1ot{4JBxrJ;V_2;2NmNG<&+FCM<6Bq%3e#~OGt z>WMCzXr@Db(i>~}VgAqAKf}el&g0Jy{5=n}AH|c=lm;pgB;W_oF$soZsFAQGYHBwk z1Ut|>+M`Q{YlpAo$4`4R-?{GFArCeRF9}`Kl=!Rfw=+fOFT){b+w>oY{)6`&_!uj) z6_6|5X)P>7uSzfu-QOMjB(Gch9VLr%QRYyiD<`Ev_`cKL#F^P?ylel5`O@L9Go@Xc zlHq8Qk+`tx8c3+;kXIaDldMP3BsksCoQTp1T`nFvhl_^K=INuC@}F0~f=fp)DN$8o zUJgaQZQYysuaEz4vRK5YLPUCD_vf=mFG~qf-zW*Swy$VCG7Ut>bnI|_`&Ncr1JOtn zwYJboFH467haGOsywKj&NRn$M$G=?_?Nh4`c9rP@{IC8S1A&T1zu#ubYCe| z;by{H1_7%I&SgA*)eCt3+7~c2J;~PYW8B%kk1tK#Ogm07k@tv9vo}tVMMa%Y;-I1g zlo2<~3K^r(Y%vyxc;Vvn(zMEzgkSrbIHQaw8pe~`2pPT$D|3iK>+5D6|ES>)X z)6{+y^+_mGfDmzRkOWjnL}viU-R-;h;Gs{Fk@dlylZ#=M?YS+@vlI8v<$W!&`L@Ue zn@Y@*&w(l;!BCeb-@EBeY-+CKo%=q-m#1!_9j0-8DsYl6P+11<4@9%yOV={`1#uqZz zhxxuoG|$xx$7d$L&i(C&xwv&6xD1uB;0*b89s-Xue_EQj$X~C z;WJA_haf1qRXr&keeT#*w4_1MXmpbXNN>S+-!n#^mI_mnMV1t%@=6((=Usuiz}CsF zv@E$&JWgY25w?5{o=DBUT~ZzJpJVd7;FYSysp86xfftm)OrxHJmf-9F+t0I#$*Xd} z&3yGnWr*M1`7ZwQygy{b_#TDv@*>di6ERvsYF=t)(^(Nw-%ckyb7Fqt2w8#`?4?ZTTavx=jkft0z>0RxKtpnc5QDXr#M|K!%8=O1hIsqtpW!_kWbnANmqE^&Y@QM?-?C=J(akU0>qZ z_OGNVTun)DMClNSxiX69niW^_^3mt>qZ{7DaBHO%7L~oP-gqxI;i$2cBbfiBv5=GV z&OPtrhUq&Qm8R{LWQn6SJpWisT&gl64L)?>qx{O||6y@w;p1E4_Xtrn&N$G$q4i4$R zZXw~2ys$7Xj1GhVMWP*gF13MNVUy9b_X(&*o<4RZ|7Fdq`NO?`&zMh1SUnt!gjzU( zmNa;*^9UCWU2KzUHRw4R5!q>xNIHnl-06#ZRPZ&b4<(6KxZ;$P24A1JiI0t6#~3T> z;aAj=o<@jXIMZ!lO|}}eSMF<9PNL2q#Z>|l&GJVa2t) zf8WR08n$!))WhtJl_-5MqjHZq|cVx)MC^ON+}yC22dhzUHdw|G=I_PzE(fe1afD#aFH$xCAALGUQtP;jZ`a;<4wl zp|PRzDGF&yi+C!AFu8hKh~g^7j{WS`8J6f~mu%HPBhG*y`^oKWVb^K`JlDZ3rA}b= zVbAy{O8=A2EzNlJ7E>Y_^@aR`DS_LaRRxLs)agIMSEg^}j_HTe#F%*In`J}^cp4}< z9>)XIk8yG9QnRsf^=_^bZixK^xUfJ`>1%uyIB|?1iO}4M)BM)XKTpJ8bw%Xo+Iq)}SHF-KuXrK1Pv6d`$FJkY>H9g5 zAK*|JXIv+Eu>CmRP~qqTV=}^~Yy)cJffp$DcE;T{0)cDCIscw7zO_3lvTEC!#!>@8*O1 zKFW`5`W})vF!p)0R8bM*bJjEDV{xnyHnc@-`$(05?O9?|& z7&!4+to!Rw>6LzSf~IzXn2>9!QMfBXZt(2Bj3u9%S=Db zAq2CKk<^x-=lTpHxY(bVZPMf~_WeC?T>lzY`&9;#g%sZs0j!dmEqsEn#`AP$e2;^5 zt@W%MUeC4q?2^VX**k1LkcmIJv$u!UZY85`$k0k*MRVoc4Thf8l`bNAv_o#tCvFX5 zg|Tdem#%moA35~J6q}eoNmA?!1{_X9YDj2$&r62RMKWtcFVLB(0@GoNFHYUUunZ;6 ztaS34`@7(_n zykzyYJa_E5HW^l+5s~Q9f^({0^M#48@l*V;B@Z zO++(UUZs)z$HGqjao|)Y<`saQB#+Rn=Og0|k5faB_sU+_jm5YWiuxYwJ{nsysQ%^}6G+VA> z>PA3AEH$jk12%P_`~SNnVrjbnF%V;pny%YIUp|UyZ55VTj(2~Q}GcDB*bX7avNZ>|TDrg@jIfud9& zl`3)}Irf@AX8t3CkyolvSTzX?OQ=Oy7D-l}4@-kDP2R>I?)*z8>oa@SbSOvhhz6P>+&A@* z9e4}>{Iql!SMWk48Dcwf)F}sh6a40`chGVf5<_Z@f+hV+AU{Ufl&#_P<_5E5N;WkG z7Ps*G)21|uM*L6rFHP{Pc@qXSHY})1KXLIDdmN=dyfcv1 zlD8oiNl9FiOI2iuRO&Txe2 z)U@K_GI(`@=S(%hayI!YdX(f!nKL&k+;Lp>g{%Lex@za*V(Ea6(u;RvGTW?L>N<_d z5bxacLH=(4Kaq!!k}6H8gJ{GTZNo(fK&SeZ)ZVj_6rFUneCeCJweuM7-1WEo!j3=Y zaGYY)kC>>b)RF)ta-mO?G0x*fxUanx^(j$U_zJxcwY396rL24f&xiMXoUM5pO?PPG z!B~imOMru=qI~n%vyz`*VK8k*!;8`A7i*u17Ubx}iIf7G(t;vfNoXs+ZCLUW9p&Vo ziV~gcx26`jfJ;A)8#}l13)_E-hdVoIxC{sgv6Kuc%-@v=p;rq?kk6N1Qe&JKIoIZUKE<*Idf>!BCJo( z^;0+5{W45VQlhm?aesn{>~V5nRV^n5`}TrTLB9&WWNQzWKeMLTs_nzMlB%UZb}zlJ zREeUguP&aJZ}FQu-od91{ySn;0#3|sqb?`ldM%FNa-H8@Bo%t3&|RjhDa63w>W2rMoOxjnTZ#P zRpR(0B5_i|N{Ll5wY4Z2mJ=RoKg6$Y`+dINzMqzBSaFsnn4@^SO0u95Y#J${GV@Mg z%*8=tqBtb=kR0bcE%E&N&UbMC)P05~Ye|Ej6dcM zJ6ShI)D~0!09KNB*8!d4S9bg%U!M4S>QqPyP^qskHnu+VOH=~}PnjBEu39&ixpwmX zOH)yJM^4Tc4u6IJwe1i2n|&W8a~UIkIB^i78JddJW0fJPO__{=lLGSfled9pi*skJ zf>tdQ?WH^%-m~lPc_?hh8T;3x07pM>f)maeItLeQs?DS|oP+_V2#e~> zm6(M!_ULPF&t6NFR*&&!#GYRQ$o+pjX9N5DT`UmhsmlUt|^srZ98X zWS}mUQ&8mu$nEwBlU$5V&Po!R{ektbCAe-a&qqp*W}=~}L|!<0&5;nu6J8KH>ul;@ zd%C;W7bb8j^z7b=6$Q&J!V?2(X2;NyqkaVEN-8MU%mKj|(^_z4%dgrZl*&&9$+A=K z2-K(4!#atXvLLCA1Eq;=Q9TVwiwAm-^Gn-)j~ga#M8#VSpVhLE;t;g}UbKatDkS(h zr$VJN;S<4S;9!660RL~_$M~7Ye}m6X+(=Uzj7X~_Dp#c#>)79-Nw73ZO0J>`H?{9) zA|7588we*tbV&&x3ApIMId*oo@!tLa#1O3+vSr1xsqY9oesWcvdJ*mOK|qNiaK-S& zhGr$x>_WMIu=TB_9K4!3e=%5M>c3{YR55)nP!!c!Cqm%?*gtejt-TrNW?$J|ETAQ8 zteKy<4urJ-5^9KsS~8#7au2t+@_Rep#rqF^GLhQx#L_;hh<*M0DV6|8T@oFXVeFf$6v%osmV{HT!a)s<31uUhkRnsv083mF#^_Y{&i>oucKuQ34h zIe0S@X5qokqef3iI(l`u2y(TY}Op{5{dytf~Jt!3zr_C|@T zczg!oKr;2}OWWSg*CuW(+gyq8?$R)e9iC#@Xdx4{SSZQKzpQ;z zB-tfVmedk-83E<)>HGMLUGL+Ew*4x1cOGWgHyDx@@dyO4&UIlrN|jM(2RtzSz@iK( zB=4|()n5qjzi011vOgZ0(@k$NcSW+=O9_a?e#KR^{8#ufHn%nukw2jfB1jxi#a#-s z--J8_awHmS%81_y84IO8kyCR}aC138%yDQQe_M!>M=ePNU*7h+eBa&2sA%iCXk>b~I6|iLEiDSfPm*?&h$lMu#^Iaz({EODWvi^KDmyZ@fw-StlP=DWcs)I?0e0x1-?mi84Tq~t>Z*C40IXAXUl zUw-`UT-UyxCM{a7k?ugW$)Tt<*{sy?`CZb78g(P=>>c7Kcl;Kg-2duuk)u=jkaULd29qfff(vZ#?%-gYtR?9w5}$%df0p0K`o_9iIy_p@q)6>fO5xO? zft#l9vdLS_P(v7BDj5nGFvcAtt-{v6{DXVvViEO%$)TqgkCF4-GoUTh6%;t;ND z-_AqZeuwFh^NKYuW@WYtbv8;YKoHbxB8$pXgXHejCv?Lnb!`=8DopU@iJSPyzEAMC zhyInW21ea54QZjINw7r`Y85-s#G^4cy))%Y6E`E0RR$Fn3gDBz#!wV)oxX*?JMbAs zWN1m~sA<&16Eka`)EZK5E8Fv4PLz z+%eue#MdTo;WG!X<2{EyLIXd~@Fc_-z-36xi6Xpm<%?3HQ-hhhmWJ~-bxA?4&N!5h zvnL)TOU5kaz=2j{*YY*5va`FB5AXX|{%rUA*_Q8N)D0*8oh6B( zc;pqXkqMnR;Hh>UoSbMw9rd3#RaH#BB0GHK$L- z6%8pV*e~rYnJl8=D`3s1YPf!kz*V<>|whrPOOsl=wIa zT)9*$E-K=LhuV*t6;&Lg;g0?@y`HuQ@`p4JovN9%w(v zGe$03*!OqNxGKW+li%P|6E`sCM$(@|Spt(f{Zc3j$rBAn4`G#zaCUaOiF>M1uf)db z`{elJA$USG60HL#gb;Z5z7Nup23{S9-88?l{T;X{eD9|Jj}bQt!I@RZ5-n0p6tpKf zcTC;MKkoTg-ns7|Y13hqUuB}jsXeSNnxCRgAD7lYC!aT9gsF?BZ$6>=-8(y8U_eV0i6 zcM2s~vw*-?#eBkABBwj^CUc4b-D80%lL~=&a8) z*C$mlV^9Qg$vMZ-CE`zv{e)&#SM7+sag2~La~I02{h~+ty}5Q$lG%t7IndqD7skKJd-whW*G=6_ z4`rnrBib`{nvg3BA4;i$zHW(FZ8>WpD|_N-rFLK9L5{O`kBo@3ag`%yBo!*d7;?0TFl!Inb8=~luN@}1 zed<1LoV=9}?fW-w?c7T@2E-|={Yop^=D&9nKQorXx82xd%h1_K)WnaQXA83I;+KZr zg|=Me&dK}I{&d<3?a4D(v331Q>_S5N-{?+K5Ze2CpPU>$~Kla`zV3PrvH+X zxK%n@c!CMyEV)AHk+Z9_lbfgS;g+e}`SU&hz*L-~tAUlSiE~3{d*O~iHT%zbF|0V0 zph?TU2`j4{GR8!l z=Fj*4J-4;*;|JHho)@gThSk{`yfh#bt>fI*f-7w|MV06a=ci&oqCh-j=}B7s6#aZj z=#vK=Xr9E|%OM)ABu~b`uOw3{vCqA zb{`bx63t$|ju+#^@)!GOIU%UCo}nHCX|xq@Ldw}7Z+ZlRHOGHDT3xcVQdF69*+n8l zuF0^pIG~64==kUO+{D-T-ZkIJOV_-JXAED)Xk(0qWQOvYhnog78Ywhp5)n9x;s||i zk`zf1rH7ii+@{uL6r1kpkIk2;kXA$)Rm&tSjg!X`gCGW?c+5jV>%+grbj}s=V)u&Mbnkan2eMB&dzryK8HrYqcPz8$zSs-DcMs3 z80lY#o2^y}E#6KifP%GILYBu0`= zN`cslgP!I*)_IJtPu#-0cmFLnwI5NvM{wnsvCEDW*wqH`r$vp>wK?0HmRM63KNaysnE5Ao** zKFGgLe1SKtc_o*PT*B4Em$ANe8s7O*3rNkl)Y;S&nhuEmA#Jxhy7JIZNR~4wUrn7{ zDv5#4XFmUC%Jq2As(K7gs)BB$lo3K z6o;9j9j0lyAvR>|fJlfrk%lE4?xb(nq(?1OoL0&f#Z8maMtd>&J zDinG)MWvV$=zlrz8E)@Bn7CJ>mK!@uY)*3ZrAgaJ(Zo{|N@eMbhc2u^?OytAKIiz@ zflreY$s`iY0>?%lP!U#SV;ssS`RfB8<>Bt5ymkGX_@)(Cv!byYU$#_3BIHU|2o>4U zo46$Xf`q=kPpO5b269!zM}-mr5riNfXKfo5$TeqAcQ-dq-o?Ki{2c%9;Aa@mCvdL8 zI=|Xn4xgOUbOB`rBlLV=e}0HR*!wqpZt{BGxZ+hjW6hOZ-nx)x*22eZMl#;_-1hYS zfT{?Uc`iyc^0gk(zMIKk)v^^YK`My5TEVE5Y}Q$kQw1N>fQGnK^o1Ch>K*3(?jt-r z`8Z#l`Whb^|11;v6w^A5;8~H4(Nw>n&sR}`OGThlc>3_u%E1tG{H+1RO2}Q|($=xDZwR$f>raPY_6ngu0&~2lGmx)?{#VvW)+&^Sl?LBL^#at?FV^e_g^#Qntb=F zZ{ztZpUoM~)49C0g+?}n7jF*mMs;;LE_w?Np;GO6l&(n%(6^n5+AsEI91zvSAfZmK zY<;A|zpxL%B^@tUnt3O(Yeb1Ykau!+c6M=l_W>T9evnTd_yV_fAD|sOOvGtM{Sc>R z>j@H)Np>`%rm7j&E`f(?8dyF?LP^T?L~@=vd|7pt-{CS#jVO?{28K6WQ>TmN79=2g$<%Aw0?Hk-J-flrt^Dxp-J z*F+9VZ6USxp(gRqph?#$P4c<2Ey@hkBz;#ej^H5AJ3P{TjC$CM7(s8~rc?Y*oJbO zTXIz#=*~bHEwuuRBC!zQ)fqzoRW!Nqe6`|Hvh?hnltTpRak@TYZEbE>cvE_a5(y#F zWr~NpkMVGO8+T6L!)M2@=l0H4x=eE@Oflw~tnj0FX@V|%;_M^j-dR2CxnTGlGq-m2 zvyxc-r!gn*|89yQyQ3*n1Y2ChgD#O8(~C7 zI2qrL5Ho7%=L zQ+M&Pi7zk}x=h6>B7r7joSv;C5a|(!3SLr$S+p2k^aQ6TU5v13;YCX#g7vsHC_lUD z`^a1(EklCnp9q>NF_`U3l4Ou*5(CoUZ}O2RH$R;)SNM$r_e|Z#9o?;r$S^pEk2%44Gh6p4IX*blDPz*2i?BBz z=Xdw~4WAvqo;R-fcAmNFN-l1kPpdgh7QGSgQ(#MpT1sLIT`zNIPhM-~%yiN{d}iW0K707<91asq#~vfD!3MvUoZNUgPi_=Ii+!z1#Iw?k zkxOJEpX3XZH*rh*LC$M#TX42iOMImDiTvt)e9Wx9%NhC!Op3@JluVl>&Cy%S30*d z71~V2DRPuiH^jzl1731^rUy3&f<6EEWDW;rVm%!ucyRh5)Cn%=3}=NWc=D$$;8HTD zl1TMmpT4~uz*@deb`5jn8q1!@UpiKTbqW`FrVA5|u&CrIFJhG&V~xOJon~)-fX|1U zxT$>?V=~OuBbV{)kt?}i=sZ@mR&ri;ChPq=hO?n`P&86Pkb+Mm0ZtLfvV@d)Uyuw^ zd6zgWz!9^)0;2NH#do5Q&=83DfM!_wiuwaSnG6@=)hdzAPh&I8dl6YUD5WOXQA~b2RAzRBKo!~1|w{v^pz=7yG(s4N~b5N(v_v`QjBMAmwz2Zy zN4U0iIWJgwEn7w|U}Iw~o13SxT2?1|gcrQHgxotnBZ!Jt5M*oVl>-)%rEyGO0FA!S zZ5K^WWg5^J$U~1q-NWn*d)OHduzzYVw{`F1#;M!5Z+a_jI!xx%bci%u#wx!8T%u|O zEvV}@<*aeRb-q%FFX$V>pYHhptNj?kBva;Jf0+TffLGIH6S!gOu9<^U%h$Y8xsWzH$W;}P2D{!phl2TKKSNr$VD)6LqK=#&-OV$2QEB{C7GI1t9!HL;(6 zpS+O~X)+>BUO09&7Y%LU{A?p*!|Q0cCg*3TqY4}SI@Ci;hY(*_@`S_~aW*b*WX7b~ zW#*(LGH*9;6HxYry>vt1aotV3)8k;+&-UITxLuDHhdopkFK#BR_T8cY`!i`=MBy?g{uqXd*!? zMkY1hi30E1^S5lv_b@C&#x*grt%4_!u=OP0ASJZ~vDR_giIMH$0QZf5X5PJfSBN=8 zz&pldB&|)=(t@NQ-WJabmm_#ICS-M$8=(sviii39!sg~? zRyS61TDF$8ZdGbisnC!X&O16`lAsQ6;O;KnOE31=-rL7?ug%upR_>d6h_6rH!J}~} z?bzW^m_#ILfvsu`0ZN{Xv(oe@&J@|7+!JD**eBp!Rl-j0b1Eeq1T$?S<^Ju3IslC z8d9k^4~G!wNQZ8_&A3jnC+ufDOfuO!#P)m-kF~dR`_#SMl|Mo|_L$Z-ZEd45Cv#1P zvSC)yO6JNM$wiT%{XqwpijDq|&ca;*!N(N81Hz{!ZZLhkJhf8inE{Ct$knRzL^sJ| z3&}E?wojI?8j&bHvEQHF=_~#{>u1MDW@6R9bgXPntbK5*M`7&`1YbdaILUtm~UWLZW-8@zb*nJ94C&=ypLGqMc~yA=fK z;>6RS#c*S|k5DJ-9EoRhdq}_YLsRPN=WSyA7h$ceB52N`IK{4TfWO)Q zF-F{H7;+6ZXB)V*bw1}e&Z6ZThB@N1j)(*=&sKFOyyJD)VZH_Y}1w= z)1l2&oF*!aNsD#aT0DZPqw9M3Kq=Rv;?St4bYVE~`iM!=Bosin+Mq!+(O69yXJdYp z6|$0E=rR$f*cT76E9~MM(|6HyO`6i6DMMU6d>*IyGdO!_BcgEr(7C1{?r6|rXt;qy zpAswM|4nz>bhVAQwY0Odk3({p$?jnu54*W{>JfJ6KDx0(M+05$GM!J;k(`EP4AWwz zUqQoAvmg+yunI2a9tFCbtZQOY;a?0VFHM|RZ=s;+8bI|2Q!6v?W-o5bx;~^4 zo1+QYmixrkPU+@Rs7PBYRc5L*B|^MowXDRsRV5nS&AU9--N|k3`)SccBqea^7|G~p zw;Tjffp%;YG%%$dJdUPo(vSx0{F?IM2?>9;F?y*EzopME%2VZlk|X}DKcLaSFG|#$ zhIrPloSI?0NK%!EKL_`|Fzq(n~GHHc=X5# z8p&gzCtW(BLk}erPew-OGFD_OSSJk%b=puAim57^G0g~+NL62#aB-e)>Yx{14@y(A zGO?`p0U8Ha8mONk>9~B=inj=%;qqh0$S2w$Pj}fX_?Y#KsX%RsYQ`b5KR@kc#km4tk{_}K=C^wj?A=T zn$n~p!YaRtsv4D||)MV5yCW#?h?1L7oWi?d= znuwZp%&fap6fj3D_@_X0t98PoRn#w#?) zNSH$%-Af{|7t#-z^Ef;Xp+Sq$Y_v>_`=6-#EcJ+IS|;^6M=B{NY4>SmjV(|%r@EX~ zEjZdT2O@Q}e?Qvu$d2|4MWS`w2dRBS$)`>-cFZ&_Rqd6lNVtY)Bwk0aFFDHQtR_;x z9EZr09Fld8NFc-U-#2^@&Noo)nh@)JH#8;`pegXA(OMz(1)a1 z?v-Q2yb_IlD(!=%64RREXff2+!g9xpXGg{~o%Jkr`B^SsOCrBAu<0oE^K5<4W93NM ziN1LuC@>@N%|LaQFXlW5mJS+pYTiRZVq}6TUO)CyzHRL*AjBE%%=x{6Pc6cj1`a;H z=ac-)p)a#C8%q4#VSUd_AQqzB198QQ$uTeNZ?1m*!%`SO42= zR7*r~%a3IFTIkCOUAmm@H}P|)|0uXZwcMG~{QOUh#6J@brZT_XuZyM6Ia)pDHTlv#APNXl#|zA{FRf`hQgXp3WE^OX9C3 zS@qyC1=Og!6-4nW6Zj8bjvHD!*{{^b!jOHh+rx@>6 z=14FqYgOs*wHYB*^+`mdkP~?1a+KfipJnb?(Z^MOs(%`BM1`nAR4IQWqRW$nPubi` z%JKQM+2V|(iPEehZALBpU!}Sx#m4ZHJVhWf9jAE7$kn|4j9*~$@R<;E91cX1tNdJ1 z;TQ>s7Jmmz{>iE8zcVBG@w)O*mq;KPNDj~4CKt(~Z)uoz@_EVu6 zp0An!?#w?sl^_V!zP_E)ezIO9SyGYopd3U=I+`*o(HHZgJXJbcdUP7qQ4|%Nfdew@ zFU5*7kR#Js)#IEuM9u7V#vi$I;kZ+%Qd+(i@Nytg34kvWuB54)43rCV*h=M|Hlqh} zRJ^G{3te*BVVW0>J&WJo{EJ+?Vhe=O55lTAlU5iksV`KkHT{!ldNKi#2HV=+kd37o;F1hS(vDP|b3{v&k~xT!HdY}$ zJ-j0sOk1{Ih$a^~mcuMk7QyUyAbd&sM^eMAdZKfEpT~J-aIUDRr8wlG`TZ?@>4PY0 z3hXBBD19O3dW?*dpmN$K9?`rsr$*eob0F2?{-<+MoDx-19CT*FzQhZ(vhX$HY1(&| zLTQRE64Sm4W`UGc1(M%ntkk+igP?egQzpS@rUvM-v_Ov*Qu==vvJ`>z2sA=OEWj0K z=gbtU8na{uWVU=g6)%sH+a`3;k|t3!rr-(bV9ZK&C%a)foPt-`TqzadkdIv;_rFf>y zP?ujCfg3fiymk)_ZR%|jV$VF1SrM$GD-h>c@?K_=?u6iQG0>Zy#G58owU~e6_rGvg zEztCcj*g@Pr1a=`;#Y7EnHWdOPy)$<+?OTf(gz?iB(q|s*@VKY(isM>5Q<{f;8H1? z_YzH@)@T(L^Hr71ofFci+sx$3ebi@RBB&_%?yWnS0-7jIfMMqa+2%9r58 z^}}K5QJ4NlKdllw0vsx#v{i99+M&bYc$l-BoA|bo7x2Ry{|i@)T!IEuUrRpKIA`sm zqWT;-g4;TEfv6cyQicBydq2Vl4}OZ4G|cEzh_2v;ear+upyrn|&$4|PhI+yg)tpNzHfIBDRUEz~;$AEG7sLQn;9h$y)w`%7hi^eJQk z9cki6R$5EFuH(1gvT-WpG2$k>r$n1OQ8iuan5yD8t}}b1(tKoo>kC7aieyJ19-bnK zLuzQ#N~Z%G*C*p}L-L*ZBBHY7!3Uk}AbAfJB~0xrsRaR#BO~IW*??vvp~m7Msv*is zX6rjIzGh4hu0*>|B@}B8PWls_Cd}s2M;56ZNS3W?mE*CTO)OutD`%(Vn$sjpZ3&d9 z>7Yye2SFqyN&+;k>I+es4jtOD&00Uk(}pkPhu6M=Z(s9LHV>=&_>CC2CmtJMwX6GGX*b_ znkB&v6>u@N1w|eHg;&w~rWd7ytcH(P_-EoE#*~!wwmwY$-j5LDsiEa2QHVsMhZR5d zLkSg%4k3qmuU}0f!lEFNI5ox8@BAgIVicEo;y*(p4FA**+v^Le-rON#I#b=!Zj|MZ zJ%&zBBSgAiz5_=jblYgJi=Xb&n`*<58*S?x7M=qk}hoKk1#YEOsTaRVZe`1SY zi?&}(tv~M_Q{72^Yv*6EJ>SJzx00S!x=zycqQ|AmE#^y}!<6E>f)lc9pTX!GUrW@8 z6Muq8-$^SQ%Y!hsr_s<$EuFXQ!$;`un3Wue=|6=1M!^8(4hN%wS@k#X1A!7G1 zLW|fMf@Ve*G*OG3oU&e@^FghSNWA;GTRdVxdVGIjy5mm-EK{(a!U&c|-njY|e0AzB z4(TKv?a&Qv4)w;#H81ztN%4>M;$W>f8x`opk8&a?f0o90z zBenRYOtPvAt)UYf9zQ%BBtZNZ8rbKe+ zS(o8lv;5w23h*GL81)vxwOZi7N6@o2fWlA*Vo=<4m(ZC+ClAAcae9yKq<7bSr?JAX zOp7u^n~JpSLqRLe2`DqSpR%ib#X6jDL;a-t!)EA`SI`kVPYKN=&?~ zViM~VSl7kWoC;*;pGWNUY_r>#v77>5K>DgzSxl|HIFX*A^C05URtrDe!mVFR+@km^ zu3+eS&qfdJr}xMnI=9|Re#0&FZodl-93V~|M6=Hs(sZd%tB%Hjsxq=ts+W?n%x34TBUp+%3eGtmncm8;JpL!_4F_4_TK!koV&YMa z4}XeiNR`n(;(C$Bx#!a-^`|lYCGQw2GUG|6k$UONdBimItsxPLf+nt&%RI7T6}o;E zt@F+$d)DR1t6$Fa?f29B!k6fM<~qXO{lv+GxaJr>^8}k%LoFcc!lUm6wITv;^I8}h zGLo<(NSL>nZJOFjD6b;KZin#LUcAVukzA=Gl7sU!&OI+BC}J{=E?9vyp8_%B)TKlx zbM$V!E%EeRLJyCZ|5)8+N7>9XP4k@QITsLJ($4eI5nMq_@D|FJ_%o1d!Rpf9i=YHF zB(aoWke_58S-F~Q!z%na=hA%E<>;%wiOy{g(fRxr37@^5-v0eCafsL$fmVZ}gOFl$ zR%&Z4mGV_3>3YsgK6hWT{GH|g;FJ3D z0iw&(LesPbkrc2l$WG@aE1!$TKn&oWFr1ArFs&8J%u?E0;@ zQ!t%p#xs!WIZz6zY6xf!Ob1jverN>QayBDpo`qg>1)Xnw3EfY8miA|^M|bT;yFwTn z!56u+%A!1G6-mgff`9gvNR0iMt96)_TU$bv=px<6x6z-kT>1+@OtevYJ+h7K6Y6I7 zr4FIgLX$}pq}L<=${nd4CYHP(=ll{A;7pT_0cX+|(E%J&C5N zOn1fEFg9AsO&}3f_vFTq1rw`<*zO`7&@3a{xCuG!G#Xc4MC)5$%EWvBmiYBMVEiC% zXa&Jn{ZkkI4tYamo7Y@j2I1(e>YeXvt4m_Ol2C$h?>%^@1k-(6`f*xuICQ9qY*>%_ z0!*k2MHUmvRJz-?A%{EAbjCH7;~wuW76_!4qT9}p!^S0Bh$}`RujcI9Zwa4b#oFMA zSBkOP&e5*ooZvQ`PV?m(@z1!3@QQEd@Lzub{rc_XhY#U~R-}o;*tdytHE5hIiQ936 zMb#V}tUi0ba;gq|z%7pyKAEo+xHE&jQ?eB$GA6^kdi5(3U!rV9Ipb^3(*=(k~miH-~CU#W8a6#i8S#DF6kyMMvrKrzrRaWXY=WoBI<|)iaDlJhJ!P& z=U?c6nKF7F2qEAkBW~P8>t!497jLHXZ`U*RCx1=YyC2CKXluv_&bn`_Ryh=$p58Jm9nhhMO zH9OF=w;bFlIF&RM;~YLln$Nl%iGo)pq$!!?1mT{9iPg~x92GP`oNSZ%2C{Jz{$;1J z>cTVVe)4(_|M~l1&mN@FM6w3r#ZX*Nk_r zog9pZX=#?c6D7F?%acHFq(B!Nms|=lwO5i6t2{MEPZWqDP3f6GnA$X|n+Rx6X>7TG zkvG4dmB07DahINtY9w}h3!Yq6pHXag$<92(Vr8n|Ytg~7GhZ+#(dpUs3oApd3HL6l+@miN$_{R2(y+CLFnCl8%`7A1Op;i zc7LNlbV8=-e2ftq7hhz96PWURLXG?8^-q2zOK_<45Hf;G@kT<9j)M*j(|Y-fajQl- z{O%7BKlQm(4mKSw3QNf-V^E~@n2A*-9%a>AR5he5oVAOEu}o%vYF}E|KG>r-(tIR`|I;9~mjVt~Ez(WD0&9nI%m#p=`7aVYQ6 z{>%-C`L8W(^!8-md=26=(0~)4#^URUsW#QCQ3;Pd29q76k(DOIOFhAMcw)DQoPK)p zzl*_)*VRmv=Z|2a0bGOjr@myv5?VIT2a;*fzR`RTjHsv~RB^1seCH z-+@4(S=g7vaVo@afJ|sS_Zn7iJdKIiqw|@s;9_&JW=u{R9On95wNi7o|5M2RGk6Pd z8OeIGZXcV`Gd@I5JN(FoH<3vOgf!_Rp^pj`{7&a;nF5-w+qU_iEcEpgSVG~O<$x=u*WlfNhuO^319)GGDC zq2f*CQ7iw{Bx2hYWcFo0Tr%hiZLKfutC_?L+ro#2af8L>lx)knY0q7CDcWuW(Kv!y z26veOJ1%wtrZZxI%;6d`@O~0a_H52b$w&Mc)HypoSKnafo5>t9^UH|WlO!3(EK?Du zoRO{J#VcPxl-zQa+0R?cKvdt_kEIZ0A~h!=O*M@bDW=H;9+`ZU|F-Q{xo+YXypytu zoFT+d$MZN$yV<%bfYn(JXbeuyHQ< zuTlXqXa39$Zq7!s=E~@nTZvD;1gj@GDnchjeq{Z3GvtO08IU7_%R*GR1*GrrNg)_# zo?imw$xzk7S0}!~n;-fquAjOIpLrV9*7vN<`edmtRg~Up?`C7d+d$P(f2uEfv<L4Z| z(MW)pME``uWx+Qg!WRx*#}7a9YuwzqAEzy{DDx)}pAz9Ml5IYl0^=)v6}=#)kpGlk zzlBn~$r%WcMNbHkoWStQUdGVtUx|ip-wI3$amhLkcOiO5bIZA@y%Zx}Jh?>bP=Zx6 zN(Q0xsjsA1Y>D-$5SLXz&O9p#|GLy(Dg}va`uqW*d*h91a#-C7@qeOm91A|1+LU8< z!FjMuiy7egre_*m5~@~(k(Yfl+3UY88N1s?izr@&B%%?^B5~0^=P{n;iSf{_=W`;( z*)me~)IOjhN>6)y-}-N3b+$Ue>?$mVjHOc>fksn>iy-t6$-oKS(B}QS|ADt{`yC$Y zJj#k}Bu)Cb`TM+`5&^86BWIptHZz)h{JeRmE$>kqxX>hFA${JBSAiVFdsh7Tk0EEQ zC#v+VbR^U=X78ioue}V{7*2(O2r<@|06C)~>h3+rfrH67N)|$)dV#JG@fTm1TKp!A z>r4`%9v?r&sVBeTW{TMx%b^F#Z@nRnQ6RWPPjI~m8&0pZvX-x7tWbmi8q-vB9>F(R z{k9*)Z(2)`NHBwU#1RVNXgH|_a$mk`u;i*Q(NOB&pV%7}WcOnsS@~fB^`_p-{ zGdHI;QB*PXO3Y(! z(3h5iOQrp_ zZ#rYoxf9h`Tt=~;nwQt)tM#p;&*GxtB+Y=hq+g>8&+!q_gp?V)FD_Z5e0lr^{@bI! z#`_QaD?7q|MqDeQ1DJ2(qDVxX{HyiS=OB${N+Jwx6iXgdmXoZMge0|aiAH^JF6kN- zZMt5M;n%(fziAcG{LvgzixPTNCA;84q9J0c>5#9L0PTc)>w~B`)Bj3q!NsM&{^inh zk+Bh?OD%mN-5)oD$1_imY}XF78_k+D_MILExIH~0&Svfke6&iZnhy;Wd3BbTRq?-P zBU#Ic){}XA2)X9GdF^YA5)l$9Q53fb&ppXNc%TItOm!#t!yWJ9ZQFi>&rW}xN$t|| zEnGBCp%lK5)N7wUw(;6;c}YsBtR8r5%rD*r!we;RDr zm7ND--&*_J`(9=OiK#FqazZA?L>0#3P*h3kR*9rUN-YI@klm)F2!~`T><&8|Zo9(~ zc0`B6l*6`6wpvuQx@Bu1LkfwM$PihaN<|h~tSVNaP*ng5Ljp)36Pby`i~^9ud-tBb zmVd0Z&pCHK_uZ3;_Y!+myh6U=o_p>-d-&G$eSFJJ*!|c4Q&247jpp6Z1PD+ZJmh+W zDI36@rPota-0+2$YoQLOBN5*I4sh?$PrE}TP*$fsuui>hB3OjY^Q-t;|Bj2|v2+MYLScKrd{vmvR@8=tn%k-qA6R8iKxiNwQz(&6i zwZy-F=eP0Gul_Ck_wW8PUK*SMgVE!jOA1=|iinAi3h;?2au2uN29~e`|eKEbXM4`HFJ6wU9d`wc>K840EvQ# zF<}NxA=rsou3x1)uatYf`|gb0U>T;{V)9_ zIFd)XxQb%7X4?Naoi|le9B2Ts1hhDLcMB0HbfjNww0Desg3t)!OA{v70A2+EONaPd zH~#0iHe6%TB({1eCQG%bjx)rK@}nu&qGCd1buEJGfRWT%f?CJPKo#3{%ZNYt!5`pn zzWjf{|M`tyz!T@cj~~bdtWysGCMZn}(Ow1_bMsY0!(g9^lb%}hV2u&$cOHd8P_m$i zj7S23f|saYs3Orc#&t*joK(!?RDW!$5QRyZsLcPWbmcq(U~!|y-r&OE5Q}1HBElA{ zrL(Qp$T`(#i~}V_*&ePjLAh?s5MtlIqWwDx`1U)n{+GYtoVg0(He+bCAqP#ivD&)w&E zvvjcS9Jcvlk;!yEahiL?7(Df~Jtt20q)z?P?&7NIh1k{wN(T>t$<|s&ah`gOW9V;c zHI)n3m-?DfQ%52Zj}#@TBT$T^r&I$5Zq$P`b1rWyr3m4`1tIC20e z7#ztCCrS+Z<~c5Eb+*D&i`LK>H$kdb(zODd_7$V8L2wb>MN2;bhyaSxz;pnhVqKwP z$~LY9V27fxffU=Pf_ESp?L=y-AR?#;;H}@Qk8h&VWvu<#AI0Vuzl@;4g~1oYH-gn# zF&M-Kw9;$WAASJponO&l$eTIhEf0)MM;Dp9+4FVq%^s40knt+D*hRL z57Crt7GJ?##xR@NFyk}q|Ky*+;49yTxYjL+?E~8(7dCJD>6FlXTGz$IFpTL|r9b4U z?Cm-C{7JFDy7$lHy0sgDXoqcst+8?9yG~(ZuvM6dt_}ezY!{2_ofUq)}L zQgi|2;7ei&MfCgbfiZ+2Ad;ddVqIHaysgYechFTg9uyiC{Me%oP8qS~7+O?-D`(dn z*I+|)>|Tfn0(*hGL<6)w?yKHDDX@9!WkfO|;^^jXOHO;8BnDE3U5Au0$;3!^mJ(9LEj z_=oNXt?xoCwUatJB?c1^r9=TiDLrsupPFX`P{#2}0U#zIi-wxX|BAF2AfCUcx1uJye=H~5NOVI;^@KdfTb z3l{xs99-p^tE=07`=dX?kvHzdeY=n1-u1h2ZEvqTHssOg;1g`jm0|$WuV)~8CMfN< zY_ET3^9?*VJb^#{;9K~k3(w#~{Rn3_&)_}%2mu8OF0dPGh^in4R7xmw#cOo6%fX0h zRZJVmJ$qI3IDj9207XgOs&Ap~Wrd5A7e89esUR{o?Tu%i#`*u(KQOXDk5V!*qPiEn z;D8b+0x|gEW1wrU0iloL*b$2s-E|Oj`##V*Aw+_N9#jix89_0EG$5$hb0+IrEtC-1 z1$H~AgsoFogdl|eZTrA??}wgv!y*(d_qRF{Mjkz}yiIZcePA+RMHH&EItz{Pa;*{} zh~In4fr)_zV?*CAv0bWUvn&Njh-7oMc>F#n^(rRsY3I+P^EE}hRHMyLpC_z@0LJFY zS52=oMc@fF*HVjTD@b*X1ym#YkAE5zDJ8mB23fYQ+~?#TxQrNn?**Ly`Twp4J99rj zp+|%b74*S~P~Vyf#l!c3uiXm~Lh;}|2vmR%A4c!CJD}@iTyVnBvM`V}G=L)x5zK)J zmvwfq0DAjA^zJ=?c;YNrfe418>_qH)E1+r78dqunztn9wcB@5wL7MPr>)(y1U~=T@ zlV&e&oWak%{ZDWmU4z}>8mxyt{=%NmVPEfN+|s)lhkJJ-^!uO~u$OjWeSOb}!}`|X zO(+5iRh%50#im@u%NwU~syv53x$u2l)JynKF5sQvd-$L{4j zzXcKN<|IE>7$r*gjptb;MIj7&>IF+*5aZGf*FeG8xNbMFs}H{WFm`|bPa!<`85DiEX0%5C0Kne_xzihx-)uV0}p<(^_3x$bzBod`$^(xGa^~WCqM?eEv zb3x;8(6WHsQd)kFF?*3bd3Bv)c;XfGn7#Gi95YTGqCRGGXNO1TOFvZkj(v9j6gxQ& zS=h=QAkYX92b8BzWAKOHZg{Nor|(dV#B)=u%aH+y0E6!x2lvbk+PLmoCOokq2w^RA0e<{JlrNvQ5(ikegd?_9p?g)U zis_Lx)mkv9sL}&cQ!h-%@AJV`uD`mvEimxr;C-CKJBVKV_~OPX?3RFjZykGRmy7)2^)BK@Bt`T$5vkhdK^HZ07bPZbyep>h$ILR z=urc}@hf!_(_DxQr<7z1zB+8r^Q1_*mKszf&W`2m>=#=xH@WgYQ2N z6uV5CNXeo`%7|PT+*@!!1$ceahZ~;iQ^*hA2Pq?pB2ol@?*)`!c>;Xn4d93G#qJ;f z0@gnFqtHGB!vKw&;DR8fM`!3 zjn^aGaD&&zIUrPmYIIn)`T-q>8;DQ6Qb*8;>~wXmy6ti(u>#6$bJYnyi~Vl-LvFu{d^B6^CuXC*x(Fkto3B}6z6+A0?|%(? z({(5wc>ufr%101y$Ymw5ekXkakgrT zFm-T=H*pZc(L*4$pS9WK6U9Jmbkh=m@bIUhz2G9!Y=@u&Fm+|bRZ~p-)|;S@E<&8e zJw>jRw~Jhk)R8N%4-6_OhXTIy4wS*}GblHh(X|5d3->3VQ_bjskTpQ`pcwqt*R1YH z>w^0r#^%o+(V7pR?Vbx_l;tME!6TNk7VX5h6N*+7r37MyhJfMMp9FIc0n(ULv*w;c z3aSetJ>m@_NY8}M4b%dGe9u$`E|t*N-oWtGS(L|L!QdNDW9^3@#ooXDv%tYS5jIM5 zUoZ0<5(0)K=-qY5C`@AAZ5;f$e!Qrv(ae`B3Z=QZO}AnkL^TW8$(7i3&IVnhxGbG> zb(?J@tOjrbtSB=GP;$>UP#W_n;cfX;yIBlDWJZ8MLlrWxW0s;F!UzZ&5uMQ&!Rjf} zH6texP`GZ~)o2}<7H!!#@sp`iAo3RFJ}U|*L>3hH902XT9?;U%0JMuj_uzoY zlbYu*Aij78N&?Y#DMF|L_W(jk0u5x5V!+8;O+dK-qhvToJ|Pwb0t#S5Fg*Se^tIC{ zzxNE*{`Sw}+Q0G_K$lX{`{mnd$?qH2?lmn+s+%3Q#oQgKYpsRj)gy&f4d+-LR#EXc z==efh{Gmn#5ZOA$#s&@8L4u>%<_F=`Hpl4R9C-^mSG_J{5sT#cHP|l+jNt9qqbGYa zos}dLylYM;chk|%wX1)Ekt!5~Lg3Oj5rssAyAOG~Y;+T@$BdTP7#lof1W;56GxYs; zpqtU$F>P!xRcdbW_*E&|Aij{_4`#GNSs;%9_4O(;|i|o z^rA+uM+}G*QNDHx6u91x>bm6C_I4-WLE+KtAdYIN&y!<-aLB-I*e5f z<>J>j4t;lUNo%*Gb{;6vyV-p7xh+tHz{cdZIY9Z{7ZCs6KS03|Yd`hV2$xE120}j; zu%ZkHTs*n=Y}JKiAq?->=Ri>_s!`S}lO`n93M?BBSE_kUXH@D^P2g(OIU>{ngS40M zcqD3>h*VQ9r+T{CK522SsaurJ_^FQkcM`-k|Bf1)VY};J-2j)XY>6*^V)Pz9Rz;L( z?wBs#;8p9w_(Irp;S`V;PheIZd)wzQmEC;N_v8i3{XXcmbGZ2T{xJqmKMf65yj|5f zb-<+Eq^3x%*1Y%H*1&{S&GASig$yIgRYh^shLXW8g2dXQcZIQ<4b z__=?K!81=I7JU@TQ1X;K*B!mmQI($(AzXXy#1m2e___!yd{Z4wb;mT(cpcW{l;w26 zWx{Yd6__pC#{g#C-Da=b5hASJ{Xi#DA}Qw@)Ie1vQ@jr#lrJ9tn6V`xt`&%<&*8(r z{|_L;&5G)Sr7hF?;ytYirc@Pysr4BjDIzc-L}Qo_Vx*L`QKC4wuLJM8Vk84X0pj3* zSiyy2_~maom4!!e*k~+t3BA3`X_3igZ!9j+Q${33IDE+H8ai}HrP1$7*-&6wOg#sJ`xK}{VoWq6x z=P!abHbF`dawP>x5vFd4a@7Ov1=CdR<8873CY)s6Z7bZwQ!g;#+0hg3KY|3GynmL1i< zP(xaY$<|yFR0vn#h*hL4n7TTKNk;`Hl;3y?7ry)@#9#|9c;qxVK`^?~Vw|zwt|Z17 zf3GIkt63I2JrAA$m*cPJMUx8X2BBxmmTkod1{q7c5Wph9P1k^KzqynBE!Ajfu=Z%v zuL(dLV)(?z53maFM-4;Z!vFi9fMRJIG8jVT>YqQ+K4{aiY)?N!mK(I%L2tZZ26~@+ z$V6;cv;YQ2i*6KNuUL}RD3&K)1w!f+;|3V_sL^(r!y>iDATek&BHVjdN9T(Z?FL^P zNxb{~C6q6`*3ID?09=19!p*l>jT2o3`ezBn8ye_fnbwfSP2m7W1c>w>o)YLuuov za@qwm2UfOhS0;)@$#YVmc;p^%(OcNT*Y0>?E9~|be|7yjdE-rl4=#TEpWQX-qyWlS zPh>6SsXut2`^n^eJ z?nFpNy>mC9eCKTx@13u@d9Or#BcMq*ZfcfQ=XepIPrZoYnb&PTc`8x3d&#_yD2EiIvp z;cF)$fw#j)2XtUXroDjjg%_Lx#M<&N$Hu-)ijc^NRPA-*bO}JX^FSv>=HeZ-N?JuR z6E}~XI*FksdI{$ba*3mDLt>(%o`OQr`}Dm)lx~XfD}q;R1h5V|!r=7Dj#8uwia`H! zk3&VF0SKyqN@p@%N%Cp)`_F-T1=Imdh*#qANJTXvjjA9bg^ECjit^cKtAch`avnRa z_KqtBelE8oHS&HMCiekSIQhk5fK`iWwi9vA(W-3OJ{}7Qh)^giLbd2;)7Yq}m9gE4&R6(e6I>ZXT@Cfnhc+v^BS-W^M(vsVmC^zObJtgGK4 zyBHpeHOZ$od*XnNU;7FY;Xq2mH9N?*Ly>!E=(n*CbU1XUvy^x6_>2|LM47$toJ2AB z-ZP!74|U$P{=WV89AbnxEr)cX(`TvO2mzfr3l#(G+L-s37hoyW>l(=m>sf0lAtl1_ z`R7f%TouaVbR*gkll|;9cO@Z*j+F?gt7laAMG087qp{-27E79vYaIP*O6rUAK#-DFLVE3<_&o5{`dA4!}kqQjTcM(Il` z2m_Zk5f0snu1c7_Hrr}hqP3)>#~6P3+uP#vM^XfjenbM|3#VMz4xQAXMNWm`2G|&c z^85v(YG`wPF=YbrxI<8&_>qUerE~*;$@Jy4QTjoo7@Rx>>J@%O*L!dic5Vk(R|qJa zUreFEW{LH?jP8KD86iY6jZB4WXljZ0)XN=p`Vr`2iE#K%Bcu$$BO6#K6x}vL#vo_` zY<}fQMAT{(R}LWS1aDSN3QUmWr>zl&8NsCwgsBsdndFn`{6#BKAU3d4wKra=2v&o! zK8=5seWxj3joWh&)|@jV6kg*|tMQ*N6vWJ+DqFV8wf7;27xI##_op9$?&??Rmemh% zPY>jdk%Qxy%7=VkI%?i+dT@hF$8;^Q#U%4WEzJs($JCsdFO+Qn`rU)8TXaI zWPhLm#lC$GT00m&O$V+WaDXC60eS02NpUxK3SY$oV@Lx2owjc zqhspY8RQWfVFlfN#O|?!eX{^#=wj-UWTcd_@#1mp1Wf~qCIxR@aSFcg5F&?EIn}}J zHDXuR)UZJqJbxU_rZu>#MFRSd9Yg6w?FEc71)y$fAk!gz<}?uMj^1ta{E~`{9vo9K2ekM&^F$RPC=W`zy0$%XXPjmLNKTW!S&ZzyN6{ zH7rT;BQ>1|Vhqlmv8d6u+2t(^qJco0Lx9MIa6154@Z#&l&A`B#Pq5U6uA-7aOn; zprT%wX+in&w9SvNM{1%jz32Is3N(p5p%dEwxMB2~#;KK+K5F z6{e!l*H4>Rd$9AKa-%psvpA~>whLVxmPOxSg;d?xr6`hyF zoskYgZ2~ce=?CvuwP);6Vg6X-K-Bo}ysvtm%mi2fCQ^ghvSr%_2Nc2Bxz)D-Pe>*V4- zF!<_IE+pN712QbpyXT03d~#6b!s}h+@`Q{AqWq1oR^6+?3#qq7^a=#J`w&t9OG!bc zfDxPzYt`pxzIg`P%qe@0kFnj(DuUFvSquRI~-drj{@PLyAZCu z-V5KmA^IaveW(f|G0OKpguMKk>k@904UAFoKZQGQ^T--?(q=_ogO+NkK!V{D&$fPj zaIh;zv5w;YdjN_Kg1dM=;)26u|Au04@(h%DM+liYdAk+-@7;sqmRq4DH85IrZa_g2 zz+~e+eDht%*|%-1IvAkdgNMO;Zv=AzieBI@+EoDA2xQ;?2*X!SL&a(UwL5s;$=VD1 zZ%2~OBd>K6bQ9qwvM7D|t!GiP*m{gMxI$O9NWq$YXvyc7oS!KXETx(vf0~H%e3oOc z3&8d$hRv4kYBW1Qyo2yF_aj6Bk=1E%Cji5|e*-ZBdFw6cTCpwC6P1Ubx|uGhwrzV z8zHMLpisuC=DE@geq=iz)isi4g!dNR8qwa)z!)n0?Ief0%}SH zq$xhDSL9qBpW}ut)tL6ZW3ssYP7o9kg5bG&YcA-hk>lNWK$kYa8XUX|Sm_EY5!B#l z{AbfJ&{Rh?T>}oV2szD{E!%dFVF?H!UnH`fWjyc0Bk(-{ka>- zm9_{*WUCF6jSZ~beFPvNYBwn|WdpD5#mn)<6NoGT0n)a})@!izx?Kpj-C|?fkydYj zX}_hYLX1NUzxBM)5bOY&1{D*l4g!R`j~IBMh(Z}6-S8+88M8VuFnsN_MaPu94r|fs zQY)%%JWCd&BNF}l?=?|zssV*CI-%e&fTf5}KZ{64#ZidWA<32EY9KK(TLFZ{S;-9| zs3@?piQ=BSt?9+JNy)oyyU1KADazw7d756lrqOCH3hKaT~!BRC&Nb!CDXoB0Oh;yLf(GYBX8S( z@8u-Hq=Mq$UCw$fh}2C4L>)*GSvTkKx4u@%OSLVOPG?w9cI`m|gusI#!aYZ)hr2qm z0*v9GJXuLUC5i&QLcxzJkxj{=@j5U8hzaYD+z-0`#_DecQb`hZwYv>pdJ)luaiT}Z zg!GDM#+G?MRh=>w8b$6I7-h@01L9Xs(1^Wzz}H`2CnuCU0YD5w^ja7y74i93tIcM6 zXc5-wz}}Dl8KY=Wg0gl*)aCke#L&PPeEkWCmp+6xGz}>ZLW=$)pZ0D{OMi7y$0n%L zRZ4)KIt3Ia&9Ngot;mX%X%JEDcfn)@qDD|B5sI4ZQ9t+r;!CgDGhk{J0nrArr+ODD zRIDifz%8H~ZmhKNsLIRJ#DTh1D>p7-`0NRgrrM^4uH+TkUszC4p^yfvMYI|L^nUWs z0HsBiD0;0Ttl^>)8W#!}eEkV%Fc5B<%4xjm%I>pMoUeI*M>HuJn6zDa>+5AqpD@>7 zWy^LMBLJ2p49AXwLNL~9aRzJZq>ZVfeJDS87j%9T9mdC2KR$^ONx|hN)*pY|BNd7W z1$RKSDp1o6Q$_sn2PmI>&gx3hE=567Q$iMZ9ks$>=`Pw4#NLA)2*g)TdVS2!aFE4Y z*!lj$DE92JVtrx|X*KUw#BYdfHFV|4v!J!Ys1y<~Uve%~>K`JOIqI~59^uneU+O~#AcIawU zgoB5SUElQyyZQX1op^&6UxI)jM4b?IULll);!iyS(P(^Ouo|gOvM5?dpybW7PMVtv z=v(lZX)Vu^Ho5eSb9?{km zsZ;~4@x?ImeHPxymhG}Fd;+0(;21;%$^@lolmH!V^6IV0<@3iIVSm~tpT7ht(Eqca z1MS%b)(BO09k4EFDm<(Y!tlB0K%obacp>xR>x&nkV^AU--Urs;^&{Q1*^Af2Kmde* z_(xAx4lVBhfMt>=K=1A&)mdak;{dR_*mLS)7gh{TyzC7SCSb0u@6qSG$rn^FEFQcc zDgu>yO(fCvu0YoC_;EzCbTolnO*wU5Uj7Hn-W_S$nZ~(C?li3ZxgP@Uz6KkjrzlrB6}7|YI8AFw&NW`yvUTI;3i!a`%4ZT!@^=v>(TewnP(Js(*Pr-4e?`1V z9pNHMbuLNNnGk?Wn^^y=e;HZ|j2B#>8amly67LWfeQf^Q-?hVrng{7(0AV8B_k#9b z3-V5i4p$%4jKy0v(-8O@Rag%IBX0OWkN;EdbU%dS$Xg7L`g- zti*9yZfs!JU;RsPRt=|e;!04v{oHoiRDVta>wqRDpkQqN>hD!!$tjBXF>q^AW4<=M zr|~VIs)cM|oN=J3o^qWYjheBEP$~vg8li;WPTp>|Y*(KVWKg2G?N%_mm#x9KtuC09 z&3o1!WBAQy>&S>+nHrGFUsG{US}UiGtq=;~fkWs&^cjE{LZ+BV%AFlRq=NFTx3Kx- zvrt4p+w0`1@5;R&djuE)g6IYE9d(?MdB(zo_}WQmzo?Hb3Oiu>5>P6NyN}wz>|ZP$ zY1xqzVqV&WeE&oRU=(OyB(2qi2h_{vH%k<^-fB^mM#rO86z=Un7FDTy?^IO*rB1wp zP=53K25^`_q9##QO{~km{$iDW21KpaN(Ja0JB0p2k64g}Qf(T$2zq;fNm{302_{gV z_O0^mw@^O$oTne9p6~ulu0)EoIYpXO3nR~5$J2*ov>-Yv$z4Uj2q>CpYwAU4N&&;?s8{to6}V5I5lzXf6Gu@4Sn6?gzkHkxI)G z3wZtam;3o7Mh4!?!&2=(@C*{&*lMT+%5|0B-3GAeM~#RjZi&^>(V1gOVgM62_1*^tYRA3d7E z0isSoN!EI=Q4#Jti1nZNNoW*H{b()m)y3y$QAj^v@Wn5oN40p1kdeDCN>z{m0zo)> z)ETI~?~_a~a#g+{`=kY+C5BHu0~uUE>ThCP+6hTQ^dA0EASQ2LK_~%Y1X&%wlUE{_ zubs5&Xa`(S>jG_4C!}nEp3_;VK>x=-*BYeFU%ylp^s}Uhk*%%4%dbHDR(E6%l&yXY zbw}al2UzM%_-u|_St2}e80%m738=)C=dbNo;x%QS36luwtzq*weh=8@GJDgrdo+rR zrp%LK`e6I!0-XR~n)1#WV`a;B<%|h@kLI6bqZC=Fgzxy{3_U?t2rFT}bH(VKbSrue47{fQ-z~GOcwCIYY=s_xC zoj(8(5n))OIC__*L7cNonT=_G)%)|h6(t}%{y46=?&j+HK_XWNhh)vT`H#f2O@B9t$-o20*S8k+8nNIusRzJzaDBn1T;U7P_ z?ITvR0hUhrcLQLh!qR4Cyb@tlBa?hH%cv?_wvT0zmjE3+2(HprmSzbReh`K5tu8HqF^=WO`@eFf*~9lY@+!5XR-Sy{~}NhtoFllV~q&T>Ht#;#>OB0 zG4$dFq*tJ)Ky(+AX>p&XGC+6T3BK_L13uAU8EaQOW!Af|%-Hi+e;Tw7P^{C#JAxi( z2n^2;JQ4>00nzpDx`@C877U&}ULAL-MrJbFFzxjgr3^$UMJj+?95{%Mw2XZ|Fk%v4 zVzRXS3oqH<1gat-sn9$SyTJG51`#3gvjZEK(ErnqW7kjoMQB;3_O}%sD6c<*Md}y| z6g^z}>K{NaUIG=pZ5z32b}}|eX2;1zrvj|07fU`{L(JKjiD#q#%zu?F+hyDUhl2ir zL)AJnhGl|RFLkq-Ffjb%Cyi(i&VWrWuzZ=Ft5l^#srVTL9Sp&D-i+P_JdOWEF~Bty7UNxuYIR-7f4fp!{$!xiYdLt{9+B@%>iiNZP@#N z{NDh(cY%hbHGHg0rD4L}$_x_kz$-Vg`Kw<9!uADM(|_K+xW58eOf-s=t1xTr4S=S< zsj6=K9BQ^~I~ri!bt{VNZa|a>B*9e?XdvgOS{BfjuF%0GD;*u4&iRd#(%$&*C@ zf)NfJ@VXkV+T9I4tj^VCMb8n?fEY`Jk`N&P6`d3yUv5iDz=8r;BZQ4!gF%R06mlzL z_=69DGjDn=?jPu#Zu;%eSd)fLj~3tyZ_GLK=0wl5X()AjCaJPq3#F}6JlV^u){XuoiME{1_WzfV35Yn%1#0lo3EV#6&5I9 zFowZoa;U`usR&5}5TZheQ2gmfAreO#N>)3hQFY*xcjuO`od)`0q$!^q972K6a$)<5 z8d*yfOOwxG@-AJF)IUp2Yl9(VIKcYf{A<|t*M0^PhhSj{sc~_w>cBxANE>$@5#z!y z{R*hpLq*@dt-@E!{IW?hDvkL{$y(OiWDQ}Y3@ta=)g#e~z zy2_*WZ9ac2QQUKP4IfN`RWNs z;Hs*HQ!Qbu37jHbH5d!`-tXsEN2kB@*C{hN+D*pOuY!uu!CTN6ps9(&(>_9t0E)tj z?4bl53?Stu)_(fW2m+7}wYN*jtdG(+4bO-#<W;T zglyeuSt4!>K>dLAzw#Hb_y79efN%K}WLSc<2j$pV{g=sbdF@?6IRDRn33_4EK%87X z^Kg8w74zpD&&-WBH=X2#P_DzumTk)(UH~C#O}!uq6qF_S;33z_bBP>POMP^d9U>-d zKK(QVfmL?xBFlJ`Y-3oyENB(o~Dy^}r}8u>vrl(Fk*g5mXK#7@+?n4`Kbse*)`&Y)0i}wci=0xSlOUGMU}@;%;y?do&__d{=m8YXVcbTbYB8y3^Y825H>s``M6jq) zw2;A7wrp1*h6NP?1@?5Br_l)LJ@$ZYMp8Dq{%NigwDiXE=3Bt~7ePhOX{IcaQ!-bz zEL+}LUFIcf^P%Y%FB;dy%u=OYaLQ9^GdH2WG0Sd9mCJCT#zXcRLH&fI) zLIeV*VyiRYhHrUpBNcF zue|<93Eb;p=)K{kT|fcpt5~yQq}#F zEnBuNZa{FlIjhYGN(L?z=zaQrkXXZs)p-+|fu$}Ag@>=50`-C=S5kD0Y@^-M-XF!f zkCU_yBBT_sMi3LieRm_=e;Dgu_;cv}+0UVO%Z)$@#EqftJzQ6plghX*{T9a8YEP1g zEDeXa^z;8C;zt`O)_M@NG>E8mO_5r}%V;4M6go#iNcB3R71vMlQ@3jhzHkgJABb3BSQw+2fa?ZwRrnm9a~7wyK6&X(;Hd`M7Zr&l(@ zLy0Kvz0W*cr8*iT!9WPa2q;&y&8MFR%ChQIOrp!wl112x@*A5(Do&?})QMaiIs`g= z2i9-D1K|swNAdV$SikKiL;$j(z+hO-E{|}Je zyCI$)vOUb}#GKQHJhC{~*(@W%?YH?kLQsvK00@8zBv6k0UsmsgP`>gqNUVrDl7N{I zoiKM99+T8}*uVDycX}A`p3Rl;g$A2PE`Os$*!=F(z;L(}Q@b{{2x^|aq=>_m%#09@ z=z$RrA3*=mK7>0yg|#pI$LK%yLn!XJ0Z<@rC}>b3h6qpr;>%OzXb7qC?PHEq1}RuQakJ_#9ant-x;!#WuOsnwYCLhoD}9arJde$d)( zgqyAd-FhQ<@Ac??_9290_hbFgA;`6B7O~qf#%%Sd6;)b`E^|xNvdz93qPHrS!qgf8 zFhmK35~OGPXXk(MpFl$&0amNi6pgMlSe<8V{800NL3M3DvJbp_H&n`se@NMACm3k( z5@lP_1@V}GjKCox!r%{|sDQ0MfvVNMP5h}U0EYlEqPX`SX`LkQ=`Y`9oQjdK2k&JL~Kf?Mh=%=nnxaE2j*If^O>~Rzi+=I2lhoIN3 zA(TKI0=zK*z)sE7bYPOiG%B4)rO@KjkB@TtUVwfd@%1;b@eltgs0bCuCb8Eo37|VT zg+7n*y-*^5aO4#54IniQbS0{g#)Z@GWE`CZLz4{`hPN?b^hSrk7~LVElmi(Jj_yXf zJ7ttKf`kepBcu^fK%`p)rMp1|1nEZN+xz{3r_XcZzOOSVJ}hoL_pu?N)+t&;$Xgj` zywA4iHvt)_C2s{QHJe!9u*d2AZDZkl({7{C3C$Lw5+HymftwGdjhO6WR9L{f?X+zR z9>Cp|xb^-gCK(nk+w%Ys0k$l0A}(@K#eV}Yg4SxkNvdE#lTscn{ZPhf9F$M!_U;+O zQLpbP&bX3fO#GyDFKx=vw-w(Y05MA(U2vE2$l-`vx_>Oo@>Q1s;ZD)R)PyLw;+sx7 zN%XUwht}0bQc7hg{}Rp0H*xj=XhK&@2sYP~Q4O{|$RO)OoCa1&aCR3|3$vH68#NAgjEBgS=FAsu*DhyU2wzivNOvB1((or>Jd_uY2~ z4JVN;UTiNYj|&dl}KZ|>i^ zJC#Y}4;7F9X-0M*m~8t#7F zk#odGDp>>pmBjeyitOM@;Hs4nJoS$`i6B4wcfk$ddsQh*LY!2;)g2t-KVR@$jb&6s1&QpA5T_ za|^qBAaoPh0lDeIx1N!()=^4b9Zwdw%CfL{5W9U=w>1G z_t%kAy*4{14}VDhvxCH{`)%|JiacyIj{3w|4Qr8z6zHovr;xhLU+zt8KtBd~3V!&# z&TXWSnxPlq6pvuP;|0m1yBBErV}#R;L>5xaNV>9_2LqrZeGDkz;ErNeJ|VyNo$5mU zk}U_U{*9YrmW==HT-yVsCz?@n!> zB4K=go<~;@y4$fwef@NI zfPxMZxQ{8p&nDe^*Pl8TXrF4TK`3_X?nBe1h@BCpAh7N+E0Z7^d5YW0$Jstp!Q z8w9CRh+K$mP^S+Wq$?2_^7)9e+9v{U2QM>h}j?cQ}7 zL9AgqsE-;IonBN&OFx&)^8gG=2R}Xo^;HI>O;*f7#n$`!nw-l~qw(0`TlF7L3F<(F z1U0NxGPlVty*Vlz_^?sh3Sox}0sRU&%_}OxOQ1fTo z+S2BF6jXDF?~r?_-`w`Df|0F6FQNB50uX%HLtfH$AG_2*(RVsy#8CC2EY27hFYZze ziRtFiDf_{A-}@vdTR}EfjcUk3uN}9?iofXaLO8Wu~`C4<&@TX$^oeTjvQg7Vm3?Ir?e2{zbq3Wi0lW%N# z=z~RT%D5(Iu8{tQ(aUyqI+F^Y2tQ?wE2Vtg8@w17Nxzxej2u z+e>isN3pk#gf-@8dav>5xB!1}3~htOOXm1!hSWc{>=*BQgcnDF=e z?KnpY=Z|5@>hXo`P81Q%?#t@d(U&S7YFM+BH#0G(#PQ@_hcoT*BoX^`(3LRO`c1}C zVdrNK3sknc8l3?JPR6Y}n)XMgf0;7_H^PrY8m!{ZHe4f(DJDXIjNEO1(nrJ~O*m0WX( zIhd*YH=QTt612eAY=!)RuPaOQRFno1(CuD}(t1Wy6({0>ce6K!+ynzOlNXVj6 zWL#D%?tcHfNVn^6OvNs>(=&O71nVEc8948NMP%%*h2|&-NyJFn_3s?mZv5!*LsB=& zXKuENDP4>YXUoKf-H@4IZ{E=|-EA8cc(&p%x6Mc$cqpTB>nIc$(lP7lEs?j<`s;(q zSH-rwr;2dLF9bvnsNoyCtX&n&Rw;{F>e!Rbe&(*fO7rUWKYQ+pT%S$kO&tu>DtTLX zJiNb->5h~Q@8(pCCx$*piWe>wT4BxY2Il??lGmw9W*&+-IL3zwRQ^Q?C7aKh6NuN0 zjGC%`1&^@nAePSi_7yI>y8CN{jMh5X+kxA!H!Ma@62&7y)Zk3}vHs;A3S_giT$whW zf`+g@LANwUV(Au;i&_0+W`L0bn%93ZSM21UE>E|5EZ%VW3a1lMyd2zFwTw8W#{I%~ zQXrofZ4td??*qiB9>F;v6=_i94a;a!{76S~QpYua)5()N36a*A+8qK2S)QN1LV8=O z)@O@imxq{!tj-LZl0?F!>}5}}vcc@?mfxE3jDjG5;^C!A=OSMH_o#PM&s0{Oir?$= zj0$6;$w=GJnBU%Q-VsEvT#4}z*Y23Q(gW~##!#@_=GXpgF{*}Oi^Yfz73P+N;n%mt zK`OaR$E%?uh<6WLZt`EK&@`aqdAbFq3IhL%*6?ReB_J*Q%uM8H)MkTzgJ(_F4dbwh zw=d*Ky?|K-ddc*ngk#)`U3ICHmEM2P;n8H~SMwQ77s9uKlF$B~!v=x&GyYI;e2zIy zXhyQ4v`zP&vHThB{a|UqD2a|+mu%Z~L(mw5Cr*}=LztIn2_tH=JAYjC=L4^!oQy7= zE(tE-8Kui~T)f z_W>1b6-|E3xKQ1{PXW+T)+q9;e}-F(TLl1v&aYM#p(Ag5-mlyc3*8>oz~w_1ikdRR(DNDzy>; zcT^K&Vdoq*jXWrS5~(T;e5A~!fuU3vi$sjYuTia_E~7si(lWI#(iZS^(uh9ZAHE6r zS_QY+w3}~EDE($Y)XQm%hifEP#D5$7`kAtOEgGE&>4tJIwTTJnE=;~g$`M?F=N3Cx zE1#^bd)|^uKKm^N8?i!mg7N3w?BuYBG6p6BUT=cgodFE)WQayF?o0mj_Sv|_z zDeXALaC&nK*HWvzQd_Po2B+XrpR?d6d28Soczjcqn?=(l1{yoQyeG6zRXQp7zG&am zVuNgT>k$==r&(ZTFPIv*$PIl?-+sX;*>Oeo_U_dk?NN79C%kZLAO8yHk`akQJs40^ znT!2o1m;PnsRCj|?dep`qXTN9d;c`~oo?2&zaeH|k_z{OU2PCTW)`2}_r5fgO|p?N z=F+!Bgl!Zg7MQnuE0`uGghHtZR)QGQsZkn=qcEwbRh3WTqP#AIkod4J=?8P$dk|*K z)}aJC{qsytev(4a`rG=+-vb&sGoE~kBUjhAL;B3`Ij~MjUl}3u>|R|+(cXjDiP`Jz z&t8A5Zu!!z-6@v_2K; zLmBLPR!cTif0vr*EbZ8RN-0+pIY)tf(Iu`FysbsraU(7naZXWp_?6Z-Ni%L-mbo$o2`XD@^;$D=YP z1a{#)S&18!ymPOgjP^{Ia z_D*Z^4{57(;G)k7Zq#2b;A!|A+k0h45vd`H(3;W)X{pWQ zFQ?#tkh1clfwN7DiJ2zx8g+Z%z+ukkqMeFZfD;b}gq4VF4J7KB8Bxp+XNazOMwZ)g z^E7impU@s}6*oCJLl#91PMQQv^v1;PFtoITVKWccw-b+&c1!@K%9q|wmMy_2^hWb(VES)>eCWy%g65{|Zl z?^`McuaiC>X^UE8jUdalx~5zwq$@Z?5HI5`g%|OX#hd^BS1UyNKw>6z3SRyLX<*S~ z`Q1vqQmh4MH>{=sRLs7jS=)l`n3C{PPV@m${Y?1Q9KQXnoH^Nlw)jwA>*XQELf86| zT}BQd5P%#D!oEX3TEw(pvOF)vg?E_|o8yHiY|nPgMgxW6gPhQS$n!AbZsM%*9eMN5 zIzkaK+`!2Ju=zY-DWGycvUT968^hgw0Q!#(L6q!G_pj9UyqgHZ(Hp`&f1979V~Zb8 zb;_EbGuwG>$3zAyRMr_8p^ell07CHshBb7lEQd~Yk&AvP8->RO!9%ojJS0)N_)2 zPZE`+q3|FGAX?_%8Y(w1Xz7=gc)*C)keN3%7=ROHM61iKzf@%;;g=>fiAf|Hl>n;a z8AMa8#I^>|_BdK8hOMDU?|!NE`fg%b-9fWpC%T}KALw||5}Dt{<+tj2-Cw>hyr`WA z_Q!brD@96KIP!`-g=STo;p~QcJEU#EoF&7 zayLny_B<-Ud}QWPaQZFH8LKv(78+h~VDVH-Gybw0aJUXVS&O4@KbJgd2!uV!SHR7n z&9C|ck)EwY4vbn_hewRUIk=hhXLW*@69BEK4eg6k!OZNaOsq{^{1kUxD`ncvShi7&?UZ&Lz z3#e&twYYDjCebpuP9|!s5KD)?$SJDOT}Z;0QU5^+i0PhYqpZn!|JkI@>y}nMO|eZQ zTObD?J5$Pt#b-Z;w163De4YW!85MEuouEy3QmatH!|$&2@1$e9SR)9prgyLuQm~&W zC^5Q@skMCu5lopfX~5vEa%^1vJi!t5*jWKioTMA0_2+GHLG8UZTwWZFmnawmOTC9| z3aD}SDsM9~e4>ypqYK91Jua)_F^Vx%@d4rASpy>JBW6NbUpt-7Ng;D#hk55BVaHkn zUp~c;w8bAyGHmr}t*#UJ1%3M?GZVQa74;Zk8{<+{B*R;yMjH+V8GpMAz5Ei2NPe{k=hRyT0u}O@r#L`4n{m%@)_b-U``%5sXPIU~y zKHzHI5DXO3HX`Rnh~bM@Y=}3?9@pD!Qc$|QdT4$%tp^e9-l;HpMu;Mk3m$eNQA{|B z)k7!JKim9=pd>=ITxOSs~E@In8gbtd( zl64=rWALSx)OZ%2iBqcVT1FEa{9UUyd<{x(t7UdW?NX2a8&hc==KDZhs9S!M$@Tf| zOU2=LU8`nKilC@(mcHCVoISgH`EMzNgU;Di;Wck#y}%i^Ue^*(GHCvF`xGzva|jdX zbDRacDyo`Lk-}ysWz@R!m0gT-}xbTrloE?iB@s@>XNWdN>(ky>yc1JIzHyx(b{Jg%qVa2A! zzXWwdLMIJ9tqSO#)8u53JbvM7aim=ezyfrDRr~mKsD|{)vN4IWi4J||ju6&@ZE9bU zdDY6vd&pPkmuWmA@sNM#m!H^FvDzP1)xG+40R_m*yiK-xUk;yY)%?+aCwOV}H%?rB zoOkWp0Rt(0X}Q9l6}=F6zh5@A@a&oZaPUhx{z-XhVVjw4xoA;Kas%sH3aT` z60%pTKgrcj`{N5)!H%|?l%n2)%! z==zcj+4*^8jT8Qt>Fw_jY@xUdm8 zedSbTuqjeS`qm@jU%P=!*0m*bQw-@DlF^D=Q~5PpxychB#w1i|urI$&-KPwH&+u=Y zJIs@1Xc?Bi#v%NK{%gmNG5!)VN08BR;=Jz?u0G0>ev+nvcMvJVzwuP#v*?2l@1hVi zJh=xRmp8AVXN&Oz%Edt@jbrtXR9jtGV6e!$$sYKgf<0skKx2~kev#dHJB+Gl#wre% z8`PYq-&=QIL8*cnvmxjA8ZsTCV8d$-E&|$WU7|=6wEP{2-k#Ybvrx17V6JQD75JTZ zWE4RzByexX)(2Su;uZZu{bF5B2iYEYFYHGOjUy!$+=Yx3IGO%-bn5fQhYQ)WDszdq z_iNEtOkLMpNw(DHf)#Z+t#1}ha6&84bPJ?dOO>fO zR2wtWt zljy^C{#gh5%mR(2{nZ|IMU5{^rn?{t)&AZ$HI^8;{2k2WaqT*tf&&V;pF)%mV@E(a zJP`sPbt zm{fTGUhuWVbExb?;Fn_*=-YEIx}hp(0Yz{`?`8J%zf>#^ETH75Lx_ic?@6X$5_hd21s!iT`E7I@ZPfM7j{nU`5QX`RnwSGDf3}aIwgXCeW>O&aU^Si&igF%m*Y;e z^HN6Z5-3t?355E)dTYL{2ZXUFX)WFK1P({?&`0FnrT@71WMp%yAtn1^O4!uMjB4rv zc8yDD9ku0t-SN}fEsSaq=U-d&_1o?cP2OUC2vXFN9oUvdQ%lc20FcG}@RT<|p&%}l zh~POPc`OZ%!A5ZYFMiN4Z5Us_Xo{iQNvB9cvh^R!$zmv!hNrP$;L`*mdHU4UujWBW zeT9P9vyVy(6EJnsRmhxo+_Xk&c_#kC*` zL0w>gcVW2Uv#F&7^q>14q;l1}F?n|8O2_0K((U%F zJl9*I@DuFf4?sC%WSKtz4~+^tb|3BQdiy}7(f#wJD@HHe>giE-E3M~YHGlDR$pL?o zx8u;o;5y}xZlCe_9inq){H!tG;Idy<`hAjrX;OIM?cTKY%atyMCscgv&F{4Wd9W?1 zfZ>n(6kmgCr4x|G`Z}rkm<%Go^4b?UT~*WAT6INyMAcb5TK4u2A2Ff2jsR8nUP)rE z$b&=5dZP#D=-PffmrYDrlEA{(csTUp9s4Q|?U+Sy&|BrGf$3M$9aFiR@SV0+Ou)G5 z6Q#e>S2u1eNgID#hTO=d2lw6;8fn>V{db>Vp!IbG)Q1yj+V}wSVRTjMFQ8gDy`5`PDtkB+6a6WdVRxURb$D&iu}BX}zO8Ip3=W#D*k=ZwU~q zj;3hP%l_l*UHBJky?eJ{3veNn=257xk_OWt?>ZG!txKKJ@up8RfaByrC9m1OTGj0+ zuyIIOndicRK&Y_iCP0uqgn}hHEr1xKtN$93*4e)CahC@p@wWq!hH13yicDwBMtz=Tn67+FeVJN(wo&eA;e*b**0xm%;0-;2C+VK%d#LSt-=oLMA(jH9X0Ei)UL}3I|EXtw#S# zR|2LuO^n-1?#p1E(AdHAm#Kjn_F*_%LNdNm!`GjG@P^355()Rf0lUv@ z4+(J#)7C47%A#)`K09DL`M&Us-!!&!=k%@nyHnO%Ql(<;Kxc48nZ1* zP5^4_T*6+~f17kQU5FhDqs-akuyxx5z%Q#vr?{fDvmKz^aja)VsoX|fOfNM0 zE&Y6Q1Q&S8Iz0PYYr(B&H;~JRfCm^k*>XL3S&R

      cD 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 DOz{_t From f740043273c3090ba4f0648bd522cfaff3de9296 Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 19 Jan 2025 09:32:01 +0100 Subject: [PATCH 1096/1766] [ruby/sinatra] Detect workers for Iodine +----------------------------+------+-----+-----+-------+--------------+ | branch_name|update| db|query|fortune|weighted_score| +----------------------------+------+-----+-----+-------+--------------+ | master| 22061|46915|32431| 8205| 2328| | sinatra/iodine-set-workers| 22579|64083|50717| 16851| 2826| +----------------------------+------+-----+-----+-------+--------------+ --- .../sinatra-sequel-postgres-iodine-mri.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile index 3f1bfb24b79..bf29d5a1e9e 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile @@ -17,4 +17,4 @@ ENV DBTYPE=postgresql EXPOSE 8080 -CMD bundle exec iodine -p 8080 +CMD bundle exec iodine -p 8080 -w $(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From d5f024c58571a8418bfefb9c1b132fb6b338b0fd Mon Sep 17 00:00:00 2001 From: eoioer Date: Sun, 19 Jan 2025 18:10:48 +0800 Subject: [PATCH 1097/1766] Modify the test code to comply with the testing specifications --- frameworks/PHP/cyberphp/app/config.php | 6 +- .../PHP/cyberphp/app/controller/Index.php | 11 +- frameworks/PHP/cyberphp/app/route.php | 2 + frameworks/PHP/cyberphp/composer.json | 7 +- frameworks/PHP/cyberphp/src/App.php | 101 +++++------------- frameworks/PHP/cyberphp/src/Route.php | 4 +- 6 files changed, 37 insertions(+), 94 deletions(-) diff --git a/frameworks/PHP/cyberphp/app/config.php b/frameworks/PHP/cyberphp/app/config.php index cf331c45ea5..ba727ea087a 100644 --- a/frameworks/PHP/cyberphp/app/config.php +++ b/frameworks/PHP/cyberphp/app/config.php @@ -19,11 +19,7 @@ 'dsn' => 'pgsql:host=tfb-database;dbname=hello_world', 'username' => 'benchmarkdbuser', 'password' => 'benchmarkdbpass', - 'options' => [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false, - ] + 'options' => [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,PDO::ATTR_EMULATE_PREPARES => false] ], 'eloquent' => [ 'driver' => 'mysql', diff --git a/frameworks/PHP/cyberphp/app/controller/Index.php b/frameworks/PHP/cyberphp/app/controller/Index.php index d1a7f261f70..b1466094bab 100644 --- a/frameworks/PHP/cyberphp/app/controller/Index.php +++ b/frameworks/PHP/cyberphp/app/controller/Index.php @@ -16,13 +16,14 @@ public function plaintext() public function db() { - $prepare = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $prepare = app()->dbWorld; $prepare->execute([mt_rand(1, 10000)]); - return Response::json($prepare->fetch()); + $data = $prepare->fetch(); + return Response::json($data); } public function fortunes() { - $fortune = app()->db->prepare('SELECT id,message FROM Fortune'); + $fortune = app()->dbFortune; $fortune->execute(); $arr = $fortune->fetchAll(\PDO::FETCH_KEY_PAIR); $arr[0] = 'Additional fortune added at request time.'; @@ -37,7 +38,7 @@ public function fortunes() public function queries($q=1) { - $statement = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $statement = app()->dbWorld; $query_count = max(min(intval($q), 500), 1); $arr = []; while ($query_count--) { @@ -51,7 +52,7 @@ public function updates($q=1) { static $updates = []; - $random = app()->db->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $random = app()->dbWorld; $count = max(min(intval($q), 500), 1); $worlds = $keys = $values = []; diff --git a/frameworks/PHP/cyberphp/app/route.php b/frameworks/PHP/cyberphp/app/route.php index a60a0dfec4c..e224ec394c3 100644 --- a/frameworks/PHP/cyberphp/app/route.php +++ b/frameworks/PHP/cyberphp/app/route.php @@ -7,6 +7,8 @@ ['/plaintext', 'GET', 'app\controller\Index@plaintext'], ['/db', 'GET', 'app\controller\Index@db'], ['/fortunes', 'GET', 'app\controller\Index@fortunes'], + ['/queries/', 'GET', 'app\controller\Index@queries'], ['/queries/{q}', 'GET', 'app\controller\Index@queries'], + ['/updates/', 'GET', 'app\controller\Index@updates'], ['/updates/{q}', 'GET', 'app\controller\Index@updates'], ]; \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/composer.json b/frameworks/PHP/cyberphp/composer.json index ef9c00160ac..68678af9697 100644 --- a/frameworks/PHP/cyberphp/composer.json +++ b/frameworks/PHP/cyberphp/composer.json @@ -13,15 +13,12 @@ "php": ">=8.3", "php-di/php-di": "^7.0", "nikic/fast-route": "^1.3", - "workerman/workerman": "^4.1", - "illuminate/database": "^11.37", - "topthink/think-orm": "^3.0" + "workerman/workerman": "^4.1" }, "autoload": { "psr-4": { "app\\": "app/", - "Cyber\\": "src/", - "": "extend/" + "Cyber\\": "src/" }, "files": [ "app/helpers.php" diff --git a/frameworks/PHP/cyberphp/src/App.php b/frameworks/PHP/cyberphp/src/App.php index 85a632d4421..288e969e0a9 100644 --- a/frameworks/PHP/cyberphp/src/App.php +++ b/frameworks/PHP/cyberphp/src/App.php @@ -10,8 +10,6 @@ use Cyber\Middleware; use Cyber\Utility; use PDO; -use Illuminate\Database\Capsule\Manager as EloquentDb; -use think\facade\Db as ThinkormDb; class App { @@ -28,16 +26,18 @@ class App public Response $response; /** Middleware */ public Middleware $middleware; - + /** Route configuration */ public array $routes; /** Route manager */ public Route $route; - + /** Application name */ public string $appName; public $db; - + public $dbWorld; + public $dbFortune; + public $start_time; public $timestamps; /** @@ -47,33 +47,28 @@ class App public function __construct($containerConfig = null) { $this->start_time = time(); - /* Check PHP environment version | extension */ - Utility::checkPHPenv(); - + /* Build container instance */ $this->container = new Container($containerConfig); - + /* Load route configuration */ - $routes = require_once $this->container->get('route_path'); + $routes = require $this->container->get('route_path'); /* Create route manager */ $this->route = $this->container->get('Route'); /* Call route dispatcher */ $this->route->dispatcher($routes); - + /* Configuration */ $this->config = $this->container->get('config'); /* Request object */ $this->request = $this->container->get('Request'); - - /* Response object */ - $this->response = $this->container->get('Response'); - - /* Middleware */ - $this->middleware = $this->container->get('Middleware'); - + /* Database */ - $this->db = $this->setDb(); - + $pdo = new PDO(...$this->getConfig('pdo')); + $this->db = $pdo; + $this->dbWorld = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $this->dbFortune = $pdo->prepare('SELECT id,message FROM Fortune'); + } /** * Run application @@ -82,66 +77,18 @@ public function run() { $this->timestamps = time(); /* cli mode maintains database connection */ - $this->cliMaintainDatabaseConnection($this->getConfig('orm')); - - /* Get application name */ - $this->appName = $this->request->getAppName(); - - /* Request object middleware list */ - $requestMiddlewares = $this->getConfig('request_middleware'); - - /* Execute request object middleware */ - if(!empty($requestMiddlewares)){ - $this->request = $this->middleware->handleRequest($requestMiddlewares); - } - - /* Parse route and return the closure to be executed */ - $handleRoute = $this->route->handleRoute(); - /* Middleware list */ - $Middlewares = $this->getConfig('middleware'); - /* Execute middleware */ - if(!empty($Middlewares)){ - $response = $this->middleware->handle($Middlewares,function() use ($handleRoute) { - return $handleRoute; - }); - }else{ - $response = $handleRoute; - } - /* Return response */ - return $response; - } - - // cli mode maintains database connection every 600 seconds - public function cliMaintainDatabaseConnection($ormName) - { - if (php_sapi_name() === 'cli' and time() - $this->start_time > 600) { + if (php_sapi_name() === 'cli' and time() - $this->start_time > 1) { $this->start_time = time(); - if($ormName=='pdo'){ - // Close the existing connection and recreate the PDO instance - $this->db = null; - $this->db = new PDO(...$this->getConfig('pdo')); - }elseif($ormName=='thinkorm'){ - // Close the existing connection and reconnect to Thinkorm - $this->db::close(); - $this->db::connect('mysql',true); - } - } - } - public function setDb() - { - if($this->getConfig('orm')=='pdo'){ - return new PDO(...$this->getConfig('pdo')); - }elseif($this->getConfig('orm')=='eloquent'){ - $EloquentDb = new EloquentDb; - $EloquentDb->addConnection($this->getConfig('eloquent')); - $EloquentDb->setAsGlobal(); - $EloquentDb->bootEloquent(); - return $EloquentDb; - }elseif($this->getConfig('orm')=='thinkorm'){ - ThinkormDb::setConfig($this->getConfig('thinkorm')); - return ThinkormDb::class; + $pdo = new PDO(...$this->getConfig('pdo')); + $this->db = $pdo; + $this->dbWorld = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); + $this->dbFortune = $pdo->prepare('SELECT id,message FROM Fortune'); } + + /* Return response */ + return $this->route->handleRoute(); } + /** * Get the current application configuration * $app->getConfig(); // Returns the entire configuration content of the current application diff --git a/frameworks/PHP/cyberphp/src/Route.php b/frameworks/PHP/cyberphp/src/Route.php index 95181591f2d..b1b70f4f873 100644 --- a/frameworks/PHP/cyberphp/src/Route.php +++ b/frameworks/PHP/cyberphp/src/Route.php @@ -47,8 +47,8 @@ public function handleRoute() // If handler is a string (controller@method) if (is_string($handler)) { list($controller, $method) = explode('@', $handler); - $class = new $controller(); - return $class->$method(...$parameters); + $ctrl = $container->get($controller); + return $ctrl->$method(...$parameters); } elseif (is_callable($handler)) { return $handler(...$parameters); } else { From d13cfa868b9f0dcf71cbed10ca0da0a85902eb2d Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 19 Jan 2025 10:37:41 +0100 Subject: [PATCH 1098/1766] [rails] Detect workers for Iodine +------------------------+---------+------+------+-----+-----+-------+--------------+ | branch_name|plaintext|update| json| db|query|fortune|weighted_score| +------------------------+---------+------+------+-----+-----+-------+--------------+ | master| 127557| 12167| 88459|24399|19880| 15784| 1480| |rails/iodine-set-workers| 158915| 15101|111481|28795|21691| 18549| 1767| +------------------------+---------+------+------+-----+-----+-------+--------------+ --- frameworks/Ruby/rails/rails-iodine.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rails/rails-iodine.dockerfile b/frameworks/Ruby/rails/rails-iodine.dockerfile index ffa3b078dd0..b91de6b668d 100644 --- a/frameworks/Ruby/rails/rails-iodine.dockerfile +++ b/frameworks/Ruby/rails/rails-iodine.dockerfile @@ -24,4 +24,4 @@ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 CMD service redis-server start && \ - bundle exec iodine + bundle exec iodine -w $(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From b1928b26a69ee052ca7d348d11058d6e30d6aff1 Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Mon, 20 Jan 2025 15:00:44 +0100 Subject: [PATCH 1099/1766] Inverno upgrade to 1.12.0 + misc performance improvements --- frameworks/Java/inverno/README.md | 21 ++- .../Java/inverno/inverno-postgres.dockerfile | 3 +- frameworks/Java/inverno/inverno.dockerfile | 3 +- frameworks/Java/inverno/pom.xml | 64 +++++-- .../techempower/inverno/benchmark/Main.java | 7 +- .../benchmark/internal/Controller.java | 160 ++++++------------ .../benchmark/internal/DbRepository.java | 132 +++++++++++++++ .../benchmark/internal/JsonSerializer.java | 38 +++++ .../internal/SqlClientReactorScope.java | 66 -------- .../inverno/benchmark/model/Fortune.java | 3 + .../inverno/benchmark/model/Message.java | 3 + .../inverno/benchmark/model/World.java | 11 +- .../inverno/src/main/java/module-info.java | 9 +- 13 files changed, 310 insertions(+), 210 deletions(-) create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/DbRepository.java create mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/JsonSerializer.java delete mode 100644 frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java diff --git a/frameworks/Java/inverno/README.md b/frameworks/Java/inverno/README.md index b205ef706b6..492cd60e430 100755 --- a/frameworks/Java/inverno/README.md +++ b/frameworks/Java/inverno/README.md @@ -2,20 +2,23 @@ ### Test Type Implementation Source Code -* [JSON](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) -* [PLAINTEXT](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) -* [DB](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) -* [QUERY](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) -* [CACHED QUERY](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) -* [UPDATE](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) -* [FORTUNES](src/main/java/com/techempower/inverno/benchmark/internal/Handler.java) +* [JSON](src/main/java/com/techempower/inverno/benchmark/internal/Controller.java) +* [PLAINTEXT](src/main/java/com/techempower/inverno/benchmark/internal/Controller.java) +* [DB](src/main/java/com/techempower/inverno/benchmark/internal/Controller.java) +* [QUERY](src/main/java/com/techempower/inverno/benchmark/internal/Controller.java) +* [CACHED QUERY](src/main/java/com/techempower/inverno/benchmark/internal/Controller.java) +* [UPDATE](src/main/java/com/techempower/inverno/benchmark/internal/Controller.java) +* [FORTUNES](src/main/java/com/techempower/inverno/benchmark/internal/Controller.java) ## Important Libraries + The tests were run with: -* [Java OpenJDK 16](https://openjdk.java.net/) -* [Inverno 1.4.1](https://inverno.io) +* [Java OpenJDK 21](https://openjdk.java.net/) +* [Inverno 1.12.0](https://inverno.io) +* [DSL-JSON 2.0.2](https://github.com/ngs-doo/dsl-json) ## Test URLs + ### JSON http://localhost:8080/json diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile index 737cb434013..d1d333ef5a5 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -1,8 +1,7 @@ -FROM maven:3.9.6-amazoncorretto-21 as maven +FROM maven:3.9.9-eclipse-temurin-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml -RUN yum -y install binutils RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 diff --git a/frameworks/Java/inverno/inverno.dockerfile b/frameworks/Java/inverno/inverno.dockerfile index 1dd39d53b27..5f666a70a95 100644 --- a/frameworks/Java/inverno/inverno.dockerfile +++ b/frameworks/Java/inverno/inverno.dockerfile @@ -1,8 +1,7 @@ -FROM maven:3.9.6-amazoncorretto-21 as maven +FROM maven:3.9.9-eclipse-temurin-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml -RUN yum -y install binutils RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index c91b31c2d37..3b11a165f97 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.10.0 + 1.12.0 com.techempower inverno-benchmark @@ -53,6 +53,11 @@ unbescape 1.1.6.RELEASE + + com.dslplatform + dsl-json + 2.0.2 + io.vertx vertx-pg-client @@ -82,7 +87,52 @@ log4j-core - + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + + + + com.dslplatform + dsl-json + 2.0.2 + + + + + + + + + + + + io.inverno.tool + inverno-maven-plugin + + + + com.dslplatform.dsl.json + + + com.dslplatform.json.Configuration + + + + + -Dlog4j2.simplelogLevel=INFO -Dlog4j2.level=INFO --add-reads com.techempower.inverno.benchmark=com.dslplatform.dsl.json --add-opens com.techempower.inverno.benchmark/com.techempower.inverno.benchmark.model=com.dslplatform.dsl.json + + + + + + io.inverno.epoll @@ -110,7 +160,7 @@ inverno-benchmark - -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 --add-reads com.techempower.inverno.benchmark=com.dslplatform.dsl.json --add-opens com.techempower.inverno.benchmark/com.techempower.inverno.benchmark.model=com.dslplatform.dsl.json @@ -119,9 +169,6 @@ - - --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64 - @@ -157,7 +204,7 @@ inverno-benchmark - -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=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 --add-reads com.techempower.inverno.benchmark=com.dslplatform.dsl.json --add-opens com.techempower.inverno.benchmark/com.techempower.inverno.benchmark.model=com.dslplatform.dsl.json @@ -166,9 +213,6 @@ - - --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64 - diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java index 74aaf730a7e..42695fc65e7 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/Main.java @@ -1,17 +1,16 @@ package com.techempower.inverno.benchmark; -import java.io.IOException; -import java.util.function.Supplier; - import io.inverno.core.annotation.Bean; import io.inverno.core.v1.Application; import io.inverno.mod.configuration.ConfigurationSource; import io.inverno.mod.configuration.source.BootstrapConfigurationSource; +import java.io.IOException; +import java.util.function.Supplier; public class Main { @Bean - public interface AppConfigurationSource extends Supplier> {} + public interface AppConfigurationSource extends Supplier {} public static void main(String[] args) throws IllegalStateException, IOException { Application.with(new Benchmark.Builder() diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java index 33c94a5c7b4..c16e6d4d767 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java @@ -1,7 +1,5 @@ package com.techempower.inverno.benchmark.internal; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.techempower.inverno.benchmark.model.Fortune; import com.techempower.inverno.benchmark.model.Message; import com.techempower.inverno.benchmark.model.World; @@ -14,15 +12,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.base.reflect.Types; 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.ErrorExchange; +import io.inverno.mod.http.server.Exchange; import io.inverno.mod.http.server.ServerController; -import io.inverno.mod.sql.SqlClient; import io.inverno.mod.sql.UnsafeSqlOperations; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -30,13 +27,14 @@ import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpHeaderValues; import io.netty.util.AsciiString; +import java.lang.reflect.Type; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Collections; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -51,36 +49,32 @@ public class Controller implements ServerController> sqlClient; + private final ReactorScope jsonSerializer; + private final ReactorScope> dbRepository; private EventLoopGroup dateEventLoopGroup; private CharSequence date; public Controller(Reactor reactor, - ObjectMapper mapper, - ReactorScope> sqlClient + ReactorScope jsonSerializer, + ReactorScope> dbRepository ) { this.reactor = reactor; - this.mapper = mapper; - this.sqlClient = sqlClient; + this.jsonSerializer = jsonSerializer; + this.dbRepository = dbRepository; } @Init public void init() { this.dateEventLoopGroup = this.reactor.createIoEventLoopGroup(1); - this.dateEventLoopGroup.scheduleAtFixedRate(() -> { - this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); - }, 0, 1000, TimeUnit.MILLISECONDS); - - + this.dateEventLoopGroup.scheduleAtFixedRate(() -> this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())), 0, 1000, TimeUnit.MILLISECONDS); } @Destroy @@ -139,15 +133,8 @@ public void handle(Exchange exchange) throws HttpException { } private static final CharSequence STATIC_PLAINTEXT_LEN_VALUE = AsciiString.cached(String.valueOf(STATIC_PLAINTEXT_LEN)); - - private static class PlaintextSupplier implements Supplier { - @Override - public ByteBuf get() { - return STATIC_PLAINTEXT_BYTEBUF.duplicate(); - } - } - - private static final Mono PLAIN_TEXT_MONO = Mono.fromSupplier(new PlaintextSupplier()); + + private static final Mono PLAIN_TEXT_MONO = Mono.fromSupplier(STATIC_PLAINTEXT_BYTEBUF::duplicate); public void handle_plaintext(Exchange exchange) throws HttpException { exchange.response() @@ -163,20 +150,15 @@ public void handle_plaintext(Exchange exchange) throws HttpExce } public void handle_json(Exchange exchange) throws HttpException { - try { - exchange.response() - .headers(h -> h - .add(HttpHeaderNames.SERVER, STATIC_SERVER) - .add(HttpHeaderNames.DATE, this.date) - .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) - ) - .body() - .raw() - .value(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!")))); - } - catch (JsonProcessingException | IllegalStateException e) { - throw new InternalServerErrorException("Error serializing message as JSON", e); - } + exchange.response() + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + ) + .body() + .raw() + .value(this.jsonSerializer.get().serialize(new Message("Hello, World!"), Message.class)); } private static int randomWorldId() { @@ -191,20 +173,10 @@ public void handle_db(Exchange exchange) throws HttpException { .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) ) .body() - .raw().stream(this.sqlClient.get().flatMap(client -> - client.queryForObject( - DB_SELECT_WORLD, - row -> { - try { - return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1)))); - } - catch (JsonProcessingException e) { - throw new InternalServerErrorException(e); - } - }, - randomWorldId() - ) - )); + .raw().stream(this.dbRepository.get() + .flatMap(repository -> repository.getWorld(randomWorldId())) + .map(world -> this.jsonSerializer.get().serialize(world, World.class)) + ); } private static final String PARAMETER_QUERIES = "queries"; @@ -227,8 +199,8 @@ public void handle_queries(Exchange exchange) throws HttpExcept .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) ) .body() - .raw().stream(this.sqlClient.get() - .flatMapMany(client -> ((UnsafeSqlOperations)client) + .raw().stream(this.dbRepository.get() + .flatMapMany(repository -> ((UnsafeSqlOperations)repository.getSqlClient()) .batchQueries(ops -> Flux.range(0, queries) .map(ign -> ops.queryForObject( @@ -239,58 +211,39 @@ public void handle_queries(Exchange exchange) throws HttpExcept ) ) .collectList() - .map(worlds -> { - try { - return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)); - } - catch (JsonProcessingException e) { - throw new InternalServerErrorException(e); - } - }) + .map(worlds -> this.jsonSerializer.get().serialize(worlds, LIST_WORLD_TYPE)) ); } public void handle_updates(Exchange exchange) throws HttpException { int queries = this.extractQueriesParameter(exchange); - exchange.response() - .headers(h -> h - .add(HttpHeaderNames.SERVER, STATIC_SERVER) - .add(HttpHeaderNames.DATE, this.date) - .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) - ) - .body() - .raw().stream(this.sqlClient.get() - .flatMapMany(client -> Flux.from(((UnsafeSqlOperations)client) - .batchQueries(ops -> - Flux.range(0, queries) - .map(ign -> ops.queryForObject( - DB_SELECT_WORLD, - row -> new World(row.getInteger(0), randomWorldId()), - randomWorldId() - )) - )) - .collectSortedList() - .delayUntil(worlds -> client.batchUpdate( - DB_UPDATE_WORLD, - worlds.stream().map(world -> new Object[] { world.getRandomNumber(), world.getId() }) - ) + .headers(h -> h + .add(HttpHeaderNames.SERVER, STATIC_SERVER) + .add(HttpHeaderNames.DATE, this.date) + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + ) + .body() + .raw().stream(this.dbRepository.get() + .flatMapMany(repository -> Flux.from(((UnsafeSqlOperations)repository.getSqlClient()) + .batchQueries(ops -> + Flux.range(0, queries) + .map(ign -> ops.queryForObject( + DB_SELECT_WORLD, + row -> new World(row.getInteger(0), randomWorldId()), + randomWorldId() + )) + )) + .collectSortedList() + .delayUntil(repository::updateWorlds) + .map(worlds -> this.jsonSerializer.get().serialize(worlds, LIST_WORLD_TYPE)) ) - .map(worlds -> { - try { - return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)); - } - catch (JsonProcessingException e) { - throw new InternalServerErrorException(e); - } - }) - ) - ); + ); } private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8"); - private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.buffer()); + private static final FortunesTemplate.Renderer> FORTUNES_RENDERER = FortunesTemplate.bytebuf(Unpooled::buffer); public void handle_fortunes(Exchange exchange) throws HttpException { exchange.response() @@ -300,12 +253,7 @@ public void handle_fortunes(Exchange exchange) throws HttpExcep .add(HttpHeaderNames.CONTENT_TYPE, MEDIA_TEXT_HTML_UTF8) ) .body() - .raw().stream(this.sqlClient.get().flatMapMany(client -> - client.query( - DB_SELECT_FORTUNE, - row -> new Fortune(row.getInteger(0), row.getString(1)) - ) - ) + .raw().stream(this.dbRepository.get().flatMapMany(DbRepository::listFortunes) .collectList() .flatMap(fortunes -> { fortunes.add(new Fortune(0, "Additional fortune added at request time.")); diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/DbRepository.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/DbRepository.java new file mode 100644 index 00000000000..28699e3c1d0 --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/DbRepository.java @@ -0,0 +1,132 @@ +package com.techempower.inverno.benchmark.internal; + +import com.techempower.inverno.benchmark.AppConfiguration; +import com.techempower.inverno.benchmark.model.Fortune; +import com.techempower.inverno.benchmark.model.World; +import io.inverno.core.annotation.Bean; +import io.inverno.core.annotation.Destroy; +import io.inverno.core.annotation.Init; +import io.inverno.mod.base.concurrent.Reactor; +import io.inverno.mod.base.concurrent.VertxReactor; +import io.inverno.mod.sql.PreparedStatement; +import io.inverno.mod.sql.SqlClient; +import io.inverno.mod.sql.vertx.ConnectionSqlClient; +import io.vertx.core.Vertx; +import io.vertx.core.VertxOptions; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgConnection; +import java.util.ArrayList; +import java.util.List; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public class DbRepository { + + public static final String DB_SELECT_WORLD = "SELECT id, randomnumber from WORLD where id = $1"; + public static final String DB_SELECT_FORTUNE = "SELECT id, message from FORTUNE"; + + private final SqlClient sqlClient; + + private final PreparedStatement selectWorldByIdQuery; + private final PreparedStatement selectFortuneQuery; + private final PreparedStatement[] updateWorldQueries; + + public DbRepository(SqlClient sqlClient) { + this.sqlClient = sqlClient; + + this.selectWorldByIdQuery = sqlClient.preparedStatement(DB_SELECT_WORLD); + this.selectFortuneQuery = sqlClient.preparedStatement(DB_SELECT_FORTUNE); + this.updateWorldQueries = new PreparedStatement[500]; + for(int i=0;i getWorld(int id) { + return Mono.from(this.selectWorldByIdQuery.bind(id).execute(row -> new World(row.getInteger(0), row.getInteger(1)))); + } + + public Flux listFortunes() { + return Flux.from(this.selectFortuneQuery.execute(row -> new Fortune(row.getInteger(0), row.getString(1)))); + } + + public Mono updateWorlds(List worlds) { + int len = worlds.size(); + List parameters = new ArrayList<>(len * 2); + for(World world : worlds) { + parameters.add(world.getId()); + parameters.add(world.getRandomNumber()); + } + return Mono.when(this.updateWorldQueries[len - 1].bind(parameters).execute()); + } + + @Bean( name = "dbRespository", visibility = Bean.Visibility.PRIVATE ) + public static class ReactorScope extends io.inverno.mod.base.concurrent.ReactorScope> { + + private final AppConfiguration configuration; + private final Reactor reactor; + + private Vertx vertx; + private PgConnectOptions connectOptions; + + public ReactorScope(AppConfiguration configuration, Reactor reactor) { + this.configuration = configuration; + this.reactor = reactor; + } + + @Init + public void init() { + if(this.reactor instanceof VertxReactor) { + this.vertx = ((VertxReactor)this.reactor).getVertx(); + } + else { + this.vertx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(this.configuration.boot().prefer_native_transport())); + } + + this.connectOptions = new PgConnectOptions() + .setHost(this.configuration.db_host()) + .setPort(this.configuration.db_port()) + .setDatabase(this.configuration.db_database()) + .setUser(this.configuration.db_username()) + .setPassword(this.configuration.db_password()) + .setCachePreparedStatements(true) + .setPreparedStatementCacheMaxSize(1024) + .setPipeliningLimit(100_100); + } + + @Destroy + public void destroy() { + if(!(this.reactor instanceof VertxReactor)) { + this.vertx.close(); + } + } + + @Override + protected Mono create() { + return Mono.fromCompletionStage(() -> PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()) + .map(pgConn -> new DbRepository(new ConnectionSqlClient(pgConn))) + .cacheInvalidateWhen(repository -> ((ConnectionSqlClient)repository.getSqlClient()).onClose()); + } + } +} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/JsonSerializer.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/JsonSerializer.java new file mode 100644 index 00000000000..24ce79eedd3 --- /dev/null +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/JsonSerializer.java @@ -0,0 +1,38 @@ +package com.techempower.inverno.benchmark.internal; + +import com.dslplatform.json.DslJson; +import com.dslplatform.json.JsonWriter; +import io.inverno.core.annotation.Bean; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import java.lang.reflect.Type; + +public class JsonSerializer { + + private static final DslJson DSL_JSON = new DslJson<>(); + + private final JsonWriter jsonWriter; + + public JsonSerializer() { + this.jsonWriter = DSL_JSON.newWriter(); + } + + public ByteBuf serialize(T value, Type type) { + try { + DSL_JSON.serialize(this.jsonWriter, type, value); + return Unpooled.wrappedBuffer(this.jsonWriter.toByteArray()); + } + finally { + this.jsonWriter.reset(); + } + } + + @Bean( name = "jsonSerializer", visibility = Bean.Visibility.PRIVATE ) + public static class ReactorScope extends io.inverno.mod.base.concurrent.ReactorScope { + + @Override + protected JsonSerializer create() { + return new JsonSerializer(); + } + } +} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java deleted file mode 100644 index d3b8a463865..00000000000 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.techempower.inverno.benchmark.internal; - -import com.techempower.inverno.benchmark.AppConfiguration; - -import io.inverno.core.annotation.Bean; -import io.inverno.core.annotation.Bean.Visibility; -import io.inverno.core.annotation.Destroy; -import io.inverno.core.annotation.Init; -import io.inverno.mod.base.concurrent.Reactor; -import io.inverno.mod.base.concurrent.ReactorScope; -import io.inverno.mod.base.concurrent.VertxReactor; -import io.inverno.mod.sql.SqlClient; -import io.inverno.mod.sql.vertx.ConnectionSqlClient; -import io.vertx.core.Vertx; -import io.vertx.core.VertxOptions; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.pgclient.PgConnection; -import reactor.core.publisher.Mono; - -@Bean( name = "SqlClient", visibility = Visibility.PRIVATE ) -public class SqlClientReactorScope extends ReactorScope> { - - private final AppConfiguration configuration; - private final Reactor reactor; - - private Vertx vertx; - private PgConnectOptions connectOptions; - - public SqlClientReactorScope(AppConfiguration configuration, Reactor reactor) { - this.configuration = configuration; - this.reactor = reactor; - } - - @Init - public void init() { - if(this.reactor instanceof VertxReactor) { - this.vertx = ((VertxReactor)this.reactor).getVertx(); - } - else { - this.vertx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(this.configuration.boot().prefer_native_transport())); - } - - this.connectOptions = new PgConnectOptions() - .setHost(this.configuration.db_host()) - .setPort(this.configuration.db_port()) - .setDatabase(this.configuration.db_database()) - .setUser(this.configuration.db_username()) - .setPassword(this.configuration.db_password()) - .setCachePreparedStatements(true) - .setPipeliningLimit(100_100); - } - - @Destroy - public void destroy() { - if(!(this.reactor instanceof VertxReactor)) { - this.vertx.close(); - } - } - - @Override - protected Mono create() { - return Mono.fromCompletionStage(() -> PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()) - .map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn)) - .cacheInvalidateWhen(client -> ((ConnectionSqlClient)client).onClose()); - } -} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java index de4017c3c0d..b00a8a9df9f 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Fortune.java @@ -1,5 +1,8 @@ package com.techempower.inverno.benchmark.model; +import com.dslplatform.json.CompiledJson; + +@CompiledJson public final class Fortune implements Comparable { private final int id; diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java index c9d554903d7..306d5c348d6 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/Message.java @@ -1,5 +1,8 @@ package com.techempower.inverno.benchmark.model; +import com.dslplatform.json.CompiledJson; + +@CompiledJson public final class Message { private final String message; diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java index f0f1825f3b9..6defeb042a3 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/model/World.java @@ -1,14 +1,15 @@ package com.techempower.inverno.benchmark.model; +import com.dslplatform.json.CompiledJson; + +@CompiledJson public final class World implements Comparable { - private final int id; + private int id; private int randomNumber; - public World(int id) { - this.id = id; - } - + public World() {} + public World(int id, int randomNumber) { this.id = id; this.randomNumber = randomNumber; diff --git a/frameworks/Java/inverno/src/main/java/module-info.java b/frameworks/Java/inverno/src/main/java/module-info.java index fefbf5c52a6..39d0224949b 100644 --- a/frameworks/Java/inverno/src/main/java/module-info.java +++ b/frameworks/Java/inverno/src/main/java/module-info.java @@ -10,16 +10,13 @@ requires io.netty.common; requires io.netty.codec.http; requires unbescape; - + requires static dsl.json; + requires io.vertx.client.sql.pg; requires io.vertx.client.sql; 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; - + exports com.techempower.inverno.benchmark; exports com.techempower.inverno.benchmark.model; } From a7deef07058edd5a4064fcecc75ef5cc1bfb075a Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Fri, 1 Nov 2024 16:16:32 -0400 Subject: [PATCH 1100/1766] Changes to fortunes. Signed-off-by: Santiago Pericas-Geertsen --- .../main/java/io/helidon/benchmark/nima/models/Fortune.java | 6 +++++- .../io/helidon/benchmark/nima/services/FortuneHandler.java | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/Fortune.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/Fortune.java index 96a5e2070be..190c792d345 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/Fortune.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/Fortune.java @@ -1,7 +1,7 @@ package io.helidon.benchmark.nima.models; -public final class Fortune { +public final class Fortune implements Comparable { public int id; public String message; @@ -17,4 +17,8 @@ public int getId() { public String getMessage() { return message; } + @Override + public int compareTo(Fortune other) { + return message.compareTo(other.message); + } } diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index 8847b7d0bc1..062fd33934f 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -1,7 +1,7 @@ package io.helidon.benchmark.nima.services; -import java.util.Comparator; +import java.util.Collections; import java.util.List; import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput; @@ -32,7 +32,7 @@ public void handle(ServerRequest req, ServerResponse res) { res.header(CONTENT_TYPE_HTML); List fortuneList = repository.getFortunes(); fortuneList.add(ADDITIONAL_FORTUNE); - fortuneList.sort(Comparator.comparing(Fortune::getMessage)); + Collections.sort(fortuneList); res.send(fortunes.template(fortuneList) .render(ArrayOfByteArraysOutput.FACTORY) .toByteArray()); From df21e04a1d438c9bbbd295df0342e86494b690e6 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Mon, 4 Nov 2024 10:08:12 -0500 Subject: [PATCH 1101/1766] Write fortunes output with an output stream. Signed-off-by: Santiago Pericas-Geertsen --- .../benchmark/nima/services/FortuneHandler.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index 062fd33934f..61294716629 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -1,12 +1,14 @@ package io.helidon.benchmark.nima.services; +import java.io.IOException; import java.util.Collections; import java.util.List; import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput; import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.Fortune; +import io.helidon.common.buffers.BufferData; import io.helidon.webserver.http.Handler; import io.helidon.webserver.http.ServerRequest; import io.helidon.webserver.http.ServerResponse; @@ -14,6 +16,7 @@ import static io.helidon.benchmark.nima.Main.CONTENT_TYPE_HTML; import static io.helidon.benchmark.nima.Main.SERVER; +import static io.helidon.http.HeaderNames.CONTENT_LENGTH; public class FortuneHandler implements Handler { @@ -30,11 +33,19 @@ public FortuneHandler(DbRepository repository) { public void handle(ServerRequest req, ServerResponse res) { res.header(SERVER); res.header(CONTENT_TYPE_HTML); + List fortuneList = repository.getFortunes(); fortuneList.add(ADDITIONAL_FORTUNE); Collections.sort(fortuneList); - res.send(fortunes.template(fortuneList) - .render(ArrayOfByteArraysOutput.FACTORY) - .toByteArray()); + ArrayOfByteArraysOutput output = fortunes.template(fortuneList).render(ArrayOfByteArraysOutput.FACTORY); + List entity = output.getArrays(); + BufferData bufferData = BufferData.create(entity.stream().map(BufferData::create).toList()); + int length = bufferData.available(); + res.header(CONTENT_LENGTH, String.valueOf(length)); + try (var out = res.outputStream()) { + bufferData.writeTo(out); + } catch (IOException e) { + throw new RuntimeException(e); + } } } \ No newline at end of file From c4a735d84905dc33c2df19be9e1a316954eb742d Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Mon, 4 Nov 2024 10:31:14 -0500 Subject: [PATCH 1102/1766] Write fortunes output with an output stream using byte[]. Signed-off-by: Santiago Pericas-Geertsen --- .../benchmark/nima/services/FortuneHandler.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index 61294716629..3d6e9ba4cfb 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -8,7 +8,6 @@ import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput; import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.Fortune; -import io.helidon.common.buffers.BufferData; import io.helidon.webserver.http.Handler; import io.helidon.webserver.http.ServerRequest; import io.helidon.webserver.http.ServerResponse; @@ -39,11 +38,17 @@ public void handle(ServerRequest req, ServerResponse res) { Collections.sort(fortuneList); ArrayOfByteArraysOutput output = fortunes.template(fortuneList).render(ArrayOfByteArraysOutput.FACTORY); List entity = output.getArrays(); - BufferData bufferData = BufferData.create(entity.stream().map(BufferData::create).toList()); - int length = bufferData.available(); + + int length = 0; + for (byte[] bytes : entity) { + length += bytes.length; + } res.header(CONTENT_LENGTH, String.valueOf(length)); + try (var out = res.outputStream()) { - bufferData.writeTo(out); + for (byte[] bytes : entity) { + out.write(bytes); + } } catch (IOException e) { throw new RuntimeException(e); } From dab117a50b37f02e538628be0a43a55fb9d0c1bf Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Mon, 4 Nov 2024 14:59:10 -0500 Subject: [PATCH 1103/1766] New connection pool. Signed-off-by: Santiago Pericas-Geertsen --- .../nima/models/PgClientConnectionPool.java | 125 ++++++++++++++++++ .../nima/models/PgClientRepository.java | 92 ++++--------- .../nima/services/FortuneHandler.java | 3 + .../nima/src/main/resources/application.yaml | 1 - 4 files changed, 154 insertions(+), 67 deletions(-) create mode 100644 frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java new file mode 100644 index 00000000000..1f0605b1303 --- /dev/null +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java @@ -0,0 +1,125 @@ + +package io.helidon.benchmark.nima.models; + +import io.vertx.core.Vertx; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgConnection; +import io.vertx.sqlclient.PreparedQuery; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowSet; + +class PgClientConnectionPool implements AutoCloseable { + + private final int size; + private final Vertx vertx; + private final PgConnectOptions options; + private final PgClientConnection[] connections; + + public PgClientConnectionPool(Vertx vertx, int size, PgConnectOptions options) { + this.size = size; + this.vertx = vertx; + this.options = options; + this.connections = new PgClientConnection[size]; + } + + public PgClientConnection clientConnection() { + int bucket = Thread.currentThread().hashCode() % size; + return connections[bucket]; + } + + public void connect() { + try { + for (int i = 0; i < size; i++) { + PgConnection conn = PgConnection.connect(vertx, options) + .toCompletionStage().toCompletableFuture().get(); + PgClientConnection clientConn = new PgClientConnection(conn); + clientConn.prepare(); + connections[i] = clientConn; + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void close() { + try { + for (PgClientConnection connection : connections) { + connection.close(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static class PgClientConnection implements AutoCloseable { + private static final int UPDATE_QUERIES = 500; + private static String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; + private static String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; + + private PreparedQuery> worldQuery; + private PreparedQuery> fortuneQuery; + private PreparedQuery>[] updateQuery; + + private final PgConnection conn; + + PgClientConnection(PgConnection conn) { + this.conn = conn; + } + + public PgConnection pgConnection() { + return conn; + } + + @Override + public void close() { + conn.close(); + } + + public PreparedQuery> worldQuery() { + return worldQuery; + } + + public PreparedQuery> fortuneQuery() { + return fortuneQuery; + } + + public PreparedQuery> updateQuery(int queryCount) { + return updateQuery[queryCount - 1]; + } + + @SuppressWarnings("unchecked") + void prepare() { + try { + worldQuery = conn.prepare(SELECT_WORLD) + .toCompletionStage().toCompletableFuture().get().query(); + fortuneQuery = conn.prepare(SELECT_FORTUNE) + .toCompletionStage().toCompletableFuture().get().query(); + updateQuery = (PreparedQuery>[]) new PreparedQuery[UPDATE_QUERIES]; + for (int i = 0; i < UPDATE_QUERIES; i++) { + updateQuery[i] = conn.prepare(singleUpdate(i + 1)) + .toCompletionStage().toCompletableFuture().get().query(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static String singleUpdate(int count) { + StringBuilder sql = new StringBuilder(); + sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); + for (int i = 0; i < count; i++) { + int k = i * 2 + 1; + sql.append(" WHEN $").append(k).append(" THEN $").append(k + 1); + } + sql.append(" ELSE RANDOMNUMBER"); + sql.append(" END WHERE ID IN ($1"); + for (int i = 1; i < count; i++) { + int k = i * 2 + 1; + sql.append(",$").append(k); + } + sql.append(")"); + return sql.toString(); + } + } +} diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java index 291131eca17..6c6da76e97e 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutionException; import java.util.logging.Logger; import io.helidon.config.Config; @@ -10,25 +9,17 @@ import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; import io.vertx.pgclient.PgConnectOptions; -import io.vertx.pgclient.PgPool; -import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.PreparedQuery; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; -import io.vertx.sqlclient.SqlClient; import io.vertx.sqlclient.Tuple; import static io.helidon.benchmark.nima.models.DbRepository.randomWorldNumber; public class PgClientRepository implements DbRepository { private static final Logger LOGGER = Logger.getLogger(PgClientRepository.class.getName()); - private static final int UPDATE_QUERIES = 500; - private final SqlClient updatePool; - - private final PreparedQuery> getFortuneQuery; - private final PreparedQuery> getWorldQuery; - private final PreparedQuery>[] updateWorldSingleQuery; + private final PgClientConnectionPool connectionPool; @SuppressWarnings("unchecked") public PgClientRepository(Config config) { @@ -41,27 +32,16 @@ public PgClientRepository(Config config) { .setUser(config.get("username").asString().orElse("benchmarkdbuser")) .setPassword(config.get("password").asString().orElse("benchmarkdbpass")) .setPipeliningLimit(100000); - - int sqlPoolSize = config.get("sql-pool-size").asInt().orElse(64); - PoolOptions clientOptions = new PoolOptions().setMaxSize(sqlPoolSize); - LOGGER.info("sql-pool-size is " + sqlPoolSize); - - SqlClient queryPool = PgPool.client(vertx, connectOptions, clientOptions); - updatePool = PgPool.client(vertx, connectOptions, clientOptions); - - getWorldQuery = queryPool.preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1"); - getFortuneQuery = queryPool.preparedQuery("SELECT id, message FROM fortune"); - - updateWorldSingleQuery = new PreparedQuery[UPDATE_QUERIES]; - for (int i = 0; i < UPDATE_QUERIES; i++) { - updateWorldSingleQuery[i] = queryPool.preparedQuery(singleUpdate(i + 1)); - } + int sqlPoolSize = config.get("sql-pool-size").asInt().orElse(Runtime.getRuntime().availableProcessors()); + connectionPool = new PgClientConnectionPool(vertx, sqlPoolSize, connectOptions); + connectionPool.connect(); } @Override public World getWorld(int id) { try { - return getWorldQuery.execute(Tuple.of(id)) + PreparedQuery> worldQuery = connectionPool.clientConnection().worldQuery(); + return worldQuery.execute(Tuple.of(id)) .map(rows -> { Row r = rows.iterator().next(); return new World(r.getInteger(0), r.getInteger(1)); @@ -74,13 +54,14 @@ public World getWorld(int id) { @Override public List getWorlds(int count) { try { + PreparedQuery> worldQuery = connectionPool.clientConnection().worldQuery(); List> futures = new ArrayList<>(); for (int i = 0; i < count; i++) { - futures.add(getWorldQuery.execute(Tuple.of(randomWorldNumber())) - .map(rows -> { - Row r = rows.iterator().next(); - return new World(r.getInteger(0), r.getInteger(1)); - })); + futures.add(worldQuery.execute(Tuple.of(randomWorldNumber())) + .map(rows -> { + Row r = rows.iterator().next(); + return new World(r.getInteger(0), r.getInteger(1)); + })); } return Future.all(futures).toCompletionStage().toCompletableFuture().get().list(); } catch (Exception e) { @@ -92,7 +73,18 @@ public List getWorlds(int count) { public List updateWorlds(int count) { List worlds = getWorlds(count); try { - return updateWorlds(worlds, count, updatePool); + PreparedQuery> updateQuery = connectionPool.clientConnection().updateQuery(count); + List updateParams = new ArrayList<>(count * 2); + for (World world : worlds) { + updateParams.add(world.id); + world.randomNumber = randomWorldNumber(); + updateParams.add(world.randomNumber); + } + return updateQuery.execute(Tuple.wrap(updateParams)) + .toCompletionStage() + .thenApply(rows -> worlds) + .toCompletableFuture() + .get(); } catch (Exception e) { throw new RuntimeException(e); } @@ -101,7 +93,8 @@ public List updateWorlds(int count) { @Override public List getFortunes() { try { - return getFortuneQuery.execute() + PreparedQuery> fortuneQuery = connectionPool.clientConnection().fortuneQuery(); + return fortuneQuery.execute() .map(rows -> { List fortunes = new ArrayList<>(rows.size() + 1); for (Row r : rows) { @@ -113,37 +106,4 @@ public List getFortunes() { throw new RuntimeException(e); } } - - private List updateWorlds(List worlds, int count, SqlClient pool) - throws ExecutionException, InterruptedException { - int size = worlds.size(); - List updateParams = new ArrayList<>(size * 2); - for (World world : worlds) { - updateParams.add(world.id); - world.randomNumber = randomWorldNumber(); - updateParams.add(world.randomNumber); - } - return updateWorldSingleQuery[count - 1].execute(Tuple.wrap(updateParams)) - .toCompletionStage() - .thenApply(rows -> worlds) - .toCompletableFuture() - .get(); - } - - private static String singleUpdate(int count) { - StringBuilder sql = new StringBuilder(); - sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); - for (int i = 0; i < count; i++) { - int k = i * 2 + 1; - sql.append(" WHEN $").append(k).append(" THEN $").append(k + 1); - } - sql.append(" ELSE RANDOMNUMBER"); - sql.append(" END WHERE ID IN ($1"); - for (int i = 1; i < count; i++) { - int k = i * 2 + 1; - sql.append(",$").append(k); - } - sql.append(")"); - return sql.toString(); - } } \ No newline at end of file diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index 3d6e9ba4cfb..96871280513 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -33,18 +33,21 @@ public void handle(ServerRequest req, ServerResponse res) { res.header(SERVER); res.header(CONTENT_TYPE_HTML); + // render using template and get list of buffers List fortuneList = repository.getFortunes(); fortuneList.add(ADDITIONAL_FORTUNE); Collections.sort(fortuneList); ArrayOfByteArraysOutput output = fortunes.template(fortuneList).render(ArrayOfByteArraysOutput.FACTORY); List entity = output.getArrays(); + // compute entity length and set header int length = 0; for (byte[] bytes : entity) { length += bytes.length; } res.header(CONTENT_LENGTH, String.valueOf(length)); + // write entity to output try (var out = res.outputStream()) { for (byte[] bytes : entity) { out.write(bytes); diff --git a/frameworks/Java/helidon/nima/src/main/resources/application.yaml b/frameworks/Java/helidon/nima/src/main/resources/application.yaml index d2d8e8943b4..4a26ea0d0e0 100644 --- a/frameworks/Java/helidon/nima/src/main/resources/application.yaml +++ b/frameworks/Java/helidon/nima/src/main/resources/application.yaml @@ -36,6 +36,5 @@ host: "tfb-database" db: "hello_world" username: benchmarkdbuser password: benchmarkdbpass -sql-pool-size: 300 db-repository: "pgclient" # "pgclient" (default) or "hikari" From 249c88206c9f7f00da5e2379ce7af522f28c62a8 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Tue, 5 Nov 2024 09:21:01 -0500 Subject: [PATCH 1104/1766] Old fortune handler. Signed-off-by: Santiago Pericas-Geertsen --- .../nima/services/FortuneHandler.java | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index 96871280513..8847b7d0bc1 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -1,8 +1,7 @@ package io.helidon.benchmark.nima.services; -import java.io.IOException; -import java.util.Collections; +import java.util.Comparator; import java.util.List; import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput; @@ -15,7 +14,6 @@ import static io.helidon.benchmark.nima.Main.CONTENT_TYPE_HTML; import static io.helidon.benchmark.nima.Main.SERVER; -import static io.helidon.http.HeaderNames.CONTENT_LENGTH; public class FortuneHandler implements Handler { @@ -32,28 +30,11 @@ public FortuneHandler(DbRepository repository) { public void handle(ServerRequest req, ServerResponse res) { res.header(SERVER); res.header(CONTENT_TYPE_HTML); - - // render using template and get list of buffers List fortuneList = repository.getFortunes(); fortuneList.add(ADDITIONAL_FORTUNE); - Collections.sort(fortuneList); - ArrayOfByteArraysOutput output = fortunes.template(fortuneList).render(ArrayOfByteArraysOutput.FACTORY); - List entity = output.getArrays(); - - // compute entity length and set header - int length = 0; - for (byte[] bytes : entity) { - length += bytes.length; - } - res.header(CONTENT_LENGTH, String.valueOf(length)); - - // write entity to output - try (var out = res.outputStream()) { - for (byte[] bytes : entity) { - out.write(bytes); - } - } catch (IOException e) { - throw new RuntimeException(e); - } + fortuneList.sort(Comparator.comparing(Fortune::getMessage)); + res.send(fortunes.template(fortuneList) + .render(ArrayOfByteArraysOutput.FACTORY) + .toByteArray()); } } \ No newline at end of file From cc9ef0e197fd34cd640e406776fd2d0c3b263a0b Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Tue, 5 Nov 2024 13:37:26 -0500 Subject: [PATCH 1105/1766] Lazy connections. Signed-off-by: Santiago Pericas-Geertsen --- .../nima/models/PgClientConnectionPool.java | 35 ++++++++++++------- .../nima/models/PgClientRepository.java | 1 - 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java index 1f0605b1303..2ac2e13efb3 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java @@ -1,6 +1,8 @@ package io.helidon.benchmark.nima.models; +import java.util.concurrent.locks.ReentrantLock; + import io.vertx.core.Vertx; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgConnection; @@ -14,6 +16,7 @@ class PgClientConnectionPool implements AutoCloseable { private final Vertx vertx; private final PgConnectOptions options; private final PgClientConnection[] connections; + private final ReentrantLock lock = new ReentrantLock(); public PgClientConnectionPool(Vertx vertx, int size, PgConnectOptions options) { this.size = size; @@ -24,29 +27,37 @@ public PgClientConnectionPool(Vertx vertx, int size, PgConnectOptions options) { public PgClientConnection clientConnection() { int bucket = Thread.currentThread().hashCode() % size; + if (connections[bucket] == null) { + try { + lock.lock(); + if (connections[bucket] == null) { + connect(bucket); + } + } finally { + lock.unlock(); + } + } return connections[bucket]; } - public void connect() { + @Override + public void close() { try { - for (int i = 0; i < size; i++) { - PgConnection conn = PgConnection.connect(vertx, options) - .toCompletionStage().toCompletableFuture().get(); - PgClientConnection clientConn = new PgClientConnection(conn); - clientConn.prepare(); - connections[i] = clientConn; + for (PgClientConnection connection : connections) { + connection.close(); } } catch (Exception e) { throw new RuntimeException(e); } } - @Override - public void close() { + private void connect(int bucket) { try { - for (PgClientConnection connection : connections) { - connection.close(); - } + PgConnection conn = PgConnection.connect(vertx, options) + .toCompletionStage().toCompletableFuture().get(); + PgClientConnection clientConn = new PgClientConnection(conn); + clientConn.prepare(); + connections[bucket] = clientConn; } catch (Exception e) { throw new RuntimeException(e); } diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java index 6c6da76e97e..a02c0786e0e 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java @@ -34,7 +34,6 @@ public PgClientRepository(Config config) { .setPipeliningLimit(100000); int sqlPoolSize = config.get("sql-pool-size").asInt().orElse(Runtime.getRuntime().availableProcessors()); connectionPool = new PgClientConnectionPool(vertx, sqlPoolSize, connectOptions); - connectionPool.connect(); } @Override From 6521f3608282e0a2107473ae0ab304f0460768ba Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Tue, 26 Nov 2024 14:14:43 -0500 Subject: [PATCH 1106/1766] New connection pool using carrier threads. Signed-off-by: Santiago Pericas-Geertsen --- .../nima/models/PgClientConnectionPool.java | 35 +++++++++++-------- .../nima/models/PgClientRepository.java | 16 ++++++--- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java index 2ac2e13efb3..520c781af1b 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java @@ -1,6 +1,8 @@ package io.helidon.benchmark.nima.models; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.locks.ReentrantLock; import io.vertx.core.Vertx; @@ -12,38 +14,38 @@ class PgClientConnectionPool implements AutoCloseable { - private final int size; private final Vertx vertx; private final PgConnectOptions options; - private final PgClientConnection[] connections; private final ReentrantLock lock = new ReentrantLock(); + private final Map connectionMap = new HashMap<>(); - public PgClientConnectionPool(Vertx vertx, int size, PgConnectOptions options) { - this.size = size; + public PgClientConnectionPool(Vertx vertx, PgConnectOptions options) { this.vertx = vertx; this.options = options; - this.connections = new PgClientConnection[size]; } public PgClientConnection clientConnection() { - int bucket = Thread.currentThread().hashCode() % size; - if (connections[bucket] == null) { + String carrierThread = carrierThread(); + PgClientConnection connection = connectionMap.get(carrierThread); + if (connection == null) { try { lock.lock(); - if (connections[bucket] == null) { - connect(bucket); + connection = connectionMap.get(carrierThread); + if (connection == null) { + connection = newConnection(); + connectionMap.put(carrierThread, connection); } } finally { lock.unlock(); } } - return connections[bucket]; + return connection; } @Override public void close() { try { - for (PgClientConnection connection : connections) { + for (PgClientConnection connection : connectionMap.values()) { connection.close(); } } catch (Exception e) { @@ -51,20 +53,25 @@ public void close() { } } - private void connect(int bucket) { + private PgClientConnection newConnection() { try { PgConnection conn = PgConnection.connect(vertx, options) .toCompletionStage().toCompletableFuture().get(); PgClientConnection clientConn = new PgClientConnection(conn); clientConn.prepare(); - connections[bucket] = clientConn; + return clientConn; } catch (Exception e) { throw new RuntimeException(e); } } + static String carrierThread() { + String threadName = Thread.currentThread().toString(); + return threadName.substring(threadName.indexOf('@') + 1); + } + public static class PgClientConnection implements AutoCloseable { - private static final int UPDATE_QUERIES = 500; + static final int UPDATE_QUERIES = 500; private static String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; private static String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java index a02c0786e0e..3f3bd2624eb 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java @@ -15,6 +15,7 @@ import io.vertx.sqlclient.Tuple; import static io.helidon.benchmark.nima.models.DbRepository.randomWorldNumber; +import static io.helidon.benchmark.nima.models.PgClientConnectionPool.PgClientConnection.UPDATE_QUERIES; public class PgClientRepository implements DbRepository { private static final Logger LOGGER = Logger.getLogger(PgClientRepository.class.getName()); @@ -23,17 +24,24 @@ public class PgClientRepository implements DbRepository { @SuppressWarnings("unchecked") public PgClientRepository(Config config) { - Vertx vertx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(true)); + VertxOptions vertxOptions = new VertxOptions() + .setPreferNativeTransport(true) + .setBlockedThreadCheckInterval(100000); + Vertx vertx = Vertx.vertx(vertxOptions); PgConnectOptions connectOptions = new PgConnectOptions() .setPort(config.get("port").asInt().orElse(5432)) - .setCachePreparedStatements(config.get("cache-prepared-statements").asBoolean().orElse(true)) .setHost(config.get("host").asString().orElse("tfb-database")) .setDatabase(config.get("db").asString().orElse("hello_world")) .setUser(config.get("username").asString().orElse("benchmarkdbuser")) .setPassword(config.get("password").asString().orElse("benchmarkdbpass")) + .setCachePreparedStatements(true) + .setPreparedStatementCacheMaxSize(UPDATE_QUERIES + 2) + .setPreparedStatementCacheSqlFilter(s -> true) // cache all + .setTcpNoDelay(true) + .setTcpQuickAck(true) + .setTcpKeepAlive(true) .setPipeliningLimit(100000); - int sqlPoolSize = config.get("sql-pool-size").asInt().orElse(Runtime.getRuntime().availableProcessors()); - connectionPool = new PgClientConnectionPool(vertx, sqlPoolSize, connectOptions); + connectionPool = new PgClientConnectionPool(vertx, connectOptions); } @Override From 96c3a1b9b003854a852837fcefcf5b1b46fe68e0 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Tue, 26 Nov 2024 17:46:16 -0500 Subject: [PATCH 1107/1766] Updated fortunes query. Signed-off-by: Santiago Pericas-Geertsen --- .../helidon/benchmark/nima/models/PgClientConnectionPool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java index 520c781af1b..478847702cb 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java @@ -73,7 +73,7 @@ static String carrierThread() { public static class PgClientConnection implements AutoCloseable { static final int UPDATE_QUERIES = 500; private static String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; - private static String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; + private static String SELECT_FORTUNE = "SELECT * from FORTUNE"; private PreparedQuery> worldQuery; private PreparedQuery> fortuneQuery; From 2fbd1d3e49efea28f6f2adf0f16c20c884a7e870 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Tue, 26 Nov 2024 18:13:42 -0500 Subject: [PATCH 1108/1766] Cleans fortunes template. Signed-off-by: Santiago Pericas-Geertsen --- .../main/resources/views/fortunes.rocker.html | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html b/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html index 3ebcae44729..86b8c004692 100644 --- a/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html +++ b/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html @@ -1,24 +1,4 @@ @import io.helidon.benchmark.nima.models.Fortune @import java.util.List @args (List fortunes) - - - - -Fortunes - - - - - - - - @for (f : fortunes) { - - - - - } -
      idmessage
      @f.getId()@f.getMessage()
      - - \ No newline at end of file +Fortunes@for (f : fortunes) {}
      idmessage
      @f.getId()@f.getMessage()
      From d669122a516d679d678e56333f0e27a4cbb021ef Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Wed, 27 Nov 2024 10:22:56 -0500 Subject: [PATCH 1109/1766] Using jte. Signed-off-by: Santiago Pericas-Geertsen --- frameworks/Java/helidon/nima/pom.xml | 23 +++++----- .../nima/services/FortuneHandler.java | 45 ++++++++++++++++--- .../src/main/resources/views/fortunes.jte | 2 + .../main/resources/views/fortunes.rocker.html | 4 -- 4 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 frameworks/Java/helidon/nima/src/main/resources/views/fortunes.jte delete mode 100644 frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html diff --git a/frameworks/Java/helidon/nima/pom.xml b/frameworks/Java/helidon/nima/pom.xml index c859b758cfc..d240518fc59 100644 --- a/frameworks/Java/helidon/nima/pom.xml +++ b/frameworks/Java/helidon/nima/pom.xml @@ -38,6 +38,7 @@ 1.3.0 4.5.3 0.9.23 + 3.1.15 @@ -78,9 +79,9 @@ 42.6.1 - com.fizzed - rocker-runtime - ${rocker.version} + gg.jte + jte + ${jte.version} io.helidon.common.testing @@ -98,7 +99,6 @@ test - @@ -125,20 +125,21 @@ + - com.fizzed - rocker-maven-plugin - ${rocker.version} + gg.jte + jte-maven-plugin + ${jte.version} + + ${project.basedir}/src/main/resources/views + Html + - generate-rocker-templates generate-sources generate - - src/main/resources - diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index 8847b7d0bc1..b821f8f9261 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -1,16 +1,21 @@ package io.helidon.benchmark.nima.services; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.util.Comparator; import java.util.List; -import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput; +import gg.jte.TemplateOutput; import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.Fortune; import io.helidon.webserver.http.Handler; import io.helidon.webserver.http.ServerRequest; import io.helidon.webserver.http.ServerResponse; -import views.fortunes; + +import gg.jte.html.OwaspHtmlTemplateOutput; +import gg.jte.generated.precompiled.JtefortunesGenerated; import static io.helidon.benchmark.nima.Main.CONTENT_TYPE_HTML; import static io.helidon.benchmark.nima.Main.SERVER; @@ -33,8 +38,38 @@ public void handle(ServerRequest req, ServerResponse res) { List fortuneList = repository.getFortunes(); fortuneList.add(ADDITIONAL_FORTUNE); fortuneList.sort(Comparator.comparing(Fortune::getMessage)); - res.send(fortunes.template(fortuneList) - .render(ArrayOfByteArraysOutput.FACTORY) - .toByteArray()); + try (OutputStream os = res.outputStream()) { + JtefortunesGenerated.render(new OwaspHtmlTemplateOutput(new HelidonTemplateOutput(os)), + null, fortuneList); + } catch (IOException e) { + throw new RuntimeException(e); + } } + + static class HelidonTemplateOutput implements TemplateOutput{ + private final OutputStream os; + + HelidonTemplateOutput(OutputStream os) { + this.os = os; + } + + @Override + public void writeContent(String value) { + writeBinaryContent(value.getBytes(StandardCharsets.UTF_8)); + } + + @Override + public void writeContent(String value, int beginIndex, int endIndex) { + writeBinaryContent(value.substring(beginIndex, endIndex).getBytes(StandardCharsets.UTF_8)); + } + + @Override + public void writeBinaryContent(byte[] value) { + try { + os.write(value); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }; } \ No newline at end of file diff --git a/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.jte b/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.jte new file mode 100644 index 00000000000..52dc350b25f --- /dev/null +++ b/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.jte @@ -0,0 +1,2 @@ +@param java.util.List fortunes +Fortunes@for(io.helidon.benchmark.nima.models.Fortune fortune : fortunes)@endfor
      idmessage
      ${fortune.getId()}${fortune.getMessage()}
      \ No newline at end of file diff --git a/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html b/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html deleted file mode 100644 index 86b8c004692..00000000000 --- a/frameworks/Java/helidon/nima/src/main/resources/views/fortunes.rocker.html +++ /dev/null @@ -1,4 +0,0 @@ -@import io.helidon.benchmark.nima.models.Fortune -@import java.util.List -@args (List fortunes) -Fortunes@for (f : fortunes) {}
      idmessage
      @f.getId()@f.getMessage()
      From 8c47f6c81a72fd99b2282ed29e0f1369d89407b4 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Thu, 16 Jan 2025 09:17:17 -0500 Subject: [PATCH 1110/1766] Updates Helidon version to 4.1.5. Signed-off-by: Santiago Pericas-Geertsen --- 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 d240518fc59..0d312c8eed8 100644 --- a/frameworks/Java/helidon/nima/pom.xml +++ b/frameworks/Java/helidon/nima/pom.xml @@ -21,7 +21,7 @@ io.helidon.applications helidon-se - 4.1.2 + 4.1.5 From 437a76eb1a0f5d31fe48a700fb7a9241590dde2a Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Thu, 16 Jan 2025 10:23:18 -0500 Subject: [PATCH 1111/1766] Updates code to use new send method. Signed-off-by: Santiago Pericas-Geertsen --- .../benchmark/nima/JsonSerializer.java | 41 +++++++------- .../java/io/helidon/benchmark/nima/Main.java | 28 ++++++---- .../benchmark/nima/services/DbService.java | 53 ++++++++++++------- 3 files changed, 75 insertions(+), 47 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java index 322a7cf030c..0564fa8a911 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/JsonSerializer.java @@ -2,8 +2,8 @@ import java.io.IOException; import java.util.Arrays; -import java.util.Map; import java.util.List; +import java.util.Map; import com.jsoniter.output.JsonStream; import com.jsoniter.output.JsonStreamPool; @@ -15,7 +15,7 @@ private JsonSerializer() { } /** - * Serialize an instance into a JSON object and return it as a byte array. + * Serialize an instance into a byte array. * * @param obj the instance * @return the byte array @@ -28,19 +28,31 @@ public static byte[] serialize(Object obj) { return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); } catch (IOException e) { throw new JsonException(e); - } finally { - JsonStreamPool.returnJsonStream(stream); } } /** - * Serialize a map of strings into a JSON object and return it as a byte array. + * Serialize an instance into a JSON stream. + * + * @param obj the instance + * @param stream the JSON stream + */ + public static void serialize(Object obj, JsonStream stream) { + try { + stream.reset(null); + stream.writeVal(obj.getClass(), obj); + } catch (IOException e) { + throw new JsonException(e); + } + } + + /** + * Serialize a map of strings into a JSON stream. * * @param map the map - * @return the byte array + * @param stream the JSON stream */ - public static byte[] serialize(Map map) { - JsonStream stream = JsonStreamPool.borrowJsonStream(); + public static void serialize(Map map, JsonStream stream) { try { stream.reset(null); stream.writeObjectStart(); @@ -53,22 +65,18 @@ public static byte[] serialize(Map map) { } }); stream.writeObjectEnd(); - return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); } catch (IOException e) { throw new JsonException(e); - } finally { - JsonStreamPool.returnJsonStream(stream); } } /** - * Serialize a list of objects into a JSON array and return it as a byte array. + * Serialize a list of objects into a JSON stream. * * @param objs the list of objects - * @return the byte array + * @param stream the JSON stream */ - public static byte[] serialize(List objs) { - JsonStream stream = JsonStreamPool.borrowJsonStream(); + public static void serialize(List objs, JsonStream stream) { try { stream.reset(null); stream.writeArrayStart(); @@ -82,11 +90,8 @@ public static byte[] serialize(List objs) { } stream.writeArrayEnd(); - return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); } catch (IOException e) { throw new JsonException(e); - } finally { - JsonStreamPool.returnJsonStream(stream); } } } diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java index df669d8a7a7..800ce927537 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Oracle and/or its affiliates. + * Copyright (c) 2022, 2025 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,16 +19,18 @@ import java.nio.charset.StandardCharsets; import java.util.logging.Logger; +import com.jsoniter.output.JsonStream; +import com.jsoniter.output.JsonStreamPool; import io.helidon.benchmark.nima.models.DbRepository; import io.helidon.benchmark.nima.models.HikariJdbcRepository; import io.helidon.benchmark.nima.models.PgClientRepository; import io.helidon.benchmark.nima.services.DbService; import io.helidon.benchmark.nima.services.FortuneHandler; +import io.helidon.config.Config; +import io.helidon.config.ConfigException; import io.helidon.http.Header; import io.helidon.http.HeaderNames; import io.helidon.http.HeaderValues; -import io.helidon.config.Config; -import io.helidon.config.ConfigException; import io.helidon.logging.common.LogConfig; import io.helidon.webserver.WebServer; import io.helidon.webserver.http.Handler; @@ -93,7 +95,7 @@ static void routing(HttpRules rules) { static class PlaintextHandler implements Handler { static final Header CONTENT_TYPE = HeaderValues.createCached(HeaderNames.CONTENT_TYPE, - "text/plain; charset=UTF-8"); + "text/plain; charset=UTF-8"); static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, "13"); private static final byte[] RESPONSE_BYTES = "Hello, World!".getBytes(StandardCharsets.UTF_8); @@ -110,14 +112,20 @@ static class JsonHandler implements Handler { private static final String MESSAGE = "Hello, World!"; private static final int JSON_LENGTH = serialize(new Message(MESSAGE)).length; static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, - String.valueOf(JSON_LENGTH)); + String.valueOf(JSON_LENGTH)); @Override public void handle(ServerRequest req, ServerResponse res) { - res.header(CONTENT_LENGTH); - res.header(HeaderValues.CONTENT_TYPE_JSON); - res.header(Main.SERVER); - res.send(serialize(new Message(MESSAGE))); + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + res.header(CONTENT_LENGTH); + res.header(HeaderValues.CONTENT_TYPE_JSON); + res.header(Main.SERVER); + serialize(new Message(MESSAGE), stream); + res.send(stream.buffer().data(), 0, stream.buffer().tail()); + } finally { + JsonStreamPool.returnJsonStream(stream); + } } } @@ -147,4 +155,4 @@ public String getMessage() { return message; } } -} +} \ No newline at end of file diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java index e3bd1fe39fc..a1e97de44b5 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java @@ -1,21 +1,19 @@ - package io.helidon.benchmark.nima.services; -import java.util.List; - +import com.jsoniter.output.JsonStream; +import com.jsoniter.output.JsonStreamPool; import io.helidon.benchmark.nima.models.DbRepository; -import io.helidon.benchmark.nima.models.World; +import io.helidon.common.mapper.OptionalValue; import io.helidon.common.parameters.Parameters; import io.helidon.http.HeaderValues; import io.helidon.webserver.http.HttpRules; import io.helidon.webserver.http.HttpService; import io.helidon.webserver.http.ServerRequest; import io.helidon.webserver.http.ServerResponse; -import io.helidon.common.mapper.OptionalValue; +import static io.helidon.benchmark.nima.JsonSerializer.serialize; import static io.helidon.benchmark.nima.Main.SERVER; import static io.helidon.benchmark.nima.models.DbRepository.randomWorldNumber; -import static io.helidon.benchmark.nima.JsonSerializer.serialize; public class DbService implements HttpService { @@ -33,24 +31,41 @@ public void routing(HttpRules httpRules) { } private void db(ServerRequest req, ServerResponse res) { - res.header(SERVER); - res.header(HeaderValues.CONTENT_TYPE_JSON); - res.send(serialize(repository.getWorld(randomWorldNumber()))); + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + res.header(SERVER); + res.header(HeaderValues.CONTENT_TYPE_JSON); + serialize(repository.getWorld(randomWorldNumber()), stream); + res.send(stream.buffer().data(), 0, stream.buffer().tail()); + } finally { + JsonStreamPool.returnJsonStream(stream); + } } private void queries(ServerRequest req, ServerResponse res) { - res.header(SERVER); - res.header(HeaderValues.CONTENT_TYPE_JSON); - int count = parseQueryCount(req.query()); - res.send(serialize(repository.getWorlds(count))); + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + res.header(SERVER); + res.header(HeaderValues.CONTENT_TYPE_JSON); + int count = parseQueryCount(req.query()); + serialize(repository.getWorlds(count), stream); + res.send(stream.buffer().data(), 0, stream.buffer().tail()); + } finally { + JsonStreamPool.returnJsonStream(stream); + } } private void updates(ServerRequest req, ServerResponse res) { - res.header(SERVER); - res.header(HeaderValues.CONTENT_TYPE_JSON); - int count = parseQueryCount(req.query()); - List worlds = repository.updateWorlds(count); - res.send(serialize(worlds)); + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + res.header(SERVER); + res.header(HeaderValues.CONTENT_TYPE_JSON); + int count = parseQueryCount(req.query()); + serialize(repository.updateWorlds(count), stream); + res.send(stream.buffer().data(), 0, stream.buffer().tail()); + } finally { + JsonStreamPool.returnJsonStream(stream); + } } private int parseQueryCount(Parameters parameters) { @@ -66,4 +81,4 @@ private int parseQueryCount(Parameters parameters) { } return Math.min(500, Math.max(1, parsedValue)); } -} \ No newline at end of file +} From 429f4b3534d70a02abe4140fb36d0ae99ef018e3 Mon Sep 17 00:00:00 2001 From: cypherpotato Date: Wed, 22 Jan 2025 00:58:32 -0300 Subject: [PATCH 1112/1766] update sisk benchmarks --- .../{sisk => sisk-framework}/.gitignore | 0 .../CSharp/{sisk => sisk-framework}/README.md | 0 .../sisk-framework/benchmark_config.json | 41 +++++++++++++++++++ frameworks/CSharp/sisk-framework/config.toml | 28 +++++++++++++ .../sisk-framework/sisk-cadente.dockerfile | 19 +++++++++ .../sisk-framework/sisk-cadente/Program.cs | 36 ++++++++++++++++ .../sisk-framework/sisk-cadente/sisk.csproj | 15 +++++++ .../{sisk => sisk-framework}/sisk.dockerfile | 0 .../CSharp/sisk-framework/sisk/Program.cs | 22 ++++++++++ .../{sisk => sisk-framework}/sisk/sisk.csproj | 2 +- frameworks/CSharp/sisk/benchmark_config.json | 21 ---------- frameworks/CSharp/sisk/config.toml | 15 ------- frameworks/CSharp/sisk/sisk/Program.cs | 26 ------------ 13 files changed, 162 insertions(+), 63 deletions(-) rename frameworks/CSharp/{sisk => sisk-framework}/.gitignore (100%) rename frameworks/CSharp/{sisk => sisk-framework}/README.md (100%) create mode 100644 frameworks/CSharp/sisk-framework/benchmark_config.json create mode 100644 frameworks/CSharp/sisk-framework/config.toml create mode 100644 frameworks/CSharp/sisk-framework/sisk-cadente.dockerfile create mode 100644 frameworks/CSharp/sisk-framework/sisk-cadente/Program.cs create mode 100644 frameworks/CSharp/sisk-framework/sisk-cadente/sisk.csproj rename frameworks/CSharp/{sisk => sisk-framework}/sisk.dockerfile (100%) create mode 100644 frameworks/CSharp/sisk-framework/sisk/Program.cs rename frameworks/CSharp/{sisk => sisk-framework}/sisk/sisk.csproj (82%) delete mode 100644 frameworks/CSharp/sisk/benchmark_config.json delete mode 100644 frameworks/CSharp/sisk/config.toml delete mode 100644 frameworks/CSharp/sisk/sisk/Program.cs diff --git a/frameworks/CSharp/sisk/.gitignore b/frameworks/CSharp/sisk-framework/.gitignore similarity index 100% rename from frameworks/CSharp/sisk/.gitignore rename to frameworks/CSharp/sisk-framework/.gitignore diff --git a/frameworks/CSharp/sisk/README.md b/frameworks/CSharp/sisk-framework/README.md similarity index 100% rename from frameworks/CSharp/sisk/README.md rename to frameworks/CSharp/sisk-framework/README.md diff --git a/frameworks/CSharp/sisk-framework/benchmark_config.json b/frameworks/CSharp/sisk-framework/benchmark_config.json new file mode 100644 index 00000000000..1e8fdc046b0 --- /dev/null +++ b/frameworks/CSharp/sisk-framework/benchmark_config.json @@ -0,0 +1,41 @@ +{ + "framework": "sisk", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Sisk", + "language": "C#", + "orm": "Raw", + "platform": ".NET", + "webserver": "HttpListener", + "os": "Linux", + "database_os": "Linux", + "display_name": "Sisk Framework" + } + }, + { + "cadente": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "Sisk", + "language": "C#", + "orm": "Raw", + "platform": ".NET", + "webserver": "Cadente", + "os": "Linux", + "database_os": "Linux", + "display_name": "Sisk Framework (Cadente)" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/CSharp/sisk-framework/config.toml b/frameworks/CSharp/sisk-framework/config.toml new file mode 100644 index 00000000000..af787b73130 --- /dev/null +++ b/frameworks/CSharp/sisk-framework/config.toml @@ -0,0 +1,28 @@ +[framework] +name = "sisk" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "HttpListener" +versus = "None" + +[cadente] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "Cadente" +versus = "None" diff --git a/frameworks/CSharp/sisk-framework/sisk-cadente.dockerfile b/frameworks/CSharp/sisk-framework/sisk-cadente.dockerfile new file mode 100644 index 00000000000..87f45780338 --- /dev/null +++ b/frameworks/CSharp/sisk-framework/sisk-cadente.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-cadente/*.csproj . +RUN dotnet restore -r linux-musl-x64 + +# copy and publish app and libraries +COPY sisk-cadente/ . +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-framework/sisk-cadente/Program.cs b/frameworks/CSharp/sisk-framework/sisk-cadente/Program.cs new file mode 100644 index 00000000000..ba19a480d16 --- /dev/null +++ b/frameworks/CSharp/sisk-framework/sisk-cadente/Program.cs @@ -0,0 +1,36 @@ +using System.Text; +using System.Text.Json; +using Sisk.Cadente; + +var host = new HttpHost ( 8080, session => { + var request = session.Request; + + if (request.Path == "/plaintext") { + SerializePlainTextResponse ( session.Response ); + } + else if (request.Path == "/json") { + SerializeJsonResponse ( session.Response ); + } + else { + session.Response.StatusCode = 404; + } +} ); + +host.Start (); +Thread.Sleep ( Timeout.Infinite ); + +static void SerializePlainTextResponse ( HttpResponse response ) { + var contentBytes = Encoding.UTF8.GetBytes ( "Hello, world!" ); + + response.Headers.Add ( new HttpHeader ( "Content-Type", "text/plain" ) ); + response.ResponseStream = new MemoryStream ( contentBytes ); +} + +static void SerializeJsonResponse ( HttpResponse response ) { + var contentBytes = JsonSerializer.SerializeToUtf8Bytes ( new { + message = "Hello, world!" + } ); + + response.Headers.Add ( new HttpHeader ( "Content-Type", "application/json; charset=utf-8" ) ); + response.ResponseStream = new MemoryStream ( contentBytes ); +} \ No newline at end of file diff --git a/frameworks/CSharp/sisk-framework/sisk-cadente/sisk.csproj b/frameworks/CSharp/sisk-framework/sisk-cadente/sisk.csproj new file mode 100644 index 00000000000..4d284054c2b --- /dev/null +++ b/frameworks/CSharp/sisk-framework/sisk-cadente/sisk.csproj @@ -0,0 +1,15 @@ + + + + Exe + net8.0 + enable + enable + true + + + + + + + diff --git a/frameworks/CSharp/sisk/sisk.dockerfile b/frameworks/CSharp/sisk-framework/sisk.dockerfile similarity index 100% rename from frameworks/CSharp/sisk/sisk.dockerfile rename to frameworks/CSharp/sisk-framework/sisk.dockerfile diff --git a/frameworks/CSharp/sisk-framework/sisk/Program.cs b/frameworks/CSharp/sisk-framework/sisk/Program.cs new file mode 100644 index 00000000000..12d331767ad --- /dev/null +++ b/frameworks/CSharp/sisk-framework/sisk/Program.cs @@ -0,0 +1,22 @@ +using System.Net.Http.Json; +using Sisk.Core.Http; +using Sisk.Core.Routing; + +var app = HttpServer.CreateBuilder ( host => { + host.UseListeningPort ( "http://+:8080/" ); +} ).Build (); + +app.Router.SetRoute ( RouteMethod.Get, "/plaintext", PlainText ); +app.Router.SetRoute ( RouteMethod.Get, "/json", Json ); + +app.Start (); + +static HttpResponse PlainText ( HttpRequest request ) { + return new HttpResponse ( "Hello, world!" ); +} + +static HttpResponse Json ( HttpRequest request ) { + return new HttpResponse ( 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-framework/sisk/sisk.csproj similarity index 82% rename from frameworks/CSharp/sisk/sisk/sisk.csproj rename to frameworks/CSharp/sisk-framework/sisk/sisk.csproj index 1b95479eb01..d9e30856114 100644 --- a/frameworks/CSharp/sisk/sisk/sisk.csproj +++ b/frameworks/CSharp/sisk-framework/sisk/sisk.csproj @@ -9,7 +9,7 @@ - + diff --git a/frameworks/CSharp/sisk/benchmark_config.json b/frameworks/CSharp/sisk/benchmark_config.json deleted file mode 100644 index b2cc682ac22..00000000000 --- a/frameworks/CSharp/sisk/benchmark_config.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "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 deleted file mode 100644 index 25d9855ea65..00000000000 --- a/frameworks/CSharp/sisk/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[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/Program.cs b/frameworks/CSharp/sisk/sisk/Program.cs deleted file mode 100644 index de5c69d1670..00000000000 --- a/frameworks/CSharp/sisk/sisk/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -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 From c72edf32f999b7217860208dd588ef57fe2d91c3 Mon Sep 17 00:00:00 2001 From: cypherpotato Date: Wed, 22 Jan 2025 01:02:18 -0300 Subject: [PATCH 1113/1766] rename sisk folder --- frameworks/CSharp/{sisk-framework => sisk}/.gitignore | 0 frameworks/CSharp/{sisk-framework => sisk}/README.md | 0 frameworks/CSharp/{sisk-framework => sisk}/benchmark_config.json | 0 frameworks/CSharp/{sisk-framework => sisk}/config.toml | 0 .../CSharp/{sisk-framework => sisk}/sisk-cadente.dockerfile | 0 .../CSharp/{sisk-framework => sisk}/sisk-cadente/Program.cs | 0 .../CSharp/{sisk-framework => sisk}/sisk-cadente/sisk.csproj | 0 frameworks/CSharp/{sisk-framework => sisk}/sisk.dockerfile | 0 frameworks/CSharp/{sisk-framework => sisk}/sisk/Program.cs | 0 frameworks/CSharp/{sisk-framework => sisk}/sisk/sisk.csproj | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename frameworks/CSharp/{sisk-framework => sisk}/.gitignore (100%) rename frameworks/CSharp/{sisk-framework => sisk}/README.md (100%) rename frameworks/CSharp/{sisk-framework => sisk}/benchmark_config.json (100%) rename frameworks/CSharp/{sisk-framework => sisk}/config.toml (100%) rename frameworks/CSharp/{sisk-framework => sisk}/sisk-cadente.dockerfile (100%) rename frameworks/CSharp/{sisk-framework => sisk}/sisk-cadente/Program.cs (100%) rename frameworks/CSharp/{sisk-framework => sisk}/sisk-cadente/sisk.csproj (100%) rename frameworks/CSharp/{sisk-framework => sisk}/sisk.dockerfile (100%) rename frameworks/CSharp/{sisk-framework => sisk}/sisk/Program.cs (100%) rename frameworks/CSharp/{sisk-framework => sisk}/sisk/sisk.csproj (100%) diff --git a/frameworks/CSharp/sisk-framework/.gitignore b/frameworks/CSharp/sisk/.gitignore similarity index 100% rename from frameworks/CSharp/sisk-framework/.gitignore rename to frameworks/CSharp/sisk/.gitignore diff --git a/frameworks/CSharp/sisk-framework/README.md b/frameworks/CSharp/sisk/README.md similarity index 100% rename from frameworks/CSharp/sisk-framework/README.md rename to frameworks/CSharp/sisk/README.md diff --git a/frameworks/CSharp/sisk-framework/benchmark_config.json b/frameworks/CSharp/sisk/benchmark_config.json similarity index 100% rename from frameworks/CSharp/sisk-framework/benchmark_config.json rename to frameworks/CSharp/sisk/benchmark_config.json diff --git a/frameworks/CSharp/sisk-framework/config.toml b/frameworks/CSharp/sisk/config.toml similarity index 100% rename from frameworks/CSharp/sisk-framework/config.toml rename to frameworks/CSharp/sisk/config.toml diff --git a/frameworks/CSharp/sisk-framework/sisk-cadente.dockerfile b/frameworks/CSharp/sisk/sisk-cadente.dockerfile similarity index 100% rename from frameworks/CSharp/sisk-framework/sisk-cadente.dockerfile rename to frameworks/CSharp/sisk/sisk-cadente.dockerfile diff --git a/frameworks/CSharp/sisk-framework/sisk-cadente/Program.cs b/frameworks/CSharp/sisk/sisk-cadente/Program.cs similarity index 100% rename from frameworks/CSharp/sisk-framework/sisk-cadente/Program.cs rename to frameworks/CSharp/sisk/sisk-cadente/Program.cs diff --git a/frameworks/CSharp/sisk-framework/sisk-cadente/sisk.csproj b/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj similarity index 100% rename from frameworks/CSharp/sisk-framework/sisk-cadente/sisk.csproj rename to frameworks/CSharp/sisk/sisk-cadente/sisk.csproj diff --git a/frameworks/CSharp/sisk-framework/sisk.dockerfile b/frameworks/CSharp/sisk/sisk.dockerfile similarity index 100% rename from frameworks/CSharp/sisk-framework/sisk.dockerfile rename to frameworks/CSharp/sisk/sisk.dockerfile diff --git a/frameworks/CSharp/sisk-framework/sisk/Program.cs b/frameworks/CSharp/sisk/sisk/Program.cs similarity index 100% rename from frameworks/CSharp/sisk-framework/sisk/Program.cs rename to frameworks/CSharp/sisk/sisk/Program.cs diff --git a/frameworks/CSharp/sisk-framework/sisk/sisk.csproj b/frameworks/CSharp/sisk/sisk/sisk.csproj similarity index 100% rename from frameworks/CSharp/sisk-framework/sisk/sisk.csproj rename to frameworks/CSharp/sisk/sisk/sisk.csproj From 6b343b37e7e2d956e269f66709c52e6894c8265a Mon Sep 17 00:00:00 2001 From: cclilshy Date: Wed, 22 Jan 2025 13:40:38 +0800 Subject: [PATCH 1114/1766] [PHP/Laravel] Synchronize ripple's latest decision --- frameworks/PHP/laravel/laravel-ripple.dockerfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/laravel/laravel-ripple.dockerfile b/frameworks/PHP/laravel/laravel-ripple.dockerfile index 4f1bb8bc3a9..2fc4a480716 100644 --- a/frameworks/PHP/laravel/laravel-ripple.dockerfile +++ b/frameworks/PHP/laravel/laravel-ripple.dockerfile @@ -33,14 +33,13 @@ RUN mkdir -p bootstrap/cache \ storage/framework/views \ storage/framework/cache -RUN echo "PRP_HTTP_LISTEN=http://0.0.0.0:8080" >> .env -RUN echo "PRP_HTTP_WORKERS=64" >> .env -RUN echo "PRP_HTTP_RELOAD=0" >> .env -RUN echo "PRP_HTTP_SANDBOX=1" >> .env +RUN echo "RIP_HTTP_LISTEN=http://0.0.0.0:8080" >> .env +RUN echo "RIP_HTTP_WORKERS=64" >> .env +RUN echo "RIP_HTTP_RELOAD=0" >> .env # Configure RUN composer install --quiet -RUN composer require cloudtay/ripple-driver --quiet +RUN composer require cloudtay/laravel-ripple --quiet RUN php artisan vendor:publish --tag=ripple-config RUN php artisan optimize From 8c5ed65efe9cdb0422c7181b2fd354223049fe4b Mon Sep 17 00:00:00 2001 From: Petrik Date: Wed, 22 Jan 2025 13:11:56 +0100 Subject: [PATCH 1115/1766] [ruby/rack] Mark Rack as Realistic instead of Stripped The requirements state that: Implementations that are not based on a realistic HTTP implementation will be marked as Stripped. See: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#general-test-requirements The Rack tests use webservers based on realisitic HTTP implementation, and Rack specification does as well: See: https://github.com/rack/rack/blob/main/SPEC.rdoc --- frameworks/Ruby/rack-sequel/benchmark_config.json | 12 ++++++------ frameworks/Ruby/rack/benchmark_config.json | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/benchmark_config.json b/frameworks/Ruby/rack-sequel/benchmark_config.json index 30ba62a6223..64663f27632 100644 --- a/frameworks/Ruby/rack-sequel/benchmark_config.json +++ b/frameworks/Ruby/rack-sequel/benchmark_config.json @@ -8,7 +8,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "database": "MySQL", "framework": "rack", @@ -28,7 +28,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "database": "Postgres", "framework": "rack", @@ -48,7 +48,7 @@ "update_url": "/updates?queries=", "plaintext_url": "/plaintext", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "database": "MySQL", "framework": "rack", @@ -68,7 +68,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "database": "Postgres", "framework": "rack", @@ -88,7 +88,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "database": "MySQL", "framework": "rack", @@ -108,7 +108,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "database": "Postgres", "framework": "rack", diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index 97227d81e36..914d2093dbb 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -10,7 +10,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "orm": "raw", "database": "Postgres", @@ -31,7 +31,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "orm": "raw", "database": "Postgres", @@ -52,7 +52,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "orm": "raw", "database": "Postgres", @@ -73,7 +73,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "orm": "raw", "database": "Postgres", @@ -94,7 +94,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, - "approach": "Stripped", + "approach": "Realistic", "classification": "Micro", "orm": "raw", "database": "Postgres", From f7153577412ba01235aabbd5b1d12ebf16f35a11 Mon Sep 17 00:00:00 2001 From: cypherpotato Date: Wed, 22 Jan 2025 13:43:55 -0300 Subject: [PATCH 1116/1766] fix: csproj version --- frameworks/CSharp/sisk/sisk/sisk.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/CSharp/sisk/sisk/sisk.csproj b/frameworks/CSharp/sisk/sisk/sisk.csproj index 6cbce377091..e767d50ede0 100644 --- a/frameworks/CSharp/sisk/sisk/sisk.csproj +++ b/frameworks/CSharp/sisk/sisk/sisk.csproj @@ -9,7 +9,7 @@ - + From 7de4d6853a5af21f4a37402833705586f6bb21f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:32:16 +0000 Subject: [PATCH 1117/1766] Bump org.apache.wicket:wicket-core in /frameworks/Java/wicket Bumps org.apache.wicket:wicket-core from 9.18.0 to 9.19.0. --- updated-dependencies: - dependency-name: org.apache.wicket:wicket-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/wicket/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/wicket/pom.xml b/frameworks/Java/wicket/pom.xml index c0f0303051d..b7f4576382c 100644 --- a/frameworks/Java/wicket/pom.xml +++ b/frameworks/Java/wicket/pom.xml @@ -24,7 +24,7 @@ 11 2.13.0 1.7.25 - 9.18.0 + 9.19.0 From acba140ae014f2a73faeeb30bc302bf7bd183ffb Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 11:46:17 +0800 Subject: [PATCH 1118/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 11 ++++++ .../java/org/smartboot/http/Bootstrap.java | 35 ++++++++++--------- .../org/smartboot/http/FeatController.java | 24 +++++++++++++ 3 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 4fe3e7a155f..ff13a2c7025 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -17,6 +17,11 @@ + + tech.smartboot.feat + feat-restful + 0.5 + io.edap edapx-json @@ -26,6 +31,12 @@ tech.smartboot.servlet servlet-core ${smartservlet.version} + + + tech.smartboot.feat + feat-restful + + com.zaxxer diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 396b6d02900..e7971b1bc39 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -8,12 +8,7 @@ package org.smartboot.http; -import org.smartboot.Message; -import tech.smartboot.feat.core.Feat; -import tech.smartboot.feat.core.common.enums.HeaderValueEnum; -import tech.smartboot.feat.core.server.HttpHandler; -import tech.smartboot.feat.core.server.HttpRequest; -import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.restful.RestFeat; public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); @@ -21,21 +16,27 @@ public class Bootstrap { public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - Feat.createHttpServer(options -> { +// Feat.createHttpServer(options -> { +// options.threadNum(cpuNum + 1) +// .headerLimiter(0) +// .readBufferSize(1024 * 4) +// .writeBufferSize(1024 * 4); +// }).httpHandler(request -> { +// HttpResponse response = request.getResponse(); +// if ("/plaintext".equals(request.getRequestURI())) { +// response.setContentLength(body.length); +// response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); +// response.write(body); +// } else if ("/json".equals(request.getRequestURI())) { +// response.setContentType("application/json"); +// JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); +// } +// }).listen(8080); + RestFeat.createServer(options -> { options.threadNum(cpuNum + 1) .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4); - }).httpHandler(request -> { - HttpResponse response = request.getResponse(); - if ("/plaintext".equals(request.getRequestURI())) { - response.setContentLength(body.length); - response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); - response.write(body); - } else if ("/json".equals(request.getRequestURI())) { - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); - } }).listen(8080); } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java new file mode 100644 index 00000000000..23299a9ffd6 --- /dev/null +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java @@ -0,0 +1,24 @@ +package org.smartboot.http; + +import org.smartboot.Message; +import tech.smartboot.feat.core.apt.annotation.Controller; +import tech.smartboot.feat.core.apt.annotation.RequestMapping; +import tech.smartboot.feat.core.common.enums.HeaderValueEnum; +import tech.smartboot.feat.core.server.HttpResponse; + +@Controller +public class FeatController { + static byte[] body = "Hello, World!".getBytes(); + + @RequestMapping("/plaintext") + public byte[] plaintext(HttpResponse response) { + response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); + return body; + } + + @RequestMapping("/json") + public Message json(HttpResponse response) { + response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); + return new Message("Hello, World!"); + } +} From f56e1eb97acc839608c993d8ee54df79ac37959f Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 12:45:01 +0800 Subject: [PATCH 1119/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/benchmark_config.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Java/smart-socket/benchmark_config.json b/frameworks/Java/smart-socket/benchmark_config.json index 7a26d71ed56..040fb6bdee9 100755 --- a/frameworks/Java/smart-socket/benchmark_config.json +++ b/frameworks/Java/smart-socket/benchmark_config.json @@ -1,5 +1,5 @@ { - "framework": "smart-socket", + "framework": "feat", "tests": [ { "default": { @@ -17,9 +17,9 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "smart-socket", + "display_name": "feat", "notes": "", - "versus": "smart-socket" + "versus": "feat" }, "smart-servlet": { "json_url": "/json", From 6d0fdff37ddd01eb8bce12fb22f524b85a2eb65a Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 12:48:16 +0800 Subject: [PATCH 1120/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java/smart-socket/smart-socket-smart-servlet.dockerfile | 2 +- frameworks/Java/smart-socket/smart-socket.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile index bb0b9258ec4..4a52b4ea7b9 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile @@ -2,7 +2,7 @@ FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src -RUN mvn compile assembly:single -q +RUN mvn install assembly:single -q FROM openjdk:21-jdk-slim WORKDIR /smart-socket diff --git a/frameworks/Java/smart-socket/smart-socket.dockerfile b/frameworks/Java/smart-socket/smart-socket.dockerfile index 4890bd04a06..2ab830f1685 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket.dockerfile @@ -2,7 +2,7 @@ FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src -RUN mvn compile assembly:single -q +RUN mvn install assembly:single -q FROM openjdk:21-jdk-slim WORKDIR /smart-socket From d5ebaf38c746b1c7d0354804cd59446e54b84bdd Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 13:52:51 +0800 Subject: [PATCH 1121/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 22 +++++++++++-------- .../smart-socket-smart-servlet.dockerfile | 4 ++-- .../Java/smart-socket/smart-socket.dockerfile | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index ff13a2c7025..3f01bb7e61f 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -125,20 +125,24 @@ - maven-assembly-plugin - 3.1.0 - - - jar-with-dependencies - - + maven-shade-plugin + 3.3.0 - make-assembly package - single + shade + + false + + + + META-INF/services/tech.smartboot.feat.core.apt.AptLoader + + + diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile index 4a52b4ea7b9..4209283ec42 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile @@ -2,11 +2,11 @@ FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src -RUN mvn install assembly:single -q +RUN mvn install -q 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 +COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0.jar app.jar EXPOSE 8080 diff --git a/frameworks/Java/smart-socket/smart-socket.dockerfile b/frameworks/Java/smart-socket/smart-socket.dockerfile index 2ab830f1685..f7eaec61f67 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket.dockerfile @@ -2,11 +2,11 @@ FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src -RUN mvn install assembly:single -q +RUN mvn install -q 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 +COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0.jar app.jar EXPOSE 8080 From ba1ef1be57e0f4182764364bb2aa25f850d7ffe7 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 13:56:25 +0800 Subject: [PATCH 1122/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smart-socket/{smart-socket.dockerfile => feat.dockerfile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frameworks/Java/smart-socket/{smart-socket.dockerfile => feat.dockerfile} (100%) diff --git a/frameworks/Java/smart-socket/smart-socket.dockerfile b/frameworks/Java/smart-socket/feat.dockerfile similarity index 100% rename from frameworks/Java/smart-socket/smart-socket.dockerfile rename to frameworks/Java/smart-socket/feat.dockerfile From 7a75eb0500ee8f5dea4ffee23b9a357028b6a6b5 Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 13:59:01 +0800 Subject: [PATCH 1123/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/smartboot/http/FeatController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java index 23299a9ffd6..8050de77198 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java @@ -18,7 +18,7 @@ public byte[] plaintext(HttpResponse response) { @RequestMapping("/json") public Message json(HttpResponse response) { - response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); + response.setContentType(HeaderValueEnum.ContentType.APPLICATION_JSON_UTF8); return new Message("Hello, World!"); } } From 71c0570c3d29b42a959ed8c60d3fed934584776f Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 14:03:59 +0800 Subject: [PATCH 1124/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...rt-servlet.dockerfile => feat-socket-smart-servlet.dockerfile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frameworks/Java/smart-socket/{smart-socket-smart-servlet.dockerfile => feat-socket-smart-servlet.dockerfile} (100%) diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/feat-socket-smart-servlet.dockerfile similarity index 100% rename from frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile rename to frameworks/Java/smart-socket/feat-socket-smart-servlet.dockerfile From 80edb0804bb879fa57f33e19be5120680b56929b Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 24 Jan 2025 14:06:42 +0800 Subject: [PATCH 1125/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ket-smart-servlet.dockerfile => feat-smart-servlet.dockerfile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frameworks/Java/smart-socket/{feat-socket-smart-servlet.dockerfile => feat-smart-servlet.dockerfile} (100%) diff --git a/frameworks/Java/smart-socket/feat-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/feat-smart-servlet.dockerfile similarity index 100% rename from frameworks/Java/smart-socket/feat-socket-smart-servlet.dockerfile rename to frameworks/Java/smart-socket/feat-smart-servlet.dockerfile From bb4dc1942814060768c9b25932eeb5700fde3f2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 18:48:26 +0000 Subject: [PATCH 1126/1766] Bump openssl from 0.10.66 to 0.10.70 in /frameworks/Rust/ohkami Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.66 to 0.10.70. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.66...openssl-v0.10.70) --- updated-dependencies: - dependency-name: openssl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/ohkami/Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index e379d121817..6bd6ad3a2a0 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -815,9 +815,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -847,9 +847,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", From afb99e2411541c253021d7e0a6f9ab9c9ab1c0d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:57:30 +0000 Subject: [PATCH 1127/1766] Bump hickory-proto from 0.24.2 to 0.24.3 in /frameworks/Rust/axum Bumps [hickory-proto](https://github.com/hickory-dns/hickory-dns) from 0.24.2 to 0.24.3. - [Release notes](https://github.com/hickory-dns/hickory-dns/releases) - [Changelog](https://github.com/hickory-dns/hickory-dns/blob/v0.24.3/CHANGELOG.md) - [Commits](https://github.com/hickory-dns/hickory-dns/compare/v0.24.2...v0.24.3) --- updated-dependencies: - dependency-name: hickory-proto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/axum/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 7871df00e8c..bdc3610a8a8 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -913,9 +913,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hickory-proto" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" +checksum = "2ad3d6d98c648ed628df039541a5577bee1a7c83e9e16fe3dbedeea4cdfeb971" dependencies = [ "async-trait", "cfg-if", From d8f3437b1f67d4a75102c2ccb7f5e66855c7e57d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:23:27 +0000 Subject: [PATCH 1128/1766] Bump rack from 3.0.11 to 3.0.12 in /frameworks/Ruby/agoo Bumps [rack](https://github.com/rack/rack) from 3.0.11 to 3.0.12. - [Release notes](https://github.com/rack/rack/releases) - [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md) - [Commits](https://github.com/rack/rack/commits/v3.0.12) --- updated-dependencies: - dependency-name: rack dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/agoo/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/agoo/Gemfile.lock b/frameworks/Ruby/agoo/Gemfile.lock index 8df20e4179a..62b47ca4908 100644 --- a/frameworks/Ruby/agoo/Gemfile.lock +++ b/frameworks/Ruby/agoo/Gemfile.lock @@ -7,7 +7,7 @@ GEM oj (3.16.3) bigdecimal (>= 3.0) pg (1.5.6) - rack (3.0.11) + rack (3.0.12) PLATFORMS ruby From c628260e8d900ba9a4b528bd9a43d5b316f96d7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:01:07 +0000 Subject: [PATCH 1129/1766] Bump nokogiri from 1.16.8 to 1.18.3 in /frameworks/Ruby/rails Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.16.8 to 1.18.3. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.18.3/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.16.8...v1.18.3) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 18ecc70ac8e..55bf64ccc9d 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -167,12 +167,12 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.4) - nokogiri (1.16.8) + nokogiri (1.18.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.8-x86_64-darwin) + nokogiri (1.18.3-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.8-x86_64-linux) + nokogiri (1.18.3-x86_64-linux-gnu) racc (~> 1.4) openssl (3.2.0) pg (1.5.9) From 1faf8fc2560ce53a761ca33575a8d07f2e7ac2a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:18:30 +0000 Subject: [PATCH 1130/1766] Bump rack from 3.1.8 to 3.1.10 in /frameworks/Ruby/rails Bumps [rack](https://github.com/rack/rack) from 3.1.8 to 3.1.10. - [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.1.8...v3.1.10) --- updated-dependencies: - dependency-name: rack 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 55bf64ccc9d..171277b6ba7 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -197,7 +197,7 @@ GEM puma (6.5.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.8) + rack (3.1.10) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) From 3c6f4e91c16eaf28738d59b2eda4c094857a2d30 Mon Sep 17 00:00:00 2001 From: Aavesh Date: Fri, 21 Feb 2025 02:03:34 +0530 Subject: [PATCH 1131/1766] Add Aroma.js to benchmarks --- frameworks/JavaScript/aroma.js/README.md | 27 ++++++++++++++ frameworks/JavaScript/aroma.js/app.js | 36 +++++++++++++++++++ .../JavaScript/aroma.js/aroma.js.dockerfile | 11 ++++++ .../JavaScript/aroma.js/benchmark_config.json | 21 +++++++++++ frameworks/JavaScript/aroma.js/config.toml | 13 +++++++ frameworks/JavaScript/aroma.js/package.json | 8 +++++ 6 files changed, 116 insertions(+) create mode 100644 frameworks/JavaScript/aroma.js/README.md create mode 100644 frameworks/JavaScript/aroma.js/app.js create mode 100644 frameworks/JavaScript/aroma.js/aroma.js.dockerfile create mode 100644 frameworks/JavaScript/aroma.js/benchmark_config.json create mode 100644 frameworks/JavaScript/aroma.js/config.toml create mode 100644 frameworks/JavaScript/aroma.js/package.json diff --git a/frameworks/JavaScript/aroma.js/README.md b/frameworks/JavaScript/aroma.js/README.md new file mode 100644 index 00000000000..2f817acdeca --- /dev/null +++ b/frameworks/JavaScript/aroma.js/README.md @@ -0,0 +1,27 @@ +# Aroma.js Benchmarking Test + +From [aromajs.suasive.in](https://aromajs.susasive.in): + +> Aroma.js is a lightweight, feature-rich, and developer-friendly web framework designed to build modern web applications with ease. It provides essential features like routing, middleware, session management, cookie handling, template rendering, static file serving, and more. With its simple API, it enables rapid development of web applications with flexibility. + +### Test Type Implementation Source Code + +- [JSON](app.js) +- [PLAINTEXT](app.js) + +## Important Libraries + +The tests were run with: + +- [Aroma.js](https://aromajs.susasive.in/) +- [NodeJS](https://nodejs.org/en/) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/JavaScript/aroma.js/app.js b/frameworks/JavaScript/aroma.js/app.js new file mode 100644 index 00000000000..414af881bfa --- /dev/null +++ b/frameworks/JavaScript/aroma.js/app.js @@ -0,0 +1,36 @@ + +const cluster = require('cluster'), + numCPUs = require('os').cpus().length, + Aroma = require('aroma.js'); + + +if (cluster.isPrimary) { + console.log(`Primary ${process.pid} is running`); + + for (let i = 0; i < numCPUs; i++) { + cluster.fork(); + } + + cluster.on('exit', (worker, code, signal) => { + console.log(`worker ${worker.process.pid} died`); + }); +} else { + const app = module.exports = new Aroma(); + + app.parseUrlEncoded(); + + app.use((req, res, next) => { + res.setHeader("Server", "Aroma.js"); + return next(); + }); + + app.get('/json', (req, res) => res.send({ message: 'Hello, World!' })); + + app.get('/plaintext', (req, res) => { + res.setHeader('Content-Type', 'text/plain'); + res.send('Hello, World!'); + }); + + + app.listen(8080); +} diff --git a/frameworks/JavaScript/aroma.js/aroma.js.dockerfile b/frameworks/JavaScript/aroma.js/aroma.js.dockerfile new file mode 100644 index 00000000000..ec726dd2800 --- /dev/null +++ b/frameworks/JavaScript/aroma.js/aroma.js.dockerfile @@ -0,0 +1,11 @@ +FROM node:20.16-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production + +EXPOSE 8080 + +CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/aroma.js/benchmark_config.json b/frameworks/JavaScript/aroma.js/benchmark_config.json new file mode 100644 index 00000000000..5d5a3fdaa62 --- /dev/null +++ b/frameworks/JavaScript/aroma.js/benchmark_config.json @@ -0,0 +1,21 @@ +{ + "framework": "aroma.js", + "tests": [{ + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "aroma.js", + "language": "JavaScript", + "flavor": "NodeJS", + "platform": "nodejs", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "aroma.js", + "versus": "nodejs" + } + }] + } \ No newline at end of file diff --git a/frameworks/JavaScript/aroma.js/config.toml b/frameworks/JavaScript/aroma.js/config.toml new file mode 100644 index 00000000000..b7c4320a60c --- /dev/null +++ b/frameworks/JavaScript/aroma.js/config.toml @@ -0,0 +1,13 @@ +[framework] +name = "aroma.js" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database_os = "Linux" +os = "Linux" +platform = "nodejs" +webserver = "None" +versus = "nodejs" diff --git a/frameworks/JavaScript/aroma.js/package.json b/frameworks/JavaScript/aroma.js/package.json new file mode 100644 index 00000000000..4f9d2856a44 --- /dev/null +++ b/frameworks/JavaScript/aroma.js/package.json @@ -0,0 +1,8 @@ +{ + "name": "aroma.js", + "dependencies": { + "aroma.js": "1.0.8" + }, + "main": "app.js" + } + \ No newline at end of file From e850e8236b367182419728e632138df6f976bd2d Mon Sep 17 00:00:00 2001 From: Aavesh Jilani <50949867+aaveshdev@users.noreply.github.com> Date: Fri, 21 Feb 2025 02:08:07 +0530 Subject: [PATCH 1132/1766] Link updated --- frameworks/JavaScript/aroma.js/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/JavaScript/aroma.js/README.md b/frameworks/JavaScript/aroma.js/README.md index 2f817acdeca..bb6bf459015 100644 --- a/frameworks/JavaScript/aroma.js/README.md +++ b/frameworks/JavaScript/aroma.js/README.md @@ -1,6 +1,6 @@ # Aroma.js Benchmarking Test -From [aromajs.suasive.in](https://aromajs.susasive.in): +From [aromajs.suasive.in](https://aromajs.suasive.in): > Aroma.js is a lightweight, feature-rich, and developer-friendly web framework designed to build modern web applications with ease. It provides essential features like routing, middleware, session management, cookie handling, template rendering, static file serving, and more. With its simple API, it enables rapid development of web applications with flexibility. @@ -13,7 +13,7 @@ From [aromajs.suasive.in](https://aromajs.susasive.in): The tests were run with: -- [Aroma.js](https://aromajs.susasive.in/) +- [Aroma.js](https://aromajs.suasive.in/) - [NodeJS](https://nodejs.org/en/) ## Test URLs From b51bf54f6eb519c2d3e8e89fddc6a33fa1dc8739 Mon Sep 17 00:00:00 2001 From: Aavesh Jilani <50949867+aaveshdev@users.noreply.github.com> Date: Tue, 25 Feb 2025 02:18:10 +0530 Subject: [PATCH 1133/1766] Aroma.js website link update --- frameworks/JavaScript/aroma.js/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/JavaScript/aroma.js/README.md b/frameworks/JavaScript/aroma.js/README.md index bb6bf459015..927f8006851 100644 --- a/frameworks/JavaScript/aroma.js/README.md +++ b/frameworks/JavaScript/aroma.js/README.md @@ -1,6 +1,6 @@ # Aroma.js Benchmarking Test -From [aromajs.suasive.in](https://aromajs.suasive.in): +From [aroma.js.org](https://aroma.js.org): > Aroma.js is a lightweight, feature-rich, and developer-friendly web framework designed to build modern web applications with ease. It provides essential features like routing, middleware, session management, cookie handling, template rendering, static file serving, and more. With its simple API, it enables rapid development of web applications with flexibility. @@ -13,7 +13,7 @@ From [aromajs.suasive.in](https://aromajs.suasive.in): The tests were run with: -- [Aroma.js](https://aromajs.suasive.in/) +- [Aroma.js](https://aroma.js.org/) - [NodeJS](https://nodejs.org/en/) ## Test URLs From 297d997e9feafe91e0b04dc6624250ccab095a5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 20:50:45 +0000 Subject: [PATCH 1134/1766] Bump passenger from 6.0.23 to 6.0.26 in /frameworks/Ruby/rack-sequel Bumps [passenger](https://github.com/phusion/passenger) from 6.0.23 to 6.0.26. - [Release notes](https://github.com/phusion/passenger/releases) - [Changelog](https://github.com/phusion/passenger/blob/stable-6.0/CHANGELOG) - [Commits](https://github.com/phusion/passenger/compare/release-6.0.23...release-6.0.26) --- updated-dependencies: - dependency-name: passenger dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rack-sequel/Gemfile.lock | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 77bdf0415e0..3d02b26b0ab 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -7,17 +7,16 @@ GEM kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.23) + passenger (6.0.26) rack (>= 1.6.13) - rackup + rackup (>= 2.0.0) rake (>= 12.3.3) pg (1.5.8) puma (6.5.0) nio4r (~> 2.0) rack (3.1.8) - rackup (2.1.0) + rackup (2.2.1) rack (>= 3) - webrick (~> 1.8) raindrops (0.20.1) rake (13.2.1) sequel (5.85.0) @@ -28,7 +27,6 @@ GEM unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) - webrick (1.8.2) PLATFORMS ruby From 43aa5def75c8186c9f84f12e892076aa18036dc1 Mon Sep 17 00:00:00 2001 From: litongjava Date: Wed, 26 Feb 2025 23:40:20 -1000 Subject: [PATCH 1135/1766] update tio-http-server version --- frameworks/Java/tio-http-server/pom.xml | 14 ++------- .../litongjava/tio/http/server/MainApp.java | 14 +++++++-- .../server/controller/CacheController.java | 6 ++-- .../http/server/controller/DbController.java | 21 ++++++------- .../http/server/utils/BeanConverterUtils.java | 31 ------------------- .../tio-http-server/tio-server.dockerfile | 2 +- 6 files changed, 27 insertions(+), 61 deletions(-) delete mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index 2b16997b60e..90491999dc3 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -16,12 +16,12 @@ com.litongjava tio-http-server - 3.7.3.v20240919-RELEASE + 3.7.3.v20250301-RELEASE com.litongjava java-db - 1.2.6 + 1.4.9 junit @@ -31,16 +31,6 @@ - - - - com.alibaba.fastjson2 fastjson2 diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java index 43a6bfc5804..6de2f4cbedb 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java @@ -9,7 +9,7 @@ import com.litongjava.tio.http.server.controller.DbController; import com.litongjava.tio.http.server.controller.IndexController; import com.litongjava.tio.http.server.handler.DefaultHttpRequestDispatcher; -import com.litongjava.tio.http.server.router.DefaultHttpReqeustRouter; +import com.litongjava.tio.http.server.router.DefaultHttpRequestRouter; import com.litongjava.tio.http.server.router.HttpRequestRouter; import com.litongjava.tio.server.ServerTioConfig; import com.litongjava.tio.utils.environment.EnvUtils; @@ -18,11 +18,12 @@ public class MainApp { public static void main(String[] args) { long start = System.currentTimeMillis(); + EnvUtils.buildCmdArgsMap(args); EnvUtils.load(); // add route IndexController controller = new IndexController(); - HttpRequestRouter simpleHttpRoutes = new DefaultHttpReqeustRouter(); + HttpRequestRouter simpleHttpRoutes = new DefaultHttpRequestRouter(); simpleHttpRoutes.add("/", controller::index); simpleHttpRoutes.add("/plaintext", controller::plaintext); simpleHttpRoutes.add("/json", controller::json); @@ -49,9 +50,16 @@ public static void main(String[] args) { // close Heartbeat serverTioConfig.setHeartbeatTimeout(0); serverTioConfig.statOn = false; + boolean db = EnvUtils.getBoolean("db", true); + if (db) { + try { + new MysqlDbConfig().init(); + } catch (Exception e) { + e.printStackTrace(); + } + } // start server try { - new MysqlDbConfig().init(); new EnjoyEngineConfig().engine(); new EhCachePluginConfig().ehCachePlugin(); httpServerStarter.start(); diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java index 6ecd7664ac1..ef48b3990db 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java @@ -7,7 +7,7 @@ import com.alibaba.fastjson2.JSON; import com.litongjava.db.activerecord.Db; -import com.litongjava.db.activerecord.Record; +import com.litongjava.db.activerecord.Row; import com.litongjava.tio.http.common.HeaderName; import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; @@ -24,7 +24,7 @@ public HttpResponse cachedQuery(HttpRequest request) { .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 .mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象 .filter(Objects::nonNull) // 过滤掉 null 值 - .map(Record::toMap) // 将每个 Record 对象转换为 Map + .map(Row::toMap) // 将每个 Record 对象转换为 Map .collect(Collectors.toList()); // 收集到 List HttpResponse httpResponse = new HttpResponse(request); @@ -34,7 +34,7 @@ public HttpResponse cachedQuery(HttpRequest request) { } - private Record findByIdWithCache(String tableName, int id) { + private Row findByIdWithCache(String tableName, int id) { String sql = "SELECT id, randomNumber FROM world WHERE id = ?"; return Db.findFirstByCache(tableName, id, sql, id); } diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java index 699b313bd69..782543a81e0 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java @@ -12,15 +12,14 @@ import com.jfinal.template.Engine; import com.jfinal.template.Template; import com.litongjava.db.activerecord.Db; -import com.litongjava.db.activerecord.Record; -import com.litongjava.ehcache.EhCache; +import com.litongjava.db.activerecord.Row; +import com.litongjava.ehcache.EhCacheKit; import com.litongjava.tio.http.common.HeaderName; import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; import com.litongjava.tio.http.common.HttpResponse; import com.litongjava.tio.http.server.model.Fortune; import com.litongjava.tio.http.server.util.Resps; -import com.litongjava.tio.http.server.utils.BeanConverterUtils; import com.litongjava.tio.http.server.utils.RandomUtils; public class DbController { @@ -37,7 +36,7 @@ public HttpResponse db(HttpRequest request) { // int id = 11; // String sql="SELECT id, randomNumber FROM world WHERE id = ?"; - Record recored = Db.findById("world", id); + Row recored = Db.findById("world", id); if (recored != null) { httpResponse.setBody(JSON.toJSONBytes(recored.toMap())); } else { @@ -57,7 +56,7 @@ public HttpResponse queries(HttpRequest request) { .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 .mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象 .filter(Objects::nonNull) // 过滤掉 null 值 - .map(Record::toMap) // 将每个 Record 对象转换为 Map + .map(Row::toMap) // 将每个 Record 对象转换为 Map .collect(Collectors.toList()); // 收集到 List HttpResponse httpResponse = new HttpResponse(request); @@ -66,11 +65,11 @@ public HttpResponse queries(HttpRequest request) { return httpResponse; } -//@GetMapping("/updates") + //@GetMapping("/updates") public HttpResponse updates(HttpRequest request) { String queries = request.getParam("queries"); - EhCache.removeAll("world"); + EhCacheKit.removeAll("world"); List> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers // limit @@ -90,7 +89,7 @@ public HttpResponse updates(HttpRequest request) { return record; }) // tomap - .map(Record::toMap) + .map(Row::toMap) // to List .collect(Collectors.toList()); @@ -101,11 +100,11 @@ public HttpResponse updates(HttpRequest request) { } public HttpResponse fortunes(HttpRequest request) throws IllegalAccessException, InstantiationException { - List records = Db.find("SELECT * FROM fortune"); + List records = Db.find("SELECT * FROM fortune"); List fortunes = new ArrayList<>(records.size()); - for (Record record : records) { - fortunes.add(BeanConverterUtils.toBean(record.toMap(), Fortune.class)); + for (Row record : records) { + fortunes.add(record.toBean(Fortune.class)); } // 添加额外的 Fortune fortunes.add(new Fortune(0L, "Additional fortune added at request time.")); diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java deleted file mode 100644 index 11796feeb0f..00000000000 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.litongjava.tio.http.server.utils; - -import java.lang.reflect.Field; -import java.util.Map; - -public class BeanConverterUtils { - - /** - * Map to to bean - */ - public static T toBean(Map map, Class beanClass) - throws IllegalAccessException, InstantiationException { - - T bean = beanClass.newInstance(); // 创建 Bean 的实例 - - for (Field field : beanClass.getDeclaredFields()) { - field.setAccessible(true); // 确保私有字段也可以访问 - - if (map.containsKey(field.getName())) { - Object value = map.get(field.getName()); - - // 如果字段类型与值类型兼容,则设置字段的值 - if (value != null && field.getType().isAssignableFrom(value.getClass())) { - field.set(bean, value); - } - } - } - - return bean; - } -} diff --git a/frameworks/Java/tio-http-server/tio-server.dockerfile b/frameworks/Java/tio-http-server/tio-server.dockerfile index e9218a84790..ace1322452b 100644 --- a/frameworks/Java/tio-http-server/tio-server.dockerfile +++ b/frameworks/Java/tio-http-server/tio-server.dockerfile @@ -16,4 +16,4 @@ COPY --from=builder /app/target/tio-http-server-benchmark-1.0.jar /app/target/ti EXPOSE 8080 -CMD ["java","-jar", "/app/target/tio-http-server-benchmark-1.0.jar"] \ No newline at end of file +CMD ["java", "-Xms1G", "-Xmx1G", "-XX:+UseNUMA", "-XX:+UseParallelGC","-jar", "/app/target/tio-http-server-benchmark-1.0.jar"] \ No newline at end of file From c74898b37398b740a324077b56c9285c8a752d41 Mon Sep 17 00:00:00 2001 From: litongjava Date: Wed, 26 Feb 2025 23:49:36 -1000 Subject: [PATCH 1136/1766] update dockerfile --- frameworks/Java/tio-http-server/pom.xml | 201 ++++++------------ .../tio-http-server/tio-server.dockerfile | 5 +- 2 files changed, 65 insertions(+), 141 deletions(-) diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index 90491999dc3..080b11956ff 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -56,144 +56,67 @@ - - - - development - - true - - - - ch.qos.logback - logback-classic - 1.2.13 - - - + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + - - - production - - - ch.qos.logback - logback-classic - 1.2.13 - - - - - - org.springframework.boot - spring-boot-maven-plugin - 2.7.4 - - ${main.class} - org.projectlombok - - - - - - repackage - - - - - - - - - - assembly - - - ch.qos.logback - logback-classic - 1.2.13 - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.1 - - - - ${main.class} - - - - jar-with-dependencies - - false - - - - make-assembly - package - - single - - - - - - - - - native - - - - org.slf4j - slf4j-jdk14 - 1.7.31 - - - - org.graalvm.sdk - graal-sdk - ${graalvm.version} - provided - - - - ${project.artifactId} - - - org.graalvm.nativeimage - native-image-maven-plugin - 21.2.0 - - - - native-image - - package - - - - false - ${project.artifactId} - ${main.class} - - -H:+RemoveSaturatedTypeFlows - --allow-incomplete-classpath - --no-fallback - - - - - - - + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + false + + + + + maven-assembly-plugin + 3.1.0 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + +
      +
      \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/tio-server.dockerfile b/frameworks/Java/tio-http-server/tio-server.dockerfile index ace1322452b..4dbaf2afaa8 100644 --- a/frameworks/Java/tio-http-server/tio-server.dockerfile +++ b/frameworks/Java/tio-http-server/tio-server.dockerfile @@ -12,8 +12,9 @@ FROM litongjava/jre:8u391-stable-slim WORKDIR /app -COPY --from=builder /app/target/tio-http-server-benchmark-1.0.jar /app/target/tio-http-server-benchmark-1.0.jar +COPY --from=builder /app/target/tio-http-server-benchmark-1.0-jar-with-dependencies.jar /app/tio-http-server-benchmark-1.0.jar EXPOSE 8080 -CMD ["java", "-Xms1G", "-Xmx1G", "-XX:+UseNUMA", "-XX:+UseParallelGC","-jar", "/app/target/tio-http-server-benchmark-1.0.jar"] \ No newline at end of file +# java --server -XX:+UseNUMA XX:+UseParallelGC -cp target/tio-http-server-benchmark-1.0-jar-with-dependencies.jar com.litongjava.tio.http.server.MainApp +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC","-cp", "/app/tio-http-server-benchmark-1.0.jar","com.litongjava.tio.http.server.MainApp"] \ No newline at end of file From 4efc70d297efb750ce6fbeb8563da347de06784c Mon Sep 17 00:00:00 2001 From: litongjava Date: Thu, 27 Feb 2025 09:38:18 -1000 Subject: [PATCH 1137/1766] add tio-boot --- frameworks/Java/tio-boot/.dockerignore | 19 ++ frameworks/Java/tio-boot/.gitignore | 3 + frameworks/Java/tio-boot/README.md | 114 +++++++++ .../Java/tio-boot/api/tio-server-benchmark.md | 227 ++++++++++++++++++ .../Java/tio-boot/benchmark_config.json | 29 +++ frameworks/Java/tio-boot/config.toml | 19 ++ frameworks/Java/tio-boot/pom.xml | 126 ++++++++++ .../litongjava/tio/http/server/MainApp.java | 13 + .../tio/http/server/MainAppConfig.java | 54 +++++ .../server/config/EhCachePluginConfig.java | 12 + .../http/server/config/EnjoyEngineConfig.java | 22 ++ .../tio/http/server/config/MysqlDbConfig.java | 31 +++ .../http/server/controller/CacheHandler.java | 41 ++++ .../tio/http/server/controller/DbHandler.java | 126 ++++++++++ .../http/server/controller/IndexHandler.java | 40 +++ .../tio/http/server/model/Fortune.java | 23 ++ .../tio/http/server/model/Message.java | 12 + .../tio/http/server/model/World.java | 32 +++ .../tio/http/server/services/CacheName.java | 50 ++++ .../server/services/CacheNameService.java | 17 ++ .../tio/http/server/utils/RandomUtils.java | 36 +++ .../src/main/resources/app.properties | 9 + .../tio-boot/src/main/resources/ehcache.xml | 9 + .../tio-boot/src/main/resources/logback.xml | 52 ++++ .../main/resources/templates/fortunes.html | 20 ++ .../tio/http/server/MainAppTest.java | 15 ++ .../Java/tio-boot/tio-server.dockerfile | 20 ++ 27 files changed, 1171 insertions(+) create mode 100644 frameworks/Java/tio-boot/.dockerignore create mode 100644 frameworks/Java/tio-boot/.gitignore create mode 100644 frameworks/Java/tio-boot/README.md create mode 100644 frameworks/Java/tio-boot/api/tio-server-benchmark.md create mode 100644 frameworks/Java/tio-boot/benchmark_config.json create mode 100644 frameworks/Java/tio-boot/config.toml create mode 100644 frameworks/Java/tio-boot/pom.xml create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java create mode 100644 frameworks/Java/tio-boot/src/main/resources/app.properties create mode 100644 frameworks/Java/tio-boot/src/main/resources/ehcache.xml create mode 100644 frameworks/Java/tio-boot/src/main/resources/logback.xml create mode 100644 frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html create mode 100644 frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java create mode 100644 frameworks/Java/tio-boot/tio-server.dockerfile diff --git a/frameworks/Java/tio-boot/.dockerignore b/frameworks/Java/tio-boot/.dockerignore new file mode 100644 index 00000000000..cba5dfe3c3b --- /dev/null +++ b/frameworks/Java/tio-boot/.dockerignore @@ -0,0 +1,19 @@ +.github +.git +.DS_Store +docs +kubernetes +node_modules +/.svelte-kit +/package +.env +.env.* +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +__pycache__ +.env +_old +uploads +.ipynb_checkpoints +**/*.db +_test \ No newline at end of file diff --git a/frameworks/Java/tio-boot/.gitignore b/frameworks/Java/tio-boot/.gitignore new file mode 100644 index 00000000000..2f089945614 --- /dev/null +++ b/frameworks/Java/tio-boot/.gitignore @@ -0,0 +1,3 @@ +/target/ +logs +.settings \ No newline at end of file diff --git a/frameworks/Java/tio-boot/README.md b/frameworks/Java/tio-boot/README.md new file mode 100644 index 00000000000..bb1539e7db1 --- /dev/null +++ b/frameworks/Java/tio-boot/README.md @@ -0,0 +1,114 @@ +# t-io Benchmarking Test + +This is the tio-server portion of a [benchmarking test suite](../) comparing a variety of web development platforms. + +## Controller + +These implementations use the tio-server's controller. + +### Plaintext Test + +* [Plaintext test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + +### JSON Serialization Test + +* [JSON test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + +### Database Query Test + +* [Database Query test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Database Queries Test + +* [Database Queries test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Database Update Test + +* [Database Update test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Template rendering Test + +* [Template rendering test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Cache Query Test +* [Cache query test source](src/main/java/com/litongjava/tio/http/server/controller/CacheController.java)) + + +## Versions +3.7.3.v20231218-RELEASE (https://gitee.com/litongjava/t-io) + +## Test URLs + +All implementations use the same URLs. + +### Plaintext Test + + http://localhost:8080/plaintext + +### JSON Encoding Test + + http://localhost:8080/json + +### Database Query Test + + http://localhost:8080/db + +### Database Queries Test + + http://localhost:8080/queries?queries=5 + +### Cache Query Test + + http://localhost:8080/cacheQuery?queries=10000 + +### Template rendering Test + + http://localhost:8080/fortunes + +### Database Update Test + + http://localhost:8080/updates?queries=5 + + ## Hot to run + ### install mysql 8 + - 1.please instal mysql 8.0.32,example cmd + ``` + docker run --restart=always -d --name mysql_8 --hostname mysql \ +-p 3306:3306 \ +-e 'MYSQL_ROOT_PASSWORD=robot_123456#' -e 'MYSQL_ROOT_HOST=%' -e 'MYSQL_DATABASE=hello_world' \ +mysql/mysql-server:8.0.32 \ +--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1 + ``` + - 2.create database schema hello_world + - 3.create tablle,[example](sql/hello_world.sql) + - 4.import data + + ### docker + ``` + docker build -t tio-server-benchmark -f tio-server.dockerfile . +``` +The run is to specify the mysql database +``` +docker run --rm -p 8080:8080 \ +-e JDBC_URL="jdbc:mysql://192.168.3.9/hello_world" \ +-e JDBC_USER="root" \ +-e JDBC_PSWD="robot_123456#" \ +tio-server-benchmark +``` + +### windows + +-windows +``` +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar --JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false --JDBC_USER=root --JDBC_PSWD=robot_123456# +``` +or +``` +set JDBC_URL=jdbc:mysql://192.168.3.9/hello_world +set jdbc.user=root +set JDBC_PSWD=robot_123456# +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar +``` + + + diff --git a/frameworks/Java/tio-boot/api/tio-server-benchmark.md b/frameworks/Java/tio-boot/api/tio-server-benchmark.md new file mode 100644 index 00000000000..1d302df2d5d --- /dev/null +++ b/frameworks/Java/tio-boot/api/tio-server-benchmark.md @@ -0,0 +1,227 @@ +--- +title: tio-server-benchmark v1.0.0 +language_tabs: + - shell: Shell + - http: HTTP + - javascript: JavaScript + - ruby: Ruby + - python: Python + - php: PHP + - java: Java + - go: Go +toc_footers: [] +includes: [] +search: true +code_clipboard: true +highlight_theme: darkula +headingLevel: 2 +generator: "@tarslib/widdershins v4.0.17" + +--- + +# tio-server-benchmark + +> v1.0.0 + +Base URLs: + +# Authentication + +# Default + +## GET plaintext + +GET /plaintext + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET json + +GET /json + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET db + +GET /db + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|id|query|string| 否 |none| + +> 返回示例 + +> 200 Response + +```json +{ + "id": 0, + "randomNumber": 0 +} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|true|none||none| +|» randomNumber|integer|true|none||none| + +## GET updates + +GET /updates + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|queries|query|string| 否 |none| + +> 返回示例 + +> 成功 + +```json +[ + { + "id": 28, + "randomNumber": 5399, + "randomnumber": 1498 + } +] +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|false|none||none| +|» randomNumber|integer|false|none||none| +|» randomnumber|integer|false|none||none| + +## GET fortunes + +GET /fortunes + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET cacheQuery + +GET /cacheQuery + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|queries|query|string| 否 |none| + +> 返回示例 + +> 200 Response + +```json +[ + { + "id": 0, + "randomNumber": 0 + } +] +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|false|none||none| +|» randomNumber|integer|false|none||none| + +## GET cacheList + +GET /cacheList + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +# 数据模型 + diff --git a/frameworks/Java/tio-boot/benchmark_config.json b/frameworks/Java/tio-boot/benchmark_config.json new file mode 100644 index 00000000000..c1121359569 --- /dev/null +++ b/frameworks/Java/tio-boot/benchmark_config.json @@ -0,0 +1,29 @@ +{ + "framework": "tio-boot", + "tests": [{ + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "cached_query_url" : "/cachedQuery?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "MySQL", + "framework": "tio-boot", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "t-io", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "tio-boot", + "notes": "tio-boot", + "versus": "t-io" + } + }] +} diff --git a/frameworks/Java/tio-boot/config.toml b/frameworks/Java/tio-boot/config.toml new file mode 100644 index 00000000000..93dddb241c9 --- /dev/null +++ b/frameworks/Java/tio-boot/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "t-io" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cachedQuery?queries=" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "t-io" +webserver = "None" +versus = "t-io" diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml new file mode 100644 index 00000000000..668d7ea5c01 --- /dev/null +++ b/frameworks/Java/tio-boot/pom.xml @@ -0,0 +1,126 @@ + + 4.0.0 + com.litongjava + tio-boot-benchmark + 1.0 + ${project.artifactId} + + UTF-8 + 1.8 + ${java.version} + ${java.version} + 1.9.1 + + com.litongjava.tio.http.server.MainApp + + + + + com.litongjava + tio-boot + ${tio-boot.version} + + + com.litongjava + java-db + 1.4.9 + + + junit + junit + 4.12 + test + + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.52 + + + + net.sf.ehcache + ehcache-core + 2.6.11 + + + + mysql + mysql-connector-java + 5.1.46 + + + + com.zaxxer + HikariCP + 4.0.3 + + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + false + + + + + maven-assembly-plugin + 3.1.0 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java new file mode 100644 index 00000000000..5fb25eb411f --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java @@ -0,0 +1,13 @@ +package com.litongjava.tio.http.server; + +import com.litongjava.tio.boot.TioApplication; + +public class MainApp { + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + TioApplication.run(MainApp.class, new MainAppConfig(), args); + long end = System.currentTimeMillis(); + System.out.println((end - start) + "ms"); + } +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java new file mode 100644 index 00000000000..8f9472597c1 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java @@ -0,0 +1,54 @@ +package com.litongjava.tio.http.server; + +import com.litongjava.context.BootConfiguration; +import com.litongjava.tio.boot.server.TioBootServer; +import com.litongjava.tio.http.server.config.EhCachePluginConfig; +import com.litongjava.tio.http.server.config.EnjoyEngineConfig; +import com.litongjava.tio.http.server.config.MysqlDbConfig; +import com.litongjava.tio.http.server.controller.CacheHandler; +import com.litongjava.tio.http.server.controller.DbHandler; +import com.litongjava.tio.http.server.controller.IndexHandler; +import com.litongjava.tio.http.server.router.HttpRequestRouter; +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MainAppConfig implements BootConfiguration { + + @Override + public void config() throws Exception { + // add route + IndexHandler controller = new IndexHandler(); + + TioBootServer server = TioBootServer.me(); + HttpRequestRouter requestRouter = server.getRequestRouter(); + + requestRouter.add("/", controller::index); + requestRouter.add("/plaintext", controller::plaintext); + requestRouter.add("/json", controller::json); + + DbHandler dbQueryController = new DbHandler(); + requestRouter.add("/db", dbQueryController::db); + requestRouter.add("/queries", dbQueryController::queries); + requestRouter.add("/updates", dbQueryController::updates); + requestRouter.add("/fortunes", dbQueryController::fortunes); + + CacheHandler cacheController = new CacheHandler(); + requestRouter.add("/cachedQuery", cacheController::cachedQuery); + + boolean db = EnvUtils.getBoolean("db", true); + if (db) { + try { + new MysqlDbConfig().init(); + } catch (Exception e) { + e.printStackTrace(); + } + } + // start enjoy and ehcache + try { + new EnjoyEngineConfig().engine(); + new EhCachePluginConfig().ehCachePlugin(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java new file mode 100644 index 00000000000..f949432cd5b --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java @@ -0,0 +1,12 @@ + package com.litongjava.tio.http.server.config; + +import com.litongjava.ehcache.EhCachePlugin; + +public class EhCachePluginConfig { + + public EhCachePlugin ehCachePlugin() { + EhCachePlugin ehCachePlugin = new EhCachePlugin(); + ehCachePlugin.start(); + return ehCachePlugin; + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java new file mode 100644 index 00000000000..b40c74c448d --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java @@ -0,0 +1,22 @@ +package com.litongjava.tio.http.server.config; + +import com.jfinal.template.Engine; + +public class EnjoyEngineConfig { + + private final String RESOURCE_BASE_PATH = "/templates/"; + + public Engine engine() { + Engine engine = Engine.use(); + engine.setBaseTemplatePath(RESOURCE_BASE_PATH); + engine.setToClassPathSourceFactory(); + // 支持模板热加载,绝大多数生产环境下也建议配置成 true,除非是极端高性能的场景 + // engine.setDevMode(true); + // 配置极速模式,性能提升 13% + Engine.setFastMode(true); + // jfinal 4.9.02 新增配置:支持中文表达式、中文变量名、中文方法名、中文模板函数名 + Engine.setChineseExpression(true); + return engine; + } + +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java new file mode 100644 index 00000000000..8a547854783 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java @@ -0,0 +1,31 @@ +package com.litongjava.tio.http.server.config; + +import com.litongjava.db.activerecord.ActiveRecordPlugin; +import com.litongjava.db.activerecord.OrderedFieldContainerFactory; +import com.litongjava.db.hikaricp.HikariCpPlugin; +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MysqlDbConfig { + + public void init() { + // start active recored + String jdbcUrl = EnvUtils.get("JDBC_URL"); + // String jdbcUrl = "jdbc:mysql://192.168.3.9/hello_world"; + + String jdbcUser = EnvUtils.get("JDBC_USER"); + // String jdbcUser = "root"; + + String jdbcPswd = EnvUtils.get("JDBC_PSWD"); + // String jdbcPswd = "robot_123456#"; + HikariCpPlugin hikariCpPlugin = new HikariCpPlugin(jdbcUrl, jdbcUser, jdbcPswd); + + ActiveRecordPlugin arp = new ActiveRecordPlugin(hikariCpPlugin); + arp.setContainerFactory(new OrderedFieldContainerFactory()); + + // arp.setShowSql(true); + + hikariCpPlugin.start(); + boolean start = arp.start(); + System.out.println("db started:" + start); + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java new file mode 100644 index 00000000000..d3546c09111 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java @@ -0,0 +1,41 @@ +package com.litongjava.tio.http.server.controller; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.fastjson2.JSON; +import com.litongjava.db.activerecord.Db; +import com.litongjava.db.activerecord.Row; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.utils.RandomUtils; + +public class CacheHandler { + // private Logger log = LoggerFactory.getLogger(this.getClass()); + + public HttpResponse cachedQuery(HttpRequest request) { + String queries = request.getParam("queries"); + List> recordMaps = RandomUtils.randomWorldNumbers() + // limit + .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 + .mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象 + .filter(Objects::nonNull) // 过滤掉 null 值 + .map(Row::toMap) // 将每个 Record 对象转换为 Map + .collect(Collectors.toList()); // 收集到 List + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(recordMaps)); + return httpResponse; + + } + + private Row findByIdWithCache(String tableName, int id) { + String sql = "SELECT id, randomNumber FROM world WHERE id = ?"; + return Db.findFirstByCache(tableName, id, sql, id); + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java new file mode 100644 index 00000000000..a7a127795ec --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java @@ -0,0 +1,126 @@ +package com.litongjava.tio.http.server.controller; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.fastjson2.JSON; +import com.jfinal.template.Engine; +import com.jfinal.template.Template; +import com.litongjava.db.activerecord.Db; +import com.litongjava.db.activerecord.Row; +import com.litongjava.ehcache.EhCacheKit; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.model.Fortune; +import com.litongjava.tio.http.server.util.Resps; +import com.litongjava.tio.http.server.utils.RandomUtils; + +public class DbHandler { + + public HttpResponse db(HttpRequest request) { + Integer id = request.getInt("id"); + if (id == null) { + id = RandomUtils.randomWorldNumber(); + } + + //System.out.println("id:" + id); + HttpResponse httpResponse = new HttpResponse(request); + + // int id = 11; + // String sql="SELECT id, randomNumber FROM world WHERE id = ?"; + + Row recored = Db.findById("world", id); + if (recored != null) { + httpResponse.setBody(JSON.toJSONBytes(recored.toMap())); + } else { + httpResponse.setBody("{}".getBytes()); + } + + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + + return httpResponse; + } + + // @GetMapping("/queries") + public HttpResponse queries(HttpRequest request) { + String queries = request.getParam("queries"); + List> recordMaps = RandomUtils.randomWorldNumbers() + // limit + .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 + .mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象 + .filter(Objects::nonNull) // 过滤掉 null 值 + .map(Row::toMap) // 将每个 Record 对象转换为 Map + .collect(Collectors.toList()); // 收集到 List + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(recordMaps)); + return httpResponse; + } + + //@GetMapping("/updates") + public HttpResponse updates(HttpRequest request) { + String queries = request.getParam("queries"); + + EhCacheKit.removeAll("world"); + + List> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers + // limit + .limit(RandomUtils.parseQueryCount(queries)) + // map + .mapToObj(id -> Db.findById("world", id)) + // not null + .filter(Objects::nonNull).map(record -> { + int currentRandomNumber = record.getInt("randomNumber"); // "randomnumber" + int newRandomNumber; + do { + newRandomNumber = RandomUtils.randomWorldNumber(); + } while (newRandomNumber == currentRandomNumber); + + record.set("randomnumber", newRandomNumber); + Db.update("world", "id", record); // update + return record; + }) + // tomap + .map(Row::toMap) + // to List + .collect(Collectors.toList()); + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(updatedRecords)); + return httpResponse; + } + + public HttpResponse fortunes(HttpRequest request) throws IllegalAccessException, InstantiationException { + List records = Db.find("SELECT * FROM fortune"); + + List fortunes = new ArrayList<>(records.size()); + for (Row record : records) { + fortunes.add(record.toBean(Fortune.class)); + } + // 添加额外的 Fortune + fortunes.add(new Fortune(0L, "Additional fortune added at request time.")); + + // 按照消息排序 + fortunes.sort(Comparator.comparing(Fortune::getMessage)); + + Map viewData = new HashMap<>(); + viewData.put("fortunes", fortunes); + + // 转换为 HTML + Engine engine = Engine.use(); + String filename = "fortunes.html"; + Template template = engine.getTemplate(filename); + String html = template.renderToString(viewData); + + return Resps.html(request, html); + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java new file mode 100644 index 00000000000..2b2bc4c5535 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java @@ -0,0 +1,40 @@ +package com.litongjava.tio.http.server.controller; + +import com.alibaba.fastjson2.JSON; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.model.Message; +import com.litongjava.tio.http.server.util.Resps; + +/** + * ab -k -n1000000 -c10 http://127.0.0.1:8080/json + * ab -k -n1000000 -c10 http://127.0.0.1:8080/plaintext + */ +public class IndexHandler { + private static final String HELLO_WORLD = "Hello, World!"; + + private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD.getBytes(); + + public HttpResponse index(HttpRequest request) { + return Resps.txt(request, "tio-boot"); + } + + public HttpResponse plaintext(HttpRequest request) { + // 更高性能的写法 + HttpResponse ret = new HttpResponse(request); + ret.setBody(HELLO_WORLD_BYTES); + ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT); + return ret; + } + + // 在IndexController中添加 + public HttpResponse json(HttpRequest request) { + // 更高性能的写法 + HttpResponse ret = new HttpResponse(request); + ret.setBody(JSON.toJSONString(new Message(HELLO_WORLD)).getBytes()); + ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + return ret; + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java new file mode 100644 index 00000000000..728db88b837 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java @@ -0,0 +1,23 @@ +package com.litongjava.tio.http.server.model; + +public final class Fortune { + + public Long id; + public String message; + + public Fortune() { + } + + public Fortune(Long id, String message) { + this.id = id; + this.message = message; + } + + public Long getId() { + return id; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java new file mode 100644 index 00000000000..2ad66214e0f --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java @@ -0,0 +1,12 @@ +package com.litongjava.tio.http.server.model; +public final class Message { + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java new file mode 100644 index 00000000000..06c4ed9a22b --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java @@ -0,0 +1,32 @@ +package com.litongjava.tio.http.server.model; + +public final class World { + + public int id; + public int randomnumber; + + protected World() { + } + + public World(int id, int randomnumber) { + this.id = id; + this.randomnumber = randomnumber; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getRandomnumber() { + return randomnumber; + } + + public void setRandomnumber(int randomnumber) { + this.randomnumber = randomnumber; + } + +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java new file mode 100644 index 00000000000..5707d4f05d4 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java @@ -0,0 +1,50 @@ +package com.litongjava.tio.http.server.services; + +public class CacheName { + // `cacheName`(缓存名称) + private String name; + // `timeToLiveSeconds`(生存时间)和`timeToIdleSeconds`(闲置时间)。 + private Long timeToLiveSeconds; + private Long timeToIdleSeconds; + + public CacheName() { + } + + public CacheName(String name, Long timeToLiveSeconds, Long timeToIdleSeconds) { + super(); + this.name = name; + this.timeToLiveSeconds = timeToLiveSeconds; + this.timeToIdleSeconds = timeToIdleSeconds; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getTimeToLiveSeconds() { + return timeToLiveSeconds; + } + + public void setTimeToLiveSeconds(Long timeToLiveSeconds) { + this.timeToLiveSeconds = timeToLiveSeconds; + } + + public Long getTimeToIdleSeconds() { + return timeToIdleSeconds; + } + + public void setTimeToIdleSeconds(Long timeToIdleSeconds) { + this.timeToIdleSeconds = timeToIdleSeconds; + } + + @Override + public String toString() { + return "CacheName [name=" + name + ", timeToLiveSeconds=" + timeToLiveSeconds + ", timeToIdleSeconds=" + + timeToIdleSeconds + "]"; + } + +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java new file mode 100644 index 00000000000..5ab5d7e58e6 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java @@ -0,0 +1,17 @@ +package com.litongjava.tio.http.server.services; + +import java.util.ArrayList; +import java.util.List; + +import com.litongjava.model.time.Time; + +public class CacheNameService { + private CacheName demo = new CacheName("world", null, Time.MINUTE_1 * 10); + + public List cacheNames() { + List list = new ArrayList<>(); + list.add(demo); + return list; + } + +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java new file mode 100644 index 00000000000..e18e98ef880 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java @@ -0,0 +1,36 @@ +package com.litongjava.tio.http.server.utils; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +public class RandomUtils { + + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; +// private static final int MAX_WORLD_NUMBER_PLUS_ONE = 30; + + public static int randomWorldNumber() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); + } + + public static IntStream randomWorldNumbers() { + return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE) + // distinct() allows us to avoid using Hibernate's first-level cache in + // the JPA-based implementation. Using a cache like that would bypass + // querying the database, which would violate the test requirements. + .distinct(); + } + + public static int parseQueryCount(String textValue) { + if (textValue == null) { + return 1; + } + int parsedValue; + try { + parsedValue = Integer.parseInt(textValue); + } catch (NumberFormatException e) { + return 1; + } + return Math.min(500, Math.max(1, parsedValue)); + } +} diff --git a/frameworks/Java/tio-boot/src/main/resources/app.properties b/frameworks/Java/tio-boot/src/main/resources/app.properties new file mode 100644 index 00000000000..b73b6ff144d --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/app.properties @@ -0,0 +1,9 @@ +http.response.header.showServer=true + +#JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false&allowPublicKeyRetrieval=true +#JDBC_USER=root +#JDBC_PSWD=robot_123456# + +JDBC_URL=jdbc:mysql://tfb-database/hello_world +JDBC_USER=benchmarkdbuser +JDBC_PSWD=benchmarkdbpass \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/resources/ehcache.xml b/frameworks/Java/tio-boot/src/main/resources/ehcache.xml new file mode 100644 index 00000000000..79b79e49479 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/ehcache.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/frameworks/Java/tio-boot/src/main/resources/logback.xml b/frameworks/Java/tio-boot/src/main/resources/logback.xml new file mode 100644 index 00000000000..aff0c711191 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/logback.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + ${LOG_HOME}/project-name-%d{yyyy-MM-dd}.log + + 180 + + + + 10MB + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html b/frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html new file mode 100644 index 00000000000..1f6817df007 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + #for(fortune : fortunes) + + + + + #end +
      idmessage
      #(fortune.id)#escape(fortune.message)
      + + diff --git a/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java b/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java new file mode 100644 index 00000000000..e469fa256ef --- /dev/null +++ b/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java @@ -0,0 +1,15 @@ +package com.litongjava.tio.http.server; + +import org.junit.Test; + +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MainAppTest { + + @Test + public void test() { + boolean boolean1 = EnvUtils.getBoolean("native", false); + System.out.println(boolean1); + } + +} diff --git a/frameworks/Java/tio-boot/tio-server.dockerfile b/frameworks/Java/tio-boot/tio-server.dockerfile new file mode 100644 index 00000000000..3b779333565 --- /dev/null +++ b/frameworks/Java/tio-boot/tio-server.dockerfile @@ -0,0 +1,20 @@ +FROM litongjava/maven:3.8.8-jdk8u391 AS builder +WORKDIR /app + +COPY pom.xml pom.xml +RUN mvn dependency:go-offline -q + +COPY src src +RUN mvn package -Passembly -q +RUN ls -l && ls -l target + +FROM litongjava/jre:8u391-stable-slim + +WORKDIR /app + +COPY --from=builder /app/target/tio-boot-benchmark-1.0-jar-with-dependencies.jar /app/tio-boot-benchmark-1.0.jar + +EXPOSE 8080 + +# java --server -XX:+UseNUMA XX:+UseParallelGC -cp target/tio-boot-benchmark-1.0-jar-with-dependencies.jar com.litongjava.tio.http.server.MainApp +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC","-cp", "/app/tio-boot-benchmark-1.0.jar","com.litongjava.tio.http.server.MainApp"] \ No newline at end of file From 996786eac66c2501579b4e601ce74dd4f204350b Mon Sep 17 00:00:00 2001 From: litongjava Date: Thu, 27 Feb 2025 09:41:46 -1000 Subject: [PATCH 1138/1766] add server.port=8080 --- frameworks/Java/tio-boot/src/main/resources/app.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/tio-boot/src/main/resources/app.properties b/frameworks/Java/tio-boot/src/main/resources/app.properties index b73b6ff144d..52083ea13ff 100644 --- a/frameworks/Java/tio-boot/src/main/resources/app.properties +++ b/frameworks/Java/tio-boot/src/main/resources/app.properties @@ -1,5 +1,5 @@ http.response.header.showServer=true - +server.port=8080 #JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false&allowPublicKeyRetrieval=true #JDBC_USER=root #JDBC_PSWD=robot_123456# From 40232e8738bd69d2e7d87cdd23180db52c1fa07b Mon Sep 17 00:00:00 2001 From: litongjava Date: Thu, 27 Feb 2025 10:31:57 -1000 Subject: [PATCH 1139/1766] update docker filename --- .../Java/tio-boot/{tio-server.dockerfile => tio-boot.dockerfile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frameworks/Java/tio-boot/{tio-server.dockerfile => tio-boot.dockerfile} (100%) diff --git a/frameworks/Java/tio-boot/tio-server.dockerfile b/frameworks/Java/tio-boot/tio-boot.dockerfile similarity index 100% rename from frameworks/Java/tio-boot/tio-server.dockerfile rename to frameworks/Java/tio-boot/tio-boot.dockerfile From 1516b0344eae95ce6265dcfdda9e37d3039f1b55 Mon Sep 17 00:00:00 2001 From: hzq Date: Sun, 2 Mar 2025 18:18:29 +0800 Subject: [PATCH 1140/1766] update paozhu --- .../paozhu/paozhu_benchmark/CMakeLists.txt | 175 +- .../paozhu_benchmark/common/cost_define.h | 3 + .../paozhu_benchmark/common/httphook.cpp | 15 +- .../paozhu_benchmark/models/Fortune.cpp | 16 +- .../paozhu/paozhu_benchmark/models/World.cpp | 16 +- .../paozhu_benchmark/models/fortune_mysql.h | 9788 +++++++++++++++++ .../paozhu_benchmark/models/include/Fortune.h | 20 +- .../paozhu_benchmark/models/include/World.h | 20 +- .../paozhu_benchmark/models/world_mysql.h | 9628 ++++++++++++++++ .../orm/include/fortunebase.h | 4600 ++++---- .../paozhu_benchmark/orm/include/worldbase.h | 4362 ++++---- 11 files changed, 23850 insertions(+), 4793 deletions(-) mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/models/fortune_mysql.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/models/world_mysql.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index 611a71394bb..a25af789299 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -73,7 +73,7 @@ if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) endif () else() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/include " ) endif () message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") @@ -86,7 +86,7 @@ elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) endif () else () set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -DBENCHMARK -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -DBENCHMARK -I/usr/local/include -I/usr/include " ) file(MAKE_DIRECTORY /usr/local/etc/paozhu) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/) endif () @@ -95,7 +95,7 @@ elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) else() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/include " ) if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") @@ -122,6 +122,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/orm) if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre) file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre) @@ -191,7 +192,7 @@ include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs) include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include) include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/common) -add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp) +add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/mysql_conn.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/mysql_conn_pool.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/clientdatacache.cpp) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) @@ -230,14 +231,17 @@ if (ENABLE_VCPKG) target_link_libraries(paozhu ZLIB::ZLIB) # find_package(libmysql REQUIRED) - find_package(unofficial-libmariadb CONFIG REQUIRED) - find_path(MYSQL_ROOT_DIR mysql) + # find_package(unofficial-libmariadb CONFIG REQUIRED) + # find_path(MYSQL_ROOT_DIR mysql) # target_link_libraries(paozhu ${MYSQL_LIBRARIES}) # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES}) - target_link_libraries(paozhu unofficial::libmariadb) - target_link_libraries(paozhu_cli unofficial::libmariadb) - target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) - target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) + # target_link_libraries(paozhu unofficial::libmariadb) + # target_link_libraries(paozhu_cli unofficial::libmariadb) + # target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) + # target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) + + target_link_libraries(paozhu_cli asio::asio) + target_link_libraries(paozhu_cli OpenSSL::Crypto OpenSSL::SSL) if (ENABLE_GD STREQUAL "ON") find_package(PkgConfig) @@ -331,6 +335,9 @@ if(OPENSSL_FOUND) INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}") target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY}) target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY}) + + target_link_libraries (paozhu_cli ${OPENSSL_SSL_LIBRARY}) + target_link_libraries (paozhu_cli ${OPENSSL_CRYPTO_LIBRARY}) endif() @@ -343,80 +350,80 @@ if(ZLIB_FOUND) endif() -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - if (IS_DIRECTORY "/usr/local/mysql/include") - MESSAGE( STATUS "/usr/local/mysql") - set(MYSQL_INCLUDE_DIR "/usr/local/mysql/include") - include_sub_directories_recursively(/usr/local/mysql/include) - endif() - - if (IS_DIRECTORY "/usr/local/opt/mysql-client") - MESSAGE( STATUS "/usr/local/opt/mysql-client") - set(MYSQL_INCLUDE_DIR "/usr/local/opt/mysql-client/include") - include_sub_directories_recursively(/usr/local/opt/mysql-client/include) - endif() - - if (IS_DIRECTORY "/opt/homebrew/opt/mysql") - MESSAGE( STATUS "/opt/homebrew/opt/mysql") - set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql/include") - include_sub_directories_recursively(/opt/homebrew/opt/mysql/include) - endif() - - - if (IS_DIRECTORY "/opt/homebrew/opt/mysql-client") - MESSAGE( STATUS "/opt/homebrew/opt/mysql-client") - set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql-client/include") - include_sub_directories_recursively(/opt/homebrew/opt/mysql-client/include) - endif() - MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") -else() - find_path(MYSQL_ROOT_DIR mysql) -endif() - - -FIND_PATH(MYSQL_INCLUDE_DIR NAMES mysql.h - PATHS /usr/local/include/mysql /usr/include/mysql /opt/homebrew/opt/mysql/include /usr/local/opt/mysql-client/include /opt/homebrew/opt/mysql-client/include -) - -MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") -find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) - - -if(NOT MYSQL_INCLUDE_DIR) - message(STATUS "Could not find \"mysql.h\" from searching ") -endif() - -SET(MYSQL_NAMES mysqlclient) -FIND_LIBRARY(MYSQL_LIBRARY - NAMES ${MYSQL_NAMES} - PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib /usr/local/opt/mysql/lib /opt/homebrew/opt/mysql/lib /opt/homebrew/opt/mysql-client/lib - PATH_SUFFIXES mysql -) - -IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - SET(MYSQL_FOUND TRUE) - SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) -ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - SET(MYSQL_FOUND FALSE) - SET( MYSQL_LIBRARIES ) -ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - -IF (MYSQL_FOUND) - IF (NOT MYSQL_FIND_QUIETLY) - MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") - ENDIF (NOT MYSQL_FIND_QUIETLY) -ELSE (MYSQL_FOUND) - IF (MYSQL_FIND_REQUIRED) - MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") - MESSAGE(FATAL_ERROR "Could NOT find MySQL library") - ENDIF (MYSQL_FIND_REQUIRED) -ENDIF (MYSQL_FOUND) - -target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) -target_link_libraries(paozhu ${MYSQL_LIBRARY}) - -target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) -target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) +#if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +# if (IS_DIRECTORY "/usr/local/mysql/include") +# MESSAGE( STATUS "/usr/local/mysql") +# set(MYSQL_INCLUDE_DIR "/usr/local/mysql/include") +# include_sub_directories_recursively(/usr/local/mysql/include) +# endif() +# +# if (IS_DIRECTORY "/usr/local/opt/mysql-client") +# MESSAGE( STATUS "/usr/local/opt/mysql-client") +# set(MYSQL_INCLUDE_DIR "/usr/local/opt/mysql-client/include") +# include_sub_directories_recursively(/usr/local/opt/mysql-client/include) +# endif() +# +# if (IS_DIRECTORY "/opt/homebrew/opt/mysql") +# MESSAGE( STATUS "/opt/homebrew/opt/mysql") +# set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql/include") +# include_sub_directories_recursively(/opt/homebrew/opt/mysql/include) +# endif() +# +# +# if (IS_DIRECTORY "/opt/homebrew/opt/mysql-client") +# MESSAGE( STATUS "/opt/homebrew/opt/mysql-client") +# set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql-client/include") +# include_sub_directories_recursively(/opt/homebrew/opt/mysql-client/include) +# endif() +# MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +#else() +# find_path(MYSQL_ROOT_DIR mysql) +#endif() +# +# +# FIND_PATH(MYSQL_INCLUDE_DIR NAMES mysql.h +# PATHS /usr/local/include/mysql /usr/include/mysql /opt/homebrew/opt/mysql/include /usr/local/opt/mysql-client/include /opt/homebrew/opt/mysql-client/include +# ) +# +# MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +# find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) +# +# +# if(NOT MYSQL_INCLUDE_DIR) +# message(STATUS "Could not find \"mysql.h\" from searching ") +# endif() +# +# SET(MYSQL_NAMES mysqlclient) +# FIND_LIBRARY(MYSQL_LIBRARY +# NAMES ${MYSQL_NAMES} +# PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib /usr/local/opt/mysql/lib /opt/homebrew/opt/mysql/lib /opt/homebrew/opt/mysql-client/lib +# PATH_SUFFIXES mysql +# ) +# +# IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) +# SET(MYSQL_FOUND TRUE) +# SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) +# ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) +# SET(MYSQL_FOUND FALSE) +# SET( MYSQL_LIBRARIES ) +# ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) +# +# IF (MYSQL_FOUND) +# IF (NOT MYSQL_FIND_QUIETLY) +# MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") +# ENDIF (NOT MYSQL_FIND_QUIETLY) +# ELSE (MYSQL_FOUND) +# IF (MYSQL_FIND_REQUIRED) +# MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") +# MESSAGE(FATAL_ERROR "Could NOT find MySQL library") +# ENDIF (MYSQL_FIND_REQUIRED) +# ENDIF (MYSQL_FOUND) +# +# target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) +# target_link_libraries(paozhu ${MYSQL_LIBRARY}) +# +# target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) +# target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h index 47fb182f0e0..ef54468d7be 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h @@ -6,4 +6,7 @@ #define CONST_HTTP_HEADER_BODY_SIZE 16384 #define CONST_PHP_BODY_POST_SIZE 16777216 +#define CONST_HTTP_BODY_POST_SIZE 33554432 +#define CONST_HTTP_JSON_POST_SIZE 2097152 + #endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp index 3440c23f84b..327ecab4b71 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp @@ -8,13 +8,24 @@ #include #include #include "httppeer.h" +#include "client_session.h" namespace http { std::map _block_ip_tables; std::map _block_host_tables; -bool check_blockip(const std::string &client_ip) +std::map _passport_ip_tables; +std::map _passport_host_tables; +bool check_blockip(std::shared_ptr peer_session) { - if (client_ip.size() > 0) + if (peer_session->isssl) + { + return false; + } + return false; +} +bool check_pressl_blockip(std::shared_ptr peer_session) +{ + if (peer_session->isssl) { return false; } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp old mode 100755 new mode 100644 index 361a81acb35..4bb6dd1bc5c --- a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp @@ -1,14 +1,16 @@ -#include "mysqlorm.hpp" + +#include "fortune_mysql.h" #include "fortunebase.h" #include "Fortune.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 - *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ -namespace orm -{ + + namespace orm{ + + Fortune::Fortune(std::string dbtag):fortune_mysql(dbtag){ mod=this; } + Fortune::Fortune():fortune_mysql(){ mod=this; } -Fortune::Fortune(std::string dbtag) : mysql_orm(dbtag) {} -Fortune::Fortune() : mysql_orm() {} -}// namespace orm + } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp old mode 100755 new mode 100644 index 8dc5de8396a..970e3427398 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp @@ -1,14 +1,16 @@ -#include "mysqlorm.hpp" + +#include "world_mysql.h" #include "worldbase.h" #include "World.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 - *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ -namespace orm -{ + + namespace orm{ + + World::World(std::string dbtag):world_mysql(dbtag){ mod=this; } + World::World():world_mysql(){ mod=this; } -World::World(std::string dbtag) : mysql_orm(dbtag) {} -World::World() : mysql_orm() {} -}// namespace orm + } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/models/fortune_mysql.h new file mode 100644 index 00000000000..18cba5958fc --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/fortune_mysql.h @@ -0,0 +1,9788 @@ +#ifndef _ORM_DEFAULT_FORTUNE_OPERATE_H +#define _ORM_DEFAULT_FORTUNE_OPERATE_H + +#include +#include +#include +#include +#include +#include +#include +#include "request.h" +#include "unicode.h" +#include "datetime.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mysql_conn.h" +#include "mysql_conn_pool.h" +#include "orm_cache.hpp" +/*baseincludefile*/ +namespace orm +{ +// mysql Operational SQL middleware +/*tagnamespace*/ +//{ /*tagnamespace_replace*/ + template + class fortune_mysql : public B_BASE + { + public: + fortune_mysql(const std::string &tag) : dbtag(tag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + fortune_mysql() : dbtag(B_BASE::_rmstag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + M_MODEL &switchDB(const std::string &temptag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(temptag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + temptag; + } + } + M_MODEL &set_table(const std::string &table_name) + { + if (original_tablename.empty()) + { + original_tablename = B_BASE::tablename; + } + if (table_name.size() > 0) + { + B_BASE::tablename = table_name; + } + return *mod; + } + M_MODEL &reset_table() + { + if (original_tablename.empty()) + { + return *mod; + } + B_BASE::tablename = original_tablename; + return *mod; + } + unsigned int count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + return 0; + } + + return 0; + } + std::tuple + page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + return std::make_tuple(minpage, maxpage, page, total_page); + } + asio::awaitable async_count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + + asio::awaitable> + async_page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = async_count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + co_return std::make_tuple(minpage, maxpage, page, total_page); + } + + unsigned int update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + co_return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int replace_col(std::string colname, const std::string &old_string, const std::string &new_string) + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + + countsql.append(" = REPLACE("); + countsql.append(colname); + countsql.append(",'"); + countsql.append(old_string); + countsql.append("','"); + countsql.append(new_string); + countsql.append("') "); + + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, typename B_BASE::meta &data_temp) + { + switch(index_pos) + { + case 0: + data_temp.id=0; + + for(unsigned int i=0; i< value_size; i++) + { + if(result_temp_data[i]>='0'&&result_temp_data[i]<='9') + { + + data_temp.id= data_temp.id * 10 + (result_temp_data[i]-'0'); + } + if(i>32) + { + break; + } + } + break; + case 1: + data_temp.message.clear(); + data_temp.message.resize(value_size); + + std::memcpy(data_temp.message.data(), result_temp_data, value_size); + break; + + } + } + + +M_MODEL& eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +M_MODEL& nullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = NULL "); + + return *mod; + } + + +M_MODEL& nnullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != NULL "); + + return *mod; + } + + +M_MODEL& eqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& nqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& inMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& ninMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& l_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("'"); + + return *mod; + } + + +M_MODEL& r_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& btMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& beMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& ltMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& leMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_nullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = NULL "); + + return *mod; + } + + +M_MODEL& or_nnullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != NULL "); + + return *mod; + } + + +M_MODEL& or_eqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_nqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_inMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& or_ninMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& or_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& orl_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("'"); + + return *mod; + } + + +M_MODEL& orr_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& or_btMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_beMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_ltMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_leMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& eqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& nqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& btMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& beMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& ltMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& leMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_eqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_nqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_btMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_beMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_ltMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_leMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + + M_MODEL &select(const std::string &fieldname) + { + if (selectsql.size() > 0) + { + selectsql.push_back(','); + } + selectsql.append(fieldname); + return *mod; + } + + M_MODEL &where(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + M_MODEL &where(const std::string &wq, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, char bi, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + wheresql.push_back('\''); + + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &where(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &between(const std::string &wq, const std::string &a, const std::string &b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN '"); + std::stringstream _stream; + _stream << a; + _stream << "' AND '"; + _stream << b; + _stream << "' ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &between(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &orBetween(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val.size() > 0 && (val[0] == '%' || val.back() == '%')) + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereLikeLeft(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("' "); + return *mod; + } + M_MODEL &whereLikeRight(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.append(val); + wheresql.append("%' "); + return *mod; + } + M_MODEL &whereOrLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val[0] == '%' || val.back() == '%') + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereAnd(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereAnd(const std::string &wq, _SQL_Value val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereAnd(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + M_MODEL &whereOr(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereOr(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &whereIn(const std::string &k) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + return *mod; + } + M_MODEL &whereIn(const std::string &k, const std::string &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + wheresql.append(a); + wheresql.append(") "); + return *mod; + } + + M_MODEL &whereIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + M_MODEL &whereNotIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::list<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereNotIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + M_MODEL &order(const std::string &wq) + { + ordersql.append(" ORDER by "); + ordersql.append(wq); + return *mod; + } + M_MODEL &asc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" ASC "); + return *mod; + } + + M_MODEL &desc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" DESC "); + return *mod; + } + + M_MODEL &having(const std::string &wq) + { + + groupsql.append(" HAVING by "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &group(const std::string &wq) + { + + groupsql.append(" GROUP BY "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &orsub() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &andsub() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &endsub() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &or_b() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &and_b() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &or_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &and_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &limit(unsigned int num) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + return *mod; + } + M_MODEL &limit(unsigned int num, unsigned int endnum) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + limitsql.push_back(','); + limitsql.append(std::to_string(endnum)); + return *mod; + } + + std::vector> fetch_obj() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + + if (iserror) + { + return temprecord; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return temprecord; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return temprecord; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::map data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if (field_array[ij].name.size() > 0) + { + data_temp.insert({field_array[ij].name, std::move(temp_str)}); + } + else if (field_array[ij].org_name.size() > 0) + { + data_temp.insert({field_array[ij].org_name, std::move(temp_str)}); + } + + tempnum = tempnum + name_length; + } + temprecord.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return temprecord; + } + std::tuple, std::map, std::vector>> + fetch_row() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temprecord = temp_cache.get(sqlhashid); + if (temprecord.size() > 0) + { + iscache = false; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_fieldname = table_cache.get(sqlhashid); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + table_fieldmap = tablemap_cache.get_obj(sqlhashid); + + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + } + + if (iserror) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + try + { + if (conn_empty()) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + + + if (iscache) + { + if (exptime > 0) + { + if (temprecord.size() > 0) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temp_cache.save(sqlhashid, temprecord, exptime); + + exptime += 1; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_cache.save(sqlhashid, table_fieldname, exptime); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + tablemap_cache.save(sqlhashid, table_fieldmap, exptime); + exptime = 0; + iscache = false; + } + } + } + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + M_MODEL &fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + B_BASE::record_reset(); + if (iserror) + { + return *mod; + } + + try + { + if (conn_empty()) + { + return *mod; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return *mod; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::record_reset(); + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + M_MODEL &fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + if (iserror) + { + return *mod; + } + + try + { + + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 1; + } + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + // asio::error_code ec; + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + // std::memset(result_data, 0x00, 4096); + // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + effect_num++; + B_BASE::record.emplace_back(std::move(data_temp)); + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + unsigned int fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + M_MODEL &use_cache(int cache_time = 0) + { + iscache = true; + exptime = cache_time; + return *mod; + } + bool isuse_cache(bool iscachedate = false) + { + if (iscachedate) + { + return exptime == 0 && iscache == false; + } + return iscache; + } + void set_cache_state(bool isrestatus = false) { iscache = isrestatus; } + void remove_exptime_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.remove_exptime(); + } + void clear_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.clear(); + } + bool remove_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.remove(sqlhashid); + } + bool remove_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.remove(cache_key_name); + } + int check_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.check(cache_key_name); + } + std::vector get_cache_data(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get(cache_key_name); + return cache_data; + } + typename B_BASE::meta get_cache_obj(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get_obj(cache_key_name); + return cache_data; + } + M_MODEL &get_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + B_BASE::record_reset(); + } + else + { + B_BASE::data = B_BASE::record[0]; + } + return *mod; + } + int update_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.update(sqlhashid, exp_time); + } + int update_cache(std::size_t cache_key_name, int exp_time) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.update(cache_key_name, exp_time); + } + bool save_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + temp_cache.save(sqlhashid, B_BASE::record, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, typename B_BASE::meta &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, std::vector &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + bool get_cacherecord(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + return false; + } + else + { + B_BASE::data = B_BASE::record[0]; + return true; + } + } + http::OBJ_VALUE fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + return valuetemp; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return valuetemp; + } + + asio::awaitable async_fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + co_return valuetemp; + } + + try + { + if (conn_empty()) + { + co_return valuetemp; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return valuetemp; + } + + long long get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + int update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + asio::awaitable async_update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int update_batch(const std::string &fieldname) + { + effect_num = 0; + if (B_BASE::record.size() == 0) + { + return 0; + } + if (fieldname.size() > 0) + { + sqlstring = B_BASE::_make_insert_into_sql(fieldname); + } + else + { + sqlstring = B_BASE::_make_replace_into_sql(); + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + co_return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int soft_remove(const std::string &fieldsql) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = B_BASE::soft_remove_sql(fieldsql); + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int soft_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + effect_num = 1; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + if (effect_num == 1) + { + sqlstring = B_BASE::soft_remove_sql(" "); + } + else + { + sqlstring = B_BASE::soft_remove_sql(""); + } + effect_num = 0; + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + long long insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + + long long save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + return 0; + } + + asio::awaitable async_save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + co_return 0; + } + + std::tuple, std::map, std::vector>> + query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iget_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + asio::awaitable, std::map, std::vector>>> + async_query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iasync_get_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + // long long edit_query(const std::string &rawsql, bool isinsert = false) + // { + // if (iserror) + // { + // return 0; + // } + + // return 0; + // } + M_MODEL &clear(bool both = true) + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + if (both) + { + B_BASE::record_reset(); + B_BASE::data_reset(); + } + return *mod; + } + M_MODEL &clearWhere() + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + return *mod; + } + M_MODEL &set_data(typename B_BASE::meta indata) + { + B_BASE::data = indata; + return *mod; + } + M_MODEL &get() { return *mod; } + std::string get_query() { return sqlstring; } + M_MODEL &start_commit() + { + iscommit = true; + return *mod; + } + M_MODEL &end_commit() + { + iscommit = false; + return *mod; + } + + unsigned int effect() + { + return effect_num; + } + bool conn_empty() + { + if (conn_obj) + { + return false; + } + error_msg = "conn_obj is null"; + iserror = true; + return true; + } + + public: + std::string selectsql; + std::string wheresql; + std::string ordersql; + std::string groupsql; + std::string limitsql; + std::string sqlstring; + std::string dbtag; + std::string error_msg; + std::string original_tablename; + + // std::list commit_sqllist; + bool iskuohao = false; + bool iscommit = false; + bool ishascontent = false; + bool iscache = false; + bool iserror = false; + int exptime = 0; + unsigned int effect_num = 0; + + M_MODEL *mod; + + std::shared_ptr conn_obj; + }; +//} /*tagnamespace_replace*/ +}// namespace orm +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h old mode 100755 new mode 100644 index 548dbed843a..1f53aa1e51d --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h @@ -1,18 +1,16 @@ #ifndef ORM_DEFAULT_FORTUNE_H #define ORM_DEFAULT_FORTUNE_H -#include "mysqlorm.hpp" +#include "fortune_mysql.h" #include "fortunebase.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 - *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ -namespace orm -{ -class Fortune : public mysql_orm -{ - public: - Fortune(std::string dbtag); - Fortune(); -}; -};// namespace orm + namespace orm { + class Fortune : public fortune_mysql{ + public: + Fortune(std::string dbtag); + Fortune(); + }; +} #endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h old mode 100755 new mode 100644 index 15ae378052a..0967117ebb0 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h @@ -1,18 +1,16 @@ #ifndef ORM_DEFAULT_WORLD_H #define ORM_DEFAULT_WORLD_H -#include "mysqlorm.hpp" +#include "world_mysql.h" #include "worldbase.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 - *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ +*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ -namespace orm -{ -class World : public mysql_orm -{ - public: - World(std::string dbtag); - World(); -}; -};// namespace orm + namespace orm { + class World : public world_mysql{ + public: + World(std::string dbtag); + World(); + }; +} #endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/models/world_mysql.h new file mode 100644 index 00000000000..5fe029ad608 --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/world_mysql.h @@ -0,0 +1,9628 @@ +#ifndef _ORM_DEFAULT_WORLD_OPERATE_H +#define _ORM_DEFAULT_WORLD_OPERATE_H + +#include +#include +#include +#include +#include +#include +#include +#include "request.h" +#include "unicode.h" +#include "datetime.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mysql_conn.h" +#include "mysql_conn_pool.h" +#include "orm_cache.hpp" +/*baseincludefile*/ +namespace orm +{ +// mysql Operational SQL middleware +/*tagnamespace*/ +//{ /*tagnamespace_replace*/ + template + class world_mysql : public B_BASE + { + public: + world_mysql(const std::string &tag) : dbtag(tag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + world_mysql() : dbtag(B_BASE::_rmstag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + M_MODEL &switchDB(const std::string &temptag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(temptag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + temptag; + } + } + M_MODEL &set_table(const std::string &table_name) + { + if (original_tablename.empty()) + { + original_tablename = B_BASE::tablename; + } + if (table_name.size() > 0) + { + B_BASE::tablename = table_name; + } + return *mod; + } + M_MODEL &reset_table() + { + if (original_tablename.empty()) + { + return *mod; + } + B_BASE::tablename = original_tablename; + return *mod; + } + unsigned int count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + return 0; + } + + return 0; + } + std::tuple + page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + return std::make_tuple(minpage, maxpage, page, total_page); + } + asio::awaitable async_count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + + asio::awaitable> + async_page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = async_count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + co_return std::make_tuple(minpage, maxpage, page, total_page); + } + + unsigned int update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + co_return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int replace_col(std::string colname, const std::string &old_string, const std::string &new_string) + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + + countsql.append(" = REPLACE("); + countsql.append(colname); + countsql.append(",'"); + countsql.append(old_string); + countsql.append("','"); + countsql.append(new_string); + countsql.append("') "); + + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, typename B_BASE::meta &data_temp) + { + switch(index_pos) + { + case 0: + data_temp.id=0; + + for(unsigned int i=0; i< value_size; i++) + { + if(result_temp_data[i]>='0'&&result_temp_data[i]<='9') + { + + data_temp.id= data_temp.id * 10 + (result_temp_data[i]-'0'); + } + if(i>32) + { + break; + } + } + break; + case 1: + data_temp.randomnumber=0; + + for(unsigned int i=0; i< value_size; i++) + { + if(result_temp_data[i]>='0'&&result_temp_data[i]<='9') + { + + data_temp.randomnumber= data_temp.randomnumber * 10 + (result_temp_data[i]-'0'); + } + if(i>32) + { + break; + } + } + break; + + } + } + + +M_MODEL& eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +M_MODEL& eqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& nqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& inRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& btRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& beRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& ltRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& leRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_eqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_nqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_inRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_btRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_beRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_ltRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_leRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& eqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& nqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& btRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& beRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ltRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& leRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_eqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_nqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_btRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_beRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ltRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_leRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + + M_MODEL &select(const std::string &fieldname) + { + if (selectsql.size() > 0) + { + selectsql.push_back(','); + } + selectsql.append(fieldname); + return *mod; + } + + M_MODEL &where(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + M_MODEL &where(const std::string &wq, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, char bi, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + wheresql.push_back('\''); + + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &where(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &between(const std::string &wq, const std::string &a, const std::string &b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN '"); + std::stringstream _stream; + _stream << a; + _stream << "' AND '"; + _stream << b; + _stream << "' ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &between(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &orBetween(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val.size() > 0 && (val[0] == '%' || val.back() == '%')) + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereLikeLeft(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("' "); + return *mod; + } + M_MODEL &whereLikeRight(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.append(val); + wheresql.append("%' "); + return *mod; + } + M_MODEL &whereOrLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val[0] == '%' || val.back() == '%') + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereAnd(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereAnd(const std::string &wq, _SQL_Value val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereAnd(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + M_MODEL &whereOr(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereOr(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &whereIn(const std::string &k) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + return *mod; + } + M_MODEL &whereIn(const std::string &k, const std::string &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + wheresql.append(a); + wheresql.append(") "); + return *mod; + } + + M_MODEL &whereIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + M_MODEL &whereNotIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::list<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereNotIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + M_MODEL &order(const std::string &wq) + { + ordersql.append(" ORDER by "); + ordersql.append(wq); + return *mod; + } + M_MODEL &asc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" ASC "); + return *mod; + } + + M_MODEL &desc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" DESC "); + return *mod; + } + + M_MODEL &having(const std::string &wq) + { + + groupsql.append(" HAVING by "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &group(const std::string &wq) + { + + groupsql.append(" GROUP BY "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &orsub() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &andsub() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &endsub() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &or_b() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &and_b() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &or_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &and_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &limit(unsigned int num) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + return *mod; + } + M_MODEL &limit(unsigned int num, unsigned int endnum) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + limitsql.push_back(','); + limitsql.append(std::to_string(endnum)); + return *mod; + } + + std::vector> fetch_obj() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + + if (iserror) + { + return temprecord; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return temprecord; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return temprecord; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::map data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if (field_array[ij].name.size() > 0) + { + data_temp.insert({field_array[ij].name, std::move(temp_str)}); + } + else if (field_array[ij].org_name.size() > 0) + { + data_temp.insert({field_array[ij].org_name, std::move(temp_str)}); + } + + tempnum = tempnum + name_length; + } + temprecord.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return temprecord; + } + std::tuple, std::map, std::vector>> + fetch_row() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temprecord = temp_cache.get(sqlhashid); + if (temprecord.size() > 0) + { + iscache = false; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_fieldname = table_cache.get(sqlhashid); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + table_fieldmap = tablemap_cache.get_obj(sqlhashid); + + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + } + + if (iserror) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + try + { + if (conn_empty()) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + + + if (iscache) + { + if (exptime > 0) + { + if (temprecord.size() > 0) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temp_cache.save(sqlhashid, temprecord, exptime); + + exptime += 1; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_cache.save(sqlhashid, table_fieldname, exptime); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + tablemap_cache.save(sqlhashid, table_fieldmap, exptime); + exptime = 0; + iscache = false; + } + } + } + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + M_MODEL &fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + B_BASE::record_reset(); + if (iserror) + { + return *mod; + } + + try + { + if (conn_empty()) + { + return *mod; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return *mod; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::record_reset(); + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + M_MODEL &fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + if (iserror) + { + return *mod; + } + + try + { + + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 1; + } + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + // asio::error_code ec; + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + // std::memset(result_data, 0x00, 4096); + // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + effect_num++; + B_BASE::record.emplace_back(std::move(data_temp)); + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + unsigned int fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + M_MODEL &use_cache(int cache_time = 0) + { + iscache = true; + exptime = cache_time; + return *mod; + } + bool isuse_cache(bool iscachedate = false) + { + if (iscachedate) + { + return exptime == 0 && iscache == false; + } + return iscache; + } + void set_cache_state(bool isrestatus = false) { iscache = isrestatus; } + void remove_exptime_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.remove_exptime(); + } + void clear_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.clear(); + } + bool remove_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.remove(sqlhashid); + } + bool remove_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.remove(cache_key_name); + } + int check_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.check(cache_key_name); + } + std::vector get_cache_data(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get(cache_key_name); + return cache_data; + } + typename B_BASE::meta get_cache_obj(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get_obj(cache_key_name); + return cache_data; + } + M_MODEL &get_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + B_BASE::record_reset(); + } + else + { + B_BASE::data = B_BASE::record[0]; + } + return *mod; + } + int update_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.update(sqlhashid, exp_time); + } + int update_cache(std::size_t cache_key_name, int exp_time) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.update(cache_key_name, exp_time); + } + bool save_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + temp_cache.save(sqlhashid, B_BASE::record, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, typename B_BASE::meta &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, std::vector &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + bool get_cacherecord(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + return false; + } + else + { + B_BASE::data = B_BASE::record[0]; + return true; + } + } + http::OBJ_VALUE fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + return valuetemp; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return valuetemp; + } + + asio::awaitable async_fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + co_return valuetemp; + } + + try + { + if (conn_empty()) + { + co_return valuetemp; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return valuetemp; + } + + long long get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + int update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + asio::awaitable async_update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int update_batch(const std::string &fieldname) + { + effect_num = 0; + if (B_BASE::record.size() == 0) + { + return 0; + } + if (fieldname.size() > 0) + { + sqlstring = B_BASE::_make_insert_into_sql(fieldname); + } + else + { + sqlstring = B_BASE::_make_replace_into_sql(); + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + co_return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int soft_remove(const std::string &fieldsql) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = B_BASE::soft_remove_sql(fieldsql); + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int soft_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + effect_num = 1; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + if (effect_num == 1) + { + sqlstring = B_BASE::soft_remove_sql(" "); + } + else + { + sqlstring = B_BASE::soft_remove_sql(""); + } + effect_num = 0; + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + long long insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + + long long save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + return 0; + } + + asio::awaitable async_save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + co_return 0; + } + + std::tuple, std::map, std::vector>> + query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iget_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + asio::awaitable, std::map, std::vector>>> + async_query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iasync_get_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + // long long edit_query(const std::string &rawsql, bool isinsert = false) + // { + // if (iserror) + // { + // return 0; + // } + + // return 0; + // } + M_MODEL &clear(bool both = true) + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + if (both) + { + B_BASE::record_reset(); + B_BASE::data_reset(); + } + return *mod; + } + M_MODEL &clearWhere() + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + return *mod; + } + M_MODEL &set_data(typename B_BASE::meta indata) + { + B_BASE::data = indata; + return *mod; + } + M_MODEL &get() { return *mod; } + std::string get_query() { return sqlstring; } + M_MODEL &start_commit() + { + iscommit = true; + return *mod; + } + M_MODEL &end_commit() + { + iscommit = false; + return *mod; + } + + unsigned int effect() + { + return effect_num; + } + bool conn_empty() + { + if (conn_obj) + { + return false; + } + error_msg = "conn_obj is null"; + iserror = true; + return true; + } + + public: + std::string selectsql; + std::string wheresql; + std::string ordersql; + std::string groupsql; + std::string limitsql; + std::string sqlstring; + std::string dbtag; + std::string error_msg; + std::string original_tablename; + + // std::list commit_sqllist; + bool iskuohao = false; + bool iscommit = false; + bool ishascontent = false; + bool iscache = false; + bool iserror = false; + int exptime = 0; + unsigned int effect_num = 0; + + M_MODEL *mod; + + std::shared_ptr conn_obj; + }; +//} /*tagnamespace_replace*/ +}// namespace orm +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h old mode 100755 new mode 100644 index 544034baf9d..6576c16d41e --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -1,400 +1,313 @@ #ifndef ORM_DEFAULT_FORTUNEBASEMATA_H #define ORM_DEFAULT_FORTUNEBASEMATA_H /* - *This file is auto create from cli - *本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT - ***/ +*This file is auto create from cli +*本文件为自动生成 Sun, 02 Mar 2025 08:24:41 GMT +***/ #include #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include +#include "unicode.h" -namespace orm -{ - +namespace orm { + + struct fortunebase { - struct meta - { - unsigned int id = 0; // - std::string message = "";// - } data; - std::vector record; - std::string _rmstag = "default";//this value must be default or tag value, tag in mysqlconnect config file . - std::vector _keypos{0x00}; - - std::vector::iterator begin() { return record.begin(); } - std::vector::iterator end() { return record.end(); } - std::vector::const_iterator begin() const { return record.begin(); } - std::vector::const_iterator end() const { return record.end(); } - const std::array colnames = {"id", "message"}; - const std::array colnamestype = {3, 253}; - std::string tablename = "fortune"; - std::string modelname = "Fortune"; - - unsigned char findcolpos(const std::string &coln) - { - if (coln.size() == 0) - { - return 255; - } - unsigned char bi = coln[0]; - - if (bi < 91 && bi > 64) - { - bi += 32; - } - switch (coln[0]) - { - - case 'i': - return 0; - break; - case 'm': - return 1; - break; - } - return 255; - } - - int size() { return record.size(); } - - void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, meta &data_temp) - { - /* - unsigned int id = 0; // - std::string message = "";// - */ - //bool is_minus = false; - switch (index_pos) - { - case 0: - data_temp.id = 0; - for (size_t i = 0; i < value_size; i++) - { - if (result_temp_data[i] >= '0' && result_temp_data[i] <= '9') - { - data_temp.id = data_temp.id * 10 + (result_temp_data[i] - '0'); - } - } - break; - case 1: - - data_temp.message.clear(); - data_temp.message.resize(value_size); - for (size_t i = 0; i < value_size; i++) - { - data_temp.message[i] = result_temp_data[i]; - } - break; - default: - break; - } - } - - std::string getPKname() - { - return "id"; - } - - void record_reset() - { - record.clear(); - } - void data_reset() - { - fortunebase::meta metatemp; - data = metatemp; - } - - std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql) - { - std::string temp; - - return temp; - } - - inline std::string stringaddslash(std::string &content) - { + struct meta{ + unsigned int id = 0; ///**/ + std::string message = ""; ///**/ + } data; + std::vector record; +std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . +unsigned int _offset=0; +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } +static constexpr std::array col_names={"id","message"}; +static constexpr std::array col_types={3,253}; +static constexpr std::array col_length={0,0}; +static constexpr std::array col_decimals={0,0}; +std::string tablename="fortune"; +static constexpr std::string_view modelname="Fortune"; + + unsigned char findcolpos(const std::string &coln){ + if(coln.size()==0) + { + return 255; + } + unsigned char bi=coln[0]; + + + if(bi<91&&bi>64){ + bi+=32; + } + switch(coln[0]){ + + + case 'i': + return 0; +break; +case 'm': + return 1; +break; + + } + return 255; + } + + int size(){ return record.size(); } + + std::string getPKname(){ + return "id"; +} + + void record_reset() + { + record.clear(); + } + void data_reset(){ + fortunebase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ + std::string temp; + + return temp; + } + + + inline std::string stringaddslash(const std::string &content){ std::string temp; - for (unsigned int i = 0; i < content.size(); i++) - { - if (content[i] == '\'') - { + for(unsigned int i=0;i 0) - { - tempsql << "`,`"; - } - else - { - tempsql << "`"; - } - tempsql << colnames[j]; - } - if (j > 0) - { - tempsql << "`"; - } - tempsql << ") VALUES ("; - - if (data.id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(data.id); - } - tempsql << ",'" << stringaddslash(data.message) << "'"; - tempsql << ")"; - - return tempsql.str(); - } - - std::string _makerecordinsertsql(meta &insert_data) - { - unsigned int j = 0; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(data.id==0){ +tempsql<<"null"; + }else{ + tempsql< 0) - { - tempsql << "`,`"; - } - else - { - tempsql << "`"; - } - tempsql << colnames[j]; - } - if (j > 0) - { - tempsql << "`"; - } - tempsql << ") VALUES ("; - - if (insert_data.id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(insert_data.id); - } - tempsql << ",'" << stringaddslash(insert_data.message) << "'"; - tempsql << ")"; - - return tempsql.str(); - } - - std::string _makerecordinsertsql(std::vector &insert_data) - { - unsigned int j = 0; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(insert_data.id==0){ +tempsql<<"null"; + }else{ + tempsql< &insert_data){ + unsigned int j=0; std::ostringstream tempsql; - tempsql << "INSERT INTO "; - tempsql << tablename; - tempsql << " ("; - for (; j < colnames.size(); j++) - { - if (j > 0) - { - tempsql << "`,`"; - } - else - { - tempsql << "`"; - } - tempsql << colnames[j]; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql< 0) - { - tempsql << "`"; + if(j>0){ + tempsql<<"`"; } - tempsql << ") VALUES "; + tempsql<<") VALUES "; - for (unsigned int i = 0; i < insert_data.size(); i++) + for(unsigned int i=0;i 0) + if(i>0) { - tempsql << ","; + tempsql<<","; } - tempsql << "("; + tempsql<<"("; - if (insert_data[i].id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(insert_data[i].id); - } - tempsql << ",'" << stringaddslash(insert_data[i].message) << "'"; - tempsql << ")"; - } - return tempsql.str(); - } + if(insert_data[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< keypos; - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - unsigned char bpos_i = findcolpos(keyname); - keypos.emplace_back(bpos_i); + tempsql<<"UPDATE "; + tempsql< keypos; + for(;jj 0) - { - unsigned char bpos_i = findcolpos(keyname); -#ifdef DEBUG - if (bpos_i == 254) - { - std::cout << "\033[1m\033[31m-----------\n" - << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" - << std::endl; - } -#endif - keypos.emplace_back(bpos_i); - keyname.clear(); - } - for (jj = 0; jj < keypos.size(); jj++) - { - switch (keypos[jj]) - { + continue; + } + keyname.push_back(fileld[jj]); - case 0: - if (jj > 0) - { - tempsql << ","; - } - if (data.id == 0) - { - tempsql << "`id`=0"; - } - else - { - tempsql << "`id`=" << std::to_string(data.id); - } - break; - case 1: - if (jj > 0) + } + if(keyname.size()>0){ + unsigned char bpos_i=findcolpos(keyname); + #ifdef DEBUG + if (bpos_i == 255) { - tempsql << ","; + std::cout << "\033[1m\033[31m-----------\n" + << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" + << std::endl; } - tempsql << "`message`='" << stringaddslash(data.message) << "'"; - break; - - default:; - } - } - } +#endif + keypos.emplace_back(bpos_i); + keyname.clear(); + } + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"`id`=0"; + }else{ + tempsql<<"`id`="<0){ tempsql<<","; } +tempsql<<"`message`='"< 0) { @@ -412,7 +325,7 @@ struct fortunebase { tempsql << "`"; } - tempsql << colnames[j]; + tempsql << col_names[j]; } if (j > 0) { @@ -427,19 +340,17 @@ struct fortunebase tempsql << ",\n"; } tempsql << "("; - if (record[i].id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(record[i].id); - } - tempsql << ",'" << stringaddslash(record[i].message) << "'"; - tempsql << ")"; - } - return tempsql.str(); - } + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< 0) { @@ -458,7 +369,7 @@ struct fortunebase { tempsql << "`"; } - tempsql << colnames[j]; + tempsql << col_names[j]; } if (j > 0) { @@ -473,2322 +384,2243 @@ struct fortunebase tempsql << ",\n"; } tempsql << "("; - if (record[i].id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(record[i].id); - } - tempsql << ",'" << stringaddslash(record[i].message) << "'"; - tempsql << ")"; - } - tempsql << " as new ON DUPLICATE KEY UPDATE "; - + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< 0) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') + unsigned char jj=0; + j=0; + if(fileld.size()>0){ + for(;jj0) { - if (j > 0) - { - tempsql << ","; - } - tempsql << keyname; - tempsql << "=new."; - tempsql << keyname; + tempsql<<","; } - continue; - } - if (fileld[jj] == 0x20) - { - - continue; + tempsql< 0) + keyname.push_back(fileld[jj]); + + } + if(keyname.size()>0){ + if(findcolpos(keyname)<255) { - if (findcolpos(keyname) < 255) + if(j>0) { - if (j > 0) - { - tempsql << ","; - } - tempsql << keyname; - tempsql << "=new."; - tempsql << keyname; + tempsql<<","; } + tempsql< data_toarray(std::string fileld = "") - { + std::vector data_toarray(std::string fileld=""){ std::vector temparray; std::string keyname; - unsigned char jj = 0; + unsigned char jj=0; std::vector keypos; - if (fileld.size() > 1) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); + }else{ + for(jj=0;jj data_tomap(std::string fileld=""){ + std::map tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } + }else{ + for(jj=0;jj keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< list_content; + for(;json_offset data_tomap(std::string fileld = "") - { - std::map tempsql; - std::string keyname; - unsigned char jj = 0; - std::vector keypos; - if (fileld.size() > 1) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - continue; - } - if (fileld[jj] == 0x20) - { - - continue; - } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - } - else - { - for (jj = 0; jj < colnames.size(); jj++) - { - keypos.emplace_back(jj); - } - } - - for (jj = 0; jj < keypos.size(); jj++) - { - switch (keypos[jj]) - { - case 0: - if (data.id == 0) - { - tempsql.insert({"id", "0"}); - } - else - { - tempsql.insert({"id", std::to_string(data.id)}); - } - break; - case 1: - tempsql.insert({"message", data.message}); - break; - - default:; - } - } - - return tempsql; - } - - std::string data_tojson() - { - std::ostringstream tempsql; - - tempsql << "{"; - if (data.id == 0) - { - tempsql << "\"id\":0"; - } - else - { - tempsql << "\"id\":" << std::to_string(data.id); - } - tempsql << ",\"message\":\"" << http::utf8_to_jsonstring(data.message); - tempsql << "\""; - tempsql << "}"; - - return tempsql.str(); - } - - std::string data_tojson(std::string fileld) - { - std::ostringstream tempsql; - std::string keyname; - unsigned char jj = 0; - std::vector keypos; - if (fileld.size() > 0) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - continue; - } - if (fileld[jj] == 0x20) - { - - continue; - } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - } - else - { - for (jj = 0; jj < colnames.size(); jj++) - { - keypos.emplace_back(jj); - } - } - tempsql << "{"; - for (jj = 0; jj < keypos.size(); jj++) - { - switch (keypos[jj]) - { - case 0: - if (jj > 0) - { - tempsql << ","; - } - if (data.id == 0) - { - tempsql << "\"id\":0"; - } - else - { - tempsql << "\"id\":" << std::to_string(data.id); - } - break; - case 1: - if (jj > 0) - { - tempsql << ","; - } - tempsql << "\"message\":\"" << http::utf8_to_jsonstring(data.message) << "\""; - break; - - default:; - } - } - tempsql << "}"; - return tempsql.str(); - } - - void from_json(const std::string &json_content) - { - record.clear(); - fortunebase::meta metatemp; - data = metatemp; - unsigned int json_offset = 0; - bool isarray = false; - //std::vector list_content; - for (; json_offset < json_content.size(); json_offset++) - { - if (json_content[json_offset] == '{') + if(json_content[json_offset]=='{') { break; } - if (json_content[json_offset] == '[') + if(json_content[json_offset]=='[') { - isarray = true; + isarray=true; break; } } - if (isarray) + if(isarray) { - json_offset += 1; - std::string json_key_name, json_value_name; - for (; json_offset < json_content.size(); json_offset++) + json_offset+=1; + std::string json_key_name,json_value_name; + for(;json_offset 0) + if(record.size()>0) { - data = metatemp; + data=metatemp; } - if (json_offset >= json_content.size()) + if(json_offset>=json_content.size()) { break; } - for (; json_offset < json_content.size(); json_offset++) + for(;json_offset= json_content.size()) - { - break; - } - json_value_name.clear(); - if (json_content[json_offset] == 0x22) + + if(json_content[json_offset]==0x20||json_content[json_offset]==0x0A||json_content[json_offset]==0x0D||json_content[json_offset]=='\t') { - - temp_offset = json_offset; - json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); - json_offset = temp_offset; - if (json_content[json_offset] == 0x22) - { - json_offset += 1; - } + continue; } else { - if (json_content[json_offset] != '{' && json_content[json_offset] != ']') + if(json_content[json_offset]==0x22) { - for (; json_offset < json_content.size(); json_offset++) + unsigned int temp_offset=json_offset; + json_key_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else + { + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') + { + for(;json_offset 1) + if(record.size()>1) { - data = record[0]; + data=record[0]; } } else { - if (json_content[json_offset] == '{') + if(json_content[json_offset]=='{') { - json_offset += 1; - std::string json_key_name, json_value_name; - - for (; json_offset < json_content.size(); json_offset++) + json_offset+=1; + std::string json_key_name,json_value_name; + + + for(;json_offset=json_content.size()) + { + break; } - break; - } - json_offset += 1; - if (json_offset >= json_content.size()) - { - break; - } - json_value_name.clear(); - if (json_content[json_offset] == 0x22) - { - - temp_offset = json_offset; - json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); - json_offset = temp_offset; - if (json_content[json_offset] == 0x22) + json_value_name.clear(); + if(json_content[json_offset]==0x22) { - json_offset += 1; + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } } - } - else - { - if (json_content[json_offset] != '{' && json_content[json_offset] != ']') + else { - for (; json_offset < json_content.size(); json_offset++) + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') { - if (json_content[json_offset] == 0x5D || json_content[json_offset] == 0x7D || json_content[json_offset] == 0x22 || json_content[json_offset] == 0x2C || json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + for(;json_offset keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } - } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< func,std::string fileld=""){ + std::ostringstream tempsql; + std::string keyname; + unsigned char jj=0; + std::vector keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } - catch (...) - { - data.message.clear(); + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +tempsql<<"\"message\":\""< getRecord(){ + return record; +} + + + template::value,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="message") + { + return data.message; + } + return nullptr; + } + + + template,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="id") + { + return data.id; + } + return nullptr; + } + + + template,bool>::type = true > + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + case 0: + a.emplace_back(iter.id); + break; - void set_val(const std::string &set_key_name, const double set_value_name) - { - switch (findcolpos(set_key_name)) + } + } + + return a; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + return a; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + + case 0: + return data.id; + break; + } + return 0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] fortunebase::meta & iter,[[maybe_unused]] std::string keyname) { - case 0: - try - { - data.id = (unsigned int)set_value_name; - } - catch (...) - { - data.id = 0; - } - break; - case 1: - try - { - data.message = std::to_string(set_value_name); - } - catch (...) - { - data.message.clear(); - } - break; - default: - { - } - } - } - std::string to_json(std::string fileld = "") - { - std::ostringstream tempsql; - std::string keyname; - unsigned char jj = 0; - std::vector keypos; - if (fileld.size() > 0) - { - for (; jj < fileld.size(); jj++) + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) { - if (fileld[jj] == ',') + case 0: + return iter.id; + break; + + } + + return 0; + } + + template,bool>::type = true > + T getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - continue; + + + } + + + return 0.0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + } - if (fileld[jj] == 0x20) + + + + return 0.0; + } + + template::value,bool>::type = true > + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) { - continue; + case 1: + return data.message; + break; + } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - } - else - { - for (jj = 0; jj < colnames.size(); jj++) - { - keypos.emplace_back(jj); - } - } - tempsql << "["; - for (size_t n = 0; n < record.size(); n++) + return ""; + } + + template::value,bool>::type = true > + std::string getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) + { + + case 1: + return iter.message; + break; + + } + + + + return ""; + } + + template::value,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + a.emplace_back(iter.message); + break; + } + } + + return a; + } + + std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) { - if (n > 0) - { - tempsql << ",{"; - } - else + std::ostringstream a; + + unsigned char kpos; + kpos=findcolpos(keyname); + int j=0; + if(isyinhao&&record.size()>0) { - tempsql << "{"; + a<<'"'; } - - for (jj = 0; jj < keypos.size(); jj++) + for(auto &iter:record) { - switch (keypos[jj]) - { - case 0: - if (jj > 0) - { - tempsql << ","; - } - if (record[n].id == 0) - { - tempsql << "\"id\":0"; - } - else + if(j>0) { - tempsql << "\"id\":" << std::to_string(record[n].id); + if(isyinhao) + { + a<<"\",\""; + }else{ + a<<','; + } } - break; - case 1: - if (jj > 0) + switch(kpos) { - tempsql << ","; + + case 0: + a<0){ + a<<'"'; + } + + return a.str(); + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp,vtemp; + for(auto &iter:record) + { + switch(kpos) + { - default:; - } - } - tempsql << "}"; - } - tempsql << "]"; - return tempsql.str(); - } + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; - std::string to_json(std::function func, std::string fileld = "") - { - std::ostringstream tempsql; - std::string keyname; - unsigned char jj = 0; - std::vector keypos; - if (fileld.size() > 0) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') + } + if(ktemp.size()>0) { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - continue; + a.emplace(ktemp,vtemp); } - if (fileld[jj] == 0x20) + } + + + return a; + } + + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) { + + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ - continue; } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - } - else - { - for (jj = 0; jj < colnames.size(); jj++) - { - keypos.emplace_back(jj); - } - } - tempsql << "["; - for (size_t n = 0; n < record.size(); n++) - { - keyname.clear(); - if (func(keyname, record[n])) - { - if (n > 0) + if(ktemp.size()>0) { - tempsql << ",{"; + a.emplace(ktemp,vtemp); } - else + } + + return a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + std::string vtemp; + for(auto &iter:record) { - tempsql << "{"; - } - tempsql << keyname; - } - else - { - continue; - } + switch(kpos) + { - for (jj = 0; jj < keypos.size(); jj++) - { + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; - switch (keypos[jj]) - { - case 0: - if (jj > 0) - { - tempsql << ","; - } - if (record[n].id == 0) - { - tempsql << "\"id\":0"; - } - else - { - tempsql << "\"id\":" << std::to_string(record[n].id); } - break; - case 1: - if (jj > 0) + if(ktemp.size()>0) { - tempsql << ","; + a.emplace(ktemp,vtemp); } - tempsql << "\"message\":\"" << http::utf8_to_jsonstring(record[n].message) << "\""; - break; - - default:; - } - } - tempsql << "}"; - } - tempsql << "]"; - return tempsql.str(); - } - long long getPK() { return data.id; } - void setPK(long long val) { data.id = val; } - unsigned int getId() { return data.id; } - void setId(unsigned int val) { data.id = val; } - - std::string getMessage() { return data.message; } - std::string &getRefMessage() { return std::ref(data.message); } - void setMessage(std::string &val) { data.message = val; } - void setMessage(std::string_view val) { data.message = val; } - - fortunebase::meta getnewData() - { - struct meta newdata; - return newdata; - } - fortunebase::meta getData() - { - return data; - } - std::vector getRecord() - { - return record; - } - - template ::value, bool>::type = true> - T &ref_meta([[maybe_unused]] std::string key_name) - { - if (key_name == "message") - { - return data.message; - } - return nullptr; - } - - template , bool>::type = true> - T &ref_meta([[maybe_unused]] std::string key_name) - { - if (key_name == "id") - { - return data.id; - } - return nullptr; - } - - template , bool>::type = true> - T &ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - template , bool>::type = true> - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) - { - case 0: - a.emplace_back(iter.id); - break; - } - } - - return a; - } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - template , bool>::type = true> - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + return a; - } - - template , bool>::type = true> - T getVal([[maybe_unused]] std::string keyname) - { - - unsigned char kpos; - kpos = findcolpos(keyname); - switch (kpos) - { - - case 0: - return data.id; - break; - } - return 0; - } - - template , bool>::type = true> - T getVal([[maybe_unused]] fortunebase::meta &iter, [[maybe_unused]] std::string keyname) - { + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos; - kpos = findcolpos(keyname); - switch (kpos) - { - case 0: - return iter.id; - break; - } + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; - return 0; - } + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { - template , bool>::type = true> - T getVal(std::string keyname) - { - unsigned char kpos; - kpos = findcolpos(keyname); + case 0: + a.emplace(iter.id,iter); + break; - switch (kpos) - { - } + } + } + + return a; + } + + template::value,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { - return 0.0; - } + case 1: + a.emplace(iter.message,iter); + break; - template , bool>::type = true> - T getVal([[maybe_unused]] fortunebase::meta &iter, std::string keyname) - { - unsigned char kpos; - kpos = findcolpos(keyname); - switch (kpos) - { - } + } + //a.emplace(ktemp,iter); + } + - return 0.0; + return a; } - - template ::value, bool>::type = true> - std::string getVal(std::string keyname) - { - unsigned char kpos; - kpos = findcolpos(keyname); - - switch (kpos) + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - case 1: - return data.message; - break; - } - return ""; - } - - template ::value, bool>::type = true> - std::string getVal([[maybe_unused]] fortunebase::meta &iter, std::string keyname) - { - - unsigned char kpos; - kpos = findcolpos(keyname); + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - switch (kpos) - { + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ - case 1: - return iter.message; - break; - } + } - return ""; - } + a.emplace_back(ktemp,vtemp); + } - template ::value, bool>::type = true> - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; + - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) { - switch (kpos) - { - - case 1: - a.emplace_back(iter.message); - break; - } - } - - return a; - } - - std::string getstrCol(std::string keyname, [[maybe_unused]] bool isyinhao = false) - { - std::ostringstream a; + std::vector> a; - unsigned char kpos; - kpos = findcolpos(keyname); - int j = 0; - if (isyinhao && record.size() > 0) - { - a << '"'; - } - for (auto &iter : record) - { - if (j > 0) - { - if (isyinhao) - { - a << "\",\""; - } - else + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) { - a << ','; - } - } - switch (kpos) - { + switch(kpos) + { - case 0: - a << std::to_string(iter.id); - break; - case 1: - if (isyinhao) - { - a << jsonaddslash(iter.message); - } - else + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) { - a << iter.message; - } - break; - } - j++; - } - if (isyinhao && j > 0) - { - a << '"'; - } - - return a.str(); - } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - std::string ktemp, vtemp; - for (auto &iter : record) - { - switch (kpos) - { + + switch(kpos) + { - case 1: - ktemp = iter.message; - break; - } - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - return a; - } + case 0: + ktemp=iter.id; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; + case 1: + ktemp=iter.message; + break; + } + switch(vpos){ +case 1: + vtemp=iter.message; + break; + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - std::string ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } - switch (vpos) - { - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - switch (vpos) - { - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - std::string vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - std::string ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - - template , bool>::type = true> - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - a.emplace(iter.id, iter); - break; - } - } - - return a; - } - - template ::value, bool>::type = true> - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) - { - - case 1: - a.emplace(iter.message, iter); - break; - } - //a.emplace(ktemp,iter); - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - std::string ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } - switch (vpos) - { - } - - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - switch (vpos) - { - } - - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } - - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } - - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template , bool>::type = true> - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - a.emplace_back(iter.id, iter); - break; - } - } - - return a; - } - template ::value, bool>::type = true> - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) - { - - case 1: - a.emplace_back(iter.message, iter); - break; - } - } - - return a; - } - template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - - switch (dpos) - { - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - - switch (dpos) - { - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } - - switch (dpos) - { - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } - - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - } - } - - return a; - } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } - - switch (dpos) - { - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - } - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - - switch (dpos) - { - } - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for (auto &iter : record) - { - - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } - - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - } - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; + case 0: + a.emplace_back(iter.id,iter); + break; - for (auto &iter : record) + } + } + + return a; + } + template::value,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) { - - switch (kpos) + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) { + switch(kpos) + { - case 1: - ktemp = iter.message; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - } + case 1: + a.emplace_back(iter.message,iter); + break; - switch (dpos) - { - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - } - } + } + } + return a; } + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; + case 0: + ktemp=iter.id; + break; + } - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } + + switch(dpos){ + + } + } - for (auto &iter : record) + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { - switch (kpos) + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) { + switch(kpos) + { - case 1: - ktemp = iter.message; - break; - } + case 0: + ktemp=iter.id; + break; + } - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } - switch (dpos) - { - } - } + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; - return a; - } - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; + case 0: + ktemp=iter.id; + break; + } - for (auto &iter : record) - { + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } - switch (kpos) - { + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; - case 1: - ktemp = iter.message; - break; - } + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } + case 0: + ktemp=iter.id; + break; + } - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - } - } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } - return a; - } + switch(dpos){ - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { - std::map>> a; + std::map>> a; - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); T ktemp; U vtemp; - // D dtemp; + // D dtemp; - for (auto &iter : record) - { - switch (kpos) + for(auto &iter:record) + { + switch(kpos) { - case 1: - ktemp = iter.message; - break; - } + case 0: + ktemp=iter.id; + break; + } - switch (vpos) - { - case 1: - vtemp = iter.message; - break; - } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } - switch (dpos) - { - case 1: - a[ktemp][vtemp].emplace_back(iter.message); - break; - } - } + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + } + } + return a; } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + case 0: + ktemp=iter.id; + break; + } - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } - for (auto &iter : record) - { - switch (kpos) - { + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; - case 1: - ktemp = iter.message; - break; - } + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for(auto &iter:record) + { + switch(kpos) + { - switch (vpos) - { - case 1: - a[ktemp].emplace_back(iter.message); - break; - } - } + case 1: + ktemp=iter.message; + break; + } - return a; - } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + switch(dpos){ - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + } + } + - for (auto &iter : record) + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { - switch (kpos) + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + + for(auto &iter:record) { + + switch(kpos) + { - case 1: - ktemp = iter.message; - break; - } + case 1: + ktemp=iter.message; + break; + } - switch (vpos) - { - } - } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } - return a; - } + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { - std::map> a; + std::map>> a; - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); T ktemp; - //U vtemp; - - for (auto &iter : record) - { - - switch (kpos) - { - - case 1: - ktemp = iter.message; - break; - } + U vtemp; + // D dtemp; - switch (vpos) + for(auto &iter:record) + { + + switch(kpos) { - case 0: - a[ktemp].emplace_back(iter.id); - break; - } - } - return a; - } + case 1: + ktemp=iter.message; + break; + } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + switch(vpos){ + case 0: + vtemp=iter.id; + break; + } - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; - for (auto &iter : record) + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - switch (kpos) + for(auto &iter:record) { + switch(kpos) + { - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - case 1: - a[ktemp].emplace_back(iter.message); - break; - } - } + case 1: + ktemp=iter.message; + break; + } - return a; - } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + switch(dpos){ - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + } + } - for (auto &iter : record) + + return a; + } + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - switch (kpos) + for(auto &iter:record) { + + switch(kpos) + { - case 0: - ktemp = iter.id; - break; - } - - switch (vpos) - { - } - } + case 1: + ktemp=iter.message; + break; + } - return a; - } + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { - for (auto &iter : record) - { + case 1: + ktemp=iter.message; + break; + } - switch (kpos) - { + switch(vpos){ + case 1: + vtemp=iter.message; + break; + } - case 0: - ktemp = iter.id; - break; - } + switch(dpos){ + case 1: + a[ktemp][vtemp].emplace_back(iter.message); + break; - switch (vpos) - { - case 0: - a[ktemp].emplace_back(iter.id); - break; - } + } + } + + return a; } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; - return a; - } + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; - template , bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos; - kpos = findcolpos(keyname); + case 1: + ktemp=iter.message; + break; + } - for (auto &iter : record) - { - switch (kpos) - { + switch(vpos){ + case 1: + a[ktemp].emplace_back(iter.message); + break; - case 0: - a[iter.id].emplace_back(iter); - break; - } + } + } + + return a; } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; - return a; - } + for(auto &iter:record) + { + switch(kpos) + { - template ::value, bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; + case 1: + ktemp=iter.message; + break; + } + + switch(vpos){ - unsigned char kpos; - kpos = findcolpos(keyname); + } + } - for (auto &iter : record) + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; - switch (kpos) + for(auto &iter:record) { + + switch(kpos) + { - case 1: - a[iter.message].emplace_back(iter); - break; - } - } + case 1: + ktemp=iter.message; + break; + } - return a; - } + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + a[ktemp].emplace_back(iter.message); + break; + + } + } - for (auto &iter : record) + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; - switch (kpos) + for(auto &iter:record) { + + switch(kpos) + { - case 1: - ktemp = iter.message; - break; - } + case 0: + ktemp=iter.id; + break; + } - switch (vpos) - { - case 1: - a[ktemp][iter.message].emplace_back(iter); - break; - } - } + switch(vpos){ - return a; - } + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + case 0: + ktemp=iter.id; + break; + } - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; - for (auto &iter : record) + } + } + + return a; + } + + template,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); - switch (kpos) + for(auto &iter:record) { + switch(kpos) + { - case 1: - ktemp = iter.message; - break; - } + case 0: + a[iter.id].emplace_back(iter); + break; - switch (vpos) - { - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - } + } + } + + return a; } + + template::value,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + for(auto &iter:record) + { + + switch(kpos) + { - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; + case 1: + a[iter.message].emplace_back(iter); + break; - for (auto &iter : record) + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; - switch (kpos) + for(auto &iter:record) { + + switch(kpos) + { - case 0: - ktemp = iter.id; - break; - } + case 1: + ktemp=iter.message; + break; + } - switch (vpos) - { - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - } - } + switch(vpos){ + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; - return a; - } + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + case 1: + ktemp=iter.message; + break; + } - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; - for (auto &iter : record) - { + } + } - switch (kpos) + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) { + + switch(kpos) + { - case 0: - ktemp = iter.id; - break; - } + case 0: + ktemp=iter.id; + break; + } - switch (vpos) - { - case 1: - a[ktemp][iter.message].emplace_back(iter); - break; - } - } + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; - return a; - } -}; + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; + } + + switch(vpos){ + case 1: + a[ktemp][iter.message].emplace_back(iter); + break; + + } + } + + return a; + } + + }; + -}// namespace orm +} #endif + \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h old mode 100755 new mode 100644 index dc44d63a6a0..35cae19e40f --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -1,450 +1,333 @@ #ifndef ORM_DEFAULT_WORLDBASEMATA_H #define ORM_DEFAULT_WORLDBASEMATA_H /* - *This file is auto create from cli - *本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT - ***/ +*This file is auto create from cli +*本文件为自动生成 Sun, 02 Mar 2025 08:24:41 GMT +***/ #include #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include +#include "unicode.h" -namespace orm -{ - +namespace orm { + + struct worldbase { - struct meta - { - unsigned int id = 0;// - int randomnumber = 0;// - } data; - std::vector record; - std::string _rmstag = "default";//this value must be default or tag value, tag in mysqlconnect config file . - std::vector _keypos{0x00}; - - std::vector::iterator begin() { return record.begin(); } - std::vector::iterator end() { return record.end(); } - std::vector::const_iterator begin() const { return record.begin(); } - std::vector::const_iterator end() const { return record.end(); } - const std::array colnames = {"id", "randomnumber"}; - const std::array colnamestype = {3, 3}; - std::string tablename = "world"; - std::string modelname = "World"; - - unsigned char findcolpos(const std::string &coln) - { - if (coln.size() == 0) - { - return 255; - } - unsigned char bi = coln[0]; - - if (bi < 91 && bi > 64) - { - bi += 32; - } - switch (coln[0]) - { - - case 'i': - return 0; - break; - case 'r': - return 1; - break; - } - return 255; - } - - int size() { return record.size(); } - - void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, meta &data_temp) - { - /* - unsigned int id = 0;// - int randomnumber = 0;// - */ - bool is_minus = false; - switch (index_pos) - { - case 0: - data_temp.id = 0; - for (size_t i = 0; i < value_size; i++) - { - if (result_temp_data[i] >= '0' && result_temp_data[i] <= '9') - { - data_temp.id = data_temp.id * 10 + (result_temp_data[i] - '0'); - } - } - break; - case 1: - - data_temp.randomnumber = 0; - - is_minus = false; - if (value_size > 0) - { - if (result_temp_data[0] == '-') - { - is_minus = true; - } - } - for (std::size_t i = 0; i < value_size; i++) - { - if (result_temp_data[i] >= '0' && result_temp_data[i] <= '9') - { - data_temp.randomnumber = data_temp.randomnumber * 10 + (result_temp_data[i] - '0'); - } - } - if (is_minus) - { - data_temp.randomnumber = ~(data_temp.randomnumber - 1); - } - break; - default: - break; - } - } - - std::string getPKname() - { - return "id"; - } - - void record_reset() - { - record.clear(); - } - void data_reset() - { - worldbase::meta metatemp; - data = metatemp; - } - - std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql) - { - std::string temp; - - return temp; - } - - inline std::string stringaddslash(std::string &content) - { + struct meta{ + unsigned int id = 0; ///**/ + int randomnumber = 0; ///**/ + } data; + std::vector record; +std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . +unsigned int _offset=0; +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } +static constexpr std::array col_names={"id","randomnumber"}; +static constexpr std::array col_types={3,3}; +static constexpr std::array col_length={0,0}; +static constexpr std::array col_decimals={0,0}; +std::string tablename="world"; +static constexpr std::string_view modelname="World"; + + unsigned char findcolpos(const std::string &coln){ + if(coln.size()==0) + { + return 255; + } + unsigned char bi=coln[0]; + + + if(bi<91&&bi>64){ + bi+=32; + } + switch(coln[0]){ + + + case 'i': + return 0; +break; +case 'r': + return 1; +break; + + } + return 255; + } + + int size(){ return record.size(); } + + std::string getPKname(){ + return "id"; +} + + void record_reset() + { + record.clear(); + } + void data_reset(){ + worldbase::meta metatemp; + data = metatemp; + } + + std::string soft_remove_sql([[maybe_unused]] const std::string &fieldsql){ + std::string temp; + + return temp; + } + + + inline std::string stringaddslash(const std::string &content){ std::string temp; - for (unsigned int i = 0; i < content.size(); i++) - { - if (content[i] == '\'') - { + for(unsigned int i=0;i 0) - { - tempsql << "`,`"; - } - else - { - tempsql << "`"; - } - tempsql << colnames[j]; - } - if (j > 0) - { - tempsql << "`"; - } - tempsql << ") VALUES ("; - - if (data.id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(data.id); - } - if (data.randomnumber == 0) - { - tempsql << ",0"; - } - else - { - tempsql << "," << std::to_string(data.randomnumber); - } - tempsql << ")"; - - return tempsql.str(); - } - - std::string _makerecordinsertsql(meta &insert_data) - { - unsigned int j = 0; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(data.id==0){ +tempsql<<"null"; + }else{ + tempsql< 0) - { - tempsql << "`,`"; - } - else - { - tempsql << "`"; - } - tempsql << colnames[j]; - } - if (j > 0) - { - tempsql << "`"; - } - tempsql << ") VALUES ("; - - if (insert_data.id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(insert_data.id); - } - if (insert_data.randomnumber == 0) - { - tempsql << ",0"; - } - else - { - tempsql << "," << std::to_string(insert_data.randomnumber); - } - tempsql << ")"; - - return tempsql.str(); - } - - std::string _makerecordinsertsql(std::vector &insert_data) - { - unsigned int j = 0; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; + + if(insert_data.id==0){ +tempsql<<"null"; + }else{ + tempsql< &insert_data){ + unsigned int j=0; std::ostringstream tempsql; - tempsql << "INSERT INTO "; - tempsql << tablename; - tempsql << " ("; - for (; j < colnames.size(); j++) - { - if (j > 0) - { - tempsql << "`,`"; - } - else - { - tempsql << "`"; - } - tempsql << colnames[j]; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql< 0) - { - tempsql << "`"; + if(j>0){ + tempsql<<"`"; } - tempsql << ") VALUES "; + tempsql<<") VALUES "; - for (unsigned int i = 0; i < insert_data.size(); i++) + for(unsigned int i=0;i 0) + if(i>0) { - tempsql << ","; + tempsql<<","; } - tempsql << "("; + tempsql<<"("; - if (insert_data[i].id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(insert_data[i].id); - } - if (insert_data[i].randomnumber == 0) - { - tempsql << ",0"; - } - else - { - tempsql << "," << std::to_string(insert_data[i].randomnumber); - } - tempsql << ")"; - } - return tempsql.str(); - } + if(insert_data[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< 0) - { - unsigned char bpos_i = findcolpos(keyname); -#ifdef DEBUG - if (bpos_i == 254) - { - std::cout << "\033[1m\033[31m-----------\n" - << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" - << std::endl; - } -#endif - keypos.emplace_back(bpos_i); - keyname.clear(); - } - for (jj = 0; jj < keypos.size(); jj++) - { - switch (keypos[jj]) - { + continue; + } + keyname.push_back(fileld[jj]); - case 0: - if (jj > 0) - { - tempsql << ","; - } - if (data.id == 0) - { - tempsql << "`id`=0"; - } - else - { - tempsql << "`id`=" << std::to_string(data.id); - } - break; - case 1: - if (jj > 0) - { - tempsql << ","; - } - if (data.randomnumber == 0) - { - tempsql << "`randomnumber`=0"; - } - else + } + if(keyname.size()>0){ + unsigned char bpos_i=findcolpos(keyname); + #ifdef DEBUG + if (bpos_i == 255) { - tempsql << "`randomnumber`=" << std::to_string(data.randomnumber); + std::cout << "\033[1m\033[31m-----------\n" + << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" + << std::endl; } - break; - - default:; - } - } - } +#endif + keypos.emplace_back(bpos_i); + keyname.clear(); + } + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"`id`=0"; + }else{ + tempsql<<"`id`="<0){ tempsql<<","; } +if(data.randomnumber==0){ + tempsql<<"`randomnumber`=0"; + }else{ + tempsql<<"`randomnumber`="< 0) { @@ -462,7 +345,7 @@ struct worldbase { tempsql << "`"; } - tempsql << colnames[j]; + tempsql << col_names[j]; } if (j > 0) { @@ -477,26 +360,21 @@ struct worldbase tempsql << ",\n"; } tempsql << "("; - if (record[i].id == 0) - { - tempsql << "null"; - } - else - { - tempsql << std::to_string(record[i].id); - } - if (record[i].randomnumber == 0) - { - tempsql << ",0"; - } - else - { - tempsql << "," << std::to_string(record[i].randomnumber); - } - tempsql << ")"; - } - return tempsql.str(); - } + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql< 0) { @@ -515,7 +393,7 @@ struct worldbase { tempsql << "`"; } - tempsql << colnames[j]; + tempsql << col_names[j]; } if (j > 0) { @@ -530,2131 +408,2041 @@ struct worldbase tempsql << ",\n"; } tempsql << "("; - if (record[i].id == 0) - { - tempsql << "null"; + if(record[i].id==0){ + tempsql<<"null"; + }else{ + tempsql<0){ + for(;jj0) + { + tempsql<<","; + } + tempsql<0){ + if(findcolpos(keyname)<255) { - tempsql << ",0"; - } - else - { - tempsql << "," << std::to_string(record[i].randomnumber); - } - tempsql << ")"; - } - tempsql << " as new ON DUPLICATE KEY UPDATE "; - - std::string keyname; - unsigned char jj = 0; - j = 0; - if (fileld.size() > 0) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - if (findcolpos(keyname) < 255) - { - if (j > 0) - { - tempsql << ","; - } - tempsql << keyname; - tempsql << "=new."; - tempsql << keyname; - } - continue; - } - if (fileld[jj] == 0x20) - { - - continue; - } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - if (findcolpos(keyname) < 255) - { - if (j > 0) - { - tempsql << ","; - } - tempsql << keyname; - tempsql << "=new."; - tempsql << keyname; - } + if(j>0) + { + tempsql<<","; + } + tempsql< data_toarray(std::string fileld = "") - { + std::vector data_toarray(std::string fileld=""){ std::vector temparray; std::string keyname; - unsigned char jj = 0; + unsigned char jj=0; std::vector keypos; - if (fileld.size() > 1) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); + if(fileld.size()>1){ + for(;jj 0) - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - } - else - { - for (jj = 0; jj < colnames.size(); jj++) - { - keypos.emplace_back(jj); - } - } - - for (jj = 0; jj < keypos.size(); jj++) - { - switch (keypos[jj]) - { - case 0: - if (data.id == 0) - { - temparray.push_back("0"); - } - else - { - temparray.push_back(std::to_string(data.id)); - } - break; - case 1: - if (data.randomnumber == 0) - { - temparray.push_back("0"); - } - else - { - temparray.push_back(std::to_string(data.randomnumber)); - } - break; - default:; + } + if(keyname.size()>0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } - } - - return temparray; - } - - std::map data_tomap(std::string fileld = "") - { - std::map tempsql; + }else{ + for(jj=0;jj data_tomap(std::string fileld=""){ + std::map tempsql; std::string keyname; - unsigned char jj = 0; + unsigned char jj=0; std::vector keypos; - if (fileld.size() > 1) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - continue; - } - if (fileld[jj] == 0x20) - { - - continue; - } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); + if(fileld.size()>1){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } - tempsql << "}"; - - return tempsql.str(); - } - - std::string data_tojson(std::string fileld) - { + }else{ + for(jj=0;jj keypos; - if (fileld.size() > 0) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - continue; - } - if (fileld[jj] == 0x20) - { - - continue; - } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); + if(fileld.size()>0){ + for(;jj 0) - { - tempsql << ","; - } - if (data.id == 0) - { - tempsql << "\"id\":0"; - } - else - { - tempsql << "\"id\":" << std::to_string(data.id); - } - break; - case 1: - if (jj > 0) - { - tempsql << ","; - } - if (data.randomnumber == 0) - { - tempsql << "\"randomnumber\":0"; - } - else - { - tempsql << "\"randomnumber\":" << std::to_string(data.randomnumber); - } - break; + if(fileld[jj]==0x20){ - default:; + continue; } - } - tempsql << "}"; - return tempsql.str(); - } + keyname.push_back(fileld[jj]); + } + if(keyname.size()>0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } +if(data.id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(data.randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< list_content; - for (; json_offset < json_content.size(); json_offset++) + for(;json_offset 0) + if(record.size()>0) { - data = metatemp; + data=metatemp; } - if (json_offset >= json_content.size()) + if(json_offset>=json_content.size()) { break; } - for (; json_offset < json_content.size(); json_offset++) + for(;json_offset= json_content.size()) - { - break; - } - json_value_name.clear(); - if (json_content[json_offset] == 0x22) + + if(json_content[json_offset]==0x20||json_content[json_offset]==0x0A||json_content[json_offset]==0x0D||json_content[json_offset]=='\t') { - - temp_offset = json_offset; - json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); - json_offset = temp_offset; - if (json_content[json_offset] == 0x22) - { - json_offset += 1; - } + continue; } else { - if (json_content[json_offset] != '{' && json_content[json_offset] != ']') + if(json_content[json_offset]==0x22) { - for (; json_offset < json_content.size(); json_offset++) + unsigned int temp_offset=json_offset; + json_key_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + for(;json_offset=json_content.size()) + { + break; + } + json_value_name.clear(); + if(json_content[json_offset]==0x22) + { + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } + } + else { - if (json_content[json_offset] == 0x5D || json_content[json_offset] == 0x7D || json_content[json_offset] == 0x22 || json_content[json_offset] == 0x2C || json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') { - if (json_content[json_offset] == 0x7D) + for(;json_offset 1) + if(record.size()>1) { - data = record[0]; + data=record[0]; } } else { - if (json_content[json_offset] == '{') + if(json_content[json_offset]=='{') { - json_offset += 1; - std::string json_key_name, json_value_name; - - for (; json_offset < json_content.size(); json_offset++) + json_offset+=1; + std::string json_key_name,json_value_name; + + + for(;json_offset=json_content.size()) + { + break; } - break; - } - json_offset += 1; - if (json_offset >= json_content.size()) - { - break; - } - json_value_name.clear(); - if (json_content[json_offset] == 0x22) - { - - temp_offset = json_offset; - json_value_name = http::jsonstring_to_utf8(&json_content[json_offset], json_content.size() - json_offset, temp_offset); - json_offset = temp_offset; - if (json_content[json_offset] == 0x22) + json_value_name.clear(); + if(json_content[json_offset]==0x22) { - json_offset += 1; + + temp_offset=json_offset; + json_value_name=http::jsonstring_to_utf8(&json_content[json_offset],json_content.size()-json_offset,temp_offset); + json_offset=temp_offset; + if(json_content[json_offset]==0x22) + { + json_offset+=1; + } } - } - else - { - if (json_content[json_offset] != '{' && json_content[json_offset] != ']') + else { - for (; json_offset < json_content.size(); json_offset++) + if(json_content[json_offset]!='{'&&json_content[json_offset]!=']') { - if (json_content[json_offset] == 0x5D || json_content[json_offset] == 0x7D || json_content[json_offset] == 0x22 || json_content[json_offset] == 0x2C || json_content[json_offset] == 0x20 || json_content[json_offset] == 0x0A || json_content[json_offset] == 0x0D || json_content[json_offset] == '\t') + for(;json_offset keypos; + if(fileld.size()>0){ + for(;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } - } - - std::string to_json(std::string fileld = "") - { - std::ostringstream tempsql; + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(record[n].randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< func,std::string fileld=""){ + std::ostringstream tempsql; std::string keyname; - unsigned char jj = 0; + unsigned char jj=0; std::vector keypos; - if (fileld.size() > 0) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); + if(fileld.size()>0){ + for(;jj 0) - { - keypos.emplace_back(findcolpos(keyname)); + + } + if(keyname.size()>0){ + keypos.emplace_back(findcolpos(keyname)); keyname.clear(); } - } - else - { - for (jj = 0; jj < colnames.size(); jj++) - { - keypos.emplace_back(jj); + }else{ + for(jj=0;jj 0) - { - tempsql << ",{"; - } - else - { - tempsql << "{"; - } - - for (jj = 0; jj < keypos.size(); jj++) - { - switch (keypos[jj]) + tempsql<<"["; + for(size_t n=0;n0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } +if(record[n].id==0){ + tempsql<<"\"id\":0"; + }else{ + tempsql<<"\"id\":"<0){ tempsql<<","; } +if(record[n].randomnumber==0){ + tempsql<<"\"randomnumber\":0"; + }else{ + tempsql<<"\"randomnumber\":"< getRecord(){ + return record; +} + + + template::value,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + + template,bool>::type = true> + T& ref_meta([[maybe_unused]] std::string key_name) + { + if(key_name=="id") + { + return data.id; + } + if(key_name=="randomnumber") + { + return data.randomnumber; + } + return nullptr; + } + + + template,bool>::type = true > + T& ref_meta([[maybe_unused]] std::string key_name) + { + return nullptr; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) { - case 0: - if (jj > 0) - { - tempsql << ","; - } - if (record[n].id == 0) - { - tempsql << "\"id\":0"; - } - else - { - tempsql << "\"id\":" << std::to_string(record[n].id); - } - break; - case 1: - if (jj > 0) - { - tempsql << ","; - } - if (record[n].randomnumber == 0) + switch(kpos) { - tempsql << "\"randomnumber\":0"; + case 0: + a.emplace_back(iter.id); + break; + case 1: + a.emplace_back(iter.randomnumber); + break; + } - else + } + + return a; + } + + template,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) + { + std::vector a; + + + return a; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) { - tempsql << "\"randomnumber\":" << std::to_string(record[n].randomnumber); - } - break; - default:; - } - } - tempsql << "}"; - } - tempsql << "]"; - return tempsql.str(); - } + case 0: + return data.id; + break; + case 1: + return data.randomnumber; + break; + } + return 0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] worldbase::meta & iter,[[maybe_unused]] std::string keyname) + { + + + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) + { + case 0: + return iter.id; + break; + case 1: + return iter.randomnumber; + break; + + } - std::string to_json(std::function func, std::string fileld = "") - { - std::ostringstream tempsql; - std::string keyname; - unsigned char jj = 0; - std::vector keypos; - if (fileld.size() > 0) - { - for (; jj < fileld.size(); jj++) - { - if (fileld[jj] == ',') - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - continue; - } - if (fileld[jj] == 0x20) + return 0; + } + + template,bool>::type = true > + T getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) { - continue; - } - keyname.push_back(fileld[jj]); - } - if (keyname.size() > 0) - { - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - } - else - { - for (jj = 0; jj < colnames.size(); jj++) - { - keypos.emplace_back(jj); - } - } - tempsql << "["; - for (size_t n = 0; n < record.size(); n++) - { - keyname.clear(); - if (func(keyname, record[n])) - { - if (n > 0) + + } + + + return 0.0; + } + + template,bool>::type = true > + T getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + switch(kpos) { - tempsql << ",{"; + } - else + + + + return 0.0; + } + + template::value,bool>::type = true > + std::string getVal(std::string keyname) + { + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) { - tempsql << "{"; - } - tempsql << keyname; - } - else - { - continue; - } - for (jj = 0; jj < keypos.size(); jj++) - { - - switch (keypos[jj]) + + } + return ""; + } + + template::value,bool>::type = true > + std::string getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + { + + unsigned char kpos; + kpos=findcolpos(keyname); + + switch(kpos) { - case 0: - if (jj > 0) - { - tempsql << ","; - } - if (record[n].id == 0) - { - tempsql << "\"id\":0"; - } - else - { - tempsql << "\"id\":" << std::to_string(record[n].id); - } - break; - case 1: - if (jj > 0) - { - tempsql << ","; - } - if (record[n].randomnumber == 0) - { - tempsql << "\"randomnumber\":0"; - } - else - { - tempsql << "\"randomnumber\":" << std::to_string(record[n].randomnumber); - } - break; - default:; + } - } - tempsql << "}"; - } - tempsql << "]"; - return tempsql.str(); - } - long long getPK() { return data.id; } - void setPK(long long val) { data.id = val; } - unsigned int getId() { return data.id; } - void setId(unsigned int val) { data.id = val; } - - int getRandomnumber() { return data.randomnumber; } - void setRandomnumber(int val) { data.randomnumber = val; } - - worldbase::meta getnewData() - { - struct meta newdata; - return newdata; - } - worldbase::meta getData() - { - return data; - } - std::vector getRecord() - { - return record; - } - - template ::value, bool>::type = true> - T &ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - template , bool>::type = true> - T &ref_meta([[maybe_unused]] std::string key_name) - { - if (key_name == "id") - { - return data.id; - } - if (key_name == "randomnumber") - { - return data.randomnumber; - } - return nullptr; - } - - template , bool>::type = true> - T &ref_meta([[maybe_unused]] std::string key_name) - { - return nullptr; - } - - template , bool>::type = true> - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) + + + + return ""; + } + + template::value,bool>::type = true > + std::vector getCol([[maybe_unused]] std::string keyname) { - case 0: - a.emplace_back(iter.id); - break; - case 1: - a.emplace_back(iter.randomnumber); - break; - } - } - - return a; - } - - template , bool>::type = true> - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; - - return a; - } - - template , bool>::type = true> - T getVal([[maybe_unused]] std::string keyname) - { - - unsigned char kpos; - kpos = findcolpos(keyname); - switch (kpos) - { - - case 0: - return data.id; - break; - case 1: - return data.randomnumber; - break; - } - return 0; - } - - template , bool>::type = true> - T getVal([[maybe_unused]] worldbase::meta &iter, [[maybe_unused]] std::string keyname) - { - - unsigned char kpos; - kpos = findcolpos(keyname); - switch (kpos) - { - case 0: - return iter.id; - break; - case 1: - return iter.randomnumber; - break; - } - - return 0; - } - - template , bool>::type = true> - T getVal(std::string keyname) - { - unsigned char kpos; - kpos = findcolpos(keyname); - - switch (kpos) - { - } - - return 0.0; - } - - template , bool>::type = true> - T getVal([[maybe_unused]] worldbase::meta &iter, std::string keyname) - { - unsigned char kpos; - kpos = findcolpos(keyname); - switch (kpos) - { - } - - return 0.0; - } - - template ::value, bool>::type = true> - std::string getVal(std::string keyname) - { - unsigned char kpos; - kpos = findcolpos(keyname); - - switch (kpos) - { - } - return ""; - } - - template ::value, bool>::type = true> - std::string getVal([[maybe_unused]] worldbase::meta &iter, std::string keyname) - { - - unsigned char kpos; - kpos = findcolpos(keyname); - - switch (kpos) - { - } - - return ""; - } + std::vector a; - template ::value, bool>::type = true> - std::vector getCol([[maybe_unused]] std::string keyname) - { - std::vector a; + return a; } - - std::string getstrCol(std::string keyname, [[maybe_unused]] bool isyinhao = false) - { - std::ostringstream a; - - unsigned char kpos; - kpos = findcolpos(keyname); - int j = 0; - if (isyinhao && record.size() > 0) - { - a << '"'; - } - for (auto &iter : record) + + std::string getstrCol(std::string keyname,[[maybe_unused]] bool isyinhao=false) { - if (j > 0) + std::ostringstream a; + + unsigned char kpos; + kpos=findcolpos(keyname); + int j=0; + if(isyinhao&&record.size()>0) { - if (isyinhao) - { - a << "\",\""; - } - else - { - a << ','; - } + a<<'"'; } - switch (kpos) + for(auto &iter:record) { + if(j>0) + { + if(isyinhao) + { + a<<"\",\""; + }else{ + a<<','; + } + } + switch(kpos) + { - case 0: - a << std::to_string(iter.id); - break; - case 1: - a << std::to_string(iter.randomnumber); - break; - } - j++; - } - if (isyinhao && j > 0) - { - a << '"'; - } - - return a.str(); - } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { + case 0: + a< 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - std::string vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - switch (vpos) - { - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - std::string ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::map getCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } - if (ktemp.size() > 0) - { - a.emplace(ktemp, vtemp); - } - } - - return a; - } - - template , bool>::type = true> - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - a.emplace(iter.id, iter); - break; - case 1: - a.emplace(iter.randomnumber, iter); - break; - } - } - - return a; - } - - template ::value, bool>::type = true> - std::map getmapRows([[maybe_unused]] std::string keyname) - { - std::map a; - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - switch (vpos) - { - } - - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - switch (vpos) - { - } - - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - - switch (kpos) - { - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } - a.emplace_back(ktemp, vtemp); - } - - return a; - } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::vector> getvecCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::vector> a; - - return a; - } - - template , bool>::type = true> - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - unsigned char kpos; - kpos = findcolpos(keyname); - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - a.emplace_back(iter.id, iter); - break; - case 1: - a.emplace_back(iter.randomnumber, iter); - break; - } - } - - return a; - } - template ::value, bool>::type = true> - std::vector> getvecRows([[maybe_unused]] std::string keyname) - { - std::vector> a; - - return a; - } - template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } - - switch (dpos) - { - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } - - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } - - switch (dpos) - { - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - - switch (vpos) - { - } - - switch (dpos) - { - } - } - - return a; - } - - template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - - switch (vpos) - { - } - - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - } - } - - return a; - } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; - - for (auto &iter : record) - { - switch (kpos) - { - - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } - - switch (vpos) - { - } - - switch (dpos) - { - } - } + } + j++; + } + if(isyinhao&&j>0){ + a<<'"'; + } + + return a.str(); + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { + + case 0: + ktemp=iter.id; + break; +case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; + } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + std::string vtemp; + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; - for (auto &iter : record) - { - switch (kpos) - { - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + std::string ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - switch (dpos) - { - } - } + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + return a; - } - - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map getCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - //D vtemp; + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; - for (auto &iter : record) - { + } + if(ktemp.size()>0) + { + a.emplace(ktemp,vtemp); + } + } + + return a; + } + + template,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { - switch (kpos) - { - } + case 0: + a.emplace(iter.id,iter); + break; + case 1: + a.emplace(iter.randomnumber,iter); + break; - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } + } + } + + return a; + } + + template::value,bool>::type = true > + std::map getmapRows([[maybe_unused]] std::string keyname) + { + std::map a; - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - } - } + return a; } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; - - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - for (auto &iter : record) - { + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + + } + + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + + switch(kpos) + { - switch (kpos) - { - } + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - switch (vpos) - { - case 0: - vtemp = iter.id; - break; - case 1: - vtemp = iter.randomnumber; - break; - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + + } + a.emplace_back(ktemp,vtemp); + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::vector> getvecCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::vector> a; + + return a; + } + + template,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + + unsigned char kpos; + kpos=findcolpos(keyname); + for(auto &iter:record) + { + switch(kpos) + { - switch (dpos) - { - } - } + case 0: + a.emplace_back(iter.id,iter); + break; +case 1: + a.emplace_back(iter.randomnumber,iter); + break; + } + } + return a; } - - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; + template::value,bool>::type = true > + std::vector> getvecRows([[maybe_unused]] std::string keyname) + { + std::vector> a; + return a; } - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos, vpos, dpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - dpos = findcolpos(dataname); - T ktemp; - U vtemp; - // D dtemp; + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + + } + } - for (auto &iter : record) + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; - switch (kpos) + for(auto &iter:record) { - } + switch(kpos) + { - switch (vpos) - { - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; - switch (dpos) - { - case 0: - a[ktemp][vtemp].emplace_back(iter.id); - break; - case 1: - a[ktemp][vtemp].emplace_back(iter.randomnumber); - break; - } - } + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { - return a; - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname, [[maybe_unused]] std::string dataname) - { - std::map>> a; + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + + switch(kpos) + { - return a; - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + switch(vpos){ + } - return a; - } + switch(dpos){ - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { - std::map> a; + std::map>> a; - return a; - } + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + for(auto &iter:record) + { + switch(kpos) + { - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } - for (auto &iter : record) - { + switch(vpos){ + } - switch (kpos) - { - } + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; - switch (vpos) - { - case 0: - a[ktemp].emplace_back(iter.id); - break; - case 1: - a[ktemp].emplace_back(iter.randomnumber); - break; } - } - + } + return a; } + template,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; + + for(auto &iter:record) + { + switch(kpos) + { - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; - - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } - for (auto &iter : record) - { + switch(vpos){ + } - switch (kpos) - { + switch(dpos){ - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } + } + } + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; + for(auto &iter:record) + { + switch(kpos) + { - switch (vpos) - { - } - } + } - return a; - } + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map> a; + switch(dpos){ - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; - //U vtemp; + } + } + - for (auto &iter : record) + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + //D vtemp; - switch (kpos) + for(auto &iter:record) { + + switch(kpos) + { - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; - switch (vpos) - { - } + } + } + + return a; } - - return a; - } - - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::map> getgroupCols([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { - std::map> a; + std::map>> a; - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); T ktemp; - //U vtemp; - - for (auto &iter : record) - { + U vtemp; + // D dtemp; - switch (kpos) + for(auto &iter:record) + { + + switch(kpos) { - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } + } + + switch(vpos){ + case 0: + vtemp=iter.id; + break; + case 1: + vtemp=iter.randomnumber; + break; + } + + switch(dpos){ - switch (vpos) - { - case 0: - a[ktemp].emplace_back(iter.id); - break; - case 1: - a[ktemp].emplace_back(iter.randomnumber); - break; } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + return a; } + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) + { + std::map>> a; + + unsigned char kpos,vpos,dpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + dpos=findcolpos(dataname); + T ktemp; + U vtemp; + // D dtemp; - return a; - } + for(auto &iter:record) + { + + switch(kpos) + { - template , bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; + } + + switch(vpos){ + } - unsigned char kpos; - kpos = findcolpos(keyname); + switch(dpos){ + case 0: + a[ktemp][vtemp].emplace_back(iter.id); + break; + case 1: + a[ktemp][vtemp].emplace_back(iter.randomnumber); + break; - for (auto &iter : record) + } + } + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname,[[maybe_unused]] std::string dataname) { - switch (kpos) - { + std::map>> a; + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; - case 0: - a[iter.id].emplace_back(iter); - break; - case 1: - a[iter.randomnumber].emplace_back(iter); - break; - } + + return a; } + + template::value,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; - return a; - } + for(auto &iter:record) + { + + switch(kpos) + { - template ::value, bool>::type = true> - std::map> getgroupRows([[maybe_unused]] std::string keyname) - { - std::map> a; + } - return a; - } + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; - template ::value, bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + } + } + + return a; + } + + template,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { - return a; - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } - template ::value, bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + switch(vpos){ - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; + } + } - for (auto &iter : record) + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; - switch (kpos) + for(auto &iter:record) { - } + + switch(kpos) + { - switch (vpos) - { - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - case 1: - a[ktemp][iter.randomnumber].emplace_back(iter); - break; - } - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } - return a; - } + switch(vpos){ - template , bool>::type = true, typename std::enable_if, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map> getgroupCols([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + //U vtemp; + + for(auto &iter:record) + { + + switch(kpos) + { - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + a[ktemp].emplace_back(iter.id); + break; + case 1: + a[ktemp].emplace_back(iter.randomnumber); + break; - for (auto &iter : record) + } + } + + return a; + } + + template,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) { + std::map> a; + + unsigned char kpos; + kpos=findcolpos(keyname); - switch (kpos) + for(auto &iter:record) { + switch(kpos) + { - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } + case 0: + a[iter.id].emplace_back(iter); + break; + case 1: + a[iter.randomnumber].emplace_back(iter); + break; - switch (vpos) - { - case 0: - a[ktemp][iter.id].emplace_back(iter); - break; - case 1: - a[ktemp][iter.randomnumber].emplace_back(iter); - break; - } - } + } + } + + return a; + } + + template::value,bool>::type = true> + std::map> getgroupRows([[maybe_unused]] std::string keyname) + { + std::map> a; + + return a; + } + + template::value,bool>::type = true, typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + return a; + } + + template::value,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { - return a; - } + } - template , bool>::type = true, typename std::enable_if::value, bool>::type = true> - std::map>> getgroupRows([[maybe_unused]] std::string keyname, [[maybe_unused]] std::string valname) - { - std::map>> a; + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; - unsigned char kpos, vpos; - kpos = findcolpos(keyname); - vpos = findcolpos(valname); - T ktemp; + } + } - for (auto &iter : record) + + return a; + } + + template,bool>::type = true,typename std::enable_if,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) { - - switch (kpos) + std::map>> a; + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) { + + switch(kpos) + { - case 0: - ktemp = iter.id; - break; - case 1: - ktemp = iter.randomnumber; - break; - } + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + case 0: + a[ktemp][iter.id].emplace_back(iter); + break; + case 1: + a[ktemp][iter.randomnumber].emplace_back(iter); + break; - switch (vpos) - { - } - } + } + } + + return a; + } + + template,bool>::type = true,typename std::enable_if::value,bool>::type = true> + std::map>> getgroupRows([[maybe_unused]] std::string keyname,[[maybe_unused]] std::string valname) + { + std::map>> a; + + + unsigned char kpos,vpos; + kpos=findcolpos(keyname); + vpos=findcolpos(valname); + T ktemp; + + for(auto &iter:record) + { + + switch(kpos) + { - return a; - } -}; + case 0: + ktemp=iter.id; + break; + case 1: + ktemp=iter.randomnumber; + break; + } + + switch(vpos){ + + } + } + + return a; + } + + }; + -}// namespace orm +} #endif + \ No newline at end of file From 00647bcbce97458e1045f2fd1111ccb600030699 Mon Sep 17 00:00:00 2001 From: hzq Date: Sun, 2 Mar 2025 18:26:00 +0800 Subject: [PATCH 1141/1766] update paozhu --- .../C++/paozhu/paozhu_benchmark/{models => orm}/fortune_mysql.h | 0 .../C++/paozhu/paozhu_benchmark/{models => orm}/world_mysql.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename frameworks/C++/paozhu/paozhu_benchmark/{models => orm}/fortune_mysql.h (100%) rename frameworks/C++/paozhu/paozhu_benchmark/{models => orm}/world_mysql.h (100%) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/fortune_mysql.h similarity index 100% rename from frameworks/C++/paozhu/paozhu_benchmark/models/fortune_mysql.h rename to frameworks/C++/paozhu/paozhu_benchmark/orm/fortune_mysql.h diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/world_mysql.h similarity index 100% rename from frameworks/C++/paozhu/paozhu_benchmark/models/world_mysql.h rename to frameworks/C++/paozhu/paozhu_benchmark/orm/world_mysql.h From 71c92c815a742ffd9450149ce354faeaa89042e4 Mon Sep 17 00:00:00 2001 From: hzq Date: Sun, 2 Mar 2025 18:39:15 +0800 Subject: [PATCH 1142/1766] update paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index af820de7002..d155b8f47ab 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -4,8 +4,8 @@ RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential l RUN apt-get -y install brotli libbrotli-dev RUN apt-get -y install libreadline-dev -RUN apt-get -y install mysql-client -RUN apt-get -y install libmysqlclient-dev +# RUN apt-get -y install mysql-client +# RUN apt-get -y install libmysqlclient-dev RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 From 21e02d57c37f2f9e9e24fd36d45609d8030a752d Mon Sep 17 00:00:00 2001 From: hzq Date: Sun, 2 Mar 2025 19:00:37 +0800 Subject: [PATCH 1143/1766] update paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 2 ++ .../paozhu/paozhu_benchmark/orm/{ => include}/fortune_mysql.h | 0 .../C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h | 2 +- .../C++/paozhu/paozhu_benchmark/orm/{ => include}/world_mysql.h | 0 frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h | 2 +- 5 files changed, 4 insertions(+), 2 deletions(-) rename frameworks/C++/paozhu/paozhu_benchmark/orm/{ => include}/fortune_mysql.h (100%) rename frameworks/C++/paozhu/paozhu_benchmark/orm/{ => include}/world_mysql.h (100%) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index d155b8f47ab..212773c8bea 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -92,6 +92,8 @@ RUN mkdir ./paozhu/orm/include COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/fortune_mysql.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/world_mysql.h ./paozhu/orm/include/ RUN mkdir ./paozhu/models RUN mkdir ./paozhu/models/include diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h similarity index 100% rename from frameworks/C++/paozhu/paozhu_benchmark/orm/fortune_mysql.h rename to frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h index 6576c16d41e..2d688b054ed 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_FORTUNEBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Sun, 02 Mar 2025 08:24:41 GMT +*本文件为自动生成 Sun, 02 Mar 2025 10:54:30 GMT ***/ #include #include diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h similarity index 100% rename from frameworks/C++/paozhu/paozhu_benchmark/orm/world_mysql.h rename to frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h index 35cae19e40f..93f7c1f14b2 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_WORLDBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Sun, 02 Mar 2025 08:24:41 GMT +*本文件为自动生成 Sun, 02 Mar 2025 10:54:30 GMT ***/ #include #include From 58bd8aa7176c1750ec6292c02a0de25674c29456 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 3 Mar 2025 15:22:55 +0100 Subject: [PATCH 1144/1766] [php] Lumen remove (#9612) The epository has been archived by the owner on Apr 9, 2024 --- frameworks/PHP/lumen/.env | 17 - frameworks/PHP/lumen/README.md | 83 - .../PHP/lumen/app/Console/Commands/.gitkeep | 0 frameworks/PHP/lumen/app/Console/Kernel.php | 26 - .../PHP/lumen/app/Exceptions/Handler.php | 23 - .../lumen/app/Http/Controllers/Controller.php | 84 - frameworks/PHP/lumen/app/Models/Fortune.php | 11 - frameworks/PHP/lumen/app/Models/World.php | 12 - frameworks/PHP/lumen/artisan | 35 - frameworks/PHP/lumen/benchmark_config.json | 97 - frameworks/PHP/lumen/bootstrap/app.php | 110 - frameworks/PHP/lumen/composer.json | 25 - frameworks/PHP/lumen/config.toml | 53 - frameworks/PHP/lumen/config/database.php | 92 - frameworks/PHP/lumen/config/swoole_http.php | 37 - .../lumen/database/factories/ModelFactory.php | 19 - .../PHP/lumen/database/migrations/.gitkeep | 0 .../lumen/database/seeds/DatabaseSeeder.php | 16 - frameworks/PHP/lumen/deploy/conf/cli-php.ini | 16 - frameworks/PHP/lumen/deploy/conf/php-fpm.conf | 551 ----- frameworks/PHP/lumen/deploy/conf/php.ini | 1926 ----------------- .../PHP/lumen/deploy/laravel-s/composer.json | 37 - frameworks/PHP/lumen/deploy/nginx.conf | 64 - .../PHP/lumen/deploy/swoole/composer.json | 26 - .../lumen/deploy/swoole/install-composer.sh | 17 - frameworks/PHP/lumen/deploy/swoole/php.ini | 2 - .../PHP/lumen/lumen-laravel-s.dockerfile | 30 - frameworks/PHP/lumen/lumen-swoole.dockerfile | 21 - .../PHP/lumen/lumen-workerman.dockerfile | 34 - frameworks/PHP/lumen/lumen.dockerfile | 34 - frameworks/PHP/lumen/public/.htaccess | 21 - frameworks/PHP/lumen/public/index.php | 28 - frameworks/PHP/lumen/resources/views/.gitkeep | 0 .../lumen/resources/views/fortunes.blade.php | 13 - frameworks/PHP/lumen/routes/web.php | 8 - frameworks/PHP/lumen/server-man.php | 45 - frameworks/PHP/lumen/start.php | 39 - 37 files changed, 3652 deletions(-) delete mode 100644 frameworks/PHP/lumen/.env delete mode 100644 frameworks/PHP/lumen/README.md delete mode 100644 frameworks/PHP/lumen/app/Console/Commands/.gitkeep delete mode 100644 frameworks/PHP/lumen/app/Console/Kernel.php delete mode 100644 frameworks/PHP/lumen/app/Exceptions/Handler.php delete mode 100644 frameworks/PHP/lumen/app/Http/Controllers/Controller.php delete mode 100644 frameworks/PHP/lumen/app/Models/Fortune.php delete mode 100644 frameworks/PHP/lumen/app/Models/World.php delete mode 100755 frameworks/PHP/lumen/artisan delete mode 100644 frameworks/PHP/lumen/benchmark_config.json delete mode 100644 frameworks/PHP/lumen/bootstrap/app.php delete mode 100644 frameworks/PHP/lumen/composer.json delete mode 100644 frameworks/PHP/lumen/config.toml delete mode 100644 frameworks/PHP/lumen/config/database.php delete mode 100644 frameworks/PHP/lumen/config/swoole_http.php delete mode 100644 frameworks/PHP/lumen/database/factories/ModelFactory.php delete mode 100644 frameworks/PHP/lumen/database/migrations/.gitkeep delete mode 100644 frameworks/PHP/lumen/database/seeds/DatabaseSeeder.php delete mode 100644 frameworks/PHP/lumen/deploy/conf/cli-php.ini delete mode 100644 frameworks/PHP/lumen/deploy/conf/php-fpm.conf delete mode 100644 frameworks/PHP/lumen/deploy/conf/php.ini delete mode 100644 frameworks/PHP/lumen/deploy/laravel-s/composer.json delete mode 100755 frameworks/PHP/lumen/deploy/nginx.conf delete mode 100644 frameworks/PHP/lumen/deploy/swoole/composer.json delete mode 100644 frameworks/PHP/lumen/deploy/swoole/install-composer.sh delete mode 100644 frameworks/PHP/lumen/deploy/swoole/php.ini delete mode 100644 frameworks/PHP/lumen/lumen-laravel-s.dockerfile delete mode 100644 frameworks/PHP/lumen/lumen-swoole.dockerfile delete mode 100644 frameworks/PHP/lumen/lumen-workerman.dockerfile delete mode 100644 frameworks/PHP/lumen/lumen.dockerfile delete mode 100644 frameworks/PHP/lumen/public/.htaccess delete mode 100644 frameworks/PHP/lumen/public/index.php delete mode 100644 frameworks/PHP/lumen/resources/views/.gitkeep delete mode 100644 frameworks/PHP/lumen/resources/views/fortunes.blade.php delete mode 100644 frameworks/PHP/lumen/routes/web.php delete mode 100644 frameworks/PHP/lumen/server-man.php delete mode 100644 frameworks/PHP/lumen/start.php diff --git a/frameworks/PHP/lumen/.env b/frameworks/PHP/lumen/.env deleted file mode 100644 index 20669bcac2f..00000000000 --- a/frameworks/PHP/lumen/.env +++ /dev/null @@ -1,17 +0,0 @@ -APP_ENV=local -APP_DEBUG=false -APP_KEY= -APP_TIMEZONE=UTC - -LOG_CHANNEL=stack -LOG_SLACK_WEBHOOK_URL= - -DB_CONNECTION=mysql -DB_HOST=tfb-database -DB_PORT=3306 -DB_DATABASE=hello_world -DB_USERNAME=benchmarkdbuser -DB_PASSWORD=benchmarkdbpass - -CACHE_DRIVER=file -QUEUE_DRIVER=sync diff --git a/frameworks/PHP/lumen/README.md b/frameworks/PHP/lumen/README.md deleted file mode 100644 index 4c428a39691..00000000000 --- a/frameworks/PHP/lumen/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# Lumen PHP Framework - -[![Build Status](https://travis-ci.org/laravel/lumen-framework.svg)](https://travis-ci.org/laravel/lumen-framework) -[![Total Downloads](https://poser.pugx.org/laravel/lumen-framework/d/total.svg)](https://packagist.org/packages/laravel/lumen-framework) -[![Latest Stable Version](https://poser.pugx.org/laravel/lumen-framework/v/stable.svg)](https://packagist.org/packages/laravel/lumen-framework) -[![Latest Unstable Version](https://poser.pugx.org/laravel/lumen-framework/v/unstable.svg)](https://packagist.org/packages/laravel/lumen-framework) -[![License](https://poser.pugx.org/laravel/lumen-framework/license.svg)](https://packagist.org/packages/laravel/lumen-framework) - -Laravel Lumen is a stunningly fast PHP micro-framework for building web applications with expressive, elegant syntax. We believe development must be an enjoyable, creative experience to be truly fulfilling. Lumen attempts to take the pain out of development by easing common tasks used in the majority of web projects, such as routing, database abstraction, queueing, and caching. - -## Official Documentation - -Documentation for the framework can be found on the [Lumen website](http://lumen.laravel.com/docs). - -## Security Vulnerabilities - -If you discover a security vulnerability within Lumen, please send an e-mail to Taylor Otwell at taylor@laravel.com. All security vulnerabilities will be promptly addressed. - -## License - -The Lumen framework is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT) - -# lumen-swoole Benchmarking Test - -The lumen-swoole test is a benchmark test of Lumen running on Swoole. - -Swoole is an asynchronous PHP webserver that runs as a PECL extension to PHP. - -Traditional PHP servers use php-fpm to run PHP software. On each request, php-fpm initializes a new instance of the php framework, processes the request, returns the response, and terminates the php framework. -This results in decreased performance relative to other technologies like Java or node.js based frameworks which intialize only once and then process multiple requests without terminating in between. - -Swoole provides this capability to PHP. When Swoole starts, it initializes the framework once and handles requests without terminating the framework between requests. Also, like nginx, netty, node.js, Swoole is an asynchronous event-loop based server. - -Laravel-swoole is an adapter layer between Swoole and Laravel/Lumen. It provides facades for http requests and PDO database connections. It launches Laravel worker instances for each cpu core to handle incoming requests. - -Also because Laravel was written under php-fpm environment where the framework is reset between each request, sometimes state changes are not re-initialized between requests since it isn't necessary in an environment where the framework is terminated after each request. -To handle this, Laravel-swoole creates a sandbox for each request with a copy of initial framework state so that any changes made by the request do not impact the state of other incoming requests. - -Brion Finlay 10/3/2018 - -### Test Type Implementation Source Code - -* [JSON](Relative/Path/To/Your/Source/File) -* [PLAINTEXT](Relative/Path/To/Your/Source/File) -* [DB](Relative/Path/To/Your/Source/File) -* [QUERY](Relative/Path/To/Your/Source/File) -* [UPDATE](Relative/Path/To/Your/Source/File) -* [FORTUNES](Relative/Path/To/Your/Source/File) - -## Important Libraries -The tests were run with: -* [Swoole](https://www.swoole.co.uk/) -* [laravel-swoole](https://github.com/swooletw/laravel-swoole/wiki) -* [Lumen](https://lumen.laravel.com/) - -## Test URLs -### JSON - -http://localhost:8080/json - -### PLAINTEXT - -http://localhost:8080/plaintext - -### DB - -http://localhost:8080/db - -### QUERY - -http://localhost:8080/queries/[count] - -### UPDATE - -http://localhost:8080/updates/[count] - -### FORTUNES - -http://localhost:8080/fortunes - - -# Add laravel-s Benchmarking Test -[laravel-s](https://github.com/hhxsv5/laravel-s) is an out-of-the-box adapter between Swoole and Laravel/Lumen, similar to laravel-swoole. diff --git a/frameworks/PHP/lumen/app/Console/Commands/.gitkeep b/frameworks/PHP/lumen/app/Console/Commands/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/PHP/lumen/app/Console/Kernel.php b/frameworks/PHP/lumen/app/Console/Kernel.php deleted file mode 100644 index 2216b951778..00000000000 --- a/frameworks/PHP/lumen/app/Console/Kernel.php +++ /dev/null @@ -1,26 +0,0 @@ -json(['message' => 'Oops, something went wrong']); - } -} diff --git a/frameworks/PHP/lumen/app/Http/Controllers/Controller.php b/frameworks/PHP/lumen/app/Http/Controllers/Controller.php deleted file mode 100644 index 68e7aacd238..00000000000 --- a/frameworks/PHP/lumen/app/Http/Controllers/Controller.php +++ /dev/null @@ -1,84 +0,0 @@ -json(['message' => 'Hello, World!']); - } - - public function db() - { - return response()->json(World::query()->find(self::randomInt())); - } - - public function queries($queries = 1) - { - $queries = self::clamp($queries); - - $rows = []; - while ($queries--) { - $rows[] = World::query()->find(self::randomInt()); - } - - return response()->json($rows); - } - - public function fortunes() - { - $rows = Fortune::all(); - - $insert = new Fortune(); - $insert->id = 0; - $insert->message = 'Additional fortune added at request time.'; - - $rows->add($insert); - $rows = $rows->sortBy('message'); - - return view('fortunes', ['rows' => $rows]); - } - - public function updates($queries = 1) - { - $queries = self::clamp($queries); - - $rows = []; - - while ($queries--) { - $row = World::query()->find(self::randomInt()); - $row->randomNumber = self::randomInt(); - $row->save(); - - $rows[] = $row; - } - - return response()->json($rows); - } - - public function plaintext() - { - return response('Hello, World!', 200, ['Content-Type' => 'text/plain']); - } - - private static function randomInt() - { - return random_int(1, 10000); - } - - private static function clamp($value) - { - if (!is_numeric($value) || $value < 1) { - return 1; - } - if ($value > 500) { - return 500; - } - return (int)$value; - } -} diff --git a/frameworks/PHP/lumen/app/Models/Fortune.php b/frameworks/PHP/lumen/app/Models/Fortune.php deleted file mode 100644 index a3998372829..00000000000 --- a/frameworks/PHP/lumen/app/Models/Fortune.php +++ /dev/null @@ -1,11 +0,0 @@ -make( - 'Illuminate\Contracts\Console\Kernel' -); - -exit($kernel->handle(new ArgvInput, new ConsoleOutput)); diff --git a/frameworks/PHP/lumen/benchmark_config.json b/frameworks/PHP/lumen/benchmark_config.json deleted file mode 100644 index f85b97c532d..00000000000 --- a/frameworks/PHP/lumen/benchmark_config.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "framework": "lumen", - "tests": [{ - "default": { - "setup_file": "setup", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries/", - "fortune_url": "/fortunes", - "update_url": "/updates/", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "lumen", - "language": "PHP", - "flavor": "PHP8.1", - "orm": "Full", - "platform": "FPM/FastCGI", - "webserver": "nginx", - "os": "Linux", - "database_os": "Linux", - "display_name": "lumen", - "notes": "", - "versus": "php" - }, - "swoole": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries/", - "fortune_url": "/fortunes", - "update_url": "/updates/", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "lumen", - "language": "PHP", - "flavor": "PHP8", - "orm": "Full", - "platform": "swoole", - "webserver": "none", - "os": "Linux", - "database_os": "Linux", - "display_name": "lumen-swoole", - "versus": "swoole" - }, - "laravel-s": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries/", - "fortune_url": "/fortunes", - "update_url": "/updates/", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "lumen", - "language": "PHP", - "flavor": "PHP8", - "orm": "Full", - "platform": "swoole", - "webserver": "none", - "os": "Linux", - "database_os": "Linux", - "display_name": "lumen-laravel-s", - "notes": "", - "versus": "swoole" - }, - "workerman": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries/", - "fortune_url": "/fortunes", - "update_url": "/updates/", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "lumen", - "language": "PHP", - "flavor": "PHP8", - "orm": "Full", - "platform": "workerman", - "webserver": "none", - "os": "Linux", - "database_os": "Linux", - "display_name": "lumen-workerman", - "notes": "", - "versus": "workerman" - } - }] -} diff --git a/frameworks/PHP/lumen/bootstrap/app.php b/frameworks/PHP/lumen/bootstrap/app.php deleted file mode 100644 index 40268a67efa..00000000000 --- a/frameworks/PHP/lumen/bootstrap/app.php +++ /dev/null @@ -1,110 +0,0 @@ -bootstrap(); - -date_default_timezone_set(env('APP_TIMEZONE', 'UTC')); - -/* - * |-------------------------------------------------------------------------- - * | Create The Application - * |-------------------------------------------------------------------------- - * | - * | Here we will load the environment and create the application instance - * | that serves as the central piece of this framework. We'll use this - * | application as an "IoC" container and router for this framework. - * | - */ - -$app = new Laravel\Lumen\Application(dirname(__DIR__)); - -// $app->withFacades(); - -$app->withEloquent(); - -/* - * |-------------------------------------------------------------------------- - * | Register Container Bindings - * |-------------------------------------------------------------------------- - * | - * | Now we will register a few bindings in the service container. We will - * | register the exception handler and the console kernel. You may add - * | your own bindings here if you like or you can make another file. - * | - */ - -$app->singleton(Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class); - -$app->singleton(Illuminate\Contracts\Console\Kernel::class, App\Console\Kernel::class); - -/* - * |-------------------------------------------------------------------------- - * | Register Config Files - * |-------------------------------------------------------------------------- - * | - * | Now we will register the "app" configuration file. If the file exists in - * | your configuration directory it will be loaded; otherwise, we'll load - * | the default version. You may register other files below as needed. - * | - */ - -if (env('APP_SWOOLE', false)) { - $app->register(\SwooleTW\Http\LumenServiceProvider::class); - $app->configure('swoole_http'); -} -if (class_exists('Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider')) { - $app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class); -} -$app->configure('database'); -/* - * |-------------------------------------------------------------------------- - * | Register Middleware - * |-------------------------------------------------------------------------- - * | - * | Next, we will register the middleware with the application. These can - * | be global middleware that run before and after each request into a - * | route or middleware that'll be assigned to some specific routes. - * | - */ - -// $app->middleware([ -// App\Http\Middleware\ExampleMiddleware::class -// ]); - -// $app->routeMiddleware([ -// 'auth' => App\Http\Middleware\Authenticate::class, -// ]); - -/* - * |-------------------------------------------------------------------------- - * | Register Service Providers - * |-------------------------------------------------------------------------- - * | - * | Here we will register all of the application's service providers which - * | are used to bind services into the container. Service providers are - * | totally optional, so you are not required to uncomment this line. - * | - */ - -// $app->register(App\Providers\AppServiceProvider::class); -// $app->register(App\Providers\AuthServiceProvider::class); -// $app->register(App\Providers\EventServiceProvider::class); - -/* - * |-------------------------------------------------------------------------- - * | Load The Application Routes - * |-------------------------------------------------------------------------- - * | - * | Next we will include the routes file so that they can all be added to - * | the application. This will provide all of the URLs the application - * | can respond to, as well as the controllers that may handle them. - * | - */ - -$app->router->group([ - 'namespace' => 'App\Http\Controllers' -], function ($router) { - require __DIR__ . '/../routes/web.php'; -}); - -return $app; diff --git a/frameworks/PHP/lumen/composer.json b/frameworks/PHP/lumen/composer.json deleted file mode 100644 index 2552d9450e3..00000000000 --- a/frameworks/PHP/lumen/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "laravel/lumen", - "description": "The Laravel Lumen Framework.", - "keywords": ["framework", "laravel", "lumen"], - "license": "MIT", - "type": "project", - "require": { - "laravel/lumen-framework": "^11" - }, - "autoload": { - "psr-4": { - "App\\": "app/" - } - }, - "scripts": { - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ] - }, - "minimum-stability": "dev", - "prefer-stable": true, - "config": { - "optimize-autoloader": true - } -} diff --git a/frameworks/PHP/lumen/config.toml b/frameworks/PHP/lumen/config.toml deleted file mode 100644 index f185f18f673..00000000000 --- a/frameworks/PHP/lumen/config.toml +++ /dev/null @@ -1,53 +0,0 @@ -[framework] -name = "lumen" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries/" -urls.update = "/updates/" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Micro" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "FPM/FastCGI" -webserver = "nginx" -versus = "php" - -[laravel-s] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries/" -urls.update = "/updates/" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Micro" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "swoole" -webserver = "none" -versus = "swoole" - -[swoole] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries/" -urls.update = "/updates/" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Micro" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "swoole" -webserver = "none" -versus = "swoole" diff --git a/frameworks/PHP/lumen/config/database.php b/frameworks/PHP/lumen/config/database.php deleted file mode 100644 index 35ceea9b388..00000000000 --- a/frameworks/PHP/lumen/config/database.php +++ /dev/null @@ -1,92 +0,0 @@ - env('DB_CONNECTION', 'mysql'), - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => [ - - 'mysql' => [ - 'driver' => 'mysql', - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'strict' => true, - 'engine' => null, - 'options'=> [ - PDO::ATTR_PERSISTENT => true, - ], - ], - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer set of commands than a typical key-value systems - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - - 'client' => 'predis', - - 'default' => [ - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), - 'port' => env('REDIS_PORT', 6379), - 'database' => 0, - ], - - ], - -]; diff --git a/frameworks/PHP/lumen/config/swoole_http.php b/frameworks/PHP/lumen/config/swoole_http.php deleted file mode 100644 index 58b6643b7cb..00000000000 --- a/frameworks/PHP/lumen/config/swoole_http.php +++ /dev/null @@ -1,37 +0,0 @@ - [ - 'host' => env('SWOOLE_HTTP_HOST', '0.0.0.0'), - 'port' => env('SWOOLE_HTTP_PORT', '8080'), - 'options' => [ - 'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('swoole_http.pid')), - // 'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')), - 'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 0), - // 'handle_static_files' => env('SWOOLE_HTTP_STATIC', 0), - // 'public_path' => storage_path('app/public'), - // 'ob_output' => env('SWOOLE_HTTP_OB_OUTPUT', 0), - // Normally this value should be 1~4 times lager according to your cpu cores - 'reactor_num' => env('SWOOLE_HTTP_REACTOR_NUM', swoole_cpu_num() * 2), - 'worker_num' => env('SWOOLE_HTTP_WORKER_NUM', swoole_cpu_num() * 2), - 'task_worker_num' => env('SWOOLE_HTTP_TASK_WORKER_NUM', swoole_cpu_num() * 2), - // This value should be larger than `post_max_size` and `upload_max_filesize` in `php.ini`. - // This equals to 10 MB - 'package_max_length' => 10 * 1024 * 1024, - 'buffer_output_size' => 10 * 1024 * 1024, - // Max buffer size for socket connections - 'socket_buffer_size' => 128 * 1024 * 1024, - // Worker will restart after processing this number of request - 'max_request' => 3000 - ] - ], - 'providers' => [ // App\Providers\AuthServiceProvider::class, - ] -]; diff --git a/frameworks/PHP/lumen/database/factories/ModelFactory.php b/frameworks/PHP/lumen/database/factories/ModelFactory.php deleted file mode 100644 index bf9496b0eef..00000000000 --- a/frameworks/PHP/lumen/database/factories/ModelFactory.php +++ /dev/null @@ -1,19 +0,0 @@ -define(App\User::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->name, - 'email' => $faker->email, - ]; -}); diff --git a/frameworks/PHP/lumen/database/migrations/.gitkeep b/frameworks/PHP/lumen/database/migrations/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/PHP/lumen/database/seeds/DatabaseSeeder.php b/frameworks/PHP/lumen/database/seeds/DatabaseSeeder.php deleted file mode 100644 index 23526c9d99c..00000000000 --- a/frameworks/PHP/lumen/database/seeds/DatabaseSeeder.php +++ /dev/null @@ -1,16 +0,0 @@ -call('UsersTableSeeder'); - } -} diff --git a/frameworks/PHP/lumen/deploy/conf/cli-php.ini b/frameworks/PHP/lumen/deploy/conf/cli-php.ini deleted file mode 100644 index e03b6e352a9..00000000000 --- a/frameworks/PHP/lumen/deploy/conf/cli-php.ini +++ /dev/null @@ -1,16 +0,0 @@ -#zend_extension=opcache.so -opcache.enable=1 -opcache.enable_cli=1 -opcache.validate_timestamps=0 -opcache.save_comments=0 -opcache.enable_file_override=1 -opcache.huge_code_pages=1 - -mysqlnd.collect_statistics = Off - -memory_limit = 512M - -opcache.jit_buffer_size = 128M -opcache.jit = tracing - -disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/lumen/deploy/conf/php-fpm.conf b/frameworks/PHP/lumen/deploy/conf/php-fpm.conf deleted file mode 100644 index 202d04b1a72..00000000000 --- a/frameworks/PHP/lumen/deploy/conf/php-fpm.conf +++ /dev/null @@ -1,551 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;; -; FPM Configuration ; -;;;;;;;;;;;;;;;;;;;;; - -; All relative paths in this configuration file are relative to PHP's install -; prefix (/usr). This prefix can be dynamically changed by using the -; '-p' argument from the command line. - -;;;;;;;;;;;;;;;;;; -; Global Options ; -;;;;;;;;;;;;;;;;;; - -[global] -; Pid file -; Note: the default prefix is /var -; Default Value: none -pid = /run/php/php-fpm.pid - -; Error log file -; If it's set to "syslog", log is sent to syslogd instead of being written -; into a local file. -; Note: the default prefix is /var -; Default Value: log/php-fpm.log -;error_log = /var/log/php-fpm.log -error_log = /dev/stderr - - -; syslog_facility is used to specify what type of program is logging the -; message. This lets syslogd specify that messages from different facilities -; will be handled differently. -; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON) -; Default Value: daemon -;syslog.facility = daemon - -; syslog_ident is prepended to every message. If you have multiple FPM -; instances running on the same server, you can change the default value -; which must suit common needs. -; Default Value: php-fpm -;syslog.ident = php-fpm - -; Log level -; Possible Values: alert, error, warning, notice, debug -; Default Value: notice -;log_level = notice - -; If this number of child processes exit with SIGSEGV or SIGBUS within the time -; interval set by emergency_restart_interval then FPM will restart. A value -; of '0' means 'Off'. -; Default Value: 0 -;emergency_restart_threshold = 0 - -; Interval of time used by emergency_restart_interval to determine when -; a graceful restart will be initiated. This can be useful to work around -; accidental corruptions in an accelerator's shared memory. -; Available Units: s(econds), m(inutes), h(ours), or d(ays) -; Default Unit: seconds -; Default Value: 0 -;emergency_restart_interval = 0 - -; Time limit for child processes to wait for a reaction on signals from master. -; Available units: s(econds), m(inutes), h(ours), or d(ays) -; Default Unit: seconds -; Default Value: 0 -;process_control_timeout = 0 - -; The maximum number of processes FPM will fork. This has been designed to control -; the global number of processes when using dynamic PM within a lot of pools. -; Use it with caution. -; Note: A value of 0 indicates no limit -; Default Value: 0 -process.max = 0 - -; Specify the nice(2) priority to apply to the master process (only if set) -; The value can vary from -19 (highest priority) to 20 (lowest priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool process will inherit the master process priority -; unless specified otherwise -; Default Value: no set -; process.priority = -19 - -; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging. -; Default Value: yes -;daemonize = yes - -; Set open file descriptor rlimit for the master process. -; Default Value: system defined value -rlimit_files = 100000 - -; Set max core size rlimit for the master process. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -rlimit_core = 'unlimited' - -; Specify the event mechanism FPM will use. The following is available: -; - select (any POSIX os) -; - poll (any POSIX os) -; - epoll (linux >= 2.5.44) -; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0) -; - /dev/poll (Solaris >= 7) -; - port (Solaris >= 10) -; Default Value: not set (auto detection) -;events.mechanism = epoll - -; When FPM is built with systemd integration, specify the interval, -; in seconds, between health report notification to systemd. -; Set to 0 to disable. -; Available Units: s(econds), m(inutes), h(ours) -; Default Unit: seconds -; Default value: 10 -systemd_interval = 0 - -;;;;;;;;;;;;;;;;;;;; -; Pool Definitions ; -;;;;;;;;;;;;;;;;;;;; - -; Multiple pools of child processes may be started with different listening -; ports and different management options. The name of the pool will be -; used in logs and stats. There is no limitation on the number of pools which -; FPM can handle. Your system will tell you anyway :) - -; Include one or more files. If glob(3) exists, it is used to include a bunch of -; files from a glob(3) pattern. This directive can be used everywhere in the -; file. -; Relative path can also be used. They will be prefixed by: -; - the global prefix if it's been set (-p argument) -; - /usr otherwise -;include=/etc/php/7.4/fpm/pool.d/*.conf - -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[www] - -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = www-data -group = www-data - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /run/php/php-fpm.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -listen.backlog = -1 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = static - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 1024 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 512 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 50 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 512 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.4/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; Depth of slow log stack trace. -; Default Value: 20 -;request_slowlog_trace_depth = 20 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_terminate_timeout = 0 - -; Set open file descriptor rlimit. -; Default Value: system defined value -rlimit_files = 100000 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -rlimit_core = 'unlimited' - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -;chdir = /var/www - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M \ No newline at end of file diff --git a/frameworks/PHP/lumen/deploy/conf/php.ini b/frameworks/PHP/lumen/deploy/conf/php.ini deleted file mode 100644 index 635f242c592..00000000000 --- a/frameworks/PHP/lumen/deploy/conf/php.ini +++ /dev/null @@ -1,1926 +0,0 @@ -[PHP] - -;;;;;;;;;;;;;;;;;;; -; About php.ini ; -;;;;;;;;;;;;;;;;;;; -; PHP's initialization file, generally called php.ini, is responsible for -; configuring many of the aspects of PHP's behavior. - -; PHP attempts to find and load this configuration from a number of locations. -; The following is a summary of its search order: -; 1. SAPI module specific location. -; 2. The PHPRC environment variable. (As of PHP 5.2.0) -; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) -; 4. Current working directory (except CLI) -; 5. The web server's directory (for SAPI modules), or directory of PHP -; (otherwise in Windows) -; 6. The directory from the --with-config-file-path compile time option, or the -; Windows directory (C:\windows or C:\winnt) -; See the PHP docs for more specific information. -; http://php.net/configuration.file - -; The syntax of the file is extremely simple. Whitespace and lines -; beginning with a semicolon are silently ignored (as you probably guessed). -; Section headers (e.g. [Foo]) are also silently ignored, even though -; they might mean something in the future. - -; Directives following the section heading [PATH=/www/mysite] only -; apply to PHP files in the /www/mysite directory. Directives -; following the section heading [HOST=www.example.com] only apply to -; PHP files served from www.example.com. Directives set in these -; special sections cannot be overridden by user-defined INI files or -; at runtime. Currently, [PATH=] and [HOST=] sections only work under -; CGI/FastCGI. -; http://php.net/ini.sections - -; Directives are specified using the following syntax: -; directive = value -; Directive names are *case sensitive* - foo=bar is different from FOO=bar. -; Directives are variables used to configure PHP or PHP extensions. -; There is no name validation. If PHP can't find an expected -; directive because it is not set or is mistyped, a default value will be used. - -; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one -; of the INI constants (On, Off, True, False, Yes, No and None) or an expression -; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a -; previously set variable or directive (e.g. ${foo}) - -; Expressions in the INI file are limited to bitwise operators and parentheses: -; | bitwise OR -; ^ bitwise XOR -; & bitwise AND -; ~ bitwise NOT -; ! boolean NOT - -; Boolean flags can be turned on using the values 1, On, True or Yes. -; They can be turned off using the values 0, Off, False or No. - -; An empty string can be denoted by simply not writing anything after the equal -; sign, or by using the None keyword: - -; foo = ; sets foo to an empty string -; foo = None ; sets foo to an empty string -; foo = "None" ; sets foo to the string 'None' - -; If you use constants in your value, and these constants belong to a -; dynamically loaded extension (either a PHP extension or a Zend extension), -; you may only use these constants *after* the line that loads the extension. - -;;;;;;;;;;;;;;;;;;; -; About this file ; -;;;;;;;;;;;;;;;;;;; -; PHP comes packaged with two INI files. One that is recommended to be used -; in production environments and one that is recommended to be used in -; development environments. - -; php.ini-production contains settings which hold security, performance and -; best practices at its core. But please be aware, these settings may break -; compatibility with older or less security conscience applications. We -; recommending using the production ini in production and testing environments. - -; php.ini-development is very similar to its production variant, except it is -; much more verbose when it comes to errors. We recommend using the -; development version only in development environments, as errors shown to -; application users can inadvertently leak otherwise secure information. - -; This is php.ini-production INI file. - -;;;;;;;;;;;;;;;;;;; -; Quick Reference ; -;;;;;;;;;;;;;;;;;;; -; The following are all the settings which are different in either the production -; or development versions of the INIs with respect to PHP's default behavior. -; Please see the actual settings later in the document for more details as to why -; we recommend these changes in PHP's behavior. - -; display_errors -; Default Value: On -; Development Value: On -; Production Value: Off - -; display_startup_errors -; Default Value: Off -; Development Value: On -; Production Value: Off - -; error_reporting -; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED -; Development Value: E_ALL -; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT - -; html_errors -; Default Value: On -; Development Value: On -; Production value: On - -; log_errors -; Default Value: Off -; Development Value: On -; Production Value: On - -; max_input_time -; Default Value: -1 (Unlimited) -; Development Value: 60 (60 seconds) -; Production Value: 60 (60 seconds) - -; output_buffering -; Default Value: Off -; Development Value: 4096 -; Production Value: 4096 - -; register_argc_argv -; Default Value: On -; Development Value: Off -; Production Value: Off - -; request_order -; Default Value: None -; Development Value: "GP" -; Production Value: "GP" - -; session.gc_divisor -; Default Value: 100 -; Development Value: 1000 -; Production Value: 1000 - -; session.sid_bits_per_character -; Default Value: 4 -; Development Value: 5 -; Production Value: 5 - -; short_open_tag -; Default Value: On -; Development Value: Off -; Production Value: Off - -; track_errors -; Default Value: Off -; Development Value: On -; Production Value: Off - -; variables_order -; Default Value: "EGPCS" -; Development Value: "GPCS" -; Production Value: "GPCS" - -;;;;;;;;;;;;;;;;;;;; -; php.ini Options ; -;;;;;;;;;;;;;;;;;;;; -; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" -;user_ini.filename = ".user.ini" - -; To disable this feature set this option to empty value -;user_ini.filename = - -; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) -;user_ini.cache_ttl = 300 - -;;;;;;;;;;;;;;;;;;;; -; Language Options ; -;;;;;;;;;;;;;;;;;;;; - -; Enable the PHP scripting language engine under Apache. -; http://php.net/engine -engine = On - -; This directive determines whether or not PHP will recognize code between -; tags as PHP source which should be processed as such. It is -; generally recommended that should be used and that this feature -; should be disabled, as enabling it may result in issues when generating XML -; documents, however this remains supported for backward compatibility reasons. -; Note that this directive does not control the would work. -; http://php.net/syntax-highlighting -;highlight.string = #DD0000 -;highlight.comment = #FF9900 -;highlight.keyword = #007700 -;highlight.default = #0000BB -;highlight.html = #000000 - -; If enabled, the request will be allowed to complete even if the user aborts -; the request. Consider enabling it if executing long requests, which may end up -; being interrupted by the user or a browser timing out. PHP's default behavior -; is to disable this feature. -; http://php.net/ignore-user-abort -;ignore_user_abort = On - -; Determines the size of the realpath cache to be used by PHP. This value should -; be increased on systems where PHP opens many files to reflect the quantity of -; the file operations performed. -; http://php.net/realpath-cache-size -realpath_cache_size = 4096k - -; Duration of time, in seconds for which to cache realpath information for a given -; file or directory. For systems with rarely changing files, consider increasing this -; value. -; http://php.net/realpath-cache-ttl -realpath_cache_ttl = 600 - -; Enables or disables the circular reference collector. -; http://php.net/zend.enable-gc -zend.enable_gc = On - -; If enabled, scripts may be written in encodings that are incompatible with -; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such -; encodings. To use this feature, mbstring extension must be enabled. -; Default: Off -;zend.multibyte = Off - -; Allows to set the default encoding for the scripts. This value will be used -; unless "declare(encoding=...)" directive appears at the top of the script. -; Only affects if zend.multibyte is set. -; Default: "" -;zend.script_encoding = - -;;;;;;;;;;;;;;;;; -; Miscellaneous ; -;;;;;;;;;;;;;;;;; - -; Decides whether PHP may expose the fact that it is installed on the server -; (e.g. by adding its signature to the Web server header). It is no security -; threat in any way, but it makes it possible to determine whether you use PHP -; on your server or not. -; http://php.net/expose-php -expose_php = Off - -;;;;;;;;;;;;;;;;;;; -; Resource Limits ; -;;;;;;;;;;;;;;;;;;; - -; Maximum execution time of each script, in seconds -; http://php.net/max-execution-time -; Note: This directive is hardcoded to 0 for the CLI SAPI -max_execution_time = 30 - -; Maximum amount of time each script may spend parsing request data. It's a good -; idea to limit this time on productions servers in order to eliminate unexpectedly -; long running scripts. -; Note: This directive is hardcoded to -1 for the CLI SAPI -; Default Value: -1 (Unlimited) -; Development Value: 60 (60 seconds) -; Production Value: 60 (60 seconds) -; http://php.net/max-input-time -max_input_time = 60 - -; Maximum input variable nesting level -; http://php.net/max-input-nesting-level -;max_input_nesting_level = 64 - -; How many GET/POST/COOKIE input variables may be accepted -; max_input_vars = 1000 - -; Maximum amount of memory a script may consume (128MB) -; http://php.net/memory-limit -memory_limit = 128M - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Error handling and logging ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; This directive informs PHP of which errors, warnings and notices you would like -; it to take action for. The recommended way of setting values for this -; directive is through the use of the error level constants and bitwise -; operators. The error level constants are below here for convenience as well as -; some common settings and their meanings. -; By default, PHP is set to take action on all errors, notices and warnings EXCEPT -; those related to E_NOTICE and E_STRICT, which together cover best practices and -; recommended coding standards in PHP. For performance reasons, this is the -; recommend error reporting setting. Your production server shouldn't be wasting -; resources complaining about best practices and coding standards. That's what -; development servers and development settings are for. -; Note: The php.ini-development file has this setting as E_ALL. This -; means it pretty much reports everything which is exactly what you want during -; development and early testing. -; -; Error Level Constants: -; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) -; E_ERROR - fatal run-time errors -; E_RECOVERABLE_ERROR - almost fatal run-time errors -; E_WARNING - run-time warnings (non-fatal errors) -; E_PARSE - compile-time parse errors -; E_NOTICE - run-time notices (these are warnings which often result -; from a bug in your code, but it's possible that it was -; intentional (e.g., using an uninitialized variable and -; relying on the fact it is automatically initialized to an -; empty string) -; E_STRICT - run-time notices, enable to have PHP suggest changes -; to your code which will ensure the best interoperability -; and forward compatibility of your code -; E_CORE_ERROR - fatal errors that occur during PHP's initial startup -; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's -; initial startup -; E_COMPILE_ERROR - fatal compile-time errors -; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) -; E_USER_ERROR - user-generated error message -; E_USER_WARNING - user-generated warning message -; E_USER_NOTICE - user-generated notice message -; E_DEPRECATED - warn about code that will not work in future versions -; of PHP -; E_USER_DEPRECATED - user-generated deprecation warnings -; -; Common Values: -; E_ALL (Show all errors, warnings and notices including coding standards.) -; E_ALL & ~E_NOTICE (Show all errors, except for notices) -; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) -; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) -; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED -; Development Value: E_ALL -; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT -; http://php.net/error-reporting -error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT - -; This directive controls whether or not and where PHP will output errors, -; notices and warnings too. Error output is very useful during development, but -; it could be very dangerous in production environments. Depending on the code -; which is triggering the error, sensitive information could potentially leak -; out of your application such as database usernames and passwords or worse. -; For production environments, we recommend logging errors rather than -; sending them to STDOUT. -; Possible Values: -; Off = Do not display any errors -; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) -; On or stdout = Display errors to STDOUT -; Default Value: On -; Development Value: On -; Production Value: Off -; http://php.net/display-errors -display_errors = Off - -; The display of errors which occur during PHP's startup sequence are handled -; separately from display_errors. PHP's default behavior is to suppress those -; errors from clients. Turning the display of startup errors on can be useful in -; debugging configuration problems. We strongly recommend you -; set this to 'off' for production servers. -; Default Value: Off -; Development Value: On -; Production Value: Off -; http://php.net/display-startup-errors -display_startup_errors = Off - -; Besides displaying errors, PHP can also log errors to locations such as a -; server-specific log, STDERR, or a location specified by the error_log -; directive found below. While errors should not be displayed on productions -; servers they should still be monitored and logging is a great way to do that. -; Default Value: Off -; Development Value: On -; Production Value: On -; http://php.net/log-errors -log_errors = On - -; Set maximum length of log_errors. In error_log information about the source is -; added. The default is 1024 and 0 allows to not apply any maximum length at all. -; http://php.net/log-errors-max-len -log_errors_max_len = 1024 - -; Do not log repeated messages. Repeated errors must occur in same file on same -; line unless ignore_repeated_source is set true. -; http://php.net/ignore-repeated-errors -ignore_repeated_errors = Off - -; Ignore source of message when ignoring repeated messages. When this setting -; is On you will not log errors with repeated messages from different files or -; source lines. -; http://php.net/ignore-repeated-source -ignore_repeated_source = Off - -; If this parameter is set to Off, then memory leaks will not be shown (on -; stdout or in the log). This has only effect in a debug compile, and if -; error reporting includes E_WARNING in the allowed list -; http://php.net/report-memleaks -report_memleaks = On - -; This setting is on by default. -;report_zend_debug = 0 - -; Store the last error/warning message in $php_errormsg (boolean). Setting this value -; to On can assist in debugging and is appropriate for development servers. It should -; however be disabled on production servers. -; This directive is DEPRECATED. -; Default Value: Off -; Development Value: Off -; Production Value: Off -; http://php.net/track-errors -;track_errors = Off - -; Turn off normal error reporting and emit XML-RPC error XML -; http://php.net/xmlrpc-errors -;xmlrpc_errors = 0 - -; An XML-RPC faultCode -;xmlrpc_error_number = 0 - -; When PHP displays or logs an error, it has the capability of formatting the -; error message as HTML for easier reading. This directive controls whether -; the error message is formatted as HTML or not. -; Note: This directive is hardcoded to Off for the CLI SAPI -; Default Value: On -; Development Value: On -; Production value: On -; http://php.net/html-errors -html_errors = On - -; If html_errors is set to On *and* docref_root is not empty, then PHP -; produces clickable error messages that direct to a page describing the error -; or function causing the error in detail. -; You can download a copy of the PHP manual from http://php.net/docs -; and change docref_root to the base URL of your local copy including the -; leading '/'. You must also specify the file extension being used including -; the dot. PHP's default behavior is to leave these settings empty, in which -; case no links to documentation are generated. -; Note: Never use this feature for production boxes. -; http://php.net/docref-root -; Examples -;docref_root = "/phpmanual/" - -; http://php.net/docref-ext -;docref_ext = .html - -; String to output before an error message. PHP's default behavior is to leave -; this setting blank. -; http://php.net/error-prepend-string -; Example: -;error_prepend_string = "" - -; String to output after an error message. PHP's default behavior is to leave -; this setting blank. -; http://php.net/error-append-string -; Example: -;error_append_string = "" - -; Log errors to specified file. PHP's default behavior is to leave this value -; empty. -; http://php.net/error-log -; Example: -;error_log = php_errors.log -; Log errors to syslog (Event Log on Windows). -;error_log = syslog - -;windows.show_crt_warning -; Default value: 0 -; Development value: 0 -; Production value: 0 - -;;;;;;;;;;;;;;;;; -; Data Handling ; -;;;;;;;;;;;;;;;;; - -; The separator used in PHP generated URLs to separate arguments. -; PHP's default setting is "&". -; http://php.net/arg-separator.output -; Example: -;arg_separator.output = "&" - -; List of separator(s) used by PHP to parse input URLs into variables. -; PHP's default setting is "&". -; NOTE: Every character in this directive is considered as separator! -; http://php.net/arg-separator.input -; Example: -;arg_separator.input = ";&" - -; This directive determines which super global arrays are registered when PHP -; starts up. G,P,C,E & S are abbreviations for the following respective super -; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty -; paid for the registration of these arrays and because ENV is not as commonly -; used as the others, ENV is not recommended on productions servers. You -; can still get access to the environment variables through getenv() should you -; need to. -; Default Value: "EGPCS" -; Development Value: "GPCS" -; Production Value: "GPCS"; -; http://php.net/variables-order -variables_order = "GPCS" - -; This directive determines which super global data (G,P & C) should be -; registered into the super global array REQUEST. If so, it also determines -; the order in which that data is registered. The values for this directive -; are specified in the same manner as the variables_order directive, -; EXCEPT one. Leaving this value empty will cause PHP to use the value set -; in the variables_order directive. It does not mean it will leave the super -; globals array REQUEST empty. -; Default Value: None -; Development Value: "GP" -; Production Value: "GP" -; http://php.net/request-order -request_order = "GP" - -; This directive determines whether PHP registers $argv & $argc each time it -; runs. $argv contains an array of all the arguments passed to PHP when a script -; is invoked. $argc contains an integer representing the number of arguments -; that were passed when the script was invoked. These arrays are extremely -; useful when running scripts from the command line. When this directive is -; enabled, registering these variables consumes CPU cycles and memory each time -; a script is executed. For performance reasons, this feature should be disabled -; on production servers. -; Note: This directive is hardcoded to On for the CLI SAPI -; Default Value: On -; Development Value: Off -; Production Value: Off -; http://php.net/register-argc-argv -register_argc_argv = Off - -; When enabled, the ENV, REQUEST and SERVER variables are created when they're -; first used (Just In Time) instead of when the script starts. If these -; variables are not used within a script, having this directive on will result -; in a performance gain. The PHP directive register_argc_argv must be disabled -; for this directive to have any affect. -; http://php.net/auto-globals-jit -auto_globals_jit = On - -; Whether PHP will read the POST data. -; This option is enabled by default. -; Most likely, you won't want to disable this option globally. It causes $_POST -; and $_FILES to always be empty; the only way you will be able to read the -; POST data will be through the php://input stream wrapper. This can be useful -; to proxy requests or to process the POST data in a memory efficient fashion. -; http://php.net/enable-post-data-reading -;enable_post_data_reading = Off - -; Maximum size of POST data that PHP will accept. -; Its value may be 0 to disable the limit. It is ignored if POST data reading -; is disabled through enable_post_data_reading. -; http://php.net/post-max-size -post_max_size = 8M - -; Automatically add files before PHP document. -; http://php.net/auto-prepend-file -auto_prepend_file = - -; Automatically add files after PHP document. -; http://php.net/auto-append-file -auto_append_file = - -; By default, PHP will output a media type using the Content-Type header. To -; disable this, simply set it to be empty. -; -; PHP's built-in default media type is set to text/html. -; http://php.net/default-mimetype -default_mimetype = "text/html" - -; PHP's default character set is set to UTF-8. -; http://php.net/default-charset -default_charset = "UTF-8" - -; PHP internal character encoding is set to empty. -; If empty, default_charset is used. -; http://php.net/internal-encoding -;internal_encoding = - -; PHP input character encoding is set to empty. -; If empty, default_charset is used. -; http://php.net/input-encoding -;input_encoding = - -; PHP output character encoding is set to empty. -; If empty, default_charset is used. -; See also output_buffer. -; http://php.net/output-encoding -;output_encoding = - -;;;;;;;;;;;;;;;;;;;;;;;;; -; Paths and Directories ; -;;;;;;;;;;;;;;;;;;;;;;;;; - -; UNIX: "/path1:/path2" -;include_path = ".:/usr/share/php" -; -; Windows: "\path1;\path2" -;include_path = ".;c:\php\includes" -; -; PHP's default setting for include_path is ".;/path/to/php/pear" -; http://php.net/include-path - -; The root of the PHP pages, used only if nonempty. -; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root -; if you are running php as a CGI under any web server (other than IIS) -; see documentation for security issues. The alternate is to use the -; cgi.force_redirect configuration below -; http://php.net/doc-root -doc_root = - -; The directory under which PHP opens the script using /~username used only -; if nonempty. -; http://php.net/user-dir -user_dir = - -; Directory in which the loadable extensions (modules) reside. -; http://php.net/extension-dir -; extension_dir = "./" -; On windows: -; extension_dir = "ext" - -; Directory where the temporary files should be placed. -; Defaults to the system default (see sys_get_temp_dir) -; sys_temp_dir = "/tmp" - -; Whether or not to enable the dl() function. The dl() function does NOT work -; properly in multithreaded servers, such as IIS or Zeus, and is automatically -; disabled on them. -; http://php.net/enable-dl -enable_dl = Off - -; cgi.force_redirect is necessary to provide security running PHP as a CGI under -; most web servers. Left undefined, PHP turns this on by default. You can -; turn it off here AT YOUR OWN RISK -; **You CAN safely turn this off for IIS, in fact, you MUST.** -; http://php.net/cgi.force-redirect -;cgi.force_redirect = 1 - -; if cgi.nph is enabled it will force cgi to always sent Status: 200 with -; every request. PHP's default behavior is to disable this feature. -;cgi.nph = 1 - -; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape -; (iPlanet) web servers, you MAY need to set an environment variable name that PHP -; will look for to know it is OK to continue execution. Setting this variable MAY -; cause security issues, KNOW WHAT YOU ARE DOING FIRST. -; http://php.net/cgi.redirect-status-env -;cgi.redirect_status_env = - -; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's -; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok -; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting -; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting -; of zero causes PHP to behave as before. Default is 1. You should fix your scripts -; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. -; http://php.net/cgi.fix-pathinfo - cgi.fix_pathinfo=0 - -; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside -; of the web tree and people will not be able to circumvent .htaccess security. -; http://php.net/cgi.dicard-path -;cgi.discard_path=1 - -; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate -; security tokens of the calling client. This allows IIS to define the -; security context that the request runs under. mod_fastcgi under Apache -; does not currently support this feature (03/17/2002) -; Set to 1 if running under IIS. Default is zero. -; http://php.net/fastcgi.impersonate -;fastcgi.impersonate = 1 - -; Disable logging through FastCGI connection. PHP's default behavior is to enable -; this feature. -;fastcgi.logging = 0 - -; cgi.rfc2616_headers configuration option tells PHP what type of headers to -; use when sending HTTP response code. If set to 0, PHP sends Status: header that -; is supported by Apache. When this option is set to 1, PHP will send -; RFC2616 compliant header. -; Default is zero. -; http://php.net/cgi.rfc2616-headers -;cgi.rfc2616_headers = 0 - -; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! -; (shebang) at the top of the running script. This line might be needed if the -; script support running both as stand-alone script and via PHP CGI<. PHP in CGI -; mode skips this line and ignores its content if this directive is turned on. -; http://php.net/cgi.check-shebang-line -;cgi.check_shebang_line=1 - -;;;;;;;;;;;;;;;; -; File Uploads ; -;;;;;;;;;;;;;;;; - -; Whether to allow HTTP file uploads. -; http://php.net/file-uploads -file_uploads = On - -; Temporary directory for HTTP uploaded files (will use system default if not -; specified). -; http://php.net/upload-tmp-dir -;upload_tmp_dir = - -; Maximum allowed size for uploaded files. -; http://php.net/upload-max-filesize -upload_max_filesize = 2M - -; Maximum number of files that can be uploaded via a single request -max_file_uploads = 20 - -;;;;;;;;;;;;;;;;;; -; Fopen wrappers ; -;;;;;;;;;;;;;;;;;; - -; Whether to allow the treatment of URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-fopen -allow_url_fopen = On - -; Whether to allow include/require to open URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-include -allow_url_include = Off - -; Define the anonymous ftp password (your email address). PHP's default setting -; for this is empty. -; http://php.net/from -;from="john@doe.com" - -; Define the User-Agent string. PHP's default setting for this is empty. -; http://php.net/user-agent -;user_agent="PHP" - -; Default timeout for socket based streams (seconds) -; http://php.net/default-socket-timeout -default_socket_timeout = 60 - -; If your scripts have to deal with files from Macintosh systems, -; or you are running on a Mac and need to deal with files from -; unix or win32 systems, setting this flag will cause PHP to -; automatically detect the EOL character in those files so that -; fgets() and file() will work regardless of the source of the file. -; http://php.net/auto-detect-line-endings -;auto_detect_line_endings = Off - -;;;;;;;;;;;;;;;;;;;;;; -; Dynamic Extensions ; -;;;;;;;;;;;;;;;;;;;;;; - -; If you wish to have an extension loaded automatically, use the following -; syntax: -; -; extension=modulename -; -; For example: -; -; extension=mysqli -; -; When the extension library to load is not located in the default extension -; directory, You may specify an absolute path to the library file: -; -; extension=/path/to/extension/mysqli.so -; -; Note : The syntax used in previous PHP versions ('extension=.so' and -; 'extension='php_.dll') is supported for legacy reasons and may be -; deprecated in a future PHP major version. So, when it is possible, please -; move to the new ('extension=) syntax. -; -; Notes for Windows environments : -; -; - ODBC support is built in, so no dll is needed for it. -; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) -; extension folders as well as the separate PECL DLL download (PHP 5+). -; Be sure to appropriately set the extension_dir directive. -; -;extension=bz2 -;extension=curl -;extension=fileinfo -;extension=gd2 -;extension=gettext -;extension=gmp -;extension=intl -;extension=imap -;extension=interbase -;extension=ldap -;extension=mbstring -;extension=exif ; Must be after mbstring as it depends on it -;extension=mysqli -;extension=oci8_12c ; Use with Oracle Database 12c Instant Client -;extension=openssl -;extension=pdo_firebird -;extension=pdo_mysql -;extension=pdo_oci -;extension=pdo_odbc -;extension=pdo_pgsql -;extension=pdo_sqlite -;extension=pgsql -;extension=shmop - -; The MIBS data available in the PHP distribution must be installed. -; See http://www.php.net/manual/en/snmp.installation.php -;extension=snmp - -;extension=soap -;extension=sockets -;extension=sqlite3 -;extension=tidy -;extension=xmlrpc -;extension=xsl - -;;;;;;;;;;;;;;;;;;; -; Module Settings ; -;;;;;;;;;;;;;;;;;;; - -[CLI Server] -; Whether the CLI web server uses ANSI color coding in its terminal output. -cli_server.color = On - -[Date] -; Defines the default timezone used by the date functions -; http://php.net/date.timezone -date.timezone = UTC - -; http://php.net/date.default-latitude -;date.default_latitude = 31.7667 - -; http://php.net/date.default-longitude -;date.default_longitude = 35.2333 - -; http://php.net/date.sunrise-zenith -;date.sunrise_zenith = 90.583333 - -; http://php.net/date.sunset-zenith -;date.sunset_zenith = 90.583333 - -[filter] -; http://php.net/filter.default -;filter.default = unsafe_raw - -; http://php.net/filter.default-flags -;filter.default_flags = - -[iconv] -; Use of this INI entry is deprecated, use global input_encoding instead. -; If empty, default_charset or input_encoding or iconv.input_encoding is used. -; The precedence is: default_charset < intput_encoding < iconv.input_encoding -;iconv.input_encoding = - -; Use of this INI entry is deprecated, use global internal_encoding instead. -; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. -; The precedence is: default_charset < internal_encoding < iconv.internal_encoding -;iconv.internal_encoding = - -; Use of this INI entry is deprecated, use global output_encoding instead. -; If empty, default_charset or output_encoding or iconv.output_encoding is used. -; The precedence is: default_charset < output_encoding < iconv.output_encoding -; To use an output encoding conversion, iconv's output handler must be set -; otherwise output encoding conversion cannot be performed. -;iconv.output_encoding = - -[intl] -;intl.default_locale = -; This directive allows you to produce PHP errors when some error -; happens within intl functions. The value is the level of the error produced. -; Default is 0, which does not produce any errors. -;intl.error_level = E_WARNING -;intl.use_exceptions = 0 - -[sqlite3] -;sqlite3.extension_dir = - -[Pcre] -;PCRE library backtracking limit. -; http://php.net/pcre.backtrack-limit -;pcre.backtrack_limit=100000 - -;PCRE library recursion limit. -;Please note that if you set this value to a high number you may consume all -;the available process stack and eventually crash PHP (due to reaching the -;stack size limit imposed by the Operating System). -; http://php.net/pcre.recursion-limit -;pcre.recursion_limit=100000 - -;Enables or disables JIT compilation of patterns. This requires the PCRE -;library to be compiled with JIT support. -;pcre.jit=1 - -[Pdo] -; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" -; http://php.net/pdo-odbc.connection-pooling -;pdo_odbc.connection_pooling=strict - -;pdo_odbc.db2_instance_name - -[Pdo_mysql] -; If mysqlnd is used: Number of cache slots for the internal result set cache -; http://php.net/pdo_mysql.cache_size -pdo_mysql.cache_size = 2000 - -; Default socket name for local MySQL connects. If empty, uses the built-in -; MySQL defaults. -; http://php.net/pdo_mysql.default-socket -pdo_mysql.default_socket= - -[Phar] -; http://php.net/phar.readonly -;phar.readonly = On - -; http://php.net/phar.require-hash -;phar.require_hash = On - -;phar.cache_list = - -[mail function] -; For Win32 only. -; http://php.net/smtp -SMTP = localhost -; http://php.net/smtp-port -smtp_port = 25 - -; For Win32 only. -; http://php.net/sendmail-from -;sendmail_from = me@example.com - -; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). -; http://php.net/sendmail-path -;sendmail_path = - -; Force the addition of the specified parameters to be passed as extra parameters -; to the sendmail binary. These parameters will always replace the value of -; the 5th parameter to mail(). -;mail.force_extra_parameters = - -; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename -mail.add_x_header = On - -; The path to a log file that will log all mail() calls. Log entries include -; the full path of the script, line number, To address and headers. -;mail.log = -; Log mail to syslog (Event Log on Windows). -;mail.log = syslog - -[ODBC] -; http://php.net/odbc.default-db -;odbc.default_db = Not yet implemented - -; http://php.net/odbc.default-user -;odbc.default_user = Not yet implemented - -; http://php.net/odbc.default-pw -;odbc.default_pw = Not yet implemented - -; Controls the ODBC cursor model. -; Default: SQL_CURSOR_STATIC (default). -;odbc.default_cursortype - -; Allow or prevent persistent links. -; http://php.net/odbc.allow-persistent -odbc.allow_persistent = On - -; Check that a connection is still valid before reuse. -; http://php.net/odbc.check-persistent -odbc.check_persistent = On - -; Maximum number of persistent links. -1 means no limit. -; http://php.net/odbc.max-persistent -odbc.max_persistent = -1 - -; Maximum number of links (persistent + non-persistent). -1 means no limit. -; http://php.net/odbc.max-links -odbc.max_links = -1 - -; Handling of LONG fields. Returns number of bytes to variables. 0 means -; passthru. -; http://php.net/odbc.defaultlrl -odbc.defaultlrl = 4096 - -; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. -; See the documentation on odbc_binmode and odbc_longreadlen for an explanation -; of odbc.defaultlrl and odbc.defaultbinmode -; http://php.net/odbc.defaultbinmode -odbc.defaultbinmode = 1 - -;birdstep.max_links = -1 - -[Interbase] -; Allow or prevent persistent links. -ibase.allow_persistent = 1 - -; Maximum number of persistent links. -1 means no limit. -ibase.max_persistent = -1 - -; Maximum number of links (persistent + non-persistent). -1 means no limit. -ibase.max_links = -1 - -; Default database name for ibase_connect(). -;ibase.default_db = - -; Default username for ibase_connect(). -;ibase.default_user = - -; Default password for ibase_connect(). -;ibase.default_password = - -; Default charset for ibase_connect(). -;ibase.default_charset = - -; Default timestamp format. -ibase.timestampformat = "%Y-%m-%d %H:%M:%S" - -; Default date format. -ibase.dateformat = "%Y-%m-%d" - -; Default time format. -ibase.timeformat = "%H:%M:%S" - -[MySQLi] - -; Maximum number of persistent links. -1 means no limit. -; http://php.net/mysqli.max-persistent -mysqli.max_persistent = -1 - -; Allow accessing, from PHP's perspective, local files with LOAD DATA statements -; http://php.net/mysqli.allow_local_infile -;mysqli.allow_local_infile = On - -; Allow or prevent persistent links. -; http://php.net/mysqli.allow-persistent -mysqli.allow_persistent = On - -; Maximum number of links. -1 means no limit. -; http://php.net/mysqli.max-links -mysqli.max_links = -1 - -; If mysqlnd is used: Number of cache slots for the internal result set cache -; http://php.net/mysqli.cache_size -mysqli.cache_size = 2000 - -; Default port number for mysqli_connect(). If unset, mysqli_connect() will use -; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the -; compile-time value defined MYSQL_PORT (in that order). Win32 will only look -; at MYSQL_PORT. -; http://php.net/mysqli.default-port -mysqli.default_port = 3306 - -; Default socket name for local MySQL connects. If empty, uses the built-in -; MySQL defaults. -; http://php.net/mysqli.default-socket -mysqli.default_socket = - -; Default host for mysql_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-host -mysqli.default_host = - -; Default user for mysql_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-user -mysqli.default_user = - -; Default password for mysqli_connect() (doesn't apply in safe mode). -; Note that this is generally a *bad* idea to store passwords in this file. -; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") -; and reveal this password! And of course, any users with read access to this -; file will be able to reveal the password as well. -; http://php.net/mysqli.default-pw -mysqli.default_pw = - -; Allow or prevent reconnect -mysqli.reconnect = Off - -[mysqlnd] -; Enable / Disable collection of general statistics by mysqlnd which can be -; used to tune and monitor MySQL operations. -; http://php.net/mysqlnd.collect_statistics -mysqlnd.collect_statistics = Off - -; Enable / Disable collection of memory usage statistics by mysqlnd which can be -; used to tune and monitor MySQL operations. -; http://php.net/mysqlnd.collect_memory_statistics -mysqlnd.collect_memory_statistics = Off - -; Records communication from all extensions using mysqlnd to the specified log -; file. -; http://php.net/mysqlnd.debug -;mysqlnd.debug = - -; Defines which queries will be logged. -; http://php.net/mysqlnd.log_mask -;mysqlnd.log_mask = 0 - -; Default size of the mysqlnd memory pool, which is used by result sets. -; http://php.net/mysqlnd.mempool_default_size -mysqlnd.mempool_default_size = 32768 - -; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. -; http://php.net/mysqlnd.net_cmd_buffer_size -mysqlnd.net_cmd_buffer_size = 4096 - -; Size of a pre-allocated buffer used for reading data sent by the server in -; bytes. -; http://php.net/mysqlnd.net_read_buffer_size -;mysqlnd.net_read_buffer_size = 32768 - -; Timeout for network requests in seconds. -; http://php.net/mysqlnd.net_read_timeout -;mysqlnd.net_read_timeout = 31536000 - -; SHA-256 Authentication Plugin related. File with the MySQL server public RSA -; key. -; http://php.net/mysqlnd.sha256_server_public_key -;mysqlnd.sha256_server_public_key = - -[OCI8] - -; Connection: Enables privileged connections using external -; credentials (OCI_SYSOPER, OCI_SYSDBA) -; http://php.net/oci8.privileged-connect -;oci8.privileged_connect = Off - -; Connection: The maximum number of persistent OCI8 connections per -; process. Using -1 means no limit. -; http://php.net/oci8.max-persistent -;oci8.max_persistent = -1 - -; Connection: The maximum number of seconds a process is allowed to -; maintain an idle persistent connection. Using -1 means idle -; persistent connections will be maintained forever. -; http://php.net/oci8.persistent-timeout -;oci8.persistent_timeout = -1 - -; Connection: The number of seconds that must pass before issuing a -; ping during oci_pconnect() to check the connection validity. When -; set to 0, each oci_pconnect() will cause a ping. Using -1 disables -; pings completely. -; http://php.net/oci8.ping-interval -;oci8.ping_interval = 60 - -; Connection: Set this to a user chosen connection class to be used -; for all pooled server requests with Oracle 11g Database Resident -; Connection Pooling (DRCP). To use DRCP, this value should be set to -; the same string for all web servers running the same application, -; the database pool must be configured, and the connection string must -; specify to use a pooled server. -;oci8.connection_class = - -; High Availability: Using On lets PHP receive Fast Application -; Notification (FAN) events generated when a database node fails. The -; database must also be configured to post FAN events. -;oci8.events = Off - -; Tuning: This option enables statement caching, and specifies how -; many statements to cache. Using 0 disables statement caching. -; http://php.net/oci8.statement-cache-size -;oci8.statement_cache_size = 20 - -; Tuning: Enables statement prefetching and sets the default number of -; rows that will be fetched automatically after statement execution. -; http://php.net/oci8.default-prefetch -;oci8.default_prefetch = 100 - -; Compatibility. Using On means oci_close() will not close -; oci_connect() and oci_new_connect() connections. -; http://php.net/oci8.old-oci-close-semantics -;oci8.old_oci_close_semantics = Off - -[PostgreSQL] -; Allow or prevent persistent links. -; http://php.net/pgsql.allow-persistent -pgsql.allow_persistent = On - -; Detect broken persistent links always with pg_pconnect(). -; Auto reset feature requires a little overheads. -; http://php.net/pgsql.auto-reset-persistent -pgsql.auto_reset_persistent = Off - -; Maximum number of persistent links. -1 means no limit. -; http://php.net/pgsql.max-persistent -pgsql.max_persistent = -1 - -; Maximum number of links (persistent+non persistent). -1 means no limit. -; http://php.net/pgsql.max-links -pgsql.max_links = -1 - -; Ignore PostgreSQL backends Notice message or not. -; Notice message logging require a little overheads. -; http://php.net/pgsql.ignore-notice -pgsql.ignore_notice = 0 - -; Log PostgreSQL backends Notice message or not. -; Unless pgsql.ignore_notice=0, module cannot log notice message. -; http://php.net/pgsql.log-notice -pgsql.log_notice = 0 - -[bcmath] -; Number of decimal digits for all bcmath functions. -; http://php.net/bcmath.scale -bcmath.scale = 0 - -[browscap] -; http://php.net/browscap -;browscap = extra/browscap.ini - -[Session] -; Handler used to store/retrieve data. -; http://php.net/session.save-handler -session.save_handler = files - -; Argument passed to save_handler. In the case of files, this is the path -; where data files are stored. Note: Windows users have to change this -; variable in order to use PHP's session functions. -; -; The path can be defined as: -; -; session.save_path = "N;/path" -; -; where N is an integer. Instead of storing all the session files in -; /path, what this will do is use subdirectories N-levels deep, and -; store the session data in those directories. This is useful if -; your OS has problems with many files in one directory, and is -; a more efficient layout for servers that handle many sessions. -; -; NOTE 1: PHP will not create this directory structure automatically. -; You can use the script in the ext/session dir for that purpose. -; NOTE 2: See the section on garbage collection below if you choose to -; use subdirectories for session storage -; -; The file storage module creates files using mode 600 by default. -; You can change that by using -; -; session.save_path = "N;MODE;/path" -; -; where MODE is the octal representation of the mode. Note that this -; does not overwrite the process's umask. -; http://php.net/session.save-path -;session.save_path = "/var/lib/php/sessions" - -; Whether to use strict session mode. -; Strict session mode does not accept uninitialized session ID and regenerate -; session ID if browser sends uninitialized session ID. Strict mode protects -; applications from session fixation via session adoption vulnerability. It is -; disabled by default for maximum compatibility, but enabling it is encouraged. -; https://wiki.php.net/rfc/strict_sessions -session.use_strict_mode = 0 - -; Whether to use cookies. -; http://php.net/session.use-cookies -session.use_cookies = 1 - -; http://php.net/session.cookie-secure -;session.cookie_secure = - -; This option forces PHP to fetch and use a cookie for storing and maintaining -; the session id. We encourage this operation as it's very helpful in combating -; session hijacking when not specifying and managing your own session id. It is -; not the be-all and end-all of session hijacking defense, but it's a good start. -; http://php.net/session.use-only-cookies -session.use_only_cookies = 1 - -; Name of the session (used as cookie name). -; http://php.net/session.name -session.name = PHPSESSID - -; Initialize session on request startup. -; http://php.net/session.auto-start -session.auto_start = 0 - -; Lifetime in seconds of cookie or, if 0, until browser is restarted. -; http://php.net/session.cookie-lifetime -session.cookie_lifetime = 0 - -; The path for which the cookie is valid. -; http://php.net/session.cookie-path -session.cookie_path = / - -; The domain for which the cookie is valid. -; http://php.net/session.cookie-domain -session.cookie_domain = - -; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. -; http://php.net/session.cookie-httponly -session.cookie_httponly = - -; Handler used to serialize data. php is the standard serializer of PHP. -; http://php.net/session.serialize-handler -session.serialize_handler = php - -; Defines the probability that the 'garbage collection' process is started -; on every session initialization. The probability is calculated by using -; gc_probability/gc_divisor. Where session.gc_probability is the numerator -; and gc_divisor is the denominator in the equation. Setting this value to 1 -; when the session.gc_divisor value is 100 will give you approximately a 1% chance -; the gc will run on any give request. -; Default Value: 1 -; Development Value: 1 -; Production Value: 1 -; http://php.net/session.gc-probability -session.gc_probability = 0 - -; Defines the probability that the 'garbage collection' process is started on every -; session initialization. The probability is calculated by using the following equation: -; gc_probability/gc_divisor. Where session.gc_probability is the numerator and -; session.gc_divisor is the denominator in the equation. Setting this value to 1 -; when the session.gc_divisor value is 100 will give you approximately a 1% chance -; the gc will run on any give request. Increasing this value to 1000 will give you -; a 0.1% chance the gc will run on any give request. For high volume production servers, -; this is a more efficient approach. -; Default Value: 100 -; Development Value: 1000 -; Production Value: 1000 -; http://php.net/session.gc-divisor -session.gc_divisor = 1000 - -; After this number of seconds, stored data will be seen as 'garbage' and -; cleaned up by the garbage collection process. -; http://php.net/session.gc-maxlifetime -session.gc_maxlifetime = 1440 - -; NOTE: If you are using the subdirectory option for storing session files -; (see session.save_path above), then garbage collection does *not* -; happen automatically. You will need to do your own garbage -; collection through a shell script, cron entry, or some other method. -; For example, the following script would is the equivalent of -; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): -; find /path/to/sessions -cmin +24 -type f | xargs rm - -; Check HTTP Referer to invalidate externally stored URLs containing ids. -; HTTP_REFERER has to contain this substring for the session to be -; considered as valid. -; http://php.net/session.referer-check -session.referer_check = - -; Set to {nocache,private,public,} to determine HTTP caching aspects -; or leave this empty to avoid sending anti-caching headers. -; http://php.net/session.cache-limiter -session.cache_limiter = nocache - -; Document expires after n minutes. -; http://php.net/session.cache-expire -session.cache_expire = 180 - -; trans sid support is disabled by default. -; Use of trans sid may risk your users' security. -; Use this option with caution. -; - User may send URL contains active session ID -; to other person via. email/irc/etc. -; - URL that contains active session ID may be stored -; in publicly accessible computer. -; - User may access your site with the same session ID -; always using URL stored in browser's history or bookmarks. -; http://php.net/session.use-trans-sid -session.use_trans_sid = 0 - -; Set session ID character length. This value could be between 22 to 256. -; Shorter length than default is supported only for compatibility reason. -; Users should use 32 or more chars. -; http://php.net/session.sid-length -; Default Value: 32 -; Development Value: 26 -; Production Value: 26 -session.sid_length = 26 - -; The URL rewriter will look for URLs in a defined set of HTML tags. -;
      is special; if you include them here, the rewriter will -; add a hidden field with the info which is otherwise appended -; to URLs. tag's action attribute URL will not be modified -; unless it is specified. -; Note that all valid entries require a "=", even if no value follows. -; Default Value: "a=href,area=href,frame=src,form=" -; Development Value: "a=href,area=href,frame=src,form=" -; Production Value: "a=href,area=href,frame=src,form=" -; http://php.net/url-rewriter.tags -session.trans_sid_tags = "a=href,area=href,frame=src,form=" - -; URL rewriter does not rewrite absolute URLs by default. -; To enable rewrites for absolute pathes, target hosts must be specified -; at RUNTIME. i.e. use ini_set() -; tags is special. PHP will check action attribute's URL regardless -; of session.trans_sid_tags setting. -; If no host is defined, HTTP_HOST will be used for allowed host. -; Example value: php.net,www.php.net,wiki.php.net -; Use "," for multiple hosts. No spaces are allowed. -; Default Value: "" -; Development Value: "" -; Production Value: "" -;session.trans_sid_hosts="" - -; Define how many bits are stored in each character when converting -; the binary hash data to something readable. -; Possible values: -; 4 (4 bits: 0-9, a-f) -; 5 (5 bits: 0-9, a-v) -; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") -; Default Value: 4 -; Development Value: 5 -; Production Value: 5 -; http://php.net/session.hash-bits-per-character -session.sid_bits_per_character = 5 - -; Enable upload progress tracking in $_SESSION -; Default Value: On -; Development Value: On -; Production Value: On -; http://php.net/session.upload-progress.enabled -;session.upload_progress.enabled = On - -; Cleanup the progress information as soon as all POST data has been read -; (i.e. upload completed). -; Default Value: On -; Development Value: On -; Production Value: On -; http://php.net/session.upload-progress.cleanup -;session.upload_progress.cleanup = On - -; A prefix used for the upload progress key in $_SESSION -; Default Value: "upload_progress_" -; Development Value: "upload_progress_" -; Production Value: "upload_progress_" -; http://php.net/session.upload-progress.prefix -;session.upload_progress.prefix = "upload_progress_" - -; The index name (concatenated with the prefix) in $_SESSION -; containing the upload progress information -; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" -; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" -; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" -; http://php.net/session.upload-progress.name -;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" - -; How frequently the upload progress should be updated. -; Given either in percentages (per-file), or in bytes -; Default Value: "1%" -; Development Value: "1%" -; Production Value: "1%" -; http://php.net/session.upload-progress.freq -;session.upload_progress.freq = "1%" - -; The minimum delay between updates, in seconds -; Default Value: 1 -; Development Value: 1 -; Production Value: 1 -; http://php.net/session.upload-progress.min-freq -;session.upload_progress.min_freq = "1" - -; Only write session data when session data is changed. Enabled by default. -; http://php.net/session.lazy-write -;session.lazy_write = On - -[Assertion] -; Switch whether to compile assertions at all (to have no overhead at run-time) -; -1: Do not compile at all -; 0: Jump over assertion at run-time -; 1: Execute assertions -; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) -; Default Value: 1 -; Development Value: 1 -; Production Value: -1 -; http://php.net/zend.assertions -zend.assertions = -1 - -; Assert(expr); active by default. -; http://php.net/assert.active -;assert.active = On - -; Throw an AssertationException on failed assertions -; http://php.net/assert.exception -;assert.exception = On - -; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) -; http://php.net/assert.warning -;assert.warning = On - -; Don't bail out by default. -; http://php.net/assert.bail -;assert.bail = Off - -; User-function to be called if an assertion fails. -; http://php.net/assert.callback -;assert.callback = 0 - -; Eval the expression with current error_reporting(). Set to true if you want -; error_reporting(0) around the eval(). -; http://php.net/assert.quiet-eval -;assert.quiet_eval = 0 - -[COM] -; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs -; http://php.net/com.typelib-file -;com.typelib_file = - -; allow Distributed-COM calls -; http://php.net/com.allow-dcom -;com.allow_dcom = true - -; autoregister constants of a components typlib on com_load() -; http://php.net/com.autoregister-typelib -;com.autoregister_typelib = true - -; register constants casesensitive -; http://php.net/com.autoregister-casesensitive -;com.autoregister_casesensitive = false - -; show warnings on duplicate constant registrations -; http://php.net/com.autoregister-verbose -;com.autoregister_verbose = true - -; The default character set code-page to use when passing strings to and from COM objects. -; Default: system ANSI code page -;com.code_page= - -[mbstring] -; language for internal character representation. -; This affects mb_send_mail() and mbstring.detect_order. -; http://php.net/mbstring.language -;mbstring.language = Japanese - -; Use of this INI entry is deprecated, use global internal_encoding instead. -; internal/script encoding. -; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) -; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. -; The precedence is: default_charset < internal_encoding < iconv.internal_encoding -;mbstring.internal_encoding = - -; Use of this INI entry is deprecated, use global input_encoding instead. -; http input encoding. -; mbstring.encoding_traslation = On is needed to use this setting. -; If empty, default_charset or input_encoding or mbstring.input is used. -; The precedence is: default_charset < intput_encoding < mbsting.http_input -; http://php.net/mbstring.http-input -;mbstring.http_input = - -; Use of this INI entry is deprecated, use global output_encoding instead. -; http output encoding. -; mb_output_handler must be registered as output buffer to function. -; If empty, default_charset or output_encoding or mbstring.http_output is used. -; The precedence is: default_charset < output_encoding < mbstring.http_output -; To use an output encoding conversion, mbstring's output handler must be set -; otherwise output encoding conversion cannot be performed. -; http://php.net/mbstring.http-output -;mbstring.http_output = - -; enable automatic encoding translation according to -; mbstring.internal_encoding setting. Input chars are -; converted to internal encoding by setting this to On. -; Note: Do _not_ use automatic encoding translation for -; portable libs/applications. -; http://php.net/mbstring.encoding-translation -;mbstring.encoding_translation = Off - -; automatic encoding detection order. -; "auto" detect order is changed according to mbstring.language -; http://php.net/mbstring.detect-order -;mbstring.detect_order = auto - -; substitute_character used when character cannot be converted -; one from another -; http://php.net/mbstring.substitute-character -;mbstring.substitute_character = none - -; overload(replace) single byte functions by mbstring functions. -; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), -; etc. Possible values are 0,1,2,4 or combination of them. -; For example, 7 for overload everything. -; 0: No overload -; 1: Overload mail() function -; 2: Overload str*() functions -; 4: Overload ereg*() functions -; http://php.net/mbstring.func-overload -;mbstring.func_overload = 0 - -; enable strict encoding detection. -; Default: Off -;mbstring.strict_detection = On - -; This directive specifies the regex pattern of content types for which mb_output_handler() -; is activated. -; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) -;mbstring.http_output_conv_mimetype= - -[gd] -; Tell the jpeg decode to ignore warnings and try to create -; a gd image. The warning will then be displayed as notices -; disabled by default -; http://php.net/gd.jpeg-ignore-warning -;gd.jpeg_ignore_warning = 1 - -[exif] -; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. -; With mbstring support this will automatically be converted into the encoding -; given by corresponding encode setting. When empty mbstring.internal_encoding -; is used. For the decode settings you can distinguish between motorola and -; intel byte order. A decode setting cannot be empty. -; http://php.net/exif.encode-unicode -;exif.encode_unicode = ISO-8859-15 - -; http://php.net/exif.decode-unicode-motorola -;exif.decode_unicode_motorola = UCS-2BE - -; http://php.net/exif.decode-unicode-intel -;exif.decode_unicode_intel = UCS-2LE - -; http://php.net/exif.encode-jis -;exif.encode_jis = - -; http://php.net/exif.decode-jis-motorola -;exif.decode_jis_motorola = JIS - -; http://php.net/exif.decode-jis-intel -;exif.decode_jis_intel = JIS - -[Tidy] -; The path to a default tidy configuration file to use when using tidy -; http://php.net/tidy.default-config -;tidy.default_config = /usr/local/lib/php/default.tcfg - -; Should tidy clean and repair output automatically? -; WARNING: Do not use this option if you are generating non-html content -; such as dynamic images -; http://php.net/tidy.clean-output -tidy.clean_output = Off - -[soap] -; Enables or disables WSDL caching feature. -; http://php.net/soap.wsdl-cache-enabled -soap.wsdl_cache_enabled=1 - -; Sets the directory name where SOAP extension will put cache files. -; http://php.net/soap.wsdl-cache-dir -soap.wsdl_cache_dir="/tmp" - -; (time to live) Sets the number of second while cached file will be used -; instead of original one. -; http://php.net/soap.wsdl-cache-ttl -soap.wsdl_cache_ttl=86400 - -; Sets the size of the cache limit. (Max. number of WSDL files to cache) -soap.wsdl_cache_limit = 5 - -[sysvshm] -; A default size of the shared memory segment -;sysvshm.init_mem = 10000 - -[ldap] -; Sets the maximum number of open links or -1 for unlimited. -ldap.max_links = -1 - -[dba] -;dba.default_handler= - -[opcache] -; Determines if Zend OPCache is enabled -opcache.enable=1 - -; Determines if Zend OPCache is enabled for the CLI version of PHP -;opcache.enable_cli=0 - -; The OPcache shared memory storage size. -opcache.memory_consumption=256 - -; The amount of memory for interned strings in Mbytes. -opcache.interned_strings_buffer=16 - -; The maximum number of keys (scripts) in the OPcache hash table. -; Only numbers between 200 and 1000000 are allowed. -opcache.max_accelerated_files=7963 - -; The maximum percentage of "wasted" memory until a restart is scheduled. -;opcache.max_wasted_percentage=5 - -; When this directive is enabled, the OPcache appends the current working -; directory to the script key, thus eliminating possible collisions between -; files with the same name (basename). Disabling the directive improves -; performance, but may break existing applications. -;opcache.use_cwd=1 - -; When disabled, you must reset the OPcache manually or restart the -; webserver for changes to the filesystem to take effect. -opcache.validate_timestamps=0 - -; How often (in seconds) to check file timestamps for changes to the shared -; memory storage allocation. ("1" means validate once per second, but only -; once per request. "0" means always validate) -;opcache.revalidate_freq=2 - -; Enables or disables file search in include_path optimization -opcache.revalidate_path=0 - -; If disabled, all PHPDoc comments are dropped from the code to reduce the -; size of the optimized code. -opcache.save_comments=0 - -; Allow file existence override (file_exists, etc.) performance feature. -opcache.enable_file_override=1 - -; A bitmask, where each bit enables or disables the appropriate OPcache -; passes -;opcache.optimization_level=0xffffffff - -;opcache.inherited_hack=1 -;opcache.dups_fix=0 - -; The location of the OPcache blacklist file (wildcards allowed). -; Each OPcache blacklist file is a text file that holds the names of files -; that should not be accelerated. The file format is to add each filename -; to a new line. The filename may be a full path or just a file prefix -; (i.e., /var/www/x blacklists all the files and directories in /var/www -; that start with 'x'). Line starting with a ; are ignored (comments). -;opcache.blacklist_filename= - -; Allows exclusion of large files from being cached. By default all files -; are cached. -;opcache.max_file_size=0 - -; Check the cache checksum each N requests. -; The default value of "0" means that the checks are disabled. -;opcache.consistency_checks=0 - -; How long to wait (in seconds) for a scheduled restart to begin if the cache -; is not being accessed. -;opcache.force_restart_timeout=180 - -; OPcache error_log file name. Empty string assumes "stderr". -;opcache.error_log= - -; All OPcache errors go to the Web server log. -; By default, only fatal errors (level 0) or errors (level 1) are logged. -; You can also enable warnings (level 2), info messages (level 3) or -; debug messages (level 4). -;opcache.log_verbosity_level=1 - -; Preferred Shared Memory back-end. Leave empty and let the system decide. -;opcache.preferred_memory_model= - -; Protect the shared memory from unexpected writing during script execution. -; Useful for internal debugging only. -;opcache.protect_memory=0 - -; Allows calling OPcache API functions only from PHP scripts which path is -; started from specified string. The default "" means no restriction -;opcache.restrict_api= - -; Mapping base of shared memory segments (for Windows only). All the PHP -; processes have to map shared memory into the same address space. This -; directive allows to manually fix the "Unable to reattach to base address" -; errors. -;opcache.mmap_base= - -; Enables and sets the second level cache directory. -; It should improve performance when SHM memory is full, at server restart or -; SHM reset. The default "" disables file based caching. -;opcache.file_cache= - -; Enables or disables opcode caching in shared memory. -;opcache.file_cache_only=0 - -; Enables or disables checksum validation when script loaded from file cache. -;opcache.file_cache_consistency_checks=1 - -; Implies opcache.file_cache_only=1 for a certain process that failed to -; reattach to the shared memory (for Windows only). Explicitly enabled file -; cache is required. -;opcache.file_cache_fallback=1 - -; Enables or disables copying of PHP code (text segment) into HUGE PAGES. -; This should improve performance, but requires appropriate OS configuration. -;opcache.huge_code_pages=1 - -; Validate cached file permissions. -;opcache.validate_permission=0 - -; Prevent name collisions in chroot'ed environment. -;opcache.validate_root=0 - -; Prevents caching files that are less than this number of seconds old. -; It protects from caching of incompletely updated files. -; In case all file updates on your site are atomic, you may increase performance by setting it to "0". -opcache.file_update_protection=0 - -opcache.fast_shutdown=1 - -opcache.preload_user=www-data - -[curl] -; A default value for the CURLOPT_CAINFO option. This is required to be an -; absolute path. -;curl.cainfo = - -[openssl] -; The location of a Certificate Authority (CA) file on the local filesystem -; to use when verifying the identity of SSL/TLS peers. Most users should -; not specify a value for this directive as PHP will attempt to use the -; OS-managed cert stores in its absence. If specified, this value may still -; be overridden on a per-stream basis via the "cafile" SSL stream context -; option. -;openssl.cafile= - -; If openssl.cafile is not specified or if the CA file is not found, the -; directory pointed to by openssl.capath is searched for a suitable -; certificate. This value must be a correctly hashed certificate directory. -; Most users should not specify a value for this directive as PHP will -; attempt to use the OS-managed cert stores in its absence. If specified, -; this value may still be overridden on a per-stream basis via the "capath" -; SSL stream context option. -;openssl.capath= - -opcache.jit_buffer_size = 128M -opcache.jit = tracing - -; Local Variables: -; tab-width: 4 -; End: diff --git a/frameworks/PHP/lumen/deploy/laravel-s/composer.json b/frameworks/PHP/lumen/deploy/laravel-s/composer.json deleted file mode 100644 index dff71f25717..00000000000 --- a/frameworks/PHP/lumen/deploy/laravel-s/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "laravel/lumen", - "description": "The Laravel Lumen Framework.", - "keywords": ["framework", "laravel", "lumen"], - "license": "MIT", - "type": "project", - "require": { - "laravel/lumen-framework": "^9", - "hhxsv5/laravel-s": "~3.7.0" - }, - "require-dev": { - "fzaninotto/faker": "^1.9.1", - "mockery/mockery": "^1.3.1", - "phpunit/phpunit": "^9.3" - }, - "autoload": { - "psr-4": { - "App\\": "app/" - } - }, - "autoload-dev": { - "classmap": [ - "tests/", - "database/" - ] - }, - "scripts": { - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ] - }, - "minimum-stability": "dev", - "prefer-stable": true, - "config": { - "optimize-autoloader": true - } -} diff --git a/frameworks/PHP/lumen/deploy/nginx.conf b/frameworks/PHP/lumen/deploy/nginx.conf deleted file mode 100755 index a968d5cb1fe..00000000000 --- a/frameworks/PHP/lumen/deploy/nginx.conf +++ /dev/null @@ -1,64 +0,0 @@ -user www-data; -worker_processes auto; -error_log stderr error; -worker_rlimit_nofile 200000; -daemon off; - -events { - worker_connections 16384; - multi_accept off; - -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - access_log off; - server_tokens off; - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - keepalive_disable none; - keepalive_requests 10000; - - #the bench don't use any static file - #open_file_cache max=2000 inactive=20s; - #open_file_cache_valid 60s; - #open_file_cache_min_uses 5; - #open_file_cache_errors off; - - #FastCGI optimizations - fastcgi_buffers 256 16k; - fastcgi_buffer_size 128k; - fastcgi_connect_timeout 30s; - fastcgi_send_timeout 60s; - fastcgi_read_timeout 60s; - fastcgi_busy_buffers_size 256k; - fastcgi_temp_file_write_size 256k; - reset_timedout_connection on; - server_names_hash_bucket_size 100; - - - upstream fastcgi_backend { - server unix:/var/run/php/php-fpm.sock; - keepalive 40; - } - - server { - listen 8080; - server_name localhost; - - root /lumen/public/; - index index.php; - - location / { - fastcgi_pass fastcgi_backend; - fastcgi_keep_conn on; - fastcgi_param SCRIPT_FILENAME $document_root/index.php; - fastcgi_param PATH_INFO $uri; - include /etc/nginx/fastcgi_params; - } - } -} diff --git a/frameworks/PHP/lumen/deploy/swoole/composer.json b/frameworks/PHP/lumen/deploy/swoole/composer.json deleted file mode 100644 index 723dc0cb69d..00000000000 --- a/frameworks/PHP/lumen/deploy/swoole/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "laravel/lumen", - "description": "The Laravel Lumen Framework.", - "keywords": ["framework", "laravel", "lumen"], - "license": "MIT", - "type": "project", - "require": { - "laravel/lumen-framework": "^9", - "swooletw/laravel-swoole": "^v2.12" - }, - "autoload": { - "psr-4": { - "App\\": "app/" - } - }, - "scripts": { - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ] - }, - "minimum-stability": "dev", - "prefer-stable": true, - "config": { - "optimize-autoloader": true - } -} diff --git a/frameworks/PHP/lumen/deploy/swoole/install-composer.sh b/frameworks/PHP/lumen/deploy/swoole/install-composer.sh deleted file mode 100644 index f8e743d6a13..00000000000 --- a/frameworks/PHP/lumen/deploy/swoole/install-composer.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -EXPECTED_SIGNATURE="$(curl -s https://composer.github.io/installer.sig)" -php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" -ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")" - -if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] -then - >&2 echo 'ERROR: Invalid installer signature' - rm composer-setup.php - exit 1 -fi - -php composer-setup.php --quiet -RESULT=$? -rm composer-setup.php -exit $RESULT \ No newline at end of file diff --git a/frameworks/PHP/lumen/deploy/swoole/php.ini b/frameworks/PHP/lumen/deploy/swoole/php.ini deleted file mode 100644 index 3cf51cccca9..00000000000 --- a/frameworks/PHP/lumen/deploy/swoole/php.ini +++ /dev/null @@ -1,2 +0,0 @@ -opcache.enable_cli=1 -opcache.validate_timestamps=0 diff --git a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile deleted file mode 100644 index 15b5544d1d2..00000000000 --- a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM phpswoole/swoole:php8.4 - -RUN docker-php-ext-install pcntl opcache curl > /dev/null - -RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -#RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -#RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini - -WORKDIR /lumen -COPY --link . . - -RUN mkdir -p bootstrap/cache \ - storage/logs \ - storage/framework/sessions \ - storage/framework/views \ - storage/framework/cache - -RUN chmod -R 777 /lumen - -COPY deploy/laravel-s/composer.json ./ - -RUN echo "LARAVELS_LISTEN_IP=0.0.0.0" >> .env -RUN echo "LARAVELS_LISTEN_PORT=8080" >> .env - -RUN composer install -a --no-dev --quiet -RUN php artisan laravels publish - -EXPOSE 8080 - -ENTRYPOINT [ "php", "bin/laravels", "start" ] diff --git a/frameworks/PHP/lumen/lumen-swoole.dockerfile b/frameworks/PHP/lumen/lumen-swoole.dockerfile deleted file mode 100644 index b146bb5c926..00000000000 --- a/frameworks/PHP/lumen/lumen-swoole.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM phpswoole/swoole:php8.4 - -RUN docker-php-ext-install pcntl opcache curl > /dev/null - -WORKDIR /lumen -COPY --link . . - -COPY --link deploy/swoole/php.ini /usr/local/etc/php/ - -RUN mkdir -p /lumen/storage/framework/sessions /lumen/storage/framework/views /lumen/storage/framework/cache - -COPY deploy/swoole/composer* ./ -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet - -RUN echo "APP_SWOOLE=true" >> .env - -RUN chmod -R 777 /lumen - -EXPOSE 8080 - -ENTRYPOINT [ "php", "artisan", "swoole:http", "start" ] diff --git a/frameworks/PHP/lumen/lumen-workerman.dockerfile b/frameworks/PHP/lumen/lumen-workerman.dockerfile deleted file mode 100644 index 6d837ace26f..00000000000 --- a/frameworks/PHP/lumen/lumen-workerman.dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM ubuntu:24.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 > /dev/null && \ - apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null - -RUN apt-get install -yqq nginx git unzip \ - php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-dev > /dev/null - -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer - -RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null -RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini - -WORKDIR /lumen -COPY --link . . - - -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN composer require joanhey/adapterman:^0.7 --quiet - -RUN mkdir -p storage \ - storage/framework/sessions \ - storage/framework/views \ - storage/framework/cache - -RUN chmod -R 777 /lumen - -EXPOSE 8080 - -CMD php -c deploy/conf/cli-php.ini \ - server-man.php start diff --git a/frameworks/PHP/lumen/lumen.dockerfile b/frameworks/PHP/lumen/lumen.dockerfile deleted file mode 100644 index 57b45fe86a9..00000000000 --- a/frameworks/PHP/lumen/lumen.dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM ubuntu:24.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 > /dev/null && \ - apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null - -RUN apt-get install -yqq nginx git unzip \ - php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml php8.4-dev > /dev/null - -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer - -COPY deploy/conf/* /etc/php/8.4/fpm/ - -WORKDIR /lumen -COPY --link . . - - -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; - -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet - -RUN mkdir -p storage \ - storage/framework/sessions \ - storage/framework/views \ - storage/framework/cache - -RUN chmod -R 777 /lumen - -EXPOSE 8080 - -CMD service php8.4-fpm start && \ - nginx -c /lumen/deploy/nginx.conf diff --git a/frameworks/PHP/lumen/public/.htaccess b/frameworks/PHP/lumen/public/.htaccess deleted file mode 100644 index b75525bedcd..00000000000 --- a/frameworks/PHP/lumen/public/.htaccess +++ /dev/null @@ -1,21 +0,0 @@ - - - Options -MultiViews -Indexes - - - RewriteEngine On - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Handle Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/frameworks/PHP/lumen/public/index.php b/frameworks/PHP/lumen/public/index.php deleted file mode 100644 index 04aa08688e0..00000000000 --- a/frameworks/PHP/lumen/public/index.php +++ /dev/null @@ -1,28 +0,0 @@ -run(); diff --git a/frameworks/PHP/lumen/resources/views/.gitkeep b/frameworks/PHP/lumen/resources/views/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/PHP/lumen/resources/views/fortunes.blade.php b/frameworks/PHP/lumen/resources/views/fortunes.blade.php deleted file mode 100644 index e8791bd34a8..00000000000 --- a/frameworks/PHP/lumen/resources/views/fortunes.blade.php +++ /dev/null @@ -1,13 +0,0 @@ - - -Fortunes - - - - - @foreach($rows as $row) - - @endforeach -
      idmessage
      {{$row->id}}{{$row->message}}
      - - \ No newline at end of file diff --git a/frameworks/PHP/lumen/routes/web.php b/frameworks/PHP/lumen/routes/web.php deleted file mode 100644 index bb6a8d1714c..00000000000 --- a/frameworks/PHP/lumen/routes/web.php +++ /dev/null @@ -1,8 +0,0 @@ -get('/json', 'Controller@json'); -$router->get('/db', 'Controller@db'); -$router->get('/queries[/{queries}]', 'Controller@queries'); -$router->get('/fortunes', 'Controller@fortunes'); -$router->get('/updates[/{queries}]', 'Controller@updates'); -$router->get('/plaintext', 'Controller@plaintext'); diff --git a/frameworks/PHP/lumen/server-man.php b/frameworks/PHP/lumen/server-man.php deleted file mode 100644 index de20d2a3e95..00000000000 --- a/frameworks/PHP/lumen/server-man.php +++ /dev/null @@ -1,45 +0,0 @@ -count = (int) shell_exec('nproc') * 4; -$http_worker->name = 'AdapterMan-Laravel'; -$http_worker->onWorkerStart = static function () { - HeaderDate::init(); - //init(); - require __DIR__.'/start.php'; -}; - -$http_worker->onMessage = static function ($connection) { - - $connection->send(run()); -}; - -Worker::runAll(); - -class HeaderDate -{ - const NAME = 'Date: '; - - /** - * Date header - * - * @var string - */ - public static $date; - - public static function init(): void - { - self::$date = self::NAME . gmdate('D, d M Y H:i:s').' GMT'; - Timer::add(1, static function() { - self::$date = self::NAME . gmdate('D, d M Y H:i:s').' GMT'; - }); - } -} diff --git a/frameworks/PHP/lumen/start.php b/frameworks/PHP/lumen/start.php deleted file mode 100644 index cc7d3075d64..00000000000 --- a/frameworks/PHP/lumen/start.php +++ /dev/null @@ -1,39 +0,0 @@ -run(); - header(HeaderDate::$date); // To pass the bench, nginx auto add it - - return ob_get_clean(); -} From f14ec23424e88630def524ce60918d57ddc718db Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 3 Mar 2025 15:23:40 +0100 Subject: [PATCH 1145/1766] Laravel update to v12 (#9611) --- frameworks/PHP/laravel/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/laravel/composer.json b/frameworks/PHP/laravel/composer.json index f25952eccea..5f11cec0b6d 100644 --- a/frameworks/PHP/laravel/composer.json +++ b/frameworks/PHP/laravel/composer.json @@ -8,7 +8,7 @@ ], "license": "MIT", "require": { - "laravel/framework": "^11" + "laravel/framework": "^12" }, "config": { "optimize-autoloader": true, From 3bb602169420569495f0431a367b919fdd7eaa6d Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:23:49 -1000 Subject: [PATCH 1146/1766] Tio boot (#9610) * add tio-boot * add server.port=8080 * update docker filename --------- Co-authored-by: litongjava --- frameworks/Java/tio-boot/.dockerignore | 19 ++ frameworks/Java/tio-boot/.gitignore | 3 + frameworks/Java/tio-boot/README.md | 114 +++++++++ .../Java/tio-boot/api/tio-server-benchmark.md | 227 ++++++++++++++++++ .../Java/tio-boot/benchmark_config.json | 29 +++ frameworks/Java/tio-boot/config.toml | 19 ++ frameworks/Java/tio-boot/pom.xml | 126 ++++++++++ .../litongjava/tio/http/server/MainApp.java | 13 + .../tio/http/server/MainAppConfig.java | 54 +++++ .../server/config/EhCachePluginConfig.java | 12 + .../http/server/config/EnjoyEngineConfig.java | 22 ++ .../tio/http/server/config/MysqlDbConfig.java | 31 +++ .../http/server/controller/CacheHandler.java | 41 ++++ .../tio/http/server/controller/DbHandler.java | 126 ++++++++++ .../http/server/controller/IndexHandler.java | 40 +++ .../tio/http/server/model/Fortune.java | 23 ++ .../tio/http/server/model/Message.java | 12 + .../tio/http/server/model/World.java | 32 +++ .../tio/http/server/services/CacheName.java | 50 ++++ .../server/services/CacheNameService.java | 17 ++ .../tio/http/server/utils/RandomUtils.java | 36 +++ .../src/main/resources/app.properties | 9 + .../tio-boot/src/main/resources/ehcache.xml | 9 + .../tio-boot/src/main/resources/logback.xml | 52 ++++ .../main/resources/templates/fortunes.html | 20 ++ .../tio/http/server/MainAppTest.java | 15 ++ frameworks/Java/tio-boot/tio-boot.dockerfile | 20 ++ 27 files changed, 1171 insertions(+) create mode 100644 frameworks/Java/tio-boot/.dockerignore create mode 100644 frameworks/Java/tio-boot/.gitignore create mode 100644 frameworks/Java/tio-boot/README.md create mode 100644 frameworks/Java/tio-boot/api/tio-server-benchmark.md create mode 100644 frameworks/Java/tio-boot/benchmark_config.json create mode 100644 frameworks/Java/tio-boot/config.toml create mode 100644 frameworks/Java/tio-boot/pom.xml create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java create mode 100644 frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java create mode 100644 frameworks/Java/tio-boot/src/main/resources/app.properties create mode 100644 frameworks/Java/tio-boot/src/main/resources/ehcache.xml create mode 100644 frameworks/Java/tio-boot/src/main/resources/logback.xml create mode 100644 frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html create mode 100644 frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java create mode 100644 frameworks/Java/tio-boot/tio-boot.dockerfile diff --git a/frameworks/Java/tio-boot/.dockerignore b/frameworks/Java/tio-boot/.dockerignore new file mode 100644 index 00000000000..cba5dfe3c3b --- /dev/null +++ b/frameworks/Java/tio-boot/.dockerignore @@ -0,0 +1,19 @@ +.github +.git +.DS_Store +docs +kubernetes +node_modules +/.svelte-kit +/package +.env +.env.* +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +__pycache__ +.env +_old +uploads +.ipynb_checkpoints +**/*.db +_test \ No newline at end of file diff --git a/frameworks/Java/tio-boot/.gitignore b/frameworks/Java/tio-boot/.gitignore new file mode 100644 index 00000000000..2f089945614 --- /dev/null +++ b/frameworks/Java/tio-boot/.gitignore @@ -0,0 +1,3 @@ +/target/ +logs +.settings \ No newline at end of file diff --git a/frameworks/Java/tio-boot/README.md b/frameworks/Java/tio-boot/README.md new file mode 100644 index 00000000000..bb1539e7db1 --- /dev/null +++ b/frameworks/Java/tio-boot/README.md @@ -0,0 +1,114 @@ +# t-io Benchmarking Test + +This is the tio-server portion of a [benchmarking test suite](../) comparing a variety of web development platforms. + +## Controller + +These implementations use the tio-server's controller. + +### Plaintext Test + +* [Plaintext test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + +### JSON Serialization Test + +* [JSON test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + +### Database Query Test + +* [Database Query test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Database Queries Test + +* [Database Queries test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Database Update Test + +* [Database Update test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Template rendering Test + +* [Template rendering test source](src/main/java/com/litongjava/tio/http/server/controller/DbController.java)) + +### Cache Query Test +* [Cache query test source](src/main/java/com/litongjava/tio/http/server/controller/CacheController.java)) + + +## Versions +3.7.3.v20231218-RELEASE (https://gitee.com/litongjava/t-io) + +## Test URLs + +All implementations use the same URLs. + +### Plaintext Test + + http://localhost:8080/plaintext + +### JSON Encoding Test + + http://localhost:8080/json + +### Database Query Test + + http://localhost:8080/db + +### Database Queries Test + + http://localhost:8080/queries?queries=5 + +### Cache Query Test + + http://localhost:8080/cacheQuery?queries=10000 + +### Template rendering Test + + http://localhost:8080/fortunes + +### Database Update Test + + http://localhost:8080/updates?queries=5 + + ## Hot to run + ### install mysql 8 + - 1.please instal mysql 8.0.32,example cmd + ``` + docker run --restart=always -d --name mysql_8 --hostname mysql \ +-p 3306:3306 \ +-e 'MYSQL_ROOT_PASSWORD=robot_123456#' -e 'MYSQL_ROOT_HOST=%' -e 'MYSQL_DATABASE=hello_world' \ +mysql/mysql-server:8.0.32 \ +--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1 + ``` + - 2.create database schema hello_world + - 3.create tablle,[example](sql/hello_world.sql) + - 4.import data + + ### docker + ``` + docker build -t tio-server-benchmark -f tio-server.dockerfile . +``` +The run is to specify the mysql database +``` +docker run --rm -p 8080:8080 \ +-e JDBC_URL="jdbc:mysql://192.168.3.9/hello_world" \ +-e JDBC_USER="root" \ +-e JDBC_PSWD="robot_123456#" \ +tio-server-benchmark +``` + +### windows + +-windows +``` +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar --JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false --JDBC_USER=root --JDBC_PSWD=robot_123456# +``` +or +``` +set JDBC_URL=jdbc:mysql://192.168.3.9/hello_world +set jdbc.user=root +set JDBC_PSWD=robot_123456# +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar +``` + + + diff --git a/frameworks/Java/tio-boot/api/tio-server-benchmark.md b/frameworks/Java/tio-boot/api/tio-server-benchmark.md new file mode 100644 index 00000000000..1d302df2d5d --- /dev/null +++ b/frameworks/Java/tio-boot/api/tio-server-benchmark.md @@ -0,0 +1,227 @@ +--- +title: tio-server-benchmark v1.0.0 +language_tabs: + - shell: Shell + - http: HTTP + - javascript: JavaScript + - ruby: Ruby + - python: Python + - php: PHP + - java: Java + - go: Go +toc_footers: [] +includes: [] +search: true +code_clipboard: true +highlight_theme: darkula +headingLevel: 2 +generator: "@tarslib/widdershins v4.0.17" + +--- + +# tio-server-benchmark + +> v1.0.0 + +Base URLs: + +# Authentication + +# Default + +## GET plaintext + +GET /plaintext + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET json + +GET /json + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET db + +GET /db + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|id|query|string| 否 |none| + +> 返回示例 + +> 200 Response + +```json +{ + "id": 0, + "randomNumber": 0 +} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|true|none||none| +|» randomNumber|integer|true|none||none| + +## GET updates + +GET /updates + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|queries|query|string| 否 |none| + +> 返回示例 + +> 成功 + +```json +[ + { + "id": 28, + "randomNumber": 5399, + "randomnumber": 1498 + } +] +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|false|none||none| +|» randomNumber|integer|false|none||none| +|» randomnumber|integer|false|none||none| + +## GET fortunes + +GET /fortunes + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +## GET cacheQuery + +GET /cacheQuery + +### 请求参数 + +|名称|位置|类型|必选|说明| +|---|---|---|---|---| +|queries|query|string| 否 |none| + +> 返回示例 + +> 200 Response + +```json +[ + { + "id": 0, + "randomNumber": 0 + } +] +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» id|integer|false|none||none| +|» randomNumber|integer|false|none||none| + +## GET cacheList + +GET /cacheList + +> 返回示例 + +> 200 Response + +```json +{} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| + +### 返回数据结构 + +# 数据模型 + diff --git a/frameworks/Java/tio-boot/benchmark_config.json b/frameworks/Java/tio-boot/benchmark_config.json new file mode 100644 index 00000000000..c1121359569 --- /dev/null +++ b/frameworks/Java/tio-boot/benchmark_config.json @@ -0,0 +1,29 @@ +{ + "framework": "tio-boot", + "tests": [{ + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "cached_query_url" : "/cachedQuery?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "MySQL", + "framework": "tio-boot", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "t-io", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "tio-boot", + "notes": "tio-boot", + "versus": "t-io" + } + }] +} diff --git a/frameworks/Java/tio-boot/config.toml b/frameworks/Java/tio-boot/config.toml new file mode 100644 index 00000000000..93dddb241c9 --- /dev/null +++ b/frameworks/Java/tio-boot/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "t-io" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +urls.cached_query = "/cachedQuery?queries=" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "t-io" +webserver = "None" +versus = "t-io" diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml new file mode 100644 index 00000000000..668d7ea5c01 --- /dev/null +++ b/frameworks/Java/tio-boot/pom.xml @@ -0,0 +1,126 @@ + + 4.0.0 + com.litongjava + tio-boot-benchmark + 1.0 + ${project.artifactId} + + UTF-8 + 1.8 + ${java.version} + ${java.version} + 1.9.1 + + com.litongjava.tio.http.server.MainApp + + + + + com.litongjava + tio-boot + ${tio-boot.version} + + + com.litongjava + java-db + 1.4.9 + + + junit + junit + 4.12 + test + + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.52 + + + + net.sf.ehcache + ehcache-core + 2.6.11 + + + + mysql + mysql-connector-java + 5.1.46 + + + + com.zaxxer + HikariCP + 4.0.3 + + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + false + + + + + maven-assembly-plugin + 3.1.0 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java new file mode 100644 index 00000000000..5fb25eb411f --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainApp.java @@ -0,0 +1,13 @@ +package com.litongjava.tio.http.server; + +import com.litongjava.tio.boot.TioApplication; + +public class MainApp { + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + TioApplication.run(MainApp.class, new MainAppConfig(), args); + long end = System.currentTimeMillis(); + System.out.println((end - start) + "ms"); + } +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java new file mode 100644 index 00000000000..8f9472597c1 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java @@ -0,0 +1,54 @@ +package com.litongjava.tio.http.server; + +import com.litongjava.context.BootConfiguration; +import com.litongjava.tio.boot.server.TioBootServer; +import com.litongjava.tio.http.server.config.EhCachePluginConfig; +import com.litongjava.tio.http.server.config.EnjoyEngineConfig; +import com.litongjava.tio.http.server.config.MysqlDbConfig; +import com.litongjava.tio.http.server.controller.CacheHandler; +import com.litongjava.tio.http.server.controller.DbHandler; +import com.litongjava.tio.http.server.controller.IndexHandler; +import com.litongjava.tio.http.server.router.HttpRequestRouter; +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MainAppConfig implements BootConfiguration { + + @Override + public void config() throws Exception { + // add route + IndexHandler controller = new IndexHandler(); + + TioBootServer server = TioBootServer.me(); + HttpRequestRouter requestRouter = server.getRequestRouter(); + + requestRouter.add("/", controller::index); + requestRouter.add("/plaintext", controller::plaintext); + requestRouter.add("/json", controller::json); + + DbHandler dbQueryController = new DbHandler(); + requestRouter.add("/db", dbQueryController::db); + requestRouter.add("/queries", dbQueryController::queries); + requestRouter.add("/updates", dbQueryController::updates); + requestRouter.add("/fortunes", dbQueryController::fortunes); + + CacheHandler cacheController = new CacheHandler(); + requestRouter.add("/cachedQuery", cacheController::cachedQuery); + + boolean db = EnvUtils.getBoolean("db", true); + if (db) { + try { + new MysqlDbConfig().init(); + } catch (Exception e) { + e.printStackTrace(); + } + } + // start enjoy and ehcache + try { + new EnjoyEngineConfig().engine(); + new EhCachePluginConfig().ehCachePlugin(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java new file mode 100644 index 00000000000..f949432cd5b --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EhCachePluginConfig.java @@ -0,0 +1,12 @@ + package com.litongjava.tio.http.server.config; + +import com.litongjava.ehcache.EhCachePlugin; + +public class EhCachePluginConfig { + + public EhCachePlugin ehCachePlugin() { + EhCachePlugin ehCachePlugin = new EhCachePlugin(); + ehCachePlugin.start(); + return ehCachePlugin; + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java new file mode 100644 index 00000000000..b40c74c448d --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/EnjoyEngineConfig.java @@ -0,0 +1,22 @@ +package com.litongjava.tio.http.server.config; + +import com.jfinal.template.Engine; + +public class EnjoyEngineConfig { + + private final String RESOURCE_BASE_PATH = "/templates/"; + + public Engine engine() { + Engine engine = Engine.use(); + engine.setBaseTemplatePath(RESOURCE_BASE_PATH); + engine.setToClassPathSourceFactory(); + // 支持模板热加载,绝大多数生产环境下也建议配置成 true,除非是极端高性能的场景 + // engine.setDevMode(true); + // 配置极速模式,性能提升 13% + Engine.setFastMode(true); + // jfinal 4.9.02 新增配置:支持中文表达式、中文变量名、中文方法名、中文模板函数名 + Engine.setChineseExpression(true); + return engine; + } + +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java new file mode 100644 index 00000000000..8a547854783 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/config/MysqlDbConfig.java @@ -0,0 +1,31 @@ +package com.litongjava.tio.http.server.config; + +import com.litongjava.db.activerecord.ActiveRecordPlugin; +import com.litongjava.db.activerecord.OrderedFieldContainerFactory; +import com.litongjava.db.hikaricp.HikariCpPlugin; +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MysqlDbConfig { + + public void init() { + // start active recored + String jdbcUrl = EnvUtils.get("JDBC_URL"); + // String jdbcUrl = "jdbc:mysql://192.168.3.9/hello_world"; + + String jdbcUser = EnvUtils.get("JDBC_USER"); + // String jdbcUser = "root"; + + String jdbcPswd = EnvUtils.get("JDBC_PSWD"); + // String jdbcPswd = "robot_123456#"; + HikariCpPlugin hikariCpPlugin = new HikariCpPlugin(jdbcUrl, jdbcUser, jdbcPswd); + + ActiveRecordPlugin arp = new ActiveRecordPlugin(hikariCpPlugin); + arp.setContainerFactory(new OrderedFieldContainerFactory()); + + // arp.setShowSql(true); + + hikariCpPlugin.start(); + boolean start = arp.start(); + System.out.println("db started:" + start); + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java new file mode 100644 index 00000000000..d3546c09111 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java @@ -0,0 +1,41 @@ +package com.litongjava.tio.http.server.controller; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.fastjson2.JSON; +import com.litongjava.db.activerecord.Db; +import com.litongjava.db.activerecord.Row; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.utils.RandomUtils; + +public class CacheHandler { + // private Logger log = LoggerFactory.getLogger(this.getClass()); + + public HttpResponse cachedQuery(HttpRequest request) { + String queries = request.getParam("queries"); + List> recordMaps = RandomUtils.randomWorldNumbers() + // limit + .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 + .mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象 + .filter(Objects::nonNull) // 过滤掉 null 值 + .map(Row::toMap) // 将每个 Record 对象转换为 Map + .collect(Collectors.toList()); // 收集到 List + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(recordMaps)); + return httpResponse; + + } + + private Row findByIdWithCache(String tableName, int id) { + String sql = "SELECT id, randomNumber FROM world WHERE id = ?"; + return Db.findFirstByCache(tableName, id, sql, id); + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java new file mode 100644 index 00000000000..a7a127795ec --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java @@ -0,0 +1,126 @@ +package com.litongjava.tio.http.server.controller; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.fastjson2.JSON; +import com.jfinal.template.Engine; +import com.jfinal.template.Template; +import com.litongjava.db.activerecord.Db; +import com.litongjava.db.activerecord.Row; +import com.litongjava.ehcache.EhCacheKit; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.model.Fortune; +import com.litongjava.tio.http.server.util.Resps; +import com.litongjava.tio.http.server.utils.RandomUtils; + +public class DbHandler { + + public HttpResponse db(HttpRequest request) { + Integer id = request.getInt("id"); + if (id == null) { + id = RandomUtils.randomWorldNumber(); + } + + //System.out.println("id:" + id); + HttpResponse httpResponse = new HttpResponse(request); + + // int id = 11; + // String sql="SELECT id, randomNumber FROM world WHERE id = ?"; + + Row recored = Db.findById("world", id); + if (recored != null) { + httpResponse.setBody(JSON.toJSONBytes(recored.toMap())); + } else { + httpResponse.setBody("{}".getBytes()); + } + + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + + return httpResponse; + } + + // @GetMapping("/queries") + public HttpResponse queries(HttpRequest request) { + String queries = request.getParam("queries"); + List> recordMaps = RandomUtils.randomWorldNumbers() + // limit + .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 + .mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象 + .filter(Objects::nonNull) // 过滤掉 null 值 + .map(Row::toMap) // 将每个 Record 对象转换为 Map + .collect(Collectors.toList()); // 收集到 List + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(recordMaps)); + return httpResponse; + } + + //@GetMapping("/updates") + public HttpResponse updates(HttpRequest request) { + String queries = request.getParam("queries"); + + EhCacheKit.removeAll("world"); + + List> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers + // limit + .limit(RandomUtils.parseQueryCount(queries)) + // map + .mapToObj(id -> Db.findById("world", id)) + // not null + .filter(Objects::nonNull).map(record -> { + int currentRandomNumber = record.getInt("randomNumber"); // "randomnumber" + int newRandomNumber; + do { + newRandomNumber = RandomUtils.randomWorldNumber(); + } while (newRandomNumber == currentRandomNumber); + + record.set("randomnumber", newRandomNumber); + Db.update("world", "id", record); // update + return record; + }) + // tomap + .map(Row::toMap) + // to List + .collect(Collectors.toList()); + + HttpResponse httpResponse = new HttpResponse(request); + httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + httpResponse.setBody(JSON.toJSONBytes(updatedRecords)); + return httpResponse; + } + + public HttpResponse fortunes(HttpRequest request) throws IllegalAccessException, InstantiationException { + List records = Db.find("SELECT * FROM fortune"); + + List fortunes = new ArrayList<>(records.size()); + for (Row record : records) { + fortunes.add(record.toBean(Fortune.class)); + } + // 添加额外的 Fortune + fortunes.add(new Fortune(0L, "Additional fortune added at request time.")); + + // 按照消息排序 + fortunes.sort(Comparator.comparing(Fortune::getMessage)); + + Map viewData = new HashMap<>(); + viewData.put("fortunes", fortunes); + + // 转换为 HTML + Engine engine = Engine.use(); + String filename = "fortunes.html"; + Template template = engine.getTemplate(filename); + String html = template.renderToString(viewData); + + return Resps.html(request, html); + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java new file mode 100644 index 00000000000..2b2bc4c5535 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java @@ -0,0 +1,40 @@ +package com.litongjava.tio.http.server.controller; + +import com.alibaba.fastjson2.JSON; +import com.litongjava.tio.http.common.HeaderName; +import com.litongjava.tio.http.common.HeaderValue; +import com.litongjava.tio.http.common.HttpRequest; +import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.server.model.Message; +import com.litongjava.tio.http.server.util.Resps; + +/** + * ab -k -n1000000 -c10 http://127.0.0.1:8080/json + * ab -k -n1000000 -c10 http://127.0.0.1:8080/plaintext + */ +public class IndexHandler { + private static final String HELLO_WORLD = "Hello, World!"; + + private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD.getBytes(); + + public HttpResponse index(HttpRequest request) { + return Resps.txt(request, "tio-boot"); + } + + public HttpResponse plaintext(HttpRequest request) { + // 更高性能的写法 + HttpResponse ret = new HttpResponse(request); + ret.setBody(HELLO_WORLD_BYTES); + ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT); + return ret; + } + + // 在IndexController中添加 + public HttpResponse json(HttpRequest request) { + // 更高性能的写法 + HttpResponse ret = new HttpResponse(request); + ret.setBody(JSON.toJSONString(new Message(HELLO_WORLD)).getBytes()); + ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + return ret; + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java new file mode 100644 index 00000000000..728db88b837 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Fortune.java @@ -0,0 +1,23 @@ +package com.litongjava.tio.http.server.model; + +public final class Fortune { + + public Long id; + public String message; + + public Fortune() { + } + + public Fortune(Long id, String message) { + this.id = id; + this.message = message; + } + + public Long getId() { + return id; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java new file mode 100644 index 00000000000..2ad66214e0f --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/Message.java @@ -0,0 +1,12 @@ +package com.litongjava.tio.http.server.model; +public final class Message { + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java new file mode 100644 index 00000000000..06c4ed9a22b --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/model/World.java @@ -0,0 +1,32 @@ +package com.litongjava.tio.http.server.model; + +public final class World { + + public int id; + public int randomnumber; + + protected World() { + } + + public World(int id, int randomnumber) { + this.id = id; + this.randomnumber = randomnumber; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getRandomnumber() { + return randomnumber; + } + + public void setRandomnumber(int randomnumber) { + this.randomnumber = randomnumber; + } + +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java new file mode 100644 index 00000000000..5707d4f05d4 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheName.java @@ -0,0 +1,50 @@ +package com.litongjava.tio.http.server.services; + +public class CacheName { + // `cacheName`(缓存名称) + private String name; + // `timeToLiveSeconds`(生存时间)和`timeToIdleSeconds`(闲置时间)。 + private Long timeToLiveSeconds; + private Long timeToIdleSeconds; + + public CacheName() { + } + + public CacheName(String name, Long timeToLiveSeconds, Long timeToIdleSeconds) { + super(); + this.name = name; + this.timeToLiveSeconds = timeToLiveSeconds; + this.timeToIdleSeconds = timeToIdleSeconds; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getTimeToLiveSeconds() { + return timeToLiveSeconds; + } + + public void setTimeToLiveSeconds(Long timeToLiveSeconds) { + this.timeToLiveSeconds = timeToLiveSeconds; + } + + public Long getTimeToIdleSeconds() { + return timeToIdleSeconds; + } + + public void setTimeToIdleSeconds(Long timeToIdleSeconds) { + this.timeToIdleSeconds = timeToIdleSeconds; + } + + @Override + public String toString() { + return "CacheName [name=" + name + ", timeToLiveSeconds=" + timeToLiveSeconds + ", timeToIdleSeconds=" + + timeToIdleSeconds + "]"; + } + +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java new file mode 100644 index 00000000000..5ab5d7e58e6 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/services/CacheNameService.java @@ -0,0 +1,17 @@ +package com.litongjava.tio.http.server.services; + +import java.util.ArrayList; +import java.util.List; + +import com.litongjava.model.time.Time; + +public class CacheNameService { + private CacheName demo = new CacheName("world", null, Time.MINUTE_1 * 10); + + public List cacheNames() { + List list = new ArrayList<>(); + list.add(demo); + return list; + } + +} diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java new file mode 100644 index 00000000000..e18e98ef880 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/utils/RandomUtils.java @@ -0,0 +1,36 @@ +package com.litongjava.tio.http.server.utils; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +public class RandomUtils { + + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; +// private static final int MAX_WORLD_NUMBER_PLUS_ONE = 30; + + public static int randomWorldNumber() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); + } + + public static IntStream randomWorldNumbers() { + return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE) + // distinct() allows us to avoid using Hibernate's first-level cache in + // the JPA-based implementation. Using a cache like that would bypass + // querying the database, which would violate the test requirements. + .distinct(); + } + + public static int parseQueryCount(String textValue) { + if (textValue == null) { + return 1; + } + int parsedValue; + try { + parsedValue = Integer.parseInt(textValue); + } catch (NumberFormatException e) { + return 1; + } + return Math.min(500, Math.max(1, parsedValue)); + } +} diff --git a/frameworks/Java/tio-boot/src/main/resources/app.properties b/frameworks/Java/tio-boot/src/main/resources/app.properties new file mode 100644 index 00000000000..52083ea13ff --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/app.properties @@ -0,0 +1,9 @@ +http.response.header.showServer=true +server.port=8080 +#JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false&allowPublicKeyRetrieval=true +#JDBC_USER=root +#JDBC_PSWD=robot_123456# + +JDBC_URL=jdbc:mysql://tfb-database/hello_world +JDBC_USER=benchmarkdbuser +JDBC_PSWD=benchmarkdbpass \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/resources/ehcache.xml b/frameworks/Java/tio-boot/src/main/resources/ehcache.xml new file mode 100644 index 00000000000..79b79e49479 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/ehcache.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/frameworks/Java/tio-boot/src/main/resources/logback.xml b/frameworks/Java/tio-boot/src/main/resources/logback.xml new file mode 100644 index 00000000000..aff0c711191 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/logback.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + ${LOG_HOME}/project-name-%d{yyyy-MM-dd}.log + + 180 + + + + 10MB + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html b/frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html new file mode 100644 index 00000000000..1f6817df007 --- /dev/null +++ b/frameworks/Java/tio-boot/src/main/resources/templates/fortunes.html @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + #for(fortune : fortunes) + + + + + #end +
      idmessage
      #(fortune.id)#escape(fortune.message)
      + + diff --git a/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java b/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java new file mode 100644 index 00000000000..e469fa256ef --- /dev/null +++ b/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java @@ -0,0 +1,15 @@ +package com.litongjava.tio.http.server; + +import org.junit.Test; + +import com.litongjava.tio.utils.environment.EnvUtils; + +public class MainAppTest { + + @Test + public void test() { + boolean boolean1 = EnvUtils.getBoolean("native", false); + System.out.println(boolean1); + } + +} diff --git a/frameworks/Java/tio-boot/tio-boot.dockerfile b/frameworks/Java/tio-boot/tio-boot.dockerfile new file mode 100644 index 00000000000..3b779333565 --- /dev/null +++ b/frameworks/Java/tio-boot/tio-boot.dockerfile @@ -0,0 +1,20 @@ +FROM litongjava/maven:3.8.8-jdk8u391 AS builder +WORKDIR /app + +COPY pom.xml pom.xml +RUN mvn dependency:go-offline -q + +COPY src src +RUN mvn package -Passembly -q +RUN ls -l && ls -l target + +FROM litongjava/jre:8u391-stable-slim + +WORKDIR /app + +COPY --from=builder /app/target/tio-boot-benchmark-1.0-jar-with-dependencies.jar /app/tio-boot-benchmark-1.0.jar + +EXPOSE 8080 + +# java --server -XX:+UseNUMA XX:+UseParallelGC -cp target/tio-boot-benchmark-1.0-jar-with-dependencies.jar com.litongjava.tio.http.server.MainApp +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC","-cp", "/app/tio-boot-benchmark-1.0.jar","com.litongjava.tio.http.server.MainApp"] \ No newline at end of file From b066471418d319fec72f310d0798255eecacd981 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:23:56 +0100 Subject: [PATCH 1147/1766] [sisk] Fix warning (#9609) `benchmark_config.json` wasn't correct resulting in the following warning: Framework sisk does not define a default test in benchmark_config.json --- frameworks/CSharp/sisk/benchmark_config.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frameworks/CSharp/sisk/benchmark_config.json b/frameworks/CSharp/sisk/benchmark_config.json index 1e8fdc046b0..2cad348515b 100644 --- a/frameworks/CSharp/sisk/benchmark_config.json +++ b/frameworks/CSharp/sisk/benchmark_config.json @@ -17,9 +17,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "Sisk Framework" - } - }, - { + }, "cadente": { "plaintext_url": "/plaintext", "json_url": "/json", @@ -38,4 +36,4 @@ } } ] -} \ No newline at end of file +} From 29ac63eb20d5842baa8e42302e50f31ce9f22377 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Mon, 3 Mar 2025 21:24:05 +0700 Subject: [PATCH 1148/1766] Upgrade ktor deps (#9603) * upgrade ktor depds * Update build.gradle.kts * Update pom.xml * Update pom.xml --------- Co-authored-by: Ilya Nemtsev --- frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts | 6 +++--- frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml | 6 +++--- frameworks/Kotlin/ktor/ktor/pom.xml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts index 5d6db161d20..63db97d7dd2 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts @@ -9,9 +9,9 @@ repositories { mavenCentral() } -val ktorVersion = "3.0.3" -val kotlinxSerializationVersion = "1.7.3" -val exposedVersion = "0.56.0" +val ktorVersion = "3.1.1" +val kotlinxSerializationVersion = "1.8.0" +val exposedVersion = "0.59.0" dependencies { implementation("io.ktor:ktor-server-core:$ktorVersion") diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml index 092e8ab9559..fc814702884 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml @@ -14,9 +14,9 @@ 2.0.21 1.10.1 - 3.0.3 - 1.7.3 - 0.11.0 + 3.1.1 + 1.8.0 + 0.12.0 UTF-8 1.5.12 3.7.1 diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 670b77cdf51..991f453b16a 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -13,9 +13,9 @@ 2.0.21 - 3.0.3 - 1.7.3 - 0.11.0 + 3.1.1 + 1.8.0 + 0.12.0 UTF-8 5.1.0 1.2.13 From 37ec654ff78819cc5a814ebd59460fceb41bff1d Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:24:12 +0100 Subject: [PATCH 1149/1766] [ruby/padrino] Upgrade to Ruby 3.4 (#9600) Also use ActiveRecord instead of DataMapper, as that is no longer maintained. +-------------------+-----+-----+-----+------+-------+---------+--------------+ | branch_name| json| db|query|update|fortune|plaintext|weighted_score| +-------------------+-----+-----+-----+------+-------+---------+--------------+ | master|16348| 4309| 6315| 3785| 4251| 12539| 439| |padrino/ruby-3.4-ar|35491|12931|12760| 7322| 10133| 17696| 880| +-------------------+-----+-----+-----+------+-------+---------+--------------+ --- frameworks/Ruby/padrino/Gemfile | 22 +++--- frameworks/Ruby/padrino/app/app.rb | 23 +++--- frameworks/Ruby/padrino/app/controllers.rb | 71 ++++++++++--------- frameworks/Ruby/padrino/app/helpers.rb | 15 +++- frameworks/Ruby/padrino/benchmark_config.json | 6 +- frameworks/Ruby/padrino/config/apps.rb | 4 +- frameworks/Ruby/padrino/config/boot.rb | 1 - frameworks/Ruby/padrino/config/database.rb | 45 ++++++++---- frameworks/Ruby/padrino/models/fortune.rb | 10 +-- frameworks/Ruby/padrino/models/world.rb | 19 +++-- .../Ruby/padrino/padrino-unicorn.dockerfile | 5 +- frameworks/Ruby/padrino/padrino.dockerfile | 7 +- 12 files changed, 136 insertions(+), 92 deletions(-) diff --git a/frameworks/Ruby/padrino/Gemfile b/frameworks/Ruby/padrino/Gemfile index 792046310c6..217e0b3649a 100644 --- a/frameworks/Ruby/padrino/Gemfile +++ b/frameworks/Ruby/padrino/Gemfile @@ -1,11 +1,17 @@ source 'https://rubygems.org' -gem 'mysql2', '~> 0.4' -gem "unicorn", '~> 6.1' -gem 'puma', '~> 6.4' -gem 'json', '~> 2.0' +gem 'mysql2', '> 0.5' +gem 'json' +gem 'activerecord', '>= 7.1', :require => 'active_record' + gem 'slim', '2.0.3' -gem 'dm-mysql-adapter', '1.2.0' -gem 'dm-core', '1.2.1' -gem 'padrino', '0.15.3' -gem 'rack', '~> 2.2' +gem 'padrino', git: 'https://github.com/padrino/padrino-framework.git' +gem 'rack' + +group :puma, optional: true do + gem 'puma', '~> 6.4', require: false +end + +group :unicorn, optional: true do + gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false +end diff --git a/frameworks/Ruby/padrino/app/app.rb b/frameworks/Ruby/padrino/app/app.rb index 1b991b42dca..8641baa8c39 100644 --- a/frameworks/Ruby/padrino/app/app.rb +++ b/frameworks/Ruby/padrino/app/app.rb @@ -14,11 +14,16 @@ class App < Padrino::Application # # You can customize caching store engines: # - # set :cache, Padrino::Cache::Store::Memcache.new(::Memcached.new('127.0.0.1:11211', :exception_retry_limit => 1)) - # set :cache, Padrino::Cache::Store::Memcache.new(::Dalli::Client.new('127.0.0.1:11211', :exception_retry_limit => 1)) - # set :cache, Padrino::Cache::Store::Redis.new(::Redis.new(:host => '127.0.0.1', :port => 6379, :db => 0)) - # set :cache, Padrino::Cache::Store::Memory.new(50) - # set :cache, Padrino::Cache::Store::File.new(Padrino.root('tmp', app_name.to_s, 'cache')) # default choice + # set :cache, Padrino::Cache.new(:LRUHash) # Keeps cached values in memory + # set :cache, Padrino::Cache.new(:Memcached) # Uses default server at localhost + # set :cache, Padrino::Cache.new(:Memcached, :server => '127.0.0.1:11211', :exception_retry_limit => 1) + # set :cache, Padrino::Cache.new(:Memcached, :backend => memcached_or_dalli_instance) + # set :cache, Padrino::Cache.new(:Redis) # Uses default server at localhost + # set :cache, Padrino::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0) + # set :cache, Padrino::Cache.new(:Redis, :backend => redis_instance) + # set :cache, Padrino::Cache.new(:Mongo) # Uses default server at localhost + # set :cache, Padrino::Cache.new(:Mongo, :backend => mongo_client_instance) + # set :cache, Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache')) # default choice # ## @@ -32,8 +37,8 @@ class App < Padrino::Application # set :reload, false # Reload application files (default in development) # set :default_builder, 'foo' # Set a custom form builder (default 'StandardFormBuilder') # set :locale_path, 'bar' # Set path for I18n translations (default your_apps_root_path/locale) - # disable :sessions # Disabled sessions by default (enable if needed) - # disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined) + disable :sessions # Disabled sessions by default (enable if needed) + disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined) # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application) # @@ -53,8 +58,8 @@ class App < Padrino::Application # render 'errors/404' # end # - # error 505 do - # render 'errors/505' + # error 500 do + # render 'errors/500' # end # end diff --git a/frameworks/Ruby/padrino/app/controllers.rb b/frameworks/Ruby/padrino/app/controllers.rb index 0d899ce97a9..c2a3291d797 100644 --- a/frameworks/Ruby/padrino/app/controllers.rb +++ b/frameworks/Ruby/padrino/app/controllers.rb @@ -1,62 +1,65 @@ -MAX_PK = 10_000 -QUERIES_MIN = 1 -QUERIES_MAX = 500 +QUERY_RANGE = (1..10_000).freeze +ALL_IDS = QUERY_RANGE.to_a HelloWorld::App.controllers do + + after do + response['Server'] = 'padrino' + end + + after do + response['Date'] = Time.now.httpdate + end if defined?(Puma) + get '/json', :provides => [:json] do - response.headers['Server'] = 'padrino' - response.headers['Date'] = Time.now.httpdate {message: "Hello, World!"}.to_json end get '/db', :provides => [:json] do - response.headers['Server'] = 'padrino' - response.headers['Date'] = Time.now.httpdate - id = Random.rand(MAX_PK) + 1 - World.get(id).attributes.to_json + world = ActiveRecord::Base.with_connection do + World.find(rand1).attributes + end + world.to_json end get '/queries', :provides => [:json] do - response.headers['Server'] = 'padrino' - response.headers['Date'] = Time.now.httpdate - queries = params['queries'].to_i.clamp(QUERIES_MIN, QUERIES_MAX) - - results = (1..queries).map do - World.get(Random.rand(MAX_PK) + 1).attributes - end.to_json + worlds = ActiveRecord::Base.with_connection do + ALL_IDS.sample(bounded_queries).map do |id| + World.find(id).attributes + end + end + worlds.to_json end get '/fortunes' do - response.headers['Server'] = 'padrino' - response.headers['Date'] = Time.now.httpdate - @fortunes = Fortune.all - @fortunes << Fortune.new(:id => 0, :message => "Additional fortune added at request time.") - @fortunes = @fortunes.sort_by { |x| x.message } + @fortunes = Fortune.all.to_a + @fortunes << Fortune.new( + id: 0, + message: "Additional fortune added at request time." + ) + @fortunes = @fortunes.sort_by(&:message) render 'fortunes', layout: "layout" end get '/updates', :provides => [:json] do - response.headers['Server'] = 'padrino' - response.headers['Date'] = Time.now.httpdate - queries = params['queries'].to_i.clamp(QUERIES_MIN, QUERIES_MAX) - - worlds = (1..queries).map do - # get a random row from the database, which we know has 10000 - # rows with ids 1 - 10000 - world = World.get(Random.rand(MAX_PK) + 1) - world.update(randomNumber: Random.rand(MAX_PK) + 1) - world.attributes + worlds = [] + ActiveRecord::Base.with_connection do + worlds = ALL_IDS.sample(bounded_queries).map do |id| + world = World.find(id) + new_value = rand1 + new_value = rand1 while new_value == world.randomNumber + world.randomNumber = new_value + world + end + World.upsert_all(worlds) end worlds.to_json end get '/plaintext' do - response.headers['Server'] = 'padrino' - response.headers['Date'] = Time.now.httpdate content_type 'text/plain' "Hello, World!" end - end diff --git a/frameworks/Ruby/padrino/app/helpers.rb b/frameworks/Ruby/padrino/app/helpers.rb index 16774801dff..523fb246f77 100644 --- a/frameworks/Ruby/padrino/app/helpers.rb +++ b/frameworks/Ruby/padrino/app/helpers.rb @@ -1,7 +1,16 @@ # Helper methods defined here can be accessed in any controller or view in the application +MAX_PK = 10_000 +QUERIES_MIN = 1 +QUERIES_MAX = 500 + HelloWorld::App.helpers do - # def simple_helper_method - # ... - # end + def rand1 + rand(MAX_PK) + 1 + end + + def bounded_queries + queries = params[:queries].to_i + queries.clamp(QUERIES_MIN, QUERIES_MAX) + end end diff --git a/frameworks/Ruby/padrino/benchmark_config.json b/frameworks/Ruby/padrino/benchmark_config.json index db352531224..2fa32a70b47 100644 --- a/frameworks/Ruby/padrino/benchmark_config.json +++ b/frameworks/Ruby/padrino/benchmark_config.json @@ -25,10 +25,10 @@ }, "unicorn": { "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", + "db_url": "/db", + "query_url": "/queries?queries=", "fortune_url": "/fortunes", - "update_url": "/updates?queries=", + "update_url": "/updates?queries=", "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Ruby/padrino/config/apps.rb b/frameworks/Ruby/padrino/config/apps.rb index 4b36a36b656..2956874c751 100644 --- a/frameworks/Ruby/padrino/config/apps.rb +++ b/frameworks/Ruby/padrino/config/apps.rb @@ -28,8 +28,8 @@ Padrino.configure_apps do # enable :sessions set :session_secret, 'b941cbcb2d647360c0d1fb3c54a7039ed4f71cc0b7785d2aac689cc37d7757b7' - set :protection, true - set :protect_from_csrf, true + set :protection, false + set :protect_from_csrf, false end # Mounts the core application for this project diff --git a/frameworks/Ruby/padrino/config/boot.rb b/frameworks/Ruby/padrino/config/boot.rb index 0706fc35e87..6e01f2ed030 100644 --- a/frameworks/Ruby/padrino/config/boot.rb +++ b/frameworks/Ruby/padrino/config/boot.rb @@ -39,7 +39,6 @@ # Add your after (RE)load hooks here # Padrino.after_load do - DataMapper.finalize end Padrino.load! diff --git a/frameworks/Ruby/padrino/config/database.rb b/frameworks/Ruby/padrino/config/database.rb index b87a47f1d19..494a834d052 100644 --- a/frameworks/Ruby/padrino/config/database.rb +++ b/frameworks/Ruby/padrino/config/database.rb @@ -1,17 +1,32 @@ -## -# A MySQL connection: -# DataMapper.setup(:default, 'mysql://user:password@localhost/the_database_name') -# -# # A Postgres connection: -# DataMapper.setup(:default, 'postgres://user:password@localhost/the_database_name') -# -# # A Sqlite3 connection -# DataMapper.setup(:default, "sqlite3://" + Padrino.root('db', "development.db")) -# +Bundler.require('mysql') +opts = { + adapter: 'mysql2', + username: 'benchmarkdbuser', + password: 'benchmarkdbpass', + host: 'tfb-database', + database: 'hello_world' +} -DataMapper.logger = logger -DataMapper::Property::String.length(255) - -case Padrino.env - when :production then DataMapper.setup(:default, "mysql://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world") +# Determine threading/thread pool size and timeout +if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 + opts[:pool] = (2 * Math.log(threads)).floor + opts[:checkout_timeout] = 10 +else + # TODO: ActiveRecord doesn't have a single-threaded mode? + opts[:pool] = 1 + opts[:checkout_timeout] = 0 end + + +# Setup our logger +ActiveRecord::Base.logger = logger + +# Use ISO 8601 format for JSON serialized times and dates. +ActiveSupport.use_standard_json_time_format = true + +# Don't escape HTML entities in JSON, leave that for the #json_escape helper +# if you're including raw JSON in an HTML page. +ActiveSupport.escape_html_entities_in_json = false + +# Now we can establish connection with our db. +ActiveRecord::Base.establish_connection(opts) diff --git a/frameworks/Ruby/padrino/models/fortune.rb b/frameworks/Ruby/padrino/models/fortune.rb index 98e91d0f9c5..61151fa4848 100644 --- a/frameworks/Ruby/padrino/models/fortune.rb +++ b/frameworks/Ruby/padrino/models/fortune.rb @@ -1,9 +1,3 @@ -class Fortune - include DataMapper::Resource - - storage_names[:default] = 'Fortune' - - # property , - property :id, Serial - property :message, String +class Fortune < ActiveRecord::Base + self.table_name = name end diff --git a/frameworks/Ruby/padrino/models/world.rb b/frameworks/Ruby/padrino/models/world.rb index 9d093ade56d..9e7b8d16fb7 100644 --- a/frameworks/Ruby/padrino/models/world.rb +++ b/frameworks/Ruby/padrino/models/world.rb @@ -1,9 +1,16 @@ -class World - include DataMapper::Resource +class World < ActiveRecord::Base + self.table_name = name - storage_names[:default] = 'World' + alias_attribute(:randomNumber, :randomnumber) \ + if connection.adapter_name.downcase.start_with?('postgres') - # property , - property :id, Serial - property :randomNumber, Integer, field: 'randomNumber' + if connection.adapter_name.downcase.start_with?('mysql') + def self.upsert_all(attributes, on_duplicate: :update, update_only: nil, returning: nil, unique_by: nil, record_timestamps: nil) + # On MySQL Batch updates verification isn't supported yet by TechEmpower. + # https://github.com/TechEmpower/FrameworkBenchmarks/issues/5983 + attributes.each do |attrs| + where(id: attrs[:id]).update_all(randomNumber: attrs[:randomNumber]) + end + end + end end diff --git a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile b/frameworks/Ruby/padrino/padrino-unicorn.dockerfile index 77e083211e9..95a44be3678 100644 --- a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile +++ b/frameworks/Ruby/padrino/padrino-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.0 +FROM ruby:3.4 WORKDIR /padrino COPY app app @@ -9,11 +9,14 @@ COPY config.ru config.ru COPY Gemfile Gemfile COPY Rakefile Rakefile +RUN bundle config set with 'unicorn' RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile RUN apt-get update -yqq && apt-get install -yqq nginx EXPOSE 8080 +ENV RUBY_YJIT_ENABLE=1 + CMD nginx -c /padrino/config/nginx.conf && \ bundle exec unicorn -E production -c config/unicorn.rb diff --git a/frameworks/Ruby/padrino/padrino.dockerfile b/frameworks/Ruby/padrino/padrino.dockerfile index 78fd7774dea..b35254eb3e7 100644 --- a/frameworks/Ruby/padrino/padrino.dockerfile +++ b/frameworks/Ruby/padrino/padrino.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.0 +FROM ruby:3.4 WORKDIR /padrino COPY app app @@ -9,8 +9,11 @@ COPY config.ru config.ru COPY Gemfile Gemfile COPY Rakefile Rakefile +RUN bundle config set with 'puma' RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile EXPOSE 8080 -CMD ["bundle", "exec", "puma", "-C", "config/puma.rb", "-w", "8", "--preload"] +ENV RUBY_YJIT_ENABLE=1 + +CMD bundle exec puma -C config/puma.rb -w 8 --preload From e331817682fad30cc56d86baa088d5e3534e247f Mon Sep 17 00:00:00 2001 From: cclilshy Date: Mon, 3 Mar 2025 22:24:19 +0800 Subject: [PATCH 1150/1766] [PHP/ripple] Replace deprecated functions in ripple (#9599) --- frameworks/PHP/ripple/server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/ripple/server.php b/frameworks/PHP/ripple/server.php index 8a615fb91c5..45d6c44fe50 100644 --- a/frameworks/PHP/ripple/server.php +++ b/frameworks/PHP/ripple/server.php @@ -195,6 +195,6 @@ public function onRequest(Server\Request $request): void } }; -$manager->addWorker($worker); +$manager->add($worker); $manager->run(); wait(); From a1957e0a7ba4802f3b289287cafe5a8b697bd9a5 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 3 Mar 2025 15:24:27 +0100 Subject: [PATCH 1151/1766] [php] Update Flight and add Workerman variant (#9598) --- frameworks/PHP/flight/benchmark_config.json | 25 ++++++++++- frameworks/PHP/flight/composer.json | 2 +- frameworks/PHP/flight/deploy/conf/cli-php.ini | 16 +++++++ .../PHP/flight/flight-workerman.dockerfile | 32 ++++++++++++++ frameworks/PHP/flight/index.php | 12 ++++- frameworks/PHP/flight/server.php | 44 +++++++++++++++++++ 6 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 frameworks/PHP/flight/deploy/conf/cli-php.ini create mode 100644 frameworks/PHP/flight/flight-workerman.dockerfile create mode 100644 frameworks/PHP/flight/server.php diff --git a/frameworks/PHP/flight/benchmark_config.json b/frameworks/PHP/flight/benchmark_config.json index fb9ad136d4a..5a2cb9f89fb 100644 --- a/frameworks/PHP/flight/benchmark_config.json +++ b/frameworks/PHP/flight/benchmark_config.json @@ -23,6 +23,29 @@ "display_name": "flight", "notes": "", "versus": "php" - } + }, + "workerman": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/db-multiple?queries=", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "MySQL", + "framework": "Flight", + "language": "PHP", + "flavor": "PHP8", + "orm": "Raw", + "platform": "workerman", + "webserver": "none", + "os": "Linux", + "database_os": "Linux", + "display_name": "flight [workerman]", + "notes": "", + "versus": "php" + } }] } diff --git a/frameworks/PHP/flight/composer.json b/frameworks/PHP/flight/composer.json index 0f94353da88..507b168e5a2 100644 --- a/frameworks/PHP/flight/composer.json +++ b/frameworks/PHP/flight/composer.json @@ -1,5 +1,5 @@ { "require": { - "mikecao/flight": "^3.0" + "flightphp/core": "^3.14" } } diff --git a/frameworks/PHP/flight/deploy/conf/cli-php.ini b/frameworks/PHP/flight/deploy/conf/cli-php.ini new file mode 100644 index 00000000000..9f0f3171834 --- /dev/null +++ b/frameworks/PHP/flight/deploy/conf/cli-php.ini @@ -0,0 +1,16 @@ +opcache.enable=1 +opcache.enable_cli=1 +opcache.validate_timestamps=0 +opcache.save_comments=0 +opcache.enable_file_override=1 +opcache.memory_consumption=256 +opcache.interned_strings_buffer=16 +opcache.huge_code_pages=1 + +mysqlnd.collect_statistics = Off +memory_limit = 512M + +opcache.jit_buffer_size=128M +opcache.jit=tracing + +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/flight/flight-workerman.dockerfile b/frameworks/PHP/flight/flight-workerman.dockerfile new file mode 100644 index 00000000000..ebaa2098243 --- /dev/null +++ b/frameworks/PHP/flight/flight-workerman.dockerfile @@ -0,0 +1,32 @@ +FROM ubuntu:24.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.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql > /dev/null + +COPY deploy/conf/* /etc/php/8.4/fpm/ + +WORKDIR /flight +COPY . . + +ENV FLIGHT_DIR="/flight/src" + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +RUN apt-get install -y php-pear php8.4-dev libevent-dev php8.4-xml > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini + +RUN composer require joanhey/adapterman:^0.7 +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet + +RUN sed -i "s|Flight::start() ;|//Flight::start() ;|g" index.php + +RUN chmod -R 777 /flight + +EXPOSE 8080 + +CMD php -c deploy/conf/cli-php.ini \ + server.php start diff --git a/frameworks/PHP/flight/index.php b/frameworks/PHP/flight/index.php index 8d954fa369e..c2cc5dee02d 100644 --- a/frameworks/PHP/flight/index.php +++ b/frameworks/PHP/flight/index.php @@ -3,6 +3,7 @@ error_reporting(-1); +Flight::set('flight.content_length', false); Flight::register('db', PDO::class, [ 'mysql:host=tfb-database;port=3306;dbname=hello_world', 'benchmarkdbuser', 'benchmarkdbpass', [ \PDO::ATTR_PERSISTENT => TRUE ] ]); // JSON test @@ -102,4 +103,13 @@ Flight::render('fortunes.php', [ 'fortunes' => $fortunes ]); }); -Flight::start(); +Flight::start() ; + +// Workerman +function run() +{ + ob_start(); + Flight::start(); + header(HeaderDate::$date); // To pass the bench, nginx auto add it + return ob_get_clean(); +} diff --git a/frameworks/PHP/flight/server.php b/frameworks/PHP/flight/server.php new file mode 100644 index 00000000000..e7bad5ffcf9 --- /dev/null +++ b/frameworks/PHP/flight/server.php @@ -0,0 +1,44 @@ +count = (int) shell_exec('nproc') * 4; +$http_worker->name = 'AdapterMan-Flight'; + +$http_worker->onWorkerStart = static function () { + HeaderDate::init(); + require __DIR__.'/index.php'; +}; + +$http_worker->onMessage = static function ($connection) { + + $connection->send(run()); +}; + +Worker::runAll(); + +class HeaderDate +{ + const NAME = 'Date: '; + + /** + * Date header + * + * @var string + */ + public static $date; + + public static function init(): void + { + self::$date = self::NAME.gmdate('D, d M Y H:i:s').' GMT'; + Timer::add(1, static function () { + self::$date = self::NAME.gmdate('D, d M Y H:i:s').' GMT'; + }); + } +} From 20d6f6dfe0650253e5c00befb9fd3e12db711ad5 Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Mon, 3 Mar 2025 22:24:36 +0800 Subject: [PATCH 1152/1766] update swoole version (#9596) --- frameworks/PHP/swoole/swoole-async-mysql.dockerfile | 7 +++---- frameworks/PHP/swoole/swoole-async-postgres.dockerfile | 7 +++---- frameworks/PHP/swoole/swoole-sync-mysql.dockerfile | 7 +++---- frameworks/PHP/swoole/swoole-sync-postgres.dockerfile | 7 +++---- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index 494b15844d3..14c0e7ce62a 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -1,6 +1,5 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 1 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql @@ -11,9 +10,9 @@ 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 libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-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} \ + && apt install git libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-dev -y > /dev/null \ + && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ + && cd /tmp/swoole-src/ && git checkout feat_llhttp \ && phpize > /dev/null \ && ./configure > /dev/null \ && make -j "$(nproc)" > /dev/null \ diff --git a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile index 7050668fe56..a37608ef746 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -1,6 +1,5 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 1 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER pgsql @@ -11,9 +10,9 @@ 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 libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-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} \ + && apt install git libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-dev libpq-dev -y > /dev/null \ + && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ + && cd /tmp/swoole-src/ && git checkout feat_llhttp \ && phpize > /dev/null \ && ./configure --enable-swoole-pgsql > /dev/null \ && make -j "$(nproc)" > /dev/null \ diff --git a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile index a97871cea8c..c845b22b5e6 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -1,6 +1,5 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 0 ENV CPU_MULTIPLES 1 ENV DATABASE_DRIVER mysql @@ -11,9 +10,9 @@ 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 libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-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} \ + && apt install git libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-dev -y > /dev/null \ + && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ + && cd /tmp/swoole-src/ && git checkout feat_llhttp \ && phpize > /dev/null \ && ./configure > /dev/null \ && make -j "$(nproc)" > /dev/null \ diff --git a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile index e45b90683df..eab86dbe337 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -1,6 +1,5 @@ FROM ubuntu:24.04 -ENV SWOOLE_VERSION 6.0.0 ENV ENABLE_COROUTINE 0 ENV CPU_MULTIPLES 4 ENV DATABASE_DRIVER pgsql @@ -11,9 +10,9 @@ 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 libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-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} \ + && apt install git libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-dev libpq-dev -y > /dev/null \ + && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ + && cd /tmp/swoole-src/ && git checkout feat_llhttp \ && phpize > /dev/null \ && ./configure > /dev/null \ && make -j "$(nproc)" > /dev/null \ From 7675a5ab960d23892405f150d828922324fbbdc6 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Mon, 3 Mar 2025 09:24:43 -0500 Subject: [PATCH 1153/1766] Follow-up PR after upgrading to Helidon 4.1.5 (#9586) * New type of connection pool using arrays. Signed-off-by: Santiago Pericas-Geertsen * Removes print statement. Signed-off-by: Santiago Pericas-Geertsen * Adds support for size-factor in config. Signed-off-by: Santiago Pericas-Geertsen * Sets size-factor to 1.0. Signed-off-by: Santiago Pericas-Geertsen * Removes old connection pool implementation that is no longer in use. Some other minor cleanup. --------- Signed-off-by: Santiago Pericas-Geertsen --- .../nima/models/PgClientConnection.java | 78 +++++++++++ .../nima/models/PgClientConnectionPool.java | 127 ++---------------- .../models/PgClientConnectionPoolArray.java | 60 +++++++++ .../nima/models/PgClientRepository.java | 7 +- .../nima/src/main/resources/application.yaml | 2 + 5 files changed, 153 insertions(+), 121 deletions(-) create mode 100644 frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java create mode 100644 frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java new file mode 100644 index 00000000000..9526fdce533 --- /dev/null +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java @@ -0,0 +1,78 @@ + +package io.helidon.benchmark.nima.models; + +import io.vertx.pgclient.PgConnection; +import io.vertx.sqlclient.PreparedQuery; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowSet; + +public class PgClientConnection implements AutoCloseable { + static final int UPDATE_QUERIES = 500; + private static String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; + private static String SELECT_FORTUNE = "SELECT * from FORTUNE"; + + private PreparedQuery> worldQuery; + private PreparedQuery> fortuneQuery; + private PreparedQuery>[] updateQuery; + + private final PgConnection conn; + + PgClientConnection(PgConnection conn) { + this.conn = conn; + } + + public PgConnection pgConnection() { + return conn; + } + + @Override + public void close() { + conn.close(); + } + + public PreparedQuery> worldQuery() { + return worldQuery; + } + + public PreparedQuery> fortuneQuery() { + return fortuneQuery; + } + + public PreparedQuery> updateQuery(int queryCount) { + return updateQuery[queryCount - 1]; + } + + @SuppressWarnings("unchecked") + void prepare() { + try { + worldQuery = conn.prepare(SELECT_WORLD) + .toCompletionStage().toCompletableFuture().get().query(); + fortuneQuery = conn.prepare(SELECT_FORTUNE) + .toCompletionStage().toCompletableFuture().get().query(); + updateQuery = (PreparedQuery>[]) new PreparedQuery[UPDATE_QUERIES]; + for (int i = 0; i < UPDATE_QUERIES; i++) { + updateQuery[i] = conn.prepare(singleUpdate(i + 1)) + .toCompletionStage().toCompletableFuture().get().query(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static String singleUpdate(int count) { + StringBuilder sql = new StringBuilder(); + sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); + for (int i = 0; i < count; i++) { + int k = i * 2 + 1; + sql.append(" WHEN $").append(k).append(" THEN $").append(k + 1); + } + sql.append(" ELSE RANDOMNUMBER"); + sql.append(" END WHERE ID IN ($1"); + for (int i = 1; i < count; i++) { + int k = i * 2 + 1; + sql.append(",$").append(k); + } + sql.append(")"); + return sql.toString(); + } +} diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java index 478847702cb..c8c267e8246 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPool.java @@ -1,59 +1,30 @@ package io.helidon.benchmark.nima.models; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.locks.ReentrantLock; - +import io.helidon.config.Config; import io.vertx.core.Vertx; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgConnection; -import io.vertx.sqlclient.PreparedQuery; -import io.vertx.sqlclient.Row; -import io.vertx.sqlclient.RowSet; -class PgClientConnectionPool implements AutoCloseable { +abstract class PgClientConnectionPool implements AutoCloseable { + private final Config config; private final Vertx vertx; private final PgConnectOptions options; - private final ReentrantLock lock = new ReentrantLock(); - private final Map connectionMap = new HashMap<>(); - public PgClientConnectionPool(Vertx vertx, PgConnectOptions options) { + static PgClientConnectionPool create(Vertx vertx, PgConnectOptions options, Config config) { + return new PgClientConnectionPoolArray(vertx, options, config); + } + + PgClientConnectionPool(Vertx vertx, PgConnectOptions options, Config config) { this.vertx = vertx; this.options = options; + this.config = config; } - public PgClientConnection clientConnection() { - String carrierThread = carrierThread(); - PgClientConnection connection = connectionMap.get(carrierThread); - if (connection == null) { - try { - lock.lock(); - connection = connectionMap.get(carrierThread); - if (connection == null) { - connection = newConnection(); - connectionMap.put(carrierThread, connection); - } - } finally { - lock.unlock(); - } - } - return connection; - } + abstract PgClientConnection clientConnection(); - @Override - public void close() { - try { - for (PgClientConnection connection : connectionMap.values()) { - connection.close(); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private PgClientConnection newConnection() { + protected PgClientConnection newConnection() { try { PgConnection conn = PgConnection.connect(vertx, options) .toCompletionStage().toCompletableFuture().get(); @@ -64,80 +35,4 @@ private PgClientConnection newConnection() { throw new RuntimeException(e); } } - - static String carrierThread() { - String threadName = Thread.currentThread().toString(); - return threadName.substring(threadName.indexOf('@') + 1); - } - - public static class PgClientConnection implements AutoCloseable { - static final int UPDATE_QUERIES = 500; - private static String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; - private static String SELECT_FORTUNE = "SELECT * from FORTUNE"; - - private PreparedQuery> worldQuery; - private PreparedQuery> fortuneQuery; - private PreparedQuery>[] updateQuery; - - private final PgConnection conn; - - PgClientConnection(PgConnection conn) { - this.conn = conn; - } - - public PgConnection pgConnection() { - return conn; - } - - @Override - public void close() { - conn.close(); - } - - public PreparedQuery> worldQuery() { - return worldQuery; - } - - public PreparedQuery> fortuneQuery() { - return fortuneQuery; - } - - public PreparedQuery> updateQuery(int queryCount) { - return updateQuery[queryCount - 1]; - } - - @SuppressWarnings("unchecked") - void prepare() { - try { - worldQuery = conn.prepare(SELECT_WORLD) - .toCompletionStage().toCompletableFuture().get().query(); - fortuneQuery = conn.prepare(SELECT_FORTUNE) - .toCompletionStage().toCompletableFuture().get().query(); - updateQuery = (PreparedQuery>[]) new PreparedQuery[UPDATE_QUERIES]; - for (int i = 0; i < UPDATE_QUERIES; i++) { - updateQuery[i] = conn.prepare(singleUpdate(i + 1)) - .toCompletionStage().toCompletableFuture().get().query(); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private static String singleUpdate(int count) { - StringBuilder sql = new StringBuilder(); - sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); - for (int i = 0; i < count; i++) { - int k = i * 2 + 1; - sql.append(" WHEN $").append(k).append(" THEN $").append(k + 1); - } - sql.append(" ELSE RANDOMNUMBER"); - sql.append(" END WHERE ID IN ($1"); - for (int i = 1; i < count; i++) { - int k = i * 2 + 1; - sql.append(",$").append(k); - } - sql.append(")"); - return sql.toString(); - } - } } diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java new file mode 100644 index 00000000000..2d142dd13d3 --- /dev/null +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java @@ -0,0 +1,60 @@ + +package io.helidon.benchmark.nima.models; + +import java.util.concurrent.locks.ReentrantLock; +import java.util.logging.Logger; + +import io.helidon.config.Config; +import io.vertx.core.Vertx; +import io.vertx.pgclient.PgConnectOptions; + +class PgClientConnectionPoolArray extends PgClientConnectionPool { + private static final Logger LOGGER = Logger.getLogger(PgClientConnectionPoolArray.class.getName()); + + private final int connections; + private final PgClientConnection[] connectionArray; + private final ReentrantLock lock = new ReentrantLock(); + + PgClientConnectionPoolArray(Vertx vertx, PgConnectOptions options, Config config) { + super(vertx, options, config); + double sizeFactor = config.get("pgclient-connection-pool.size-factor") + .asDouble() + .orElse(1.0); + connections = (int) (Runtime.getRuntime().availableProcessors() * sizeFactor); + connectionArray = new PgClientConnection[connections]; + LOGGER.info("Connection pool is " + getClass().getSimpleName()); + LOGGER.info("Size of connection pool is " + connections); + } + + @Override + public PgClientConnection clientConnection() { + int index = Thread.currentThread().hashCode() % connections; + PgClientConnection connection = connectionArray[index]; + if (connection == null) { + try { + lock.lock(); + connection = connectionArray[index]; + if (connection == null) { + connection = newConnection(); + connectionArray[index] = connection; + } + } finally { + lock.unlock(); + } + } + return connection; + } + + @Override + public void close() { + try { + for (PgClientConnection connection : connectionArray) { + if (connection != null) { + connection.close(); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java index 3f3bd2624eb..1af13ae8930 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.logging.Logger; import io.helidon.config.Config; import io.vertx.core.Future; @@ -15,14 +14,12 @@ import io.vertx.sqlclient.Tuple; import static io.helidon.benchmark.nima.models.DbRepository.randomWorldNumber; -import static io.helidon.benchmark.nima.models.PgClientConnectionPool.PgClientConnection.UPDATE_QUERIES; +import static io.helidon.benchmark.nima.models.PgClientConnection.UPDATE_QUERIES; public class PgClientRepository implements DbRepository { - private static final Logger LOGGER = Logger.getLogger(PgClientRepository.class.getName()); private final PgClientConnectionPool connectionPool; - @SuppressWarnings("unchecked") public PgClientRepository(Config config) { VertxOptions vertxOptions = new VertxOptions() .setPreferNativeTransport(true) @@ -41,7 +38,7 @@ public PgClientRepository(Config config) { .setTcpQuickAck(true) .setTcpKeepAlive(true) .setPipeliningLimit(100000); - connectionPool = new PgClientConnectionPool(vertx, connectOptions); + connectionPool = PgClientConnectionPool.create(vertx, connectOptions, config); } @Override diff --git a/frameworks/Java/helidon/nima/src/main/resources/application.yaml b/frameworks/Java/helidon/nima/src/main/resources/application.yaml index 4a26ea0d0e0..d4db8d75119 100644 --- a/frameworks/Java/helidon/nima/src/main/resources/application.yaml +++ b/frameworks/Java/helidon/nima/src/main/resources/application.yaml @@ -37,4 +37,6 @@ db: "hello_world" username: benchmarkdbuser password: benchmarkdbpass db-repository: "pgclient" # "pgclient" (default) or "hikari" +pgclient-connection-pool: + size-factor: 1.0 # size = available-processors * size-factor From a4b54e1485a898914e0b3e0d5803d0ef643dfef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20Bj=C3=B6rklin?= Date: Mon, 3 Mar 2025 06:24:50 -0800 Subject: [PATCH 1154/1766] chore: bump OCaml version in image (#9585) --- frameworks/OCaml/httpaf/httpaf.dockerfile | 2 +- frameworks/OCaml/webmachine/webmachine.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/OCaml/httpaf/httpaf.dockerfile b/frameworks/OCaml/httpaf/httpaf.dockerfile index 4921ba7d828..905be838567 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:5.1.1-b58c72ee +FROM rbjorklin/techempower-ocaml-image:5.3.0-e8949511 # https://caml.inria.fr/pub/docs/manual-ocaml/libref/Gc.html # https://linux.die.net/man/1/ocamlrun diff --git a/frameworks/OCaml/webmachine/webmachine.dockerfile b/frameworks/OCaml/webmachine/webmachine.dockerfile index ab3f373c8c4..ac3a1fab080 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:5.1.1-b58c72ee +FROM rbjorklin/techempower-ocaml-image:5.3.0-e8949511 ENV DIR project From 3dce7fe40ce0348ab9c061b5a38cc2472f8783c2 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 3 Mar 2025 15:24:58 +0100 Subject: [PATCH 1155/1766] [php] Update leaf to 3.11 (#9582) --- frameworks/PHP/leaf/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/leaf/composer.json b/frameworks/PHP/leaf/composer.json index adc04bf753d..25dd1d1aa6e 100644 --- a/frameworks/PHP/leaf/composer.json +++ b/frameworks/PHP/leaf/composer.json @@ -1,5 +1,5 @@ { "require": { - "leafs/leaf": "^3.3" + "leafs/leaf": "^3.11" } } From e10ad45440366abeabdd5af33af28b7fbbefff10 Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Mon, 3 Mar 2025 15:25:08 +0100 Subject: [PATCH 1156/1766] Revert to epoll instead of io_uring (#9577) * Revert to epoll instead of io_uring * Restore io_uring * Do rever to epoll (PR was not merged yet) --- frameworks/Java/inverno/inverno-postgres.dockerfile | 2 +- frameworks/Java/inverno/inverno.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile index d1d333ef5a5..1435b348829 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -2,7 +2,7 @@ FROM maven:3.9.9-eclipse-temurin-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml -RUN mvn package -q -Pio.inverno.io_uring +RUN mvn package -q -Pio.inverno.epoll EXPOSE 8080 diff --git a/frameworks/Java/inverno/inverno.dockerfile b/frameworks/Java/inverno/inverno.dockerfile index 5f666a70a95..6744f548c14 100644 --- a/frameworks/Java/inverno/inverno.dockerfile +++ b/frameworks/Java/inverno/inverno.dockerfile @@ -2,7 +2,7 @@ FROM maven:3.9.9-eclipse-temurin-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml -RUN mvn package -q -Pio.inverno.io_uring +RUN mvn package -q -Pio.inverno.epoll EXPOSE 8080 From 176b40883e5bbb06f11653bdac8cb18ad45d5750 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:25:15 +0100 Subject: [PATCH 1157/1766] [ruby/sinatra] Only set headers not created by servers (#9575) +------------------------+-----+-----+-----+------+-------+---------+--------------+ | branch_name| json| db|query|update|fortune|plaintext|weighted_score| +------------------------+-----+-----+-----+------+-------+---------+--------------+ | master|62219|24663| 8786| 6706| 20755| 62218| 849| |remove-redundant-headers|76413|31652|13103| 6976| 19379| 60110| 982| +------------------------+-----+-----+-----+------+-------+---------+--------------+ --- frameworks/Ruby/sinatra-sequel/hello_world.rb | 2 +- frameworks/Ruby/sinatra/hello_world.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index 5a4630585f9..454c77e5a16 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -33,7 +33,7 @@ def rand1 after do response['Date'] = Time.now.httpdate - end + end if defined?(Falcon) || defined?(Puma) after do response['Server'] = SERVER_STRING diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index 1a6b2c55c4c..4cad26711d4 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -33,7 +33,7 @@ def rand1 after do response['Date'] = Time.now.httpdate - end + end if defined?(Falcon) || defined?(Puma) || defined?(Agoo) after do response['Server'] = SERVER_STRING From b08578abcc47d49589cf924dc54f5ec6170201b6 Mon Sep 17 00:00:00 2001 From: Gabriel Scatolin <17441745+CypherPotato@users.noreply.github.com> Date: Mon, 3 Mar 2025 11:25:26 -0300 Subject: [PATCH 1158/1766] update sisk cadente tests (#9576) * update sisk cadente * add missing dependencies to aot test * remove aot test * fix: plaintext strings * update cadente version * update cadente version --- frameworks/CSharp/sisk/config.toml | 2 +- .../CSharp/sisk/sisk-cadente.dockerfile | 10 ++++-- .../CSharp/sisk/sisk-cadente/Program.cs | 36 +++++++++++-------- .../CSharp/sisk/sisk-cadente/sisk.csproj | 22 ++++++------ frameworks/CSharp/sisk/sisk/Program.cs | 8 +++-- 5 files changed, 47 insertions(+), 31 deletions(-) diff --git a/frameworks/CSharp/sisk/config.toml b/frameworks/CSharp/sisk/config.toml index af787b73130..ac39e86d851 100644 --- a/frameworks/CSharp/sisk/config.toml +++ b/frameworks/CSharp/sisk/config.toml @@ -25,4 +25,4 @@ os = "Linux" orm = "Raw" platform = ".NET" webserver = "Cadente" -versus = "None" +versus = "None" \ No newline at end of file diff --git a/frameworks/CSharp/sisk/sisk-cadente.dockerfile b/frameworks/CSharp/sisk/sisk-cadente.dockerfile index 87f45780338..34092a0e15c 100644 --- a/frameworks/CSharp/sisk/sisk-cadente.dockerfile +++ b/frameworks/CSharp/sisk/sisk-cadente.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /source # copy csproj and restore as distinct layers @@ -7,10 +7,14 @@ RUN dotnet restore -r linux-musl-x64 # copy and publish app and libraries COPY sisk-cadente/ . -RUN dotnet publish -c release -o /app -r linux-musl-x64 +RUN dotnet publish -c release -o /app + +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 # final stage/image -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime WORKDIR /app COPY --from=build /app . diff --git a/frameworks/CSharp/sisk/sisk-cadente/Program.cs b/frameworks/CSharp/sisk/sisk-cadente/Program.cs index ba19a480d16..267877ee584 100644 --- a/frameworks/CSharp/sisk/sisk-cadente/Program.cs +++ b/frameworks/CSharp/sisk/sisk-cadente/Program.cs @@ -1,10 +1,19 @@ -using System.Text; +using System.Net; +using System.Text; using System.Text.Json; using Sisk.Cadente; -var host = new HttpHost ( 8080, session => { - var request = session.Request; +HttpHost.QueueSize = 4096; + +var host = new HttpHost ( new IPEndPoint ( IPAddress.Any, 8080 ) ); +host.ContextCreated += Host_ContextCreated; + +host.Start (); +Thread.Sleep ( Timeout.Infinite ); +void Host_ContextCreated ( HttpHost sender, HttpHostContext session ) { + var request = session.Request; + if (request.Path == "/plaintext") { SerializePlainTextResponse ( session.Response ); } @@ -14,23 +23,22 @@ else { session.Response.StatusCode = 404; } -} ); +} -host.Start (); -Thread.Sleep ( Timeout.Infinite ); +static void SerializePlainTextResponse ( HttpHostContext.HttpResponse response ) { -static void SerializePlainTextResponse ( HttpResponse response ) { - var contentBytes = Encoding.UTF8.GetBytes ( "Hello, world!" ); + var messageBytes = Encoding.UTF8.GetBytes ( "Hello, World!" ); - response.Headers.Add ( new HttpHeader ( "Content-Type", "text/plain" ) ); - response.ResponseStream = new MemoryStream ( contentBytes ); + response.Headers.Add ( new HttpHeader ( "Content-Type", "text/plain; charset=UTF-8" ) ); + response.ResponseStream = new MemoryStream ( messageBytes ); } -static void SerializeJsonResponse ( HttpResponse response ) { +static void SerializeJsonResponse ( HttpHostContext.HttpResponse response ) { + var contentBytes = JsonSerializer.SerializeToUtf8Bytes ( new { - message = "Hello, world!" + message = "Hello, World!" } ); - - response.Headers.Add ( new HttpHeader ( "Content-Type", "application/json; charset=utf-8" ) ); + + response.Headers.Add ( new HttpHeader ( "Content-Type", "application/json" ) ); response.ResponseStream = new MemoryStream ( contentBytes ); } \ No newline at end of file diff --git a/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj b/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj index 4d284054c2b..c72c3f1faee 100644 --- a/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj +++ b/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj @@ -1,15 +1,15 @@  - - Exe - net8.0 - enable - enable - true - + + Exe + net9.0 + enable + enable + true + - - - + + + - + \ No newline at end of file diff --git a/frameworks/CSharp/sisk/sisk/Program.cs b/frameworks/CSharp/sisk/sisk/Program.cs index 12d331767ad..7b80417d4b7 100644 --- a/frameworks/CSharp/sisk/sisk/Program.cs +++ b/frameworks/CSharp/sisk/sisk/Program.cs @@ -1,9 +1,13 @@ using System.Net.Http.Json; +using System.Text; using Sisk.Core.Http; using Sisk.Core.Routing; var app = HttpServer.CreateBuilder ( host => { host.UseListeningPort ( "http://+:8080/" ); + host.UseConfiguration ( config => { + config.AccessLogsStream = null; + } ); } ).Build (); app.Router.SetRoute ( RouteMethod.Get, "/plaintext", PlainText ); @@ -12,11 +16,11 @@ app.Start (); static HttpResponse PlainText ( HttpRequest request ) { - return new HttpResponse ( "Hello, world!" ); + return new HttpResponse ( new StringContent ( "Hello, World!", Encoding.UTF8, "text/plain" ) ); } static HttpResponse Json ( HttpRequest request ) { return new HttpResponse ( JsonContent.Create ( new { - message = "Hello, world!" + message = "Hello, World!" } ) ); } \ No newline at end of file From 697b36c832c0fb279cc7ba1d8d950ebe8653a5e1 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:25:46 +0100 Subject: [PATCH 1159/1766] Validate response status codes (#9605) This checks that the status code of the response is a 200. It also makes sure the headers are verified for the query and update tests. --- toolset/test_types/abstract_test_type.py | 6 +++-- .../test_types/cached-query/cached-query.py | 6 ++++- toolset/test_types/db/db.py | 7 +++--- toolset/test_types/fortune/fortune.py | 4 +-- toolset/test_types/json/json.py | 7 +++--- toolset/test_types/plaintext/plaintext.py | 7 +++--- toolset/test_types/query/query.py | 6 ++++- toolset/test_types/update/update.py | 6 ++++- toolset/test_types/verifications.py | 25 +++++++++++++++---- 9 files changed, 53 insertions(+), 21 deletions(-) diff --git a/toolset/test_types/abstract_test_type.py b/toolset/test_types/abstract_test_type.py index c8fc00a3e6b..0f6d5300b7f 100644 --- a/toolset/test_types/abstract_test_type.py +++ b/toolset/test_types/abstract_test_type.py @@ -28,6 +28,7 @@ def __init__(self, self.args = args self.headers = "" self.body = "" + self.status = None if accept_header is None: self.accept_header = self.accept('json') @@ -64,7 +65,7 @@ def parse(self, test_keys): "A %s requires the benchmark_config.json to contain %s" % (self.name, self.args)) - def request_headers_and_body(self, url): + def request_headers_and_body_and_status(self, url): ''' Downloads a URL and returns the HTTP response headers and body content as a tuple @@ -76,7 +77,8 @@ def request_headers_and_body(self, url): self.headers = r.headers self.body = r.content - return self.headers, self.body + self.status = r.status_code + return self.headers, self.body, self.status def output_headers_and_body(self): log(str(self.headers)) diff --git a/toolset/test_types/cached-query/cached-query.py b/toolset/test_types/cached-query/cached-query.py index 83f5302a641..e2cd57d1b7b 100644 --- a/toolset/test_types/cached-query/cached-query.py +++ b/toolset/test_types/cached-query/cached-query.py @@ -1,5 +1,5 @@ from toolset.test_types.abstract_test_type import AbstractTestType -from toolset.test_types.verifications import verify_query_cases +from toolset.test_types.verifications import verify_query_cases, verify_status, verify_headers class TestType(AbstractTestType): @@ -39,6 +39,10 @@ def verify(self, base_url): "Route for cached queries must be at least 15 characters, found '{}' instead".format(self.cached_query_url), url)) + headers, body, status = self.request_headers_and_body_and_status(url) + problems += verify_status(self.request_headers_and_body_and_status, status, url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json') + if len(problems) == 0: return [('pass', '', url + case) for case, _ in cases] else: diff --git a/toolset/test_types/db/db.py b/toolset/test_types/db/db.py index 065667a19a7..508c1b45b75 100644 --- a/toolset/test_types/db/db.py +++ b/toolset/test_types/db/db.py @@ -1,5 +1,5 @@ from toolset.test_types.abstract_test_type import AbstractTestType -from toolset.test_types.verifications import basic_body_verification, verify_headers, verify_randomnumber_object, verify_queries_count +from toolset.test_types.verifications import basic_body_verification, verify_status, verify_headers, verify_randomnumber_object, verify_queries_count class TestType(AbstractTestType): @@ -28,7 +28,7 @@ def verify(self, base_url): expected_queries = repetitions * concurrency url = base_url + self.db_url - headers, body = self.request_headers_and_body(url) + headers, body, status = self.request_headers_and_body_and_status(url) response, problems = basic_body_verification(body, url) @@ -62,7 +62,8 @@ def verify(self, base_url): # Verify response content problems += verify_randomnumber_object(response, url) - problems += verify_headers(self.request_headers_and_body, headers, url, should_be='json') + problems += verify_status(self.request_headers_and_body_and_status, status, url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json') if len(problems) == 0: problems += verify_queries_count(self, "World", url, concurrency, repetitions, expected_queries, expected_queries) diff --git a/toolset/test_types/fortune/fortune.py b/toolset/test_types/fortune/fortune.py index 6c42a4665bb..f14b3990c8a 100644 --- a/toolset/test_types/fortune/fortune.py +++ b/toolset/test_types/fortune/fortune.py @@ -30,7 +30,7 @@ def verify(self, base_url): expected_rows = 12 * expected_queries url = base_url + self.fortune_url - headers, body = self.request_headers_and_body(url) + headers, body, status = self.request_headers_and_body_and_status(url) _, problems = basic_body_verification(body, url, is_json_check=False) @@ -49,7 +49,7 @@ def verify(self, base_url): (valid, diff) = parser.isValidFortune(self.name, body.decode()) if valid: - problems += verify_headers(self.request_headers_and_body, headers, url, should_be='html') + problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='html') if len(problems) == 0: problems += verify_queries_count(self, "fortune", url, concurrency, repetitions, expected_queries, expected_rows) if len(problems) == 0: diff --git a/toolset/test_types/json/json.py b/toolset/test_types/json/json.py index ebaf0d5fe4a..0c03aa10965 100644 --- a/toolset/test_types/json/json.py +++ b/toolset/test_types/json/json.py @@ -1,5 +1,5 @@ from toolset.test_types.abstract_test_type import AbstractTestType -from toolset.test_types.verifications import basic_body_verification, verify_headers, verify_helloworld_object +from toolset.test_types.verifications import basic_body_verification, verify_status, verify_headers, verify_helloworld_object class TestType(AbstractTestType): def __init__(self, config): @@ -23,7 +23,7 @@ def verify(self, base_url): ''' url = base_url + self.json_url - headers, body = self.request_headers_and_body(url) + headers, body, status = self.request_headers_and_body_and_status(url) response, problems = basic_body_verification(body, url) @@ -38,7 +38,8 @@ def verify(self, base_url): return problems problems += verify_helloworld_object(response, url) - problems += verify_headers(self.request_headers_and_body, headers, url, should_be='json') + problems += verify_status(self.request_headers_and_body_and_status, status, url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json') if len(problems) > 0: return problems diff --git a/toolset/test_types/plaintext/plaintext.py b/toolset/test_types/plaintext/plaintext.py index c1fa1bbbabf..ed713c4dd10 100644 --- a/toolset/test_types/plaintext/plaintext.py +++ b/toolset/test_types/plaintext/plaintext.py @@ -1,4 +1,4 @@ -from toolset.test_types.verifications import basic_body_verification, verify_headers +from toolset.test_types.verifications import basic_body_verification, verify_status, verify_headers from toolset.test_types.abstract_test_type import AbstractTestType @@ -15,7 +15,7 @@ def __init__(self, config): def verify(self, base_url): url = base_url + self.plaintext_url - headers, body = self.request_headers_and_body(url) + headers, body, status = self.request_headers_and_body_and_status(url) _, problems = basic_body_verification(body, url, is_json_check=False) @@ -45,7 +45,8 @@ def verify(self, base_url): "This may negatively affect benchmark performance." % extra_bytes), url)) - problems += verify_headers(self.request_headers_and_body, headers, url, should_be='plaintext') + problems += verify_status(self.request_headers_and_body_and_status, status, url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='plaintext') if len(problems) == 0: return [('pass', '', url)] diff --git a/toolset/test_types/query/query.py b/toolset/test_types/query/query.py index ebf57d1aa9d..0ae9cd722e3 100644 --- a/toolset/test_types/query/query.py +++ b/toolset/test_types/query/query.py @@ -1,5 +1,5 @@ from toolset.test_types.abstract_test_type import AbstractTestType -from toolset.test_types.verifications import verify_query_cases +from toolset.test_types.verifications import verify_query_cases, verify_status, verify_headers class TestType(AbstractTestType): @@ -39,6 +39,10 @@ def verify(self, base_url): "Route for queries must be at least 9 characters, found '{}' instead".format(self.query_url), url)) + headers, body, status = self.request_headers_and_body_and_status(url) + problems += verify_status(self.request_headers_and_body_and_status, status, url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json') + if len(problems) == 0: return [('pass', '', url + case) for case, _ in cases] else: diff --git a/toolset/test_types/update/update.py b/toolset/test_types/update/update.py index e904e6c356b..e518c6bfc80 100644 --- a/toolset/test_types/update/update.py +++ b/toolset/test_types/update/update.py @@ -1,5 +1,5 @@ from toolset.test_types.abstract_test_type import AbstractTestType -from toolset.test_types.verifications import verify_query_cases +from toolset.test_types.verifications import verify_query_cases, verify_status, verify_headers class TestType(AbstractTestType): @@ -38,6 +38,10 @@ def verify(self, base_url): "Route for update must be at least 8 characters, found '{}' instead".format(self.update_url), url)) + headers, body, status = self.request_headers_and_body_and_status(url) + problems += verify_status(self.request_headers_and_body_and_status, status, url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json') + if len(problems) == 0: return [('pass', '', url + case) for (case, _) in cases] else: diff --git a/toolset/test_types/verifications.py b/toolset/test_types/verifications.py index d7c040f0737..99107ea757e 100644 --- a/toolset/test_types/verifications.py +++ b/toolset/test_types/verifications.py @@ -41,8 +41,23 @@ def basic_body_verification(body, url, is_json_check=True): # they do not need or expect a dict back return None, [] +def verify_status(request_headers_and_body_and_status, status, url, expected_status=200): + ''' + Verifies the status code of a framework response + ''' + + problems = [] + + if status is not expected_status: + problems.append(( + 'fail', + 'Invalid response status, found \"%s\", did not match \"%s\"' + % (status, expected_status), url)) + + return problems + -def verify_headers(request_headers_and_body, headers, url, should_be='json'): +def verify_headers(request_headers_and_body_and_status, headers, url, should_be='json'): ''' Verifies the headers of a framework response param `should_be` is a switch for the three acceptable content types @@ -76,7 +91,7 @@ def verify_headers(request_headers_and_body, headers, url, should_be='json'): # Verify response content # Make sure that the date object isn't cached sleep(3) - second_headers, body2 = request_headers_and_body(url) + second_headers, body2, status2 = request_headers_and_body_and_status(url) second_date = second_headers.get('Date') date2 = second_headers.get('Date') @@ -349,7 +364,7 @@ def verify_query_cases(self, cases, url, check_updates=False): for q, max_infraction in cases: case_url = url + q - headers, body = self.request_headers_and_body(case_url) + headers, body, status = self.request_headers_and_body_and_status(case_url) try: queries = int(q) # drops down for 'foo' and '' @@ -363,7 +378,7 @@ def verify_query_cases(self, cases, url, check_updates=False): problems += verify_randomnumber_list(expected_len, headers, body, case_url, max_infraction) - problems += verify_headers(self.request_headers_and_body, headers, case_url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, case_url) # Only check update changes if we are doing an Update verification and if we're testing # the highest number of queries, to ensure that we don't accidentally FAIL for a query @@ -393,7 +408,7 @@ def verify_query_cases(self, cases, url, check_updates=False): # parameter input problems += verify_randomnumber_list( expected_len, headers, body, case_url, max_infraction) - problems += verify_headers(self.request_headers_and_body, headers, case_url) + problems += verify_headers(self.request_headers_and_body_and_status, headers, case_url) if hasattr(self, 'database'): # verify the number of queries and rows read for 20 queries, with a concurrency level of 512, with 2 repetitions From cb99cc772f4fc7044ce36540b0d64276a54c8466 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:26:25 -1000 Subject: [PATCH 1160/1766] update to tio-http-server 3.7.3.v20250301-RELEASE (#9608) * update tio-http-server version * update dockerfile --------- Co-authored-by: litongjava --- frameworks/Java/tio-http-server/pom.xml | 215 ++++++------------ .../litongjava/tio/http/server/MainApp.java | 14 +- .../server/controller/CacheController.java | 6 +- .../http/server/controller/DbController.java | 21 +- .../http/server/utils/BeanConverterUtils.java | 31 --- .../tio-http-server/tio-server.dockerfile | 5 +- 6 files changed, 91 insertions(+), 201 deletions(-) delete mode 100644 frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index 2b16997b60e..080b11956ff 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -16,12 +16,12 @@ com.litongjava tio-http-server - 3.7.3.v20240919-RELEASE + 3.7.3.v20250301-RELEASE com.litongjava java-db - 1.2.6 + 1.4.9 junit @@ -31,16 +31,6 @@ - - - - com.alibaba.fastjson2 fastjson2 @@ -66,144 +56,67 @@ - - - - development - - true - - - - ch.qos.logback - logback-classic - 1.2.13 - - - + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + false + + - - - production - - - ch.qos.logback - logback-classic - 1.2.13 - - - - - - org.springframework.boot - spring-boot-maven-plugin - 2.7.4 - - ${main.class} - org.projectlombok - - - - - - repackage - - - - - - - - - - assembly - - - ch.qos.logback - logback-classic - 1.2.13 - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.1 - - - - ${main.class} - - - - jar-with-dependencies - - false - - - - make-assembly - package - - single - - - - - - - - - native - - - - org.slf4j - slf4j-jdk14 - 1.7.31 - - - - org.graalvm.sdk - graal-sdk - ${graalvm.version} - provided - - - - ${project.artifactId} - - - org.graalvm.nativeimage - native-image-maven-plugin - 21.2.0 - - - - native-image - - package - - - - false - ${project.artifactId} - ${main.class} - - -H:+RemoveSaturatedTypeFlows - --allow-incomplete-classpath - --no-fallback - - - - - - - + + maven-assembly-plugin + 3.1.0 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + \ No newline at end of file diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java index 43a6bfc5804..6de2f4cbedb 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java @@ -9,7 +9,7 @@ import com.litongjava.tio.http.server.controller.DbController; import com.litongjava.tio.http.server.controller.IndexController; import com.litongjava.tio.http.server.handler.DefaultHttpRequestDispatcher; -import com.litongjava.tio.http.server.router.DefaultHttpReqeustRouter; +import com.litongjava.tio.http.server.router.DefaultHttpRequestRouter; import com.litongjava.tio.http.server.router.HttpRequestRouter; import com.litongjava.tio.server.ServerTioConfig; import com.litongjava.tio.utils.environment.EnvUtils; @@ -18,11 +18,12 @@ public class MainApp { public static void main(String[] args) { long start = System.currentTimeMillis(); + EnvUtils.buildCmdArgsMap(args); EnvUtils.load(); // add route IndexController controller = new IndexController(); - HttpRequestRouter simpleHttpRoutes = new DefaultHttpReqeustRouter(); + HttpRequestRouter simpleHttpRoutes = new DefaultHttpRequestRouter(); simpleHttpRoutes.add("/", controller::index); simpleHttpRoutes.add("/plaintext", controller::plaintext); simpleHttpRoutes.add("/json", controller::json); @@ -49,9 +50,16 @@ public static void main(String[] args) { // close Heartbeat serverTioConfig.setHeartbeatTimeout(0); serverTioConfig.statOn = false; + boolean db = EnvUtils.getBoolean("db", true); + if (db) { + try { + new MysqlDbConfig().init(); + } catch (Exception e) { + e.printStackTrace(); + } + } // start server try { - new MysqlDbConfig().init(); new EnjoyEngineConfig().engine(); new EhCachePluginConfig().ehCachePlugin(); httpServerStarter.start(); diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java index 6ecd7664ac1..ef48b3990db 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java @@ -7,7 +7,7 @@ import com.alibaba.fastjson2.JSON; import com.litongjava.db.activerecord.Db; -import com.litongjava.db.activerecord.Record; +import com.litongjava.db.activerecord.Row; import com.litongjava.tio.http.common.HeaderName; import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; @@ -24,7 +24,7 @@ public HttpResponse cachedQuery(HttpRequest request) { .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 .mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象 .filter(Objects::nonNull) // 过滤掉 null 值 - .map(Record::toMap) // 将每个 Record 对象转换为 Map + .map(Row::toMap) // 将每个 Record 对象转换为 Map .collect(Collectors.toList()); // 收集到 List HttpResponse httpResponse = new HttpResponse(request); @@ -34,7 +34,7 @@ public HttpResponse cachedQuery(HttpRequest request) { } - private Record findByIdWithCache(String tableName, int id) { + private Row findByIdWithCache(String tableName, int id) { String sql = "SELECT id, randomNumber FROM world WHERE id = ?"; return Db.findFirstByCache(tableName, id, sql, id); } diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java index 699b313bd69..782543a81e0 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java @@ -12,15 +12,14 @@ import com.jfinal.template.Engine; import com.jfinal.template.Template; import com.litongjava.db.activerecord.Db; -import com.litongjava.db.activerecord.Record; -import com.litongjava.ehcache.EhCache; +import com.litongjava.db.activerecord.Row; +import com.litongjava.ehcache.EhCacheKit; import com.litongjava.tio.http.common.HeaderName; import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; import com.litongjava.tio.http.common.HttpResponse; import com.litongjava.tio.http.server.model.Fortune; import com.litongjava.tio.http.server.util.Resps; -import com.litongjava.tio.http.server.utils.BeanConverterUtils; import com.litongjava.tio.http.server.utils.RandomUtils; public class DbController { @@ -37,7 +36,7 @@ public HttpResponse db(HttpRequest request) { // int id = 11; // String sql="SELECT id, randomNumber FROM world WHERE id = ?"; - Record recored = Db.findById("world", id); + Row recored = Db.findById("world", id); if (recored != null) { httpResponse.setBody(JSON.toJSONBytes(recored.toMap())); } else { @@ -57,7 +56,7 @@ public HttpResponse queries(HttpRequest request) { .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 .mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象 .filter(Objects::nonNull) // 过滤掉 null 值 - .map(Record::toMap) // 将每个 Record 对象转换为 Map + .map(Row::toMap) // 将每个 Record 对象转换为 Map .collect(Collectors.toList()); // 收集到 List HttpResponse httpResponse = new HttpResponse(request); @@ -66,11 +65,11 @@ public HttpResponse queries(HttpRequest request) { return httpResponse; } -//@GetMapping("/updates") + //@GetMapping("/updates") public HttpResponse updates(HttpRequest request) { String queries = request.getParam("queries"); - EhCache.removeAll("world"); + EhCacheKit.removeAll("world"); List> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers // limit @@ -90,7 +89,7 @@ public HttpResponse updates(HttpRequest request) { return record; }) // tomap - .map(Record::toMap) + .map(Row::toMap) // to List .collect(Collectors.toList()); @@ -101,11 +100,11 @@ public HttpResponse updates(HttpRequest request) { } public HttpResponse fortunes(HttpRequest request) throws IllegalAccessException, InstantiationException { - List records = Db.find("SELECT * FROM fortune"); + List records = Db.find("SELECT * FROM fortune"); List fortunes = new ArrayList<>(records.size()); - for (Record record : records) { - fortunes.add(BeanConverterUtils.toBean(record.toMap(), Fortune.class)); + for (Row record : records) { + fortunes.add(record.toBean(Fortune.class)); } // 添加额外的 Fortune fortunes.add(new Fortune(0L, "Additional fortune added at request time.")); diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java deleted file mode 100644 index 11796feeb0f..00000000000 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/utils/BeanConverterUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.litongjava.tio.http.server.utils; - -import java.lang.reflect.Field; -import java.util.Map; - -public class BeanConverterUtils { - - /** - * Map to to bean - */ - public static T toBean(Map map, Class beanClass) - throws IllegalAccessException, InstantiationException { - - T bean = beanClass.newInstance(); // 创建 Bean 的实例 - - for (Field field : beanClass.getDeclaredFields()) { - field.setAccessible(true); // 确保私有字段也可以访问 - - if (map.containsKey(field.getName())) { - Object value = map.get(field.getName()); - - // 如果字段类型与值类型兼容,则设置字段的值 - if (value != null && field.getType().isAssignableFrom(value.getClass())) { - field.set(bean, value); - } - } - } - - return bean; - } -} diff --git a/frameworks/Java/tio-http-server/tio-server.dockerfile b/frameworks/Java/tio-http-server/tio-server.dockerfile index e9218a84790..4dbaf2afaa8 100644 --- a/frameworks/Java/tio-http-server/tio-server.dockerfile +++ b/frameworks/Java/tio-http-server/tio-server.dockerfile @@ -12,8 +12,9 @@ FROM litongjava/jre:8u391-stable-slim WORKDIR /app -COPY --from=builder /app/target/tio-http-server-benchmark-1.0.jar /app/target/tio-http-server-benchmark-1.0.jar +COPY --from=builder /app/target/tio-http-server-benchmark-1.0-jar-with-dependencies.jar /app/tio-http-server-benchmark-1.0.jar EXPOSE 8080 -CMD ["java","-jar", "/app/target/tio-http-server-benchmark-1.0.jar"] \ No newline at end of file +# java --server -XX:+UseNUMA XX:+UseParallelGC -cp target/tio-http-server-benchmark-1.0-jar-with-dependencies.jar com.litongjava.tio.http.server.MainApp +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC","-cp", "/app/tio-http-server-benchmark-1.0.jar","com.litongjava.tio.http.server.MainApp"] \ No newline at end of file From 756600eaa2179cf16a8d2b39b7e2410ad54e5d07 Mon Sep 17 00:00:00 2001 From: n0nag0n Date: Mon, 3 Mar 2025 07:26:31 -0700 Subject: [PATCH 1161/1766] Fomo framework for PHP (#9584) * added fomo framework * added some .keep files * corrected readme * Update .env remove APP_WORKER_COUNT * Test with PHP8.4 * Revert to PHP8.3 Work but with deprecated errrors. * Remove unnece * Remove unnecessary services configs --------- Co-authored-by: Joan Miquel --- frameworks/PHP/fomo/.env | 21 ++++ frameworks/PHP/fomo/.gitignore | 12 +++ frameworks/PHP/fomo/README.md | 26 +++++ .../PHP/fomo/app/Exceptions/Handler.php | 30 ++++++ frameworks/PHP/fomo/benchmark_config.json | 31 ++++++ frameworks/PHP/fomo/composer.json | 45 ++++++++ frameworks/PHP/fomo/config.toml | 19 ++++ frameworks/PHP/fomo/config/app.php | 8 ++ frameworks/PHP/fomo/config/database.php | 67 ++++++++++++ frameworks/PHP/fomo/config/server.php | 82 ++++++++++++++ frameworks/PHP/fomo/deploy/php-async.ini | 13 +++ frameworks/PHP/fomo/engineer | 98 +++++++++++++++++ frameworks/PHP/fomo/fomo.dockerfile | 22 ++++ .../fomo/language/validation/en/errors.php | 30 ++++++ frameworks/PHP/fomo/routes/api.php | 100 ++++++++++++++++++ frameworks/PHP/fomo/storage/logs/.keep | 0 frameworks/PHP/fomo/storage/routes/.keep | 0 frameworks/PHP/fomo/storage/view/fortunes.php | 18 ++++ 18 files changed, 622 insertions(+) create mode 100644 frameworks/PHP/fomo/.env create mode 100644 frameworks/PHP/fomo/.gitignore create mode 100644 frameworks/PHP/fomo/README.md create mode 100644 frameworks/PHP/fomo/app/Exceptions/Handler.php create mode 100755 frameworks/PHP/fomo/benchmark_config.json create mode 100644 frameworks/PHP/fomo/composer.json create mode 100644 frameworks/PHP/fomo/config.toml create mode 100644 frameworks/PHP/fomo/config/app.php create mode 100644 frameworks/PHP/fomo/config/database.php create mode 100755 frameworks/PHP/fomo/config/server.php create mode 100644 frameworks/PHP/fomo/deploy/php-async.ini create mode 100644 frameworks/PHP/fomo/engineer create mode 100644 frameworks/PHP/fomo/fomo.dockerfile create mode 100644 frameworks/PHP/fomo/language/validation/en/errors.php create mode 100644 frameworks/PHP/fomo/routes/api.php create mode 100644 frameworks/PHP/fomo/storage/logs/.keep create mode 100644 frameworks/PHP/fomo/storage/routes/.keep create mode 100644 frameworks/PHP/fomo/storage/view/fortunes.php diff --git a/frameworks/PHP/fomo/.env b/frameworks/PHP/fomo/.env new file mode 100644 index 00000000000..9e3a7f21887 --- /dev/null +++ b/frameworks/PHP/fomo/.env @@ -0,0 +1,21 @@ +APP_NAME=Fomo +APP_TIMEZONE=UTC +APP_ENV=local +APP_SSL=false +APP_DEBUG=false +APP_URL=http://localhost + +DB_HOST=tfb-database +DB_PORT=3306 +DB_DATABASE=hello_world +DB_USERNAME=benchmarkdbuser +DB_PASSWORD=benchmarkdbpass +DB_CHARSET=utf8mb4 +DB_COLLATION=utf8mb4_unicode_ci + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_USERNAME=null +REDIS_PORT=6379 +REDIS_DATABASE=0 + diff --git a/frameworks/PHP/fomo/.gitignore b/frameworks/PHP/fomo/.gitignore new file mode 100644 index 00000000000..a757318145d --- /dev/null +++ b/frameworks/PHP/fomo/.gitignore @@ -0,0 +1,12 @@ +.buildpath +.settings/ +.project +*.patch +.idea/ +.git/ +runtime/ +vendor/ +.phpintel/ +.DS_Store +*.lock +.phpunit* \ No newline at end of file diff --git a/frameworks/PHP/fomo/README.md b/frameworks/PHP/fomo/README.md new file mode 100644 index 00000000000..31c6ddcbed1 --- /dev/null +++ b/frameworks/PHP/fomo/README.md @@ -0,0 +1,26 @@ +# Introduction + +Fomo is a web application framework based. + +We tried to implement Fomo in the simplest possible way so that anyone can use it. + +Fomo supports the following: + +- Simple, fast routing engine. +- Processing work in the background. +- Queued job processing. +- And more... + +Fomo is very fast, simple and for use in large scale projects. + +# Original intention + +Here's 3 reason why you should use Fomo: + +- Fomo is very simple (less to learn and train others on). +- Fomo is very fast (uses fewer resources to do the same thing). +- Fomo is another tool that developers can use to solve their complex problems in a simple way. + +# Documentation + +[https://fomo-framework.github.io/docs/](https://fomo-framework.github.io/docs/) diff --git a/frameworks/PHP/fomo/app/Exceptions/Handler.php b/frameworks/PHP/fomo/app/Exceptions/Handler.php new file mode 100644 index 00000000000..a4cff760343 --- /dev/null +++ b/frameworks/PHP/fomo/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ +json([ + 'message' => 'not found' + ] , 404); + } + + public function notAllowedHttpException(Request $request): string + { + return response()->json([ + 'message' => "this is route supported {$request->method()} method" + ] , 405); + } + + public function InternalErrorException(Request $request, Throwable $error): string + { + return response()->json([ + 'message' => 'internal error' + ] , 500); + } +} diff --git a/frameworks/PHP/fomo/benchmark_config.json b/frameworks/PHP/fomo/benchmark_config.json new file mode 100755 index 00000000000..f79f7905e7e --- /dev/null +++ b/frameworks/PHP/fomo/benchmark_config.json @@ -0,0 +1,31 @@ +{ + "framework": "fomo", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/query?queries=", + "update_url": "/update?queries=", + "port": 9000, + "approach": "Realistic", + "classification": "Micro", + "database": "mysql", + "framework": "Fomo", + "language": "PHP", + "flavor": "None", + "orm": "Full", + "platform": "swoole", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Fomo", + "notes": "", + "versus": "swoole" + } + } + ] + } + \ No newline at end of file diff --git a/frameworks/PHP/fomo/composer.json b/frameworks/PHP/fomo/composer.json new file mode 100644 index 00000000000..ea983317469 --- /dev/null +++ b/frameworks/PHP/fomo/composer.json @@ -0,0 +1,45 @@ +{ + "name": "fomo/fomo", + "description": "The Fomo Framework", + "keywords": ["framework", "fomo" , "high performance"], + "type": "project", + "license": "MIT", + "authors": [ + { + "name": "Amir", + "email": "faramarzii.amir@gmail.com" + } + ], + "require": { + "php" : ">=8.1", + "fomo/framework": "^2.0" + }, + "autoload": { + "psr-4": { + "App\\" : "app/" , + "Database\\" : "database/", + "Storage\\Routes\\" : "storage/routes/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ] + }, + "minimum-stability": "dev", + "prefer-stable": true, + "require-dev": { + "fakerphp/faker": "^1.15", + "phpunit/phpunit": "^9.5" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true + } + } +} diff --git a/frameworks/PHP/fomo/config.toml b/frameworks/PHP/fomo/config.toml new file mode 100644 index 00000000000..1067719fe39 --- /dev/null +++ b/frameworks/PHP/fomo/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "fomo" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Fullstack" +database = "MySQL" +database_os = "Linux" +os = "Linux" +orm = "Full" +platform = "swoole" +webserver = "None" +versus = "swoole" \ No newline at end of file diff --git a/frameworks/PHP/fomo/config/app.php b/frameworks/PHP/fomo/config/app.php new file mode 100644 index 00000000000..0f6c003a1a6 --- /dev/null +++ b/frameworks/PHP/fomo/config/app.php @@ -0,0 +1,8 @@ + env('APP_NAME' , 'Fomo'), + 'timezone' => env('APP_TIMEZONE' , 'UTC'), + 'faker_locale' => 'en_US' , + 'locale' => 'en' , +]; \ No newline at end of file diff --git a/frameworks/PHP/fomo/config/database.php b/frameworks/PHP/fomo/config/database.php new file mode 100644 index 00000000000..004a473cc99 --- /dev/null +++ b/frameworks/PHP/fomo/config/database.php @@ -0,0 +1,67 @@ + env('DB_CONNECTION', 'mysql'), + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', databasePath('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ] +]; \ No newline at end of file diff --git a/frameworks/PHP/fomo/config/server.php b/frameworks/PHP/fomo/config/server.php new file mode 100755 index 00000000000..273b2cf3d4a --- /dev/null +++ b/frameworks/PHP/fomo/config/server.php @@ -0,0 +1,82 @@ + SWOOLE_BASE , + 'host' => '0.0.0.0', + 'port' => 9000 , + 'sockType' => SWOOLE_SOCK_TCP , + 'additional' => [ + 'worker_num' => env('APP_WORKER_COUNT' , cpuCount() * 2) , + /* + * log level + * SWOOLE_LOG_DEBUG (default) + * SWOOLE_LOG_TRACE + * SWOOLE_LOG_INFO + * SWOOLE_LOG_NOTICE + * SWOOLE_LOG_WARNING + * SWOOLE_LOG_ERROR + */ + 'log_level' => SWOOLE_LOG_DEBUG , + 'log_file' => storagePath('logs/fomo.log') , + + /* + This key causes Fomo to receive a complete HTTP data packet and prevents it from receiving incomplete HTTP packets. + */ + 'open_http_protocol' => true, + ], + + 'ssl' => [ + 'ssl_cert_file' => null , + 'ssl_key_file' => null , + ] , + + /* + * The following services are created for better performance in the program, only one object is created from them and they can be used throughout the program + */ + 'services' => [ + Fomo\Services\Cache::class , + Fomo\Services\Database::class , + Fomo\Services\Language::class , + Fomo\Services\Response::class , + Fomo\Services\Validation::class , + ] , + + /* + * Files and folders that must be changed in real time + */ + 'watcher' => [ + 'app', + 'config', + 'database', + 'language', + 'routes', + 'composer.lock', + '.env', + ] , + + /* + * Each of the following causes changes to the performance of the desired class. (so be careful in using them) + */ + 'advanceMode' => [ + /* + * advanced mode in Fomo\Request\Request class + * + * By activating the advanced mode in this class, you can access the data you want in an advanced way + * For example, consider that the user has sent you a array of the information of several customers. + * If the advanced mode is not active, you can only access an array of all customer information + * + * For example, the: + * $request->get('customers') + * + * But if the advanced mode is active, you can access any data you need from customers + * For example, the: + * $request->get('customers.*.name') + */ + 'request' => DISABLE + ] +]; diff --git a/frameworks/PHP/fomo/deploy/php-async.ini b/frameworks/PHP/fomo/deploy/php-async.ini new file mode 100644 index 00000000000..6c94704a357 --- /dev/null +++ b/frameworks/PHP/fomo/deploy/php-async.ini @@ -0,0 +1,13 @@ +opcache.enable=1 +opcache.enable_cli=1 +opcache.validate_timestamps=0 +opcache.save_comments=0 +opcache.enable_file_override=1 +opcache.memory_consumption=256 +opcache.interned_strings_buffer=16 +opcache.max_accelerated_files=7963 +opcache.preload_user=www-data + +mysqlnd.collect_statistics = Off + +memory_limit = 512M diff --git a/frameworks/PHP/fomo/engineer b/frameworks/PHP/fomo/engineer new file mode 100644 index 00000000000..d5794972427 --- /dev/null +++ b/frameworks/PHP/fomo/engineer @@ -0,0 +1,98 @@ +load(); + +/* + * set timezone + */ +date_default_timezone_set(config('app.timezone')); + +/* + * create console + */ +$application = new Application(); + +/* + * server commands + */ +$application->add(new StartServerCommand()); +$application->add(new ReloadServerCommand()); +$application->add(new StatusServerCommand()); +$application->add(new StopServerCommand()); + +/* + * build commands + */ +$application->add(new BuildControllerCommand()); +$application->add(new BuildExceptionCommand()); +$application->add(new BuildMiddlewareCommand()); +$application->add(new BuildResourceCommand()); +$application->add(new BuildTestCommand()); +$application->add(new BuildJobCommand()); +$application->add(new BuildTaskCommand()); +$application->add(new BuildServiceCommand()); + +/* + * tests commands + */ +$application->add(new TestsRunCommand()); + +/* + * factory commands + */ +$application->add(new FactoryStartCommand()); + +/* + * queue commands + */ +$application->add(new QueueStartCommand()); +$application->add(new QueueStatusCommand()); +$application->add(new QueueStopCommand()); + +/* + * scheduler commands + */ +$application->add(new SchedulerStartCommand()); +$application->add(new SchedulerStatusCommand()); +$application->add(new SchedulerStopCommand()); + +/* + * run console + */ +$application->run(); diff --git a/frameworks/PHP/fomo/fomo.dockerfile b/frameworks/PHP/fomo/fomo.dockerfile new file mode 100644 index 00000000000..eee3c65e802 --- /dev/null +++ b/frameworks/PHP/fomo/fomo.dockerfile @@ -0,0 +1,22 @@ +FROM phpswoole/swoole:5.1.3-php8.3 + +RUN docker-php-ext-install pcntl opcache > /dev/null + +# RUN pecl install --force redis + +COPY deploy/php-async.ini /usr/local/etc/php/php.ini + +COPY . /fomo + +WORKDIR /fomo + +RUN composer install --no-dev --quiet +RUN composer dump-autoload --optimize --quiet + +RUN chmod -R 777 /fomo/storage + +# USER www-data + +EXPOSE 9000 + +ENTRYPOINT [ "php", "engineer", "server:start" ] diff --git a/frameworks/PHP/fomo/language/validation/en/errors.php b/frameworks/PHP/fomo/language/validation/en/errors.php new file mode 100644 index 00000000000..b0d0c5bd160 --- /dev/null +++ b/frameworks/PHP/fomo/language/validation/en/errors.php @@ -0,0 +1,30 @@ + [ + 'required' => 'The :attribute is mandatory' , + 'string' => 'The :attribute must be a string' , + 'integer' => 'The :attribute must be a number' , + 'boolean' => 'The :attribute must be true or false' , + 'array' => 'The :attribute must be an array' , + 'email' => 'The :attribute must be the email address' , + 'regex' => 'The template :attribute is wrong' , + 'notRegex' => 'The template :attribute is wrong' , + 'max' => 'The :attribute field should not be greater than :value' , + 'min' => 'The :attribute field should not be less than :value' , + 'size' => 'The field :attribute must be equal to :value' , + 'after' => 'The :attribute field must be larger than the :value field' , + 'before' => 'The :attribute field must be smaller than the :value field' , + 'in' => 'The field :attribute must be equal to one of the values :value' , + 'date' => 'The :attribute must be of date type' , + 'exists' => 'Such :attribute does not exist' , + 'unique' => 'Such :attribute exists' , + 'nationalCode' => 'The national code entered in the :attribute field is incorrect' + ], + + 'attribute' => [ + 'firstName' => 'first name' , + 'lastName' => 'last name' , + 'phone' => 'phone' + ] +]; \ No newline at end of file diff --git a/frameworks/PHP/fomo/routes/api.php b/frameworks/PHP/fomo/routes/api.php new file mode 100644 index 00000000000..f711870746d --- /dev/null +++ b/frameworks/PHP/fomo/routes/api.php @@ -0,0 +1,100 @@ +get('/plaintext' , function () { + return response()->withHeaders([ + 'Server' => 'Fomo', + 'Date' => date('D, d M Y H:i:s T'), + ])->plainText('Hello, World!'); +}); + +$router->get('/json' , function () { + return response()->withHeaders([ + 'Server' => 'Fomo', + 'Date' => date('D, d M Y H:i:s T'), + ])->json(['message' => 'Hello, World!']); +}); + +$router->get('/db' , function () { + $id = mt_rand(1, 10000); + // need to pull back a single record from the World table by an $id. + $world = (array) DB::table('World')->where('id', '=', $id)->get()->toArray()[0]; + return response()->withHeaders([ + 'Server' => 'Fomo', + 'Date' => date('D, d M Y H:i:s T'), + ])->json($world); +}); + +$router->get('/fortunes' , function () { + + //$table = DB::table('World'); + $fortunes = DB::table('Fortune')->get()->toArray(); + + $fortune = new \stdClass(); + $fortune->id = 0; + $fortune->message = 'Additional fortune added at request time.'; + array_unshift($fortunes, $fortune); + + // sort the fortunes by message + usort($fortunes, function($a, $b) { + return $a->message <=> $b->message; + }); + + ob_start(); + include(storagePath('view/fortunes.php')); + $html = ob_get_clean(); + + return response()->withHeaders([ + 'Server' => 'Fomo', + 'Date' => date('D, d M Y H:i:s T'), + ])->html($html); +}); + +$router->get('/query' , function () { + $request = Request::getInstance(); + $queries = $request->get('queries'); + if (is_numeric($queries)) { + $queries = max(1, min($queries, 500)); + } else { + $queries = 1; + } + + $worlds = []; + for ($i = 0; $i < $queries; ++$i) { + $random_id = mt_rand(1, 10000); + $world = (array) DB::table('World')->where('id', '=', $random_id)->get()->toArray()[0]; + $worlds[] = $world; + } + return response()->withHeaders([ + 'Server' => 'Fomo', + 'Date' => date('D, d M Y H:i:s T'), + ])->json($worlds); +}); + +$router->get('/update' , function () { + $request = Request::getInstance(); + $queries = $request->get('queries'); + if (is_numeric($queries)) { + $queries = max(1, min($queries, 500)); + } else { + $queries = 1; + } + + $worlds = []; + for ($i = 0; $i < $queries; ++$i) { + $random_id = mt_rand(1, 10000); + $random_number = mt_rand(1, 10000); + $world = (array) DB::table('World')->where('id', '=', $random_id)->get()->toArray()[0]; + DB::table('World')->where('id', '=', $world['id'])->update(['randomNumber' => $random_number]); + $world['randomNumber'] = $random_number; + $worlds[] = $world; + } + return response()->withHeaders([ + 'Server' => 'Fomo', + 'Date' => date('D, d M Y H:i:s T'), + ])->json($worlds); +}); \ No newline at end of file diff --git a/frameworks/PHP/fomo/storage/logs/.keep b/frameworks/PHP/fomo/storage/logs/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/PHP/fomo/storage/routes/.keep b/frameworks/PHP/fomo/storage/routes/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/PHP/fomo/storage/view/fortunes.php b/frameworks/PHP/fomo/storage/view/fortunes.php new file mode 100644 index 00000000000..3b1b2c99b5e --- /dev/null +++ b/frameworks/PHP/fomo/storage/view/fortunes.php @@ -0,0 +1,18 @@ + + + Fortunes + + + + + + + + + + + + +
      idmessage
      id ?>message) ?>
      + + From ea96185495d4c4e47e39c6045367f86fecaa878b Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Mon, 3 Mar 2025 22:26:48 +0800 Subject: [PATCH 1162/1766] [xitca-web] utilize simd-json for unrealistic benchmark (#9583) * utilize simd-json for unrealistic benchmark * fix pg binding build * fix wasm build * explicit cast fd to tcp listener type * update to rust edition 2024 * feature flag fix --- frameworks/Rust/xitca-web/Cargo.lock | 452 +++++++++++++----- frameworks/Rust/xitca-web/Cargo.toml | 20 +- frameworks/Rust/xitca-web/src/db.rs | 6 +- frameworks/Rust/xitca-web/src/db_diesel.rs | 2 +- .../Rust/xitca-web/src/db_diesel_async.rs | 4 +- .../Rust/xitca-web/src/db_unrealistic.rs | 26 +- frameworks/Rust/xitca-web/src/main.rs | 30 +- frameworks/Rust/xitca-web/src/main_orm.rs | 19 +- frameworks/Rust/xitca-web/src/main_sync.rs | 4 +- .../Rust/xitca-web/src/main_unrealistic.rs | 9 +- frameworks/Rust/xitca-web/src/main_wasm.rs | 8 +- frameworks/Rust/xitca-web/src/ser.rs | 9 +- frameworks/Rust/xitca-web/src/util.rs | 6 +- .../Rust/xitca-web/xitca-web-orm.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-sync.dockerfile | 2 +- .../xitca-web-unrealistic.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-wasm.dockerfile | 2 +- .../Rust/xitca-web/xitca-web.dockerfile | 2 +- 18 files changed, 402 insertions(+), 203 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index a3f4e7a02cd..8411895981c 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -17,11 +17,29 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", @@ -84,9 +102,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block-buffer" @@ -99,9 +117,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -111,15 +129,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cc" -version = "1.2.1" +version = "1.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" dependencies = [ "shlex", ] @@ -143,9 +161,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -197,11 +215,11 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.4" +version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158fe8e2e68695bd615d7e4f3227c0727b151330d3e253b525086c348d055d5e" +checksum = "04001f23ba8843dc315804fa324000376084dfb1c30794ff68dd279e6e5696d5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "byteorder", "diesel_derives", "itoa", @@ -258,9 +276,9 @@ dependencies = [ [[package]] name = "dsl_auto_type" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607" +checksum = "139ae9aca7527f85f26dd76483eb38533fd84bd571065da1739656ef71c5ff5b" dependencies = [ "darling", "either", @@ -282,6 +300,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -366,10 +393,24 @@ name = "getrandom" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", ] [[package]] @@ -378,6 +419,26 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "halfbrown" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +dependencies = [ + "hashbrown", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "heck" version = "0.5.0" @@ -401,9 +462,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -412,9 +473,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -440,9 +501,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a73e9fe3c49d7afb2ace819fa181a287ce54a0983eda4e0eb05c22f82ffe534" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "itoap" @@ -452,18 +513,19 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "libc" -version = "0.2.164" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libmimalloc-sys" @@ -487,9 +549,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "md-5" @@ -518,9 +580,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] @@ -532,7 +594,7 @@ source = "git+https://github.com/fakeshadow/mio?rev=9bae6012b7ecfc6083350785f71a dependencies = [ "hermit-abi", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys", ] @@ -557,18 +619,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "parking_lot" @@ -601,27 +663,27 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_shared", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -631,9 +693,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "postgres-protocol" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" dependencies = [ "base64", "byteorder", @@ -649,9 +711,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ "bytes", "fallible-iterator", @@ -664,32 +726,33 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] name = "pq-sys" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cc05d7ea95200187117196eee9edd0644424911821aeb28a18ce60ea0b8793" +checksum = "30b51d65ebe1cb1f40641b15abae017fed35ccdda46e3dab1ff8768f625a3222" dependencies = [ + "libc", "vcpkg", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -707,20 +770,20 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ - "libc", "rand_chacha", "rand_core", + "zerocopy 0.8.20", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -728,20 +791,41 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" dependencies = [ - "getrandom", + "getrandom 0.3.1", + "zerocopy 0.8.20", ] [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", +] + +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -752,9 +836,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "sailfish" @@ -793,18 +877,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -813,9 +897,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -861,11 +945,59 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-json" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" +dependencies = [ + "getrandom 0.2.15", + "halfbrown", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + +[[package]] +name = "simd-json-derive" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde9e4ab4322320af4f9709170ca77dec74ef4e44db7c0600cf6f3d601b74cee" +dependencies = [ + "itoa", + "ryu", + "simd-json", + "simd-json-derive-int", + "thiserror", + "value-trait", +] + +[[package]] +name = "simd-json-derive-int" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cebcbb57e77f41aee1cef06b800c6c79288b133054a478135a9a0e8e79c938dd" +dependencies = [ + "proc-macro2", + "quote", + "simd-json", + "syn", + "thiserror", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" @@ -878,9 +1010,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" @@ -894,9 +1026,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys", @@ -927,20 +1059,40 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.87" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -953,9 +1105,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -964,15 +1116,15 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2 0.5.8", "windows-sys", ] [[package]] name = "tokio-postgres" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" dependencies = [ "async-trait", "byteorder", @@ -988,7 +1140,7 @@ dependencies = [ "postgres-protocol", "postgres-types", "rand", - "socket2 0.5.7", + "socket2 0.5.8", "tokio", "tokio-util", "whoami", @@ -1011,9 +1163,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -1024,9 +1176,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -1034,27 +1186,27 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-normalization" @@ -1071,6 +1223,18 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +[[package]] +name = "value-trait" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -1089,6 +1253,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasite" version = "0.1.0" @@ -1097,9 +1270,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", @@ -1108,13 +1281,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn", @@ -1123,9 +1295,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1133,9 +1305,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -1146,15 +1318,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -1266,10 +1441,19 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "xitca-codegen" version = "0.4.0" -source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" +source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" dependencies = [ "quote", "syn", @@ -1278,7 +1462,7 @@ dependencies = [ [[package]] name = "xitca-http" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" +source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" dependencies = [ "futures-core", "http", @@ -1286,7 +1470,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.8", "tokio", "tokio-uring", "tracing", @@ -1328,7 +1512,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" +source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" dependencies = [ "fallible-iterator", "futures-core", @@ -1366,9 +1550,9 @@ dependencies = [ [[package]] name = "xitca-server" version = "0.5.0" -source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" +source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" dependencies = [ - "socket2 0.5.7", + "socket2 0.5.8", "tokio", "tokio-uring", "tracing", @@ -1380,7 +1564,7 @@ dependencies = [ [[package]] name = "xitca-service" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" +source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" [[package]] name = "xitca-unsafe-collection" @@ -1407,6 +1591,8 @@ dependencies = [ "sailfish", "serde", "serde_json", + "simd-json", + "simd-json-derive", "tokio", "tokio-uring", "xitca-http", @@ -1422,7 +1608,7 @@ dependencies = [ [[package]] name = "xitca-web" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=3b005af#3b005af839ce718f9121d57788f5185296ceacf1" +source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" dependencies = [ "futures-core", "pin-project-lite", @@ -1444,7 +1630,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +dependencies = [ + "zerocopy-derive 0.8.20", ] [[package]] @@ -1457,3 +1652,14 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zerocopy-derive" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index acae496a4f2..64362b8eb1f 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "xitca-web" version = "0.1.0" -edition = "2021" +edition = "2024" [[bin]] name = "xitca-web" @@ -46,7 +46,7 @@ template = ["dep:sailfish"] # io-uring optional io-uring = ["dep:tokio-uring", "xitca-http/io-uring", "xitca-server/io-uring"] # unrealistic performance optimization -perf = ["dep:core_affinity", "dep:mimalloc", "tokio/parking_lot"] +perf = ["dep:core_affinity", "dep:mimalloc", "tokio/parking_lot", "simd-json", "simd-json-derive"] [dependencies] xitca-http = "0.7" @@ -83,11 +83,13 @@ tokio-uring = { version = "0.5", optional = true } # perf optional core_affinity = { version = "0.8.1", optional = true } mimalloc = { version = "0.1", default-features = false, optional = true } +simd-json = { version = "0.14", optional = true } +simd-json-derive = { version = "0.15", default-features = false, 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 } -rand = { version = "0.8", features = ["small_rng"] } +rand = { version = "0.9", features = ["os_rng", "small_rng"], default-features = false } tokio = "1.41" [profile.release] @@ -102,9 +104,9 @@ xitca-postgres-diesel = { git = "https://github.com/fakeshadow/xitca-postgres-di diesel-async = { git = "https://github.com/weiznich/diesel_async", rev = "5b8262b" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } -xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } -xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } -xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } -xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } -xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } -xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "3b005af" } +xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } +xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } +xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } +xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } +xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } +xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index abb9ef10870..b35affdc61b 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -3,14 +3,14 @@ mod db_util; use core::cell::RefCell; -use xitca_postgres::{iter::AsyncLendingIterator, pipeline::Pipeline, pool::Pool, statement::Statement, Execute}; +use xitca_postgres::{Execute, iter::AsyncLendingIterator, pipeline::Pipeline, pool::Pool, statement::Statement}; use super::{ ser::{Fortune, Fortunes, World}, - util::{HandleResult, DB_URL}, + util::{DB_URL, HandleResult}, }; -use db_util::{not_found, sort_update_params, update_query_from_num, Shared, FORTUNE_STMT, WORLD_STMT}; +use db_util::{FORTUNE_STMT, Shared, WORLD_STMT, not_found, sort_update_params, update_query_from_num}; pub struct Client { pool: Pool, diff --git a/frameworks/Rust/xitca-web/src/db_diesel.rs b/frameworks/Rust/xitca-web/src/db_diesel.rs index 1675a7c2cd1..f187afc54e1 100644 --- a/frameworks/Rust/xitca-web/src/db_diesel.rs +++ b/frameworks/Rust/xitca-web/src/db_diesel.rs @@ -10,7 +10,7 @@ use diesel::{prelude::*, r2d2}; use crate::{ ser::{Fortune, Fortunes, World}, - util::{HandleResult, Rand, DB_URL}, + util::{DB_URL, HandleResult, Rand}, }; use db_util::{not_found, update_query_from_ids}; diff --git a/frameworks/Rust/xitca-web/src/db_diesel_async.rs b/frameworks/Rust/xitca-web/src/db_diesel_async.rs index e3ee7e895fd..edae0afec03 100644 --- a/frameworks/Rust/xitca-web/src/db_diesel_async.rs +++ b/frameworks/Rust/xitca-web/src/db_diesel_async.rs @@ -5,8 +5,8 @@ use std::{io, sync::Mutex}; use diesel::prelude::*; use diesel_async::{ - pooled_connection::{bb8, AsyncDieselConnectionManager}, RunQueryDsl, + pooled_connection::{AsyncDieselConnectionManager, bb8}, }; use futures_util::{ future::join, @@ -16,7 +16,7 @@ use xitca_postgres_diesel::AsyncPgConnection; use crate::{ ser::{Fortune, Fortunes, World}, - util::{HandleResult, Rand, DB_URL}, + util::{DB_URL, HandleResult, Rand}, }; use db_util::{not_found, update_query_from_ids}; diff --git a/frameworks/Rust/xitca-web/src/db_unrealistic.rs b/frameworks/Rust/xitca-web/src/db_unrealistic.rs index 99e4249e39b..71e51e8e8f0 100644 --- a/frameworks/Rust/xitca-web/src/db_unrealistic.rs +++ b/frameworks/Rust/xitca-web/src/db_unrealistic.rs @@ -6,14 +6,14 @@ mod db_util; use std::cell::RefCell; -use xitca_postgres::{iter::AsyncLendingIterator, pipeline::Pipeline, statement::Statement, Execute}; +use xitca_postgres::{Execute, iter::AsyncLendingIterator, pipeline::Pipeline, statement::Statement}; use super::{ ser::{Fortune, Fortunes, World}, - util::{HandleResult, DB_URL}, + util::{DB_URL, HandleResult}, }; -use db_util::{not_found, sort_update_params, update_query_from_num, Shared, FORTUNE_STMT, WORLD_STMT}; +use db_util::{FORTUNE_STMT, Shared, WORLD_STMT, not_found, sort_update_params, update_query_from_num}; pub struct Client { cli: xitca_postgres::Client, @@ -36,7 +36,7 @@ pub async fn create() -> HandleResult { let mut updates = vec![Statement::default()]; - for update in (1..=500).map(update_query_from_num).into_iter() { + for update in (1..=500).map(update_query_from_num) { let stmt = Statement::named(&update, &[]).execute(&cli).await?.leak(); updates.push(stmt); } @@ -61,20 +61,18 @@ impl Client { pub async fn get_worlds(&self, num: u16) -> HandleResult> { let len = num as usize; - let mut res = Vec::with_capacity(len); - - { - let (ref mut rng, ..) = *self.shared.borrow_mut(); - for _ in 0..len { - let stream = self.world.bind([rng.gen_id()]).query(&self.cli).await?; - res.push(stream); - } + let mut res = { + let (ref mut rng, ref mut buf) = *self.shared.borrow_mut(); + // unrealistic as all queries are sent with only one sync point. + let mut pipe = Pipeline::unsync_with_capacity_from_buf(len, buf); + (0..num).try_for_each(|_| self.world.bind([rng.gen_id()]).query(&mut pipe))?; + pipe.query(&self.cli)? }; let mut worlds = Vec::with_capacity(len); - for mut stream in res { - let row = stream.try_next().await?.ok_or_else(not_found)?; + while let Some(mut item) = res.try_next().await? { + let row = item.try_next().await?.ok_or_else(not_found)?; worlds.push(World::new(row.get(0), row.get(1))); } diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index abe665f3715..e49e684cbb4 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -3,8 +3,9 @@ mod ser; mod util; use xitca_http::{ + HttpServiceBuilder, h1::RequestBody, - http::{header::SERVER, StatusCode}, + http::{StatusCode, header::SERVER}, util::{ middleware::context::{Context, ContextBuilder}, service::{ @@ -12,13 +13,12 @@ use xitca_http::{ router::{Router, RouterError}, }, }, - HttpServiceBuilder, }; -use xitca_service::{fn_service, Service, ServiceExt}; +use xitca_service::{Service, ServiceExt, fn_service}; use db::Client; -use ser::{error_response, IntoResponse, Message, Request, Response}; -use util::{HandleResult, QueryParse, State, SERVER_HEADER_VALUE}; +use ser::{IntoResponse, Message, Request, Response, error_response}; +use util::{HandleResult, QueryParse, SERVER_HEADER_VALUE, State}; type Ctx<'a> = Context<'a, Request, State>; @@ -30,8 +30,12 @@ fn main() -> std::io::Result<()> { .insert("/fortunes", get(fn_service(fortunes))) .insert("/queries", get(fn_service(queries))) .insert("/updates", get(fn_service(updates))) - .enclosed_fn(middleware) .enclosed(ContextBuilder::new(|| async { db::create().await.map(State::new) })) + .enclosed_fn(async |service, req| { + let mut res = service.call(req).await.unwrap_or_else(error_handler); + res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); + Ok::<_, core::convert::Infallible>(res) + }) .enclosed(HttpServiceBuilder::h1().io_uring()); xitca_server::Builder::new() .bind("xitca-web", "0.0.0.0:8080", service)? @@ -39,24 +43,14 @@ fn main() -> std::io::Result<()> { .wait() } -async fn middleware(service: &S, req: Ctx<'_>) -> Result -where - S: for<'c> Service, Response = Response, Error = RouterError>, -{ - let mut res = service.call(req).await.unwrap_or_else(error_handler); - res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); - Ok(res) -} - #[cold] #[inline(never)] fn error_handler(e: RouterError) -> Response { - let status = match e { + error_response(match e { RouterError::Match(_) => StatusCode::NOT_FOUND, RouterError::NotAllowed(_) => StatusCode::METHOD_NOT_ALLOWED, RouterError::Service(_) => StatusCode::INTERNAL_SERVER_ERROR, - }; - error_response(status) + }) } async fn plain_text(ctx: Ctx<'_>) -> HandleResult { diff --git a/frameworks/Rust/xitca-web/src/main_orm.rs b/frameworks/Rust/xitca-web/src/main_orm.rs index 86e8037ac2e..ed5a51069a7 100644 --- a/frameworks/Rust/xitca-web/src/main_orm.rs +++ b/frameworks/Rust/xitca-web/src/main_orm.rs @@ -3,17 +3,16 @@ mod schema; mod ser; mod util; -use serde::Serialize; use xitca_web::{ + App, codegen::route, handler::{html::Html, json::Json, query::Query, state::StateRef, text::Text}, - http::{header::SERVER, WebResponse}, + http::{WebResponse, header::SERVER}, route::get, - App, }; use db_diesel_async::Pool; -use ser::Num; +use ser::{Num, World}; use util::{HandleResult, SERVER_HEADER_VALUE}; fn main() -> std::io::Result<()> { @@ -39,7 +38,7 @@ fn header(mut res: WebResponse) -> WebResponse { } #[route("/db", method = get)] -async fn db(StateRef(pool): StateRef<'_, Pool>) -> HandleResult> { +async fn db(StateRef(pool): StateRef<'_, Pool>) -> HandleResult> { pool.get_world().await.map(Json) } @@ -51,17 +50,11 @@ async fn fortunes(StateRef(pool): StateRef<'_, Pool>) -> HandleResult, - StateRef(pool): StateRef<'_, Pool>, -) -> HandleResult> { +async fn queries(Query(Num(num)): Query, StateRef(pool): StateRef<'_, Pool>) -> HandleResult>> { pool.get_worlds(num).await.map(Json) } #[route("/updates", method = get)] -async fn updates( - Query(Num(num)): Query, - StateRef(pool): StateRef<'_, Pool>, -) -> HandleResult> { +async fn updates(Query(Num(num)): Query, StateRef(pool): StateRef<'_, Pool>) -> HandleResult>> { pool.update(num).await.map(Json) } diff --git a/frameworks/Rust/xitca-web/src/main_sync.rs b/frameworks/Rust/xitca-web/src/main_sync.rs index ae49ebf5827..48ac2520bd1 100644 --- a/frameworks/Rust/xitca-web/src/main_sync.rs +++ b/frameworks/Rust/xitca-web/src/main_sync.rs @@ -5,11 +5,11 @@ mod util; use serde::Serialize; use xitca_web::{ + App, codegen::route, handler::{html::Html, json::Json, query::Query, state::StateOwn, text::Text}, - http::{header::SERVER, WebResponse}, + http::{WebResponse, header::SERVER}, route::get, - App, }; use db_diesel::Pool; diff --git a/frameworks/Rust/xitca-web/src/main_unrealistic.rs b/frameworks/Rust/xitca-web/src/main_unrealistic.rs index a4f9223ba44..18dc72a9847 100644 --- a/frameworks/Rust/xitca-web/src/main_unrealistic.rs +++ b/frameworks/Rust/xitca-web/src/main_unrealistic.rs @@ -18,6 +18,9 @@ use xitca_http::{ http::StatusCode, }; use xitca_service::Service; +// simd-json crate is realistic approach to json serializer. +// That said xitca-web by default utilize serde-json as serializer making it an unrealistic representation of framework performance +use simd_json_derive::Serialize; use self::{ ser::Message, @@ -106,7 +109,7 @@ async fn handler<'h>(req: Request<'h, State>, res: Response<'h>) -> .header("server", "X") // unrealistic content length header. .header("content-length", "27") - .body_writer(|buf| serde_json::to_writer(BufMutWriter(buf), &Message::new()).unwrap()), + .body_writer(|buf| Message::new().json_write(&mut BufMutWriter(buf)).unwrap()), // all database related categories are unrealistic. please reference db_unrealistic module for detail. "/fortunes" => { @@ -139,10 +142,10 @@ async fn handler<'h>(req: Request<'h, State>, res: Response<'h>) -> fn json_response<'r, DB, T>(res: Response<'r>, state: &State, val: &T) -> Response<'r, 3> where - T: serde::Serialize, + T: Serialize, { let buf = &mut *state.write_buf.borrow_mut(); - serde_json::to_writer(BufMutWriter(buf), val).unwrap(); + val.json_write(&mut BufMutWriter(buf)).unwrap(); let res = res .status(StatusCode::OK) .header("content-type", "application/json") diff --git a/frameworks/Rust/xitca-web/src/main_wasm.rs b/frameworks/Rust/xitca-web/src/main_wasm.rs index 4a38435a151..ec06d5dec68 100644 --- a/frameworks/Rust/xitca-web/src/main_wasm.rs +++ b/frameworks/Rust/xitca-web/src/main_wasm.rs @@ -1,18 +1,20 @@ mod ser; mod util; +use std::os::wasi::io::FromRawFd; + use xitca_web::{ + App, handler::{json::Json, text::Text}, - http::{header::SERVER, WebResponse}, + http::{WebResponse, header::SERVER}, route::get, - App, }; fn main() -> std::io::Result<()> { let listener = std::env::var("FD_COUNT") .ok() .and_then(|v| v.parse().ok()) - .map(|fd| unsafe { std::os::wasi::io::FromRawFd::from_raw_fd(fd) }) + .map(|fd| unsafe { std::net::TcpListener::from_raw_fd(fd) }) .expect("failed to parse FD_COUNT env"); App::new() diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index edf9183a8c0..8eadc873e2c 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -2,15 +2,14 @@ use std::borrow::Cow; -use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; +use serde::{Deserialize, Deserializer, Serialize, Serializer, ser::SerializeStruct}; use xitca_http::{ body::Once, bytes::{BufMutWriter, Bytes}, http::{ - self, + self, IntoResponse as _, RequestExt, StatusCode, const_header_value::{JSON, TEXT_HTML_UTF8, TEXT_UTF8}, header::CONTENT_TYPE, - IntoResponse as _, RequestExt, StatusCode, }, }; @@ -19,6 +18,7 @@ use crate::util::{Error, State}; const HELLO: &str = "Hello, World!"; const HELLO_BYTES: &[u8] = HELLO.as_bytes(); +#[cfg_attr(feature = "perf", derive(simd_json_derive::Serialize))] #[derive(Clone)] pub struct Message { message: &'static str, @@ -34,6 +34,7 @@ impl Message { pub struct Num(pub u16); #[cfg_attr(any(feature = "pg-orm", feature = "pg-orm-async"), derive(diesel::Queryable))] +#[cfg_attr(feature = "perf", derive(simd_json_derive::Serialize))] pub struct World { pub id: i32, pub randomnumber: i32, @@ -124,7 +125,7 @@ impl<'de> Deserialize<'de> for Num { { struct FieldVisitor; - impl<'de> Visitor<'de> for FieldVisitor { + impl Visitor<'_> for FieldVisitor { type Value = Field; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index 3998a2ef1ec..f4764a4a34c 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -47,20 +47,20 @@ impl State { #[cfg(not(target_arch = "wasm32"))] pub mod non_wasm { - use rand::{rngs::SmallRng, Rng, SeedableRng}; + use rand::{Rng, SeedableRng, rngs::SmallRng}; pub struct Rand(SmallRng); impl Default for Rand { fn default() -> Self { - Self(SmallRng::from_entropy()) + Self(SmallRng::from_os_rng()) } } impl Rand { #[inline] pub fn gen_id(&mut self) -> i32 { - self.0.gen_range(1..=10000) + self.0.random_range(1..=10000) } } } diff --git a/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile b/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile index 06e40825b00..b50a348dcd2 100644 --- a/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.81 +FROM rust:1.85 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 ad2602a8606..cf951f74e47 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.81 +FROM rust:1.85 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile b/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile index f202947acc0..50aa44a4bc0 100644 --- a/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.81 +FROM rust:1.85 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 1c22986b0a2..16d96cfafc5 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-wasip1-threads -FROM rust:1.81 AS compile +FROM rust:1.85 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 d928183362f..0a4f87e8423 100644 --- a/frameworks/Rust/xitca-web/xitca-web.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.81 +FROM rust:1.85 ADD ./ /xitca-web WORKDIR /xitca-web From 027150a46f1c5ff1945431ec75cdc9a5874e801f Mon Sep 17 00:00:00 2001 From: pim Date: Mon, 3 Mar 2025 09:26:57 -0500 Subject: [PATCH 1163/1766] =?UTF-8?q?=F0=9F=90=A6=20Falco=20v5.x=20(#9580)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/FSharp/falco/README.md | 10 +- frameworks/FSharp/falco/benchmark_config.json | 2 +- frameworks/FSharp/falco/falco.dockerfile | 8 +- frameworks/FSharp/falco/src/App/App.fsproj | 11 +-- frameworks/FSharp/falco/src/App/Fortune.fs | 83 ---------------- frameworks/FSharp/falco/src/App/Program.fs | 97 ++++++++++++++++--- frameworks/FSharp/falco/src/App/Server.fs | 47 --------- frameworks/FSharp/falco/src/App/UI.fs | 11 --- 8 files changed, 99 insertions(+), 170 deletions(-) delete mode 100644 frameworks/FSharp/falco/src/App/Fortune.fs delete mode 100644 frameworks/FSharp/falco/src/App/Server.fs delete mode 100644 frameworks/FSharp/falco/src/App/UI.fs diff --git a/frameworks/FSharp/falco/README.md b/frameworks/FSharp/falco/README.md index 3b954590d09..6c534e885d0 100644 --- a/frameworks/FSharp/falco/README.md +++ b/frameworks/FSharp/falco/README.md @@ -1,11 +1,12 @@ # Falco Tests on Linux + This includes tests for plaintext, json, and fortunes HTML serialization. ## Infrastructure Software Versions **Language** -* F# 6.0 +* F# 6.0 (or greater) **Platforms** @@ -18,11 +19,10 @@ This includes tests for plaintext, json, and fortunes HTML serialization. **Web Stack** * [Falco](https://github.com/pimbrouwers/Falco) -* [Donald](https://github.com/pimbrouwers/Donald) * ASP.NET Core ## Paths & Source for Tests -* [Plaintext](src/App/Value.fs): "/plaintext" -* [JSON serialization](src/App/Value.fs): "/json" -* [Fortunes using Donald](src/App/Fortune.fs): "/fortunes" +* [Plaintext](src/App/Program.fs): "/plaintext" +* [JSON serialization](src/App/Program.fs): "/json" +* [Fortunes using Donald](src/App/Program.fs): "/fortunes" diff --git a/frameworks/FSharp/falco/benchmark_config.json b/frameworks/FSharp/falco/benchmark_config.json index 8e77080c1a5..230dbdc8864 100644 --- a/frameworks/FSharp/falco/benchmark_config.json +++ b/frameworks/FSharp/falco/benchmark_config.json @@ -18,7 +18,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "Falco, Donald", + "display_name": "Falco", "notes": "", "versus": "aspcore" } diff --git a/frameworks/FSharp/falco/falco.dockerfile b/frameworks/FSharp/falco/falco.dockerfile index b0c2d9ec661..54e170d82f9 100644 --- a/frameworks/FSharp/falco/falco.dockerfile +++ b/frameworks/FSharp/falco/falco.dockerfile @@ -1,12 +1,12 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0.100 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime # Full PGO -ENV DOTNET_TieredPGO 1 -ENV DOTNET_TC_QuickJitForLoops 1 +ENV DOTNET_TieredPGO 1 +ENV DOTNET_TC_QuickJitForLoops 1 ENV DOTNET_ReadyToRun 0 ENV ASPNETCORE_URLS http://+:8080 diff --git a/frameworks/FSharp/falco/src/App/App.fsproj b/frameworks/FSharp/falco/src/App/App.fsproj index 437c5ae6329..d6b5bd70732 100644 --- a/frameworks/FSharp/falco/src/App/App.fsproj +++ b/frameworks/FSharp/falco/src/App/App.fsproj @@ -1,7 +1,7 @@  - net7.0 + net9.0 portable App Exe @@ -11,17 +11,12 @@ - - - - - - - + + diff --git a/frameworks/FSharp/falco/src/App/Fortune.fs b/frameworks/FSharp/falco/src/App/Fortune.fs deleted file mode 100644 index 080a4c0a2b4..00000000000 --- a/frameworks/FSharp/falco/src/App/Fortune.fs +++ /dev/null @@ -1,83 +0,0 @@ -module App.Fortune - -open System.Data -open System.Threading.Tasks -open Donald -open Falco - -type FortuneModel = - { - id : int - message : string - } - -module FortuneModel = - let fromDataReader (rd : IDataReader) = - { - id = rd.GetInt32("id") - message = rd.GetString("message") - } - -module Service = - module ListQuery = - type LoadFortunes = unit -> Task - - let extraFortune = - { - id = 0 - message = "Additional fortune added at request time." - } - - let handle - (loadFortunes : LoadFortunes) = - fun () -> - task { - let! fortunes = loadFortunes () - - return - extraFortune - :: fortunes - |> List.sortBy (fun f -> f.message) - } - - -module Db = - let selectAsync (connection : IDbConnection) : Task = - queryAsync - "SELECT id, message FROM fortune" - [] - FortuneModel.fromDataReader - connection - -module View = - open Falco.Markup - - let index (fortunes : FortuneModel list) = - UI.layout "Fortunes" [ - Elem.table [] [ - yield Elem.tr [] [ - Elem.th [] [ Text.raw "id" ] - Elem.th [] [ Text.raw "message" ] - ] - for fortune in fortunes -> - Elem.tr [] [ - Elem.td [] [ Text.raw (string fortune.id) ] - Elem.td [] [ Text.enc fortune.message] - ] - ] - ] - -let handleIndex : HttpHandler = - fun ctx -> - task { - let connFactory = ctx.GetService() - use conn = createConn connFactory - let selectFortunes = fun () -> Db.selectAsync conn - let! fortunes = () |> Service.ListQuery.handle selectFortunes - - return! - ctx - |> (fortunes - |> View.index - |> Response.ofHtml) - } :> Task diff --git a/frameworks/FSharp/falco/src/App/Program.fs b/frameworks/FSharp/falco/src/App/Program.fs index e91b068ad7e..6a974bfc230 100644 --- a/frameworks/FSharp/falco/src/App/Program.fs +++ b/frameworks/FSharp/falco/src/App/Program.fs @@ -1,7 +1,12 @@ module Program +open System.Data open Falco -open App +open Falco.Markup +open Falco.Routing +open Microsoft.AspNetCore.Builder +open Microsoft.Extensions.Logging +open Npgsql [] let connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" @@ -9,16 +14,86 @@ let connectionString = "Server=tfb-database;Database=hello_world;User Id=benchma [] let defaultMsg = "Hello, World!" -type JsonModel = { message : string } +type JsonResponse = + { message : string } + +type Fortune = + { id : int + message : string } + + static member Default = + { id = 0 + message = "Additional fortune added at request time." } + +let handleFortunes (connStr : string) : HttpHandler = fun ctx -> task { + use conn = new NpgsqlConnection(connStr) + + use comd = conn.CreateCommand() + comd.CommandText <- "SELECT id, message FROM fortune" + + do! conn.OpenAsync() + use! redr = comd.ExecuteReaderAsync(CommandBehavior.SequentialAccess) + + let! dbFortunes = + task { + let mutable shouldContinue = true + let fortunes = ResizeArray() + + while shouldContinue do + let! fortunesRead = redr.ReadAsync() + + if not fortunesRead then + shouldContinue <- false + else + fortunes.Add { id = redr.GetInt32(0) + message = redr.GetString(1) } + return fortunes |> List.ofSeq + } + + redr.Dispose() + comd.Dispose() + conn.Dispose() + + let sortedFortunes = + Fortune.Default :: + dbFortunes + |> List.sortBy (fun f -> f.message) + + let html = + Elem.html [] [ + Elem.head [] [ + Elem.title [] [ Text.raw "Fortunes" ] + ] + Elem.body [] [ + Elem.table [] [ + yield Elem.tr [] [ + Elem.th [] [ Text.raw "id" ] + Elem.th [] [ Text.raw "message" ] + ] + for fortune in sortedFortunes -> + Elem.tr [] [ + Elem.td [] [ Text.raw (string fortune.id) ] + Elem.td [] [ Text.enc fortune.message] + ] + ] + ] + ] + + return Response.ofHtml html ctx +} [] -let main args = - Host.startWebHost - args - (Server.configure connectionString) - [ - get "/plaintext" (Response.ofPlainText defaultMsg) - get "/json" (Response.ofJson { message = defaultMsg }) - get "/fortunes" Fortune.handleIndex - ] +let main args = + let bldr = WebApplication.CreateBuilder(args) + bldr.Logging.ClearProviders() |> ignore + + let wapp = bldr.Build() + + wapp.UseRouting() + .UseFalco([ + get "/plaintext" (Response.ofPlainText defaultMsg) + get "/json" (Response.ofJson { message = defaultMsg }) + get "/fortunes" (handleFortunes connectionString) + ]) + .Run() 0 \ No newline at end of file diff --git a/frameworks/FSharp/falco/src/App/Server.fs b/frameworks/FSharp/falco/src/App/Server.fs deleted file mode 100644 index dd4125b2230..00000000000 --- a/frameworks/FSharp/falco/src/App/Server.fs +++ /dev/null @@ -1,47 +0,0 @@ -module App.Server - -open System.Data -open Donald -open Falco -open Falco.Host -open Microsoft.AspNetCore.Builder -open Microsoft.AspNetCore.Hosting -open Microsoft.Extensions.DependencyInjection -open Microsoft.Extensions.Logging -open Npgsql - -type ConnectionString = string -type ConfigureLogging = ILoggingBuilder -> unit -type ConfigureServices = DbConnectionFactory -> IServiceCollection -> unit -type ConfigureApp = HttpEndpoint list -> IApplicationBuilder -> unit -type ConfigureServer = ConnectionString -> ConfigureWebHost - -let configure : ConfigureServer = - let configureLogging : ConfigureLogging = - fun log -> - log.ClearProviders() - |> ignore - - let configureServices : ConfigureServices = - fun connectionFactory services -> - services - .AddRouting() - .AddSingleton(connectionFactory) - |> ignore - - let configure : ConfigureApp = - fun endpoints app -> - app.UseRouting() - .UseHttpEndPoints(endpoints) - |> ignore - - fun connectionString endpoints webHost -> - let connectionFactory = - fun () -> new NpgsqlConnection(connectionString) :> IDbConnection - - webHost - .UseKestrel() - .ConfigureLogging(configureLogging) - .ConfigureServices(configureServices connectionFactory) - .Configure(configure endpoints) - |> ignore \ No newline at end of file diff --git a/frameworks/FSharp/falco/src/App/UI.fs b/frameworks/FSharp/falco/src/App/UI.fs deleted file mode 100644 index aa3a4bc85da..00000000000 --- a/frameworks/FSharp/falco/src/App/UI.fs +++ /dev/null @@ -1,11 +0,0 @@ -module App.UI - -open Falco.Markup - -let layout pageTitle content = - Elem.html [] [ - Elem.head [] [ - Elem.title [] [ Text.raw pageTitle ] - ] - Elem.body [] content - ] \ No newline at end of file From 6f8ba24f4f4703c2e17897adcf8a0618f3d365ac Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:27:04 +0100 Subject: [PATCH 1164/1766] [ruby] Only install optional gems (#9574) This should reduce build times slightly. --- frameworks/Ruby/rack-sequel/Gemfile | 10 +++++----- .../rack-sequel/rack-sequel-passenger-mri.dockerfile | 2 +- .../rack-sequel-postgres-passenger-mri.dockerfile | 2 +- .../rack-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../Ruby/rack-sequel/rack-sequel-postgres.dockerfile | 2 +- .../rack-sequel/rack-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 2 +- frameworks/Ruby/roda-sequel/Gemfile | 4 ++-- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 ++ .../roda-sequel-postgres-iodine-mri.dockerfile | 2 +- .../roda-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile | 1 - 14 files changed, 19 insertions(+), 18 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index d427bd4ef4e..11db7de0ce2 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -4,26 +4,26 @@ gem 'json', '~> 2.8' gem 'sequel', '~> 5.0' gem 'rack', '~> 3.0' -group :mysql do +group :mysql, optional: true do gem 'jdbc-mysql', '~> 5.1', platforms: :jruby, require: 'jdbc/mysql' gem 'mysql2', '~> 0.4', platforms: [:ruby, :mswin] end -group :postgresql do +group :postgresql, optional: true do gem 'jdbc-postgres', '~> 9.4', platforms: :jruby, require: 'jdbc/postgres' gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false end -group :passenger do +group :passenger, optional: true do gem 'base64' # required by passenger on Ruby 3.4 gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false end -group :puma do +group :puma, optional: true do gem 'puma', '~> 6.4', require: false end -group :unicorn do +group :unicorn, optional: true do gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false end diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index 9b862f3f239..7583be33de6 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 -RUN bundle config set without 'postgresql puma unicorn' +RUN bundle config set with 'mysql passenger' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 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 b8352b5dcdc..8ea750bd282 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 -RUN bundle config set without 'mysql puma unicorn' +RUN bundle config set with 'postgresql passenger' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile # TODO: https://github.com/phusion/passenger/issues/1916 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 ba8425fd1bc..e7271257774 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 -RUN bundle config set without 'mysql passenger puma' +RUN bundle config set with 'postgresql unicorn' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index 26018f4bc3a..ac998e5fa9b 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 -RUN bundle config set without 'mysql passenger unicorn' +RUN bundle config set with 'postgresql puma' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile index c602df71030..bc49545a709 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 -RUN bundle config set without 'postgresql passenger puma' +RUN bundle config set with 'mysql unicorn' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index d283076458f..1c87d624525 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 -RUN bundle config set without 'postgresql passenger unicorn' +RUN bundle config set with 'mysql puma' RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=mysql diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 5e391a9907a..d021a2b4bb9 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -7,11 +7,11 @@ gem "sequel", "~> 5.67" gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" -group :mysql do +group :mysql, optional: true do gem "mysql2", "~> 0.5", platforms: %i[ruby mswin] end -group :postgresql do +group :postgresql, optional: true do gem "pg", "~> 1.4", platforms: %i[ruby mswin] gem "sequel_pg", "~> 1.17", platforms: :ruby, require: false end diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 4313d0850a9..283bf222111 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -4,6 +4,7 @@ GEM base64 (0.2.0) bigdecimal (3.1.8) erubi (1.13.0) + iodine (0.7.58) json (2.9.1) kgio (2.11.4) mysql2 (0.5.6) @@ -32,6 +33,7 @@ PLATFORMS DEPENDENCIES base64 erubi (~> 1.12) + iodine (~> 0.7) json (~> 2.8) mysql2 (~> 0.5) pg (~> 1.4) diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile index c7f9fe856d1..850c7fe36f9 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set with 'iodine' +RUN bundle config set with 'postgresql iodine' RUN bundle install --jobs=8 ENV DBTYPE=postgresql 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 9e3156a0594..035f02cc40a 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set with 'unicorn' +RUN bundle config set with 'postgresql unicorn' RUN bundle install --jobs=8 ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile index 1aee2de12a7..6c731ee6b97 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set with 'puma' +RUN bundle config set with 'postgresql puma' RUN bundle install --jobs=8 ENV DBTYPE=postgresql diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index eba22e96477..02319f0499d 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && \ ENV LD_PRELOAD=libjemalloc.so.2 ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set with 'puma' +RUN bundle config set with 'mysql puma' RUN bundle install --jobs=8 ENV DBTYPE=mysql diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 3395ce7f853..4b906cf4be1 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -13,7 +13,6 @@ group :postgresql, optional: true do gem 'sequel_pg', '~> 1.6', :platforms=>:ruby, :require=>false end - group :iodine, optional: true do gem 'iodine', '~> 0.7', platforms: [:ruby, :mswin], require: false end From 8ff228e928901fd43a0c4a97c22ac91aaa834c36 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:27:13 +0100 Subject: [PATCH 1165/1766] [rails] Return plain json from route (#9573) Return JSON from the routes is a lot faster: +------------+------------------------------+------+ | name| branch_name| json| +------------+------------------------------+------+ |rails-iodine| master|105369| |rails-iodine| rails/json-from-route|144006| +------------+------------------------------+------+ --- .../application_controller_metal.rb | 8 --- .../rails/app/controllers/json_controller.rb | 9 ---- frameworks/Ruby/rails/config/routes.rb | 54 +++++++++++++++---- 3 files changed, 44 insertions(+), 27 deletions(-) delete mode 100644 frameworks/Ruby/rails/app/controllers/application_controller_metal.rb delete mode 100644 frameworks/Ruby/rails/app/controllers/json_controller.rb diff --git a/frameworks/Ruby/rails/app/controllers/application_controller_metal.rb b/frameworks/Ruby/rails/app/controllers/application_controller_metal.rb deleted file mode 100644 index b26d9c470cd..00000000000 --- a/frameworks/Ruby/rails/app/controllers/application_controller_metal.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -class ApplicationControllerMetal < ActionController::Metal - def add_headers - response.set_header('Server', 'rails') - response.set_header('Date', Time.now.httpdate) - end -end diff --git a/frameworks/Ruby/rails/app/controllers/json_controller.rb b/frameworks/Ruby/rails/app/controllers/json_controller.rb deleted file mode 100644 index 1a87495f93c..00000000000 --- a/frameworks/Ruby/rails/app/controllers/json_controller.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -class JsonController < ApplicationControllerMetal - def index - add_headers - self.content_type = 'application/json' - self.response_body = { 'message' => 'Hello, World!' }.to_json - end -end diff --git a/frameworks/Ruby/rails/config/routes.rb b/frameworks/Ruby/rails/config/routes.rb index 70b58d84bfc..33afbfbcdda 100644 --- a/frameworks/Ruby/rails/config/routes.rb +++ b/frameworks/Ruby/rails/config/routes.rb @@ -1,19 +1,53 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - get "json", to: JsonController.action(:index) + JsonApp = if defined?(Falcon) || defined?(Puma) || defined?(Agoo) + ->(env) do + [200, + { + 'Server' => 'Rails', + 'Content-Type' => 'application/json', + 'Date' => Time.now.httpdate, + }, + [{ 'message' => 'Hello, World!' }.to_json]] + end + else + ->(env) do + [200, + { + 'Server' => 'Rails', + 'Content-Type' => 'application/json' + }, + [{ 'message' => 'Hello, World!' }.to_json]] + end + end + + PlaintextApp = if defined?(Falcon) || defined?(Puma) || defined?(Agoo) + ->(env) do + [200, + { + 'Server' => 'Rails', + 'Content-Type' => 'text/plain', + 'Date' => Time.now.httpdate + }, + ['Hello, World!']] + end + else + ->(env) do + [200, + { + 'Server' => 'Rails', + 'Content-Type' => 'text/plain' + }, + ['Hello, World!']] + end + end + + get "json", to: JsonApp get "db", to: "hello_world#db" get "queries", to: "hello_world#query" get "fortunes", to: "hello_world#fortune" get "updates", to: "hello_world#update" - get "plaintext", to: ->(env) do - [200, - { - 'Content-Type' => 'text/plain', - 'Date' => Time.now.httpdate, - 'Server' => 'Rails' - }, - ['Hello, World!']] - end + get "plaintext", to: PlaintextApp get "cached", to: "hello_world#cached_query" end From a5703ffcf5c0659ae41461923e32891754268288 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:27:23 +0100 Subject: [PATCH 1166/1766] [ruby/roda-sequel] Only set headers not created by servers (#9571) Servers like Iodine sets the `Date` header itself. +------------------------------------+------+-----+-----+------+-------+---------+--------------+ | branch_name| json| db|query|update|fortune|plaintext|weighted_score| +------------------------------------+------+-----+-----+------+-------+---------+--------------+ | master|213942|52774|37141| 22971| 49660| 227545| 2923| |roda-sequel/remove-redundant-headers|280527|89348|61538| 24688| 57966| 335448| 3752| +------------------------------------+------+-----+-----+------+-------+---------+--------------+ --- frameworks/Ruby/roda-sequel/hello_world.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index c05354e2097..387e0187034 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -15,9 +15,19 @@ def rand1 rand(MAX_PK) + 1 end + if defined?(Puma) + def set_default_headers(response) + response[DATE_HEADER] = Time.now.httpdate + response[SERVER_HEADER] = SERVER_STRING + end + else + def set_default_headers(response) + response[SERVER_HEADER] = SERVER_STRING + end + end + route do |r| - response[DATE_HEADER] = Time.now.httpdate - response[SERVER_HEADER] = SERVER_STRING if SERVER_STRING + set_default_headers(response) # Test type 1: JSON serialization r.is "json" do From befd25d691c363780864c5d772872f2863be1703 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:27:28 +0100 Subject: [PATCH 1167/1766] [ruby/rack-sequel] Only set headers not created by servers (#9570) Some servers already set the 'Date' or 'Content-Length' headers. +-----------+------------------------------------+-----+-----+------+-------+--------------+ | name| branch_name| db|query|update|fortune|weighted_score| +-----------+------------------------------------+-----+-----+------+-------+--------------+ |rack-sequel| master|44962|19605| 10677| 34058| 1373| |rack-sequel|rack-sequel/remove-redundant-headers|45573|20403| 12342| 34488| 1507| +-----------+------------------------------------+-----+-----+------+-------+--------------+ --- frameworks/Ruby/rack-sequel/boot.rb | 24 ----- frameworks/Ruby/rack-sequel/hello_world.rb | 106 +++++++++++++++------ 2 files changed, 75 insertions(+), 55 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index 609e3dacceb..7c28556dfe3 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -1,31 +1,7 @@ # frozen_string_literal: true require 'bundler/setup' -require 'time' -MAX_PK = 10_000 -ID_RANGE = (1..10_000).freeze -ALL_IDS = ID_RANGE.to_a -QUERIES_MIN = 1 -QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true -CONTENT_TYPE = 'Content-Type' -JSON_TYPE = 'application/json' -HTML_TYPE = 'text/html; charset=utf-8' -PLAINTEXT_TYPE = 'text/plain' -DATE_HEADER = 'Date' -SERVER_HEADER = 'Server' - -SERVER_STRING = - if defined?(PhusionPassenger) - [ - PhusionPassenger::SharedConstants::SERVER_TOKEN_NAME, - PhusionPassenger::VERSION_STRING - ].join('/').freeze - elsif defined?(Puma) - Puma::Const::PUMA_SERVER_STRING - elsif defined?(Unicorn) - Unicorn::HttpParser::DEFAULTS['SERVER_SOFTWARE'] - end Bundler.require(:default) # Load core modules diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index dbda8902f90..37674cba883 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -1,12 +1,31 @@ # frozen_string_literal: true +require 'time' # Our Rack application to be executed by rackup class HelloWorld - DEFAULT_HEADERS = {}.tap do |h| - h[SERVER_HEADER] = SERVER_STRING if SERVER_STRING - - h.freeze - end + MAX_PK = 10_000 + ID_RANGE = (1..10_000).freeze + ALL_IDS = ID_RANGE.to_a + QUERIES_MIN = 1 + QUERIES_MAX = 500 + CONTENT_TYPE = 'Content-Type' + CONTENT_LENGTH = 'Content-Length' + JSON_TYPE = 'application/json' + HTML_TYPE = 'text/html; charset=utf-8' + PLAINTEXT_TYPE = 'text/plain' + DATE = 'Date' + SERVER = 'Server' + SERVER_STRING = if defined?(PhusionPassenger) + 'Passenger' + elsif defined?(Puma) + 'Puma' + elsif defined?(Iodine) + 'Iodine' + elsif defined?(Unicorn) + 'Unicorn' + else + 'Ruby Rack' + end def bounded_queries(env) params = Rack::Utils.parse_query(env['QUERY_STRING']) @@ -87,35 +106,60 @@ def updates(env) end def call(env) - content_type, *body = - case env['PATH_INFO'] - when '/json' - # Test type 1: JSON serialization - [JSON_TYPE, { message: 'Hello, World!' }.to_json] - when '/db' - # Test type 2: Single database query - [JSON_TYPE, db.to_json] - when '/queries' - # Test type 3: Multiple database queries - [JSON_TYPE, queries(env).to_json] - when '/fortunes' - # Test type 4: Fortunes - [HTML_TYPE, fortunes] - when '/updates' - # Test type 5: Database updates - [JSON_TYPE, updates(env).to_json] - when '/plaintext' - # Test type 6: Plaintext - [PLAINTEXT_TYPE, 'Hello, World!'] - end + case env['PATH_INFO'] + when '/json' + # Test type 1: JSON serialization + respond JSON_TYPE, { message: 'Hello, World!' }.to_json + when '/db' + # Test type 2: Single database query + respond JSON_TYPE, db.to_json + when '/queries' + # Test type 3: Multiple database queries + respond JSON_TYPE, queries(env).to_json + when '/fortunes' + # Test type 4: Fortunes + respond HTML_TYPE, fortunes + when '/updates' + # Test type 5: Database updates + respond JSON_TYPE, updates(env).to_json + when '/plaintext' + # Test type 6: Plaintext + respond PLAINTEXT_TYPE, 'Hello, World!' + end + end + + private + def respond(content_type, body) [ 200, - DEFAULT_HEADERS.merge( - CONTENT_TYPE => content_type, - DATE_HEADER => Time.now.httpdate - ), - body + headers(content_type, body), + [body] ] end + + if defined?(Unicorn) + def headers(content_type, body) + { + CONTENT_TYPE => content_type, + SERVER => SERVER_STRING, + CONTENT_LENGTH => body.bytesize.to_s + } + end + elsif defined?(Puma) + def headers(content_type, _) + { + CONTENT_TYPE => content_type, + SERVER => SERVER_STRING, + DATE => Time.now.utc.httpdate + } + end + else + def headers(content_type, _) + { + CONTENT_TYPE => content_type, + SERVER => SERVER_STRING + } + end + end end From 3c1f93380c7c086290e55149b3a1c83edf23fb0a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Mar 2025 15:27:33 +0100 Subject: [PATCH 1168/1766] [ruby/rack] Only set headers not created by servers (#9569) +------------+------------------------------------+------+-----+-----+------+-------+---------+--------------+ | name| branch_name| json| db|query|update|fortune|plaintext|weighted_score| +------------+------------------------------------+------+-----+-----+------+-------+---------+--------------+ | rack-iodine| master|272762|92478|82287| 25252| 76641| 356731| 4319| | rack-iodine|rack/remove-redundant-content-length|329655|95705|83260| 25488| 80504| 498301| 4458| +------------+------------------------------------+------+-----+-----+------+-------+---------+--------------+ --- frameworks/Ruby/agoo/app.rb | 1 - frameworks/Ruby/rack/hello_world.rb | 53 ++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index cd4f7165a31..c288cffa9fe 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -21,7 +21,6 @@ QUERIES_MAX = 500 CONTENT_TYPE = 'Content-Type' -CONTENT_LENGTH = 'Content-Length' DATE = 'Date' SERVER = 'Server' SERVER_STRING = 'Agoo' diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index ec6655c2f2c..fa1b0fa6e60 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -25,9 +25,7 @@ class HelloWorld PLAINTEXT_TYPE = 'text/plain' DATE = 'Date' SERVER = 'Server' - SERVER_STRING = if defined?(PhusionPassenger) - 'Passenger' - elsif defined?(Puma) + SERVER_STRING = if defined?(Puma) 'Puma' elsif defined?(Iodine) 'Iodine' @@ -64,20 +62,6 @@ def initialize @db = PgDb.new(DEFAULT_DATABASE_URL, max_connections) end - def respond(content_type, body = '') - headers = { - CONTENT_TYPE => content_type, - DATE => Time.now.utc.httpdate, - SERVER => SERVER_STRING - } - headers[CONTENT_LENGTH] = body.bytesize.to_s if defined?(Unicorn) - [ - 200, - headers, - [body] - ] - end - def fortunes fortunes = @db.select_fortunes fortunes << { id: 0, message: 'Additional fortune added at request time.' } @@ -118,4 +102,39 @@ def call(env) respond PLAINTEXT_TYPE, 'Hello, World!' end end + + private + + def respond(content_type, body) + [ + 200, + headers(content_type, body), + [body] + ] + end + + if defined?(Unicorn) + def headers(content_type, body) + { + CONTENT_TYPE => content_type, + SERVER => SERVER_STRING, + CONTENT_LENGTH => body.bytesize.to_s + } + end + elsif defined?(Falcon) || defined?(Puma) + def headers(content_type, _) + { + CONTENT_TYPE => content_type, + SERVER => SERVER_STRING, + DATE => Time.now.utc.httpdate + } + end + else + def headers(content_type, _) + { + CONTENT_TYPE => content_type, + SERVER => SERVER_STRING + } + end + end end From 51a63ae2fa7500fe47004880c16d77073af96b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Mon, 3 Mar 2025 15:27:43 +0100 Subject: [PATCH 1169/1766] [csharp] Update to GenHTTP 9.6 and use a regular handler for JSON (#9568) * Update to GenHTTP 9.6 and use a regular handler for JSON * Use the same .NET optimizations as everyone elese * Update to 9.6.2 --- .../genhttp/Benchmarks/Benchmarks.csproj | 15 ++++--- .../CSharp/genhttp/Benchmarks/Program.cs | 6 ++- .../genhttp/Benchmarks/Tests/JsonHandler.cs | 39 +++++++++++++++++++ .../genhttp/Benchmarks/Tests/JsonResource.cs | 20 ---------- frameworks/CSharp/genhttp/genhttp.dockerfile | 5 +++ 5 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs delete mode 100644 frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index b96158a711b..529f7add6ca 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -16,22 +16,21 @@ - - + + - + - - - + + - - + + diff --git a/frameworks/CSharp/genhttp/Benchmarks/Program.cs b/frameworks/CSharp/genhttp/Benchmarks/Program.cs index aa2eb68938a..dd55ad6b782 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Program.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Program.cs @@ -1,14 +1,16 @@ using Benchmarks.Tests; using Benchmarks.Utilities; -using GenHTTP.Engine.Kestrel; + +using GenHTTP.Engine.Internal; + using GenHTTP.Modules.IO; using GenHTTP.Modules.Layouting; using GenHTTP.Modules.Webservices; var tests = Layout.Create() .Add("plaintext", Content.From(Resource.FromString("Hello, World!"))) + .Add("json", new JsonHandler()) .Add("fortunes", new FortuneHandler()) - .AddService("json") .AddService("db") .AddService("queries") .AddService("updates") diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs new file mode 100644 index 00000000000..4944c669198 --- /dev/null +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs @@ -0,0 +1,39 @@ +using System.Text.Json; + +using GenHTTP.Api.Content; +using GenHTTP.Api.Protocol; + +using GenHTTP.Modules.Conversion.Serializers.Json; + +namespace Benchmarks.Tests; + +public sealed class JsonResult +{ + + public string Message { get; set; } +} + +public sealed class JsonHandler : IHandler +{ + private static readonly FlexibleContentType _ContentType = new(ContentType.ApplicationJson, "utf-8"); + + private static readonly JsonSerializerOptions _Options = new(); + + public ValueTask PrepareAsync() => new(); + + public ValueTask HandleAsync(IRequest request) + { + var result = new JsonResult() + { + Message = "Hello, World!" + }; + + var response = request.Respond() + .Content(new JsonContent(result, _Options)) + .Type(_ContentType) + .Build(); + + return new(response); + } + +} diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs deleted file mode 100644 index 1fae7c88922..00000000000 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs +++ /dev/null @@ -1,20 +0,0 @@ -using GenHTTP.Modules.Webservices; - -namespace Benchmarks.Tests; - -public sealed class JsonResult -{ - - public string Message { get; set; } -} - -public sealed class JsonResource -{ - - [ResourceMethod] - public JsonResult GetMessage() => new() - { - Message = "Hello, World!" - }; - -} diff --git a/frameworks/CSharp/genhttp/genhttp.dockerfile b/frameworks/CSharp/genhttp/genhttp.dockerfile index 202df7ddedf..8c473477a61 100644 --- a/frameworks/CSharp/genhttp/genhttp.dockerfile +++ b/frameworks/CSharp/genhttp/genhttp.dockerfile @@ -11,6 +11,11 @@ RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-cont # final stage/image FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine + +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 + WORKDIR /app COPY --from=build /app . From 1c3638e0d0020257c233f1ad52b543adbf6d161f Mon Sep 17 00:00:00 2001 From: kanarus Date: Mon, 3 Mar 2025 23:27:50 +0900 Subject: [PATCH 1170/1766] [Rust] Bump ohkami to v0.21 and Add various tests (#9567) * bump ohkami & add various tests * fix dockerfiles * fix dockerfiles * fix cfg * fix dockerfiles * fix around db cfg * fix test names * remove conflict debris --- frameworks/Rust/ohkami/.gitignore | 2 +- frameworks/Rust/ohkami/Cargo.toml | 32 +- frameworks/Rust/ohkami/benchmark_config.json | 93 +- frameworks/Rust/ohkami/config.toml | 19 - frameworks/Rust/ohkami/ohkami.dockerfile | 18 - .../Rust/ohkami/rt_async-std.dockerfile | 26 + .../Rust/ohkami/rt_async-std/Cargo.lock | 2649 +++++++++++++++++ .../Rust/ohkami/rt_async-std/Cargo.toml | 14 + .../Rust/ohkami/rt_async-std/src/main.rs | 5 + frameworks/Rust/ohkami/rt_glommio.dockerfile | 23 + frameworks/Rust/ohkami/rt_glommio/Cargo.lock | 1062 +++++++ frameworks/Rust/ohkami/rt_glommio/Cargo.toml | 15 + frameworks/Rust/ohkami/rt_glommio/src/main.rs | 10 + frameworks/Rust/ohkami/rt_nio.dockerfile | 22 + frameworks/Rust/ohkami/rt_nio/Cargo.lock | 773 +++++ frameworks/Rust/ohkami/rt_nio/Cargo.toml | 14 + frameworks/Rust/ohkami/rt_nio/src/main.rs | 5 + frameworks/Rust/ohkami/rt_smol.dockerfile | 22 + frameworks/Rust/ohkami/rt_smol/Cargo.lock | 754 +++++ frameworks/Rust/ohkami/rt_smol/Cargo.toml | 14 + frameworks/Rust/ohkami/rt_smol/src/main.rs | 6 + frameworks/Rust/ohkami/rt_tokio.dockerfile | 26 + .../Rust/ohkami/{ => rt_tokio}/Cargo.lock | 824 +++-- frameworks/Rust/ohkami/rt_tokio/Cargo.toml | 14 + frameworks/Rust/ohkami/rt_tokio/src/main.rs | 5 + frameworks/Rust/ohkami/src/fangs.rs | 40 +- frameworks/Rust/ohkami/src/lib.rs | 91 + frameworks/Rust/ohkami/src/main.rs | 75 - frameworks/Rust/ohkami/src/models.rs | 59 +- frameworks/Rust/ohkami/src/postgres.rs | 32 +- frameworks/Rust/ohkami/src/templates.rs | 11 +- 31 files changed, 6264 insertions(+), 491 deletions(-) delete mode 100644 frameworks/Rust/ohkami/config.toml delete mode 100644 frameworks/Rust/ohkami/ohkami.dockerfile create mode 100644 frameworks/Rust/ohkami/rt_async-std.dockerfile create mode 100644 frameworks/Rust/ohkami/rt_async-std/Cargo.lock create mode 100644 frameworks/Rust/ohkami/rt_async-std/Cargo.toml create mode 100644 frameworks/Rust/ohkami/rt_async-std/src/main.rs create mode 100644 frameworks/Rust/ohkami/rt_glommio.dockerfile create mode 100644 frameworks/Rust/ohkami/rt_glommio/Cargo.lock create mode 100644 frameworks/Rust/ohkami/rt_glommio/Cargo.toml create mode 100644 frameworks/Rust/ohkami/rt_glommio/src/main.rs create mode 100644 frameworks/Rust/ohkami/rt_nio.dockerfile create mode 100644 frameworks/Rust/ohkami/rt_nio/Cargo.lock create mode 100644 frameworks/Rust/ohkami/rt_nio/Cargo.toml create mode 100644 frameworks/Rust/ohkami/rt_nio/src/main.rs create mode 100644 frameworks/Rust/ohkami/rt_smol.dockerfile create mode 100644 frameworks/Rust/ohkami/rt_smol/Cargo.lock create mode 100644 frameworks/Rust/ohkami/rt_smol/Cargo.toml create mode 100644 frameworks/Rust/ohkami/rt_smol/src/main.rs create mode 100644 frameworks/Rust/ohkami/rt_tokio.dockerfile rename frameworks/Rust/ohkami/{ => rt_tokio}/Cargo.lock (72%) create mode 100644 frameworks/Rust/ohkami/rt_tokio/Cargo.toml create mode 100644 frameworks/Rust/ohkami/rt_tokio/src/main.rs create mode 100644 frameworks/Rust/ohkami/src/lib.rs delete mode 100644 frameworks/Rust/ohkami/src/main.rs diff --git a/frameworks/Rust/ohkami/.gitignore b/frameworks/Rust/ohkami/.gitignore index ea8c4bf7f35..b60de5b5f2c 100644 --- a/frameworks/Rust/ohkami/.gitignore +++ b/frameworks/Rust/ohkami/.gitignore @@ -1 +1 @@ -/target +**/target diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index 04e08b92b0c..83638ba7d79 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -1,24 +1,20 @@ [package] -name = "ohkami_framework_benchmarks" -version = "0.20.0" +name = "framework_benchmarks" +version = "0.21.0" edition = "2021" authors = ["kanarus "] [dependencies] -ohkami = { version = "=0.20.0", features = ["rt_tokio"] } -tokio = { version = "1.40.0" , features = ["full"] } -rand = { version = "0.8.5" , features = ["small_rng"] } -sqlx = { version = "0.8.1" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } -yarte = { version = "0.15.7" } -futures-util = { version = "0.3.30" } +ohkami = { version = "0.21" } +yarte = { optional = true, version = "0.15" } +futures-util = { optional = true, version = "0.3" } +rand = { optional = true, version = "0.8", features = ["small_rng"] } +sqlx = { optional = true, version = "0.8", features = ["postgres", "tls-native-tls"] } -[profile.release] -opt-level = 3 -debug = false -debug-assertions = false -lto = true -panic = "abort" -incremental = false -codegen-units = 1 -rpath = false -strip = false \ No newline at end of file +[features] +db = ["yarte", "futures-util", "rand", "sqlx"] +rt_tokio = ["ohkami/rt_tokio", "db", "sqlx/runtime-tokio"] +rt_async-std = ["ohkami/rt_async-std", "db", "sqlx/runtime-async-std"] +rt_smol = ["ohkami/rt_smol"] +rt_glommio = ["ohkami/rt_glommio"] +rt_nio = ["ohkami/rt_nio"] diff --git a/frameworks/Rust/ohkami/benchmark_config.json b/frameworks/Rust/ohkami/benchmark_config.json index d09a2d32926..3f0647c3927 100644 --- a/frameworks/Rust/ohkami/benchmark_config.json +++ b/frameworks/Rust/ohkami/benchmark_config.json @@ -3,27 +3,106 @@ "tests": [ { "default": { + "dockerfile": "rt_tokio.dockerfile", + "display_name": "Ohkami [tokio]", + "framework": "Ohkami", + "webserver": "Ohkami", + "language": "Rust", + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "orm": "Raw", + "platform": "None", + "os": "Linux", + "database_os": "Linux", + "port": 8000, + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "update_url": "/updates?q=", + "plaintext_url": "/plaintext" + } + }, + { + "rt_async-std": { + "dockerfile": "rt_async-std.dockerfile", + "display_name": "Ohkami [async-std]", + "framework": "Ohkami", + "webserver": "Ohkami", + "language": "Rust", + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "orm": "Raw", + "platform": "None", + "os": "Linux", + "database_os": "Linux", + "port": 8000, "json_url": "/json", "db_url": "/db", "query_url": "/queries?q=", "fortune_url": "/fortunes", "update_url": "/updates?q=", - "plaintext_url": "/plaintext", + "plaintext_url": "/plaintext" + } + }, + { + "rt_smol": { + "dockerfile": "rt_smol.dockerfile", + "display_name": "Ohkami [smol]", + "framework": "Ohkami", + "webserver": "Ohkami", + "language": "Rust", + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "orm": "Raw", + "platform": "None", + "os": "Linux", + "database_os": "Linux", "port": 8000, + "json_url": "/json", + "plaintext_url": "/plaintext" + } + }, + { + "rt_glommio": { + "dockerfile": "rt_glommio.dockerfile", + "display_name": "Ohkami [glommio]", + "framework": "Ohkami", + "webserver": "Ohkami", + "language": "Rust", "approach": "Realistic", "classification": "Micro", "database": "Postgres", - "framework": "ohkami", + "orm": "Raw", + "platform": "None", + "os": "Linux", + "database_os": "Linux", + "port": 8000, + "json_url": "/json", + "plaintext_url": "/plaintext" + } + }, + { + "rt_nio": { + "dockerfile": "rt_nio.dockerfile", + "display_name": "Ohkami [nio]", + "framework": "Ohkami", + "webserver": "Ohkami", "language": "Rust", + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", "orm": "Raw", "platform": "None", - "webserver": "ohkami", "os": "Linux", "database_os": "Linux", - "display_name": "ohkami", - "notes": "", - "versus": "None" + "port": 8000, + "json_url": "/json", + "plaintext_url": "/plaintext" } } ] -} \ No newline at end of file +} diff --git a/frameworks/Rust/ohkami/config.toml b/frameworks/Rust/ohkami/config.toml deleted file mode 100644 index 85eddc62c99..00000000000 --- a/frameworks/Rust/ohkami/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[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 deleted file mode 100644 index 287f293a061..00000000000 --- a/frameworks/Rust/ohkami/ohkami.dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM rust:1.80-slim-bullseye -WORKDIR /ohkami_framework_benchmarks - -ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world -ENV MAX_CONNECTIONS=56 -ENV MIN_CONNECTIONS=56 - -COPY ./src ./src -COPY ./Cargo.toml ./Cargo.toml -COPY ./Cargo.lock ./Cargo.lock - -RUN apt update && apt install -y --no-install-recommends \ - libpq-dev pkg-config libssl-dev && \ - rm -rf /var/lib/apt/lists/* - -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release -EXPOSE 8000 -CMD ./target/release/ohkami_framework_benchmarks diff --git a/frameworks/Rust/ohkami/rt_async-std.dockerfile b/frameworks/Rust/ohkami/rt_async-std.dockerfile new file mode 100644 index 00000000000..c9fd1be3388 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_async-std.dockerfile @@ -0,0 +1,26 @@ +FROM rust:1.84-slim-bookworm AS builder + +RUN apt update && apt install -y --no-install-recommends \ + pkg-config \ + libpq-dev libssl-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY ./Cargo.toml /build/ +COPY ./src/ /build/src/ +COPY ./rt_async-std/ /build/rt_async-std/ + +WORKDIR /build/rt_async-std +ENV RUSTFLAGS="-C target-cpu=native" +RUN cargo build --release + +########################################################## + +FROM gcr.io/distroless/cc-debian12 + +COPY --from=builder /build/rt_async-std/target/release/framework_benchmarks-async-std /app/ + +EXPOSE 8000 +ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world +ENV MAX_CONNECTIONS=56 +ENV MIN_CONNECTIONS=56 +CMD [ "/app/framework_benchmarks-async-std" ] diff --git a/frameworks/Rust/ohkami/rt_async-std/Cargo.lock b/frameworks/Rust/ohkami/rt_async-std/Cargo.lock new file mode 100644 index 00000000000..ef927a959c9 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_async-std/Cargo.lock @@ -0,0 +1,2649 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "annotate-snippets" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io 2.4.0", + "async-lock 3.4.0", + "blocking", + "futures-lite 2.6.0", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.28", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.0", + "parking", + "polling 3.7.4", + "rustix 0.38.44", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io 2.4.0", + "async-lock 3.4.0", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.0", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.6.0", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte_reader" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aad623c0c9416ec94524edd23af3f3e2fd16d1ec7d41c940084c05f77e35c96" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "cc" +version = "1.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.96", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +dependencies = [ + "serde", +] + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.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]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "framework_benchmarks" +version = "0.21.0" +dependencies = [ + "futures-util", + "ohkami", + "rand", + "sqlx", + "yarte", +] + +[[package]] +name = "framework_benchmarks-async-std" +version = "0.0.0" +dependencies = [ + "async-std", + "framework_benchmarks", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.3.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +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 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +dependencies = [ + "value-bag", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mews" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21788e6e675e8f19754e8c520ed420977ebade2867e2ff8363357b68c2ef8e8a" +dependencies = [ + "async-std", + "base64", + "sha1", +] + +[[package]] +name = "native-tls" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[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.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "ohkami" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37844b8da12eece89bd239e4d8cb7d7dad07978f6f20b3917d6fe7c289361f58" +dependencies = [ + "async-std", + "base64", + "byte_reader", + "ctrlc", + "futures-util", + "hmac", + "mews", + "ohkami_lib", + "ohkami_macros", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "ohkami_lib" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95fa8274aba0c04904453fdd847898faf86856f7e80180305a51a5636338ed8" +dependencies = [ + "byte_reader", + "percent-encoding", + "serde", +] + +[[package]] +name = "ohkami_macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f326ade375c9f24daa9c029f2f6019bff9157bb780239839a6e4ce9aa136178f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "openssl" +version = "0.10.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.3.0", + "futures-io", +] + +[[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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.44", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rsa" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" +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.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.8.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" + +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "serde_json" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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 = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[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 = "sqlx" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +dependencies = [ + "async-io 1.13.0", + "async-std", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener 5.4.0", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown", + "hashlink", + "indexmap", + "log", + "memchr", + "native-tls", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.96", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +dependencies = [ + "async-std", + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.96", + "tempfile", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +dependencies = [ + "atoi", + "base64", + "bitflags 2.8.0", + "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", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +dependencies = [ + "atoi", + "base64", + "bitflags 2.8.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "tempfile" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +dependencies = [ + "cfg-if", + "fastrand 2.3.0", + "getrandom", + "once_cell", + "rustix 0.38.44", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "v_eval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" +dependencies = [ + "regex", + "syn 1.0.109", +] + +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" + +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.96", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[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.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "yarte" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfce1df93f3b16e5272221a559e60bbbaaa71dbc042a43996d223e51a690aab2" +dependencies = [ + "yarte_derive", + "yarte_helpers", +] + +[[package]] +name = "yarte_codegen" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a79312078b97a195de91a8c1457c2e0d7abd97e6e605f3cdeb01b3c105d2cff" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_helpers", + "yarte_hir", +] + +[[package]] +name = "yarte_derive" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_codegen", + "yarte_helpers", + "yarte_hir", + "yarte_parser", +] + +[[package]] +name = "yarte_helpers" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" +dependencies = [ + "dtoa", + "itoa", + "prettyplease", + "serde", + "syn 1.0.109", + "toml", + "v_htmlescape", +] + +[[package]] +name = "yarte_hir" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee42d2f704a3b1d8bc111d47a705d1302a0943d85e4c230f4e8300ee0dde4a6" +dependencies = [ + "derive_more", + "proc-macro2", + "quote", + "syn 1.0.109", + "v_eval", + "v_htmlescape", + "yarte_helpers", + "yarte_parser", +] + +[[package]] +name = "yarte_parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538f72049cf7104e12d5c444048d112cb8fc788a31308afd912442a381ba860c" +dependencies = [ + "annotate-snippets", + "derive_more", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "unicode-xid", + "yarte_helpers", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] diff --git a/frameworks/Rust/ohkami/rt_async-std/Cargo.toml b/frameworks/Rust/ohkami/rt_async-std/Cargo.toml new file mode 100644 index 00000000000..81cc7b817b9 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_async-std/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "framework_benchmarks-async-std" +version = "0.0.0" +edition = "2021" +authors = ["kanarus "] + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 + +[dependencies] +framework_benchmarks = { path = "..", features = ["rt_async-std"] } +async-std = { version = "1.13", features = ["attributes"] } diff --git a/frameworks/Rust/ohkami/rt_async-std/src/main.rs b/frameworks/Rust/ohkami/rt_async-std/src/main.rs new file mode 100644 index 00000000000..b65f3148d9b --- /dev/null +++ b/frameworks/Rust/ohkami/rt_async-std/src/main.rs @@ -0,0 +1,5 @@ +#[async_std::main] +async fn main() { + framework_benchmarks::ohkami().await + .howl("0.0.0.0:8000").await +} diff --git a/frameworks/Rust/ohkami/rt_glommio.dockerfile b/frameworks/Rust/ohkami/rt_glommio.dockerfile new file mode 100644 index 00000000000..e7462c2765f --- /dev/null +++ b/frameworks/Rust/ohkami/rt_glommio.dockerfile @@ -0,0 +1,23 @@ +FROM rust:1.84-slim-bookworm AS builder + +RUN apt update && apt install -y --no-install-recommends \ + pkg-config \ + git \ + && rm -rf /var/lib/apt/lists/* + +COPY ./Cargo.toml /build/ +COPY ./src/ /build/src/ +COPY ./rt_glommio/ /build/rt_glommio/ + +WORKDIR /build/rt_glommio +ENV RUSTFLAGS="-C target-cpu=native" +RUN cargo build --release + +########################################################## + +FROM gcr.io/distroless/cc-debian12 + +COPY --from=builder /build/rt_glommio/target/release/framework_benchmarks-glommio /app/ + +EXPOSE 8000 +CMD [ "/app/framework_benchmarks-glommio" ] diff --git a/frameworks/Rust/ohkami/rt_glommio/Cargo.lock b/frameworks/Rust/ohkami/rt_glommio/Cargo.lock new file mode 100644 index 00000000000..0ef27d22413 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_glommio/Cargo.lock @@ -0,0 +1,1062 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + +[[package]] +name = "bitmaps" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "buddy-alloc" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3240a4cb09cf0da6a51641bd40ce90e96ea6065e3a1adc46434029254bcc2d09" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte_reader" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aad623c0c9416ec94524edd23af3f3e2fd16d1ec7d41c940084c05f77e35c96" + +[[package]] +name = "cache-padded" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" + +[[package]] +name = "cc" +version = "1.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "concurrent-queue" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix 0.29.0", + "windows-sys", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "enclose" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef4f6f904480430009ad8f22edc9573e26e4f137365f014d7ea998d5341639a" + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin", +] + +[[package]] +name = "framework_benchmarks" +version = "0.21.0" +dependencies = [ + "ohkami", +] + +[[package]] +name = "framework_benchmarks-glommio" +version = "0.0.0" +dependencies = [ + "framework_benchmarks", + "glommio", + "num_cpus", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glommio" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1f8bc1fce949d18098dc0a4e861314e40351a0144ebf61e59bdb5254a2273b2" +dependencies = [ + "ahash", + "backtrace", + "bitflags", + "bitmaps", + "buddy-alloc", + "cc", + "concurrent-queue", + "crossbeam", + "enclose", + "flume", + "futures-lite", + "intrusive-collections", + "lazy_static", + "libc", + "lockfree", + "log", + "nix 0.27.1", + "pin-project-lite", + "rlimit", + "scoped-tls", + "scopeguard", + "signal-hook", + "sketches-ddsketch", + "smallvec", + "socket2", + "tracing", + "typenum", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "intrusive-collections" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" +dependencies = [ + "memoffset", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "lockfree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74ee94b5ad113c7cb98c5a040f783d0952ee4fe100993881d1673c2cb002dd23" +dependencies = [ + "owned-alloc", +] + +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mews" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21788e6e675e8f19754e8c520ed420977ebade2867e2ff8363357b68c2ef8e8a" +dependencies = [ + "base64", + "futures-util", + "glommio", + "sha1", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "ohkami" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37844b8da12eece89bd239e4d8cb7d7dad07978f6f20b3917d6fe7c289361f58" +dependencies = [ + "base64", + "byte_reader", + "ctrlc", + "futures-util", + "glommio", + "hmac", + "mews", + "num_cpus", + "ohkami_lib", + "ohkami_macros", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "ohkami_lib" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95fa8274aba0c04904453fdd847898faf86856f7e80180305a51a5636338ed8" +dependencies = [ + "byte_reader", + "percent-encoding", + "serde", +] + +[[package]] +name = "ohkami_macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f326ade375c9f24daa9c029f2f6019bff9157bb780239839a6e4ce9aa136178f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "owned-alloc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30fceb411f9a12ff9222c5f824026be368ff15dc2f13468d850c7d3f502205d6" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rlimit" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc0bf25554376fd362f54332b8410a625c71f15445bca32ffdfdf4ec9ac91726" +dependencies = [ + "libc", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "sketches-ddsketch" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d2ecae5fcf33b122e2e6bd520a57ccf152d2dde3b38c71039df1a6867264ee" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[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.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[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.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/frameworks/Rust/ohkami/rt_glommio/Cargo.toml b/frameworks/Rust/ohkami/rt_glommio/Cargo.toml new file mode 100644 index 00000000000..09aee0f200d --- /dev/null +++ b/frameworks/Rust/ohkami/rt_glommio/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "framework_benchmarks-glommio" +version = "0.0.0" +edition = "2021" +authors = ["kanarus "] + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 + +[dependencies] +framework_benchmarks = { path = "..", features = ["rt_glommio"] } +glommio = { version = "0.9" } +num_cpus = { version = "1.16" } diff --git a/frameworks/Rust/ohkami/rt_glommio/src/main.rs b/frameworks/Rust/ohkami/rt_glommio/src/main.rs new file mode 100644 index 00000000000..af663d416b6 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_glommio/src/main.rs @@ -0,0 +1,10 @@ +use glommio::{LocalExecutorPoolBuilder, PoolPlacement, CpuSet}; + +fn main() { + LocalExecutorPoolBuilder::new(PoolPlacement::MaxSpread( + num_cpus::get(), CpuSet::online().ok() + )).on_all_shards(|| async { + framework_benchmarks::ohkami().await + .howl("0.0.0.0:8000").await + }).unwrap().join_all(); +} diff --git a/frameworks/Rust/ohkami/rt_nio.dockerfile b/frameworks/Rust/ohkami/rt_nio.dockerfile new file mode 100644 index 00000000000..49b764a9cb9 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_nio.dockerfile @@ -0,0 +1,22 @@ +FROM rust:1.84-slim-bookworm AS builder + +RUN apt update && apt install -y --no-install-recommends \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +COPY ./Cargo.toml /build/ +COPY ./src/ /build/src/ +COPY ./rt_nio/ /build/rt_nio/ + +WORKDIR /build/rt_nio +ENV RUSTFLAGS="-C target-cpu=native" +RUN cargo build --release + +########################################################## + +FROM gcr.io/distroless/cc-debian12 + +COPY --from=builder /build/rt_nio/target/release/framework_benchmarks-nio /app/ + +EXPOSE 8000 +CMD [ "/app/framework_benchmarks-nio" ] diff --git a/frameworks/Rust/ohkami/rt_nio/Cargo.lock b/frameworks/Rust/ohkami/rt_nio/Cargo.lock new file mode 100644 index 00000000000..0ffab198e12 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_nio/Cargo.lock @@ -0,0 +1,773 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byte_reader" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aad623c0c9416ec94524edd23af3f3e2fd16d1ec7d41c940084c05f77e35c96" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "framework_benchmarks" +version = "0.21.0" +dependencies = [ + "ohkami", +] + +[[package]] +name = "framework_benchmarks-nio" +version = "0.0.0" +dependencies = [ + "framework_benchmarks", + "nio", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mews" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21788e6e675e8f19754e8c520ed420977ebade2867e2ff8363357b68c2ef8e8a" +dependencies = [ + "base64", + "nio", + "sha1", + "tokio", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "mpmc-channel" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9184bf37b24a7fcdc91a9ca61efc4f3510276693f4693735556a77cc42cc342c" + +[[package]] +name = "nio" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af5df74a05351a6e56595f76330c6dc0641452291d69f36e7541a949bbbc93eb" +dependencies = [ + "crossbeam-channel", + "futures", + "libc", + "mio", + "mpmc-channel", + "nio-macros", + "socket2", + "tokio", +] + +[[package]] +name = "nio-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a67f7f91ca31eaa3fa95a2654d86f34ea912e3b0fec9f4a89e0890b64a4e33e" +dependencies = [ + "quote2", + "syn", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "ohkami" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37844b8da12eece89bd239e4d8cb7d7dad07978f6f20b3917d6fe7c289361f58" +dependencies = [ + "base64", + "byte_reader", + "ctrlc", + "hmac", + "mews", + "nio", + "ohkami_lib", + "ohkami_macros", + "serde", + "serde_json", + "sha2", + "tokio", +] + +[[package]] +name = "ohkami_lib" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95fa8274aba0c04904453fdd847898faf86856f7e80180305a51a5636338ed8" +dependencies = [ + "byte_reader", + "percent-encoding", + "serde", +] + +[[package]] +name = "ohkami_macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f326ade375c9f24daa9c029f2f6019bff9157bb780239839a6e4ce9aa136178f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote2" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61aa775e928368b9a33bcac44f47f4132f30b0b6a17eb15c0873fc8af899211" +dependencies = [ + "proc-macro2", + "quote", + "quote2-macros", +] + +[[package]] +name = "quote2-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ceeba20cfeffd4e0f7dd03ef72e55d115be2927b97424249a02fed0e86647a" + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tokio" +version = "1.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +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.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/frameworks/Rust/ohkami/rt_nio/Cargo.toml b/frameworks/Rust/ohkami/rt_nio/Cargo.toml new file mode 100644 index 00000000000..2c86b10f8fe --- /dev/null +++ b/frameworks/Rust/ohkami/rt_nio/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "framework_benchmarks-nio" +version = "0.0.0" +edition = "2021" +authors = ["kanarus "] + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 + +[dependencies] +framework_benchmarks = { path = "..", features = ["rt_nio"] } +nio = { version = "0.0" } diff --git a/frameworks/Rust/ohkami/rt_nio/src/main.rs b/frameworks/Rust/ohkami/rt_nio/src/main.rs new file mode 100644 index 00000000000..ffaeee65b1a --- /dev/null +++ b/frameworks/Rust/ohkami/rt_nio/src/main.rs @@ -0,0 +1,5 @@ +#[nio::main] +async fn main() { + framework_benchmarks::ohkami().await + .howl("0.0.0.0:8000").await +} diff --git a/frameworks/Rust/ohkami/rt_smol.dockerfile b/frameworks/Rust/ohkami/rt_smol.dockerfile new file mode 100644 index 00000000000..42684323acf --- /dev/null +++ b/frameworks/Rust/ohkami/rt_smol.dockerfile @@ -0,0 +1,22 @@ +FROM rust:1.84-slim-bookworm AS builder + +RUN apt update && apt install -y --no-install-recommends \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +COPY ./Cargo.toml /build/ +COPY ./src/ /build/src/ +COPY ./rt_smol/ /build/rt_smol/ + +WORKDIR /build/rt_smol +ENV RUSTFLAGS="-C target-cpu=native" +RUN cargo build --release + +########################################################## + +FROM gcr.io/distroless/cc-debian12 + +COPY --from=builder /build/rt_smol/target/release/framework_benchmarks-smol /app/ + +EXPOSE 8000 +CMD [ "/app/framework_benchmarks-smol" ] diff --git a/frameworks/Rust/ohkami/rt_smol/Cargo.lock b/frameworks/Rust/ohkami/rt_smol/Cargo.lock new file mode 100644 index 00000000000..59625d44ce8 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_smol/Cargo.lock @@ -0,0 +1,754 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", + "tracing", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "byte_reader" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aad623c0c9416ec94524edd23af3f3e2fd16d1ec7d41c940084c05f77e35c96" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "framework_benchmarks" +version = "0.21.0" +dependencies = [ + "ohkami", +] + +[[package]] +name = "framework_benchmarks-smol" +version = "0.0.0" +dependencies = [ + "framework_benchmarks", + "smol", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mews" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21788e6e675e8f19754e8c520ed420977ebade2867e2ff8363357b68c2ef8e8a" +dependencies = [ + "base64", + "sha1", + "smol", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "ohkami" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37844b8da12eece89bd239e4d8cb7d7dad07978f6f20b3917d6fe7c289361f58" +dependencies = [ + "base64", + "byte_reader", + "ctrlc", + "futures-util", + "hmac", + "mews", + "ohkami_lib", + "ohkami_macros", + "serde", + "serde_json", + "sha2", + "smol", +] + +[[package]] +name = "ohkami_lib" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95fa8274aba0c04904453fdd847898faf86856f7e80180305a51a5636338ed8" +dependencies = [ + "byte_reader", + "percent-encoding", + "serde", +] + +[[package]] +name = "ohkami_macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f326ade375c9f24daa9c029f2f6019bff9157bb780239839a6e4ce9aa136178f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smol" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" +dependencies = [ + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/frameworks/Rust/ohkami/rt_smol/Cargo.toml b/frameworks/Rust/ohkami/rt_smol/Cargo.toml new file mode 100644 index 00000000000..cc4b0fd9043 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_smol/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "framework_benchmarks-smol" +version = "0.0.0" +edition = "2021" +authors = ["kanarus "] + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 + +[dependencies] +framework_benchmarks = { path = "..", features = ["rt_smol"] } +smol = { version = "2.0" } diff --git a/frameworks/Rust/ohkami/rt_smol/src/main.rs b/frameworks/Rust/ohkami/rt_smol/src/main.rs new file mode 100644 index 00000000000..68d594b664a --- /dev/null +++ b/frameworks/Rust/ohkami/rt_smol/src/main.rs @@ -0,0 +1,6 @@ +fn main() { + smol::block_on(async { + framework_benchmarks::ohkami().await + .howl("0.0.0.0:8000").await + }) +} diff --git a/frameworks/Rust/ohkami/rt_tokio.dockerfile b/frameworks/Rust/ohkami/rt_tokio.dockerfile new file mode 100644 index 00000000000..56ce1bfa4fa --- /dev/null +++ b/frameworks/Rust/ohkami/rt_tokio.dockerfile @@ -0,0 +1,26 @@ +FROM rust:1.84-slim-bookworm AS builder + +RUN apt update && apt install -y --no-install-recommends \ + pkg-config \ + libpq-dev libssl-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY ./Cargo.toml /build/ +COPY ./src/ /build/src/ +COPY ./rt_tokio/ /build/rt_tokio/ + +WORKDIR /build/rt_tokio +ENV RUSTFLAGS="-C target-cpu=native" +RUN cargo build --release + +########################################################## + +FROM gcr.io/distroless/cc-debian12 + +COPY --from=builder /build/rt_tokio/target/release/framework_benchmarks-tokio /app/ + +EXPOSE 8000 +ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world +ENV MAX_CONNECTIONS=56 +ENV MIN_CONNECTIONS=56 +CMD [ "/app/framework_benchmarks-tokio" ] diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/rt_tokio/Cargo.lock similarity index 72% rename from frameworks/Rust/ohkami/Cargo.lock rename to frameworks/Rust/ohkami/rt_tokio/Cargo.lock index 6bd6ad3a2a0..5423ff0e7dd 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/rt_tokio/Cargo.lock @@ -1,33 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 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.11" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" @@ -40,9 +28,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "annotate-snippets" @@ -65,23 +53,23 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -98,15 +86,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" dependencies = [ "serde", ] @@ -134,15 +116,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.15" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "shlex", ] @@ -153,6 +135,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -192,9 +180,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -216,18 +204,18 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -239,6 +227,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + [[package]] name = "der" version = "0.7.9" @@ -260,7 +258,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -275,6 +273,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "dotenvy" version = "0.15.7" @@ -304,12 +313,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -325,9 +334,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -336,21 +345,27 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", "spin", ] +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.3.2" @@ -375,11 +390,30 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "framework_benchmarks" +version = "0.21.0" +dependencies = [ + "futures-util", + "ohkami", + "rand", + "sqlx", + "yarte", +] + +[[package]] +name = "framework_benchmarks-tokio" +version = "0.0.0" +dependencies = [ + "framework_benchmarks", + "tokio", +] + [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -387,15 +421,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -415,38 +449,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-io", @@ -482,25 +516,26 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", ] [[package]] name = "hashlink" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ "hashbrown", ] @@ -511,12 +546,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hex" version = "0.4.3" @@ -543,28 +572,157 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", ] [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "indexmap" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown", @@ -572,9 +730,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "lazy_static" @@ -587,15 +745,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libsqlite3-sys" @@ -603,16 +761,21 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ - "cc", "pkg-config", "vcpkg", ] [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -626,9 +789,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "md-5" @@ -647,27 +810,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "mews" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "21788e6e675e8f19754e8c520ed420977ebade2867e2ff8363357b68c2ef8e8a" +dependencies = [ + "base64", + "sha1", + "tokio", +] [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -675,9 +842,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ "libc", "log", @@ -691,13 +858,15 @@ dependencies = [ ] [[package]] -name = "nom" -version = "7.1.3" +name = "nix" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "memchr", - "minimal-lexical", + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", ] [[package]] @@ -749,47 +918,37 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "ohkami" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa5507d0f2230d8fbbec9163207da1219ac513441269465a8d532e0bf5018411" +checksum = "37844b8da12eece89bd239e4d8cb7d7dad07978f6f20b3917d6fe7c289361f58" dependencies = [ + "base64", "byte_reader", + "ctrlc", "hmac", + "mews", "ohkami_lib", "ohkami_macros", - "rustc-hash", "serde", "serde_json", "sha2", "tokio", ] -[[package]] -name = "ohkami_framework_benchmarks" -version = "0.20.0" -dependencies = [ - "futures-util", - "ohkami", - "rand", - "sqlx", - "tokio", - "yarte", -] - [[package]] name = "ohkami_lib" -version = "0.2.5" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "889b290a5ca6f0e2d1b1bae72d0ec1fb768d84cf246c532e6f7c65ff962e65e3" +checksum = "e95fa8274aba0c04904453fdd847898faf86856f7e80180305a51a5636338ed8" dependencies = [ "byte_reader", "percent-encoding", @@ -798,20 +957,20 @@ dependencies = [ [[package]] name = "ohkami_macros" -version = "0.8.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a231d9afdadeab9fc5c850093377c65ecd30512692de0efec51f708dff5be12" +checksum = "f326ade375c9f24daa9c029f2f6019bff9157bb780239839a6e4ce9aa136178f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.96", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" @@ -819,7 +978,7 @@ version = "0.10.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -836,14 +995,14 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" @@ -859,9 +1018,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -881,17 +1040,11 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -909,9 +1062,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -942,9 +1095,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "ppv-lite86" @@ -967,18 +1120,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1015,27 +1168,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", + "bitflags", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1045,9 +1189,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1056,15 +1200,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest", @@ -1086,12 +1230,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - [[package]] name = "rustc_version" version = "0.4.1" @@ -1103,15 +1241,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1122,11 +1260,11 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1141,7 +1279,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -1150,9 +1288,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -1160,35 +1298,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" dependencies = [ "itoa", "memchr", @@ -1275,9 +1413,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1302,21 +1440,11 @@ dependencies = [ "der", ] -[[package]] -name = "sqlformat" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" -dependencies = [ - "nom", - "unicode_categories", -] - [[package]] name = "sqlx" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfa89bea9500db4a0d038513d7a060566bfc51d46d1c014847049a45cce85e8" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1327,37 +1455,31 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06e2f2bd861719b1f3f0c7dbe1d80c30bf59e76cf019f07d9014ed7eefb8e08" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" dependencies = [ - "atoi", - "byteorder", "bytes", "crc", "crossbeam-queue", "either", "event-listener", - "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", "hashbrown", "hashlink", - "hex", "indexmap", "log", "memchr", "native-tls", "once_cell", - "paste", "percent-encoding", "serde", "serde_json", "sha2", "smallvec", - "sqlformat", "thiserror", "tokio", "tokio-stream", @@ -1367,22 +1489,22 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f998a9defdbd48ed005a89362bd40dd2117502f15294f61c8d47034107dbbdc" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] name = "sqlx-macros-core" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d100558134176a2629d46cec0c8891ba0be8910f7896abfdb75ef4ab6f4e7ce" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" dependencies = [ "dotenvy", "either", @@ -1398,7 +1520,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.77", + "syn 2.0.96", "tempfile", "tokio", "url", @@ -1406,13 +1528,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cac0ab331b14cb3921c62156d913e4c15b74fb6ec0f3146bd4ef6e4fb3c12" +checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" dependencies = [ "atoi", "base64", - "bitflags 2.6.0", + "bitflags", "byteorder", "bytes", "crc", @@ -1448,20 +1570,19 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9734dbce698c67ecf67c442f768a5e90a49b2a4d61a9f1d59f73874bd4cf0710" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64", - "bitflags 2.6.0", + "bitflags", "byteorder", "crc", "dotenvy", "etcetera", "futures-channel", "futures-core", - "futures-io", "futures-util", "hex", "hkdf", @@ -1486,9 +1607,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75b419c3c1b1697833dd927bdc4c6545a620bc1bbafabd44e1efbe9afcd337e" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" dependencies = [ "atoi", "flume", @@ -1507,6 +1628,12 @@ dependencies = [ "url", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "stringprep" version = "0.1.5" @@ -1537,23 +1664,35 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "tempfile" -version = "3.12.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys 0.59.0", @@ -1561,29 +1700,39 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", ] [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -1596,9 +1745,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -1614,20 +1763,20 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -1645,9 +1794,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -1657,20 +1806,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -1683,60 +1832,66 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "v_eval" version = "0.6.0" @@ -1779,11 +1934,11 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall", "wasite", ] @@ -1957,6 +2112,18 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "yansi-term" version = "0.1.2" @@ -2051,6 +2218,30 @@ dependencies = [ "yarte_helpers", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -2069,7 +2260,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure", ] [[package]] @@ -2077,3 +2289,25 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] diff --git a/frameworks/Rust/ohkami/rt_tokio/Cargo.toml b/frameworks/Rust/ohkami/rt_tokio/Cargo.toml new file mode 100644 index 00000000000..fe49fca4b98 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_tokio/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "framework_benchmarks-tokio" +version = "0.0.0" +edition = "2021" +authors = ["kanarus "] + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 + +[dependencies] +framework_benchmarks = { path = "..", features = ["rt_tokio"] } +tokio = { version = "1.43", features = ["full"] } diff --git a/frameworks/Rust/ohkami/rt_tokio/src/main.rs b/frameworks/Rust/ohkami/rt_tokio/src/main.rs new file mode 100644 index 00000000000..660405f7862 --- /dev/null +++ b/frameworks/Rust/ohkami/rt_tokio/src/main.rs @@ -0,0 +1,5 @@ +#[tokio::main] +async fn main() { + framework_benchmarks::ohkami().await + .howl("0.0.0.0:8000").await +} diff --git a/frameworks/Rust/ohkami/src/fangs.rs b/frameworks/Rust/ohkami/src/fangs.rs index 2dd8e27e5d3..8b69cbb156d 100644 --- a/frameworks/Rust/ohkami/src/fangs.rs +++ b/frameworks/Rust/ohkami/src/fangs.rs @@ -1,6 +1,5 @@ use ohkami::prelude::*; - #[derive(Clone)] pub struct SetServer; impl FangAction for SetServer { @@ -9,3 +8,42 @@ impl FangAction for SetServer { res.headers.set().Server("ohkami"); } } + +#[cfg(feature = "db")] +impl crate::Postgres { + pub async fn init() -> impl FangAction { + #[derive(Clone)] + pub struct UsePostgres(crate::Postgres); + impl FangAction for UsePostgres { + #[inline(always)] + async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { + Ok(req.memorize(self.0.clone())) + } + } + + 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 + } + + let pool = sqlx::postgres::PgPoolOptions::new() + .max_connections(MAX_CONNECTIONS) + .min_connections(MIN_CONNECTIONS) + .connect(&DATABASE_URL).await + .unwrap(); + + UsePostgres(pool.into()) + } +} diff --git a/frameworks/Rust/ohkami/src/lib.rs b/frameworks/Rust/ohkami/src/lib.rs new file mode 100644 index 00000000000..9a60a5f0a59 --- /dev/null +++ b/frameworks/Rust/ohkami/src/lib.rs @@ -0,0 +1,91 @@ +mod fangs; +mod models; +#[cfg(feature = "db")] mod postgres; +#[cfg(feature = "db")] mod templates; + +use { + fangs::SetServer, + models::Message, + ohkami::prelude::*, + ohkami::format::JSON, +}; +#[cfg(feature = "db")] use { + models::{Fortune, World, WorldsMeta}, + postgres::Postgres, + templates::FortunesTemplate, + ohkami::format::Query, +}; + +pub async fn ohkami() -> Ohkami { + #[cfg(feature = "db")] { + Ohkami::new(( + 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), + )) + } + #[cfg(not(feature = "db"))] { + Ohkami::new(( + SetServer, + "/json" .GET(json_serialization), + "/plaintext".GET(plaintext), + )) + } +} + +async fn json_serialization() -> JSON { + JSON(Message { + message: "Hello, World!" + }) +} + +#[cfg(feature = "db")] +async fn single_database_query( + Context(db): Context<'_, Postgres>, +) -> JSON { + let world = db.select_random_world().await; + JSON(world) +} + +#[cfg(feature = "db")] +async fn multiple_database_query( + Query(q): Query>, + Context(db): Context<'_, Postgres>, +) -> JSON> { + let n = q.parse(); + let worlds = db.select_n_random_worlds(n).await; + JSON(worlds) +} + +#[cfg(feature = "db")] +async fn fortunes( + Context(db): Context<'_, Postgres>, +) -> FortunesTemplate { + let mut fortunes = db.select_all_fortunes().await; + fortunes.push(Fortune { + id: 0, + message: String::from("Additional fortune added at request time."), + }); + fortunes.sort_unstable_by(|a, b| str::cmp(&a.message, &b.message)); + FortunesTemplate { fortunes } +} + +#[cfg(feature = "db")] +async fn database_updates( + Query(q): Query>, + Context(db): Context<'_, Postgres>, +) -> JSON> { + let n = q.parse(); + let mut worlds = db.select_n_random_worlds(n).await; + db.update_random_ids_of_worlds(&mut worlds).await; + JSON(worlds) +} + +async fn plaintext() -> &'static str { + "Hello, World!" +} diff --git a/frameworks/Rust/ohkami/src/main.rs b/frameworks/Rust/ohkami/src/main.rs deleted file mode 100644 index 96cc9cc2fbc..00000000000 --- a/frameworks/Rust/ohkami/src/main.rs +++ /dev/null @@ -1,75 +0,0 @@ -mod fangs; -use fangs::SetServer; - -mod models; -use models::{Fortune, Message, World, WorldsQuery}; - -mod postgres; -use postgres::Postgres; - -mod templates; -use templates::FortunesTemplate; - -use ohkami::prelude::*; -use ohkami::format::{JSON, Query}; -use ohkami::Memory; - - -#[tokio::main] -async fn main() { - Ohkami::with(( - SetServer, - Memory::new(Postgres::new().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() -> JSON { - JSON(Message { - message: "Hello, World!" - }) -} - -async fn single_database_query(p: Memory<'_, Postgres>) -> JSON { - let world = p.select_random_world().await; - JSON(world) -} - -async fn multiple_database_query( - Query(q): Query>, - p: Memory<'_, Postgres> -) -> JSON> { - let n = q.parse(); - let worlds = p.select_n_random_worlds(n).await; - JSON(worlds) -} - -async fn fortunes(p: Memory<'_, Postgres>) -> FortunesTemplate { - let mut fortunes = p.select_all_fortunes().await; - fortunes.push(Fortune { - id: 0, - message: String::from("Additional fortune added at request time."), - }); - fortunes.sort_unstable_by(|a, b| str::cmp(&a.message, &b.message)); - FortunesTemplate { fortunes } -} - -async fn database_updates( - Query(q): Query>, - p: Memory<'_, Postgres> -) -> JSON> { - let n = q.parse(); - let mut worlds = p.select_n_random_worlds(n).await; - p.update_random_ids_of_worlds(&mut worlds).await; - 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 index 874dd22a5d7..cdbd7b2df00 100644 --- a/frameworks/Rust/ohkami/src/models.rs +++ b/frameworks/Rust/ohkami/src/models.rs @@ -1,36 +1,43 @@ -use ohkami::serde::{Serialize, Deserialize}; +use ohkami::serde; - -#[derive(Serialize)] +#[derive(serde::Serialize)] pub struct Message { pub message: &'static str, } -#[derive(sqlx::FromRow)] -pub struct Fortune { - pub id: i32, - pub message: String, -} +#[cfg(feature = "db")] +pub use db::*; +#[cfg(feature = "db")] +mod db { + use super::*; -#[derive(sqlx::FromRow)] -#[derive(Serialize)] -pub struct World { - pub id: i32, - #[serde(rename="randomNumber")] - pub randomnumber: i32, -} + #[derive(sqlx::FromRow)] + pub struct Fortune { + pub id: i32, + pub message: String, + } -#[derive(Deserialize)] -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, + #[derive(sqlx::FromRow)] + #[derive(serde::Serialize)] + #[allow(non_snake_case)] + pub struct World { + pub id: i32, + #[serde(rename = "randomNumber")] + pub randomnumber: i32, + } + + #[derive(serde::Deserialize)] + pub struct WorldsMeta<'req> { + q: Option<&'req str>, + } + impl WorldsMeta<'_> { + #[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 index c320e2516e3..ffb57e467ef 100644 --- a/frameworks/Rust/ohkami/src/postgres.rs +++ b/frameworks/Rust/ohkami/src/postgres.rs @@ -1,37 +1,15 @@ +#![cfg(feature = "db")] + 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 new() -> Self { - 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 - } - - let pool = sqlx::postgres::PgPoolOptions::new() - .max_connections(MAX_CONNECTIONS) - .min_connections(MIN_CONNECTIONS) - .connect(&DATABASE_URL).await - .unwrap(); - - Self(pool) +impl From for Postgres { + fn from(pgpool: sqlx::PgPool) -> Self { + Self(pgpool) } } diff --git a/frameworks/Rust/ohkami/src/templates.rs b/frameworks/Rust/ohkami/src/templates.rs index 4b7f8e06e92..d4f4c4306ea 100644 --- a/frameworks/Rust/ohkami/src/templates.rs +++ b/frameworks/Rust/ohkami/src/templates.rs @@ -1,21 +1,24 @@ +#![cfg(feature = "db")] + use ohkami::{IntoResponse, Response}; use yarte::Template; use crate::models::Fortune; - #[derive(Template)] -#[template(src = r#"Fortunes +#[template(src = r#" +Fortunes
      idmessage
      {{~# each fortunes ~}} {{~/each ~}} -
      idmessage
      {{id}}{{message}}
      "#)] + +"#)] pub struct FortunesTemplate { pub fortunes: Vec, } impl IntoResponse for FortunesTemplate { fn into_response(self) -> Response { - match self.call() { + match Template::call(&self) { Ok(template) => Response::OK().with_html(template), Err(_) => Response::InternalServerError(), } From 939321d3a65a9b3d5646df25c3ae5ed19c3d34b1 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, 3 Mar 2025 19:57:57 +0530 Subject: [PATCH 1171/1766] [CSharp] Migrate `FastEndpoints` to .NET 9 (#9566) --- .../CSharp/fastendpoints/Benchmarks/Benchmarks.csproj | 2 +- .../Benchmarks/Endpoints/JsonEndpoint.cs | 5 +++-- .../Benchmarks/Endpoints/PlainTextEndpoint.cs | 11 ++++++----- frameworks/CSharp/fastendpoints/Benchmarks/Program.cs | 10 +++++----- frameworks/CSharp/fastendpoints/README.md | 6 +++--- .../CSharp/fastendpoints/fastendpoints.dockerfile | 8 ++++++-- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj index f3b5211caa5..bbfe65a1034 100644 --- a/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable CA2016;IDE1006 diff --git a/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/JsonEndpoint.cs b/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/JsonEndpoint.cs index 20598ad3181..1fb401af540 100644 --- a/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/JsonEndpoint.cs +++ b/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/JsonEndpoint.cs @@ -1,6 +1,6 @@ namespace Benchmarks.Endpoints; -public sealed class JsonEndpoint : Endpoint +sealed class JsonEndpoint : Ep.NoReq.Res { public override void Configure() { @@ -8,9 +8,10 @@ public override void Configure() AllowAnonymous(); } - public override Task HandleAsync(EmptyRequest _, CancellationToken __) + public override Task HandleAsync(CancellationToken ct) { HttpContext.Response.ContentLength = 27; + return SendAsync(new { message = "Hello, World!" }); } } \ No newline at end of file diff --git a/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/PlainTextEndpoint.cs b/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/PlainTextEndpoint.cs index 23a8eb36546..af7e31d2386 100644 --- a/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/PlainTextEndpoint.cs +++ b/frameworks/CSharp/fastendpoints/Benchmarks/Endpoints/PlainTextEndpoint.cs @@ -1,8 +1,8 @@ namespace Benchmarks.Endpoints; -public sealed class PlainTextEndpoint : Endpoint +sealed class PlainTextEndpoint : Ep.NoReq.Res { - private static readonly byte[] payload = System.Text.Encoding.UTF8.GetBytes("Hello, World!"); + static readonly byte[] _payload = "Hello, World!"u8.ToArray(); public override void Configure() { @@ -10,11 +10,12 @@ public override void Configure() AllowAnonymous(); } - public override Task HandleAsync(EmptyRequest _, CancellationToken __) + public override Task HandleAsync(CancellationToken ct) { HttpContext.Response.StatusCode = StatusCodes.Status200OK; HttpContext.Response.ContentType = "text/plain"; - HttpContext.Response.ContentLength = payload.Length; - return HttpContext.Response.Body.WriteAsync(payload, 0, payload.Length); + HttpContext.Response.ContentLength = _payload.Length; + + return HttpContext.Response.Body.WriteAsync(_payload, 0, _payload.Length); } } \ No newline at end of file diff --git a/frameworks/CSharp/fastendpoints/Benchmarks/Program.cs b/frameworks/CSharp/fastendpoints/Benchmarks/Program.cs index 0cafb905e95..5b5aacbb6e8 100644 --- a/frameworks/CSharp/fastendpoints/Benchmarks/Program.cs +++ b/frameworks/CSharp/fastendpoints/Benchmarks/Program.cs @@ -1,9 +1,9 @@ global using FastEndpoints; -var builder = WebApplication.CreateBuilder(); -builder.Logging.ClearProviders(); -builder.Services.AddFastEndpoints(); +var bld = WebApplication.CreateBuilder(); +bld.Logging.ClearProviders(); +bld.Services.AddFastEndpoints(); -var app = builder.Build(); +var app = bld.Build(); app.UseFastEndpoints(); -app.Run("http://0.0.0.0:8080"); +app.Run("http://0.0.0.0:8080"); \ No newline at end of file diff --git a/frameworks/CSharp/fastendpoints/README.md b/frameworks/CSharp/fastendpoints/README.md index 327f2749ab1..768b79ba75e 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# 12.0 +* C# 13.0 **Platforms** -* .NET 8 (Windows and Linux) +* .NET 9 (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 8 +* ASP.NET 9 ## Paths & Source for Tests diff --git a/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile b/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile index 08419edaf8f..cd6de83683d 100644 --- a/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile +++ b/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile @@ -1,9 +1,13 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /app COPY Benchmarks . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 + WORKDIR /app COPY --from=build /app/out ./ From 83bb868a8fc23bb944ce5867d7b751a43e71adc1 Mon Sep 17 00:00:00 2001 From: Ajay Kidave <130696958+akclace@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:28:05 -0800 Subject: [PATCH 1172/1766] Added localhost path (#9565) --- frameworks/Python/clace/run.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Python/clace/run.sh b/frameworks/Python/clace/run.sh index d5dc87d345e..311de74eaed 100755 --- a/frameworks/Python/clace/run.sh +++ b/frameworks/Python/clace/run.sh @@ -15,5 +15,6 @@ EOF clace server start & sleep 2 +clace app create --auth=none --approve /clace / clace app create --auth=none --approve /clace tfb-server:/ tail -f /dev/null From 83db59049a3375be85a1d123be9ebb2b7338a94c Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Mon, 3 Mar 2025 15:28:10 +0100 Subject: [PATCH 1173/1766] [ Kotlin / Hexagon ] Benchmark next release (#9563) * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Fix native image settings * Change implementations * Update version * Add tests for new adapter * Update dependencies * Update dependencies --- .../Kotlin/hexagon/benchmark_config.json | 8 ++-- frameworks/Kotlin/hexagon/build.gradle | 20 +++++----- frameworks/Kotlin/hexagon/config.toml | 4 +- frameworks/Kotlin/hexagon/core/build.gradle | 10 ++--- .../hexagon/core/src/main/kotlin/Benchmark.kt | 12 +++--- .../core/src/main/kotlin/Controller.kt | 40 +++++++++---------- .../src/main/kotlin/store/BenchmarkStore.kt | 10 ++--- .../core/native-image.properties | 5 ++- .../core/src/main/resources/fortunes.jte | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 3 +- ...erfile => hexagon-jdk-pgclient.dockerfile} | 8 ++-- ...loom.dockerfile => hexagon-jdk.dockerfile} | 8 ++-- .../hexagon_helidon_pgclient/build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 18 ++++----- .../hexagon_helidon_postgresql/build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 16 ++++---- .../hexagon/hexagon_jdk_pgclient/build.gradle | 7 ++++ .../src/main/kotlin/Benchmark.kt | 25 ++++++++++++ .../hexagon_jdk_postgresql/build.gradle | 8 ++++ .../src/main/kotlin/Benchmark.kt | 25 ++++++++++++ .../hexagon_jetty_pgclient/build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 18 ++++----- .../hexagon_jetty_postgresql/build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 18 ++++----- .../hexagon_nettyepoll_pgclient/build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 16 ++++---- .../build.gradle | 2 +- .../src/main/kotlin/Benchmark.kt | 16 ++++---- .../hexagon_tomcat_postgresql/build.gradle | 2 +- .../src/main/kotlin/WebListenerServer.kt | 26 ++++++------ frameworks/Kotlin/hexagon/model/build.gradle | 2 +- .../hexagon/model/src/main/kotlin/Settings.kt | 6 +-- .../src/main/kotlin/model/CachedWorld.kt | 2 +- .../model/src/main/kotlin/model/Fortune.kt | 2 +- .../model/src/main/kotlin/model/Message.kt | 2 +- .../model/src/main/kotlin/model/World.kt | 2 +- frameworks/Kotlin/hexagon/settings.gradle | 2 + .../src/main/kotlin/BenchmarkPgClientStore.kt | 20 +++++----- .../src/main/kotlin/BenchmarkSqlStore.kt | 20 +++++----- 40 files changed, 233 insertions(+), 164 deletions(-) rename frameworks/Kotlin/hexagon/{hexagon-jettyloom-pgclient.dockerfile => hexagon-jdk-pgclient.dockerfile} (63%) rename frameworks/Kotlin/hexagon/{hexagon-jettyloom.dockerfile => hexagon-jdk.dockerfile} (62%) create mode 100644 frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt create mode 100644 frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/build.gradle create mode 100644 frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index 8155e24b68c..f858301bddd 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -48,7 +48,7 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, - "jettyloom": { + "jdk": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -67,11 +67,11 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Jetty Loom PostgreSQL", + "display_name": "Hexagon JDK PostgreSQL", "notes": "http://hexagonkt.com", "versus": "servlet" }, - "jettyloom-pgclient": { + "jdk-pgclient": { "json_url": "/json", "db_url": "/db", "query_url": "/query?queries=", @@ -90,7 +90,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Hexagon Jetty Loom PgClient", + "display_name": "Hexagon JDK PgClient", "notes": "http://hexagonkt.com", "versus": "servlet" }, diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index f739a6f3418..97818fa7924 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,26 +1,26 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.0.21" apply false - id "org.graalvm.buildtools.native" version "0.10.4" apply false + id "org.jetbrains.kotlin.jvm" version "2.1.0" apply false + id "org.graalvm.buildtools.native" version "0.10.5" apply false } version = "1.0.0" description = "TFB benchmark" -group = "com.hexagonkt" +group = "com.hexagontk" ext { - hexagonVersion = "3.7.3" + hexagonVersion = "4.0.1" jettyVersion = "12.0.16" - nettyVersion = "4.1.116.Final" + nettyVersion = "4.1.118.Final" hikariVersion = "6.2.1" - postgresqlVersion = "42.7.4" - vertxVersion = "4.5.11" + postgresqlVersion = "42.7.5" + vertxVersion = "4.5.12" cache2kVersion = "2.6.1.Final" - applicationClass = "com.hexagonkt.BenchmarkKt" + applicationClass = "com.hexagontk.BenchmarkKt" modules = "java.naming,java.sql,java.management" - gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle" + gradleScripts = "https://raw.githubusercontent.com/hexagontk/hexagon/$hexagonVersion/gradle" } subprojects { @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.10.2" + gradleVersion = "8.12.1" } diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index 6f25ab27753..c9e89f53241 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -19,7 +19,7 @@ platform = "Servlet" webserver = "None" versus = "servlet" -[jettyloom] +[jdk] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" @@ -37,7 +37,7 @@ platform = "Servlet" webserver = "None" versus = "servlet" -[jettyloom-pgclient] +[jdk-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle index 18212db6bee..d4d2650a0dc 100644 --- a/frameworks/Kotlin/hexagon/core/build.gradle +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -1,16 +1,16 @@ plugins { - id("gg.jte.gradle") version("3.1.4") + id("gg.jte.gradle") version("3.1.13") } dependencies { api(project(":model")) - api("com.hexagonkt:http_server:$hexagonVersion") - api("com.hexagonkt:templates_jte:$hexagonVersion") - api("com.hexagonkt:serialization_jackson_json:$hexagonVersion") + api("com.hexagontk.http:http_server:$hexagonVersion") + api("com.hexagontk.templates:templates_jte:$hexagonVersion") + api("com.hexagontk.serialization:serialization_jackson_json:$hexagonVersion") api("org.cache2k:cache2k-core:$cache2kVersion") - jteGenerate("gg.jte:jte-native-resources:3.1.4") + jteGenerate("gg.jte:jte-native-resources:3.1.13") } tasks.register("minimizeTemplate") { diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt index ef2da876dae..128b84ecbc4 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Benchmark.kt @@ -1,10 +1,10 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.http.server.HttpServer -import com.hexagonkt.http.server.HttpServerPort -import com.hexagonkt.http.server.HttpServerSettings -import com.hexagonkt.store.BenchmarkStore -import com.hexagonkt.templates.TemplatePort +import com.hexagontk.http.server.HttpServer +import com.hexagontk.http.server.HttpServerPort +import com.hexagontk.http.server.HttpServerSettings +import com.hexagontk.store.BenchmarkStore +import com.hexagontk.templates.TemplatePort import java.net.InetAddress import java.net.URL diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt index 5bfd17dfcd5..78b36c61401 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt @@ -1,21 +1,21 @@ -package com.hexagonkt - -import com.hexagonkt.core.fieldsMapOf -import com.hexagonkt.core.media.APPLICATION_JSON -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.media.TEXT_PLAIN -import com.hexagonkt.http.model.ContentType -import com.hexagonkt.http.model.Header -import com.hexagonkt.http.model.Headers -import com.hexagonkt.http.server.callbacks.DateCallback -import com.hexagonkt.http.handlers.HttpContext -import com.hexagonkt.http.handlers.PathHandler -import com.hexagonkt.http.handlers.path -import com.hexagonkt.model.* -import com.hexagonkt.serialization.jackson.json.Json -import com.hexagonkt.serialization.serialize -import com.hexagonkt.store.BenchmarkStore -import com.hexagonkt.templates.TemplatePort +package com.hexagontk + +import com.hexagontk.core.fieldsMapOf +import com.hexagontk.core.media.APPLICATION_JSON +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.media.TEXT_PLAIN +import com.hexagontk.http.model.ContentType +import com.hexagontk.http.model.Field +import com.hexagontk.http.model.Headers +import com.hexagontk.http.server.callbacks.DateCallback +import com.hexagontk.http.handlers.HttpContext +import com.hexagontk.http.handlers.PathHandler +import com.hexagontk.http.handlers.path +import com.hexagontk.model.* +import com.hexagontk.serialization.jackson.json.Json +import com.hexagontk.serialization.serialize +import com.hexagontk.store.BenchmarkStore +import com.hexagontk.templates.TemplatePort import java.net.URL import java.util.concurrent.ThreadLocalRandom import kotlin.text.Charsets.UTF_8 @@ -35,7 +35,7 @@ class Controller( private val json: ContentType = ContentType(APPLICATION_JSON) private val html: ContentType = ContentType(TEXT_HTML, charset = UTF_8) - private val headers = Headers(Header("server", "Hexagon")) + private val headers = Headers(Field("server", "Hexagon")) val path: PathHandler by lazy { path { @@ -105,7 +105,7 @@ class Controller( ok(body.serialize(Json.raw), contentType = json) private fun HttpContext.getWorldsCount(parameter: String): Int = - request.queryParameters[parameter]?.string()?.toIntOrNull().let { + request.queryParameters[parameter]?.text?.toIntOrNull().let { when { it == null -> 1 it < 1 -> 1 diff --git a/frameworks/Kotlin/hexagon/core/src/main/kotlin/store/BenchmarkStore.kt b/frameworks/Kotlin/hexagon/core/src/main/kotlin/store/BenchmarkStore.kt index 5182fe4ccae..384c81580f9 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/kotlin/store/BenchmarkStore.kt +++ b/frameworks/Kotlin/hexagon/core/src/main/kotlin/store/BenchmarkStore.kt @@ -1,9 +1,9 @@ -package com.hexagonkt.store +package com.hexagontk.store -import com.hexagonkt.model.CachedWorld -import com.hexagonkt.model.Fortune -import com.hexagonkt.Settings -import com.hexagonkt.model.World +import com.hexagontk.model.CachedWorld +import com.hexagontk.model.Fortune +import com.hexagontk.Settings +import com.hexagontk.model.World import org.cache2k.Cache import org.cache2k.Cache2kBuilder 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 3c802071a99..50844ff8098 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 @@ -3,4 +3,7 @@ Args= \ --static \ --libc=musl \ --gc=G1 \ - --enable-sbom + --enable-sbom \ + --initialize-at-build-time=org.slf4j.LoggerFactory \ + --initialize-at-build-time=org.slf4j.helpers.Reporter \ + --initialize-at-build-time=org.slf4j.LoggerFactoinitialize-at-build-timery diff --git a/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.jte b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.jte index 82b28ce94c3..9c9aabbdb01 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.jte +++ b/frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.jte @@ -1,5 +1,5 @@ @import java.util.* -@import com.hexagonkt.model.Fortune +@import com.hexagontk.model.Fortune @param List fortunes diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index df97d72b8b9..e18bc253b85 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.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index f5feea6d6b1..f3b75f3b0d4 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile similarity index 63% rename from frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile index 21ef3b64c8b..485fff941e5 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build USER root WORKDIR /hexagon @@ -12,8 +12,8 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl -ARG PROJECT=hexagon_jetty_pgclient +FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl +ARG PROJECT=hexagon_jdk_pgclient ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true @@ -21,4 +21,4 @@ ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -ENTRYPOINT [ "/opt/hexagon_jetty_pgclient/bin/hexagon_jetty_pgclient" ] +ENTRYPOINT [ "/opt/hexagon_jdk_pgclient/bin/hexagon_jdk_pgclient" ] diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile similarity index 62% rename from frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile rename to frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile index c51c03bc6db..b82e52e1100 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build USER root WORKDIR /hexagon @@ -12,8 +12,8 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl -ARG PROJECT=hexagon_jetty_postgresql +FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl +ARG PROJECT=hexagon_jdk_postgresql ENV POSTGRESQL_DB_HOST tfb-database ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true @@ -21,4 +21,4 @@ ENV maximumPoolSize 300 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT -ENTRYPOINT [ "/opt/hexagon_jetty_postgresql/bin/hexagon_jetty_postgresql" ] +ENTRYPOINT [ "/opt/hexagon_jdk_postgresql/bin/hexagon_jdk_postgresql" ] diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/build.gradle index 5e64c7bde3f..68a431b25a8 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/build.gradle @@ -4,5 +4,5 @@ apply(from: "$gradleScripts/native.gradle") dependencies { api(project(":store_pgclient")) - api("com.hexagonkt:http_server_helidon:$hexagonVersion") + api("com.hexagontk.http:http_server_helidon:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt index a5778a2c353..2a97cb6ab07 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt @@ -1,18 +1,18 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.Jvm.systemSettingOrNull -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.helidon.HelidonServerAdapter -import com.hexagonkt.store.BenchmarkPgClientStore -import com.hexagonkt.templates.jte.JteAdapter +import com.hexagontk.core.Platform.systemSettingOrNull +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.helidon.HelidonHttpServer +import com.hexagontk.store.BenchmarkPgClientStore +import com.hexagontk.templates.jte.Jte import java.time.Duration fun main() { val store = BenchmarkPgClientStore("postgresql") - val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = HelidonServerAdapter( + val engine = HelidonHttpServer( backlog = systemSettingOrNull("backlog") ?: (8 * 1024), writeQueueLength = systemSettingOrNull("writeQueueLength") ?: (8 * 1024), readTimeout = Duration.parse(systemSettingOrNull("readTimeout") ?: "PT0S"), diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/build.gradle index 1fb3fbffab6..2fa5b450d0c 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/build.gradle @@ -3,5 +3,5 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_sql")) - api("com.hexagonkt:http_server_helidon:$hexagonVersion") + api("com.hexagontk.http:http_server_helidon:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt index cbfb372cbd5..9cbf992c8f4 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt @@ -1,17 +1,17 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.helidon.HelidonServerAdapter -import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.jte.JteAdapter +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.helidon.HelidonHttpServer +import com.hexagontk.store.BenchmarkSqlStore +import com.hexagontk.templates.jte.Jte fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") - val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = HelidonServerAdapter() + val engine = HelidonHttpServer() val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) benchmark.server.start() diff --git a/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/build.gradle new file mode 100644 index 00000000000..52bd337daf9 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/build.gradle @@ -0,0 +1,7 @@ + +apply(from: "$gradleScripts/application.gradle") + +dependencies { + api(project(":store_pgclient")) + api("com.hexagontk.http:http_server_jdk:$hexagonVersion") +} diff --git a/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..d5cdace42f1 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt @@ -0,0 +1,25 @@ +package com.hexagontk + +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.jdk.JdkHttpServer +import com.hexagontk.store.BenchmarkPgClientStore +import com.hexagontk.templates.jte.Jte +import java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor + +fun main() { + System.setProperty("sun.net.httpserver.idleInterval", "5") + System.setProperty("sun.net.httpserver.maxIdleConnections", "400") + + val settings = Settings() + val store = BenchmarkPgClientStore("postgresql") + val templateEngine = Jte(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") + val engine = JdkHttpServer( + executor = newVirtualThreadPerTaskExecutor(), + backlog = 2_048 + ) + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/build.gradle new file mode 100644 index 00000000000..b1ea253c073 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/build.gradle @@ -0,0 +1,8 @@ + +apply(from: "$gradleScripts/application.gradle") +apply(from: "$gradleScripts/native.gradle") + +dependencies { + api(project(":store_sql")) + api("com.hexagontk.http:http_server_jdk:$hexagonVersion") +} diff --git a/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt new file mode 100644 index 00000000000..67d2a3dfba2 --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt @@ -0,0 +1,25 @@ +package com.hexagontk + +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.jdk.JdkHttpServer +import com.hexagontk.store.BenchmarkSqlStore +import com.hexagontk.templates.jte.Jte +import java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor + +fun main() { + System.setProperty("sun.net.httpserver.idleInterval", "5") + System.setProperty("sun.net.httpserver.maxIdleConnections", "400") + + val settings = Settings() + val store = BenchmarkSqlStore("postgresql") + val templateEngine = Jte(TEXT_HTML, precompiled = true) + val templateUrl = urlOf("classpath:fortunes.jte") + val engine = JdkHttpServer( + executor = newVirtualThreadPerTaskExecutor(), + backlog = 2_048 + ) + + val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) + benchmark.server.start() +} diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle index 3b3d4b51b92..a9c2a1b12d2 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle @@ -3,5 +3,5 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_pgclient")) - api("com.hexagonkt:http_server_jetty:$hexagonVersion") + api("com.hexagontk.http:http_server_jetty:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt index c6e8dbcf855..54efe59c383 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt @@ -1,18 +1,18 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.Jvm.systemFlag -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.jetty.JettyServletAdapter -import com.hexagonkt.store.BenchmarkPgClientStore -import com.hexagonkt.templates.jte.JteAdapter +import com.hexagontk.core.Platform.systemFlag +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.jetty.JettyServletHttpServer +import com.hexagontk.store.BenchmarkPgClientStore +import com.hexagontk.templates.jte.Jte fun main() { val settings = Settings() val store = BenchmarkPgClientStore("postgresql") - val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = JettyServletAdapter( + val engine = JettyServletHttpServer( sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, sendXPoweredBy = settings.sendXPoweredBy, diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle index 059804ac9ff..5576046c945 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle @@ -4,5 +4,5 @@ apply(from: "$gradleScripts/native.gradle") dependencies { api(project(":store_sql")) - api("com.hexagonkt:http_server_jetty:$hexagonVersion") + api("com.hexagontk.http:http_server_jetty:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt index 64585b785b6..40d654f2a7f 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt @@ -1,18 +1,18 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.Jvm.systemFlag -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.jetty.JettyServletAdapter -import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.jte.JteAdapter +import com.hexagontk.core.Platform.systemFlag +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.jetty.JettyServletHttpServer +import com.hexagontk.store.BenchmarkSqlStore +import com.hexagontk.templates.jte.Jte fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") - val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = JettyServletAdapter( + val engine = JettyServletHttpServer( sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, sendXPoweredBy = settings.sendXPoweredBy, diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle index 0017123ec54..2a8b788a99f 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle @@ -3,6 +3,6 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_pgclient")) - api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion") + api("com.hexagontk.http:http_server_netty_epoll:$hexagonVersion") api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") } diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt index 0bbd8038edd..f094b7bc217 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt @@ -1,10 +1,10 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter -import com.hexagonkt.store.BenchmarkPgClientStore -import com.hexagonkt.templates.jte.JteAdapter +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.netty.epoll.NettyEpollHttpServer +import com.hexagontk.store.BenchmarkPgClientStore +import com.hexagontk.templates.jte.Jte import io.netty.util.ResourceLeakDetector import io.netty.util.ResourceLeakDetector.Level.DISABLED @@ -16,9 +16,9 @@ fun main() { val settings = Settings() val store = BenchmarkPgClientStore("postgresql") - val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = NettyEpollServerAdapter( + val engine = NettyEpollHttpServer( keepAliveHandler = false, httpAggregatorHandler = false, chunkedHandler = false, diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle index 243fa57c121..3c142f1f1c6 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle @@ -3,6 +3,6 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_sql")) - api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion") + api("com.hexagontk.http:http_server_netty_epoll:$hexagonVersion") api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") } diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt index 77fa370b915..eaba3b48b40 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt @@ -1,10 +1,10 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter -import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.jte.JteAdapter +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.server.netty.epoll.NettyEpollHttpServer +import com.hexagontk.store.BenchmarkSqlStore +import com.hexagontk.templates.jte.Jte import io.netty.util.ResourceLeakDetector import io.netty.util.ResourceLeakDetector.Level.DISABLED @@ -16,9 +16,9 @@ fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") - val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = NettyEpollServerAdapter( + val engine = NettyEpollHttpServer( keepAliveHandler = false, httpAggregatorHandler = false, chunkedHandler = false, diff --git a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle index 3c72b9d4b0a..ca5fd01a071 100644 --- a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/build.gradle @@ -9,7 +9,7 @@ build.dependsOn("war") dependencies { api(project(":store_sql")) - api("com.hexagonkt:http_server_servlet:$hexagonVersion") + api("com.hexagontk.http:http_server_servlet:$hexagonVersion") compileOnly("jakarta.servlet:jakarta.servlet-api:5.0.0") } diff --git a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt index c7d7ea4449c..d50232ab974 100644 --- a/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt +++ b/frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt @@ -1,15 +1,15 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.media.TEXT_HTML -import com.hexagonkt.core.urlOf -import com.hexagonkt.http.model.Header -import com.hexagonkt.http.model.Headers -import com.hexagonkt.http.handlers.HttpHandler -import com.hexagonkt.http.handlers.OnHandler -import com.hexagonkt.http.handlers.PathHandler -import com.hexagonkt.http.server.servlet.ServletServer -import com.hexagonkt.store.BenchmarkSqlStore -import com.hexagonkt.templates.jte.JteAdapter +import com.hexagontk.core.media.TEXT_HTML +import com.hexagontk.core.urlOf +import com.hexagontk.http.model.Field +import com.hexagontk.http.model.Headers +import com.hexagontk.http.handlers.HttpHandler +import com.hexagontk.http.handlers.OnHandler +import com.hexagontk.http.handlers.PathHandler +import com.hexagontk.http.server.servlet.ServletServer +import com.hexagontk.store.BenchmarkSqlStore +import com.hexagontk.templates.jte.Jte import jakarta.servlet.annotation.WebListener @WebListener class WebListenerServer( @@ -17,11 +17,11 @@ import jakarta.servlet.annotation.WebListener ) : ServletServer(createHandlers(settings)) { private companion object { - val headers = Headers(Header("server", "Tomcat")) + val headers = Headers(Field("server", "Tomcat")) fun createHandlers(settings: Settings): HttpHandler { val store = BenchmarkSqlStore("postgresql") - val templateEngine = JteAdapter(TEXT_HTML, precompiled = true) + val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") val controller = Controller(settings, store, templateEngine, templateUrl) val controllerPath = controller.path diff --git a/frameworks/Kotlin/hexagon/model/build.gradle b/frameworks/Kotlin/hexagon/model/build.gradle index bb97bfd9a3d..a606fb03967 100644 --- a/frameworks/Kotlin/hexagon/model/build.gradle +++ b/frameworks/Kotlin/hexagon/model/build.gradle @@ -1,4 +1,4 @@ dependencies { - api("com.hexagonkt:core:$hexagonVersion") + api("com.hexagontk:core:$hexagonVersion") } diff --git a/frameworks/Kotlin/hexagon/model/src/main/kotlin/Settings.kt b/frameworks/Kotlin/hexagon/model/src/main/kotlin/Settings.kt index b11ed02c9e9..70fdd0f5b81 100644 --- a/frameworks/Kotlin/hexagon/model/src/main/kotlin/Settings.kt +++ b/frameworks/Kotlin/hexagon/model/src/main/kotlin/Settings.kt @@ -1,7 +1,7 @@ -package com.hexagonkt +package com.hexagontk -import com.hexagonkt.core.Jvm.systemFlag -import com.hexagonkt.core.Jvm.systemSettingOrNull +import com.hexagontk.core.Platform.systemFlag +import com.hexagontk.core.Platform.systemSettingOrNull data class Settings( val bindPort: Int = systemSettingOrNull("bindPort") ?: 9090, diff --git a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/CachedWorld.kt b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/CachedWorld.kt index 101176e3c39..edfa5ee0ec5 100644 --- a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/CachedWorld.kt +++ b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/CachedWorld.kt @@ -1,3 +1,3 @@ -package com.hexagonkt.model +package com.hexagontk.model data class CachedWorld(val id: Int, val randomNumber: Int) diff --git a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Fortune.kt b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Fortune.kt index b4781735ec1..a8061b81db3 100644 --- a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Fortune.kt +++ b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Fortune.kt @@ -1,3 +1,3 @@ -package com.hexagonkt.model +package com.hexagontk.model data class Fortune(val id: Int, val message: String) diff --git a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Message.kt b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Message.kt index 090dcbf0be6..3231b8bd961 100644 --- a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Message.kt +++ b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Message.kt @@ -1,3 +1,3 @@ -package com.hexagonkt.model +package com.hexagontk.model data class Message(val message: String) diff --git a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/World.kt b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/World.kt index 5f3316f9a5a..347e00e608f 100644 --- a/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/World.kt +++ b/frameworks/Kotlin/hexagon/model/src/main/kotlin/model/World.kt @@ -1,3 +1,3 @@ -package com.hexagonkt.model +package com.hexagontk.model data class World(val id: Int, val randomNumber: Int) diff --git a/frameworks/Kotlin/hexagon/settings.gradle b/frameworks/Kotlin/hexagon/settings.gradle index f7b97fb2582..2636b07ef6a 100644 --- a/frameworks/Kotlin/hexagon/settings.gradle +++ b/frameworks/Kotlin/hexagon/settings.gradle @@ -9,6 +9,8 @@ include( "hexagon_jetty_postgresql", "hexagon_helidon_pgclient", "hexagon_helidon_postgresql", + "hexagon_jdk_pgclient", + "hexagon_jdk_postgresql", "hexagon_nettyepoll_pgclient", "hexagon_nettyepoll_postgresql", "hexagon_tomcat_postgresql", diff --git a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt index 2b09d73f6f5..02359461502 100644 --- a/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt +++ b/frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt @@ -1,10 +1,10 @@ -package com.hexagonkt.store +package com.hexagontk.store -import com.hexagonkt.Settings -import com.hexagonkt.core.Jvm -import com.hexagonkt.model.CachedWorld -import com.hexagonkt.model.Fortune -import com.hexagonkt.model.World +import com.hexagontk.Settings +import com.hexagontk.core.Platform +import com.hexagontk.model.CachedWorld +import com.hexagontk.model.Fortune +import com.hexagontk.model.World import io.vertx.core.Future import io.vertx.core.Vertx import io.vertx.core.VertxOptions @@ -27,7 +27,7 @@ class BenchmarkPgClientStore( private val connectOptions: PgConnectOptions by lazy { PgConnectOptions().apply { - host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" + host = Platform.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" database = settings.databaseName user = settings.databaseUsername password = settings.databasePassword @@ -37,9 +37,9 @@ class BenchmarkPgClientStore( private val poolOptions: PoolOptions by lazy { PoolOptions().apply { - val environment = Jvm.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() - val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 - maxSize = Jvm.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize + val environment = Platform.systemSettingOrNull("BENCHMARK_ENV")?.lowercase() + val poolSize = 8 + if (environment == "citrine") Platform.cpuCount else Platform.cpuCount * 2 + maxSize = Platform.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize } } diff --git a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt index 14558b1a2bd..126a9fc946a 100644 --- a/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt +++ b/frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt @@ -1,10 +1,10 @@ -package com.hexagonkt.store +package com.hexagontk.store -import com.hexagonkt.model.CachedWorld -import com.hexagonkt.model.Fortune -import com.hexagonkt.Settings -import com.hexagonkt.model.World -import com.hexagonkt.core.Jvm +import com.hexagontk.model.CachedWorld +import com.hexagontk.model.Fortune +import com.hexagontk.Settings +import com.hexagontk.model.World +import com.hexagontk.core.Platform import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import org.cache2k.Cache @@ -23,9 +23,9 @@ class BenchmarkSqlStore( } private val dataSource: HikariDataSource by lazy { - val dbHost = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" - val environment = Jvm.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase() - val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2 + val dbHost = Platform.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database" + val environment = Platform.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase() + val poolSize = 8 + if (environment == "citrine") Platform.cpuCount else Platform.cpuCount * 2 val postgresqlSettings = listOf( "ssl=false", "assumeMinServerVersion=12.10", @@ -35,7 +35,7 @@ class BenchmarkSqlStore( ).joinToString("&") val config = HikariConfig().apply { jdbcUrl = "jdbc:postgresql://$dbHost/${settings.databaseName}?$postgresqlSettings" - maximumPoolSize = Jvm.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize + maximumPoolSize = Platform.systemSettingOrNull(Int::class, "maximumPoolSize") ?: poolSize driverClassName = settings.databaseDriver username = settings.databaseUsername password = settings.databasePassword From 434803dd81c57c51f6a5e310fb9f221f99e38d6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 3 Mar 2025 22:28:22 +0800 Subject: [PATCH 1174/1766] upgrade feat (#9562) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 * 适配最新版 --- .../Java/smart-socket/benchmark_config.json | 6 ++-- ...ckerfile => feat-smart-servlet.dockerfile} | 4 +-- ...mart-socket.dockerfile => feat.dockerfile} | 4 +-- frameworks/Java/smart-socket/pom.xml | 33 ++++++++++++----- .../java/org/smartboot/http/Bootstrap.java | 35 ++++++++++--------- .../org/smartboot/http/FeatController.java | 24 +++++++++++++ 6 files changed, 73 insertions(+), 33 deletions(-) rename frameworks/Java/smart-socket/{smart-socket-smart-servlet.dockerfile => feat-smart-servlet.dockerfile} (82%) rename frameworks/Java/smart-socket/{smart-socket.dockerfile => feat.dockerfile} (82%) create mode 100644 frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java diff --git a/frameworks/Java/smart-socket/benchmark_config.json b/frameworks/Java/smart-socket/benchmark_config.json index 7a26d71ed56..040fb6bdee9 100755 --- a/frameworks/Java/smart-socket/benchmark_config.json +++ b/frameworks/Java/smart-socket/benchmark_config.json @@ -1,5 +1,5 @@ { - "framework": "smart-socket", + "framework": "feat", "tests": [ { "default": { @@ -17,9 +17,9 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "smart-socket", + "display_name": "feat", "notes": "", - "versus": "smart-socket" + "versus": "feat" }, "smart-servlet": { "json_url": "/json", diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/feat-smart-servlet.dockerfile similarity index 82% rename from frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile rename to frameworks/Java/smart-socket/feat-smart-servlet.dockerfile index bb0b9258ec4..4209283ec42 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/feat-smart-servlet.dockerfile @@ -2,11 +2,11 @@ FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src -RUN mvn compile assembly:single -q +RUN mvn install -q 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 +COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0.jar app.jar EXPOSE 8080 diff --git a/frameworks/Java/smart-socket/smart-socket.dockerfile b/frameworks/Java/smart-socket/feat.dockerfile similarity index 82% rename from frameworks/Java/smart-socket/smart-socket.dockerfile rename to frameworks/Java/smart-socket/feat.dockerfile index 4890bd04a06..f7eaec61f67 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/feat.dockerfile @@ -2,11 +2,11 @@ FROM maven:3.9.7-amazoncorretto-21 as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src -RUN mvn compile assembly:single -q +RUN mvn install -q 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 +COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0.jar app.jar EXPOSE 8080 diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 4fe3e7a155f..3f01bb7e61f 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -17,6 +17,11 @@ + + tech.smartboot.feat + feat-restful + 0.5 + io.edap edapx-json @@ -26,6 +31,12 @@ tech.smartboot.servlet servlet-core ${smartservlet.version} + + + tech.smartboot.feat + feat-restful + + com.zaxxer @@ -114,20 +125,24 @@ - maven-assembly-plugin - 3.1.0 - - - jar-with-dependencies - - + maven-shade-plugin + 3.3.0 - make-assembly package - single + shade + + false + + + + META-INF/services/tech.smartboot.feat.core.apt.AptLoader + + + diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index 396b6d02900..e7971b1bc39 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -8,12 +8,7 @@ package org.smartboot.http; -import org.smartboot.Message; -import tech.smartboot.feat.core.Feat; -import tech.smartboot.feat.core.common.enums.HeaderValueEnum; -import tech.smartboot.feat.core.server.HttpHandler; -import tech.smartboot.feat.core.server.HttpRequest; -import tech.smartboot.feat.core.server.HttpResponse; +import tech.smartboot.feat.restful.RestFeat; public class Bootstrap { static byte[] body = "Hello, World!".getBytes(); @@ -21,21 +16,27 @@ public class Bootstrap { public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 - Feat.createHttpServer(options -> { +// Feat.createHttpServer(options -> { +// options.threadNum(cpuNum + 1) +// .headerLimiter(0) +// .readBufferSize(1024 * 4) +// .writeBufferSize(1024 * 4); +// }).httpHandler(request -> { +// HttpResponse response = request.getResponse(); +// if ("/plaintext".equals(request.getRequestURI())) { +// response.setContentLength(body.length); +// response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); +// response.write(body); +// } else if ("/json".equals(request.getRequestURI())) { +// response.setContentType("application/json"); +// JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); +// } +// }).listen(8080); + RestFeat.createServer(options -> { options.threadNum(cpuNum + 1) .headerLimiter(0) .readBufferSize(1024 * 4) .writeBufferSize(1024 * 4); - }).httpHandler(request -> { - HttpResponse response = request.getResponse(); - if ("/plaintext".equals(request.getRequestURI())) { - response.setContentLength(body.length); - response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); - response.write(body); - } else if ("/json".equals(request.getRequestURI())) { - response.setContentType("application/json"); - JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); - } }).listen(8080); } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java new file mode 100644 index 00000000000..8050de77198 --- /dev/null +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java @@ -0,0 +1,24 @@ +package org.smartboot.http; + +import org.smartboot.Message; +import tech.smartboot.feat.core.apt.annotation.Controller; +import tech.smartboot.feat.core.apt.annotation.RequestMapping; +import tech.smartboot.feat.core.common.enums.HeaderValueEnum; +import tech.smartboot.feat.core.server.HttpResponse; + +@Controller +public class FeatController { + static byte[] body = "Hello, World!".getBytes(); + + @RequestMapping("/plaintext") + public byte[] plaintext(HttpResponse response) { + response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); + return body; + } + + @RequestMapping("/json") + public Message json(HttpResponse response) { + response.setContentType(HeaderValueEnum.ContentType.APPLICATION_JSON_UTF8); + return new Message("Hello, World!"); + } +} From 14115253d1268b26e59535ff60866d233a641f7b Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Mon, 3 Mar 2025 22:28:31 +0800 Subject: [PATCH 1175/1766] [Paozhu] new orm module (#9546) * update new test * update new test * fix directory error * fix db update error * fix db update error * fix db update error * fix db update error * fix paozhu * update paozhu * update paozhu * update paozhu * update paozhu --- frameworks/C++/paozhu/paozhu.dockerfile | 90 +- .../paozhu/paozhu_benchmark/CMakeLists.txt | 175 +- .../common/autocontrolmethod.hpp | 27 +- .../paozhu_benchmark/common/cost_define.h | 3 + .../paozhu_benchmark/common/httphook.cpp | 15 +- .../C++/paozhu/paozhu_benchmark/conf/orm.conf | 6 +- .../paozhu/paozhu_benchmark/conf/server.conf | 22 +- .../controller/include/techempower.h | 20 +- .../controller/src/techempower.cpp | 389 +- .../paozhu_benchmark/models/Fortune.cpp | 14 +- .../paozhu/paozhu_benchmark/models/World.cpp | 14 +- .../paozhu_benchmark/models/include/Fortune.h | 6 +- .../paozhu_benchmark/models/include/World.h | 6 +- .../orm/include/fortune_mysql.h | 9788 +++++++++++++++++ .../orm/include/fortunebase.h | 599 +- .../orm/include/world_mysql.h | 9628 ++++++++++++++++ .../paozhu_benchmark/orm/include/worldbase.h | 593 +- 17 files changed, 20368 insertions(+), 1027 deletions(-) mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h create mode 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h mode change 100755 => 100644 frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 7381d0e9ac9..212773c8bea 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -4,8 +4,8 @@ RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential l RUN apt-get -y install brotli libbrotli-dev RUN apt-get -y install libreadline-dev -RUN apt-get -y install mysql-client -RUN apt-get -y install libmysqlclient-dev +# RUN apt-get -y install mysql-client +# RUN apt-get -y install libmysqlclient-dev RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 @@ -18,13 +18,13 @@ WORKDIR / # RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip RUN git clone https://github.com/hggq/paozhu # RUN unzip benchmark.zip -# RUN rm -Rf ./paozhu/controller -# RUN rm -Rf ./paozhu/libs +RUN rm -Rf ./paozhu/controller +RUN rm -Rf ./paozhu/libs # RUN rm -Rf ./paozhu/view -# RUN rm -Rf ./paozhu/viewsrc -# RUN rm -Rf ./paozhu/orm -# RUN rm -Rf ./paozhu/models -# RUN rm -Rf ./paozhu/common +RUN rm -Rf ./paozhu/viewsrc +RUN rm -Rf ./paozhu/orm +RUN rm -Rf ./paozhu/models +RUN rm -Rf ./paozhu/common @@ -39,29 +39,29 @@ RUN git clone https://github.com/hggq/paozhu # RUN ls -l ./paozhu # RUN pwd -# RUN mkdir ./paozhu/common -# RUN mkdir ./paozhu/libs -# RUN mkdir ./paozhu/libs/types -# COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ -# COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ +RUN mkdir ./paozhu/common +RUN mkdir ./paozhu/libs +RUN mkdir ./paozhu/libs/types +COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ +COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/ -# RUN mkdir ./paozhu/controller -# RUN mkdir ./paozhu/controller/include -# RUN mkdir ./paozhu/controller/src +RUN mkdir ./paozhu/controller +RUN mkdir ./paozhu/controller/include +RUN mkdir ./paozhu/controller/src -# COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ -# COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ +COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/ +COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/ -# COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ -# COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ -# COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ -# COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ +COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ +COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf @@ -74,32 +74,34 @@ COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt # COPY ./paozhu_benchmark/view/techempower/fortunes.html ./paozhu/view/techempower/ -# RUN mkdir ./paozhu/viewsrc -# RUN mkdir ./paozhu/viewsrc/include -# RUN mkdir ./paozhu/viewsrc/view -# RUN mkdir ./paozhu/viewsrc/view/techempower +RUN mkdir ./paozhu/viewsrc +RUN mkdir ./paozhu/viewsrc/include +RUN mkdir ./paozhu/viewsrc/view +RUN mkdir ./paozhu/viewsrc/view/techempower -# COPY ./paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp ./paozhu/viewsrc/view/techempower/ -# COPY ./paozhu_benchmark/viewsrc/include/viewsrc.h ./paozhu/viewsrc/include/ -# COPY ./paozhu_benchmark/viewsrc/include/regviewmethod.hpp ./paozhu/viewsrc/include/ +COPY ./paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp ./paozhu/viewsrc/view/techempower/ +COPY ./paozhu_benchmark/viewsrc/include/viewsrc.h ./paozhu/viewsrc/include/ +COPY ./paozhu_benchmark/viewsrc/include/regviewmethod.hpp ./paozhu/viewsrc/include/ -# RUN mkdir ./paozhu/orm -# RUN mkdir ./paozhu/orm/include +RUN mkdir ./paozhu/orm +RUN mkdir ./paozhu/orm/include -# COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ -# COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ -# COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ +COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/fortune_mysql.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/world_mysql.h ./paozhu/orm/include/ -# RUN mkdir ./paozhu/models -# RUN mkdir ./paozhu/models/include +RUN mkdir ./paozhu/models +RUN mkdir ./paozhu/models/include -# COPY ./paozhu_benchmark/models/include/Fortune.h ./paozhu/models/include/ -# COPY ./paozhu_benchmark/models/include/World.h ./paozhu/models/include/ -# COPY ./paozhu_benchmark/models/World.cpp ./paozhu/models/ -# COPY ./paozhu_benchmark/models/Fortune.cpp ./paozhu/models/ +COPY ./paozhu_benchmark/models/include/Fortune.h ./paozhu/models/include/ +COPY ./paozhu_benchmark/models/include/World.h ./paozhu/models/include/ +COPY ./paozhu_benchmark/models/World.cpp ./paozhu/models/ +COPY ./paozhu_benchmark/models/Fortune.cpp ./paozhu/models/ WORKDIR /paozhu RUN unzip asio.zip diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index 611a71394bb..a25af789299 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -73,7 +73,7 @@ if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) endif () else() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/include " ) endif () message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") @@ -86,7 +86,7 @@ elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) endif () else () set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -DBENCHMARK -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -DBENCHMARK -I/usr/local/include -I/usr/include " ) file(MAKE_DIRECTORY /usr/local/etc/paozhu) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/) endif () @@ -95,7 +95,7 @@ elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) else() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra") message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DBENCHMARK -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/include " ) if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") @@ -122,6 +122,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/orm) if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre) file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre) @@ -191,7 +192,7 @@ include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs) include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include) include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/common) -add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp) +add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/mysql_conn.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/mysql_conn_pool.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/clientdatacache.cpp) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) @@ -230,14 +231,17 @@ if (ENABLE_VCPKG) target_link_libraries(paozhu ZLIB::ZLIB) # find_package(libmysql REQUIRED) - find_package(unofficial-libmariadb CONFIG REQUIRED) - find_path(MYSQL_ROOT_DIR mysql) + # find_package(unofficial-libmariadb CONFIG REQUIRED) + # find_path(MYSQL_ROOT_DIR mysql) # target_link_libraries(paozhu ${MYSQL_LIBRARIES}) # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES}) - target_link_libraries(paozhu unofficial::libmariadb) - target_link_libraries(paozhu_cli unofficial::libmariadb) - target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) - target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) + # target_link_libraries(paozhu unofficial::libmariadb) + # target_link_libraries(paozhu_cli unofficial::libmariadb) + # target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql) + # target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql) + + target_link_libraries(paozhu_cli asio::asio) + target_link_libraries(paozhu_cli OpenSSL::Crypto OpenSSL::SSL) if (ENABLE_GD STREQUAL "ON") find_package(PkgConfig) @@ -331,6 +335,9 @@ if(OPENSSL_FOUND) INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}") target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY}) target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY}) + + target_link_libraries (paozhu_cli ${OPENSSL_SSL_LIBRARY}) + target_link_libraries (paozhu_cli ${OPENSSL_CRYPTO_LIBRARY}) endif() @@ -343,80 +350,80 @@ if(ZLIB_FOUND) endif() -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - if (IS_DIRECTORY "/usr/local/mysql/include") - MESSAGE( STATUS "/usr/local/mysql") - set(MYSQL_INCLUDE_DIR "/usr/local/mysql/include") - include_sub_directories_recursively(/usr/local/mysql/include) - endif() - - if (IS_DIRECTORY "/usr/local/opt/mysql-client") - MESSAGE( STATUS "/usr/local/opt/mysql-client") - set(MYSQL_INCLUDE_DIR "/usr/local/opt/mysql-client/include") - include_sub_directories_recursively(/usr/local/opt/mysql-client/include) - endif() - - if (IS_DIRECTORY "/opt/homebrew/opt/mysql") - MESSAGE( STATUS "/opt/homebrew/opt/mysql") - set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql/include") - include_sub_directories_recursively(/opt/homebrew/opt/mysql/include) - endif() - - - if (IS_DIRECTORY "/opt/homebrew/opt/mysql-client") - MESSAGE( STATUS "/opt/homebrew/opt/mysql-client") - set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql-client/include") - include_sub_directories_recursively(/opt/homebrew/opt/mysql-client/include) - endif() - MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") -else() - find_path(MYSQL_ROOT_DIR mysql) -endif() - - -FIND_PATH(MYSQL_INCLUDE_DIR NAMES mysql.h - PATHS /usr/local/include/mysql /usr/include/mysql /opt/homebrew/opt/mysql/include /usr/local/opt/mysql-client/include /opt/homebrew/opt/mysql-client/include -) - -MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") -find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) - - -if(NOT MYSQL_INCLUDE_DIR) - message(STATUS "Could not find \"mysql.h\" from searching ") -endif() - -SET(MYSQL_NAMES mysqlclient) -FIND_LIBRARY(MYSQL_LIBRARY - NAMES ${MYSQL_NAMES} - PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib /usr/local/opt/mysql/lib /opt/homebrew/opt/mysql/lib /opt/homebrew/opt/mysql-client/lib - PATH_SUFFIXES mysql -) - -IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - SET(MYSQL_FOUND TRUE) - SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) -ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - SET(MYSQL_FOUND FALSE) - SET( MYSQL_LIBRARIES ) -ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) - -IF (MYSQL_FOUND) - IF (NOT MYSQL_FIND_QUIETLY) - MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") - ENDIF (NOT MYSQL_FIND_QUIETLY) -ELSE (MYSQL_FOUND) - IF (MYSQL_FIND_REQUIRED) - MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") - MESSAGE(FATAL_ERROR "Could NOT find MySQL library") - ENDIF (MYSQL_FIND_REQUIRED) -ENDIF (MYSQL_FOUND) - -target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) -target_link_libraries(paozhu ${MYSQL_LIBRARY}) - -target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) -target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) +#if(CMAKE_SYSTEM_NAME MATCHES "Darwin") +# if (IS_DIRECTORY "/usr/local/mysql/include") +# MESSAGE( STATUS "/usr/local/mysql") +# set(MYSQL_INCLUDE_DIR "/usr/local/mysql/include") +# include_sub_directories_recursively(/usr/local/mysql/include) +# endif() +# +# if (IS_DIRECTORY "/usr/local/opt/mysql-client") +# MESSAGE( STATUS "/usr/local/opt/mysql-client") +# set(MYSQL_INCLUDE_DIR "/usr/local/opt/mysql-client/include") +# include_sub_directories_recursively(/usr/local/opt/mysql-client/include) +# endif() +# +# if (IS_DIRECTORY "/opt/homebrew/opt/mysql") +# MESSAGE( STATUS "/opt/homebrew/opt/mysql") +# set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql/include") +# include_sub_directories_recursively(/opt/homebrew/opt/mysql/include) +# endif() +# +# +# if (IS_DIRECTORY "/opt/homebrew/opt/mysql-client") +# MESSAGE( STATUS "/opt/homebrew/opt/mysql-client") +# set(MYSQL_INCLUDE_DIR "/opt/homebrew/opt/mysql-client/include") +# include_sub_directories_recursively(/opt/homebrew/opt/mysql-client/include) +# endif() +# MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +#else() +# find_path(MYSQL_ROOT_DIR mysql) +#endif() +# +# +# FIND_PATH(MYSQL_INCLUDE_DIR NAMES mysql.h +# PATHS /usr/local/include/mysql /usr/include/mysql /opt/homebrew/opt/mysql/include /usr/local/opt/mysql-client/include /opt/homebrew/opt/mysql-client/include +# ) +# +# MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ") +# find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR) +# +# +# if(NOT MYSQL_INCLUDE_DIR) +# message(STATUS "Could not find \"mysql.h\" from searching ") +# endif() +# +# SET(MYSQL_NAMES mysqlclient) +# FIND_LIBRARY(MYSQL_LIBRARY +# NAMES ${MYSQL_NAMES} +# PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib /usr/local/opt/mysql/lib /opt/homebrew/opt/mysql/lib /opt/homebrew/opt/mysql-client/lib +# PATH_SUFFIXES mysql +# ) +# +# IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) +# SET(MYSQL_FOUND TRUE) +# SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) +# ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) +# SET(MYSQL_FOUND FALSE) +# SET( MYSQL_LIBRARIES ) +# ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) +# +# IF (MYSQL_FOUND) +# IF (NOT MYSQL_FIND_QUIETLY) +# MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") +# ENDIF (NOT MYSQL_FIND_QUIETLY) +# ELSE (MYSQL_FOUND) +# IF (MYSQL_FIND_REQUIRED) +# MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") +# MESSAGE(FATAL_ERROR "Could NOT find MySQL library") +# ENDIF (MYSQL_FIND_REQUIRED) +# ENDIF (MYSQL_FOUND) +# +# target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR}) +# target_link_libraries(paozhu ${MYSQL_LIBRARY}) +# +# target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR}) +# target_link_libraries(paozhu_cli ${MYSQL_LIBRARY}) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp index 46d8979692a..b793d7f8d5e 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp @@ -9,14 +9,21 @@ #include "httppeer.h" #include "techempower.h" + +namespace http +{ + + void _initauto_control_httpmethodregto(std::map &methodcallback) + { + struct regmethold_t temp; -namespace http -{ - void _initauto_control_httpmethodregto(std::map &methodcallback) - { - struct regmethold_t temp; + } + + void _initauto_co_control_httpmethodregto(std::map &methodcallback) + { + struct regmethold_co_t temp; temp.pre = nullptr; temp.regfun = techempowerplaintext; methodcallback.emplace("plaintext",temp); @@ -54,8 +61,16 @@ namespace http } -} + void _initauto_co_domain_httpmethodregto(std::map> &domain_methodcallback) + { + struct regmethold_co_t temp; + std::map methodcallback; + std::map>::iterator domain_iterator; + + } + +} #endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h index 47fb182f0e0..ef54468d7be 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h @@ -6,4 +6,7 @@ #define CONST_HTTP_HEADER_BODY_SIZE 16384 #define CONST_PHP_BODY_POST_SIZE 16777216 +#define CONST_HTTP_BODY_POST_SIZE 33554432 +#define CONST_HTTP_JSON_POST_SIZE 2097152 + #endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp index 3440c23f84b..327ecab4b71 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/httphook.cpp @@ -8,13 +8,24 @@ #include #include #include "httppeer.h" +#include "client_session.h" namespace http { std::map _block_ip_tables; std::map _block_host_tables; -bool check_blockip(const std::string &client_ip) +std::map _passport_ip_tables; +std::map _passport_host_tables; +bool check_blockip(std::shared_ptr peer_session) { - if (client_ip.size() > 0) + if (peer_session->isssl) + { + return false; + } + return false; +} +bool check_pressl_blockip(std::shared_ptr peer_session) +{ + if (peer_session->isssl) { return false; } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf index 1700d25a66e..b8eae8460ab 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf @@ -6,7 +6,8 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=5 +maxpool=120 +minpool=30 dbtype=mysql type=second @@ -16,5 +17,6 @@ dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass pretable= -maxpool=20 +maxpool=120 +minpool=30 dbtype=mysql diff --git a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf index 9013265e678..265e2193570 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf +++ b/frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf @@ -18,19 +18,19 @@ clean_cron =m5t600 ;5-minute interval clean 600 seconds ago inactive connection links_restart_process =n9998877ts1te5 ;More than 15000 connections, restart the process from 1:00 am to 5:00 am session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve static_file_compress_cache=1 ;1 enable, Cache static file compress(gzip,br) content to cache directory -modelspath=/root/benchmark/models -serverpath=/root/benchmark -viewpath=/root/benchmark/view -viewsopath=/root/benchmark/module/view +modelspath=/paozhu/models +serverpath=/paozhu +viewpath=/paozhu/view +viewsopath=/paozhu/module/view -controlpath=/root/benchmark/controller -controlsopath=/root/benchmark/module/controller +controlpath=/paozhu/controller +controlsopath=/paozhu/module/controller -temppath=/root/benchmark/temp -logpath=/root/benchmark/log -wwwpath=/root/benchmark/www/default -pluginspath=/root/benchmark/plugins -libspath=/root/benchmark/libs +temppath=/paozhu/temp +logpath=/paozhu/log +wwwpath=/paozhu/www/default +pluginspath=/paozhu/plugins +libspath=/paozhu/libs directorylist=0 index=index.html ;usehtmlcache=1 diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h old mode 100755 new mode 100644 index f1697f616b9..ce43babe19f --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h @@ -5,15 +5,13 @@ #include "httppeer.h" namespace http -{ - - - std::string techempowerplaintext(std::shared_ptr peer); - std::string techempowerjson(std::shared_ptr peer); - std::string techempowerdb(std::shared_ptr peer); - std::string techempowerqueries(std::shared_ptr peer); - std::string techempowerfortunes(std::shared_ptr peer); - std::string techempowerupdates(std::shared_ptr peer); - std::string techempowercached_queries(std::shared_ptr peer); - std::string techempowercached_db(std::shared_ptr peer); +{ + asio::awaitable techempowerplaintext(std::shared_ptr peer); + asio::awaitable techempowerjson(std::shared_ptr peer); + asio::awaitable techempowerdb(std::shared_ptr peer); + asio::awaitable techempowerqueries(std::shared_ptr peer); + asio::awaitable techempowerfortunes(std::shared_ptr peer); + asio::awaitable techempowerupdates(std::shared_ptr peer); + asio::awaitable techempowercached_queries(std::shared_ptr peer); + asio::awaitable techempowercached_db(std::shared_ptr peer); } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index f8dfe230acd..f3111732864 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -6,236 +6,245 @@ #include #include "httppeer.h" #include "techempower.h" +#include "techempower_json.h" #include "datetime.h" #include "func.h" #include "pzcache.h" #include "json_reflect_headers.h" -#include "techempower_json.h" namespace http { - //@urlpath(null,plaintext) - std::string techempowerplaintext(std::shared_ptr peer) +//@urlpath(null,plaintext) +asio::awaitable techempowerplaintext(std::shared_ptr peer) +{ + peer->type("text/plain; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + peer->output = "Hello, World!"; + co_return ""; +} + +//@urlpath(null,json) +asio::awaitable techempowerjson(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + struct techempower_outjson_t a; + a.message = "Hello, World!"; + peer->output = json_encode(a); + co_return ""; +} + +//@urlpath(null,db) +asio::awaitable techempowerdb(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + auto myworld = orm::World(); + unsigned int rd_num = rand_range(1, 10000); + myworld.where("id", rd_num); + myworld.limit(1); + co_await myworld.async_fetch_one(); + peer->output = myworld.data_tojson(); + co_return ""; +} + +//@urlpath(null,queries) +asio::awaitable techempowerqueries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + unsigned int get_num = peer->get["queries"].to_int(); + if (get_num == 0) { - peer->type("text/plain; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - peer->output = "Hello, World!"; - return ""; + get_num = 1; } - - //@urlpath(null,json) - std::string techempowerjson(std::shared_ptr peer) + else if (get_num > 500) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - struct techempower_outjson_t a; - a.message = "Hello, World!"; - peer->output = json_encode(a); - return ""; + get_num = 500; } - - //@urlpath(null,db) - std::string techempowerdb(std::shared_ptr peer) + auto myworld = orm::World(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - auto myworld = orm::World(); + myworld.wheresql.clear(); unsigned int rd_num = rand_range(1, 10000); - myworld.get_one(rd_num); - - peer->output = myworld.data_tojson(); - return ""; + myworld.where("id", rd_num); + co_await myworld.async_fetch_append(); } - //@urlpath(null,queries) - std::string techempowerqueries(std::shared_ptr peer) - { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); + peer->output = myworld.to_json(); + co_return ""; +} - unsigned int get_num = peer->get["queries"].to_int(); - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) - { - myworld.wheresql.clear(); - unsigned int rd_num = rand_range(1, 10000); - myworld.where("id", rd_num).fetch_append(); - } - - peer->output = myworld.to_json(); - return ""; +//@urlpath(null,fortunes) +asio::awaitable techempowerfortunes(std::shared_ptr peer) +{ + peer->type("text/html; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + + auto myfortune = orm::Fortune(); + co_await myfortune.async_fetch(); + myfortune.data.id = 0; + myfortune.data.message = "Additional fortune added at request time."; + myfortune.record.push_back(myfortune.data); + + std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) + { return lhs.message < rhs.message; }); + peer->val["list"].set_array(); + OBJ_ARRAY item; + for (unsigned int i = 0; i < myfortune.record.size(); i++) + { + item["id"] = myfortune.record[i].id; + item["message"] = html_encode(myfortune.record[i].message); + peer->val["list"].push(item); } + peer->view("techempower/fortunes"); + // peer->output = "Fortunes"; + // for (unsigned int i = 0; i < myfortune.record.size(); i++) + // { + // peer->output += ""; + // } + // peer->output += "
      idmessage
      " + std::to_string(myfortune.record[i].id) + "" + html_encode(myfortune.record[i].message) + "
      "; + co_return ""; +} + +//@urlpath(null,updates) +asio::awaitable techempowerupdates(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + unsigned int get_num = peer->get["queries"].to_int(); - //@urlpath(null,fortunes) - std::string techempowerfortunes(std::shared_ptr peer) + if (get_num == 0) { - peer->type("text/html; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - - auto myfortune = orm::Fortune(); - myfortune.fetch(); - myfortune.data.id = 0; - myfortune.data.message = "Additional fortune added at request time."; - myfortune.record.push_back(myfortune.data); - - std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) - { return lhs.message < rhs.message; }); - peer->val["list"].set_array(); - OBJ_ARRAY item; - for (unsigned int i = 0; i < myfortune.record.size(); i++) - { - item["id"] = myfortune.record[i].id; - item["message"] = html_encode(myfortune.record[i].message); - peer->val["list"].push(item); - } - - peer->view("techempower/fortunes"); - return ""; + get_num = 1; } - - //@urlpath(null,updates) - std::string techempowerupdates(std::shared_ptr peer) + else if (get_num > 500) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - unsigned int get_num = peer->get["queries"].to_int(); - - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - myworld.record.clear(); - myworld.record.reserve(get_num); - for (unsigned int i = 0; i < get_num; i++) + get_num = 500; + } + auto myworld = orm::World(); + myworld.record.clear(); + myworld.record.reserve(get_num); + for (unsigned int i = 0; i < get_num; i++) + { + myworld.wheresql.clear(); + myworld.where("id", rand_range(1, 10000)); + co_await myworld.async_fetch_append(); + if (myworld.effect() > 0) { - myworld.wheresql.clear(); - myworld.where("id", rand_range(1, 10000)).fetch_append(); - if (myworld.effect() > 0) - { - unsigned int j = myworld.record.size() - 1; - myworld.data.randomnumber = rand_range(1, 10000); - myworld.record[j].randomnumber = myworld.data.randomnumber; - myworld.update("randomnumber"); - } + unsigned int j = myworld.record.size() - 1; + myworld.data.randomnumber = rand_range(1, 10000); + myworld.record[j].randomnumber = myworld.data.randomnumber; + co_await myworld.async_update("randomnumber"); } - peer->output = myworld.to_json(); - return ""; } + peer->output = myworld.to_json(); + co_return ""; +} - //@urlpath(null,cached-queries) - std::string techempowercached_queries(std::shared_ptr peer) - { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); +//@urlpath(null,cached-queries) +asio::awaitable techempowercached_queries(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "alldatacache"; + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) + { + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "alldatacache"; - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); - std::vector allcachedata_array; - allcachedata_array.reserve(10000); - // create rand data to cache - if (temp_cache.check(mycacheid) > -1) - { - allcachedata_array = temp_cache.get(mycacheid); - } - else - { - allcachedata_array.resize(10000); - for (unsigned int i = 0; i < 10000; i++) - { - allcachedata_array[i].id = i + 1; - allcachedata_array[i].randomnumber = rand_range(1, 10000); - } - temp_cache.save(mycacheid, allcachedata_array, 120); - } - // get rand data from cache - mycacheid = "my" + std::to_string(get_num); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) + std::vector allcachedata_array; + allcachedata_array.reserve(10000); + //create rand data to cache + if (temp_cache.check(mycacheid) > -1) + { + allcachedata_array = temp_cache.get(mycacheid); + } + else + { + allcachedata_array.resize(10000); + for (unsigned int i = 0; i < 10000; i++) { - myworld.record = temp_cache.get(mycacheid); + allcachedata_array[i].id = i + 1; + allcachedata_array[i].randomnumber = rand_range(1, 10000); } - else + temp_cache.save(mycacheid, allcachedata_array, 360); + } + //get rand data from cache + mycacheid = "my" + std::to_string(get_num); + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + if (allcachedata_array.size() == 10000) { - if (allcachedata_array.size() == 10000) + for (unsigned int i = 0; i < get_num; i++) { - for (unsigned int i = 0; i < get_num; i++) - { - unsigned int temp_rid = rand_range(0, 9999); - myworld.record.push_back(allcachedata_array[temp_rid]); - } + unsigned int temp_rid = rand_range(0, 9999); + myworld.record.push_back(allcachedata_array[temp_rid]); } - temp_cache.save(mycacheid, myworld.record, 120); } - - peer->output = myworld.to_json(); - return ""; + temp_cache.save(mycacheid, myworld.record, 360); } - //@urlpath(null,cached-db) - std::string techempowercached_db(std::shared_ptr peer) + peer->output = myworld.to_json(); + co_return ""; +} + +//@urlpath(null,cached-db) +asio::awaitable techempowercached_db(std::shared_ptr peer) +{ + peer->type("application/json; charset=UTF-8"); + peer->set_header("Date", get_gmttime()); + //this test from database to cache + unsigned int get_num = peer->get["count"].to_int(); + if (get_num == 0) { - peer->type("application/json; charset=UTF-8"); - peer->set_header("Date", get_gmttime()); - // this test from database to cache - unsigned int get_num = peer->get["count"].to_int(); - if (get_num == 0) - { - get_num = 1; - } - else if (get_num > 500) - { - get_num = 500; - } - auto myworld = orm::World(); - std::string mycacheid = "my" + std::to_string(get_num); + get_num = 1; + } + else if (get_num > 500) + { + get_num = 500; + } + auto myworld = orm::World(); + std::string mycacheid = "my" + std::to_string(get_num); - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); - myworld.record.reserve(get_num); - if (temp_cache.check(mycacheid) > -1) - { - myworld.record = temp_cache.get(mycacheid); - } - else + myworld.record.reserve(get_num); + if (temp_cache.check(mycacheid) > -1) + { + myworld.record = temp_cache.get(mycacheid); + } + else + { + std::vector cacheid; + for (unsigned int i = 0; i < get_num; i++) { - std::vector cacheid; - for (unsigned int i = 0; i < get_num; i++) - { - cacheid.push_back(rand_range(1, 10000)); - } - - std::string sqlstr = array_to_sql(cacheid); - myworld.whereIn("id", sqlstr).fetch(); - temp_cache.save(mycacheid, myworld.record, 120); + cacheid.push_back(rand_range(1, 10000)); } - peer->output = myworld.to_json(); - return ""; + std::string sqlstr = array_to_sql(cacheid); + myworld.whereIn("id", sqlstr); + co_await myworld.async_fetch(); + temp_cache.save(mycacheid, myworld.record, 360); } -} // namespace http \ No newline at end of file + peer->output = myworld.to_json(); + co_return ""; +} + +}// namespace http \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp old mode 100755 new mode 100644 index 160924992af..4bb6dd1bc5c --- a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp @@ -1,4 +1,5 @@ -#include "mysqlmodel.hpp" + +#include "fortune_mysql.h" #include "fortunebase.h" #include "Fortune.h" @@ -7,10 +8,9 @@ namespace orm{ - - - Fortune::Fortune(std::string dbtag):mysqlclientDB(dbtag){} - Fortune::Fortune():mysqlclientDB(){} - - + + Fortune::Fortune(std::string dbtag):fortune_mysql(dbtag){ mod=this; } + Fortune::Fortune():fortune_mysql(){ mod=this; } + + } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp old mode 100755 new mode 100644 index aa18f46cab6..970e3427398 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp @@ -1,4 +1,5 @@ -#include "mysqlmodel.hpp" + +#include "world_mysql.h" #include "worldbase.h" #include "World.h" @@ -7,10 +8,9 @@ namespace orm{ - - - World::World(std::string dbtag):mysqlclientDB(dbtag){} - World::World():mysqlclientDB(){} - - + + World::World(std::string dbtag):world_mysql(dbtag){ mod=this; } + World::World():world_mysql(){ mod=this; } + + } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h old mode 100755 new mode 100644 index 27865161b32..1f53aa1e51d --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h @@ -1,16 +1,16 @@ #ifndef ORM_DEFAULT_FORTUNE_H #define ORM_DEFAULT_FORTUNE_H -#include "mysqlmodel.hpp" +#include "fortune_mysql.h" #include "fortunebase.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ namespace orm { - class Fortune : public mysqlclientDB{ + class Fortune : public fortune_mysql{ public: Fortune(std::string dbtag); Fortune(); }; -}; +} #endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h old mode 100755 new mode 100644 index ba44dee7888..0967117ebb0 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h @@ -1,16 +1,16 @@ #ifndef ORM_DEFAULT_WORLD_H #define ORM_DEFAULT_WORLD_H -#include "mysqlmodel.hpp" +#include "world_mysql.h" #include "worldbase.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ namespace orm { - class World : public mysqlclientDB{ + class World : public world_mysql{ public: World(std::string dbtag); World(); }; -}; +} #endif diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h new file mode 100644 index 00000000000..18cba5958fc --- /dev/null +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h @@ -0,0 +1,9788 @@ +#ifndef _ORM_DEFAULT_FORTUNE_OPERATE_H +#define _ORM_DEFAULT_FORTUNE_OPERATE_H + +#include +#include +#include +#include +#include +#include +#include +#include "request.h" +#include "unicode.h" +#include "datetime.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mysql_conn.h" +#include "mysql_conn_pool.h" +#include "orm_cache.hpp" +/*baseincludefile*/ +namespace orm +{ +// mysql Operational SQL middleware +/*tagnamespace*/ +//{ /*tagnamespace_replace*/ + template + class fortune_mysql : public B_BASE + { + public: + fortune_mysql(const std::string &tag) : dbtag(tag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + fortune_mysql() : dbtag(B_BASE::_rmstag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + M_MODEL &switchDB(const std::string &temptag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(temptag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + temptag; + } + } + M_MODEL &set_table(const std::string &table_name) + { + if (original_tablename.empty()) + { + original_tablename = B_BASE::tablename; + } + if (table_name.size() > 0) + { + B_BASE::tablename = table_name; + } + return *mod; + } + M_MODEL &reset_table() + { + if (original_tablename.empty()) + { + return *mod; + } + B_BASE::tablename = original_tablename; + return *mod; + } + unsigned int count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + return 0; + } + + return 0; + } + std::tuple + page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + return std::make_tuple(minpage, maxpage, page, total_page); + } + asio::awaitable async_count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + + asio::awaitable> + async_page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = async_count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + co_return std::make_tuple(minpage, maxpage, page, total_page); + } + + unsigned int update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + co_return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int replace_col(std::string colname, const std::string &old_string, const std::string &new_string) + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + + countsql.append(" = REPLACE("); + countsql.append(colname); + countsql.append(",'"); + countsql.append(old_string); + countsql.append("','"); + countsql.append(new_string); + countsql.append("') "); + + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, typename B_BASE::meta &data_temp) + { + switch(index_pos) + { + case 0: + data_temp.id=0; + + for(unsigned int i=0; i< value_size; i++) + { + if(result_temp_data[i]>='0'&&result_temp_data[i]<='9') + { + + data_temp.id= data_temp.id * 10 + (result_temp_data[i]-'0'); + } + if(i>32) + { + break; + } + } + break; + case 1: + data_temp.message.clear(); + data_temp.message.resize(value_size); + + std::memcpy(data_temp.message.data(), result_temp_data, value_size); + break; + + } + } + + +M_MODEL& eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +M_MODEL& nullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = NULL "); + + return *mod; + } + + +M_MODEL& nnullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != NULL "); + + return *mod; + } + + +M_MODEL& eqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& nqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& inMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& ninMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& l_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("'"); + + return *mod; + } + + +M_MODEL& r_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& btMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& beMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& ltMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& leMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_nullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = NULL "); + + return *mod; + } + + +M_MODEL& or_nnullMessage() + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != NULL "); + + return *mod; + } + + +M_MODEL& or_eqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_nqMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_inMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& or_ninMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + wheresql.append(val); + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(B_BASE::stringaddslash(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninMessage(const std::vector &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message NOT IN("); + + for(unsigned int i=0;i0) + { + wheresql.push_back(','); + } + wheresql.push_back('\''); + wheresql.append(std::to_string(val[i])); + wheresql.push_back('\''); + } + + + + return *mod; + } + + +M_MODEL& or_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& orl_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '%"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("'"); + + return *mod; + } + + +M_MODEL& orr_likeMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message LIKE '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.append("%'"); + + return *mod; + } + + +M_MODEL& or_btMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_beMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_ltMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +M_MODEL& or_leMessage(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(B_BASE::stringaddslash(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& eqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& nqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& btMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& beMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& ltMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& leMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_eqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message = '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_nqMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message != '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_btMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message > '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_beMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message >= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_ltMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message < '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + +template + requires std::is_floating_point_v||std::is_integral_v +M_MODEL& or_leMessage(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" message <= '"); + wheresql.append(std::to_string(val)); + wheresql.push_back('\''); + + return *mod; + } + + + M_MODEL &select(const std::string &fieldname) + { + if (selectsql.size() > 0) + { + selectsql.push_back(','); + } + selectsql.append(fieldname); + return *mod; + } + + M_MODEL &where(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + M_MODEL &where(const std::string &wq, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, char bi, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + wheresql.push_back('\''); + + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &where(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &between(const std::string &wq, const std::string &a, const std::string &b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN '"); + std::stringstream _stream; + _stream << a; + _stream << "' AND '"; + _stream << b; + _stream << "' ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &between(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &orBetween(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val.size() > 0 && (val[0] == '%' || val.back() == '%')) + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereLikeLeft(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("' "); + return *mod; + } + M_MODEL &whereLikeRight(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.append(val); + wheresql.append("%' "); + return *mod; + } + M_MODEL &whereOrLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val[0] == '%' || val.back() == '%') + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereAnd(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereAnd(const std::string &wq, _SQL_Value val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereAnd(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + M_MODEL &whereOr(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereOr(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &whereIn(const std::string &k) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + return *mod; + } + M_MODEL &whereIn(const std::string &k, const std::string &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + wheresql.append(a); + wheresql.append(") "); + return *mod; + } + + M_MODEL &whereIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + M_MODEL &whereNotIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::list<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereNotIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + M_MODEL &order(const std::string &wq) + { + ordersql.append(" ORDER by "); + ordersql.append(wq); + return *mod; + } + M_MODEL &asc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" ASC "); + return *mod; + } + + M_MODEL &desc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" DESC "); + return *mod; + } + + M_MODEL &having(const std::string &wq) + { + + groupsql.append(" HAVING by "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &group(const std::string &wq) + { + + groupsql.append(" GROUP BY "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &orsub() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &andsub() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &endsub() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &or_b() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &and_b() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &or_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &and_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &limit(unsigned int num) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + return *mod; + } + M_MODEL &limit(unsigned int num, unsigned int endnum) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + limitsql.push_back(','); + limitsql.append(std::to_string(endnum)); + return *mod; + } + + std::vector> fetch_obj() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + + if (iserror) + { + return temprecord; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return temprecord; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return temprecord; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::map data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if (field_array[ij].name.size() > 0) + { + data_temp.insert({field_array[ij].name, std::move(temp_str)}); + } + else if (field_array[ij].org_name.size() > 0) + { + data_temp.insert({field_array[ij].org_name, std::move(temp_str)}); + } + + tempnum = tempnum + name_length; + } + temprecord.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return temprecord; + } + std::tuple, std::map, std::vector>> + fetch_row() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temprecord = temp_cache.get(sqlhashid); + if (temprecord.size() > 0) + { + iscache = false; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_fieldname = table_cache.get(sqlhashid); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + table_fieldmap = tablemap_cache.get_obj(sqlhashid); + + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + } + + if (iserror) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + try + { + if (conn_empty()) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + + + if (iscache) + { + if (exptime > 0) + { + if (temprecord.size() > 0) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temp_cache.save(sqlhashid, temprecord, exptime); + + exptime += 1; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_cache.save(sqlhashid, table_fieldname, exptime); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + tablemap_cache.save(sqlhashid, table_fieldmap, exptime); + exptime = 0; + iscache = false; + } + } + } + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + M_MODEL &fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + B_BASE::record_reset(); + if (iserror) + { + return *mod; + } + + try + { + if (conn_empty()) + { + return *mod; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return *mod; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::record_reset(); + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + M_MODEL &fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + if (iserror) + { + return *mod; + } + + try + { + + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 1; + } + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + // asio::error_code ec; + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + // std::memset(result_data, 0x00, 4096); + // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + effect_num++; + B_BASE::record.emplace_back(std::move(data_temp)); + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + unsigned int fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + M_MODEL &use_cache(int cache_time = 0) + { + iscache = true; + exptime = cache_time; + return *mod; + } + bool isuse_cache(bool iscachedate = false) + { + if (iscachedate) + { + return exptime == 0 && iscache == false; + } + return iscache; + } + void set_cache_state(bool isrestatus = false) { iscache = isrestatus; } + void remove_exptime_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.remove_exptime(); + } + void clear_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.clear(); + } + bool remove_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.remove(sqlhashid); + } + bool remove_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.remove(cache_key_name); + } + int check_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.check(cache_key_name); + } + std::vector get_cache_data(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get(cache_key_name); + return cache_data; + } + typename B_BASE::meta get_cache_obj(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get_obj(cache_key_name); + return cache_data; + } + M_MODEL &get_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + B_BASE::record_reset(); + } + else + { + B_BASE::data = B_BASE::record[0]; + } + return *mod; + } + int update_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.update(sqlhashid, exp_time); + } + int update_cache(std::size_t cache_key_name, int exp_time) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.update(cache_key_name, exp_time); + } + bool save_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + temp_cache.save(sqlhashid, B_BASE::record, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, typename B_BASE::meta &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, std::vector &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + bool get_cacherecord(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + return false; + } + else + { + B_BASE::data = B_BASE::record[0]; + return true; + } + } + http::OBJ_VALUE fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + return valuetemp; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return valuetemp; + } + + asio::awaitable async_fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + co_return valuetemp; + } + + try + { + if (conn_empty()) + { + co_return valuetemp; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return valuetemp; + } + + long long get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + int update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + asio::awaitable async_update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int update_batch(const std::string &fieldname) + { + effect_num = 0; + if (B_BASE::record.size() == 0) + { + return 0; + } + if (fieldname.size() > 0) + { + sqlstring = B_BASE::_make_insert_into_sql(fieldname); + } + else + { + sqlstring = B_BASE::_make_replace_into_sql(); + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + co_return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int soft_remove(const std::string &fieldsql) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = B_BASE::soft_remove_sql(fieldsql); + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int soft_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + effect_num = 1; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + if (effect_num == 1) + { + sqlstring = B_BASE::soft_remove_sql(" "); + } + else + { + sqlstring = B_BASE::soft_remove_sql(""); + } + effect_num = 0; + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + long long insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + + long long save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + return 0; + } + + asio::awaitable async_save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + co_return 0; + } + + std::tuple, std::map, std::vector>> + query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iget_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + asio::awaitable, std::map, std::vector>>> + async_query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iasync_get_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + // long long edit_query(const std::string &rawsql, bool isinsert = false) + // { + // if (iserror) + // { + // return 0; + // } + + // return 0; + // } + M_MODEL &clear(bool both = true) + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + if (both) + { + B_BASE::record_reset(); + B_BASE::data_reset(); + } + return *mod; + } + M_MODEL &clearWhere() + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + return *mod; + } + M_MODEL &set_data(typename B_BASE::meta indata) + { + B_BASE::data = indata; + return *mod; + } + M_MODEL &get() { return *mod; } + std::string get_query() { return sqlstring; } + M_MODEL &start_commit() + { + iscommit = true; + return *mod; + } + M_MODEL &end_commit() + { + iscommit = false; + return *mod; + } + + unsigned int effect() + { + return effect_num; + } + bool conn_empty() + { + if (conn_obj) + { + return false; + } + error_msg = "conn_obj is null"; + iserror = true; + return true; + } + + public: + std::string selectsql; + std::string wheresql; + std::string ordersql; + std::string groupsql; + std::string limitsql; + std::string sqlstring; + std::string dbtag; + std::string error_msg; + std::string original_tablename; + + // std::list commit_sqllist; + bool iskuohao = false; + bool iscommit = false; + bool ishascontent = false; + bool iscache = false; + bool iserror = false; + int exptime = 0; + unsigned int effect_num = 0; + + M_MODEL *mod; + + std::shared_ptr conn_obj; + }; +//} /*tagnamespace_replace*/ +}// namespace orm +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h old mode 100755 new mode 100644 index 8a09ecc4564..2d688b054ed --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_FORTUNEBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT +*本文件为自动生成 Sun, 02 Mar 2025 10:54:30 GMT ***/ #include #include @@ -14,28 +14,30 @@ #include #include #include -#include "mysql.h" +#include "unicode.h" + namespace orm { struct fortunebase { struct meta{ - unsigned int id= 0; // - std::string message=""; // + unsigned int id = 0; ///**/ + std::string message = ""; ///**/ } data; std::vector record; std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . -std::vector _keypos{0x00}; -MYSQL_ROW _row; +unsigned int _offset=0; std::vector::iterator begin(){ return record.begin(); } std::vector::iterator end(){ return record.end(); } std::vector::const_iterator begin() const{ return record.begin(); } std::vector::const_iterator end() const{ return record.end(); } -const std::array colnames={"id","message"}; -const std::array colnamestype= {3,253}; +static constexpr std::array col_names={"id","message"}; +static constexpr std::array col_types={3,253}; +static constexpr std::array col_length={0,0}; +static constexpr std::array col_decimals={0,0}; std::string tablename="fortune"; -std::string modelname="Fortune"; +static constexpr std::string_view modelname="Fortune"; unsigned char findcolpos(const std::string &coln){ if(coln.size()==0) @@ -82,70 +84,9 @@ break; return temp; } - void _setColnamevalue() - { - for(unsigned char i=0;i<_keypos.size();i++) - { - switch(_keypos[i]){ - case 0: - try{ - data.id=std::stoul(_row[i]); - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.message.append((_row[i]==NULL?"":_row[i])); - }catch (...) { - data.message.clear(); - } - break; - default: - { } - - - } - - if(i>210){ - break; - } - } - } - void _addnewrowvalue(){ - fortunebase::meta metatemp; - - for(unsigned char i=0;i<_keypos.size();i++){ - - switch(_keypos[i]){ - - case 0: - try{ - metatemp.id=std::stoul(_row[i]); - }catch (...) { - metatemp.id=0; - } - break; - case 1: - try{ - metatemp.message.append((_row[i]==NULL?"":_row[i])); - }catch (...) { - metatemp.message.clear(); - } - break; - default: - { } - - - } - if(i>210){ - break; - } - } - record.emplace_back(std::move(metatemp)); - } + - inline std::string stringaddslash(std::string &content){ + inline std::string stringaddslash(const std::string &content){ std::string temp; for(unsigned int i=0;i0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; if(data.id==0){ tempsql<<"null"; @@ -209,24 +150,24 @@ tempsql<<")"; return tempsql.str(); } - std::string _makerecordinsertsql( meta &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; + std::string _makerecordinsertsql(const meta &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; if(insert_data.id==0){ tempsql<<"null"; @@ -240,35 +181,35 @@ tempsql<<")"; return tempsql.str(); } - std::string _makerecordinsertsql( std::vector &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES "; + std::string _makerecordinsertsql(const std::vector &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES "; - for(unsigned int i=0;i0) - { - tempsql<<","; - } - tempsql<<"("; + for(unsigned int i=0;i0) + { + tempsql<<","; + } + tempsql<<"("; - if(insert_data[i].id==0){ + if(insert_data[i].id==0){ tempsql<<"null"; }else{ tempsql<0){ unsigned char bpos_i=findcolpos(keyname); #ifdef DEBUG - if (bpos_i == 254) + if (bpos_i == 255) { std::cout << "\033[1m\033[31m-----------\n" << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" @@ -375,7 +315,7 @@ tempsql<<"`message`='"< 0) { @@ -385,7 +325,7 @@ tempsql<<"`message`='"< 0) { @@ -419,7 +359,7 @@ tempsql<<"`message`='"< 0) { @@ -429,7 +369,7 @@ tempsql<<"`message`='"< 0) { @@ -455,33 +395,12 @@ tempsql<<"`message`='"<0){ - for(;jj0) - { - tempsql<<","; - } - tempsql<0){ + std::string keyname; + unsigned char jj=0; + j=0; + if(fileld.size()>0){ + for(;jj0) @@ -491,10 +410,30 @@ tempsql<<"`message`='"<0){ + if(findcolpos(keyname)<255) + { + if(j>0) + { + tempsql<<","; + } + tempsql< keypos; if(fileld.size()>1){ for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } }else{ - for(jj=0;jj data_tomap(std::string fileld=""){ std::map tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj keypos; + if(fileld.size()>1){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj keypos; - if(fileld.size()>0){ - for(;jj keypos; + if(fileld.size()>0){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } if(data.id==0){ @@ -981,43 +920,43 @@ tempsql<<"\"message\":\""< keypos; - if(fileld.size()>0){ - for(;jj keypos; + if(fileld.size()>0){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - - for(jj=0;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } if(record[n].id==0){ @@ -1043,49 +982,49 @@ tempsql<<"\"message\":\""< func,std::string fileld=""){ std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj keypos; + if(fileld.size()>0){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - tempsql<0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } if(record[n].id==0){ @@ -1110,12 +1049,12 @@ tempsql<<"\"message\":\""< +#include +#include +#include +#include +#include +#include +#include "request.h" +#include "unicode.h" +#include "datetime.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mysql_conn.h" +#include "mysql_conn_pool.h" +#include "orm_cache.hpp" +/*baseincludefile*/ +namespace orm +{ +// mysql Operational SQL middleware +/*tagnamespace*/ +//{ /*tagnamespace_replace*/ + template + class world_mysql : public B_BASE + { + public: + world_mysql(const std::string &tag) : dbtag(tag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + world_mysql() : dbtag(B_BASE::_rmstag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(dbtag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + dbtag; + } + } + M_MODEL &switchDB(const std::string &temptag) + { + std::map> &conn_pool_obj = get_orm_conn_pool_obj(); + auto iter = conn_pool_obj.find(temptag); + if (iter != conn_pool_obj.end()) + { + conn_obj = iter->second; + } + else + { + conn_obj = nullptr; + iserror = true; + error_msg = "conn_pool not found " + temptag; + } + } + M_MODEL &set_table(const std::string &table_name) + { + if (original_tablename.empty()) + { + original_tablename = B_BASE::tablename; + } + if (table_name.size() > 0) + { + B_BASE::tablename = table_name; + } + return *mod; + } + M_MODEL &reset_table() + { + if (original_tablename.empty()) + { + return *mod; + } + B_BASE::tablename = original_tablename; + return *mod; + } + unsigned int count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + return 0; + } + + return 0; + } + std::tuple + page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + return std::make_tuple(minpage, maxpage, page, total_page); + } + asio::awaitable async_count() + { + std::string countsql; + countsql = "SELECT count(*) as total_countnum FROM "; + countsql.append(B_BASE::tablename); + countsql.append(" WHERE "); + if (wheresql.empty()) + { + countsql.append(" 1 "); + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + //std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + querysql_len = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int tempnum = 0; + + unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + querysql_len = 0; + for (unsigned int ik = 0; ik < name_length; ik++) + { + if (temp_pack_data.data[tempnum] >= '0' && temp_pack_data.data[tempnum] <= '9') + { + querysql_len = querysql_len * 10 + (temp_pack_data.data[tempnum] - '0'); + } + tempnum++; + } + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return querysql_len; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + + asio::awaitable> + async_page(unsigned int page, unsigned int per_page = 10, unsigned int list_num = 5) + { + unsigned int total_page = async_count(); + if (per_page == 0) + { + per_page = 10; + } + if (list_num < 1) + { + list_num = 1; + } + total_page = std::ceil((float)total_page / per_page); + + if (total_page < 1) + { + total_page = 1; + } + if (page > total_page) + { + page = total_page; + } + if (page < 1) + { + page = 1; + } + unsigned int mid_num = std::floor(list_num / 2); + unsigned int last_num = list_num - 1; + + int temp_num = page - mid_num; + + unsigned int minpage = temp_num < 1 ? 1 : temp_num; + unsigned int maxpage = minpage + last_num; + + if (maxpage > total_page) + { + maxpage = total_page; + temp_num = (maxpage - last_num); + if (temp_num < 1) + { + minpage = 1; + } + else + { + minpage = temp_num; + } + } + limit((page - 1) * per_page, per_page); + co_return std::make_tuple(minpage, maxpage, page, total_page); + } + + unsigned int update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update_col(std::string colname, int num, char symbol = '+') + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + if (num > 0) + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.append(std::to_string(num)); + } + else + { + countsql.append(" = "); + countsql.append(colname); + countsql.push_back(' '); + countsql.push_back(symbol); + countsql.push_back('('); + countsql.push_back('-'); + countsql.append(std::to_string(std::abs(num))); + countsql.push_back(')'); + } + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + co_return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int replace_col(std::string colname, const std::string &old_string, const std::string &new_string) + { + effect_num = 0; + std::string countsql; + countsql = "UPDATE "; + countsql.append(B_BASE::tablename); + countsql.append(" SET "); + countsql.append(colname); + + countsql.append(" = REPLACE("); + countsql.append(colname); + countsql.append(",'"); + countsql.append(old_string); + countsql.append("','"); + countsql.append(new_string); + countsql.append("') "); + + countsql.append(" where "); + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + countsql.append(tempsql.str()); + } + else + { + return 0; + } + } + else + { + countsql.append(wheresql); + } + if (!groupsql.empty()) + { + countsql.append(groupsql); + } + if (!limitsql.empty()) + { + countsql.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = countsql.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(countsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + void assign_field_value(unsigned char index_pos, unsigned char *result_temp_data, unsigned int value_size, typename B_BASE::meta &data_temp) + { + switch(index_pos) + { + case 0: + data_temp.id=0; + + for(unsigned int i=0; i< value_size; i++) + { + if(result_temp_data[i]>='0'&&result_temp_data[i]<='9') + { + + data_temp.id= data_temp.id * 10 + (result_temp_data[i]-'0'); + } + if(i>32) + { + break; + } + } + break; + case 1: + data_temp.randomnumber=0; + + for(unsigned int i=0; i< value_size; i++) + { + if(result_temp_data[i]>='0'&&result_temp_data[i]<='9') + { + + data_temp.randomnumber= data_temp.randomnumber * 10 + (result_temp_data[i]-'0'); + } + if(i>32) + { + break; + } + } + break; + + } + } + + +M_MODEL& eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_eqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_nqId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_inId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninId(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_btId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_beId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_ltId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_leId(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_eqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_nqId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_btId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_beId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ltId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_leId(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" id <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +M_MODEL& eqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& nqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& inRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& btRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& beRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& ltRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& leRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_eqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_nqRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_inRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_inRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + wheresql.append(val); + wheresql.push_back(')'); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + wheresql.append(std::to_string(val[i])); + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_ninRandomnumber(const std::vector& val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber NOT IN("); + + for(unsigned int i=0;i 0) + { + wheresql.push_back(','); + } + + try + { + wheresql.append(std::to_string(std::stoll(val[i]))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + } + wheresql.push_back(')'); + + return *mod; + } + + +M_MODEL& or_btRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_beRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_ltRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +M_MODEL& or_leRandomnumber(const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + try + { + wheresql.append(std::to_string(std::stoll(val))); + } + catch (std::invalid_argument const& ex) + { + wheresql.push_back('0'); + } + catch (std::out_of_range const& ex) + { + wheresql.push_back('0'); + } + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& eqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& nqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& btRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& beRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& ltRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& leRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_eqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber = "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_nqRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber != "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_btRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber > "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_beRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber >= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_ltRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber < "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + +template + requires std::is_integral_v +M_MODEL& or_leRandomnumber(T val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" randomnumber <= "); + + wheresql.append(std::to_string(val)); + return *mod; + } + + + M_MODEL &select(const std::string &fieldname) + { + if (selectsql.size() > 0) + { + selectsql.push_back(','); + } + selectsql.append(fieldname); + return *mod; + } + + M_MODEL &where(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + M_MODEL &where(const std::string &wq, http::OBJ_VALUE &obj) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + if (obj.is_string()) + { + wheresql.push_back('\''); + wheresql.append(obj.as_string()); + wheresql.push_back('\''); + } + else + { + + wheresql.append(obj.to_string()); + } + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &where(const std::string &wq, char bi, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + + M_MODEL &where(const std::string &wq, char bi, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back(bi); + wheresql.push_back('\''); + + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &where(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &between(const std::string &wq, const std::string &a, const std::string &b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN '"); + std::stringstream _stream; + _stream << a; + _stream << "' AND '"; + _stream << b; + _stream << "' ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &between(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &orBetween(const std::string &wq, _SQL_Value a, _SQL_Value b) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(" ("); + wheresql.append(wq); + wheresql.append(" BETWEEN "); + std::stringstream _stream; + _stream << a; + _stream << " AND "; + _stream << b; + _stream << " ) "; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val.size() > 0 && (val[0] == '%' || val.back() == '%')) + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereLikeLeft(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("' "); + return *mod; + } + M_MODEL &whereLikeRight(const std::string &wq, const std::string &val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + wheresql.append(val); + wheresql.append("%' "); + return *mod; + } + M_MODEL &whereOrLike(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" like '"); + if (val[0] == '%' || val.back() == '%') + { + wheresql.append(val); + wheresql.append("' "); + } + else + { + wheresql.push_back('%'); + wheresql.append(val); + wheresql.append("%' "); + } + return *mod; + } + M_MODEL &whereAnd(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereAnd(const std::string &wq, _SQL_Value val) + { + + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereAnd(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + M_MODEL &whereOr(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + std::stringstream _stream; + _stream << val; + wheresql.append(_stream.str()); + return *mod; + } + M_MODEL &whereOr(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + char bi = wq.back(); + if (bi == '=' || bi == '>' || bi == '<') + { + } + else + { + wheresql.push_back('='); + } + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + M_MODEL &whereIn(const std::string &k) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + return *mod; + } + M_MODEL &whereIn(const std::string &k, const std::string &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + wheresql.append(a); + wheresql.append(") "); + return *mod; + } + + M_MODEL &whereIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + M_MODEL &whereNotIn(const std::string &k, const std::vector &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(",\'"); + } + else + { + wheresql.append("\'"); + } + wheresql.append(key); + wheresql.append("\'"); + i++; + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::list<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" in("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereNotIn(const std::string &k, const std::vector<_SQL_Value> &a) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + + wheresql.append(k); + wheresql.append(" NOT IN("); + int i = 0; + std::stringstream _stream; + for (auto &key : a) + { + if (i > 0) + { + wheresql.append(","); + } + _stream << key; + wheresql.append(_stream.str()); + i++; + _stream.str(""); + } + wheresql.append(") "); + return *mod; + } + + M_MODEL &order(const std::string &wq) + { + ordersql.append(" ORDER by "); + ordersql.append(wq); + return *mod; + } + M_MODEL &asc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" ASC "); + return *mod; + } + + M_MODEL &desc(const std::string &wq) + { + + ordersql.append(" ORDER by "); + ordersql.append(wq); + ordersql.append(" DESC "); + return *mod; + } + + M_MODEL &having(const std::string &wq) + { + + groupsql.append(" HAVING by "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &group(const std::string &wq) + { + + groupsql.append(" GROUP BY "); + groupsql.append(wq); + return *mod; + } + + M_MODEL &orsub() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &andsub() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &endsub() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &or_b() + { + + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + else + { + wheresql.append(" OR ("); + iskuohao = true; + ishascontent = false; + } + return *mod; + } + M_MODEL &and_b() + { + + if (iskuohao == true) + { + iskuohao = false; + wheresql.append(" )"); + ishascontent = false; + } + else + { + wheresql.append(" AND ("); + iskuohao = true; + ishascontent = false; + } + + return *mod; + } + + M_MODEL &or_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &and_e() + { + if (iskuohao == true) + { + iskuohao = false; + ishascontent = false; + wheresql.append(" )"); + } + return *mod; + } + + M_MODEL &limit(unsigned int num) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + return *mod; + } + M_MODEL &limit(unsigned int num, unsigned int endnum) + { + limitsql.clear(); + limitsql.append(" limit "); + limitsql.append(std::to_string(num)); + limitsql.push_back(','); + limitsql.append(std::to_string(endnum)); + return *mod; + } + + std::vector> fetch_obj() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + + if (iserror) + { + return temprecord; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return temprecord; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return temprecord; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::map data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if (field_array[ij].name.size() > 0) + { + data_temp.insert({field_array[ij].name, std::move(temp_str)}); + } + else if (field_array[ij].org_name.size() > 0) + { + data_temp.insert({field_array[ij].org_name, std::move(temp_str)}); + } + + tempnum = tempnum + name_length; + } + temprecord.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return temprecord; + } + std::tuple, std::map, std::vector>> + fetch_row() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temprecord = temp_cache.get(sqlhashid); + if (temprecord.size() > 0) + { + iscache = false; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_fieldname = table_cache.get(sqlhashid); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + table_fieldmap = tablemap_cache.get_obj(sqlhashid); + + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + } + + if (iserror) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + try + { + if (conn_empty()) + { + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + + + if (iscache) + { + if (exptime > 0) + { + if (temprecord.size() > 0) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + + model_meta_cache> &temp_cache = + model_meta_cache>::getinstance(); + temp_cache.save(sqlhashid, temprecord, exptime); + + exptime += 1; + model_meta_cache &table_cache = model_meta_cache::getinstance(); + table_cache.save(sqlhashid, table_fieldname, exptime); + + model_meta_cache> &tablemap_cache = + model_meta_cache>::getinstance(); + tablemap_cache.save(sqlhashid, table_fieldmap, exptime); + exptime = 0; + iscache = false; + } + } + } + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + M_MODEL &fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + B_BASE::record_reset(); + if (iserror) + { + return *mod; + } + + try + { + if (conn_empty()) + { + return *mod; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return *mod; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::record_reset(); + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + M_MODEL &fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return *mod; + } + } + + if (iserror) + { + return *mod; + } + + try + { + + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return *mod; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return *mod; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return *mod; + } + + asio::awaitable async_fetch_append() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 1; + } + } + + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + // asio::error_code ec; + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + // std::memset(result_data, 0x00, 4096); + // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + effect_num++; + B_BASE::record.emplace_back(std::move(data_temp)); + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + unsigned int fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + return 0; + } + + try + { + effect_num = 0; + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + unsigned char action_setup = 0; + unsigned int column_num = 0; + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_fetch_one(bool isappend = false) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + + sqlstring.append(" limit 1"); + + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + if (iserror) + { + co_return 0; + } + + try + { + effect_num = 0; + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + // std::vector> field_value; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + // std::map other_col; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + if (isappend) + { + typename B_BASE::meta data_temp; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); + tempnum = tempnum + name_length; + } + B_BASE::record.emplace_back(std::move(data_temp)); + effect_num++; + } + else + { + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + effect_num++; + } + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + M_MODEL &use_cache(int cache_time = 0) + { + iscache = true; + exptime = cache_time; + return *mod; + } + bool isuse_cache(bool iscachedate = false) + { + if (iscachedate) + { + return exptime == 0 && iscache == false; + } + return iscache; + } + void set_cache_state(bool isrestatus = false) { iscache = isrestatus; } + void remove_exptime_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.remove_exptime(); + } + void clear_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.clear(); + } + bool remove_cache() + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.remove(sqlhashid); + } + bool remove_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.remove(cache_key_name); + } + int check_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.check(cache_key_name); + } + std::vector get_cache_data(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get(cache_key_name); + return cache_data; + } + typename B_BASE::meta get_cache_obj(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + auto cache_data = temp_cache.get_obj(cache_key_name); + return cache_data; + } + M_MODEL &get_cache(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + B_BASE::record_reset(); + } + else + { + B_BASE::data = B_BASE::record[0]; + } + return *mod; + } + int update_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + return temp_cache.update(sqlhashid, exp_time); + } + int update_cache(std::size_t cache_key_name, int exp_time) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + return temp_cache.update(cache_key_name, exp_time); + } + bool save_cache(int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); + temp_cache.save(sqlhashid, B_BASE::record, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, typename B_BASE::meta &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, std::vector &cache_data, int exp_time = 0) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + temp_cache.save(cache_key_name, cache_data, exp_time); + return true; + } + bool get_cacherecord(std::size_t cache_key_name) + { + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); + if (B_BASE::record.size() == 0) + { + return false; + } + else + { + B_BASE::data = B_BASE::record[0]; + return true; + } + } + http::OBJ_VALUE fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + return valuetemp; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return valuetemp; + } + + asio::awaitable async_fetch_json() + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + sqlstring.append(" 1 "); + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + http::OBJ_VALUE valuetemp; + valuetemp.set_array(); + + if (iserror) + { + co_return valuetemp; + } + + try + { + if (conn_empty()) + { + co_return valuetemp; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + http::OBJ_VALUE json_temp_v; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + std::string temp_str; + temp_str.resize(name_length); + std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + if(field_array[ij].name.size()>0) + { + //or alias name + json_temp_v[field_array[ij].name]=std::move(temp_str); + } + else if(field_array[ij].org_name.size()>0) + { + json_temp_v[field_array[ij].org_name]=std::move(temp_str); + } + tempnum = tempnum + name_length; + } + valuetemp.push(json_temp_v); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return valuetemp; + } + + long long get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_get_one(long long id) + { + effect_num = 0; + if (selectsql.empty()) + { + sqlstring = "SELECT * FROM "; + } + else + { + sqlstring = "SELECT "; + sqlstring.append(selectsql); + sqlstring.append(" FROM "); + } + + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + sqlstring.append(" limit 1"); + if (iscache) + { + std::size_t sqlhashid = std::hash{}(sqlstring); + if (get_cacherecord(sqlhashid)) + { + iscache = false; + co_return 0; + } + } + + B_BASE::data_reset(); + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_select_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + + assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); + tempnum = tempnum + name_length; + } + + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + if (iscache) + { + if (exptime > 0) + { + save_cache(exptime); + exptime = 0; + iscache = false; + } + } + co_return effect_num; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + int update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_update(const std::string &fieldname) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(fieldname); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + asio::awaitable async_update() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + error_msg = "warning empty where sql!"; + co_return 0; + } + } + + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + try + { + + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int update_batch(const std::string &fieldname) + { + effect_num = 0; + if (B_BASE::record.size() == 0) + { + return 0; + } + if (fieldname.size() > 0) + { + sqlstring = B_BASE::_make_insert_into_sql(fieldname); + } + else + { + sqlstring = B_BASE::_make_replace_into_sql(); + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + co_return 0; + } + } + + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + + asio::awaitable async_remove(long long id) + { + effect_num = 0; + sqlstring = "DELETE FROM "; + sqlstring.append(B_BASE::tablename); + sqlstring.append(" WHERE "); + + sqlstring.append(B_BASE::getPKname()); + sqlstring.append("="); + sqlstring.append(std::to_string(id)); + + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + co_return 0; + } + + int soft_remove(const std::string &fieldsql) + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + + sqlstring = B_BASE::soft_remove_sql(fieldsql); + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + int soft_remove() + { + effect_num = 0; + if (wheresql.empty()) + { + if (B_BASE::getPK() > 0) + { + std::ostringstream tempsql; + effect_num = 1; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + else + { + return 0; + } + } + if (effect_num == 1) + { + sqlstring = B_BASE::soft_remove_sql(" "); + } + else + { + sqlstring = B_BASE::soft_remove_sql(""); + } + effect_num = 0; + if (sqlstring.empty()) + { + error_msg = "soft delete field empty."; + return 0; + } + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + + } + return 0; + } + long long insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(typename B_BASE::meta &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert(std::vector &insert_data) + { + effect_num = 0; + sqlstring = B_BASE::_makerecordinsertsql(insert_data); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + long long insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + + try + { + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return 0; + } + + asio::awaitable async_insert() + { + effect_num = 0; + sqlstring = B_BASE::_makeinsertsql(); + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + + + long long save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + return 0; + } + + if (iserror) + { + return 0; + } + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + return effect_num; + } + return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + if (conn_empty()) + { + return 0; + } + auto conn = conn_obj->get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return 0; + } + + unsigned int offset = 0; + n = conn->read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + return insert_last_id; + } + return 0; + } + return 0; + } + + asio::awaitable async_save(bool isrealnew = false) + { + effect_num = 0; + if (B_BASE::getPK() > 0 && isrealnew == false) + { + if (wheresql.empty()) + { + std::ostringstream tempsql; + tempsql << " "; + tempsql << B_BASE::getPKname(); + tempsql << " = '"; + tempsql << B_BASE::getPK(); + tempsql << "' "; + wheresql = tempsql.str(); + } + sqlstring = B_BASE::_makeupdatesql(""); + sqlstring.append(" where "); + if (wheresql.empty()) + { + co_return 0; + } + else + { + sqlstring.append(wheresql); + } + if (!groupsql.empty()) + { + sqlstring.append(groupsql); + } + if (!ordersql.empty()) + { + sqlstring.append(ordersql); + } + if (!limitsql.empty()) + { + sqlstring.append(limitsql); + } + if (iscommit) + { + iscommit = false; + co_return 0; + } + + if (iserror) + { + co_return 0; + } + + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + iserror = true; + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return effect_num; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + co_return 0; + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + co_return 0; + } + co_return 0; + } + else + { + sqlstring = B_BASE::_makeinsertsql(); + try + { + if (conn_empty()) + { + co_return 0; + } + auto conn = co_await conn_obj->async_get_edit_conn(); + + unsigned int querysql_len = sqlstring.length() + 1; + + conn->send_data.clear(); + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(sqlstring); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + unsigned int offset = 0; + n = co_await conn->async_read_loop(); + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + + conn_obj->back_edit_conn(conn); + + if ((unsigned char)temp_pack_data.data[0] == 0xFF) + { + error_msg = temp_pack_data.data.substr(3); + } + else if ((unsigned char)temp_pack_data.data[0] == 0x00) + { + + unsigned int d_offset = 1; + effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + + co_return insert_last_id; + } + co_return 0; + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return 0; + } + co_return 0; + } + + std::tuple, std::map, std::vector>> + query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iget_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + if(conn->ec) + { + error_msg = conn->ec.message(); + iserror = true; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = conn->read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + asio::awaitable, std::map, std::vector>>> + async_query(const std::string &rawsql) + { + + std::vector> temprecord; + std::vector table_fieldname; + std::map table_fieldmap; + + if(rawsql.size()>10) + { + unsigned int i=0; + for(;iasync_get_select_conn(); + + unsigned int querysql_len = rawsql.length() + 1; + + conn->send_data.clear(); + + conn->send_data.push_back((querysql_len & 0xFF)); + conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + conn->send_data.push_back(0x00); + conn->send_data.push_back(0x03); + conn->send_data.append(rawsql); + + std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + + + pack_info_t temp_pack_data; + temp_pack_data.seq_id = 1; + bool is_sql_item = false; + std::vector field_array; + + unsigned char action_setup = 0; + unsigned int column_num = 0; + + unsigned int offset = 0; + + std::vector field_pos; + + for (; is_sql_item == false;) + { + n = co_await conn->async_read_loop(); + offset = 0; + for (; offset < n;) + { + conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + if (temp_pack_data.length == temp_pack_data.current_length) + { + if (conn->pack_eof_check(temp_pack_data)) + { + is_sql_item = true; + break; + } + + if (action_setup == 0) + { + if (temp_pack_data.length == 2 && (unsigned char)temp_pack_data.data[0] < 251 && (unsigned char)temp_pack_data.data[0] > 0) + { + action_setup = 1; + column_num = (unsigned char)temp_pack_data.data[0]; + } + } + else if (action_setup == 1) + { + field_info_t temp_filed_col; + conn->read_col_info(temp_pack_data.data, temp_filed_col); + + field_array.emplace_back(std::move(temp_filed_col)); + column_num--; + if (column_num == 0) + { + action_setup = 2; + for (unsigned int ii = 0; ii < field_array.size(); ii++) + { + field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); + table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldname.push_back(field_array[ii].org_name); + } + } + } + else if (action_setup == 2) + { + unsigned int column_num = field_array.size(); + unsigned int tempnum = 0; + + std::vector temp_v_record; + for (unsigned int ij = 0; ij < column_num; ij++) + { + unsigned long long name_length = 0; + name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + std::string tempstr; + tempstr.resize(name_length); + std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); + temp_v_record.push_back(std::move(tempstr)); + tempnum = tempnum + name_length; + } + temprecord.push_back(temp_v_record); + effect_num++; + } + } + else + { + if (offset >= n) + { + break; + } + is_sql_item = true; + break; + } + } + } + conn_obj->back_select_conn(conn); + + co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); + } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (...) + { + } + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + + // long long edit_query(const std::string &rawsql, bool isinsert = false) + // { + // if (iserror) + // { + // return 0; + // } + + // return 0; + // } + M_MODEL &clear(bool both = true) + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + if (both) + { + B_BASE::record_reset(); + B_BASE::data_reset(); + } + return *mod; + } + M_MODEL &clearWhere() + { + selectsql.clear(); + wheresql.clear(); + ordersql.clear(); + groupsql.clear(); + limitsql.clear(); + sqlstring.clear(); + error_msg.clear(); + iskuohao = false; + ishascontent = false; + iscommit = false; + iscache = false; + effect_num = 0; + return *mod; + } + M_MODEL &set_data(typename B_BASE::meta indata) + { + B_BASE::data = indata; + return *mod; + } + M_MODEL &get() { return *mod; } + std::string get_query() { return sqlstring; } + M_MODEL &start_commit() + { + iscommit = true; + return *mod; + } + M_MODEL &end_commit() + { + iscommit = false; + return *mod; + } + + unsigned int effect() + { + return effect_num; + } + bool conn_empty() + { + if (conn_obj) + { + return false; + } + error_msg = "conn_obj is null"; + iserror = true; + return true; + } + + public: + std::string selectsql; + std::string wheresql; + std::string ordersql; + std::string groupsql; + std::string limitsql; + std::string sqlstring; + std::string dbtag; + std::string error_msg; + std::string original_tablename; + + // std::list commit_sqllist; + bool iskuohao = false; + bool iscommit = false; + bool ishascontent = false; + bool iscache = false; + bool iserror = false; + int exptime = 0; + unsigned int effect_num = 0; + + M_MODEL *mod; + + std::shared_ptr conn_obj; + }; +//} /*tagnamespace_replace*/ +}// namespace orm +#endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h old mode 100755 new mode 100644 index 2bba08096e2..93f7c1f14b2 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_WORLDBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Fri, 26 Jan 2024 02:59:30 GMT +*本文件为自动生成 Sun, 02 Mar 2025 10:54:30 GMT ***/ #include #include @@ -14,28 +14,30 @@ #include #include #include -#include "mysql.h" +#include "unicode.h" + namespace orm { struct worldbase { struct meta{ - unsigned int id= 0; // - int randomnumber= 0; // + unsigned int id = 0; ///**/ + int randomnumber = 0; ///**/ } data; std::vector record; std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . -std::vector _keypos{0x00}; -MYSQL_ROW _row; +unsigned int _offset=0; std::vector::iterator begin(){ return record.begin(); } std::vector::iterator end(){ return record.end(); } std::vector::const_iterator begin() const{ return record.begin(); } std::vector::const_iterator end() const{ return record.end(); } -const std::array colnames={"id","randomnumber"}; -const std::array colnamestype= {3,3}; +static constexpr std::array col_names={"id","randomnumber"}; +static constexpr std::array col_types={3,3}; +static constexpr std::array col_length={0,0}; +static constexpr std::array col_decimals={0,0}; std::string tablename="world"; -std::string modelname="World"; +static constexpr std::string_view modelname="World"; unsigned char findcolpos(const std::string &coln){ if(coln.size()==0) @@ -82,70 +84,9 @@ break; return temp; } - void _setColnamevalue() - { - for(unsigned char i=0;i<_keypos.size();i++) - { - switch(_keypos[i]){ - case 0: - try{ - data.id=std::stoul(_row[i]); - }catch (...) { - data.id=0; - } - break; - case 1: - try{ - data.randomnumber=std::stoi(_row[i]); - }catch (...) { - data.randomnumber=0; - } - break; - default: - { } - - - } - - if(i>210){ - break; - } - } - } - void _addnewrowvalue(){ - worldbase::meta metatemp; - - for(unsigned char i=0;i<_keypos.size();i++){ - - switch(_keypos[i]){ - - case 0: - try{ - metatemp.id=std::stoul(_row[i]); - }catch (...) { - metatemp.id=0; - } - break; - case 1: - try{ - metatemp.randomnumber=std::stoi(_row[i]); - }catch (...) { - metatemp.randomnumber=0; - } - break; - default: - { } - - - } - if(i>210){ - break; - } - } - record.emplace_back(std::move(metatemp)); - } + - inline std::string stringaddslash(std::string &content){ + inline std::string stringaddslash(const std::string &content){ std::string temp; for(unsigned int i=0;i0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; if(data.id==0){ tempsql<<"null"; @@ -213,24 +154,24 @@ tempsql<<")"; return tempsql.str(); } - std::string _makerecordinsertsql( meta &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES ("; + std::string _makerecordinsertsql(const meta &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES ("; if(insert_data.id==0){ tempsql<<"null"; @@ -248,35 +189,35 @@ tempsql<<")"; return tempsql.str(); } - std::string _makerecordinsertsql( std::vector &insert_data){ - unsigned int j=0; - std::ostringstream tempsql; - tempsql<<"INSERT INTO "; - tempsql<0){ - tempsql<<"`,`"; - }else{ - tempsql<<"`"; - } - tempsql<0){ - tempsql<<"`"; - } - tempsql<<") VALUES "; + std::string _makerecordinsertsql(const std::vector &insert_data){ + unsigned int j=0; + std::ostringstream tempsql; + tempsql<<"INSERT INTO "; + tempsql<0){ + tempsql<<"`,`"; + }else{ + tempsql<<"`"; + } + tempsql<0){ + tempsql<<"`"; + } + tempsql<<") VALUES "; - for(unsigned int i=0;i0) - { - tempsql<<","; - } - tempsql<<"("; + for(unsigned int i=0;i0) + { + tempsql<<","; + } + tempsql<<"("; - if(insert_data[i].id==0){ + if(insert_data[i].id==0){ tempsql<<"null"; }else{ tempsql<0){ unsigned char bpos_i=findcolpos(keyname); #ifdef DEBUG - if (bpos_i == 254) + if (bpos_i == 255) { std::cout << "\033[1m\033[31m-----------\n" << keyname << " not in " << tablename << " table Field.\n-----------\033[0m" @@ -395,7 +335,7 @@ if(data.randomnumber==0){ tempsql << "REPLACE INTO "; tempsql << tablename; tempsql << " ("; - for (; j < colnames.size(); j++) + for (; j < col_names.size(); j++) { if (j > 0) { @@ -405,7 +345,7 @@ if(data.randomnumber==0){ { tempsql << "`"; } - tempsql << colnames[j]; + tempsql << col_names[j]; } if (j > 0) { @@ -443,7 +383,7 @@ if(data.randomnumber==0){ tempsql << "INSERT INTO "; tempsql << tablename; tempsql << " ("; - for (; j < colnames.size(); j++) + for (; j < col_names.size(); j++) { if (j > 0) { @@ -453,7 +393,7 @@ if(data.randomnumber==0){ { tempsql << "`"; } - tempsql << colnames[j]; + tempsql << col_names[j]; } if (j > 0) { @@ -483,33 +423,12 @@ if(data.randomnumber==0){ tempsql<<" as new ON DUPLICATE KEY UPDATE "; - std::string keyname; - unsigned char jj=0; - j=0; - if(fileld.size()>0){ - for(;jj0) - { - tempsql<<","; - } - tempsql<0){ + std::string keyname; + unsigned char jj=0; + j=0; + if(fileld.size()>0){ + for(;jj0) @@ -519,10 +438,30 @@ if(data.randomnumber==0){ tempsql<0){ + if(findcolpos(keyname)<255) + { + if(j>0) + { + tempsql<<","; + } + tempsql< keypos; if(fileld.size()>1){ for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); } }else{ - for(jj=0;jj data_tomap(std::string fileld=""){ std::map tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>1){ - for(;jj keypos; + if(fileld.size()>1){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj keypos; - if(fileld.size()>0){ - for(;jj keypos; + if(fileld.size()>0){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ tempsql<<","; } if(data.id==0){ @@ -1024,43 +963,43 @@ if(data.randomnumber==0){ } std::string to_json(std::string fileld=""){ - std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj keypos; + if(fileld.size()>0){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - - for(jj=0;jj0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + + for(jj=0;jj0){ tempsql<<","; } if(record[n].id==0){ @@ -1090,49 +1029,49 @@ if(record[n].randomnumber==0){ std::string to_json(std::function func,std::string fileld=""){ std::ostringstream tempsql; - std::string keyname; - unsigned char jj=0; - std::vector keypos; - if(fileld.size()>0){ - for(;jj keypos; + if(fileld.size()>0){ + for(;jj0){ - keypos.emplace_back(findcolpos(keyname)); - keyname.clear(); - } - }else{ - for(jj=0;jj0){ - tempsql<<",{"; - }else{ - tempsql<<"{"; - } - tempsql<0){ + keypos.emplace_back(findcolpos(keyname)); + keyname.clear(); + } + }else{ + for(jj=0;jj0){ + tempsql<<",{"; + }else{ + tempsql<<"{"; + } + tempsql<0){ tempsql<<","; } if(record[n].id==0){ @@ -1161,8 +1100,8 @@ if(record[n].randomnumber==0){ } long long getPK(){ return data.id; } void setPK(long long val){ data.id=val;} -unsigned int getId(){ return data.id; } - void setId(unsigned int val){ data.id=val;} + unsigned int getId(){ return data.id; } + void setId( unsigned int val){ data.id=val;} int getRandomnumber(){ return data.randomnumber; } void setRandomnumber( int val){ data.randomnumber=val;} From 8f512568b188adc8f98f6ac5d0b67e4316cda4e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:28:59 -0800 Subject: [PATCH 1176/1766] Bump koa from 2.5.0 to 2.15.4 in /frameworks/JavaScript/koa (#9592) Bumps [koa](https://github.com/koajs/koa) from 2.5.0 to 2.15.4. - [Release notes](https://github.com/koajs/koa/releases) - [Changelog](https://github.com/koajs/koa/blob/2.15.4/History.md) - [Commits](https://github.com/koajs/koa/compare/2.5.0...2.15.4) --- updated-dependencies: - dependency-name: koa dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/koa/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/koa/package.json b/frameworks/JavaScript/koa/package.json index 52cbf5ca886..eb4a7970a04 100644 --- a/frameworks/JavaScript/koa/package.json +++ b/frameworks/JavaScript/koa/package.json @@ -7,7 +7,7 @@ "dependencies": { "bluebird": "3.5.1", "handlebars": "4.3.0", - "koa": "2.5.0", + "koa": "2.15.4", "koa-bodyparser": "4.2.0", "koa-hbs": "1.0.0", "koa-router": "7.4.0", From 74ecfe586870a0cc76bbce1cb817f773ecd52f25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:29:09 -0800 Subject: [PATCH 1177/1766] Bump net-imap from 0.5.1 to 0.5.6 in /frameworks/Ruby/rails (#9587) Bumps [net-imap](https://github.com/ruby/net-imap) from 0.5.1 to 0.5.6. - [Release notes](https://github.com/ruby/net-imap/releases) - [Commits](https://github.com/ruby/net-imap/compare/v0.5.1...v0.5.6) --- updated-dependencies: - dependency-name: net-imap dependency-type: indirect ... 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 171277b6ba7..e3045598567 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -157,7 +157,7 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.4) - net-imap (0.5.1) + net-imap (0.5.6) date net-protocol net-pop (0.1.2) @@ -248,7 +248,7 @@ GEM securerandom (0.4.0) stringio (3.1.2) thor (1.3.2) - timeout (0.4.2) + timeout (0.4.3) traces (0.14.1) trilogy (2.8.1) tzinfo (2.0.6) From b59d741fece27a6ae7b666c710aa379d9e1be1dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:29:42 -0800 Subject: [PATCH 1178/1766] Bump simd-json-derive from 0.2.2 to 0.12.0 in /frameworks/Rust/actix (#9395) Bumps [simd-json-derive](https://github.com/simd-lite/simd-json-derive) from 0.2.2 to 0.12.0. - [Release notes](https://github.com/simd-lite/simd-json-derive/releases) - [Commits](https://github.com/simd-lite/simd-json-derive/compare/v0.2.2...simd-json-derive-int-v0.12.0) --- updated-dependencies: - dependency-name: simd-json-derive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Rust/actix/Cargo.lock | 145 ++++++++++++++++++++++++++++--- frameworks/Rust/actix/Cargo.toml | 2 +- 2 files changed, 133 insertions(+), 14 deletions(-) mode change 100755 => 100644 frameworks/Rust/actix/Cargo.toml diff --git a/frameworks/Rust/actix/Cargo.lock b/frameworks/Rust/actix/Cargo.lock index 35e34f98efc..5bce2a3656e 100644 --- a/frameworks/Rust/actix/Cargo.lock +++ b/frameworks/Rust/actix/Cargo.lock @@ -298,6 +298,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -1053,8 +1059,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1098,6 +1106,16 @@ dependencies = [ "serde", ] +[[package]] +name = "halfbrown" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +dependencies = [ + "hashbrown 0.14.0", + "serde", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1118,6 +1136,10 @@ name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash 0.8.3", + "allocator-api2", +] [[package]] name = "heck" @@ -1337,6 +1359,70 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lexical-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +dependencies = [ + "lexical-util", + "static_assertions", +] + [[package]] name = "libc" version = "0.2.147" @@ -2065,37 +2151,52 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0c3aaa7729b636ed4843efa96722f0d5823825b4f388d74c83757a3227f64d4" dependencies = [ - "halfbrown", + "halfbrown 0.1.18", + "serde", + "serde_json", + "simdutf8", + "value-trait 0.2.12", +] + +[[package]] +name = "simd-json" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f07a84c7456b901b8dd2c1d44caca8b0fd2c2616206ee5acc9d9da61e8d9ec" +dependencies = [ + "getrandom", + "halfbrown 0.2.5", + "lexical-core", "serde", "serde_json", "simdutf8", - "value-trait", + "value-trait 0.6.1", ] [[package]] name = "simd-json-derive" -version = "0.2.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3221374cc85242d6da1fea48d5b6edb417cf79cf9f6d6c636cd8425161faa096" +checksum = "601202a467f1d17a37b20d6d4d7bd679764ac3e9e9fc0f7a24524ba35bd55552" dependencies = [ "chrono", - "itoa 0.4.8", + "itoa 1.0.8", "ryu", - "simd-json", + "simd-json 0.12.0", "simd-json-derive-int", - "value-trait", + "value-trait 0.6.1", ] [[package]] name = "simd-json-derive-int" -version = "0.2.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929b468389809e93768ab7962f21aad7911774d472aca6211e332f74824c4635" +checksum = "4826470c4520fac1e3b57c413a6e83a198bac992e3222d1c290f7909881d3df1" dependencies = [ "proc-macro2", "quote", - "simd-json", - "syn 1.0.109", + "simd-json 0.12.0", + "syn 2.0.25", ] [[package]] @@ -2169,6 +2270,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stringprep" version = "0.1.2" @@ -2275,7 +2382,7 @@ dependencies = [ "rand", "serde", "serde_json", - "simd-json", + "simd-json 0.4.15", "simd-json-derive", "snmalloc-rs", "tokio", @@ -2670,11 +2777,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fe40a74a6f052b10668ef021c8c3ae56ab38269f9c0f401daa6ed36f96662fd" dependencies = [ "float-cmp", - "halfbrown", + "halfbrown 0.1.18", "itoa 0.4.8", "ryu", ] +[[package]] +name = "value-trait" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a5b6c8ceb01263b969cac48d4a6705134d490ded13d889e52c0cfc80c6945e" +dependencies = [ + "float-cmp", + "halfbrown 0.2.5", + "itoa 1.0.8", + "ryu", +] + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/frameworks/Rust/actix/Cargo.toml b/frameworks/Rust/actix/Cargo.toml old mode 100755 new mode 100644 index a7ae6720cce..9544e873c89 --- a/frameworks/Rust/actix/Cargo.toml +++ b/frameworks/Rust/actix/Cargo.toml @@ -49,7 +49,7 @@ rand = { version = "0.8", features = ["small_rng"] } serde = { version = "1", features = ["derive"] } serde_json = "1" simd-json = "0.4" -simd-json-derive = "0.2" +simd-json-derive = "0.12" snmalloc-rs = "0.2.6" tokio = { version = "1", features = ["full"] } tokio-util = "0.7.8" From 6a4f7034e989c08d25e3459853751e9a5c1a5264 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Mon, 3 Mar 2025 06:31:53 -0800 Subject: [PATCH 1179/1766] [Elysia] Use Bun's SQL API (#9572) * Use Bun's SQL API for Elysia * Upgrade bun to 1.2 --- frameworks/TypeScript/elysia/elysia-compiled.dockerfile | 2 +- frameworks/TypeScript/elysia/elysia-postgres.dockerfile | 2 +- .../TypeScript/elysia/elysia-smol-postgres.dockerfile | 2 +- frameworks/TypeScript/elysia/elysia.dockerfile | 2 +- frameworks/TypeScript/elysia/src/postgres.ts | 9 +++------ 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/frameworks/TypeScript/elysia/elysia-compiled.dockerfile b/frameworks/TypeScript/elysia/elysia-compiled.dockerfile index 73de65fcfa7..59e5454e46e 100644 --- a/frameworks/TypeScript/elysia/elysia-compiled.dockerfile +++ b/frameworks/TypeScript/elysia/elysia-compiled.dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.1 +FROM oven/bun:1.2 EXPOSE 8080 diff --git a/frameworks/TypeScript/elysia/elysia-postgres.dockerfile b/frameworks/TypeScript/elysia/elysia-postgres.dockerfile index 68ce83d3325..2058fa4cfee 100644 --- a/frameworks/TypeScript/elysia/elysia-postgres.dockerfile +++ b/frameworks/TypeScript/elysia/elysia-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.1 +FROM oven/bun:1.2 EXPOSE 8080 diff --git a/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile b/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile index fa6c7a7aca7..91ccad74351 100644 --- a/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile +++ b/frameworks/TypeScript/elysia/elysia-smol-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.1 +FROM oven/bun:1.2 EXPOSE 8080 diff --git a/frameworks/TypeScript/elysia/elysia.dockerfile b/frameworks/TypeScript/elysia/elysia.dockerfile index f95b8706c6c..ae30a0d5764 100644 --- a/frameworks/TypeScript/elysia/elysia.dockerfile +++ b/frameworks/TypeScript/elysia/elysia.dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.1 +FROM oven/bun:1.2 EXPOSE 8080 diff --git a/frameworks/TypeScript/elysia/src/postgres.ts b/frameworks/TypeScript/elysia/src/postgres.ts index 33db0497fcc..ee09e073712 100644 --- a/frameworks/TypeScript/elysia/src/postgres.ts +++ b/frameworks/TypeScript/elysia/src/postgres.ts @@ -1,12 +1,9 @@ -import postgres from "postgres"; +import { SQL } from "bun"; import { rand } from "./db-handlers"; import type { Fortune, World } from "./types"; -const sql = postgres({ - host: "tfb-database", - user: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world", +const sql = new SQL({ + url: "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world", max: 1, }); From 759d3646756fcb32ce7b01dd647ad84eb8051438 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 22:13:43 +0000 Subject: [PATCH 1180/1766] Bump uri from 1.0.2 to 1.0.3 in /frameworks/Ruby/rails Bumps [uri](https://github.com/ruby/uri) from 1.0.2 to 1.0.3. - [Release notes](https://github.com/ruby/uri/releases) - [Commits](https://github.com/ruby/uri/compare/v1.0.2...v1.0.3) --- updated-dependencies: - dependency-name: uri 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 e3045598567..b048da6986e 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -255,7 +255,7 @@ GEM concurrent-ruby (~> 1.0) tzinfo-data (1.2024.2) tzinfo (>= 1.0.0) - uri (1.0.2) + uri (1.0.3) useragent (0.16.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) From c484d1af20d72828d15c0a027d18c42715dbfff3 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Tue, 4 Mar 2025 19:20:15 +0800 Subject: [PATCH 1181/1766] use more async closure --- frameworks/Rust/xitca-web/Cargo.lock | 115 +++++++++++++------------- frameworks/Rust/xitca-web/Cargo.toml | 12 +-- frameworks/Rust/xitca-web/src/main.rs | 90 ++++++++++---------- 3 files changed, 110 insertions(+), 107 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 8411895981c..d57f388c2aa 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -37,9 +37,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" dependencies = [ "proc-macro2", "quote", @@ -102,9 +102,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -135,9 +135,9 @@ checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cc" -version = "1.2.15" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "shlex", ] @@ -150,9 +150,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "core_affinity" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622892f5635ce1fc38c8f16dfc938553ed64af482edb5e150bf4caedbfcb2304" +checksum = "a034b3a7b624016c6e13f5df875747cc25f884156aad2abd12b6c46797971342" dependencies = [ "libc", "num_cpus", @@ -215,11 +215,11 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.7" +version = "2.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04001f23ba8843dc315804fa324000376084dfb1c30794ff68dd279e6e5696d5" +checksum = "470eb10efc8646313634c99bb1593f402a6434cbd86e266770c6e39219adb86a" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "byteorder", "diesel_derives", "itoa", @@ -243,9 +243,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.2.3" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" +checksum = "a93958254b70bea63b4187ff73d10180599d9d8d177071b7f91e6da4e0c0ad55" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", @@ -290,9 +290,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" [[package]] name = "fallible-iterator" @@ -473,9 +473,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -501,9 +501,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "itoap" @@ -523,9 +523,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libmimalloc-sys" @@ -741,18 +741,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" dependencies = [ "proc-macro2", ] @@ -776,7 +776,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha", "rand_core", - "zerocopy 0.8.20", + "zerocopy 0.8.21", ] [[package]] @@ -791,37 +791,36 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.20", ] [[package]] name = "redox_syscall" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] name = "ref-cast" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", @@ -836,9 +835,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "sailfish" @@ -897,9 +896,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -1059,9 +1058,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.98" +version = "2.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" dependencies = [ "proc-macro2", "quote", @@ -1090,9 +1089,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -1204,9 +1203,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -1447,13 +1446,13 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] name = "xitca-codegen" version = "0.4.0" -source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" +source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" dependencies = [ "quote", "syn", @@ -1462,7 +1461,7 @@ dependencies = [ [[package]] name = "xitca-http" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" +source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" dependencies = [ "futures-core", "http", @@ -1512,7 +1511,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" +source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" dependencies = [ "fallible-iterator", "futures-core", @@ -1550,7 +1549,7 @@ dependencies = [ [[package]] name = "xitca-server" version = "0.5.0" -source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" +source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" dependencies = [ "socket2 0.5.8", "tokio", @@ -1564,7 +1563,7 @@ dependencies = [ [[package]] name = "xitca-service" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" +source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" [[package]] name = "xitca-unsafe-collection" @@ -1608,7 +1607,7 @@ dependencies = [ [[package]] name = "xitca-web" version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=c2de532#c2de53223e778154e400dc25347ef557c1cec51e" +source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" dependencies = [ "futures-core", "pin-project-lite", @@ -1635,11 +1634,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" dependencies = [ - "zerocopy-derive 0.8.20", + "zerocopy-derive 0.8.21", ] [[package]] @@ -1655,9 +1654,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 64362b8eb1f..9fcea2ad8b4 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -104,9 +104,9 @@ xitca-postgres-diesel = { git = "https://github.com/fakeshadow/xitca-postgres-di diesel-async = { git = "https://github.com/weiznich/diesel_async", rev = "5b8262b" } mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } -xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } -xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } -xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } -xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } -xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } -xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "c2de532" } +xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } +xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } +xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } +xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } +xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } +xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index e49e684cbb4..449651ed129 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -18,18 +18,58 @@ use xitca_service::{Service, ServiceExt, fn_service}; use db::Client; use ser::{IntoResponse, Message, Request, Response, error_response}; -use util::{HandleResult, QueryParse, SERVER_HEADER_VALUE, State}; +use util::{QueryParse, SERVER_HEADER_VALUE, State}; type Ctx<'a> = Context<'a, Request, State>; fn main() -> std::io::Result<()> { let service = Router::new() - .insert("/plaintext", get(fn_service(plain_text))) - .insert("/json", get(fn_service(json))) - .insert("/db", get(fn_service(db))) - .insert("/fortunes", get(fn_service(fortunes))) - .insert("/queries", get(fn_service(queries))) - .insert("/updates", get(fn_service(updates))) + .insert( + "/plaintext", + get(fn_service(async |ctx: Ctx| ctx.into_parts().0.text_response())), + ) + .insert( + "/json", + get(fn_service(async |ctx: Ctx| { + let (req, state) = ctx.into_parts(); + req.json_response(state, &Message::new()) + })), + ) + .insert( + "/db", + get(fn_service(async |ctx: Ctx| { + let (req, state) = ctx.into_parts(); + let world = state.client.get_world().await?; + req.json_response(state, &world) + })), + ) + .insert( + "/fortunes", + get(fn_service(async |ctx: Ctx| { + let (req, state) = ctx.into_parts(); + use sailfish::TemplateOnce; + let fortunes = state.client.tell_fortune().await?.render_once()?; + req.html_response(fortunes) + })), + ) + .insert( + "/queries", + get(fn_service(async |ctx: Ctx| { + let (req, state) = ctx.into_parts(); + let num = req.uri().query().parse_query(); + let worlds = state.client.get_worlds(num).await?; + req.json_response(state, &worlds) + })), + ) + .insert( + "/updates", + get(fn_service(async |ctx: Ctx| { + let (req, state) = ctx.into_parts(); + let num = req.uri().query().parse_query(); + let worlds = state.client.update(num).await?; + req.json_response(state, &worlds) + })), + ) .enclosed(ContextBuilder::new(|| async { db::create().await.map(State::new) })) .enclosed_fn(async |service, req| { let mut res = service.call(req).await.unwrap_or_else(error_handler); @@ -52,39 +92,3 @@ fn error_handler(e: RouterError) -> Response { RouterError::Service(_) => StatusCode::INTERNAL_SERVER_ERROR, }) } - -async fn plain_text(ctx: Ctx<'_>) -> HandleResult { - ctx.into_parts().0.text_response() -} - -async fn json(ctx: Ctx<'_>) -> HandleResult { - let (req, state) = ctx.into_parts(); - req.json_response(state, &Message::new()) -} - -async fn db(ctx: Ctx<'_>) -> HandleResult { - let (req, state) = ctx.into_parts(); - let world = state.client.get_world().await?; - req.json_response(state, &world) -} - -async fn fortunes(ctx: Ctx<'_>) -> HandleResult { - let (req, state) = ctx.into_parts(); - use sailfish::TemplateOnce; - let fortunes = state.client.tell_fortune().await?.render_once()?; - req.html_response(fortunes) -} - -async fn queries(ctx: Ctx<'_>) -> HandleResult { - let (req, state) = ctx.into_parts(); - let num = req.uri().query().parse_query(); - let worlds = state.client.get_worlds(num).await?; - req.json_response(state, &worlds) -} - -async fn updates(ctx: Ctx<'_>) -> HandleResult { - let (req, state) = ctx.into_parts(); - let num = req.uri().query().parse_query(); - let worlds = state.client.update(num).await?; - req.json_response(state, &worlds) -} From c0c8d2f9f8758ba4f0c9ac700d2175b85ec13292 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:33:26 +0000 Subject: [PATCH 1182/1766] Bump rack from 3.1.10 to 3.1.11 in /frameworks/Ruby/rails Bumps [rack](https://github.com/rack/rack) from 3.1.10 to 3.1.11. - [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.1.10...v3.1.11) --- updated-dependencies: - dependency-name: rack 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 b048da6986e..876056701dd 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -197,7 +197,7 @@ GEM puma (6.5.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.10) + rack (3.1.11) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) From 73b64051b2db302308d132a37303cfa6555b7818 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:51:21 +0000 Subject: [PATCH 1183/1766] Bump fastify from 2.12.1 to 2.15.1 in /frameworks/TypeScript/nest Bumps [fastify](https://github.com/fastify/fastify) from 2.12.1 to 2.15.1. - [Release notes](https://github.com/fastify/fastify/releases) - [Commits](https://github.com/fastify/fastify/compare/v2.12.1...v2.15.1) --- updated-dependencies: - dependency-name: fastify dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 fe27e6fc40b..9487ab587a0 100644 --- a/frameworks/TypeScript/nest/package.json +++ b/frameworks/TypeScript/nest/package.json @@ -21,7 +21,7 @@ "@nestjs/platform-fastify": "6.11.11", "@nestjs/typeorm": "7.1.5", "cache-manager": "3.1.0", - "fastify": "2.12.1", + "fastify": "2.15.1", "fastify-formbody": "3.1.0", "handlebars": "4.7.3", "hbs": "4.1.0", From 740508dad1f55b70ed9d03631554900516fd5696 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:51:22 +0000 Subject: [PATCH 1184/1766] Bump handlebars from 4.7.3 to 4.7.7 in /frameworks/TypeScript/nest Bumps [handlebars](https://github.com/handlebars-lang/handlebars.js) from 4.7.3 to 4.7.7. - [Release notes](https://github.com/handlebars-lang/handlebars.js/releases) - [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md) - [Commits](https://github.com/handlebars-lang/handlebars.js/compare/v4.7.3...v4.7.7) --- updated-dependencies: - dependency-name: handlebars dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 fe27e6fc40b..2c6d5bb2a37 100644 --- a/frameworks/TypeScript/nest/package.json +++ b/frameworks/TypeScript/nest/package.json @@ -23,7 +23,7 @@ "cache-manager": "3.1.0", "fastify": "2.12.1", "fastify-formbody": "3.1.0", - "handlebars": "4.7.3", + "handlebars": "4.7.7", "hbs": "4.1.0", "mongodb": "3.5.4", "mysql2": "3.9.8", From 4e14dcd51011753b2dfb85c9dae5c92ad76f8edc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 19:52:49 +0000 Subject: [PATCH 1185/1766] Bump rack from 2.2.10 to 2.2.12 in /frameworks/Ruby/rage-sequel Bumps [rack](https://github.com/rack/rack) from 2.2.10 to 2.2.12. - [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/v2.2.10...v2.2.12) --- updated-dependencies: - dependency-name: rack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rage-sequel/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index d1ad00bb988..251d9c3b3b5 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -3,7 +3,7 @@ GEM specs: bigdecimal (3.1.9) pg (1.5.9) - rack (2.2.10) + rack (2.2.12) rack-test (2.2.0) rack (>= 1.3) rage-iodine (4.0.0) From f5afe651b0c440b4056a2b63aa2d7490efa15450 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Wed, 5 Mar 2025 13:00:13 -0600 Subject: [PATCH 1186/1766] [nextjs] Use config to set HTTP `Server` header [According to Next.js maintainers][suggestion], this can improve performance: > If you only need custom headers, you might see better performance by > using the `headers` option in `next.config.js` instead of middleware. [suggestion]: https://github.com/vercel/next.js/discussions/75930#discussioncomment-12187436 --- frameworks/TypeScript/nextjs/middleware.ts | 7 ------- frameworks/TypeScript/nextjs/next.config.ts | 11 +++++++++++ 2 files changed, 11 insertions(+), 7 deletions(-) delete mode 100644 frameworks/TypeScript/nextjs/middleware.ts diff --git a/frameworks/TypeScript/nextjs/middleware.ts b/frameworks/TypeScript/nextjs/middleware.ts deleted file mode 100644 index 7983b8a3673..00000000000 --- a/frameworks/TypeScript/nextjs/middleware.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { NextRequest, NextResponse } from "next/server" - -export function middleware(request: NextRequest) { - const response = NextResponse.next() - response.headers.set("Server", "Next.js") - return response -} diff --git a/frameworks/TypeScript/nextjs/next.config.ts b/frameworks/TypeScript/nextjs/next.config.ts index 68a6c64d279..7d67e37baf8 100644 --- a/frameworks/TypeScript/nextjs/next.config.ts +++ b/frameworks/TypeScript/nextjs/next.config.ts @@ -2,6 +2,17 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { output: "standalone", + + async headers() { + return [ + { + source: "/(.*?)", + headers: [ + { key: "Server", value: "Next.js" }, + ], + }, + ] + }, }; export default nextConfig; From 2ca756242b2814853b84c95c83801bcd69361b97 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Wed, 5 Mar 2025 11:31:42 -0600 Subject: [PATCH 1187/1766] [nextjs] Enable Fortunes test Previously, the Fortunes test for Next.js was temporarily disabled due to strict requirements on the HTML output. Those requirements have been relaxed by #9505, so this commit enables for the Fortunes test for Next.js. --- frameworks/TypeScript/nextjs/README.md | 18 ------------------ .../TypeScript/nextjs/benchmark_config.json | 2 +- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/frameworks/TypeScript/nextjs/README.md b/frameworks/TypeScript/nextjs/README.md index c6cb986eac7..10411041b28 100644 --- a/frameworks/TypeScript/nextjs/README.md +++ b/frameworks/TypeScript/nextjs/README.md @@ -27,21 +27,3 @@ [`app/updates/route.ts`]: ./app/updates/route.ts [`app/plaintext/route.ts`]: ./app/plaintext/route.ts [`app/cached-queries/route.ts`]: ./app/cached-queries/route.ts - -## TODO - -The Fortunes test is currently disabled because the benchmark expects exact HTML output — see [TechEmpower/FrameworkBenchmarks#9505](https://github.com/TechEmpower/FrameworkBenchmarks/pull/9505). After that issue is resolved, the Fortunes test can be re-enabled by applying the following diff: - -```diff ---- a/frameworks/TypeScript/nextjs/benchmark_config.json -+++ b/frameworks/TypeScript/nextjs/benchmark_config.json -@@ -20,7 +20,7 @@ - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", -- "TEMPORARILY DISABLED fortune_url": "/fortunes", -+ "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "cached_query_url": "/cached-queries?queries=" -``` diff --git a/frameworks/TypeScript/nextjs/benchmark_config.json b/frameworks/TypeScript/nextjs/benchmark_config.json index d0853b96419..72980fe5922 100644 --- a/frameworks/TypeScript/nextjs/benchmark_config.json +++ b/frameworks/TypeScript/nextjs/benchmark_config.json @@ -20,7 +20,7 @@ "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", - "TEMPORARILY DISABLED fortune_url": "/fortunes", + "fortune_url": "/fortunes", "update_url": "/updates?queries=", "plaintext_url": "/plaintext", "cached_query_url": "/cached-queries?queries=" From fe6eae1dc5f0843830b71786aa856b363237eb9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:49:18 +0000 Subject: [PATCH 1188/1766] Bump jinja2 from 2.11.3 to 3.1.6 in /frameworks/Python/turbogears Bumps [jinja2](https://github.com/pallets/jinja) from 2.11.3 to 3.1.6. - [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.6) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/turbogears/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/turbogears/requirements.txt b/frameworks/Python/turbogears/requirements.txt index 0ad8a126c99..58499e541b2 100644 --- a/frameworks/Python/turbogears/requirements.txt +++ b/frameworks/Python/turbogears/requirements.txt @@ -3,7 +3,7 @@ tg.devtools==2.3.8 SQLAlchemy==1.3.0 zope.sqlalchemy==0.7.6 mysqlclient==1.3.7 -jinja2==2.11.3 +jinja2==3.1.6 gunicorn==19.9.0 meinheld==1.0.2 From 2e8dc1f92efc1402d6e16e8164dde575e8a41161 Mon Sep 17 00:00:00 2001 From: litongjava Date: Thu, 6 Mar 2025 23:19:12 -1000 Subject: [PATCH 1189/1766] update tio-boot version --- frameworks/Java/tio-boot/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index 668d7ea5c01..6370df32af1 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -11,7 +11,7 @@ 1.8 ${java.version} ${java.version} - 1.9.1 + 1.9.3 com.litongjava.tio.http.server.MainApp @@ -25,7 +25,7 @@ com.litongjava java-db - 1.4.9 + 1.5.0 junit From 6bab1ca5b1a3ac32ea57b1f47f0570b0c2d19059 Mon Sep 17 00:00:00 2001 From: litongjava Date: Fri, 7 Mar 2025 00:00:45 -1000 Subject: [PATCH 1190/1766] upgrade tio-core to 3.7.3.v20250305-RELEASE --- frameworks/Java/tio-http-server/pom.xml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index 080b11956ff..f6fc4055259 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -1,4 +1,6 @@ - + 4.0.0 com.litongjava tio-http-server-benchmark @@ -17,11 +19,16 @@ com.litongjava tio-http-server 3.7.3.v20250301-RELEASE + + + com.litongjava + tio-core + 3.7.3.v20250305-RELEASE com.litongjava java-db - 1.4.9 + 1.5.0 junit From 63ad280af8d56c3d9d87d33e36137a4258a945ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 17:05:02 +0000 Subject: [PATCH 1191/1766] Bump ring from 0.17.8 to 0.17.13 in /frameworks/Rust/rocket Bumps [ring](https://github.com/briansmith/ring) from 0.17.8 to 0.17.13. - [Changelog](https://github.com/briansmith/ring/blob/main/RELEASES.md) - [Commits](https://github.com/briansmith/ring/commits) --- updated-dependencies: - dependency-name: ring dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/rocket/Cargo.lock | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index 99bf76ca11b..68a60d48670 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -195,11 +195,11 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ - "libc", + "shlex", ] [[package]] @@ -873,9 +873,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libm" @@ -1451,15 +1451,14 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "ring" -version = "0.17.8" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" dependencies = [ "cc", "cfg-if", "getrandom", "libc", - "spin 0.9.8", "untrusted", "windows-sys 0.52.0", ] @@ -1775,6 +1774,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.1" From 071bb2b6d2a52b97a8c220c2de0d01e64780f9fa Mon Sep 17 00:00:00 2001 From: Alpha Ho <666504+alphaho@users.noreply.github.com> Date: Tue, 25 Feb 2025 23:16:06 +0900 Subject: [PATCH 1192/1766] Add kyo-tapir --- frameworks/Scala/kyo-tapir/README.md | 21 ++++++++ .../Scala/kyo-tapir/benchmark_config.json | 26 ++++++++++ frameworks/Scala/kyo-tapir/build.sbt | 17 +++++++ frameworks/Scala/kyo-tapir/config.toml | 15 ++++++ .../Scala/kyo-tapir/kyo-tapir.dockerfile | 10 ++++ .../Scala/kyo-tapir/project/build.properties | 1 + .../Scala/kyo-tapir/project/plugins.sbt | 1 + .../Scala/kyo-tapir/src/main/scala/Main.scala | 48 +++++++++++++++++++ .../kyo-tapir/src/main/scala/Payload.scala | 8 ++++ 9 files changed, 147 insertions(+) create mode 100644 frameworks/Scala/kyo-tapir/README.md create mode 100644 frameworks/Scala/kyo-tapir/benchmark_config.json create mode 100644 frameworks/Scala/kyo-tapir/build.sbt create mode 100644 frameworks/Scala/kyo-tapir/config.toml create mode 100644 frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile create mode 100644 frameworks/Scala/kyo-tapir/project/build.properties create mode 100644 frameworks/Scala/kyo-tapir/project/plugins.sbt create mode 100644 frameworks/Scala/kyo-tapir/src/main/scala/Main.scala create mode 100644 frameworks/Scala/kyo-tapir/src/main/scala/Payload.scala diff --git a/frameworks/Scala/kyo-tapir/README.md b/frameworks/Scala/kyo-tapir/README.md new file mode 100644 index 00000000000..4fcc3d2c677 --- /dev/null +++ b/frameworks/Scala/kyo-tapir/README.md @@ -0,0 +1,21 @@ +# Kyo Tapir Benchmarking Test + +This is a simple test to benchmark the performance of the Kyo and Tapir libraries in Scala. + +### Test Type Implementation Source Code + +* [JSON](src/main/scala/Main.scala) +* [PLAINTEXT](src/main/scala/Main.scala) + +## Software Versions + +* [Java OpenJDK 21](https://adoptium.net/temurin/releases/) +* [Scala 3.6.3](https://www.scala-lang.org/) +* [Kyo 0.16.2](https://github.com/getkyo/kyo) +* [Tapir 1.11.15](https://tapir.softwaremill.com) +* [ZIO Json 0.7.32](https://zio.dev/zio-json/) + +## Test URLs + +* JSON - http://localhost:9999/json +* PLAINTEXT - http://localhost:9999/plaintext diff --git a/frameworks/Scala/kyo-tapir/benchmark_config.json b/frameworks/Scala/kyo-tapir/benchmark_config.json new file mode 100644 index 00000000000..3b005996a8f --- /dev/null +++ b/frameworks/Scala/kyo-tapir/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "kyo-tapir", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 9999, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "kyo-tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "kyo-tapir", + "notes": "", + "versus": "None" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/build.sbt b/frameworks/Scala/kyo-tapir/build.sbt new file mode 100644 index 00000000000..c7ee01108fc --- /dev/null +++ b/frameworks/Scala/kyo-tapir/build.sbt @@ -0,0 +1,17 @@ +name := "kyo-tapir" +version := "1.0.0" +scalaVersion := "3.6.3" +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "io.getkyo" %% "kyo-tapir" % "0.16.2", + "com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.11.15", + "dev.zio" %% "zio-json" % "0.7.32" + ), + assembly / assemblyMergeStrategy := { + case x if x.contains("io.netty.versions.properties") => MergeStrategy.discard + case x => + val oldStrategy = (assembly / assemblyMergeStrategy).value + oldStrategy(x) + } + ) diff --git a/frameworks/Scala/kyo-tapir/config.toml b/frameworks/Scala/kyo-tapir/config.toml new file mode 100644 index 00000000000..f210a34bf48 --- /dev/null +++ b/frameworks/Scala/kyo-tapir/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "kyo-tapir" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile b/frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile new file mode 100644 index 00000000000..4dc5370acf2 --- /dev/null +++ b/frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile @@ -0,0 +1,10 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.7_3.6.3 + +WORKDIR /kyo-tapir +COPY src src +COPY project project +COPY build.sbt build.sbt +RUN sbt assembly + +EXPOSE 9999 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-Dio.netty.leakDetection.level=disabled", "-Dio.netty.recycler.maxCapacityPerThread=0", "-jar", "/kyo-tapir/target/scala-3.6.3/kyo-tapir-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/project/build.properties b/frameworks/Scala/kyo-tapir/project/build.properties new file mode 100644 index 00000000000..0882e8a3906 --- /dev/null +++ b/frameworks/Scala/kyo-tapir/project/build.properties @@ -0,0 +1 @@ +sbt.version = 1.10.7 \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/project/plugins.sbt b/frameworks/Scala/kyo-tapir/project/plugins.sbt new file mode 100644 index 00000000000..f8ea5d0fbb0 --- /dev/null +++ b/frameworks/Scala/kyo-tapir/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") diff --git a/frameworks/Scala/kyo-tapir/src/main/scala/Main.scala b/frameworks/Scala/kyo-tapir/src/main/scala/Main.scala new file mode 100644 index 00000000000..6c543de17e2 --- /dev/null +++ b/frameworks/Scala/kyo-tapir/src/main/scala/Main.scala @@ -0,0 +1,48 @@ +import kyo.* +import sttp.model.{Header, HeaderNames} +import sttp.tapir.* +import sttp.tapir.json.zio.* +import sttp.tapir.server.netty.* + +object Main extends KyoApp { + private val STATIC_SERVER_NAME = "kyo-tapir" + + private val plainTextMessage: String = "Hello, World!" + + run { + val plaintextRoute: Unit < Routes = + Routes.add( + _.get.in("plaintext") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(header[String](HeaderNames.Date)) + .out(stringBody) + ) { _ => + for { + now <- Clock.now + } yield Header.toHttpDateString(now.toJava) -> plainTextMessage + } + + val jsonRoute: Unit < Routes = + Routes.add( + _.get.in("json") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(header[String](HeaderNames.Date)) + .out(jsonBody[Payload]) + ) { _ => + for { + now <- Clock.now + } yield Header.toHttpDateString(now.toJava) -> Payload(plainTextMessage) + } + + val config = NettyConfig.default + .withSocketKeepAlive + .copy(lingerTimeout = None) + + val server = NettyKyoServer(config).host("0.0.0.0").port(9999) + + val binding: NettyKyoServerBinding < Async = + Routes.run(server)(plaintextRoute.andThen(jsonRoute)) + + binding + } +} \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/src/main/scala/Payload.scala b/frameworks/Scala/kyo-tapir/src/main/scala/Payload.scala new file mode 100644 index 00000000000..53b27e476c2 --- /dev/null +++ b/frameworks/Scala/kyo-tapir/src/main/scala/Payload.scala @@ -0,0 +1,8 @@ +import sttp.tapir.Schema +import zio.json.* + +case class Payload(message: String) +object Payload { + given JsonCodec[Payload] = DeriveJsonCodec.gen + given Schema[Payload] = Schema.derived +} \ No newline at end of file From 1883072ffa87ee00741da883b338e05e7ceea1ab Mon Sep 17 00:00:00 2001 From: redkale Date: Sun, 9 Mar 2025 14:19:09 +0800 Subject: [PATCH 1193/1766] Update Redkale Maven --- frameworks/Java/redkale/pom-jdbc.xml | 4 ++-- frameworks/Java/redkale/pom-pgclient.xml | 4 ++-- frameworks/Java/redkale/pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Java/redkale/pom-jdbc.xml b/frameworks/Java/redkale/pom-jdbc.xml index 86b6c6d5fd6..8483c39801d 100644 --- a/frameworks/Java/redkale/pom-jdbc.xml +++ b/frameworks/Java/redkale/pom-jdbc.xml @@ -7,8 +7,8 @@ org.redkale.boot.Application - 2.8.0-SNAPSHOT - 1.2.0-SNAPSHOT + 2.8.1-SNAPSHOT + 1.2.0 42.7.2 UTF-8 21 diff --git a/frameworks/Java/redkale/pom-pgclient.xml b/frameworks/Java/redkale/pom-pgclient.xml index 47f212a3053..10ee48261f9 100644 --- a/frameworks/Java/redkale/pom-pgclient.xml +++ b/frameworks/Java/redkale/pom-pgclient.xml @@ -7,8 +7,8 @@ org.redkale.boot.Application - 2.8.0-SNAPSHOT - 1.2.0-SNAPSHOT + 2.8.1-SNAPSHOT + 1.2.0 4.5.8 2.1 UTF-8 diff --git a/frameworks/Java/redkale/pom.xml b/frameworks/Java/redkale/pom.xml index 3c7970fb4e3..c8ef3afb031 100644 --- a/frameworks/Java/redkale/pom.xml +++ b/frameworks/Java/redkale/pom.xml @@ -7,8 +7,8 @@ org.redkale.boot.Application - 2.8.0-SNAPSHOT - 1.2.0-SNAPSHOT + 2.8.1-SNAPSHOT + 1.2.0 UTF-8 21 21 From 174292e133585186447d4ae4397db1709b68ef8f Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Sun, 9 Mar 2025 18:44:39 +0500 Subject: [PATCH 1194/1766] ntex: update version --- frameworks/Rust/ntex/Cargo.toml | 26 ++++++++- frameworks/Rust/ntex/benchmark_config.json | 56 +++++++++++++++++++ frameworks/Rust/ntex/config.toml | 41 ++++++++++++++ .../Rust/ntex/ntex-db-default.dockerfile | 16 ++++++ frameworks/Rust/ntex/ntex-default.dockerfile | 16 ++++++ .../Rust/ntex/ntex-plt-default.dockerfile | 16 ++++++ frameworks/Rust/ntex/src/main.rs | 16 +----- frameworks/Rust/ntex/src/main_db.rs | 16 +----- frameworks/Rust/ntex/src/main_plt.rs | 16 +----- 9 files changed, 172 insertions(+), 47 deletions(-) create mode 100644 frameworks/Rust/ntex/ntex-db-default.dockerfile create mode 100644 frameworks/Rust/ntex/ntex-default.dockerfile create mode 100644 frameworks/Rust/ntex/ntex-plt-default.dockerfile diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index 3bbf3dffa0f..d87937a626f 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -11,6 +11,10 @@ path = "src/main.rs" name = "ntex-compio" path = "src/main.rs" +[[bin]] +name = "ntex-default" +path = "src/main.rs" + [[bin]] name = "ntex-db" path = "src/main_db.rs" @@ -19,6 +23,10 @@ path = "src/main_db.rs" name = "ntex-db-compio" path = "src/main_db.rs" +[[bin]] +name = "ntex-db-default" +path = "src/main_db.rs" + [[bin]] name = "ntex-plt" path = "src/main_plt.rs" @@ -27,6 +35,10 @@ path = "src/main_plt.rs" name = "ntex-plt-compio" path = "src/main_plt.rs" +[[bin]] +name = "ntex-plt-default" +path = "src/main_plt.rs" + [features] default = [] @@ -36,8 +48,11 @@ tokio = ["ntex/tokio"] # compio runtime compio = ["ntex/compio"] +# default-rt runtime +default-rt = ["ntex/default-rt"] + [dependencies] -ntex = "2.8" +ntex = "2.12" ntex-compio = "0.2" ntex-bytes = { version = "0.1.21", features=["simd"] } mimalloc = { version = "0.1.25", default-features = false } @@ -47,7 +62,6 @@ buf-min = { version = "0.7", features = ["ntex-bytes"] } env_logger = "0.11" nanorand = { version = "0.7", default-features = false, features = ["std", "wyrand", "tls"] } atoi = "2.0" -core_affinity = "0.8" futures = "0.3" sonic-rs = "0.3.16" serde = { version = "1", features = ["derive"] } @@ -59,6 +73,14 @@ tokio-postgres = { git="https://github.com/fafhrd91/postgres.git", branch="ntex- [target.'cfg(target_os = "linux")'.dependencies] compio-driver = { version = "*", features = ["io-uring"]} +[patch.crates-io] +ntex = { git = "https://github.com/ntex-rs/ntex.git" } +ntex-io = { git = "https://github.com/ntex-rs/ntex.git" } +ntex-iodriver = { git = "https://github.com/ntex-rs/ntex.git" } +ntex-net = { git = "https://github.com/ntex-rs/ntex.git" } +ntex-rt = { git = "https://github.com/ntex-rs/ntex.git" } +ntex-runtime = { git = "https://github.com/ntex-rs/ntex.git" } + [profile.release] opt-level = 3 codegen-units = 1 diff --git a/frameworks/Rust/ntex/benchmark_config.json b/frameworks/Rust/ntex/benchmark_config.json index 9ed29c64b97..ef02ed24804 100755 --- a/frameworks/Rust/ntex/benchmark_config.json +++ b/frameworks/Rust/ntex/benchmark_config.json @@ -37,6 +37,24 @@ "notes": "", "versus": "" }, + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "ntex", + "language": "Rust", + "orm": "Raw", + "platform": "None", + "webserver": "ntex", + "os": "Linux", + "database_os": "Linux", + "display_name": "ntex [default]", + "notes": "", + "versus": "" + }, "db": { "fortune_url": "/fortunes", "db_url": "/db", @@ -77,6 +95,26 @@ "notes": "", "versus": "" }, + "db-default": { + "fortune_url": "/fortunes", + "db_url": "/db", + "query_url": "/query?q=", + "update_url": "/update?q=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "ntex", + "language": "Rust", + "orm": "Raw", + "platform": "None", + "webserver": "ntex", + "os": "Linux", + "database_os": "Linux", + "display_name": "ntex [default,db]", + "notes": "", + "versus": "" + }, "plt": { "json_url": "/json", "plaintext_url": "/plaintext", @@ -112,6 +150,24 @@ "display_name": "ntex [compio,platform]", "notes": "", "versus": "" + }, + "plt-default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "ntex", + "language": "Rust", + "orm": "Raw", + "platform": "None", + "webserver": "ntex", + "os": "Linux", + "database_os": "Linux", + "display_name": "ntex [default,platform]", + "notes": "", + "versus": "" } }] } diff --git a/frameworks/Rust/ntex/config.toml b/frameworks/Rust/ntex/config.toml index 759dca26c70..8fc74a20d70 100644 --- a/frameworks/Rust/ntex/config.toml +++ b/frameworks/Rust/ntex/config.toml @@ -27,6 +27,19 @@ platform = "None" webserver = "ntex" versus = "" +[default] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "ntex" +versus = "" + [db] urls.db = "/db" urls.query = "/query?q=" @@ -57,6 +70,21 @@ platform = "None" webserver = "ntex" versus = "" +[db-default] +urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "ntex" +versus = "" + [plt] urls.plaintext = "/plaintext" urls.json = "/json" @@ -82,3 +110,16 @@ orm = "Raw" platform = "None" webserver = "ntex" versus = "" + +[plt-default] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "ntex" +versus = "" diff --git a/frameworks/Rust/ntex/ntex-db-default.dockerfile b/frameworks/Rust/ntex/ntex-db-default.dockerfile new file mode 100644 index 00000000000..1ce2f12e7af --- /dev/null +++ b/frameworks/Rust/ntex/ntex-db-default.dockerfile @@ -0,0 +1,16 @@ +FROM rust:latest + +# Disable simd at jsonescape +# ENV CARGO_CFG_JSONESCAPE_DISABLE_AUTO_SIMD= + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /ntex +WORKDIR /ntex + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default-rt" + +EXPOSE 8080 + +CMD ./target/release/ntex-db-default diff --git a/frameworks/Rust/ntex/ntex-default.dockerfile b/frameworks/Rust/ntex/ntex-default.dockerfile new file mode 100644 index 00000000000..06a70a68a8f --- /dev/null +++ b/frameworks/Rust/ntex/ntex-default.dockerfile @@ -0,0 +1,16 @@ +FROM rust:latest + +# Disable simd at jsonescape +# ENV CARGO_CFG_JSONESCAPE_DISABLE_AUTO_SIMD= + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /ntex +WORKDIR /ntex + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default-rt" + +EXPOSE 8080 + +CMD ./target/release/ntex-default diff --git a/frameworks/Rust/ntex/ntex-plt-default.dockerfile b/frameworks/Rust/ntex/ntex-plt-default.dockerfile new file mode 100644 index 00000000000..f6b1c389bae --- /dev/null +++ b/frameworks/Rust/ntex/ntex-plt-default.dockerfile @@ -0,0 +1,16 @@ +FROM rust:latest + +# Disable simd at jsonescape +# ENV CARGO_CFG_JSONESCAPE_DISABLE_AUTO_SIMD= + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /ntex +WORKDIR /ntex + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default" + +EXPOSE 8080 + +CMD ./target/release/ntex-plt-default diff --git a/frameworks/Rust/ntex/src/main.rs b/frameworks/Rust/ntex/src/main.rs index 5210d85863f..aeecbeae481 100644 --- a/frameworks/Rust/ntex/src/main.rs +++ b/frameworks/Rust/ntex/src/main.rs @@ -48,13 +48,10 @@ async fn plaintext() -> web::HttpResponse { async fn main() -> std::io::Result<()> { println!("Started http server: 127.0.0.1:8080"); - let cores = core_affinity::get_core_ids().unwrap(); - let total_cores = cores.len(); - let cores = std::sync::Arc::new(std::sync::Mutex::new(cores)); - // start http server ntex::server::build() .backlog(1024) + .enable_affinity() .bind("techempower", "0.0.0.0:8080", |cfg| { cfg.memory_pool(PoolId::P1); PoolId::P1.set_read_params(65535, 2048); @@ -67,17 +64,6 @@ async fn main() -> std::io::Result<()> { .payload_read_rate(Seconds::ZERO, Seconds::ZERO, 0) .h1(web::App::new().service(json).service(plaintext).finish()) })? - .configure(move |cfg| { - let cores = cores.clone(); - cfg.on_worker_start(move |_| { - if let Some(core) = cores.lock().unwrap().pop() { - core_affinity::set_for_current(core); - } - Ready::<_, &str>::Ok(()) - }); - Ok(()) - })? - .workers(total_cores) .run() .await } diff --git a/frameworks/Rust/ntex/src/main_db.rs b/frameworks/Rust/ntex/src/main_db.rs index 4197322bc13..bce599170ab 100644 --- a/frameworks/Rust/ntex/src/main_db.rs +++ b/frameworks/Rust/ntex/src/main_db.rs @@ -82,12 +82,9 @@ impl ServiceFactory for AppFactory { async fn main() -> std::io::Result<()> { println!("Starting http server: 127.0.0.1:8080"); - let cores = core_affinity::get_core_ids().unwrap(); - let total_cores = cores.len(); - let cores = std::sync::Arc::new(std::sync::Mutex::new(cores)); - ntex::server::build() .backlog(1024) + .enable_affinity() .bind("techempower", "0.0.0.0:8080", |cfg| { cfg.memory_pool(PoolId::P1); PoolId::P1.set_read_params(65535, 2048); @@ -100,17 +97,6 @@ async fn main() -> std::io::Result<()> { .payload_read_rate(Seconds::ZERO, Seconds::ZERO, 0) .h1(AppFactory) })? - .configure(move |cfg| { - let cores = cores.clone(); - cfg.on_worker_start(move |_| { - if let Some(core) = cores.lock().unwrap().pop() { - core_affinity::set_for_current(core); - } - Ready::<_, &str>::Ok(()) - }); - Ok(()) - })? - .workers(total_cores) .run() .await } diff --git a/frameworks/Rust/ntex/src/main_plt.rs b/frameworks/Rust/ntex/src/main_plt.rs index 9cc80ac9952..78642043289 100644 --- a/frameworks/Rust/ntex/src/main_plt.rs +++ b/frameworks/Rust/ntex/src/main_plt.rs @@ -79,13 +79,10 @@ impl Future for App { async fn main() -> io::Result<()> { println!("Started http server: 127.0.0.1:8080"); - let cores = core_affinity::get_core_ids().unwrap(); - let total_cores = cores.len(); - let cores = std::sync::Arc::new(std::sync::Mutex::new(cores)); - // start http server ntex::server::build() .backlog(1024) + .enable_affinity() .bind("techempower", "0.0.0.0:8080", |cfg| { cfg.memory_pool(PoolId::P1); PoolId::P1.set_read_params(65535, 2048); @@ -96,17 +93,6 @@ async fn main() -> io::Result<()> { codec: h1::Codec::default(), }) })? - .configure(move |cfg| { - let cores = cores.clone(); - cfg.on_worker_start(move |_| { - if let Some(core) = cores.lock().unwrap().pop() { - core_affinity::set_for_current(core); - } - Ready::<_, &str>::Ok(()) - }); - Ok(()) - })? - .workers(total_cores) .run() .await } From b78c530668299b37a346aacacac569d077980331 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Sun, 9 Mar 2025 18:50:31 +0500 Subject: [PATCH 1195/1766] wip --- frameworks/Rust/ntex/src/db.rs | 2 +- frameworks/Rust/ntex/src/main.rs | 2 +- frameworks/Rust/ntex/src/main_db.rs | 2 +- frameworks/Rust/ntex/src/main_plt.rs | 5 ++--- frameworks/Rust/ntex/src/utils.rs | 4 ++-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/ntex/src/db.rs b/frameworks/Rust/ntex/src/db.rs index cd4443f3c00..da33f1f6c35 100644 --- a/frameworks/Rust/ntex/src/db.rs +++ b/frameworks/Rust/ntex/src/db.rs @@ -173,7 +173,7 @@ impl PgConnection { utils::reserve(&mut body, 4 * 1024); FortunesTemplate { - fortunes: &*fortunes, + fortunes: &fortunes, } .write_call(&mut body); fortunes.clear(); diff --git a/frameworks/Rust/ntex/src/main.rs b/frameworks/Rust/ntex/src/main.rs index aeecbeae481..b0e53b3f05c 100644 --- a/frameworks/Rust/ntex/src/main.rs +++ b/frameworks/Rust/ntex/src/main.rs @@ -2,7 +2,7 @@ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; use ntex::http::header::{CONTENT_TYPE, SERVER}; -use ntex::{http, time::Seconds, util::BytesMut, util::PoolId, util::Ready, web}; +use ntex::{http, time::Seconds, util::BytesMut, util::PoolId, web}; use sonic_rs::Serialize; mod utils; diff --git a/frameworks/Rust/ntex/src/main_db.rs b/frameworks/Rust/ntex/src/main_db.rs index bce599170ab..544921fb594 100644 --- a/frameworks/Rust/ntex/src/main_db.rs +++ b/frameworks/Rust/ntex/src/main_db.rs @@ -6,7 +6,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::PoolId, util::Ready}; +use ntex::{time::Seconds, util::PoolId}; mod db; mod utils; diff --git a/frameworks/Rust/ntex/src/main_plt.rs b/frameworks/Rust/ntex/src/main_plt.rs index 78642043289..e16070f0b63 100644 --- a/frameworks/Rust/ntex/src/main_plt.rs +++ b/frameworks/Rust/ntex/src/main_plt.rs @@ -1,10 +1,9 @@ #[global_allocator] static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; -use std::{future::Future, io, pin::Pin, task::Context, task::Poll}; +use std::{future::Future, io, pin::Pin, task::ready, task::Context, task::Poll}; -use ntex::util::{ready, PoolId, Ready}; -use ntex::{fn_service, http::h1, io::Io, io::RecvError}; +use ntex::{fn_service, http::h1, io::Io, io::RecvError, util::PoolId}; use sonic_rs::Serialize; mod utils; diff --git a/frameworks/Rust/ntex/src/utils.rs b/frameworks/Rust/ntex/src/utils.rs index 7a2e6bf1df1..b8a9010237f 100644 --- a/frameworks/Rust/ntex/src/utils.rs +++ b/frameworks/Rust/ntex/src/utils.rs @@ -34,7 +34,7 @@ pub fn reserve(buf: &mut BytesMut, lw: usize) { pub struct BytesWriter<'a>(pub &'a mut BytesMut); -impl<'a> Write for BytesWriter<'a> { +impl Write for BytesWriter<'_> { fn write(&mut self, src: &[u8]) -> Result { self.0.extend_from_slice(src); Ok(src.len()) @@ -45,7 +45,7 @@ impl<'a> Write for BytesWriter<'a> { } } -impl<'a> WriteExt for BytesWriter<'a> { +impl WriteExt for BytesWriter<'_> { #[inline(always)] fn reserve_with(&mut self, additional: usize) -> Result<&mut [MaybeUninit], io::Error> { self.0.reserve(additional); From 698e69bca8f6e8c321dcfbc8e50caa39d30fb16b Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Sun, 9 Mar 2025 19:03:07 +0500 Subject: [PATCH 1196/1766] wip --- frameworks/Rust/ntex/benchmark_config.json | 2 +- frameworks/Rust/ntex/config.toml | 2 +- frameworks/Rust/ntex/ntex-plt-default.dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Rust/ntex/benchmark_config.json b/frameworks/Rust/ntex/benchmark_config.json index ef02ed24804..67ffbf68d7a 100755 --- a/frameworks/Rust/ntex/benchmark_config.json +++ b/frameworks/Rust/ntex/benchmark_config.json @@ -37,7 +37,7 @@ "notes": "", "versus": "" }, - "default": { + "default-rt": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, diff --git a/frameworks/Rust/ntex/config.toml b/frameworks/Rust/ntex/config.toml index 8fc74a20d70..3595c61e8fd 100644 --- a/frameworks/Rust/ntex/config.toml +++ b/frameworks/Rust/ntex/config.toml @@ -27,7 +27,7 @@ platform = "None" webserver = "ntex" versus = "" -[default] +[default-rt] urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" diff --git a/frameworks/Rust/ntex/ntex-plt-default.dockerfile b/frameworks/Rust/ntex/ntex-plt-default.dockerfile index f6b1c389bae..8e2e72a8343 100644 --- a/frameworks/Rust/ntex/ntex-plt-default.dockerfile +++ b/frameworks/Rust/ntex/ntex-plt-default.dockerfile @@ -9,7 +9,7 @@ ADD ./ /ntex WORKDIR /ntex RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default" +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default-rt" EXPOSE 8080 From a040c660d7d9f12e5543e10715be16f4d36da77b Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Sun, 9 Mar 2025 19:16:24 +0500 Subject: [PATCH 1197/1766] wip --- .../ntex/{ntex-default.dockerfile => ntex-default-rt.dockerfile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frameworks/Rust/ntex/{ntex-default.dockerfile => ntex-default-rt.dockerfile} (100%) diff --git a/frameworks/Rust/ntex/ntex-default.dockerfile b/frameworks/Rust/ntex/ntex-default-rt.dockerfile similarity index 100% rename from frameworks/Rust/ntex/ntex-default.dockerfile rename to frameworks/Rust/ntex/ntex-default-rt.dockerfile From 669a3995f371837a64ba978af0b753c8bd498b15 Mon Sep 17 00:00:00 2001 From: Shyam Sundar B Date: Sun, 9 Mar 2025 22:30:01 +0530 Subject: [PATCH 1198/1766] Fixed actix build error. Upgraded rust to 2024 edition --- frameworks/Rust/actix/Cargo.lock | 1909 ++++++++++------- frameworks/Rust/actix/Cargo.toml | 49 +- frameworks/Rust/actix/actix-http.dockerfile | 2 +- frameworks/Rust/actix/actix-server.dockerfile | 2 +- .../Rust/actix/actix-web-diesel.dockerfile | 2 +- .../Rust/actix/actix-web-mongodb.dockerfile | 2 +- .../actix/actix-web-pg-deadpool.dockerfile | 2 +- frameworks/Rust/actix/actix.dockerfile | 2 +- frameworks/Rust/actix/benchmark_config.json | 0 frameworks/Rust/actix/src/db.rs | 16 +- frameworks/Rust/actix/src/db_diesel.rs | 29 +- frameworks/Rust/actix/src/main_http.rs | 3 +- frameworks/Rust/actix/src/main_mongodb.rs | 13 +- frameworks/Rust/actix/src/main_pg_deadpool.rs | 8 +- 14 files changed, 1249 insertions(+), 790 deletions(-) mode change 100755 => 100644 frameworks/Rust/actix/benchmark_config.json diff --git a/frameworks/Rust/actix/Cargo.lock b/frameworks/Rust/actix/Cargo.lock index 5bce2a3656e..321ff2870fa 100644 --- a/frameworks/Rust/actix/Cargo.lock +++ b/frameworks/Rust/actix/Cargo.lock @@ -1,16 +1,17 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "actix" -version = "0.13.0" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f728064aca1c318585bf4bb04ffcfac9e75e508ab4e8b1bd9ba5dfe04e2cbed5" +checksum = "de7fa236829ba0841304542f7614c42b80fca007455315c45c785ccfa873a85b" dependencies = [ + "actix-macros", "actix-rt", "actix_derive", - "bitflags", + "bitflags 2.9.0", "bytes", "crossbeam-channel", "futures-core", @@ -23,24 +24,7 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", - "tokio-util 0.7.8", -] - -[[package]] -name = "actix-codec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36c014a3e811624313b51a227b775ecba55d36ef9462bbaac7d4f13e54c9271" -dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-sink", - "log", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util 0.6.10", + "tokio-util", ] [[package]] @@ -49,30 +33,30 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes", "futures-core", "futures-sink", "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.8", + "tokio-util", "tracing", ] [[package]] name = "actix-http" -version = "3.3.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" +checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" dependencies = [ - "actix-codec 0.5.1", + "actix-codec", "actix-rt", "actix-service", "actix-utils", - "ahash 0.8.3", - "base64 0.21.2", - "bitflags", + "ahash", + "base64 0.22.1", + "bitflags 2.9.0", "brotli", "bytes", "bytestring", @@ -84,17 +68,17 @@ dependencies = [ "http", "httparse", "httpdate", - "itoa 1.0.8", + "itoa", "language-tags", "local-channel", "mime", "percent-encoding", "pin-project-lite", - "rand", + "rand 0.8.5", "sha1", "smallvec", "tokio", - "tokio-util 0.7.8", + "tokio-util", "tracing", "zstd", ] @@ -111,22 +95,24 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ "bytestring", + "cfg-if", "http", "regex", + "regex-lite", "serde", "tracing", ] [[package]] name = "actix-rt" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" dependencies = [ "actix-macros", "futures-core", @@ -174,11 +160,11 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.3.1" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" +checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" dependencies = [ - "actix-codec 0.5.1", + "actix-codec", "actix-http", "actix-macros", "actix-router", @@ -187,7 +173,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web-codegen", - "ahash 0.7.6", + "ahash", "bytes", "bytestring", "cfg-if", @@ -196,33 +182,34 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "http", - "itoa 1.0.8", + "impl-more", + "itoa", "language-tags", "log", "mime", "once_cell", "pin-project-lite", "regex", + "regex-lite", "serde", "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.4.9", - "time 0.3.23", + "socket2 0.5.8", + "time 0.3.37", "url", ] [[package]] name = "actix-web-codegen" -version = "4.2.0" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] @@ -251,17 +238,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.3" @@ -269,7 +245,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.10", "once_cell", "version_check", ] @@ -300,9 +276,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -330,40 +306,88 @@ dependencies = [ ] [[package]] -name = "ansi_term" -version = "0.12.1" +name = "anstream" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ - "winapi", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" [[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.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87bf87e6e8b47264efa9bde63d6225c6276a52e05e91bf37eaa8afd0032d6b71" +checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" dependencies = [ - "askama_shared", + "askama_parser", + "basic-toml", + "mime", + "mime_guess", "proc-macro2", - "syn 1.0.109", + "quote", + "serde", + "syn 2.0.98", ] [[package]] @@ -373,45 +397,23 @@ 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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf722b94118a07fcbc6640190f247334027685d4e218b794dbfe17c32bf38ed0" +checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" dependencies = [ - "askama_escape", - "humansize", - "mime", - "mime_guess", "nom", - "num-traits", - "percent-encoding", - "proc-macro2", - "quote", - "serde", - "syn 1.0.109", - "toml", ] [[package]] name = "async-trait" -version = "0.1.71" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "syn 2.0.98", ] [[package]] @@ -447,27 +449,39 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "basic-toml" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" +dependencies = [ + "serde", +] + [[package]] name = "bindgen" -version = "0.59.2" +version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags", + "bitflags 2.9.0", "cexpr", "clang-sys", - "clap", - "env_logger", - "lazy_static", - "lazycell", + "itertools", "log", - "peeking_take_while", + "prettyplease 0.2.29", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "which", + "syn 2.0.98", ] [[package]] @@ -476,6 +490,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + [[package]] name = "bitvec" version = "1.0.1" @@ -499,9 +519,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.3.4" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -510,9 +530,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -520,31 +540,25 @@ dependencies = [ [[package]] name = "bson" -version = "2.6.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aeb8bae494e49dbc330dd23cf78f6f7accee22f640ce3ab17841badaa4ce232" +checksum = "068208f2b6fcfa27a7f1ee37488d2bb8ba2640f68f5475d08e1d9130696aba59" dependencies = [ - "ahash 0.7.6", + "ahash", "base64 0.13.1", "bitvec", "hex", - "indexmap 1.9.3", + "indexmap 2.7.1", "js-sys", - "lazy_static", - "rand", + "once_cell", + "rand 0.8.5", "serde", "serde_bytes", "serde_json", - "time 0.3.23", + "time 0.3.37", "uuid", ] -[[package]] -name = "buf-min" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4531c8a9fe2fb94e0d2afdf6bb4effd4797baf98dd26b6e20be71a92ac78e8d" - [[package]] name = "buf-min" version = "0.7.1" @@ -580,11 +594,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "jobserver", + "libc", + "shlex", ] [[package]] @@ -612,6 +628,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "time 0.1.45", "wasm-bindgen", "winapi", @@ -629,27 +646,38 @@ dependencies = [ ] [[package]] -name = "clap" -version = "2.34.0" +name = "cmake" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", + "cc", ] [[package]] -name = "cmake" -version = "0.1.50" +name = "colorchoice" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ - "cc", + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.10", + "once_cell", + "tiny-keccak", ] [[package]] @@ -665,7 +693,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", - "time 0.3.23", + "time 0.3.37", "version_check", ] @@ -712,6 +740,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + [[package]] name = "crypto-common" version = "0.1.6" @@ -724,9 +758,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -734,27 +768,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 1.0.109", + "strsim", + "syn 2.0.98", ] [[package]] name = "darling_macro" -version = "0.13.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] @@ -765,27 +799,27 @@ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" [[package]] name = "deadpool" -version = "0.9.5" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "421fe0f90f2ab22016f32a9881be5134fdd71c65298917084b0c7477cbc3856e" +checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f" dependencies = [ - "async-trait", "deadpool-runtime", "num_cpus", - "retain_mut", "tokio", ] [[package]] name = "deadpool-postgres" -version = "0.10.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a24a9d49deefe610b8b60c767a7412e9a931d79a89415cd2d2d71630ca8d7" +checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" dependencies = [ + "async-trait", "deadpool", - "log", + "getrandom 0.2.10", "tokio", "tokio-postgres", + "tracing", ] [[package]] @@ -798,14 +832,35 @@ dependencies = [ ] [[package]] -name = "derivative" -version = "2.2.0" +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive-syn-parse" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", +] + +[[package]] +name = "derive-where" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -817,31 +872,43 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version", "syn 1.0.109", ] [[package]] name = "diesel" -version = "1.4.8" +version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b28135ecf6b7d446b43e27e225622a038cc4e2930a1022f51cdb97ada19b8e4d" +checksum = "04001f23ba8843dc315804fa324000376084dfb1c30794ff68dd279e6e5696d5" dependencies = [ - "bitflags", + "bitflags 2.9.0", "byteorder", "diesel_derives", + "itoa", "pq-sys", ] [[package]] name = "diesel_derives" -version = "1.4.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" +checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" dependencies = [ + "diesel_table_macro_syntax", + "dsl_auto_type", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" +dependencies = [ + "syn 2.0.98", ] [[package]] @@ -855,6 +922,31 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "dsl_auto_type" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ae9aca7527f85f26dd76483eb38533fd84bd571065da1739656ef71c5ff5b" +dependencies = [ + "darling", + "either", + "heck", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "dtoa" version = "1.0.8" @@ -878,27 +970,37 @@ dependencies = [ [[package]] name = "enum-as-inner" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", ] [[package]] name = "env_logger" -version = "0.9.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ - "atty", + "anstream", + "anstyle", + "env_filter", "humantime", "log", - "regex", - "termcolor", ] [[package]] @@ -925,9 +1027,9 @@ dependencies = [ [[package]] name = "float-cmp" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" dependencies = [ "num-traits", ] @@ -940,9 +1042,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -955,9 +1057,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -970,9 +1072,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -980,15 +1082,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -997,38 +1099,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.98", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1065,6 +1167,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gimli" version = "0.27.3" @@ -1089,23 +1203,13 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.0.0", + "indexmap 2.7.1", "slab", "tokio", - "tokio-util 0.7.8", + "tokio-util", "tracing", ] -[[package]] -name = "halfbrown" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e2a3c70a9c00cc1ee87b54e89f9505f73bb17d63f1b25c9a462ba8ef885444f" -dependencies = [ - "hashbrown 0.13.2", - "serde", -] - [[package]] name = "halfbrown" version = "0.2.5" @@ -1122,39 +1226,27 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] - [[package]] name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ - "ahash 0.8.3", + "ahash", "allocator-api2", ] [[package]] -name = "heck" -version = "0.4.1" +name = "hashbrown" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -1169,21 +1261,66 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "hmac" -version = "0.12.1" +name = "hickory-proto" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" dependencies = [ - "digest", + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", ] [[package]] -name = "hostname" -version = "0.3.1" +name = "hickory-resolver" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" dependencies = [ - "libc", + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", "match_cfg", "winapi", ] @@ -1196,7 +1333,7 @@ checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", - "itoa 1.0.8", + "itoa", ] [[package]] @@ -1213,9 +1350,12 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[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" @@ -1247,187 +1387,246 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "idna" -version = "0.4.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "indexmap" -version = "1.9.3" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "autocfg", - "hashbrown 0.12.3", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "indexmap" -version = "2.0.0" +name = "icu_locid_transform_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" [[package]] -name = "ipconfig" -version = "0.3.2" +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ - "socket2 0.5.3", - "widestring", - "windows-sys", - "winreg", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", ] [[package]] -name = "ipnet" -version = "2.8.0" +name = "icu_normalizer_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] -name = "itoa" -version = "0.4.8" +name = "icu_properties" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] [[package]] -name = "itoa" -version = "1.0.8" +name = "icu_properties_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] -name = "jobserver" -version = "0.1.26" +name = "icu_provider" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ - "libc", + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "js-sys" -version = "0.3.64" +name = "icu_provider_macros" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ - "wasm-bindgen", + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] -name = "language-tags" -version = "0.3.2" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "lazy_static" -version = "1.4.0" +name = "idna" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] [[package]] -name = "lazycell" -version = "1.3.0" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] [[package]] -name = "lexical-core" -version = "0.8.5" +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + +[[package]] +name = "indexmap" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", + "autocfg", + "hashbrown 0.12.3", + "serde", ] [[package]] -name = "lexical-parse-float" -version = "0.8.5" +name = "indexmap" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ - "lexical-parse-integer", - "lexical-util", - "static_assertions", + "equivalent", + "hashbrown 0.15.2", + "serde", ] [[package]] -name = "lexical-parse-integer" -version = "0.8.6" +name = "ipconfig" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "lexical-util", - "static_assertions", + "socket2 0.5.8", + "widestring", + "windows-sys 0.48.0", + "winreg", ] [[package]] -name = "lexical-util" -version = "0.8.5" +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "static_assertions", + "either", ] [[package]] -name = "lexical-write-float" -version = "0.8.5" +name = "itoa" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "lexical-util", - "lexical-write-integer", - "static_assertions", + "libc", ] [[package]] -name = "lexical-write-integer" -version = "0.8.5" +name = "js-sys" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ - "lexical-util", - "static_assertions", + "wasm-bindgen", ] +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + [[package]] name = "libc" -version = "0.2.147" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libloading" @@ -1439,12 +1638,24 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + [[package]] name = "linked-hash-map" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + [[package]] name = "local-channel" version = "0.1.3" @@ -1475,9 +1686,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "lru-cache" @@ -1489,16 +1700,58 @@ dependencies = [ ] [[package]] -name = "match_cfg" -version = "0.1.0" +name = "macro_magic" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.98", +] [[package]] -name = "matches" -version = "0.1.10" +name = "macro_magic_core" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" +dependencies = [ + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "md-5" @@ -1555,33 +1808,37 @@ dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "mongodb" -version = "2.6.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd85ec209a5b84fd9f54b9e381f6fa17462bc74160d018fc94fd8b9f61faa8" +checksum = "9a93560fa3ec754ed9aa0954ae8307c5997150dbba7aa735173b514660088475" dependencies = [ "async-trait", "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "bson", "chrono", - "derivative", + "derive-where", "derive_more", "futures-core", "futures-executor", "futures-io", "futures-util", "hex", + "hickory-proto", + "hickory-resolver", "hmac", - "lazy_static", + "macro_magic", "md-5", + "mongodb-internal-macros", + "once_cell", "pbkdf2", "percent-encoding", - "rand", + "rand 0.8.5", "rustc_version_runtime", "rustls", "rustls-pemfile", @@ -1590,21 +1847,31 @@ dependencies = [ "serde_with", "sha-1", "sha2", - "socket2 0.4.9", + "socket2 0.5.8", "stringprep", - "strsim 0.10.0", + "strsim", "take_mut", "thiserror", "tokio", "tokio-rustls", - "tokio-util 0.7.8", - "trust-dns-proto", - "trust-dns-resolver", + "tokio-util", "typed-builder", "uuid", "webpki-roots", ] +[[package]] +name = "mongodb-internal-macros" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b3dace6c4f33db61d492b3d3b02f4358687a1eb59457ffef6f6cfe461cdb54" +dependencies = [ + "macro_magic", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "nom" version = "7.1.3" @@ -1615,6 +1882,12 @@ 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.15" @@ -1630,7 +1903,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi", "libc", ] @@ -1645,9 +1918,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "parking_lot" @@ -1667,9 +1940,9 @@ checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.3.5", "smallvec", - "windows-targets", + "windows-targets 0.48.1", ] [[package]] @@ -1687,17 +1960,11 @@ dependencies = [ "digest", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" @@ -1719,9 +1986,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1731,39 +1998,45 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "postgres-protocol" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b7fa9f396f51dffd61546fd8573ee20592287996568e6175ceb0f8699ad75d" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "byteorder", "bytes", "fallible-iterator", "hmac", "md-5", "memchr", - "rand", + "rand 0.9.0", "sha2", "stringprep", ] [[package]] name = "postgres-types" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f028f05971fe20f512bcc679e2c10227e57809a3af86a7606304435bc8896cd6" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" 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" @@ -1789,11 +2062,21 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prettyplease" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +dependencies = [ + "proc-macro2", + "syn 2.0.98", +] + [[package]] name = "proc-macro2" -version = "1.0.64" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -1806,9 +2089,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.29" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1826,8 +2109,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy", ] [[package]] @@ -1837,7 +2131,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1846,7 +2150,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.10", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", ] [[package]] @@ -1855,7 +2168,36 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -1881,6 +2223,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + [[package]] name = "regex-syntax" version = "0.7.4" @@ -1897,12 +2245,6 @@ 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" @@ -1913,11 +2255,25 @@ dependencies = [ "libc", "once_cell", "spin", - "untrusted", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.10", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1926,18 +2282,9 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.2.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" @@ -1945,29 +2292,29 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.17", + "semver", ] [[package]] name = "rustc_version_runtime" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d31b7153270ebf48bf91c65ae5b0c00e749c4cfad505f66530ac74950249582f" +checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" dependencies = [ - "rustc_version 0.2.3", - "semver 0.9.0", + "rustc_version", + "semver", ] [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring", + "ring 0.17.11", + "rustls-webpki", "sct", - "webpki", ] [[package]] @@ -1979,6 +2326,16 @@ dependencies = [ "base64 0.21.2", ] +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.11", + "untrusted 0.9.0", +] + [[package]] name = "ryu" version = "1.0.14" @@ -1997,17 +2354,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -2016,17 +2364,11 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" -version = "1.0.171" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] @@ -2042,13 +2384,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.171" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.98", ] [[package]] @@ -2057,8 +2399,8 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" dependencies = [ - "indexmap 2.0.0", - "itoa 1.0.8", + "indexmap 2.7.1", + "itoa", "ryu", "serde", ] @@ -2070,31 +2412,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.8", + "itoa", "ryu", "serde", ] [[package]] name = "serde_with" -version = "1.14.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.1", "serde", + "serde_derive", + "serde_json", "serde_with_macros", + "time 0.3.37", ] [[package]] name = "serde_with_macros" -version = "1.5.2" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] @@ -2147,56 +2497,45 @@ dependencies = [ [[package]] name = "simd-json" -version = "0.4.15" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3aaa7729b636ed4843efa96722f0d5823825b4f388d74c83757a3227f64d4" +checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" dependencies = [ - "halfbrown 0.1.18", + "getrandom 0.2.10", + "halfbrown", + "ref-cast", "serde", "serde_json", "simdutf8", - "value-trait 0.2.12", -] - -[[package]] -name = "simd-json" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f07a84c7456b901b8dd2c1d44caca8b0fd2c2616206ee5acc9d9da61e8d9ec" -dependencies = [ - "getrandom", - "halfbrown 0.2.5", - "lexical-core", - "serde", - "serde_json", - "simdutf8", - "value-trait 0.6.1", + "value-trait", ] [[package]] name = "simd-json-derive" -version = "0.12.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601202a467f1d17a37b20d6d4d7bd679764ac3e9e9fc0f7a24524ba35bd55552" +checksum = "dde9e4ab4322320af4f9709170ca77dec74ef4e44db7c0600cf6f3d601b74cee" dependencies = [ "chrono", - "itoa 1.0.8", + "itoa", "ryu", - "simd-json 0.12.0", + "simd-json", "simd-json-derive-int", - "value-trait 0.6.1", + "thiserror", + "value-trait", ] [[package]] name = "simd-json-derive-int" -version = "0.12.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4826470c4520fac1e3b57c413a6e83a198bac992e3222d1c290f7909881d3df1" +checksum = "cebcbb57e77f41aee1cef06b800c6c79288b133054a478135a9a0e8e79c938dd" dependencies = [ "proc-macro2", "quote", - "simd-json 0.12.0", - "syn 2.0.25", + "simd-json", + "syn 2.0.98", + "thiserror", ] [[package]] @@ -2222,24 +2561,24 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "snmalloc-rs" -version = "0.2.28" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36acaace2719c972eab3ef6a6b3aee4495f0bf300f59715bb9cff6c5acf4ae20" +checksum = "eb317153089fdfa4d8a2eec059d40a5a23c3bde43995ea23b19121c3f621e74a" dependencies = [ "snmalloc-sys", ] [[package]] name = "snmalloc-sys" -version = "0.2.28" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a7e6e7d5fe756bee058ddedefc7e0a9f9c8dbaa9401b48ed3c17d6578e40b5" +checksum = "065fea53d32bb77bc36cca466cb191f2e5216ebfd0ed360b1d64889ee6e559ea" dependencies = [ "cmake", ] @@ -2256,12 +2595,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2271,10 +2610,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] -name = "static_assertions" -version = "1.1.0" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stringprep" @@ -2288,15 +2627,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -2317,15 +2650,26 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.25" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "take_mut" version = "0.2.2" @@ -2338,30 +2682,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "tfb-actix" -version = "3.0.0" +version = "4.0.0" dependencies = [ "actix", - "actix-codec 0.4.2", + "actix-codec", "actix-http", "actix-rt", "actix-server", @@ -2375,42 +2701,41 @@ dependencies = [ "diesel", "env_logger", "futures", - "http", "log", "mongodb", "num_cpus", - "rand", + "rand 0.9.0", "serde", "serde_json", - "simd-json 0.4.15", + "simd-json", "simd-json-derive", "snmalloc-rs", "tokio", "tokio-postgres", - "tokio-util 0.7.8", + "tokio-util", "url", - "v_htmlescape 0.14.1", + "v_htmlescape", "yarte", ] [[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.98", ] [[package]] @@ -2426,29 +2751,52 @@ dependencies = [ [[package]] name = "time" -version = "0.3.23" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "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.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ - "itoa 1.0.8", - "serde", + "num-conv", "time-core", - "time-macros", ] [[package]] -name = "time-core" -version = "0.1.1" +name = "tiny-keccak" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] [[package]] -name = "time-macros" -version = "0.2.10" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "time-core", + "displaydoc", + "zerovec", ] [[package]] @@ -2483,7 +2831,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.4.9", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2494,14 +2842,14 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.98", ] [[package]] name = "tokio-postgres" -version = "0.7.8" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e89f6234aa8fd43779746012fcf53603cdb91fdd8399aa0de868c2d56b6dde1" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" dependencies = [ "async-trait", "byteorder", @@ -2516,41 +2864,28 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "socket2 0.5.3", + "rand 0.9.0", + "socket2 0.5.8", "tokio", - "tokio-util 0.7.8", + "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-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", ] [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -2558,7 +2893,6 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -2579,61 +2913,28 @@ dependencies = [ "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] [[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trust-dns-proto" -version = "0.21.2" +name = "tracing-attributes" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "log", - "rand", - "smallvec", - "thiserror", - "tinyvec", - "tokio", - "url", + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] -name = "trust-dns-resolver" -version = "0.21.2" +name = "tracing-core" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "parking_lot", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "trust-dns-proto", + "once_cell", ] [[package]] @@ -2701,44 +3002,49 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" -version = "2.4.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.4.0", + "idna", "percent-encoding", ] [[package]] -name = "uuid" -version = "1.4.0" +name = "utf16_iter" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" -dependencies = [ - "getrandom", - "serde", -] +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" [[package]] -name = "v_escape" -version = "0.18.0" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79d297315e8ca0b98255614f409699ea189e5929e820f07f69afcebf96c41f9b" -dependencies = [ - "buf-min 0.6.1", - "v_escape_derive", -] +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "v_escape_derive" -version = "0.9.1" +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe81cf194472e6ddd6545f8e91ee9780de636194c2e896b8ac201ac78389809" +checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" dependencies = [ - "syn 1.0.109", + "getrandom 0.2.10", + "serde", ] [[package]] @@ -2751,46 +3057,24 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "v_htmlescape" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b32732bcd549ad15fcb01ee63ad03dd6a0289e9ba72b8164707d1f9fa80478" -dependencies = [ - "cfg-if", - "v_escape", -] - [[package]] name = "v_htmlescape" version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" dependencies = [ - "buf-min 0.7.1", -] - -[[package]] -name = "value-trait" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe40a74a6f052b10668ef021c8c3ae56ab38269f9c0f401daa6ed36f96662fd" -dependencies = [ - "float-cmp", - "halfbrown 0.1.18", - "itoa 0.4.8", - "ryu", + "buf-min", ] [[package]] name = "value-trait" -version = "0.6.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a5b6c8ceb01263b969cac48d4a6705134d490ded13d889e52c0cfc80c6945e" +checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" dependencies = [ "float-cmp", - "halfbrown 0.2.5", - "itoa 1.0.8", + "halfbrown", + "itoa", "ryu", ] @@ -2800,12 +3084,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.4" @@ -2824,6 +3102,21 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.87" @@ -2845,7 +3138,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -2867,7 +3160,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2888,34 +3181,21 @@ dependencies = [ "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.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] -name = "which" -version = "4.4.0" +name = "whoami" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "either", - "libc", - "once_cell", + "redox_syscall 0.5.9", + "wasite", + "web-sys", ] [[package]] @@ -2940,15 +3220,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" @@ -2961,7 +3232,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets", + "windows-targets 0.48.1", ] [[package]] @@ -2970,7 +3241,25 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.1", +] + +[[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.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -2979,13 +3268,29 @@ version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" 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.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -2994,42 +3299,90 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winreg" version = "0.50.0" @@ -3037,9 +3390,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.9.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -3064,7 +3438,7 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfce1df93f3b16e5272221a559e60bbbaaa71dbc042a43996d223e51a690aab2" dependencies = [ - "buf-min 0.7.1", + "buf-min", "yarte_derive", "yarte_helpers", ] @@ -3103,15 +3477,15 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" dependencies = [ - "buf-min 0.7.1", + "buf-min", "dtoa", - "itoa 1.0.8", - "prettyplease", + "itoa", + "prettyplease 0.1.25", "ryu", "serde", "syn 1.0.109", "toml", - "v_htmlescape 0.15.8", + "v_htmlescape", ] [[package]] @@ -3125,7 +3499,7 @@ dependencies = [ "quote", "syn 1.0.109", "v_eval", - "v_htmlescape 0.15.8", + "v_htmlescape", "yarte_helpers", "yarte_parser", ] @@ -3146,32 +3520,117 @@ dependencies = [ "yarte_helpers", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "zstd" -version = "0.12.3+zstd.1.5.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.5+zstd.1.5.4" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" dependencies = [ - "libc", "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.14+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/frameworks/Rust/actix/Cargo.toml b/frameworks/Rust/actix/Cargo.toml index 9544e873c89..b4862239793 100644 --- a/frameworks/Rust/actix/Cargo.toml +++ b/frameworks/Rust/actix/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "tfb-actix" -version = "3.0.0" -edition = "2018" +version = "4.0.0" +edition = "2024" [[bin]] name = "tfb-web" @@ -28,41 +28,40 @@ name = "tfb-web-pg-deadpool" path = "src/main_pg_deadpool.rs" [dependencies] -anyhow = "1" -actix = "0.13" -actix-web = "4.3.1" -actix-http = "3.3.1" -actix-rt = "2" -actix-codec = "0.4" +anyhow = "1.0.96" +actix = "0.13.5" +actix-web = "4.9.0" +actix-http = "3.9.0" +actix-rt = "2.10.0" +actix-codec = "0.5" actix-server = "2" actix-service = "2" -askama = "0.11" +askama = "0.12" bytes = "1" -diesel = { version = "1.4", features = ["postgres"] } -env_logger = "0.9" -futures = "0.3.7" -http = "0.2" +diesel = { version = "2.2.7", features = ["postgres"] } +env_logger = "0.11" +futures = "0.3.31" log = { version = "0.4", features = ["release_max_level_debug"] } num_cpus = "1.13" -rand = { version = "0.8", features = ["small_rng"] } +rand = { version = "0.9", features = ["small_rng"] } serde = { version = "1", features = ["derive"] } serde_json = "1" -simd-json = "0.4" -simd-json-derive = "0.12" -snmalloc-rs = "0.2.6" +simd-json = "0.14" +simd-json-derive = "0.15" +snmalloc-rs = "0.3.8" tokio = { version = "1", features = ["full"] } -tokio-util = "0.7.8" -tokio-postgres = "0.7.5" -deadpool-postgres = "0.10.1" -mongodb = "2.2.0" -url = "2.1" -v_htmlescape = "0.14" +tokio-util = "0.7.13" +tokio-postgres = "0.7.13" +deadpool-postgres = "0.14.1" +mongodb = "3.2.1" +url = "2.5" +v_htmlescape = "0.15" yarte = { version = "0.15", features = ["bytes-buf"] } [build-dependencies] -askama = "0.11" -bindgen = "0.59" +askama = "0.12" +bindgen = "0.71" [profile.release] lto = true diff --git a/frameworks/Rust/actix/actix-http.dockerfile b/frameworks/Rust/actix/actix-http.dockerfile index 1e2723b175d..e22a047c11a 100644 --- a/frameworks/Rust/actix/actix-http.dockerfile +++ b/frameworks/Rust/actix/actix-http.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.58 +FROM rust:1.85 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/actix/actix-server.dockerfile b/frameworks/Rust/actix/actix-server.dockerfile index ae54cdea548..6c4adac18e7 100644 --- a/frameworks/Rust/actix/actix-server.dockerfile +++ b/frameworks/Rust/actix/actix-server.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.58 +FROM rust:1.85 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/actix/actix-web-diesel.dockerfile b/frameworks/Rust/actix/actix-web-diesel.dockerfile index 43fc2424510..145ccb2fe5d 100644 --- a/frameworks/Rust/actix/actix-web-diesel.dockerfile +++ b/frameworks/Rust/actix/actix-web-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.58 +FROM rust:1.85 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/actix/actix-web-mongodb.dockerfile b/frameworks/Rust/actix/actix-web-mongodb.dockerfile index f89e9552660..beb5f47fcd3 100644 --- a/frameworks/Rust/actix/actix-web-mongodb.dockerfile +++ b/frameworks/Rust/actix/actix-web-mongodb.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.57.0 +FROM rust:1.85 ENV ACTIX_TECHEMPOWER_MONGODB_URL=mongodb://tfb-database:27017 diff --git a/frameworks/Rust/actix/actix-web-pg-deadpool.dockerfile b/frameworks/Rust/actix/actix-web-pg-deadpool.dockerfile index 0ce0a4dbaac..e3674b64588 100644 --- a/frameworks/Rust/actix/actix-web-pg-deadpool.dockerfile +++ b/frameworks/Rust/actix/actix-web-pg-deadpool.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.57.0 +FROM rust:1.85 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/actix/actix.dockerfile b/frameworks/Rust/actix/actix.dockerfile index 75e192e25f8..abe34444ab8 100644 --- a/frameworks/Rust/actix/actix.dockerfile +++ b/frameworks/Rust/actix/actix.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.58 +FROM rust:1.85.0 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/actix/benchmark_config.json b/frameworks/Rust/actix/benchmark_config.json old mode 100755 new mode 100644 diff --git a/frameworks/Rust/actix/src/db.rs b/frameworks/Rust/actix/src/db.rs index b1a2f0673dd..1630a68a567 100644 --- a/frameworks/Rust/actix/src/db.rs +++ b/frameworks/Rust/actix/src/db.rs @@ -6,7 +6,7 @@ use bytes::{Bytes, BytesMut}; use futures::{ stream::futures_unordered::FuturesUnordered, FutureExt, StreamExt, TryStreamExt, }; -use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; +use rand::{rngs::SmallRng, Rng, SeedableRng}; use tokio_postgres::{connect, types::ToSql, Client, NoTls, Statement}; use crate::{ @@ -101,9 +101,9 @@ impl PgConnection { } pub async fn get_world(&self) -> Result { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rand::rng()); - let random_id = (rng.gen::() % 10_000 + 1) as i32; + let random_id = (rng.random::() % 10_000 + 1) as i32; let world = self.query_one_world(random_id).await?; let mut body = BytesMut::with_capacity(40); @@ -113,12 +113,12 @@ impl PgConnection { } pub async fn get_worlds(&self, num: usize) -> Result, PgError> { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rand::rng()); let worlds = FuturesUnordered::new(); for _ in 0..num { - let w_id = (rng.gen::() % 10_000 + 1) as i32; + let w_id = (rng.random::() % 10_000 + 1) as i32; worlds.push(self.query_one_world(w_id)); } @@ -126,13 +126,13 @@ impl PgConnection { } pub async fn update(&self, num: u16) -> Result, PgError> { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rand::rng()); let worlds = FuturesUnordered::new(); for _ in 0..num { - let id = (rng.gen::() % 10_000 + 1) as i32; - let w_id = (rng.gen::() % 10_000 + 1) as i32; + let id = (rng.random::() % 10_000 + 1) as i32; + let w_id = (rng.random::() % 10_000 + 1) as i32; worlds.push(self.query_one_world(w_id).map(move |res| match res { Ok(mut world) => { diff --git a/frameworks/Rust/actix/src/db_diesel.rs b/frameworks/Rust/actix/src/db_diesel.rs index 9d38d0b96c6..7675e3d4b52 100644 --- a/frameworks/Rust/actix/src/db_diesel.rs +++ b/frameworks/Rust/actix/src/db_diesel.rs @@ -3,7 +3,7 @@ use std::io; use actix::prelude::*; -use diesel::{prelude::*, result::Error}; +use diesel::prelude::*; use rand::{rngs::SmallRng, Rng, SeedableRng}; use crate::models; @@ -18,7 +18,7 @@ impl DbExecutor { DbExecutor { conn: PgConnection::establish(db_url) .unwrap_or_else(|_| panic!("Error connecting to {}", db_url)), - rng: SmallRng::from_entropy(), + rng: SmallRng::from_os_rng(), } } } @@ -39,10 +39,10 @@ impl Handler for DbExecutor { fn handle(&mut self, _: RandomWorld, _: &mut Self::Context) -> Self::Result { use crate::schema::world::dsl::*; - let random_id = self.rng.gen_range(1..10_001); + let random_id = self.rng.random_range(1..10_001); match world .filter(id.eq(random_id)) - .load::(&self.conn) + .load::(&mut self.conn) { Ok(mut items) => Ok(items.pop().unwrap()), Err(_) => Err(io::Error::new(io::ErrorKind::Other, "Database error")), @@ -64,8 +64,8 @@ impl Handler for DbExecutor { let mut worlds = Vec::with_capacity(msg.0 as usize); for _ in 0..msg.0 { - let w_id = self.rng.gen_range(1..10_001); - let w = match world.filter(id.eq(w_id)).load::(&self.conn) { + let w_id = self.rng.random_range(1..10_001); + let w = match world.filter(id.eq(w_id)).load::(&mut self.conn) { Ok(mut items) => items.pop().unwrap(), Err(_) => { return Err(io::Error::new(io::ErrorKind::Other, "Database error")); @@ -91,27 +91,28 @@ impl Handler for DbExecutor { let mut worlds = Vec::with_capacity(msg.0 as usize); for _ in 0..msg.0 { - let w_id: i32 = self.rng.gen_range(1..10_001); - let mut w = match world.filter(id.eq(w_id)).load::(&self.conn) { + let w_id: i32 = self.rng.random_range(1..10_001); + let mut w = match world.filter(id.eq(w_id)).load::(&mut self.conn) { Ok(mut items) => items.pop().unwrap(), Err(_) => { return Err(io::Error::new(io::ErrorKind::Other, "Database error")); } }; - w.randomnumber = self.rng.gen_range(1..10_001); + w.randomnumber = self.rng.random_range(1..10_001); worlds.push(w); } worlds.sort_by_key(|w| w.id); - let _ = self.conn.transaction::<(), Error, _>(|| { + self.conn.transaction(|conn| { for w in &worlds { - let _ = diesel::update(world) + diesel::update(world) .filter(id.eq(w.id)) .set(randomnumber.eq(w.randomnumber)) - .execute(&self.conn); + .execute(conn)?; } Ok(()) - }); + }) + .map_err(|e: diesel::result::Error| io::Error::new(io::ErrorKind::Other, e))?; Ok(worlds) } @@ -129,7 +130,7 @@ impl Handler for DbExecutor { fn handle(&mut self, _: TellFortune, _: &mut Self::Context) -> Self::Result { use crate::schema::fortune::dsl::*; - match fortune.load::(&self.conn) { + match fortune.load::(&mut self.conn) { Ok(mut items) => { items.push(models::Fortune { id: 0, diff --git a/frameworks/Rust/actix/src/main_http.rs b/frameworks/Rust/actix/src/main_http.rs index a8ab73c1f55..a1e76742320 100644 --- a/frameworks/Rust/actix/src/main_http.rs +++ b/frameworks/Rust/actix/src/main_http.rs @@ -23,6 +23,7 @@ use crate::{ utils::Writer, }; +#[allow(dead_code)] #[derive(Debug)] enum Error { Pg(PgError), @@ -134,7 +135,7 @@ impl Service for App { } _ => Box::pin(ok(Response::with_body( - http::StatusCode::NOT_FOUND, + StatusCode::NOT_FOUND, Bytes::new(), ))), } diff --git a/frameworks/Rust/actix/src/main_mongodb.rs b/frameworks/Rust/actix/src/main_mongodb.rs index 251060fe2e1..ae26914f2d4 100644 --- a/frameworks/Rust/actix/src/main_mongodb.rs +++ b/frameworks/Rust/actix/src/main_mongodb.rs @@ -28,12 +28,12 @@ async fn find_random_world(data: web::Data) -> Result { let runtime = data.tokio_runtime.clone(); runtime .spawn(async move { - let mut rng = SmallRng::from_entropy(); - let id = (rng.gen::() % 10_000 + 1) as i32; + let mut rng = SmallRng::from_os_rng(); + let id = (rng.random::() % 10_000 + 1) as i32; let coll = data.client.database("hello_world").collection("world"); let world = coll - .find_one(doc! { "id": id as f32 }, None) + .find_one(doc! { "id": id as f32 }) .await? .expect("should find world"); Ok(world) @@ -101,10 +101,10 @@ async fn updates( let mut worlds = find_random_worlds(data, query.q).await?; - let mut rng = SmallRng::from_entropy(); + let mut rng = SmallRng::from_os_rng(); let mut updates = Vec::new(); for world in worlds.iter_mut() { - let new_random_number = (rng.gen::() % 10_000 + 1) as i32; + let new_random_number = (rng.random::() % 10_000 + 1) as i32; updates.push(doc! { "q": { "id": world.id }, "u": { "$set": { "randomNumber": new_random_number }} }); @@ -121,7 +121,6 @@ async fn updates( "updates": updates, "ordered": false, }, - None, ) .await }) @@ -145,7 +144,7 @@ async fn fortune(data: web::Data) -> Result>> { let fortunes_cursor = client .database("hello_world") .collection::("fortune") - .find(None, None) + .find(doc! {}) .await?; let mut fortunes: Vec = fortunes_cursor.try_collect().await?; diff --git a/frameworks/Rust/actix/src/main_pg_deadpool.rs b/frameworks/Rust/actix/src/main_pg_deadpool.rs index b24d5753d20..da0ff484eef 100644 --- a/frameworks/Rust/actix/src/main_pg_deadpool.rs +++ b/frameworks/Rust/actix/src/main_pg_deadpool.rs @@ -27,8 +27,8 @@ async fn find_random_world(pool: &Pool) -> Result { .await .unwrap(); - let mut rng = SmallRng::from_entropy(); - let id = (rng.gen::() % 10_000 + 1) as i32; + let mut rng = SmallRng::from_os_rng(); + let id = (rng.random::() % 10_000 + 1) as i32; let row = conn.query_one(&world, &[&id]).await?; @@ -95,14 +95,14 @@ async fn updates( ) -> Result>> { let mut worlds = find_random_worlds(&data, query.q).await?; - let mut rng = SmallRng::from_entropy(); + let mut rng = SmallRng::from_os_rng(); let mut updates = "UPDATE world SET randomnumber = CASE id ".to_string(); let mut params: Vec<&(dyn ToSql + Sync)> = Vec::with_capacity(query.q as usize * 3); let mut n_params = 1; for world in worlds.iter_mut() { - let new_random_number = (rng.gen::() % 10_000 + 1) as i32; + let new_random_number = (rng.random::() % 10_000 + 1) as i32; write!(&mut updates, "when ${} then ${} ", n_params, n_params + 1).unwrap(); world.randomnumber = new_random_number; n_params += 2; From 0c1013ecdf0fd2f4c009e8a262795b04458b2352 Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 9 Mar 2025 18:16:44 +0100 Subject: [PATCH 1199/1766] [ruby/rack] Update dependencies to latest --- frameworks/Ruby/rack-sequel/Gemfile | 4 +- frameworks/Ruby/rack-sequel/Gemfile.lock | 16 ++-- frameworks/Ruby/rack/Gemfile | 2 +- frameworks/Ruby/rack/Gemfile.lock | 105 ++++++++++++----------- frameworks/Ruby/rack/README.md | 4 +- 5 files changed, 67 insertions(+), 64 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 11db7de0ce2..5389d9134d6 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -5,12 +5,10 @@ gem 'sequel', '~> 5.0' gem 'rack', '~> 3.0' group :mysql, optional: true do - gem 'jdbc-mysql', '~> 5.1', platforms: :jruby, require: 'jdbc/mysql' gem 'mysql2', '~> 0.4', platforms: [:ruby, :mswin] end group :postgresql, optional: true do - gem 'jdbc-postgres', '~> 9.4', platforms: :jruby, require: 'jdbc/postgres' gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false end @@ -21,7 +19,7 @@ group :passenger, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.4', require: false + gem 'puma', '~> 6.5', require: false end group :unicorn, optional: true do diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 3d02b26b0ab..0913e9cca6d 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -2,8 +2,8 @@ GEM remote: https://rubygems.org/ specs: base64 (0.2.0) - bigdecimal (3.1.8) - json (2.9.1) + bigdecimal (3.1.9) + json (2.10.1) kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) @@ -11,15 +11,15 @@ GEM rack (>= 1.6.13) rackup (>= 2.0.0) rake (>= 12.3.3) - pg (1.5.8) - puma (6.5.0) + pg (1.5.9) + puma (6.6.0) nio4r (~> 2.0) - rack (3.1.8) + rack (3.1.11) rackup (2.2.1) rack (>= 3) raindrops (0.20.1) rake (13.2.1) - sequel (5.85.0) + sequel (5.90.0) bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) @@ -34,13 +34,11 @@ PLATFORMS DEPENDENCIES base64 - jdbc-mysql (~> 5.1) - jdbc-postgres (~> 9.4) json (~> 2.8) mysql2 (~> 0.4) passenger (~> 6.0) pg (~> 1.5) - puma (~> 6.4) + puma (~> 6.5) rack (~> 3.0) sequel (~> 5.0) sequel_pg (~> 1.6) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index 83ef0486ea3..67c29718242 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -20,7 +20,7 @@ group :iodine, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.4' + gem 'puma', '~> 6.5' end group :unicorn, optional: true do diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index e15a39ea4cf..ad4ae67371c 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -2,47 +2,53 @@ GEM remote: https://rubygems.org/ specs: ast (2.4.2) - async (2.20.0) + async (2.23.0) console (~> 1.29) fiber-annotation - io-event (~> 1.6, >= 1.6.5) - async-container (0.18.3) - async (~> 2.10) - async-http (0.83.1) + io-event (~> 1.9) + metrics (~> 0.12) + traces (~> 0.15) + async-container (0.24.0) + async (~> 2.22) + async-container-supervisor (0.5.1) + async-container (~> 0.22) + async-service + io-endpoint + memory-leak (~> 0.5) + async-http (0.87.0) async (>= 2.10.2) async-pool (~> 0.9) io-endpoint (~> 0.14) io-stream (~> 0.6) metrics (~> 0.12) - protocol-http (~> 0.43) - protocol-http1 (>= 0.28.1) - protocol-http2 (~> 0.19) + protocol-http (~> 0.49) + protocol-http1 (~> 0.30) + protocol-http2 (~> 0.22) traces (~> 0.10) - async-http-cache (0.4.4) + async-http-cache (0.4.5) async-http (~> 0.56) - async-pool (0.10.1) + async-pool (0.10.3) async (>= 1.25) - traces - async-service (0.12.0) + async-service (0.13.0) async async-container (~> 0.16) - bigdecimal (3.1.8) - concurrent-ruby (1.3.4) - connection_pool (2.4.1) - console (1.29.0) + bigdecimal (3.1.9) + concurrent-ruby (1.3.5) + connection_pool (2.5.0) + console (1.30.0) fiber-annotation fiber-local (~> 1.1) json - falcon (0.48.3) + falcon (0.51.1) async - async-container (~> 0.18) + async-container (~> 0.20) + async-container-supervisor (~> 0.5.0) async-http (~> 0.75) async-http-cache (~> 0.4) async-service (~> 0.10) bundler localhost (~> 1.1) openssl (~> 3.0) - process-metrics (~> 0.2) protocol-http (~> 0.31) protocol-rack (~> 0.7) samovar (~> 2.3) @@ -50,73 +56,74 @@ GEM fiber-local (1.1.0) fiber-storage fiber-storage (1.0.0) - io-endpoint (0.14.0) - io-event (1.7.3) + io-endpoint (0.15.2) + io-event (1.9.0) io-stream (0.6.1) iodine (0.7.58) - json (2.9.1) + json (2.10.1) kgio (2.11.4) - language_server-protocol (3.17.0.3) + language_server-protocol (3.17.0.4) + lint_roller (1.1.0) localhost (1.3.1) mapping (1.1.1) - metrics (0.12.1) + memory-leak (0.5.2) + metrics (0.12.2) nio4r (2.7.4) - openssl (3.2.0) + openssl (3.3.0) parallel (1.26.3) - parser (3.3.6.0) + parser (3.3.7.1) ast (~> 2.4.1) racc pg (1.5.9) - process-metrics (0.3.0) - console (~> 1.8) - json (~> 2) - samovar (~> 2.1) protocol-hpack (1.5.1) - protocol-http (0.43.0) - protocol-http1 (0.28.1) + protocol-http (0.49.0) + protocol-http1 (0.30.0) protocol-http (~> 0.22) - protocol-http2 (0.20.0) + protocol-http2 (0.22.1) protocol-hpack (~> 1.4) - protocol-http (~> 0.18) - protocol-rack (0.11.0) + protocol-http (~> 0.47) + protocol-rack (0.11.2) protocol-http (~> 0.43) rack (>= 1.0) - puma (6.5.0) + puma (6.6.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.8) - rack-test (2.1.0) + rack (3.1.11) + rack-test (2.2.0) rack (>= 1.3) rainbow (3.1.1) raindrops (0.20.1) - regexp_parser (2.9.2) - rubocop (1.68.0) + regexp_parser (2.10.0) + rubocop (1.73.2) json (~> 2.3) - language_server-protocol (>= 3.17.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 2.4, < 3.0) - rubocop-ast (>= 1.32.2, < 2.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.38.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.35.0) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.38.1) parser (>= 3.3.1.0) ruby-progressbar (1.13.0) samovar (2.3.0) console (~> 1.0) mapping (~> 1.0) - sequel (5.86.0) + sequel (5.90.0) bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) - traces (0.14.1) + traces (0.15.2) tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2023.3) tzinfo (>= 1.0.0) - unicode-display_width (2.6.0) + unicode-display_width (3.1.4) + unicode-emoji (~> 4.0, >= 4.0.4) + unicode-emoji (4.0.4) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) @@ -132,7 +139,7 @@ DEPENDENCIES jdbc-postgres (~> 42.2) json (~> 2.8) pg (~> 1.5) - puma (~> 6.4) + puma (~> 6.5) rack (~> 3.0) rack-test rubocop diff --git a/frameworks/Ruby/rack/README.md b/frameworks/Ruby/rack/README.md index 65783108d2e..478315eb1d0 100644 --- a/frameworks/Ruby/rack/README.md +++ b/frameworks/Ruby/rack/README.md @@ -13,12 +13,12 @@ The tests were run with: * [Ruby 3.4](http://www.ruby-lang.org/) * [JRuby 9.4](http://jruby.org/) -* [Rack 3.0.7](http://rack.github.com/) +* [Rack 3.1](http://rack.github.com/) * [Unicorn 6.1.0](http://unicorn.bogomips.org/) * [Puma 6.4](http://puma.io/) * [Iodine](https://github.com/boazsegev/iodine) * [Falcon](https://github.com/socketry/falcon) -* [Sequel 5.68.0](https://sequel.jeremyevans.net/) +* [Sequel 5](https://sequel.jeremyevans.net/) ## Paths & Source for Tests From c44a4a8920f534a5d97c3d81c98254347fec9fab Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 9 Mar 2025 18:22:01 +0100 Subject: [PATCH 1200/1766] [rails] Update dependencies --- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 228 ++++++++++---------- frameworks/Ruby/rails/config/application.rb | 2 +- 3 files changed, 120 insertions(+), 112 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 0afad6b04cc..4adfe82d29e 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -26,5 +26,5 @@ group :falcon, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.4', require: false + gem 'puma', '~> 6.5', require: false end diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 876056701dd..964bb4521fe 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://rubygems.org/ specs: - actioncable (8.0.0) - actionpack (= 8.0.0) - activesupport (= 8.0.0) + actioncable (8.0.1) + actionpack (= 8.0.1) + activesupport (= 8.0.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.0) - actionpack (= 8.0.0) - activejob (= 8.0.0) - activerecord (= 8.0.0) - activestorage (= 8.0.0) - activesupport (= 8.0.0) + actionmailbox (8.0.1) + actionpack (= 8.0.1) + activejob (= 8.0.1) + activerecord (= 8.0.1) + activestorage (= 8.0.1) + activesupport (= 8.0.1) mail (>= 2.8.0) - actionmailer (8.0.0) - actionpack (= 8.0.0) - actionview (= 8.0.0) - activejob (= 8.0.0) - activesupport (= 8.0.0) + actionmailer (8.0.1) + actionpack (= 8.0.1) + actionview (= 8.0.1) + activejob (= 8.0.1) + activesupport (= 8.0.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.0) - actionview (= 8.0.0) - activesupport (= 8.0.0) + actionpack (8.0.1) + actionview (= 8.0.1) + activesupport (= 8.0.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -31,35 +31,35 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.0) - actionpack (= 8.0.0) - activerecord (= 8.0.0) - activestorage (= 8.0.0) - activesupport (= 8.0.0) + actiontext (8.0.1) + actionpack (= 8.0.1) + activerecord (= 8.0.1) + activestorage (= 8.0.1) + activesupport (= 8.0.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.0) - activesupport (= 8.0.0) + actionview (8.0.1) + activesupport (= 8.0.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.0) - activesupport (= 8.0.0) + activejob (8.0.1) + activesupport (= 8.0.1) globalid (>= 0.3.6) - activemodel (8.0.0) - activesupport (= 8.0.0) - activerecord (8.0.0) - activemodel (= 8.0.0) - activesupport (= 8.0.0) + activemodel (8.0.1) + activesupport (= 8.0.1) + activerecord (8.0.1) + activemodel (= 8.0.1) + activesupport (= 8.0.1) timeout (>= 0.4.0) - activestorage (8.0.0) - actionpack (= 8.0.0) - activejob (= 8.0.0) - activerecord (= 8.0.0) - activesupport (= 8.0.0) + activestorage (8.0.1) + actionpack (= 8.0.1) + activejob (= 8.0.1) + activerecord (= 8.0.1) + activesupport (= 8.0.1) marcel (~> 1.0) - activesupport (8.0.0) + activesupport (8.0.1) base64 benchmark (>= 0.3) bigdecimal @@ -73,54 +73,60 @@ GEM tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) agoo (2.15.13) - async (2.19.0) + async (2.23.0) console (~> 1.29) fiber-annotation - io-event (~> 1.6, >= 1.6.5) - async-container (0.18.3) - async (~> 2.10) - async-http (0.82.3) + io-event (~> 1.9) + metrics (~> 0.12) + traces (~> 0.15) + async-container (0.24.0) + async (~> 2.22) + async-container-supervisor (0.5.1) + async-container (~> 0.22) + async-service + io-endpoint + memory-leak (~> 0.5) + async-http (0.87.0) async (>= 2.10.2) async-pool (~> 0.9) io-endpoint (~> 0.14) io-stream (~> 0.6) metrics (~> 0.12) - protocol-http (~> 0.37) - protocol-http1 (>= 0.28.1) - protocol-http2 (~> 0.19) + protocol-http (~> 0.49) + protocol-http1 (~> 0.30) + protocol-http2 (~> 0.22) traces (~> 0.10) - async-http-cache (0.4.4) + async-http-cache (0.4.5) async-http (~> 0.56) - async-pool (0.10.1) + async-pool (0.10.3) async (>= 1.25) - traces - async-service (0.12.0) + async-service (0.13.0) async async-container (~> 0.16) base64 (0.2.0) benchmark (0.4.0) - bigdecimal (3.1.8) + bigdecimal (3.1.9) builder (3.3.0) - concurrent-ruby (1.3.4) - connection_pool (2.4.1) - console (1.29.0) + concurrent-ruby (1.3.5) + connection_pool (2.5.0) + console (1.30.0) fiber-annotation fiber-local (~> 1.1) json crass (1.0.6) date (3.4.1) drb (2.2.1) - erubi (1.13.0) - falcon (0.48.3) + erubi (1.13.1) + falcon (0.51.1) async - async-container (~> 0.18) + async-container (~> 0.20) + async-container-supervisor (~> 0.5.0) async-http (~> 0.75) async-http-cache (~> 0.4) async-service (~> 0.10) bundler localhost (~> 1.1) openssl (~> 3.0) - process-metrics (~> 0.2) protocol-http (~> 0.31) protocol-rack (~> 0.7) samovar (~> 2.3) @@ -130,20 +136,21 @@ GEM fiber-storage (1.0.0) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.6) + i18n (1.14.7) concurrent-ruby (~> 1.0) io-console (0.8.0) - io-endpoint (0.14.0) - io-event (1.7.3) + io-endpoint (0.15.2) + io-event (1.9.0) io-stream (0.6.1) iodine (0.7.58) - irb (1.14.1) + irb (1.15.1) + pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - json (2.9.1) + json (2.10.1) localhost (1.3.1) - logger (1.6.2) - loofah (2.23.1) + logger (1.6.6) + loofah (2.24.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -153,7 +160,8 @@ GEM net-smtp mapping (1.1.1) marcel (1.0.4) - metrics (0.12.1) + memory-leak (0.5.2) + metrics (0.12.2) mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.4) @@ -164,7 +172,7 @@ GEM net-protocol net-protocol (0.2.2) timeout - net-smtp (0.5.0) + net-smtp (0.5.1) net-protocol nio4r (2.7.4) nokogiri (1.18.3) @@ -174,93 +182,93 @@ GEM racc (~> 1.4) nokogiri (1.18.3-x86_64-linux-gnu) racc (~> 1.4) - openssl (3.2.0) + openssl (3.3.0) pg (1.5.9) - process-metrics (0.3.0) - console (~> 1.8) - json (~> 2) - samovar (~> 2.1) + pp (0.6.2) + prettyprint + prettyprint (0.2.0) protocol-hpack (1.5.1) - protocol-http (0.42.0) - protocol-http1 (0.28.1) + protocol-http (0.49.0) + protocol-http1 (0.30.0) protocol-http (~> 0.22) - protocol-http2 (0.19.4) + protocol-http2 (0.22.1) protocol-hpack (~> 1.4) - protocol-http (~> 0.18) - traces - protocol-rack (0.10.1) - protocol-http (~> 0.37) + protocol-http (~> 0.47) + protocol-rack (0.11.2) + protocol-http (~> 0.43) rack (>= 1.0) - psych (5.2.1) + psych (5.2.3) date stringio - puma (6.5.0) + puma (6.6.0) nio4r (~> 2.0) racc (1.8.1) rack (3.1.11) - rack-session (2.0.0) + rack-session (2.1.0) + base64 (>= 0.1.0) rack (>= 3.0.0) - rack-test (2.1.0) + rack-test (2.2.0) rack (>= 1.3) rackup (2.2.1) rack (>= 3) - rails (8.0.0) - actioncable (= 8.0.0) - actionmailbox (= 8.0.0) - actionmailer (= 8.0.0) - actionpack (= 8.0.0) - actiontext (= 8.0.0) - actionview (= 8.0.0) - activejob (= 8.0.0) - activemodel (= 8.0.0) - activerecord (= 8.0.0) - activestorage (= 8.0.0) - activesupport (= 8.0.0) + rails (8.0.1) + actioncable (= 8.0.1) + actionmailbox (= 8.0.1) + actionmailer (= 8.0.1) + actionpack (= 8.0.1) + actiontext (= 8.0.1) + actionview (= 8.0.1) + activejob (= 8.0.1) + activemodel (= 8.0.1) + activerecord (= 8.0.1) + activestorage (= 8.0.1) + activesupport (= 8.0.1) bundler (>= 1.15.0) - railties (= 8.0.0) + railties (= 8.0.1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.1) + rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.0) - actionpack (= 8.0.0) - activesupport (= 8.0.0) + railties (8.0.1) + actionpack (= 8.0.1) + activesupport (= 8.0.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.8.1) + rdoc (6.12.0) psych (>= 4.0.0) - redis (5.3.0) + redis (5.4.0) redis-client (>= 0.22.0) - redis-client (0.22.2) + redis-client (0.24.0) connection_pool - reline (0.5.12) + reline (0.6.0) io-console (~> 0.5) samovar (2.3.0) console (~> 1.0) mapping (~> 1.0) - securerandom (0.4.0) - stringio (3.1.2) + securerandom (0.4.1) + stringio (3.1.5) thor (1.3.2) timeout (0.4.3) - traces (0.14.1) + traces (0.15.2) trilogy (2.8.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2024.2) + tzinfo-data (1.2025.1) tzinfo (>= 1.0.0) uri (1.0.3) useragent (0.16.11) - websocket-driver (0.7.6) + websocket-driver (0.7.7) + base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.7.1) + zeitwerk (2.7.2) PLATFORMS ruby @@ -272,7 +280,7 @@ DEPENDENCIES falcon (~> 0.47) iodine (~> 0.7) pg (~> 1.5) - puma (~> 6.4) + puma (~> 6.5) rackup rails (~> 8.0.0) redis (~> 5.0) diff --git a/frameworks/Ruby/rails/config/application.rb b/frameworks/Ruby/rails/config/application.rb index 963357fb4e6..8f5abd7901b 100644 --- a/frameworks/Ruby/rails/config/application.rb +++ b/frameworks/Ruby/rails/config/application.rb @@ -21,7 +21,7 @@ module Hello class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 7.2 + config.load_defaults Rails::VERSION::STRING.to_f # Please, add to the `ignore` list any other `lib` subdirectories that do # not contain `.rb` files, or that should not be reloaded or eager loaded. From a1624a110fb7122179fee7d003d5d9e32e024690 Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 9 Mar 2025 18:25:01 +0100 Subject: [PATCH 1201/1766] [ruby/roda] Update dependencies --- frameworks/Ruby/roda-sequel/Gemfile.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 283bf222111..cb136ca6029 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -2,26 +2,26 @@ GEM remote: https://rubygems.org/ specs: base64 (0.2.0) - bigdecimal (3.1.8) - erubi (1.13.0) + bigdecimal (3.1.9) + erubi (1.13.1) iodine (0.7.58) - json (2.9.1) + json (2.10.1) kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) - pg (1.5.8) - puma (6.5.0) + pg (1.5.9) + puma (6.6.0) nio4r (~> 2.0) - rack (3.1.8) + rack (3.1.11) raindrops (0.20.1) - roda (3.85.0) + roda (3.89.0) rack - sequel (5.85.0) + sequel (5.90.0) bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) - tilt (2.4.0) + tilt (2.6.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) From 1b55cebc507bb6c1056731b45e976d1ca48d58e7 Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 12 Jan 2025 11:07:49 +0100 Subject: [PATCH 1202/1766] [ruby/agoo] update dependencies --- frameworks/Ruby/agoo/Gemfile.lock | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/agoo/Gemfile.lock b/frameworks/Ruby/agoo/Gemfile.lock index 62b47ca4908..8d4a2594fdc 100644 --- a/frameworks/Ruby/agoo/Gemfile.lock +++ b/frameworks/Ruby/agoo/Gemfile.lock @@ -1,13 +1,15 @@ GEM remote: https://rubygems.org/ specs: - agoo (2.15.10) - bigdecimal (3.1.8) - connection_pool (2.4.1) - oj (3.16.3) + agoo (2.15.13) + bigdecimal (3.1.9) + connection_pool (2.5.0) + oj (3.16.10) bigdecimal (>= 3.0) - pg (1.5.6) - rack (3.0.12) + ostruct (>= 0.2) + ostruct (0.6.1) + pg (1.5.9) + rack (3.1.11) PLATFORMS ruby From 78fcec9c24d8538ef2addebb4393b318b0a1fbc3 Mon Sep 17 00:00:00 2001 From: Petrik Date: Mon, 27 Jan 2025 18:52:11 +0100 Subject: [PATCH 1203/1766] [rails] Only set Date headers if not created by servers --- .../Ruby/rails/app/controllers/application_controller.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/app/controllers/application_controller.rb b/frameworks/Ruby/rails/app/controllers/application_controller.rb index 02f927caed7..0ef204a6b6b 100644 --- a/frameworks/Ruby/rails/app/controllers/application_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/application_controller.rb @@ -1,11 +1,13 @@ # frozen_string_literal: true class ApplicationController < ActionController::Base - before_action :add_header + if defined?(Agoo) || defined?(Falcon) || defined?(Puma) + before_action :add_date_header + end private - def add_header + def add_date_header response.set_header('Date', Time.now.httpdate) end end From dc70b7b2c331256378a6121f605ca616f54f8ee1 Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 9 Mar 2025 21:30:40 +0100 Subject: [PATCH 1204/1766] [rust/ohkami] Fix test variants Use proper formatting for ohkami. Fixes the following warning: Framework ohkami does not define a default test in benchmark_config.json --- frameworks/Rust/ohkami/benchmark_config.json | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/frameworks/Rust/ohkami/benchmark_config.json b/frameworks/Rust/ohkami/benchmark_config.json index 3f0647c3927..654faa24d48 100644 --- a/frameworks/Rust/ohkami/benchmark_config.json +++ b/frameworks/Rust/ohkami/benchmark_config.json @@ -22,9 +22,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?q=", "plaintext_url": "/plaintext" - } - }, - { + }, "rt_async-std": { "dockerfile": "rt_async-std.dockerfile", "display_name": "Ohkami [async-std]", @@ -45,9 +43,7 @@ "fortune_url": "/fortunes", "update_url": "/updates?q=", "plaintext_url": "/plaintext" - } - }, - { + }, "rt_smol": { "dockerfile": "rt_smol.dockerfile", "display_name": "Ohkami [smol]", @@ -64,9 +60,7 @@ "port": 8000, "json_url": "/json", "plaintext_url": "/plaintext" - } - }, - { + }, "rt_glommio": { "dockerfile": "rt_glommio.dockerfile", "display_name": "Ohkami [glommio]", @@ -83,9 +77,7 @@ "port": 8000, "json_url": "/json", "plaintext_url": "/plaintext" - } - }, - { + }, "rt_nio": { "dockerfile": "rt_nio.dockerfile", "display_name": "Ohkami [nio]", From 5930645018cda5d5c59bcc233638f23db1ae8192 Mon Sep 17 00:00:00 2001 From: hzq Date: Mon, 10 Mar 2025 14:06:18 +0800 Subject: [PATCH 1205/1766] Paozhu update --- .../paozhu_benchmark/common/cost_define.h | 4 + .../orm/include/fortune_mysql.h | 502 ++++++++++++++---- .../orm/include/fortunebase.h | 2 +- .../orm/include/world_mysql.h | 502 ++++++++++++++---- .../paozhu_benchmark/orm/include/worldbase.h | 2 +- 5 files changed, 804 insertions(+), 208 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h index ef54468d7be..c4d1a48addf 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h @@ -9,4 +9,8 @@ #define CONST_HTTP_BODY_POST_SIZE 33554432 #define CONST_HTTP_JSON_POST_SIZE 2097152 +#define CONST_ORM_CLEAR_TIME 7200 +#define CONST_ORM_CLEAR_NUMBER 1024 +#define CONST_ORM_QUERY_CONNECT_TIMEOUT 30 + #endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h index 18cba5958fc..8b31ea9a000 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h @@ -28,6 +28,7 @@ #include "mysql_conn.h" #include "mysql_conn_pool.h" #include "orm_cache.hpp" +#include "mysql_connect_mar.h" /*baseincludefile*/ namespace orm { @@ -168,10 +169,21 @@ namespace orm { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -371,10 +383,20 @@ namespace orm { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -601,7 +623,11 @@ namespace orm unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -730,7 +756,10 @@ namespace orm unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -848,7 +877,11 @@ namespace orm unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -5067,10 +5100,21 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return temprecord; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return temprecord; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5282,10 +5326,21 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5455,26 +5510,33 @@ M_MODEL& or_leMessage(T val) return *mod; } auto conn = conn_obj->get_select_conn(); + + std::size_t n = conn->write_sql(sqlstring); + if(n==0) + { + error_msg = conn->error_msg; + return *mod; + } - unsigned int querysql_len = sqlstring.length() + 1; + //unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); + // conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - if(conn->ec) - { - error_msg = conn->ec.message(); - iserror = true; - return *mod; - } + // if(conn->ec) + // { + // error_msg = conn->ec.message(); + // iserror = true; + // return *mod; + // } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5492,10 +5554,22 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + iserror = true; + error_msg = conn->error_msg; + return *mod; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return *mod; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5646,18 +5720,26 @@ M_MODEL& or_leMessage(T val) } auto conn = co_await conn_obj->async_get_select_conn(); - unsigned int querysql_len = sqlstring.length() + 1; + std::size_t n = co_await conn->async_write_sql(sqlstring); + + if(n==0) + { + error_msg = conn->error_msg; + co_return 0; + } - conn->send_data.clear(); + // unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + // conn->send_data.clear(); - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); pack_info_t temp_pack_data; @@ -5676,10 +5758,20 @@ M_MODEL& or_leMessage(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5865,10 +5957,21 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6056,10 +6159,20 @@ M_MODEL& or_leMessage(T val) // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6208,25 +6321,32 @@ M_MODEL& or_leMessage(T val) } auto conn = conn_obj->get_select_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = conn->error_msg; return 0; } + // unsigned int querysql_len = sqlstring.length() + 1; + + // conn->send_data.clear(); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + // if(conn->ec) + // { + // error_msg = conn->ec.message(); + // iserror = true; + // return 0; + // } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -6242,10 +6362,21 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6412,17 +6543,25 @@ M_MODEL& or_leMessage(T val) } auto conn = co_await conn_obj->async_get_select_conn(); - unsigned int querysql_len = sqlstring.length() + 1; + std::size_t n = co_await conn->async_write_sql(sqlstring); + + if (n==0) + { + error_msg = conn->error_msg; + co_return 0; + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + // unsigned int querysql_len = sqlstring.length() + 1; - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + // conn->send_data.clear(); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); pack_info_t temp_pack_data; @@ -6443,10 +6582,20 @@ M_MODEL& or_leMessage(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6753,10 +6902,21 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6923,10 +7083,20 @@ M_MODEL& or_leMessage(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return valuetemp; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -7093,10 +7263,21 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -7260,10 +7441,20 @@ M_MODEL& or_leMessage(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -7434,7 +7625,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7533,28 +7728,39 @@ M_MODEL& or_leMessage(T val) } auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = conn->error_msg; return 0; } + // unsigned int querysql_len = sqlstring.length() + 1; + + // conn->send_data.clear(); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + // if(conn->ec) + // { + // error_msg = conn->ec.message(); + // iserror = true; + // return 0; + // } + unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7668,7 +7874,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7783,7 +7992,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7871,7 +8083,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7992,7 +8208,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8107,7 +8327,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8194,7 +8417,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8274,7 +8501,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8399,7 +8629,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8531,7 +8765,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8610,7 +8848,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8683,7 +8925,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8763,7 +9008,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8836,7 +9085,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8916,7 +9168,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8988,7 +9244,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9099,7 +9358,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9149,7 +9412,11 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9244,7 +9511,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9306,7 +9576,10 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9429,10 +9702,21 @@ M_MODEL& or_leMessage(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -9594,10 +9878,20 @@ M_MODEL& or_leMessage(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -9781,6 +10075,8 @@ M_MODEL& or_leMessage(T val) M_MODEL *mod; + std::shared_ptr select_conn; + std::shared_ptr edit_conn; std::shared_ptr conn_obj; }; //} /*tagnamespace_replace*/ diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h index 2d688b054ed..6c04469a720 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_FORTUNEBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Sun, 02 Mar 2025 10:54:30 GMT +*本文件为自动生成 Mon, 10 Mar 2025 03:03:50 GMT ***/ #include #include diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h index 5fe029ad608..530ab810239 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h @@ -28,6 +28,7 @@ #include "mysql_conn.h" #include "mysql_conn_pool.h" #include "orm_cache.hpp" +#include "mysql_connect_mar.h" /*baseincludefile*/ namespace orm { @@ -168,10 +169,21 @@ namespace orm { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -371,10 +383,20 @@ namespace orm { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -601,7 +623,11 @@ namespace orm unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -730,7 +756,10 @@ namespace orm unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -848,7 +877,11 @@ namespace orm unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -4907,10 +4940,21 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return temprecord; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return temprecord; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5122,10 +5166,21 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5295,26 +5350,33 @@ M_MODEL& or_leRandomnumber(T val) return *mod; } auto conn = conn_obj->get_select_conn(); + + std::size_t n = conn->write_sql(sqlstring); + if(n==0) + { + error_msg = conn->error_msg; + return *mod; + } - unsigned int querysql_len = sqlstring.length() + 1; + //unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); + // conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - if(conn->ec) - { - error_msg = conn->ec.message(); - iserror = true; - return *mod; - } + // if(conn->ec) + // { + // error_msg = conn->ec.message(); + // iserror = true; + // return *mod; + // } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5332,10 +5394,22 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + iserror = true; + error_msg = conn->error_msg; + return *mod; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return *mod; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5486,18 +5560,26 @@ M_MODEL& or_leRandomnumber(T val) } auto conn = co_await conn_obj->async_get_select_conn(); - unsigned int querysql_len = sqlstring.length() + 1; + std::size_t n = co_await conn->async_write_sql(sqlstring); + + if(n==0) + { + error_msg = conn->error_msg; + co_return 0; + } - conn->send_data.clear(); + // unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + // conn->send_data.clear(); - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); pack_info_t temp_pack_data; @@ -5516,10 +5598,20 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5705,10 +5797,21 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -5896,10 +5999,20 @@ M_MODEL& or_leRandomnumber(T val) // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6048,25 +6161,32 @@ M_MODEL& or_leRandomnumber(T val) } auto conn = conn_obj->get_select_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = conn->error_msg; return 0; } + // unsigned int querysql_len = sqlstring.length() + 1; + + // conn->send_data.clear(); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + // if(conn->ec) + // { + // error_msg = conn->ec.message(); + // iserror = true; + // return 0; + // } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -6082,10 +6202,21 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6252,17 +6383,25 @@ M_MODEL& or_leRandomnumber(T val) } auto conn = co_await conn_obj->async_get_select_conn(); - unsigned int querysql_len = sqlstring.length() + 1; + std::size_t n = co_await conn->async_write_sql(sqlstring); + + if (n==0) + { + error_msg = conn->error_msg; + co_return 0; + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + // unsigned int querysql_len = sqlstring.length() + 1; - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + // conn->send_data.clear(); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); pack_info_t temp_pack_data; @@ -6283,10 +6422,20 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6593,10 +6742,21 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6763,10 +6923,20 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return valuetemp; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -6933,10 +7103,21 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -7100,10 +7281,20 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return 0; + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return 0; + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -7274,7 +7465,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7373,28 +7568,39 @@ M_MODEL& or_leRandomnumber(T val) } auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = conn->error_msg; return 0; } + // unsigned int querysql_len = sqlstring.length() + 1; + + // conn->send_data.clear(); + // conn->send_data.push_back((querysql_len & 0xFF)); + // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); + // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); + // conn->send_data.push_back(0x00); + // conn->send_data.push_back(0x03); + // conn->send_data.append(sqlstring); + + // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + + // if(conn->ec) + // { + // error_msg = conn->ec.message(); + // iserror = true; + // return 0; + // } + unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7508,7 +7714,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7623,7 +7832,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7711,7 +7923,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7832,7 +8048,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -7947,7 +8167,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8034,7 +8257,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8114,7 +8341,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8239,7 +8469,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8371,7 +8605,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8450,7 +8688,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8523,7 +8765,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8603,7 +8848,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8676,7 +8925,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8756,7 +9008,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8828,7 +9084,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8939,7 +9198,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -8989,7 +9252,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = conn->read_loop(); - + if(n==0) + { + error_msg = conn->error_msg; + return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9084,7 +9351,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9146,7 +9416,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await conn->async_read_loop(); - + if (n==0) + { + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); @@ -9269,10 +9542,21 @@ M_MODEL& or_leRandomnumber(T val) { n = conn->read_loop(); offset = 0; + if(n==0) + { + error_msg = conn->error_msg; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -9434,10 +9718,20 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await conn->async_read_loop(); offset = 0; + if (n==0) + { + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } for (; offset < n;) { conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - if (temp_pack_data.length == temp_pack_data.current_length) + if(temp_pack_data.error > 0) + { + iserror = true; + error_msg =temp_pack_data.data; + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { if (conn->pack_eof_check(temp_pack_data)) { @@ -9621,6 +9915,8 @@ M_MODEL& or_leRandomnumber(T val) M_MODEL *mod; + std::shared_ptr select_conn; + std::shared_ptr edit_conn; std::shared_ptr conn_obj; }; //} /*tagnamespace_replace*/ diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h index 93f7c1f14b2..19775f6117b 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_WORLDBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Sun, 02 Mar 2025 10:54:30 GMT +*本文件为自动生成 Mon, 10 Mar 2025 03:03:50 GMT ***/ #include #include From 513db9464af6593bf1ccd300b3f41a09ca4f3fa1 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Mon, 10 Mar 2025 12:12:21 +0500 Subject: [PATCH 1206/1766] wip --- frameworks/Rust/ntex/Cargo.toml | 15 +++++++-------- frameworks/Rust/ntex/benchmark_config.json | 12 ++++++------ frameworks/Rust/ntex/config.toml | 6 +++--- ...ault-rt.dockerfile => ntex-db-neon.dockerfile} | 4 ++-- ...db-default.dockerfile => ntex-neon.dockerfile} | 4 ++-- ...efault.dockerfile => ntex-plt-neon.dockerfile} | 4 ++-- 6 files changed, 22 insertions(+), 23 deletions(-) rename frameworks/Rust/ntex/{ntex-default-rt.dockerfile => ntex-db-neon.dockerfile} (83%) rename frameworks/Rust/ntex/{ntex-db-default.dockerfile => ntex-neon.dockerfile} (83%) rename frameworks/Rust/ntex/{ntex-plt-default.dockerfile => ntex-plt-neon.dockerfile} (82%) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index d87937a626f..bfc44e1e408 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ntex-bench" -version = "2.0.0" +version = "2.1.0" edition = "2018" [[bin]] @@ -12,7 +12,7 @@ name = "ntex-compio" path = "src/main.rs" [[bin]] -name = "ntex-default" +name = "ntex-neon" path = "src/main.rs" [[bin]] @@ -24,7 +24,7 @@ name = "ntex-db-compio" path = "src/main_db.rs" [[bin]] -name = "ntex-db-default" +name = "ntex-db-neon" path = "src/main_db.rs" [[bin]] @@ -36,7 +36,7 @@ name = "ntex-plt-compio" path = "src/main_plt.rs" [[bin]] -name = "ntex-plt-default" +name = "ntex-plt-neon" path = "src/main_plt.rs" [features] @@ -48,8 +48,8 @@ tokio = ["ntex/tokio"] # compio runtime compio = ["ntex/compio"] -# default-rt runtime -default-rt = ["ntex/default-rt"] +# neon runtime +neon = ["ntex/neon"] [dependencies] ntex = "2.12" @@ -76,10 +76,9 @@ compio-driver = { version = "*", features = ["io-uring"]} [patch.crates-io] ntex = { git = "https://github.com/ntex-rs/ntex.git" } ntex-io = { git = "https://github.com/ntex-rs/ntex.git" } -ntex-iodriver = { git = "https://github.com/ntex-rs/ntex.git" } ntex-net = { git = "https://github.com/ntex-rs/ntex.git" } ntex-rt = { git = "https://github.com/ntex-rs/ntex.git" } -ntex-runtime = { git = "https://github.com/ntex-rs/ntex.git" } +ntex-neon = { git = "https://github.com/ntex-rs/ntex.git" } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/ntex/benchmark_config.json b/frameworks/Rust/ntex/benchmark_config.json index 67ffbf68d7a..44e54843e8e 100755 --- a/frameworks/Rust/ntex/benchmark_config.json +++ b/frameworks/Rust/ntex/benchmark_config.json @@ -37,7 +37,7 @@ "notes": "", "versus": "" }, - "default-rt": { + "neon": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -51,7 +51,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [default]", + "display_name": "ntex [neon]", "notes": "", "versus": "" }, @@ -95,7 +95,7 @@ "notes": "", "versus": "" }, - "db-default": { + "db-neon": { "fortune_url": "/fortunes", "db_url": "/db", "query_url": "/query?q=", @@ -111,7 +111,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [default,db]", + "display_name": "ntex [neon,db]", "notes": "", "versus": "" }, @@ -151,7 +151,7 @@ "notes": "", "versus": "" }, - "plt-default": { + "plt-neon": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -165,7 +165,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [default,platform]", + "display_name": "ntex [neon,platform]", "notes": "", "versus": "" } diff --git a/frameworks/Rust/ntex/config.toml b/frameworks/Rust/ntex/config.toml index 3595c61e8fd..75e7832f73b 100644 --- a/frameworks/Rust/ntex/config.toml +++ b/frameworks/Rust/ntex/config.toml @@ -27,7 +27,7 @@ platform = "None" webserver = "ntex" versus = "" -[default-rt] +[neon] urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" @@ -70,7 +70,7 @@ platform = "None" webserver = "ntex" versus = "" -[db-default] +[db-neon] urls.db = "/db" urls.query = "/query?q=" urls.update = "/update?q=" @@ -111,7 +111,7 @@ platform = "None" webserver = "ntex" versus = "" -[plt-default] +[plt-neon] urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" diff --git a/frameworks/Rust/ntex/ntex-default-rt.dockerfile b/frameworks/Rust/ntex/ntex-db-neon.dockerfile similarity index 83% rename from frameworks/Rust/ntex/ntex-default-rt.dockerfile rename to frameworks/Rust/ntex/ntex-db-neon.dockerfile index 06a70a68a8f..0bd30d7d49c 100644 --- a/frameworks/Rust/ntex/ntex-default-rt.dockerfile +++ b/frameworks/Rust/ntex/ntex-db-neon.dockerfile @@ -9,8 +9,8 @@ ADD ./ /ntex WORKDIR /ntex RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default-rt" +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="neon" EXPOSE 8080 -CMD ./target/release/ntex-default +CMD ./target/release/ntex-db-neon diff --git a/frameworks/Rust/ntex/ntex-db-default.dockerfile b/frameworks/Rust/ntex/ntex-neon.dockerfile similarity index 83% rename from frameworks/Rust/ntex/ntex-db-default.dockerfile rename to frameworks/Rust/ntex/ntex-neon.dockerfile index 1ce2f12e7af..91b0ac1acba 100644 --- a/frameworks/Rust/ntex/ntex-db-default.dockerfile +++ b/frameworks/Rust/ntex/ntex-neon.dockerfile @@ -9,8 +9,8 @@ ADD ./ /ntex WORKDIR /ntex RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default-rt" +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="neon" EXPOSE 8080 -CMD ./target/release/ntex-db-default +CMD ./target/release/ntex-neon diff --git a/frameworks/Rust/ntex/ntex-plt-default.dockerfile b/frameworks/Rust/ntex/ntex-plt-neon.dockerfile similarity index 82% rename from frameworks/Rust/ntex/ntex-plt-default.dockerfile rename to frameworks/Rust/ntex/ntex-plt-neon.dockerfile index 8e2e72a8343..766886f6997 100644 --- a/frameworks/Rust/ntex/ntex-plt-default.dockerfile +++ b/frameworks/Rust/ntex/ntex-plt-neon.dockerfile @@ -9,8 +9,8 @@ ADD ./ /ntex WORKDIR /ntex RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="default-rt" +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="neon" EXPOSE 8080 -CMD ./target/release/ntex-plt-default +CMD ./target/release/ntex-plt-neon From 0f77be659c161b71f731653e5fd15efc790ba2aa Mon Sep 17 00:00:00 2001 From: Petrik Date: Mon, 10 Mar 2025 09:36:56 +0100 Subject: [PATCH 1207/1766] [ruby/sinatra] Update dependencies --- frameworks/Ruby/sinatra/Gemfile.lock | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 76b66f8fedd..3e41be6ff15 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -23,33 +23,34 @@ GEM agoo (2.15.13) base64 (0.2.0) benchmark (0.4.0) - bigdecimal (3.1.8) - concurrent-ruby (1.3.4) - connection_pool (2.4.1) + bigdecimal (3.1.9) + concurrent-ruby (1.3.5) + connection_pool (2.5.0) drb (2.2.1) - i18n (1.14.6) + i18n (1.14.7) concurrent-ruby (~> 1.0) - json (2.9.1) + json (2.10.1) kgio (2.11.4) - logger (1.6.4) + logger (1.6.6) minitest (5.25.4) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.24) + passenger (6.0.26) rack (>= 1.6.13) rackup (>= 2.0.0) rake (>= 12.3.3) pg (1.5.9) - puma (6.5.0) + puma (6.6.0) nio4r (~> 2.0) - rack (3.1.8) + rack (3.1.11) rack-protection (4.1.1) base64 (>= 0.1.0) logger (>= 1.6.0) rack (>= 3.0.0, < 4) - rack-session (2.0.0) + rack-session (2.1.0) + base64 (>= 0.1.0) rack (>= 3.0.0) rackup (2.2.1) rack (>= 3) @@ -64,14 +65,14 @@ GEM rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - tilt (2.5.0) + tilt (2.6.0) timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) - uri (1.0.2) + uri (1.0.3) PLATFORMS ruby From 74f3531418905de73c6d2245abdd4ac3613d330c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 22:35:27 +0000 Subject: [PATCH 1208/1766] Bump rack from 3.1.11 to 3.1.12 in /frameworks/Ruby/rails Bumps [rack](https://github.com/rack/rack) from 3.1.11 to 3.1.12. - [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.1.11...v3.1.12) --- updated-dependencies: - dependency-name: rack 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 964bb4521fe..2f8f40f851a 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -203,7 +203,7 @@ GEM puma (6.6.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.11) + rack (3.1.12) rack-session (2.1.0) base64 (>= 0.1.0) rack (>= 3.0.0) From e1cf358600da1693655f07dae051521dddd363c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 11 Mar 2025 08:02:05 +0800 Subject: [PATCH 1209/1766] feat: hyperlane v4.29.0 --- frameworks/Rust/hyperlane/Cargo.lock | 1698 +++++++++++++++++ frameworks/Rust/hyperlane/Cargo.toml | 45 + frameworks/Rust/hyperlane/README.md | 30 + .../Rust/hyperlane/benchmark_config.json | 25 + frameworks/Rust/hyperlane/config.toml | 19 + .../Rust/hyperlane/hyperlane.dockerfile | 13 + frameworks/Rust/hyperlane/src/constant.rs | 9 + frameworks/Rust/hyperlane/src/db.rs | 136 ++ frameworks/Rust/hyperlane/src/lazy.rs | 4 + frameworks/Rust/hyperlane/src/main.rs | 37 + .../Rust/hyperlane/src/request_middleware.rs | 11 + .../Rust/hyperlane/src/response_middleware.rs | 5 + frameworks/Rust/hyperlane/src/router.rs | 43 + frameworks/Rust/hyperlane/src/server.rs | 18 + frameworks/Rust/hyperlane/src/type.rs | 6 + .../Rust/hyperlane/templates/fortune.hbs | 5 + 16 files changed, 2104 insertions(+) create mode 100644 frameworks/Rust/hyperlane/Cargo.lock create mode 100644 frameworks/Rust/hyperlane/Cargo.toml create mode 100644 frameworks/Rust/hyperlane/README.md create mode 100644 frameworks/Rust/hyperlane/benchmark_config.json create mode 100644 frameworks/Rust/hyperlane/config.toml create mode 100644 frameworks/Rust/hyperlane/hyperlane.dockerfile create mode 100644 frameworks/Rust/hyperlane/src/constant.rs create mode 100644 frameworks/Rust/hyperlane/src/db.rs create mode 100644 frameworks/Rust/hyperlane/src/lazy.rs create mode 100644 frameworks/Rust/hyperlane/src/main.rs create mode 100644 frameworks/Rust/hyperlane/src/request_middleware.rs create mode 100644 frameworks/Rust/hyperlane/src/response_middleware.rs create mode 100644 frameworks/Rust/hyperlane/src/router.rs create mode 100644 frameworks/Rust/hyperlane/src/server.rs create mode 100644 frameworks/Rust/hyperlane/src/type.rs create mode 100644 frameworks/Rust/hyperlane/templates/fortune.hbs diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock new file mode 100644 index 00000000000..40ae1f7c6c8 --- /dev/null +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -0,0 +1,1698 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "async-func" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80066a41906f85b9ac479cbbd2abcb783438834c1660a34bf646ed8abf6b626f" +dependencies = [ + "tokio", +] + +[[package]] +name = "async-trait" +version = "0.1.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bb8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d8b8e1a22743d9241575c6ba822cf9c8fef34771c86ab7e477a4fbfd254e5" +dependencies = [ + "futures-util", + "parking_lot", + "tokio", +] + +[[package]] +name = "bb8-postgres" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e570e6557cd0f88d28d32afa76644873271a70dc22656df565b2021c4036aa9c" +dependencies = [ + "bb8", + "tokio", + "tokio-postgres", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clonelicious" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244a99ea51161852985586dad04aa54843497a09331a686484b423ebd9ff4de0" + +[[package]] +name = "color-output" +version = "6.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6a18fb944ff5f0dcc0b549868e17bcd638a6d1d9554030b986de29b6aab097d" +dependencies = [ + "hyperlane-time", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "file-operation" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b795bb8a0d08dd1b6d6e2b02b83584e26dceb7016b9a57e438a5946530136e9" +dependencies = [ + "tokio", +] + +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "halfbrown" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +dependencies = [ + "hashbrown", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http-compress" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca94f46c998f0d44d7fe82aeaf3edcc689027624d5e1da3e957a0943d2b0f897" +dependencies = [ + "brotli", + "flate2", + "http-constant", +] + +[[package]] +name = "http-constant" +version = "1.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce9eb07f0cbd4a9832e9c5158a08bcfbcea832c3a69d0872c31f1a2be0f92f26" + +[[package]] +name = "http-type" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bdf14cea97c9fd74e3e4cac42d9659beaf583e0233cec0ea30bfb17c0648c9" +dependencies = [ + "hex", + "http-compress", + "http-constant", + "lombok-macros", + "serde", + "serde-xml-rs", + "serde_json", + "serde_urlencoded", + "tokio", + "url", +] + +[[package]] +name = "hyperlane" +version = "4.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a738f244c96d7c30150d53a9a78a90abb8126696f82c9c2a29582a204ae2a1a8" +dependencies = [ + "async-func", + "clonelicious", + "color-output", + "file-operation", + "futures", + "http-compress", + "http-type", + "hyperlane-log", + "lombok-macros", + "once_cell", + "recoverable-spawn", + "recoverable-thread-pool", + "serde", + "serde_json", + "server-manager", + "simd-json", + "std-macro-extensions", + "tokio", +] + +[[package]] +name = "hyperlane-log" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a05a669263f0021812ae483d83a25e7d08e6032222844338abaa3a377f1a97a1" +dependencies = [ + "file-operation", + "hyperlane-time", + "lombok-macros", + "once_cell", + "recoverable-spawn", +] + +[[package]] +name = "hyperlane-time" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3560ff2c528d3fd9ba75e9f47096452a96fc2ae0cff838de71f8d2a8c80eb0bb" + +[[package]] +name = "hyperlane_techempower" +version = "0.0.1" +dependencies = [ + "bb8", + "bb8-postgres", + "hyperlane", + "rand", + "tokio-postgres", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.170" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "lombok-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c093f50f1ac912704228373ec7c7b9e5c927bb37e7c37a8f3d3a53aad2249425" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "postgres-protocol" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" +dependencies = [ + "base64", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" +dependencies = [ + "bytes", + "fallible-iterator", + "postgres-protocol", + "uuid", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.23", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha", + "rand_core", + "zerocopy 0.8.23", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", +] + +[[package]] +name = "recoverable-spawn" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa0209879a97de8df4ebe358164997474a2f4a02b82fd78615aea5dedb17d3c" +dependencies = [ + "once_cell", + "tokio", +] + +[[package]] +name = "recoverable-thread-pool" +version = "2.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd78e4575ff1cd61ffa4e6b65453407efeb396a136d8764edbf1740df8bbdfd" +dependencies = [ + "lombok-macros", + "recoverable-spawn", +] + +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[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.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-xml-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +dependencies = [ + "log", + "serde", + "thiserror", + "xml-rs", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "server-manager" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec2b61180a976cb1097c8303666ab2af07af6613ef9b519b56e2cce5c94c4263" +dependencies = [ + "tokio", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-json" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" +dependencies = [ + "getrandom 0.2.15", + "halfbrown", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "std-macro-extensions" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f59f08a01eaad5163433e41c5c36db1f6d3a66abda4e501dbf554d7e390cfc9" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand", + "socket2", + "tokio", + "tokio-util", + "whoami", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + +[[package]] +name = "value-trait" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", + "web-sys", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xml-rs" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +dependencies = [ + "zerocopy-derive 0.8.23", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml new file mode 100644 index 00000000000..2e1bc683076 --- /dev/null +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "hyperlane_techempower" +version = "0.0.1" +edition = "2021" +authors = ["ltpp-universe "] +license = "MIT" +description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, TCP communication, and redirection features, making it ideal for building modern web services.""" +keywords = ["http", "request", "response", "tcp", "redirect"] +repository = "https://github.com/ltpp-universe/hyperlane.git" +categories = ["network-programming", "web-programming"] +exclude = [ + "target", + "Cargo.lock", + "sh", + ".github", + "logs", + "**/*.log" +] + +[dependencies] +hyperlane = "4.29.0" +bb8 = "0.9.0" +bb8-postgres = "0.9.0" +rand = "0.9.0" +tokio-postgres = { version = "0.7.13", features = ["with-uuid-0_8"] } + +[profile.dev] +incremental = false +opt-level = 3 +lto = true +panic = "unwind" +debug = false +codegen-units = 1 +strip = "debuginfo" +backtrace = "off" + +[profile.release] +incremental = false +opt-level = 3 +lto = true +panic = "unwind" +debug = false +codegen-units = 1 +strip = "debuginfo" +backtrace = "off" diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md new file mode 100644 index 00000000000..e0856bbd64c --- /dev/null +++ b/frameworks/Rust/hyperlane/README.md @@ -0,0 +1,30 @@ +# [hyperlane](https://github.com/ltpp-universe/hyperlane) web framework + +## Description + +Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, TCP communication, and redirection features, making it ideal for building modern web services. + +## Database + +PostgreSQL. + +- url: postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world +- tfb-database read from env DBHOST + +## Test URLs + +### Test 1: JSON Encoding + + http://localhost:60000/json + +### Test 2: Single Row Query + + http://localhost:60000/db + +### Test 3: Multi Row Query + + http://localhost:60000/queries?queries=20 + +### Test 4: Plaintext + + http://localhost:60000/plaintext diff --git a/frameworks/Rust/hyperlane/benchmark_config.json b/frameworks/Rust/hyperlane/benchmark_config.json new file mode 100644 index 00000000000..eaaed427531 --- /dev/null +++ b/frameworks/Rust/hyperlane/benchmark_config.json @@ -0,0 +1,25 @@ +{ + "framework": "hyperlane", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "port": 60000, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "hyperlane", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "hyperlane", + "os": "Linux", + "database_os": "Linux", + "display_name": "hyperlane" + } + } + ] +} diff --git a/frameworks/Rust/hyperlane/config.toml b/frameworks/Rust/hyperlane/config.toml new file mode 100644 index 00000000000..7e47fcc26b8 --- /dev/null +++ b/frameworks/Rust/hyperlane/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "hyperlane" + +[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 = "Rust" +webserver = "hyperlane" +versus = "None" diff --git a/frameworks/Rust/hyperlane/hyperlane.dockerfile b/frameworks/Rust/hyperlane/hyperlane.dockerfile new file mode 100644 index 00000000000..a2b07066ae0 --- /dev/null +++ b/frameworks/Rust/hyperlane/hyperlane.dockerfile @@ -0,0 +1,13 @@ +FROM rust:1.85 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /hyperlane_techempower +WORKDIR /hyperlane_techempower + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release + +EXPOSE 60000 + +CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/src/constant.rs b/frameworks/Rust/hyperlane/src/constant.rs new file mode 100644 index 00000000000..2b988574a6c --- /dev/null +++ b/frameworks/Rust/hyperlane/src/constant.rs @@ -0,0 +1,9 @@ +pub static RESPONSEDATA: &str = "Hello, World!"; +pub static DATABASE_TYPE: &str = "postgres"; +pub static DATABASE_HOST: &str = "tfb-database"; +pub static DATABASE_USER_NAME: &str = "benchmarkdbuser"; +pub static DATABASE_USER_PASSWORD: &str = "benchmarkdbpass"; +pub static DATABASE_PORT: usize = 5432; +pub static DATABASE_NAME: &str = "hello_world"; +pub static TABLE_NAME: &str = "World"; +pub static ROW_LIMIT: i32 = 500; diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs new file mode 100644 index 00000000000..b86896f797d --- /dev/null +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -0,0 +1,136 @@ +use crate::*; + +pub async fn get_db_connection() -> DbPoolConnection { + let db_pool: DbPoolConnection = DB.read().await.clone().unwrap(); + db_pool +} + +pub async fn create_batabase() { + let db_pool: DbPoolConnection = get_db_connection().await; + let connection: DbConnection = db_pool.get().await.unwrap(); + let db_exists: bool = connection + .query_one( + "SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname = $1);", + &[&DATABASE_NAME], + ) + .await + .unwrap() + .get(0); + if !db_exists { + println_warning!( + "database `", + DATABASE_NAME, + "` not found. Creating database..." + ); + connection + .batch_execute(&format!("CREATE DATABASE {};", DATABASE_NAME)) + .await + .unwrap(); + println_success!("database `", DATABASE_NAME, "` created successfully"); + } + println_success!("database `", DATABASE_NAME, "` ready"); +} + +pub async fn create_table() { + let db_pool: DbPoolConnection = get_db_connection().await; + let connection: DbConnection = db_pool.get().await.unwrap(); + connection + .batch_execute(&format!( + "CREATE TABLE IF NOT EXISTS {} ( + id SERIAL PRIMARY KEY, + randomNumber INTEGER NOT NULL + );", + TABLE_NAME + )) + .await + .unwrap(); + println_success!("table `", TABLE_NAME, "` ready"); +} + +pub async fn insert_records() { + let db_pool: DbPoolConnection = get_db_connection().await; + let connection: DbConnection = db_pool.get().await.unwrap(); + let row: Row = connection + .query_one(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME), &[]) + .await + .unwrap(); + let count: i64 = row.get(0); + let limit: i64 = ROW_LIMIT as i64; + if count >= limit { + println_warning!(format!( + "table '{}' already has {} records. No need to insert.", + TABLE_NAME, count + )); + return; + } + let missing_count: i64 = limit - count; + println_warning!(format!( + "table '{}' has {} records. Inserting {} missing records...", + TABLE_NAME, count, missing_count + )); + let mut rng: rand::prelude::ThreadRng = rand::rng(); + let mut values: Vec = Vec::new(); + for _ in 0..missing_count { + let random_number: i32 = rng.random_range(1..=10000); + values.push(format!("(DEFAULT, {})", random_number)); + } + let query: String = format!( + "INSERT INTO {} (id, randomNumber) VALUES {}", + TABLE_NAME, + values.join(",") + ); + connection.batch_execute(&query).await.unwrap(); + println_success!(format!( + "successfully inserted {} missing records into '{}' table.", + TABLE_NAME, missing_count + )); +} + +pub async fn init_db() { + let dbhost: &str = match option_env!("DBHOST") { + Some(it) => it, + _ => DATABASE_HOST, + }; + let db_url: String = format!( + "{}://{}:{}@{}:{}/{}", + DATABASE_TYPE, + DATABASE_USER_NAME, + DATABASE_USER_PASSWORD, + dbhost, + DATABASE_PORT, + DATABASE_NAME + ); + println_warning!("db url: ", db_url); + let config: Config = db_url.parse::().unwrap(); + let db_manager: PostgresConnectionManager = + PostgresConnectionManager::new(config, NoTls); + let db_pool: DbPoolConnection = Pool::builder().build(db_manager).await.unwrap(); + { + let mut db_pool_lock: RwLockWriteGuard<'_, Option> = DB.write().await; + *db_pool_lock = Some(db_pool.clone()); + } + create_batabase().await; + create_table().await; + insert_records().await; +} + +pub async fn random_world_row() -> Result> { + let random_id: i32 = rand::rng().random_range(1..ROW_LIMIT); + let db_pool: DbPoolConnection = get_db_connection().await; + let connection: DbConnection = db_pool + .get() + .await + .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("timeout: {}", e)))?; + let stmt: Statement = connection + .prepare(&format!( + "SELECT id, randomNumber FROM {} WHERE id = $1", + TABLE_NAME + )) + .await?; + if let Some(rows) = connection.query_opt(&stmt, &[&random_id]).await? { + let id: i32 = rows.get(0); + let random_number: i32 = rows.get(1); + return Ok((id, random_number)); + } + return Ok((0, 0)); +} diff --git a/frameworks/Rust/hyperlane/src/lazy.rs b/frameworks/Rust/hyperlane/src/lazy.rs new file mode 100644 index 00000000000..5b701e371bd --- /dev/null +++ b/frameworks/Rust/hyperlane/src/lazy.rs @@ -0,0 +1,4 @@ +use crate::*; + +pub static DB: Lazy>> = + Lazy::new(|| Arc::new(RwLock::new(None))); diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs new file mode 100644 index 00000000000..0b95175e074 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -0,0 +1,37 @@ +pub(crate) mod constant; +pub(crate) mod db; +pub(crate) mod lazy; +pub(crate) mod request_middleware; +pub(crate) mod response_middleware; +pub(crate) mod router; +pub(crate) mod server; +pub(crate) mod r#type; + +pub(crate) use bb8::{Pool, PooledConnection}; +pub(crate) use bb8_postgres::PostgresConnectionManager; +pub(crate) use constant::*; +pub(crate) use db::*; +pub(crate) use hyperlane::{ + once_cell::sync::Lazy, + serde_json::json, + tokio::sync::{RwLock, RwLockWriteGuard}, + *, +}; +pub(crate) use lazy::*; +pub(crate) use r#type::*; +pub(crate) use rand::Rng; +pub(crate) use request_middleware::*; +pub(crate) use response_middleware::*; +pub(crate) use router::*; +pub(crate) use server::*; +pub(crate) use std::{io, sync::Arc}; +pub(crate) use tokio_postgres::{Config, NoTls, Row, Statement}; + +#[tokio::main] +async fn main() { + println_warning!("start connect db"); + init_db().await; + println_success!("connect db finish"); + println_warning!("start init server"); + run_server().await; +} diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs new file mode 100644 index 00000000000..dfb39aac42b --- /dev/null +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -0,0 +1,11 @@ +use crate::*; + +pub async fn request(controller_data: ControllerData) { + let _ = controller_data + .set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) + .await + .set_request_header(CONTENT_TYPE, APPLICATION_JSON) + .await + .set_response_status_code(200) + .await; +} diff --git a/frameworks/Rust/hyperlane/src/response_middleware.rs b/frameworks/Rust/hyperlane/src/response_middleware.rs new file mode 100644 index 00000000000..81fb0c368e9 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/response_middleware.rs @@ -0,0 +1,5 @@ +use crate::*; + +pub async fn response(controller_data: ControllerData) { + let _ = controller_data.send().await; +} diff --git a/frameworks/Rust/hyperlane/src/router.rs b/frameworks/Rust/hyperlane/src/router.rs new file mode 100644 index 00000000000..2d6720adca8 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/router.rs @@ -0,0 +1,43 @@ +use crate::*; + +pub async fn json(controller_data: ControllerData) { + let json: serde_json::Value = json!({ + "message": RESPONSEDATA + }); + let _ = controller_data + .set_response_body(serde_json::to_string(&json).unwrap_or_default()) + .await; +} + +pub async fn plaintext(controller_data: ControllerData) { + let _ = controller_data + .set_request_header(CONTENT_TYPE, TEXT_PLAIN) + .await + .set_response_body(RESPONSEDATA) + .await; +} + +pub async fn db(controller_data: ControllerData) { + let query_row: QueryRow = random_world_row().await.unwrap(); + let _ = controller_data + .set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) + .await; +} + +pub async fn queries(controller_data: ControllerData) { + let queries: Queries = controller_data + .get_request_query("queries") + .await + .map(|queries| queries.parse::().unwrap_or_default()) + .unwrap_or(0) + .min(ROW_LIMIT as usize); + let mut data: Vec = Vec::with_capacity(queries); + for _ in 0..queries { + let _ = random_world_row().await.map(|row| { + data.push(row); + }); + } + let _ = controller_data + .set_response_body(serde_json::to_string(&data).unwrap_or_default()) + .await; +} diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs new file mode 100644 index 00000000000..71c677865a4 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -0,0 +1,18 @@ +use crate::*; + +pub async fn run_server() { + let mut server: Server = Server::new(); + server.host("0.0.0.0").await; + server.port(60000).await; + server.log_dir("./logs").await; + server.log_interval_millis(1_000_000_000).await; + server.disable_print().await; + server.router("/json", json).await; + server.router("/plaintext", plaintext).await; + server.router("/db", db).await; + server.router("/queries", queries).await; + server.request_middleware(request).await; + server.response_middleware(response).await; + println_success!("server initialization completed"); + server.listen().await; +} diff --git a/frameworks/Rust/hyperlane/src/type.rs b/frameworks/Rust/hyperlane/src/type.rs new file mode 100644 index 00000000000..27ba8888181 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/type.rs @@ -0,0 +1,6 @@ +use crate::*; + +pub type DbPoolConnection = bb8::Pool>; +pub type DbConnection<'a> = PooledConnection<'a, PostgresConnectionManager>; +pub type QueryRow = (i32, i32); +pub type Queries = usize; diff --git a/frameworks/Rust/hyperlane/templates/fortune.hbs b/frameworks/Rust/hyperlane/templates/fortune.hbs new file mode 100644 index 00000000000..b9e25a52a8e --- /dev/null +++ b/frameworks/Rust/hyperlane/templates/fortune.hbs @@ -0,0 +1,5 @@ +Fortunes + {{~# each fortunes ~}} + + {{~/each ~}} +
      idmessage
      {{id}}{{message}}
      From 3ffe77cf33200c70cfb4c99a07f5ea1a78eddd82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 11 Mar 2025 09:02:33 +0800 Subject: [PATCH 1210/1766] feat: v4.30.0 --- frameworks/Rust/hyperlane/Cargo.lock | 8 ++++---- frameworks/Rust/hyperlane/Cargo.toml | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 40ae1f7c6c8..c0035ea4d9a 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -471,9 +471,9 @@ checksum = "ce9eb07f0cbd4a9832e9c5158a08bcfbcea832c3a69d0872c31f1a2be0f92f26" [[package]] name = "http-type" -version = "3.20.2" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bdf14cea97c9fd74e3e4cac42d9659beaf583e0233cec0ea30bfb17c0648c9" +checksum = "66532d9dfd4e12d5b04efb888dada57deedbdc521a84c777caaa15d4cb1f6536" dependencies = [ "hex", "http-compress", @@ -489,9 +489,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.29.0" +version = "4.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a738f244c96d7c30150d53a9a78a90abb8126696f82c9c2a29582a204ae2a1a8" +checksum = "1ec04344054243f2d53b32f621d3b600b16682c1d92db140a63b8f497590b108" dependencies = [ "async-func", "clonelicious", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 2e1bc683076..c86f83f3bd5 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.29.0" +hyperlane = "4.30.0" bb8 = "0.9.0" bb8-postgres = "0.9.0" rand = "0.9.0" @@ -32,7 +32,6 @@ panic = "unwind" debug = false codegen-units = 1 strip = "debuginfo" -backtrace = "off" [profile.release] incremental = false @@ -41,5 +40,4 @@ lto = true panic = "unwind" debug = false codegen-units = 1 -strip = "debuginfo" -backtrace = "off" +strip = "debuginfo" \ No newline at end of file From 2042ab82ae5c5417fbdfb15468db67f74deeb9fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 02:43:53 +0000 Subject: [PATCH 1211/1766] Bump rack from 2.2.12 to 2.2.13 in /frameworks/Ruby/rage-sequel Bumps [rack](https://github.com/rack/rack) from 2.2.12 to 2.2.13. - [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/v2.2.12...v2.2.13) --- updated-dependencies: - dependency-name: rack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rage-sequel/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index 251d9c3b3b5..0bb226b818b 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -3,7 +3,7 @@ GEM specs: bigdecimal (3.1.9) pg (1.5.9) - rack (2.2.12) + rack (2.2.13) rack-test (2.2.0) rack (>= 1.3) rage-iodine (4.0.0) From 4336b65e5d426775aeb71fba42f39bd77b85377d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 11 Mar 2025 12:01:12 +0800 Subject: [PATCH 1212/1766] feat: v4.31.0 --- frameworks/Rust/hyperlane/Cargo.lock | 60 +++++++++---------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/src/main.rs | 4 +- .../hyperlane/src/{router.rs => route.rs} | 0 frameworks/Rust/hyperlane/src/server.rs | 8 +-- 5 files changed, 37 insertions(+), 37 deletions(-) rename frameworks/Rust/hyperlane/src/{router.rs => route.rs} (100%) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index c0035ea4d9a..18453c63fb4 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -52,9 +52,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "async-func" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80066a41906f85b9ac479cbbd2abcb783438834c1660a34bf646ed8abf6b626f" +checksum = "8882ceb09bc57f9b7a52d48cffab866310aeeb6a5aa1c9420640e7689660c9ee" dependencies = [ "tokio", ] @@ -181,15 +181,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clonelicious" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244a99ea51161852985586dad04aa54843497a09331a686484b423ebd9ff4de0" +checksum = "2c61986b9f0347d401ef41468e7aadba2ab6dfc2547df1862f2563250fbfa8d3" [[package]] name = "color-output" -version = "6.4.2" +version = "6.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a18fb944ff5f0dcc0b549868e17bcd638a6d1d9554030b986de29b6aab097d" +checksum = "dc537d9d2e7e15fa40da2a6a451afedea17808a63f8339863e3a6b5ae93db596" dependencies = [ "hyperlane-time", ] @@ -252,9 +252,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "file-operation" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b795bb8a0d08dd1b6d6e2b02b83584e26dceb7016b9a57e438a5946530136e9" +checksum = "eaba2fa080e689c4ec9a0666c5b7eb074182fdba13a34e97b19b56ac2a855556" dependencies = [ "tokio", ] @@ -454,9 +454,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.3.3" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca94f46c998f0d44d7fe82aeaf3edcc689027624d5e1da3e957a0943d2b0f897" +checksum = "8646f4e10f8fc48d8f2a595e6ef303189e49e386d6863d771f028c969f0c5e42" dependencies = [ "brotli", "flate2", @@ -465,15 +465,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.33.0" +version = "1.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9eb07f0cbd4a9832e9c5158a08bcfbcea832c3a69d0872c31f1a2be0f92f26" +checksum = "3a3567340a02df4ec03fa5475e2b273aa183d875b3bf09674403407aadda1cd1" [[package]] name = "http-type" -version = "3.21.0" +version = "3.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66532d9dfd4e12d5b04efb888dada57deedbdc521a84c777caaa15d4cb1f6536" +checksum = "a4f21786d19bad67be1eb85b528e65722d44812d6e9bed878147f767573a2586" dependencies = [ "hex", "http-compress", @@ -489,9 +489,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.30.0" +version = "4.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec04344054243f2d53b32f621d3b600b16682c1d92db140a63b8f497590b108" +checksum = "1614d327866798839bf4632acb7aa8268ebfa2b58d9d60378f1d17def4cf6b35" dependencies = [ "async-func", "clonelicious", @@ -515,9 +515,9 @@ dependencies = [ [[package]] name = "hyperlane-log" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a05a669263f0021812ae483d83a25e7d08e6032222844338abaa3a377f1a97a1" +checksum = "acf652414e2c385beb37c36341ae91f6eb686062f3cfff6c0cff8526deafbb65" dependencies = [ "file-operation", "hyperlane-time", @@ -528,9 +528,9 @@ dependencies = [ [[package]] name = "hyperlane-time" -version = "0.0.7" +version = "0.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3560ff2c528d3fd9ba75e9f47096452a96fc2ae0cff838de71f8d2a8c80eb0bb" +checksum = "11dcc4ca08d1ebfc1f70e7a40033483219f77909a7ef6c4af302a14aa97da3d2" [[package]] name = "hyperlane_techempower" @@ -728,9 +728,9 @@ checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "lombok-macros" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c093f50f1ac912704228373ec7c7b9e5c927bb37e7c37a8f3d3a53aad2249425" +checksum = "ebe4fc0110b8bdb29b2423a2be59fa7b9b3e0e1b225553514895564420887bc5" dependencies = [ "proc-macro2", "quote", @@ -945,9 +945,9 @@ dependencies = [ [[package]] name = "recoverable-spawn" -version = "3.4.2" +version = "3.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa0209879a97de8df4ebe358164997474a2f4a02b82fd78615aea5dedb17d3c" +checksum = "d5081593fb6a36af3e9ca8c4f23735f9d454a252cba0629509baa3947983846d" dependencies = [ "once_cell", "tokio", @@ -955,9 +955,9 @@ dependencies = [ [[package]] name = "recoverable-thread-pool" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd78e4575ff1cd61ffa4e6b65453407efeb396a136d8764edbf1740df8bbdfd" +checksum = "4190261c8a4823ceaf4b9cd68bf28deca98aa5697d2e1ec66e8053dac2a817fa" dependencies = [ "lombok-macros", "recoverable-spawn", @@ -1068,9 +1068,9 @@ dependencies = [ [[package]] name = "server-manager" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2b61180a976cb1097c8303666ab2af07af6613ef9b519b56e2cce5c94c4263" +checksum = "5144bc130554928fb304af2e7590742db173a40f82672613dc293f7567e8730e" dependencies = [ "tokio", ] @@ -1155,9 +1155,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "std-macro-extensions" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f59f08a01eaad5163433e41c5c36db1f6d3a66abda4e501dbf554d7e390cfc9" +checksum = "5b44c771c1591df90e3b49f618362dc1c431a8df6a7a6cc69dbe00757b158522" [[package]] name = "stringprep" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index c86f83f3bd5..990a745486c 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.30.0" +hyperlane = "4.31.0" bb8 = "0.9.0" bb8-postgres = "0.9.0" rand = "0.9.0" diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index 0b95175e074..a9c4db50d26 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -3,7 +3,7 @@ pub(crate) mod db; pub(crate) mod lazy; pub(crate) mod request_middleware; pub(crate) mod response_middleware; -pub(crate) mod router; +pub(crate) mod route; pub(crate) mod server; pub(crate) mod r#type; @@ -22,7 +22,7 @@ pub(crate) use r#type::*; pub(crate) use rand::Rng; pub(crate) use request_middleware::*; pub(crate) use response_middleware::*; -pub(crate) use router::*; +pub(crate) use route::*; pub(crate) use server::*; pub(crate) use std::{io, sync::Arc}; pub(crate) use tokio_postgres::{Config, NoTls, Row, Statement}; diff --git a/frameworks/Rust/hyperlane/src/router.rs b/frameworks/Rust/hyperlane/src/route.rs similarity index 100% rename from frameworks/Rust/hyperlane/src/router.rs rename to frameworks/Rust/hyperlane/src/route.rs diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 71c677865a4..4c7c0aebe80 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -7,10 +7,10 @@ pub async fn run_server() { server.log_dir("./logs").await; server.log_interval_millis(1_000_000_000).await; server.disable_print().await; - server.router("/json", json).await; - server.router("/plaintext", plaintext).await; - server.router("/db", db).await; - server.router("/queries", queries).await; + server.route("/json", json).await; + server.route("/plaintext", plaintext).await; + server.route("/db", db).await; + server.route("/queries", queries).await; server.request_middleware(request).await; server.response_middleware(response).await; println_success!("server initialization completed"); From 191506f42db0193010c3d7db1279f2dc5d24f5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 11 Mar 2025 13:21:06 +0800 Subject: [PATCH 1213/1766] docs: readme --- frameworks/Rust/hyperlane/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index e0856bbd64c..a309b5d1d28 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -11,6 +11,14 @@ PostgreSQL. - url: postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - tfb-database read from env DBHOST +## Docker file + +```sh +docker build -t hyperlane_techempower -f hyperlane.dockerfile .; +# Replace DBHOST with the database host address +docker run --name hyperlane_techempower --network=host -e DBHOST=127.0.0.1 -d hyperlane_techempower; +``` + ## Test URLs ### Test 1: JSON Encoding From cfc23141ce1aec9e13e563c1ca30030d1c899d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 11 Mar 2025 13:44:31 +0800 Subject: [PATCH 1214/1766] docs: readme --- frameworks/Rust/hyperlane/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index a309b5d1d28..962ee9f484c 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -16,7 +16,7 @@ PostgreSQL. ```sh docker build -t hyperlane_techempower -f hyperlane.dockerfile .; # Replace DBHOST with the database host address -docker run --name hyperlane_techempower --network=host -e DBHOST=127.0.0.1 -d hyperlane_techempower; +docker run --name hyperlane_techempower --ulimit nofile=1024000:1024000 --network=host -e DBHOST=127.0.0.1 -d hyperlane_techempower; ``` ## Test URLs From 2b94d194745f854c36de73c2831fa971f610a324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 11 Mar 2025 20:49:10 +0800 Subject: [PATCH 1215/1766] feat: change port & dockerfile --- frameworks/Rust/hyperlane/README.md | 18 +++++++--------- .../Rust/hyperlane/benchmark_config.json | 4 ++-- frameworks/Rust/hyperlane/config.toml | 4 +--- .../Rust/hyperlane/hyperlane.dockerfile | 4 ++-- frameworks/Rust/hyperlane/src/db.rs | 21 +++++++++---------- frameworks/Rust/hyperlane/src/route.rs | 2 +- frameworks/Rust/hyperlane/src/server.rs | 2 +- 7 files changed, 25 insertions(+), 30 deletions(-) diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index 962ee9f484c..1b544fbc38b 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -8,31 +8,29 @@ Hyperlane is a lightweight and high-performance Rust HTTP server library designe PostgreSQL. -- url: postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world -- tfb-database read from env DBHOST - -## Docker file +## Dev shell for me ```sh +docker network create tfb-network; +docker run --rm -d --name tfb-database --network tfb-network -e POSTGRES_USER=benchmarkdbuser -e POSTGRES_PASSWORD=benchmarkdbpass -e POSTGRES_DB=hello_world postgres:latest; docker build -t hyperlane_techempower -f hyperlane.dockerfile .; -# Replace DBHOST with the database host address -docker run --name hyperlane_techempower --ulimit nofile=1024000:1024000 --network=host -e DBHOST=127.0.0.1 -d hyperlane_techempower; +docker run --rm --network tfb-network hyperlane_techempower; ``` ## Test URLs ### Test 1: JSON Encoding - http://localhost:60000/json + http://localhost:8080/json ### Test 2: Single Row Query - http://localhost:60000/db + http://localhost:8080/db ### Test 3: Multi Row Query - http://localhost:60000/queries?queries=20 + http://localhost:8080/queries?q=20 ### Test 4: Plaintext - http://localhost:60000/plaintext + http://localhost:8080/plaintext diff --git a/frameworks/Rust/hyperlane/benchmark_config.json b/frameworks/Rust/hyperlane/benchmark_config.json index eaaed427531..77d9399a10e 100644 --- a/frameworks/Rust/hyperlane/benchmark_config.json +++ b/frameworks/Rust/hyperlane/benchmark_config.json @@ -6,8 +6,8 @@ "json_url": "/json", "plaintext_url": "/plaintext", "db_url": "/db", - "query_url": "/queries?queries=", - "port": 60000, + "query_url": "/queries?q=", + "port": 8080, "approach": "Realistic", "classification": "Micro", "database": "Postgres", diff --git a/frameworks/Rust/hyperlane/config.toml b/frameworks/Rust/hyperlane/config.toml index 7e47fcc26b8..3871bc56afe 100644 --- a/frameworks/Rust/hyperlane/config.toml +++ b/frameworks/Rust/hyperlane/config.toml @@ -5,9 +5,7 @@ name = "hyperlane" urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" +urls.query = "/queries?q=" approach = "Realistic" classification = "Micro" database = "Postgres" diff --git a/frameworks/Rust/hyperlane/hyperlane.dockerfile b/frameworks/Rust/hyperlane/hyperlane.dockerfile index a2b07066ae0..480553c8c7a 100644 --- a/frameworks/Rust/hyperlane/hyperlane.dockerfile +++ b/frameworks/Rust/hyperlane/hyperlane.dockerfile @@ -1,6 +1,6 @@ FROM rust:1.85 -RUN apt-get update -yqq && apt-get install -yqq cmake g++ +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world ADD ./ /hyperlane_techempower WORKDIR /hyperlane_techempower @@ -8,6 +8,6 @@ WORKDIR /hyperlane_techempower RUN cargo clean RUN RUSTFLAGS="-C target-cpu=native" cargo build --release -EXPOSE 60000 +EXPOSE 8080 CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index b86896f797d..43154be5877 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -87,19 +87,18 @@ pub async fn insert_records() { } pub async fn init_db() { - let dbhost: &str = match option_env!("DBHOST") { + let db_url: &str = match option_env!("POSTGRES_URL") { Some(it) => it, - _ => DATABASE_HOST, + _ => &format!( + "{}://{}:{}@{}:{}/{}", + DATABASE_TYPE, + DATABASE_USER_NAME, + DATABASE_USER_PASSWORD, + DATABASE_HOST, + DATABASE_PORT, + DATABASE_NAME + ), }; - let db_url: String = format!( - "{}://{}:{}@{}:{}/{}", - DATABASE_TYPE, - DATABASE_USER_NAME, - DATABASE_USER_PASSWORD, - dbhost, - DATABASE_PORT, - DATABASE_NAME - ); println_warning!("db url: ", db_url); let config: Config = db_url.parse::().unwrap(); let db_manager: PostgresConnectionManager = diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 2d6720adca8..39934ad698e 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -26,7 +26,7 @@ pub async fn db(controller_data: ControllerData) { pub async fn queries(controller_data: ControllerData) { let queries: Queries = controller_data - .get_request_query("queries") + .get_request_query("q") .await .map(|queries| queries.parse::().unwrap_or_default()) .unwrap_or(0) diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 4c7c0aebe80..7042eab442b 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -3,7 +3,7 @@ use crate::*; pub async fn run_server() { let mut server: Server = Server::new(); server.host("0.0.0.0").await; - server.port(60000).await; + server.port(8080).await; server.log_dir("./logs").await; server.log_interval_millis(1_000_000_000).await; server.disable_print().await; From 238676de5c7d69029a65b2db58652e3ac244a4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 22:08:51 +0800 Subject: [PATCH 1216/1766] docs: readme --- frameworks/Rust/hyperlane/README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index 1b544fbc38b..3d399671575 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -8,15 +8,6 @@ Hyperlane is a lightweight and high-performance Rust HTTP server library designe PostgreSQL. -## Dev shell for me - -```sh -docker network create tfb-network; -docker run --rm -d --name tfb-database --network tfb-network -e POSTGRES_USER=benchmarkdbuser -e POSTGRES_PASSWORD=benchmarkdbpass -e POSTGRES_DB=hello_world postgres:latest; -docker build -t hyperlane_techempower -f hyperlane.dockerfile .; -docker run --rm --network tfb-network hyperlane_techempower; -``` - ## Test URLs ### Test 1: JSON Encoding From 68d75087ad918e1f031019ac59543fa14f077551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 22:15:11 +0800 Subject: [PATCH 1217/1766] feat: json --- frameworks/Rust/hyperlane/benchmark_config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Rust/hyperlane/benchmark_config.json b/frameworks/Rust/hyperlane/benchmark_config.json index 77d9399a10e..b52090969ec 100644 --- a/frameworks/Rust/hyperlane/benchmark_config.json +++ b/frameworks/Rust/hyperlane/benchmark_config.json @@ -3,6 +3,7 @@ "tests": [ { "default": { + "dockerfile": "hyperlane.dockerfile", "json_url": "/json", "plaintext_url": "/plaintext", "db_url": "/db", From 70ff13752ada2e0cf53d52892bbfdd575fa260c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 22:21:52 +0800 Subject: [PATCH 1218/1766] feat: server header --- frameworks/Rust/hyperlane/src/constant.rs | 1 + frameworks/Rust/hyperlane/src/request_middleware.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/frameworks/Rust/hyperlane/src/constant.rs b/frameworks/Rust/hyperlane/src/constant.rs index 2b988574a6c..adc58ac641e 100644 --- a/frameworks/Rust/hyperlane/src/constant.rs +++ b/frameworks/Rust/hyperlane/src/constant.rs @@ -7,3 +7,4 @@ pub static DATABASE_PORT: usize = 5432; pub static DATABASE_NAME: &str = "hello_world"; pub static TABLE_NAME: &str = "World"; pub static ROW_LIMIT: i32 = 500; +pub static HYPERLANE: &str = "hyperlane"; diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index dfb39aac42b..082064b9677 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -6,6 +6,8 @@ pub async fn request(controller_data: ControllerData) { .await .set_request_header(CONTENT_TYPE, APPLICATION_JSON) .await + .set_response_header(SERVER, HYPERLANE) + .await .set_response_status_code(200) .await; } From 3af01a5fafea1d46c7d2aa8737929d60c9993435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 22:38:36 +0800 Subject: [PATCH 1219/1766] feat: server header --- frameworks/Rust/hyperlane/Cargo.lock | 96 +++++++++++++++++++ frameworks/Rust/hyperlane/Cargo.toml | 3 +- frameworks/Rust/hyperlane/src/main.rs | 4 + .../Rust/hyperlane/src/request_middleware.rs | 7 +- frameworks/Rust/hyperlane/src/utils.rs | 6 ++ 5 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 frameworks/Rust/hyperlane/src/utils.rs diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 18453c63fb4..cbaad21c00d 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -50,6 +50,21 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "async-func" version = "0.1.8" @@ -173,12 +188,35 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cc" +version = "1.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "clonelicious" version = "1.0.5" @@ -194,6 +232,12 @@ dependencies = [ "hyperlane-time", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -538,11 +582,35 @@ version = "0.0.1" dependencies = [ "bb8", "bb8-postgres", + "chrono", "hyperlane", "rand", "tokio-postgres", ] +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "1.5.0" @@ -998,6 +1066,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + [[package]] name = "ryu" version = "1.0.20" @@ -1086,6 +1160,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1420,6 +1500,7 @@ checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] @@ -1490,6 +1571,21 @@ dependencies = [ "web-sys", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 990a745486c..80213077272 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -23,6 +23,7 @@ bb8 = "0.9.0" bb8-postgres = "0.9.0" rand = "0.9.0" tokio-postgres = { version = "0.7.13", features = ["with-uuid-0_8"] } +chrono = "0.4.40" [profile.dev] incremental = false @@ -40,4 +41,4 @@ lto = true panic = "unwind" debug = false codegen-units = 1 -strip = "debuginfo" \ No newline at end of file +strip = "debuginfo" diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index a9c4db50d26..bf8532ab9d4 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -6,9 +6,11 @@ pub(crate) mod response_middleware; pub(crate) mod route; pub(crate) mod server; pub(crate) mod r#type; +pub(crate) mod utils; pub(crate) use bb8::{Pool, PooledConnection}; pub(crate) use bb8_postgres::PostgresConnectionManager; +pub(crate) use chrono::{DateTime, Utc}; pub(crate) use constant::*; pub(crate) use db::*; pub(crate) use hyperlane::{ @@ -24,8 +26,10 @@ pub(crate) use request_middleware::*; pub(crate) use response_middleware::*; pub(crate) use route::*; pub(crate) use server::*; +pub(crate) use std::time::SystemTime; pub(crate) use std::{io, sync::Arc}; pub(crate) use tokio_postgres::{Config, NoTls, Row, Statement}; +pub(crate) use utils::*; #[tokio::main] async fn main() { diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 082064b9677..8d267a63caf 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -4,10 +4,15 @@ pub async fn request(controller_data: ControllerData) { let _ = controller_data .set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) .await - .set_request_header(CONTENT_TYPE, APPLICATION_JSON) + .set_request_header( + CONTENT_TYPE, + format!("{}; {}", APPLICATION_JSON, CHARSET_UTF_8), + ) .await .set_response_header(SERVER, HYPERLANE) .await + .set_response_header(DATE, generate_rfc1123_timestamp()) + .await .set_response_status_code(200) .await; } diff --git a/frameworks/Rust/hyperlane/src/utils.rs b/frameworks/Rust/hyperlane/src/utils.rs new file mode 100644 index 00000000000..c189f0be8db --- /dev/null +++ b/frameworks/Rust/hyperlane/src/utils.rs @@ -0,0 +1,6 @@ +use crate::*; + +pub fn generate_rfc1123_timestamp() -> String { + let now: DateTime = SystemTime::now().into(); + now.format("%a, %d %b %Y %H:%M:%S GMT").to_string() +} From 5d5a3d450ebd650cad211cf744b2b6c01e79bc24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 22:57:01 +0800 Subject: [PATCH 1220/1766] feat: server header --- frameworks/Rust/hyperlane/Cargo.lock | 1 + frameworks/Rust/hyperlane/Cargo.toml | 1 + frameworks/Rust/hyperlane/src/db.rs | 4 ++-- frameworks/Rust/hyperlane/src/main.rs | 2 ++ frameworks/Rust/hyperlane/src/type.rs | 17 ++++++++++++++++- 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index cbaad21c00d..4411e3db8db 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -585,6 +585,7 @@ dependencies = [ "chrono", "hyperlane", "rand", + "serde", "tokio-postgres", ] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 80213077272..34c952876a7 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -24,6 +24,7 @@ bb8-postgres = "0.9.0" rand = "0.9.0" tokio-postgres = { version = "0.7.13", features = ["with-uuid-0_8"] } chrono = "0.4.40" +serde = "1.0.219" [profile.dev] incremental = false diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 43154be5877..81120b548bb 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -129,7 +129,7 @@ pub async fn random_world_row() -> Result> if let Some(rows) = connection.query_opt(&stmt, &[&random_id]).await? { let id: i32 = rows.get(0); let random_number: i32 = rows.get(1); - return Ok((id, random_number)); + return Ok(QueryRow::new(id, random_number)); } - return Ok((0, 0)); + return Ok(QueryRow::new(0, 0)); } diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index bf8532ab9d4..d0145b343da 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -15,6 +15,7 @@ pub(crate) use constant::*; pub(crate) use db::*; pub(crate) use hyperlane::{ once_cell::sync::Lazy, + serde::*, serde_json::json, tokio::sync::{RwLock, RwLockWriteGuard}, *, @@ -25,6 +26,7 @@ pub(crate) use rand::Rng; pub(crate) use request_middleware::*; pub(crate) use response_middleware::*; pub(crate) use route::*; + pub(crate) use server::*; pub(crate) use std::time::SystemTime; pub(crate) use std::{io, sync::Arc}; diff --git a/frameworks/Rust/hyperlane/src/type.rs b/frameworks/Rust/hyperlane/src/type.rs index 27ba8888181..5e524ede2e9 100644 --- a/frameworks/Rust/hyperlane/src/type.rs +++ b/frameworks/Rust/hyperlane/src/type.rs @@ -2,5 +2,20 @@ use crate::*; pub type DbPoolConnection = bb8::Pool>; pub type DbConnection<'a> = PooledConnection<'a, PostgresConnectionManager>; -pub type QueryRow = (i32, i32); pub type Queries = usize; + +#[allow(bad_style)] +#[derive(Serialize)] +pub struct QueryRow { + id: i32, + randomNumber: i32, +} + +impl QueryRow { + pub fn new(id: i32, random_number: i32) -> Self { + Self { + id: id, + randomNumber: random_number, + } + } +} From f380b8bb34ff12e923b6f5076c27831c89811767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 23:08:25 +0800 Subject: [PATCH 1221/1766] feat: server header --- frameworks/Rust/hyperlane/src/request_middleware.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 8d267a63caf..b1ffc0fd2fa 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -4,7 +4,7 @@ pub async fn request(controller_data: ControllerData) { let _ = controller_data .set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) .await - .set_request_header( + .set_response_header( CONTENT_TYPE, format!("{}; {}", APPLICATION_JSON, CHARSET_UTF_8), ) From a5f0c86c4c18ddd7f1f1bf89aed9c4df57ec7522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 23:12:55 +0800 Subject: [PATCH 1222/1766] feat: response header --- frameworks/Rust/hyperlane/src/route.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 39934ad698e..36d2aa1c153 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -11,7 +11,7 @@ pub async fn json(controller_data: ControllerData) { pub async fn plaintext(controller_data: ControllerData) { let _ = controller_data - .set_request_header(CONTENT_TYPE, TEXT_PLAIN) + .set_response_header(CONTENT_TYPE, TEXT_PLAIN) .await .set_response_body(RESPONSEDATA) .await; @@ -29,7 +29,7 @@ pub async fn queries(controller_data: ControllerData) { .get_request_query("q") .await .map(|queries| queries.parse::().unwrap_or_default()) - .unwrap_or(0) + .unwrap_or(1) .min(ROW_LIMIT as usize); let mut data: Vec = Vec::with_capacity(queries); for _ in 0..queries { From b9413e36c8e18ac6909e2ab5e169adf7365c280f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 23:20:19 +0800 Subject: [PATCH 1223/1766] feat: error use 1 --- frameworks/Rust/hyperlane/src/route.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 36d2aa1c153..c43a4c1fa1e 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -28,7 +28,7 @@ pub async fn queries(controller_data: ControllerData) { let queries: Queries = controller_data .get_request_query("q") .await - .map(|queries| queries.parse::().unwrap_or_default()) + .and_then(|queries| queries.parse::().ok()) .unwrap_or(1) .min(ROW_LIMIT as usize); let mut data: Vec = Vec::with_capacity(queries); From 569004285eeca0ae59d64cb7457fed81047e7c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Mar 2025 23:24:08 +0800 Subject: [PATCH 1224/1766] feat: error use 1 --- frameworks/Rust/hyperlane/src/route.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index c43a4c1fa1e..fce11dbc1ca 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -29,8 +29,9 @@ pub async fn queries(controller_data: ControllerData) { .get_request_query("q") .await .and_then(|queries| queries.parse::().ok()) - .unwrap_or(1) - .min(ROW_LIMIT as usize); + .unwrap_or_default() + .min(ROW_LIMIT as usize) + .max(1); let mut data: Vec = Vec::with_capacity(queries); for _ in 0..queries { let _ = random_world_row().await.map(|row| { From 31ffe2933dbec50490e18953507ecae136d486be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 16:01:32 +0000 Subject: [PATCH 1225/1766] Bump json from 2.10.1 to 2.10.2 in /frameworks/Ruby/rack Bumps [json](https://github.com/ruby/json) from 2.10.1 to 2.10.2. - [Release notes](https://github.com/ruby/json/releases) - [Changelog](https://github.com/ruby/json/blob/master/CHANGES.md) - [Commits](https://github.com/ruby/json/compare/v2.10.1...v2.10.2) --- updated-dependencies: - dependency-name: json dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rack/Gemfile | 2 +- frameworks/Ruby/rack/Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index 67c29718242..c1288cb2cda 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -5,7 +5,7 @@ source 'https://rubygems.org' gem 'rack', '~> 3.0' gem 'connection_pool', '~> 2.4' gem 'jdbc-postgres', '~> 42.2', platforms: :jruby, require: 'jdbc/postgres' -gem 'json', '~> 2.8' +gem 'json', '~> 2.10' gem 'pg', '~> 1.5', platforms: %i[ruby mswin] gem 'sequel' gem 'sequel_pg', platforms: %i[ruby mswin] diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index ad4ae67371c..66efa44e788 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -60,7 +60,7 @@ GEM io-event (1.9.0) io-stream (0.6.1) iodine (0.7.58) - json (2.10.1) + json (2.10.2) kgio (2.11.4) language_server-protocol (3.17.0.4) lint_roller (1.1.0) @@ -137,7 +137,7 @@ DEPENDENCIES falcon (~> 0.47) iodine (~> 0.7) jdbc-postgres (~> 42.2) - json (~> 2.8) + json (~> 2.10) pg (~> 1.5) puma (~> 6.5) rack (~> 3.0) From d5f67f5568021c9d6e41a1ef2ae0ec9bf08abe05 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Wed, 12 Mar 2025 12:41:16 -0400 Subject: [PATCH 1226/1766] Lazily prepare statements to reduce connection time. Signed-off-by: Santiago Pericas-Geertsen --- .../nima/models/PgClientConnection.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java index 9526fdce533..956a5ef1ba1 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnection.java @@ -1,8 +1,12 @@ package io.helidon.benchmark.nima.models; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + 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; @@ -11,9 +15,9 @@ public class PgClientConnection implements AutoCloseable { private static String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; private static String SELECT_FORTUNE = "SELECT * from FORTUNE"; - private PreparedQuery> worldQuery; - private PreparedQuery> fortuneQuery; - private PreparedQuery>[] updateQuery; + private CompletableFuture worldQuery; + private CompletableFuture fortuneQuery; + private CompletableFuture[] updateQuery; private final PgConnection conn; @@ -30,30 +34,28 @@ public void close() { conn.close(); } - public PreparedQuery> worldQuery() { - return worldQuery; + public PreparedQuery> worldQuery() throws ExecutionException, InterruptedException { + return worldQuery.get().query(); } - public PreparedQuery> fortuneQuery() { - return fortuneQuery; + public PreparedQuery> fortuneQuery() throws ExecutionException, InterruptedException { + return fortuneQuery.get().query(); } - public PreparedQuery> updateQuery(int queryCount) { - return updateQuery[queryCount - 1]; + public PreparedQuery> updateQuery(int queryCount) throws ExecutionException, InterruptedException { + return updateQuery[queryCount - 1].get().query(); } @SuppressWarnings("unchecked") void prepare() { try { - worldQuery = conn.prepare(SELECT_WORLD) - .toCompletionStage().toCompletableFuture().get().query(); - fortuneQuery = conn.prepare(SELECT_FORTUNE) - .toCompletionStage().toCompletableFuture().get().query(); - updateQuery = (PreparedQuery>[]) new PreparedQuery[UPDATE_QUERIES]; + worldQuery = conn.prepare(SELECT_WORLD).toCompletionStage().toCompletableFuture(); + fortuneQuery = conn.prepare(SELECT_FORTUNE).toCompletionStage().toCompletableFuture(); + updateQuery = (CompletableFuture[]) new CompletableFuture[UPDATE_QUERIES]; for (int i = 0; i < UPDATE_QUERIES; i++) { updateQuery[i] = conn.prepare(singleUpdate(i + 1)) - .toCompletionStage().toCompletableFuture().get().query(); - } + .toCompletionStage().toCompletableFuture(); + } } catch (Exception e) { throw new RuntimeException(e); } From 1f8ad7044b95a2cc98dffd5c3acf1def02d35512 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Wed, 12 Mar 2025 14:53:04 -0400 Subject: [PATCH 1227/1766] New locking strategy. Signed-off-by: Santiago Pericas-Geertsen --- .../models/PgClientConnectionPoolArray.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java index 2d142dd13d3..5469941c44c 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientConnectionPoolArray.java @@ -1,7 +1,8 @@ package io.helidon.benchmark.nima.models; -import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Logger; import io.helidon.config.Config; @@ -13,7 +14,7 @@ class PgClientConnectionPoolArray extends PgClientConnectionPool { private final int connections; private final PgClientConnection[] connectionArray; - private final ReentrantLock lock = new ReentrantLock(); + private final ReadWriteLock lock = new ReentrantReadWriteLock(); PgClientConnectionPoolArray(Vertx vertx, PgConnectOptions options, Config config) { super(vertx, options, config); @@ -29,20 +30,23 @@ class PgClientConnectionPoolArray extends PgClientConnectionPool { @Override public PgClientConnection clientConnection() { int index = Thread.currentThread().hashCode() % connections; - PgClientConnection connection = connectionArray[index]; - if (connection == null) { - try { - lock.lock(); - connection = connectionArray[index]; - if (connection == null) { - connection = newConnection(); - connectionArray[index] = connection; + if (connectionArray[index] == null) { + lock.readLock().lock(); + if (connectionArray[index] == null) { + lock.readLock().unlock(); + lock.writeLock().lock(); + try { + if (connectionArray[index] == null) { + connectionArray[index] = newConnection(); + } + } finally { + lock.writeLock().unlock(); } - } finally { - lock.unlock(); + } else { + lock.readLock().unlock(); } } - return connection; + return connectionArray[index]; } @Override From 15093ff8abf288af90caf179dd1631c0ed466c07 Mon Sep 17 00:00:00 2001 From: Sakib Hadziavdic Date: Thu, 13 Mar 2025 01:03:04 +0100 Subject: [PATCH 1228/1766] Add sharaf framework --- frameworks/Scala/sharaf/.mill-version | 1 + frameworks/Scala/sharaf/README.md | 43 +++ frameworks/Scala/sharaf/benchmark_config.json | 30 ++ frameworks/Scala/sharaf/build.mill | 14 + frameworks/Scala/sharaf/mill | 265 ++++++++++++++++++ frameworks/Scala/sharaf/sharaf.dockerfile | 14 + frameworks/Scala/sharaf/src/db.scala | 52 ++++ frameworks/Scala/sharaf/src/main.scala | 22 ++ frameworks/Scala/sharaf/src/pages.scala | 21 ++ frameworks/Scala/sharaf/src/routes.scala | 59 ++++ 10 files changed, 521 insertions(+) create mode 100644 frameworks/Scala/sharaf/.mill-version create mode 100644 frameworks/Scala/sharaf/README.md create mode 100644 frameworks/Scala/sharaf/benchmark_config.json create mode 100644 frameworks/Scala/sharaf/build.mill create mode 100644 frameworks/Scala/sharaf/mill create mode 100644 frameworks/Scala/sharaf/sharaf.dockerfile create mode 100644 frameworks/Scala/sharaf/src/db.scala create mode 100644 frameworks/Scala/sharaf/src/main.scala create mode 100644 frameworks/Scala/sharaf/src/pages.scala create mode 100644 frameworks/Scala/sharaf/src/routes.scala diff --git a/frameworks/Scala/sharaf/.mill-version b/frameworks/Scala/sharaf/.mill-version new file mode 100644 index 00000000000..1b3f5e2da8a --- /dev/null +++ b/frameworks/Scala/sharaf/.mill-version @@ -0,0 +1 @@ +0.12.8 \ No newline at end of file diff --git a/frameworks/Scala/sharaf/README.md b/frameworks/Scala/sharaf/README.md new file mode 100644 index 00000000000..8e9e9758908 --- /dev/null +++ b/frameworks/Scala/sharaf/README.md @@ -0,0 +1,43 @@ + +# Sharaf Benchmarking Test + +### Test Type Implementation Source Code + +* [JSON](src/routes.scala) +* [PLAINTEXT](src/routes.scala) +* [DB](src/routes.scala) +* [QUERY](src/routes.scala) +* [UPDATE](src/routes.scala) +* [FORTUNES](src/routes.scala) + +## Important Libraries +The tests were run with: +* [squery](https://sake92.github.io/squery/) for SQL +* [tupson](https://sake92.github.io/tupson/) for JSON +* [scalatags](https://com-lihaoyi.github.io/scalatags/) for HTML + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/query?queries= + + +### UPDATE + +http://localhost:8080/update?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Scala/sharaf/benchmark_config.json b/frameworks/Scala/sharaf/benchmark_config.json new file mode 100644 index 00000000000..2864f92059a --- /dev/null +++ b/frameworks/Scala/sharaf/benchmark_config.json @@ -0,0 +1,30 @@ +{ + "framework": "sharaf", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "Sharaf", + "language": "Scala", + "flavor": "None", + "orm": "Micro", + "platform": "Undertow", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Sharaf", + "notes": "", + "versus": "Undertow" + } + } + ] +} diff --git a/frameworks/Scala/sharaf/build.mill b/frameworks/Scala/sharaf/build.mill new file mode 100644 index 00000000000..be7a09e418d --- /dev/null +++ b/frameworks/Scala/sharaf/build.mill @@ -0,0 +1,14 @@ +package build + +import mill._ +import mill.scalalib._ + +object `package` extends RootModule with ScalaModule { + def scalaVersion = "3.6.2" + def ivyDeps = Agg( + ivy"ba.sake::sharaf:0.8.1", + ivy"ba.sake::squery:0.6.4", + ivy"org.postgresql:postgresql:42.6.0", + ivy"com.zaxxer:HikariCP:5.0.1" + ) +} \ No newline at end of file diff --git a/frameworks/Scala/sharaf/mill b/frameworks/Scala/sharaf/mill new file mode 100644 index 00000000000..5102f00fc92 --- /dev/null +++ b/frameworks/Scala/sharaf/mill @@ -0,0 +1,265 @@ +#!/usr/bin/env sh + +# This is a wrapper script, that automatically download mill from GitHub release pages +# You can give the required mill version with --mill-version parameter +# If no version is given, it falls back to the value of DEFAULT_MILL_VERSION +# +# Original Project page: https://github.com/lefou/millw +# Script Version: 0.4.12 +# +# If you want to improve this script, please also contribute your changes back! +# +# Licensed under the Apache License, Version 2.0 + +set -e + +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then + DEFAULT_MILL_VERSION="0.11.4" +fi + + +if [ -z "${GITHUB_RELEASE_CDN}" ] ; then + GITHUB_RELEASE_CDN="" +fi + + +MILL_REPO_URL="https://github.com/com-lihaoyi/mill" + +if [ -z "${CURL_CMD}" ] ; then + CURL_CMD=curl +fi + +# Explicit commandline argument takes precedence over all other methods +if [ "$1" = "--mill-version" ] ; then + shift + if [ "x$1" != "x" ] ; then + MILL_VERSION="$1" + shift + else + echo "You specified --mill-version without a version." 1>&2 + echo "Please provide a version that matches one provided on" 1>&2 + echo "${MILL_REPO_URL}/releases" 1>&2 + false + fi +fi + +# Please note, that if a MILL_VERSION is already set in the environment, +# We reuse it's value and skip searching for a value. + +# If not already set, read .mill-version file +if [ -z "${MILL_VERSION}" ] ; then + if [ -f ".mill-version" ] ; then + MILL_VERSION="$(tr '\r' '\n' < .mill-version | head -n 1 2> /dev/null)" + elif [ -f ".config/mill-version" ] ; then + MILL_VERSION="$(tr '\r' '\n' < .config/mill-version | head -n 1 2> /dev/null)" + fi +fi + +MILL_USER_CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/mill" + +if [ -z "${MILL_DOWNLOAD_PATH}" ] ; then + MILL_DOWNLOAD_PATH="${MILL_USER_CACHE_DIR}/download" +fi + +# If not already set, try to fetch newest from Github +if [ -z "${MILL_VERSION}" ] ; then + # TODO: try to load latest version from release page + echo "No mill version specified." 1>&2 + echo "You should provide a version via '.mill-version' file or --mill-version option." 1>&2 + + mkdir -p "${MILL_DOWNLOAD_PATH}" + LANG=C touch -d '1 hour ago' "${MILL_DOWNLOAD_PATH}/.expire_latest" 2>/dev/null || ( + # we might be on OSX or BSD which don't have -d option for touch + # but probably a -A [-][[hh]mm]SS + touch "${MILL_DOWNLOAD_PATH}/.expire_latest"; touch -A -010000 "${MILL_DOWNLOAD_PATH}/.expire_latest" + ) || ( + # in case we still failed, we retry the first touch command with the intention + # to show the (previously suppressed) error message + LANG=C touch -d '1 hour ago' "${MILL_DOWNLOAD_PATH}/.expire_latest" + ) + + # POSIX shell variant of bash's -nt operator, see https://unix.stackexchange.com/a/449744/6993 + # if [ "${MILL_DOWNLOAD_PATH}/.latest" -nt "${MILL_DOWNLOAD_PATH}/.expire_latest" ] ; then + if [ -n "$(find -L "${MILL_DOWNLOAD_PATH}/.latest" -prune -newer "${MILL_DOWNLOAD_PATH}/.expire_latest")" ]; then + # we know a current latest version + MILL_VERSION=$(head -n 1 "${MILL_DOWNLOAD_PATH}"/.latest 2> /dev/null) + fi + + if [ -z "${MILL_VERSION}" ] ; then + # we don't know a current latest version + echo "Retrieving latest mill version ..." 1>&2 + LANG=C ${CURL_CMD} -s -i -f -I ${MILL_REPO_URL}/releases/latest 2> /dev/null | grep --ignore-case Location: | sed s'/^.*tag\///' | tr -d '\r\n' > "${MILL_DOWNLOAD_PATH}/.latest" + MILL_VERSION=$(head -n 1 "${MILL_DOWNLOAD_PATH}"/.latest 2> /dev/null) + fi + + if [ -z "${MILL_VERSION}" ] ; then + # Last resort + MILL_VERSION="${DEFAULT_MILL_VERSION}" + echo "Falling back to hardcoded mill version ${MILL_VERSION}" 1>&2 + else + echo "Using mill version ${MILL_VERSION}" 1>&2 + fi +fi + +MILL_NATIVE_SUFFIX="-native" +FULL_MILL_VERSION=$MILL_VERSION +ARTIFACT_SUFFIX="" +case "$MILL_VERSION" in + *"$MILL_NATIVE_SUFFIX") + MILL_VERSION=${MILL_VERSION%"$MILL_NATIVE_SUFFIX"} + if [ "$(expr substr $(uname -s) 1 5 2>/dev/null)" = "Linux" ]; then + if [ "$(uname -m)" = "aarch64" ]; then + ARTIFACT_SUFFIX="-native-linux-aarch64" + else + ARTIFACT_SUFFIX="-native-linux-amd64" + fi + elif [ "$(uname)" = "Darwin" ]; then + if [ "$(uname -m)" = "arm64" ]; then + ARTIFACT_SUFFIX="-native-mac-aarch64" + else + ARTIFACT_SUFFIX="-native-mac-amd64" + fi + else + echo "This native mill launcher supports only Linux and macOS." 1>&2 + exit 1 + fi +esac + +MILL="${MILL_DOWNLOAD_PATH}/${FULL_MILL_VERSION}" + +try_to_use_system_mill() { + if [ "$(uname)" != "Linux" ]; then + return 0 + fi + + MILL_IN_PATH="$(command -v mill || true)" + + if [ -z "${MILL_IN_PATH}" ]; then + return 0 + fi + + SYSTEM_MILL_FIRST_TWO_BYTES=$(head --bytes=2 "${MILL_IN_PATH}") + if [ "${SYSTEM_MILL_FIRST_TWO_BYTES}" = "#!" ]; then + # MILL_IN_PATH is (very likely) a shell script and not the mill + # executable, ignore it. + return 0 + fi + + SYSTEM_MILL_PATH=$(readlink -e "${MILL_IN_PATH}") + SYSTEM_MILL_SIZE=$(stat --format=%s "${SYSTEM_MILL_PATH}") + SYSTEM_MILL_MTIME=$(stat --format=%y "${SYSTEM_MILL_PATH}") + + if [ ! -d "${MILL_USER_CACHE_DIR}" ]; then + mkdir -p "${MILL_USER_CACHE_DIR}" + fi + + SYSTEM_MILL_INFO_FILE="${MILL_USER_CACHE_DIR}/system-mill-info" + if [ -f "${SYSTEM_MILL_INFO_FILE}" ]; then + parseSystemMillInfo() { + LINE_NUMBER="${1}" + # Select the line number of the SYSTEM_MILL_INFO_FILE, cut the + # variable definition in that line in two halves and return + # the value, and finally remove the quotes. + sed -n "${LINE_NUMBER}p" "${SYSTEM_MILL_INFO_FILE}" |\ + cut -d= -f2 |\ + sed 's/"\(.*\)"/\1/' + } + + CACHED_SYSTEM_MILL_PATH=$(parseSystemMillInfo 1) + CACHED_SYSTEM_MILL_VERSION=$(parseSystemMillInfo 2) + CACHED_SYSTEM_MILL_SIZE=$(parseSystemMillInfo 3) + CACHED_SYSTEM_MILL_MTIME=$(parseSystemMillInfo 4) + + if [ "${SYSTEM_MILL_PATH}" = "${CACHED_SYSTEM_MILL_PATH}" ] \ + && [ "${SYSTEM_MILL_SIZE}" = "${CACHED_SYSTEM_MILL_SIZE}" ] \ + && [ "${SYSTEM_MILL_MTIME}" = "${CACHED_SYSTEM_MILL_MTIME}" ]; then + if [ "${CACHED_SYSTEM_MILL_VERSION}" = "${MILL_VERSION}" ]; then + MILL="${SYSTEM_MILL_PATH}" + return 0 + else + return 0 + fi + fi + fi + + SYSTEM_MILL_VERSION=$(${SYSTEM_MILL_PATH} --version | head -n1 | sed -n 's/^Mill.*version \(.*\)/\1/p') + + cat < "${SYSTEM_MILL_INFO_FILE}" +CACHED_SYSTEM_MILL_PATH="${SYSTEM_MILL_PATH}" +CACHED_SYSTEM_MILL_VERSION="${SYSTEM_MILL_VERSION}" +CACHED_SYSTEM_MILL_SIZE="${SYSTEM_MILL_SIZE}" +CACHED_SYSTEM_MILL_MTIME="${SYSTEM_MILL_MTIME}" +EOF + + if [ "${SYSTEM_MILL_VERSION}" = "${MILL_VERSION}" ]; then + MILL="${SYSTEM_MILL_PATH}" + fi +} +try_to_use_system_mill + +# If not already downloaded, download it +if [ ! -s "${MILL}" ] ; then + + # support old non-XDG download dir + MILL_OLD_DOWNLOAD_PATH="${HOME}/.mill/download" + OLD_MILL="${MILL_OLD_DOWNLOAD_PATH}/${MILL_VERSION}" + if [ -x "${OLD_MILL}" ] ; then + MILL="${OLD_MILL}" + else + case $MILL_VERSION in + 0.0.* | 0.1.* | 0.2.* | 0.3.* | 0.4.* ) + DOWNLOAD_SUFFIX="" + DOWNLOAD_FROM_MAVEN=0 + ;; + 0.5.* | 0.6.* | 0.7.* | 0.8.* | 0.9.* | 0.10.* | 0.11.0-M* ) + DOWNLOAD_SUFFIX="-assembly" + DOWNLOAD_FROM_MAVEN=0 + ;; + *) + DOWNLOAD_SUFFIX="-assembly" + DOWNLOAD_FROM_MAVEN=1 + ;; + esac + + DOWNLOAD_FILE=$(mktemp mill.XXXXXX) + + if [ "$DOWNLOAD_FROM_MAVEN" = "1" ] ; then + DOWNLOAD_URL="https://repo1.maven.org/maven2/com/lihaoyi/mill-dist${ARTIFACT_SUFFIX}/${MILL_VERSION}/mill-dist${ARTIFACT_SUFFIX}-${MILL_VERSION}.jar" + else + MILL_VERSION_TAG=$(echo "$MILL_VERSION" | sed -E 's/([^-]+)(-M[0-9]+)?(-.*)?/\1\2/') + DOWNLOAD_URL="${GITHUB_RELEASE_CDN}${MILL_REPO_URL}/releases/download/${MILL_VERSION_TAG}/${MILL_VERSION}${DOWNLOAD_SUFFIX}" + unset MILL_VERSION_TAG + fi + + # TODO: handle command not found + echo "Downloading mill ${MILL_VERSION} from ${DOWNLOAD_URL} ..." 1>&2 + ${CURL_CMD} -f -L -o "${DOWNLOAD_FILE}" "${DOWNLOAD_URL}" + chmod +x "${DOWNLOAD_FILE}" + mkdir -p "${MILL_DOWNLOAD_PATH}" + mv "${DOWNLOAD_FILE}" "${MILL}" + + unset DOWNLOAD_FILE + unset DOWNLOAD_SUFFIX + fi +fi + +if [ -z "$MILL_MAIN_CLI" ] ; then + MILL_MAIN_CLI="${0}" +fi + +MILL_FIRST_ARG="" +if [ "$1" = "--bsp" ] || [ "$1" = "-i" ] || [ "$1" = "--interactive" ] || [ "$1" = "--no-server" ] || [ "$1" = "--repl" ] || [ "$1" = "--help" ] ; then + # Need to preserve the first position of those listed options + MILL_FIRST_ARG=$1 + shift +fi + +unset MILL_DOWNLOAD_PATH +unset MILL_OLD_DOWNLOAD_PATH +unset OLD_MILL +unset MILL_VERSION +unset MILL_REPO_URL + +# We don't quote MILL_FIRST_ARG on purpose, so we can expand the empty value without quotes +# shellcheck disable=SC2086 +exec "${MILL}" $MILL_FIRST_ARG -D "mill.main.cli=${MILL_MAIN_CLI}" "$@" \ No newline at end of file diff --git a/frameworks/Scala/sharaf/sharaf.dockerfile b/frameworks/Scala/sharaf/sharaf.dockerfile new file mode 100644 index 00000000000..d15c119240b --- /dev/null +++ b/frameworks/Scala/sharaf/sharaf.dockerfile @@ -0,0 +1,14 @@ +FROM eclipse-temurin:21-jdk-ubi9-minimal +WORKDIR /sharaf + +COPY src src +COPY build.mill build.mill +COPY mill mill +RUN chmod 777 mill +COPY .mill-version .mill-version + +RUN ./mill assembly + +EXPOSE 8080 + +CMD ["java", "-server", "-Xms1g", "-Xmx1g", "-jar", "out/assembly.dest/out.jar"] diff --git a/frameworks/Scala/sharaf/src/db.scala b/frameworks/Scala/sharaf/src/db.scala new file mode 100644 index 00000000000..960715e9c12 --- /dev/null +++ b/frameworks/Scala/sharaf/src/db.scala @@ -0,0 +1,52 @@ +package ba.sake.sharaf.benchmark + +import java.util.concurrent.ThreadLocalRandom +import scala.collection.mutable +import ba.sake.squery.{*, given} +import scala.collection.decorators.* + +class DAO { + private val ds = com.zaxxer.hikari.HikariDataSource() + ds.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world") + ds.setUsername("benchmarkdbuser") + ds.setPassword("benchmarkdbpass") + ds.setMaximumPoolSize(48) + private val squeryContext = SqueryContext(ds) + + def getRandomWorld(): WorldRow = squeryContext.run { + sql"SELECT id, randomnumber FROM world WHERE id = ${getRandomRowId()}" + .readRow() + } + + def getRandomWorlds(queriesCount: Int): Seq[WorldRow] = squeryContext.run { + val buffer = new mutable.ArrayBuffer[WorldRow](queriesCount) + for i <- 0 until queriesCount do + buffer += sql"SELECT id, randomnumber FROM world WHERE id = ${getRandomRowId()}" + .readRow() + buffer.toSeq + } + + def updateWorlds(rows: Seq[WorldRow]): Unit = squeryContext.run { + val values = rows + .map(row => sql"(${row.id}, ${row.randomnumber})") + .intersperse(sql",") + .reduce(_ ++ _) + sql""" + UPDATE world as w + SET randomnumber = c.randomnumber + FROM (VALUES ${values}) AS c(id, randomnumber) + WHERE w.id = c.id + """.update() + } + + def getFortunes(): Seq[FortuneRow] = squeryContext.run { + sql"SELECT id, message FROM fortune".readRows() + } + + def getRandomRowId(): Int = + return 1 + ThreadLocalRandom.current().nextInt(10000) + +} + +case class WorldRow(id: Int, randomnumber: Int) derives SqlReadRow +case class FortuneRow(id: Int, message: String) derives SqlReadRow diff --git a/frameworks/Scala/sharaf/src/main.scala b/frameworks/Scala/sharaf/src/main.scala new file mode 100644 index 00000000000..a562900fd04 --- /dev/null +++ b/frameworks/Scala/sharaf/src/main.scala @@ -0,0 +1,22 @@ +package ba.sake.sharaf.benchmark + +import io.undertow.Undertow +import io.undertow.UndertowOptions +import ba.sake.sharaf.* + +@main def run(): Unit = { + val dao = DAO() + val benchmarkRoutes = BenchmarkRoutes(dao) + val server = Undertow + .builder() + .addHttpListener(8080, "0.0.0.0") + .setHandler(SharafHandler(benchmarkRoutes.routes)) + .setIoThreads(Runtime.getRuntime().availableProcessors() * 2) + // In HTTP/1.1, connections are persistent unless declared otherwise. + // Adding a "Connection: keep-alive" header to every response would only + // add useless bytes. + .setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false) + .build() + server.start() + println(s"Started HTTP server at localhost:8080") +} diff --git a/frameworks/Scala/sharaf/src/pages.scala b/frameworks/Scala/sharaf/src/pages.scala new file mode 100644 index 00000000000..659d7737b3b --- /dev/null +++ b/frameworks/Scala/sharaf/src/pages.scala @@ -0,0 +1,21 @@ +package ba.sake.sharaf.benchmark + +import scalatags.Text.all.* +import ba.sake.hepek.html.HtmlPage + +class FortunesPage(rows: Seq[FortuneRow]) extends HtmlPage { + override def pageSettings = super.pageSettings.withTitle("Fortunes") + + override def bodyContent = table( + tr( + th("id"), + th("message") + ), + rows.map { row => + tr( + td(row.id), + td(row.message) + ) + } + ) +} diff --git a/frameworks/Scala/sharaf/src/routes.scala b/frameworks/Scala/sharaf/src/routes.scala new file mode 100644 index 00000000000..01a456d7f39 --- /dev/null +++ b/frameworks/Scala/sharaf/src/routes.scala @@ -0,0 +1,59 @@ +package ba.sake.sharaf.benchmark + +import ba.sake.sharaf.*, routing.* +import ba.sake.querson.* +import ba.sake.tupson.* + +class BenchmarkRoutes(dao: DAO) { + + def routes: Routes = Routes { + case GET() -> Path("plaintext") => + Response.withBody("Hello, World!").settingHeader("Server", "sharaf") + + case GET() -> Path("json") => + Response + .withBody(MessageResponse("Hello, World!")) + .settingHeader("Server", "sharaf") + + case GET() -> Path("db") => + val row = dao.getRandomWorld() + val body = WorldResponse(row.id, row.randomnumber) + Response.withBody(body).settingHeader("Server", "sharaf") + + case GET() -> Path("queries") => + val queriesCountStr = Request.current.queryParams[QueriesQP].queries + var queriesCount = queriesCountStr.toIntOption.getOrElse(1) + if queriesCount < 1 then queriesCount = 1 + if queriesCount > 500 then queriesCount = 500 + val rows = dao.getRandomWorlds(queriesCount) + val body = rows.map(row => WorldResponse(row.id, row.randomnumber)) + Response.withBody(body).settingHeader("Server", "sharaf") + + case GET() -> Path("fortunes") => + val rows = dao + .getFortunes() + .appended(FortuneRow(0, "Additional fortune added at request time.")) + val rowsSorted = rows.sortBy(_.message) + val body = FortunesPage(rowsSorted) + Response.withBody(body).settingHeader("Server", "sharaf") + + case GET() -> Path("updates") => + val queriesCountStr = Request.current.queryParams[QueriesQP].queries + var queriesCount = queriesCountStr.toIntOption.getOrElse(1) + if queriesCount < 1 then queriesCount = 1 + if queriesCount > 500 then queriesCount = 500 + val rows = dao.getRandomWorlds(queriesCount) + val updatedRows = rows.map(_.copy(randomnumber = dao.getRandomRowId())) + dao.updateWorlds(updatedRows) + val body = updatedRows.map(row => WorldResponse(row.id, row.randomnumber)) + Response.withBody(body).settingHeader("Server", "sharaf") + + } +} + +// query params +case class QueriesQP(queries: String = "1") derives QueryStringRW + +// json responses +case class MessageResponse(message: String) derives JsonRW +case class WorldResponse(id: Int, randomNumber: Int) derives JsonRW From 59456b977f2b0af8486ae1397716d4394dcb9a56 Mon Sep 17 00:00:00 2001 From: Sakib Hadziavdic Date: Thu, 13 Mar 2025 01:07:49 +0100 Subject: [PATCH 1229/1766] Update sharaf readme --- frameworks/Scala/sharaf/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/Scala/sharaf/README.md b/frameworks/Scala/sharaf/README.md index 8e9e9758908..82ec706d260 100644 --- a/frameworks/Scala/sharaf/README.md +++ b/frameworks/Scala/sharaf/README.md @@ -1,6 +1,8 @@ # Sharaf Benchmarking Test +[Sharaf](https://sake92.github.io/sharaf/) is a minimalistic Scala 3 web framework. + ### Test Type Implementation Source Code * [JSON](src/routes.scala) From 30ad308d149b0a1bbd9929ee84561e713403ca50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 00:26:13 +0000 Subject: [PATCH 1230/1766] Bump golang.org/x/net from 0.23.0 to 0.36.0 in /frameworks/Go/echo/src Bumps [golang.org/x/net](https://github.com/golang/net) from 0.23.0 to 0.36.0. - [Commits](https://github.com/golang/net/compare/v0.23.0...v0.36.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/echo/src/go.mod | 11 ++++++----- frameworks/Go/echo/src/go.sum | 22 ++++++++++++---------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/frameworks/Go/echo/src/go.mod b/frameworks/Go/echo/src/go.mod index 04c940547d5..cb54749b3ad 100644 --- a/frameworks/Go/echo/src/go.mod +++ b/frameworks/Go/echo/src/go.mod @@ -1,6 +1,7 @@ module echo/app go 1.22 +toolchain go1.23.7 require ( github.com/jackc/pgx/v5 v5.6.0 @@ -16,9 +17,9 @@ 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.21.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/crypto v0.35.0 // indirect + golang.org/x/net v0.36.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect ) diff --git a/frameworks/Go/echo/src/go.sum b/frameworks/Go/echo/src/go.sum index e607732cf1b..cb3bf5a04a1 100644 --- a/frameworks/Go/echo/src/go.sum +++ b/frameworks/Go/echo/src/go.sum @@ -25,25 +25,27 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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/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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= 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/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= From 2a6905206916a12617c0ea36c828c0a0143b9a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Thu, 13 Mar 2025 08:30:24 +0800 Subject: [PATCH 1231/1766] docs: readme --- frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 34c952876a7..db2475e26b2 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.31.0" +hyperlane = "4.31.1" bb8 = "0.9.0" bb8-postgres = "0.9.0" rand = "0.9.0" diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index 3d399671575..e0011c4a591 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -2,7 +2,7 @@ ## Description -Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, TCP communication, and redirection features, making it ideal for building modern web services. +Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication. ## Database From 51f35260cd374df8932a9a784e6d7fc3fabc7b8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Thu, 13 Mar 2025 21:37:30 +0800 Subject: [PATCH 1232/1766] feat: toml --- frameworks/Rust/hyperlane/Cargo.lock | 4 ++-- frameworks/Rust/hyperlane/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 4411e3db8db..8d66da54a3c 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -533,9 +533,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.31.0" +version = "4.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1614d327866798839bf4632acb7aa8268ebfa2b58d9d60378f1d17def4cf6b35" +checksum = "74319ece1df44e8ddd62a9e1ae13040ba34fd1500eb240fa449ca8fbc7210727" dependencies = [ "async-func", "clonelicious", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index db2475e26b2..cb0eccc2e0b 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.1" edition = "2021" authors = ["ltpp-universe "] license = "MIT" -description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, TCP communication, and redirection features, making it ideal for building modern web services.""" +description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication.""" keywords = ["http", "request", "response", "tcp", "redirect"] repository = "https://github.com/ltpp-universe/hyperlane.git" categories = ["network-programming", "web-programming"] From f230e8a6e23613214264108746ea5c2b1b5fb065 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Thu, 13 Mar 2025 09:44:13 -0400 Subject: [PATCH 1233/1766] Added -server flag. Signed-off-by: Santiago Pericas-Geertsen --- frameworks/Java/helidon/helidon-nima.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Java/helidon/helidon-nima.dockerfile b/frameworks/Java/helidon/helidon-nima.dockerfile index bfe655e52c0..3e34b8b275c 100644 --- a/frameworks/Java/helidon/helidon-nima.dockerfile +++ b/frameworks/Java/helidon/helidon-nima.dockerfile @@ -12,5 +12,6 @@ COPY --from=maven /helidon/target/benchmark-nima.jar app.jar EXPOSE 8080 CMD java -XX:+UseNUMA \ + -server \ -XX:+UseParallelGC \ -jar app.jar From b6c3fc7101986f73e8c0cb4ea85a1975e8cc925e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Thu, 13 Mar 2025 22:09:46 +0800 Subject: [PATCH 1234/1766] docs: readme --- frameworks/Rust/hyperlane/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index e0011c4a591..96bf0620a7e 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -6,7 +6,7 @@ Hyperlane is a lightweight and high-performance Rust HTTP server library designe ## Database -PostgreSQL. +PostgreSQL ## Test URLs From 9e9547e4eb8d85dcf4213f68c7fd897b0b5cb6e7 Mon Sep 17 00:00:00 2001 From: Petrik Date: Thu, 13 Mar 2025 18:23:43 +0100 Subject: [PATCH 1235/1766] [crystal/lucky] Disable compression GZip compression is not permitted: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#requirements --- frameworks/Crystal/lucky/config/server.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Crystal/lucky/config/server.cr b/frameworks/Crystal/lucky/config/server.cr index 16f458c361c..cdfeda684ef 100644 --- a/frameworks/Crystal/lucky/config/server.cr +++ b/frameworks/Crystal/lucky/config/server.cr @@ -6,7 +6,7 @@ Lucky::Server.configure do |settings| settings.secret_key_base = "u4PWnhZfOFXdTOtoiSBF+6jn0zHbYS6/yumo3WXYNSw" settings.host = "0.0.0.0" settings.port = 8080 - settings.gzip_enabled = true + settings.gzip_enabled = false settings.asset_host = "" end From 594a2e71807d26f149e423671d2ee8e5ca2c14fd Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:54:35 +0100 Subject: [PATCH 1236/1766] [python/crax] Remove crax (#9644) Crax is currently failing and hasn't been updated in 5 years: https://github.com/crax-framework/crax --- frameworks/Python/crax/README.md | 22 ----- frameworks/Python/crax/benchmark_config.json | 27 ------ frameworks/Python/crax/config.toml | 19 ---- frameworks/Python/crax/crax.dockerfile | 12 --- frameworks/Python/crax/crax_conf.py | 14 --- frameworks/Python/crax/hello/__init__.py | 0 frameworks/Python/crax/hello/app.py | 90 ------------------- .../Python/crax/hello/templates/fortune.html | 10 --- frameworks/Python/crax/requirements.txt | 5 -- 9 files changed, 199 deletions(-) delete mode 100644 frameworks/Python/crax/README.md delete mode 100644 frameworks/Python/crax/benchmark_config.json delete mode 100644 frameworks/Python/crax/config.toml delete mode 100644 frameworks/Python/crax/crax.dockerfile delete mode 100644 frameworks/Python/crax/crax_conf.py delete mode 100644 frameworks/Python/crax/hello/__init__.py delete mode 100644 frameworks/Python/crax/hello/app.py delete mode 100644 frameworks/Python/crax/hello/templates/fortune.html delete mode 100644 frameworks/Python/crax/requirements.txt diff --git a/frameworks/Python/crax/README.md b/frameworks/Python/crax/README.md deleted file mode 100644 index ffb69935b57..00000000000 --- a/frameworks/Python/crax/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# [Crax](https://crax.wiki/) Benchmark Test - -This is the Crax portion of a [benchmarking tests suite](../../) -comparing a variety of web development platforms. - -The information below is specific to Crax. 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 - -[Crax](https://github.com/crax-framework/crax) is a framework or a pack of tools for web development. - -## Test Paths & Sources - -All of the test implementations are located within a single file ([app.py](hello/app.py)). - -## Resources - -* [Crax on GitHub](https://github.com/crax-framework/crax) -* [Crax Wiki](https://crax.wiki/) diff --git a/frameworks/Python/crax/benchmark_config.json b/frameworks/Python/crax/benchmark_config.json deleted file mode 100644 index a461cd62fab..00000000000 --- a/frameworks/Python/crax/benchmark_config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "framework": "crax", - "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": "crax", - "language": "Python", - "flavor": "Python3", - "platform": "None", - "webserver": "None", - "os": "Linux", - "orm": "Raw", - "database_os": "Linux", - "database": "Postgres", - "display_name": "Crax", - "notes": "" - } - }] -} \ No newline at end of file diff --git a/frameworks/Python/crax/config.toml b/frameworks/Python/crax/config.toml deleted file mode 100644 index b640dfaac07..00000000000 --- a/frameworks/Python/crax/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "crax" - -[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 = "None" -webserver = "None" -versus = "None" diff --git a/frameworks/Python/crax/crax.dockerfile b/frameworks/Python/crax/crax.dockerfile deleted file mode 100644 index 4b33e3a0fb6..00000000000 --- a/frameworks/Python/crax/crax.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM python:3.8 - -ADD ./ /crax - -WORKDIR /crax - -RUN pip3 install cython==0.29.13 && \ - pip3 install -r /crax/requirements.txt - -EXPOSE 8080 - -CMD gunicorn hello.app:app -k uvicorn.workers.UvicornWorker -c crax_conf.py \ No newline at end of file diff --git a/frameworks/Python/crax/crax_conf.py b/frameworks/Python/crax/crax_conf.py deleted file mode 100644 index 042c7445e6d..00000000000 --- a/frameworks/Python/crax/crax_conf.py +++ /dev/null @@ -1,14 +0,0 @@ -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/crax.pid' -loglevel = 'error' diff --git a/frameworks/Python/crax/hello/__init__.py b/frameworks/Python/crax/hello/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/Python/crax/hello/app.py b/frameworks/Python/crax/hello/app.py deleted file mode 100644 index 718489d18a1..00000000000 --- a/frameworks/Python/crax/hello/app.py +++ /dev/null @@ -1,90 +0,0 @@ -import os -from operator import itemgetter -from random import randint -import asyncpg -from crax import Crax -from crax.response_types import BaseResponse, JSONResponse -from crax.urls import Route, Url -from crax.views import JSONView, TemplateView - -READ_ROW_SQL = 'SELECT "id", "randomnumber" FROM "world" WHERE id = $1' -WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$1 WHERE id=$2' - - -async def setup_database(): - global connection_pool - connection_pool = await asyncpg.create_pool( - user=os.getenv('PGUSER', 'benchmarkdbuser'), - password=os.getenv('PGPASS', 'benchmarkdbpass'), - database='hello_world', - host='tfb-database', - port=5432 - ) - - -def get_num_queries(request): - try: - query_count = int(request.query["queries"][0]) - except (KeyError, IndexError, ValueError): - return 1 - if query_count < 1: - return 1 - if query_count > 500: - return 500 - return query_count - - -class TestSingleQuery(JSONView): - async def get(self): - row_id = randint(1, 10000) - async with connection_pool.acquire() as connection: - if self.request.path == '/db': - res = await connection.fetchval(READ_ROW_SQL, row_id) - self.context = {'id': row_id, 'randomNumber': res} - - -class TestMultiQueries(JSONView): - async def get(self): - row_ids = [randint(1, 10000) for _ in range(get_num_queries(self.request))] - worlds = [] - async with connection_pool.acquire() as connection: - statement = await connection.prepare(READ_ROW_SQL) - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append({'id': row_id, 'randomNumber': number}) - self.context = worlds - - -class TestUpdates(JSONView): - async def get(self): - updates = [(randint(1, 10000), randint(1, 10000)) for _ in range(get_num_queries(self.request))] - worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] - async with connection_pool.acquire() as connection: - statement = await connection.prepare(READ_ROW_SQL) - for row_id, number in updates: - await statement.fetchval(row_id) - await connection.executemany(WRITE_ROW_SQL, updates) - self.context = worlds - - -class TestSingleFortunes(TemplateView): - template = "fortune.html" - - async def get(self): - async with connection_pool.acquire() as connection: - fortunes = await connection.fetch('SELECT * FROM Fortune') - fortunes.append([0, 'Additional fortune added at request time.']) - fortunes.sort(key=itemgetter(1)) - self.context["fortunes"] = fortunes - - -APPLICATIONS = ["hello"] -URL_PATTERNS = [ - Route(Url('/json'), JSONResponse(None, {'message': 'Hello, world!'})), - Route(Url('/plaintext'), BaseResponse(None, b'Hello, world!')), - Route(Url('/db'), TestSingleQuery), - Route(Url('/queries'), TestMultiQueries), - Route(Url('/updates'), TestUpdates), - Route(Url('/fortunes'), TestSingleFortunes) -] -app = Crax('hello.app', debug=True, on_startup=setup_database) diff --git a/frameworks/Python/crax/hello/templates/fortune.html b/frameworks/Python/crax/hello/templates/fortune.html deleted file mode 100644 index 4f0b3db447c..00000000000 --- a/frameworks/Python/crax/hello/templates/fortune.html +++ /dev/null @@ -1,10 +0,0 @@ - - -Fortunes - - - -{% for fortune in fortunes %} -{% endfor %}
      idmessage
      {{ fortune[0] }}{{ fortune[1]|e }}
      - - \ No newline at end of file diff --git a/frameworks/Python/crax/requirements.txt b/frameworks/Python/crax/requirements.txt deleted file mode 100644 index 714d2fb4f27..00000000000 --- a/frameworks/Python/crax/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -crax[postgresql]==0.1.5 -gunicorn==20.1.0 -uvloop==0.17.0 -uvicorn==0.20.0 -httptools==0.5.0 From 0eae98015226552cce246858c04eedc309e0b167 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:54:42 +0100 Subject: [PATCH 1237/1766] [python/hug] Remove Hug (#9645) Hug hasn't received any updates in 2 years and seems abandonned: https://github.com/hugapi/hug/issues/897 Also, it only implements the plaintext test, which isn't allowed by the current rules. --- frameworks/Python/hug/README.md | 0 frameworks/Python/hug/app.py | 29 --------------------- frameworks/Python/hug/benchmark_config.json | 25 ------------------ frameworks/Python/hug/config.toml | 14 ---------- frameworks/Python/hug/hug.dockerfile | 12 --------- frameworks/Python/hug/requirements.txt | 6 ----- frameworks/Python/hug/uwsgi.ini | 13 --------- 7 files changed, 99 deletions(-) delete mode 100644 frameworks/Python/hug/README.md delete mode 100644 frameworks/Python/hug/app.py delete mode 100644 frameworks/Python/hug/benchmark_config.json delete mode 100644 frameworks/Python/hug/config.toml delete mode 100644 frameworks/Python/hug/hug.dockerfile delete mode 100644 frameworks/Python/hug/requirements.txt delete mode 100644 frameworks/Python/hug/uwsgi.ini diff --git a/frameworks/Python/hug/README.md b/frameworks/Python/hug/README.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/Python/hug/app.py b/frameworks/Python/hug/app.py deleted file mode 100644 index 0ee6509add6..00000000000 --- a/frameworks/Python/hug/app.py +++ /dev/null @@ -1,29 +0,0 @@ -import hug - -from datetime import datetime - - -# Create decorators for mimetypes (JSON is default) -plaintext = hug.get(output=hug.output_format.text) -json = hug.get(output=hug.output_format.json) - - -# Create a directive to add necessary headers -@hug.response_middleware() -def set_required_headers(request, response, resource): - date_obj = datetime.now() - rfc_1123 = "%a, %d %b %Y %H:%M:%S GMT" - rfc_1123_date = date_obj.strftime(rfc_1123) - - headers = { "Server": "hug", "Date": rfc_1123_date } - - response.set_headers(headers) - - -@plaintext -@hug.get("/plaintext") -def plaintext(): - """Plaintext handler.""" - return "Hello, World!" - -app = hug.API(__name__).http.server() diff --git a/frameworks/Python/hug/benchmark_config.json b/frameworks/Python/hug/benchmark_config.json deleted file mode 100644 index b86b6f36db1..00000000000 --- a/frameworks/Python/hug/benchmark_config.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "framework": "hug", - "tests": [ - { - "default": { - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "Hug", - "language": "Python", - "flavor": "Python3", - "orm": "Raw", - "platform": "Falcon", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hug", - "notes": "CPython 2", - "versus": "wsgi" - } - } - ] -} diff --git a/frameworks/Python/hug/config.toml b/frameworks/Python/hug/config.toml deleted file mode 100644 index 18bf06c490a..00000000000 --- a/frameworks/Python/hug/config.toml +++ /dev/null @@ -1,14 +0,0 @@ -[framework] -name = "hug" - -[main] -urls.plaintext = "/plaintext" -approach = "Realistic" -classification = "Micro" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Falcon" -webserver = "None" -versus = "wsgi" diff --git a/frameworks/Python/hug/hug.dockerfile b/frameworks/Python/hug/hug.dockerfile deleted file mode 100644 index b385c993026..00000000000 --- a/frameworks/Python/hug/hug.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM python:3.6.6-stretch - -WORKDIR /hug -COPY app.py app.py -COPY uwsgi.ini uwsgi.ini -COPY requirements.txt requirements.txt - -RUN pip3 install -r requirements.txt - -EXPOSE 8080 - -CMD ["uwsgi", "--ini", "uwsgi.ini"] diff --git a/frameworks/Python/hug/requirements.txt b/frameworks/Python/hug/requirements.txt deleted file mode 100644 index 7b366e79132..00000000000 --- a/frameworks/Python/hug/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -Cython==0.28.5 -hug==2.3.2 -uWSGI==2.0.17.1 -greenlet==0.4.14 -gunicorn==19.9.0 -meinheld==0.6.1 diff --git a/frameworks/Python/hug/uwsgi.ini b/frameworks/Python/hug/uwsgi.ini deleted file mode 100644 index 15d7d5fa95f..00000000000 --- a/frameworks/Python/hug/uwsgi.ini +++ /dev/null @@ -1,13 +0,0 @@ -; These preferences specifically tuned for performance. - -[uwsgi] -http=:8080 -chdir=/hug -wsgi-file=/hug/app.py -callable=app -workers=%(%k * 2 + 1) -processes=%k -enable-threads=True -threads=1 -disable-logging=True -max-worker-lifetime=30 From bc579443a362d65164ca6bb39a293237a2cc20cb Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:54:47 +0100 Subject: [PATCH 1238/1766] [python/starlite] Remove starlite (#9646) Starlite is currently failing and hasn't been updated in 3 years: https://github.com/Harry-Lees/starlite --- frameworks/Python/starlite/.dockerignore | 2 - frameworks/Python/starlite/README.md | 17 --- frameworks/Python/starlite/app.py | 121 ------------------ .../Python/starlite/benchmark_config.json | 30 ----- frameworks/Python/starlite/config.toml | 19 --- frameworks/Python/starlite/requirements.txt | 5 - .../Python/starlite/starlite.dockerfile | 14 -- .../Python/starlite/templates/fortune.html | 17 --- 8 files changed, 225 deletions(-) delete mode 100644 frameworks/Python/starlite/.dockerignore delete mode 100755 frameworks/Python/starlite/README.md delete mode 100755 frameworks/Python/starlite/app.py delete mode 100755 frameworks/Python/starlite/benchmark_config.json delete mode 100644 frameworks/Python/starlite/config.toml delete mode 100644 frameworks/Python/starlite/requirements.txt delete mode 100644 frameworks/Python/starlite/starlite.dockerfile delete mode 100644 frameworks/Python/starlite/templates/fortune.html diff --git a/frameworks/Python/starlite/.dockerignore b/frameworks/Python/starlite/.dockerignore deleted file mode 100644 index 9fce104ae8c..00000000000 --- a/frameworks/Python/starlite/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -.venv -README.md diff --git a/frameworks/Python/starlite/README.md b/frameworks/Python/starlite/README.md deleted file mode 100755 index 0d1452fc99a..00000000000 --- a/frameworks/Python/starlite/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Starlite Benchmarking Test - -This is the Starlite portion of a [benchmarking tests suite](../../) -comparing a variety of web development platforms. - -The information below is specific to Starlite. 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# Starlite - -Starlite is a powerful, performant, flexible and opinionated ASGI framework, -offering first class typing support and a full [Pydantic](https://github.com/samuelcolvin/pydantic) -integration. - -Check out the [documentation 📚](https://starlite-api.github.io/starlite/). diff --git a/frameworks/Python/starlite/app.py b/frameworks/Python/starlite/app.py deleted file mode 100755 index 09a4ffa56f5..00000000000 --- a/frameworks/Python/starlite/app.py +++ /dev/null @@ -1,121 +0,0 @@ -import asyncio -import os -from operator import itemgetter -from random import randint, sample -from typing import Any - -import uvloop -from asyncpg import create_pool -from jinja2 import Template -from starlite import MediaType, Starlite, get - -asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) -connection_pool: Any = None - - -async def init_connection_pool() -> None: - global connection_pool - connection_pool = await create_pool( - user=os.getenv('PGUSER', 'benchmarkdbuser'), - password=os.getenv('PGPASS', 'benchmarkdbpass'), - database='hello_world', - host='tfb-database', - port=5432 - ) - - -def normalize_queries(value: str | None) -> int: - queries = int(value) if value and value.isnumeric() else 1 - if queries > 500: - return 500 - if queries < 1: - return 1 - return queries - - -def load_fortunes_template() -> "Template": - path = os.path.join('templates', 'fortune.html') - with open(path, 'r') as template_file: - template_text = template_file.read() - return Template(template_text) - - -fortune_template = load_fortunes_template() - - -@get(path='/json') -def json_serialization() -> dict[str, str]: - return {'message': 'Hello, world!'} - - -@get(path='/db') -async def single_database_query() -> dict[str, int]: - row_id = randint(1, 10000) - async with connection_pool.acquire() as connection: - number = await connection.fetchval( - 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1', - row_id - ) - - return {'id': row_id, 'randomNumber': number} - - -@get(path='/queries') -async def multiple_database_queries(queries: None | str = None) -> list[dict[str, int]]: - row_ids = sample(range(1, 10000), normalize_queries(queries)) - worlds = [] - - async with connection_pool.acquire() as connection: - statement = await connection.prepare('SELECT "randomnumber", "id" FROM "world" WHERE id = $1') - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append({'id': row_id, 'randomNumber': number}) - - return worlds - - -@get(path='/fortunes', media_type=MediaType.HTML) -async def render_fortunes_template() -> str: - async with connection_pool.acquire() as connection: - fortunes = await connection.fetch('SELECT * FROM Fortune') - - fortunes.append([0, 'Additional fortune added at request time.']) - fortunes.sort(key=itemgetter(1)) - return fortune_template.render(fortunes=fortunes) - - -@get(path='/updates') -async def database_updates(queries: None | str = None) -> list[dict[str, int]]: - num_queries = normalize_queries(queries) - updates = list(zip(sorted(sample(range(1, 10000 + 1), num_queries)), sample(range(1, 10000), num_queries))) - - worlds = [ - {"id": row_id, "randomNumber": number} for row_id, number in updates - ] - - async with connection_pool.acquire() as connection: - statement = await connection.prepare('SELECT "id", "randomnumber" FROM "world" WHERE id = $1') - for row_id, _ in updates: - await statement.fetchval(row_id) - await connection.executemany('UPDATE "world" SET "randomnumber"=$1 WHERE id=$2', updates) - - return worlds - - -@get(path='/plaintext', media_type=MediaType.TEXT) -def plaintext() -> bytes: - return b'Hello, world!' - - -app = Starlite( - route_handlers=[ - database_updates, - json_serialization, - multiple_database_queries, - plaintext, - render_fortunes_template, - single_database_query, - ], - on_startup=[init_connection_pool], - openapi_config=None, -) diff --git a/frameworks/Python/starlite/benchmark_config.json b/frameworks/Python/starlite/benchmark_config.json deleted file mode 100755 index cdceafff5e4..00000000000 --- a/frameworks/Python/starlite/benchmark_config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "framework": "starlite", - "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", - "database": "Postgres", - "framework": "Starlite", - "language": "Python", - "flavor": "Python3", - "orm": "Raw", - "platform": "None", - "webserver": "Uvicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "Starlite", - "notes": "", - "versus": "None" - } - } - ] -} diff --git a/frameworks/Python/starlite/config.toml b/frameworks/Python/starlite/config.toml deleted file mode 100644 index 3aa7c3cec44..00000000000 --- a/frameworks/Python/starlite/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "starlite" - -[uvicorn] -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 = "None" -webserver = "Uvicorn" -versus = "None" diff --git a/frameworks/Python/starlite/requirements.txt b/frameworks/Python/starlite/requirements.txt deleted file mode 100644 index d8312c6df61..00000000000 --- a/frameworks/Python/starlite/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -asyncpg>=0.27.0 -jinja2>=3.1.2 -starlite>=1.51.0 -uvicorn[standard]>=0.20.0 -uvloop>=0.17.0 \ No newline at end of file diff --git a/frameworks/Python/starlite/starlite.dockerfile b/frameworks/Python/starlite/starlite.dockerfile deleted file mode 100644 index f51c232e4cc..00000000000 --- a/frameworks/Python/starlite/starlite.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM python:3.11 -WORKDIR /starlite/ - -RUN python -m venv /opt/venv -ENV PATH="/opt/venv/bin:$PATH" - -COPY . . - -RUN pip install --upgrade pip \ - && pip install cython==0.29.33 \ - && pip install -r /starlite/requirements.txt - -EXPOSE 8080 -CMD uvicorn app:app --host 0.0.0.0 --port 8080 --workers $(nproc) --log-level error --loop uvloop diff --git a/frameworks/Python/starlite/templates/fortune.html b/frameworks/Python/starlite/templates/fortune.html deleted file mode 100644 index 2e62ac5f7a0..00000000000 --- a/frameworks/Python/starlite/templates/fortune.html +++ /dev/null @@ -1,17 +0,0 @@ - - -Fortunes - - - - - - - {% for fortune in fortunes %} - - - - - {% endfor %}
      idmessage
      {{ fortune[0] }}{{ fortune[1]|e }}
      - - From 93b742e97f5cc1ebb6201cdae69268e9b5f695a9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:55:12 +0100 Subject: [PATCH 1239/1766] [python/morepath] Remove morepath (#9647) Morepath is currently failing and hasn't been updated in 3 years: https://github.com/morepath/morepath/tree/master --- frameworks/Python/morepath/README.md | 50 ---- frameworks/Python/morepath/app/__init__.py | 3 - frameworks/Python/morepath/app/app.py | 11 - frameworks/Python/morepath/app/collection.py | 6 - frameworks/Python/morepath/app/model.py | 29 -- frameworks/Python/morepath/app/path.py | 35 --- frameworks/Python/morepath/app/run.py | 31 --- .../morepath/app/templates/fortune.jinja2 | 21 -- .../Python/morepath/app/tests/test_app.py | 259 ------------------ frameworks/Python/morepath/app/view.py | 79 ------ .../Python/morepath/benchmark_config.json | 27 -- frameworks/Python/morepath/config.toml | 19 -- frameworks/Python/morepath/gunicorn_conf.py | 14 - .../Python/morepath/morepath.dockerfile | 11 - frameworks/Python/morepath/requirements.txt | 17 -- frameworks/Python/morepath/setup.py | 41 --- 16 files changed, 653 deletions(-) delete mode 100644 frameworks/Python/morepath/README.md delete mode 100644 frameworks/Python/morepath/app/__init__.py delete mode 100644 frameworks/Python/morepath/app/app.py delete mode 100644 frameworks/Python/morepath/app/collection.py delete mode 100644 frameworks/Python/morepath/app/model.py delete mode 100644 frameworks/Python/morepath/app/path.py delete mode 100644 frameworks/Python/morepath/app/run.py delete mode 100644 frameworks/Python/morepath/app/templates/fortune.jinja2 delete mode 100644 frameworks/Python/morepath/app/tests/test_app.py delete mode 100644 frameworks/Python/morepath/app/view.py delete mode 100644 frameworks/Python/morepath/benchmark_config.json delete mode 100644 frameworks/Python/morepath/config.toml delete mode 100644 frameworks/Python/morepath/gunicorn_conf.py delete mode 100644 frameworks/Python/morepath/morepath.dockerfile delete mode 100644 frameworks/Python/morepath/requirements.txt delete mode 100644 frameworks/Python/morepath/setup.py diff --git a/frameworks/Python/morepath/README.md b/frameworks/Python/morepath/README.md deleted file mode 100644 index 3d0066a6f32..00000000000 --- a/frameworks/Python/morepath/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# [Morepath](http://morepath.readthedocs.io/) Benchmark Test - -The information below is specific to Morepath. For further guidance, -review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki). -Also note that there is additional information that's provided in -the [Python README](../). - -This is the Python Morepath portion of a [benchmarking tests suite](../../) -comparing a variety of frameworks. - -All test implementations are located within ([./app](app)). - -## Description - -Morepath with [PonyOrm](https://docs.ponyorm.com/) using PostgreSQL for -database access. - -### Database - -PostgreSQL (with PonyORM). - -### Server - -gunicorn + meinheld on CPython - -## Test URLs - -### Test 1: JSON Encoding - - http://localhost:8080/json - -### Test 2: Single Row Query - - http://localhost:8080/db - -### Test 3: Multi Row Query - - http://localhost:8080/queries?queries=20 - -### Test 4: Fortunes (Template rendering) - - http://localhost:8080/fortunes - -### Test 5: Update Query - - http://localhost:8080/updates?queries=20 - -### Test 6: Plaintext - - http://localhost:8080/plaintext diff --git a/frameworks/Python/morepath/app/__init__.py b/frameworks/Python/morepath/app/__init__.py deleted file mode 100644 index b601c11a64a..00000000000 --- a/frameworks/Python/morepath/app/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# flake8: noqa - -from app.app import App diff --git a/frameworks/Python/morepath/app/app.py b/frameworks/Python/morepath/app/app.py deleted file mode 100644 index 7b43a7baf51..00000000000 --- a/frameworks/Python/morepath/app/app.py +++ /dev/null @@ -1,11 +0,0 @@ -from more.pony import PonyApp -from more.jinja2 import Jinja2App - - -class App(PonyApp, Jinja2App): - pass - - -@App.template_directory() -def get_template_directory(): - return 'templates' diff --git a/frameworks/Python/morepath/app/collection.py b/frameworks/Python/morepath/app/collection.py deleted file mode 100644 index 8ab02a095f8..00000000000 --- a/frameworks/Python/morepath/app/collection.py +++ /dev/null @@ -1,6 +0,0 @@ -from .model import Fortune - - -class FortuneCollection(object): - def query(self): - return Fortune.select() diff --git a/frameworks/Python/morepath/app/model.py b/frameworks/Python/morepath/app/model.py deleted file mode 100644 index 9cd7bc8ed49..00000000000 --- a/frameworks/Python/morepath/app/model.py +++ /dev/null @@ -1,29 +0,0 @@ -from pony.orm import Database, Optional - -db = Database() - - -class Json(): - pass - - -class World(db.Entity): - randomnumber = Optional(int) - - -class WorldQueries(): - def __init__(self, queries): - self.queries = queries - - -class Fortune(db.Entity): - message = Optional(str) - - -class WorldUpdates(): - def __init__(self, queries): - self.queries = queries - - -class Plaintext(): - pass diff --git a/frameworks/Python/morepath/app/path.py b/frameworks/Python/morepath/app/path.py deleted file mode 100644 index 05d1dc442e1..00000000000 --- a/frameworks/Python/morepath/app/path.py +++ /dev/null @@ -1,35 +0,0 @@ -from random import randint - -from .app import App -from .model import Json, World, WorldQueries, WorldUpdates, Plaintext -from .collection import FortuneCollection - - -@App.path(model=Json, path='json') -def get_json(): - return Json() - - -@App.path(model=World, path='db') -def get_random_world(): - return World[randint(1, 10000)] - - -@App.path(model=WorldQueries, path='queries') -def get_queries(queries): - return WorldQueries(queries) - - -@App.path(model=FortuneCollection, path='fortunes') -def get_fortunes(): - return FortuneCollection() - - -@App.path(model=WorldUpdates, path='updates') -def get_updates(queries): - return WorldUpdates(queries) - - -@App.path(model=Plaintext, path='plaintext') -def get_plaintext(): - return Plaintext() diff --git a/frameworks/Python/morepath/app/run.py b/frameworks/Python/morepath/app/run.py deleted file mode 100644 index 82336adbb79..00000000000 --- a/frameworks/Python/morepath/app/run.py +++ /dev/null @@ -1,31 +0,0 @@ -import os - -import morepath - -from app import App -from .model import db - - -def setup_db(): - DBHOST = 'tfb-database' - - db.bind( - 'postgres', - user='benchmarkdbuser', - password='benchmarkdbpass', - host=DBHOST, - database='hello_world' - ) - db.generate_mapping(create_tables=True) - - -def wsgi_factory(): # pragma: no cover - morepath.autoscan() - - App.commit() - setup_db() - - return App() - - -application = wsgi_factory() # pragma: no cover diff --git a/frameworks/Python/morepath/app/templates/fortune.jinja2 b/frameworks/Python/morepath/app/templates/fortune.jinja2 deleted file mode 100644 index e2c33c3c4af..00000000000 --- a/frameworks/Python/morepath/app/templates/fortune.jinja2 +++ /dev/null @@ -1,21 +0,0 @@ - - - - -Fortunes - - - - - - - -{% for fortune in fortunes %} - - - - -{% endfor %} -
      idmessage
      {{ fortune.id }}{{ fortune.message|escape }}
      - - diff --git a/frameworks/Python/morepath/app/tests/test_app.py b/frameworks/Python/morepath/app/tests/test_app.py deleted file mode 100644 index 63f94e5c818..00000000000 --- a/frameworks/Python/morepath/app/tests/test_app.py +++ /dev/null @@ -1,259 +0,0 @@ -from webtest import TestApp as Client -import morepath - -import app -from app import App - - -def setup_module(module): - morepath.scan(app) - morepath.commit(App) - - -def test_json(): - """/json""" - app = App() - c = Client(app) - - response = c.get('/json', status=200) - assert response.headerlist == [ - ('Content-Type', 'application/json'), - ('Content-Length', '27') - ] - assert response.json == {"message": "Hello, World!"} - - -def test_db(): - """/db""" - app = App() - c = Client(app) - - response = c.get('/db', status=200) - assert response.content_type == 'application/json' - assert 'id' in response.json - assert 'randomNumber' in response.json - assert 1 <= response.json['id'] <= 10000 - assert 1 <= response.json['randomNumber'] <= 10000 - - -def test_queries(): - """/queries?queries=""" - app = App() - c = Client(app) - - response = c.get('/queries?queries=', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 1 - - -def test_queries_foo(): - """/queries?queries=foo""" - app = App() - c = Client(app) - - response = c.get('/queries?queries=foo', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 1 - - -def test_queries_0(): - """/queries?queries=0""" - app = App() - c = Client(app) - - response = c.get('/queries?queries=0', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 1 - - -def test_queries_999(): - """/queries?queries=999""" - app = App() - c = Client(app) - - response = c.get('/queries?queries=999', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 500 - - -def test_queries_10(): - """/queries?queries=10""" - app = App() - c = Client(app) - - response = c.get('/queries?queries=10', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 10 - - obj_list = response.json - for obj in obj_list: - assert 'id' in obj - assert 'randomNumber' in obj - assert 1 <= obj['id'] <= 10000 - assert 1 <= obj['randomNumber'] <= 10000 - - -def test_fortunes(): - """/fortunes""" - app = App() - c = Client(app) - - response = c.get('/fortunes', status=200) - assert response.headerlist == [ - ('Content-Type', 'text/html; charset=UTF-8'), - ('Content-Length', '1304') - ] - assert response.text == fortunes - - -def test_updates(): - """/updates?queries=""" - app = App() - c = Client(app) - - response = c.get('/updates?queries=', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 1 - - -def test_updates_foo(): - """/updates?queries=foo""" - app = App() - c = Client(app) - - response = c.get('/updates?queries=foo', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 1 - - -def test_updates_0(): - """/updates?queries=0""" - app = App() - c = Client(app) - - response = c.get('/updates?queries=0', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 1 - - -def test_updates_999(): - """/updates?queries=999""" - app = App() - c = Client(app) - - response = c.get('/updates?queries=999', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 500 - - -def test_updates_10(): - """/updates?queries=10""" - app = App() - c = Client(app) - - response = c.get('/updates?queries=10', status=200) - assert response.content_type == 'application/json' - assert len(response.json) == 10 - - obj_list = response.json - for obj in obj_list: - assert 'id' in obj - assert 'randomNumber' in obj - assert 1 <= obj['id'] <= 10000 - assert 1 <= obj['randomNumber'] <= 10000 - - -def test_plaintext(): - """/plaintext""" - app = App() - c = Client(app) - - response = c.get('/plaintext', status=200) - assert response.headerlist == [ - ('Content-Type', 'text/plain; charset=UTF-8'), - ('Content-Length', '13') - ] - assert response.text == 'Hello, World!' - - -fortunes = """ - - - -Fortunes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      idmessage
      11<script>alert("This should not be displayed in a browser alert box.");</script>
      4A bad random number generator: 1, 1, 1, 1, 1, 4.33e+67, 1, 1, 1
      5A computer program does what you tell it to do, not what you want it to do.
      2A computer scientist is someone who fixes things that aren't broken.
      8A list is only as strong as its weakest link. — Donald Knuth
      0Additional fortune added at request time.
      3After enough decimal places, nobody gives a damn.
      7Any program that runs right is obsolete.
      10Computers make very fast, very accurate mistakes.
      6Emacs is a nice operating system, but I prefer UNIX. — Tom Christaensen
      9Feature: A bug with seniority.
      1fortune: No such file or directory
      12フレームワークのベンチマーク
      - -""" diff --git a/frameworks/Python/morepath/app/view.py b/frameworks/Python/morepath/app/view.py deleted file mode 100644 index c518784a93d..00000000000 --- a/frameworks/Python/morepath/app/view.py +++ /dev/null @@ -1,79 +0,0 @@ -from random import randint - -from .app import App -from .model import Json, World, WorldQueries, WorldUpdates, Plaintext -from .collection import FortuneCollection - - -@App.json(model=Json) -def test_1(self, request): - """Test 1: JSON serialization""" - return {'message': 'Hello, World!'} - - -@App.json(model=World) -def test_2(self, request): - """Test 2: Single database query""" - return {'id': self.id, 'randomNumber': self.randomnumber} - - -@App.json(model=WorldQueries) -def test_3(self, request): - """Test 3: Multiple database queries""" - try: - queries = int(self.queries) - except ValueError: - queries = 1 - else: - if queries < 1: - queries = 1 - elif queries > 500: - queries = 500 - - result = [] - - for id_ in [randint(1, 10000) for _ in range(queries)]: - result.append({'id': id_, 'randomNumber': World[id_].randomnumber}) - - return result - - -@App.html(model=FortuneCollection, template='fortune.jinja2') -def test_4(self, request): - """Test 4: Fortunes""" - fortunes = [f.to_dict() for f in self.query()] - fortunes.append({ - 'id': 0, - 'message': 'Additional fortune added at request time.' - }) - - return {'fortunes': sorted(fortunes, key=lambda x: x['message'])} - - -@App.json(model=WorldUpdates) -def test_5(self, request): - """Test 5: Database updates""" - try: - queries = int(self.queries) - except ValueError: - queries = 1 - else: - if queries < 1: - queries = 1 - elif queries > 500: - queries = 500 - - result = [] - - for id_ in sorted(randint(1, 10000) for _ in range(queries)): - randomNumber = randint(1, 10000) - World[id_].randomnumber = randomNumber - result.append({'id': id_, 'randomNumber': randomNumber}) - - return result - - -@App.view(model=Plaintext) -def test_6(self, request): - """Test 6: Plaintext""" - return 'Hello, World!' diff --git a/frameworks/Python/morepath/benchmark_config.json b/frameworks/Python/morepath/benchmark_config.json deleted file mode 100644 index 43f1b3200d4..00000000000 --- a/frameworks/Python/morepath/benchmark_config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "framework": "morepath", - "tests": [{ - "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "morepath", - "language": "Python", - "flavor": "Python3", - "orm": "Full", - "platform": "Meinheld", - "webserver": "gunicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "Morepath", - "notes": "uses Morepath with PonyORM for database access" - } - }] -} diff --git a/frameworks/Python/morepath/config.toml b/frameworks/Python/morepath/config.toml deleted file mode 100644 index af46ef2250a..00000000000 --- a/frameworks/Python/morepath/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "morepath" - -[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 = "Full" -platform = "Meinheld" -webserver = "gunicorn" -versus = "None" diff --git a/frameworks/Python/morepath/gunicorn_conf.py b/frameworks/Python/morepath/gunicorn_conf.py deleted file mode 100644 index bab6df83a9e..00000000000 --- a/frameworks/Python/morepath/gunicorn_conf.py +++ /dev/null @@ -1,14 +0,0 @@ -import multiprocessing -import os - -if os.environ.get('TRAVIS') == 'true': - workers = 2 -else: - workers = multiprocessing.cpu_count() * 3 - -bind = '0.0.0.0:8080' -keepalive = 120 -errorlog = '-' -pidfile = 'gunicorn.pid' - -worker_class = "meinheld.gmeinheld.MeinheldWorker" diff --git a/frameworks/Python/morepath/morepath.dockerfile b/frameworks/Python/morepath/morepath.dockerfile deleted file mode 100644 index a0fee3578cd..00000000000 --- a/frameworks/Python/morepath/morepath.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.6.6-stretch - -ADD ./ /japronto - -WORKDIR /japronto - -RUN pip3 install -r /japronto/requirements.txt - -EXPOSE 8080 - -CMD gunicorn app.run -c gunicorn_conf.py diff --git a/frameworks/Python/morepath/requirements.txt b/frameworks/Python/morepath/requirements.txt deleted file mode 100644 index 8f58488b64e..00000000000 --- a/frameworks/Python/morepath/requirements.txt +++ /dev/null @@ -1,17 +0,0 @@ -dectate==0.13 -greenlet==0.4.14 -gunicorn==19.9.0 -importscan==0.1 -Jinja2==2.11.3 -MarkupSafe==1.0 -meinheld==1.0.2 -more.jinja2==0.2 -more.pony==0.1 -morepath==0.18.1 -pony==0.7.1 -psycopg2==2.7.5 -reg==0.11 -repoze.lru==0.6 -WebOb==1.8.8 - --e . diff --git a/frameworks/Python/morepath/setup.py b/frameworks/Python/morepath/setup.py deleted file mode 100644 index d712f4e8c87..00000000000 --- a/frameworks/Python/morepath/setup.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -from setuptools import setup, find_packages - -setup( - name='frameworkbenchmarks', - version='0.0', - description='FrameworkBenchmarks', - author='', - author_email='', - url='', - packages=find_packages(), - include_package_data=True, - zip_safe=False, - platforms='any', - install_requires=[ - 'more.pony', - 'psycopg2', - 'more.jinja2', - 'gunicorn', - 'meinheld', - ], - extras_require=dict( - test=[ - 'pytest >= 2.9.1', - 'WebTest >= 2.0.14', - 'pytest-cov', - ] - ), - entry_points=dict( - morepath=[ - 'scan = app', - ], - ), - classifiers=[ - 'Programming Language :: Python', - 'Framework :: Morepath', - 'Topic :: Internet :: WWW/HTTP', - 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', - ] -) From 1f0ae904d48941f10c742828d5c2ed08243cbbd6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:55:19 +0100 Subject: [PATCH 1240/1766] [python/xpresso] Remove Xpresso (#9648) Xpresso is currently failing and the framework hasn't been updated in 2 years and the projects seems unmaintained: https://github.com/adriangb/xpresso > It's going to stay around, but it's less likely to become a stable > production ready framework --- frameworks/Python/xpresso/README.md | 25 --- .../Python/xpresso/benchmark_config.json | 30 ---- frameworks/Python/xpresso/config.toml | 19 --- frameworks/Python/xpresso/main.py | 158 ------------------ frameworks/Python/xpresso/requirements.txt | 7 - .../Python/xpresso/templates/fortune.html | 10 -- frameworks/Python/xpresso/xpresso.dockerfile | 14 -- 7 files changed, 263 deletions(-) delete mode 100755 frameworks/Python/xpresso/README.md delete mode 100755 frameworks/Python/xpresso/benchmark_config.json delete mode 100644 frameworks/Python/xpresso/config.toml delete mode 100755 frameworks/Python/xpresso/main.py delete mode 100644 frameworks/Python/xpresso/requirements.txt delete mode 100644 frameworks/Python/xpresso/templates/fortune.html delete mode 100644 frameworks/Python/xpresso/xpresso.dockerfile diff --git a/frameworks/Python/xpresso/README.md b/frameworks/Python/xpresso/README.md deleted file mode 100755 index 1a66fe57feb..00000000000 --- a/frameworks/Python/xpresso/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Xpresso Benchmarking Test - -This is the Xpresso portion of a [benchmarking tests suite](../../) comparing a variety of web development platforms. - -The information below is specific to Xpresso. -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 - -[Xpresso] is a high performance Python web framework built on top of [Starlette], [Pydantic] and [di] with a focus on composability, flexibility and minimal but well defined library APIs. - -## Test Paths & Sources - -All of the test implementations are located within a single file ([main.py](main.py)). - -## Resources - -* [Xpresso source code on GitHub](https://github.com/adriangb/xpresso) -* [Xpresso website - documentation](https://xpresso-api.dev) - -[Xpresso]: https://github.com/adriangb/xpresso -[Starlette]: https://github.com/encode/starlette -[Pydantic]: https://github.com/samuelcolvin/pydantic/ -[di]: https://github.com/adriangb/di diff --git a/frameworks/Python/xpresso/benchmark_config.json b/frameworks/Python/xpresso/benchmark_config.json deleted file mode 100755 index dcc76e906a7..00000000000 --- a/frameworks/Python/xpresso/benchmark_config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "framework": "xpresso", - "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", - "database": "Postgres", - "framework": "Xpresso", - "language": "Python", - "flavor": "Python3", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Xpresso", - "notes": "", - "versus": "None" - } - } - ] -} diff --git a/frameworks/Python/xpresso/config.toml b/frameworks/Python/xpresso/config.toml deleted file mode 100644 index fe4a990a539..00000000000 --- a/frameworks/Python/xpresso/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "xpresso" - -[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 = "None" -webserver = "None" -versus = "None" diff --git a/frameworks/Python/xpresso/main.py b/frameworks/Python/xpresso/main.py deleted file mode 100755 index 0862fe51c7a..00000000000 --- a/frameworks/Python/xpresso/main.py +++ /dev/null @@ -1,158 +0,0 @@ -import multiprocessing -import os -import pathlib -from operator import itemgetter -from random import randint, sample -from typing import Annotated, AsyncIterable, Optional - -import asyncpg # type: ignore -import jinja2 # type: ignore -import uvicorn # type: ignore -from pydantic import BaseModel, Field -from starlette.responses import HTMLResponse, PlainTextResponse -from xpresso import App, Depends, Path, Response, FromQuery - -READ_ROW_SQL = 'SELECT "randomnumber", "id" 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.') - - -sort_fortunes_key = itemgetter(1) - -app_dir = pathlib.Path(__file__).parent -with (app_dir / "templates" / "fortune.html").open() as template_file: - template = jinja2.Template(template_file.read()) - - -async def get_db_pool() -> AsyncIterable[asyncpg.Pool]: - async with asyncpg.create_pool( # type: ignore - user=os.getenv('PGUSER', 'benchmarkdbuser'), - password=os.getenv('PGPASS', 'benchmarkdbpass'), - database=os.getenv('PGDB', 'hello_world'), - host=os.getenv('PGHOST', 'tfb-database'), - port=5432, - ) as pool: - yield pool - - -DBPool = Annotated[asyncpg.Pool, Depends(get_db_pool, scope="app")] - - -def get_num_queries(queries: Optional[str]) -> int: - if not queries: - return 1 - try: - queries_num = int(queries) - except (ValueError, TypeError): - return 1 - if queries_num < 1: - return 1 - if queries_num > 500: - return 500 - return queries_num - - - -class Greeting(BaseModel): - message: str - - -def json_serialization() -> Greeting: - return Greeting(message="Hello, world!") - - -def plaintext() -> Response: - return PlainTextResponse(b"Hello, world!") - - -class QueryResult(BaseModel): - id: int - randomNumber: int - - -async def single_database_query(pool: DBPool) -> QueryResult: - row_id = randint(1, 10000) - - connection: "asyncpg.Connection" - async with pool.acquire() as connection: # type: ignore - number: int = await connection.fetchval(READ_ROW_SQL, row_id) # type: ignore - - return QueryResult.construct(id=row_id, randomNumber=number) - - -QueryCount = Annotated[str, Field(gt=0, le=500)] - - -async def multiple_database_queries( - pool: DBPool, - queries: FromQuery[str | None] = None, -) -> list[QueryResult]: - num_queries = get_num_queries(queries) - row_ids = sample(range(1, 10000), num_queries) - - connection: "asyncpg.Connection" - async with pool.acquire() as connection: # type: ignore - statement = await connection.prepare(READ_ROW_SQL) # type: ignore - return [ - QueryResult.construct( - id=row_id, - randomNumber=await statement.fetchval(row_id), # type: ignore - ) - for row_id in row_ids - ] - - -async def fortunes(pool: DBPool) -> Response: - connection: "asyncpg.Connection" - async with pool.acquire() as connection: # type: ignore - fortunes: "list[tuple[int, str]]" = await connection.fetch("SELECT * FROM Fortune") # type: ignore - - fortunes.append(ADDITIONAL_ROW) - fortunes.sort(key=sort_fortunes_key) - content = template.render(fortunes=fortunes) # type: ignore - return HTMLResponse(content) - - -async def database_updates( - pool: DBPool, - queries: FromQuery[str | None] = None, -) -> list[QueryResult]: - num_queries = get_num_queries(queries) - - updates = [(row_id, randint(1, 10000)) for row_id in sample(range(1, 10000), num_queries)] - - 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) # type: ignore - - return [QueryResult.construct(id=row_id, randomNumber=number) for row_id, number in updates] - - -routes = ( - Path("/json", get=json_serialization), - Path("/plaintext", get=plaintext), - Path("/db", get=single_database_query), - Path("/queries", get=multiple_database_queries), - Path("/fortunes", get=fortunes), - Path("/updates", get=database_updates), -) - - -app = App(routes=routes) - - -if __name__ == "__main__": - workers = multiprocessing.cpu_count() - if os.environ.get("TRAVIS") == "true": - workers = 2 - uvicorn.run( # type: ignore - "main:app", - host="0.0.0.0", - port=8080, - workers=workers, - log_level="error", - loop="uvloop", - http="httptools", - ) diff --git a/frameworks/Python/xpresso/requirements.txt b/frameworks/Python/xpresso/requirements.txt deleted file mode 100644 index e9e6af671f9..00000000000 --- a/frameworks/Python/xpresso/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -asyncpg==0.27.0 -Jinja2==2.11.3 -markupsafe==2.0.1 -httptools==0.5.0 -uvloop==0.17.0 -uvicorn==0.20.0 -xpresso==0.46.0 diff --git a/frameworks/Python/xpresso/templates/fortune.html b/frameworks/Python/xpresso/templates/fortune.html deleted file mode 100644 index 1c90834285d..00000000000 --- a/frameworks/Python/xpresso/templates/fortune.html +++ /dev/null @@ -1,10 +0,0 @@ - - -Fortunes - - - -{% for fortune in fortunes %} -{% endfor %}
      idmessage
      {{ fortune[0] }}{{ fortune[1]|e }}
      - - diff --git a/frameworks/Python/xpresso/xpresso.dockerfile b/frameworks/Python/xpresso/xpresso.dockerfile deleted file mode 100644 index f0aba7a9005..00000000000 --- a/frameworks/Python/xpresso/xpresso.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM python:3.10 - -RUN mkdir /xpresso -WORKDIR /xpresso - -COPY ./requirements.txt /xpresso/ - -RUN pip install --no-cache-dir -r /xpresso/requirements.txt - -COPY ./ /xpresso/ - -EXPOSE 8080 - -CMD ["python", "main.py"] From d761d5632ac7fc9dc53dd741aa24e837b80489e6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:55:29 +0100 Subject: [PATCH 1241/1766] [python/vibora] Remove Vibora (#9649) Vibora hasn't been updated in 6 years and the repo has been archived: https://github.com/vibora-io/vibora --- frameworks/Python/vibora/README.md | 46 ------- frameworks/Python/vibora/app.py | 115 ------------------ .../Python/vibora/benchmark_config.json | 24 ---- frameworks/Python/vibora/config.toml | 16 --- frameworks/Python/vibora/db.py | 36 ------ frameworks/Python/vibora/requirements.txt | 2 - frameworks/Python/vibora/templates/index.html | 21 ---- frameworks/Python/vibora/vibora.dockerfile | 11 -- 8 files changed, 271 deletions(-) delete mode 100644 frameworks/Python/vibora/README.md delete mode 100644 frameworks/Python/vibora/app.py delete mode 100644 frameworks/Python/vibora/benchmark_config.json delete mode 100644 frameworks/Python/vibora/config.toml delete mode 100644 frameworks/Python/vibora/db.py delete mode 100644 frameworks/Python/vibora/requirements.txt delete mode 100644 frameworks/Python/vibora/templates/index.html delete mode 100644 frameworks/Python/vibora/vibora.dockerfile diff --git a/frameworks/Python/vibora/README.md b/frameworks/Python/vibora/README.md deleted file mode 100644 index 647792661a2..00000000000 --- a/frameworks/Python/vibora/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# [Vibora](https://github.com/vibora-io/vibora) Benchmark Test - -The information below is specific to Vibora. For further guidance, -review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki). -Also note that there is additional information that's provided in -the [Python README](../). - -This is the Python Vibora portion of a [benchmarking tests suite](../../) -comparing a variety of frameworks. - -All test implementations are located within a single file -([app.py](app.py)). - -## Description - -Vibora, Vibora + psycopg2 - -### Database - -Postgres - -## Test URLs -### JSON Encoding - -http://localhost:8080/json - -### Single Row Random Query - -http://localhost:8080/db - -### Plaintext - -http://localhost:8080/plaintext - - - -The following tests cannot be currently run due to an issue with the framework -[Details Here] = https://github.com/vibora-io/vibora/issues/223 - -### Update random rows - -http://localhost:8080/updates/?queries= - -### Variable Row Query Test - -http://localhost:8080/db?queries= diff --git a/frameworks/Python/vibora/app.py b/frameworks/Python/vibora/app.py deleted file mode 100644 index 243aa4365e1..00000000000 --- a/frameworks/Python/vibora/app.py +++ /dev/null @@ -1,115 +0,0 @@ -import multiprocessing -import os -from random import randint -from operator import itemgetter - -from vibora import Vibora, Request, JsonResponse, Response -from vibora.hooks import Events - -from db import Pool -DEFAULT_POOL_SIZE = 1000//multiprocessing.cpu_count() - -READ_ROW_SQL = 'SELECT * FROM "world" WHERE id={0}' -WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"={0} WHERE id={1} RETURNING id, randomNumber' -READ_ALL_FORTUNES = 'SELECT * FROM "fortune"' -ADDITIONAL_ROW = [0, 'Additional fortune added at request time.'] -sort_fortunes_key = itemgetter(1) - -app = Vibora(template_dirs=['templates']) - - -@app.handle(Events.BEFORE_SERVER_START) -async def init_db(app: Vibora): - app.components.add(await Pool("postgresql://%s:%s@%s:5432/%s" % (os.getenv("PGUSER", "benchmarkdbuser"), os.getenv("PSPASS", "benchmarkdbpass"), os.getenv("PGADDR", "tfb-database"), os.getenv("PGDB", "hello_world")), max_size=int(os.getenv("PGPOOLSIZE", DEFAULT_POOL_SIZE)))) - - -@app.handle(Events.BEFORE_SERVER_STOP) -async def close_db(app: Vibora): - await asyncio.wait_for(app.components.get(Pool).close(), timeout=10) - - -def getQueriesTotal(params): - try: - queries = params['queries'][0] - query_count = int(queries) - except: - return 1 - - if query_count < 1: - return 1 - if query_count > 500: - return 500 - return query_count - - -async def fetchWorld(pool): - async with pool.acquire() as conn: - return await conn.fetchrow(READ_ROW_SQL.format(randint(1, 10000))) - - -async def updateWorld(world_id, pool): - async with pool.acquire() as conn: - return await conn.fetchrow(WRITE_ROW_SQL.format(randint(1, 10000), world_id)) - - -async def fetchMultipleWorlds(total, pool): - worlds = [] - for x in range(total): - res = await fetchWorld(pool) - worlds.append({'id': res[0], 'randomNumber': res[1]}) - return worlds - - -async def updateMultipleWorlds(total, pool): - worlds = [] - for x in range(total): - res = await fetchWorld(pool) - updated = await updateWorld(res[0], pool) - worlds.append({'id': updated[0], 'randomNumber': updated[1]}) - return worlds - - -async def fetchFortunes(pool): - async with pool.acquire() as conn: - return await conn.fetch(READ_ALL_FORTUNES) - - -@app.route('/fortunes') -async def fortunes(pool: Pool): - fortunes = await fetchFortunes(pool) - fortunes.append(ADDITIONAL_ROW) - fortunes.sort(key=sort_fortunes_key) - return await app.render('index.html', fortunes=fortunes) - - -@app.route('/db') -async def single_query(request: Request, pool: Pool): - res = await fetchWorld(pool) - return JsonResponse({'id': res[0], 'randomNumber': res[1]}, headers={'Server': 'Vibora'}) - - -@app.route('/plaintext') -async def plaintext(): - return Response(b'Hello, World!', headers={'Server': 'Vibora', 'Content-Type': 'text/plain'}) - - -@app.route('/json') -async def json(): - return JsonResponse({'message': 'Hello, World!'}, headers={'Server': 'Vibora'}) - - -@app.route('/queries') -async def multiple_queries(request: Request, pool: Pool): - total_queries = getQueriesTotal(request.args) - worlds = await fetchMultipleWorlds(total_queries, pool) - return JsonResponse(worlds, headers={'Server': 'Vibora', 'Content-Type': 'application/json', 'Content-Length': str(total_queries)}) - - -@app.route('/updates') -async def update_queries(request: Request, pool: Pool): - total_queries = getQueriesTotal(request.args) - worlds = await updateMultipleWorlds(total_queries, pool) - return JsonResponse(worlds, headers={'Server': 'Vibora', 'Content-Type': 'application/json', 'Content-Length': str(total_queries)}) - -if __name__ == '__main__': - app.run(host="0.0.0.0", port=8000, workers=multiprocessing.cpu_count()) diff --git a/frameworks/Python/vibora/benchmark_config.json b/frameworks/Python/vibora/benchmark_config.json deleted file mode 100644 index 3876196498a..00000000000 --- a/frameworks/Python/vibora/benchmark_config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "framework": "vibora", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "port": 8000, - "approach": "Realistic", - "classification": "Platform", - "framework": "vibora", - "language": "Python", - "flavor": "Python3", - "platform": "None", - "webserver": "None", - "os": "Linux", - "orm": "Full", - "database_os": "Linux", - "database": "Postgres", - "display_name": "Vibora", - "notes": "" - } - }] -} diff --git a/frameworks/Python/vibora/config.toml b/frameworks/Python/vibora/config.toml deleted file mode 100644 index 03952ecdb41..00000000000 --- a/frameworks/Python/vibora/config.toml +++ /dev/null @@ -1,16 +0,0 @@ -[framework] -name = "vibora" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "None" -webserver = "None" -versus = "None" diff --git a/frameworks/Python/vibora/db.py b/frameworks/Python/vibora/db.py deleted file mode 100644 index 2f3fe5560e2..00000000000 --- a/frameworks/Python/vibora/db.py +++ /dev/null @@ -1,36 +0,0 @@ -import asyncio -from contextlib import asynccontextmanager -import asyncpg - - -class Connection(asyncpg.Connection): - async def reset(self, *, timeout=None): - pass - - -class Pool: - def __init__(self, connect_url, max_size=10, connection_class=None): - self._connect_url = connect_url - self._connection_class = connection_class or Connection - self._queue = asyncio.LifoQueue(max_size) - - def __await__(self): - return self._async_init__().__await__() - - async def _async_init__(self): - for _ in range(self._queue.maxsize): - self._queue.put_nowait(await asyncpg.connect(self._connect_url, connection_class=self._connection_class)) - return self - - @asynccontextmanager - async def acquire(self): - conn = await self._queue.get() - try: - yield conn - finally: - self._queue.put_nowait(conn) - - async def close(self): - for _ in range(self._queue.maxsize): - conn = await self._queue.get() - await conn.close() diff --git a/frameworks/Python/vibora/requirements.txt b/frameworks/Python/vibora/requirements.txt deleted file mode 100644 index 88fbcd0ba4b..00000000000 --- a/frameworks/Python/vibora/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -asyncpg==0.26.0 -git+https://github.com/IterableTrucks/vibora.git@a24bbf417a84df3a25f7e8901613a1c50ccfe63f#egg=vibora[fast] diff --git a/frameworks/Python/vibora/templates/index.html b/frameworks/Python/vibora/templates/index.html deleted file mode 100644 index 55c472c8ee1..00000000000 --- a/frameworks/Python/vibora/templates/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fortunes - - - - - - - - {% for fortune in fortunes %} - - - - - {% endfor %} -
      idmessage
      {{ fortune[0] }}{{ fortune[1] }}
      - - \ No newline at end of file diff --git a/frameworks/Python/vibora/vibora.dockerfile b/frameworks/Python/vibora/vibora.dockerfile deleted file mode 100644 index 5a2685d5ec5..00000000000 --- a/frameworks/Python/vibora/vibora.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.10.6 - -ADD ./ /vibora - -WORKDIR /vibora - -RUN pip3 install -r /vibora/requirements.txt - -EXPOSE 8000 - -CMD ["python3", "app.py"] From d9e8d81e3fbb6b7f92ba6dfe0efffa07f57f6aea Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:55:36 +0100 Subject: [PATCH 1242/1766] [ruby/grape] Update Ruby to 3.4 (#9650) Also set Date header for Puma only. --- frameworks/Ruby/grape/Gemfile | 2 +- frameworks/Ruby/grape/README.md | 2 +- frameworks/Ruby/grape/config.ru | 2 +- frameworks/Ruby/grape/grape-unicorn.dockerfile | 2 +- frameworks/Ruby/grape/grape.dockerfile | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/grape/Gemfile b/frameworks/Ruby/grape/Gemfile index 185a55f68e2..1aea70fade0 100644 --- a/frameworks/Ruby/grape/Gemfile +++ b/frameworks/Ruby/grape/Gemfile @@ -4,6 +4,6 @@ gem 'mysql2', '0.5.6' gem 'unicorn', '6.1.0' gem 'puma', '~> 6.4' gem 'activerecord', '~> 7.1.0', :require => 'active_record' -gem 'grape', '2.0.0' +gem 'grape', '2.1.1' gem 'multi_json', require: 'multi_json' gem 'oj', '~> 3.16' diff --git a/frameworks/Ruby/grape/README.md b/frameworks/Ruby/grape/README.md index 6e35abfae04..87f4e3f1c2a 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](http://www.ruby-lang.org/) +* [Ruby 3.4](http://www.ruby-lang.org/) * [Grape 2.0.0](http://www.ruby-grape.org/) * [Unicorn 6.1.0](https://yhbt.net/unicorn/) * [Puma 6.4](https://puma.io/) diff --git a/frameworks/Ruby/grape/config.ru b/frameworks/Ruby/grape/config.ru index 22142a30c72..a91b5364a11 100644 --- a/frameworks/Ruby/grape/config.ru +++ b/frameworks/Ruby/grape/config.ru @@ -77,7 +77,7 @@ module Acme class API < Grape::API before do - header 'Date', Time.now.httpdate + header 'Date', Time.now.httpdate if defined?(Puma) header 'Server', 'WebServer' end content_type :json, 'application/json' diff --git a/frameworks/Ruby/grape/grape-unicorn.dockerfile b/frameworks/Ruby/grape/grape-unicorn.dockerfile index f805021f71e..4f32633e8bb 100644 --- a/frameworks/Ruby/grape/grape-unicorn.dockerfile +++ b/frameworks/Ruby/grape/grape-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/grape/grape.dockerfile b/frameworks/Ruby/grape/grape.dockerfile index 99898d43e65..e14f49a9bb4 100644 --- a/frameworks/Ruby/grape/grape.dockerfile +++ b/frameworks/Ruby/grape/grape.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 From 7935fc5d70773800e682d7fe3a306c1e254699b6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:55:45 +0100 Subject: [PATCH 1243/1766] [ruby/sinatra] Add iodine to the tests (#9651) +--------------+------+-----+-----+------+-------+---------+--------------+ | | json| db|query|update|fortune|plaintext|weighted_score| +--------------+------+-----+-----+------+-------+---------+--------------+ | master| 58048|23085|12225| 5170| 12364| 47186| 775| |sinatra/iodine|103642|41732|31679| 7853| 10708| 100518| 1461| +--------------+------+-----+-----+------+-------+---------+--------------+ --- frameworks/Ruby/sinatra/Gemfile | 6 ++++- frameworks/Ruby/sinatra/Gemfile.lock | 2 ++ frameworks/Ruby/sinatra/benchmark_config.json | 22 +++++++++++++++++++ frameworks/Ruby/sinatra/boot.rb | 2 ++ frameworks/Ruby/sinatra/hello_world.rb | 3 +++ .../sinatra-postgres-iodine-mri.dockerfile | 20 +++++++++++++++++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index c80246d6a35..70a541e6be1 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -12,6 +12,10 @@ group :postgresql, optional: true do gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] end +group :iodine, optional: true do + gem 'iodine', '~> 0.7', platforms: [:ruby, :mswin], require: false +end + group :passenger, optional: true do gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false end @@ -20,7 +24,7 @@ group :puma, optional: true do gem 'puma', '~> 6.4', require: false end -group :unicorn do +group :unicorn, optional: true do gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false end diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 3e41be6ff15..93710d657af 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -29,6 +29,7 @@ GEM drb (2.2.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + iodine (0.7.58) json (2.10.1) kgio (2.11.4) logger (1.6.6) @@ -81,6 +82,7 @@ PLATFORMS DEPENDENCIES activerecord (~> 8.0) agoo + iodine (~> 0.7) json (~> 2.8) mysql2 (~> 0.5) passenger (~> 6.0) diff --git a/frameworks/Ruby/sinatra/benchmark_config.json b/frameworks/Ruby/sinatra/benchmark_config.json index 3e318c9aa58..611f763606b 100644 --- a/frameworks/Ruby/sinatra/benchmark_config.json +++ b/frameworks/Ruby/sinatra/benchmark_config.json @@ -66,6 +66,28 @@ "versus": "rack-postgres-agoo-mri", "notes": "" }, + "postgres-iodine-mri": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "sinatra", + "language": "Ruby", + "orm": "Full", + "platform": "Rack", + "webserver": "Iodine", + "os": "Linux", + "database_os": "Linux", + "display_name": "sinatra-postgres-iodine-mri", + "versus": "rack-postgres-iodine-mri", + "notes": "" + }, "postgres-passenger-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index 261e12f1145..c0c905d21ee 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -15,6 +15,8 @@ 'puma' elsif defined?(Unicorn) 'unicorn' + elsif defined?(Iodine) + 'iodine' elsif defined?(Agoo) 'agoo' end diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index 4cad26711d4..54afe906d6a 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -10,6 +10,9 @@ class HelloWorld < Sinatra::Base # XSS, CSRF, IP spoofing, etc. protection are not explicitly required disable :protection + # disable it for all environments + set :host_authorization, { permitted_hosts: [] } + # Only add the charset parameter to specific content types per the requirements set :add_charset, [mime_type(:html)] end diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile new file mode 100644 index 00000000000..30dac9dc01a --- /dev/null +++ b/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile @@ -0,0 +1,20 @@ +FROM ruby:3.4 + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +ADD ./ /sinatra +WORKDIR /sinatra + +ENV BUNDLE_WITH=postgresql:iodine +RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile + +ENV DBTYPE=postgresql + +EXPOSE 8080 + +CMD bundle exec iodine -p 8080 -w $(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From 3e76271c378635452cef00e937f61789401d1710 Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Fri, 14 Mar 2025 04:55:53 +0800 Subject: [PATCH 1244/1766] Paozhu update (#9652) * Paozhu update * Update orm file * [Paozhu] update orm file --- CMakeCache.txt | 505 ++++ CMakeFiles/3.31.5/CMakeCCompiler.cmake | 81 + CMakeFiles/3.31.5/CMakeCXXCompiler.cmake | 101 + .../3.31.5/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 4424 bytes .../3.31.5/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 4408 bytes CMakeFiles/3.31.5/CMakeSystem.cmake | 15 + .../3.31.5/CompilerIdC/CMakeCCompilerId.c | 904 ++++++ .../3.31.5/CompilerIdC/CMakeCCompilerId.o | Bin 0 -> 1528 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 919 ++++++ .../3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o | Bin 0 -> 1536 bytes CMakeFiles/CMakeConfigureLog.yaml | 471 +++ CMakeFiles/cmake.check_cache | 1 + frameworks/C++/paozhu/paozhu.dockerfile | 16 +- .../orm/include/fortune_mysql.h | 2527 +++++++++++------ .../orm/include/fortunebase.h | 2 +- .../orm/include/world_mysql.h | 2527 +++++++++++------ .../paozhu_benchmark/orm/include/worldbase.h | 2 +- 17 files changed, 6207 insertions(+), 1864 deletions(-) create mode 100644 CMakeCache.txt create mode 100644 CMakeFiles/3.31.5/CMakeCCompiler.cmake create mode 100644 CMakeFiles/3.31.5/CMakeCXXCompiler.cmake create mode 100755 CMakeFiles/3.31.5/CMakeDetermineCompilerABI_C.bin create mode 100755 CMakeFiles/3.31.5/CMakeDetermineCompilerABI_CXX.bin create mode 100644 CMakeFiles/3.31.5/CMakeSystem.cmake create mode 100644 CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c create mode 100644 CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o create mode 100644 CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o create mode 100644 CMakeFiles/CMakeConfigureLog.yaml create mode 100644 CMakeFiles/cmake.check_cache diff --git a/CMakeCache.txt b/CMakeCache.txt new file mode 100644 index 00000000000..628d4cdc769 --- /dev/null +++ b/CMakeCache.txt @@ -0,0 +1,505 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hzq/cpp/FrameworkBenchmarks +# It was generated by CMake: /usr/local/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a library. +BRDEC_LIB_DIR:FILEPATH=BRDEC_LIB_DIR-NOTFOUND + +//Path to a library. +BR_LIB_DIR:FILEPATH=BR_LIB_DIR-NOTFOUND + +//Path to a library. +Brotli:FILEPATH=Brotli-NOTFOUND + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=CMAKE_ADDR2LINE-NOTFOUND + +//Path to a program. +CMAKE_AR:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Release + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc + +//Flags used by the C compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the C compiler during DEBUG builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the C compiler during RELEASE builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/pkgRedirects + +//Path to a program. +CMAKE_INSTALL_NAME_TOOL:FILEPATH=/usr/bin/install_name_tool + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=CMAKE_OBJCOPY-NOTFOUND + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/objdump + +//Build architectures for OSX +CMAKE_OSX_ARCHITECTURES:STRING= + +//Minimum OS X version to target for deployment (at runtime); newer +// APIs weak linked. Set to empty string for default value. +CMAKE_OSX_DEPLOYMENT_TARGET:STRING=14.7 + +//The product will be built against the headers and libraries located +// inside the indicated SDK. +CMAKE_OSX_SYSROOT:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Paozhu_web_framework + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=CMAKE_READELF-NOTFOUND + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip + +//Path to a program. +CMAKE_TAPI:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//choose ON to enable +ENABLE_BOOST:BOOL=OFF + +//choose ON to enable +ENABLE_GD:BOOL=ON + +//choose ON to enable +ENABLE_VCPKG:BOOL=OFF + +//choose ON to enable +ENABLE_WIN_VCPKG:BOOL=OFF + +//Path to a library. +FREETYPE_LIB_DIR:FILEPATH=/usr/local/opt/freetype/lib/libfreetype.dylib + +//Path to a library. +GD_LIB_DIR:FILEPATH=/usr/local/opt/gd/lib/libgd.dylib + +//Path to a file. +MYSQL_INCLUDE_DIR:PATH=/usr/local/mysql/include + +//Path to a library. +MYSQL_LIBRARY:FILEPATH=/usr/local/mysql/lib/libmysqlclient.dylib + +//Path to a file. +MYSQL_ROOT_DIR:PATH=/usr/local + +//Path to a library. +OPENSSL_CRYPTO_LIBRARY:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libcrypto.dylib + +//Path to a file. +OPENSSL_INCLUDE_DIR:PATH=/usr/local/Cellar/openssl@3/3.4.1/include + +//Path to a library. +OPENSSL_SSL_LIBRARY:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libssl.dylib + +//Arguments to supply to pkg-config +PKG_CONFIG_ARGN:STRING= + +//pkg-config executable +PKG_CONFIG_EXECUTABLE:FILEPATH=/usr/local/bin/pkg-config + +//Path to a library. +PNG_LIB_DIR:FILEPATH=/usr/local/opt/libpng/lib/libpng.dylib + +//Value Computed by CMake +Paozhu_web_framework_BINARY_DIR:STATIC=/Users/hzq/cpp/FrameworkBenchmarks + +//Value Computed by CMake +Paozhu_web_framework_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +Paozhu_web_framework_SOURCE_DIR:STATIC=/Users/hzq/cpp + +//Path to a library. +QR_LIB_DIR:FILEPATH=/usr/local/opt/qrencode/lib/libqrencode.dylib + +//Path to a file. +ZLIB_INCLUDE_DIR:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include + +//Path to a library. +ZLIB_LIBRARY_DEBUG:FILEPATH=ZLIB_LIBRARY_DEBUG-NOTFOUND + +//Path to a library. +ZLIB_LIBRARY_RELEASE:FILEPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/libz.tbd + +//Path to a library. +pkgcfg_lib__OPENSSL_crypto:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libcrypto.dylib + +//Path to a library. +pkgcfg_lib__OPENSSL_ssl:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libssl.dylib + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hzq/cpp/FrameworkBenchmarks +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/local/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/local/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=MACHO +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hzq/cpp +//ADVANCED property for variable: CMAKE_INSTALL_NAME_TOOL +CMAKE_INSTALL_NAME_TOOL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/local/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Details about finding OpenSSL +FIND_PACKAGE_MESSAGE_DETAILS_OpenSSL:INTERNAL=[/usr/local/Cellar/openssl@3/3.4.1/lib/libcrypto.dylib][/usr/local/Cellar/openssl@3/3.4.1/include][c ][v3.4.1()] +//Details about finding ZLIB +FIND_PACKAGE_MESSAGE_DETAILS_ZLIB:INTERNAL=[/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/libz.tbd][/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include][c ][v1.2.12()] +//Details about finding mysql +FIND_PACKAGE_MESSAGE_DETAILS_mysql:INTERNAL=[/usr/local][v()] +//ADVANCED property for variable: OPENSSL_CRYPTO_LIBRARY +OPENSSL_CRYPTO_LIBRARY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: OPENSSL_INCLUDE_DIR +OPENSSL_INCLUDE_DIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: OPENSSL_SSL_LIBRARY +OPENSSL_SSL_LIBRARY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PKG_CONFIG_ARGN +PKG_CONFIG_ARGN-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE +PKG_CONFIG_EXECUTABLE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: ZLIB_INCLUDE_DIR +ZLIB_INCLUDE_DIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: ZLIB_LIBRARY_DEBUG +ZLIB_LIBRARY_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: ZLIB_LIBRARY_RELEASE +ZLIB_LIBRARY_RELEASE-ADVANCED:INTERNAL=1 +_OPENSSL_CFLAGS:INTERNAL=-I/usr/local/Cellar/openssl@3/3.4.1/include +_OPENSSL_CFLAGS_I:INTERNAL= +_OPENSSL_CFLAGS_OTHER:INTERNAL= +_OPENSSL_FOUND:INTERNAL=1 +_OPENSSL_INCLUDEDIR:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/include +_OPENSSL_INCLUDE_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/include +_OPENSSL_LDFLAGS:INTERNAL=-L/usr/local/Cellar/openssl@3/3.4.1/lib;-lssl;-lcrypto +_OPENSSL_LDFLAGS_OTHER:INTERNAL= +_OPENSSL_LIBDIR:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib +_OPENSSL_LIBRARIES:INTERNAL=ssl;crypto +_OPENSSL_LIBRARY_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib +_OPENSSL_LIBS:INTERNAL= +_OPENSSL_LIBS_L:INTERNAL= +_OPENSSL_LIBS_OTHER:INTERNAL= +_OPENSSL_LIBS_PATHS:INTERNAL= +_OPENSSL_MODULE_NAME:INTERNAL=openssl +_OPENSSL_PREFIX:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1 +_OPENSSL_STATIC_CFLAGS:INTERNAL=-I/usr/local/Cellar/openssl@3/3.4.1/include +_OPENSSL_STATIC_CFLAGS_I:INTERNAL= +_OPENSSL_STATIC_CFLAGS_OTHER:INTERNAL= +_OPENSSL_STATIC_INCLUDE_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/include +_OPENSSL_STATIC_LDFLAGS:INTERNAL=-L/usr/local/Cellar/openssl@3/3.4.1/lib;-lssl;-lcrypto +_OPENSSL_STATIC_LDFLAGS_OTHER:INTERNAL= +_OPENSSL_STATIC_LIBDIR:INTERNAL= +_OPENSSL_STATIC_LIBRARIES:INTERNAL=ssl;crypto +_OPENSSL_STATIC_LIBRARY_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib +_OPENSSL_STATIC_LIBS:INTERNAL= +_OPENSSL_STATIC_LIBS_L:INTERNAL= +_OPENSSL_STATIC_LIBS_OTHER:INTERNAL= +_OPENSSL_STATIC_LIBS_PATHS:INTERNAL= +_OPENSSL_VERSION:INTERNAL=3.4.1 +_OPENSSL_openssl_INCLUDEDIR:INTERNAL= +_OPENSSL_openssl_LIBDIR:INTERNAL= +_OPENSSL_openssl_PREFIX:INTERNAL= +_OPENSSL_openssl_VERSION:INTERNAL= +__pkg_config_arguments__OPENSSL:INTERNAL=QUIET;openssl +__pkg_config_checked__OPENSSL:INTERNAL=1 +//ADVANCED property for variable: pkgcfg_lib__OPENSSL_crypto +pkgcfg_lib__OPENSSL_crypto-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: pkgcfg_lib__OPENSSL_ssl +pkgcfg_lib__OPENSSL_ssl-ADVANCED:INTERNAL=1 +prefix_result:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib + diff --git a/CMakeFiles/3.31.5/CMakeCCompiler.cmake b/CMakeFiles/3.31.5/CMakeCCompiler.cmake new file mode 100644 index 00000000000..bb8540e2ff3 --- /dev/null +++ b/CMakeFiles/3.31.5/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "AppleClang") +set(CMAKE_C_COMPILER_VERSION "16.0.0.16000026") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Darwin") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") +set(CMAKE_C_COMPILER_AR "") +set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") +set(CMAKE_C_COMPILER_RANLIB "") +set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") +set(CMAKE_C_COMPILER_LINKER_ID "AppleClang") +set(CMAKE_C_COMPILER_LINKER_VERSION 1115.7.3) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks") diff --git a/CMakeFiles/3.31.5/CMakeCXXCompiler.cmake b/CMakeFiles/3.31.5/CMakeCXXCompiler.cmake new file mode 100644 index 00000000000..c7424f026f2 --- /dev/null +++ b/CMakeFiles/3.31.5/CMakeCXXCompiler.cmake @@ -0,0 +1,101 @@ +set(CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "AppleClang") +set(CMAKE_CXX_COMPILER_VERSION "16.0.0.16000026") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "23") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "") + +set(CMAKE_CXX_PLATFORM_ID "Darwin") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") +set(CMAKE_CXX_COMPILER_AR "") +set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "") +set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") +set(CMAKE_CXX_COMPILER_LINKER_ID "AppleClang") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 1115.7.3) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Unsupported generator: Unix Makefiles") + + + diff --git a/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_C.bin b/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..7d275c141229e74eb817c16a7516320ade785bfe GIT binary patch literal 4424 zcmeHK&ubGw6rMCGtymlF!5{d8oTPeaiwcIKkd|(daM``4d6 zLL`zxh%R^%I-!)y6~ESQ_$R*{1Yy5LeTX>Hud^BU zQr7*4p6^J{U#Tb@<@ZYWo7d-vsr%oot^c%T-!Uev1MQ$sL^rLMse)lnZ&m9XLTsrL ze6omK*EkEz_a%q3@NHn~{Tb^9*5mM5IE^)Qz6ERk#qb;=1MhsCyn)Nwm3u&%H)1aMy>%hrr7#g{LoLVSkF)i}i}e)GM}Ffmnf9fmnf9fmnf9 zfmnf9fmnh6LxKBd^UJRBgJhbI_swSg+pf_fGMDe}o6ov$VVi!R>P;H0rqR;DJcDmj zW+XTl2|hJi3m*}&?8%wYn)k@9tVm}gs1`@E2csvlLfF>KWN9>LNVi&XonqA*mwDT; zChW0rL{;ZYjlh+as^eCR(^jD{ZAinOu*Ph3;=FS~b&9T>T{zq1u+nd1j-=((xBcOK z)Q2u7RVNi!BUHOWsJUtc0XnU-faj02gcN6(Ad#f_a0#Eii`dHbHR*1;%XM67&0WHs z#4*movO^?sVtvW;#Q=`-3~dPBk6w#T?;#&*!h8mk n_+ch$DvvOcib)u6KZ7iJtJ3uyZ^;*ja%C?F%I-lL|Dyc@n83pj literal 0 HcmV?d00001 diff --git a/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_CXX.bin b/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..b296b6a08d9df22cd1c94e57cf070d94c2662347 GIT binary patch literal 4408 zcmeHK&ubG=5PoS=TCq08gD5KGBx<3*6p6)RTe{6I#%-x7l!h{GvfE}M-IQd5ja2Bx zLlE)cKOl(zf#^*H4?Xr@=*3$Ek3~fM=Ix8STkA#ewga>8ee-5!=Y6}E@9_KApM63k zl0t|c_z-*r;F-u^C&VSV4kuci$!V+F(gH`LmWaYr5%FJhF(~ zQaB4d2Fx>Dgzo?|-=DDVVm%9AgtPHC=>8|1^Dl@ECZK!>O+^FwA{;?`iiNWIK#-l?K)6c(uFbn1>4-b!wk6}sz0f9+FC~ia~%AT(j&p8NbtGVS^JELVa_j1Hk>DRZIi4WuU;I>cBLmyg)ohU z`O>7}IgQ)51YUogj*Oe}2dCTYf3Um8(!WT_E*9D3F zyED!}asT;RlCLFN&5z$XuAgvM)`b$Pj^|bFZq6@h C{m3K$ literal 0 HcmV?d00001 diff --git a/CMakeFiles/3.31.5/CMakeSystem.cmake b/CMakeFiles/3.31.5/CMakeSystem.cmake new file mode 100644 index 00000000000..4ba5c26de72 --- /dev/null +++ b/CMakeFiles/3.31.5/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-23.6.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "23.6.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Darwin-23.6.0") +set(CMAKE_SYSTEM_NAME "Darwin") +set(CMAKE_SYSTEM_VERSION "23.6.0") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c b/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 00000000000..8d8bb038bb3 --- /dev/null +++ b/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o b/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..2841bb77a683b7540ec18d6ad9c9412889cfc437 GIT binary patch literal 1528 zcmbVMzl#$=6rSA0TtK}`VR3>B0WDHVazzAf5|TY4=$#x9gb>CdyGa(3P1tNS92}%k z2#4SwU}5QBU}mPZ}&|$i5#ep%zW?XH*c7?`Sj!K*@h6Yb%6~l zj`d~@TN(>;6)QvbIr5o`ARjnK+u#(m5)_0;>Dwbe)I+;!KB`8x)?Tqfd_gbR0*<&C z>l{KU8w1~S+!i~fT;|g}9>*=Z;DW4PNlHukDoT*DT&xx&JH_|RuxkoFqMV|?3sKr! zLw`MY5M6k+zXJ2!;ff@9@HxG=X7kZR_ymXcB!M>R$T;p8vOWdC12Q#FX(nqlTp(fULWV4Zy z%ad;>PlqiCpUcw|1+K6fJ3J7vQ7V?Yw2^#?tQ+uO!z!Hp3PkrUikqqDYo*Kj|Kk~Q zFiS=sh`BZ-5U*nF0wG2Y8%ES1F3=ijAo3G5dxR;*BqJd36Cyt`1a5&i&7GIn*55t3 zDW2u{b+$8XH`(51`+#gTRABot*{nmwADH7ddy>Xrs9LuC^C4F=R)>J&dal^ymlLw9 O9G881z}Te862AdX80ZQB literal 0 HcmV?d00001 diff --git a/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp b/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 00000000000..da6c824af3a --- /dev/null +++ b/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o b/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..db2cc10625b7caefd672fde07d6e4ac504a380cb GIT binary patch literal 1536 zcmbVM&ubGw6rQv(4X9}j9xAvH&_hp> z6v02hgGc`Yk6t{~gWxqsFWw@Ery^4Q-tL=h66wJ{GV{Hk-@IX7_RFvDr)xq)Rs}Y! zDAv0bY$+_rRjf_2&ycTF1o^}{+6Jef6{8?TO3xm7fgacu^I;{lwf2S;;`4jK=5s{F zq0S+cvOe(Kw$o&%l#6_t$K|+17o3yjD@kc7PlX9mmI{?ZXeareo9vo^k0>YT??RY1 z)6ief8H5*J?k~@Lceo-B9{kP};_LQR-IGJ-Y1^@++$qf`A2MHxon?^uS4MLjTDY>5 zc1t!~)wP3y<^JAsQJ(o)nvd;^LbO=*A&Y$jD=16MLUbtkS z=$$F&Jo2DC{&sBsrqc1Vlk#}@%RX)Orfcm|Y^$*ebsyQ8-)BkXyuKdcUI8XVJ zIjw!XySu%&MbFpn*lxAZ?|1BCM>)-!@FV?>@)|w2TP-OUPs?8A)>~E92cB{)$*qrdWJUwCH3agQWeGwTYBgso^@z=<@0sl3u{OKQGbl;+oNWNGpUe@1_ z=g7f48+{-~(U3rhv5gHhMh1viGKdQ^XQTp*(d@yFB^l$40N+oD`q(}&0pdJ&egJzN z2d3CAvaP=Zu(s3aNg9KpYTEMOhg{BB9s-W*xxyFm Z(M~4ov-0x^*;Q?a^YoOlN#jLr`~}c;>5>2d literal 0 HcmV?d00001 diff --git a/CMakeFiles/CMakeConfigureLog.yaml b/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 00000000000..0667d47946f --- /dev/null +++ b/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,471 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineSystem.cmake:205 (message)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + The system is: Darwin - 23.6.0 - x86_64 + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" failed. + Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc + Build flags: + Id flags: + + The output was: + 1 + ld: library 'System' not found + cc: error: linker command failed with exit code 1 (use -v to see invocation) + + + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc + Build flags: + Id flags: -c + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is AppleClang, found in: + /Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed. + Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ + Build flags: + Id flags: + + The output was: + 1 + ld: library 'c++' not found + c++: error: linker command failed with exit code 1 (use -v to see invocation) + + + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ + Build flags: + Id flags: -c + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is AppleClang, found in: + /Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC" + binary: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC" + cmakeVariables: + CMAKE_C_FLAGS: "" + CMAKE_C_FLAGS_DEBUG: "-g" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_OSX_ARCHITECTURES: "" + CMAKE_OSX_DEPLOYMENT_TARGET: "14.7" + CMAKE_OSX_SYSROOT: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC' + + Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_148e9/fast + /Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_148e9.dir/build.make CMakeFiles/cmTC_148e9.dir/build + Building C object CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl,-v -MD -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c + Apple clang version 16.0.0 (clang-1600.0.26.6) + Target: x86_64-apple-darwin23.6.0 + Thread model: posix + InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin + cc: warning: -Wl,-v: 'linker' input unused [-Wunused-command-line-argument] + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -x c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c + clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0 + ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include" + ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks" + #include "..." search starts here: + #include <...> search starts here: + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory) + End of search list. + Linking C executable cmTC_148e9 + /usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_148e9.dir/link.txt --verbose=1 + Apple clang version 16.0.0 (clang-1600.0.26.6) + Target: x86_64-apple-darwin23.6.0 + Thread model: posix + InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_148e9 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a + @(#)PROGRAM:ld PROJECT:ld-1115.7.3 + BUILD 23:50:35 Dec 5 2024 + configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em + will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em + LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) + TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) + Library search paths: + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift + Framework search paths: + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -o cmTC_148e9 + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:113 (message)" + - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Effective list of requested architectures (possibly empty) : "" + Effective list of architectures found in the ABI info binary: "x86_64" + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] + add: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] + add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + end of search list found + collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] + collapse include dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] + collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + implicit include dirs: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_148e9/fast] + ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_148e9.dir/build.make CMakeFiles/cmTC_148e9.dir/build] + ignore line: [Building C object CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o] + ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl -v -MD -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c] + ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] + ignore line: [Target: x86_64-apple-darwin23.6.0] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] + ignore line: [cc: warning: -Wl -v: 'linker' input unused [-Wunused-command-line-argument]] + ignore line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -x c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0] + ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory)] + ignore line: [End of search list.] + ignore line: [Linking C executable cmTC_148e9] + ignore line: [/usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_148e9.dir/link.txt --verbose=1] + ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] + ignore line: [Target: x86_64-apple-darwin23.6.0] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] + link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_148e9 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore + arg [-demangle] ==> ignore + arg [-lto_library] ==> ignore, skip following value + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> skip value of -lto_library + arg [-dynamic] ==> ignore + arg [-arch] ==> ignore + arg [x86_64] ==> ignore + arg [-platform_version] ==> ignore + arg [macos] ==> ignore + arg [14.7.0] ==> ignore + arg [15.2] ==> ignore + arg [-syslibroot] ==> ignore + arg [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk] ==> ignore + arg [-mllvm] ==> ignore + arg [-enable-linkonceodr-outlining] ==> ignore + arg [-o] ==> ignore + arg [cmTC_148e9] ==> ignore + arg [-search_paths_first] ==> ignore + arg [-headerpad_max_install_names] ==> ignore + arg [-v] ==> ignore + arg [CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lSystem] ==> lib [System] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] + linker tool for 'C': /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld + Library search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] + Framework search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] + remove lib [System] + remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] + collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] + collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] + collapse framework dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] + implicit libs: [] + implicit objs: [] + implicit dirs: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] + implicit fwks: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] + + + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Running the C compiler's linker: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "-v" + @(#)PROGRAM:ld PROJECT:ld-1115.7.3 + BUILD 23:50:35 Dec 5 2024 + configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em + will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em + LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) + TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) + - + kind: "try_compile-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX" + binary: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX" + cmakeVariables: + CMAKE_CXX_FLAGS: "" + CMAKE_CXX_FLAGS_DEBUG: "-g" + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_OSX_ARCHITECTURES: "" + CMAKE_OSX_DEPLOYMENT_TARGET: "14.7" + CMAKE_OSX_SYSROOT: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX' + + Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_8ba91/fast + /Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_8ba91.dir/build.make CMakeFiles/cmTC_8ba91.dir/build + Building CXX object CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl,-v -MD -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp + Apple clang version 16.0.0 (clang-1600.0.26.6) + Target: x86_64-apple-darwin23.6.0 + Thread model: posix + InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin + c++: warning: -Wl,-v: 'linker' input unused [-Wunused-command-line-argument] + ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1" + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1 -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdeprecated-macro -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -x c++ /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0 + ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include" + ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks" + #include "..." search starts here: + #include <...> search starts here: + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1 + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory) + End of search list. + Linking CXX executable cmTC_8ba91 + /usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8ba91.dir/link.txt --verbose=1 + Apple clang version 16.0.0 (clang-1600.0.26.6) + Target: x86_64-apple-darwin23.6.0 + Thread model: posix + InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_8ba91 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a + @(#)PROGRAM:ld PROJECT:ld-1115.7.3 + BUILD 23:50:35 Dec 5 2024 + configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em + will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em + LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) + TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) + Library search paths: + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift + Framework search paths: + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_8ba91 + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:113 (message)" + - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Effective list of requested architectures (possibly empty) : "" + Effective list of architectures found in the ABI info binary: "x86_64" + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] + add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] + add: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] + add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + end of search list found + collapse include dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] + collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] + collapse include dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] + collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + implicit include dirs: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_8ba91/fast] + ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_8ba91.dir/build.make CMakeFiles/cmTC_8ba91.dir/build] + ignore line: [Building CXX object CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl -v -MD -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] + ignore line: [Target: x86_64-apple-darwin23.6.0] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] + ignore line: [c++: warning: -Wl -v: 'linker' input unused [-Wunused-command-line-argument]] + ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1"] + ignore line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1 -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdeprecated-macro -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -x c++ /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0] + ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] + ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory)] + ignore line: [End of search list.] + ignore line: [Linking CXX executable cmTC_8ba91] + ignore line: [/usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8ba91.dir/link.txt --verbose=1] + ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] + ignore line: [Target: x86_64-apple-darwin23.6.0] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] + link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_8ba91 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore + arg [-demangle] ==> ignore + arg [-lto_library] ==> ignore, skip following value + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> skip value of -lto_library + arg [-dynamic] ==> ignore + arg [-arch] ==> ignore + arg [x86_64] ==> ignore + arg [-platform_version] ==> ignore + arg [macos] ==> ignore + arg [14.7.0] ==> ignore + arg [15.2] ==> ignore + arg [-syslibroot] ==> ignore + arg [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk] ==> ignore + arg [-mllvm] ==> ignore + arg [-enable-linkonceodr-outlining] ==> ignore + arg [-o] ==> ignore + arg [cmTC_8ba91] ==> ignore + arg [-search_paths_first] ==> ignore + arg [-headerpad_max_install_names] ==> ignore + arg [-v] ==> ignore + arg [CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lc++] ==> lib [c++] + arg [-lSystem] ==> lib [System] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] + linker tool for 'CXX': /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld + Library search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] + Framework search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] + remove lib [System] + remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] + collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] + collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] + collapse framework dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] + implicit libs: [c++] + implicit objs: [] + implicit dirs: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] + implicit fwks: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] + + + - + kind: "message-v1" + backtrace: + - "/usr/local/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:26 (PROJECT)" + message: | + Running the CXX compiler's linker: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "-v" + @(#)PROGRAM:ld PROJECT:ld-1115.7.3 + BUILD 23:50:35 Dec 5 2024 + configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em + will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em + LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) + TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) +... diff --git a/CMakeFiles/cmake.check_cache b/CMakeFiles/cmake.check_cache new file mode 100644 index 00000000000..3dccd731726 --- /dev/null +++ b/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index 212773c8bea..f71728d65f2 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -24,10 +24,14 @@ RUN rm -Rf ./paozhu/libs RUN rm -Rf ./paozhu/viewsrc RUN rm -Rf ./paozhu/orm RUN rm -Rf ./paozhu/models -RUN rm -Rf ./paozhu/common - - - +#RUN rm -Rf ./paozhu/common +RUN rm -Rf ./paozhu/common/autocontrolmethod.hpp +RUN rm -Rf ./paozhu/common/autorestfulpaths.hpp +RUN rm -Rf ./paozhu/common/json_reflect_headers.h +RUN rm -Rf ./paozhu/common/reghttpmethod_pre.hpp +RUN rm -Rf ./paozhu/common/reghttpmethod.hpp +RUN rm -Rf ./paozhu/common/websockets_method_reg.hpp +RUN rm -Rf ./paozhu/common/httphook.cpp # COPY ./paozhu_benchmark/controller ./paozhu/ # COPY ./paozhu_benchmark/libs ./paozhu/ # COPY ./paozhu_benchmark/view ./paozhu/ @@ -39,7 +43,7 @@ RUN rm -Rf ./paozhu/common # RUN ls -l ./paozhu # RUN pwd -RUN mkdir ./paozhu/common +#RUN mkdir ./paozhu/common RUN mkdir ./paozhu/libs RUN mkdir ./paozhu/libs/types COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/ @@ -58,7 +62,7 @@ COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/ -COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ +#COPY ./paozhu_benchmark/common/cost_define.h ./paozhu/common/ COPY ./paozhu_benchmark/common/autorestfulpaths.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/websockets_method_reg.hpp ./paozhu/common/ COPY ./paozhu_benchmark/common/httphook.cpp ./paozhu/common/ diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h index 8b31ea9a000..2e403808c05 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h @@ -140,21 +140,31 @@ namespace orm { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = countsql.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = select_conn->write_sql(countsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + return 0; + } - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -163,29 +173,31 @@ namespace orm unsigned int column_num = 0; unsigned int offset = 0; - querysql_len = 0; + unsigned int querysql_len = 0; for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -202,7 +214,7 @@ namespace orm else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); column_num--; if (column_num == 0) @@ -214,7 +226,7 @@ namespace orm { unsigned int tempnum = 0; - unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + unsigned int name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); querysql_len = 0; for (unsigned int ik = 0; ik < name_length; ik++) @@ -240,7 +252,18 @@ namespace orm } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } + + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -354,19 +377,31 @@ namespace orm { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = countsql.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(countsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return 0; + } + //std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); pack_info_t temp_pack_data; @@ -377,28 +412,30 @@ namespace orm unsigned int column_num = 0; unsigned int offset = 0; - querysql_len = 0; + unsigned int querysql_len = 0; for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -415,7 +452,7 @@ namespace orm else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); column_num--; if (column_num == 0) @@ -427,7 +464,7 @@ namespace orm { unsigned int tempnum = 0; - unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + unsigned int name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); querysql_len = 0; for (unsigned int ik = 0; ik < name_length; ik++) @@ -453,8 +490,17 @@ namespace orm } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -607,32 +653,50 @@ namespace orm { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = countsql.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(countsql); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + return 0; + } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -642,12 +706,14 @@ namespace orm { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -740,31 +806,48 @@ namespace orm { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = countsql.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(countsql); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -774,12 +857,13 @@ namespace orm { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -861,32 +945,51 @@ namespace orm { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = countsql.length() + 1; + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + std::size_t n = edit_conn->write_sql(countsql); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + return 0; + } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -896,12 +999,13 @@ namespace orm { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -5064,27 +5168,31 @@ M_MODEL& or_leMessage(T val) { return temprecord; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return temprecord; } - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5098,25 +5206,27 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return temprecord; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return temprecord; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5133,7 +5243,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5155,7 +5265,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string temp_str; temp_str.resize(name_length); @@ -5186,8 +5296,18 @@ M_MODEL& or_leMessage(T val) } } } + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } - conn_obj->back_select_conn(conn); + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -5287,28 +5407,32 @@ M_MODEL& or_leMessage(T val) { return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5324,25 +5448,27 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5359,7 +5485,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5383,7 +5509,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string tempstr; tempstr.resize(name_length); std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); @@ -5405,9 +5531,18 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } - + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -5509,34 +5644,30 @@ M_MODEL& or_leMessage(T val) { return *mod; } - auto conn = conn_obj->get_select_conn(); - - std::size_t n = conn->write_sql(sqlstring); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + + std::size_t n = select_conn->write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return *mod; } - - //unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - // if(conn->ec) - // { - // error_msg = conn->ec.message(); - // iserror = true; - // return *mod; - // } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5552,26 +5683,28 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { iserror = true; - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return *mod; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return *mod; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5588,7 +5721,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5610,7 +5743,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -5630,7 +5763,18 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -5718,29 +5862,31 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = co_await conn->async_write_sql(sqlstring); + std::size_t n = co_await select_conn->async_write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); co_return 0; } - - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5756,24 +5902,26 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5790,7 +5938,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5812,7 +5960,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -5832,8 +5980,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -5919,25 +6076,28 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } @@ -5955,25 +6115,27 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5990,7 +6152,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6012,7 +6174,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -6032,7 +6194,18 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -6121,23 +6294,30 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - // asio::error_code ec; + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -6155,26 +6335,26 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - // std::memset(result_data, 0x00, 4096); - // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6191,7 +6371,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6213,7 +6393,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -6233,8 +6413,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -6319,34 +6508,31 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } + + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = conn->write_sql(sqlstring); + std::size_t n = select_conn->write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } - - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - // if(conn->ec) - // { - // error_msg = conn->ec.message(); - // iserror = true; - // return 0; - // } - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -6360,25 +6546,27 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6395,7 +6583,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6419,7 +6607,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -6432,7 +6620,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -6452,8 +6640,18 @@ M_MODEL& or_leMessage(T val) } } } + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } - conn_obj->back_select_conn(conn); + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -6541,34 +6739,36 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = co_await conn->async_write_sql(sqlstring); + std::size_t n = co_await select_conn->async_write_sql(sqlstring); if (n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); co_return 0; } - - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; std::vector field_array; - // std::vector> field_value; unsigned char action_setup = 0; unsigned int column_num = 0; @@ -6576,28 +6776,29 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; std::vector field_pos; - // std::map other_col; for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6614,7 +6815,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6638,7 +6839,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -6651,7 +6852,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -6671,9 +6872,17 @@ M_MODEL& or_leMessage(T val) } } } - - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -6865,25 +7074,29 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } @@ -6900,25 +7113,27 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6935,7 +7150,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6953,7 +7168,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string temp_str; temp_str.resize(name_length); @@ -6984,7 +7199,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } } catch (const std::exception &e) @@ -7053,21 +7278,31 @@ M_MODEL& or_leMessage(T val) { co_return valuetemp; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return valuetemp; + } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -7081,24 +7316,26 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return valuetemp; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -7115,7 +7352,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -7133,7 +7370,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string temp_str; temp_str.resize(name_length); @@ -7164,7 +7401,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } } catch (const std::exception &e) @@ -7225,25 +7472,30 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.clear(); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } @@ -7261,25 +7513,27 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -7296,7 +7550,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -7317,7 +7571,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -7337,8 +7591,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -7409,22 +7672,31 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return 0; + } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -7439,24 +7711,26 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -7473,7 +7747,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -7494,7 +7768,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -7514,8 +7788,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -7602,39 +7885,52 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - conn_obj->back_edit_conn(conn); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -7644,10 +7940,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -7726,46 +8025,50 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } - std::size_t n = conn->write_sql(sqlstring); + std::size_t n = edit_conn->write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - // if(conn->ec) - // { - // error_msg = conn->ec.message(); - // iserror = true; - // return 0; - // } - unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - conn_obj->back_edit_conn(conn); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -7775,10 +8078,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -7858,32 +8164,49 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -7893,11 +8216,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -7976,31 +8301,48 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8011,11 +8353,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -8060,39 +8404,50 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8102,10 +8457,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8185,39 +8543,49 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8227,10 +8595,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8311,31 +8682,48 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8345,10 +8733,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -8394,39 +8785,49 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8436,10 +8837,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8485,31 +8889,48 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - unsigned int offset = 0; - n = co_await conn->async_read_loop(); - if (n==0) + if(edit_conn->isdebug) { - co_return 0; + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } + + unsigned int offset = 0; + n = co_await edit_conn->async_read_loop(); + if (n==0) + { + edit_conn.reset(); + co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8519,10 +8940,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -8606,39 +9031,49 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8648,10 +9083,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8742,40 +9181,51 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -8784,10 +9234,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8825,40 +9278,52 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + //auto conn = conn_obj->get_edit_conn(); - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -8867,12 +9332,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } catch (const std::exception &e) { @@ -8909,32 +9376,50 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -8943,12 +9428,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -8985,40 +9472,51 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9027,12 +9525,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } catch (const std::exception &e) { @@ -9069,46 +9569,65 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { - unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -9145,40 +9664,51 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) { - error_msg = conn->ec.message(); - iserror = true; + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9186,12 +9716,14 @@ M_MODEL& or_leMessage(T val) else if ((unsigned char)temp_pack_data.data[0] == 0x00) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } catch (const std::exception &e) { @@ -9228,32 +9760,50 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9262,12 +9812,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -9335,40 +9887,50 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9377,10 +9939,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } else { @@ -9389,40 +9955,51 @@ M_MODEL& or_leMessage(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9431,12 +10008,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } return 0; } @@ -9495,31 +10074,48 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -9530,11 +10126,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -9560,32 +10158,49 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9594,12 +10209,14 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -9620,7 +10237,7 @@ M_MODEL& or_leMessage(T val) std::tuple, std::map, std::vector>> query(const std::string &rawsql) { - + effect_num = 0; std::vector> temprecord; std::vector table_fieldname; std::map table_fieldmap; @@ -9664,25 +10281,28 @@ M_MODEL& or_leMessage(T val) { return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = rawsql.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(rawsql); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(select_conn->isdebug) { - error_msg = conn->ec.message(); - iserror = true; + select_conn->begin_time(); + } + std::size_t n = select_conn->write_sql(rawsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -9700,25 +10320,27 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -9735,7 +10357,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -9759,7 +10381,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string tempstr; tempstr.resize(name_length); std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); @@ -9781,8 +10403,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(rawsql,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); } catch (const std::exception &e) @@ -9802,7 +10433,7 @@ M_MODEL& or_leMessage(T val) asio::awaitable, std::map, std::vector>>> async_query(const std::string &rawsql) { - + effect_num = 0; std::vector> temprecord; std::vector table_fieldname; std::map table_fieldmap; @@ -9846,22 +10477,30 @@ M_MODEL& or_leMessage(T val) { co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = rawsql.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(rawsql); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(rawsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -9876,24 +10515,26 @@ M_MODEL& or_leMessage(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -9910,7 +10551,7 @@ M_MODEL& or_leMessage(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -9934,7 +10575,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string tempstr; tempstr.resize(name_length); std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); @@ -9956,8 +10597,17 @@ M_MODEL& or_leMessage(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(rawsql,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); } catch (const std::exception &e) @@ -9996,6 +10646,7 @@ M_MODEL& or_leMessage(T val) ishascontent = false; iscommit = false; iscache = false; + iserror = false; effect_num = 0; if (both) { @@ -10017,6 +10668,7 @@ M_MODEL& or_leMessage(T val) ishascontent = false; iscommit = false; iscache = false; + iserror = false; effect_num = 0; return *mod; } @@ -10052,7 +10704,25 @@ M_MODEL& or_leMessage(T val) iserror = true; return true; } - + void lock_conn() + { + islock_conn = true; + } + void unlock_conn() + { + islock_conn = false; + if (conn_obj) + { + if(select_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } + if(edit_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + } + } public: std::string selectsql; std::string wheresql; @@ -10070,6 +10740,7 @@ M_MODEL& or_leMessage(T val) bool ishascontent = false; bool iscache = false; bool iserror = false; + bool islock_conn = false; int exptime = 0; unsigned int effect_num = 0; diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h index 6c04469a720..0c2957cb67b 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_FORTUNEBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Mon, 10 Mar 2025 03:03:50 GMT +*本文件为自动生成 Thu, 13 Mar 2025 08:50:20 GMT ***/ #include #include diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h index 530ab810239..6d4f2b60aec 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h @@ -140,21 +140,31 @@ namespace orm { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = countsql.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = select_conn->write_sql(countsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + return 0; + } - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -163,29 +173,31 @@ namespace orm unsigned int column_num = 0; unsigned int offset = 0; - querysql_len = 0; + unsigned int querysql_len = 0; for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -202,7 +214,7 @@ namespace orm else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); column_num--; if (column_num == 0) @@ -214,7 +226,7 @@ namespace orm { unsigned int tempnum = 0; - unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + unsigned int name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); querysql_len = 0; for (unsigned int ik = 0; ik < name_length; ik++) @@ -240,7 +252,18 @@ namespace orm } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } + + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -354,19 +377,31 @@ namespace orm { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = countsql.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(countsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return 0; + } + //std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); pack_info_t temp_pack_data; @@ -377,28 +412,30 @@ namespace orm unsigned int column_num = 0; unsigned int offset = 0; - querysql_len = 0; + unsigned int querysql_len = 0; for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -415,7 +452,7 @@ namespace orm else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); column_num--; if (column_num == 0) @@ -427,7 +464,7 @@ namespace orm { unsigned int tempnum = 0; - unsigned int name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + unsigned int name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); querysql_len = 0; for (unsigned int ik = 0; ik < name_length; ik++) @@ -453,8 +490,17 @@ namespace orm } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -607,32 +653,50 @@ namespace orm { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = countsql.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(countsql); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + return 0; + } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -642,12 +706,14 @@ namespace orm { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -740,31 +806,48 @@ namespace orm { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = countsql.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(countsql); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -774,12 +857,13 @@ namespace orm { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -861,32 +945,51 @@ namespace orm { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = countsql.length() + 1; + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(countsql); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); + std::size_t n = edit_conn->write_sql(countsql); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + return 0; + } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(countsql,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -896,12 +999,13 @@ namespace orm { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - //insertid = pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -4904,27 +5008,31 @@ M_MODEL& or_leRandomnumber(T val) { return temprecord; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return temprecord; } - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -4938,25 +5046,27 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return temprecord; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return temprecord; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -4973,7 +5083,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -4995,7 +5105,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string temp_str; temp_str.resize(name_length); @@ -5026,8 +5136,18 @@ M_MODEL& or_leRandomnumber(T val) } } } + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } - conn_obj->back_select_conn(conn); + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -5127,28 +5247,32 @@ M_MODEL& or_leRandomnumber(T val) { return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5164,25 +5288,27 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5199,7 +5325,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5223,7 +5349,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string tempstr; tempstr.resize(name_length); std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); @@ -5245,9 +5371,18 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } - + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -5349,34 +5484,30 @@ M_MODEL& or_leRandomnumber(T val) { return *mod; } - auto conn = conn_obj->get_select_conn(); - - std::size_t n = conn->write_sql(sqlstring); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + + std::size_t n = select_conn->write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return *mod; } - - //unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - // if(conn->ec) - // { - // error_msg = conn->ec.message(); - // iserror = true; - // return *mod; - // } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5392,26 +5523,28 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { iserror = true; - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return *mod; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return *mod; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5428,7 +5561,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5450,7 +5583,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -5470,7 +5603,18 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -5558,29 +5702,31 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = co_await conn->async_write_sql(sqlstring); + std::size_t n = co_await select_conn->async_write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); co_return 0; } - - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5596,24 +5742,26 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5630,7 +5778,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5652,7 +5800,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -5672,8 +5820,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -5759,25 +5916,28 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } @@ -5795,25 +5955,27 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -5830,7 +5992,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -5852,7 +6014,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -5872,7 +6034,18 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -5961,23 +6134,30 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - // asio::error_code ec; + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return 0; + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -5995,26 +6175,26 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - // std::memset(result_data, 0x00, 4096); - // n = co_await conn->socket->async_read_some(asio::buffer(result_data), asio::use_awaitable); - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6031,7 +6211,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6053,7 +6233,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -6073,8 +6253,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -6159,34 +6348,31 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } + + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = conn->write_sql(sqlstring); + std::size_t n = select_conn->write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } - - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - // if(conn->ec) - // { - // error_msg = conn->ec.message(); - // iserror = true; - // return 0; - // } - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -6200,25 +6386,27 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6235,7 +6423,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6259,7 +6447,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -6272,7 +6460,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -6292,8 +6480,18 @@ M_MODEL& or_leRandomnumber(T val) } } } + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } - conn_obj->back_select_conn(conn); + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { @@ -6381,34 +6579,36 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = co_await conn->async_write_sql(sqlstring); + std::size_t n = co_await select_conn->async_write_sql(sqlstring); if (n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); co_return 0; } - - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; std::vector field_array; - // std::vector> field_value; unsigned char action_setup = 0; unsigned int column_num = 0; @@ -6416,28 +6616,29 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; std::vector field_pos; - // std::map other_col; for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6454,7 +6655,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6478,7 +6679,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, data_temp); tempnum = tempnum + name_length; @@ -6491,7 +6692,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -6511,9 +6712,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -6705,25 +6914,29 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } @@ -6740,25 +6953,27 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6775,7 +6990,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6793,7 +7008,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string temp_str; temp_str.resize(name_length); @@ -6824,7 +7039,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } } catch (const std::exception &e) @@ -6893,21 +7118,31 @@ M_MODEL& or_leRandomnumber(T val) { co_return valuetemp; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return valuetemp; + } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6921,24 +7156,26 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return valuetemp; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -6955,7 +7192,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -6973,7 +7210,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string temp_str; temp_str.resize(name_length); @@ -7004,7 +7241,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } } catch (const std::exception &e) @@ -7065,25 +7312,30 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - conn->send_data.clear(); + if(select_conn->isdebug) + { + select_conn->begin_time(); + } - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = select_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } @@ -7101,25 +7353,27 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -7136,7 +7390,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -7157,7 +7411,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -7177,8 +7431,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -7249,22 +7512,31 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = co_await conn_obj->async_get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return 0; + } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -7279,24 +7551,26 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return 0; } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return 0; } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -7313,7 +7587,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -7334,7 +7608,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; @@ -7354,8 +7628,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } if (iscache) { if (exptime > 0) @@ -7442,39 +7725,52 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - conn_obj->back_edit_conn(conn); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -7484,10 +7780,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -7566,46 +7865,50 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } - std::size_t n = conn->write_sql(sqlstring); + std::size_t n = edit_conn->write_sql(sqlstring); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } - // unsigned int querysql_len = sqlstring.length() + 1; - - // conn->send_data.clear(); - // conn->send_data.push_back((querysql_len & 0xFF)); - // conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - // conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - // conn->send_data.push_back(0x00); - // conn->send_data.push_back(0x03); - // conn->send_data.append(sqlstring); - - // std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - // if(conn->ec) - // { - // error_msg = conn->ec.message(); - // iserror = true; - // return 0; - // } - unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - conn_obj->back_edit_conn(conn); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -7615,10 +7918,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -7698,32 +8004,49 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -7733,11 +8056,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -7816,31 +8141,48 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -7851,11 +8193,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -7900,39 +8244,50 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -7942,10 +8297,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8025,39 +8383,49 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8067,10 +8435,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8151,31 +8522,48 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8185,10 +8573,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -8234,39 +8625,49 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8276,10 +8677,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8325,31 +8729,48 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - unsigned int offset = 0; - n = co_await conn->async_read_loop(); - if (n==0) + if(edit_conn->isdebug) { - co_return 0; + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } + + unsigned int offset = 0; + n = co_await edit_conn->async_read_loop(); + if (n==0) + { + edit_conn.reset(); + co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8359,10 +8780,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -8446,39 +8871,49 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -8488,10 +8923,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8582,40 +9021,51 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); + //auto conn = conn_obj->get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -8624,10 +9074,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } catch (const std::exception &e) { @@ -8665,40 +9118,52 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + //auto conn = conn_obj->get_edit_conn(); - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -8707,12 +9172,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } catch (const std::exception &e) { @@ -8749,32 +9216,50 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -8783,12 +9268,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -8825,40 +9312,51 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -8867,12 +9365,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } catch (const std::exception &e) { @@ -8909,46 +9409,65 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { - unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -8985,40 +9504,51 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) { - error_msg = conn->ec.message(); - iserror = true; + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9026,12 +9556,14 @@ M_MODEL& or_leRandomnumber(T val) else if ((unsigned char)temp_pack_data.data[0] == 0x00) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } catch (const std::exception &e) { @@ -9068,32 +9600,50 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9102,12 +9652,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -9175,40 +9727,50 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9217,10 +9779,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return effect_num; } else { @@ -9229,40 +9795,51 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - auto conn = conn_obj->get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + //auto conn = conn_obj->get_edit_conn(); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = edit_conn->write_sql(sqlstring); + if(n==0) { - error_msg = conn->ec.message(); - iserror = true; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } unsigned int offset = 0; - n = conn->read_loop(); + n = edit_conn->read_loop(); if(n==0) { - error_msg = conn->error_msg; + error_msg = edit_conn->error_msg; + edit_conn.reset(); return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); - + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9271,12 +9848,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + return insert_last_id; } return 0; } @@ -9335,31 +9914,48 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -9370,11 +9966,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return effect_num; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return effect_num; } catch (const std::exception &e) { @@ -9400,32 +9998,49 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - auto conn = co_await conn_obj->async_get_edit_conn(); - - unsigned int querysql_len = sqlstring.length() + 1; + if(islock_conn) + { + if(!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } - conn->send_data.clear(); - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(sqlstring); + if(edit_conn->isdebug) + { + edit_conn->begin_time(); + } + std::size_t n = co_await edit_conn->async_write_sql(sqlstring); + if(n==0) + { + error_msg = edit_conn->error_msg; + edit_conn.reset(); + co_return 0; + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - unsigned int offset = 0; - n = co_await conn->async_read_loop(); + n = co_await edit_conn->async_read_loop(); if (n==0) { + edit_conn.reset(); co_return 0; } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); - - conn_obj->back_edit_conn(conn); + edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); + if(edit_conn->isdebug) + { + edit_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= edit_conn->count_time(); + conn_mar.push_log(sqlstring,std::to_string(du_time)); + } + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9434,12 +10049,14 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - long long insert_last_id= conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - - co_return insert_last_id; + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - co_return 0; + if(!islock_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + co_return insert_last_id; } catch (const std::exception &e) { @@ -9460,7 +10077,7 @@ M_MODEL& or_leRandomnumber(T val) std::tuple, std::map, std::vector>> query(const std::string &rawsql) { - + effect_num = 0; std::vector> temprecord; std::vector table_fieldname; std::map table_fieldmap; @@ -9504,25 +10121,28 @@ M_MODEL& or_leRandomnumber(T val) { return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - auto conn = conn_obj->get_select_conn(); - - unsigned int querysql_len = rawsql.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(rawsql); + //auto conn = conn_obj->get_select_conn(); + if(islock_conn) + { + if(!select_conn) + { + select_conn = conn_obj->get_select_conn(); + } + } + else + { + select_conn = conn_obj->get_select_conn(); + } - std::size_t n = asio::write(*conn->socket, asio::buffer(conn->send_data), conn->ec); - - if(conn->ec) + if(select_conn->isdebug) { - error_msg = conn->ec.message(); - iserror = true; + select_conn->begin_time(); + } + std::size_t n = select_conn->write_sql(rawsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -9540,25 +10160,27 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = conn->read_loop(); + n = select_conn->read_loop(); offset = 0; if(n==0) { - error_msg = conn->error_msg; + error_msg = select_conn->error_msg; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -9575,7 +10197,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -9599,7 +10221,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string tempstr; tempstr.resize(name_length); std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); @@ -9621,8 +10243,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(rawsql,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); } catch (const std::exception &e) @@ -9642,7 +10273,7 @@ M_MODEL& or_leRandomnumber(T val) asio::awaitable, std::map, std::vector>>> async_query(const std::string &rawsql) { - + effect_num = 0; std::vector> temprecord; std::vector table_fieldname; std::map table_fieldmap; @@ -9686,22 +10317,30 @@ M_MODEL& or_leRandomnumber(T val) { co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - auto conn = co_await conn_obj->async_get_select_conn(); - - unsigned int querysql_len = rawsql.length() + 1; - - conn->send_data.clear(); - - conn->send_data.push_back((querysql_len & 0xFF)); - conn->send_data.push_back((querysql_len >> 8 & 0xFF)); - conn->send_data.push_back((querysql_len >> 16 & 0xFF)); - conn->send_data.push_back(0x00); - conn->send_data.push_back(0x03); - conn->send_data.append(rawsql); + if(islock_conn) + { + if(!select_conn) + { + select_conn = co_await conn_obj->async_get_select_conn(); + } + } + else + { + select_conn = co_await conn_obj->async_get_select_conn(); + } - std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - - + if(select_conn->isdebug) + { + select_conn->begin_time(); + } + std::size_t n = co_await select_conn->async_write_sql(rawsql); + if(n==0) + { + error_msg = select_conn->error_msg; + select_conn.reset(); + co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); + } + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -9716,24 +10355,26 @@ M_MODEL& or_leRandomnumber(T val) for (; is_sql_item == false;) { - n = co_await conn->async_read_loop(); + n = co_await select_conn->async_read_loop(); offset = 0; if (n==0) { + select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } for (; offset < n;) { - conn->read_field_pack(conn->_cache_data, n, offset, temp_pack_data); + select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); if(temp_pack_data.error > 0) { iserror = true; error_msg =temp_pack_data.data; + select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } if (temp_pack_data.length == temp_pack_data.current_length && temp_pack_data.current_length > 0) { - if (conn->pack_eof_check(temp_pack_data)) + if (select_conn->pack_eof_check(temp_pack_data)) { is_sql_item = true; break; @@ -9750,7 +10391,7 @@ M_MODEL& or_leRandomnumber(T val) else if (action_setup == 1) { field_info_t temp_filed_col; - conn->read_col_info(temp_pack_data.data, temp_filed_col); + select_conn->read_col_info(temp_pack_data.data, temp_filed_col); field_array.emplace_back(std::move(temp_filed_col)); column_num--; @@ -9774,7 +10415,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; - name_length = conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); + name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); std::string tempstr; tempstr.resize(name_length); std::memcpy(tempstr.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); @@ -9796,8 +10437,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - conn_obj->back_select_conn(conn); - + if(select_conn->isdebug) + { + select_conn->finish_time(); + auto &conn_mar = get_orm_connect_mar(); + long long du_time= select_conn->count_time(); + conn_mar.push_log(rawsql,std::to_string(du_time)); + } + if(!islock_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); } catch (const std::exception &e) @@ -9836,6 +10486,7 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = false; iscommit = false; iscache = false; + iserror = false; effect_num = 0; if (both) { @@ -9857,6 +10508,7 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = false; iscommit = false; iscache = false; + iserror = false; effect_num = 0; return *mod; } @@ -9892,7 +10544,25 @@ M_MODEL& or_leRandomnumber(T val) iserror = true; return true; } - + void lock_conn() + { + islock_conn = true; + } + void unlock_conn() + { + islock_conn = false; + if (conn_obj) + { + if(select_conn) + { + conn_obj->back_select_conn(std::move(select_conn)); + } + if(edit_conn) + { + conn_obj->back_edit_conn(std::move(edit_conn)); + } + } + } public: std::string selectsql; std::string wheresql; @@ -9910,6 +10580,7 @@ M_MODEL& or_leRandomnumber(T val) bool ishascontent = false; bool iscache = false; bool iserror = false; + bool islock_conn = false; int exptime = 0; unsigned int effect_num = 0; diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h index 19775f6117b..0fee4b832c8 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_WORLDBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Mon, 10 Mar 2025 03:03:50 GMT +*本文件为自动生成 Thu, 13 Mar 2025 08:50:20 GMT ***/ #include #include From ca3bb9c7ecad7552732645b2c2c6f5d5296622b2 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:56:10 +0100 Subject: [PATCH 1245/1766] [rust/anansi] Remove Anansi (#9653) Anansi is currently failing and the repo hasn't seen activity in 2 years: https://github.com/saru-tora/anansi --- frameworks/Rust/anansi/Cargo.toml | 25 ---- frameworks/Rust/anansi/README.md | 36 ------ frameworks/Rust/anansi/anansi-raw.dockerfile | 11 -- frameworks/Rust/anansi/anansi.dockerfile | 14 --- frameworks/Rust/anansi/benchmark_config.json | 53 --------- frameworks/Rust/anansi/settings.toml | 18 --- .../Rust/anansi/src/hello/middleware.rs | 94 --------------- .../Rust/anansi/src/hello/migrations/mod.rs | 3 - frameworks/Rust/anansi/src/hello/mod.rs | 8 -- frameworks/Rust/anansi/src/hello/records.rs | 48 -------- frameworks/Rust/anansi/src/hello/world/mod.rs | 5 - frameworks/Rust/anansi/src/hello/world/raw.rs | 110 ------------------ .../src/hello/world/templates/.parsed/base.in | 9 -- .../world/templates/.parsed/base_args.in | 1 - .../hello/world/templates/.parsed/fortunes.in | 6 - .../hello/world/templates/.parsed/index.in | 1 - .../world/templates/.parsed/raw_fortunes.in | 4 - .../src/hello/world/templates/base.rs.html | 9 -- .../hello/world/templates/fortunes.rs.html | 10 -- .../world/templates/raw_fortunes.rs.html | 10 -- .../Rust/anansi/src/hello/world/util.rs | 16 --- .../Rust/anansi/src/hello/world/views.rs | 90 -------------- .../Rust/anansi/src/http_errors/500.html | 11 -- frameworks/Rust/anansi/src/http_errors/mod.rs | 1 - .../templates/.parsed/not_found.in | 11 -- .../http_errors/templates/not_found.rs.html | 11 -- .../Rust/anansi/src/http_errors/views.rs | 12 -- frameworks/Rust/anansi/src/main.rs | 28 ----- frameworks/Rust/anansi/src/project.rs | 62 ---------- frameworks/Rust/anansi/src/urls.rs | 32 ----- 30 files changed, 749 deletions(-) delete mode 100644 frameworks/Rust/anansi/Cargo.toml delete mode 100755 frameworks/Rust/anansi/README.md delete mode 100644 frameworks/Rust/anansi/anansi-raw.dockerfile delete mode 100644 frameworks/Rust/anansi/anansi.dockerfile delete mode 100755 frameworks/Rust/anansi/benchmark_config.json delete mode 100644 frameworks/Rust/anansi/settings.toml delete mode 100644 frameworks/Rust/anansi/src/hello/middleware.rs delete mode 100644 frameworks/Rust/anansi/src/hello/migrations/mod.rs delete mode 100644 frameworks/Rust/anansi/src/hello/mod.rs delete mode 100644 frameworks/Rust/anansi/src/hello/records.rs delete mode 100644 frameworks/Rust/anansi/src/hello/world/mod.rs delete mode 100644 frameworks/Rust/anansi/src/hello/world/raw.rs delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/.parsed/base.in delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/.parsed/base_args.in delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/.parsed/fortunes.in delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/.parsed/index.in delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/.parsed/raw_fortunes.in delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/base.rs.html delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/fortunes.rs.html delete mode 100644 frameworks/Rust/anansi/src/hello/world/templates/raw_fortunes.rs.html delete mode 100644 frameworks/Rust/anansi/src/hello/world/util.rs delete mode 100644 frameworks/Rust/anansi/src/hello/world/views.rs delete mode 100644 frameworks/Rust/anansi/src/http_errors/500.html delete mode 100644 frameworks/Rust/anansi/src/http_errors/mod.rs delete mode 100644 frameworks/Rust/anansi/src/http_errors/templates/.parsed/not_found.in delete mode 100644 frameworks/Rust/anansi/src/http_errors/templates/not_found.rs.html delete mode 100644 frameworks/Rust/anansi/src/http_errors/views.rs delete mode 100644 frameworks/Rust/anansi/src/main.rs delete mode 100644 frameworks/Rust/anansi/src/project.rs delete mode 100644 frameworks/Rust/anansi/src/urls.rs diff --git a/frameworks/Rust/anansi/Cargo.toml b/frameworks/Rust/anansi/Cargo.toml deleted file mode 100644 index a717e96e70b..00000000000 --- a/frameworks/Rust/anansi/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[workspace] -members = [ - ".", -] - -[package] -name = "tfb-anansi" -version = "0.1.0" -edition = "2021" - -[features] -raw = [] - -[dependencies] -anansi = { git = "https://github.com/saru-tora/anansi", rev = "c350a23", features = ["postgres", "minimal", "redis"] } -async-trait = "0.1.57" -rand = "0.8.4" -serde = "1" -serde_json = "1" -tokio-postgres = "0.7.7" - -[profile.release] -lto = true -opt-level = 3 -codegen-units = 1 diff --git a/frameworks/Rust/anansi/README.md b/frameworks/Rust/anansi/README.md deleted file mode 100755 index ebddef843ca..00000000000 --- a/frameworks/Rust/anansi/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# [Anansi](https://saru-tora.github.io/anansi/) Benchmarking Test - -Anansi is a simple full-stack web framework for Rust. - -### Test Type Implementation Source Code - -All tests can be found in: src/hello/world/ - -## Test URLs -### JSON - -http://localhost:8080/json - -### PLAINTEXT - -http://localhost:8080/plaintext - -### DB - -http://localhost:8080/db - -### QUERY - -http://localhost:8080/query?queries= - -### CACHED QUERY - -http://localhost:8080/cached_query?queries= - -### UPDATE - -http://localhost:8080/update?queries= - -### FORTUNES - -http://localhost:8080/fortunes diff --git a/frameworks/Rust/anansi/anansi-raw.dockerfile b/frameworks/Rust/anansi/anansi-raw.dockerfile deleted file mode 100644 index 96c284a8b7a..00000000000 --- a/frameworks/Rust/anansi/anansi-raw.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM rust:1.64 - -ADD ./ /anansi -WORKDIR /anansi - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features raw - -EXPOSE 8080 - -CMD RUST_LOG=off ./target/release/tfb-anansi 0.0.0.0:8080 diff --git a/frameworks/Rust/anansi/anansi.dockerfile b/frameworks/Rust/anansi/anansi.dockerfile deleted file mode 100644 index bf6f7596193..00000000000 --- a/frameworks/Rust/anansi/anansi.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM rust:1.64 - -RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server - -ADD ./ /anansi -WORKDIR /anansi - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release - -EXPOSE 8080 - -ENV RUST_LOG=off -CMD service redis-server start && ./target/release/tfb-anansi 0.0.0.0:8080 diff --git a/frameworks/Rust/anansi/benchmark_config.json b/frameworks/Rust/anansi/benchmark_config.json deleted file mode 100755 index dd1c17b71bd..00000000000 --- a/frameworks/Rust/anansi/benchmark_config.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "framework": "anansi", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "cached_query_url": "/cached-queries?q=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "postgres", - "framework": "Anansi", - "language": "Rust", - "flavor": "None", - "orm": "Full", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Anansi [minimal]", - "notes": "", - "versus": "None" - }, - "raw": { - "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "cached_query_url": "/cached-queries?q=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "postgres", - "framework": "Anansi", - "language": "Rust", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Anansi [minimal, raw]", - "notes": "", - "versus": "None" - } - } - ] -} diff --git a/frameworks/Rust/anansi/settings.toml b/frameworks/Rust/anansi/settings.toml deleted file mode 100644 index 6089347e428..00000000000 --- a/frameworks/Rust/anansi/settings.toml +++ /dev/null @@ -1,18 +0,0 @@ -secret_key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" -login_url = "/login" -smtp_relay = "" -smtp_username = "" -smtp_password = "" - -[caches] - -[caches.default] -location = "redis://127.0.0.1/" - -[databases] - -[databases.default] -name = "hello_world" -user = "benchmarkdbuser" -password = "benchmarkdbpass" -address = "tfb-database" diff --git a/frameworks/Rust/anansi/src/hello/middleware.rs b/frameworks/Rust/anansi/src/hello/middleware.rs deleted file mode 100644 index be369cb827d..00000000000 --- a/frameworks/Rust/anansi/src/hello/middleware.rs +++ /dev/null @@ -1,94 +0,0 @@ -use std::fmt::{self, Write}; -use std::sync::Arc; -use anansi::db::postgres::{PgDbPool, PgDbRow, PgDbRowVec, PgStatement}; - -#[macro_export] -macro_rules! impl_pg { - () => { - #[async_trait::async_trait] - impl crate::hello::middleware::Pg for HttpRequest { - async fn get_world(&self) -> anansi::web::Result { - use anansi::web::BaseRequest; - self.raw().app_state().stmt.0.world.fetch_one(&[&Self::random_num()], self.raw().pool()).await - } - async fn update_worlds(&self, n: usize, params: &[&(dyn tokio_postgres::types::ToSql + Sync)]) -> anansi::web::Result<()> { - use anansi::web::BaseRequest; - self.raw().app_state().stmt.0.updates[n].execute(params, self.raw().pool()).await - } - async fn get_fortunes(&self) -> anansi::web::Result { - use anansi::web::BaseRequest; - self.raw().app_state().stmt.0.fortune.fetch_all(&[], self.raw().pool()).await - } - } - impl crate::hello::middleware::AsStmt for AppData { - fn as_stmt(&self) -> &crate::hello::middleware::Stmt { - &self.stmt - } - } - } -} - -fn update_statement(num: u16) -> String { - let mut pl = 1; - let mut q = "UPDATE world SET randomnumber = CASE id ".to_string(); - for _ in 1..=num { - let _ = write!(q, "WHEN ${} THEN ${} ", pl, pl + 1); - pl += 2; - } - - q.push_str("ELSE randomnumber END WHERE id IN ("); - - for _ in 1..=num { - let _ = write!(q, "${},", pl); - pl += 1; - } - - q.pop(); - q.push(')'); - q -} - -#[derive(Clone)] -pub struct Stmt(pub Arc); - -impl fmt::Debug for Stmt { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Stmt") - .finish() - } -} - -impl Stmt { - pub async fn new(pool: &PgDbPool) -> anansi::web::Result { - let mut updates = vec![]; - for n in 1..=500 { - updates.push(PgStatement::new(&update_statement(n), pool).await?); - } - Ok(Self(Arc::new(State { - world: PgStatement::new("SELECT * FROM world WHERE id = $1", pool).await?, - updates, - fortune: PgStatement::new("SELECT * FROM fortune", pool).await?, - }))) - } -} - -pub struct State { - pub world: PgStatement, - pub updates: Vec, - pub fortune: PgStatement, -} - -pub trait AsStmt { - fn as_stmt(&self) -> &Stmt; -} - -#[async_trait::async_trait] -pub trait Pg { - fn random_num() -> i32 { - use rand::Rng; - rand::thread_rng().gen_range(1..=10_000) - } - async fn get_world(&self) -> anansi::web::Result; - async fn update_worlds(&self, n: usize, params: &[&(dyn tokio_postgres::types::ToSql + Sync)]) -> anansi::web::Result<()>; - async fn get_fortunes(&self) -> anansi::web::Result; -} diff --git a/frameworks/Rust/anansi/src/hello/migrations/mod.rs b/frameworks/Rust/anansi/src/hello/migrations/mod.rs deleted file mode 100644 index 72ca3a1f046..00000000000 --- a/frameworks/Rust/anansi/src/hello/migrations/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -use anansi::migrations::prelude::*; - -local_migrations! {} \ No newline at end of file diff --git a/frameworks/Rust/anansi/src/hello/mod.rs b/frameworks/Rust/anansi/src/hello/mod.rs deleted file mode 100644 index 74ca45e2a9d..00000000000 --- a/frameworks/Rust/anansi/src/hello/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -pub mod records; -pub mod migrations; - -pub const APP_NAME: &'static str = "hello"; -pub mod world; - -#[cfg(feature = "raw")] -pub mod middleware; diff --git a/frameworks/Rust/anansi/src/hello/records.rs b/frameworks/Rust/anansi/src/hello/records.rs deleted file mode 100644 index 6dc93a9c95c..00000000000 --- a/frameworks/Rust/anansi/src/hello/records.rs +++ /dev/null @@ -1,48 +0,0 @@ -#![allow(non_snake_case)] -use async_trait::async_trait; -use anansi::web::{Result, BaseRequest}; -use anansi::record; -use anansi::records::{Relate, Int, Text, random_int}; -use serde::Serialize; - -#[record(table_name = "World")] -#[derive(Serialize)] -pub struct World { - #[field(primary_key = "true", default_fn = "random_int")] - pub id: Int, - pub randomNumber: Int, -} - -#[async_trait] -impl Relate for World { - async fn on_save(&self, _req: &mut R) -> Result<()> { - unimplemented!(); - } - async fn on_delete(&self, _req: &R) -> Result<()> { - unimplemented!(); - } -} - -#[record(table_name = "Fortune")] -pub struct Fortune { - #[field(primary_key = "true", default_fn = "random_int")] - pub id: Int, - pub message: Text, -} - -#[cfg(not(feature = "raw"))] -impl Fortune { - pub fn additional() -> Self { - Self {id: Int::new(0), message: Text::from("Additional fortune added at request time.".to_string())} - } -} - -#[async_trait] -impl Relate for Fortune { - async fn on_save(&self, _req: &mut R) -> Result<()> { - unimplemented!(); - } - async fn on_delete(&self, _req: &R) -> Result<()> { - unimplemented!(); - } -} diff --git a/frameworks/Rust/anansi/src/hello/world/mod.rs b/frameworks/Rust/anansi/src/hello/world/mod.rs deleted file mode 100644 index 2d3508e5707..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[cfg(not(feature = "raw"))] -pub mod views; -#[cfg(feature = "raw")] -pub mod raw; -pub mod util; diff --git a/frameworks/Rust/anansi/src/hello/world/raw.rs b/frameworks/Rust/anansi/src/hello/world/raw.rs deleted file mode 100644 index 6199bf0fb2e..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/raw.rs +++ /dev/null @@ -1,110 +0,0 @@ -use crate::prelude::*; -use crate::hello::middleware::Pg; -use serde::Serialize; -use anansi::check; -use super::util::get_query; -use rand::Rng; -use tokio_postgres::types::ToSql; - -fn random_num() -> i32 { - rand::thread_rng().gen_range(1..=10_000) -} - -#[derive(Copy, Clone, Serialize, Debug)] -pub struct World { - id: i32, - randomnumber: i32, -} - -#[derive(Serialize, Debug)] -pub struct Fortune<'a> { - id: i32, - message: &'a str, -} - -#[base_view] -fn base(_req: &mut R) -> Result {} - -#[viewer] -impl WorldView { - async fn one_world(req: &R) -> Result { - let row = req.get_world().await?; - let world = World { - id: row.get_i32(0), - randomnumber: row.get_i32(1), - }; - Ok(world) - } - async fn get_worlds(req: &R) -> Result> { - let q = get_query(req.params()); - let mut worlds = Vec::with_capacity(q as usize); - for _ in 0..q { - let world = Self::one_world(req).await?; - worlds.push(world); - } - Ok(worlds) - } - #[check(Site::is_visitor)] - pub async fn db(req: &mut R) -> Result { - let world = Self::one_world(req).await?; - Response::json(&world) - } - #[check(Site::is_visitor)] - pub async fn queries(req: &mut R) -> Result { - let worlds = Self::get_worlds(req).await?; - Response::json(&worlds) - } - #[view(Site::is_visitor)] - pub async fn raw_fortunes(req: &mut R) -> Result { - let title = "Fortunes"; - let rows = req.get_fortunes().await?; - let mut fortunes = Vec::with_capacity(rows.len() + 1); - fortunes.push(Fortune { - id: 0, - message: "Additional fortune added at request time.", - }); - fortunes.extend(rows.iter().map(|row| Fortune { - id: row.get(0), - message: row.get(1), - })); - fortunes.sort_by(|it, next| it.message.cmp(&next.message)); - } - #[check(Site::is_visitor)] - pub async fn updates(req: &mut R) -> Result { - let q = get_query(req.params()) as usize; - let mut worlds = Vec::with_capacity(q); - let mut params: Vec<&(dyn ToSql + Sync)> = Vec::with_capacity(q * 3); - for _ in 0..q { - let row = req.get_world().await?; - let world = World { - id: row.get_i32(0), - randomnumber: random_num(), - }; - worlds.push(world); - } - for world in &worlds { - params.push(&world.id); - params.push(&world.randomnumber); - } - for world in &worlds { - params.push(&world.id); - } - req.update_worlds(q - 1, params.as_slice()).await?; - Response::json(&worlds) - } - #[check(Site::is_visitor)] - pub async fn cached_queries(req: &mut R) -> Result { - let q = get_query(req.params()); - let mut ids = vec![]; - for _ in 0..q { - ids.push(random_num().to_string()); - } - let mut worlds = vec!['[' as u8]; - for mut world in req.cache().get_many(ids).await? { - worlds.append(&mut world); - } - worlds.pop(); - worlds.push(']' as u8); - Response::json_bytes(worlds) - } -} diff --git a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/base.in b/frameworks/Rust/anansi/src/hello/world/templates/.parsed/base.in deleted file mode 100644 index 0473720779d..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/base.in +++ /dev/null @@ -1,9 +0,0 @@ -{let mut _c = String::new();_c.push_str(" - - - ");_c.push_str(&_base_args._title);_c.push_str(" - - - ");_c.push_str(&_base_args._content);_c.push_str(" - -");_c.into_bytes()} \ No newline at end of file diff --git a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/base_args.in b/frameworks/Rust/anansi/src/hello/world/templates/.parsed/base_args.in deleted file mode 100644 index 9ad5b91f42b..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/base_args.in +++ /dev/null @@ -1 +0,0 @@ -pub struct Args {pub _title: String,pub _content: String,}impl anansi::cache::Cacheable for Args {fn to_bytes(&self) -> Vec {let mut v = vec![];v.append(&mut self._title.len().to_ne_bytes().to_vec());v.append(&mut self._title.as_bytes().to_vec());v.append(&mut self._content.len().to_ne_bytes().to_vec());v.append(&mut self._content.as_bytes().to_vec());v} fn from_bytes(mut __b: Vec) -> anansi::web::Result {let mut buf = __b.split_off(8); let l = usize::from_ne_bytes(__b.try_into().unwrap()); let mut __b = buf.split_off(l); let _title = String::from_utf8(buf)?;let mut buf = __b.split_off(8); let l = usize::from_ne_bytes(__b.try_into().unwrap()); let mut __b = buf.split_off(l); let _content = String::from_utf8(buf)?;Ok(Self {_title, _content, })}} impl Args {pub fn new() -> Self {Self {_title: String::new(), _content: String::new(), }}} \ No newline at end of file diff --git a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/fortunes.in b/frameworks/Rust/anansi/src/hello/world/templates/.parsed/fortunes.in deleted file mode 100644 index 7cf8984f743..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/fortunes.in +++ /dev/null @@ -1,6 +0,0 @@ -{_args._title = {let mut _c = String::new();_c.push_str("");_c.push_str(&anansi::web::html_escape(&format!("{}", title)));_c.push_str(""); _c};_args._content = {let mut _c = String::new();_c.push_str(" - - ");for fortune in fortunes {_c.push_str(" - - ");}_c.push_str(" -
      idmessage
      ");_c.push_str(&anansi::web::html_escape(&format!("{}", fortune.pk())));_c.push_str("");_c.push_str(&anansi::web::html_escape(&format!("{}", fortune.message)));_c.push_str("
      "); _c};_args} \ No newline at end of file diff --git a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/index.in b/frameworks/Rust/anansi/src/hello/world/templates/.parsed/index.in deleted file mode 100644 index 17b9c49d56b..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/index.in +++ /dev/null @@ -1 +0,0 @@ -{_args._title = {let mut _c = String::new();_c.push_str("");_c.push_str(&anansi::web::html_escape(&format!("{}", title)));_c.push_str(""); _c};_args._content = {let mut _c = String::new();_c.push_str("

      ");_c.push_str(&anansi::web::html_escape(&format!("{}", title)));_c.push_str("

      "); _c};_args} \ No newline at end of file diff --git a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/raw_fortunes.in b/frameworks/Rust/anansi/src/hello/world/templates/.parsed/raw_fortunes.in deleted file mode 100644 index 83c5b13e6cf..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/.parsed/raw_fortunes.in +++ /dev/null @@ -1,4 +0,0 @@ -{_args._content = {let mut _c = String::new();_c.push_str(""); -for fortune in fortunes {_c.push_str(&format!("");} -_c.push_str("
      idmessage
      {}", fortune.id));anansi::web::html_escape2(&mut _c, fortune.message);_c.push_str("
      "); _c}; -_args._title = {let mut _c = String::new();_c.push_str(&format!("{}", title)); _c};_args} diff --git a/frameworks/Rust/anansi/src/hello/world/templates/base.rs.html b/frameworks/Rust/anansi/src/hello/world/templates/base.rs.html deleted file mode 100644 index 440d37a95eb..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/base.rs.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - @block title - - - @block content - - diff --git a/frameworks/Rust/anansi/src/hello/world/templates/fortunes.rs.html b/frameworks/Rust/anansi/src/hello/world/templates/fortunes.rs.html deleted file mode 100644 index 0d4e369792a..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/fortunes.rs.html +++ /dev/null @@ -1,10 +0,0 @@ -@block title {@title} - -@block content { - - - @for fortune in fortunes { - - } -
      idmessage
      @fortune.pk()@fortune.message
      -} diff --git a/frameworks/Rust/anansi/src/hello/world/templates/raw_fortunes.rs.html b/frameworks/Rust/anansi/src/hello/world/templates/raw_fortunes.rs.html deleted file mode 100644 index 22edc654ba9..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/templates/raw_fortunes.rs.html +++ /dev/null @@ -1,10 +0,0 @@ -@block title {@unescape title} - -@block content { - - - @for fortune in fortunes { - - } -
      idmessage
      @unescape fortune.id@fortune.message
      -} diff --git a/frameworks/Rust/anansi/src/hello/world/util.rs b/frameworks/Rust/anansi/src/hello/world/util.rs deleted file mode 100644 index 8e8998f2b1f..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/util.rs +++ /dev/null @@ -1,16 +0,0 @@ -use anansi::web::Parameters; - -pub fn get_query(params: &Parameters) -> i16 { - if let Ok(q) = params.get("q") { - if let Ok(q) = q.parse() { - if q > 1 { - return if q <= 500 { - q - } else { - 500 - }; - } - } - } - 1 -} diff --git a/frameworks/Rust/anansi/src/hello/world/views.rs b/frameworks/Rust/anansi/src/hello/world/views.rs deleted file mode 100644 index c75b2fcd4cb..00000000000 --- a/frameworks/Rust/anansi/src/hello/world/views.rs +++ /dev/null @@ -1,90 +0,0 @@ -use crate::prelude::*; -use anansi::cache::prelude::*; -use anansi::records::Int; -use super::super::records::{World, Fortune}; -use super::util::get_query; -use serde::Serialize; -use anansi::{check, raw_bulk_update}; -use rand::Rng; - -fn random_i32() -> i32 { - rand::thread_rng().gen_range(1..=10_000) -} - -fn random_int() -> Int { - Int::new(random_i32()) -} - -#[derive(Serialize)] -struct Message { - message: &'static str, -} - -#[base_view] -fn base(_req: &mut R) -> Result {} - -#[viewer] -impl WorldView { - #[check(Site::is_visitor)] - pub async fn json(req: &mut R) -> Result { - let message = Message {message: "Hello, World!"}; - Response::json(&message) - } - async fn get_world(req: &R) -> Result { - World::find(random_int()).get(req).await - } - async fn get_worlds(req: &R) -> Result> { - let q = get_query(req.params()); - let mut worlds = Vec::with_capacity(q as usize); - for _ in 0..q { - let world = Self::get_world(req).await?; - worlds.push(world); - } - Ok(worlds) - } - #[check(Site::is_visitor)] - pub async fn db(req: &mut R) -> Result { - let world = Self::get_world(req).await?; - Response::json(&world) - } - #[check(Site::is_visitor)] - pub async fn queries(req: &mut R) -> Result { - let worlds = Self::get_worlds(req).await?; - Response::json(&worlds) - } - #[view(Site::is_visitor)] - pub async fn fortunes(req: &mut R) -> Result { - let title = "Fortunes"; - let mut fortunes = Fortune::get_all().query(req).await?; - fortunes.push(Fortune::additional()); - fortunes.sort_by(|it, next| it.message.cmp(&next.message)); - } - #[check(Site::is_visitor)] - pub async fn updates(req: &mut R) -> Result { - let mut worlds = Self::get_worlds(req).await?; - for world in &mut worlds { - world.randomNumber = random_int(); - } - raw_bulk_update!(req, World, &worlds, randomNumber).await?; - Response::json(&worlds) - } - #[check(Site::is_visitor)] - pub async fn plaintext(req: &mut R) -> Result { - Ok(Response::text("Hello, World!".to_string())) - } - #[check(Site::is_visitor)] - pub async fn cached_queries(req: &mut R) -> Result { - let q = get_query(req.params()); - let mut ids = vec![]; - for _ in 0..q { - ids.push(random_i32().to_string()); - } - let mut worlds = vec!['[' as u8]; - for mut world in req.cache().get_many(ids).await? { - worlds.append(&mut world); - } - worlds.pop(); - worlds.push(']' as u8); - Response::json_bytes(worlds) - } -} diff --git a/frameworks/Rust/anansi/src/http_errors/500.html b/frameworks/Rust/anansi/src/http_errors/500.html deleted file mode 100644 index 1c14f7cd7f3..00000000000 --- a/frameworks/Rust/anansi/src/http_errors/500.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 500 Internal Server Error - - -

      Internal Server Error

      -

      Sorry, something went wrong.

      - - diff --git a/frameworks/Rust/anansi/src/http_errors/mod.rs b/frameworks/Rust/anansi/src/http_errors/mod.rs deleted file mode 100644 index 38b44033152..00000000000 --- a/frameworks/Rust/anansi/src/http_errors/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod views; diff --git a/frameworks/Rust/anansi/src/http_errors/templates/.parsed/not_found.in b/frameworks/Rust/anansi/src/http_errors/templates/.parsed/not_found.in deleted file mode 100644 index c13f6730bf5..00000000000 --- a/frameworks/Rust/anansi/src/http_errors/templates/.parsed/not_found.in +++ /dev/null @@ -1,11 +0,0 @@ -{let mut _c = String::new();_c.push_str(" - - - - Not Found - - -

      404

      -

      Page not found.

      - -");_c.into_bytes()} \ No newline at end of file diff --git a/frameworks/Rust/anansi/src/http_errors/templates/not_found.rs.html b/frameworks/Rust/anansi/src/http_errors/templates/not_found.rs.html deleted file mode 100644 index eaf9a979ee7..00000000000 --- a/frameworks/Rust/anansi/src/http_errors/templates/not_found.rs.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Not Found - - -

      404

      -

      Page not found.

      - - diff --git a/frameworks/Rust/anansi/src/http_errors/views.rs b/frameworks/Rust/anansi/src/http_errors/views.rs deleted file mode 100644 index 04872858818..00000000000 --- a/frameworks/Rust/anansi/src/http_errors/views.rs +++ /dev/null @@ -1,12 +0,0 @@ -use anansi::{check, viewer, render}; -use anansi::web::{Result, Response}; -use anansi::site::Site; -use crate::project::Request; - -#[viewer] -impl ErrorView { - #[check(Site::is_visitor)] - pub async fn not_found(_req: &mut R) -> Result { - render!("not_found") - } -} diff --git a/frameworks/Rust/anansi/src/main.rs b/frameworks/Rust/anansi/src/main.rs deleted file mode 100644 index 24e3fd87292..00000000000 --- a/frameworks/Rust/anansi/src/main.rs +++ /dev/null @@ -1,28 +0,0 @@ -use anansi::*; - -mod urls; -mod project; -mod http_errors; -mod hello; - -apps! { - hello, -} - -app_statics! {} - -min_main!(server, { - use anansi::cache::prelude::*; - use hello::records::World; - use anansi::records::Record; - use anansi::db::AsDb; - let worlds = World::get_all().raw_query(server.app_data.as_db()).await.expect("problem fetching worlds"); - let mut items = vec![]; - for world in worlds { - let id = world.pk().to_string(); - let mut bytes = serde_json::to_vec(&world).expect("problem serializing world"); - bytes.push(',' as u8); - items.push((id, bytes)); - } - server.cache.set_many(&items).await.expect("problem caching world"); -}); diff --git a/frameworks/Rust/anansi/src/project.rs b/frameworks/Rust/anansi/src/project.rs deleted file mode 100644 index 074460a6b46..00000000000 --- a/frameworks/Rust/anansi/src/project.rs +++ /dev/null @@ -1,62 +0,0 @@ -use anansi::project::prelude::*; -use crate::app_migrations; - -#[cfg(feature = "raw")] -use super::hello::middleware::Stmt; - -#[cfg(feature = "raw")] -use crate::impl_pg; - -#[cfg(feature = "raw")] -app_cache!(local); - -#[cfg(not(feature = "raw"))] -app_cache!(redis); - -database!(postgres); - -#[cfg(feature = "raw")] -raw_middleware!(); - -#[cfg(feature = "raw")] -anansi::setup!(); - -#[cfg(feature = "raw")] -impl_pg!(); - -#[cfg(not(feature = "raw"))] -middleware!(); - -#[derive(Clone, Debug)] -pub struct AppData { - pub pool: Pool, - #[cfg(feature = "raw")] - pub stmt: Stmt, -} - -#[cfg(feature = "raw")] -impl AppData { - pub async fn new() -> Self { - let pool = anansi::server::get_db::(app_migrations).await; - let stmt = Stmt::new(&pool).await.unwrap(); - Self {pool, stmt} - } -} - -#[cfg(not(feature = "raw"))] -impl AppData { - pub async fn new() -> Self { - let pool = anansi::server::get_db::(app_migrations).await; - Self {pool} - } -} - -impl anansi::db::AsDb for AppData { - type SqlDb = Pool; - fn as_db(&self) -> &Pool { - &self.pool - } - fn as_db_mut(&mut self) -> &mut Pool { - &mut self.pool - } -} diff --git a/frameworks/Rust/anansi/src/urls.rs b/frameworks/Rust/anansi/src/urls.rs deleted file mode 100644 index bd04cbaad43..00000000000 --- a/frameworks/Rust/anansi/src/urls.rs +++ /dev/null @@ -1,32 +0,0 @@ -use anansi::web::prelude::*; -use crate::prelude::Request; -#[cfg(not(feature = "raw"))] -use crate::hello::world::views::WorldView; - -#[cfg(not(feature = "raw"))] -pub fn routes() -> Router { - Router::new() - .route("/json", WorldView::json) - .route("/db", WorldView::db) - .route("/queries", WorldView::queries) - .route("/fortunes", WorldView::fortunes) - .route("/updates", WorldView::updates) - .route("/plaintext", WorldView::plaintext) - .route("/cached-queries", WorldView::cached_queries) -} - -#[cfg(feature = "raw")] -use crate::hello::world::raw::WorldView; - -#[cfg(feature = "raw")] -use crate::hello::middleware::Pg; - -#[cfg(feature = "raw")] -pub fn routes() -> Router { - Router::new() - .route("/db", WorldView::db) - .route("/queries", WorldView::queries) - .route("/fortunes", WorldView::raw_fortunes) - .route("/updates", WorldView::updates) - .route("/cached-queries", WorldView::cached_queries) -} From 9b5e16b0470c0e2dbaeb21cbd8b34dbc2bc95570 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:56:17 +0100 Subject: [PATCH 1246/1766] [lua/luxure] Remove luxure (#9654) Luxure is currenlty failing and the repo hasn't seen activity in 2 years: https://github.com/cosock/luxure --- frameworks/Lua/luxure/README.md | 22 ------------- frameworks/Lua/luxure/benchmark_config.json | 26 --------------- frameworks/Lua/luxure/luxure.dockerfile | 36 --------------------- frameworks/Lua/luxure/server.lua | 22 ------------- 4 files changed, 106 deletions(-) delete mode 100755 frameworks/Lua/luxure/README.md delete mode 100755 frameworks/Lua/luxure/benchmark_config.json delete mode 100644 frameworks/Lua/luxure/luxure.dockerfile delete mode 100644 frameworks/Lua/luxure/server.lua diff --git a/frameworks/Lua/luxure/README.md b/frameworks/Lua/luxure/README.md deleted file mode 100755 index 5518b909a56..00000000000 --- a/frameworks/Lua/luxure/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Luxure Benchmarking Test - -### Test Type Implementation Source Code - -* [JSON](./server.lua) -* [PLAINTEXT](./server.lua) - -## Important Libraries -The tests were run with: -* [luasocket](https://www.github.com/lunarmodules/luasocket) -* [cosock](https://www.github.com/cosock/cosock) -* [luncheon](https://www.github.com/cosock/luncheon) -* [dkjson](https://github.com/LuaDist/dkjson) - -## Test URLs -### JSON - -http://localhost:8080/json - -### PLAINTEXT - -http://localhost:8080/plaintext diff --git a/frameworks/Lua/luxure/benchmark_config.json b/frameworks/Lua/luxure/benchmark_config.json deleted file mode 100755 index 50717aa6951..00000000000 --- a/frameworks/Lua/luxure/benchmark_config.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "framework": "luxure", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "Luxure", - "language": "Lua", - "flavor": "None", - "orm": "None", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Luxure", - "notes": "", - "versus": "Express" - } - } - ] -} diff --git a/frameworks/Lua/luxure/luxure.dockerfile b/frameworks/Lua/luxure/luxure.dockerfile deleted file mode 100644 index b509fa37309..00000000000 --- a/frameworks/Lua/luxure/luxure.dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -FROM ubuntu:22.04 - -COPY ./server.lua / - -RUN DEBIAN_FRONTEND=noninteractiv \ - apt-get update \ - && apt-get install -y \ - build-essential \ - libreadline-dev \ - unzip \ - curl \ - wget \ - libssl-dev \ - && curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz \ - && tar -zxf lua-5.3.5.tar.gz \ - && cd lua-5.3.5 \ - && make linux test \ - && make install \ - && cd .. \ - && rm -rf lua-5.3.5 \ - && rm ./lua-5.3.5.tar.gz \ - && wget https://luarocks.org/releases/luarocks-3.8.0.tar.gz \ - && tar zxpf luarocks-3.8.0.tar.gz \ - && cd luarocks-3.8.0 \ - && ./configure --with-lua-include=/usr/local/include \ - && make \ - && make install \ - && cd .. \ - && rm -rf ./luarocks-3.8.0 \ - && rm luarocks-3.8.0.tar.gz \ - && luarocks install luxure \ - && luarocks install dkjson - -EXPOSE 8080 - -CMD lua /server.lua diff --git a/frameworks/Lua/luxure/server.lua b/frameworks/Lua/luxure/server.lua deleted file mode 100644 index e9a6fe106d8..00000000000 --- a/frameworks/Lua/luxure/server.lua +++ /dev/null @@ -1,22 +0,0 @@ -local lux = require "luxure" -local dkjson = require "dkjson" -local server = lux.Server.new() - -server:use(function(req, res, next) - res:add_header("server", "luxure") - res:add_header("date", os.date("!%a, %d %b %Y %X GMT")) - next(req, res) -end) - -server:get("/json", function(req, res) - res:add_header("content-type", "application/json") - res:send(dkjson.encode({ message = "Hello, World!" })) -end) - -server:get("/plaintext", function(req,res) - res:add_header("content-type", "text/plain") - res:send("Hello, World!") -end) - -server:listen(8080) -server:run() From 52863957e5e7356a6288ae3f217d426fd25d964f Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:56:24 +0100 Subject: [PATCH 1247/1766] [java/play1] Remove Play1 (#9655) Play1 is currently failing because downloading the framework fails: https://tfb-status.techempower.com/unzip/results.2025-03-08-22-02-56-466.zip/results/20250302185309/play1/build/play1.log The TechEmpower tests haven't been updated in 5 years, and the latest v1 release is from 3 years ago: https://www.playframework.com/releases --- frameworks/Java/play1/README.md | 31 --- .../play1/app/controllers/Application.java | 132 ---------- frameworks/Java/play1/app/models/World.java | 30 --- .../play1/app/views/Application/index.html | 8 - .../Java/play1/app/views/errors/404.html | 19 -- .../Java/play1/app/views/errors/500.html | 21 -- frameworks/Java/play1/app/views/main.html | 16 -- frameworks/Java/play1/benchmark_config.json | 26 -- frameworks/Java/play1/conf/application.conf | 236 ------------------ frameworks/Java/play1/conf/dependencies.yml | 4 - frameworks/Java/play1/conf/messages | 3 - frameworks/Java/play1/conf/routes | 15 -- frameworks/Java/play1/config.toml | 17 -- frameworks/Java/play1/play1.dockerfile | 13 - .../Java/play1/public/images/favicon.png | Bin 687 -> 0 bytes .../public/javascripts/jquery-1.6.4.min.js | 4 - .../Java/play1/public/stylesheets/main.css | 0 .../Java/play1/test/Application.test.html | 7 - .../Java/play1/test/ApplicationTest.java | 17 -- frameworks/Java/play1/test/BasicTest.java | 13 - frameworks/Java/play1/test/data.yml | 7 - 21 files changed, 619 deletions(-) delete mode 100644 frameworks/Java/play1/README.md delete mode 100644 frameworks/Java/play1/app/controllers/Application.java delete mode 100644 frameworks/Java/play1/app/models/World.java delete mode 100644 frameworks/Java/play1/app/views/Application/index.html delete mode 100644 frameworks/Java/play1/app/views/errors/404.html delete mode 100644 frameworks/Java/play1/app/views/errors/500.html delete mode 100644 frameworks/Java/play1/app/views/main.html delete mode 100644 frameworks/Java/play1/benchmark_config.json delete mode 100644 frameworks/Java/play1/conf/application.conf delete mode 100644 frameworks/Java/play1/conf/dependencies.yml delete mode 100644 frameworks/Java/play1/conf/messages delete mode 100644 frameworks/Java/play1/conf/routes delete mode 100644 frameworks/Java/play1/config.toml delete mode 100644 frameworks/Java/play1/play1.dockerfile delete mode 100644 frameworks/Java/play1/public/images/favicon.png delete mode 100644 frameworks/Java/play1/public/javascripts/jquery-1.6.4.min.js delete mode 100644 frameworks/Java/play1/public/stylesheets/main.css delete mode 100644 frameworks/Java/play1/test/Application.test.html delete mode 100644 frameworks/Java/play1/test/ApplicationTest.java delete mode 100644 frameworks/Java/play1/test/BasicTest.java delete mode 100644 frameworks/Java/play1/test/data.yml diff --git a/frameworks/Java/play1/README.md b/frameworks/Java/play1/README.md deleted file mode 100644 index 7cf95274bd7..00000000000 --- a/frameworks/Java/play1/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Play 1 framework Benchmarking Test - -[Play 1 framework](https://www.playframework.com/) - the high velocity web framework for Java and Scala. This is the old version - it's not Play 2. - -### Test sources - -This is the list: - - * [Plaintext](app/controllers/Application.java#L24) - * [JSON](app/controllers/Application.java#L28) - * [DB](app/controllers/Application.java#L39) - * [Queries](app/controllers/Application.java#L45) - -## Software Versions - -The tests were run with: - - * [Oracle Java 10](https://www.oracle.com/java/) - * [MySQL 5.7](http://www.mysql.com/) - -Please check the versions in the install and build scripts of TFB project. - -## Test URLs - -All implementations use the same URLs. - - * Plaintext - `http://localhost:8080/plaintext` - * JSON - `http://localhost:8080/json` - * DB - `http://localhost:8080/db` - * Queries - `http://localhost:8080/query?queries=` - diff --git a/frameworks/Java/play1/app/controllers/Application.java b/frameworks/Java/play1/app/controllers/Application.java deleted file mode 100644 index f2424d15b15..00000000000 --- a/frameworks/Java/play1/app/controllers/Application.java +++ /dev/null @@ -1,132 +0,0 @@ -package controllers; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ThreadLocalRandom; - -import models.World; -import play.db.jpa.JPAPlugin; -import play.jobs.Job; -import play.libs.F.Promise; -import play.mvc.Controller; - -public class Application extends Controller { - - private static final int TEST_DATABASE_ROWS = 10000; - - public static void index() { - render(); - } - - public static void hello() { - renderText("Hello, world!"); - } - - public static void json() { - Map result = new HashMap(); - result.put("message", "Hello, World!"); - renderJSON(result); - } - - /** - * this version is used in the tests. it is the simplest and fastest. - * - * @param queries - */ - public static void dbSync() { - Long id = Long.valueOf(ThreadLocalRandom.current().nextInt(TEST_DATABASE_ROWS) + 1); - World result = World.findById(id); - renderJSON(result); - } - - public static void dbQueries(int queries) { - if (queries == 0) { - queries = 1; - } else if (queries > 500) { - queries = 500; - } - final List worlds = new ArrayList(); - for (int i = 0; i < queries; ++i) { - Long id = Long.valueOf(ThreadLocalRandom.current().nextInt(TEST_DATABASE_ROWS) + 1); - World result = World.findById(id); - worlds.add(result); - } - renderJSON(worlds); - } - - @play.db.jpa.NoTransaction - public static void setup() { - JPAPlugin plugin = play.Play.plugin(JPAPlugin.class); - plugin.startTx(true); - - // clean out the old - World.deleteAll(); - System.out.println("DELETED"); - // in with the new - for (long i = 0; i <= TEST_DATABASE_ROWS; i++) { - int randomNumber = ThreadLocalRandom.current().nextInt(TEST_DATABASE_ROWS) + 1; - new World(i, randomNumber).save(); - if (i % 100 == 0) { - - World.em().flush(); - World.em().clear(); - System.out.println("FLUSHED : " + i + "/" + TEST_DATABASE_ROWS); - - } - } - System.out.println("ADDED"); - plugin.closeTx(false); - } - - /** - * note this is method is much slower than the synchronous version - */ - public static void dbAsyncEachQuery(int queries) - throws InterruptedException, ExecutionException { - if (queries == 0) - queries = 1; - final int queryCount = queries; - List> promises = new ArrayList>(); - for (int i = 0; i < queryCount; ++i) { - final Long id = Long - .valueOf(ThreadLocalRandom.current().nextInt(TEST_DATABASE_ROWS) + 1); - Job job = new Job() { - public World doJobWithResult() throws Exception { - World result = World.findById(id); - return result; - }; - }; - promises.add(job.now()); - } - List result = await(Promise.waitAll(promises)); - renderJSON(result); - } - - /** - * note this is method is a bit slower than the synchronous version - */ - public static void dbAsyncAllQueries(int queries) - throws InterruptedException, ExecutionException { - if (queries == 0) - queries = 1; - final int queryCount = queries; - final List worlds = new ArrayList(); - Job> job = new Job>() { - public java.util.List doJobWithResult() throws Exception { - for (int i = 0; i < queryCount; ++i) { - Long id = Long - .valueOf(ThreadLocalRandom.current().nextInt(TEST_DATABASE_ROWS) + 1); - World result = World.findById(id); - worlds.add(result); - } - return worlds; - }; - }; - List result = job.now().get(); - renderJSON(result); - } - -} diff --git a/frameworks/Java/play1/app/models/World.java b/frameworks/Java/play1/app/models/World.java deleted file mode 100644 index c1337dd9c6c..00000000000 --- a/frameworks/Java/play1/app/models/World.java +++ /dev/null @@ -1,30 +0,0 @@ -package models; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; - -import play.db.jpa.GenericModel; -import play.db.jpa.Model; - -import com.google.gson.annotations.SerializedName; - -/** - * use a generic model as we want to explicitly define the id - * - * @author tom - * - */ -@Entity -public class World extends GenericModel { - - public World(long i, long number) { - id = i; - randomNumber = number ; - } - - @Id - public Long id; - - public Long randomNumber; -} \ No newline at end of file diff --git a/frameworks/Java/play1/app/views/Application/index.html b/frameworks/Java/play1/app/views/Application/index.html deleted file mode 100644 index c614df6bffb..00000000000 --- a/frameworks/Java/play1/app/views/Application/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/frameworks/Java/play1/app/views/errors/404.html b/frameworks/Java/play1/app/views/errors/404.html deleted file mode 100644 index eb0b00e5421..00000000000 --- a/frameworks/Java/play1/app/views/errors/404.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Not found - - - - #{if play.mode.name() == 'DEV'} - #{404 result /} - #{/if} - #{else} -

      Not found

      -

      - ${result.message} -

      - #{/else} - - diff --git a/frameworks/Java/play1/app/views/errors/500.html b/frameworks/Java/play1/app/views/errors/500.html deleted file mode 100644 index a898cb77e48..00000000000 --- a/frameworks/Java/play1/app/views/errors/500.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Application error - - - - #{if play.mode.name() == 'DEV'} - #{500 exception /} - #{/if} - #{else} -

      Oops, an error occured

      - #{if exception instanceof play.exceptions.PlayException} -

      - This exception has been logged with id ${exception.id}. -

      - #{/if} - #{/else} - - diff --git a/frameworks/Java/play1/app/views/main.html b/frameworks/Java/play1/app/views/main.html deleted file mode 100644 index 92e03f87d7a..00000000000 --- a/frameworks/Java/play1/app/views/main.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - #{get 'title' /} - - - #{get 'moreStyles' /} - - - #{get 'moreScripts' /} - - - #{doLayout /} - - diff --git a/frameworks/Java/play1/benchmark_config.json b/frameworks/Java/play1/benchmark_config.json deleted file mode 100644 index dddee2bca86..00000000000 --- a/frameworks/Java/play1/benchmark_config.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "framework": "play1", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/query?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "MySQL", - "framework": "play1", - "language": "Java", - "flavor": "None", - "orm": "Full", - "platform": "Netty", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "play1", - "notes": "", - "versus": "netty" - } - }] -} diff --git a/frameworks/Java/play1/conf/application.conf b/frameworks/Java/play1/conf/application.conf deleted file mode 100644 index 02d35c1cde6..00000000000 --- a/frameworks/Java/play1/conf/application.conf +++ /dev/null @@ -1,236 +0,0 @@ -# This is the main configuration file for the application. -# ~~~~~ -application.name=play-1.2.5 - -# Application mode -# ~~~~~ -# Set to dev to enable instant reloading and other development help. -# Otherwise set to prod. -application.mode=dev -%prod.application.mode=prod - -# Secret key -# ~~~~~ -# The secret key is used to secure cryptographics functions -# If you deploy your application to several instances be sure to use the same key ! -application.secret=p7Abj8rpexZmmC8iPsY2PlXSo1xtHFhLKHRCHpE1ZqEgRU5TIHPcEbaryoj16vi8 - -# i18n -# ~~~~~ -# Define locales used by your application. -# You can then place localized messages in conf/messages.{locale} files -# application.langs=fr,en,ja - -# Date format -# ~~~~~ -date.format=yyyy-MM-dd -# date.format.fr=dd/MM/yyyy - -# Server configuration -# ~~~~~ -# If you need to change the HTTP port, uncomment this (default is set to 9000) -# http.port=9000 - -#modified to match previous port on test -http.port=8080 - -# -# By default the server listen for HTTP on the wilcard address. -# You can restrict this. -# http.address=127.0.0.1 -# -# Use this if you don't host your Play application at the root of the domain -# you're serving it from. This parameter has no effect when deployed as a -# war, because the path will be handled by the application server. -# http.path=/ - -# Session configuration -# ~~~~~~~~~~~~~~~~~~~~~~ -# By default, session will be written to the transient PLAY_SESSION cookie. -# The cookies are not secured by default, only set it to true -# if you're serving your pages through https. -# application.session.cookie=PLAY -# application.session.maxAge=1h -# application.session.secure=false - -# Session/Cookie sharing between subdomain -# ~~~~~~~~~~~~~~~~~~~~~~ -# By default a cookie is only valid for a specific domain. By setting -# application.defaultCookieDomain to '.example.com', the cookies -# will be valid for all domains ending with '.example.com', ie: -# foo.example.com and bar.example.com -# application.defaultCookieDomain=.example.com - -# JVM configuration -# ~~~~~ -# Define which port is used by JPDA when application is in debug mode (default is set to 8000) -# jpda.port=8000 -# -# Java source level => 1.5, 1.6 or 1.7 (experimental) -# java.source=1.5 - -# Log level -# ~~~~~ -# Specify log level for your application. -# If you want a very customized log, create a log4j.properties file in the conf directory -# application.log=INFO -# -# More logging configuration -# application.log.path=/log4j.properties -# application.log.system.out=off - -# Database configuration -# ~~~~~ -# Enable a database engine if needed. -# -# To quickly set up a development database, use either: -# - mem : for a transient in memory database (H2 in memory) -# - fs : for a simple file written database (H2 file stored) -# db=mem -# -# To connect to a local MySQL5 database, use: -# db=mysql://user:pwd@host/database -# -# To connect to a local PostgreSQL9 database, use: -# db=postgres://user:pwd@host/database -# -# If you need a full JDBC configuration use the following : -# db.url=jdbc:postgresql:database_name -# db.driver=org.postgresql.Driver -# db.user=root -# db.pass=secret -# -# Connections pool configuration : -db.pool.timeout=1000 -db.pool.maxSize=30 -db.pool.minSize=10 - - -# -# If you want to reuse an existing Datasource from your application server, use: -# db=java:/comp/env/jdbc/myDatasource -# -# When using an existing Datasource, it's sometimes needed to destroy it when -# the application is stopped. Depending on the datasource, you can define a -# generic "destroy" method : -# db.destroyMethod=close -db.driver= com.mysql.jdbc.Driver -db.url=jdbc:mysql://tfb-database:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true&useSSL=false -#db.url=jdbc:mysql://tfb-database:3306/hello_world -db.user=benchmarkdbuser -db.pass=benchmarkdbpass -#db.jndiName=DefaultDS - -#db.default.driver= com.mysql.jdbc.Driver -#db.default.url=jdbc:mysql://tfb-database:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true -#db.default.user=benchmarkdbuser -#db.default.pass=benchmarkdbpass -#db.default.jndiName=DefaultDS - - -# JPA Configuration (Hibernate) -# ~~~~~ -# -# Specify the custom JPA dialect to use here (default to guess): -# jpa.dialect=org.hibernate.dialect.PostgreSQLDialect -# -# Specify the ddl generation pattern to use. Set to none to disable it -# (default to update in DEV mode, and none in PROD mode): -# jpa.ddl=update -# -# Debug SQL statements (logged using DEBUG level): -# jpa.debugSQL=true -# -# You can even specify additional hibernate properties here: -# hibernate.use_sql_comments=true -# ... -# -# Store path for Blob content -attachments.path=data/attachments - -# Memcached configuration -# ~~~~~ -# Enable memcached if needed. Otherwise a local cache is used. -# memcached=enabled -# -# Specify memcached host (default to 127.0.0.1:11211) -# memcached.host=127.0.0.1:11211 -# -# Or you can specify multiple host to build a distributed cache -# memcached.1.host=127.0.0.1:11211 -# memcached.2.host=127.0.0.1:11212 -# -# Use plain SASL to authenticate for memcached -# memcached.user= -# memcached.password= - -# HTTP Response headers control for static files -# ~~~~~ -# Set the default max-age, telling the user's browser how long it should cache the page. -# Default is 3600 (one hour). Set it to 0 to send no-cache. -# This is only read in prod mode, in dev mode the cache is disabled. -# http.cacheControl=3600 - -# If enabled, Play will generate entity tags automatically and send a 304 when needed. -# Default is true, set it to false to deactivate use of entity tags. -# http.useETag=true - -# Custom mime types -# mimetype.xpi=application/x-xpinstall - -# WS configuration -# ~~~~~ -# Default engine is Async Http Client, uncomment to use -# the JDK's internal implementation -# webservice = urlfetch -# If you need to set proxy params for WS requests -# http.proxyHost = localhost -# http.proxyPort = 3128 -# http.proxyUser = jojo -# http.proxyPassword = jojo - -# Mail configuration -# ~~~~~ -# Default is to use a mock Mailer -mail.smtp=mock - -# Or, specify mail host configuration -# mail.smtp.host=127.0.0.1 -# mail.smtp.user=admin -# mail.smtp.pass= -# mail.smtp.channel=ssl - -# Url-resolving in Jobs -# ~~~~~~ -# When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), -# ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. -# %test.application.baseUrl=http://localhost:9000/ -# %prod.application.baseUrl=http://www.yourdomain.com/ - -# Jobs executor -# ~~~~~~ -# Size of the Jobs pool -# play.jobs.pool=10 - - -# Execution pool -# ~~~~~ -# Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. -# Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) -# play.pool=3 - -# Open file from errors pages -# ~~~~~ -# If your text editor supports opening files by URL, Play! will -# dynamically link error pages to files -# -# Example, for textmate: -# play.editor=txmt://open?url=file://%s&line=%s - -# Testing. Set up a custom configuration for test mode -# ~~~~~ -#%test.module.cobertura=${play.path}/modules/cobertura -%test.application.mode=dev -%test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 -%test.jpa.ddl=create -%test.mail.smtp=mock diff --git a/frameworks/Java/play1/conf/dependencies.yml b/frameworks/Java/play1/conf/dependencies.yml deleted file mode 100644 index d86de2e46ea..00000000000 --- a/frameworks/Java/play1/conf/dependencies.yml +++ /dev/null @@ -1,4 +0,0 @@ -# Application dependencies - -require: - - play \ No newline at end of file diff --git a/frameworks/Java/play1/conf/messages b/frameworks/Java/play1/conf/messages deleted file mode 100644 index b51f29459d1..00000000000 --- a/frameworks/Java/play1/conf/messages +++ /dev/null @@ -1,3 +0,0 @@ -# You can specialize this file for each language. -# For example, for French create a messages.fr file -# diff --git a/frameworks/Java/play1/conf/routes b/frameworks/Java/play1/conf/routes deleted file mode 100644 index 5f33cf52b6c..00000000000 --- a/frameworks/Java/play1/conf/routes +++ /dev/null @@ -1,15 +0,0 @@ -# Routes -# This file defines all application routes (Higher priority routes first) -# ~~~~ - - -# Home page -GET /json Application.json -GET /db Application.dbSync -GET /query Application.dbQueries -GET /plaintext Application.hello -GET /db2 Application.dbAsyncAllQueries -GET /db3 Application.dbAsyncEachQuery -GET /setup Application.setup -GET / Application.index - diff --git a/frameworks/Java/play1/config.toml b/frameworks/Java/play1/config.toml deleted file mode 100644 index 7e774fff5de..00000000000 --- a/frameworks/Java/play1/config.toml +++ /dev/null @@ -1,17 +0,0 @@ -[framework] -name = "play1" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/query?queries=" -approach = "Realistic" -classification = "Fullstack" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Netty" -webserver = "None" -versus = "netty" diff --git a/frameworks/Java/play1/play1.dockerfile b/frameworks/Java/play1/play1.dockerfile deleted file mode 100644 index 090a8ff77a5..00000000000 --- a/frameworks/Java/play1/play1.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM openjdk:10-jdk -WORKDIR /play1 -COPY app app -COPY conf conf -COPY public public -COPY test test -RUN wget -nv https://downloads.typesafe.com/play/1.5.2/play-1.5.2.zip -RUN unzip -q play-1.5.2.zip -RUN apt-get install -yqq python - -EXPOSE 8080 - -CMD ["play-1.5.2/play", "run", "--%prod"] diff --git a/frameworks/Java/play1/public/images/favicon.png b/frameworks/Java/play1/public/images/favicon.png deleted file mode 100644 index c7d92d2ae47434d9a61c90bc205e099b673b9dd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmV;g0#N;lP)ezT{T_ZJ?}AL z5NC{NW(ESID=>(O3&Eg8 zmA9J&6c`h4_f6L;=bU>_H8aNG`kfvCj9zomNt)?O;rzWqZs0LEt%1WB218%1fo9uB zsW^yhBR7C(mqN%GEK9&msg0~ zWY?#bf4q8G-~2KttQZ($odJvy&_-~f?9*ThK@fwR$U^1)p*8=_+^3BXx0$i1BC8XC zr21u6D5nVK&^!dOAw&|1E;qC3uFNj3*Jj#&%Oje@0D-nhfmM*o%^5f}-pxQ07(95H z3|LoV>V19w#rLgmRmtVy9!T3M3FUE3><0T8&b3yEsWcLW`0(=1+qsqc(k(ymBLK0h zK!6(6$7MX~M`-QA2$wk7n(7hhkJ}4Rwi-Vd(_ZFX1Yk7TXuB0IJYpo@kLb2G8m)E{ z`9v=!hi}fOytKckfN^C@6+Z*+MVI9-W_p@_3yyR#UYc0FTpD}i#k>c!wYCS)4v@E$ zchZCo=zV@)`v^$;V18ixdjFMY#q^2$wEX%{f(XD8POnsn$bpbClpC@hPxjzyO>pY|*pF3UU2tYcCN?rUk{Sskej70Mmu9vPwMYhO1m{AxAt(zqDT|0jP7FaX=6 V`?~}E4H^Id002ovPDHLkV1hC)G==~G diff --git a/frameworks/Java/play1/public/javascripts/jquery-1.6.4.min.js b/frameworks/Java/play1/public/javascripts/jquery-1.6.4.min.js deleted file mode 100644 index 628ed9b3160..00000000000 --- a/frameworks/Java/play1/public/javascripts/jquery-1.6.4.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.6.4 http://jquery.com/ | http://jquery.org/license */ -(function(a,b){function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cr(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
      a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
      ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
      t
      ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
      ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/frameworks/Java/play1/public/stylesheets/main.css b/frameworks/Java/play1/public/stylesheets/main.css deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/Java/play1/test/Application.test.html b/frameworks/Java/play1/test/Application.test.html deleted file mode 100644 index 2b0ad094b67..00000000000 --- a/frameworks/Java/play1/test/Application.test.html +++ /dev/null @@ -1,7 +0,0 @@ -*{ You can use plain selenium command using the selenium tag }* - -#{selenium} - // Open the home page, and check that no error occured - open('/') - assertNotTitle('Application error') -#{/selenium} \ No newline at end of file diff --git a/frameworks/Java/play1/test/ApplicationTest.java b/frameworks/Java/play1/test/ApplicationTest.java deleted file mode 100644 index f1501cbbdba..00000000000 --- a/frameworks/Java/play1/test/ApplicationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -import org.junit.*; -import play.test.*; -import play.mvc.*; -import play.mvc.Http.*; -import models.*; - -public class ApplicationTest extends FunctionalTest { - - @Test - public void testThatIndexPageWorks() { - Response response = GET("/"); - assertIsOk(response); - assertContentType("text/html", response); - assertCharset(play.Play.defaultWebEncoding, response); - } - -} \ No newline at end of file diff --git a/frameworks/Java/play1/test/BasicTest.java b/frameworks/Java/play1/test/BasicTest.java deleted file mode 100644 index d039860fa30..00000000000 --- a/frameworks/Java/play1/test/BasicTest.java +++ /dev/null @@ -1,13 +0,0 @@ -import org.junit.*; -import java.util.*; -import play.test.*; -import models.*; - -public class BasicTest extends UnitTest { - - @Test - public void aVeryImportantThingToTest() { - assertEquals(2, 1 + 1); - } - -} diff --git a/frameworks/Java/play1/test/data.yml b/frameworks/Java/play1/test/data.yml deleted file mode 100644 index 77b04bb14b2..00000000000 --- a/frameworks/Java/play1/test/data.yml +++ /dev/null @@ -1,7 +0,0 @@ -# you describe your data using the YAML notation here -# and then load them using Fixtures.load("data.yml") - -# User(bob): -# email: bob@gmail.com -# password: secret -# fullname: Bob \ No newline at end of file From 6bebca67c2346bbe8dec8a280d4279be771cc553 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:56:36 +0100 Subject: [PATCH 1248/1766] [python/quart] Fix failing test (#9656) This fixes the failing quart test because Werkzeug version 3 removed `url_quote` raising: ImportError: cannot import name 'url_quote' from 'werkzeug.urls' --- 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 fb1f1a1e0be..13e6e269e43 100644 --- a/frameworks/Python/quart/requirements.txt +++ b/frameworks/Python/quart/requirements.txt @@ -14,5 +14,5 @@ priority==2.0.0 quart==0.18.0 toml==0.10.2 uvloop==0.16.0 -Werkzeug==3.0.3 +Werkzeug==2.3.8 wsproto==1.2.0 From 8501d7efa05c06c307ef64d692299b5d36bc5855 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:56:42 +0100 Subject: [PATCH 1249/1766] [ruby/hanami] Add support for queries and updates tests (#9657) --- frameworks/Ruby/hanami/.env | 3 + frameworks/Ruby/hanami/Gemfile.lock | 166 ++++++++++++++++++ .../Ruby/hanami/app/actions/db/index.rb | 2 +- .../Ruby/hanami/app/actions/queries/index.rb | 32 ++++ .../Ruby/hanami/app/actions/updates/index.rb | 42 +++++ frameworks/Ruby/hanami/benchmark_config.json | 4 +- .../hanami/config/providers/persistence.rb | 14 +- frameworks/Ruby/hanami/config/puma.rb | 2 +- frameworks/Ruby/hanami/config/routes.rb | 2 + frameworks/Ruby/hanami/hanami.dockerfile | 5 +- 10 files changed, 259 insertions(+), 13 deletions(-) create mode 100644 frameworks/Ruby/hanami/.env create mode 100644 frameworks/Ruby/hanami/Gemfile.lock create mode 100644 frameworks/Ruby/hanami/app/actions/queries/index.rb create mode 100644 frameworks/Ruby/hanami/app/actions/updates/index.rb diff --git a/frameworks/Ruby/hanami/.env b/frameworks/Ruby/hanami/.env new file mode 100644 index 00000000000..c28bf215c1f --- /dev/null +++ b/frameworks/Ruby/hanami/.env @@ -0,0 +1,3 @@ +HANAMI_ENV=production +HANAMI_PORT=8080 +DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock new file mode 100644 index 00000000000..36b859fb018 --- /dev/null +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -0,0 +1,166 @@ +GEM + remote: https://rubygems.org/ + specs: + bigdecimal (3.1.9) + concurrent-ruby (1.3.4) + dry-auto_inject (1.1.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-cli (1.2.0) + dry-configurable (1.3.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-core (1.1.0) + concurrent-ruby (~> 1.0) + logger + zeitwerk (~> 2.6) + dry-events (1.1.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.1) + dry-files (1.1.0) + dry-inflector (1.2.0) + dry-initializer (3.2.0) + dry-logger (1.0.4) + dry-logic (1.6.0) + bigdecimal + concurrent-ruby (~> 1.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-monitor (1.0.1) + dry-configurable (~> 1.0, < 2) + dry-core (~> 1.0, < 2) + dry-events (~> 1.0, < 2) + dry-schema (1.13.4) + concurrent-ruby (~> 1.0) + dry-configurable (~> 1.0, >= 1.0.1) + dry-core (~> 1.0, < 2) + dry-initializer (~> 3.0) + dry-logic (>= 1.4, < 2) + dry-types (>= 1.7, < 2) + zeitwerk (~> 2.6) + dry-struct (1.7.0) + dry-core (~> 1.1) + dry-types (~> 1.8) + ice_nine (~> 0.11) + zeitwerk (~> 2.6) + dry-system (1.2.0) + dry-auto_inject (~> 1.1) + dry-configurable (~> 1.3) + dry-core (~> 1.1) + dry-inflector (~> 1.1) + dry-transformer (1.0.1) + zeitwerk (~> 2.6) + dry-types (1.8.0) + bigdecimal (~> 3.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-logic (~> 1.4) + zeitwerk (~> 2.6) + dry-validation (1.10.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0, < 2) + dry-initializer (~> 3.0) + dry-schema (>= 1.12, < 2) + zeitwerk (~> 2.6) + hanami (2.2.1) + bundler (>= 1.16, < 3) + dry-configurable (~> 1.0, >= 1.2.0, < 2) + dry-core (~> 1.0, < 2) + dry-inflector (~> 1.0, >= 1.1.0, < 2) + dry-logger (~> 1.0, < 2) + dry-monitor (~> 1.0, >= 1.0.1, < 2) + dry-system (~> 1.1) + hanami-cli (~> 2.2.1) + hanami-utils (~> 2.2) + json (>= 2.7.2) + zeitwerk (~> 2.6) + hanami-cli (2.2.1) + bundler (~> 2.1) + dry-cli (~> 1.0, >= 1.1.0) + dry-files (~> 1.0, >= 1.0.2, < 2) + dry-inflector (~> 1.0, < 2) + rake (~> 13.0) + zeitwerk (~> 2.6) + hanami-controller (2.1.0) + dry-configurable (~> 1.0, < 2) + dry-core (~> 1.0) + hanami-utils (~> 2.1) + rack (~> 2.0) + zeitwerk (~> 2.6) + hanami-router (2.1.0) + mustermann (~> 3.0) + mustermann-contrib (~> 3.0) + rack (~> 2.0) + hanami-utils (2.2.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0, < 2) + dry-transformer (~> 1.0, < 2) + hanami-validations (2.1.0) + dry-validation (>= 1.10, < 2) + zeitwerk (~> 2.6.0) + hansi (0.2.1) + ice_nine (0.11.2) + json (2.9.1) + logger (1.6.4) + mustermann (3.0.3) + ruby2_keywords (~> 0.0.1) + mustermann-contrib (3.0.3) + hansi (~> 0.2.0) + mustermann (= 3.0.3) + nio4r (2.7.4) + pg (1.5.9) + puma (6.5.0) + nio4r (~> 2.0) + rack (2.2.9) + rake (13.2.1) + rom (5.3.2) + rom-changeset (~> 5.3, >= 5.3.0) + rom-core (~> 5.3, >= 5.3.2) + rom-repository (~> 5.3, >= 5.3.0) + rom-changeset (5.3.0) + dry-core (~> 1.0) + rom-core (~> 5.3) + transproc (~> 1.0, >= 1.1.0) + rom-core (5.3.2) + concurrent-ruby (~> 1.1) + dry-configurable (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-initializer (~> 3.0, >= 3.0.1) + dry-struct (~> 1.0) + dry-types (~> 1.6) + transproc (~> 1.0, >= 1.1.0) + rom-repository (5.3.0) + dry-core (~> 1.0) + dry-initializer (~> 3.0, >= 3.0.1) + rom-core (~> 5.3, >= 5.3.0) + rom-sql (3.6.5) + dry-core (~> 1.0) + dry-types (~> 1.0) + rom (~> 5.2, >= 5.2.1) + sequel (>= 4.49) + ruby2_keywords (0.0.5) + sequel (5.88.0) + bigdecimal + transproc (1.1.1) + zeitwerk (2.6.18) + +PLATFORMS + ruby + x86_64-darwin-23 + +DEPENDENCIES + dry-types (~> 1.0, >= 1.6.1) + hanami (~> 2.0) + hanami-controller (~> 2.0) + hanami-router (~> 2.0) + hanami-validations (~> 2.0) + pg + puma + rake + rom (~> 5.3) + rom-sql (~> 3.6) + +BUNDLED WITH + 2.5.16 diff --git a/frameworks/Ruby/hanami/app/actions/db/index.rb b/frameworks/Ruby/hanami/app/actions/db/index.rb index c32ec0f1df0..98b8ed970d8 100644 --- a/frameworks/Ruby/hanami/app/actions/db/index.rb +++ b/frameworks/Ruby/hanami/app/actions/db/index.rb @@ -8,7 +8,7 @@ class Index < HelloWorld::Action include Deps["persistence.rom"] def handle(*, response) - world = rom.relations[:World].where(id: random_id).one + world = rom.relations[:World].by_pk(random_id).one response.headers['Server'] = 'hanami' response.headers['Date'] = Time.now.httpdate response.format = :json diff --git a/frameworks/Ruby/hanami/app/actions/queries/index.rb b/frameworks/Ruby/hanami/app/actions/queries/index.rb new file mode 100644 index 00000000000..5a1d0bd1419 --- /dev/null +++ b/frameworks/Ruby/hanami/app/actions/queries/index.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module HelloWorld + module Actions + module Queries + class Index < HelloWorld::Action + QUERY_RANGE = 1..10_000 # range of IDs in the Fortune DB + ALL_IDS = QUERY_RANGE.to_a # enumeration of all the IDs in fortune DB + MIN_QUERIES = 1 # min number of records that can be retrieved + MAX_QUERIES = 500 # max number of records that can be retrieved + + include Deps["persistence.rom"] + + def handle(request, response) + worlds = ALL_IDS.sample(queries(request)).map do |id| + rom.relations[:World].by_pk(id).one + end + response.headers['Server'] = 'hanami' + response.headers['Date'] = Time.now.httpdate + response.format = :json + response.body = worlds.to_json + end + + private + + def queries(request) + request.params[:queries].to_i.clamp(MIN_QUERIES, MAX_QUERIES) + end + end + end + end +end diff --git a/frameworks/Ruby/hanami/app/actions/updates/index.rb b/frameworks/Ruby/hanami/app/actions/updates/index.rb new file mode 100644 index 00000000000..54f963f7bf2 --- /dev/null +++ b/frameworks/Ruby/hanami/app/actions/updates/index.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module HelloWorld + module Actions + module Updates + class Index < HelloWorld::Action + QUERY_RANGE = 1..10_000 # range of IDs in the Fortune DB + ALL_IDS = QUERY_RANGE.to_a # enumeration of all the IDs in fortune DB + MIN_QUERIES = 1 # min number of records that can be retrieved + MAX_QUERIES = 500 # max number of records that can be retrieved + + include Deps["persistence.rom"] + + def handle(request, response) + worlds = ALL_IDS.sample(queries(request)).map do |id| + world = rom.relations[:World].by_pk(id) + world_struct = world.one + new_value = random_id + new_value = random_id while new_value == world_struct[:randomnumber] + world_struct[:randomnumber] = new_value + world.command(:update).call(randomnumber: world_struct[:randomnumber]) + world_struct + end + response.headers['Server'] = 'hanami' + response.headers['Date'] = Time.now.httpdate + response.format = :json + response.body = worlds.to_json + end + + private + + def queries(request) + request.params[:queries].to_i.clamp(MIN_QUERIES, MAX_QUERIES) + end + + def random_id + Random.rand(QUERY_RANGE) + end + end + end + end +end diff --git a/frameworks/Ruby/hanami/benchmark_config.json b/frameworks/Ruby/hanami/benchmark_config.json index d5ee774c13f..d384577682c 100644 --- a/frameworks/Ruby/hanami/benchmark_config.json +++ b/frameworks/Ruby/hanami/benchmark_config.json @@ -2,8 +2,10 @@ "framework": "hanami", "tests": [{ "default": { - "db_url": "/db", "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Ruby/hanami/config/providers/persistence.rb b/frameworks/Ruby/hanami/config/providers/persistence.rb index 28234177e29..0aa12ececf6 100644 --- a/frameworks/Ruby/hanami/config/providers/persistence.rb +++ b/frameworks/Ruby/hanami/config/providers/persistence.rb @@ -5,12 +5,10 @@ require_relative '../auto_tune' num_workers, num_threads = auto_tune - opts = {} - - if (threads = num_threads) > 1 - opts[:max_connections] = (2 * Math.log(threads)).floor - opts[:pool_timeout] = 10 - end + opts = { + max_connections: 3, + pool_timeout: 10 + } config = ROM::Configuration.new(:sql, target["settings"].database_url, opts) register "config", config @@ -27,4 +25,8 @@ register "rom", ROM.container(config) end + + stop do + target["persistence.rom"].disconnect + end end diff --git a/frameworks/Ruby/hanami/config/puma.rb b/frameworks/Ruby/hanami/config/puma.rb index b360cf8a278..83e2dc90637 100644 --- a/frameworks/Ruby/hanami/config/puma.rb +++ b/frameworks/Ruby/hanami/config/puma.rb @@ -5,7 +5,7 @@ num_workers, num_threads = auto_tune workers num_workers -threads num_threads, num_threads +threads 3, 3 port ENV.fetch("HANAMI_PORT", 2300) environment ENV.fetch("HANAMI_ENV", "development") diff --git a/frameworks/Ruby/hanami/config/routes.rb b/frameworks/Ruby/hanami/config/routes.rb index 77ea9582b13..d568af27c70 100644 --- a/frameworks/Ruby/hanami/config/routes.rb +++ b/frameworks/Ruby/hanami/config/routes.rb @@ -4,6 +4,8 @@ module HelloWorld class Routes < Hanami::Routes get "/db", to: "db.index" get "/json", to: "json.index" + get "/updates", to: "updates.index" get "/plaintext", to: "plaintext.index" + get "/queries", to: "queries.index" end end diff --git a/frameworks/Ruby/hanami/hanami.dockerfile b/frameworks/Ruby/hanami/hanami.dockerfile index 6ba8e69f3e6..09892d3f9e7 100644 --- a/frameworks/Ruby/hanami/hanami.dockerfile +++ b/frameworks/Ruby/hanami/hanami.dockerfile @@ -7,15 +7,12 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +ADD ./ /hanami WORKDIR /hanami -COPY Gemfile ./ - ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle install --jobs=8 -COPY . . - EXPOSE 8080 ENV HANAMI_ENV=production From 6dad79d62b8f505cd5fc7c7a19812baac6e6c17c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:56:51 +0100 Subject: [PATCH 1250/1766] [c++/cuehttp] Remove Cuehttp (#9658) CueHttp only implements the plaintext test and the framework hasn't been updated in 4 years: https://github.com/doraxcyle/cuehttp --- frameworks/C++/cuehttp/README.md | 13 ---------- frameworks/C++/cuehttp/benchmark_config.json | 25 ------------------- frameworks/C++/cuehttp/config.toml | 14 ----------- frameworks/C++/cuehttp/cuehttp.dockerfile | 18 ------------- .../C++/cuehttp/plaintext/CMakeLists.txt | 21 ---------------- frameworks/C++/cuehttp/plaintext/main.cpp | 17 ------------- 6 files changed, 108 deletions(-) delete mode 100644 frameworks/C++/cuehttp/README.md delete mode 100644 frameworks/C++/cuehttp/benchmark_config.json delete mode 100644 frameworks/C++/cuehttp/config.toml delete mode 100644 frameworks/C++/cuehttp/cuehttp.dockerfile delete mode 100644 frameworks/C++/cuehttp/plaintext/CMakeLists.txt delete mode 100644 frameworks/C++/cuehttp/plaintext/main.cpp diff --git a/frameworks/C++/cuehttp/README.md b/frameworks/C++/cuehttp/README.md deleted file mode 100644 index 600152a6635..00000000000 --- a/frameworks/C++/cuehttp/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# cuehttp Benchmarking Test - -https://github.com/xcyl/cuehttp - -## Testing Source Code - -* [PLAINTEXT](plaintext/main.cpp) - -## Test URLs - -### PLAINTEXT - -http://localhost:8080/plaintext diff --git a/frameworks/C++/cuehttp/benchmark_config.json b/frameworks/C++/cuehttp/benchmark_config.json deleted file mode 100644 index 85b98fb5188..00000000000 --- a/frameworks/C++/cuehttp/benchmark_config.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "framework": "cuehttp", - "tests": [ - { - "default": { - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "None", - "framework": "cuehttp", - "language": "C++", - "flavor": "None", - "orm": "None", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "cuehttp", - "notes": "", - "versus": "cuehttp" - } - } - ] -} \ No newline at end of file diff --git a/frameworks/C++/cuehttp/config.toml b/frameworks/C++/cuehttp/config.toml deleted file mode 100644 index c9eb86399f0..00000000000 --- a/frameworks/C++/cuehttp/config.toml +++ /dev/null @@ -1,14 +0,0 @@ -[framework] -name = "cuehttp" - -[main] -urls.plaintext = "/plaintext" -approach = "Realistic" -classification = "Fullstack" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "None" -platform = "None" -webserver = "None" -versus = "cuehttp" diff --git a/frameworks/C++/cuehttp/cuehttp.dockerfile b/frameworks/C++/cuehttp/cuehttp.dockerfile deleted file mode 100644 index 5ea59fbf51b..00000000000 --- a/frameworks/C++/cuehttp/cuehttp.dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM ubuntu:18.04 - -RUN apt-get update -yqq -RUN apt-get install -yqq g++-7 cmake git libboost-all-dev - -ENV CUEHTTP=/cuehttp - -WORKDIR / -RUN git clone https://github.com/xcyl/cuehttp.git - -WORKDIR /cuehttp - -RUN git checkout a7f5a4c935e22d110b70c5928c8ea2ce4dcbeeb5 - -WORKDIR /cuehttp/examples/plaintext -RUN mkdir build && cd build && cmake .. && make -j8 -EXPOSE 8080 -CMD ./build/plaintext diff --git a/frameworks/C++/cuehttp/plaintext/CMakeLists.txt b/frameworks/C++/cuehttp/plaintext/CMakeLists.txt deleted file mode 100644 index dc7352aabad..00000000000 --- a/frameworks/C++/cuehttp/plaintext/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -cmake_minimum_required(VERSION 2.6) - -project(plaintext) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -msse4.2 -Wall -std=c++17") - -set(SRC main.cpp) -include_directories($ENV{CUEHTTP}/include) - -find_package(Boost COMPONENTS system REQUIRED) -include_directories(${Boost_INCLUDE_DIRS}) - -add_executable(${PROJECT_NAME} ${SRC}) - -target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES}) - -if (WIN32) - target_link_libraries(${PROJECT_NAME} ws2_32 wsock32) -else () - target_link_libraries(${PROJECT_NAME} pthread) -endif () diff --git a/frameworks/C++/cuehttp/plaintext/main.cpp b/frameworks/C++/cuehttp/plaintext/main.cpp deleted file mode 100644 index 2b103e2a909..00000000000 --- a/frameworks/C++/cuehttp/plaintext/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -using namespace cue::http; - -int main(int argc, char** argv) { - router route; - route.post("/plaintext", [](context& ctx) { - ctx.type("text/plain"); - ctx.status(200); - ctx.body("Hello, World!"); - }); - cuehttp app; - app.use(route); - app.listen(8080).run(); - - return 0; -} From 41ef0636a9317cdf81b50d359bc4f8e6dd745341 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Fri, 14 Mar 2025 01:57:04 +0500 Subject: [PATCH 1251/1766] [ntex]: add io-uring based runtime (#9659) * [ntex]: add io-uring runtime * wip * wip --- frameworks/Rust/ntex/Cargo.toml | 18 +++++++- frameworks/Rust/ntex/benchmark_config.json | 24 +++++------ frameworks/Rust/ntex/config.toml | 41 +++++++++++++++++++ .../Rust/ntex/ntex-db-neon-uring.dockerfile | 16 ++++++++ .../Rust/ntex/ntex-neon-uring.dockerfile | 16 ++++++++ .../Rust/ntex/ntex-plt-neon-uring.dockerfile | 16 ++++++++ frameworks/Rust/ntex/src/utils.rs | 3 +- 7 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 frameworks/Rust/ntex/ntex-db-neon-uring.dockerfile create mode 100644 frameworks/Rust/ntex/ntex-neon-uring.dockerfile create mode 100644 frameworks/Rust/ntex/ntex-plt-neon-uring.dockerfile diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index bfc44e1e408..ba3133f31b8 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -15,6 +15,10 @@ path = "src/main.rs" name = "ntex-neon" path = "src/main.rs" +[[bin]] +name = "ntex-neon-uring" +path = "src/main.rs" + [[bin]] name = "ntex-db" path = "src/main_db.rs" @@ -27,6 +31,10 @@ path = "src/main_db.rs" name = "ntex-db-neon" path = "src/main_db.rs" +[[bin]] +name = "ntex-db-neon-uring" +path = "src/main_db.rs" + [[bin]] name = "ntex-plt" path = "src/main_plt.rs" @@ -39,6 +47,10 @@ path = "src/main_plt.rs" name = "ntex-plt-neon" path = "src/main_plt.rs" +[[bin]] +name = "ntex-plt-neon-uring" +path = "src/main_plt.rs" + [features] default = [] @@ -51,6 +63,9 @@ compio = ["ntex/compio"] # neon runtime neon = ["ntex/neon"] +# neon runtime +neon-uring = ["ntex/neon-uring"] + [dependencies] ntex = "2.12" ntex-compio = "0.2" @@ -63,7 +78,7 @@ env_logger = "0.11" nanorand = { version = "0.7", default-features = false, features = ["std", "wyrand", "tls"] } atoi = "2.0" futures = "0.3" -sonic-rs = "0.3.16" +sonic-rs = "0.4.0" serde = { version = "1", features = ["derive"] } serde_json = "1" log = { version = "0.4", features = ["release_max_level_off"] } @@ -78,7 +93,6 @@ ntex = { git = "https://github.com/ntex-rs/ntex.git" } ntex-io = { git = "https://github.com/ntex-rs/ntex.git" } ntex-net = { git = "https://github.com/ntex-rs/ntex.git" } ntex-rt = { git = "https://github.com/ntex-rs/ntex.git" } -ntex-neon = { git = "https://github.com/ntex-rs/ntex.git" } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/ntex/benchmark_config.json b/frameworks/Rust/ntex/benchmark_config.json index 44e54843e8e..16615823f11 100755 --- a/frameworks/Rust/ntex/benchmark_config.json +++ b/frameworks/Rust/ntex/benchmark_config.json @@ -19,7 +19,7 @@ "notes": "", "versus": "" }, - "compio": { + "neon": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -33,11 +33,11 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [compio]", + "display_name": "ntex [neon]", "notes": "", "versus": "" }, - "neon": { + "neon-uring": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -51,7 +51,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [neon]", + "display_name": "ntex [neon(io-uring)]", "notes": "", "versus": "" }, @@ -75,7 +75,7 @@ "notes": "", "versus": "" }, - "db-compio": { + "db-neon": { "fortune_url": "/fortunes", "db_url": "/db", "query_url": "/query?q=", @@ -91,11 +91,11 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [compio,db]", + "display_name": "ntex [neon,db]", "notes": "", "versus": "" }, - "db-neon": { + "db-neon-uring": { "fortune_url": "/fortunes", "db_url": "/db", "query_url": "/query?q=", @@ -111,7 +111,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [neon,db]", + "display_name": "ntex [neon(io-uring),db]", "notes": "", "versus": "" }, @@ -133,7 +133,7 @@ "notes": "", "versus": "" }, - "plt-compio": { + "plt-neon": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -147,11 +147,11 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [compio,platform]", + "display_name": "ntex [neon,platform]", "notes": "", "versus": "" }, - "plt-neon": { + "plt-neon-uring": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -165,7 +165,7 @@ "webserver": "ntex", "os": "Linux", "database_os": "Linux", - "display_name": "ntex [neon,platform]", + "display_name": "ntex [neon(io-uring),platform]", "notes": "", "versus": "" } diff --git a/frameworks/Rust/ntex/config.toml b/frameworks/Rust/ntex/config.toml index 75e7832f73b..ad8a0276411 100644 --- a/frameworks/Rust/ntex/config.toml +++ b/frameworks/Rust/ntex/config.toml @@ -40,6 +40,19 @@ platform = "None" webserver = "ntex" versus = "" +[neon-uring] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "ntex" +versus = "" + [db] urls.db = "/db" urls.query = "/query?q=" @@ -85,6 +98,21 @@ platform = "None" webserver = "ntex" versus = "" +[db-neon-uring] +urls.db = "/db" +urls.query = "/query?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "ntex" +versus = "" + [plt] urls.plaintext = "/plaintext" urls.json = "/json" @@ -123,3 +151,16 @@ orm = "Raw" platform = "None" webserver = "ntex" versus = "" + +[plt-neon-uring] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "ntex" +versus = "" diff --git a/frameworks/Rust/ntex/ntex-db-neon-uring.dockerfile b/frameworks/Rust/ntex/ntex-db-neon-uring.dockerfile new file mode 100644 index 00000000000..2b65aaa1556 --- /dev/null +++ b/frameworks/Rust/ntex/ntex-db-neon-uring.dockerfile @@ -0,0 +1,16 @@ +FROM rust:latest + +# Disable simd at jsonescape +# ENV CARGO_CFG_JSONESCAPE_DISABLE_AUTO_SIMD= + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /ntex +WORKDIR /ntex + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="neon-uring" + +EXPOSE 8080 + +CMD ./target/release/ntex-db-neon-uring diff --git a/frameworks/Rust/ntex/ntex-neon-uring.dockerfile b/frameworks/Rust/ntex/ntex-neon-uring.dockerfile new file mode 100644 index 00000000000..f69e45e7f8d --- /dev/null +++ b/frameworks/Rust/ntex/ntex-neon-uring.dockerfile @@ -0,0 +1,16 @@ +FROM rust:latest + +# Disable simd at jsonescape +# ENV CARGO_CFG_JSONESCAPE_DISABLE_AUTO_SIMD= + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /ntex +WORKDIR /ntex + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="neon-uring" + +EXPOSE 8080 + +CMD ./target/release/ntex-neon-uring diff --git a/frameworks/Rust/ntex/ntex-plt-neon-uring.dockerfile b/frameworks/Rust/ntex/ntex-plt-neon-uring.dockerfile new file mode 100644 index 00000000000..943c6ef2373 --- /dev/null +++ b/frameworks/Rust/ntex/ntex-plt-neon-uring.dockerfile @@ -0,0 +1,16 @@ +FROM rust:latest + +# Disable simd at jsonescape +# ENV CARGO_CFG_JSONESCAPE_DISABLE_AUTO_SIMD= + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /ntex +WORKDIR /ntex + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --features="neon-uring" + +EXPOSE 8080 + +CMD ./target/release/ntex-plt-neon-uring diff --git a/frameworks/Rust/ntex/src/utils.rs b/frameworks/Rust/ntex/src/utils.rs index b8a9010237f..6fd48e6e265 100644 --- a/frameworks/Rust/ntex/src/utils.rs +++ b/frameworks/Rust/ntex/src/utils.rs @@ -57,10 +57,11 @@ impl WriteExt for BytesWriter<'_> { } #[inline(always)] - unsafe fn flush_len(&mut self, additional: usize) { + unsafe fn flush_len(&mut self, additional: usize) -> io::Result<()> { unsafe { let new_len = self.0.len() + additional; self.0.set_len(new_len); } + Ok(()) } } From 31d41fe2f44d67f85c2813a5ebf7f93537772444 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:58:35 +0100 Subject: [PATCH 1252/1766] [ruby/sinatra] Update dependencies (#9637) --- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 28 +++++++++++-------- frameworks/Ruby/sinatra-sequel/hello_world.rb | 3 ++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 4f084bcd3b9..40b1cad63db 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -2,44 +2,48 @@ GEM remote: https://rubygems.org/ specs: base64 (0.2.0) - bigdecimal (3.1.8) + bigdecimal (3.1.9) iodine (0.7.58) - json (2.9.1) + json (2.10.1) kgio (2.11.4) + logger (1.6.6) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.24) + passenger (6.0.26) rack (>= 1.6.13) rackup (>= 2.0.0) rake (>= 12.3.3) - pg (1.5.8) - puma (6.5.0) + pg (1.5.9) + puma (6.6.0) nio4r (~> 2.0) - rack (3.1.8) - rack-protection (4.0.0) + rack (3.1.12) + rack-protection (4.1.1) base64 (>= 0.1.0) + logger (>= 1.6.0) rack (>= 3.0.0, < 4) - rack-session (2.0.0) + rack-session (2.1.0) + base64 (>= 0.1.0) rack (>= 3.0.0) rackup (2.2.1) rack (>= 3) raindrops (0.20.1) rake (13.2.1) ruby2_keywords (0.0.5) - sequel (5.85.0) + sequel (5.90.0) bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) - sinatra (4.0.0) + sinatra (4.1.1) + logger (>= 1.6.0) mustermann (~> 3.0) rack (>= 3.0.0, < 4) - rack-protection (= 4.0.0) + rack-protection (= 4.1.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - tilt (2.4.0) + tilt (2.6.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index 454c77e5a16..3f4380aecb5 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -10,6 +10,9 @@ class HelloWorld < Sinatra::Base # XSS, CSRF, IP spoofing, etc. protection are not explicitly required disable :protection + # disable host_authorization for all environments + set :host_authorization, { permitted_hosts: [] } + # Only add the charset parameter to specific content types per the requirements set :add_charset, [mime_type(:html)] end From e5968db3b39fe5e1f28af15fddba1ed6e525abba Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 13 Mar 2025 21:58:44 +0100 Subject: [PATCH 1253/1766] [python/flask] Pin Werkzeug version (#9638) This fixes the failing flask test because Werkzeug version 3 removed `url_quote` raising: ImportError: cannot import name 'url_quote' from 'werkzeug.urls' --- frameworks/Python/flask/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Python/flask/requirements.txt b/frameworks/Python/flask/requirements.txt index eb63cf6086d..bbd623a8f9d 100644 --- a/frameworks/Python/flask/requirements.txt +++ b/frameworks/Python/flask/requirements.txt @@ -10,3 +10,4 @@ Jinja2==3.1.4 MarkupSafe==2.1.2 ujson==5.4.0 orjson==3.8.7; implementation_name=='cpython' +Werkzeug==2.3.8 From 00416748fb572cfc20acba63d762d5565b315bae Mon Sep 17 00:00:00 2001 From: Petrik Date: Thu, 13 Mar 2025 09:16:59 +0100 Subject: [PATCH 1254/1766] [ruby/roda-sequel] Enable assume_fixed_locals +------------------------+-------+ | branch_name|fortune| +------------------------+-------+ | master| 29296| |roda/assume-fixed-locals| 32861| +------------------------+-------+ --- frameworks/Ruby/roda-sequel/Gemfile.lock | 6 +++--- frameworks/Ruby/roda-sequel/hello_world.rb | 10 +++++----- frameworks/Ruby/roda-sequel/views/fortunes.erb | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index cb136ca6029..8c6f5bc8321 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -5,16 +5,16 @@ GEM bigdecimal (3.1.9) erubi (1.13.1) iodine (0.7.58) - json (2.10.1) + json (2.10.2) kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.11) + rack (3.1.12) raindrops (0.20.1) - roda (3.89.0) + roda (3.90.0) rack sequel (5.90.0) bigdecimal diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 387e0187034..6f5adc59b5c 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -3,7 +3,7 @@ # Our Rack application to be executed by rackup class HelloWorld < Roda plugin :hooks - plugin :render, escape: true, layout_opts: { cache_key: "default_layout" } + plugin :render, escape: true, assume_fixed_locals: true, template_opts: { extract_fixed_locals: true}, layout_opts: { cache_key: "default_layout" } def bounded_queries queries = request.params["queries"].to_i @@ -56,13 +56,13 @@ def set_default_headers(response) # Test type 4: Fortunes r.is "fortunes" do response[CONTENT_TYPE] = HTML_TYPE - @fortunes = Fortune.all - @fortunes << Fortune.new( + fortunes = Fortune.all + fortunes << Fortune.new( id: 0, message: "Additional fortune added at request time." ) - @fortunes.sort_by!(&:message) - view :fortunes + fortunes.sort_by!(&:message) + view :fortunes, locals: { fortunes: fortunes } end # Test type 5: Database updates diff --git a/frameworks/Ruby/roda-sequel/views/fortunes.erb b/frameworks/Ruby/roda-sequel/views/fortunes.erb index e3dbcf66239..6b1f763da43 100644 --- a/frameworks/Ruby/roda-sequel/views/fortunes.erb +++ b/frameworks/Ruby/roda-sequel/views/fortunes.erb @@ -3,7 +3,7 @@ id message -<% @fortunes.each do |fortune| %> +<% fortunes.each do |fortune| %> <%= fortune.id %> <%= fortune.message %> From 85c756eaa03b7ef2ef9cf3881a39a3bd16baa178 Mon Sep 17 00:00:00 2001 From: Petrik Date: Fri, 14 Mar 2025 13:26:14 +0100 Subject: [PATCH 1255/1766] [ruby/roda-sequel] Get ids outside of database connection +----------------------------------+------+ | branch_name|update| +----------------------------------+------+ | master| 9258| |roda-sequel/ids-outside-connection| 9601| +----------------------------------+------+ --- frameworks/Ruby/roda-sequel/hello_world.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 387e0187034..a3da529b8d2 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -44,9 +44,10 @@ def set_default_headers(response) # Test type 3: Multiple database queries r.is "queries" do response[CONTENT_TYPE] = JSON_TYPE + ids = ALL_IDS.sample(bounded_queries) worlds = DB.synchronize do - ALL_IDS.sample(bounded_queries).map do |id| + ids.map do |id| World.with_pk(id).values end end @@ -69,9 +70,10 @@ def set_default_headers(response) r.is "updates" do response[CONTENT_TYPE] = JSON_TYPE worlds = [] + ids = ALL_IDS.sample(bounded_queries) DB.synchronize do worlds = - ALL_IDS.sample(bounded_queries).map do |id| + ids.map do |id| world = World.with_pk(id) new_value = rand1 new_value = rand1 while new_value == world.randomnumber From 2f429b3d7bbbcbf22793fdd2981f904150a81ebe Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 14 Mar 2025 20:55:18 +0800 Subject: [PATCH 1256/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/Java/smart-socket/pom.xml | 13 ++++------- .../java/org/smartboot/http/Bootstrap.java | 23 +++---------------- .../org/smartboot/http/FeatController.java | 10 ++++---- .../http/MultipleQueriesHandler.java | 9 ++++++-- .../smartboot/http/SingleQueryHandler.java | 9 ++++++-- .../java/org/smartboot/servlet/Bootstrap.java | 10 ++++---- 6 files changed, 31 insertions(+), 43 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 3f01bb7e61f..402693dcb80 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.8 + 2.9.1 5.0.0 0.9.23
      @@ -19,13 +19,8 @@ tech.smartboot.feat - feat-restful - 0.5 - - - io.edap - edapx-json - 0.1-SNAPSHOT + feat-cloud-starter + 0.8.2 tech.smartboot.servlet @@ -34,7 +29,7 @@ tech.smartboot.feat - feat-restful + feat-core diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java index e7971b1bc39..80fe3131706 100755 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/Bootstrap.java @@ -8,31 +8,14 @@ package org.smartboot.http; -import tech.smartboot.feat.restful.RestFeat; + +import tech.smartboot.feat.cloud.FeatCloud; public class Bootstrap { - static byte[] body = "Hello, World!".getBytes(); public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); - // 定义服务器接受的消息类型以及各类消息对应的处理器 -// Feat.createHttpServer(options -> { -// options.threadNum(cpuNum + 1) -// .headerLimiter(0) -// .readBufferSize(1024 * 4) -// .writeBufferSize(1024 * 4); -// }).httpHandler(request -> { -// HttpResponse response = request.getResponse(); -// if ("/plaintext".equals(request.getRequestURI())) { -// response.setContentLength(body.length); -// response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); -// response.write(body); -// } else if ("/json".equals(request.getRequestURI())) { -// response.setContentType("application/json"); -// JsonUtil.writeJsonBytes(response, new Message("Hello, World!")); -// } -// }).listen(8080); - RestFeat.createServer(options -> { + FeatCloud.cloudServer(options -> { options.threadNum(cpuNum + 1) .headerLimiter(0) .readBufferSize(1024 * 4) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java index 8050de77198..2973f2861e5 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/FeatController.java @@ -1,9 +1,9 @@ package org.smartboot.http; import org.smartboot.Message; -import tech.smartboot.feat.core.apt.annotation.Controller; -import tech.smartboot.feat.core.apt.annotation.RequestMapping; -import tech.smartboot.feat.core.common.enums.HeaderValueEnum; +import tech.smartboot.feat.cloud.annotation.Controller; +import tech.smartboot.feat.cloud.annotation.RequestMapping; +import tech.smartboot.feat.core.common.HeaderValue; import tech.smartboot.feat.core.server.HttpResponse; @Controller @@ -12,13 +12,13 @@ public class FeatController { @RequestMapping("/plaintext") public byte[] plaintext(HttpResponse response) { - response.setContentType(HeaderValueEnum.ContentType.TEXT_PLAIN_UTF8); + response.setContentType(HeaderValue.ContentType.TEXT_PLAIN_UTF8); return body; } @RequestMapping("/json") public Message json(HttpResponse response) { - response.setContentType(HeaderValueEnum.ContentType.APPLICATION_JSON_UTF8); + response.setContentType(HeaderValue.ContentType.APPLICATION_JSON_UTF8); return new Message("Hello, World!"); } } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index f9b6b4faa5b..200f8ee2606 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -2,9 +2,9 @@ import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.server.HttpHandler; import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; -import tech.smartboot.feat.core.server.handler.BaseHttpHandler; import javax.sql.DataSource; import java.io.IOException; @@ -19,7 +19,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class MultipleQueriesHandler extends BaseHttpHandler { +public class MultipleQueriesHandler implements HttpHandler { private DataSource dataSource; public MultipleQueriesHandler(DataSource dataSource) { @@ -59,6 +59,11 @@ public void handle(HttpRequest httpRequest, CompletableFuture completabl } + @Override + public void handle(HttpRequest request) throws Throwable { + + } + protected int getRandomNumber() { return 1 + ThreadLocalRandom.current().nextInt(10000); } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index 12898f62b7d..326ac0e8782 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -1,9 +1,9 @@ package org.smartboot.http; +import tech.smartboot.feat.core.server.HttpHandler; import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; -import tech.smartboot.feat.core.server.handler.BaseHttpHandler; import javax.sql.DataSource; import java.io.IOException; @@ -18,7 +18,7 @@ * @author 三刀 * @version V1.0 , 2020/6/16 */ -public class SingleQueryHandler extends BaseHttpHandler { +public class SingleQueryHandler implements HttpHandler { private DataSource dataSource; public SingleQueryHandler(DataSource dataSource) { @@ -49,6 +49,11 @@ public void handle(HttpRequest httpRequest, CompletableFuture completabl } + @Override + public void handle(HttpRequest request) throws Throwable { + + } + protected int getRandomNumber() { return 1 + ThreadLocalRandom.current().nextInt(10000); } 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 f3caa038cbe..0ff24d1cbfa 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,7 +4,6 @@ import tech.smartboot.servlet.Container; import tech.smartboot.servlet.ServletContextRuntime; import tech.smartboot.servlet.conf.ServletInfo; -import tech.smartboot.servlet.conf.ServletMappingInfo; /** * @author 三刀(zhengjunweimail@163.com) @@ -13,7 +12,7 @@ public class Bootstrap { public static void main(String[] args) throws Throwable { - System.setProperty("smart-servlet-spring-boot-starter","true"); + System.setProperty("smart-servlet-spring-boot-starter", "true"); Container containerRuntime = new Container(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/"); @@ -23,23 +22,24 @@ public static void main(String[] args) throws Throwable { ServletInfo plainTextServletInfo = new ServletInfo(); plainTextServletInfo.setServletName("plaintext"); plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName()); - applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(plainTextServletInfo.getServletName(), "/plaintext")); + plainTextServletInfo.addServletMapping("/plaintext", applicationRuntime); applicationRuntime.getDeploymentInfo().addServlet(plainTextServletInfo); // json ServletInfo jsonServletInfo = new ServletInfo(); jsonServletInfo.setServletName("json"); jsonServletInfo.setServletClass(JsonServlet.class.getName()); + jsonServletInfo.addServletMapping("/json", applicationRuntime); applicationRuntime.getDeploymentInfo().addServlet(jsonServletInfo); - applicationRuntime.getDeploymentInfo().addServletMapping(new ServletMappingInfo(jsonServletInfo.getServletName(), "/json")); containerRuntime.addRuntime(applicationRuntime); int cpuNum = Runtime.getRuntime().availableProcessors(); // 定义服务器接受的消息类型以及各类消息对应的处理器 containerRuntime.getConfiguration() .setThreadNum(cpuNum) + .setHeaderLimiter(0) .setReadBufferSize(1024 * 4); containerRuntime.initialize(); containerRuntime.start(); - + } } From 09b1eaf061c52f430c4c632d19941e2779765e0b Mon Sep 17 00:00:00 2001 From: zhengjw22 Date: Fri, 14 Mar 2025 20:59:34 +0800 Subject: [PATCH 1257/1766] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/smart-servlet/License.shield | Bin 967 -> 693 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield b/frameworks/Java/smart-socket/src/main/resources/smart-servlet/License.shield index f970f023915e0e46165f8a833528edbaedc9f2d4..866f59ca2b9f0665da74f5215d800e02049593ca 100644 GIT binary patch delta 623 zcmV-#0+9X32ek!3b8TUAbS-RYV`Xl0WdHyHlN8g#r~m)~nrjQ)H~;_uAZ0LNF=Q}i zGGa6|F=aL}WM(ojHZfr{GG<~lVL4=BWsyN4f4GsCp2D(gl`?HJCbax=k2xu3gpCM< zPh()fja5gTAu1s@C7s)HF%UFWzAYWrNm6K;!rI`CE<4td-5dPrxli@zLO*~%p|I1! zS;#%uqRaT1r1=5T3Tek(YU^l2)@Oe90R(FfVi#UK$c$=1@)Ufxxp$FZ!O@%n1lvLr z0iBWJHh&6$2s?=LiF`6uqs8|?Y?}tE{G=1Nfyt(RXm#R8d000000010-MUN$v27fjG(93`(Q;+4UOJBzThm_2|)rRtK z4FJ6T`lV>Jt=x!7AqY0lJ}>m;Fri`g{=gsXm1jL72CZpREpEEwwG?8h=++PStm$*T zX8p@>1S=zTCSo-m=S~I!&qDx+aoXoRwjhSea&m- z`M0%SnojoM*J_(OfkneTL69CmF`aoQN%7~YQHp(k@6ZyXYF&Sr%U!tB49QXZPBXhR z9ASld*FI7uZ*^!beU~viOp#F z^)n091{Eq+b7g1Tcj5w;p!QXn>kqFT(a%=l%iUH<-UGd($|u}tG!4X_i`wxf`Z8wA zz<(kqSowIFh479V2`mJwAFdrvRmk9(p}cEY9)J8<7=-)L;4F_6vw0ueYf~Sj{PR~(C;$Ke z0000041k?LxrFUDe3af7AAygrSO$0?$t|{L90Ta(EC@kUb7ixt`2acmVr4oXZE>CJ zw`dJ9*+OMKBbUh0Bj~8a7qf9La2&K*;;ffmP!hLi9F45-(w*1Jcq&b09%SzjGJlzO z%W!p%mN{b?VQsrrBMkVLq;|Av4pEzKuE@Oc*jj4<00000000nxX7T)#{A*6(F1(s+ zI8Ys-Q>JFW3gi+qb+#)mC&Cz%I#P*@xq69x`^k>dtXR zgjiu_;HZjL>hSt?pQa<+?3a${m^5dvv>Lb*d!0 Date: Sat, 15 Mar 2025 00:30:34 +0800 Subject: [PATCH 1258/1766] [go/gin] Ensure rows are closed --- frameworks/Go/gin/gin-src/hello.go | 1 + frameworks/Go/gin/gin-std/main.go | 1 + 2 files changed, 2 insertions(+) diff --git a/frameworks/Go/gin/gin-src/hello.go b/frameworks/Go/gin/gin-src/hello.go index 88328c39e4b..4b15c438838 100644 --- a/frameworks/Go/gin/gin-src/hello.go +++ b/frameworks/Go/gin/gin-src/hello.go @@ -99,6 +99,7 @@ func fortunes(c *gin.Context) { c.AbortWithError(500, err) return } + defer rows.Close() // Ensure rows are closed fortunes := make(Fortunes, 0) for rows.Next() { //Fetch rows diff --git a/frameworks/Go/gin/gin-std/main.go b/frameworks/Go/gin/gin-std/main.go index 43065bc9b22..390d7e13f3b 100644 --- a/frameworks/Go/gin/gin-std/main.go +++ b/frameworks/Go/gin/gin-std/main.go @@ -99,6 +99,7 @@ func fortunes(c *gin.Context) { c.AbortWithError(500, err) return } + defer rows.Close() // Ensure rows are closed fortunes := make(Fortunes, 0) for rows.Next() { //Fetch rows From d0e486a4373421417a4ad2abb25285cbfbfe5564 Mon Sep 17 00:00:00 2001 From: Petrik Date: Fri, 14 Mar 2025 13:34:54 +0100 Subject: [PATCH 1259/1766] [ruby/sinatra] Get ids outside of database connection +------------------------------+------+ | branch_name|update| +------------------------------+------+ | master| 7905| |sinatra/ids-outside-connection| 8392| +------------------------------+------+ --- frameworks/Ruby/sinatra-sequel/hello_world.rb | 6 ++++-- frameworks/Ruby/sinatra/hello_world.rb | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/hello_world.rb b/frameworks/Ruby/sinatra-sequel/hello_world.rb index 3f4380aecb5..f4410cd140c 100644 --- a/frameworks/Ruby/sinatra-sequel/hello_world.rb +++ b/frameworks/Ruby/sinatra-sequel/hello_world.rb @@ -54,9 +54,10 @@ def rand1 # Test type 3: Multiple database queries get '/queries' do + ids = ALL_IDS.sample(bounded_queries) worlds = DB.synchronize do - ALL_IDS.sample(bounded_queries).map do |id| + ids.map do |id| World.with_pk(id) end end @@ -79,9 +80,10 @@ def rand1 # Test type 5: Database updates get '/updates' do worlds = nil + ids = ALL_IDS.sample(bounded_queries) DB.synchronize do worlds = - ALL_IDS.sample(bounded_queries).map do |id| + ids.map do |id| world = World.with_pk(id) new_value = rand1 new_value = rand1 while new_value == world.randomnumber diff --git a/frameworks/Ruby/sinatra/hello_world.rb b/frameworks/Ruby/sinatra/hello_world.rb index 54afe906d6a..3c5a96ba2a4 100644 --- a/frameworks/Ruby/sinatra/hello_world.rb +++ b/frameworks/Ruby/sinatra/hello_world.rb @@ -59,9 +59,10 @@ def rand1 # Test type 3: Multiple database queries get '/queries' do + ids = ALL_IDS.sample(bounded_queries) worlds = ActiveRecord::Base.with_connection do - ALL_IDS.sample(bounded_queries).map do |id| + ids.map do |id| World.find(id).attributes end end @@ -86,8 +87,9 @@ def rand1 # Test type 5: Database updates get '/updates' do worlds = nil + ids = ALL_IDS.sample(bounded_queries) ActiveRecord::Base.with_connection do - worlds = ALL_IDS.sample(bounded_queries).map do |id| + worlds = ids.map do |id| world = World.find(id) new_value = rand1 new_value = rand1 until new_value != world.randomNumber From 5fa7af56113abea842dda2e82c344425e986a905 Mon Sep 17 00:00:00 2001 From: Petrik Date: Tue, 11 Mar 2025 10:06:30 +0100 Subject: [PATCH 1260/1766] [ruby/rack-sequel] Get ids outside of database connection +---------------------------+-----+ | branch_name|query| +---------------------------+-----+ | master|21337| |rack/ids-outside-connection|21873| +---------------------------+-----+ --- frameworks/Ruby/rack-sequel/hello_world.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 37674cba883..7e7c1beb144 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -44,8 +44,9 @@ def db end def queries(env) + ids = ALL_IDS.sample(bounded_queries(env)) DB.synchronize do - ALL_IDS.sample(bounded_queries(env)).map do |id| + ids.map do |id| World::BY_ID.(id: id) end end @@ -93,9 +94,10 @@ def fortunes end def updates(env) + ids = ALL_IDS.sample(bounded_queries(env)) DB.synchronize do worlds = - ALL_IDS.sample(bounded_queries(env)).map do |id| + ids.map do |id| world = World::BY_ID.(id: id) world[:randomnumber] = rand1 world From ee37ca41a63757318227a002cef39d8fbb6aea9b Mon Sep 17 00:00:00 2001 From: Petrik Date: Sun, 9 Mar 2025 18:46:43 +0100 Subject: [PATCH 1261/1766] [rails] Use ActionController::API for actions that return JSON API::Controller is a lightweight version of ActionController::Base, useful for controllers that only return JSON. +----------------------+------+-----+-----+------+-------+---------+--------------+ | branch_name| json| db|query|update|fortune|plaintext|weighted_score| +----------------------+------+-----+-----+------+-------+---------+--------------+ | master|147603|32970|26658| 15330| 18044| 173519| 1934| |rails/metal-controller|159296|33277|30173| 15743| 19999| 177191| 2059| +----------------------+------+-----+-----+------+-------+---------+--------------+ --- .../app/controllers/application_controller.rb | 9 --------- .../rails/app/controllers/concerns/date_header.rb | 15 +++++++++++++++ .../rails/app/controllers/fortunes_controller.rb | 12 ++++++++++++ .../app/controllers/hello_world_controller.rb | 11 +++-------- .../{hello_world => fortunes}/fortune.html.erb | 0 frameworks/Ruby/rails/config/routes.rb | 2 +- 6 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 frameworks/Ruby/rails/app/controllers/concerns/date_header.rb create mode 100644 frameworks/Ruby/rails/app/controllers/fortunes_controller.rb rename frameworks/Ruby/rails/app/views/{hello_world => fortunes}/fortune.html.erb (100%) diff --git a/frameworks/Ruby/rails/app/controllers/application_controller.rb b/frameworks/Ruby/rails/app/controllers/application_controller.rb index 0ef204a6b6b..7944f9f993a 100644 --- a/frameworks/Ruby/rails/app/controllers/application_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/application_controller.rb @@ -1,13 +1,4 @@ # frozen_string_literal: true class ApplicationController < ActionController::Base - if defined?(Agoo) || defined?(Falcon) || defined?(Puma) - before_action :add_date_header - end - - private - - def add_date_header - response.set_header('Date', Time.now.httpdate) - end end diff --git a/frameworks/Ruby/rails/app/controllers/concerns/date_header.rb b/frameworks/Ruby/rails/app/controllers/concerns/date_header.rb new file mode 100644 index 00000000000..d314038144c --- /dev/null +++ b/frameworks/Ruby/rails/app/controllers/concerns/date_header.rb @@ -0,0 +1,15 @@ +module DateHeader + extend ActiveSupport::Concern + + included do + if defined?(Agoo) || defined?(Falcon) || defined?(Puma) + before_action :add_header + end + end + + private + + def add_header + response.set_header('Date', Time.now.httpdate) + end +end diff --git a/frameworks/Ruby/rails/app/controllers/fortunes_controller.rb b/frameworks/Ruby/rails/app/controllers/fortunes_controller.rb new file mode 100644 index 00000000000..0f937aff039 --- /dev/null +++ b/frameworks/Ruby/rails/app/controllers/fortunes_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class FortunesController < ApplicationController + include DateHeader + + def index + @fortunes = Fortune.all.to_a + @fortunes << Fortune.new(id: 0, message: 'Additional fortune added at request time.') + @fortunes.sort_by!(&:message) + render :fortune + end +end diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index 9e9ce8b8327..d4582e18c02 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true -class HelloWorldController < ApplicationController +class HelloWorldController < ActionController::API + include DateHeader + QUERY_RANGE = 1..10_000 # range of IDs in the Fortune DB ALL_IDS = QUERY_RANGE.to_a # enumeration of all the IDs in fortune DB MIN_QUERIES = 1 # min number of records that can be retrieved @@ -26,13 +28,6 @@ def cached_query render json: items.values end - def fortune - @fortunes = Fortune.all.to_a - @fortunes << Fortune.new(id: 0, message: 'Additional fortune added at request time.') - @fortunes.sort_by!(&:message) - render :fortune - end - def update worlds = ALL_IDS.sample(query_count).map do |id| world = World.find(id) diff --git a/frameworks/Ruby/rails/app/views/hello_world/fortune.html.erb b/frameworks/Ruby/rails/app/views/fortunes/fortune.html.erb similarity index 100% rename from frameworks/Ruby/rails/app/views/hello_world/fortune.html.erb rename to frameworks/Ruby/rails/app/views/fortunes/fortune.html.erb diff --git a/frameworks/Ruby/rails/config/routes.rb b/frameworks/Ruby/rails/config/routes.rb index 33afbfbcdda..22c47dc8704 100644 --- a/frameworks/Ruby/rails/config/routes.rb +++ b/frameworks/Ruby/rails/config/routes.rb @@ -46,7 +46,7 @@ get "json", to: JsonApp get "db", to: "hello_world#db" get "queries", to: "hello_world#query" - get "fortunes", to: "hello_world#fortune" + get "fortunes", to: "fortunes#index" get "updates", to: "hello_world#update" get "plaintext", to: PlaintextApp get "cached", to: "hello_world#cached_query" From 3a435f346e01b439d82021852b5323d66f866a1f Mon Sep 17 00:00:00 2001 From: David Denton Date: Sat, 15 Mar 2025 13:14:28 +0000 Subject: [PATCH 1262/1766] Reduce entries to limit of 10 --- .../Kotlin/http4k/benchmark_config.json | 220 ------------------ frameworks/Kotlin/http4k/config.toml | 176 -------------- frameworks/Kotlin/http4k/settings.gradle.kts | 12 +- 3 files changed, 2 insertions(+), 406 deletions(-) diff --git a/frameworks/Kotlin/http4k/benchmark_config.json b/frameworks/Kotlin/http4k/benchmark_config.json index 81dd97b4b47..810be318c33 100755 --- a/frameworks/Kotlin/http4k/benchmark_config.json +++ b/frameworks/Kotlin/http4k/benchmark_config.json @@ -2,51 +2,6 @@ "framework": "http4k", "tests": [ { - "default": { - "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": "sunhttp", - "webserver": "None", - "os": "Linux", - "notes": "https://http4k.org", - "display_name": "http4k-sunhttp", - "versus": "servlet" - }, - "sunhttploom": { - "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=", - "database": "Postgres", - "port": 9000, - "approach": "Realistic", - "classification": "Micro", - "framework": "http4k", - "language": "Kotlin", - "platform": "sunhttp", - "webserver": "None", - "os": "Linux", - "notes": "https://http4k.org", - "display_name": "http4k-sunhttploom", - "versus": "servlet" - }, "apache": { "orm": "Raw", "database_os": "Linux", @@ -91,69 +46,6 @@ "notes": "https://http4k.org", "versus": "servlet" }, - "apache-graalvm": { - "orm": "Raw", - "database_os": "Linux", - "cached_query_url": "/cached?queries=", - "db_url": "/db", - "json_url": "/json", - "plaintext_url": "/plaintext", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "database": "Postgres", - "port": 9000, - "approach": "Realistic", - "classification": "Micro", - "framework": "http4k", - "language": "Kotlin", - "platform": "graalvm", - "webserver": "None", - "os": "Linux", - "notes": "https://http4k.org", - "versus": "servlet" - }, - "graalvm": { - "orm": "Raw", - "database_os": "Linux", - "cached_query_url": "/cached?queries=", - "db_url": "/db", - "json_url": "/json", - "plaintext_url": "/plaintext", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "database": "Postgres", - "port": 9000, - "approach": "Realistic", - "classification": "Micro", - "framework": "http4k", - "language": "Kotlin", - "platform": "graalvm", - "webserver": "None", - "os": "Linux", - "notes": "https://http4k.org", - "versus": "servlet" - }, - "helidon-graalvm": { - "orm": "Raw", - "database_os": "Linux", - "cached_query_url": "/cached?queries=", - "db_url": "/db", - "json_url": "/json", - "plaintext_url": "/plaintext", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "database": "Postgres", - "port": 9000, - "approach": "Realistic", - "classification": "Micro", - "framework": "http4k", - "language": "Kotlin", - "platform": "graalvm", - "webserver": "None", - "os": "Linux", - "notes": "https://http4k.org", - "versus": "helidon-jdbc" - }, "helidon-jdbc": { "orm": "Raw", "database_os": "Linux", @@ -242,118 +134,6 @@ "notes": "https://http4k.org", "versus": "jetty" }, - "jettyloom-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": "jetty-loom-pgclient", - "webserver": "None", - "os": "Linux", - "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", - "cached_query_url": "/cached?queries=", - "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": "ktor", - "webserver": "None", - "os": "Linux", - "notes": "https://http4k.org", - "versus": "ktor-cio", - "tags": ["broken"] - }, "ktornetty": { "orm": "Raw", "database_os": "Linux", diff --git a/frameworks/Kotlin/http4k/config.toml b/frameworks/Kotlin/http4k/config.toml index 4f3a6f6e614..e61586ecd1b 100644 --- a/frameworks/Kotlin/http4k/config.toml +++ b/frameworks/Kotlin/http4k/config.toml @@ -54,41 +54,6 @@ platform = "ktor" webserver = "None" versus = "ktor-netty" -[main] -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 = "sunhttp" -webserver = "None" -versus = "servlet" - -[sunhttploom] -urls.cached_query = "/cached?queries=" -urls.db = "/db" -urls.fortune = "/fortunes" -urls.json = "/json" -urls.plaintext = "/plaintext" -urls.query = "/queries?queries=" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "sunhttp" -webserver = "None" -versus = "servlet" - [apache4] urls.cached_query = "/cached?queries=" urls.db = "/db" @@ -143,78 +108,6 @@ platform = "jetty-loom-jdbc" webserver = "None" versus = "jetty" -[jettyloom-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 = "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" @@ -269,75 +162,6 @@ platform = "apache-httpcore" webserver = "None" versus = "servlet" -[helidon-graalvm] -urls.cached_query = "/cached?queries=" -urls.db = "/db" -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 = "graalvm" -webserver = "None" -versus = "helidon-jdbc" - -[apache-graalvm] -urls.cached_query = "/cached?queries=" -urls.db = "/db" -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 = "graalvm" -webserver = "None" -versus = "servlet" - -[graalvm] -urls.cached_query = "/cached?queries=" -urls.db = "/db" -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 = "graalvm" -webserver = "None" -versus = "servlet" - -[ktorcio] -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 = "ktor" -webserver = "None" -versus = "ktor-cio" - [ratpack] urls.cached_query = "/cached?queries=" urls.db = "/db" diff --git a/frameworks/Kotlin/http4k/settings.gradle.kts b/frameworks/Kotlin/http4k/settings.gradle.kts index bc46ef57f0e..d00bf33bbe8 100644 --- a/frameworks/Kotlin/http4k/settings.gradle.kts +++ b/frameworks/Kotlin/http4k/settings.gradle.kts @@ -23,23 +23,15 @@ rootProject.name = "http4k-benchmark" include("core") include("core-jdbc") include("core-pgclient") + + include("apache") -include("apache-graalvm") include("apache4") -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") -include("ktorcio") include("ktornetty") include("netty") include("ratpack") -include("sunhttp") -include("sunhttploom") include("undertow") From 80d798e3affe51449def416ae73eee17e7033f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Mon, 17 Mar 2025 23:52:05 +0800 Subject: [PATCH 1263/1766] Merge pull request #9677 from ltpp-universe/master Add fortunes & database updates & caching --- frameworks/Rust/hyperlane/.gitignore | 3 + frameworks/Rust/hyperlane/Cargo.lock | 1795 ----------------- frameworks/Rust/hyperlane/Cargo.toml | 10 +- frameworks/Rust/hyperlane/README.md | 18 +- .../Rust/hyperlane/benchmark_config.json | 7 +- frameworks/Rust/hyperlane/src/constant.rs | 11 +- frameworks/Rust/hyperlane/src/db.rs | 268 ++- frameworks/Rust/hyperlane/src/lazy.rs | 1 + frameworks/Rust/hyperlane/src/main.rs | 19 +- .../Rust/hyperlane/src/request_middleware.rs | 8 +- .../Rust/hyperlane/src/response_middleware.rs | 1 + frameworks/Rust/hyperlane/src/route.rs | 75 +- frameworks/Rust/hyperlane/src/server.rs | 10 +- frameworks/Rust/hyperlane/src/type.rs | 56 +- frameworks/Rust/hyperlane/src/utils.rs | 26 +- 15 files changed, 380 insertions(+), 1928 deletions(-) create mode 100644 frameworks/Rust/hyperlane/.gitignore delete mode 100644 frameworks/Rust/hyperlane/Cargo.lock diff --git a/frameworks/Rust/hyperlane/.gitignore b/frameworks/Rust/hyperlane/.gitignore new file mode 100644 index 00000000000..af8e65c2e7a --- /dev/null +++ b/frameworks/Rust/hyperlane/.gitignore @@ -0,0 +1,3 @@ +/target +/logs +Cargo.lock \ No newline at end of file diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock deleted file mode 100644 index 8d66da54a3c..00000000000 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ /dev/null @@ -1,1795 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "async-func" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8882ceb09bc57f9b7a52d48cffab866310aeeb6a5aa1c9420640e7689660c9ee" -dependencies = [ - "tokio", -] - -[[package]] -name = "async-trait" -version = "0.1.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bb8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d8b8e1a22743d9241575c6ba822cf9c8fef34771c86ab7e477a4fbfd254e5" -dependencies = [ - "futures-util", - "parking_lot", - "tokio", -] - -[[package]] -name = "bb8-postgres" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e570e6557cd0f88d28d32afa76644873271a70dc22656df565b2021c4036aa9c" -dependencies = [ - "bb8", - "tokio", - "tokio-postgres", -] - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "brotli" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cc" -version = "1.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "clonelicious" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c61986b9f0347d401ef41468e7aadba2ab6dfc2547df1862f2563250fbfa8d3" - -[[package]] -name = "color-output" -version = "6.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc537d9d2e7e15fa40da2a6a451afedea17808a63f8339863e3a6b5ae93db596" -dependencies = [ - "hyperlane-time", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "file-operation" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaba2fa080e689c4ec9a0666c5b7eb074182fdba13a34e97b19b56ac2a855556" -dependencies = [ - "tokio", -] - -[[package]] -name = "flate2" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" -dependencies = [ - "num-traits", -] - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "halfbrown" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" -dependencies = [ - "hashbrown", - "serde", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "http-compress" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8646f4e10f8fc48d8f2a595e6ef303189e49e386d6863d771f028c969f0c5e42" -dependencies = [ - "brotli", - "flate2", - "http-constant", -] - -[[package]] -name = "http-constant" -version = "1.33.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3567340a02df4ec03fa5475e2b273aa183d875b3bf09674403407aadda1cd1" - -[[package]] -name = "http-type" -version = "3.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f21786d19bad67be1eb85b528e65722d44812d6e9bed878147f767573a2586" -dependencies = [ - "hex", - "http-compress", - "http-constant", - "lombok-macros", - "serde", - "serde-xml-rs", - "serde_json", - "serde_urlencoded", - "tokio", - "url", -] - -[[package]] -name = "hyperlane" -version = "4.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74319ece1df44e8ddd62a9e1ae13040ba34fd1500eb240fa449ca8fbc7210727" -dependencies = [ - "async-func", - "clonelicious", - "color-output", - "file-operation", - "futures", - "http-compress", - "http-type", - "hyperlane-log", - "lombok-macros", - "once_cell", - "recoverable-spawn", - "recoverable-thread-pool", - "serde", - "serde_json", - "server-manager", - "simd-json", - "std-macro-extensions", - "tokio", -] - -[[package]] -name = "hyperlane-log" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf652414e2c385beb37c36341ae91f6eb686062f3cfff6c0cff8526deafbb65" -dependencies = [ - "file-operation", - "hyperlane-time", - "lombok-macros", - "once_cell", - "recoverable-spawn", -] - -[[package]] -name = "hyperlane-time" -version = "0.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11dcc4ca08d1ebfc1f70e7a40033483219f77909a7ef6c4af302a14aa97da3d2" - -[[package]] -name = "hyperlane_techempower" -version = "0.0.1" -dependencies = [ - "bb8", - "bb8-postgres", - "chrono", - "hyperlane", - "rand", - "serde", - "tokio-postgres", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.170" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" - -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" - -[[package]] -name = "lombok-macros" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe4fc0110b8bdb29b2423a2be59fa7b9b3e0e1b225553514895564420887bc5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "miniz_oxide" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "postgres-protocol" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" -dependencies = [ - "base64", - "byteorder", - "bytes", - "fallible-iterator", - "hmac", - "md-5", - "memchr", - "rand", - "sha2", - "stringprep", -] - -[[package]] -name = "postgres-types" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" -dependencies = [ - "bytes", - "fallible-iterator", - "postgres-protocol", - "uuid", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy 0.8.23", -] - -[[package]] -name = "proc-macro2" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" -dependencies = [ - "rand_chacha", - "rand_core", - "zerocopy 0.8.23", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.1", -] - -[[package]] -name = "recoverable-spawn" -version = "3.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5081593fb6a36af3e9ca8c4f23735f9d454a252cba0629509baa3947983846d" -dependencies = [ - "once_cell", - "tokio", -] - -[[package]] -name = "recoverable-thread-pool" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4190261c8a4823ceaf4b9cd68bf28deca98aa5697d2e1ec66e8053dac2a817fa" -dependencies = [ - "lombok-macros", - "recoverable-spawn", -] - -[[package]] -name = "redox_syscall" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" -dependencies = [ - "bitflags", -] - -[[package]] -name = "ref-cast" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustversion" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[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.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-xml-rs" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" -dependencies = [ - "log", - "serde", - "thiserror", - "xml-rs", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "server-manager" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5144bc130554928fb304af2e7590742db173a40f82672613dc293f7567e8730e" -dependencies = [ - "tokio", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "simd-json" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" -dependencies = [ - "getrandom 0.2.15", - "halfbrown", - "ref-cast", - "serde", - "serde_json", - "simdutf8", - "value-trait", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "std-macro-extensions" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b44c771c1591df90e3b49f618362dc1c431a8df6a7a6cc69dbe00757b158522" - -[[package]] -name = "stringprep" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" -dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-postgres" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" -dependencies = [ - "async-trait", - "byteorder", - "bytes", - "fallible-iterator", - "futures-channel", - "futures-util", - "log", - "parking_lot", - "percent-encoding", - "phf", - "pin-project-lite", - "postgres-protocol", - "postgres-types", - "rand", - "socket2", - "tokio", - "tokio-util", - "whoami", -] - -[[package]] -name = "tokio-util" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-properties" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" - -[[package]] -name = "value-trait" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" -dependencies = [ - "float-cmp", - "halfbrown", - "itoa", - "ryu", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "whoami" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" -dependencies = [ - "redox_syscall", - "wasite", - "web-sys", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-link" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "wit-bindgen-rt" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "xml-rs" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" -dependencies = [ - "zerocopy-derive 0.8.23", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index cb0eccc2e0b..8b909a01df4 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,13 +18,10 @@ exclude = [ ] [dependencies] -hyperlane = "4.31.1" -bb8 = "0.9.0" -bb8-postgres = "0.9.0" +hyperlane = "4.36.1" rand = "0.9.0" -tokio-postgres = { version = "0.7.13", features = ["with-uuid-0_8"] } -chrono = "0.4.40" serde = "1.0.219" +sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } [profile.dev] incremental = false @@ -43,3 +40,6 @@ panic = "unwind" debug = false codegen-units = 1 strip = "debuginfo" + +[features] +dev = [] diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index 96bf0620a7e..20ab5eec3c4 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -6,7 +6,7 @@ Hyperlane is a lightweight and high-performance Rust HTTP server library designe ## Database -PostgreSQL +PostgreSQL. ## Test URLs @@ -20,8 +20,20 @@ PostgreSQL ### Test 3: Multi Row Query - http://localhost:8080/queries?q=20 + http://localhost:8080/query?q=20 -### Test 4: Plaintext +### Test 4: Fortunes (Template rendering) + + http://localhost:8080/fortunes + +### Test 5: Update Query + + http://localhost:8080/upda?q=20 + +### Test 6: Plaintext http://localhost:8080/plaintext + +### Test 7: Caching + + http://localhost:8080/cached-quer?c=20 diff --git a/frameworks/Rust/hyperlane/benchmark_config.json b/frameworks/Rust/hyperlane/benchmark_config.json index b52090969ec..1f810752e18 100644 --- a/frameworks/Rust/hyperlane/benchmark_config.json +++ b/frameworks/Rust/hyperlane/benchmark_config.json @@ -6,11 +6,14 @@ "dockerfile": "hyperlane.dockerfile", "json_url": "/json", "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", "db_url": "/db", - "query_url": "/queries?q=", + "query_url": "/query?q=", + "update_url": "/upda?q=", + "cached_query_url": "/cached-quer?c=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "database": "Postgres", "framework": "hyperlane", "language": "Rust", diff --git a/frameworks/Rust/hyperlane/src/constant.rs b/frameworks/Rust/hyperlane/src/constant.rs index adc58ac641e..e22ac57c0b0 100644 --- a/frameworks/Rust/hyperlane/src/constant.rs +++ b/frameworks/Rust/hyperlane/src/constant.rs @@ -3,8 +3,13 @@ pub static DATABASE_TYPE: &str = "postgres"; pub static DATABASE_HOST: &str = "tfb-database"; pub static DATABASE_USER_NAME: &str = "benchmarkdbuser"; pub static DATABASE_USER_PASSWORD: &str = "benchmarkdbpass"; -pub static DATABASE_PORT: usize = 5432; +pub static DATABASE_PORT: usize = 5_432; pub static DATABASE_NAME: &str = "hello_world"; -pub static TABLE_NAME: &str = "World"; +pub static TABLE_NAME_WORLD: &str = "World"; +pub static TABLE_NAME_FORTUNE: &str = "Fortune"; pub static ROW_LIMIT: i32 = 500; -pub static HYPERLANE: &str = "hyperlane"; +pub static RANDOM_MAX: i32 = 10_000; +pub static RANDOM_MAX_ADD_ONE: u32 = 10_001; +pub static KEY_ID: &str = "id"; +pub static KEY_RANDOM_NUMBER: &str = "randomnumber"; +pub static KEY_MESSAGE: &str = "message"; diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 81120b548bb..d1d51e8ee11 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -1,92 +1,108 @@ use crate::*; +#[inline] pub async fn get_db_connection() -> DbPoolConnection { - let db_pool: DbPoolConnection = DB.read().await.clone().unwrap(); + if let Some(db_pool) = DB.read().await.clone() { + return db_pool; + }; + let db_pool: DbPoolConnection = connection_db().await; + { + let mut db_pool_lock: RwLockWriteGuard<'_, Option> = DB.write().await; + *db_pool_lock = Some(db_pool.clone()); + } db_pool } +#[inline] +#[cfg(feature = "dev")] pub async fn create_batabase() { let db_pool: DbPoolConnection = get_db_connection().await; - let connection: DbConnection = db_pool.get().await.unwrap(); - let db_exists: bool = connection - .query_one( - "SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname = $1);", - &[&DATABASE_NAME], - ) - .await - .unwrap() - .get(0); - if !db_exists { - println_warning!( - "database `", - DATABASE_NAME, - "` not found. Creating database..." - ); - connection - .batch_execute(&format!("CREATE DATABASE {};", DATABASE_NAME)) - .await - .unwrap(); - println_success!("database `", DATABASE_NAME, "` created successfully"); - } - println_success!("database `", DATABASE_NAME, "` ready"); + let _ = query(&format!("CREATE DATABASE {};", DATABASE_NAME)) + .execute(&db_pool) + .await; } +#[inline] +#[cfg(feature = "dev")] pub async fn create_table() { let db_pool: DbPoolConnection = get_db_connection().await; - let connection: DbConnection = db_pool.get().await.unwrap(); - connection - .batch_execute(&format!( - "CREATE TABLE IF NOT EXISTS {} ( - id SERIAL PRIMARY KEY, - randomNumber INTEGER NOT NULL - );", - TABLE_NAME - )) - .await - .unwrap(); - println_success!("table `", TABLE_NAME, "` ready"); + let _ = query(&format!( + "CREATE TABLE IF NOT EXISTS {} ( + id SERIAL PRIMARY KEY, randomNumber INT NOT NULL + );", + TABLE_NAME_WORLD + )) + .execute(&db_pool) + .await; + let _ = query(&format!( + "CREATE TABLE IF NOT EXISTS {} ( + id SERIAL PRIMARY KEY, message VARCHAR NOT NULL + );", + TABLE_NAME_FORTUNE + )) + .execute(&db_pool) + .await; } +#[inline] +#[cfg(feature = "dev")] pub async fn insert_records() { let db_pool: DbPoolConnection = get_db_connection().await; - let connection: DbConnection = db_pool.get().await.unwrap(); - let row: Row = connection - .query_one(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME), &[]) + let row: PgRow = query(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME_WORLD)) + .fetch_one(&db_pool) .await .unwrap(); let count: i64 = row.get(0); - let limit: i64 = ROW_LIMIT as i64; + let limit: i64 = RANDOM_MAX as i64; if count >= limit { - println_warning!(format!( - "table '{}' already has {} records. No need to insert.", - TABLE_NAME, count - )); return; } let missing_count: i64 = limit - count; - println_warning!(format!( - "table '{}' has {} records. Inserting {} missing records...", - TABLE_NAME, count, missing_count - )); - let mut rng: rand::prelude::ThreadRng = rand::rng(); let mut values: Vec = Vec::new(); for _ in 0..missing_count { - let random_number: i32 = rng.random_range(1..=10000); + let random_number: i32 = get_random_id(); values.push(format!("(DEFAULT, {})", random_number)); } - let query: String = format!( + let sql: String = format!( "INSERT INTO {} (id, randomNumber) VALUES {}", - TABLE_NAME, + TABLE_NAME_WORLD, values.join(",") ); - connection.batch_execute(&query).await.unwrap(); - println_success!(format!( - "successfully inserted {} missing records into '{}' table.", - TABLE_NAME, missing_count - )); + let _ = query(&sql).execute(&db_pool).await; + let mut values: Vec = Vec::new(); + for _ in 0..missing_count { + let random_number: i32 = get_random_id(); + values.push(format!("(DEFAULT, {})", random_number)); + } + let sql: String = format!( + "INSERT INTO {} (id, message) VALUES {}", + TABLE_NAME_FORTUNE, + values.join(",") + ); + let _ = query(&sql).execute(&db_pool).await; } -pub async fn init_db() { +#[inline] +pub async fn init_cache() { + let mut res: Vec = Vec::with_capacity(RANDOM_MAX as usize); + let db_pool: DbPoolConnection = get_db_connection().await; + let sql: String = format!( + "SELECT id, randomNumber FROM {} LIMIT {}", + TABLE_NAME_WORLD, RANDOM_MAX + ); + if let Ok(rows) = query(&sql).fetch_all(&db_pool).await { + for row in rows { + let id: i32 = row.get(KEY_ID); + let random_number: i32 = row.get(KEY_RANDOM_NUMBER); + res.push(QueryRow::new(id, random_number)); + } + } + let mut cache: RwLockWriteGuard<'_, Vec> = CACHE.write().await; + *cache = res; +} + +#[inline] +pub async fn connection_db() -> DbPoolConnection { let db_url: &str = match option_env!("POSTGRES_URL") { Some(it) => it, _ => &format!( @@ -99,37 +115,123 @@ pub async fn init_db() { DATABASE_NAME ), }; - println_warning!("db url: ", db_url); - let config: Config = db_url.parse::().unwrap(); - let db_manager: PostgresConnectionManager = - PostgresConnectionManager::new(config, NoTls); - let db_pool: DbPoolConnection = Pool::builder().build(db_manager).await.unwrap(); + let pool_size: u32 = (get_thread_count() >> 2).max(10).min(100) as u32; + let max_pool_size: u32 = option_env!("POSTGRES_MAX_POOL_SIZE") + .unwrap_or(&pool_size.to_string()) + .parse::() + .unwrap_or(pool_size); + let min_pool_size: u32 = option_env!("POSTGRES_MIN_POOL_SIZE") + .unwrap_or(&pool_size.to_string()) + .parse::() + .unwrap_or(pool_size); + let pool: DbPoolConnection = PgPoolOptions::new() + .max_connections(max_pool_size) + .min_connections(min_pool_size) + .max_lifetime(None) + .test_before_acquire(false) + .idle_timeout(None) + .connect(db_url) + .await + .unwrap(); + pool +} + +#[inline] +pub async fn get_update_data( + limit: Queries, +) -> (String, Vec, Vec, Vec) { + let db_pool: DbPoolConnection = get_db_connection().await; + let mut query_res_list: Vec = Vec::with_capacity(limit as usize); + let rows: Vec = get_some_row_id(limit, &db_pool).await; + let mut sql = format!("UPDATE {} SET randomNumber = CASE id ", TABLE_NAME_WORLD); + let mut id_list: Vec = Vec::with_capacity(rows.len()); + let mut value_list: Vec = Vec::with_capacity(rows.len() * 2); + let mut random_numbers: Vec = Vec::with_capacity(rows.len()); + for (i, row) in rows.iter().enumerate() { + let new_random_number: i32 = get_random_id() as i32; + id_list.push(row.id); + random_numbers.push(new_random_number); + value_list.push(format!("WHEN ${} THEN ${}", i * 2 + 1, i * 2 + 2)); + query_res_list.push(QueryRow::new(row.id, new_random_number)); + } + sql.push_str(&value_list.join(" ")); + let id_params: String = id_list + .iter() + .enumerate() + .map(|(i, _)| format!("${}", (rows.len() * 2 + 1) + i)) + .collect::>() + .join(","); + sql.push_str(&format!( + " ELSE randomNumber END WHERE id IN ({})", + id_params + )); + (sql, query_res_list, id_list, random_numbers) +} + +#[inline] +pub async fn init_db() { { let mut db_pool_lock: RwLockWriteGuard<'_, Option> = DB.write().await; - *db_pool_lock = Some(db_pool.clone()); + *db_pool_lock = Some(connection_db().await); + } + #[cfg(feature = "dev")] + { + create_batabase().await; + create_table().await; + insert_records().await; } - create_batabase().await; - create_table().await; - insert_records().await; + init_cache().await; +} + +#[inline] +pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { + let random_id: Queries = get_random_id(); + query_world_row(db_pool, random_id).await } -pub async fn random_world_row() -> Result> { - let random_id: i32 = rand::rng().random_range(1..ROW_LIMIT); +#[inline] +pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRow { + let sql: String = format!( + "SELECT id, randomNumber FROM {} WHERE id = {} LIMIT 1", + TABLE_NAME_WORLD, id + ); + if let Ok(rows) = query(&sql).fetch_one(db_pool).await { + let random_number: i32 = rows.get(KEY_RANDOM_NUMBER); + return QueryRow::new(id as i32, random_number); + } + return QueryRow::new(id as i32, 1); +} + +#[inline] +pub async fn update_world_rows(limit: Queries) -> Vec { let db_pool: DbPoolConnection = get_db_connection().await; - let connection: DbConnection = db_pool - .get() - .await - .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("timeout: {}", e)))?; - let stmt: Statement = connection - .prepare(&format!( - "SELECT id, randomNumber FROM {} WHERE id = $1", - TABLE_NAME - )) - .await?; - if let Some(rows) = connection.query_opt(&stmt, &[&random_id]).await? { - let id: i32 = rows.get(0); - let random_number: i32 = rows.get(1); - return Ok(QueryRow::new(id, random_number)); + let (sql, data, id_list, random_numbers) = get_update_data(limit).await; + let mut query_builder: query::Query<'_, Postgres, postgres::PgArguments> = query(&sql); + for (id, random_number) in id_list.iter().zip(random_numbers.iter()) { + query_builder = query_builder.bind(id).bind(random_number); + } + for id in &id_list { + query_builder = query_builder.bind(id); + } + let _ = query_builder.execute(&db_pool).await; + data +} + +#[inline] +pub async fn all_world_row() -> Vec { + let db_pool: DbPoolConnection = get_db_connection().await; + let sql: String = format!("SELECT id, message FROM {}", TABLE_NAME_FORTUNE); + let res: Vec = query(&sql).fetch_all(&db_pool).await.unwrap_or_default(); + return res; +} + +#[inline] +pub async fn get_some_row_id(limit: Queries, db_pool: &DbPoolConnection) -> Vec { + let mut res: Vec = Vec::with_capacity(limit as usize); + for _ in 0..limit { + let id: i32 = get_random_id(); + let tem: QueryRow = query_world_row(db_pool, id).await; + res.push(tem); } - return Ok(QueryRow::new(0, 0)); + res } diff --git a/frameworks/Rust/hyperlane/src/lazy.rs b/frameworks/Rust/hyperlane/src/lazy.rs index 5b701e371bd..6826b018008 100644 --- a/frameworks/Rust/hyperlane/src/lazy.rs +++ b/frameworks/Rust/hyperlane/src/lazy.rs @@ -2,3 +2,4 @@ use crate::*; pub static DB: Lazy>> = Lazy::new(|| Arc::new(RwLock::new(None))); +pub static CACHE: Lazy>> = Lazy::new(|| arc_rwlock(vec![])); diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index d0145b343da..ef4a7838faa 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -8,36 +8,31 @@ pub(crate) mod server; pub(crate) mod r#type; pub(crate) mod utils; -pub(crate) use bb8::{Pool, PooledConnection}; -pub(crate) use bb8_postgres::PostgresConnectionManager; -pub(crate) use chrono::{DateTime, Utc}; pub(crate) use constant::*; pub(crate) use db::*; pub(crate) use hyperlane::{ once_cell::sync::Lazy, serde::*, serde_json::json, - tokio::sync::{RwLock, RwLockWriteGuard}, + tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}, *, }; pub(crate) use lazy::*; pub(crate) use r#type::*; -pub(crate) use rand::Rng; +pub(crate) use rand::{rngs::SmallRng, Rng, SeedableRng}; pub(crate) use request_middleware::*; pub(crate) use response_middleware::*; pub(crate) use route::*; - pub(crate) use server::*; -pub(crate) use std::time::SystemTime; -pub(crate) use std::{io, sync::Arc}; -pub(crate) use tokio_postgres::{Config, NoTls, Row, Statement}; +pub(crate) use sqlx::{ + postgres::{PgPoolOptions, PgRow}, + *, +}; +pub(crate) use std::{fmt, sync::Arc}; pub(crate) use utils::*; #[tokio::main] async fn main() { - println_warning!("start connect db"); init_db().await; - println_success!("connect db finish"); - println_warning!("start init server"); run_server().await; } diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index b1ffc0fd2fa..fe810b0a1d5 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -1,17 +1,15 @@ use crate::*; +#[inline] pub async fn request(controller_data: ControllerData) { let _ = controller_data .set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) .await - .set_response_header( - CONTENT_TYPE, - format!("{}; {}", APPLICATION_JSON, CHARSET_UTF_8), - ) + .set_response_header(CONTENT_TYPE, APPLICATION_JSON) .await .set_response_header(SERVER, HYPERLANE) .await - .set_response_header(DATE, generate_rfc1123_timestamp()) + .set_response_header(DATE, current_date_gmt()) .await .set_response_status_code(200) .await; diff --git a/frameworks/Rust/hyperlane/src/response_middleware.rs b/frameworks/Rust/hyperlane/src/response_middleware.rs index 81fb0c368e9..dcf3b096b10 100644 --- a/frameworks/Rust/hyperlane/src/response_middleware.rs +++ b/frameworks/Rust/hyperlane/src/response_middleware.rs @@ -1,5 +1,6 @@ use crate::*; +#[inline] pub async fn response(controller_data: ControllerData) { let _ = controller_data.send().await; } diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index fce11dbc1ca..e52db693195 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -1,5 +1,6 @@ use crate::*; +#[inline] pub async fn json(controller_data: ControllerData) { let json: serde_json::Value = json!({ "message": RESPONSEDATA @@ -9,6 +10,7 @@ pub async fn json(controller_data: ControllerData) { .await; } +#[inline] pub async fn plaintext(controller_data: ControllerData) { let _ = controller_data .set_response_header(CONTENT_TYPE, TEXT_PLAIN) @@ -17,28 +19,89 @@ pub async fn plaintext(controller_data: ControllerData) { .await; } +#[inline] pub async fn db(controller_data: ControllerData) { - let query_row: QueryRow = random_world_row().await.unwrap(); + let db_connection: DbPoolConnection = get_db_connection().await; + let query_row: QueryRow = random_world_row(&db_connection).await; let _ = controller_data .set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) .await; } +#[inline] pub async fn queries(controller_data: ControllerData) { let queries: Queries = controller_data .get_request_query("q") .await .and_then(|queries| queries.parse::().ok()) .unwrap_or_default() - .min(ROW_LIMIT as usize) + .min(ROW_LIMIT as Queries) .max(1); - let mut data: Vec = Vec::with_capacity(queries); + let mut data: Vec = Vec::with_capacity(queries as usize); + let db_pool: DbPoolConnection = get_db_connection().await; for _ in 0..queries { - let _ = random_world_row().await.map(|row| { - data.push(row); - }); + let row: QueryRow = random_world_row(&db_pool).await; + data.push(row); } let _ = controller_data .set_response_body(serde_json::to_string(&data).unwrap_or_default()) .await; } + +#[inline] +pub async fn fortunes(controller_data: ControllerData) { + let all_rows: Vec = all_world_row().await; + let mut fortunes_list: Vec = all_rows + .iter() + .map(|row| { + let id: i32 = row.get(KEY_ID); + let message: String = row.get(KEY_MESSAGE); + Fortunes::new(id, message) + }) + .collect(); + fortunes_list.push(Fortunes::new( + 0, + "Additional fortune added at request time.".to_owned(), + )); + fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); + let res: String = FortunesTemplate::new(fortunes_list).to_string(); + controller_data + .set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) + .await + .set_response_body(res) + .await; +} + +#[inline] +pub async fn updates(controller_data: ControllerData) { + let queries: Queries = controller_data + .get_request_query("q") + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let res: Vec = update_world_rows(queries).await; + let _ = controller_data + .set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .await; +} + +#[inline] +pub async fn cached_queries(controller_data: ControllerData) { + let count: Queries = controller_data + .get_request_query("c") + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let mut res: Vec = Vec::with_capacity(count as usize); + let cache: RwLockReadGuard<'_, Vec> = CACHE.read().await; + for i in 0..count { + res.push(cache[i as usize].clone()); + } + let _ = controller_data + .set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .await; +} diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 7042eab442b..91dc1aeea08 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -1,18 +1,22 @@ use crate::*; +#[inline] pub async fn run_server() { let mut server: Server = Server::new(); server.host("0.0.0.0").await; server.port(8080).await; server.log_dir("./logs").await; server.log_interval_millis(1_000_000_000).await; - server.disable_print().await; + server.disable_inner_log().await; + server.disable_inner_print().await; server.route("/json", json).await; server.route("/plaintext", plaintext).await; server.route("/db", db).await; - server.route("/queries", queries).await; + server.route("/query", queries).await; + server.route("/fortunes", fortunes).await; + server.route("/upda", updates).await; + server.route("/cached-quer", cached_queries).await; server.request_middleware(request).await; server.response_middleware(response).await; - println_success!("server initialization completed"); server.listen().await; } diff --git a/frameworks/Rust/hyperlane/src/type.rs b/frameworks/Rust/hyperlane/src/type.rs index 5e524ede2e9..3fb320ba049 100644 --- a/frameworks/Rust/hyperlane/src/type.rs +++ b/frameworks/Rust/hyperlane/src/type.rs @@ -1,21 +1,61 @@ use crate::*; -pub type DbPoolConnection = bb8::Pool>; -pub type DbConnection<'a> = PooledConnection<'a, PostgresConnectionManager>; -pub type Queries = usize; +pub type DbPoolConnection = Pool; +pub type Queries = i32; #[allow(bad_style)] -#[derive(Serialize)] +#[derive(Serialize, Default, Clone)] pub struct QueryRow { - id: i32, - randomNumber: i32, + pub id: Queries, + pub randomNumber: Queries, } impl QueryRow { - pub fn new(id: i32, random_number: i32) -> Self { + #[inline] + pub fn new(id: Queries, random_number: Queries) -> Self { Self { - id: id, + id, randomNumber: random_number, } } } + +#[derive(Serialize)] +pub struct Fortunes { + pub id: Queries, + pub message: String, +} + +impl Fortunes { + #[inline] + pub fn new(id: Queries, message: String) -> Self { + Self { id, message } + } +} + +#[derive(Serialize)] +pub struct FortunesTemplate(pub Vec); + +impl FortunesTemplate { + #[inline] + pub fn new(list: Vec) -> Self { + Self(list) + } +} + +impl fmt::Display for FortunesTemplate { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let fortunes: &Vec = &self.0; + let _ = write!(f, "Fortunes"); + for tem in fortunes.iter() { + let row: String = format!( + "", + tem.id, + escape_html(&tem.message) + ); + let _ = write!(f, "{}", row); + } + let _ = write!(f, "
      idmessage
      {}{}
      "); + Ok(()) + } +} diff --git a/frameworks/Rust/hyperlane/src/utils.rs b/frameworks/Rust/hyperlane/src/utils.rs index c189f0be8db..9552fe79074 100644 --- a/frameworks/Rust/hyperlane/src/utils.rs +++ b/frameworks/Rust/hyperlane/src/utils.rs @@ -1,6 +1,26 @@ +use rand::rng; + use crate::*; -pub fn generate_rfc1123_timestamp() -> String { - let now: DateTime = SystemTime::now().into(); - now.format("%a, %d %b %Y %H:%M:%S GMT").to_string() +#[inline] +pub fn escape_html(input: &str) -> String { + let mut result: String = String::new(); + for ch in input.chars() { + match ch { + '<' => result.push_str("<"), + '>' => result.push_str(">"), + '&' => result.push_str("&"), + '"' => result.push_str("""), + '\'' => result.push_str("'"), + _ => result.push(ch), + } + } + result +} + +#[inline] +pub fn get_random_id() -> Queries { + let mut rng: SmallRng = SmallRng::from_rng(&mut rng()); + let random_id: u32 = rng.random_range(1..RANDOM_MAX_ADD_ONE); + random_id as Queries } From 83ee3c93709e1fc942fa8319ad09c0b82d256401 Mon Sep 17 00:00:00 2001 From: Kayden <143221653+Kayden1412@users.noreply.github.com> Date: Mon, 17 Mar 2025 22:53:20 +0700 Subject: [PATCH 1264/1766] [Zig/Httpz] Remove Mustache and Optimize Date Updates (#9678) * [Zig/Httpz] calculate date on another thread * [Zig/Httpz] fix build error * [Zig/Httpz] fix build error 2 * [Zig/Httpz] fix build error 3 * [Zig/Httpz] fix #4 * [Zig/Httpz] proper escape * [Zig/Htttpz] update run.sh * [Zig/Httpz] update dockerfile * [Zig/Httpz] update dockerfile 2 * [Zig/Httpz] update dockerfile 3 * [Zig/Httpz] update dockerfile 4 * [Zig/Httpz] update dockerfile 5 * update dockerfile 6 * update dockerfile 7 * update doclerfile 8 * update dockerfile 9 --- frameworks/Zig/httpz/build.zig | 2 - frameworks/Zig/httpz/build.zig.zon | 4 - frameworks/Zig/httpz/httpz.dockerfile | 23 +++--- frameworks/Zig/httpz/run.sh | 3 - frameworks/Zig/httpz/src/endpoints.zig | 100 ++++++++----------------- frameworks/Zig/httpz/src/main.zig | 41 +++++----- 6 files changed, 65 insertions(+), 108 deletions(-) delete mode 100644 frameworks/Zig/httpz/run.sh diff --git a/frameworks/Zig/httpz/build.zig b/frameworks/Zig/httpz/build.zig index 510dfbecfa2..16a4bb64845 100644 --- a/frameworks/Zig/httpz/build.zig +++ b/frameworks/Zig/httpz/build.zig @@ -16,12 +16,10 @@ pub fn build(b: *std.Build) !void { const httpz_module = b.dependency("httpz", dep_opts).module("httpz"); const pg_module = b.dependency("pg", dep_opts).module("pg"); const datetimez_module = b.dependency("datetimez", dep_opts).module("zig-datetime"); - const mustache_module = b.dependency("mustache", dep_opts).module("mustache"); exe.root_module.addImport("httpz", httpz_module); exe.root_module.addImport("pg", pg_module); exe.root_module.addImport("datetimez", datetimez_module); - exe.root_module.addImport("mustache", mustache_module); // This declares intent for the executable to be installed into the // standard location when the user invokes the "install" step (the default diff --git a/frameworks/Zig/httpz/build.zig.zon b/frameworks/Zig/httpz/build.zig.zon index 58b494c2fe3..83c29e48929 100644 --- a/frameworks/Zig/httpz/build.zig.zon +++ b/frameworks/Zig/httpz/build.zig.zon @@ -12,8 +12,4 @@ .url = "git+https://github.com/frmdstryr/zig-datetime#70aebf28fb3e137cd84123a9349d157a74708721", .hash = "122077215ce36e125a490e59ec1748ffd4f6ba00d4d14f7308978e5360711d72d77f", }, - .mustache = .{ - .url = "git+https://github.com/batiati/mustache-zig#ae5ecc1522da983dc39bb0d8b27f5d1b1d7956e3", - .hash = "1220ac9e3316ce71ad9cd66c7f215462bf5c187828b50bb3d386549bf6af004e3bb0", - }, } } diff --git a/frameworks/Zig/httpz/httpz.dockerfile b/frameworks/Zig/httpz/httpz.dockerfile index 5257b77ea18..ea4f9a7f76d 100644 --- a/frameworks/Zig/httpz/httpz.dockerfile +++ b/frameworks/Zig/httpz/httpz.dockerfile @@ -1,6 +1,4 @@ -FROM fedora:40 - -WORKDIR /httpz +FROM debian:12.9 ENV PG_USER=benchmarkdbuser ENV PG_PASS=benchmarkdbpass @@ -8,16 +6,23 @@ ENV PG_DB=hello_world ENV PG_HOST=tfb-database ENV PG_PORT=5432 +WORKDIR /app + COPY src src COPY build.zig.zon build.zig.zon COPY build.zig build.zig -COPY run.sh run.sh -RUN dnf install -y zig -RUN zig version -RUN zig build -Doptimize=ReleaseFast -RUN cp /httpz/zig-out/bin/httpz /usr/local/bin +ARG ZIG_VER=0.13.0 + +RUN apt-get update && apt-get install -y curl xz-utils ca-certificates + +RUN curl https://ziglang.org/download/${ZIG_VER}/zig-linux-$(uname -m)-${ZIG_VER}.tar.xz -o zig-linux.tar.xz && \ + tar xf zig-linux.tar.xz && \ + mv zig-linux-$(uname -m)-${ZIG_VER}/ /opt/zig + +RUN /opt/zig/zig build -Doptimize=ReleaseFast EXPOSE 3000 +RUN ls -CMD ["sh", "run.sh"] \ No newline at end of file +CMD ["zig-out/bin/httpz"] diff --git a/frameworks/Zig/httpz/run.sh b/frameworks/Zig/httpz/run.sh deleted file mode 100644 index a849756041d..00000000000 --- a/frameworks/Zig/httpz/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -echo "Waiting for Httpz framework to start..." - -httpz 3000 \ No newline at end of file diff --git a/frameworks/Zig/httpz/src/endpoints.zig b/frameworks/Zig/httpz/src/endpoints.zig index a0f4476dab6..b8cfe9757fb 100644 --- a/frameworks/Zig/httpz/src/endpoints.zig +++ b/frameworks/Zig/httpz/src/endpoints.zig @@ -2,16 +2,12 @@ const std = @import("std"); const httpz = @import("httpz"); const pg = @import("pg"); const datetimez = @import("datetimez"); -const mustache = @import("mustache"); -const Thread = std.Thread; -const Mutex = Thread.Mutex; -const template = "Fortunes{{#fortunes}}{{/fortunes}}
      idmessage
      {{id}}{{message}}
      "; +pub var date_str: []u8 = ""; pub const Global = struct { pool: *pg.Pool, rand: *std.rand.Random, - mutex: std.Thread.Mutex = .{}, }; const World = struct { @@ -40,9 +36,7 @@ pub fn json(_: *Global, _: *httpz.Request, res: *httpz.Response) !void { pub fn db(global: *Global, _: *httpz.Request, res: *httpz.Response) !void { try setHeaders(res.arena, res); - global.mutex.lock(); const random_number = 1 + (global.rand.uintAtMostBiased(u32, 9999)); - global.mutex.unlock(); const world = getWorld(global.pool, random_number) catch |err| { std.debug.print("Error querying database: {}\n", .{err}); @@ -76,31 +70,37 @@ fn getWorld(pool: *pg.Pool, random_number: u32) !World { fn setHeaders(allocator: std.mem.Allocator, res: *httpz.Response) !void { res.header("Server", "Httpz"); - const now = datetimez.datetime.Date.now(); - const time = datetimez.datetime.Time.now(); + //const now = datetimez.datetime.Date.now(); + //const time = datetimez.datetime.Time.now(); // Wed, 17 Apr 2013 12:00:00 GMT // Return date in ISO format YYYY-MM-DD - const TB_DATE_FMT = "{s:0>3}, {d:0>2} {s:0>3} {d:0>4} {d:0>2}:{d:0>2}:{d:0>2} GMT"; - const now_str = try std.fmt.allocPrint(allocator, TB_DATE_FMT, .{ now.weekdayName()[0..3], now.day, now.monthName()[0..3], now.year, time.hour, time.minute, time.second }); + //const TB_DATE_FMT = "{s:0>3}, {d:0>2} {s:0>3} {d:0>4} {d:0>2}:{d:0>2}:{d:0>2} GMT"; + //const now_str = try std.fmt.allocPrint(allocator, TB_DATE_FMT, .{ now.weekdayName()[0..3], now.day, now.monthName()[0..3], now.year, time.hour, time.minute, time.second }); //defer allocator.free(now_str); - res.header("Date", now_str); + res.header("Date", try allocator.dupe(u8, date_str)); } fn getFortunesHtml(allocator: std.mem.Allocator, pool: *pg.Pool) ![]const u8 { const fortunes = try getFortunes(allocator, pool); - const raw = try mustache.allocRenderText(allocator, template, .{ .fortunes = fortunes }); + var sb = try std.ArrayListUnmanaged(u8).initCapacity(allocator, 0); - // std.debug.print("mustache output {s}\n", .{raw}); + const writer = sb.writer(allocator); + try sb.appendSlice(allocator, "Fortunes"); - const html = try deescapeHtml(allocator, raw); + for (fortunes) |ft| { + try writer.print("", .{ + ft.id, + try escape_html(allocator, ft.message), + }); + } - // std.debug.print("html output {s}\n", .{html}); + try sb.appendSlice(allocator, "
      idmessage
      {d}{s}
      "); - return html; + return sb.toOwnedSlice(allocator); } fn getFortunes(allocator: std.mem.Allocator, pool: *pg.Pool) ![]const Fortune { @@ -110,18 +110,18 @@ fn getFortunes(allocator: std.mem.Allocator, pool: *pg.Pool) ![]const Fortune { var rows = try conn.query("SELECT id, message FROM Fortune", .{}); defer rows.deinit(); - var fortunes = std.ArrayList(Fortune).init(allocator); - defer fortunes.deinit(); + var fortunes = try std.ArrayListUnmanaged(Fortune).initCapacity(allocator, 0); + defer fortunes.deinit(allocator); while (try rows.next()) |row| { const current_fortune = Fortune{ .id = row.get(i32, 0), .message = row.get([]const u8, 1) }; - try fortunes.append(current_fortune); + try fortunes.append(allocator, current_fortune); } const zero_fortune = Fortune{ .id = 0, .message = "Additional fortune added at request time." }; - try fortunes.append(zero_fortune); + try fortunes.append(allocator, zero_fortune); - const fortunes_slice = try fortunes.toOwnedSlice(); + const fortunes_slice = try fortunes.toOwnedSlice(allocator); std.mem.sort(Fortune, fortunes_slice, {}, cmpFortuneByMessage); return fortunes_slice; @@ -131,53 +131,17 @@ fn cmpFortuneByMessage(_: void, a: Fortune, b: Fortune) bool { return std.mem.order(u8, a.message, b.message).compare(std.math.CompareOperator.lt); } -fn deescapeHtml(allocator: std.mem.Allocator, input: []const u8) ![]const u8 { - var output = std.ArrayList(u8).init(allocator); - 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; +fn escape_html(allocator: std.mem.Allocator, input: []const u8) ![]const u8 { + var output = try std.ArrayListUnmanaged(u8).initCapacity(allocator, 0); + defer output.deinit(allocator); + + for (input) |char| { + switch (char) { + '<' => try output.appendSlice(allocator, "<"), + '>' => try output.appendSlice(allocator, ">"), + else => try output.append(allocator, char), } } - return output.toOwnedSlice(); + return output.toOwnedSlice(allocator); } diff --git a/frameworks/Zig/httpz/src/main.zig b/frameworks/Zig/httpz/src/main.zig index b7fd4850bc2..dd5b3966b2f 100644 --- a/frameworks/Zig/httpz/src/main.zig +++ b/frameworks/Zig/httpz/src/main.zig @@ -20,6 +20,24 @@ pub fn main() !void { var pg_pool = try pool.initPool(allocator); defer pg_pool.deinit(); + const date_thread = try std.Thread.spawn(.{}, struct { + fn update() !void { + const ally = std.heap.page_allocator; + while (true) { + const now = datetimez.datetime.Date.now(); + const time = datetimez.datetime.Time.now(); + + // Wed, 17 Apr 2013 12:00:00 GMT + // Return date in ISO format YYYY-MM-DD + const TB_DATE_FMT = "{s:0>3}, {d:0>2} {s:0>3} {d:0>4} {d:0>2}:{d:0>2}:{d:0>2} GMT"; + endpoints.date_str = try std.fmt.allocPrint(ally, TB_DATE_FMT, .{ now.weekdayName()[0..3], now.day, now.monthName()[0..3], now.year, time.hour, time.minute, time.second }); + std.time.sleep(std.time.ns_per_ms * 980); + } + } + }.update, .{}); + + date_thread.detach(); + var prng = std.rand.DefaultPrng.init(@as(u64, @bitCast(std.time.milliTimestamp()))); var rand = prng.random(); @@ -29,10 +47,7 @@ pub fn main() !void { .rand = &rand, }; - const args = try std.process.argsAlloc(allocator); - - const port: u16 = if (args.len > 1) try std.fmt.parseInt(u16, args[1], 0) else 3000; - + const port: u16 = 3000; const workers = @as(u16, @intCast(16 * cpu_count)); server = try httpz.ServerApp(*endpoints.Global).init(allocator, .{ @@ -55,10 +70,6 @@ pub fn main() !void { // static buffers. For example, if response headers don't fit in in // $response.header_buffer_size, a buffer will be pulled from here. // This is per-worker. - .large_buffer_count = 16, - - // The size of each large buffer. - .large_buffer_size = 65536, // Size of bytes retained for the connection arena between use. This will // result in up to `count * min_conn * retain_allocated_bytes` of memory usage. @@ -77,22 +88,8 @@ pub fn main() !void { // This applies back pressure to the above workers and ensures that, under load // pending requests get precedence over processing new requests. .backlog = 2048, - - // Size of the static buffer to give each thread. Memory usage will be - // `count * buffer_size`. If you're making heavy use of either `req.arena` or - // `res.arena`, this is likely the single easiest way to gain performance. - .buffer_size = 8192, }, .request = .{ - // Maximum request body size that we'll process. We can allocate up - // to this much memory per request for the body. Internally, we might - // keep this memory around for a number of requests as an optimization. - .max_body_size = 1_048_576, - - // This memory is allocated upfront. The request header _must_ fit into - // this space, else the request will be rejected. - .buffer_size = 4_096, - // Maximum number of headers to accept. // Additional headers will be silently ignored. .max_header_count = 32, From b73a8a2f8ec908d68256832429575ead6ca554c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E5=AD=90=20Yang?= Date: Mon, 17 Mar 2025 23:55:47 +0800 Subject: [PATCH 1265/1766] Add cached query tests (#9680) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add new framework Java/today * change build config * :arrow_up: 升级版本 4.0.0-Draft.6 * 更新 /updates API * 打开日志 * :fire: 删除 /updates API 偶尔会出错,目前尚未找到原因 * :art: 更新 /updates API * :art: 添加 epoll 支持 * :fire: remove all of the files that aren't necessary for the tests * :art: .gitignore * :art: 优化构建 * :sparkles: 更新框架,新增 cached_query_url * :art: 优化使用方式 * :art: 优化使用方式 * :art: * :art: * :art: 修改 cached queries 地址 --- frameworks/Java/today/.gitignore | 3 +- frameworks/Java/today/README.md | 4 ++ frameworks/Java/today/benchmark_config.json | 3 +- frameworks/Java/today/build.gradle | 28 +++++--- frameworks/Java/today/config.toml | 1 + frameworks/Java/today/gradle.properties | 6 +- .../cn/taketoday/benchmark/AppConfig.java | 63 ++++++++++------ .../benchmark/BenchmarkApplication.java | 4 +- .../benchmark/http/BenchmarkHttpHandler.java | 71 ++++++++++--------- .../taketoday/benchmark/http/WorldCache.java | 28 ++++++++ .../benchmark/http/package-info.java | 6 ++ .../cn/taketoday/benchmark/model/Fortune.java | 7 +- .../cn/taketoday/benchmark/model/Message.java | 14 ++++ .../cn/taketoday/benchmark/model/World.java | 17 +++-- .../benchmark/model/package-info.java | 6 ++ .../cn/taketoday/benchmark/package-info.java | 6 ++ .../src/main/resources/application-test.yaml | 9 +-- .../today/src/main/resources/application.yaml | 7 +- frameworks/Java/today/today.dockerfile | 14 ++-- 19 files changed, 205 insertions(+), 92 deletions(-) create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/WorldCache.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/package-info.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Message.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/package-info.java create mode 100644 frameworks/Java/today/src/main/java/cn/taketoday/benchmark/package-info.java diff --git a/frameworks/Java/today/.gitignore b/frameworks/Java/today/.gitignore index ea1cbb085ef..ed040c778b1 100644 --- a/frameworks/Java/today/.gitignore +++ b/frameworks/Java/today/.gitignore @@ -6,4 +6,5 @@ build .idea today.properties -gradle \ No newline at end of file +gradle +gradlew \ No newline at end of file diff --git a/frameworks/Java/today/README.md b/frameworks/Java/today/README.md index a7c42243f25..96aa3bbbdbb 100644 --- a/frameworks/Java/today/README.md +++ b/frameworks/Java/today/README.md @@ -17,6 +17,10 @@ http://localhost:8080/db http://localhost:8080/queries?queries= +### Caching QUERY + +http://localhost:8080/cached-queries?count=10 + ### UPDATE http://localhost:8080/update?queries= diff --git a/frameworks/Java/today/benchmark_config.json b/frameworks/Java/today/benchmark_config.json index 92c3c756ad1..c44a0306ce5 100755 --- a/frameworks/Java/today/benchmark_config.json +++ b/frameworks/Java/today/benchmark_config.json @@ -9,6 +9,7 @@ "query_url": "/queries?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", + "cached_query_url": "/cached-queries?count=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -21,7 +22,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "Today", + "display_name": "TODAY", "notes": "", "versus": "None" } diff --git a/frameworks/Java/today/build.gradle b/frameworks/Java/today/build.gradle index a95a1982f4e..0925eff2b4a 100644 --- a/frameworks/Java/today/build.gradle +++ b/frameworks/Java/today/build.gradle @@ -1,16 +1,16 @@ description = "benchmark" -apply plugin: "java" -apply plugin: "application" -apply plugin: 'cn.taketoday.application' -apply plugin: 'io.spring.dependency-management' +apply plugin: 'java' +apply plugin: 'application' +apply plugin: 'infra.application' configure(allprojects) { group = "cn.taketoday.benchmark" repositories { + mavenLocal() mavenCentral() - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } } } @@ -24,6 +24,7 @@ dependencies { implementation 'mysql:mysql-connector-java' implementation 'ch.qos.logback:logback-classic' + implementation 'com.github.ben-manes.caffeine:caffeine' implementation('io.netty:netty-transport-native-epoll') { artifact { @@ -31,6 +32,12 @@ dependencies { } } + implementation('io.netty.incubator:netty-incubator-transport-native-io_uring:0.0.21.Final') { + artifact { + classifier = 'linux-x86_64' + } + } + // implementation('io.netty:netty-transport-native-kqueue') { // artifact { // classifier = 'osx-aarch_64' @@ -40,23 +47,24 @@ dependencies { } java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } application { mainClass = 'cn.taketoday.benchmark.BenchmarkApplication' applicationDefaultJvmArgs = [ "-server", + "-Xms2G", + "-Xmx2G", "-XX:+UseNUMA", - "-XX:+UseG1GC", - "-XX:+DisableExplicitGC", - "-XX:-StackTraceInThrowable", "-XX:+UseStringDeduplication", "-Dinfra.profiles.active=test", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.leakDetection.level=disabled", + "-Dio.netty.iouring.iosqeAsyncThreshold=32000", + "-Djava.lang.Integer.IntegerCache.high=10000", "--add-opens=java.base/java.nio=ALL-UNNAMED", "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED" ] diff --git a/frameworks/Java/today/config.toml b/frameworks/Java/today/config.toml index dc2e84c877d..36cf38bc9f5 100644 --- a/frameworks/Java/today/config.toml +++ b/frameworks/Java/today/config.toml @@ -8,6 +8,7 @@ urls.db = "/db" urls.query = "/queries?queries=" urls.update = "/updates?queries=" urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?count=" approach = "Realistic" classification = "Fullstack" database = "mysql" diff --git a/frameworks/Java/today/gradle.properties b/frameworks/Java/today/gradle.properties index 9379f1c95c9..088db4d0de3 100644 --- a/frameworks/Java/today/gradle.properties +++ b/frameworks/Java/today/gradle.properties @@ -1,6 +1,6 @@ -version=1.0.0 -#infraVersion=4.0.0-Draft.6-SNAPSHOT -infraVersion=4.0.0-Draft.6 +version=1.1.0 +#infraVersion=5.0-Draft.2 +infraVersion=5.0-Draft.2-SNAPSHOT org.gradle.caching=true org.gradle.jvmargs=-Xmx2048m diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java index 1d385a77133..b5496ce042d 100644 --- a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java @@ -4,21 +4,26 @@ import javax.sql.DataSource; -import cn.taketoday.beans.factory.annotation.DisableAllDependencyInjection; -import cn.taketoday.beans.factory.config.BeanDefinition; -import cn.taketoday.context.annotation.Configuration; -import cn.taketoday.context.annotation.Role; -import cn.taketoday.framework.web.netty.NettyRequestConfig; -import cn.taketoday.framework.web.netty.SendErrorHandler; -import cn.taketoday.jdbc.RepositoryManager; -import cn.taketoday.jdbc.persistence.EntityManager; -import cn.taketoday.stereotype.Component; -import io.netty.handler.codec.http.DefaultHttpHeadersFactory; +import infra.beans.factory.annotation.DisableAllDependencyInjection; +import infra.beans.factory.config.BeanDefinition; +import infra.context.annotation.Configuration; +import infra.context.annotation.Role; +import infra.jdbc.RepositoryManager; +import infra.persistence.EntityManager; +import infra.stereotype.Component; +import infra.web.server.WebServerFactoryCustomizer; +import infra.web.server.error.SendErrorHandler; +import infra.web.server.support.NettyRequestConfig; +import infra.web.server.support.NettyWebServerFactory; +import io.netty.handler.codec.http.DefaultHttpHeaders; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpHeadersFactory; import io.netty.handler.codec.http.multipart.DefaultHttpDataFactory; +import io.netty.incubator.channel.uring.IOUring; +import io.netty.incubator.channel.uring.IOUringEventLoopGroup; +import io.netty.incubator.channel.uring.IOUringServerSocketChannel; -import static cn.taketoday.http.HttpHeaders.DATE_FORMATTER; +import static infra.http.HttpHeaders.DATE_FORMATTER; /** * @author Harry Yang @@ -29,30 +34,41 @@ @Configuration(proxyBeanMethods = false) class AppConfig { - private static final DefaultHttpHeadersFactory headersFactory = DefaultHttpHeadersFactory.headersFactory(); - @Component - static RepositoryManager repositoryManager(DataSource dataSource) { + public static RepositoryManager repositoryManager(DataSource dataSource) { return new RepositoryManager(dataSource); } @Component - static EntityManager entityManager(RepositoryManager repositoryManager) { + public static EntityManager entityManager(RepositoryManager repositoryManager) { return repositoryManager.getEntityManager(); } + @Component + public static WebServerFactoryCustomizer factoryWebServerFactoryCustomizer() { + return factory -> { + if (IOUring.isAvailable()) { + IOUringEventLoopGroup loopGroup = new IOUringEventLoopGroup(); + factory.setAcceptorGroup(loopGroup); + factory.setWorkerGroup(loopGroup); + factory.setSocketChannel(IOUringServerSocketChannel.class); + } + }; + } + @Component @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - static NettyRequestConfig nettyRequestConfig(SendErrorHandler sendErrorHandler) { + public static NettyRequestConfig nettyRequestConfig(SendErrorHandler sendErrorHandler) { var factory = new DefaultHttpDataFactory(false); - return NettyRequestConfig.forBuilder() + + return NettyRequestConfig.forBuilder(false) .httpDataFactory(factory) .sendErrorHandler(sendErrorHandler) .headersFactory(new HttpHeadersFactory() { @Override public HttpHeaders newHeaders() { - HttpHeaders headers = headersFactory.newHeaders(); + HttpHeaders headers = new ResponseHeaders(); headers.set("Server", "TODAY"); headers.set("Date", DATE_FORMATTER.format(ZonedDateTime.now())); return headers; @@ -60,11 +76,18 @@ public HttpHeaders newHeaders() { @Override public HttpHeaders newEmptyHeaders() { - return headersFactory.newEmptyHeaders(); + return new ResponseHeaders(); } }) - .secure(false) .build(); } + static class ResponseHeaders extends DefaultHttpHeaders { + + public ResponseHeaders() { + super(name -> { }, v -> { }); + } + + } + } diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java index 0e2eea0f995..9dfe80b4d08 100644 --- a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java @@ -1,7 +1,7 @@ package cn.taketoday.benchmark; -import cn.taketoday.framework.Application; -import cn.taketoday.framework.InfraApplication; +import infra.app.Application; +import infra.app.InfraApplication; @InfraApplication public class BenchmarkApplication { diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java index d0d240534bd..3000a073aab 100644 --- a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java @@ -2,21 +2,21 @@ import java.util.Comparator; import java.util.List; -import java.util.Map; -import java.util.Objects; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; import cn.taketoday.benchmark.model.Fortune; +import cn.taketoday.benchmark.model.Message; import cn.taketoday.benchmark.model.World; -import cn.taketoday.http.MediaType; -import cn.taketoday.http.ResponseEntity; -import cn.taketoday.jdbc.persistence.EntityManager; -import cn.taketoday.lang.Nullable; -import cn.taketoday.ui.Model; -import cn.taketoday.web.annotation.GET; -import cn.taketoday.web.annotation.RestController; -import cn.taketoday.web.view.ViewRef; +import infra.http.MediaType; +import infra.http.ResponseEntity; +import infra.lang.Nullable; +import infra.persistence.EntityManager; +import infra.ui.Model; +import infra.util.concurrent.Future; +import infra.web.annotation.GET; +import infra.web.annotation.RestController; +import infra.web.view.ViewRef; /** * @author Harry Yang @@ -26,19 +26,23 @@ final class BenchmarkHttpHandler { private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER = 10_000; private final EntityManager entityManager; + private final WorldCache worldCache; + BenchmarkHttpHandler(EntityManager entityManager) { this.entityManager = entityManager; + this.worldCache = new WorldCache(entityManager.find(World.class)); } @GET("/json") - public ResponseEntity> json() { + public ResponseEntity json() { return ResponseEntity.ok() .contentType(MediaType.APPLICATION_JSON) - .body(Map.of("message", "Hello, World!")); + .body(new Message("Hello, World!")); } @GET("/plaintext") @@ -46,30 +50,33 @@ public String plaintext() { return "Hello, World!"; } + @Nullable @GET("/db") public World db() { return entityManager.findById(World.class, nextInt()); } @GET("/queries") - public List queries(@Nullable String queries) { - return randomNumbers() - .mapToObj(this::findWorldById) - .limit(parseQueryCount(queries)) - .toList(); + public Future> queries(@Nullable String queries) { + return Future.combine(randomNumbers().limit(parseQueryCount(queries)).mapToObj(this::findWorldByIdFuture)) + .asList(); + } + + @GET("/cached-queries") + public List cachedQueries(@Nullable String count) { + return worldCache.getCachedWorld(parseQueryCount(count)); } @GET("/updates") - public List updates(@Nullable String queries) { - return randomNumbers() - .mapToObj(this::findWorldById) - .filter(Objects::nonNull) - .peek(world -> { + public Future> updates(@Nullable String queries) { + return Future.combine(randomNumbers() + .limit(parseQueryCount(queries)) + .mapToObj(this::findWorldByIdFuture) + .map(worldFuture -> worldFuture.map(world -> { world.setRandomNumber(nextInt()); entityManager.updateById(world); - }) - .limit(parseQueryCount(queries)) - .toList(); + return world; + }))).asList(); } @GET("/fortunes") @@ -82,9 +89,13 @@ public ViewRef fortunes(Model model) { return ViewRef.forViewName("fortunes"); } + private Future findWorldByIdFuture(int id) { + return Future.run(() -> findWorldById(id)); + } + @Nullable private World findWorldById(int id) { - return entityManager.findById(World.class, boxed[id]); + return entityManager.findById(World.class, id); } // @@ -95,12 +106,8 @@ private static IntStream randomNumbers() { .distinct(); } - private static final Integer[] boxed = IntStream.range(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER + 1) - .boxed() - .toArray(Integer[]::new); - - private static Integer nextInt() { - return boxed[ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER)]; + private static int nextInt() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER); } private static int parseQueryCount(@Nullable String textValue) { diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/WorldCache.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/WorldCache.java new file mode 100644 index 00000000000..899dafa7470 --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/WorldCache.java @@ -0,0 +1,28 @@ +package cn.taketoday.benchmark.http; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +import cn.taketoday.benchmark.model.World; + +public class WorldCache { + + private final World[] cache; + + public WorldCache(List worlds) { + this.cache = worlds.toArray(new World[0]); + } + + public List getCachedWorld(int count) { + World[] worlds = this.cache; + int length = worlds.length; + ArrayList ret = new ArrayList<>(count); + ThreadLocalRandom current = ThreadLocalRandom.current(); + for (int i = 0; i < count; i++) { + ret.add(worlds[current.nextInt(length - 1)]); + } + return ret; + } + +} \ No newline at end of file diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/package-info.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/package-info.java new file mode 100644 index 00000000000..4ef5fb0311b --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/package-info.java @@ -0,0 +1,6 @@ +@NonNullApi +@NonNullFields +package cn.taketoday.benchmark.http; + +import infra.lang.NonNullApi; +import infra.lang.NonNullFields; \ No newline at end of file diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java index a261c1434bd..1df119d4a3d 100644 --- a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java @@ -2,8 +2,8 @@ import java.util.Objects; -import cn.taketoday.jdbc.persistence.Id; -import cn.taketoday.jdbc.persistence.Table; +import infra.persistence.Id; +import infra.persistence.Table; @Table("fortune") public class Fortune { @@ -13,7 +13,8 @@ public class Fortune { private String message; - public Fortune() { } + public Fortune() { + } public Fortune(Integer id, String message) { this.id = id; diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Message.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Message.java new file mode 100644 index 00000000000..fde5de5b8a8 --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Message.java @@ -0,0 +1,14 @@ +package cn.taketoday.benchmark.model; + +public class Message { + + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java index 04c60c8445f..4ff2a25c1d1 100644 --- a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java @@ -2,12 +2,12 @@ import java.util.Objects; -import cn.taketoday.jdbc.persistence.Column; -import cn.taketoday.jdbc.persistence.Id; -import cn.taketoday.jdbc.persistence.Table; +import infra.persistence.Column; +import infra.persistence.Id; +import infra.persistence.Table; @Table("world") -public class World { +public class World implements Comparable { @Id private Integer id; @@ -15,7 +15,8 @@ public class World { @Column("randomNumber") private Integer randomNumber; - public World() { } + public World() { + } public World(Integer id, Integer randomNumber) { this.id = id; @@ -52,4 +53,10 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(id, randomNumber); } + + @Override + public int compareTo(World o) { + return Integer.compare(id, o.id); + } + } diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/package-info.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/package-info.java new file mode 100644 index 00000000000..115f7640198 --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/package-info.java @@ -0,0 +1,6 @@ +@NonNullApi +@NonNullFields +package cn.taketoday.benchmark.model; + +import infra.lang.NonNullApi; +import infra.lang.NonNullFields; \ No newline at end of file diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/package-info.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/package-info.java new file mode 100644 index 00000000000..518576b46e9 --- /dev/null +++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/package-info.java @@ -0,0 +1,6 @@ +@NonNullApi +@NonNullFields +package cn.taketoday.benchmark; + +import infra.lang.NonNullApi; +import infra.lang.NonNullFields; \ No newline at end of file diff --git a/frameworks/Java/today/src/main/resources/application-test.yaml b/frameworks/Java/today/src/main/resources/application-test.yaml index e901f8a0476..7d554af1c14 100644 --- a/frameworks/Java/today/src/main/resources/application-test.yaml +++ b/frameworks/Java/today/src/main/resources/application-test.yaml @@ -5,10 +5,11 @@ datasource: logging: level: - root: info + root: OFF server: netty: - acceptor-threads: 4 - worker-threads: 8 - max-connection: 65535 \ No newline at end of file + acceptor-threads: 8 + worker-threads: 16 + max-connection: 8192 + validate-headers: false \ No newline at end of file diff --git a/frameworks/Java/today/src/main/resources/application.yaml b/frameworks/Java/today/src/main/resources/application.yaml index 650df4454a5..aba9b42e36a 100644 --- a/frameworks/Java/today/src/main/resources/application.yaml +++ b/frameworks/Java/today/src/main/resources/application.yaml @@ -30,12 +30,9 @@ datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver hikari: - maximum-pool-size: 20 - max-lifetime: 120000 + maximum-pool-size: 256 connection-test-query: 'select 1' logging: level: - root: OFF - pattern: - dateformat: 'yyyy-MM-dd HH:mm:ss.SSS' \ No newline at end of file + root: OFF \ No newline at end of file diff --git a/frameworks/Java/today/today.dockerfile b/frameworks/Java/today/today.dockerfile index b063749f6b1..643bbe4c00a 100644 --- a/frameworks/Java/today/today.dockerfile +++ b/frameworks/Java/today/today.dockerfile @@ -1,11 +1,13 @@ -FROM gradle:8.6.0-jdk17 as build -COPY --chown=gradle:gradle . /home/gradle/src -WORKDIR /home/gradle/src -RUN gradle installInfraDist --no-daemon +FROM gradle:8.13.0-jdk21 as build +COPY --chown=gradle:gradle . /infra-src +WORKDIR /infra-src +RUN gradle installDist --no-daemon -FROM openjdk:21 +#FROM openjdk:21 +FROM bellsoft/liberica-openjre-debian:21.0.5 +RUN apt install findutils WORKDIR /today -COPY --from=build /home/gradle/src/build/install/today-infra-app/ ./ +COPY --from=build /infra-src/build/install/today/ ./ EXPOSE 8080 ENTRYPOINT "./bin/today" From af661274860ffcb9f836fde2b02f36eb32e5bef9 Mon Sep 17 00:00:00 2001 From: rio Date: Tue, 18 Mar 2025 01:16:51 +0900 Subject: [PATCH 1266/1766] [php] CakePHP remove xdebug (#9675) (#9679) --- frameworks/PHP/cakephp/cakephp-workerman.dockerfile | 2 -- frameworks/PHP/cakephp/cakephp.dockerfile | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frameworks/PHP/cakephp/cakephp-workerman.dockerfile b/frameworks/PHP/cakephp/cakephp-workerman.dockerfile index 0339af783c9..7d275912de0 100644 --- a/frameworks/PHP/cakephp/cakephp-workerman.dockerfile +++ b/frameworks/PHP/cakephp/cakephp-workerman.dockerfile @@ -24,8 +24,6 @@ RUN composer install --optimize-autoloader --classmap-authoritative --no-dev -- RUN chmod -R 777 /cakephp -#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 \ diff --git a/frameworks/PHP/cakephp/cakephp.dockerfile b/frameworks/PHP/cakephp/cakephp.dockerfile index 3ebafcb9d8c..d5d39a7ea65 100644 --- a/frameworks/PHP/cakephp/cakephp.dockerfile +++ b/frameworks/PHP/cakephp/cakephp.dockerfile @@ -7,7 +7,7 @@ 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.4-fpm php8.4-mysql php8.4-xml php8.4-mbstring php8.4-intl php8.4-dev php8.4-curl php-xdebug > /dev/null + php8.4-fpm php8.4-mysql php8.4-xml php8.4-mbstring php8.4-intl php8.4-dev php8.4-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer From 551083d3ef787264f0b4f89d53f0de4a708fa45e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=85=89?= Date: Tue, 18 Mar 2025 00:35:00 +0800 Subject: [PATCH 1267/1766] update com.fasterxml.jackson.core:jackson-databind 2.13.4.2 to 2.16.0 (#9181) --- frameworks/Java/activeweb/pom.xml | 2 +- frameworks/Java/bayou/pom.xml | 2 +- frameworks/Java/grizzly/pom.xml | 2 +- frameworks/Java/httpserver/pom.xml | 2 +- frameworks/Java/jlhttp/pom.xml | 2 +- frameworks/Java/microhttp/pom.xml | 2 +- frameworks/Java/nanohttpd/pom.xml | 2 +- frameworks/Java/servlet/pom.xml | 2 +- frameworks/Java/servlet3/pom.xml | 2 +- frameworks/Java/tapestry/pom.xml | 2 +- frameworks/Java/undertow-jersey/pom.xml | 2 +- frameworks/Java/undertow/pom.xml | 2 +- frameworks/Prolog/tuProlog/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Java/activeweb/pom.xml b/frameworks/Java/activeweb/pom.xml index e3f9f0c430d..25171d2d172 100644 --- a/frameworks/Java/activeweb/pom.xml +++ b/frameworks/Java/activeweb/pom.xml @@ -120,7 +120,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 diff --git a/frameworks/Java/bayou/pom.xml b/frameworks/Java/bayou/pom.xml index feee2d76073..638a06778e2 100644 --- a/frameworks/Java/bayou/pom.xml +++ b/frameworks/Java/bayou/pom.xml @@ -33,7 +33,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 diff --git a/frameworks/Java/grizzly/pom.xml b/frameworks/Java/grizzly/pom.xml index 0cf5f082fd4..527560610b6 100644 --- a/frameworks/Java/grizzly/pom.xml +++ b/frameworks/Java/grizzly/pom.xml @@ -72,7 +72,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 diff --git a/frameworks/Java/httpserver/pom.xml b/frameworks/Java/httpserver/pom.xml index 4526fb528bf..30577d8801f 100644 --- a/frameworks/Java/httpserver/pom.xml +++ b/frameworks/Java/httpserver/pom.xml @@ -18,7 +18,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 com.fasterxml.jackson.module diff --git a/frameworks/Java/jlhttp/pom.xml b/frameworks/Java/jlhttp/pom.xml index 5f12f34226c..af63382cc2b 100644 --- a/frameworks/Java/jlhttp/pom.xml +++ b/frameworks/Java/jlhttp/pom.xml @@ -24,7 +24,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 com.fasterxml.jackson.module diff --git a/frameworks/Java/microhttp/pom.xml b/frameworks/Java/microhttp/pom.xml index 75501b02275..6e4ea1d91eb 100644 --- a/frameworks/Java/microhttp/pom.xml +++ b/frameworks/Java/microhttp/pom.xml @@ -29,7 +29,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 mysql diff --git a/frameworks/Java/nanohttpd/pom.xml b/frameworks/Java/nanohttpd/pom.xml index 5ce138edc23..10538727775 100644 --- a/frameworks/Java/nanohttpd/pom.xml +++ b/frameworks/Java/nanohttpd/pom.xml @@ -23,7 +23,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 com.fasterxml.jackson.module diff --git a/frameworks/Java/servlet/pom.xml b/frameworks/Java/servlet/pom.xml index 052ca85e38e..6f08f65c22a 100644 --- a/frameworks/Java/servlet/pom.xml +++ b/frameworks/Java/servlet/pom.xml @@ -13,7 +13,7 @@ 11 11 1.2.3.Final - 2.13.4.2 + 2.16.0 src/main/webapp/WEB-INF/web.xml diff --git a/frameworks/Java/servlet3/pom.xml b/frameworks/Java/servlet3/pom.xml index d8db7acde68..d48a9d90723 100644 --- a/frameworks/Java/servlet3/pom.xml +++ b/frameworks/Java/servlet3/pom.xml @@ -80,7 +80,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 diff --git a/frameworks/Java/tapestry/pom.xml b/frameworks/Java/tapestry/pom.xml index f76174d8b7e..e764bc2860d 100644 --- a/frameworks/Java/tapestry/pom.xml +++ b/frameworks/Java/tapestry/pom.xml @@ -95,7 +95,7 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 org.glassfish.jaxb diff --git a/frameworks/Java/undertow-jersey/pom.xml b/frameworks/Java/undertow-jersey/pom.xml index af553eea552..3dcc90d2d81 100644 --- a/frameworks/Java/undertow-jersey/pom.xml +++ b/frameworks/Java/undertow-jersey/pom.xml @@ -145,7 +145,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.16.0 com.fasterxml.jackson.module diff --git a/frameworks/Java/undertow/pom.xml b/frameworks/Java/undertow/pom.xml index 133d1ce186c..3bdce648fb3 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -14,7 +14,7 @@ 18 UTF-8 5.0.1 - 2.13.4.2 + 2.16.0 3.10.1 3.3.0 3.2.2 diff --git a/frameworks/Prolog/tuProlog/pom.xml b/frameworks/Prolog/tuProlog/pom.xml index c707a7e3221..dd86c6a45a2 100644 --- a/frameworks/Prolog/tuProlog/pom.xml +++ b/frameworks/Prolog/tuProlog/pom.xml @@ -13,7 +13,7 @@ 16 0.18.2 4.3.8 - 2.13.4.2 + 2.16.0 From 9c4f41a1b9a948d1a94a7dad4653a8f56d0b1963 Mon Sep 17 00:00:00 2001 From: Artur Date: Mon, 17 Mar 2025 17:38:08 +0100 Subject: [PATCH 1268/1766] feat: begone 60s wait time (#9240) --- Dockerfile | 1 + toolset/benchmark/benchmarker.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4325f036734..28de4fb3415 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,7 @@ RUN apt-get -yqq update && \ gcc \ git-core \ gosu \ + iproute2 \ # Needed for mysqlclient libmysqlclient-dev \ libpq-dev \ diff --git a/toolset/benchmark/benchmarker.py b/toolset/benchmark/benchmarker.py index 8b5ce49d65b..edf66ce24d4 100644 --- a/toolset/benchmark/benchmarker.py +++ b/toolset/benchmark/benchmarker.py @@ -37,8 +37,6 @@ def __init__(self, config): self.results = Results(self) self.docker_helper = DockerHelper(self) - self.last_test = False - ########################################################################################## # Public methods ########################################################################################## @@ -64,8 +62,6 @@ def run(self): with open(os.path.join(self.results.directory, 'benchmark.log'), 'w') as benchmark_log: for test in self.tests: - if self.tests.index(test) + 1 == len(self.tests): - self.last_test = True log("Running Test: %s" % test.name, border='-') with self.config.quiet_out.enable(): if not self.__run_test(test, benchmark_log): @@ -101,13 +97,17 @@ def __exit_test(self, success, prefix, file, message=None): color=Fore.RED if success else '') self.time_logger.log_test_end(log_prefix=prefix, file=file) if self.config.mode == "benchmark": - # Sleep for 60 seconds to ensure all host connects are closed - log("Clean up: Sleep 60 seconds...", prefix=prefix, file=file) - time.sleep(60) + total_tcp_sockets = subprocess.check_output("ss -s | grep TCP: | awk '{print $2}'", shell=True, text=True) + log("Total TCP sockets: " + total_tcp_sockets, prefix=prefix, file=file) + + if int(total_tcp_sockets) > 5000: + # Sleep for 60 seconds to ensure all host connects are closed + log("Clean up: Sleep 60 seconds...", prefix=prefix, file=file) + time.sleep(60) + # After benchmarks are complete for all test types in this test, # let's clean up leftover test images (techempower/tfb.test.test-name) self.docker_helper.clean() - return success def __run_test(self, test, benchmark_log): From b30765dde4dc78b19500d59c32f2f744cf08aaa3 Mon Sep 17 00:00:00 2001 From: softjapan Date: Tue, 18 Mar 2025 02:21:46 +0900 Subject: [PATCH 1269/1766] Refactor User and Group Creation in Dockerfile for Improved Efficiency and Simplicity (#9490) refactors the user and group creation process in the Dockerfile to address inefficiencies, reduce redundancy, and enhance simplicity. --- Dockerfile | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 28de4fb3415..0e60a78d94c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,17 +44,12 @@ RUN curl -LSs "https://github.com/scottchiefbaker/dool/archive/${DOOL_VERSION}.t tar --strip-components=1 -xz && \ ./install.py -# Check if the group ID is already created +# create group and user ARG GROUP_ID -RUN if ! getent group "$GROUP_ID"; then \ - addgroup --gid "$GROUP_ID" user; \ - fi - -# Check if the user ID is already created ARG USER_ID -RUN if ! getent passwd "$USER_ID"; then \ - adduser --disabled-password --gecos '' --gid "$GROUP_ID" --uid "$USER_ID" user; \ - fi + +RUN groupadd -g "$GROUP_ID" user || true && \ + useradd -m -u "$USER_ID" -g "$GROUP_ID" -s /bin/bash user || true ENV FWROOT=/FrameworkBenchmarks USER_ID="$USER_ID" ENV PYTHONPATH="$FWROOT" From 2661d4b75e4fb9d8f4583104264487d1e7947b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Mon, 17 Mar 2025 11:44:27 -0700 Subject: [PATCH 1270/1766] Update ASP.NET Core metadata (#9639) * Update ASP.NET metadata Would it be possible to also update the calculation using `ASP.NET Core [Paltform]` instead of the previous `ASP.NET Core`? * Fix typeos * Remove updates for MVC * Add maintainers to benchmark_config.json --- .../CSharp/aspnetcore/benchmark_config.json | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/frameworks/CSharp/aspnetcore/benchmark_config.json b/frameworks/CSharp/aspnetcore/benchmark_config.json index 831a9f27d81..eb56fddfb57 100644 --- a/frameworks/CSharp/aspnetcore/benchmark_config.json +++ b/frameworks/CSharp/aspnetcore/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "aspnetcore", + "maintainers": ["DamianEdwards", "sebastienros"], "tests": [ { "default": { @@ -14,7 +15,7 @@ "approach": "Realistic", "classification": "Platform", "database": "Postgres", - "framework": "ASP.NET Core", + "framework": "ASP.NET Core [Platform]", "language": "C#", "orm": "Raw", "platform": ".NET", @@ -22,7 +23,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core [Platform, Pg]", + "display_name": "ASP.NET Core [Platform]", "notes": "" }, "aot": { @@ -37,7 +38,7 @@ "approach": "Realistic", "classification": "Platform", "database": "Postgres", - "framework": "ASP.NET Core", + "framework": "ASP.NET Core [Platform]", "language": "C#", "orm": "Raw", "platform": ".NET", @@ -45,7 +46,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core [Platform, Pg, AOT]", + "display_name": "ASP.NET Core [Platform, AOT]", "notes": "" }, "minimal": { @@ -67,7 +68,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core [Minimal APIs, Pg, Dapper]", + "display_name": "ASP.NET Core [Minimal APIs]", "notes": "", "versus": "aspnetcore" }, @@ -89,7 +90,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core [MVC, Pg, EF]", + "display_name": "ASP.NET Core [MVC]", "notes": "", "versus": "aspnetcore" }, @@ -103,7 +104,7 @@ "approach": "Realistic", "classification": "Platform", "database": "MySQL", - "framework": "ASP.NET Core", + "framework": "ASP.NET Core [Platform]", "language": "C#", "orm": "Raw", "platform": ".NET", @@ -111,8 +112,9 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core [Platform, My]", - "notes": "" + "display_name": "ASP.NET Core [Platform, MySQL]", + "notes": "", + "versus": "aspnetcore" } } ] From a807ce89a74b5b530c72a4e2bdd6e4c79693bdbf Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 17 Mar 2025 19:45:39 +0100 Subject: [PATCH 1271/1766] [ruby/padrino] Don't hardcode number of workers to 8 for Puma (#9681) Use autotune instead as the server can handle a lot more than 8 threads. --- frameworks/Ruby/padrino/config/auto_tune.rb | 2 +- frameworks/Ruby/padrino/padrino.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/padrino/config/auto_tune.rb b/frameworks/Ruby/padrino/config/auto_tune.rb index 4544231b9d2..54ae1e08731 100644 --- a/frameworks/Ruby/padrino/config/auto_tune.rb +++ b/frameworks/Ruby/padrino/config/auto_tune.rb @@ -9,7 +9,7 @@ MIN_WORKERS = 2 MAX_WORKERS_PER_VCPU = 1.25 # virtual/logical MIN_THREADS_PER_WORKER = 1 -MAX_THREADS = Integer(ENV['MAX_CONCURRENCY'] || 8) +MAX_THREADS = Integer(ENV['MAX_CONCURRENCY'] || 256) def meminfo(arg) File.open('/proc/meminfo') do |f| diff --git a/frameworks/Ruby/padrino/padrino.dockerfile b/frameworks/Ruby/padrino/padrino.dockerfile index b35254eb3e7..eb3bf6f68de 100644 --- a/frameworks/Ruby/padrino/padrino.dockerfile +++ b/frameworks/Ruby/padrino/padrino.dockerfile @@ -16,4 +16,4 @@ EXPOSE 8080 ENV RUBY_YJIT_ENABLE=1 -CMD bundle exec puma -C config/puma.rb -w 8 --preload +CMD bundle exec puma -C config/puma.rb From 05ad8ef053aa57109615dfd1c162fd472dbdcb85 Mon Sep 17 00:00:00 2001 From: Marc Scholten Date: Mon, 17 Mar 2025 13:32:20 -0700 Subject: [PATCH 1272/1766] ihp: update to v1.3.1 (#9594) * ihp: update to v1.3.1 * ihp: use specific nixpkgs commit to avoid out of memory on github actions --- frameworks/Haskell/ihp/ihp.dockerfile | 10 +- frameworks/Haskell/ihp/src/.envrc | 16 + frameworks/Haskell/ihp/src/.ghci | 7 +- frameworks/Haskell/ihp/src/.gitignore | 6 +- frameworks/Haskell/ihp/src/Makefile | 10 +- frameworks/Haskell/ihp/src/default.nix | 21 - frameworks/Haskell/ihp/src/flake.lock | 1247 ++++++++++++++++++++++++ frameworks/Haskell/ihp/src/flake.nix | 37 + frameworks/Haskell/ihp/src/start | 17 - 9 files changed, 1316 insertions(+), 55 deletions(-) create mode 100644 frameworks/Haskell/ihp/src/.envrc delete mode 100644 frameworks/Haskell/ihp/src/default.nix create mode 100644 frameworks/Haskell/ihp/src/flake.lock create mode 100644 frameworks/Haskell/ihp/src/flake.nix delete mode 100755 frameworks/Haskell/ihp/src/start diff --git a/frameworks/Haskell/ihp/ihp.dockerfile b/frameworks/Haskell/ihp/ihp.dockerfile index cc1f35a428c..f01fa42dd2f 100644 --- a/frameworks/Haskell/ihp/ihp.dockerfile +++ b/frameworks/Haskell/ihp/ihp.dockerfile @@ -1,14 +1,14 @@ FROM nixos/nix -COPY ./src /ihp -WORKDIR /ihp - # Add build dependencies -RUN nix-env -i cachix +RUN nix-env -f https://github.com/NixOS/nixpkgs/archive/54b4bb956f9891b872904abdb632cea85a033ff2.tar.gz -iA cachix RUN cachix use digitallyinduced +COPY ./src /ihp +WORKDIR /ihp + # Build -RUN nix-build -j auto --cores 0 +RUN nix --extra-experimental-features "nix-command flakes" build -j auto --cores 0 .#optimized-prod-server # Setup ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world diff --git a/frameworks/Haskell/ihp/src/.envrc b/frameworks/Haskell/ihp/src/.envrc new file mode 100644 index 00000000000..33b7d186799 --- /dev/null +++ b/frameworks/Haskell/ihp/src/.envrc @@ -0,0 +1,16 @@ +if ! has nix_direnv_version || ! nix_direnv_version 2.3.0; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.3.0/direnvrc" "sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8=" +fi + +use flake . --impure --accept-flake-config + +# Include .env file if it exists locally. Use the .env file to load env vars that you don't want to commit to git +if [ -f .env ] +then + set -o allexport + source .env + set +o allexport +fi +# Add your env vars here +# +# E.g. export AWS_ACCESS_KEY_ID="XXXXX" \ No newline at end of file diff --git a/frameworks/Haskell/ihp/src/.ghci b/frameworks/Haskell/ihp/src/.ghci index aceca281d6c..48ee12a2ed3 100644 --- a/frameworks/Haskell/ihp/src/.ghci +++ b/frameworks/Haskell/ihp/src/.ghci @@ -1,3 +1,4 @@ -import Prelude -:def source readFile -:source build/ihp-lib/applicationGhciConfig +:set -XNoImplicitPrelude +:def loadFromIHP \file -> (System.Environment.getEnv "IHP_LIB") >>= (\ihpLib -> readFile (ihpLib <> "/" <> file)) +:loadFromIHP applicationGhciConfig +import IHP.Prelude \ No newline at end of file diff --git a/frameworks/Haskell/ihp/src/.gitignore b/frameworks/Haskell/ihp/src/.gitignore index d27ddd2281d..6bb8d1fba18 100644 --- a/frameworks/Haskell/ihp/src/.gitignore +++ b/frameworks/Haskell/ihp/src/.gitignore @@ -1,5 +1,4 @@ .DS_Store -.envrc .idea tmp result @@ -17,3 +16,8 @@ gen del static/prod.* Config/client_session_key.aes + +.devenv* +devenv.local.nix +.direnv +.env \ No newline at end of file diff --git a/frameworks/Haskell/ihp/src/Makefile b/frameworks/Haskell/ihp/src/Makefile index eb103029c90..4482e99a6c6 100644 --- a/frameworks/Haskell/ihp/src/Makefile +++ b/frameworks/Haskell/ihp/src/Makefile @@ -1,11 +1,3 @@ -ifneq ($(wildcard IHP/.*),) -IHP = IHP/lib/IHP -else -IHP = $(shell dirname $$(which RunDevServer))/../lib/IHP -endif - -include ${IHP}/Makefile.dist - CSS_FILES += ${IHP}/static/vendor/bootstrap.min.css CSS_FILES += ${IHP}/static/vendor/flatpickr.min.css @@ -19,3 +11,5 @@ JS_FILES += ${IHP}/static/vendor/morphdom-umd.min.js JS_FILES += ${IHP}/static/vendor/turbolinks.js JS_FILES += ${IHP}/static/vendor/turbolinksInstantClick.js JS_FILES += ${IHP}/static/vendor/turbolinksMorphdom.js + +include ${IHP}/Makefile.dist \ No newline at end of file diff --git a/frameworks/Haskell/ihp/src/default.nix b/frameworks/Haskell/ihp/src/default.nix deleted file mode 100644 index 1bf1062066e..00000000000 --- a/frameworks/Haskell/ihp/src/default.nix +++ /dev/null @@ -1,21 +0,0 @@ -let - ihp = builtins.fetchGit { - url = "https://github.com/digitallyinduced/ihp.git"; - ref = "refs/tags/v1.0.1"; - }; - haskellEnv = import "${ihp}/NixSupport/default.nix" { - ihp = ihp; - haskellDeps = p: with p; [ - base - wai - text - p.ihp - ]; - otherDeps = p: with p; [ - # Native dependencies, e.g. imagemagick - ]; - projectPath = ./.; - optimized = true; - }; -in - haskellEnv diff --git a/frameworks/Haskell/ihp/src/flake.lock b/frameworks/Haskell/ihp/src/flake.lock new file mode 100644 index 00000000000..8529cf94aae --- /dev/null +++ b/frameworks/Haskell/ihp/src/flake.lock @@ -0,0 +1,1247 @@ +{ + "nodes": { + "cachix": { + "inputs": { + "devenv": "devenv_2", + "flake-compat": [ + "ihp", + "devenv", + "flake-compat" + ], + "nixpkgs": [ + "ihp", + "devenv", + "nixpkgs" + ], + "pre-commit-hooks": [ + "ihp", + "devenv", + "pre-commit-hooks" + ] + }, + "locked": { + "lastModified": 1712055811, + "narHash": "sha256-7FcfMm5A/f02yyzuavJe06zLa9hcMHsagE28ADcmQvk=", + "owner": "cachix", + "repo": "cachix", + "rev": "02e38da89851ec7fec3356a5c04bc8349cae0e30", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "cachix", + "type": "github" + } + }, + "devenv": { + "inputs": { + "cachix": "cachix", + "flake-compat": "flake-compat_2", + "nix": "nix_2", + "nixpkgs": [ + "ihp", + "nixpkgs" + ], + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1714390914, + "narHash": "sha256-W5DFIifCjGYJXJzLU3RpqBeqes4zrf0Sr/6rwzTygPU=", + "owner": "cachix", + "repo": "devenv", + "rev": "34e6461fd76b5f51ad5f8214f5cf22c4cd7a196e", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "refs/tags/v1.0.5", + "repo": "devenv", + "type": "github" + } + }, + "devenv_2": { + "inputs": { + "flake-compat": [ + "ihp", + "devenv", + "cachix", + "flake-compat" + ], + "nix": "nix", + "nixpkgs": "nixpkgs", + "poetry2nix": "poetry2nix", + "pre-commit-hooks": [ + "ihp", + "devenv", + "cachix", + "pre-commit-hooks" + ] + }, + "locked": { + "lastModified": 1708704632, + "narHash": "sha256-w+dOIW60FKMaHI1q5714CSibk99JfYxm0CzTinYWr+Q=", + "owner": "cachix", + "repo": "devenv", + "rev": "2ee4450b0f4b95a1b90f2eb5ffea98b90e48c196", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "python-rewrite", + "repo": "devenv", + "type": "github" + } + }, + "devenv_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "nix": "nix_3", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "nixpkgs" + ], + "pre-commit-hooks": "pre-commit-hooks_2" + }, + "locked": { + "lastModified": 1694422554, + "narHash": "sha256-s5NTPzT66yIMmau+ZGP7q9z4NjgceDETL4xZ6HJ/TBg=", + "owner": "cachix", + "repo": "devenv", + "rev": "63d20fe09aa09060ea9ec9bb6d582c025402ba15", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "devenv_4": { + "inputs": { + "flake-compat": "flake-compat_4", + "nix": "nix_4", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "nixpkgs" + ], + "pre-commit-hooks": "pre-commit-hooks_3" + }, + "locked": { + "lastModified": 1686054274, + "narHash": "sha256-93aebyN7EMmeFFXisFIvp28UEbrozu79vd3pKPjvNR0=", + "owner": "cachix", + "repo": "devenv", + "rev": "c51a56bac8853c019241fe8d821c0a0d82422835", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "ihp", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1714641030, + "narHash": "sha256-yzcRNDoyVP7+SCNX0wmuDju1NUCt8Dz9+lyUXEI0dbI=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "e5d10a24b66c3ea8f150e47dfdb0416ab7c3390e", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1693611461, + "narHash": "sha256-aPODl8vAgGQ0ZYFIRisxYG5MOGSkIczvu2Cd8Gb9+1Y=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "7f53fdb7bdc5bb237da7fefef12d099e4fd611ca", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1685662779, + "narHash": "sha256-cKDDciXGpMEjP1n6HlzKinN0H+oLmNpgeCTzYnsA2po=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "71fb97f0d875fd4de4994dfb849f2c75e17eb6c3", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1685518550, + "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "ihp", + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "gitignore_3": { + "inputs": { + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "ihp": { + "inputs": { + "devenv": "devenv", + "flake-parts": "flake-parts", + "ihp-boilerplate": "ihp-boilerplate", + "nix-filter": "nix-filter_2", + "nixpkgs": "nixpkgs_4", + "systems": "systems_6" + }, + "locked": { + "lastModified": 1739859908, + "narHash": "sha256-UjXDYUmRpUbx9xNi6gA+dh4HDEvB67TvHovm79SRKHE=", + "owner": "digitallyinduced", + "repo": "ihp", + "rev": "4df99962603bf53514d5a645ccc5a596e8c57243", + "type": "github" + }, + "original": { + "owner": "digitallyinduced", + "ref": "v1.3.1", + "repo": "ihp", + "type": "github" + } + }, + "ihp-boilerplate": { + "inputs": { + "devenv": [ + "ihp", + "ihp-boilerplate", + "ihp", + "devenv" + ], + "flake-parts": [ + "ihp", + "ihp-boilerplate", + "ihp", + "flake-parts" + ], + "ihp": "ihp_2", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "nixpkgs" + ], + "systems": [ + "ihp", + "ihp-boilerplate", + "ihp", + "systems" + ] + }, + "locked": { + "lastModified": 1710175252, + "narHash": "sha256-QIFqo64U69uUGJ7pgBr37T3yAKK0n1ueqagKmnm+XWw=", + "owner": "digitallyinduced", + "repo": "ihp-boilerplate", + "rev": "323591d6135f7a89b5b4e518d5d420cd5b046fe2", + "type": "github" + }, + "original": { + "owner": "digitallyinduced", + "repo": "ihp-boilerplate", + "type": "github" + } + }, + "ihp-boilerplate_2": { + "inputs": { + "devenv": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "devenv" + ], + "flake-parts": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "flake-parts" + ], + "ihp": "ihp_3", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "nixpkgs" + ], + "systems": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "systems" + ] + }, + "locked": { + "lastModified": 1689954789, + "narHash": "sha256-RsgD1YGSlx+K/GkTspOdg/tz47PyZZDc66PzfFZvqBk=", + "owner": "digitallyinduced", + "repo": "ihp-boilerplate", + "rev": "832d1a5aed4dc3625486c82b06a1d07024267680", + "type": "github" + }, + "original": { + "owner": "digitallyinduced", + "repo": "ihp-boilerplate", + "type": "github" + } + }, + "ihp-boilerplate_3": { + "flake": false, + "locked": { + "lastModified": 1686165507, + "narHash": "sha256-ZaP8GfqjZDnMayPcvWxEqnZmRs4ixf5O5d1Ba867m4c=", + "owner": "digitallyinduced", + "repo": "ihp-boilerplate", + "rev": "ff63ce46b6fb68f1b8b3cdb0bdd6749f7ef1df93", + "type": "github" + }, + "original": { + "owner": "digitallyinduced", + "ref": "nicolas/flake", + "repo": "ihp-boilerplate", + "type": "github" + } + }, + "ihp_2": { + "inputs": { + "devenv": "devenv_3", + "flake-parts": "flake-parts_2", + "ihp-boilerplate": "ihp-boilerplate_2", + "nix-filter": "nix-filter", + "nixpkgs": "nixpkgs_3", + "systems": "systems_5" + }, + "locked": { + "lastModified": 1700013490, + "narHash": "sha256-oQz7ZBrHe6WwYMwnxxUgnYM55CuH5Oxjz6mrLnYbB7U=", + "owner": "digitallyinduced", + "repo": "ihp", + "rev": "d59a65d71943cb506eee3ad6255f017963237359", + "type": "github" + }, + "original": { + "owner": "digitallyinduced", + "ref": "v1.2", + "repo": "ihp", + "type": "github" + } + }, + "ihp_3": { + "inputs": { + "devenv": "devenv_4", + "flake-parts": "flake-parts_3", + "ihp-boilerplate": "ihp-boilerplate_3", + "nixpkgs": "nixpkgs_2", + "systems": "systems_4" + }, + "locked": { + "lastModified": 1689949405, + "narHash": "sha256-o0ZSDaDFgwbXqozHfcXKxW4FeF7JqaGprAh6r7NhvhE=", + "owner": "digitallyinduced", + "repo": "ihp", + "rev": "e6c6eaf1d089423a03e586cd25d1eda39f5a6b11", + "type": "github" + }, + "original": { + "owner": "digitallyinduced", + "ref": "v1.1", + "repo": "ihp", + "type": "github" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_2": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "nix": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": [ + "ihp", + "devenv", + "cachix", + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", + "owner": "domenkozar", + "repo": "nix", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.21", + "repo": "nix", + "type": "github" + } + }, + "nix-filter": { + "locked": { + "lastModified": 1694434370, + "narHash": "sha256-7yfdTR4mCvWZ39Q6HUcsa18tr0mg+fJZSaHE/63rwoo=", + "owner": "numtide", + "repo": "nix-filter", + "rev": "d6381c442f79f2f1fdfde00521c3d15d6c21218e", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nix-filter", + "type": "github" + } + }, + "nix-filter_2": { + "locked": { + "lastModified": 1710156097, + "narHash": "sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj+rL8sRQsSM=", + "owner": "numtide", + "repo": "nix-filter", + "rev": "3342559a24e85fc164b295c3444e8a139924675b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nix-filter", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "ihp", + "devenv", + "cachix", + "devenv", + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nix_2": { + "inputs": { + "flake-compat": [ + "ihp", + "devenv", + "flake-compat" + ], + "nixpkgs": [ + "ihp", + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression_2" + }, + "locked": { + "lastModified": 1718382440, + "narHash": "sha256-aUqR+pxqKTKLtj8HAI5sbdT6C1VgtHDcrKjmn+wWkXQ=", + "owner": "domenkozar", + "repo": "nix", + "rev": "31b9700169d9bba693c379d59d587cd20bf115a6", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.21", + "repo": "nix", + "type": "github" + } + }, + "nix_3": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression_3" + }, + "locked": { + "lastModified": 1676545802, + "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "owner": "domenkozar", + "repo": "nix", + "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "relaxed-flakes", + "repo": "nix", + "type": "github" + } + }, + "nix_4": { + "inputs": { + "lowdown-src": "lowdown-src_2", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression_4" + }, + "locked": { + "lastModified": 1676545802, + "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "owner": "domenkozar", + "repo": "nix", + "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "relaxed-flakes", + "repo": "nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1692808169, + "narHash": "sha256-x9Opq06rIiwdwGeK2Ykj69dNc2IvUH1fY55Wm7atwrE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9201b5ff357e781bf014d0330d18555695df7ba8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1693471703, + "narHash": "sha256-0l03ZBL8P1P6z8MaSDS/MvuU8E75rVxe5eE1N6gxeTo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e52e76b70d5508f3cec70b882a29199f4d1ee85", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-regression_2": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-regression_3": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-regression_4": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1710695816, + "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "614b4613980a522ba49f0d194531beddbb7220d3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_2": { + "locked": { + "lastModified": 1685801374, + "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_3": { + "locked": { + "lastModified": 1678872516, + "narHash": "sha256-/E1YwtMtFAu2KUQKV/1+KFuReYPANM2Rzehk84VxVoc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9b8e5abb18324c7fe9f07cb100c3cd4a29cda8b8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1681488673, + "narHash": "sha256-PmojOyePBNvbY3snYE7NAQHTLB53t7Ro+pgiJ4wPCuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a95ed9fe764c3ba2bf2d2fa223012c379cd6b32e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a95ed9fe764c3ba2bf2d2fa223012c379cd6b32e", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1696291921, + "narHash": "sha256-isKgVAoUxuxYEuO3Q4xhbfKcZrF/+UkJtOTv0eb/W5E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ea0284a3da391822909be5e98a60c1e62572a7dc", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ea0284a3da391822909be5e98a60c1e62572a7dc", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1714864423, + "narHash": "sha256-Wx3Y6arRJD1pd3c8SnD7dfW7KWuCr/r248P/5XLaMdM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "54b4bb956f9891b872904abdb632cea85a033ff2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "54b4bb956f9891b872904abdb632cea85a033ff2", + "type": "github" + } + }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "ihp", + "devenv", + "cachix", + "devenv", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1692876271, + "narHash": "sha256-IXfZEkI0Mal5y1jr6IRWMqK8GW2/f28xJenZIPQqkY0=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "d5006be9c2c2417dafb2e2e5034d83fabd207ee3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": [ + "ihp", + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils_2", + "gitignore": "gitignore", + "nixpkgs": [ + "ihp", + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1713775815, + "narHash": "sha256-Wu9cdYTnGQQwtT20QQMg7jzkANKQjwBD9iccfGKkfls=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "2ac4dcbf55ed43f3be0bae15e181f08a57af24a4", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "pre-commit-hooks_2": { + "inputs": { + "flake-compat": [ + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils_3", + "gitignore": "gitignore_2", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable_2" + }, + "locked": { + "lastModified": 1688056373, + "narHash": "sha256-2+SDlNRTKsgo3LBRiMUcoEUb6sDViRNQhzJquZ4koOI=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "5843cf069272d92b60c3ed9e55b7a8989c01d4c7", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "pre-commit-hooks_3": { + "inputs": { + "flake-compat": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils_4", + "gitignore": "gitignore_3", + "nixpkgs": [ + "ihp", + "ihp-boilerplate", + "ihp", + "ihp-boilerplate", + "ihp", + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable_3" + }, + "locked": { + "lastModified": 1682596858, + "narHash": "sha256-Hf9XVpqaGqe/4oDGr30W8HlsWvJXtMsEPHDqHZA6dDg=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "fb58866e20af98779017134319b5663b8215d912", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": [ + "ihp", + "devenv" + ], + "flake-parts": [ + "ihp", + "flake-parts" + ], + "ihp": "ihp", + "nixpkgs": [ + "ihp", + "nixpkgs" + ], + "systems": [ + "ihp", + "systems" + ] + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_5": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_6": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/frameworks/Haskell/ihp/src/flake.nix b/frameworks/Haskell/ihp/src/flake.nix new file mode 100644 index 00000000000..90f42b47ce8 --- /dev/null +++ b/frameworks/Haskell/ihp/src/flake.nix @@ -0,0 +1,37 @@ +{ + inputs = { + # Here you can adjust the IHP version of your project + # You can find new releases at https://github.com/digitallyinduced/ihp/releases + ihp.url = "github:digitallyinduced/ihp/v1.3.1"; + nixpkgs.follows = "ihp/nixpkgs"; + flake-parts.follows = "ihp/flake-parts"; + devenv.follows = "ihp/devenv"; + systems.follows = "ihp/systems"; + }; + + outputs = inputs@{ ihp, flake-parts, systems, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + + systems = import systems; + imports = [ ihp.flakeModules.default ]; + + perSystem = { pkgs, ... }: { + ihp = { + enable = true; + projectPath = ./.; + packages = with pkgs; [ + # Native dependencies, e.g. imagemagick + ]; + haskellPackages = p: with p; [ + # Haskell dependencies go here + p.ihp + cabal-install + base + wai + text + ]; + }; + }; + + }; +} \ No newline at end of file diff --git a/frameworks/Haskell/ihp/src/start b/frameworks/Haskell/ihp/src/start deleted file mode 100755 index a5642231608..00000000000 --- a/frameworks/Haskell/ihp/src/start +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# Script to start the local dev server - -set -e - -# Unless the RunDevServer binary is available, we rebuild the .envrc cache with nix-shell -# and config cachix for using our binary cache -command -v RunDevServer >/dev/null 2>&1 \ - || { echo "PATH_add $(nix-shell -j auto --cores 0 --run 'printf %q $PATH')" > .envrc; } - -# Now we have to load the PATH variable from the .envrc cache -direnv allow -eval "$(direnv hook bash)" -eval "$(direnv export bash)" - -# Finally start the dev server -RunDevServer From feca8319c5d4ca3ecf335968efaea9efec7c753e Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Tue, 18 Mar 2025 15:21:51 +0000 Subject: [PATCH 1273/1766] Upgrade aiohttp (#9348) * Upgrade aiohttp * Update aiohttp.dockerfile * Update aiohttp-pg-raw.dockerfile * Update aiohttp-pg-raw.dockerfile * Update main.py * Update models.py * Update frameworks/Python/aiohttp/requirements.txt * Update models.py * Update aiohttp.dockerfile * Update aiohttp-pg-raw.dockerfile * Update requirements.txt * Update requirements.txt * Update requirements.txt * Update aiohttp-pg-raw.dockerfile * Update aiohttp.dockerfile * Update main.py * Update requirements.txt * Update aiohttp-pg-raw.dockerfile * Update aiohttp.dockerfile --- .../Python/aiohttp/aiohttp-pg-raw.dockerfile | 6 +++--- frameworks/Python/aiohttp/aiohttp.dockerfile | 6 +++--- frameworks/Python/aiohttp/app/main.py | 16 +++++++++------- frameworks/Python/aiohttp/app/models.py | 14 +++++++------- frameworks/Python/aiohttp/requirements.txt | 17 ++++++++--------- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/frameworks/Python/aiohttp/aiohttp-pg-raw.dockerfile b/frameworks/Python/aiohttp/aiohttp-pg-raw.dockerfile index ddcb349006a..f6dda6f5ef5 100644 --- a/frameworks/Python/aiohttp/aiohttp-pg-raw.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp-pg-raw.dockerfile @@ -1,14 +1,14 @@ -FROM python:3.8 +FROM python:3.13 ADD ./ /aiohttp WORKDIR aiohttp -RUN pip3 install cython==0.29.23 && \ +RUN pip3 install cython==3.0.11 && \ pip3 install -r /aiohttp/requirements.txt ENV CONNECTION=RAW EXPOSE 8080 -CMD gunicorn app.gunicorn:app -c gunicorn_conf.py +CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py diff --git a/frameworks/Python/aiohttp/aiohttp.dockerfile b/frameworks/Python/aiohttp/aiohttp.dockerfile index b817ec61264..fe1648e3ff4 100644 --- a/frameworks/Python/aiohttp/aiohttp.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp.dockerfile @@ -1,14 +1,14 @@ -FROM python:3.8 +FROM python:3.13 ADD ./ /aiohttp WORKDIR aiohttp -RUN pip3 install cython==0.29.23 && \ +RUN pip3 install cython==3.0.11 && \ pip3 install -r /aiohttp/requirements.txt WORKDIR /aiohttp EXPOSE 8080 -CMD gunicorn app.gunicorn:app -c gunicorn_conf.py +CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py diff --git a/frameworks/Python/aiohttp/app/main.py b/frameworks/Python/aiohttp/app/main.py index 087bd39f56d..30680138c33 100644 --- a/frameworks/Python/aiohttp/app/main.py +++ b/frameworks/Python/aiohttp/app/main.py @@ -4,8 +4,7 @@ import asyncpg from aiohttp import web from sqlalchemy.engine.url import URL -from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine -from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine from .views import ( json, @@ -28,14 +27,15 @@ def pg_dsn(dialect=None) -> str: """ :return: DSN url suitable for sqlalchemy and aiopg. """ - return str(URL.create( + url = URL.create( database='hello_world', password=os.getenv('PGPASS', 'benchmarkdbpass'), host='tfb-database', port='5432', username=os.getenv('PGUSER', 'benchmarkdbuser'), drivername='postgresql+{}'.format(dialect) if dialect else 'postgresql', - )) + ) + return url.render_as_string(hide_password=False) async def db_ctx(app: web.Application): @@ -48,15 +48,17 @@ async def db_ctx(app: web.Application): print(f'connection pool: min size: {min_size}, max size: {max_size}, orm: {CONNECTION_ORM}') if CONNECTION_ORM: dsn = pg_dsn('asyncpg') - engine = create_async_engine(dsn, future=True, pool_size=max_size) - app['db_session'] = sessionmaker(engine, class_=AsyncSession) + engine = create_async_engine(dsn, pool_size=max_size) + app['db_session'] = async_sessionmaker(engine) else: dsn = pg_dsn() app['pg'] = await asyncpg.create_pool(dsn=dsn, min_size=min_size, max_size=max_size, loop=app.loop) yield - if not CONNECTION_ORM: + if CONNECTION_ORM: + await app['db_session'].dispose() + else: await app['pg'].close() diff --git a/frameworks/Python/aiohttp/app/models.py b/frameworks/Python/aiohttp/app/models.py index 69f9f3858a1..c614124cbe4 100644 --- a/frameworks/Python/aiohttp/app/models.py +++ b/frameworks/Python/aiohttp/app/models.py @@ -1,20 +1,20 @@ -from sqlalchemy import Column, Integer, String -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column -Base = declarative_base() +class Base(DeclarativeBase): + """Base for models.""" class World(Base): __tablename__ = 'world' - id = Column(Integer, primary_key=True) - randomnumber = Column(Integer) + id: Mapped[int] = mapped_column(primary_key=True) + randomnumber: Mapped[int] sa_worlds = World.__table__ class Fortune(Base): __tablename__ = 'fortune' - id = Column(Integer, primary_key=True) - message = Column(String) + id: Mapped[int] = mapped_column(primary_key=True) + message: Mapped[str] sa_fortunes = Fortune.__table__ diff --git a/frameworks/Python/aiohttp/requirements.txt b/frameworks/Python/aiohttp/requirements.txt index 444a284f816..82efc712810 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,9 +1,8 @@ -aiohttp==3.10.2 -asyncpg==0.25.0 -cchardet==2.1.7 -gunicorn==20.1 -jinja2==3.1.4 -psycopg2==2.9.2 -SQLAlchemy==1.4.29 -ujson==5.4.0 -uvloop==0.16 +aiohttp==3.11.14 +asyncpg==0.30.0 +gunicorn==23.0.0 +jinja2==3.1.5 +psycopg2==2.9.10 +SQLAlchemy==2.0.39 +ujson==5.10.0 +uvloop==0.21.0 From f7401a5935e6c5ba11aaec64b7b814e06b738ae5 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 18 Mar 2025 16:22:35 +0100 Subject: [PATCH 1274/1766] [ruby/hanami] Update to Hanami 2.2 (#9685) Move setting headers to application action. Use repo's for database operations. --- frameworks/Ruby/hanami/Gemfile | 9 +- frameworks/Ruby/hanami/Gemfile.lock | 96 ++++++++++--------- frameworks/Ruby/hanami/Procfile.dev | 2 + frameworks/Ruby/hanami/app/action.rb | 8 ++ .../Ruby/hanami/app/actions/db/index.rb | 9 +- .../Ruby/hanami/app/actions/json/index.rb | 2 - .../hanami/app/actions/plaintext/index.rb | 2 - .../Ruby/hanami/app/actions/queries/index.rb | 8 +- .../Ruby/hanami/app/actions/updates/index.rb | 12 +-- frameworks/Ruby/hanami/app/db/relation.rb | 10 ++ frameworks/Ruby/hanami/app/db/repo.rb | 10 ++ frameworks/Ruby/hanami/app/db/struct.rb | 10 ++ frameworks/Ruby/hanami/app/relations/.keep | 0 .../Ruby/hanami/app/relations/worlds.rb | 7 ++ frameworks/Ruby/hanami/app/repos/.keep | 0 .../Ruby/hanami/app/repos/world_repo.rb | 27 ++++++ frameworks/Ruby/hanami/app/structs/.keep | 0 .../hanami/app/templates/layouts/app.html.erb | 11 +++ frameworks/Ruby/hanami/app/view.rb | 9 ++ .../hanami/config/providers/persistence.rb | 32 ------- .../persistence/relations/world.rb | 9 -- 21 files changed, 158 insertions(+), 115 deletions(-) create mode 100644 frameworks/Ruby/hanami/Procfile.dev create mode 100644 frameworks/Ruby/hanami/app/db/relation.rb create mode 100644 frameworks/Ruby/hanami/app/db/repo.rb create mode 100644 frameworks/Ruby/hanami/app/db/struct.rb create mode 100644 frameworks/Ruby/hanami/app/relations/.keep create mode 100644 frameworks/Ruby/hanami/app/relations/worlds.rb create mode 100644 frameworks/Ruby/hanami/app/repos/.keep create mode 100644 frameworks/Ruby/hanami/app/repos/world_repo.rb create mode 100644 frameworks/Ruby/hanami/app/structs/.keep create mode 100644 frameworks/Ruby/hanami/app/templates/layouts/app.html.erb create mode 100644 frameworks/Ruby/hanami/app/view.rb delete mode 100644 frameworks/Ruby/hanami/config/providers/persistence.rb delete mode 100644 frameworks/Ruby/hanami/lib/hello_world/persistence/relations/world.rb diff --git a/frameworks/Ruby/hanami/Gemfile b/frameworks/Ruby/hanami/Gemfile index d1d45e22f87..ebc633433f4 100644 --- a/frameworks/Ruby/hanami/Gemfile +++ b/frameworks/Ruby/hanami/Gemfile @@ -2,10 +2,11 @@ source "https://rubygems.org" -gem "hanami", "~> 2.0" -gem "hanami-router", "~> 2.0" -gem "hanami-controller", "~> 2.0" -gem "hanami-validations", "~> 2.0" +gem "hanami", "~> 2.2" +gem "hanami-router", "~> 2.2" +gem "hanami-controller", "~> 2.2" +gem "hanami-db", "~> 2.2" +gem "hanami-validations", "~> 2.2" gem "dry-types", "~> 1.0", ">= 1.6.1" gem "puma" diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index 36b859fb018..09111dda2dc 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -2,7 +2,7 @@ GEM remote: https://rubygems.org/ specs: bigdecimal (3.1.9) - concurrent-ruby (1.3.4) + concurrent-ruby (1.3.5) dry-auto_inject (1.1.0) dry-core (~> 1.1) zeitwerk (~> 2.6) @@ -30,38 +30,38 @@ GEM dry-configurable (~> 1.0, < 2) dry-core (~> 1.0, < 2) dry-events (~> 1.0, < 2) - dry-schema (1.13.4) + dry-schema (1.14.1) concurrent-ruby (~> 1.0) dry-configurable (~> 1.0, >= 1.0.1) - dry-core (~> 1.0, < 2) - dry-initializer (~> 3.0) - dry-logic (>= 1.4, < 2) - dry-types (>= 1.7, < 2) - zeitwerk (~> 2.6) - dry-struct (1.7.0) dry-core (~> 1.1) + dry-initializer (~> 3.2) + dry-logic (~> 1.5) dry-types (~> 1.8) + zeitwerk (~> 2.6) + dry-struct (1.8.0) + dry-core (~> 1.1) + dry-types (~> 1.8, >= 1.8.2) ice_nine (~> 0.11) zeitwerk (~> 2.6) - dry-system (1.2.0) + dry-system (1.2.2) dry-auto_inject (~> 1.1) dry-configurable (~> 1.3) dry-core (~> 1.1) dry-inflector (~> 1.1) dry-transformer (1.0.1) zeitwerk (~> 2.6) - dry-types (1.8.0) + dry-types (1.8.2) bigdecimal (~> 3.0) concurrent-ruby (~> 1.0) dry-core (~> 1.0) dry-inflector (~> 1.0) dry-logic (~> 1.4) zeitwerk (~> 2.6) - dry-validation (1.10.0) + dry-validation (1.11.1) concurrent-ruby (~> 1.0) - dry-core (~> 1.0, < 2) - dry-initializer (~> 3.0) - dry-schema (>= 1.12, < 2) + dry-core (~> 1.1) + dry-initializer (~> 3.2) + dry-schema (~> 1.14) zeitwerk (~> 2.6) hanami (2.2.1) bundler (>= 1.16, < 3) @@ -82,13 +82,17 @@ GEM dry-inflector (~> 1.0, < 2) rake (~> 13.0) zeitwerk (~> 2.6) - hanami-controller (2.1.0) + hanami-controller (2.2.0) dry-configurable (~> 1.0, < 2) dry-core (~> 1.0) - hanami-utils (~> 2.1) + hanami-utils (~> 2.2) rack (~> 2.0) zeitwerk (~> 2.6) - hanami-router (2.1.0) + hanami-db (2.2.1) + rom (~> 5.4, >= 5.4.1) + rom-sql (~> 3.7) + zeitwerk (~> 2.6) + hanami-router (2.2.0) mustermann (~> 3.0) mustermann-contrib (~> 3.0) rack (~> 2.0) @@ -96,13 +100,12 @@ GEM concurrent-ruby (~> 1.0) dry-core (~> 1.0, < 2) dry-transformer (~> 1.0, < 2) - hanami-validations (2.1.0) + hanami-validations (2.2.0) dry-validation (>= 1.10, < 2) - zeitwerk (~> 2.6.0) hansi (0.2.1) ice_nine (0.11.2) - json (2.9.1) - logger (1.6.4) + json (2.10.2) + logger (1.6.6) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) mustermann-contrib (3.0.3) @@ -110,41 +113,41 @@ GEM mustermann (= 3.0.3) nio4r (2.7.4) pg (1.5.9) - puma (6.5.0) + puma (6.6.0) nio4r (~> 2.0) - rack (2.2.9) + rack (2.2.13) rake (13.2.1) - rom (5.3.2) - rom-changeset (~> 5.3, >= 5.3.0) - rom-core (~> 5.3, >= 5.3.2) - rom-repository (~> 5.3, >= 5.3.0) - rom-changeset (5.3.0) + rom (5.4.2) + rom-changeset (~> 5.4) + rom-core (~> 5.4) + rom-repository (~> 5.4, >= 5.4.2) + rom-changeset (5.4.0) dry-core (~> 1.0) - rom-core (~> 5.3) - transproc (~> 1.0, >= 1.1.0) - rom-core (5.3.2) + rom-core (~> 5.4) + transproc (~> 1.1) + rom-core (5.4.0) concurrent-ruby (~> 1.1) dry-configurable (~> 1.0) dry-core (~> 1.0) dry-inflector (~> 1.0) - dry-initializer (~> 3.0, >= 3.0.1) + dry-initializer (~> 3.2) dry-struct (~> 1.0) dry-types (~> 1.6) - transproc (~> 1.0, >= 1.1.0) - rom-repository (5.3.0) - dry-core (~> 1.0) - dry-initializer (~> 3.0, >= 3.0.1) - rom-core (~> 5.3, >= 5.3.0) - rom-sql (3.6.5) + transproc (~> 1.1) + rom-repository (5.4.2) dry-core (~> 1.0) - dry-types (~> 1.0) - rom (~> 5.2, >= 5.2.1) + dry-initializer (~> 3.2) + rom-core (~> 5.4) + rom-sql (3.7.0) + dry-core (~> 1.1) + dry-types (~> 1.8) + rom (~> 5.4) sequel (>= 4.49) ruby2_keywords (0.0.5) - sequel (5.88.0) + sequel (5.90.0) bigdecimal transproc (1.1.1) - zeitwerk (2.6.18) + zeitwerk (2.7.2) PLATFORMS ruby @@ -152,10 +155,11 @@ PLATFORMS DEPENDENCIES dry-types (~> 1.0, >= 1.6.1) - hanami (~> 2.0) - hanami-controller (~> 2.0) - hanami-router (~> 2.0) - hanami-validations (~> 2.0) + hanami (~> 2.2) + hanami-controller (~> 2.2) + hanami-db (~> 2.2) + hanami-router (~> 2.2) + hanami-validations (~> 2.2) pg puma rake diff --git a/frameworks/Ruby/hanami/Procfile.dev b/frameworks/Ruby/hanami/Procfile.dev new file mode 100644 index 00000000000..04e92a10dc1 --- /dev/null +++ b/frameworks/Ruby/hanami/Procfile.dev @@ -0,0 +1,2 @@ +web: bundle exec hanami server +# assets: bundle exec hanami assets watch diff --git a/frameworks/Ruby/hanami/app/action.rb b/frameworks/Ruby/hanami/app/action.rb index 0771adb9298..8ef93e34f4a 100644 --- a/frameworks/Ruby/hanami/app/action.rb +++ b/frameworks/Ruby/hanami/app/action.rb @@ -5,5 +5,13 @@ module HelloWorld class Action < Hanami::Action + before :set_headers + + private + + def set_headers(*, response) + response.headers['Server'] = 'hanami' + response.headers['Date'] = Time.now.httpdate + end end end diff --git a/frameworks/Ruby/hanami/app/actions/db/index.rb b/frameworks/Ruby/hanami/app/actions/db/index.rb index 98b8ed970d8..e5efcc2f414 100644 --- a/frameworks/Ruby/hanami/app/actions/db/index.rb +++ b/frameworks/Ruby/hanami/app/actions/db/index.rb @@ -5,14 +5,13 @@ module Actions module DB class Index < HelloWorld::Action QUERY_RANGE = 1..10_000 # range of IDs in the Fortune DB - include Deps["persistence.rom"] + + include Deps["repos.world_repo"] def handle(*, response) - world = rom.relations[:World].by_pk(random_id).one - response.headers['Server'] = 'hanami' - response.headers['Date'] = Time.now.httpdate + world = world_repo.find(random_id) response.format = :json - response.body = world.to_json + response.body = world.to_h.to_json end def random_id diff --git a/frameworks/Ruby/hanami/app/actions/json/index.rb b/frameworks/Ruby/hanami/app/actions/json/index.rb index a49b641cb7c..9dd7220a45c 100644 --- a/frameworks/Ruby/hanami/app/actions/json/index.rb +++ b/frameworks/Ruby/hanami/app/actions/json/index.rb @@ -5,8 +5,6 @@ module Actions module JSON class Index < HelloWorld::Action def handle(*, response) - response.headers['Server'] = 'hanami' - response.headers['Date'] = Time.now.httpdate response.format = :json response.body = { 'message' => 'Hello, World!' }.to_json end diff --git a/frameworks/Ruby/hanami/app/actions/plaintext/index.rb b/frameworks/Ruby/hanami/app/actions/plaintext/index.rb index 62523769a66..dee41365b02 100644 --- a/frameworks/Ruby/hanami/app/actions/plaintext/index.rb +++ b/frameworks/Ruby/hanami/app/actions/plaintext/index.rb @@ -5,8 +5,6 @@ module Actions module Plaintext class Index < HelloWorld::Action def handle(*, response) - response.headers['Server'] = 'hanami' - response.headers['Date'] = Time.now.httpdate response.body = 'Hello, World!' end end diff --git a/frameworks/Ruby/hanami/app/actions/queries/index.rb b/frameworks/Ruby/hanami/app/actions/queries/index.rb index 5a1d0bd1419..d20dfc2df3a 100644 --- a/frameworks/Ruby/hanami/app/actions/queries/index.rb +++ b/frameworks/Ruby/hanami/app/actions/queries/index.rb @@ -9,16 +9,14 @@ class Index < HelloWorld::Action MIN_QUERIES = 1 # min number of records that can be retrieved MAX_QUERIES = 500 # max number of records that can be retrieved - include Deps["persistence.rom"] + include Deps["repos.world_repo"] def handle(request, response) worlds = ALL_IDS.sample(queries(request)).map do |id| - rom.relations[:World].by_pk(id).one + world_repo.find(id) end - response.headers['Server'] = 'hanami' - response.headers['Date'] = Time.now.httpdate response.format = :json - response.body = worlds.to_json + response.body = worlds.map(&:to_h).to_json end private diff --git a/frameworks/Ruby/hanami/app/actions/updates/index.rb b/frameworks/Ruby/hanami/app/actions/updates/index.rb index 54f963f7bf2..88c85a2ff60 100644 --- a/frameworks/Ruby/hanami/app/actions/updates/index.rb +++ b/frameworks/Ruby/hanami/app/actions/updates/index.rb @@ -9,20 +9,12 @@ class Index < HelloWorld::Action MIN_QUERIES = 1 # min number of records that can be retrieved MAX_QUERIES = 500 # max number of records that can be retrieved - include Deps["persistence.rom"] + include Deps["repos.world_repo"] def handle(request, response) worlds = ALL_IDS.sample(queries(request)).map do |id| - world = rom.relations[:World].by_pk(id) - world_struct = world.one - new_value = random_id - new_value = random_id while new_value == world_struct[:randomnumber] - world_struct[:randomnumber] = new_value - world.command(:update).call(randomnumber: world_struct[:randomnumber]) - world_struct + world_repo.update(id) end - response.headers['Server'] = 'hanami' - response.headers['Date'] = Time.now.httpdate response.format = :json response.body = worlds.to_json end diff --git a/frameworks/Ruby/hanami/app/db/relation.rb b/frameworks/Ruby/hanami/app/db/relation.rb new file mode 100644 index 00000000000..9ff3c56789f --- /dev/null +++ b/frameworks/Ruby/hanami/app/db/relation.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "hanami/db/relation" + +module HelloWorld + module DB + class Relation < Hanami::DB::Relation + end + end +end diff --git a/frameworks/Ruby/hanami/app/db/repo.rb b/frameworks/Ruby/hanami/app/db/repo.rb new file mode 100644 index 00000000000..586c7af94d0 --- /dev/null +++ b/frameworks/Ruby/hanami/app/db/repo.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "hanami/db/repo" + +module HelloWorld + module DB + class Repo < Hanami::DB::Repo + end + end +end diff --git a/frameworks/Ruby/hanami/app/db/struct.rb b/frameworks/Ruby/hanami/app/db/struct.rb new file mode 100644 index 00000000000..5484ea7c357 --- /dev/null +++ b/frameworks/Ruby/hanami/app/db/struct.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "hanami/db/struct" + +module HelloWorld + module DB + class Struct < Hanami::DB::Struct + end + end +end diff --git a/frameworks/Ruby/hanami/app/relations/.keep b/frameworks/Ruby/hanami/app/relations/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/Ruby/hanami/app/relations/worlds.rb b/frameworks/Ruby/hanami/app/relations/worlds.rb new file mode 100644 index 00000000000..54d982fa9bf --- /dev/null +++ b/frameworks/Ruby/hanami/app/relations/worlds.rb @@ -0,0 +1,7 @@ +module HelloWorld + module Relations + class Worlds < HelloWorld::DB::Relation + schema :World, infer: true, as: :worlds + end + end +end diff --git a/frameworks/Ruby/hanami/app/repos/.keep b/frameworks/Ruby/hanami/app/repos/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/Ruby/hanami/app/repos/world_repo.rb b/frameworks/Ruby/hanami/app/repos/world_repo.rb new file mode 100644 index 00000000000..40baa32c089 --- /dev/null +++ b/frameworks/Ruby/hanami/app/repos/world_repo.rb @@ -0,0 +1,27 @@ +module HelloWorld + module Repos + class WorldRepo < HelloWorld::DB::Repo + QUERY_RANGE = 1..10_000 # range of IDs in the Fortune DB + + def find(id) + worlds.by_pk(id).one + end + + def update(id) + world = worlds.by_pk(id) + world_hash = world.one.to_h + new_value = random_id + new_value = random_id while new_value == world_hash[:randomnumber] + world_hash[:randomnumber] = new_value + world.changeset(:update, **world_hash).commit + world_hash + end + + private + + def random_id + Random.rand(QUERY_RANGE) + end + end + end +end diff --git a/frameworks/Ruby/hanami/app/structs/.keep b/frameworks/Ruby/hanami/app/structs/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/frameworks/Ruby/hanami/app/templates/layouts/app.html.erb b/frameworks/Ruby/hanami/app/templates/layouts/app.html.erb new file mode 100644 index 00000000000..ab87e9112bd --- /dev/null +++ b/frameworks/Ruby/hanami/app/templates/layouts/app.html.erb @@ -0,0 +1,11 @@ + + + + + + Bookshelf + + + <%= yield %> + + diff --git a/frameworks/Ruby/hanami/app/view.rb b/frameworks/Ruby/hanami/app/view.rb new file mode 100644 index 00000000000..d0a4d76065d --- /dev/null +++ b/frameworks/Ruby/hanami/app/view.rb @@ -0,0 +1,9 @@ +# auto_register: false +# frozen_string_literal: true + +require "hanami/view" + +module HelloWorld + class View < Hanami::View + end +end diff --git a/frameworks/Ruby/hanami/config/providers/persistence.rb b/frameworks/Ruby/hanami/config/providers/persistence.rb deleted file mode 100644 index 0aa12ececf6..00000000000 --- a/frameworks/Ruby/hanami/config/providers/persistence.rb +++ /dev/null @@ -1,32 +0,0 @@ -Hanami.app.register_provider :persistence, namespace: true do - prepare do - require "rom" - - require_relative '../auto_tune' - num_workers, num_threads = auto_tune - - opts = { - max_connections: 3, - pool_timeout: 10 - } - config = ROM::Configuration.new(:sql, target["settings"].database_url, opts) - - register "config", config - register "db", config.gateways[:default].connection - end - - start do - config = target["persistence.config"] - - config.auto_registration( - target.root.join("lib/hello_world/persistence"), - namespace: "HelloWorld::Persistence" - ) - - register "rom", ROM.container(config) - end - - stop do - target["persistence.rom"].disconnect - end -end diff --git a/frameworks/Ruby/hanami/lib/hello_world/persistence/relations/world.rb b/frameworks/Ruby/hanami/lib/hello_world/persistence/relations/world.rb deleted file mode 100644 index 2039d0481c9..00000000000 --- a/frameworks/Ruby/hanami/lib/hello_world/persistence/relations/world.rb +++ /dev/null @@ -1,9 +0,0 @@ -module HelloWorld - module Persistence - module Relations - class World < ROM::Relation[:sql] - schema(:World, infer: true) - end - end - end -end From 864558a389768832fff1a4ab7bc4a2121e5d6fc9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 18 Mar 2025 18:19:06 +0100 Subject: [PATCH 1275/1766] [ruby/hanami] Add fortunes test (#9686) --- frameworks/Ruby/hanami/Gemfile | 1 + frameworks/Ruby/hanami/Gemfile.lock | 10 ++++++++++ .../Ruby/hanami/app/actions/fortunes/index.rb | 12 ++++++++++++ frameworks/Ruby/hanami/app/relations/fortunes.rb | 7 +++++++ frameworks/Ruby/hanami/app/repos/fortune_repo.rb | 11 +++++++++++ .../hanami/app/templates/fortunes/index.html.erb | 12 ++++++++++++ .../Ruby/hanami/app/templates/layouts/app.html.erb | 6 ++---- frameworks/Ruby/hanami/app/views/fortunes/index.rb | 14 ++++++++++++++ frameworks/Ruby/hanami/benchmark_config.json | 1 + frameworks/Ruby/hanami/config/routes.rb | 5 +++-- 10 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 frameworks/Ruby/hanami/app/actions/fortunes/index.rb create mode 100644 frameworks/Ruby/hanami/app/relations/fortunes.rb create mode 100644 frameworks/Ruby/hanami/app/repos/fortune_repo.rb create mode 100644 frameworks/Ruby/hanami/app/templates/fortunes/index.html.erb create mode 100644 frameworks/Ruby/hanami/app/views/fortunes/index.rb diff --git a/frameworks/Ruby/hanami/Gemfile b/frameworks/Ruby/hanami/Gemfile index ebc633433f4..83b7c0d287b 100644 --- a/frameworks/Ruby/hanami/Gemfile +++ b/frameworks/Ruby/hanami/Gemfile @@ -7,6 +7,7 @@ gem "hanami-router", "~> 2.2" gem "hanami-controller", "~> 2.2" gem "hanami-db", "~> 2.2" gem "hanami-validations", "~> 2.2" +gem "hanami-view", "~> 2.2" gem "dry-types", "~> 1.0", ">= 1.6.1" gem "puma" diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index 09111dda2dc..a1d3a8ff478 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -102,6 +102,13 @@ GEM dry-transformer (~> 1.0, < 2) hanami-validations (2.2.0) dry-validation (>= 1.10, < 2) + hanami-view (2.2.1) + dry-configurable (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0, < 2) + temple (~> 0.10.0, >= 0.10.2) + tilt (~> 2.3) + zeitwerk (~> 2.6) hansi (0.2.1) ice_nine (0.11.2) json (2.10.2) @@ -146,6 +153,8 @@ GEM ruby2_keywords (0.0.5) sequel (5.90.0) bigdecimal + temple (0.10.3) + tilt (2.6.0) transproc (1.1.1) zeitwerk (2.7.2) @@ -160,6 +169,7 @@ DEPENDENCIES hanami-db (~> 2.2) hanami-router (~> 2.2) hanami-validations (~> 2.2) + hanami-view (~> 2.2) pg puma rake diff --git a/frameworks/Ruby/hanami/app/actions/fortunes/index.rb b/frameworks/Ruby/hanami/app/actions/fortunes/index.rb new file mode 100644 index 00000000000..4d6bbbba502 --- /dev/null +++ b/frameworks/Ruby/hanami/app/actions/fortunes/index.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +module HelloWorld + module Actions + module Fortunes + class Index < HelloWorld::Action + def handle(*, response) + end + end + end + end +end diff --git a/frameworks/Ruby/hanami/app/relations/fortunes.rb b/frameworks/Ruby/hanami/app/relations/fortunes.rb new file mode 100644 index 00000000000..d35a05575f1 --- /dev/null +++ b/frameworks/Ruby/hanami/app/relations/fortunes.rb @@ -0,0 +1,7 @@ +module HelloWorld + module Relations + class Fortunes < HelloWorld::DB::Relation + schema :Fortune, infer: true, as: :fortunes + end + end +end diff --git a/frameworks/Ruby/hanami/app/repos/fortune_repo.rb b/frameworks/Ruby/hanami/app/repos/fortune_repo.rb new file mode 100644 index 00000000000..c356c615e91 --- /dev/null +++ b/frameworks/Ruby/hanami/app/repos/fortune_repo.rb @@ -0,0 +1,11 @@ +module HelloWorld + module Repos + class FortuneRepo < HelloWorld::DB::Repo + def all + results = fortunes.to_a.map(&:to_h) + results << { id: 0, message: 'Additional fortune added at request time.' } + results.sort_by! { |fortune| fortune[:message] } + end + end + end +end diff --git a/frameworks/Ruby/hanami/app/templates/fortunes/index.html.erb b/frameworks/Ruby/hanami/app/templates/fortunes/index.html.erb new file mode 100644 index 00000000000..eacad31aca9 --- /dev/null +++ b/frameworks/Ruby/hanami/app/templates/fortunes/index.html.erb @@ -0,0 +1,12 @@ + + + + + + <% fortunes.each do |fortune| %> + + + + + <% end %> +
      idmessage
      <%= fortune[:id] %><%= fortune[:message] %>
      diff --git a/frameworks/Ruby/hanami/app/templates/layouts/app.html.erb b/frameworks/Ruby/hanami/app/templates/layouts/app.html.erb index ab87e9112bd..2c125c136fd 100644 --- a/frameworks/Ruby/hanami/app/templates/layouts/app.html.erb +++ b/frameworks/Ruby/hanami/app/templates/layouts/app.html.erb @@ -1,9 +1,7 @@ - + - - - Bookshelf + Fortunes <%= yield %> diff --git a/frameworks/Ruby/hanami/app/views/fortunes/index.rb b/frameworks/Ruby/hanami/app/views/fortunes/index.rb new file mode 100644 index 00000000000..5eb7d500305 --- /dev/null +++ b/frameworks/Ruby/hanami/app/views/fortunes/index.rb @@ -0,0 +1,14 @@ +module HelloWorld + module Views + module Fortunes + class Index < HelloWorld::View + + include Deps["repos.fortune_repo"] + + expose :fortunes do + fortune_repo.all + end + end + end + end +end diff --git a/frameworks/Ruby/hanami/benchmark_config.json b/frameworks/Ruby/hanami/benchmark_config.json index d384577682c..1a081210b16 100644 --- a/frameworks/Ruby/hanami/benchmark_config.json +++ b/frameworks/Ruby/hanami/benchmark_config.json @@ -5,6 +5,7 @@ "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", + "fortune_url": "/fortunes", "update_url": "/updates?queries=", "plaintext_url": "/plaintext", "port": 8080, diff --git a/frameworks/Ruby/hanami/config/routes.rb b/frameworks/Ruby/hanami/config/routes.rb index d568af27c70..55f2f414845 100644 --- a/frameworks/Ruby/hanami/config/routes.rb +++ b/frameworks/Ruby/hanami/config/routes.rb @@ -2,10 +2,11 @@ module HelloWorld class Routes < Hanami::Routes - get "/db", to: "db.index" get "/json", to: "json.index" + get "/db", to: "db.index" + get "/queries", to: "queries.index" + get "/fortunes", to: "fortunes.index" get "/updates", to: "updates.index" get "/plaintext", to: "plaintext.index" - get "/queries", to: "queries.index" end end From a88f9784f1434b597c88f19cf2bd10776737d3e8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 18 Mar 2025 18:20:31 +0100 Subject: [PATCH 1276/1766] [ruby/hanami] Upgrade to Ruby 3.4 (#9688) --- frameworks/Ruby/hanami/hanami.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/hanami/hanami.dockerfile b/frameworks/Ruby/hanami/hanami.dockerfile index 09892d3f9e7..80ab2a6c31f 100644 --- a/frameworks/Ruby/hanami/hanami.dockerfile +++ b/frameworks/Ruby/hanami/hanami.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3 +FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 From d4acac67b29b7294d2ee83c59b6e826036405db7 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 18 Mar 2025 18:21:01 +0100 Subject: [PATCH 1277/1766] [ruby/grape] Update dependencies (#9689) Also increase the connection pool to 3 (similar to Rails). +-------------------------+---------+------+-----+-----+-----+--------------+ | branch_name|plaintext|update| json| db|query|weighted_score| +-------------------------+---------+------+-----+-----+-----+--------------+ | master| 19841| 10008|57534|25783|13696| 1087| |grape/update-dependencies| 22286| 10680|58089|28088|17152| 1213| +-------------------------+---------+------+-----+-----+-----+--------------+ --- frameworks/Ruby/grape/Gemfile | 7 +++---- frameworks/Ruby/grape/config.ru | 6 +++--- frameworks/Ruby/grape/config/database.yml | 2 +- frameworks/Ruby/grape/config/puma.rb | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/grape/Gemfile b/frameworks/Ruby/grape/Gemfile index 1aea70fade0..b1e9fe3b4d5 100644 --- a/frameworks/Ruby/grape/Gemfile +++ b/frameworks/Ruby/grape/Gemfile @@ -2,8 +2,7 @@ source 'https://rubygems.org' gem 'mysql2', '0.5.6' gem 'unicorn', '6.1.0' -gem 'puma', '~> 6.4' -gem 'activerecord', '~> 7.1.0', :require => 'active_record' +gem 'puma', '~> 6.5' +gem 'activerecord', '~> 8.0.0', :require => 'active_record' gem 'grape', '2.1.1' -gem 'multi_json', require: 'multi_json' -gem 'oj', '~> 3.16' +gem 'json', '~> 2.9' diff --git a/frameworks/Ruby/grape/config.ru b/frameworks/Ruby/grape/config.ru index a91b5364a11..334605c20c4 100644 --- a/frameworks/Ruby/grape/config.ru +++ b/frameworks/Ruby/grape/config.ru @@ -48,13 +48,13 @@ module Acme end get '/db' do - ActiveRecord::Base.connection_pool.with_connection do + ActiveRecord::Base.with_connection do World.find(rand1).attributes end end get '/query' do - ActiveRecord::Base.connection_pool.with_connection do + ActiveRecord::Base.with_connection do ALL_IDS.sample(bounded_queries).map do |id| World.find(id) end @@ -63,7 +63,7 @@ module Acme get '/updates' do worlds = - ActiveRecord::Base.connection_pool.with_connection do + ActiveRecord::Base.with_connection do ALL_IDS.sample(bounded_queries).map do |id| world = World.find(id) new_value = rand1 diff --git a/frameworks/Ruby/grape/config/database.yml b/frameworks/Ruby/grape/config/database.yml index 40b271b409a..9be8d7d851a 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: 2 + pool: 3 timeout: 5000 diff --git a/frameworks/Ruby/grape/config/puma.rb b/frameworks/Ruby/grape/config/puma.rb index b187587b799..1ac05407d4a 100644 --- a/frameworks/Ruby/grape/config/puma.rb +++ b/frameworks/Ruby/grape/config/puma.rb @@ -5,7 +5,7 @@ workers num_workers -threads 2, 2 +threads 3, 3 # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code From 46de0d47a80275762b1e00c01a193b429bfac56a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 18 Mar 2025 19:03:38 +0100 Subject: [PATCH 1278/1766] [ruby/hanami] Return json and plaintext from the routes. (#9687) --- .../Ruby/hanami/app/actions/json/index.rb | 14 ------------- .../hanami/app/actions/plaintext/index.rb | 13 ------------ frameworks/Ruby/hanami/config/routes.rb | 20 +++++++++++++++++-- 3 files changed, 18 insertions(+), 29 deletions(-) delete mode 100644 frameworks/Ruby/hanami/app/actions/json/index.rb delete mode 100644 frameworks/Ruby/hanami/app/actions/plaintext/index.rb diff --git a/frameworks/Ruby/hanami/app/actions/json/index.rb b/frameworks/Ruby/hanami/app/actions/json/index.rb deleted file mode 100644 index 9dd7220a45c..00000000000 --- a/frameworks/Ruby/hanami/app/actions/json/index.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module HelloWorld - module Actions - module JSON - class Index < HelloWorld::Action - def handle(*, response) - response.format = :json - response.body = { 'message' => 'Hello, World!' }.to_json - end - end - end - end -end diff --git a/frameworks/Ruby/hanami/app/actions/plaintext/index.rb b/frameworks/Ruby/hanami/app/actions/plaintext/index.rb deleted file mode 100644 index dee41365b02..00000000000 --- a/frameworks/Ruby/hanami/app/actions/plaintext/index.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module HelloWorld - module Actions - module Plaintext - class Index < HelloWorld::Action - def handle(*, response) - response.body = 'Hello, World!' - end - end - end - end -end diff --git a/frameworks/Ruby/hanami/config/routes.rb b/frameworks/Ruby/hanami/config/routes.rb index 55f2f414845..b57e5af753f 100644 --- a/frameworks/Ruby/hanami/config/routes.rb +++ b/frameworks/Ruby/hanami/config/routes.rb @@ -2,11 +2,27 @@ module HelloWorld class Routes < Hanami::Routes - get "/json", to: "json.index" + get "/json", to: ->(env) do + [200, + { + 'Server' => 'Rails', + 'Content-Type' => 'application/json', + 'Date' => Time.now.httpdate, + }, + [{ 'message' => 'Hello, World!' }.to_json]] + end get "/db", to: "db.index" get "/queries", to: "queries.index" get "/fortunes", to: "fortunes.index" get "/updates", to: "updates.index" - get "/plaintext", to: "plaintext.index" + get "/plaintext", to: ->(env) do + [200, + { + 'Server' => 'Hanami', + 'Content-Type' => 'text/plain', + 'Date' => Time.now.httpdate + }, + ['Hello, World!']] + end end end From 1b5925e0df2450679d5dec8f1dd25004e78a9544 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Wed, 19 Mar 2025 11:11:55 -1000 Subject: [PATCH 1279/1766] add logback to tio-boot (#9690) * change to for each * add logback --------- Co-authored-by: litongjava --- frameworks/Java/tio-boot/pom.xml | 7 +- .../tio/http/server/MainAppConfig.java | 39 +++++----- .../http/server/controller/CacheHandler.java | 36 ++++----- .../tio/http/server/controller/DbHandler.java | 77 ++++++++++--------- .../http/server/controller/IndexHandler.java | 22 +++--- .../tio-boot/src/main/resources/logback.xml | 41 +++++----- .../tio/http/server/MainAppTest.java | 3 +- 7 files changed, 116 insertions(+), 109 deletions(-) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index d72bc47bb04..73443cb3c08 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -27,8 +27,14 @@ com.litongjava java-db 1.5.0 +
      + + ch.qos.logback + logback-classic + 1.2.3 + junit junit @@ -36,7 +42,6 @@ test - com.alibaba.fastjson2 fastjson2 diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java index 8f9472597c1..2852e830fe4 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java @@ -15,24 +15,6 @@ public class MainAppConfig implements BootConfiguration { @Override public void config() throws Exception { - // add route - IndexHandler controller = new IndexHandler(); - - TioBootServer server = TioBootServer.me(); - HttpRequestRouter requestRouter = server.getRequestRouter(); - - requestRouter.add("/", controller::index); - requestRouter.add("/plaintext", controller::plaintext); - requestRouter.add("/json", controller::json); - - DbHandler dbQueryController = new DbHandler(); - requestRouter.add("/db", dbQueryController::db); - requestRouter.add("/queries", dbQueryController::queries); - requestRouter.add("/updates", dbQueryController::updates); - requestRouter.add("/fortunes", dbQueryController::fortunes); - - CacheHandler cacheController = new CacheHandler(); - requestRouter.add("/cachedQuery", cacheController::cachedQuery); boolean db = EnvUtils.getBoolean("db", true); if (db) { @@ -49,6 +31,25 @@ public void config() throws Exception { } catch (Exception e) { e.printStackTrace(); } - } + // add route + IndexHandler controller = new IndexHandler(); + + TioBootServer server = TioBootServer.me(); + HttpRequestRouter requestRouter = server.getRequestRouter(); + if (requestRouter != null) { + requestRouter.add("/", controller::index); + requestRouter.add("/plaintext", controller::plaintext); + requestRouter.add("/json", controller::json); + + DbHandler dbQueryController = new DbHandler(); + requestRouter.add("/db", dbQueryController::db); + requestRouter.add("/queries", dbQueryController::queries); + requestRouter.add("/updates", dbQueryController::updates); + requestRouter.add("/fortunes", dbQueryController::fortunes); + + CacheHandler cacheController = new CacheHandler(); + requestRouter.add("/cachedQuery", cacheController::cachedQuery); + } + } } diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java index d3546c09111..c0d1f9c3066 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java @@ -1,13 +1,13 @@ package com.litongjava.tio.http.server.controller; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; import com.alibaba.fastjson2.JSON; import com.litongjava.db.activerecord.Db; import com.litongjava.db.activerecord.Row; +import com.litongjava.tio.boot.http.TioRequestContext; import com.litongjava.tio.http.common.HeaderName; import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; @@ -16,26 +16,26 @@ public class CacheHandler { // private Logger log = LoggerFactory.getLogger(this.getClass()); + String sql = "SELECT id, randomNumber FROM world WHERE id = ?"; public HttpResponse cachedQuery(HttpRequest request) { String queries = request.getParam("queries"); - List> recordMaps = RandomUtils.randomWorldNumbers() - // limit - .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 - .mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象 - .filter(Objects::nonNull) // 过滤掉 null 值 - .map(Row::toMap) // 将每个 Record 对象转换为 Map - .collect(Collectors.toList()); // 收集到 List - - HttpResponse httpResponse = new HttpResponse(request); - httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); - httpResponse.setBody(JSON.toJSONBytes(recordMaps)); - return httpResponse; - } + int queryCount = RandomUtils.parseQueryCount(queries); + + List> recordMaps = new ArrayList<>(); + + int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray(); + for (int id : randomNumbers) { + Row row = Db.findFirstByCache("world", id, sql, id); + if (row != null) { + recordMaps.add(row.toMap()); + } + } - private Row findByIdWithCache(String tableName, int id) { - String sql = "SELECT id, randomNumber FROM world WHERE id = ?"; - return Db.findFirstByCache(tableName, id, sql, id); + HttpResponse response = TioRequestContext.getResponse(); + response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + response.setBody(JSON.toJSONBytes(recordMaps)); + return response; } } diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java index a7a127795ec..3ab48edeba2 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java @@ -5,8 +5,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; import com.alibaba.fastjson2.JSON; import com.jfinal.template.Engine; @@ -14,6 +12,7 @@ import com.litongjava.db.activerecord.Db; import com.litongjava.db.activerecord.Row; import com.litongjava.ehcache.EhCacheKit; +import com.litongjava.tio.boot.http.TioRequestContext; import com.litongjava.tio.http.common.HeaderName; import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; @@ -23,6 +22,10 @@ import com.litongjava.tio.http.server.utils.RandomUtils; public class DbHandler { + private Engine engine = Engine.use(); + private String filename = "fortunes.html"; + private Template template = engine.getTemplate(filename); + private static final byte[] bytes = "{}".getBytes(); public HttpResponse db(HttpRequest request) { Integer id = request.getInt("id"); @@ -31,7 +34,7 @@ public HttpResponse db(HttpRequest request) { } //System.out.println("id:" + id); - HttpResponse httpResponse = new HttpResponse(request); + HttpResponse httpResponse = TioRequestContext.getResponse(); // int id = 11; // String sql="SELECT id, randomNumber FROM world WHERE id = ?"; @@ -40,7 +43,7 @@ public HttpResponse db(HttpRequest request) { if (recored != null) { httpResponse.setBody(JSON.toJSONBytes(recored.toMap())); } else { - httpResponse.setBody("{}".getBytes()); + httpResponse.setBody(bytes); } httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); @@ -51,15 +54,19 @@ public HttpResponse db(HttpRequest request) { // @GetMapping("/queries") public HttpResponse queries(HttpRequest request) { String queries = request.getParam("queries"); - List> recordMaps = RandomUtils.randomWorldNumbers() - // limit - .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量 - .mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象 - .filter(Objects::nonNull) // 过滤掉 null 值 - .map(Row::toMap) // 将每个 Record 对象转换为 Map - .collect(Collectors.toList()); // 收集到 List + int queryCount = RandomUtils.parseQueryCount(queries); + int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray(); - HttpResponse httpResponse = new HttpResponse(request); + List> recordMaps = new ArrayList<>(); + + for (int id : randomNumbers) { + Row row = Db.findById("world", id); + if (row != null) { + recordMaps.add(row.toMap()); + } + } + + HttpResponse httpResponse = TioRequestContext.getResponse(); httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); httpResponse.setBody(JSON.toJSONBytes(recordMaps)); return httpResponse; @@ -71,27 +78,24 @@ public HttpResponse updates(HttpRequest request) { EhCacheKit.removeAll("world"); - List> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers - // limit - .limit(RandomUtils.parseQueryCount(queries)) - // map - .mapToObj(id -> Db.findById("world", id)) - // not null - .filter(Objects::nonNull).map(record -> { - int currentRandomNumber = record.getInt("randomNumber"); // "randomnumber" - int newRandomNumber; - do { - newRandomNumber = RandomUtils.randomWorldNumber(); - } while (newRandomNumber == currentRandomNumber); - - record.set("randomnumber", newRandomNumber); - Db.update("world", "id", record); // update - return record; - }) - // tomap - .map(Row::toMap) - // to List - .collect(Collectors.toList()); + int queryCount = RandomUtils.parseQueryCount(queries); + int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray(); + List> updatedRecords = new ArrayList<>(); + + for (int id : randomNumbers) { + Row row = Db.findById("world", id); + if (row != null) { + int currentRandomNumber = row.getInt("randomNumber"); // "randomnumber" + int newRandomNumber; + do { + newRandomNumber = RandomUtils.randomWorldNumber(); + } while (newRandomNumber == currentRandomNumber); + + row.set("randomnumber", newRandomNumber); + Db.update("world", "id", row); // update + updatedRecords.add(row.toMap()); + } + } HttpResponse httpResponse = new HttpResponse(request); httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); @@ -116,11 +120,8 @@ public HttpResponse fortunes(HttpRequest request) throws IllegalAccessException, viewData.put("fortunes", fortunes); // 转换为 HTML - Engine engine = Engine.use(); - String filename = "fortunes.html"; - Template template = engine.getTemplate(filename); String html = template.renderToString(viewData); - - return Resps.html(request, html); + HttpResponse httpResponse = TioRequestContext.getResponse(); + return Resps.html(httpResponse, html); } } diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java index 2b2bc4c5535..3dd0ba384b9 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java @@ -1,6 +1,7 @@ package com.litongjava.tio.http.server.controller; import com.alibaba.fastjson2.JSON; +import com.litongjava.tio.boot.http.TioRequestContext; import com.litongjava.tio.http.common.HeaderName; import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; @@ -22,19 +23,16 @@ public HttpResponse index(HttpRequest request) { } public HttpResponse plaintext(HttpRequest request) { - // 更高性能的写法 - HttpResponse ret = new HttpResponse(request); - ret.setBody(HELLO_WORLD_BYTES); - ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT); - return ret; + HttpResponse response = TioRequestContext.getResponse(); + response.setBody(HELLO_WORLD_BYTES); + response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT); + return response; } - // 在IndexController中添加 public HttpResponse json(HttpRequest request) { - // 更高性能的写法 - HttpResponse ret = new HttpResponse(request); - ret.setBody(JSON.toJSONString(new Message(HELLO_WORLD)).getBytes()); - ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); - return ret; + HttpResponse response = TioRequestContext.getResponse(); + response.setBody(JSON.toJSONBytes(new Message(HELLO_WORLD))); + response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + return response; } -} +} \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/resources/logback.xml b/frameworks/Java/tio-boot/src/main/resources/logback.xml index aff0c711191..6065c075e78 100644 --- a/frameworks/Java/tio-boot/src/main/resources/logback.xml +++ b/frameworks/Java/tio-boot/src/main/resources/logback.xml @@ -1,9 +1,13 @@ - - + + + - - + + + @@ -12,41 +16,40 @@ - + ${CONSOLE_LOG_PATTERN} - - - ${LOG_HOME}/project-name-%d{yyyy-MM-dd}.log - + + + ${LOG_HOME}/log.%d{yyyyMMddHH}.%i.log + 180 + + 100MB - - - 10MB - - - + + - + + - + - + - \ No newline at end of file + diff --git a/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java b/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java index e469fa256ef..41b724b15c4 100644 --- a/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java +++ b/frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java @@ -6,10 +6,9 @@ public class MainAppTest { - @Test + // @Test public void test() { boolean boolean1 = EnvUtils.getBoolean("native", false); System.out.println(boolean1); } - } From 9e7dd42ce9b49392c4671bd8658e57fa4fd02618 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 19 Mar 2025 22:12:11 +0100 Subject: [PATCH 1280/1766] [rails] Warmup cache before starting up (#9691) Also make sure records are always loaded from cache for cached_query. --- .../Ruby/rails/app/controllers/hello_world_controller.rb | 5 +++-- frameworks/Ruby/rails/config/application.rb | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index d4582e18c02..526d850e94c 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -21,8 +21,9 @@ def query end def cached_query - items = Rails.cache.fetch_multi(*ALL_IDS.sample(query_count)) do |id| - World.find(id).as_json + keys = ALL_IDS.sample(query_count).map { "world_#{_1}" } + items = Rails.cache.fetch_multi(*keys) do |id| + raise "Could not find World with id: #{id} in cache" end render json: items.values diff --git a/frameworks/Ruby/rails/config/application.rb b/frameworks/Ruby/rails/config/application.rb index 8f5abd7901b..19ca9a41572 100644 --- a/frameworks/Ruby/rails/config/application.rb +++ b/frameworks/Ruby/rails/config/application.rb @@ -47,5 +47,11 @@ class Application < Rails::Application config.middleware.delete Rails::Rack::Logger config.active_support.isolation_level = :fiber if defined?(Falcon) + + config.to_prepare do + HelloWorldController::ALL_IDS.each do |id| + Rails.cache.write("world_#{id}", World.find(id).as_json, expires_in: 1.day) + end + end end end From e96c213b98b63652794f507a6a7bbe9e3178a6e3 Mon Sep 17 00:00:00 2001 From: rio Date: Thu, 20 Mar 2025 06:12:29 +0900 Subject: [PATCH 1281/1766] [PHP/Codeigniter] Update PHP version 8.4 (#9408) (#9692) --- frameworks/PHP/codeigniter/codeigniter.dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/codeigniter/codeigniter.dockerfile b/frameworks/PHP/codeigniter/codeigniter.dockerfile index e04cf572ab6..097ea60514d 100644 --- a/frameworks/PHP/codeigniter/codeigniter.dockerfile +++ b/frameworks/PHP/codeigniter/codeigniter.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-intl php8.3-curl > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-intl php8.4-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/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.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /codeigniter/deploy/nginx.conf From 84c55271552017e1e3e8a47a85d48618ba9e7d68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 21:12:51 +0000 Subject: [PATCH 1282/1766] Bump ch.qos.logback:logback-classic in /frameworks/Java/tio-boot Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.2.3 to 1.2.13. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.2.3...v_1.2.13) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/tio-boot/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index 73443cb3c08..cb358e64621 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -32,7 +32,7 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.13 From a4f4da099882774c109f2133a7698aeaf021fe53 Mon Sep 17 00:00:00 2001 From: rio Date: Thu, 20 Mar 2025 06:12:57 +0900 Subject: [PATCH 1283/1766] [Python/Django] Update Python version 3.12 (#9694) --- frameworks/Python/django/benchmark_config.json | 4 ++-- .../Python/django/django-postgresql.dockerfile | 2 +- frameworks/Python/django/django.dockerfile | 2 +- frameworks/Python/django/gunicorn_conf.py | 16 ++-------------- .../Python/django/requirements-gunicorn.txt | 6 +++--- frameworks/Python/django/requirements.txt | 9 ++++----- 6 files changed, 13 insertions(+), 26 deletions(-) diff --git a/frameworks/Python/django/benchmark_config.json b/frameworks/Python/django/benchmark_config.json index 47ff6ff7135..c4e3d51a143 100644 --- a/frameworks/Python/django/benchmark_config.json +++ b/frameworks/Python/django/benchmark_config.json @@ -17,7 +17,7 @@ "flavor": "Python3", "orm": "Full", "platform": "WSGI", - "webserver": "Meinheld", + "webserver": "Gunicorn", "os": "Linux", "database_os": "Linux", "display_name": "Django", @@ -77,7 +77,7 @@ "flavor": "Python3", "orm": "Full", "platform": "WSGI", - "webserver": "Meinheld", + "webserver": "Gunicorn", "os": "Linux", "database_os": "Linux", "display_name": "Django [Postgres]", diff --git a/frameworks/Python/django/django-postgresql.dockerfile b/frameworks/Python/django/django-postgresql.dockerfile index 51870d2750d..ff554710097 100644 --- a/frameworks/Python/django/django-postgresql.dockerfile +++ b/frameworks/Python/django/django-postgresql.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9-bullseye +FROM python:3.12-bullseye ADD ./ /django diff --git a/frameworks/Python/django/django.dockerfile b/frameworks/Python/django/django.dockerfile index 261bd05fa12..a5b5182eabf 100644 --- a/frameworks/Python/django/django.dockerfile +++ b/frameworks/Python/django/django.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9-bullseye +FROM python:3.12-bullseye ADD ./ /django diff --git a/frameworks/Python/django/gunicorn_conf.py b/frameworks/Python/django/gunicorn_conf.py index 356e04d1d4a..c6848f685b7 100644 --- a/frameworks/Python/django/gunicorn_conf.py +++ b/frameworks/Python/django/gunicorn_conf.py @@ -5,7 +5,7 @@ _is_pypy = hasattr(sys, 'pypy_version_info') _is_travis = os.environ.get('TRAVIS') == 'true' -workers = int(multiprocessing.cpu_count() * 2.5) +workers = int(multiprocessing.cpu_count()) if _is_travis: workers = 2 @@ -14,16 +14,4 @@ errorlog = '-' pidfile = 'gunicorn.pid' pythonpath = 'hello' - -if _is_pypy: - worker_class = "sync" -else: - worker_class = "meinheld.gmeinheld.MeinheldWorker" - - def post_fork(server, worker): - import meinheld - import meinheld.server - import meinheld.patch - meinheld.server.set_access_logger(None) - meinheld.set_keepalive(keepalive) - meinheld.patch.patch_all() +worker_class = 'sync' \ No newline at end of file diff --git a/frameworks/Python/django/requirements-gunicorn.txt b/frameworks/Python/django/requirements-gunicorn.txt index 4dae00dbf65..7ec2e47c136 100644 --- a/frameworks/Python/django/requirements-gunicorn.txt +++ b/frameworks/Python/django/requirements-gunicorn.txt @@ -1,4 +1,4 @@ -r requirements.txt -greenlet==0.4.17 -gunicorn==20.1.0 -meinheld==1.0.2 +greenlet==3.1.1 +gunicorn==21.2.0 +gevent==24.10.2 \ No newline at end of file diff --git a/frameworks/Python/django/requirements.txt b/frameworks/Python/django/requirements.txt index d5f982d585e..c7765c2c549 100644 --- a/frameworks/Python/django/requirements.txt +++ b/frameworks/Python/django/requirements.txt @@ -1,6 +1,5 @@ Django==3.2.25 -mysqlclient==1.4.6 -psycopg2==2.9.6; implementation_name=='cpython' -psycopg2cffi==2.9.0; implementation_name=='pypy' -pytz==2020.4 -ujson==5.4.0 +mysqlclient==2.2.6 +psycopg2==2.9.9; implementation_name=='cpython' +pytz==2023.2 +ujson==5.8.0 From b44e41aaeb4132a6696ac722e251a2a54913dad8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 18:54:15 +0000 Subject: [PATCH 1284/1766] Bump github.com/redis/go-redis/v9 in /frameworks/Go/goravel/src/gin Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.5.3 to 9.5.5. - [Release notes](https://github.com/redis/go-redis/releases) - [Changelog](https://github.com/redis/go-redis/blob/master/CHANGELOG.md) - [Commits](https://github.com/redis/go-redis/compare/v9.5.3...v9.5.5) --- updated-dependencies: - dependency-name: github.com/redis/go-redis/v9 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/goravel/src/gin/go.mod | 2 +- frameworks/Go/goravel/src/gin/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/goravel/src/gin/go.mod b/frameworks/Go/goravel/src/gin/go.mod index e010a6645c6..8547a95c5d3 100644 --- a/frameworks/Go/goravel/src/gin/go.mod +++ b/frameworks/Go/goravel/src/gin/go.mod @@ -122,7 +122,7 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/pterm/pterm v0.12.79 // indirect github.com/rabbitmq/amqp091-go v1.9.0 // indirect - github.com/redis/go-redis/v9 v9.5.3 // indirect + github.com/redis/go-redis/v9 v9.5.5 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 // indirect github.com/rivo/uniseg v0.4.7 // indirect diff --git a/frameworks/Go/goravel/src/gin/go.sum b/frameworks/Go/goravel/src/gin/go.sum index fefa43c5558..8318d8ee4d8 100644 --- a/frameworks/Go/goravel/src/gin/go.sum +++ b/frameworks/Go/goravel/src/gin/go.sum @@ -566,8 +566,8 @@ github.com/rabbitmq/amqp091-go v1.9.0 h1:qrQtyzB4H8BQgEuJwhmVQqVHB9O4+MNDJCCAcpc github.com/rabbitmq/amqp091-go v1.9.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= -github.com/redis/go-redis/v9 v9.5.3 h1:fOAp1/uJG+ZtcITgZOfYFmTKPE7n4Vclj1wZFgRciUU= -github.com/redis/go-redis/v9 v9.5.3/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/redis/go-redis/v9 v9.5.5 h1:51VEyMF8eOO+NUHFm8fpg+IOc1xFuFOhxs3R+kPu1FM= +github.com/redis/go-redis/v9 v9.5.5/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= From 508fb38f4a49e9a5b886020b395966c7ce236958 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 21 Mar 2025 01:05:17 +0100 Subject: [PATCH 1285/1766] [rails] Don't use a logger (#9696) Not using a logger is faster than setting the log level to fatal. +----------------+------+-----+-----+------+-------+---------+------------+--------------+ | branch_name| json| db|query|update|fortune|plaintext|cached-query|weighted_score| +----------------+------+-----+-----+------+-------+---------+------------+--------------+ | master|152537|33415|28714| 13947| 20249| 186596| 27632| 1901| |rails/nil-logger|157689|34283|30021| 15317| 21485| 184987| 26848| 2034| +----------------+------+-----+-----+------+-------+---------+------------+--------------+ --- frameworks/Ruby/rails/config/environments/production.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rails/config/environments/production.rb b/frameworks/Ruby/rails/config/environments/production.rb index 331a2687e8f..b84b2807e96 100644 --- a/frameworks/Ruby/rails/config/environments/production.rb +++ b/frameworks/Ruby/rails/config/environments/production.rb @@ -36,7 +36,7 @@ # Log to STDOUT with the current request id as a default log tag. # config.log_tags = [ :request_id ] - config.logger = ActiveSupport::TaggedLogging.logger(STDOUT) + config.logger = nil # Change to "debug" to log everything (including potentially personally-identifiable information!) config.log_level = :fatal From 00a00a953b055883483870bbc8620452bf6c3be0 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 21 Mar 2025 18:03:55 +0100 Subject: [PATCH 1286/1766] [rust/roa] Remove Roa (#9698) Roa has been failing for more than a year: https://tfb-status.techempower.com/results/1d6a0f6b-7106-4aa1-8341-63d4bd23779f The project repo hasn't seen any updates in 3 years: https://github.com/Hexilee/roa --- frameworks/Rust/roa/.env | 1 - frameworks/Rust/roa/Cargo.toml | 46 -------- frameworks/Rust/roa/README.md | 111 ------------------ frameworks/Rust/roa/benchmark_config.json | 119 ------------------- frameworks/Rust/roa/config.toml | 86 -------------- frameworks/Rust/roa/roa-core.dockerfile | 13 --- frameworks/Rust/roa/roa-diesel.dockerfile | 13 --- frameworks/Rust/roa/roa-pg.dockerfile | 13 --- frameworks/Rust/roa/roa-sqlx.dockerfile | 13 --- frameworks/Rust/roa/roa-tokio.dockerfile | 13 --- frameworks/Rust/roa/roa.dockerfile | 13 --- frameworks/Rust/roa/rustfmt.toml | 2 - frameworks/Rust/roa/src/db_diesel.rs | 97 ---------------- frameworks/Rust/roa/src/db_pg.rs | 126 --------------------- frameworks/Rust/roa/src/db_sqlx.rs | 108 ------------------ frameworks/Rust/roa/src/endpoints.rs | 23 ---- frameworks/Rust/roa/src/main-core.rs | 44 ------- frameworks/Rust/roa/src/main-db.rs | 118 ------------------- frameworks/Rust/roa/src/main.rs | 34 ------ frameworks/Rust/roa/src/models.rs | 30 ----- frameworks/Rust/roa/src/schema.rs | 15 --- frameworks/Rust/roa/src/utils.rs | 20 ---- frameworks/Rust/roa/templates/fortune.html | 12 -- 23 files changed, 1070 deletions(-) delete mode 100644 frameworks/Rust/roa/.env delete mode 100644 frameworks/Rust/roa/Cargo.toml delete mode 100755 frameworks/Rust/roa/README.md delete mode 100755 frameworks/Rust/roa/benchmark_config.json delete mode 100644 frameworks/Rust/roa/config.toml delete mode 100644 frameworks/Rust/roa/roa-core.dockerfile delete mode 100644 frameworks/Rust/roa/roa-diesel.dockerfile delete mode 100644 frameworks/Rust/roa/roa-pg.dockerfile delete mode 100644 frameworks/Rust/roa/roa-sqlx.dockerfile delete mode 100644 frameworks/Rust/roa/roa-tokio.dockerfile delete mode 100644 frameworks/Rust/roa/roa.dockerfile delete mode 100644 frameworks/Rust/roa/rustfmt.toml delete mode 100644 frameworks/Rust/roa/src/db_diesel.rs delete mode 100644 frameworks/Rust/roa/src/db_pg.rs delete mode 100644 frameworks/Rust/roa/src/db_sqlx.rs delete mode 100644 frameworks/Rust/roa/src/endpoints.rs delete mode 100644 frameworks/Rust/roa/src/main-core.rs delete mode 100644 frameworks/Rust/roa/src/main-db.rs delete mode 100644 frameworks/Rust/roa/src/main.rs delete mode 100644 frameworks/Rust/roa/src/models.rs delete mode 100644 frameworks/Rust/roa/src/schema.rs delete mode 100644 frameworks/Rust/roa/src/utils.rs delete mode 100644 frameworks/Rust/roa/templates/fortune.html diff --git a/frameworks/Rust/roa/.env b/frameworks/Rust/roa/.env deleted file mode 100644 index 3a9b68230d3..00000000000 --- a/frameworks/Rust/roa/.env +++ /dev/null @@ -1 +0,0 @@ -DATABASE_URL="postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world" \ No newline at end of file diff --git a/frameworks/Rust/roa/Cargo.toml b/frameworks/Rust/roa/Cargo.toml deleted file mode 100644 index d65ecf208b8..00000000000 --- a/frameworks/Rust/roa/Cargo.toml +++ /dev/null @@ -1,46 +0,0 @@ -[package] -name = "roa-techempower" -version = "0.1.0" -edition = "2018" -publish = false - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "roa" -path = "src/main.rs" - -[[bin]] -name = "roa-db" -path = "src/main-db.rs" - -[[bin]] -name = "roa-core" -path = "src/main-core.rs" - -[dependencies] -roa = { version = "0.5.0", features = ["json", "template", "router"] } -roa-diesel = { version = "0.5.0", optional = true } -roa-pg = { version = "0.5.0", optional = true } -roa-tokio = { version = "0.5.0", optional = true } -async-std = { version = "1.5", features = ["attributes"] } -askama = "0.9" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -rand = { version = "0.7", features = ["small_rng"] } -bytes = "0.5.3" -futures = "0.3.4" -http = "0.2" -lazy_static = "1.4.0" -dotenv_codegen = "0.15.0" - -tokio = { version = "0.2.13", features = ["full"], optional = true } -diesel = { version = "1.4.3", features = ["postgres"], optional = true } -sqlx = { version = "0.2", features = ["postgres"], optional = true } -#hyper = "0.13" - -[features] -orm = ["diesel", "roa-diesel"] -pg = ["roa-pg"] -sqlx-pg = ["sqlx"] -tokio_rt = ["tokio", "roa-tokio"] diff --git a/frameworks/Rust/roa/README.md b/frameworks/Rust/roa/README.md deleted file mode 100755 index 4653b4c3dba..00000000000 --- a/frameworks/Rust/roa/README.md +++ /dev/null @@ -1,111 +0,0 @@ -
      -

      Roa

      -

      Roa is an async web framework inspired by koajs, lightweight but powerful.

      -

      - -[![Stable Test](https://github.com/Hexilee/roa/workflows/Stable%20Test/badge.svg)](https://github.com/Hexilee/roa/actions) -[![codecov](https://codecov.io/gh/Hexilee/roa/branch/master/graph/badge.svg)](https://codecov.io/gh/Hexilee/roa) -[![wiki](https://img.shields.io/badge/roa-wiki-purple.svg)](https://github.com/Hexilee/roa/wiki) -[![Rust Docs](https://docs.rs/roa/badge.svg)](https://docs.rs/roa) -[![Crate version](https://img.shields.io/crates/v/roa.svg)](https://crates.io/crates/roa) -[![Download](https://img.shields.io/crates/d/roa.svg)](https://crates.io/crates/roa) -[![Version](https://img.shields.io/badge/rustc-1.40+-lightgray.svg)](https://blog.rust-lang.org/2019/12/19/Rust-1.40.0.html) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/Hexilee/roa/blob/master/LICENSE) - -

      - -

      - Examples - | - Guide - | - Cookbook -

      -
      -
      - - -#### Feature highlights - -- A lightweight, solid and well extensible core. - - Supports HTTP/1.x and HTTP/2.0 protocols. - - Full streaming. - - Highly extensible middleware system. - - Based on [`hyper`](https://github.com/hyperium/hyper), runtime-independent, you can chose async runtime as you like. -- Many useful extensions. - - Official runtime schemes: - - [async-std](https://github.com/async-rs/async-std) runtime and TcpStream; - - [tokio](https://github.com/tokio-rs/tokio) runtime and TcpStream. - - Transparent content compression (br, gzip, deflate, zstd). - - Configurable and nestable router. - - Named uri parameters(query and router parameter). - - Cookie and jwt support. - - HTTPS support. - - WebSocket support. - - Asynchronous multipart form support. - - Other middlewares(logger, CORS .etc). -- Integrations - - roa-diesel, integration with [diesel](https://github.com/diesel-rs/diesel). - - roa-juniper, integration with [juniper](https://github.com/graphql-rust/juniper). - - roa-pg, integration with [tokio-postgres](https://crates.io/crates/tokio-postgres). -- Works on stable Rust. - -#### Get start - -```text -# Cargo.toml - -[dependencies] -roa = "0.5.0" -async-std = { version = "1.5", features = ["attributes"] } -``` - -```rust,no_run -use roa::App; -use roa::preload::*; -use std::error::Error as StdError; - -#[async_std::main] -async fn main() -> Result<(), Box> { - let app = App::new().end("Hello, World"); - app.listen("127.0.0.1:8000", |addr| { - println!("Server is listening on {}", addr) - })? - .await?; - Ok(()) -} -``` -Refer to [wiki](https://github.com/Hexilee/roa/wiki) for more details. - -## Database - -PostgreSQL. - -* [diesel](http://diesel.rs) \/ [tokio-postgres](https://crates.io/crates/tokio-postgres) \/ [sqlx](https://github.com/launchbadge/sqlx) - -## Test URLs - -### Test 1: JSON Encoding - - http://localhost:8080/json - -### Test 2: Single Row Query - - http://localhost:8080/db - -### Test 3: Multi Row Query - - http://localhost:8080/queries?q=20 - -### Test 4: Fortunes (Template rendering) - - http://localhost:8080/fortune - -### Test 5: Update Query - - http://localhost:8080/updates?q=20 - -### Test 6: Plaintext - - http://localhost:8080/plaintext - diff --git a/frameworks/Rust/roa/benchmark_config.json b/frameworks/Rust/roa/benchmark_config.json deleted file mode 100755 index b60fbac4858..00000000000 --- a/frameworks/Rust/roa/benchmark_config.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "framework": "roa", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "roa", - "language": "Rust", - "orm": "Raw", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Roa", - "notes": "", - "versus": "" - }, - "core": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "roa", - "language": "Rust", - "orm": "Raw", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Roa [Core]", - "notes": "", - "versus": "" - }, - "tokio": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "roa", - "language": "Rust", - "orm": "Raw", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Roa [Tokio]", - "notes": "", - "versus": "" - }, - "diesel": { - "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "roa", - "language": "Rust", - "orm": "Full", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Roa [Diesel]", - "notes": "", - "versus": "" - }, - "pg": { - "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "roa", - "language": "Rust", - "orm": "Raw", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Roa [Postgres]", - "notes": "", - "versus": "" - }, - "sqlx": { - "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "roa", - "language": "Rust", - "orm": "Raw", - "platform": "None", - "webserver": "hyper", - "os": "Linux", - "database_os": "Linux", - "display_name": "Roa [Sqlx]", - "notes": "", - "versus": "" - } - }] -} \ No newline at end of file diff --git a/frameworks/Rust/roa/config.toml b/frameworks/Rust/roa/config.toml deleted file mode 100644 index 196983fba0a..00000000000 --- a/frameworks/Rust/roa/config.toml +++ /dev/null @@ -1,86 +0,0 @@ -[framework] -name = "roa" - -[sqlx] -urls.db = "/db" -urls.query = "/queries?q=" -urls.update = "/updates?q=" -urls.fortune = "/fortune" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "hyper" -versus = "" - -[core] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "hyper" -versus = "" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "hyper" -versus = "" - -[diesel] -urls.db = "/db" -urls.query = "/queries?q=" -urls.update = "/updates?q=" -urls.fortune = "/fortune" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "None" -webserver = "hyper" -versus = "" - -[pg] -urls.db = "/db" -urls.query = "/queries?q=" -urls.update = "/updates?q=" -urls.fortune = "/fortune" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "hyper" -versus = "" - -[tokio] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "hyper" -versus = "" diff --git a/frameworks/Rust/roa/roa-core.dockerfile b/frameworks/Rust/roa/roa-core.dockerfile deleted file mode 100644 index e77098a5a32..00000000000 --- a/frameworks/Rust/roa/roa-core.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM rust:1.73 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ - -ADD ./ /roa -WORKDIR /roa - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin roa-core - -EXPOSE 8080 - -CMD ./target/release/roa-core diff --git a/frameworks/Rust/roa/roa-diesel.dockerfile b/frameworks/Rust/roa/roa-diesel.dockerfile deleted file mode 100644 index 35d7aa3507a..00000000000 --- a/frameworks/Rust/roa/roa-diesel.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM rust:1.73 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ - -ADD ./ /roa -WORKDIR /roa - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin roa-db --features "orm" - -EXPOSE 8080 - -CMD ./target/release/roa-db diff --git a/frameworks/Rust/roa/roa-pg.dockerfile b/frameworks/Rust/roa/roa-pg.dockerfile deleted file mode 100644 index beb9d673858..00000000000 --- a/frameworks/Rust/roa/roa-pg.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM rust:1.73 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ - -ADD ./ /roa -WORKDIR /roa - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin roa-db --features "pg" - -EXPOSE 8080 - -CMD ./target/release/roa-db diff --git a/frameworks/Rust/roa/roa-sqlx.dockerfile b/frameworks/Rust/roa/roa-sqlx.dockerfile deleted file mode 100644 index f14a42dc735..00000000000 --- a/frameworks/Rust/roa/roa-sqlx.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM rust:1.73 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ - -ADD ./ /roa -WORKDIR /roa - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin roa-db --features "sqlx-pg" - -EXPOSE 8080 - -CMD ./target/release/roa-db diff --git a/frameworks/Rust/roa/roa-tokio.dockerfile b/frameworks/Rust/roa/roa-tokio.dockerfile deleted file mode 100644 index 38f3b9fa381..00000000000 --- a/frameworks/Rust/roa/roa-tokio.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM rust:1.73 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ - -ADD ./ /roa -WORKDIR /roa - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin roa-core --features "tokio_rt" - -EXPOSE 8080 - -CMD ./target/release/roa-core diff --git a/frameworks/Rust/roa/roa.dockerfile b/frameworks/Rust/roa/roa.dockerfile deleted file mode 100644 index 29ed4e2200f..00000000000 --- a/frameworks/Rust/roa/roa.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM rust:1.73 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ - -ADD ./ /roa -WORKDIR /roa - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin roa - -EXPOSE 8080 - -CMD ./target/release/roa diff --git a/frameworks/Rust/roa/rustfmt.toml b/frameworks/Rust/roa/rustfmt.toml deleted file mode 100644 index 30e2708ff60..00000000000 --- a/frameworks/Rust/roa/rustfmt.toml +++ /dev/null @@ -1,2 +0,0 @@ -max_width = 89 -reorder_imports = true \ No newline at end of file diff --git a/frameworks/Rust/roa/src/db_diesel.rs b/frameworks/Rust/roa/src/db_diesel.rs deleted file mode 100644 index 9a311adf00a..00000000000 --- a/frameworks/Rust/roa/src/db_diesel.rs +++ /dev/null @@ -1,97 +0,0 @@ -use diesel::pg::PgConnection; -use diesel::prelude::*; -use diesel::r2d2::ConnectionManager; -use roa::http::StatusCode; -use roa_diesel::preload::*; -use roa_diesel::Pool; - -use rand::rngs::SmallRng; -use rand::{Rng, SeedableRng}; - -use crate::models::Fortune; -use crate::{async_trait, throw, Context, Result, Service, StdResult, World}; -use futures::stream::{FuturesUnordered, TryStreamExt}; - -#[derive(Clone)] -pub struct State { - pool: Pool, - rng: SmallRng, -} - -impl AsRef> for State { - #[inline] - fn as_ref(&self) -> &Pool { - &self.pool - } -} - -impl State { - pub async fn bind(pg_url: &str) -> StdResult { - let pool = Pool::builder() - .max_size(50) - .build(ConnectionManager::::new(pg_url))?; - Ok(Self { - pool, - rng: SmallRng::from_entropy(), - }) - } -} - -#[async_trait(?Send)] -impl Service for Context { - #[inline] - fn random_id(&mut self) -> i32 { - self.rng.gen_range(0, 10_001) - } - - #[inline] - fn get_queries(&self) -> usize { - use std::cmp::{max, min}; - let query = self.uri().query(); - let nums = query - .and_then(|query| Some((query, query.find("q")?))) - .and_then(|(query, pos)| query.split_at(pos + 2).1.parse().ok()) - .unwrap_or(1); - min(500, max(1, nums)) - } - - #[inline] - async fn query_world(&self, wid: i32) -> Result { - use crate::schema::world::dsl::*; - let data = self.first(world.filter(id.eq(wid))).await?; - match data { - None => throw!(StatusCode::NOT_FOUND), - Some(item) => Ok(item), - } - } - - #[inline] - async fn fortunes(&self) -> Result> { - use crate::schema::fortune::dsl::*; - Ok(self.load_data(fortune).await?) - } - - #[inline] - async fn update_worlds(&mut self) -> Result> { - let worlds = FuturesUnordered::new(); - let random_ids: Vec<_> = - (0..self.get_queries()).map(|_| self.random_id()).collect(); - for wid in random_ids { - worlds.push(update_world(self, wid)); - } - worlds.try_collect().await - } -} - -async fn update_world(ctx: &Context, wid: i32) -> Result { - use crate::schema::world::dsl::*; - let mut data = ctx.query_world(wid).await?; - data.randomnumber = wid; - ctx.execute( - diesel::update(world) - .filter(id.eq(wid)) - .set(randomnumber.eq(wid)), - ) - .await?; - Ok(data) -} diff --git a/frameworks/Rust/roa/src/db_pg.rs b/frameworks/Rust/roa/src/db_pg.rs deleted file mode 100644 index e2e3435af5a..00000000000 --- a/frameworks/Rust/roa/src/db_pg.rs +++ /dev/null @@ -1,126 +0,0 @@ -use crate::models::Fortune; -use crate::{async_trait, throw, Context, Result, Service, StdResult, World}; -use rand::rngs::SmallRng; -use rand::{Rng, SeedableRng}; -use roa::http::StatusCode; -use roa_pg::types::ToSql; -use roa_pg::{connect, Client, Statement}; -use std::collections::HashMap; -use std::fmt::Write; -use std::sync::Arc; - -#[derive(Clone)] -pub struct State { - client: Arc, - queries: Arc, - rng: SmallRng, -} - -pub struct Queries { - fortune: Statement, - world: Statement, - updates: HashMap, -} - -impl State { - pub async fn bind(url: &str) -> StdResult { - let (client, conn) = connect(&url.parse()?).await?; - - async_std::task::spawn(conn); - - let fortune = client.prepare("SELECT * FROM fortune").await?; - let world = client.prepare("SELECT * FROM world WHERE id=$1").await?; - let mut updates = HashMap::new(); - for num in 1..=500 { - let mut pl = 1; - let mut q = String::new(); - q.push_str("UPDATE world SET randomnumber = CASE id "); - for _ in 1..=num { - write!(&mut q, "when ${} then ${} ", pl, pl + 1)?; - pl += 2; - } - q.push_str("ELSE randomnumber END WHERE id IN ("); - for _ in 1..=num { - write!(&mut q, "${},", pl)?; - pl += 1; - } - q.pop(); - q.push(')'); - updates.insert(num, client.prepare(&q).await?); - } - Ok(State { - client: Arc::new(client), - queries: Arc::new(Queries { - fortune, - world, - updates, - }), - rng: SmallRng::from_entropy(), - }) - } -} - -#[async_trait(?Send)] -impl Service for Context { - #[inline] - fn random_id(&mut self) -> i32 { - self.rng.gen_range(0, 10_001) - } - - #[inline] - fn get_queries(&self) -> usize { - use std::cmp::{max, min}; - let query = self.uri().query(); - let nums = query - .and_then(|query| Some((query, query.find("q")?))) - .and_then(|(query, pos)| query.split_at(pos + 2).1.parse().ok()) - .unwrap_or(1); - min(500, max(1, nums)) - } - - #[inline] - async fn query_world(&self, wid: i32) -> Result { - match self.client.query_opt(&self.queries.world, &[&wid]).await? { - None => throw!(StatusCode::NOT_FOUND), - Some(row) => Ok(World { - id: row.get(0), - randomnumber: row.get(1), - }), - } - } - - #[inline] - async fn fortunes(&self) -> Result> { - let fortunes = self - .client - .query(&self.queries.fortune, &[]) - .await? - .iter() - .map(|row| Fortune { - id: row.get(0), - message: row.get(1), - }) - .collect(); - Ok(fortunes) - } - - #[inline] - async fn update_worlds(&mut self) -> Result> { - let mut worlds = self.query_worlds().await?; - let nums = worlds.len(); - let mut params: Vec<&(dyn ToSql + Sync)> = Vec::with_capacity(nums * 3); - for w in worlds.iter_mut() { - w.randomnumber = w.id; - } - for w in &worlds { - params.push(&w.id); - params.push(&w.randomnumber); - } - for w in &worlds { - params.push(&w.id); - } - let statement = &self.queries.updates[&nums]; - self.client.execute(statement, ¶ms).await?; - Ok(worlds) - } -} diff --git a/frameworks/Rust/roa/src/db_sqlx.rs b/frameworks/Rust/roa/src/db_sqlx.rs deleted file mode 100644 index 731f3dd7445..00000000000 --- a/frameworks/Rust/roa/src/db_sqlx.rs +++ /dev/null @@ -1,108 +0,0 @@ -use crate::models::Fortune; -use crate::{async_trait, throw, Context, Result, Service, StdResult, World}; -use futures::TryStreamExt; -use rand::rngs::SmallRng; -use rand::{Rng, SeedableRng}; -use roa::http::StatusCode; -use sqlx::{PgPool, Row}; -use std::collections::HashMap; -use std::fmt::Write; -use std::sync::Arc; - -#[derive(Clone)] -pub struct State { - client: PgPool, - updates: Arc>, - rng: SmallRng, -} - -impl State { - pub async fn bind(url: &str) -> StdResult { - let client = PgPool::new(url).await?; - let mut updates = HashMap::new(); - for num in 1..=500 { - let mut pl = 1; - let mut q = String::new(); - q.push_str("UPDATE world SET randomnumber = CASE id "); - for _ in 1..=num { - write!(&mut q, "when ${} then ${} ", pl, pl + 1)?; - pl += 2; - } - q.push_str("ELSE randomnumber END WHERE id IN ("); - for _ in 1..=num { - write!(&mut q, "${},", pl)?; - pl += 1; - } - q.pop(); - q.push(')'); - updates.insert(num, q); - } - Ok(State { - client, - updates: Arc::new(updates), - rng: SmallRng::from_entropy(), - }) - } -} - -#[async_trait(?Send)] -impl Service for Context { - #[inline] - fn random_id(&mut self) -> i32 { - self.rng.gen_range(0, 10_001) - } - - #[inline] - fn get_queries(&self) -> usize { - use std::cmp::{max, min}; - let query = self.uri().query(); - let nums = query - .and_then(|query| Some((query, query.find("q")?))) - .and_then(|(query, pos)| query.split_at(pos + 2).1.parse().ok()) - .unwrap_or(1); - min(500, max(1, nums)) - } - - #[inline] - async fn query_world(&self, wid: i32) -> Result { - match sqlx::query("SELECT * FROM world WHERE id=$1") - .bind(wid) - .fetch_optional(&mut &self.client) - .await? - { - None => throw!(StatusCode::NOT_FOUND), - Some(row) => Ok(World { - id: row.get(0), - randomnumber: row.get(1), - }), - } - } - - #[inline] - async fn fortunes(&self) -> Result> { - let fortunes: Vec<_> = sqlx::query("SELECT * FROM fortune") - .fetch(&mut &self.client) - .map_ok(|row| Fortune { - id: row.get(0), - message: row.get(1), - }) - .try_collect() - .await?; - Ok(fortunes) - } - - #[inline] - async fn update_worlds(&mut self) -> Result> { - let mut worlds = self.query_worlds().await?; - let mut query = sqlx::query(&self.updates[&worlds.len()]); - for w in worlds.iter_mut() { - w.randomnumber = w.id; - query = query.bind(w.id).bind(w.randomnumber); - } - for w in &worlds { - query = query.bind(w.id); - } - query.execute(&mut &self.client).await?; - Ok(worlds) - } -} diff --git a/frameworks/Rust/roa/src/endpoints.rs b/frameworks/Rust/roa/src/endpoints.rs deleted file mode 100644 index 1d5363d3cce..00000000000 --- a/frameworks/Rust/roa/src/endpoints.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::utils::{Message, JSON_LEN, PLAINTEXT_LEN}; -use roa::http::header::CONTENT_LENGTH; -use roa::preload::*; -use roa::{Context, Result}; - -static HELLO_WORLD: &str = "Hello, World!"; - -#[inline] -pub async fn json(ctx: &mut Context) -> Result { - ctx.resp.headers.insert(CONTENT_LENGTH, JSON_LEN.clone()); - ctx.write_json(&Message { - message: HELLO_WORLD, - }) -} - -#[inline] -pub async fn plaintext(ctx: &mut Context) -> Result { - ctx.resp - .headers - .insert(CONTENT_LENGTH, PLAINTEXT_LEN.clone()); - ctx.write(HELLO_WORLD); - Ok(()) -} diff --git a/frameworks/Rust/roa/src/main-core.rs b/frameworks/Rust/roa/src/main-core.rs deleted file mode 100644 index fb82662a47b..00000000000 --- a/frameworks/Rust/roa/src/main-core.rs +++ /dev/null @@ -1,44 +0,0 @@ -use roa::http::header::SERVER; -use roa::{App, Context, Result}; -use std::error::Error as StdError; -use std::result::Result as StdResult; - -pub mod endpoints; -pub mod utils; -use endpoints::{json, plaintext}; -use utils::SERVER_HEADER; - -#[inline] -async fn endpoint(ctx: &mut Context<()>) -> Result { - // avoid to re-allocate a header map - ctx.resp.headers = std::mem::take(&mut ctx.req.headers); - ctx.resp.headers.clear(); - ctx.resp.headers.insert(SERVER, SERVER_HEADER.clone()); - match ctx.uri().path() { - "/plaintext" => plaintext(ctx).await, - _ => json(ctx).await, - } -} - -#[cfg(not(feature = "tokio_rt"))] -#[async_std::main] -async fn main() -> StdResult<(), Box> { - use roa::preload::*; - let app = App::new().end(endpoint); - app.listen("0.0.0.0:8080", |addr| { - println!("Server listen on {}...", addr); - })? - .await?; - Ok(()) -} - -#[cfg(feature = "tokio_rt")] -#[tokio::main] -async fn main() -> StdResult<(), Box> { - use roa_tokio::{Exec, TcpIncoming}; - let app = App::with_exec((), Exec).end(endpoint); - let incoming = TcpIncoming::bind("0.0.0.0:8080")?; - println!("Server listen on {}...", incoming.local_addr()); - app.accept(incoming).await?; - Ok(()) -} diff --git a/frameworks/Rust/roa/src/main-db.rs b/frameworks/Rust/roa/src/main-db.rs deleted file mode 100644 index acb702c17fd..00000000000 --- a/frameworks/Rust/roa/src/main-db.rs +++ /dev/null @@ -1,118 +0,0 @@ -#[cfg(feature = "orm")] -#[macro_use] -extern crate diesel; - -#[cfg(feature = "orm")] -mod db_diesel; - -#[cfg(feature = "orm")] -mod schema; - -#[cfg(feature = "orm")] -use db_diesel::State; - -#[cfg(feature = "pg")] -mod db_pg; - -#[cfg(feature = "pg")] -use db_pg::State; - -#[cfg(feature = "sqlx-pg")] -mod db_sqlx; - -#[cfg(feature = "sqlx-pg")] -use db_sqlx::State; - -use futures::stream::{FuturesUnordered, TryStreamExt}; -use roa::http::header::SERVER; -use roa::preload::*; -use roa::router::{get, RouteTable, Router}; -use roa::{async_trait, throw, App, Context, Next, Result}; -mod models; -pub mod utils; -use dotenv_codegen::dotenv; -use models::*; -use utils::SERVER_HEADER; - -type StdResult = std::result::Result>; - -#[async_trait(?Send)] -trait Service { - fn random_id(&mut self) -> i32; - fn get_queries(&self) -> usize; - async fn query_world(&self, wid: i32) -> Result; - async fn fortunes(&self) -> Result>; - async fn update_worlds(&mut self) -> Result>; - async fn query_worlds(&mut self) -> Result> { - let worlds = FuturesUnordered::new(); - let random_ids: Vec<_> = - (0..self.get_queries()).map(|_| self.random_id()).collect(); - for id in random_ids { - worlds.push(self.query_world(id)); - } - worlds.try_collect().await - } -} - -#[inline] -async fn gate(ctx: &mut Context, next: Next<'_>) -> Result { - // avoid to re-allocate a header map - ctx.resp.headers = std::mem::take(&mut ctx.req.headers); - ctx.resp.headers.clear(); - ctx.resp.headers.insert(SERVER, SERVER_HEADER.clone()); - next.await -} - -#[inline] -async fn db(ctx: &mut Context) -> Result { - let id = ctx.random_id(); - let data = ctx.query_world(id).await?; - ctx.write_json(&data)?; - Ok(()) -} - -#[inline] -async fn queries(ctx: &mut Context) -> Result { - let data = ctx.query_worlds().await?; - ctx.write_json(&data)?; - Ok(()) -} - -#[inline] -async fn fortune(ctx: &mut Context) -> Result { - let mut fortunes = ctx.fortunes().await?; - fortunes.push(Fortune { - id: 0, - message: "Additional fortune added at request time.".to_owned(), - }); - fortunes.sort_by(|it, next| it.message.cmp(&next.message)); - ctx.render(&Fortunes { items: &fortunes }) -} - -#[inline] -async fn updates(ctx: &mut Context) -> Result { - let data = ctx.update_worlds().await?; - ctx.write_json(&data)?; - Ok(()) -} - -fn routes(prefix: &'static str) -> StdResult> { - Router::new() - .gate(gate) - .on("/db", get(db)) - .on("/queries", get(queries)) - .on("/fortunes", get(fortune)) - .on("/updates", get(updates)) - .routes(prefix) - .map_err(Into::into) -} - -#[async_std::main] -async fn main() -> StdResult<()> { - let app = App::state(State::bind(dotenv!("DATABASE_URL")).await?).end(routes("/")?); - app.listen("0.0.0.0:8080", |addr| { - println!("Server listen on {}...", addr); - })? - .await?; - Ok(()) -} diff --git a/frameworks/Rust/roa/src/main.rs b/frameworks/Rust/roa/src/main.rs deleted file mode 100644 index af49219fe74..00000000000 --- a/frameworks/Rust/roa/src/main.rs +++ /dev/null @@ -1,34 +0,0 @@ -use roa::http::header::SERVER; -use roa::preload::*; -use roa::router::{get, Router}; -use roa::{App, Context, Next, Result}; -use std::error::Error; -use std::result::Result as StdResult; - -pub mod endpoints; -pub mod utils; -use endpoints::{json, plaintext}; -use utils::SERVER_HEADER; - -#[inline] -async fn gate(ctx: &mut Context<()>, next: Next<'_>) -> Result { - // avoid to re-allocate a header map - ctx.resp.headers = std::mem::take(&mut ctx.req.headers); - ctx.resp.headers.clear(); - ctx.resp.headers.insert(SERVER, SERVER_HEADER.clone()); - next.await -} - -#[async_std::main] -async fn main() -> StdResult<(), Box> { - let router = Router::new() - .gate(gate) - .on("/json", get(json)) - .on("/plaintext", get(plaintext)); - let app = App::new().end(router.routes("/")?); - app.listen("0.0.0.0:8080", |addr| { - println!("Server listen on {}...", addr); - })? - .await?; - Ok(()) -} diff --git a/frameworks/Rust/roa/src/models.rs b/frameworks/Rust/roa/src/models.rs deleted file mode 100644 index b45713d536c..00000000000 --- a/frameworks/Rust/roa/src/models.rs +++ /dev/null @@ -1,30 +0,0 @@ -#![allow(dead_code)] - -use askama::Template; -use serde::Serialize; - -#[derive(Serialize)] -pub struct Message { - pub message: &'static str, -} - -#[cfg_attr(feature = "orm", derive(Queryable))] -#[allow(non_snake_case)] -#[derive(Serialize, Debug)] -pub struct World { - pub id: i32, - pub randomnumber: i32, -} - -#[cfg_attr(feature = "orm", derive(Queryable))] -#[derive(Serialize, Debug)] -pub struct Fortune { - pub id: i32, - pub message: String, -} - -#[derive(Template)] -#[template(path = "fortune.html")] -pub struct Fortunes<'a> { - pub items: &'a [Fortune], -} diff --git a/frameworks/Rust/roa/src/schema.rs b/frameworks/Rust/roa/src/schema.rs deleted file mode 100644 index eb14aa98a75..00000000000 --- a/frameworks/Rust/roa/src/schema.rs +++ /dev/null @@ -1,15 +0,0 @@ -#![allow(non_snake_case)] - -table! { - world (id) { - id -> Integer, - randomnumber -> Integer, - } -} - -table! { - fortune (id) { - id -> Integer, - message -> Text, - } -} diff --git a/frameworks/Rust/roa/src/utils.rs b/frameworks/Rust/roa/src/utils.rs deleted file mode 100644 index 34c00037fbc..00000000000 --- a/frameworks/Rust/roa/src/utils.rs +++ /dev/null @@ -1,20 +0,0 @@ -use lazy_static::lazy_static; -use roa::http::header::HeaderValue; -use serde::{Deserialize, Serialize}; - -lazy_static! { - pub static ref SERVER_HEADER: HeaderValue = HeaderValue::from_static("roa"); - pub static ref JSON_LEN: HeaderValue = HeaderValue::from_static("27"); - pub static ref PLAINTEXT_LEN: HeaderValue = HeaderValue::from_static("13"); -} - -#[derive(Serialize, Debug)] -pub struct Fortune { - pub id: i32, - pub message: String, -} - -#[derive(Serialize, Deserialize)] -pub struct Message { - pub message: &'static str, -} diff --git a/frameworks/Rust/roa/templates/fortune.html b/frameworks/Rust/roa/templates/fortune.html deleted file mode 100644 index 7c448b9d999..00000000000 --- a/frameworks/Rust/roa/templates/fortune.html +++ /dev/null @@ -1,12 +0,0 @@ - - - Fortunes - - - - {% for item in items %} - - {% endfor %} -
      idmessage
      {{item.id}}{{item.message}}
      - - From 7865ccc0711e604c79c5aae4c8351077e8a7c2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Sat, 22 Mar 2025 01:04:38 +0800 Subject: [PATCH 1287/1766] Upgrade hyperlane (#9701) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile --- frameworks/Rust/hyperlane/Cargo.toml | 4 ++-- .../Rust/hyperlane/hyperlane.dockerfile | 4 +++- frameworks/Rust/hyperlane/src/db.rs | 22 +++++++------------ frameworks/Rust/hyperlane/src/lazy.rs | 5 ++--- frameworks/Rust/hyperlane/src/main.rs | 14 ++++-------- frameworks/Rust/hyperlane/src/route.rs | 2 +- frameworks/Rust/hyperlane/src/server.rs | 4 ++-- frameworks/Rust/hyperlane/src/type.rs | 6 ++++- frameworks/Rust/hyperlane/src/utils.rs | 2 -- .../Rust/hyperlane/templates/fortune.hbs | 5 ----- 10 files changed, 27 insertions(+), 41 deletions(-) delete mode 100644 frameworks/Rust/hyperlane/templates/fortune.hbs diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 8b909a01df4..7ca0bbe6f4e 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "hyperlane_techempower" version = "0.0.1" -edition = "2021" +edition = "2024" authors = ["ltpp-universe "] license = "MIT" description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication.""" @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.36.1" +hyperlane = "4.42.1" rand = "0.9.0" serde = "1.0.219" sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } diff --git a/frameworks/Rust/hyperlane/hyperlane.dockerfile b/frameworks/Rust/hyperlane/hyperlane.dockerfile index 480553c8c7a..d9bd815fd04 100644 --- a/frameworks/Rust/hyperlane/hyperlane.dockerfile +++ b/frameworks/Rust/hyperlane/hyperlane.dockerfile @@ -1,12 +1,14 @@ FROM rust:1.85 +RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld + ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world ADD ./ /hyperlane_techempower WORKDIR /hyperlane_techempower RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release EXPOSE 8080 diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index d1d51e8ee11..9f4db9f0f5c 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -2,20 +2,18 @@ use crate::*; #[inline] pub async fn get_db_connection() -> DbPoolConnection { - if let Some(db_pool) = DB.read().await.clone() { - return db_pool; + if let Some(db_pool) = DB.get() { + return db_pool.clone(); }; let db_pool: DbPoolConnection = connection_db().await; - { - let mut db_pool_lock: RwLockWriteGuard<'_, Option> = DB.write().await; - *db_pool_lock = Some(db_pool.clone()); - } + DB.set(db_pool.clone()) + .expect("Failed to initialize DB_POOL"); db_pool } #[inline] #[cfg(feature = "dev")] -pub async fn create_batabase() { +pub async fn create_database() { let db_pool: DbPoolConnection = get_db_connection().await; let _ = query(&format!("CREATE DATABASE {};", DATABASE_NAME)) .execute(&db_pool) @@ -97,8 +95,7 @@ pub async fn init_cache() { res.push(QueryRow::new(id, random_number)); } } - let mut cache: RwLockWriteGuard<'_, Vec> = CACHE.write().await; - *cache = res; + let _ = CACHE.set(res); } #[inline] @@ -170,13 +167,10 @@ pub async fn get_update_data( #[inline] pub async fn init_db() { - { - let mut db_pool_lock: RwLockWriteGuard<'_, Option> = DB.write().await; - *db_pool_lock = Some(connection_db().await); - } + get_db_connection().await; #[cfg(feature = "dev")] { - create_batabase().await; + create_database().await; create_table().await; insert_records().await; } diff --git a/frameworks/Rust/hyperlane/src/lazy.rs b/frameworks/Rust/hyperlane/src/lazy.rs index 6826b018008..6e95d5019b0 100644 --- a/frameworks/Rust/hyperlane/src/lazy.rs +++ b/frameworks/Rust/hyperlane/src/lazy.rs @@ -1,5 +1,4 @@ use crate::*; -pub static DB: Lazy>> = - Lazy::new(|| Arc::new(RwLock::new(None))); -pub static CACHE: Lazy>> = Lazy::new(|| arc_rwlock(vec![])); +pub static DB: OnceCell = OnceCell::new(); +pub static CACHE: OnceCell> = OnceCell::new(); diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index ef4a7838faa..72253debec0 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -10,16 +10,9 @@ pub(crate) mod utils; pub(crate) use constant::*; pub(crate) use db::*; -pub(crate) use hyperlane::{ - once_cell::sync::Lazy, - serde::*, - serde_json::json, - tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}, - *, -}; +pub(crate) use hyperlane::{once_cell::sync::OnceCell, serde::*, serde_json::json, *}; pub(crate) use lazy::*; -pub(crate) use r#type::*; -pub(crate) use rand::{rngs::SmallRng, Rng, SeedableRng}; +pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng}; pub(crate) use request_middleware::*; pub(crate) use response_middleware::*; pub(crate) use route::*; @@ -28,7 +21,8 @@ pub(crate) use sqlx::{ postgres::{PgPoolOptions, PgRow}, *, }; -pub(crate) use std::{fmt, sync::Arc}; +pub(crate) use std::fmt; +pub(crate) use r#type::*; pub(crate) use utils::*; #[tokio::main] diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index e52db693195..c3c7cbcb855 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -97,7 +97,7 @@ pub async fn cached_queries(controller_data: ControllerData) { .min(ROW_LIMIT as Queries) .max(1); let mut res: Vec = Vec::with_capacity(count as usize); - let cache: RwLockReadGuard<'_, Vec> = CACHE.read().await; + let cache: Vec = CACHE.get().cloned().unwrap_or_default(); for i in 0..count { res.push(cache[i as usize].clone()); } diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 91dc1aeea08..568fb066446 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -9,13 +9,13 @@ pub async fn run_server() { server.log_interval_millis(1_000_000_000).await; server.disable_inner_log().await; server.disable_inner_print().await; - server.route("/json", json).await; server.route("/plaintext", plaintext).await; + server.route("/json", json).await; + server.route("/cached-quer", cached_queries).await; server.route("/db", db).await; server.route("/query", queries).await; server.route("/fortunes", fortunes).await; server.route("/upda", updates).await; - server.route("/cached-quer", cached_queries).await; server.request_middleware(request).await; server.response_middleware(response).await; server.listen().await; diff --git a/frameworks/Rust/hyperlane/src/type.rs b/frameworks/Rust/hyperlane/src/type.rs index 3fb320ba049..9ec11ff4342 100644 --- a/frameworks/Rust/hyperlane/src/type.rs +++ b/frameworks/Rust/hyperlane/src/type.rs @@ -44,9 +44,13 @@ impl FortunesTemplate { } impl fmt::Display for FortunesTemplate { + #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let fortunes: &Vec = &self.0; - let _ = write!(f, "Fortunes"); + let _ = write!( + f, + "Fortunes
      idmessage
      " + ); for tem in fortunes.iter() { let row: String = format!( "", diff --git a/frameworks/Rust/hyperlane/src/utils.rs b/frameworks/Rust/hyperlane/src/utils.rs index 9552fe79074..16e8cdd8839 100644 --- a/frameworks/Rust/hyperlane/src/utils.rs +++ b/frameworks/Rust/hyperlane/src/utils.rs @@ -1,5 +1,3 @@ -use rand::rng; - use crate::*; #[inline] diff --git a/frameworks/Rust/hyperlane/templates/fortune.hbs b/frameworks/Rust/hyperlane/templates/fortune.hbs deleted file mode 100644 index b9e25a52a8e..00000000000 --- a/frameworks/Rust/hyperlane/templates/fortune.hbs +++ /dev/null @@ -1,5 +0,0 @@ -Fortunes
      idmessage
      {}{}
      - {{~# each fortunes ~}} - - {{~/each ~}} -
      idmessage
      {{id}}{{message}}
      From 927b9e826b73ab35bdf38612786bd5c11debc0a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:05:31 +0000 Subject: [PATCH 1288/1766] Bump next from 15.1.3 to 15.2.3 in /frameworks/TypeScript/nextjs Bumps [next](https://github.com/vercel/next.js) from 15.1.3 to 15.2.3. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.1.3...v15.2.3) --- updated-dependencies: - dependency-name: next dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../TypeScript/nextjs/package-lock.json | 80 +++++++++---------- frameworks/TypeScript/nextjs/package.json | 2 +- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/frameworks/TypeScript/nextjs/package-lock.json b/frameworks/TypeScript/nextjs/package-lock.json index 66e3d67f8a2..40fc15b10e4 100644 --- a/frameworks/TypeScript/nextjs/package-lock.json +++ b/frameworks/TypeScript/nextjs/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "kysely": "^0.27.5", - "next": "^15.1.3", + "next": "^15.2.3", "pg": "^8.13.1", "react": "^19.0.0", "react-dom": "^19.0.0" @@ -394,15 +394,15 @@ } }, "node_modules/@next/env": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.3.tgz", - "integrity": "sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.3.tgz", + "integrity": "sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz", - "integrity": "sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.3.tgz", + "integrity": "sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==", "cpu": [ "arm64" ], @@ -416,9 +416,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz", - "integrity": "sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.3.tgz", + "integrity": "sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==", "cpu": [ "x64" ], @@ -432,9 +432,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz", - "integrity": "sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.3.tgz", + "integrity": "sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==", "cpu": [ "arm64" ], @@ -448,9 +448,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz", - "integrity": "sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.3.tgz", + "integrity": "sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==", "cpu": [ "arm64" ], @@ -464,9 +464,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz", - "integrity": "sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.3.tgz", + "integrity": "sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==", "cpu": [ "x64" ], @@ -480,9 +480,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz", - "integrity": "sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.3.tgz", + "integrity": "sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==", "cpu": [ "x64" ], @@ -496,9 +496,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz", - "integrity": "sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.3.tgz", + "integrity": "sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==", "cpu": [ "arm64" ], @@ -512,9 +512,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz", - "integrity": "sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.3.tgz", + "integrity": "sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==", "cpu": [ "x64" ], @@ -780,12 +780,12 @@ } }, "node_modules/next": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/next/-/next-15.1.3.tgz", - "integrity": "sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.2.3.tgz", + "integrity": "sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==", "license": "MIT", "dependencies": { - "@next/env": "15.1.3", + "@next/env": "15.2.3", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", @@ -800,14 +800,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.1.3", - "@next/swc-darwin-x64": "15.1.3", - "@next/swc-linux-arm64-gnu": "15.1.3", - "@next/swc-linux-arm64-musl": "15.1.3", - "@next/swc-linux-x64-gnu": "15.1.3", - "@next/swc-linux-x64-musl": "15.1.3", - "@next/swc-win32-arm64-msvc": "15.1.3", - "@next/swc-win32-x64-msvc": "15.1.3", + "@next/swc-darwin-arm64": "15.2.3", + "@next/swc-darwin-x64": "15.2.3", + "@next/swc-linux-arm64-gnu": "15.2.3", + "@next/swc-linux-arm64-musl": "15.2.3", + "@next/swc-linux-x64-gnu": "15.2.3", + "@next/swc-linux-x64-musl": "15.2.3", + "@next/swc-win32-arm64-msvc": "15.2.3", + "@next/swc-win32-x64-msvc": "15.2.3", "sharp": "^0.33.5" }, "peerDependencies": { diff --git a/frameworks/TypeScript/nextjs/package.json b/frameworks/TypeScript/nextjs/package.json index bc87525a493..4b71a8daca5 100644 --- a/frameworks/TypeScript/nextjs/package.json +++ b/frameworks/TypeScript/nextjs/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "kysely": "^0.27.5", - "next": "^15.1.3", + "next": "^15.2.3", "pg": "^8.13.1", "react": "^19.0.0", "react-dom": "^19.0.0" From 957dec95b8741aa1b2696d7a6ba988a73005e54f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 22:15:18 +0000 Subject: [PATCH 1289/1766] Bump github.com/golang-jwt/jwt/v5 in /frameworks/Go/goravel/src/fiber Bumps [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) from 5.2.1 to 5.2.2. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v5.2.1...v5.2.2) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/goravel/src/fiber/go.mod | 2 +- frameworks/Go/goravel/src/fiber/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/goravel/src/fiber/go.mod b/frameworks/Go/goravel/src/fiber/go.mod index 87ba6260420..8c5b49edc32 100644 --- a/frameworks/Go/goravel/src/fiber/go.mod +++ b/frameworks/Go/goravel/src/fiber/go.mod @@ -66,7 +66,7 @@ require ( github.com/gofiber/template/html/v2 v2.1.1 // indirect github.com/gofiber/utils v1.1.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/golang-migrate/migrate/v4 v4.17.1 // indirect github.com/golang-module/carbon/v2 v2.3.12 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect diff --git a/frameworks/Go/goravel/src/fiber/go.sum b/frameworks/Go/goravel/src/fiber/go.sum index 2106df44b89..a22d712901e 100644 --- a/frameworks/Go/goravel/src/fiber/go.sum +++ b/frameworks/Go/goravel/src/fiber/go.sum @@ -289,8 +289,8 @@ github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4= github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM= github.com/golang-module/carbon/v2 v2.3.12 h1:VC1DwN1kBwJkh5MjXmTFryjs5g4CWyoM8HAHffZPX/k= From 7321073d9e823e6fda1b6cb4a72ad4f8ae2b880d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 22:30:08 +0000 Subject: [PATCH 1290/1766] Bump github.com/golang-jwt/jwt/v4 in /frameworks/Go/goravel/src/gin Bumps [github.com/golang-jwt/jwt/v4](https://github.com/golang-jwt/jwt) from 4.5.1 to 4.5.2. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v4.5.1...v4.5.2) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/goravel/src/gin/go.mod | 2 +- frameworks/Go/goravel/src/gin/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/goravel/src/gin/go.mod b/frameworks/Go/goravel/src/gin/go.mod index 8547a95c5d3..1e61f0b5682 100644 --- a/frameworks/Go/goravel/src/gin/go.mod +++ b/frameworks/Go/goravel/src/gin/go.mod @@ -65,7 +65,7 @@ require ( github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang-migrate/migrate/v4 v4.17.1 // indirect github.com/golang-module/carbon/v2 v2.3.12 // indirect diff --git a/frameworks/Go/goravel/src/gin/go.sum b/frameworks/Go/goravel/src/gin/go.sum index 8318d8ee4d8..2d7f6ccefad 100644 --- a/frameworks/Go/goravel/src/gin/go.sum +++ b/frameworks/Go/goravel/src/gin/go.sum @@ -288,8 +288,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= -github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= From 6d42c392e69db1b571512900faa0d9a8ca36e6f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 23:48:29 +0000 Subject: [PATCH 1291/1766] Bump nokogiri from 1.18.3 to 1.18.4 in /frameworks/Ruby/rails Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.3 to 1.18.4. - [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.18.3...v1.18.4) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 2f8f40f851a..98ba2e7c84e 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -175,12 +175,12 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.18.3) + nokogiri (1.18.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.3-x86_64-darwin) + nokogiri (1.18.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.3-x86_64-linux-gnu) + nokogiri (1.18.4-x86_64-linux-gnu) racc (~> 1.4) openssl (3.3.0) pg (1.5.9) From d8358add5406f3544af967d9bc81ce987cf23430 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 00:06:59 +0000 Subject: [PATCH 1292/1766] Bump gunicorn from 20.1.0 to 23.0.0 in /frameworks/Python/falcon Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 23.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...23.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/falcon/requirements-meinheld.txt | 2 +- frameworks/Python/falcon/requirements-pypy.txt | 2 +- frameworks/Python/falcon/requirements-uvicorn.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Python/falcon/requirements-meinheld.txt b/frameworks/Python/falcon/requirements-meinheld.txt index ab4da943513..c816f95c997 100644 --- a/frameworks/Python/falcon/requirements-meinheld.txt +++ b/frameworks/Python/falcon/requirements-meinheld.txt @@ -1,2 +1,2 @@ -gunicorn==20.1.0 +gunicorn==23.0.0 meinheld==1.0.2 diff --git a/frameworks/Python/falcon/requirements-pypy.txt b/frameworks/Python/falcon/requirements-pypy.txt index 9d41f264a67..4afe40e70ce 100644 --- a/frameworks/Python/falcon/requirements-pypy.txt +++ b/frameworks/Python/falcon/requirements-pypy.txt @@ -1 +1 @@ -gunicorn==20.1.0 +gunicorn==23.0.0 diff --git a/frameworks/Python/falcon/requirements-uvicorn.txt b/frameworks/Python/falcon/requirements-uvicorn.txt index 23016ffc9d7..fcbed985e7e 100644 --- a/frameworks/Python/falcon/requirements-uvicorn.txt +++ b/frameworks/Python/falcon/requirements-uvicorn.txt @@ -1,4 +1,4 @@ -gunicorn==20.1.0 +gunicorn==23.0.0 httptools==0.5.0 uvloop==0.17.0 uvicorn==0.21.1 From dbc80f479747cdc7f357c1b525e7574171cfd915 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 00:24:34 +0000 Subject: [PATCH 1293/1766] Bump gunicorn from 22.0.0 to 23.0.0 in /frameworks/Python/api_hour Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 22.0.0 to 23.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/22.0.0...23.0.0) --- updated-dependencies: - dependency-name: gunicorn 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 9045239a633..5db05703f22 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -4,7 +4,7 @@ aiopg==0.7.0 -e git+https://github.com/Eyepea/API-Hour.git@577abbdcbb8cc2810dad46e260b338b15db4d0e3#egg=api_hour-master asyncio-redis==0.13.4 chardet==2.3.0 -gunicorn==22.0.0 +gunicorn==23.0.0 hiredis==0.2.0 Jinja2==3.1.4 MarkupSafe==0.23 From 3492fa2b04d3a5b7cca85a16cf635321ae475deb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 01:49:33 +0000 Subject: [PATCH 1294/1766] Bump gunicorn from 20.1.0 to 23.0.0 in /frameworks/Python/starlette Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 23.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...23.0.0) --- updated-dependencies: - dependency-name: gunicorn 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 47b27a87e9a..b94ce4d5784 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -1,5 +1,5 @@ asyncpg==0.26.0 -gunicorn==20.1.0 +gunicorn==23.0.0 httptools==0.5.0 idna==3.7 Jinja2==3.1.4 From 24a7351efa5bd2cfd32cee7231780a870cc6fa91 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 24 Mar 2025 16:55:44 +0100 Subject: [PATCH 1295/1766] [ruby] Use Bundler 2.6.2 (#9703) Ruby 3.4 has Bundler 2.6.2 installed by default. Using this version should be a bit faster as it doesn't need to install another version as mentioned by the following warning: Bundler 2.6.2 is running, but your lockfile was generated with 2.5.16. Installing Bundler 2.5.16 and restarting using that version. This also outputs the platform for Rack. If we know the platform we can improve the Ruby build times by using precompiled binaries. --- frameworks/Ruby/agoo/Gemfile.lock | 3 +- frameworks/Ruby/grape/Gemfile.lock | 93 ++++++++++++ frameworks/Ruby/hanami/Gemfile.lock | 3 +- frameworks/Ruby/padrino/Gemfile.lock | 149 ++++++++++++++++++++ frameworks/Ruby/rack-sequel/Gemfile.lock | 3 +- frameworks/Ruby/rack/Gemfile | 3 + frameworks/Ruby/rack/Gemfile.lock | 2 +- frameworks/Ruby/rage-sequel/Gemfile.lock | 2 +- frameworks/Ruby/rails/Gemfile.lock | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 3 +- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 3 +- frameworks/Ruby/sinatra/Gemfile.lock | 3 +- 12 files changed, 260 insertions(+), 9 deletions(-) create mode 100644 frameworks/Ruby/grape/Gemfile.lock create mode 100644 frameworks/Ruby/padrino/Gemfile.lock diff --git a/frameworks/Ruby/agoo/Gemfile.lock b/frameworks/Ruby/agoo/Gemfile.lock index 8d4a2594fdc..cf3141c5d63 100644 --- a/frameworks/Ruby/agoo/Gemfile.lock +++ b/frameworks/Ruby/agoo/Gemfile.lock @@ -13,6 +13,7 @@ GEM PLATFORMS ruby + x86_64-linux DEPENDENCIES agoo @@ -22,4 +23,4 @@ DEPENDENCIES rack BUNDLED WITH - 2.5.10 + 2.6.2 diff --git a/frameworks/Ruby/grape/Gemfile.lock b/frameworks/Ruby/grape/Gemfile.lock new file mode 100644 index 00000000000..1ccedb35a78 --- /dev/null +++ b/frameworks/Ruby/grape/Gemfile.lock @@ -0,0 +1,93 @@ +GEM + remote: https://rubygems.org/ + specs: + activemodel (8.0.1) + activesupport (= 8.0.1) + activerecord (8.0.1) + activemodel (= 8.0.1) + activesupport (= 8.0.1) + timeout (>= 0.4.0) + activesupport (8.0.1) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + base64 (0.2.0) + benchmark (0.4.0) + bigdecimal (3.1.9) + concurrent-ruby (1.3.5) + connection_pool (2.5.0) + drb (2.2.1) + dry-core (1.1.0) + concurrent-ruby (~> 1.0) + logger + zeitwerk (~> 2.6) + dry-inflector (1.2.0) + dry-logic (1.6.0) + bigdecimal + concurrent-ruby (~> 1.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-types (1.8.2) + bigdecimal (~> 3.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-logic (~> 1.4) + zeitwerk (~> 2.6) + grape (2.1.1) + activesupport (>= 6) + dry-types (>= 1.1) + mustermann-grape (~> 1.1.0) + rack (>= 2) + zeitwerk + i18n (1.14.7) + concurrent-ruby (~> 1.0) + json (2.10.1) + kgio (2.11.4) + logger (1.6.6) + minitest (5.25.4) + mustermann (3.0.3) + ruby2_keywords (~> 0.0.1) + mustermann-grape (1.1.0) + mustermann (>= 1.0.0) + mysql2 (0.5.6) + nio4r (2.7.4) + puma (6.6.0) + nio4r (~> 2.0) + rack (3.1.12) + raindrops (0.20.1) + ruby2_keywords (0.0.5) + securerandom (0.4.1) + timeout (0.4.3) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicorn (6.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) + uri (1.0.3) + zeitwerk (2.7.2) + +PLATFORMS + ruby + x86_64-darwin-23 + x86_64-linux + +DEPENDENCIES + activerecord (~> 8.0.0) + grape (= 2.1.1) + json (~> 2.9) + mysql2 (= 0.5.6) + puma (~> 6.5) + unicorn (= 6.1.0) + +BUNDLED WITH + 2.6.2 diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index a1d3a8ff478..99f2203709c 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -161,6 +161,7 @@ GEM PLATFORMS ruby x86_64-darwin-23 + x86_64-linux DEPENDENCIES dry-types (~> 1.0, >= 1.6.1) @@ -177,4 +178,4 @@ DEPENDENCIES rom-sql (~> 3.6) BUNDLED WITH - 2.5.16 + 2.6.2 diff --git a/frameworks/Ruby/padrino/Gemfile.lock b/frameworks/Ruby/padrino/Gemfile.lock new file mode 100644 index 00000000000..850309a3430 --- /dev/null +++ b/frameworks/Ruby/padrino/Gemfile.lock @@ -0,0 +1,149 @@ +GIT + remote: https://github.com/padrino/padrino-framework.git + revision: 9a38042351c9f5768231e94abca87bb1592cdcfa + specs: + padrino (0.16.0.pre3) + padrino-admin (= 0.16.0.pre3) + padrino-cache (= 0.16.0.pre3) + padrino-core (= 0.16.0.pre3) + padrino-gen (= 0.16.0.pre3) + padrino-helpers (= 0.16.0.pre3) + padrino-mailer (= 0.16.0.pre3) + padrino-support (= 0.16.0.pre3) + padrino-admin (0.16.0.pre3) + padrino-core (= 0.16.0.pre3) + padrino-helpers (= 0.16.0.pre3) + padrino-cache (0.16.0.pre3) + moneta (~> 1.6) + padrino-core (= 0.16.0.pre3) + padrino-helpers (= 0.16.0.pre3) + padrino-core (0.16.0.pre3) + padrino-support (= 0.16.0.pre3) + rackup (~> 2.1) + sinatra (~> 4) + thor (~> 1.0) + padrino-gen (0.16.0.pre3) + bundler (>= 1.0, < 3) + padrino-core (= 0.16.0.pre3) + padrino-helpers (0.16.0.pre3) + i18n (>= 0.6.7, < 2) + padrino-support (= 0.16.0.pre3) + tilt (>= 1.4.1, < 3) + padrino-mailer (0.16.0.pre3) + mail (~> 2.5) + mime-types (< 4) + padrino-core (= 0.16.0.pre3) + padrino-support (0.16.0.pre3) + +GEM + remote: https://rubygems.org/ + specs: + activemodel (8.0.2) + activesupport (= 8.0.2) + activerecord (8.0.2) + activemodel (= 8.0.2) + activesupport (= 8.0.2) + timeout (>= 0.4.0) + activesupport (8.0.2) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + base64 (0.2.0) + benchmark (0.4.0) + bigdecimal (3.1.9) + concurrent-ruby (1.3.5) + connection_pool (2.5.0) + date (3.4.1) + drb (2.2.1) + i18n (1.14.7) + concurrent-ruby (~> 1.0) + json (2.10.2) + kgio (2.11.4) + logger (1.6.6) + mail (2.8.1) + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + mime-types (3.6.1) + logger + mime-types-data (~> 3.2015) + mime-types-data (3.2025.0318) + mini_mime (1.1.5) + minitest (5.25.5) + moneta (1.6.0) + mustermann (3.0.3) + ruby2_keywords (~> 0.0.1) + mysql2 (0.5.6) + net-imap (0.5.6) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.5.1) + net-protocol + nio4r (2.7.4) + puma (6.6.0) + nio4r (~> 2.0) + rack (3.1.12) + rack-protection (4.1.1) + base64 (>= 0.1.0) + logger (>= 1.6.0) + rack (>= 3.0.0, < 4) + rack-session (2.1.0) + base64 (>= 0.1.0) + rack (>= 3.0.0) + rackup (2.2.1) + rack (>= 3) + raindrops (0.20.1) + ruby2_keywords (0.0.5) + securerandom (0.4.1) + sinatra (4.1.1) + logger (>= 1.6.0) + mustermann (~> 3.0) + rack (>= 3.0.0, < 4) + rack-protection (= 4.1.1) + rack-session (>= 2.0.0, < 3) + tilt (~> 2.0) + slim (2.0.3) + temple (~> 0.6.6) + tilt (>= 1.3.3, < 2.1) + temple (0.6.10) + thor (1.3.2) + tilt (2.0.11) + timeout (0.4.3) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicorn (6.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) + uri (1.0.3) + +PLATFORMS + ruby + x86_64-darwin-23 + x86_64-linux + +DEPENDENCIES + activerecord (>= 7.1) + json + mysql2 (> 0.5) + padrino! + puma (~> 6.4) + rack + slim (= 2.0.3) + unicorn (~> 6.1) + +BUNDLED WITH + 2.6.2 diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 0913e9cca6d..cd3ddd3e3ff 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -31,6 +31,7 @@ GEM PLATFORMS ruby x86_64-darwin-22 + x86_64-linux DEPENDENCIES base64 @@ -45,4 +46,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.5.10 + 2.6.2 diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index c1288cb2cda..fa5548c1098 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -2,6 +2,9 @@ source 'https://rubygems.org' +# Show platform so we can set in the Gemfile +puts "Platform: #{Gem::Platform.local}" + gem 'rack', '~> 3.0' gem 'connection_pool', '~> 2.4' gem 'jdbc-postgres', '~> 42.2', platforms: :jruby, require: 'jdbc/postgres' diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 66efa44e788..26be8052593 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -149,4 +149,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.5.11 + 2.6.2 diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index 0bb226b818b..866b6c60c06 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -34,4 +34,4 @@ DEPENDENCIES sequel_pg (~> 1.6) BUNDLED WITH - 2.5.6 + 2.6.2 diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 98ba2e7c84e..bc2ebf4a76b 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -288,4 +288,4 @@ DEPENDENCIES tzinfo-data BUNDLED WITH - 2.5.16 + 2.6.2 diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 8c6f5bc8321..a2e9337de97 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -29,6 +29,7 @@ GEM PLATFORMS ruby x86_64-darwin-22 + x86_64-linux DEPENDENCIES base64 @@ -45,4 +46,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.5.10 + 2.6.2 diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 40b1cad63db..d53049e2d18 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -51,6 +51,7 @@ GEM PLATFORMS ruby x86_64-darwin-23 + x86_64-linux DEPENDENCIES iodine (~> 0.7) @@ -65,4 +66,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.5.16 + 2.6.2 diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 93710d657af..a6a79d096c3 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -78,6 +78,7 @@ GEM PLATFORMS ruby x86_64-darwin-23 + x86_64-linux DEPENDENCIES activerecord (~> 8.0) @@ -93,4 +94,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.5.16 + 2.6.2 From a5baa2b637146bbb2ad681e9d41ab5507d7a3178 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Mon, 24 Mar 2025 08:57:00 -0700 Subject: [PATCH 1296/1766] Add Lute (#9711) --- frameworks/Luau/lute/README.md | 12 + frameworks/Luau/lute/benchmark_config.json | 26 ++ frameworks/Luau/lute/lute.dockerfile | 19 + frameworks/Luau/lute/rokit.toml | 7 + frameworks/Luau/lute/src/json.luau | 486 +++++++++++++++++++++ frameworks/Luau/lute/src/parallel.luau | 9 + frameworks/Luau/lute/src/serve.luau | 33 ++ 7 files changed, 592 insertions(+) create mode 100755 frameworks/Luau/lute/README.md create mode 100755 frameworks/Luau/lute/benchmark_config.json create mode 100644 frameworks/Luau/lute/lute.dockerfile create mode 100644 frameworks/Luau/lute/rokit.toml create mode 100644 frameworks/Luau/lute/src/json.luau create mode 100644 frameworks/Luau/lute/src/parallel.luau create mode 100644 frameworks/Luau/lute/src/serve.luau diff --git a/frameworks/Luau/lute/README.md b/frameworks/Luau/lute/README.md new file mode 100755 index 00000000000..53dcca2b161 --- /dev/null +++ b/frameworks/Luau/lute/README.md @@ -0,0 +1,12 @@ +# Lute Benchmarking Test + +[Lute](https://github.com/aatxe/lute) is a runtime for [Luau](https://luau.org/), a typed scripting language derived from Lua. + +## Test URLs +### JSON + +http://localhost:3000/json + +### PLAINTEXT + +http://localhost:3000/plaintext diff --git a/frameworks/Luau/lute/benchmark_config.json b/frameworks/Luau/lute/benchmark_config.json new file mode 100755 index 00000000000..201399976ee --- /dev/null +++ b/frameworks/Luau/lute/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "lute", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 3000, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Luau", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Lute", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Luau/lute/lute.dockerfile b/frameworks/Luau/lute/lute.dockerfile new file mode 100644 index 00000000000..2fca69214eb --- /dev/null +++ b/frameworks/Luau/lute/lute.dockerfile @@ -0,0 +1,19 @@ +FROM ubuntu:24.04 + +EXPOSE 3000 + +WORKDIR /app + +RUN apt-get update && apt-get install -y curl unzip + +COPY rokit.toml . + +RUN curl -sSf https://raw.githubusercontent.com/rojo-rbx/rokit/main/scripts/install.sh | bash + +ENV PATH="/root/.rokit/bin:${PATH}" + +RUN rokit install --no-trust-check + +COPY ./src . + +CMD ["sh", "-c", "lute parallel.luau -- $(nproc)"] diff --git a/frameworks/Luau/lute/rokit.toml b/frameworks/Luau/lute/rokit.toml new file mode 100644 index 00000000000..83ad1526885 --- /dev/null +++ b/frameworks/Luau/lute/rokit.toml @@ -0,0 +1,7 @@ +# This file lists tools managed by Rokit, a toolchain manager for Roblox projects. +# For more information, see https://github.com/rojo-rbx/rokit + +# New tools can be added by running `rokit add ` in a terminal. + +[tools] +lute = "aatxe/lute@0.1.0-nightly.20250322" diff --git a/frameworks/Luau/lute/src/json.luau b/frameworks/Luau/lute/src/json.luau new file mode 100644 index 00000000000..bc8c40e1251 --- /dev/null +++ b/frameworks/Luau/lute/src/json.luau @@ -0,0 +1,486 @@ +--!strict + +local json = { + --- Not actually a nil value, a newproxy stand-in for a null value since Luau has no actual representation of `null` + NULL = newproxy() :: nil, +} + +type JSONPrimitive = nil | number | string | boolean +type Object = { [string]: Value } +type Array = { Value } +export type Value = JSONPrimitive | Array | Object + +-- serialization + +type SerializerState = { + buf: buffer, + cursor: number, + prettyPrint: boolean, + depth: number, +} + +local function checkState(state: SerializerState, len: number) + local curLen = buffer.len(state.buf) + + if state.cursor + len < curLen then + return + end + + local newBuffer = buffer.create(curLen * 2) + + buffer.copy(newBuffer, 0, state.buf) + + state.buf = newBuffer +end + +local function writeByte(state: SerializerState, byte: number) + checkState(state, 1) + + buffer.writeu8(state.buf, state.cursor, byte) + + state.cursor += 1 +end + +local function writeSpaces(state: SerializerState) + if state.depth == 0 then + return + end + + if state.prettyPrint then + checkState(state, state.depth * 4) + + for i = 0, state.depth do + buffer.writeu32(state.buf, state.cursor, 0x_20_20_20_20) + state.cursor += 4 + end + else + buffer.writeu8(state.buf, state.cursor, string.byte(" ")) + + state.cursor += 1 + end +end + +local function writeString(state: SerializerState, str: string) + checkState(state, #str) + + buffer.writestring(state.buf, state.cursor, str) + + state.cursor += #str +end + +local serializeAny + +local ESCAPE_MAP = { + [0x5C] = string.byte("\\"), -- 5C = '\' + [0x08] = string.byte("b"), + [0x0C] = string.byte("f"), + [0x0A] = string.byte("n"), + [0x0D] = string.byte("r"), + [0x09] = string.byte("t"), +} + +local function serializeUnicode(codepoint: number) + if codepoint >= 0x10000 then + local high = math.floor((codepoint - 0x10000) / 0x400) + 0xD800 + local low = ((codepoint - 0x10000) % 0x400) + 0xDC00 + return string.format("\\u%04x\\u%04x", high, low) + end + + return string.format("\\u%04x", codepoint) +end + +local function serializeString(state: SerializerState, str: string) + checkState(state, #str) + + writeByte(state, string.byte('"')) + + for pos, codepoint in utf8.codes(str) do + if ESCAPE_MAP[codepoint] then + writeByte(state, string.byte("\\")) + writeByte(state, ESCAPE_MAP[codepoint]) + elseif codepoint < 32 or codepoint > 126 then + writeString(state, serializeUnicode(codepoint)) + else + writeString(state, utf8.char(codepoint)) + end + end + + writeByte(state, string.byte('"')) +end + +local function serializeArray(state: SerializerState, array: Array) + state.depth += 1 + + writeByte(state, string.byte("[")) + + if state.prettyPrint and #array ~= 0 then + writeByte(state, string.byte("\n")) + end + + for i, value in array do + if i ~= 1 then + writeByte(state, string.byte(",")) + + if state.prettyPrint then + writeByte(state, string.byte("\n")) + end + end + + if i ~= 1 or state.prettyPrint then + writeSpaces(state) + end + + serializeAny(state, value) + end + + state.depth -= 1 + + if state.prettyPrint and #array ~= 0 then + writeByte(state, string.byte("\n")) + writeSpaces(state) + end + + writeByte(state, string.byte("]")) +end + +local function serializeTable(state: SerializerState, object: Object) + writeByte(state, string.byte("{")) + + if state.prettyPrint then + writeByte(state, string.byte("\n")) + end + + state.depth += 1 + + local first = true + for key, value in object do + if not first then + writeByte(state, string.byte(",")) + writeByte(state, string.byte(" ")) + + if state.prettyPrint then + writeByte(state, string.byte("\n")) + end + end + + first = false + + writeSpaces(state) + + writeByte(state, string.byte('"')) + writeString(state, key) + writeString(state, '": ') + + serializeAny(state, value) + end + + if state.prettyPrint then + writeByte(state, string.byte("\n")) + end + + state.depth -= 1 + + writeSpaces(state) + + writeByte(state, string.byte("}")) +end + +serializeAny = function(state: SerializerState, value: Value) + local valueType = type(value) + + if value == json.NULL then + writeString(state, "null") + elseif valueType == "boolean" then + writeString(state, if value then "true" else "false") + elseif valueType == "number" then + writeString(state, tostring(value)) + elseif valueType == "string" then + serializeString(state, value :: string) + elseif valueType == "table" then + if #(value :: {}) == 0 and next(value :: {}) ~= nil then + serializeTable(state, value :: Object) + else + serializeArray(state, value :: Array) + end + else + error("Unknown value", 2) + end +end + +-- deserialization + +type DeserializerState = { + src: string, + cursor: number, +} + +local function deserializerError(state: DeserializerState, msg: string): never + return error(`JSON error - {msg} around {state.cursor}`) +end + +local function skipWhitespace(state: DeserializerState): boolean + state.cursor = string.find(state.src, "%S", state.cursor) :: number + + if not state.cursor then + return false + end + + return true +end + +local function currentByte(state: DeserializerState) + return string.byte(state.src, state.cursor) +end + +local function deserializeNumber(state: DeserializerState) + -- first "segment" + local nStart, nEnd = string.find(state.src, "^[%-%deE]*", state.cursor) + + if not nStart then + -- i dont think this is possible + deserializerError(state, "Could not match a number literal?") + end + + if string.byte(state.src, nEnd :: number + 1) == string.byte(".") then -- decimal! + local decStart, decEnd = string.find(state.src, "^[eE%-+%d]+", nEnd :: number + 2) + + if not decStart then + deserializerError(state, "Trailing '.' in number value") + end + + nEnd = decEnd + end + + local num = tonumber(string.sub(state.src, nStart :: number, nEnd)) + + if not num then + deserializerError(state, "Malformed number value") + end + + state.cursor = nEnd :: number + 1 + + return num +end + +local function decodeSurrogatePair(high, low): string? + local highVal = tonumber(high, 16) + local lowVal = tonumber(low, 16) + + if not highVal or not lowVal then + return nil -- Invalid + end + + -- Calculate the actual Unicode codepoint + local codepoint = 0x10000 + ((highVal - 0xD800) * 0x400) + (lowVal - 0xDC00) + return utf8.char(codepoint) +end + +local function deserializeString(state: DeserializerState): string + state.cursor += 1 + + local startPos = state.cursor + + if currentByte(state) == string.byte('"') then + state.cursor += 1 + + return "" + end + + while state.cursor <= #state.src do + if currentByte(state) == string.byte('"') then + state.cursor += 1 + + local source = string.sub(state.src, startPos, state.cursor - 2) + + source = string.gsub( + source, + "\\u([dD]83[dD])\\u(d[cC]%w%w)", + function(high, low) + return decodeSurrogatePair(high, low) + or deserializerError(state, "Invalid unicode surrogate pair") + end :: any + ) + -- Handle regular Unicode escapes + source = string.gsub(source, "\\u(%x%x%x%x)", function(code) + return utf8.char(tonumber(code, 16) :: number) + end) + + source = string.gsub(source, "\\\\", "\0") + source = string.gsub(source, "\\b", "\b") + source = string.gsub(source, "\\f", "\f") + source = string.gsub(source, "\\n", "\n") + source = string.gsub(source, "\\r", "\r") + source = string.gsub(source, "\\t", "\t") + source = string.gsub(source, '\\"', '"') + source = string.gsub(source, '\0', '\\') + + return source + end + + if currentByte(state) == string.byte("\\") then + state.cursor += 1 + end + + state.cursor += 1 + end + + -- error + + state.cursor = startPos + + return deserializerError(state, "Unterminated string") +end + +local deserialize + +local function deserializeArray(state: DeserializerState): Array + state.cursor += 1 + + local current: Array = {} + + local expectingValue = false + while state.cursor < #state.src do + skipWhitespace(state) + + if currentByte(state) == string.byte(",") then + expectingValue = true + state.cursor += 1 + end + + skipWhitespace(state) + + if currentByte(state) == string.byte("]") then + break + end + + table.insert(current, deserialize(state)) + + expectingValue = false + end + + if expectingValue then + deserializerError(state, "Trailing comma") + end + + if not skipWhitespace(state) or currentByte(state) ~= string.byte("]") then + deserializerError(state, "Unterminated array") + end + + state.cursor += 1 + + return current +end + +local function deserializeObject(state: DeserializerState): Object + state.cursor += 1 + + local current = {} + + local expectingValue = false + while state.cursor < #state.src do + skipWhitespace(state) + + if currentByte(state) == string.byte("}") then + break + end + + skipWhitespace(state) + + if currentByte(state) ~= string.byte('"') then + return deserializerError(state, "Expected a string key") + end + + local key = deserializeString(state) + + skipWhitespace(state) + + if currentByte(state) ~= string.byte(":") then + return deserializerError(state, "Expected ':' for key value pair") + end + + state.cursor += 1 + + local value = deserialize(state) + + current[key] = value + + if not skipWhitespace(state) then + deserializerError(state, "Unterminated object") + end + + skipWhitespace(state) + + if currentByte(state) == string.byte(",") then + expectingValue = true + state.cursor += 1 + else + expectingValue = false + end + end + + if expectingValue then + return deserializerError(state, "Trailing comma") + end + + if not skipWhitespace(state) or currentByte(state) ~= string.byte("}") then + deserializerError(state, "Unterminated object") + end + + state.cursor += 1 + + return current +end + +deserialize = function(state: DeserializerState): Value + skipWhitespace(state) + + local fourChars = string.sub(state.src, state.cursor, state.cursor + 3) + + if fourChars == "null" then + state.cursor += 4 + return json.NULL + elseif fourChars == "true" then + state.cursor += 4 + return true + elseif string.sub(state.src, state.cursor, state.cursor + 4) == "false" then + state.cursor += 5 + return false + elseif string.match(state.src, "^[%d%.]", state.cursor) then + -- number + return deserializeNumber(state) + elseif string.byte(state.src, state.cursor) == string.byte('"') then + return deserializeString(state) + elseif string.byte(state.src, state.cursor) == string.byte("[") then + return deserializeArray(state) + elseif string.byte(state.src, state.cursor) == string.byte("{") then + return deserializeObject(state) + end + + return deserializerError(state, `Unexpected token '{string.sub(state.src, state.cursor, state.cursor)}'`) +end + +-- user-facing + +json.serialize = function(value: Value, prettyPrint: boolean?) + local state: SerializerState = { + buf = buffer.create(1024), + cursor = 0, + prettyPrint = prettyPrint or false, + depth = 0, + } + + serializeAny(state, value) + + return buffer.readstring(state.buf, 0, state.cursor) +end + +json.deserialize = function(src: string) + local state = { + src = src, + cursor = 0, + } + + return deserialize(state) +end + +return table.freeze(json) diff --git a/frameworks/Luau/lute/src/parallel.luau b/frameworks/Luau/lute/src/parallel.luau new file mode 100644 index 00000000000..df3f97a505e --- /dev/null +++ b/frameworks/Luau/lute/src/parallel.luau @@ -0,0 +1,9 @@ +local vm = require("@lute/vm") + +local threadCount = tonumber(...) + +for i = 1, threadCount do + coroutine.resume(coroutine.create(vm.create("./serve").serve)) +end + +print(`Created {threadCount} server threads`) diff --git a/frameworks/Luau/lute/src/serve.luau b/frameworks/Luau/lute/src/serve.luau new file mode 100644 index 00000000000..53d34f06b72 --- /dev/null +++ b/frameworks/Luau/lute/src/serve.luau @@ -0,0 +1,33 @@ +local net = require("@lute/net") +local json = require("./json") + +return { + serve = function() + net.serve(function(req) + if req.path == "/plaintext" then + return { + status = 200, + headers = { + ["Content-Type"] = "text/plain", + ["Server"] = "Lute", + }, + body = "Hello, world!", + } + elseif req.path == "/json" then + return { + status = 200, + headers = { + ["Content-Type"] = "application/json", + ["Server"] = "Lute", + }, + body = json.serialize({ message = "Hello, world!" }), + } + else + return { + status = 404, + body = "Not Found", + } + end + end) + end, +} From 9a262d7e47b41009db08c7fda3cd55e429863855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Mon, 24 Mar 2025 23:58:23 +0800 Subject: [PATCH 1297/1766] Upgrade smart-socket (#9712) --- frameworks/Java/smart-socket/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 402693dcb80..ce10ecfc94b 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -22,6 +22,11 @@ feat-cloud-starter 0.8.2
      + + io.github.smartboot.socket + aio-pro + 1.6.56 + tech.smartboot.servlet servlet-core From 859c6f2295fabb2c60509b4f2eb337e449e8849e Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 24 Mar 2025 16:58:48 +0100 Subject: [PATCH 1298/1766] [ruby/sinatra] Remove passenger (#9713) Remove passenger as it is the slowest and it doesn't differentiate that much. --- frameworks/Ruby/sinatra-sequel/Gemfile | 4 --- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 8 ------ .../Ruby/sinatra-sequel/benchmark_config.json | 20 ------------- frameworks/Ruby/sinatra-sequel/boot.rb | 19 ++----------- ...a-sequel-postgres-passenger-mri.dockerfile | 28 ------------------- frameworks/Ruby/sinatra/Gemfile | 4 --- frameworks/Ruby/sinatra/Gemfile.lock | 6 ---- frameworks/Ruby/sinatra/benchmark_config.json | 20 ------------- frameworks/Ruby/sinatra/boot.rb | 14 +--------- .../sinatra-postgres-passenger-mri.dockerfile | 28 ------------------- 10 files changed, 4 insertions(+), 147 deletions(-) delete mode 100644 frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile delete mode 100644 frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 4b906cf4be1..9c25813a61a 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -17,10 +17,6 @@ group :iodine, optional: true do gem 'iodine', '~> 0.7', platforms: [:ruby, :mswin], require: false end -group :passenger, optional: true do - gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false -end - group :puma, optional: true do gem 'puma', '~> 6.4', require: false end diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index d53049e2d18..83fa4b0a229 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -11,10 +11,6 @@ GEM ruby2_keywords (~> 0.0.1) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.26) - rack (>= 1.6.13) - rackup (>= 2.0.0) - rake (>= 12.3.3) pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) @@ -26,10 +22,7 @@ GEM rack-session (2.1.0) base64 (>= 0.1.0) rack (>= 3.0.0) - rackup (2.2.1) - rack (>= 3) raindrops (0.20.1) - rake (13.2.1) ruby2_keywords (0.0.5) sequel (5.90.0) bigdecimal @@ -57,7 +50,6 @@ DEPENDENCIES iodine (~> 0.7) json (~> 2.8) mysql2 (~> 0.5) - passenger (~> 6.0) pg (~> 1.5) puma (~> 6.4) sequel (~> 5.0) diff --git a/frameworks/Ruby/sinatra-sequel/benchmark_config.json b/frameworks/Ruby/sinatra-sequel/benchmark_config.json index 94ffb819bb1..187cb418def 100644 --- a/frameworks/Ruby/sinatra-sequel/benchmark_config.json +++ b/frameworks/Ruby/sinatra-sequel/benchmark_config.json @@ -62,26 +62,6 @@ "versus": "rack-sequel-postgres-iodine-mri", "notes": "" }, - "postgres-passenger-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Passenger", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-sequel-postgres-passenger-mri", - "versus": "rack-sequel-postgres-passenger-mri", - "notes": "" - }, "postgres-unicorn-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index c86f4fb9f34..3cff8a30069 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -8,17 +8,7 @@ QUERIES_MIN = 1 QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true - -SERVER_STRING = - if defined?(PhusionPassenger) - 'passenger' - elsif defined?(Puma) - 'puma' - elsif defined?(Unicorn) - 'unicorn' - elsif defined?(Iodine) - 'iodine' - end +SERVER_STRING = "Sinatra" Bundler.require(:default) # Load core modules @@ -33,13 +23,10 @@ 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) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 + if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor opts[:pool_timeout] = 10 - elsif defined?(Unicorn) || defined?(Passenger) + elsif defined?(Unicorn) Sequel.single_threaded = true end diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile deleted file mode 100644 index 1bb51a99587..00000000000 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM ruby:3.4 - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra-sequel -WORKDIR /sinatra-sequel - -ENV BUNDLE_WITH=postgresql:passenger -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=postgresql - -RUN ruby -r /sinatra-sequel/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production - diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 70a541e6be1..180ba944492 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -16,10 +16,6 @@ group :iodine, optional: true do gem 'iodine', '~> 0.7', platforms: [:ruby, :mswin], require: false end -group :passenger, optional: true do - gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false -end - group :puma, optional: true do gem 'puma', '~> 6.4', require: false end diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index a6a79d096c3..bd47b9778a6 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -38,10 +38,6 @@ GEM ruby2_keywords (~> 0.0.1) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.26) - rack (>= 1.6.13) - rackup (>= 2.0.0) - rake (>= 12.3.3) pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) @@ -56,7 +52,6 @@ GEM rackup (2.2.1) rack (>= 3) raindrops (0.20.1) - rake (13.2.1) ruby2_keywords (0.0.5) securerandom (0.4.1) sinatra (4.1.1) @@ -86,7 +81,6 @@ DEPENDENCIES iodine (~> 0.7) json (~> 2.8) mysql2 (~> 0.5) - passenger (~> 6.0) pg (~> 1.5) puma (~> 6.4) rackup diff --git a/frameworks/Ruby/sinatra/benchmark_config.json b/frameworks/Ruby/sinatra/benchmark_config.json index 611f763606b..58481db7cd5 100644 --- a/frameworks/Ruby/sinatra/benchmark_config.json +++ b/frameworks/Ruby/sinatra/benchmark_config.json @@ -88,26 +88,6 @@ "versus": "rack-postgres-iodine-mri", "notes": "" }, - "postgres-passenger-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Passenger", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-postgres-passenger-mri", - "versus": "rack-postgres-passenger-mri", - "notes": "" - }, "postgres-unicorn-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index c0c905d21ee..9431a3d7c98 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -7,19 +7,7 @@ ALL_IDS = ID_RANGE.to_a QUERIES_MIN = 1 QUERIES_MAX = 500 - -SERVER_STRING = - if defined?(PhusionPassenger) - 'passenger' - elsif defined?(Puma) - 'puma' - elsif defined?(Unicorn) - 'unicorn' - elsif defined?(Iodine) - 'iodine' - elsif defined?(Agoo) - 'agoo' - end +SERVER_STRING = "Sinatra" Bundler.require(:default) # Load core modules diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile deleted file mode 100644 index b7860ac22f5..00000000000 --- a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM ruby:3.4 - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra -WORKDIR /sinatra - -ENV BUNDLE_WITH=postgresql:passenger -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=postgresql - -RUN ruby -r /sinatra/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production - From 0e740356448f559f52ebf10451646d4c8da91b53 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 24 Mar 2025 17:04:35 +0100 Subject: [PATCH 1299/1766] [ruby/rack-sequel] Remove passenger (#9714) Remove passenger as it is the slowest and it doesn't differtiate that much. --- frameworks/Ruby/rack-sequel/Gemfile | 5 --- frameworks/Ruby/rack-sequel/Gemfile.lock | 10 ----- .../Ruby/rack-sequel/benchmark_config.json | 40 ------------------- frameworks/Ruby/rack-sequel/hello_world.rb | 12 +----- .../rack-sequel-passenger-mri.dockerfile | 29 -------------- ...k-sequel-postgres-passenger-mri.dockerfile | 28 ------------- 6 files changed, 1 insertion(+), 123 deletions(-) delete mode 100644 frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile delete mode 100644 frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 5389d9134d6..93632125c9e 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -13,11 +13,6 @@ group :postgresql, optional: true do gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false end -group :passenger, optional: true do - gem 'base64' # required by passenger on Ruby 3.4 - gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false -end - group :puma, optional: true do gem 'puma', '~> 6.5', require: false end diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index cd3ddd3e3ff..6216dbfb065 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -1,24 +1,16 @@ GEM remote: https://rubygems.org/ specs: - base64 (0.2.0) bigdecimal (3.1.9) json (2.10.1) kgio (2.11.4) mysql2 (0.5.6) nio4r (2.7.4) - passenger (6.0.26) - rack (>= 1.6.13) - rackup (>= 2.0.0) - rake (>= 12.3.3) pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) rack (3.1.11) - rackup (2.2.1) - rack (>= 3) raindrops (0.20.1) - rake (13.2.1) sequel (5.90.0) bigdecimal sequel_pg (1.17.1) @@ -34,10 +26,8 @@ PLATFORMS x86_64-linux DEPENDENCIES - base64 json (~> 2.8) mysql2 (~> 0.4) - passenger (~> 6.0) pg (~> 1.5) puma (~> 6.5) rack (~> 3.0) diff --git a/frameworks/Ruby/rack-sequel/benchmark_config.json b/frameworks/Ruby/rack-sequel/benchmark_config.json index 64663f27632..83d94802995 100644 --- a/frameworks/Ruby/rack-sequel/benchmark_config.json +++ b/frameworks/Ruby/rack-sequel/benchmark_config.json @@ -42,46 +42,6 @@ "versus": null, "notes": "" }, - "passenger-mri": { - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "rack", - "language": "Ruby", - "orm": "Micro", - "platform": "Rack", - "webserver": "Passenger", - "os": "Linux", - "database_os": "Linux", - "display_name": "rack-sequel-passenger-mri", - "versus": null, - "notes": "" - }, - "postgres-passenger-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "rack", - "language": "Ruby", - "orm": "Micro", - "platform": "Rack", - "webserver": "Passenger", - "os": "Linux", - "database_os": "Linux", - "display_name": "rack-sequel-postgres-passenger-mri", - "versus": null, - "notes": "" - }, "unicorn-mri": { "db_url": "/db", "query_url": "/queries?queries=", diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 7e7c1beb144..e8507d3c54c 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -15,17 +15,7 @@ class HelloWorld PLAINTEXT_TYPE = 'text/plain' DATE = 'Date' SERVER = 'Server' - SERVER_STRING = if defined?(PhusionPassenger) - 'Passenger' - elsif defined?(Puma) - 'Puma' - elsif defined?(Iodine) - 'Iodine' - elsif defined?(Unicorn) - 'Unicorn' - else - 'Ruby Rack' - end + SERVER_STRING = "Rack" def bounded_queries(env) params = Rack::Utils.parse_query(env['QUERY_STRING']) diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile deleted file mode 100644 index 7583be33de6..00000000000 --- a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM ruby:3.4 - -ADD ./ /rack-sequel - -WORKDIR /rack-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -RUN bundle config set with 'mysql passenger' -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=mysql - -RUN ruby -r /rack-sequel/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production - diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile deleted file mode 100644 index 8ea750bd282..00000000000 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM ruby:3.4 - -ADD ./ /rack-sequel - -WORKDIR /rack-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -RUN bundle config set with 'postgresql passenger' -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile - -# TODO: https://github.com/phusion/passenger/issues/1916 -ENV _PASSENGER_FORCE_HTTP_SESSION=true -ENV DBTYPE=postgresql - -RUN ruby -r /rack-sequel/config/auto_tune -e 'puts auto_tune.first' > instances - -EXPOSE 8080 - -CMD bundle exec passenger start --log-level 1 \ - --engine builtin --disable-turbocaching --disable-security-update-check \ - --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ - --address 0.0.0.0 --port 8080 --environment production From 20e3c170114fa7a3c9ac73f377e5e977ac0c0b66 Mon Sep 17 00:00:00 2001 From: Kayden <143221653+Kayden1412@users.noreply.github.com> Date: Mon, 24 Mar 2025 23:05:58 +0700 Subject: [PATCH 1300/1766] [Zig] Add ZZZ framework (#9715) * feat(zig) add zzz * Update benchmark_config.json * feat(zig/zzz): add date header * fix(main.zig) build error * fix(main.zig) build error 2 * Dupa date * Alloc date * Fix build error * Update main.zig * Fix date * Update README.md * Fix build error 3 --- frameworks/Zig/zzz/.gitignore | 2 + frameworks/Zig/zzz/README.md | 18 +++++ frameworks/Zig/zzz/benchmark_config.json | 24 ++++++ frameworks/Zig/zzz/build.zig | 22 ++++++ frameworks/Zig/zzz/build.zig.zon | 17 +++++ frameworks/Zig/zzz/src/main.zig | 94 ++++++++++++++++++++++++ frameworks/Zig/zzz/zzz.dockerfile | 21 ++++++ 7 files changed, 198 insertions(+) create mode 100644 frameworks/Zig/zzz/.gitignore create mode 100644 frameworks/Zig/zzz/README.md create mode 100644 frameworks/Zig/zzz/benchmark_config.json create mode 100644 frameworks/Zig/zzz/build.zig create mode 100644 frameworks/Zig/zzz/build.zig.zon create mode 100644 frameworks/Zig/zzz/src/main.zig create mode 100644 frameworks/Zig/zzz/zzz.dockerfile diff --git a/frameworks/Zig/zzz/.gitignore b/frameworks/Zig/zzz/.gitignore new file mode 100644 index 00000000000..4d2782fa13c --- /dev/null +++ b/frameworks/Zig/zzz/.gitignore @@ -0,0 +1,2 @@ +.zig-out +.zig-cache diff --git a/frameworks/Zig/zzz/README.md b/frameworks/Zig/zzz/README.md new file mode 100644 index 00000000000..b92aa3c9504 --- /dev/null +++ b/frameworks/Zig/zzz/README.md @@ -0,0 +1,18 @@ + +# [ZZZ](https://github.com/tardy-org/zzz) - Web Franework. + +## Description + +ZZZ is a framework for writing performant and reliable networked services in Zig. It supports both HTTP and HTTPS. + +## Test URLs + +### Test 1: JSON Encoding + + http://localhost:8080/json + +### Test 2: Plaintext + + http://localhost:8080/plaintext + + diff --git a/frameworks/Zig/zzz/benchmark_config.json b/frameworks/Zig/zzz/benchmark_config.json new file mode 100644 index 00000000000..84a86305ebe --- /dev/null +++ b/frameworks/Zig/zzz/benchmark_config.json @@ -0,0 +1,24 @@ +{ + "framework": "zzz", + "tests": [{ + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "zzz", + "language": "Zig", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ZZZ (Zig)", + "notes": "", + "versus": "" + } + }] +} diff --git a/frameworks/Zig/zzz/build.zig b/frameworks/Zig/zzz/build.zig new file mode 100644 index 00000000000..44345668450 --- /dev/null +++ b/frameworks/Zig/zzz/build.zig @@ -0,0 +1,22 @@ +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + const root_source_file = b.path("src/main.zig"); + + const zzz = b.dependency("zzz", .{ + .target = target, + .optimize = optimize, + }); + + const exe = b.addExecutable(.{ + .name = "zzz", + .target = target, + .optimize = optimize, + .root_source_file = root_source_file, + .strip = true, + }); + exe.root_module.addImport("zzz", zzz.module("zzz")); + b.installArtifact(exe); +} diff --git a/frameworks/Zig/zzz/build.zig.zon b/frameworks/Zig/zzz/build.zig.zon new file mode 100644 index 00000000000..8147f5750a0 --- /dev/null +++ b/frameworks/Zig/zzz/build.zig.zon @@ -0,0 +1,17 @@ +.{ + .name = .zzz_bench, + .version = "0.0.0", + .fingerprint = 0xab2ef1c28b2bcc91, + .minimum_zig_version = "0.14.0", + .dependencies = .{ + .zzz = .{ + .url = "git+https://github.com/tardy-org/zzz#90cc62494644e7234efd85ab1df5d65440f9eead", + .hash = "zzz-0.3.0-4HoaJqpQAgDgcImt8cC2cpT59J25JNDynMDt4qLaXDYK", + }, + }, + .paths = .{ + "src/", + "build.zig", + "build.zig.zon", + }, +} diff --git a/frameworks/Zig/zzz/src/main.zig b/frameworks/Zig/zzz/src/main.zig new file mode 100644 index 00000000000..3f4c1014cc8 --- /dev/null +++ b/frameworks/Zig/zzz/src/main.zig @@ -0,0 +1,94 @@ +const std = @import("std"); + +const zzz = @import("zzz"); +const http = zzz.HTTP; + +const tardy = zzz.tardy; +const Tardy = tardy.Tardy(.auto); +const Runtime = tardy.Runtime; +const Socket = tardy.Socket; + +const Server = http.Server; +const Router = http.Router; +const Context = http.Context; +const Route = http.Route; +const Respond = http.Respond; + +const Message = struct { message: []const u8 }; +var date: [29]u8 = undefined; + +pub fn main() !void { + const host: []const u8 = "0.0.0.0"; + const port: u16 = 8080; + + const date_thread = try std.Thread.spawn(.{}, struct { + fn a() !void { + while (true) { + var d = http.Date.init(std.time.timestamp()); + const http_date = d.to_http_date(); + _ = try http_date.into_buf(date[0..]); + std.time.sleep(std.time.ns_per_ms * 985); + } + } + }.a, .{}); + + date_thread.detach(); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + defer if (gpa.deinit() == .leak) { + @panic("Memory leak has occurred!"); + }; + + const allocator = gpa.allocator(); + + var t = try Tardy.init(allocator, .{ + .threading = .all, + }); + defer t.deinit(); + + var router = try Router.init(allocator, &.{ + Route.init("/plaintext").get({}, home_handler).layer(), + Route.init("/json").get({}, json_handler).layer(), + }, .{}); + defer router.deinit(allocator); + + var socket = try Socket.init(.{ .tcp = .{ .host = host, .port = port } }); + defer socket.close_blocking(); + try socket.bind(); + try socket.listen(4096); + + const EntryParams = struct { + router: *const Router, + socket: Socket, + }; + + try t.entry( + EntryParams{ .router = &router, .socket = socket }, + struct { + fn entry(rt: *Runtime, p: EntryParams) !void { + var server = Server.init(.{ + .capture_count_max = 0, + }); + try server.serve(rt, p.router, .{ .normal = p.socket }); + } + }.entry, + ); +} + +pub fn home_handler(ctx: *const Context, _: void) !Respond { + try ctx.response.headers.put("Date", try ctx.allocator.dupe(u8, date[0..])); + return ctx.response.apply(.{ + .mime = http.Mime.TEXT, + .body = "Hello, World!", + .status = .OK, + }); +} + +pub fn json_handler(ctx: *const Context, _: void) !Respond { + try ctx.response.headers.put("Date", try ctx.allocator.dupe(u8, date[0..])); + return ctx.response.apply(.{ + .mime = http.Mime.JSON, + .body = try std.json.stringifyAlloc(ctx.allocator, Message{ .message = "Hello, World!" }, .{}), + .status = .OK, + }); +} diff --git a/frameworks/Zig/zzz/zzz.dockerfile b/frameworks/Zig/zzz/zzz.dockerfile new file mode 100644 index 00000000000..8411a39ba09 --- /dev/null +++ b/frameworks/Zig/zzz/zzz.dockerfile @@ -0,0 +1,21 @@ +FROM debian:12.9 + +WORKDIR /app + +COPY src src +COPY build.zig.zon build.zig.zon +COPY build.zig build.zig + +ARG ZIG_VER=0.14.0 + +RUN apt-get update && apt-get install -y curl xz-utils ca-certificates + +RUN curl https://ziglang.org/download/${ZIG_VER}/zig-linux-$(uname -m)-${ZIG_VER}.tar.xz -o zig-linux.tar.xz && \ + tar xf zig-linux.tar.xz && \ + mv zig-linux-$(uname -m)-${ZIG_VER}/ /opt/zig + +RUN /opt/zig/zig build -Doptimize=ReleaseFast + +EXPOSE 8080 + +CMD ["zig-out/bin/zzz"] From 79ff46bf8294c754a9c139670e1bfbe0e8161efd Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 25 Mar 2025 00:08:20 +0800 Subject: [PATCH 1301/1766] Upgrade Angel3 to run on dart 3.6.1 (#9716) * Upgraded Angel3 to run on dart 3.6.1 * Fixed update error * Updated ORM query * Updated ORM query --- frameworks/Dart/angel3/README.md | 16 +- .../Dart/angel3/angel3-mysql.dockerfile | 2 +- frameworks/Dart/angel3/angel3.dockerfile | 2 +- frameworks/Dart/angel3/benchmark_config.json | 3 + .../Dart/angel3/orm-mysql/config/default.yaml | 1 - ...{orm_mysql_app.dart => benchmark_app.dart} | 1 - .../orm-mysql/lib/src/config/config.dart | 1 - .../orm-mysql/lib/src/config/plugins/orm.dart | 36 - .../lib/src/config/plugins/plugins.dart | 1 - .../orm-mysql/lib/src/models/fortune.dart | 1 - .../orm-mysql/lib/src/models/fortune.g.dart | 57 +- .../orm-mysql/lib/src/models/world.g.dart | 57 +- .../src/routes/controllers/controllers.dart | 37 +- .../orm-mysql/lib/src/routes/routes.dart | 1 - .../orm-mysql/lib/src/services/services.dart | 1 - frameworks/Dart/angel3/orm-mysql/pubspec.lock | 622 ++++++++++------- frameworks/Dart/angel3/orm-mysql/pubspec.yaml | 60 +- frameworks/Dart/angel3/orm-mysql/run/dev.dart | 2 +- .../Dart/angel3/orm-mysql/run/prod.dart | 25 +- .../Dart/angel3/orm-mysql/test/all_test.dart | 13 +- .../Dart/angel3/orm/config/default.yaml | 1 - .../Dart/angel3/orm/lib/benchmark_app.dart | 1 - .../orm/lib/src/config/plugins/orm.dart | 59 +- .../angel3/orm/lib/src/models/fortune.g.dart | 57 +- .../angel3/orm/lib/src/models/world.g.dart | 57 +- .../src/routes/controllers/controllers.dart | 37 +- frameworks/Dart/angel3/orm/pubspec.lock | 643 +++++++++++------- frameworks/Dart/angel3/orm/pubspec.yaml | 60 +- frameworks/Dart/angel3/orm/run/prod.dart | 23 - frameworks/Dart/angel3/orm/test/all_test.dart | 6 +- 30 files changed, 1052 insertions(+), 831 deletions(-) rename frameworks/Dart/angel3/orm-mysql/lib/{orm_mysql_app.dart => benchmark_app.dart} (95%) diff --git a/frameworks/Dart/angel3/README.md b/frameworks/Dart/angel3/README.md index b78d395dab1..865387be4fe 100644 --- a/frameworks/Dart/angel3/README.md +++ b/frameworks/Dart/angel3/README.md @@ -1,10 +1,10 @@ # Angel3 Framework Benchmarking Test -This is the Angel3 framework portion of a [benchmarking test suite](../) comparing a variety of web development platforms. +This is the Angel3 framework portion of a [benchmarking test suite](../) comparing a variety of web development platforms. ## Description -All the tests are implemented using the [Angel3 Framework](https://angel3-framework.web.app) with ORM for Postgresql database enabled. The directory layout follows the standard ORM boilerplate template. +All the tests are implemented using the [Angel3 Framework](https://angel3-framework.web.app) with ORM for Postgresql and MySQL database on Dart 3.6. The directory layout follows the standard ORM boilerplate template. ### Test Type Implementation Source Code @@ -28,24 +28,24 @@ The tests were run with: ### JSON -http://localhost:8080/json + ### PLAINTEXT -http://localhost:8080/plaintext + ### DB -http://localhost:8080/db + ### QUERY -http://localhost:8080/query?queries= + ### UPDATE -http://localhost:8080/updates?queries= + ### FORTUNES -http://localhost:8080/fortunes + diff --git a/frameworks/Dart/angel3/angel3-mysql.dockerfile b/frameworks/Dart/angel3/angel3-mysql.dockerfile index 614663423f4..0a796a8da8e 100644 --- a/frameworks/Dart/angel3/angel3-mysql.dockerfile +++ b/frameworks/Dart/angel3/angel3-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM dart:2.19.6 +FROM dart:3.6.1 COPY ./orm-mysql/config /app/config COPY ./orm-mysql/lib /app/lib diff --git a/frameworks/Dart/angel3/angel3.dockerfile b/frameworks/Dart/angel3/angel3.dockerfile index 47ea08cb073..01c25265247 100644 --- a/frameworks/Dart/angel3/angel3.dockerfile +++ b/frameworks/Dart/angel3/angel3.dockerfile @@ -1,4 +1,4 @@ -FROM dart:2.19.6 +FROM dart:3.6.1 COPY ./orm/config /app/config COPY ./orm/lib /app/lib diff --git a/frameworks/Dart/angel3/benchmark_config.json b/frameworks/Dart/angel3/benchmark_config.json index 98ab2c0fde9..414d3bf1b0e 100644 --- a/frameworks/Dart/angel3/benchmark_config.json +++ b/frameworks/Dart/angel3/benchmark_config.json @@ -26,9 +26,12 @@ "versus": "None" }, "mysql": { + "json_url": "/json", "db_url": "/db", + "plaintext_url": "/plaintext", "query_url": "/query?queries=", "fortune_url": "/fortunes", + "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", diff --git a/frameworks/Dart/angel3/orm-mysql/config/default.yaml b/frameworks/Dart/angel3/orm-mysql/config/default.yaml index 3363993352c..4771b8ef9ff 100644 --- a/frameworks/Dart/angel3/orm-mysql/config/default.yaml +++ b/frameworks/Dart/angel3/orm-mysql/config/default.yaml @@ -2,7 +2,6 @@ host: 127.0.0.1 port: 8080 mysql: - #host: localhost host: tfb-database port: 3306 database_name: hello_world diff --git a/frameworks/Dart/angel3/orm-mysql/lib/orm_mysql_app.dart b/frameworks/Dart/angel3/orm-mysql/lib/benchmark_app.dart similarity index 95% rename from frameworks/Dart/angel3/orm-mysql/lib/orm_mysql_app.dart rename to frameworks/Dart/angel3/orm-mysql/lib/benchmark_app.dart index baaf97ce234..f97da4a2ccd 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/orm_mysql_app.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/benchmark_app.dart @@ -1,4 +1,3 @@ -/// Your very own web application! import 'dart:async'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:file/local.dart'; diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/config/config.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/config/config.dart index c485448be83..0f11e856089 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/config/config.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/config/config.dart @@ -1,4 +1,3 @@ -/// Configuration for this Angel instance. import 'package:angel3_configuration/angel3_configuration.dart'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_jael/angel3_jael.dart'; diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/orm.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/orm.dart index 04a1549a976..429dd1bed37 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/orm.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/orm.dart @@ -3,45 +3,9 @@ import 'dart:io'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_orm/angel3_orm.dart'; import 'package:angel3_orm_mysql/angel3_orm_mysql.dart'; -import 'package:mysql1/mysql1.dart'; import 'package:mysql_client/mysql_client.dart'; -// For MariaDb -Future configureServer2(Angel app) async { - try { - var connection = await connectToMariaDb(app.configuration); - var executor = MariaDbExecutor(connection, logger: app.logger); - - app - ..container.registerSingleton(executor) - ..shutdownHooks.add((_) => connection.close()); - } catch (e) { - app.logger.severe("Failed to connect to MariaDB. ORM disabled.", e); - } -} - -// MariaDB connection -Future connectToMariaDb(Map configuration) async { - var mariaDbConfig = configuration['mysql'] as Map? ?? {}; - var settings = ConnectionSettings( - host: mariaDbConfig['host'] as String? ?? 'localhost', - port: mariaDbConfig['port'] as int? ?? 3306, - db: mariaDbConfig['database_name'] as String? ?? - Platform.environment['USER'] ?? - Platform.environment['USERNAME'] ?? - '', - user: mariaDbConfig['username'] as String?, - password: mariaDbConfig['password'] as String?, - timeout: Duration( - seconds: mariaDbConfig['timeout_in_seconds'] as int? ?? 30000), - useSSL: mariaDbConfig['use_ssl'] as bool? ?? false); - - var connection = await MySqlConnection.connect(settings); - return connection; -} - // For Mysql - Future configureServer(Angel app) async { try { var connection = await connectToMysql(app.configuration); diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/plugins.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/plugins.dart index f6200eb62a2..08ebc81a0bf 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/plugins.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/config/plugins/plugins.dart @@ -1,4 +1,3 @@ -/// Custom plugins go here. import 'dart:async'; import 'package:angel3_framework/angel3_framework.dart'; import 'orm.dart' as orm; diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.dart index 3f0a612c0df..03d2ab4c589 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.dart @@ -1,5 +1,4 @@ import 'package:angel3_migration/angel3_migration.dart'; -//import 'package:angel3_model/angel3_model.dart'; import 'package:angel3_serialize/angel3_serialize.dart'; import 'package:angel3_orm/angel3_orm.dart'; import 'package:optional/optional.dart'; diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.g.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.g.dart index 4f706492a2a..d4bd661a8cd 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.g.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/models/fortune.g.dart @@ -26,8 +26,10 @@ class FortuneMigration extends Migration { // ************************************************************************** class FortuneQuery extends Query { - FortuneQuery({Query? parent, Set? trampoline}) - : super(parent: parent) { + FortuneQuery({ + Query? parent, + Set? trampoline, + }) : super(parent: parent) { trampoline ??= {}; trampoline.add(tableName); _where = FortuneQueryWhere(this); @@ -52,7 +54,10 @@ class FortuneQuery extends Query { @override List get fields { - const _fields = ['id', 'message']; + const _fields = [ + 'id', + 'message', + ]; return _selectedFields.isEmpty ? _fields : _fields.where((field) => _selectedFields.contains(field)).toList(); @@ -78,8 +83,9 @@ class FortuneQuery extends Query { return Optional.empty(); } var model = Fortune( - id: fields.contains('id') ? (row[0] as int?) : null, - message: fields.contains('message') ? (row[1] as String?) : null); + id: fields.contains('id') ? mapToInt(row[0]) : null, + message: fields.contains('message') ? (row[1] as String?) : null, + ); return Optional.of(model); } @@ -91,8 +97,14 @@ class FortuneQuery extends Query { class FortuneQueryWhere extends QueryWhere { FortuneQueryWhere(FortuneQuery query) - : id = NumericSqlExpressionBuilder(query, 'id'), - message = StringSqlExpressionBuilder(query, 'message'); + : id = NumericSqlExpressionBuilder( + query, + 'id', + ), + message = StringSqlExpressionBuilder( + query, + 'message', + ); final NumericSqlExpressionBuilder id; @@ -100,7 +112,10 @@ class FortuneQueryWhere extends QueryWhere { @override List get expressionBuilders { - return [id, message]; + return [ + id, + message, + ]; } } @@ -115,11 +130,13 @@ class FortuneQueryValues extends MapQueryValues { } set id(int? value) => values['id'] = value; + String? get message { return (values['message'] as String?); } set message(String? value) => values['message'] = value; + void copyFrom(Fortune model) { id = model.id; message = model.message; @@ -132,7 +149,10 @@ class FortuneQueryValues extends MapQueryValues { @generatedSerializable class Fortune extends _Fortune { - Fortune({this.id, this.message}); + Fortune({ + this.id, + this.message, + }); @override int? id; @@ -140,7 +160,10 @@ class Fortune extends _Fortune { @override String? message; - Fortune copyWith({int? id, String? message}) { + Fortune copyWith({ + int? id, + String? message, + }) { return Fortune(id: id ?? this.id, message: message ?? this.message); } @@ -151,7 +174,10 @@ class Fortune extends _Fortune { @override int get hashCode { - return hashObjects([id, message]); + return hashObjects([ + id, + message, + ]); } @override @@ -189,22 +215,27 @@ class FortuneSerializer extends Codec { @override FortuneEncoder get encoder => const FortuneEncoder(); + @override FortuneDecoder get decoder => const FortuneDecoder(); + static Fortune fromMap(Map map) { return Fortune(id: map['id'] as int?, message: map['message'] as String?); } static Map toMap(_Fortune? model) { if (model == null) { - return {}; + throw FormatException("Required field [model] cannot be null"); } return {'id': model.id, 'message': model.message}; } } abstract class FortuneFields { - static const List allFields = [id, message]; + static const List allFields = [ + id, + message, + ]; static const String id = 'id'; diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/models/world.g.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/models/world.g.dart index b5c66b9c5e5..5b51631b790 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/models/world.g.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/models/world.g.dart @@ -26,7 +26,10 @@ class WorldMigration extends Migration { // ************************************************************************** class WorldQuery extends Query { - WorldQuery({Query? parent, Set? trampoline}) : super(parent: parent) { + WorldQuery({ + Query? parent, + Set? trampoline, + }) : super(parent: parent) { trampoline ??= {}; trampoline.add(tableName); _where = WorldQueryWhere(this); @@ -51,7 +54,10 @@ class WorldQuery extends Query { @override List get fields { - const _fields = ['id', 'randomNumber']; + const _fields = [ + 'id', + 'randomNumber', + ]; return _selectedFields.isEmpty ? _fields : _fields.where((field) => _selectedFields.contains(field)).toList(); @@ -77,9 +83,9 @@ class WorldQuery extends Query { return Optional.empty(); } var model = World( - id: fields.contains('id') ? (row[0] as int?) : null, - randomNumber: - fields.contains('randomNumber') ? (row[1] as int?) : null); + id: fields.contains('id') ? mapToInt(row[0]) : null, + randomNumber: fields.contains('randomNumber') ? mapToInt(row[1]) : null, + ); return Optional.of(model); } @@ -91,8 +97,14 @@ class WorldQuery extends Query { class WorldQueryWhere extends QueryWhere { WorldQueryWhere(WorldQuery query) - : id = NumericSqlExpressionBuilder(query, 'id'), - randomNumber = NumericSqlExpressionBuilder(query, 'randomNumber'); + : id = NumericSqlExpressionBuilder( + query, + 'id', + ), + randomNumber = NumericSqlExpressionBuilder( + query, + 'randomNumber', + ); final NumericSqlExpressionBuilder id; @@ -100,7 +112,10 @@ class WorldQueryWhere extends QueryWhere { @override List get expressionBuilders { - return [id, randomNumber]; + return [ + id, + randomNumber, + ]; } } @@ -115,11 +130,13 @@ class WorldQueryValues extends MapQueryValues { } set id(int? value) => values['id'] = value; + int? get randomNumber { return (values['randomNumber'] as int?); } set randomNumber(int? value) => values['randomNumber'] = value; + void copyFrom(World model) { id = model.id; randomNumber = model.randomNumber; @@ -132,7 +149,10 @@ class WorldQueryValues extends MapQueryValues { @generatedSerializable class World extends _World { - World({this.id, this.randomNumber}); + World({ + this.id, + this.randomNumber, + }); @override int? id; @@ -140,7 +160,10 @@ class World extends _World { @override int? randomNumber; - World copyWith({int? id, int? randomNumber}) { + World copyWith({ + int? id, + int? randomNumber, + }) { return World( id: id ?? this.id, randomNumber: randomNumber ?? this.randomNumber); } @@ -154,7 +177,10 @@ class World extends _World { @override int get hashCode { - return hashObjects([id, randomNumber]); + return hashObjects([ + id, + randomNumber, + ]); } @override @@ -192,8 +218,10 @@ class WorldSerializer extends Codec { @override WorldEncoder get encoder => const WorldEncoder(); + @override WorldDecoder get decoder => const WorldDecoder(); + static World fromMap(Map map) { return World( id: map['id'] as int?, randomNumber: map['randomNumber'] as int?); @@ -201,14 +229,17 @@ class WorldSerializer extends Codec { static Map toMap(_World? model) { if (model == null) { - return {}; + throw FormatException("Required field [model] cannot be null"); } return {'id': model.id, 'randomNumber': model.randomNumber}; } } abstract class WorldFields { - static const List allFields = [id, randomNumber]; + static const List allFields = [ + id, + randomNumber, + ]; static const String id = 'id'; diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/routes/controllers/controllers.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/routes/controllers/controllers.dart index 34fb213ecf9..771995d66a9 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/routes/controllers/controllers.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/routes/controllers/controllers.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:math'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_orm/angel3_orm.dart'; @@ -12,12 +11,12 @@ Future configureServer(Angel app) async { var executor = app.container.make(); // Generate a random number between 1 and 10000 - int _genRandomId() { + int genRandomId() { var rand = Random(); return rand.nextInt(10000) + 1; } - int _parseQueryCount(String? count) { + int parseQueryCount(String? count) { if (count == null) { return 1; } @@ -30,11 +29,11 @@ Future configureServer(Angel app) async { return limit; } - List _generateIds(int maxCount) { + List generateIds(int maxCount) { var result = []; while (result.length < maxCount) { - var id = _genRandomId(); + var id = genRandomId(); if (!result.contains(id)) { result.add(id); } @@ -56,25 +55,18 @@ Future configureServer(Angel app) async { // Add an entry and sort a list of fortune app.get('/fortunes', (req, res) async { - //var stopwatch = Stopwatch()..start(); - var list = await FortuneQuery().get(executor); - //print('Query Time: ${stopwatch.elapsed.inMilliseconds}ms'); - list.add( Fortune(id: 0, message: 'Additional fortune added at request time.')); list.sort((a, b) => a.message?.compareTo(b.message ?? '') ?? 0); - //print('Process Time: ${stopwatch.elapsed.inMilliseconds}ms'); - //stopwatch.stop(); - res.render('listing', {'fortunes': list}); }); // Find a random World app.get('/db', (req, res) async { - var id = _genRandomId(); + var id = genRandomId(); var query = WorldQuery()..where?.id.equals(id); var result = await query.get(executor); if (result.isNotEmpty) { @@ -88,12 +80,12 @@ Future configureServer(Angel app) async { app.get('/query', (req, res) async { var params = req.queryParameters; - var queryLimit = _parseQueryCount(params['queries'] as String?); + var queryLimit = parseQueryCount(params['queries'] as String?); - var list = _generateIds(queryLimit); - var query = WorldQuery(); + var list = generateIds(queryLimit); var result = []; for (var id in list) { + var query = WorldQuery(); query.where?.id.equals(id); var optWorld = await query.getOne(executor); result.add(optWorld.value); @@ -104,28 +96,23 @@ Future configureServer(Angel app) async { // Update a list of worlds app.get('/updates', (req, res) async { - //var stopwatch = Stopwatch()..start(); - var params = req.queryParameters; - var queryLimit = _parseQueryCount(params['queries'] as String?); - var listOfIds = _generateIds(queryLimit); + var queryLimit = parseQueryCount(params['queries'] as String?); + var listOfIds = generateIds(queryLimit); - var query = WorldQuery(); var result = []; for (var id in listOfIds) { + var query = WorldQuery(); query.where?.id.equals(id); var optWorld = await query.getOne(executor); query ..where?.id.equals(optWorld.value.id!) - ..values.randomNumber = _genRandomId(); + ..values.randomNumber = genRandomId(); var updatedRec = await query.updateOne(executor); result.add(updatedRec.value); } - //rint('Process Time: ${stopwatch.elapsed.inMilliseconds}ms'); - //stopwatch.stop(); - res.json(result); }); } diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/routes/routes.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/routes/routes.dart index f09c7af933c..560fc1f8ba9 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/routes/routes.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/routes/routes.dart @@ -1,4 +1,3 @@ -/// This app's route configuration. import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_static/angel3_static.dart'; import 'package:file/file.dart'; diff --git a/frameworks/Dart/angel3/orm-mysql/lib/src/services/services.dart b/frameworks/Dart/angel3/orm-mysql/lib/src/services/services.dart index 188d0b89f81..bf1ce7cb251 100644 --- a/frameworks/Dart/angel3/orm-mysql/lib/src/services/services.dart +++ b/frameworks/Dart/angel3/orm-mysql/lib/src/services/services.dart @@ -1,4 +1,3 @@ -/// Declare services here! import 'dart:async'; import 'package:angel3_framework/angel3_framework.dart'; diff --git a/frameworks/Dart/angel3/orm-mysql/pubspec.lock b/frameworks/Dart/angel3/orm-mysql/pubspec.lock index a9ffdd5bb48..bb10156745f 100644 --- a/frameworks/Dart/angel3/orm-mysql/pubspec.lock +++ b/frameworks/Dart/angel3/orm-mysql/pubspec.lock @@ -5,841 +5,977 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + url: "https://pub.dev" source: hosted - version: "47.0.0" + version: "80.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "7.3.0" angel3_auth: dependency: "direct main" description: name: angel3_auth - url: "https://pub.dartlang.org" + sha256: "3996219fca7a49174c3745732a1e438ec94d55936697f2504196be4f3dbf191a" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_client: dependency: transitive description: name: angel3_client - url: "https://pub.dartlang.org" + sha256: e2886fdb41f243d85003f94127850bdd70f79fa5f7cf1f2b79b4f7029198e9dd + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_configuration: dependency: "direct main" description: name: angel3_configuration - url: "https://pub.dartlang.org" + sha256: f585699cf0ea5376d7ed6310e9fc57ccdd4645e5746ea0bae1fa6c05efe4e810 + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_container: - dependency: transitive + dependency: "direct main" description: name: angel3_container - url: "https://pub.dartlang.org" + sha256: c08ea6b426242861d11109b748792503652a7eb0db4005409c0a031e80820c7f + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_framework: dependency: "direct main" description: name: angel3_framework - url: "https://pub.dartlang.org" + sha256: "91d56825b78846d9294e8aae789362644d4e24df4870d52d6c2cc6d8adf8d2c9" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.5.0" angel3_hot: dependency: "direct dev" description: name: angel3_hot - url: "https://pub.dartlang.org" + sha256: "8e1e7409631a49f05483e2067d1f27f594d558459712311b5ea4317b5519975b" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_http_exception: dependency: transitive description: name: angel3_http_exception - url: "https://pub.dartlang.org" + sha256: "9484b425a1aece1af3f2f0521fba429cd48f0a952521d40281333694c750e4ab" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_jael: dependency: "direct main" description: name: angel3_jael - url: "https://pub.dartlang.org" + sha256: "4ce85198613faff74ac8706065c619e7d6fc609aeb63b2fa7d9dba6f5a981f5c" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_migration: dependency: "direct main" description: name: angel3_migration - url: "https://pub.dartlang.org" + sha256: de7180ce8e48b0fe551c0b96cc83d0cafdcb71de3c75e13b0b08c3fdaf9df351 + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_migration_runner: dependency: "direct dev" description: name: angel3_migration_runner - url: "https://pub.dartlang.org" + sha256: "30596dd82471dcddd35afb8b245c1dd56c8c53bdf77dee5e131c353e37e05f9b" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_mock_request: dependency: transitive description: name: angel3_mock_request - url: "https://pub.dartlang.org" + sha256: "8c8513a649d33c0c0531a120183da558000b4f044a4f30fd3ae22dfe11355a04" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_model: dependency: transitive description: name: angel3_model - url: "https://pub.dartlang.org" + sha256: "9a3f50b02bf119bb160d5f94580940b93973589d9b5949d284d2427b8fb65e16" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_orm: dependency: "direct main" description: name: angel3_orm - url: "https://pub.dartlang.org" + sha256: "9d1831b6b91820e312b52cf4c8c3cebb067be59b47123276fbc7741a01ae2ac5" + url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "8.3.2" angel3_orm_generator: dependency: "direct dev" description: name: angel3_orm_generator - url: "https://pub.dartlang.org" + sha256: "18426152dc86e1f0cd5fab14470f07a5b5ac7dd1b78f7e1bf8986d2625a898ec" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_orm_mysql: dependency: "direct main" description: name: angel3_orm_mysql - url: "https://pub.dartlang.org" + sha256: "63e7a6c36a0e492b89b4677bec9f79042d098063bbecb920705ab60d4415a3c6" + url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "8.3.1" angel3_production: dependency: "direct main" description: name: angel3_production - url: "https://pub.dartlang.org" + sha256: "286d4b6dcd5e4297eea3db93cb419282ca14ef920f77439ef7b42c6229ab6219" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_route: dependency: transitive description: name: angel3_route - url: "https://pub.dartlang.org" + sha256: f2ebf4b134e13f804271d4e164a92de5dd25ad0bb651303df2c9e6fb397f32a8 + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_serialize: dependency: "direct main" description: name: angel3_serialize - url: "https://pub.dartlang.org" + sha256: "4a4658b8af0d0eec6b8816699f137367c6af7c6f6a1f83a84e43fee55f892f5e" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_serialize_generator: dependency: "direct dev" description: name: angel3_serialize_generator - url: "https://pub.dartlang.org" + sha256: "0fd91dd1162f5c0d1b3c0f2734f48787202693926e6d6c97bca18658c8b812f4" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_static: dependency: "direct main" description: name: angel3_static - url: "https://pub.dartlang.org" + sha256: "534e827500304fa4e95f3613b130aad832dc65681b9a4c47a83891f65b04b554" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_test: dependency: "direct dev" description: name: angel3_test - url: "https://pub.dartlang.org" + sha256: "2ae3d83f83fb6c0834948b4ae3afc02da8c7ee38da3e164bd455564267e39ff8" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_validate: dependency: "direct main" description: name: angel3_validate - url: "https://pub.dartlang.org" + sha256: "661ef636583b0e60b35756d3d296d2ef7b257277fa703a494278ace9fcbe4f0c" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_websocket: dependency: transitive description: name: angel3_websocket - url: "https://pub.dartlang.org" + sha256: "160399b1898d5fd9c8294b4321691567687d9d86d8940aea83cc528b85427229" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.7.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.13.0" belatuk_code_buffer: dependency: transitive description: name: belatuk_code_buffer - url: "https://pub.dartlang.org" + sha256: "06c4329570e2cb72cb808c5f19d2004865b7c1f18447d4af16d465776416ccfc" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_combinator: dependency: transitive description: name: belatuk_combinator - url: "https://pub.dartlang.org" + sha256: "0c54ddf1a6a7c94585c55a5852ccc13ad1a871e3e0709d3322d0286eb7afb7d7" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_html_builder: dependency: transitive description: name: belatuk_html_builder - url: "https://pub.dartlang.org" + sha256: "0bdd783a54aa7435c86231b319bfffa06259aea6df59dbec62d351456062e67f" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_http_server: dependency: transitive description: name: belatuk_http_server - url: "https://pub.dartlang.org" + sha256: "2a4ae9409f3586a95a3393b924c86fd38c30d955aa2437070c3198a1ec0a1686" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.5.0" belatuk_json_serializer: dependency: transitive description: name: belatuk_json_serializer - url: "https://pub.dartlang.org" + sha256: b0b6ee6b4aa0552d84b487c5d1a97f72c9d5c4cbc4e2828f57e24635d5d75be8 + url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "7.3.0" belatuk_merge_map: dependency: transitive description: name: belatuk_merge_map - url: "https://pub.dartlang.org" + sha256: "1eb3c77417598e1d40c11d8d93b3c7bb5f10ca0977b2f942c623698bf3745f43" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_pretty_logging: dependency: "direct main" description: name: belatuk_pretty_logging - url: "https://pub.dartlang.org" + sha256: "29fb3127ce58643e59fc4510ce41fa4d795f56997cbc661dffdf07e9a65e7021" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.3.0" belatuk_pub_sub: dependency: transitive description: name: belatuk_pub_sub - url: "https://pub.dartlang.org" + sha256: "08c4f458165f7e2d76a3a4796e94092b98579aedd1fc8a64f39cfbbd18db249d" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.4.0" belatuk_range_header: dependency: transitive description: name: belatuk_range_header - url: "https://pub.dartlang.org" + sha256: "78f315c8a53415a04a77dee3fcec6f867bac77d2e5d3e13ffc7532d1800adc53" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.4.0" belatuk_symbol_table: dependency: transitive description: name: belatuk_symbol_table - url: "https://pub.dartlang.org" + sha256: "154f50623b2c5a669561588d86a445f97cf081de6e690ba9bc866dcd98508f50" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" buffer: dependency: transitive description: name: buffer - url: "https://pub.dartlang.org" + sha256: "389da2ec2c16283c8787e0adaede82b1842102f8c8aae2f49003a766c5c6b3d1" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.3" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.2" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.4" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + url: "https://pub.dev" source: hosted - version: "2.0.10" + version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.4.15" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" source: hosted - version: "7.2.4" + version: "8.0.0" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + url: "https://pub.dev" source: hosted - version: "8.4.1" + version: "8.9.5" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.10.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.19.1" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.2" coverage: dependency: transitive description: name: coverage - url: "https://pub.dartlang.org" + sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 + url: "https://pub.dev" source: hosted - version: "1.6.0" + version: "1.11.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.6" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "3.0.1" dotenv: dependency: transitive description: name: dotenv - url: "https://pub.dartlang.org" + sha256: "379e64b6fc82d3df29461d349a1796ecd2c436c480d4653f3af6872eccbc90e1" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.2.0" file: - dependency: transitive + dependency: "direct main" description: name: file - url: "https://pub.dartlang.org" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.1" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.1" frontend_server_client: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "4.0.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.3.2" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "1.3.0" http2: dependency: transitive description: name: http2 - url: "https://pub.dartlang.org" + sha256: "382d3aefc5bd6dc68c6b892d7664f29b5beb3251611ae946a98d35158a82bbfa" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.3.1" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.1.2" inflection3: dependency: transitive description: name: inflection3 - url: "https://pub.dartlang.org" + sha256: cb54689bcfe3c0168a6979ee3191df584dcef4f870c5ef41c798bcb35ff5aca3 + url: "https://pub.dev" source: hosted version: "0.5.3+2" intl: dependency: transitive description: name: intl - url: "https://pub.dartlang.org" + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.20.2" io: dependency: "direct dev" description: name: io - url: "https://pub.dartlang.org" + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.5" jael3: dependency: "direct main" description: name: jael3 - url: "https://pub.dartlang.org" + sha256: bee0b8d328898dac9008caf7392400d03bc2035a3dd9acebe7ebee052ef9132b + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.2.0" jael3_preprocessor: dependency: transitive description: name: jael3_preprocessor - url: "https://pub.dartlang.org" + sha256: "8e70b92608e61c032f08bed82fa63b82e26b4ede4f4924b81bd75329fae9e9b8" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.2.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.7.1" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.9.0" json_rpc_2: dependency: transitive description: name: json_rpc_2 - url: "https://pub.dartlang.org" + sha256: "246b321532f0e8e2ba474b4d757eaa558ae4fdd0688fdbc1e1ca9705f9b8ca0e" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" lints: dependency: "direct dev" description: name: lints - url: "https://pub.dartlang.org" + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "5.1.1" logging: dependency: "direct main" description: name: logging - url: "https://pub.dartlang.org" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.3.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.17" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.16.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "2.0.0" mysql1: dependency: transitive description: name: mysql1 - url: "https://pub.dartlang.org" + sha256: "68aec7003d2abc85769bafa1777af3f4a390a90c31032b89636758ff8eb839e9" + url: "https://pub.dev" source: hosted version: "0.20.0" mysql_client: - dependency: transitive + dependency: "direct main" description: name: mysql_client - url: "https://pub.dartlang.org" + sha256: "6a0fdcbe3e0721c637f97ad24649be2f70dbce2b21ede8f962910e640f753fc2" + url: "https://pub.dev" source: hosted - version: "0.0.26" + version: "0.0.27" node_preamble: dependency: transitive description: name: node_preamble - url: "https://pub.dartlang.org" + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" optional: dependency: "direct main" description: name: optional - url: "https://pub.dartlang.org" + sha256: f80327d7a3335a0be68418072668043c7ab291df575c21aa42e0c5633641da39 + url: "https://pub.dev" source: hosted version: "6.1.0+1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "1.8.2" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" + version: "1.9.1" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted version: "1.5.1" postgres: dependency: transitive description: name: postgres - url: "https://pub.dartlang.org" + sha256: "7a7f9805d33e41cb14fa22535959f3af51843a792015cdbd8f2fa78bcd1b501b" + url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "3.5.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.5.0" quiver: dependency: transitive description: name: quiver - url: "https://pub.dartlang.org" + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.2" recase: dependency: transitive description: name: recase - url: "https://pub.dartlang.org" + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.0" sasl_scram: dependency: transitive description: name: sasl_scram - url: "https://pub.dartlang.org" + sha256: a47207a436eb650f8fdcf54a2e2587b850dc3caef9973ce01f332b07a6fc9cb9 + url: "https://pub.dev" source: hosted version: "0.1.1" saslprep: dependency: transitive description: name: saslprep - url: "https://pub.dartlang.org" + sha256: "3d421d10be9513bf4459c17c5e70e7b8bc718c9fc5ad4ba5eb4f5fd27396f740" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.2" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - url: "https://pub.dartlang.org" + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" shelf_static: dependency: transitive description: name: shelf_static - url: "https://pub.dartlang.org" + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "3.0.0" source_gen: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "2.0.0" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - url: "https://pub.dartlang.org" + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" source_maps: dependency: transitive description: name: source_maps - url: "https://pub.dartlang.org" + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" source: hosted - version: "0.10.10" + version: "0.10.13" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test: dependency: "direct dev" description: name: test - url: "https://pub.dartlang.org" + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + url: "https://pub.dev" source: hosted - version: "1.21.6" + version: "1.25.15" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" source: hosted - version: "0.4.14" + version: "0.7.4" test_core: dependency: transitive description: name: test_core - url: "https://pub.dartlang.org" + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + url: "https://pub.dev" source: hosted - version: "0.4.18" + version: "0.6.8" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" tuple: dependency: transitive description: name: tuple - url: "https://pub.dartlang.org" + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.2" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" unorm_dart: dependency: transitive description: name: unorm_dart - url: "https://pub.dartlang.org" + sha256: "23d8bf65605401a6a32cff99435fed66ef3dab3ddcad3454059165df46496a3b" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.3.0" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "4.5.1" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "15.0.0" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "3.0.2" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - url: "https://pub.dartlang.org" + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.3" sdks: - dart: ">=2.18.0 <3.0.0" + dart: ">=3.6.0 <4.0.0" diff --git a/frameworks/Dart/angel3/orm-mysql/pubspec.yaml b/frameworks/Dart/angel3/orm-mysql/pubspec.yaml index 4744712db06..1cd83585e76 100644 --- a/frameworks/Dart/angel3/orm-mysql/pubspec.yaml +++ b/frameworks/Dart/angel3/orm-mysql/pubspec.yaml @@ -1,40 +1,38 @@ name: orm_mysql_app -version: 1.0.0 +version: 2.0.0 description: A basic starter application template for Angel3 framework publish_to: none environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=3.6.0 <4.0.0' + dependencies: - angel3_auth: ^7.0.0 - angel3_configuration: ^7.0.0 - angel3_framework: ^7.0.0 - angel3_jael: ^7.0.0 - angel3_migration: ^7.0.0 - angel3_orm: ^7.0.0 - angel3_orm_mysql: ^7.0.0 - angel3_serialize: ^7.0.0 - angel3_production: ^7.0.0 - angel3_static: ^7.0.0 - angel3_validate: ^7.0.0 - jael3: ^7.0.0 - belatuk_pretty_logging: ^5.0.0 + angel3_auth: ^8.3.0 + angel3_configuration: ^8.3.0 + angel3_framework: ^8.5.0 + angel3_jael: ^8.3.0 + angel3_migration: ^8.3.0 + angel3_orm: ^8.3.0 + angel3_orm_mysql: ^8.3.0 + angel3_serialize: ^8.3.0 + angel3_production: ^8.3.0 + angel3_static: ^8.3.0 + angel3_validate: ^8.3.0 + jael3: ^8.0.0 + belatuk_pretty_logging: ^6.0.0 optional: ^6.0.0 - logging: ^1.0.0 + logging: ^1.2.0 + angel3_container: ^8.3.0 + file: ^7.0.1 + mysql_client: ^0.0.27 + dev_dependencies: - angel3_hot: ^7.0.0 - angel3_migration_runner: ^7.0.0 - angel3_orm_generator: ^7.0.0 - angel3_serialize_generator: ^7.0.0 - angel3_test: ^7.0.0 - build_runner: ^2.0.3 + angel3_hot: ^8.0.0 + angel3_migration_runner: ^8.0.0 + angel3_orm_generator: ^8.0.0 + angel3_serialize_generator: ^8.0.0 + angel3_test: ^8.0.0 + build_runner: ^2.4.0 io: ^1.0.0 - test: ^1.17.5 - lints: ^2.0.0 -# dependency_overrides: -# angel3_orm: -# path: ../../../../../belatuk/packages/orm/angel_orm -# angel3_orm_postgres: -# path: ../../../../../belatuk/packages/orm/angel_orm_postgres -# angel3_jael: -# path: ../../../../../belatuk/packages/jael/angel_jael + test: ^1.25.0 + lints: ^5.0.0 \ No newline at end of file diff --git a/frameworks/Dart/angel3/orm-mysql/run/dev.dart b/frameworks/Dart/angel3/orm-mysql/run/dev.dart index cecd1abacbf..33b104e04be 100644 --- a/frameworks/Dart/angel3/orm-mysql/run/dev.dart +++ b/frameworks/Dart/angel3/orm-mysql/run/dev.dart @@ -4,7 +4,7 @@ import 'package:belatuk_pretty_logging/belatuk_pretty_logging.dart'; import 'package:angel3_container/mirrors.dart'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_hot/angel3_hot.dart'; -import 'package:orm_mysql_app/orm_mysql_app.dart'; +import 'package:orm_mysql_app/benchmark_app.dart'; void main() async { // Watch the config/ and web/ directories for changes, and hot-reload the server. diff --git a/frameworks/Dart/angel3/orm-mysql/run/prod.dart b/frameworks/Dart/angel3/orm-mysql/run/prod.dart index 158bc09a567..dfcda79585a 100644 --- a/frameworks/Dart/angel3/orm-mysql/run/prod.dart +++ b/frameworks/Dart/angel3/orm-mysql/run/prod.dart @@ -1,29 +1,6 @@ import 'package:angel3_container/mirrors.dart'; import 'package:angel3_production/angel3_production.dart'; -import 'package:orm_mysql_app/orm_mysql_app.dart'; +import 'package:orm_mysql_app/benchmark_app.dart'; -// NOTE: By default, the Runner class does not use the `MirrorsReflector`, or any -// reflector, by default. -// -// If your application is using any sort of functionality reliant on annotations or reflection, -// either include the MirrorsReflector, or use a static reflector variant. -// -// The following use cases require reflection: -// * Use of Controllers, via @Expose() or @ExposeWS() -// * Use of dependency injection into constructors, whether in controllers or plain `container.make` calls -// * Use of the `ioc` function in any route -// -// The `MirrorsReflector` from `package:angel_container/mirrors.dart` is by far the most convenient pattern, -// so use it if possible. -// -// However, the following alternatives exist: -// * Generation via `package:angel_container_generator` -// * Creating an instance of `StaticReflector` -// * Manually implementing the `Reflector` interface (cumbersome; not recommended) -// -// As of January 4th, 2018, the documentation has not yet been updated to state this, -// so in the meantime, visit the Angel chat for further questions: -// -// https://gitter.im/angel_dart/discussion void main(List args) => Runner('Angel3', configureServer, reflector: MirrorsReflector()).run(args); diff --git a/frameworks/Dart/angel3/orm-mysql/test/all_test.dart b/frameworks/Dart/angel3/orm-mysql/test/all_test.dart index 4fed3057fb5..e8025b27b28 100644 --- a/frameworks/Dart/angel3/orm-mysql/test/all_test.dart +++ b/frameworks/Dart/angel3/orm-mysql/test/all_test.dart @@ -1,22 +1,17 @@ import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_test/angel3_test.dart'; import 'package:test/test.dart'; -import 'package:orm_mysql_app/orm_mysql_app.dart'; +import 'package:orm_mysql_app/benchmark_app.dart'; -// Angel also includes facilities to make testing easier. +// Angel3 also includes facilities to make testing easier. // -// `package:angel_test` ships a client that can test -// both plain HTTP and WebSockets. +// `package:angel3_test` ships a client that can test both plain HTTP and WebSockets. // // Tests do not require your server to actually be mounted on a port, // so they will run faster than they would in other frameworks, where you // would have to first bind a socket, and then account for network latency. // -// See the documentation here: -// https://github.com/angel-dart/test -// -// If you are unfamiliar with Dart's advanced testing library, you can read up -// here: +// If you are unfamiliar with Dart's advanced testing library, you can read up here: // https://github.com/dart-lang/test void main() async { diff --git a/frameworks/Dart/angel3/orm/config/default.yaml b/frameworks/Dart/angel3/orm/config/default.yaml index e43fde7a80c..11a3f44e235 100644 --- a/frameworks/Dart/angel3/orm/config/default.yaml +++ b/frameworks/Dart/angel3/orm/config/default.yaml @@ -2,7 +2,6 @@ host: 127.0.0.1 port: 8080 postgres: - #host: localhost host: tfb-database port: 5432 database_name: hello_world diff --git a/frameworks/Dart/angel3/orm/lib/benchmark_app.dart b/frameworks/Dart/angel3/orm/lib/benchmark_app.dart index baaf97ce234..f97da4a2ccd 100644 --- a/frameworks/Dart/angel3/orm/lib/benchmark_app.dart +++ b/frameworks/Dart/angel3/orm/lib/benchmark_app.dart @@ -1,4 +1,3 @@ -/// Your very own web application! import 'dart:async'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:file/local.dart'; diff --git a/frameworks/Dart/angel3/orm/lib/src/config/plugins/orm.dart b/frameworks/Dart/angel3/orm/lib/src/config/plugins/orm.dart index 87d9defb170..5700708d619 100644 --- a/frameworks/Dart/angel3/orm/lib/src/config/plugins/orm.dart +++ b/frameworks/Dart/angel3/orm/lib/src/config/plugins/orm.dart @@ -3,45 +3,23 @@ import 'dart:io'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_orm/angel3_orm.dart'; import 'package:angel3_orm_postgres/angel3_orm_postgres.dart'; -import 'package:postgres_pool/postgres_pool.dart'; +import 'package:postgres/postgres.dart'; Future configureServer(Angel app) async { var logger = app.environment.isProduction ? null : app.logger; - var connection = await connectToPostgres(app.configuration); - await connection.open(); - var executor = PostgreSqlExecutor(connection, logger: logger); - - //var executor = await connectToPostgresPool(app.configuration, logger); + var connector = await pooledPostgresConnections(app.configuration); + var executor = PostgreSqlPoolExecutor(connector, logger: logger); app ..container.registerSingleton(executor) - ..shutdownHooks.add((_) => connection.close()); -// ..shutdownHooks.add((_) => executor.close()); -} - -Future connectToPostgres(Map configuration) async { - var postgresConfig = configuration['postgres'] as Map? ?? {}; - var connection = PostgreSQLConnection( - postgresConfig['host'] as String? ?? 'localhost', - postgresConfig['port'] as int? ?? 5432, - postgresConfig['database_name'] as String? ?? - Platform.environment['USER'] ?? - Platform.environment['USERNAME'] ?? - '', - username: postgresConfig['username'] as String?, - password: postgresConfig['password'] as String?, - timeZone: postgresConfig['time_zone'] as String? ?? 'UTC', - timeoutInSeconds: postgresConfig['timeout_in_seconds'] as int? ?? 30, - useSSL: postgresConfig['use_ssl'] as bool? ?? false); - return connection; + ..shutdownHooks.add((_) => connector.close()); } -Future connectToPostgresPool( - Map configuration, dynamic logger) async { +Future> pooledPostgresConnections(Map configuration) async { var postgresConfig = configuration['postgres'] as Map? ?? {}; - var _pool = PgPool( - PgEndpoint( + return Pool.withEndpoints([ + Endpoint( host: postgresConfig['host'] as String? ?? 'localhost', port: postgresConfig['port'] as int? ?? 5432, database: postgresConfig['database_name'] as String? ?? @@ -49,18 +27,13 @@ Future connectToPostgresPool( Platform.environment['USERNAME'] ?? '', username: postgresConfig['username'] as String?, - password: postgresConfig['password'] as String?), - settings: PgPoolSettings() - ..maxConnectionAge = Duration(hours: 1) - ..concurrency = 10, - ); - - // Run sql to create the tables in a transaction - //await _pool.runTx((conn) async { - // for (var s in schemas) { - // await conn.execute(await File('test/migrations/$s.sql').readAsString()); - // } - //}); - - return PostgreSqlPoolExecutor(_pool, logger: logger); + password: postgresConfig['password'] as String?) + ], + settings: PoolSettings( + maxConnectionAge: Duration(hours: 1), + maxConnectionCount: 20, + connectTimeout: Duration( + seconds: postgresConfig['timeout_in_seconds'] as int? ?? 30), + timeZone: postgresConfig['time_zone'] as String? ?? 'UTC', + sslMode: SslMode.disable)); } diff --git a/frameworks/Dart/angel3/orm/lib/src/models/fortune.g.dart b/frameworks/Dart/angel3/orm/lib/src/models/fortune.g.dart index 4f706492a2a..d4bd661a8cd 100644 --- a/frameworks/Dart/angel3/orm/lib/src/models/fortune.g.dart +++ b/frameworks/Dart/angel3/orm/lib/src/models/fortune.g.dart @@ -26,8 +26,10 @@ class FortuneMigration extends Migration { // ************************************************************************** class FortuneQuery extends Query { - FortuneQuery({Query? parent, Set? trampoline}) - : super(parent: parent) { + FortuneQuery({ + Query? parent, + Set? trampoline, + }) : super(parent: parent) { trampoline ??= {}; trampoline.add(tableName); _where = FortuneQueryWhere(this); @@ -52,7 +54,10 @@ class FortuneQuery extends Query { @override List get fields { - const _fields = ['id', 'message']; + const _fields = [ + 'id', + 'message', + ]; return _selectedFields.isEmpty ? _fields : _fields.where((field) => _selectedFields.contains(field)).toList(); @@ -78,8 +83,9 @@ class FortuneQuery extends Query { return Optional.empty(); } var model = Fortune( - id: fields.contains('id') ? (row[0] as int?) : null, - message: fields.contains('message') ? (row[1] as String?) : null); + id: fields.contains('id') ? mapToInt(row[0]) : null, + message: fields.contains('message') ? (row[1] as String?) : null, + ); return Optional.of(model); } @@ -91,8 +97,14 @@ class FortuneQuery extends Query { class FortuneQueryWhere extends QueryWhere { FortuneQueryWhere(FortuneQuery query) - : id = NumericSqlExpressionBuilder(query, 'id'), - message = StringSqlExpressionBuilder(query, 'message'); + : id = NumericSqlExpressionBuilder( + query, + 'id', + ), + message = StringSqlExpressionBuilder( + query, + 'message', + ); final NumericSqlExpressionBuilder id; @@ -100,7 +112,10 @@ class FortuneQueryWhere extends QueryWhere { @override List get expressionBuilders { - return [id, message]; + return [ + id, + message, + ]; } } @@ -115,11 +130,13 @@ class FortuneQueryValues extends MapQueryValues { } set id(int? value) => values['id'] = value; + String? get message { return (values['message'] as String?); } set message(String? value) => values['message'] = value; + void copyFrom(Fortune model) { id = model.id; message = model.message; @@ -132,7 +149,10 @@ class FortuneQueryValues extends MapQueryValues { @generatedSerializable class Fortune extends _Fortune { - Fortune({this.id, this.message}); + Fortune({ + this.id, + this.message, + }); @override int? id; @@ -140,7 +160,10 @@ class Fortune extends _Fortune { @override String? message; - Fortune copyWith({int? id, String? message}) { + Fortune copyWith({ + int? id, + String? message, + }) { return Fortune(id: id ?? this.id, message: message ?? this.message); } @@ -151,7 +174,10 @@ class Fortune extends _Fortune { @override int get hashCode { - return hashObjects([id, message]); + return hashObjects([ + id, + message, + ]); } @override @@ -189,22 +215,27 @@ class FortuneSerializer extends Codec { @override FortuneEncoder get encoder => const FortuneEncoder(); + @override FortuneDecoder get decoder => const FortuneDecoder(); + static Fortune fromMap(Map map) { return Fortune(id: map['id'] as int?, message: map['message'] as String?); } static Map toMap(_Fortune? model) { if (model == null) { - return {}; + throw FormatException("Required field [model] cannot be null"); } return {'id': model.id, 'message': model.message}; } } abstract class FortuneFields { - static const List allFields = [id, message]; + static const List allFields = [ + id, + message, + ]; static const String id = 'id'; diff --git a/frameworks/Dart/angel3/orm/lib/src/models/world.g.dart b/frameworks/Dart/angel3/orm/lib/src/models/world.g.dart index b5c66b9c5e5..5b51631b790 100644 --- a/frameworks/Dart/angel3/orm/lib/src/models/world.g.dart +++ b/frameworks/Dart/angel3/orm/lib/src/models/world.g.dart @@ -26,7 +26,10 @@ class WorldMigration extends Migration { // ************************************************************************** class WorldQuery extends Query { - WorldQuery({Query? parent, Set? trampoline}) : super(parent: parent) { + WorldQuery({ + Query? parent, + Set? trampoline, + }) : super(parent: parent) { trampoline ??= {}; trampoline.add(tableName); _where = WorldQueryWhere(this); @@ -51,7 +54,10 @@ class WorldQuery extends Query { @override List get fields { - const _fields = ['id', 'randomNumber']; + const _fields = [ + 'id', + 'randomNumber', + ]; return _selectedFields.isEmpty ? _fields : _fields.where((field) => _selectedFields.contains(field)).toList(); @@ -77,9 +83,9 @@ class WorldQuery extends Query { return Optional.empty(); } var model = World( - id: fields.contains('id') ? (row[0] as int?) : null, - randomNumber: - fields.contains('randomNumber') ? (row[1] as int?) : null); + id: fields.contains('id') ? mapToInt(row[0]) : null, + randomNumber: fields.contains('randomNumber') ? mapToInt(row[1]) : null, + ); return Optional.of(model); } @@ -91,8 +97,14 @@ class WorldQuery extends Query { class WorldQueryWhere extends QueryWhere { WorldQueryWhere(WorldQuery query) - : id = NumericSqlExpressionBuilder(query, 'id'), - randomNumber = NumericSqlExpressionBuilder(query, 'randomNumber'); + : id = NumericSqlExpressionBuilder( + query, + 'id', + ), + randomNumber = NumericSqlExpressionBuilder( + query, + 'randomNumber', + ); final NumericSqlExpressionBuilder id; @@ -100,7 +112,10 @@ class WorldQueryWhere extends QueryWhere { @override List get expressionBuilders { - return [id, randomNumber]; + return [ + id, + randomNumber, + ]; } } @@ -115,11 +130,13 @@ class WorldQueryValues extends MapQueryValues { } set id(int? value) => values['id'] = value; + int? get randomNumber { return (values['randomNumber'] as int?); } set randomNumber(int? value) => values['randomNumber'] = value; + void copyFrom(World model) { id = model.id; randomNumber = model.randomNumber; @@ -132,7 +149,10 @@ class WorldQueryValues extends MapQueryValues { @generatedSerializable class World extends _World { - World({this.id, this.randomNumber}); + World({ + this.id, + this.randomNumber, + }); @override int? id; @@ -140,7 +160,10 @@ class World extends _World { @override int? randomNumber; - World copyWith({int? id, int? randomNumber}) { + World copyWith({ + int? id, + int? randomNumber, + }) { return World( id: id ?? this.id, randomNumber: randomNumber ?? this.randomNumber); } @@ -154,7 +177,10 @@ class World extends _World { @override int get hashCode { - return hashObjects([id, randomNumber]); + return hashObjects([ + id, + randomNumber, + ]); } @override @@ -192,8 +218,10 @@ class WorldSerializer extends Codec { @override WorldEncoder get encoder => const WorldEncoder(); + @override WorldDecoder get decoder => const WorldDecoder(); + static World fromMap(Map map) { return World( id: map['id'] as int?, randomNumber: map['randomNumber'] as int?); @@ -201,14 +229,17 @@ class WorldSerializer extends Codec { static Map toMap(_World? model) { if (model == null) { - return {}; + throw FormatException("Required field [model] cannot be null"); } return {'id': model.id, 'randomNumber': model.randomNumber}; } } abstract class WorldFields { - static const List allFields = [id, randomNumber]; + static const List allFields = [ + id, + randomNumber, + ]; static const String id = 'id'; diff --git a/frameworks/Dart/angel3/orm/lib/src/routes/controllers/controllers.dart b/frameworks/Dart/angel3/orm/lib/src/routes/controllers/controllers.dart index 81e4ac83e4d..771995d66a9 100644 --- a/frameworks/Dart/angel3/orm/lib/src/routes/controllers/controllers.dart +++ b/frameworks/Dart/angel3/orm/lib/src/routes/controllers/controllers.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:math'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_orm/angel3_orm.dart'; @@ -12,12 +11,12 @@ Future configureServer(Angel app) async { var executor = app.container.make(); // Generate a random number between 1 and 10000 - int _genRandomId() { + int genRandomId() { var rand = Random(); return rand.nextInt(10000) + 1; } - int _parseQueryCount(String? count) { + int parseQueryCount(String? count) { if (count == null) { return 1; } @@ -30,11 +29,11 @@ Future configureServer(Angel app) async { return limit; } - List _generateIds(int maxCount) { + List generateIds(int maxCount) { var result = []; while (result.length < maxCount) { - var id = _genRandomId(); + var id = genRandomId(); if (!result.contains(id)) { result.add(id); } @@ -56,25 +55,18 @@ Future configureServer(Angel app) async { // Add an entry and sort a list of fortune app.get('/fortunes', (req, res) async { - //var stopwatch = Stopwatch()..start(); - var list = await FortuneQuery().get(executor); - //print('Query Time: ${stopwatch.elapsed.inMilliseconds}ms'); - list.add( Fortune(id: 0, message: 'Additional fortune added at request time.')); list.sort((a, b) => a.message?.compareTo(b.message ?? '') ?? 0); - //print('Process Time: ${stopwatch.elapsed.inMilliseconds}ms'); - //stopwatch.stop(); - res.render('listing', {'fortunes': list}); }); // Find a random World app.get('/db', (req, res) async { - var id = _genRandomId(); + var id = genRandomId(); var query = WorldQuery()..where?.id.equals(id); var result = await query.get(executor); if (result.isNotEmpty) { @@ -88,12 +80,12 @@ Future configureServer(Angel app) async { app.get('/query', (req, res) async { var params = req.queryParameters; - var queryLimit = _parseQueryCount(params['queries'] as String?); + var queryLimit = parseQueryCount(params['queries'] as String?); - var list = _generateIds(queryLimit); - var query = WorldQuery(); + var list = generateIds(queryLimit); var result = []; for (var id in list) { + var query = WorldQuery(); query.where?.id.equals(id); var optWorld = await query.getOne(executor); result.add(optWorld.value); @@ -104,28 +96,23 @@ Future configureServer(Angel app) async { // Update a list of worlds app.get('/updates', (req, res) async { - //var stopwatch = Stopwatch()..start(); - var params = req.queryParameters; - var queryLimit = _parseQueryCount(params['queries'] as String?); - var listOfIds = _generateIds(queryLimit); + var queryLimit = parseQueryCount(params['queries'] as String?); + var listOfIds = generateIds(queryLimit); - var query = WorldQuery(); var result = []; for (var id in listOfIds) { + var query = WorldQuery(); query.where?.id.equals(id); var optWorld = await query.getOne(executor); query ..where?.id.equals(optWorld.value.id!) - ..values.randomNumber = _genRandomId(); + ..values.randomNumber = genRandomId(); var updatedRec = await query.updateOne(executor); result.add(updatedRec.value); } - //print('Process Time: ${stopwatch.elapsed.inMilliseconds}ms'); - //stopwatch.stop(); - res.json(result); }); } diff --git a/frameworks/Dart/angel3/orm/pubspec.lock b/frameworks/Dart/angel3/orm/pubspec.lock index 875804ad750..10a54530573 100644 --- a/frameworks/Dart/angel3/orm/pubspec.lock +++ b/frameworks/Dart/angel3/orm/pubspec.lock @@ -5,862 +5,977 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + url: "https://pub.dev" source: hosted - version: "47.0.0" + version: "80.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "7.3.0" angel3_auth: dependency: "direct main" description: name: angel3_auth - url: "https://pub.dartlang.org" + sha256: "3996219fca7a49174c3745732a1e438ec94d55936697f2504196be4f3dbf191a" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_client: dependency: transitive description: name: angel3_client - url: "https://pub.dartlang.org" + sha256: e2886fdb41f243d85003f94127850bdd70f79fa5f7cf1f2b79b4f7029198e9dd + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_configuration: dependency: "direct main" description: name: angel3_configuration - url: "https://pub.dartlang.org" + sha256: f585699cf0ea5376d7ed6310e9fc57ccdd4645e5746ea0bae1fa6c05efe4e810 + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_container: - dependency: transitive + dependency: "direct main" description: name: angel3_container - url: "https://pub.dartlang.org" + sha256: c08ea6b426242861d11109b748792503652a7eb0db4005409c0a031e80820c7f + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_framework: dependency: "direct main" description: name: angel3_framework - url: "https://pub.dartlang.org" + sha256: "91d56825b78846d9294e8aae789362644d4e24df4870d52d6c2cc6d8adf8d2c9" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.5.0" angel3_hot: dependency: "direct dev" description: name: angel3_hot - url: "https://pub.dartlang.org" + sha256: "8e1e7409631a49f05483e2067d1f27f594d558459712311b5ea4317b5519975b" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_http_exception: dependency: transitive description: name: angel3_http_exception - url: "https://pub.dartlang.org" + sha256: "9484b425a1aece1af3f2f0521fba429cd48f0a952521d40281333694c750e4ab" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_jael: dependency: "direct main" description: name: angel3_jael - url: "https://pub.dartlang.org" + sha256: "4ce85198613faff74ac8706065c619e7d6fc609aeb63b2fa7d9dba6f5a981f5c" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_migration: dependency: "direct main" description: name: angel3_migration - url: "https://pub.dartlang.org" + sha256: de7180ce8e48b0fe551c0b96cc83d0cafdcb71de3c75e13b0b08c3fdaf9df351 + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_migration_runner: dependency: "direct dev" description: name: angel3_migration_runner - url: "https://pub.dartlang.org" + sha256: "30596dd82471dcddd35afb8b245c1dd56c8c53bdf77dee5e131c353e37e05f9b" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_mock_request: dependency: transitive description: name: angel3_mock_request - url: "https://pub.dartlang.org" + sha256: "8c8513a649d33c0c0531a120183da558000b4f044a4f30fd3ae22dfe11355a04" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_model: dependency: transitive description: name: angel3_model - url: "https://pub.dartlang.org" + sha256: "9a3f50b02bf119bb160d5f94580940b93973589d9b5949d284d2427b8fb65e16" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_orm: dependency: "direct main" description: name: angel3_orm - url: "https://pub.dartlang.org" + sha256: "9d1831b6b91820e312b52cf4c8c3cebb067be59b47123276fbc7741a01ae2ac5" + url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "8.3.2" angel3_orm_generator: dependency: "direct dev" description: name: angel3_orm_generator - url: "https://pub.dartlang.org" + sha256: "18426152dc86e1f0cd5fab14470f07a5b5ac7dd1b78f7e1bf8986d2625a898ec" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_orm_postgres: dependency: "direct main" description: name: angel3_orm_postgres - url: "https://pub.dartlang.org" + sha256: "7ecaec40b62b8d573ee72b1694f97353be4b6581b4da847d4bfe857f2540bd29" + url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "8.3.1" angel3_production: dependency: "direct main" description: name: angel3_production - url: "https://pub.dartlang.org" + sha256: "286d4b6dcd5e4297eea3db93cb419282ca14ef920f77439ef7b42c6229ab6219" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_route: dependency: transitive description: name: angel3_route - url: "https://pub.dartlang.org" + sha256: f2ebf4b134e13f804271d4e164a92de5dd25ad0bb651303df2c9e6fb397f32a8 + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" angel3_serialize: dependency: "direct main" description: name: angel3_serialize - url: "https://pub.dartlang.org" + sha256: "4a4658b8af0d0eec6b8816699f137367c6af7c6f6a1f83a84e43fee55f892f5e" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_serialize_generator: dependency: "direct dev" description: name: angel3_serialize_generator - url: "https://pub.dartlang.org" + sha256: "0fd91dd1162f5c0d1b3c0f2734f48787202693926e6d6c97bca18658c8b812f4" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.1" angel3_static: dependency: "direct main" description: name: angel3_static - url: "https://pub.dartlang.org" + sha256: "534e827500304fa4e95f3613b130aad832dc65681b9a4c47a83891f65b04b554" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_test: dependency: "direct dev" description: name: angel3_test - url: "https://pub.dartlang.org" + sha256: "2ae3d83f83fb6c0834948b4ae3afc02da8c7ee38da3e164bd455564267e39ff8" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_validate: dependency: "direct main" description: name: angel3_validate - url: "https://pub.dartlang.org" + sha256: "661ef636583b0e60b35756d3d296d2ef7b257277fa703a494278ace9fcbe4f0c" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.3.0" angel3_websocket: dependency: transitive description: name: angel3_websocket - url: "https://pub.dartlang.org" + sha256: "160399b1898d5fd9c8294b4321691567687d9d86d8940aea83cc528b85427229" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.4.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.7.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.13.0" belatuk_code_buffer: dependency: transitive description: name: belatuk_code_buffer - url: "https://pub.dartlang.org" + sha256: "06c4329570e2cb72cb808c5f19d2004865b7c1f18447d4af16d465776416ccfc" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_combinator: dependency: transitive description: name: belatuk_combinator - url: "https://pub.dartlang.org" + sha256: "0c54ddf1a6a7c94585c55a5852ccc13ad1a871e3e0709d3322d0286eb7afb7d7" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_html_builder: dependency: transitive description: name: belatuk_html_builder - url: "https://pub.dartlang.org" + sha256: "0bdd783a54aa7435c86231b319bfffa06259aea6df59dbec62d351456062e67f" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_http_server: dependency: transitive description: name: belatuk_http_server - url: "https://pub.dartlang.org" + sha256: "2a4ae9409f3586a95a3393b924c86fd38c30d955aa2437070c3198a1ec0a1686" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.5.0" belatuk_json_serializer: dependency: transitive description: name: belatuk_json_serializer - url: "https://pub.dartlang.org" + sha256: b0b6ee6b4aa0552d84b487c5d1a97f72c9d5c4cbc4e2828f57e24635d5d75be8 + url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "7.3.0" belatuk_merge_map: dependency: transitive description: name: belatuk_merge_map - url: "https://pub.dartlang.org" + sha256: "1eb3c77417598e1d40c11d8d93b3c7bb5f10ca0977b2f942c623698bf3745f43" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" belatuk_pretty_logging: dependency: "direct main" description: name: belatuk_pretty_logging - url: "https://pub.dartlang.org" + sha256: "29fb3127ce58643e59fc4510ce41fa4d795f56997cbc661dffdf07e9a65e7021" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.3.0" belatuk_pub_sub: dependency: transitive description: name: belatuk_pub_sub - url: "https://pub.dartlang.org" + sha256: "08c4f458165f7e2d76a3a4796e94092b98579aedd1fc8a64f39cfbbd18db249d" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.4.0" belatuk_range_header: dependency: transitive description: name: belatuk_range_header - url: "https://pub.dartlang.org" + sha256: "78f315c8a53415a04a77dee3fcec6f867bac77d2e5d3e13ffc7532d1800adc53" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.4.0" belatuk_symbol_table: dependency: transitive description: name: belatuk_symbol_table - url: "https://pub.dartlang.org" + sha256: "154f50623b2c5a669561588d86a445f97cf081de6e690ba9bc866dcd98508f50" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.3.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" buffer: dependency: transitive description: name: buffer - url: "https://pub.dartlang.org" + sha256: "389da2ec2c16283c8787e0adaede82b1842102f8c8aae2f49003a766c5c6b3d1" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.3" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.4" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.4.15" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" source: hosted - version: "7.2.3" + version: "8.0.0" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + url: "https://pub.dev" source: hosted - version: "8.4.1" + version: "8.9.5" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.10.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.19.1" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.2" coverage: dependency: transitive description: name: coverage - url: "https://pub.dartlang.org" + sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.11.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.6" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "3.0.1" dotenv: dependency: transitive description: name: dotenv - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - executor: - dependency: transitive - description: - name: executor - url: "https://pub.dartlang.org" + sha256: "379e64b6fc82d3df29461d349a1796ecd2c436c480d4653f3af6872eccbc90e1" + url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "4.2.0" file: - dependency: transitive + dependency: "direct main" description: name: file - url: "https://pub.dartlang.org" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.1" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.1" frontend_server_client: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "4.0.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.3.2" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "1.3.0" http2: dependency: transitive description: name: http2 - url: "https://pub.dartlang.org" + sha256: "382d3aefc5bd6dc68c6b892d7664f29b5beb3251611ae946a98d35158a82bbfa" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.3.1" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.1.2" inflection3: dependency: transitive description: name: inflection3 - url: "https://pub.dartlang.org" + sha256: cb54689bcfe3c0168a6979ee3191df584dcef4f870c5ef41c798bcb35ff5aca3 + url: "https://pub.dev" source: hosted version: "0.5.3+2" intl: dependency: transitive description: name: intl - url: "https://pub.dartlang.org" + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.20.2" io: dependency: "direct dev" description: name: io - url: "https://pub.dartlang.org" + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.5" jael3: dependency: "direct main" description: name: jael3 - url: "https://pub.dartlang.org" + sha256: bee0b8d328898dac9008caf7392400d03bc2035a3dd9acebe7ebee052ef9132b + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.2.0" jael3_preprocessor: dependency: transitive description: name: jael3_preprocessor - url: "https://pub.dartlang.org" + sha256: "8e70b92608e61c032f08bed82fa63b82e26b4ede4f4924b81bd75329fae9e9b8" + url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.2.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.7.1" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.9.0" json_rpc_2: dependency: transitive description: name: json_rpc_2 - url: "https://pub.dartlang.org" + sha256: "246b321532f0e8e2ba474b4d757eaa558ae4fdd0688fdbc1e1ca9705f9b8ca0e" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" lints: dependency: "direct dev" description: name: lints - url: "https://pub.dartlang.org" + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "5.1.1" logging: dependency: "direct main" description: name: logging - url: "https://pub.dartlang.org" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.3.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.17" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.16.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "2.0.0" mysql1: dependency: transitive description: name: mysql1 - url: "https://pub.dartlang.org" + sha256: "68aec7003d2abc85769bafa1777af3f4a390a90c31032b89636758ff8eb839e9" + url: "https://pub.dev" source: hosted version: "0.20.0" mysql_client: dependency: transitive description: name: mysql_client - url: "https://pub.dartlang.org" + sha256: "6a0fdcbe3e0721c637f97ad24649be2f70dbce2b21ede8f962910e640f753fc2" + url: "https://pub.dev" source: hosted - version: "0.0.25" + version: "0.0.27" node_preamble: dependency: transitive description: name: node_preamble - url: "https://pub.dartlang.org" + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" optional: dependency: "direct main" description: name: optional - url: "https://pub.dartlang.org" + sha256: f80327d7a3335a0be68418072668043c7ab291df575c21aa42e0c5633641da39 + url: "https://pub.dev" source: hosted version: "6.1.0+1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.9.1" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted version: "1.5.1" postgres: - dependency: transitive + dependency: "direct main" description: name: postgres - url: "https://pub.dartlang.org" - source: hosted - version: "2.4.6" - postgres_pool: - dependency: transitive - description: - name: postgres_pool - url: "https://pub.dartlang.org" + sha256: "7a7f9805d33e41cb14fa22535959f3af51843a792015cdbd8f2fa78bcd1b501b" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "3.5.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.5.0" quiver: dependency: transitive description: name: quiver - url: "https://pub.dartlang.org" + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.2" recase: dependency: transitive description: name: recase - url: "https://pub.dartlang.org" + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" source: hosted - version: "4.0.0" - retry: - dependency: transitive - description: - name: retry - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" + version: "4.1.0" sasl_scram: dependency: transitive description: name: sasl_scram - url: "https://pub.dartlang.org" + sha256: a47207a436eb650f8fdcf54a2e2587b850dc3caef9973ce01f332b07a6fc9cb9 + url: "https://pub.dev" source: hosted version: "0.1.1" saslprep: dependency: transitive description: name: saslprep - url: "https://pub.dartlang.org" + sha256: "3d421d10be9513bf4459c17c5e70e7b8bc718c9fc5ad4ba5eb4f5fd27396f740" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.2" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - url: "https://pub.dartlang.org" + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" shelf_static: dependency: transitive description: name: shelf_static - url: "https://pub.dartlang.org" + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "3.0.0" source_gen: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "2.0.0" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - url: "https://pub.dartlang.org" + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" source_maps: dependency: transitive description: name: source_maps - url: "https://pub.dartlang.org" + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" source: hosted - version: "0.10.10" + version: "0.10.13" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test: dependency: "direct dev" description: name: test - url: "https://pub.dartlang.org" + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + url: "https://pub.dev" source: hosted - version: "1.21.5" + version: "1.25.15" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" source: hosted - version: "0.4.13" + version: "0.7.4" test_core: dependency: transitive description: name: test_core - url: "https://pub.dartlang.org" + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + url: "https://pub.dev" source: hosted - version: "0.4.17" + version: "0.6.8" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" tuple: dependency: transitive description: name: tuple - url: "https://pub.dartlang.org" + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.2" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" unorm_dart: dependency: transitive description: name: unorm_dart - url: "https://pub.dartlang.org" + sha256: "23d8bf65605401a6a32cff99435fed66ef3dab3ddcad3454059165df46496a3b" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.3.0" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "4.5.1" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" source: hosted - version: "9.3.0" + version: "15.0.0" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "3.0.2" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - url: "https://pub.dartlang.org" + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.3" sdks: - dart: ">=2.18.0-146.0.dev <3.0.0" + dart: ">=3.6.0 <4.0.0" diff --git a/frameworks/Dart/angel3/orm/pubspec.yaml b/frameworks/Dart/angel3/orm/pubspec.yaml index 299c020ff43..bea8b753b68 100644 --- a/frameworks/Dart/angel3/orm/pubspec.yaml +++ b/frameworks/Dart/angel3/orm/pubspec.yaml @@ -1,40 +1,38 @@ name: benchmark_app -version: 1.0.0 +version: 2.0.0 description: A basic starter application template for Angel3 framework publish_to: none environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=3.6.0 <4.0.0' + dependencies: - angel3_auth: ^7.0.0 - angel3_configuration: ^7.0.0 - angel3_framework: ^7.0.0 - angel3_jael: ^7.0.0 - angel3_migration: ^7.0.0 - angel3_orm: ^7.0.0 - angel3_orm_postgres: ^7.0.0 - angel3_serialize: ^7.0.0 - angel3_production: ^7.0.0 - angel3_static: ^7.0.0 - angel3_validate: ^7.0.0 - jael3: ^7.0.0 - belatuk_pretty_logging: ^5.0.0 + angel3_auth: ^8.3.0 + angel3_configuration: ^8.3.0 + angel3_framework: ^8.5.0 + angel3_jael: ^8.3.0 + angel3_migration: ^8.4.0 + angel3_orm: ^8.3.0 + angel3_orm_postgres: ^8.3.0 + angel3_serialize: ^8.3.0 + angel3_production: ^8.3.0 + angel3_static: ^8.3.0 + angel3_validate: ^8.3.0 + jael3: ^8.0.0 + belatuk_pretty_logging: ^6.0.0 + postgres: ^3.5.0 optional: ^6.0.0 - logging: ^1.0.0 + logging: ^1.3.0 + angel3_container: ^8.3.0 + file: ^7.0.1 + dev_dependencies: - angel3_hot: ^7.0.0 - angel3_migration_runner: ^7.0.0 - angel3_orm_generator: ^7.0.0 - angel3_serialize_generator: ^7.0.0 - angel3_test: ^7.0.0 - build_runner: ^2.0.3 + angel3_hot: ^8.3.0 + angel3_migration_runner: ^8.3.0 + angel3_orm_generator: ^8.3.0 + angel3_serialize_generator: ^8.3.0 + angel3_test: ^8.3.0 + build_runner: ^2.4.0 io: ^1.0.0 - test: ^1.17.5 - lints: ^2.0.0 -#dependency_overrides: -# angel3_orm: -# path: ../../../../../belatuk/packages/orm/angel_orm -# angel3_orm_postgres: -# path: ../../../../../belatuk/packages/orm/angel_orm_postgres -# angel3_jael: -# path: ../../../../../belatuk/packages/jael/angel_jael + test: ^1.25.0 + lints: ^5.0.0 \ No newline at end of file diff --git a/frameworks/Dart/angel3/orm/run/prod.dart b/frameworks/Dart/angel3/orm/run/prod.dart index cf7c0c692e4..62cb1486a2f 100644 --- a/frameworks/Dart/angel3/orm/run/prod.dart +++ b/frameworks/Dart/angel3/orm/run/prod.dart @@ -2,28 +2,5 @@ import 'package:angel3_container/mirrors.dart'; import 'package:angel3_production/angel3_production.dart'; import 'package:benchmark_app/benchmark_app.dart'; -// NOTE: By default, the Runner class does not use the `MirrorsReflector`, or any -// reflector, by default. -// -// If your application is using any sort of functionality reliant on annotations or reflection, -// either include the MirrorsReflector, or use a static reflector variant. -// -// The following use cases require reflection: -// * Use of Controllers, via @Expose() or @ExposeWS() -// * Use of dependency injection into constructors, whether in controllers or plain `container.make` calls -// * Use of the `ioc` function in any route -// -// The `MirrorsReflector` from `package:angel_container/mirrors.dart` is by far the most convenient pattern, -// so use it if possible. -// -// However, the following alternatives exist: -// * Generation via `package:angel_container_generator` -// * Creating an instance of `StaticReflector` -// * Manually implementing the `Reflector` interface (cumbersome; not recommended) -// -// As of January 4th, 2018, the documentation has not yet been updated to state this, -// so in the meantime, visit the Angel chat for further questions: -// -// https://gitter.im/angel_dart/discussion void main(List args) => Runner('Angel3', configureServer, reflector: MirrorsReflector()).run(args); diff --git a/frameworks/Dart/angel3/orm/test/all_test.dart b/frameworks/Dart/angel3/orm/test/all_test.dart index 8a5dad86ead..01978ff328f 100644 --- a/frameworks/Dart/angel3/orm/test/all_test.dart +++ b/frameworks/Dart/angel3/orm/test/all_test.dart @@ -5,16 +5,12 @@ import 'package:benchmark_app/benchmark_app.dart'; // Angel also includes facilities to make testing easier. // -// `package:angel_test` ships a client that can test -// both plain HTTP and WebSockets. +// `package:angel3_test` ships a client that can test both plain HTTP and WebSockets. // // Tests do not require your server to actually be mounted on a port, // so they will run faster than they would in other frameworks, where you // would have to first bind a socket, and then account for network latency. // -// See the documentation here: -// https://github.com/angel-dart/test -// // If you are unfamiliar with Dart's advanced testing library, you can read up // here: // https://github.com/dart-lang/test From a6fdf666eae9f959fa6f42c0a3e8c6b778413d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Tue, 25 Mar 2025 00:09:26 +0800 Subject: [PATCH 1302/1766] Upgrade hyperlane (#9719) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 --- frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/src/constant.rs | 3 +- frameworks/Rust/hyperlane/src/db.rs | 29 +++++------------ frameworks/Rust/hyperlane/src/main.rs | 8 ++++- .../Rust/hyperlane/src/request_middleware.rs | 1 - .../Rust/hyperlane/src/response_middleware.rs | 1 - frameworks/Rust/hyperlane/src/route.rs | 31 +++++++------------ frameworks/Rust/hyperlane/src/server.rs | 8 ++--- frameworks/Rust/hyperlane/src/type.rs | 4 --- frameworks/Rust/hyperlane/src/utils.rs | 2 -- 10 files changed, 33 insertions(+), 56 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 7ca0bbe6f4e..ff050f6e959 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.42.1" +hyperlane = "4.56.1" rand = "0.9.0" serde = "1.0.219" sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } diff --git a/frameworks/Rust/hyperlane/src/constant.rs b/frameworks/Rust/hyperlane/src/constant.rs index e22ac57c0b0..3c09d6f416a 100644 --- a/frameworks/Rust/hyperlane/src/constant.rs +++ b/frameworks/Rust/hyperlane/src/constant.rs @@ -1,4 +1,5 @@ -pub static RESPONSEDATA: &str = "Hello, World!"; +pub static RESPONSEDATA_STR: &str = "Hello, World!"; +pub static RESPONSEDATA_BIN: &[u8] = b"Hello, World!"; pub static DATABASE_TYPE: &str = "postgres"; pub static DATABASE_HOST: &str = "tfb-database"; pub static DATABASE_USER_NAME: &str = "benchmarkdbuser"; diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 9f4db9f0f5c..09d2edd97a2 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -1,6 +1,5 @@ use crate::*; -#[inline] pub async fn get_db_connection() -> DbPoolConnection { if let Some(db_pool) = DB.get() { return db_pool.clone(); @@ -11,7 +10,6 @@ pub async fn get_db_connection() -> DbPoolConnection { db_pool } -#[inline] #[cfg(feature = "dev")] pub async fn create_database() { let db_pool: DbPoolConnection = get_db_connection().await; @@ -20,7 +18,6 @@ pub async fn create_database() { .await; } -#[inline] #[cfg(feature = "dev")] pub async fn create_table() { let db_pool: DbPoolConnection = get_db_connection().await; @@ -42,7 +39,6 @@ pub async fn create_table() { .await; } -#[inline] #[cfg(feature = "dev")] pub async fn insert_records() { let db_pool: DbPoolConnection = get_db_connection().await; @@ -80,7 +76,6 @@ pub async fn insert_records() { let _ = query(&sql).execute(&db_pool).await; } -#[inline] pub async fn init_cache() { let mut res: Vec = Vec::with_capacity(RANDOM_MAX as usize); let db_pool: DbPoolConnection = get_db_connection().await; @@ -98,7 +93,6 @@ pub async fn init_cache() { let _ = CACHE.set(res); } -#[inline] pub async fn connection_db() -> DbPoolConnection { let db_url: &str = match option_env!("POSTGRES_URL") { Some(it) => it, @@ -112,7 +106,7 @@ pub async fn connection_db() -> DbPoolConnection { DATABASE_NAME ), }; - let pool_size: u32 = (get_thread_count() >> 2).max(10).min(100) as u32; + let pool_size: u32 = (get_thread_count() << 2).max(10).min(100) as u32; let max_pool_size: u32 = option_env!("POSTGRES_MAX_POOL_SIZE") .unwrap_or(&pool_size.to_string()) .parse::() @@ -133,7 +127,6 @@ pub async fn connection_db() -> DbPoolConnection { pool } -#[inline] pub async fn get_update_data( limit: Queries, ) -> (String, Vec, Vec, Vec) { @@ -165,7 +158,6 @@ pub async fn get_update_data( (sql, query_res_list, id_list, random_numbers) } -#[inline] pub async fn init_db() { get_db_connection().await; #[cfg(feature = "dev")] @@ -177,13 +169,11 @@ pub async fn init_db() { init_cache().await; } -#[inline] pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { let random_id: Queries = get_random_id(); query_world_row(db_pool, random_id).await } -#[inline] pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRow { let sql: String = format!( "SELECT id, randomNumber FROM {} WHERE id = {} LIMIT 1", @@ -196,7 +186,6 @@ pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRo return QueryRow::new(id as i32, 1); } -#[inline] pub async fn update_world_rows(limit: Queries) -> Vec { let db_pool: DbPoolConnection = get_db_connection().await; let (sql, data, id_list, random_numbers) = get_update_data(limit).await; @@ -211,7 +200,6 @@ pub async fn update_world_rows(limit: Queries) -> Vec { data } -#[inline] pub async fn all_world_row() -> Vec { let db_pool: DbPoolConnection = get_db_connection().await; let sql: String = format!("SELECT id, message FROM {}", TABLE_NAME_FORTUNE); @@ -219,13 +207,12 @@ pub async fn all_world_row() -> Vec { return res; } -#[inline] pub async fn get_some_row_id(limit: Queries, db_pool: &DbPoolConnection) -> Vec { - let mut res: Vec = Vec::with_capacity(limit as usize); - for _ in 0..limit { - let id: i32 = get_random_id(); - let tem: QueryRow = query_world_row(db_pool, id).await; - res.push(tem); - } - res + let futures: Vec<_> = (0..limit) + .map(|_| async { + let id: i32 = get_random_id(); + query_world_row(db_pool, id).await + }) + .collect(); + join_all(futures).await } diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index 72253debec0..e240a6aa862 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -10,7 +10,13 @@ pub(crate) mod utils; pub(crate) use constant::*; pub(crate) use db::*; -pub(crate) use hyperlane::{once_cell::sync::OnceCell, serde::*, serde_json::json, *}; +pub(crate) use futures::future::join_all; +pub(crate) use hyperlane::{ + once_cell::sync::OnceCell, + serde::*, + serde_json::{Value, json}, + *, +}; pub(crate) use lazy::*; pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng}; pub(crate) use request_middleware::*; diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index fe810b0a1d5..4696f51e867 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -1,6 +1,5 @@ use crate::*; -#[inline] pub async fn request(controller_data: ControllerData) { let _ = controller_data .set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) diff --git a/frameworks/Rust/hyperlane/src/response_middleware.rs b/frameworks/Rust/hyperlane/src/response_middleware.rs index dcf3b096b10..81fb0c368e9 100644 --- a/frameworks/Rust/hyperlane/src/response_middleware.rs +++ b/frameworks/Rust/hyperlane/src/response_middleware.rs @@ -1,6 +1,5 @@ use crate::*; -#[inline] pub async fn response(controller_data: ControllerData) { let _ = controller_data.send().await; } diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index c3c7cbcb855..22f8f24af23 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -1,25 +1,22 @@ use crate::*; -#[inline] pub async fn json(controller_data: ControllerData) { - let json: serde_json::Value = json!({ - "message": RESPONSEDATA + let json: Value = json!({ + "message": RESPONSEDATA_STR }); let _ = controller_data .set_response_body(serde_json::to_string(&json).unwrap_or_default()) .await; } -#[inline] pub async fn plaintext(controller_data: ControllerData) { let _ = controller_data .set_response_header(CONTENT_TYPE, TEXT_PLAIN) .await - .set_response_body(RESPONSEDATA) + .set_response_body(RESPONSEDATA_BIN) .await; } -#[inline] pub async fn db(controller_data: ControllerData) { let db_connection: DbPoolConnection = get_db_connection().await; let query_row: QueryRow = random_world_row(&db_connection).await; @@ -28,7 +25,6 @@ pub async fn db(controller_data: ControllerData) { .await; } -#[inline] pub async fn queries(controller_data: ControllerData) { let queries: Queries = controller_data .get_request_query("q") @@ -37,18 +33,13 @@ pub async fn queries(controller_data: ControllerData) { .unwrap_or_default() .min(ROW_LIMIT as Queries) .max(1); - let mut data: Vec = Vec::with_capacity(queries as usize); let db_pool: DbPoolConnection = get_db_connection().await; - for _ in 0..queries { - let row: QueryRow = random_world_row(&db_pool).await; - data.push(row); - } + let data: Vec = get_some_row_id(queries, &db_pool).await; let _ = controller_data .set_response_body(serde_json::to_string(&data).unwrap_or_default()) .await; } -#[inline] pub async fn fortunes(controller_data: ControllerData) { let all_rows: Vec = all_world_row().await; let mut fortunes_list: Vec = all_rows @@ -72,7 +63,6 @@ pub async fn fortunes(controller_data: ControllerData) { .await; } -#[inline] pub async fn updates(controller_data: ControllerData) { let queries: Queries = controller_data .get_request_query("q") @@ -87,7 +77,6 @@ pub async fn updates(controller_data: ControllerData) { .await; } -#[inline] pub async fn cached_queries(controller_data: ControllerData) { let count: Queries = controller_data .get_request_query("c") @@ -96,11 +85,13 @@ pub async fn cached_queries(controller_data: ControllerData) { .unwrap_or_default() .min(ROW_LIMIT as Queries) .max(1); - let mut res: Vec = Vec::with_capacity(count as usize); - let cache: Vec = CACHE.get().cloned().unwrap_or_default(); - for i in 0..count { - res.push(cache[i as usize].clone()); - } + let res: Vec = CACHE + .get() + .unwrap_or(&Vec::new()) + .iter() + .take(count as usize) + .cloned() + .collect(); let _ = controller_data .set_response_body(serde_json::to_string(&res).unwrap_or_default()) .await; diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 568fb066446..1730e1b0ef7 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -1,14 +1,14 @@ use crate::*; -#[inline] pub async fn run_server() { - let mut server: Server = Server::new(); + let server: Server = Server::new(); server.host("0.0.0.0").await; server.port(8080).await; - server.log_dir("./logs").await; - server.log_interval_millis(1_000_000_000).await; + server.disable_log().await; server.disable_inner_log().await; server.disable_inner_print().await; + server.http_line_buffer_size(512).await; + server.websocket_buffer_size(512).await; server.route("/plaintext", plaintext).await; server.route("/json", json).await; server.route("/cached-quer", cached_queries).await; diff --git a/frameworks/Rust/hyperlane/src/type.rs b/frameworks/Rust/hyperlane/src/type.rs index 9ec11ff4342..b5e47ecd6cd 100644 --- a/frameworks/Rust/hyperlane/src/type.rs +++ b/frameworks/Rust/hyperlane/src/type.rs @@ -11,7 +11,6 @@ pub struct QueryRow { } impl QueryRow { - #[inline] pub fn new(id: Queries, random_number: Queries) -> Self { Self { id, @@ -27,7 +26,6 @@ pub struct Fortunes { } impl Fortunes { - #[inline] pub fn new(id: Queries, message: String) -> Self { Self { id, message } } @@ -37,14 +35,12 @@ impl Fortunes { pub struct FortunesTemplate(pub Vec); impl FortunesTemplate { - #[inline] pub fn new(list: Vec) -> Self { Self(list) } } impl fmt::Display for FortunesTemplate { - #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let fortunes: &Vec = &self.0; let _ = write!( diff --git a/frameworks/Rust/hyperlane/src/utils.rs b/frameworks/Rust/hyperlane/src/utils.rs index 16e8cdd8839..2f67531f50e 100644 --- a/frameworks/Rust/hyperlane/src/utils.rs +++ b/frameworks/Rust/hyperlane/src/utils.rs @@ -1,6 +1,5 @@ use crate::*; -#[inline] pub fn escape_html(input: &str) -> String { let mut result: String = String::new(); for ch in input.chars() { @@ -16,7 +15,6 @@ pub fn escape_html(input: &str) -> String { result } -#[inline] pub fn get_random_id() -> Queries { let mut rng: SmallRng = SmallRng::from_rng(&mut rng()); let random_id: u32 = rng.random_range(1..RANDOM_MAX_ADD_ONE); From 21e286354fba577269f599cbba610ed553b3175b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 24 Mar 2025 17:09:55 +0100 Subject: [PATCH 1303/1766] [ruby/rack] Mark as platform (#9723) All Ruby frameworks are build on Rack, so the classification should be considered Platform instead of Micro. It's even mentioned in the wiki: > ... a web platform such as Rack, Servlet, or plain PHP https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Basic-Concepts --- frameworks/Ruby/rack/benchmark_config.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index 914d2093dbb..26e1087e4ac 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -11,7 +11,7 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "orm": "raw", "database": "Postgres", "framework": "rack", @@ -32,7 +32,7 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "orm": "raw", "database": "Postgres", "framework": "rack", @@ -53,7 +53,7 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "orm": "raw", "database": "Postgres", "framework": "rack", @@ -74,7 +74,7 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "orm": "raw", "database": "Postgres", "framework": "rack", @@ -95,7 +95,7 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "orm": "raw", "database": "Postgres", "framework": "rack", From ad02042106dffe34a918ab967d3b37baa7969edb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 09:11:02 -0700 Subject: [PATCH 1304/1766] Bump gunicorn from 20.1.0 to 23.0.0 in /frameworks/Python/flask (#9710) Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.1.0 to 23.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.1.0...23.0.0) --- updated-dependencies: - dependency-name: gunicorn 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-gunicorn.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/flask/requirements-gunicorn.txt b/frameworks/Python/flask/requirements-gunicorn.txt index 26385a38109..1469261d7ee 100644 --- a/frameworks/Python/flask/requirements-gunicorn.txt +++ b/frameworks/Python/flask/requirements-gunicorn.txt @@ -1,4 +1,4 @@ -r requirements.txt greenlet<0.5 -gunicorn==20.1.0 +gunicorn==23.0.0 meinheld==1.0.2 From 2875eaf8408541e6df6139e124a723fc9560fcd9 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Mon, 24 Mar 2025 09:20:39 -0700 Subject: [PATCH 1305/1766] hyper: refactor, update Rust, Hyper, and deps (#9720) * hyper: refactor, update Rust, Hyper, and deps - Update Rust to 1.85.0 - Update hyper to 1.6.0 - Use socket2 instead of net2 - Bump other dependencies - Remove hyper-db test. This is now provided as a route in the main test. - Add a new test using tokio multi-thread runtime to compare with the single-thread runtime. This uses the same docker image, but passes a command line argument to the server to use the multi-thread runtime. - Add a healthcheck /ping url to the dockerfile to ensure that the server is running before running the tests. - Use deadpool-postgres for connection pooling. - Use cached prepared statements for the queries. - Factor each test into its own module. - Simplify the previous approach that used closures into more a more straightforward approach that uses linear functions. - Add single query and multiple query tests. * hyper: add maintainers * fix: don't pre-compute json content-length * fix: add back socket.set_nodelay(true) * fix: don't precompute plaintext content-length header --- frameworks/Rust/hyper/.dockerignore | 1 + frameworks/Rust/hyper/Cargo.lock | 1078 ++++++++++++----- frameworks/Rust/hyper/Cargo.toml | 55 +- frameworks/Rust/hyper/benchmark_config.json | 23 +- frameworks/Rust/hyper/hyper-db.dockerfile | 11 - frameworks/Rust/hyper/hyper.dockerfile | 15 +- frameworks/Rust/hyper/rustfmt.toml | 4 + frameworks/Rust/hyper/src/db.rs | 59 +- frameworks/Rust/hyper/src/fortunes.rs | 75 ++ frameworks/Rust/hyper/src/json.rs | 29 + frameworks/Rust/hyper/src/main.rs | 283 +++-- frameworks/Rust/hyper/src/main_db.rs | 109 -- frameworks/Rust/hyper/src/multiple_queries.rs | 59 + frameworks/Rust/hyper/src/plaintext.rs | 20 + frameworks/Rust/hyper/src/server.rs | 79 -- frameworks/Rust/hyper/src/single_query.rs | 50 + 16 files changed, 1290 insertions(+), 660 deletions(-) create mode 100644 frameworks/Rust/hyper/.dockerignore delete mode 100644 frameworks/Rust/hyper/hyper-db.dockerfile create mode 100644 frameworks/Rust/hyper/rustfmt.toml create mode 100644 frameworks/Rust/hyper/src/fortunes.rs create mode 100644 frameworks/Rust/hyper/src/json.rs delete mode 100644 frameworks/Rust/hyper/src/main_db.rs create mode 100644 frameworks/Rust/hyper/src/multiple_queries.rs create mode 100644 frameworks/Rust/hyper/src/plaintext.rs delete mode 100644 frameworks/Rust/hyper/src/server.rs create mode 100644 frameworks/Rust/hyper/src/single_query.rs diff --git a/frameworks/Rust/hyper/.dockerignore b/frameworks/Rust/hyper/.dockerignore new file mode 100644 index 00000000000..2f7896d1d13 --- /dev/null +++ b/frameworks/Rust/hyper/.dockerignore @@ -0,0 +1 @@ +target/ diff --git a/frameworks/Rust/hyper/Cargo.lock b/frameworks/Rust/hyper/Cargo.lock index a8cdf6d1bb0..7c1a5d6a4c6 100644 --- a/frameworks/Rust/hyper/Cargo.lock +++ b/frameworks/Rust/hyper/Cargo.lock @@ -1,89 +1,201 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] [[package]] name = "async-trait" -version = "0.1.64" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.108", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] [[package]] name = "base64" -version = "0.13.1" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[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 = "buf-min" -version = "0.1.1" +name = "bumpalo" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6ae7069aad07c7cdefe6a22a671f00650728bd2331a4cc62e1e5d0becdf9ca4" -dependencies = [ - "bytes 0.5.6", -] +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[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 = "0.5.6" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] -name = "bytes" -version = "1.4.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cfg-if" -version = "0.1.10" +name = "clap" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" +dependencies = [ + "clap_builder", + "clap_derive", +] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "clap_builder" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", + "terminal_size", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -98,23 +210,73 @@ dependencies = [ "typenum", ] +[[package]] +name = "deadpool" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f" +dependencies = [ + "deadpool-runtime", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-postgres" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" +dependencies = [ + "async-trait", + "deadpool", + "getrandom 0.2.15", + "tokio", + "tokio-postgres", + "tracing", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +dependencies = [ + "tokio", +] + [[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", "crypto-common", "subtle", ] +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "fallible-iterator" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "fnv" version = "1.0.7" @@ -123,9 +285,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "futures-channel" -version = "0.3.26" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -133,38 +295,38 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.26" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-macro" -version = "0.3.26" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.108", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "futures-sink" -version = "0.3.26" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.26" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.26" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-macro", @@ -177,34 +339,57 @@ 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 0.9.4", + "version_check", ] [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", + "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] -name = "hermit-abi" -version = "0.2.6" +name = "getrandom" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ + "cfg-if", "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hmac" version = "0.12.1" @@ -216,47 +401,58 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ - "bytes 1.4.0", + "bytes", "fnv", "itoa", ] [[package]] name = "http-body" -version = "0.4.5" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "bytes 1.4.0", + "bytes", "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[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.24" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ - "bytes 1.4.0", + "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -264,45 +460,97 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "smallvec", "tokio", - "tower-service", - "tracing", - "want", ] [[package]] name = "hyper-techempower" version = "0.5.0" dependencies = [ + "clap", + "deadpool-postgres", + "fastrand", + "http", + "http-body-util", "hyper", + "hyper-util", "log", "markup", - "net2", "num_cpus", "serde", "serde_json", + "socket2", + "strum", + "thiserror", "tokio", "tokio-postgres", + "tracing", + "tracing-subscriber", "v_htmlescape", ] +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "linux-raw-sys" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -310,102 +558,112 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "markup" -version = "0.3.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360ec4d83ae8c3150530220fd89e0c5dba54cfc8d7675695f1fdc3581880dce9" +checksum = "74a887ad620fe1022257343ac77fcdd3720e92888e1b2e66e1b7a4707f453898" dependencies = [ "markup-proc-macro", ] [[package]] name = "markup-proc-macro" -version = "0.3.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba9c3711ed5187a843aaa960eb78db98f64d76ea22a47c204ca2affb3904bb92" +checksum = "9ab6ee21fd1855134cacf2f41afdf45f1bc456c7d7f6165d763b4647062dd2be" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", + "proc-macro2", + "quote", + "syn", ] [[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.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "mio" -version = "0.8.6" +name = "miniz_oxide" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.45.0", + "adler2", ] [[package]] -name = "net2" -version = "0.2.38" +name = "mio" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "cfg-if 0.1.10", "libc", - "winapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] -name = "nom" -version = "4.2.3" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "memchr", - "version_check 0.1.5", + "overload", + "winapi", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" + +[[package]] +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -413,46 +671,46 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[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.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_shared", ] [[package]] name = "phf_shared" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -462,13 +720,13 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "postgres-protocol" -version = "0.6.4" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878c6cbf956e03af9aa8204b407b9cbf47c072164800aa918c516cd4b056c50c" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" dependencies = [ "base64", "byteorder", - "bytes 1.4.0", + "bytes", "fallible-iterator", "hmac", "md-5", @@ -480,73 +738,64 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.4" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73d946ec7d256b04dfadc4e6a3292324e6f417124750fc5c0950f981b703a0f1" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ - "bytes 1.4.0", + "bytes", "fallible-iterator", "postgres-protocol", ] [[package]] name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "0.4.30" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "unicode-xid", + "zerocopy", ] [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "0.6.13" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ - "proc-macro2 0.4.30", + "proc-macro2", ] [[package]] -name = "quote" -version = "1.0.23" +name = "r-efi" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" -dependencies = [ - "proc-macro2 1.0.51", -] +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" [[package]] name = "rand" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ - "libc", "rand_chacha", "rand_core", + "zerocopy", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -554,150 +803,243 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom", + "getrandom 0.3.2", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ "bitflags", ] +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.152" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.108", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "serde_json" -version = "1.0.93" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[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 1.0.0", + "cfg-if", "cpufeatures", "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "siphasher" -version = "0.3.10" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" -version = "0.4.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] -name = "subtle" -version = "2.4.1" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "syn" -version = "0.15.44" +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid", + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" -version = "1.0.108" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56e159d99e6c2b93995d171050271edb50ecc5288fbc7cc17de8fdce4e58c14" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2", + "quote", "unicode-ident", ] +[[package]] +name = "terminal_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +dependencies = [ + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -710,29 +1052,28 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.25.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ - "autocfg", - "bytes 1.4.0", + "backtrace", + "bytes", "libc", - "memchr", "mio", "pin-project-lite", "socket2", - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-postgres" -version = "0.7.7" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a12c1b3e0704ae7dfc25562629798b29c72e6b1d0a681b6f29ab4ae5e7f7bf" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" dependencies = [ "async-trait", "byteorder", - "bytes 1.4.0", + "bytes", "fallible-iterator", "futures-channel", "futures-util", @@ -743,149 +1084,244 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", + "rand", "socket2", "tokio", "tokio-util", + "whoami", ] [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ - "bytes 1.4.0", + "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if 1.0.0", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", + "valuable", ] [[package]] -name = "try-lock" -version = "0.2.4" +name = "tracing-log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] [[package]] name = "typenum" -version = "1.16.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-bidi" -version = "0.3.10" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] -name = "unicode-xid" +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasite" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] -name = "v_escape" -version = "0.13.2" +name = "wasm-bindgen" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039a44473286eb84e4e74f90165feff67c802dbeced7ee4c5b00d719b0d0475e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "buf-min", - "v_escape_derive", + "cfg-if", + "once_cell", + "wasm-bindgen-macro", ] [[package]] -name = "v_escape_derive" -version = "0.8.5" +name = "wasm-bindgen-backend" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29769400af8b264944b851c961a4a6930e76604f59b1fcd51246bab6a296c8c" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ - "nom", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.108", + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", ] [[package]] -name = "v_htmlescape" -version = "0.10.4" +name = "wasm-bindgen-macro" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7c2a33ed7cf0dc1b42bcf39e01b6512f9df08f09e1cd8a49d9dc49a6a9482" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ - "cfg-if 1.0.0", - "v_escape", + "quote", + "wasm-bindgen-macro-support", ] [[package]] -name = "version_check" -version = "0.1.5" +name = "wasm-bindgen-macro-support" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] [[package]] -name = "version_check" -version = "0.9.4" +name = "wasm-bindgen-shared" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] -name = "want" -version = "0.3.0" +name = "web-sys" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ - "log", - "try-lock", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "whoami" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", + "web-sys", +] [[package]] name = "winapi" @@ -911,37 +1347,32 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 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-targets", ] [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -950,42 +1381,77 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/frameworks/Rust/hyper/Cargo.toml b/frameworks/Rust/hyper/Cargo.toml index 2d3819863d7..b94bb0cbbae 100644 --- a/frameworks/Rust/hyper/Cargo.toml +++ b/frameworks/Rust/hyper/Cargo.toml @@ -5,30 +5,47 @@ edition = "2018" authors = [ "Steve Klabnik ", "Alexander Polyakov ", - "Sean McArthur " + "Sean McArthur ", ] -[[bin]] -name = "hyper-techempower" -path = "src/main.rs" - -[[bin]] -name = "hyper-db-techempower" -path = "src/main_db.rs" - [dependencies] +clap = { version = "4.5.32", features = ["derive", "wrap_help"] } +deadpool-postgres = "0.14.1" +fastrand = "2.3.0" +http = "1.3.1" +http-body-util = "0.1.3" # Disable default runtime, so that tokio single thread can be used instead. -hyper = { version = "0.14", features = ["server", "http1"], default-features = false } +hyper = { version = "1.6.0", features = [ + "server", + "http1", +], default-features = false } +hyper-util = { version = "0.1.10", features = [ + "http1", + "server", + "service", + "tokio", +] } # Since no logs are allowed anyways, just compile-time turn them all off -log = { version = "0.4", features = ["release_max_level_off"] } -markup = "0.3.1" -net2 = "0.2" -num_cpus = "1.2" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -tokio = { version = "1", features = ["rt", "net", "time"] } -tokio-postgres = { version = "0.7", default-features = false, features = ["runtime"] } -v_htmlescape = "0.10" +log = { version = "0.4.26", features = ["release_max_level_off"] } +markup = "0.15.0" +num_cpus = "1.16.0" +serde = { version = "1.0.219", features = ["derive"] } +serde_json = "1.0.140" +socket2 = { version = "0.5.8", features = ["all"] } +strum = { version = "0.27.1", features = ["derive"] } +thiserror = "2.0.12" +tokio = { version = "1.44.1", features = [ + "rt", + "rt-multi-thread", + "net", + "time", +] } +tokio-postgres = { version = "0.7.13", default-features = false, features = [ + "runtime", +] } +tracing = "0.1.41" +tracing-subscriber = "0.3.19" +v_htmlescape = "0.15.8" [profile.release] opt-level = 3 diff --git a/frameworks/Rust/hyper/benchmark_config.json b/frameworks/Rust/hyper/benchmark_config.json index 4dab46b0554..f9f7ef8f673 100644 --- a/frameworks/Rust/hyper/benchmark_config.json +++ b/frameworks/Rust/hyper/benchmark_config.json @@ -1,9 +1,18 @@ { "framework": "hyper", + "maintainers": [ + "polachok", + "seanmonstar", + "steveklabnik" + ], "tests": [{ "default": { - "plaintext_url": "/plaintext", + "docker_cmd": "hyper-techempower --runtime current-thread", "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?count=", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Micro", @@ -15,10 +24,16 @@ "webserver": "hyper", "os": "Linux", "database_os": "Linux", - "display_name": "hyper", + "display_name": "Hyper (current-thread runtime)", "notes": "" }, - "db": { + "multi-thread": { + "dockerfile": "hyper.dockerfile", + "docker_cmd": "hyper-techempower --runtime multi-thread", + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?count=", "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", @@ -31,7 +46,7 @@ "webserver": "hyper", "os": "Linux", "database_os": "Linux", - "display_name": "hyper", + "display_name": "Hyper (multi-thread runtime)", "notes": "" } }] diff --git a/frameworks/Rust/hyper/hyper-db.dockerfile b/frameworks/Rust/hyper/hyper-db.dockerfile deleted file mode 100644 index 8930ea7c28e..00000000000 --- a/frameworks/Rust/hyper/hyper-db.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM rust:1.67 - -ADD ./ /hyper -WORKDIR /hyper - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release - -EXPOSE 8080 - -CMD ["./target/release/hyper-db-techempower"] diff --git a/frameworks/Rust/hyper/hyper.dockerfile b/frameworks/Rust/hyper/hyper.dockerfile index e273f5c95c4..b2f6b8cb6b3 100644 --- a/frameworks/Rust/hyper/hyper.dockerfile +++ b/frameworks/Rust/hyper/hyper.dockerfile @@ -1,11 +1,8 @@ -FROM rust:1.67 - -ADD ./ /hyper -WORKDIR /hyper - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native" cargo build --release +FROM rust:1.85 AS hyper +WORKDIR /src +COPY . . +RUN RUSTFLAGS="-C target-cpu=native" cargo install --path . --locked EXPOSE 8080 - -CMD ["./target/release/hyper-techempower"] +CMD ["hyper-techempower"] +HEALTHCHECK CMD curl --fail http://localhost:8080/ping || exit 1 \ No newline at end of file diff --git a/frameworks/Rust/hyper/rustfmt.toml b/frameworks/Rust/hyper/rustfmt.toml new file mode 100644 index 00000000000..e37b2bf4664 --- /dev/null +++ b/frameworks/Rust/hyper/rustfmt.toml @@ -0,0 +1,4 @@ +# unstable_features +comment_width = 100 +group_imports = "StdExternalCrate" +imports_granularity = "Module" diff --git a/frameworks/Rust/hyper/src/db.rs b/frameworks/Rust/hyper/src/db.rs index d72de86f798..b6cb246af04 100644 --- a/frameworks/Rust/hyper/src/db.rs +++ b/frameworks/Rust/hyper/src/db.rs @@ -1,46 +1,21 @@ -use std::net::SocketAddr; +use std::sync::LazyLock; -use tokio::net::TcpStream; -use tokio::runtime::Handle; -use tokio_postgres::{Client, Config, NoTls, Statement}; +use deadpool_postgres::{Config, CreatePoolError, Pool}; +use tokio_postgres::NoTls; +use tracing::info; -pub struct Db { - client: Client, - fortune: Statement, -} - -pub struct Fortune { - pub id: i32, - pub message: String, -} - -pub async fn connect( - addr: SocketAddr, - config: Config, - handle: Handle, -) -> Result> { - let stream = TcpStream::connect(&addr).await?; - let (client, conn) = config.connect_raw(stream, NoTls).await?; - handle.spawn(conn); - let fortune = client.prepare("SELECT id, message FROM fortune").await?; - Ok(Db { client, fortune }) -} - -impl Db { - pub async fn tell_fortune(&self) -> Result, tokio_postgres::Error> { - let mut items = vec![Fortune { - id: 0, - message: "Additional fortune added at request time.".to_string(), - }]; +pub static POOL: LazyLock = + LazyLock::new(|| connect().expect("failed to create database connection pool")); - let rows = self.client.query(&self.fortune, &[]).await?; - for row in rows { - items.push(Fortune { - id: row.get(0), - message: row.get(1), - }); - } - items.sort_by(|it, next| it.message.cmp(&next.message)); - Ok(items) - } +fn connect() -> Result { + info!("Creating database connection pool"); + let config = Config { + host: Some("tfb-database".to_string()), + port: Some(5432), + dbname: Some("hello_world".to_string()), + user: Some("benchmarkdbuser".to_string()), + password: Some("benchmarkdbpass".to_string()), + ..Default::default() + }; + config.create_pool(None, NoTls) } diff --git a/frameworks/Rust/hyper/src/fortunes.rs b/frameworks/Rust/hyper/src/fortunes.rs new file mode 100644 index 00000000000..0cdbd2f3ccf --- /dev/null +++ b/frameworks/Rust/hyper/src/fortunes.rs @@ -0,0 +1,75 @@ +use std::convert::Infallible; + +use http::header::{CONTENT_LENGTH, CONTENT_TYPE, SERVER}; +use http::Response; +use http_body_util::combinators::BoxBody; +use http_body_util::{BodyExt, Full}; +use hyper::body::Bytes; +use tokio_postgres::Row; + +use crate::db::POOL; +use crate::{Error, SERVER_HEADER, TEXT_HTML}; + +const QUERY: &str = "SELECT id, message FROM fortune"; + +pub struct Fortune { + pub id: i32, + pub message: String, +} + +impl From<&Row> for Fortune { + fn from(row: &Row) -> Self { + Self { + id: row.get(0), + message: row.get(1), + } + } +} + +pub async fn get() -> crate::Result>> { + let fortunes = tell_fortune().await?; + let content = FortunesTemplate { fortunes }.to_string(); + Response::builder() + .header(SERVER, SERVER_HEADER.clone()) + .header(CONTENT_TYPE, TEXT_HTML.clone()) + .header(CONTENT_LENGTH, content.len()) + .body(Full::from(content).boxed()) + .map_err(Error::from) +} + +async fn tell_fortune() -> crate::Result> { + let db = POOL.get().await?; + let statement = db.prepare_cached(QUERY).await?; + let rows = db.query(&statement, &[]).await?; + let mut fortunes = rows.iter().map(Fortune::from).collect::>(); + + fortunes.push(Fortune { + id: 0, + message: "Additional fortune added at request time.".to_string(), + }); + fortunes.sort_by(|a, b| a.message.cmp(&b.message)); + + Ok(fortunes) +} + +markup::define! { + FortunesTemplate(fortunes: Vec) { + {markup::doctype()} + html { + head { + title { "Fortunes" } + } + body { + table { + tr { th { "id" } th { "message" } } + @for item in fortunes { + tr { + td { {item.id} } + td { {markup::raw(v_htmlescape::escape(&item.message))} } + } + } + } + } + } + } +} diff --git a/frameworks/Rust/hyper/src/json.rs b/frameworks/Rust/hyper/src/json.rs new file mode 100644 index 00000000000..c80ad50c09a --- /dev/null +++ b/frameworks/Rust/hyper/src/json.rs @@ -0,0 +1,29 @@ +use std::convert::Infallible; + +use http::header::{CONTENT_LENGTH, CONTENT_TYPE, SERVER}; +use http::Response; +use http_body_util::combinators::BoxBody; +use http_body_util::{BodyExt, Full}; +use hyper::body::Bytes; +use serde::Serialize; + +use crate::{Error, Result, APPLICATION_JSON, SERVER_HEADER}; + +#[derive(Serialize)] +struct JsonResponse<'a> { + message: &'a str, +} + +static CONTENT: JsonResponse = JsonResponse { + message: "Hello, world!", +}; + +pub fn get() -> Result>> { + let content = serde_json::to_vec(&CONTENT)?; + Response::builder() + .header(SERVER, SERVER_HEADER.clone()) + .header(CONTENT_TYPE, APPLICATION_JSON.clone()) + .header(CONTENT_LENGTH, content.len()) + .body(Full::from(content).boxed()) + .map_err(Error::from) +} diff --git a/frameworks/Rust/hyper/src/main.rs b/frameworks/Rust/hyper/src/main.rs index 663ed87afc0..81b79374172 100644 --- a/frameworks/Rust/hyper/src/main.rs +++ b/frameworks/Rust/hyper/src/main.rs @@ -1,91 +1,212 @@ -use hyper::header::{HeaderValue, CONTENT_LENGTH, CONTENT_TYPE, SERVER}; +use std::convert::Infallible; +use std::net::{Ipv4Addr, SocketAddr}; +use std::{io, thread}; + +use clap::{Parser, ValueEnum}; +use http_body_util::combinators::BoxBody; +use http_body_util::{BodyExt, Empty, Full}; +use hyper::body::{Bytes, Incoming}; +use hyper::header::{HeaderValue, SERVER}; +use hyper::server::conn::http1; use hyper::service::service_fn; -use hyper::{Body, Response, StatusCode}; -use serde::Serialize; +use hyper::{Request, Response, StatusCode}; +use hyper_util::rt::TokioIo; +use socket2::{Domain, SockAddr, Socket}; +use strum::Display; +use thiserror::Error; +use tokio::net::TcpListener; +use tokio::runtime; +use tracing::{error, info}; + +mod db; +mod fortunes; +mod json; +mod multiple_queries; +mod plaintext; +mod single_query; + +static SERVER_HEADER: HeaderValue = HeaderValue::from_static("hyper"); +static APPLICATION_JSON: HeaderValue = HeaderValue::from_static("application/json"); +static TEXT_HTML: HeaderValue = HeaderValue::from_static("text/html; charset=utf-8"); +static TEXT_PLAIN: HeaderValue = HeaderValue::from_static("text/plain"); + +type Result = std::result::Result; + +#[derive(Debug, Error)] +enum Error { + #[error("I/O error: {0}")] + Io(#[from] io::Error), + #[error("Hyper error: {0}")] + Hyper(#[from] hyper::Error), + #[error("Database error: {0}")] + TokioPostgres(#[from] tokio_postgres::Error), + #[error("Http error: {0}")] + Http(#[from] http::Error), + #[error("Database pool error: {0}")] + DbPool(#[from] deadpool_postgres::PoolError), + #[error("Serde error: {0}")] + Serde(#[from] serde_json::Error), +} + +#[derive(Debug, Parser)] +struct Args { + /// The runtime to use. + #[arg(short, long, default_value_t = Runtime::default())] + runtime: Runtime, + + /// The number of threads to use. + /// + /// Defaults to the number of logical CPUs cores available on the system. + /// + /// - For the current thread runtime, this is the number of threads to spawn in addition to the + /// main thread. + /// - For the multi-thread runtime, this is the number of worker threads to configure the + /// runtime to use. + #[arg(short, long, default_value_t = num_cpus::get())] + threads: usize, +} + +#[derive(Clone, Debug, Default, Display, ValueEnum)] +#[strum(serialize_all = "kebab-case")] +enum Runtime { + #[default] + CurrentThread, + MultiThread, +} + +fn main() -> Result<()> { + // Note: this is only here to capture logs outside of the hot path code. Avoid logging messages + // in the hot path code. + tracing_subscriber::fmt().with_thread_ids(true).init(); -mod server; + let args = Args::parse(); + match args.runtime { + Runtime::CurrentThread => run_current_thread(args.threads)?, + Runtime::MultiThread => run_multi_thread(args.threads)?, + } -static HELLO_WORLD: &[u8] = b"Hello, world!"; + Ok(()) +} + +/// Runs the server using multiple current thread runtimes. +fn run_current_thread(threads: usize) -> Result<()> { + info!("Running with {} threads", threads); + + // Spawn a new runtime on each thread. + for _ in 1..threads { + let runtime = runtime::Builder::new_current_thread() + .enable_all() + .build()?; + thread::spawn(|| run_server(runtime)); + } + // Run the server on the main thread. + let runtime = runtime::Builder::new_current_thread() + .enable_all() + .build()?; + run_server(runtime) +} -#[derive(Serialize)] -struct JsonResponse<'a> { - message: &'a str, +/// Runs the server using a single multi-thread runtime. +fn run_multi_thread(threads: usize) -> Result<()> { + let runtime = runtime::Builder::new_multi_thread() + .enable_all() + .worker_threads(threads) + .build()?; + run_server(runtime) } -fn main() { - // It seems most of the other benchmarks create static header values - // for performance, so just play by the same rules here... - let plaintext_len = HeaderValue::from_static("13"); - let plaintext_ct = HeaderValue::from_static("text/plain"); - let json_len = HeaderValue::from_static("27"); - let json_ct = HeaderValue::from_static("application/json"); - let server_header = HeaderValue::from_static("hyper"); - - server::run(move |socket, http, handle| { - // This closure is run for each connection... - - // The plaintext benchmarks use pipelined requests. - http.pipeline_flush(true); - - // Gotta clone these to be able to move into the Service... - let plaintext_len = plaintext_len.clone(); - let plaintext_ct = plaintext_ct.clone(); - let json_len = json_len.clone(); - let json_ct = json_ct.clone(); - let server_header = server_header.clone(); - - // This is the `Service` that will handle the connection. - // `service_fn_ok` is a helper to convert a function that - // returns a Response into a `Service`. - let svc = service_fn(move |req| { - // Gotta clone these to be able to move into future... - let plaintext_len = plaintext_len.clone(); - let plaintext_ct = plaintext_ct.clone(); - let json_len = json_len.clone(); - let json_ct = json_ct.clone(); - let server_header = server_header.clone(); - - async move { - let (req, _body) = req.into_parts(); - // For speed, reuse the allocated header map from the request, - // instead of allocating a new one. Because. - let mut headers = req.headers; - headers.clear(); - - let body = match req.uri.path() { - // Apparently, other benchmarks don't check the method, so we - // don't either. Yay? - "/plaintext" => { - headers.insert(CONTENT_LENGTH, plaintext_len.clone()); - headers.insert(CONTENT_TYPE, plaintext_ct.clone()); - Body::from(HELLO_WORLD) - } - "/json" => { - let rep = JsonResponse { - message: "Hello, world!", - }; - let rep_body = serde_json::to_vec(&rep).unwrap(); - headers.insert(CONTENT_LENGTH, json_len.clone()); - headers.insert(CONTENT_TYPE, json_ct.clone()); - Body::from(rep_body) - } - _ => { - let mut res = Response::new(Body::empty()); - *res.status_mut() = StatusCode::NOT_FOUND; - *res.headers_mut() = headers; - return Ok::<_, std::io::Error>(res); - } - }; - - headers.insert(SERVER, server_header.clone()); - - let mut res = Response::new(body); - *res.headers_mut() = headers; - Ok(res) +fn run_server(runtime: runtime::Runtime) -> Result<()> { + // It's important to use [`Runtime::block_on()`] here and not [`handle::block_on()`] as + // otherwise the runtime will not drive I/O operations. See the [`Handle::block_on`] + // documentation for more information. + runtime.block_on(serve(runtime.handle())) +} + +async fn serve(handle: &runtime::Handle) -> Result<()> { + let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 8080)); + let socket = create_socket(addr)?; + + let listener = TcpListener::from_std(socket.into())?; + let addr = listener.local_addr()?; + info!("Listening on: {}", addr); + + // spawn accept loop into a task so it is scheduled on the runtime with all the other tasks. + let accept_loop = accept_loop(handle.clone(), listener); + handle.spawn(accept_loop).await.unwrap() +} + +/// Create a socket that allows reuse of the address and port. +/// +/// This makes it possible for multiple instances of the server task to bind to the same address and +/// port. +fn create_socket(addr: SocketAddr) -> Result { + let domain = match addr { + SocketAddr::V4(_) => Domain::IPV4, + SocketAddr::V6(_) => Domain::IPV6, + }; + let addr = SockAddr::from(addr); + let socket = Socket::new(domain, socket2::Type::STREAM, None)?; + let backlog = 4096; // maximum number of pending connections + #[cfg(unix)] + socket.set_reuse_port(true)?; + socket.set_reuse_address(true)?; + socket.set_nodelay(true)?; + socket.set_nonblocking(true)?; // required for tokio + socket.bind(&addr)?; + socket.listen(backlog)?; + + Ok(socket) +} + +/// Accept loop that accepts incoming connections and spawns a new task to handle each connection. +async fn accept_loop(handle: runtime::Handle, listener: TcpListener) -> Result<()> { + let mut http = http1::Builder::new(); + http.pipeline_flush(true); + + let service = service_fn(router); + loop { + let (stream, _) = listener.accept().await?; + let http = http.clone(); + handle.spawn(async move { + let io = TokioIo::new(stream); + if let Err(_e) = http.serve_connection(io, service).await { + // ignore errors until https://github.com/hyperium/hyper/pull/3863/ is merged + // This PR will allow us to filter out shutdown errors which are expected. + // warn!("Connection error (this may be normal during shutdown): {e}"); } }); + } +} + +/// Routes requests to the appropriate handler. +async fn router(request: Request) -> Result>> { + // The method is always GET, so we don't check it. + match request.uri().path() { + "/ping" => ping(), + "/json" => json::get(), + "/db" => single_query::get().await, + "/queries" => multiple_queries::get(request.uri().query()).await, + "/fortunes" => fortunes::get().await, + "/plaintext" => plaintext::get(), + _ => not_found_error(), + } +} + +/// A handler that returns a "pong" response. +/// +/// This handler is used to verify that the server is running and can respond to requests. It is +/// used by the docker health check command. +fn ping() -> Result>> { + Response::builder() + .body(Full::from("pong").boxed()) + .map_err(Error::from) +} - // Spawn the `serve_connection` future into the runtime. - handle.spawn(http.serve_connection(socket, svc)); - }) +/// A handler that returns a 404 response. +fn not_found_error() -> Result>> { + Response::builder() + .status(StatusCode::NOT_FOUND) + .header(SERVER, SERVER_HEADER.clone()) + .body(Empty::new().boxed()) + .map_err(Error::from) } diff --git a/frameworks/Rust/hyper/src/main_db.rs b/frameworks/Rust/hyper/src/main_db.rs deleted file mode 100644 index 1ac93cd6b31..00000000000 --- a/frameworks/Rust/hyper/src/main_db.rs +++ /dev/null @@ -1,109 +0,0 @@ -use std::fmt::Write; -use std::sync::Arc; - -use hyper::header::{HeaderValue, CONTENT_TYPE, SERVER}; -use hyper::service::service_fn; -use hyper::{Body, Response}; -use std::net::ToSocketAddrs; - -mod db; -mod server; - -fn main() { - //"postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; - let mut psql_config = tokio_postgres::Config::new(); - psql_config - .user("benchmarkdbuser") - .password("benchmarkdbpass") - .dbname("hello_world"); - let psql_addr = ("tfb-database", 5432) - .to_socket_addrs() - .expect("must be able to resolve database hostname") - .next() - .expect("database hostname must resolve to an address"); - - server::run(move |socket, http, handle| { - let http = http.clone(); - let handle2 = handle.clone(); - - let html_ct = HeaderValue::from_static("text/html; charset=utf-8"); - let server_header = HeaderValue::from_static("hyper"); - let config = psql_config.clone(); - - // Before handling any requests, we should grab a DB connection. - let db_fut = async move { - let handle = handle2.clone(); - let db_conn = db::connect(psql_addr, config, handle).await?; - let db_conn = Arc::new(db_conn); - - let html_ct = html_ct.clone(); - let server_header = server_header.clone(); - - // This is the `Service` that will handle the connection. - // `service_fn` is a helper to convert a function that - // returns a Future into a `Service`. - let svc = service_fn(move |req| { - let html_ct = html_ct.clone(); - let server_header = server_header.clone(); - let db_conn = db_conn.clone(); - - async move { - let (req, _body) = req.into_parts(); - // For speed, reuse the allocated header map from the request, - // instead of allocating a new one. Because. - let mut headers = req.headers; - headers.clear(); - - headers.insert(CONTENT_TYPE, html_ct.clone()); - headers.insert(SERVER, server_header.clone()); - - match req.uri.path() { - "/fortunes" => { - let fortunes = db_conn.tell_fortune().await?; - let mut buf = String::with_capacity(2048); - let _ = write!(&mut buf, "{}", FortunesTemplate { fortunes }); - let mut res = Response::new(Body::from(buf)); - *res.headers_mut() = headers; - Ok::<_, Box>(res) - } - _ => { - let mut res = Response::new(Body::empty()); - *res.status_mut() = hyper::StatusCode::NOT_FOUND; - *res.headers_mut() = headers; - Ok(res) - } - } - } - }); - // Spawn the `serve_connection` future into the runtime. - handle2.spawn(http.serve_connection(socket, svc)); - Ok::<_, Box>(()) - }; - - handle.spawn(async move { - let _ = db_fut.await; - }); - }); -} - -markup::define! { - FortunesTemplate(fortunes: Vec) { - {markup::doctype()} - html { - head { - title { "Fortunes" } - } - body { - table { - tr { th { "id" } th { "message" } } - @for item in {fortunes} { - tr { - td { {item.id} } - td { {markup::raw(v_htmlescape::escape(&item.message))} } - } - } - } - } - } - } -} diff --git a/frameworks/Rust/hyper/src/multiple_queries.rs b/frameworks/Rust/hyper/src/multiple_queries.rs new file mode 100644 index 00000000000..f9aa862acad --- /dev/null +++ b/frameworks/Rust/hyper/src/multiple_queries.rs @@ -0,0 +1,59 @@ +use std::convert::Infallible; + +use http::header::{CONTENT_LENGTH, CONTENT_TYPE, SERVER}; +use http::Response; +use http_body_util::combinators::BoxBody; +use http_body_util::{BodyExt, Full}; +use hyper::body::Bytes; +use serde::Serialize; +use tokio_postgres::Row; + +use crate::db::POOL; +use crate::{Error, Result, APPLICATION_JSON, SERVER_HEADER}; + +const QUERY: &str = "SELECT id, randomnumber FROM world WHERE id = $1"; + +#[derive(Debug, Serialize)] +pub struct World { + id: i32, + randomnumber: i32, +} + +impl From for World { + fn from(row: Row) -> Self { + World { + id: row.get(0), + randomnumber: row.get(1), + } + } +} + +pub async fn get(query: Option<&str>) -> Result>> { + let count = query + .and_then(|query| query.strip_prefix("count=")) + .and_then(|query| query.parse().ok()) + .unwrap_or(1) + .clamp(1, 500); + + let worlds = query_worlds(count).await?; + let json = serde_json::to_vec(&worlds)?; + + Response::builder() + .header(SERVER, SERVER_HEADER.clone()) + .header(CONTENT_TYPE, APPLICATION_JSON.clone()) + .header(CONTENT_LENGTH, json.len()) + .body(Full::from(json).boxed()) + .map_err(Error::from) +} + +async fn query_worlds(count: usize) -> Result> { + let db = POOL.get().await?; + let statement = db.prepare_cached(QUERY).await?; + let mut worlds = Vec::with_capacity(count); + for _ in 0..count { + let id = fastrand::i32(1..10_000); + let row = db.query_one(&statement, &[&id]).await?; + worlds.push(World::from(row)); + } + Ok(worlds) +} diff --git a/frameworks/Rust/hyper/src/plaintext.rs b/frameworks/Rust/hyper/src/plaintext.rs new file mode 100644 index 00000000000..e2a081d2d39 --- /dev/null +++ b/frameworks/Rust/hyper/src/plaintext.rs @@ -0,0 +1,20 @@ +use std::convert::Infallible; + +use http::header::{CONTENT_LENGTH, CONTENT_TYPE, SERVER}; +use http::Response; +use http_body_util::combinators::BoxBody; +use http_body_util::{BodyExt, Full}; +use hyper::body::Bytes; + +use crate::{Error, Result, SERVER_HEADER, TEXT_PLAIN}; + +static CONTENT: &[u8] = b"Hello, world!"; + +pub fn get() -> Result>> { + Response::builder() + .header(SERVER, SERVER_HEADER.clone()) + .header(CONTENT_TYPE, TEXT_PLAIN.clone()) + .header(CONTENT_LENGTH, CONTENT.len()) + .body(Full::from(CONTENT).boxed()) + .map_err(Error::from) +} diff --git a/frameworks/Rust/hyper/src/server.rs b/frameworks/Rust/hyper/src/server.rs deleted file mode 100644 index 32ae0c8cc75..00000000000 --- a/frameworks/Rust/hyper/src/server.rs +++ /dev/null @@ -1,79 +0,0 @@ -use std::io; -use std::net::SocketAddr; -use std::thread; - -use hyper::server::conn::Http; -use tokio::net::{TcpListener, TcpStream}; -use tokio::runtime::{Builder as RuntimeBuilder, Handle}; - -pub(crate) fn run(per_connection: F) -where - F: Fn(TcpStream, &mut Http, Handle) + Clone + Send + 'static, -{ - // Spawn a thread for each available core, minus one, since we'll - // reuse the main thread as a server thread as well. - for _ in 1..num_cpus::get() { - let per_connection = per_connection.clone(); - thread::spawn(move || { - server_thread(per_connection); - }); - } - server_thread(per_connection); -} - -fn server_thread(per_connection: F) -where - F: Fn(TcpStream, &mut Http, Handle) + Send + 'static, -{ - let mut http = Http::new(); - http.http1_only(true); - - // Our event loop... - let core = RuntimeBuilder::new_current_thread() - .enable_all() - .build() - .expect("runtime"); - let handle = core.handle(); - - // Bind to 0.0.0.0:8080 - let addr = SocketAddr::from(([0, 0, 0, 0], 8080)); - - // For every accepted connection, spawn an HTTP task - let server = async move { - let tcp = reuse_listener(&addr).expect("couldn't bind to addr"); - loop { - match tcp.accept().await { - Ok((sock, _)) => { - let _ = sock.set_nodelay(true); - per_connection(sock, &mut http, handle.clone()); - } - Err(e) => { - log::warn!("accept error: {}", e) - } - } - } - }; - - core.block_on(server); -} - -fn reuse_listener(addr: &SocketAddr) -> io::Result { - let builder = match *addr { - SocketAddr::V4(_) => net2::TcpBuilder::new_v4()?, - SocketAddr::V6(_) => net2::TcpBuilder::new_v6()?, - }; - - #[cfg(unix)] - { - use net2::unix::UnixTcpBuilderExt; - if let Err(e) = builder.reuse_port(true) { - eprintln!("error setting SO_REUSEPORT: {}", e); - } - } - - builder.reuse_address(true)?; - builder.bind(addr)?; - let listener = builder.listen(1024)?; - listener.set_nonblocking(true)?; - TcpListener::from_std(listener) -} diff --git a/frameworks/Rust/hyper/src/single_query.rs b/frameworks/Rust/hyper/src/single_query.rs new file mode 100644 index 00000000000..62083dd4d3a --- /dev/null +++ b/frameworks/Rust/hyper/src/single_query.rs @@ -0,0 +1,50 @@ +use std::convert::Infallible; + +use http::header::{CONTENT_LENGTH, CONTENT_TYPE, SERVER}; +use http::Response; +use http_body_util::combinators::BoxBody; +use http_body_util::{BodyExt, Full}; +use hyper::body::Bytes; +use serde::Serialize; +use tokio_postgres::Row; + +use crate::db::POOL; +use crate::{Error, Result, APPLICATION_JSON, SERVER_HEADER}; + +static QUERY: &str = "SELECT id, randomnumber FROM world WHERE id = $1"; + +#[derive(Debug, Serialize)] +pub struct World { + id: i32, + randomnumber: i32, +} + +impl From for World { + fn from(row: Row) -> Self { + World { + id: row.get(0), + randomnumber: row.get(1), + } + } +} + +pub async fn get() -> Result>> { + let id = fastrand::i32(1..10_000); + let world = query_world(id).await?; + let json = serde_json::to_vec(&world)?; + + Response::builder() + .header(SERVER, SERVER_HEADER.clone()) + .header(CONTENT_TYPE, APPLICATION_JSON.clone()) + .header(CONTENT_LENGTH, json.len()) + .body(Full::from(json).boxed()) + .map_err(Error::from) +} + +async fn query_world(id: i32) -> Result { + let db = POOL.get().await?; + let statement = db.prepare_cached(QUERY).await?; + let row = db.query_one(&statement, &[&id]).await?; + let world = World::from(row); + Ok(world) +} From 1c894c9d0d3f14f7b001969d52e0535754e25092 Mon Sep 17 00:00:00 2001 From: Aleksei Gagarin Date: Mon, 24 Mar 2025 20:35:40 +0400 Subject: [PATCH 1306/1766] php/spiral: cleanup (#9682) * Spiral: Add cycle orm config * Disable unused modules * Update PHP to 8.4 * Build ORM schema before workers start * Show `app configure` log * Use ORM warmup in roadrunner only --- frameworks/PHP/spiral/.env | 1 + frameworks/PHP/spiral/.rr.yaml | 2 + frameworks/PHP/spiral/app.php | 13 +++++- frameworks/PHP/spiral/app/config/cycle.php | 52 ++++++++++++++++++++++ frameworks/PHP/spiral/app/src/App.php | 9 ---- frameworks/PHP/spiral/composer.json | 8 ---- frameworks/PHP/spiral/spiral.dockerfile | 6 +-- 7 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 frameworks/PHP/spiral/app/config/cycle.php diff --git a/frameworks/PHP/spiral/.env b/frameworks/PHP/spiral/.env index 99b475a0bef..c515771e507 100644 --- a/frameworks/PHP/spiral/.env +++ b/frameworks/PHP/spiral/.env @@ -1,4 +1,5 @@ # Debug mode disabled view cache and enabled higher verbosity. +APP_ENV=prod DEBUG=false DB_DSN=mysql:host=tfb-database:3306;charset=utf8;dbname=hello_world;user=benchmarkdbuser;password=benchmarkdbpass diff --git a/frameworks/PHP/spiral/.rr.yaml b/frameworks/PHP/spiral/.rr.yaml index 392e5df92b4..f4b6753ca6f 100644 --- a/frameworks/PHP/spiral/.rr.yaml +++ b/frameworks/PHP/spiral/.rr.yaml @@ -4,6 +4,8 @@ rpc: listen: tcp://127.0.0.1:6001 server: + on_init: + command: "php app.php cycle" command: "php app.php" relay: pipes diff --git a/frameworks/PHP/spiral/app.php b/frameworks/PHP/spiral/app.php index 0aa75e9826e..0f747f19b01 100644 --- a/frameworks/PHP/spiral/app.php +++ b/frameworks/PHP/spiral/app.php @@ -3,16 +3,25 @@ declare(strict_types=1); use App\App; +use Spiral\Core\Container; +use Spiral\Core\Options; \mb_internal_encoding('UTF-8'); -\error_reporting(E_ALL | E_STRICT ^ E_DEPRECATED); +\error_reporting(E_ALL ^ E_DEPRECATED); \ini_set('display_errors', 'stderr'); // Register Composer's auto loader. require __DIR__ . '/vendor/autoload.php'; // Initialize shared container, bindings, directories and etc. -$app = App::create(directories: ['root' => __DIR__])->run(); +$options = new Options(); +$options->validateArguments = false; +$options->allowSingletonsRebinding = true; +$container = new Container(options: $options); +$app = App::create( + directories: ['root' => __DIR__], + container: $container, +)->run(); if ($app === null) { exit(255); diff --git a/frameworks/PHP/spiral/app/config/cycle.php b/frameworks/PHP/spiral/app/config/cycle.php new file mode 100644 index 00000000000..773081decb6 --- /dev/null +++ b/frameworks/PHP/spiral/app/config/cycle.php @@ -0,0 +1,52 @@ + [ + /** + * true (Default) - Schema will be stored in a cache after compilation. + * It won't be changed after entity modification. Use `php app.php cycle` to update schema. + * + * false - Schema won't be stored in a cache after compilation. + * It will be automatically changed after entity modification. (Development mode) + */ + 'cache' => true, + + /** + * The CycleORM provides the ability to manage default settings for + * every schema with not defined segments + */ + 'defaults' => [ + SchemaInterface::MAPPER => \Cycle\ORM\Mapper\Mapper::class, + SchemaInterface::REPOSITORY => \Cycle\ORM\Select\Repository::class, + SchemaInterface::SCOPE => null, + SchemaInterface::TYPECAST_HANDLER => [ + \Cycle\ORM\Parser\Typecast::class + ], + ], + + 'collections' => [ + 'default' => 'array', + 'factories' => [ + 'array' => new \Cycle\ORM\Collection\ArrayCollectionFactory(), + // 'doctrine' => new \Cycle\ORM\Collection\DoctrineCollectionFactory(), + // 'illuminate' => new \Cycle\ORM\Collection\IlluminateCollectionFactory(), + ], + ], + + /** + * Schema generators (Optional) + * null (default) - Will be used schema generators defined in bootloaders + */ + 'generators' => null, + ], + + /** + * Prepare all internal ORM services (mappers, repositories, typecasters...) + */ + 'warmup' => \env('RR_MODE') !== null, +]; diff --git a/frameworks/PHP/spiral/app/src/App.php b/frameworks/PHP/spiral/app/src/App.php index b40bd257aa5..ffd8ebdf8ab 100644 --- a/frameworks/PHP/spiral/app/src/App.php +++ b/frameworks/PHP/spiral/app/src/App.php @@ -31,14 +31,7 @@ class App extends Kernel */ protected const LOAD = [ // Core Services - Bootloader\DebugBootloader::class, Bootloader\SnapshotsBootloader::class, - - // Security and validation - Bootloader\Security\EncrypterBootloader::class, - Bootloader\Security\FiltersBootloader::class, - Bootloader\Security\GuardBootloader::class, - RoadRunnerBridge\HttpBootloader::class, // HTTP extensions @@ -59,8 +52,6 @@ class App extends Kernel // Template engine Stempler\StemplerBootloader::class, - Scaffolder\ScaffolderBootloader::class, - // Framework commands Bootloader\CommandBootloader::class, RoadRunnerBridge\CommandBootloader::class, diff --git a/frameworks/PHP/spiral/composer.json b/frameworks/PHP/spiral/composer.json index 815b273af96..6246e74b539 100644 --- a/frameworks/PHP/spiral/composer.json +++ b/frameworks/PHP/spiral/composer.json @@ -16,14 +16,6 @@ "spiral/roadrunner-bridge": "^3.0", "spiral/roadrunner-cli": "^2.4" }, - "scripts": { - "post-create-project-cmd": [ - "php -r \"copy('.env.sample', '.env');\"", - "php app.php encrypt:key -m .env", - "php app.php configure -vv", - "rr get-binary --quiet" - ] - }, "autoload": { "psr-4": { "App\\": "app/src/" diff --git a/frameworks/PHP/spiral/spiral.dockerfile b/frameworks/PHP/spiral/spiral.dockerfile index 1f5d3440a48..22f390d0e49 100644 --- a/frameworks/PHP/spiral/spiral.dockerfile +++ b/frameworks/PHP/spiral/spiral.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.3-cli +FROM php:8.4-cli RUN apt-get update -yqq > /dev/null && apt-get install -yqq git unzip > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer @@ -9,7 +9,7 @@ RUN docker-php-ext-install \ sockets > /dev/null # RoadRunner >= 2024.x.x requires protobuf extensions to be installed -ARG PROTOBUF_VERSION="4.26.1" +ARG PROTOBUF_VERSION="4.30.1" RUN pecl channel-update pecl.php.net RUN MAKEFLAGS="-j $(nproc)" pecl install protobuf-${PROTOBUF_VERSION} > /dev/null @@ -22,7 +22,7 @@ RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --q # pre-configure RUN ./vendor/bin/rr get-binary > /dev/null 2>&1 -RUN php app.php configure > /dev/null 2>&1 +RUN php app.php configure EXPOSE 8080 From 3c4d632f6e06981e67a298a52f57058be83f1984 Mon Sep 17 00:00:00 2001 From: ccesar Date: Mon, 24 Mar 2025 13:36:30 -0300 Subject: [PATCH 1307/1766] Add veb, the new V lang framework (#9717) * Add veb. V lang default framework * Update Readme, config and so * set headers with a middleware to reduce code repetition --------- Co-authored-by: c-cesar --- frameworks/V/veb/README.md | 35 +++++++++ frameworks/V/veb/benchmark_config.json | 30 +++++++ frameworks/V/veb/config.toml | 19 +++++ frameworks/V/veb/fortunes.html | 12 +++ frameworks/V/veb/main.v | 103 +++++++++++++++++++++++++ frameworks/V/veb/run.sh | 7 ++ frameworks/V/veb/veb.dockerfile | 9 +++ 7 files changed, 215 insertions(+) create mode 100755 frameworks/V/veb/README.md create mode 100755 frameworks/V/veb/benchmark_config.json create mode 100644 frameworks/V/veb/config.toml create mode 100644 frameworks/V/veb/fortunes.html create mode 100644 frameworks/V/veb/main.v create mode 100644 frameworks/V/veb/run.sh create mode 100644 frameworks/V/veb/veb.dockerfile diff --git a/frameworks/V/veb/README.md b/frameworks/V/veb/README.md new file mode 100755 index 00000000000..467345c1431 --- /dev/null +++ b/frameworks/V/veb/README.md @@ -0,0 +1,35 @@ +# [veb](https://modules.vlang.io/veb.html) Benchmarking Test + +Veb is the default V language web framework. This test uses veb and V native ORM. + +### Test Type Implementation Source Code + +All tests in a 95 lines [main.v] and a html [template](fortunes.html) +### Database + +PostgresQL + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/query?q= + +### UPDATE + +http://localhost:8080/update?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/V/veb/benchmark_config.json b/frameworks/V/veb/benchmark_config.json new file mode 100755 index 00000000000..e5ca19da42c --- /dev/null +++ b/frameworks/V/veb/benchmark_config.json @@ -0,0 +1,30 @@ +{ + "framework": "veb", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "update_url": "/update?q=", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "veb", + "language": "V", + "flavor": "None", + "orm": "Micro", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "veb", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/V/veb/config.toml b/frameworks/V/veb/config.toml new file mode 100644 index 00000000000..ea461db93e4 --- /dev/null +++ b/frameworks/V/veb/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "veb" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?q=" +urls.update = "/update?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Micro" +platform = "None" +webserver = "None" +versus = "None" diff --git a/frameworks/V/veb/fortunes.html b/frameworks/V/veb/fortunes.html new file mode 100644 index 00000000000..51e1d42989a --- /dev/null +++ b/frameworks/V/veb/fortunes.html @@ -0,0 +1,12 @@ + + +Fortunes + + + +@for m in fortunes + +@end +
      idmessage
      @m.id@m.message
      + + \ No newline at end of file diff --git a/frameworks/V/veb/main.v b/frameworks/V/veb/main.v new file mode 100644 index 00000000000..1fa0b3e5d0f --- /dev/null +++ b/frameworks/V/veb/main.v @@ -0,0 +1,103 @@ +import veb +import time +import rand +import db.pg + +pub fn (app &App) plaintext(mut ctx Context) veb.Result { + s := 'Hello, World!' + return ctx.text(s) +} + +pub fn (app &App) json(mut ctx Context) veb.Result { + obj := {'message': 'Hello, World!'} + return ctx.json(obj) +} + +struct World { + id int @[primary; sql: serial] +mut: + randomnumber int +} + +pub fn (app &App) db(mut ctx Context) veb.Result { + r := rand.int_in_range(1, 10000) or { return ctx.text('rand error') } + mut world := sql app.db { + select from World where id == r + } or { return ctx.text('db error') } + return ctx.json(world.first()) +} + +pub fn (app &App) queries(mut ctx Context) veb.Result { + mut q := ctx.query['q'].int() + if q < 1 { q = 1 } else if q > 500 { q = 500 } + mut world := []World{} + for _ in 0..q { + r := rand.int_in_range(1, 10000) or { return ctx.text('rand error') } + world << sql app.db { + select from World where id == r + } or { return ctx.text('db error') } + } + return ctx.json(world) +} + +pub fn (app &App) update(mut ctx Context) veb.Result { + mut q := ctx.query['q'].int() + if q < 1 { q = 1 } else if q > 500 { q = 500 } + mut world := []World{} + for _ in 0..q { + r := rand.int_in_range(1, 10000) or { return ctx.text('rand error') } + world << sql app.db { + select from World where id == r + } or { return ctx.text('db error') } + world.last().randomnumber = rand.int_in_range(1, 10000) or { return ctx.text('rand error') } + sql app.db { + update World set randomnumber = world.last().randomnumber where id == world.last().id + } or { return ctx.text('db error') } + } + return ctx.json(world) +} + +struct Fortune { + id int @[primary; sql: serial] + message string +} + +pub fn (app &App) fortunes(mut ctx Context) veb.Result { + mut fortunes := sql app.db { + select from Fortune + } or { return ctx.text('db error') } + fortunes.insert(0, Fortune{id: 0, message: 'Additional fortune added at request time.'}) + fortunes.sort(a.message < b.message) + ctx.content_type = 'text/html; charset=utf-8' + return $veb.html() +} + +pub struct Context { + veb.Context +} + +pub struct App { + veb.Middleware[Context] +pub mut: + db pg.DB +} + +pub fn header(mut ctx Context) bool { + ctx.set_header(.date, time.now().as_utc().custom_format('ddd, DD MMM YYYY HH:MM:ss') + ' GMT') + ctx.set_header(.server, 'veb') + return true +} + +fn main() { + mut app := &App{ + db: pg.connect(pg.Config{ + host: 'tfb-database' + port: 5432 + user: 'benchmarkdbuser' + password: 'benchmarkdbpass' + dbname: 'hello_world' + }) ! + } + app.use(handler: header) + veb.run[App, Context](mut app, 8080) +} diff --git a/frameworks/V/veb/run.sh b/frameworks/V/veb/run.sh new file mode 100644 index 00000000000..5979570b9dc --- /dev/null +++ b/frameworks/V/veb/run.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +for i in $(seq 0 $(nproc)); do + taskset -c $i ./main & +done + +wait diff --git a/frameworks/V/veb/veb.dockerfile b/frameworks/V/veb/veb.dockerfile new file mode 100644 index 00000000000..d3313b4515e --- /dev/null +++ b/frameworks/V/veb/veb.dockerfile @@ -0,0 +1,9 @@ +FROM thevlang/vlang:debian-dev +RUN apt update && apt install -y libpq-dev + +WORKDIR /app +COPY ./main.v run.sh fortunes.html ./ +RUN v -prod -cflags '-std=gnu11 -Wall -O3 -march=native -mtune=native -flto' main.v + +EXPOSE 8080 +CMD sh run.sh From c82a834c5e8aeae14c8203cc05beaaa18dcc7cfc Mon Sep 17 00:00:00 2001 From: robert engels Date: Mon, 24 Mar 2025 15:17:55 -0500 Subject: [PATCH 1308/1766] update httpserver-robaho version (#9418) * dev environment * production * update README * update for latest httpserver * update httpserver version * update java options * update to version 1.0.9 and JDK 23 * Update pom.xml use version 1.0.22 * Update httpserver-robaho.dockerfile need different maven release for JDK23 * Update httpserver-robaho.dockerfile need to update the jdk from reference as well * Update pom.xml update to 1.0.23 * Update httpserver-robaho-postgres.dockerfile need to update other dockerfile --- .../httpserver-robaho-postgres.dockerfile | 4 ++-- .../Java/httpserver-robaho/httpserver-robaho.dockerfile | 4 ++-- frameworks/Java/httpserver-robaho/pom.xml | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile b/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile index 858df742cc8..b97d3eb5d2e 100644 --- a/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile +++ b/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile @@ -1,10 +1,10 @@ -FROM jelastic/maven:3.9.5-openjdk-21 as maven +FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven WORKDIR /httpserver-robaho COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:21-jdk-slim +FROM openjdk:23-jdk-slim WORKDIR /httpserver-robaho COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile b/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile index d02bada7709..f12f0bbdfeb 100644 --- a/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile +++ b/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile @@ -1,10 +1,10 @@ -FROM jelastic/maven:3.9.5-openjdk-21 as maven +FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven WORKDIR /httpserver-robaho COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:21-jdk-slim +FROM openjdk:23-jdk-slim WORKDIR /httpserver-robaho COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver-robaho/pom.xml b/frameworks/Java/httpserver-robaho/pom.xml index 2888eba5693..550fcab5118 100644 --- a/frameworks/Java/httpserver-robaho/pom.xml +++ b/frameworks/Java/httpserver-robaho/pom.xml @@ -7,9 +7,9 @@ jar UTF-8 - 21 - 21 - 21 + 23 + 23 + 23 @@ -40,7 +40,7 @@ io.github.robaho httpserver - 1.0.17 + 1.0.23 compile From ff6a8a796092a91f80e4269703bdd85f143d1a97 Mon Sep 17 00:00:00 2001 From: Mike Smith Date: Tue, 25 Mar 2025 09:03:16 -0700 Subject: [PATCH 1309/1766] Update CICD logic (#9725) * Update CICD logic Attempts to address #9682 * Check Spiral * [ci fw-only PHP/spiral] Attempt this again * [ci fw-only PHP/spiral] Correct the CICD logic * [ci fw-only PHP/spiral] Correct the CICD logic * [ci fw-only PHP/spiral] Add logging * [ci fw-only PHP/spiral] Add env var to dockerfile * [ci fw-only PHP/spiral] Pass through to Docker * [ci fw-only PHP/spiral] Maybe this is less dumb --- .github/workflows/build.yml | 2 +- toolset/test_types/verifications.py | 36 ++++++++++++++--------------- toolset/utils/benchmark_config.py | 2 ++ 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5bc13308a7c..46e7a2410e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -155,7 +155,7 @@ jobs: # run-ci.py runs the diffing to see if github actions needs to test this framework. Ideally/eventually, # we'd like to try and do the diffing before github_actions_clean & setup. # This will run the tests exactly as you would in your own vm: - docker network create tfb > /dev/null 2>&1 && docker run --network=tfb -e USER_ID=$(id -u) -v /var/run/docker.sock:/var/run/docker.sock --mount type=bind,source=`pwd`,target=/FrameworkBenchmarks techempower/tfb --mode verify --test-dir $RUN_TESTS --results-environment Github-Actions; + docker network create tfb > /dev/null 2>&1 && docker run --network=tfb -e USER_ID=$(id -u) -e CI=true -v /var/run/docker.sock:/var/run/docker.sock --mount type=bind,source=`pwd`,target=/FrameworkBenchmarks techempower/tfb --mode verify --test-dir $RUN_TESTS --results-environment Github-Actions; dependabot: needs: verify runs-on: ubuntu-latest diff --git a/toolset/test_types/verifications.py b/toolset/test_types/verifications.py index 99107ea757e..19d1e4b900d 100644 --- a/toolset/test_types/verifications.py +++ b/toolset/test_types/verifications.py @@ -326,7 +326,7 @@ def verify_updates(old_worlds, new_worlds, updates_expected, url): return problems -def verify_query_cases(self, cases, url, check_updates=False): +def verify_query_cases(test_instance, cases, url, check_updates=False): ''' The /updates and /queries tests accept a `queries` parameter that is expected to be between 1-500. @@ -352,19 +352,19 @@ def verify_query_cases(self, cases, url, check_updates=False): MIN = 1 # Initialization for query counting repetitions = 1 - concurrency = max(self.config.concurrency_levels) + concurrency = max(test_instance.config.concurrency_levels) expected_queries = 20 * repetitions * concurrency expected_rows = expected_queries # Only load in the World table if we are doing an Update verification world_db_before = {} if check_updates: - world_db_before = databases[self.database.lower()].get_current_world_table(self.config) + world_db_before = databases[test_instance.database.lower()].get_current_world_table(test_instance.config) expected_queries = expected_queries + concurrency * repetitions # eventually bulk updates! for q, max_infraction in cases: case_url = url + q - headers, body, status = self.request_headers_and_body_and_status(case_url) + headers, body, status = test_instance.request_headers_and_body_and_status(case_url) try: queries = int(q) # drops down for 'foo' and '' @@ -378,14 +378,14 @@ def verify_query_cases(self, cases, url, check_updates=False): problems += verify_randomnumber_list(expected_len, headers, body, case_url, max_infraction) - problems += verify_headers(self.request_headers_and_body_and_status, headers, case_url) + problems += verify_headers(test_instance.request_headers_and_body_and_status, headers, case_url) # Only check update changes if we are doing an Update verification and if we're testing # the highest number of queries, to ensure that we don't accidentally FAIL for a query # that only updates 1 item and happens to set its randomNumber to the same value it # previously held if check_updates and queries >= MAX: - world_db_after = databases[self.database.lower()].get_current_world_table(self.config) + world_db_after = databases[test_instance.database.lower()].get_current_world_table(test_instance.config) problems += verify_updates(world_db_before, world_db_after, MAX, case_url) @@ -408,16 +408,16 @@ def verify_query_cases(self, cases, url, check_updates=False): # parameter input problems += verify_randomnumber_list( expected_len, headers, body, case_url, max_infraction) - problems += verify_headers(self.request_headers_and_body_and_status, headers, case_url) + problems += verify_headers(test_instance.request_headers_and_body_and_status, headers, case_url) - if hasattr(self, 'database'): + if hasattr(test_instance, 'database'): # verify the number of queries and rows read for 20 queries, with a concurrency level of 512, with 2 repetitions - problems += verify_queries_count(self, "world", url + "20", concurrency, repetitions, expected_queries, + problems += verify_queries_count(test_instance, "world", url + "20", concurrency, repetitions, expected_queries, expected_rows, check_updates) return problems -def verify_queries_count(self, tbl_name, url, concurrency=512, count=2, expected_queries=1024, expected_rows=1024, +def verify_queries_count(test_instance, tbl_name, url, concurrency=512, count=2, expected_queries=1024, expected_rows=1024, check_updates=False): ''' Checks that the number of executed queries, at the given concurrency level, @@ -431,20 +431,20 @@ def verify_queries_count(self, tbl_name, url, concurrency=512, count=2, expected problems = [] - queries, rows, rows_updated, margin, trans_failures = databases[self.database.lower()].verify_queries(self.config, - tbl_name, url, - concurrency, - count, - check_updates) + queries, rows, rows_updated, margin, trans_failures = databases[test_instance.database.lower()].verify_queries(test_instance.config, + tbl_name, url, + concurrency, + count, + check_updates) isBulk = check_updates and (queries < 1.001 * expected_queries) and (queries > 0.999 * expected_queries) if check_updates and not isBulk: # Restore the normal queries number if bulk queries are not used expected_queries = (expected_queries - count * concurrency) * 2 - # Add a margin based on the number of cpu cores - queries_margin = 1.015 # For a run on Travis - if multiprocessing.cpu_count() > 2: + # Add a margin based on whether we're running in a CI environment + queries_margin = 1.015 # For a run in CI environment + if not test_instance.config.is_ci: queries_margin = 1 # real run (Citrine or Azure) -> no margin on queries # Check for transactions failures (socket errors...) if trans_failures > 0: diff --git a/toolset/utils/benchmark_config.py b/toolset/utils/benchmark_config.py index 48755e9f460..04dcc2c6cc3 100755 --- a/toolset/utils/benchmark_config.py +++ b/toolset/utils/benchmark_config.py @@ -22,6 +22,8 @@ def __init__(self, args): else: self.types = {t: types[t] for t in args.type} + # Check if we're running in a CI environment + self.is_ci = os.getenv('CI') self.duration = args.duration self.exclude = args.exclude self.quiet = args.quiet From 0ec720774d51597bf408f54d11f69163276be46d Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Wed, 26 Mar 2025 00:15:49 +0800 Subject: [PATCH 1310/1766] [viz] Improve JSON response (#9721) --- frameworks/Rust/viz/Cargo.toml | 6 +++-- frameworks/Rust/viz/src/db_pg.rs | 16 ++++++------ frameworks/Rust/viz/src/main.rs | 30 ++++++++++++++--------- 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 +- 7 files changed, 34 insertions(+), 26 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index a1daab27b7f..72d159b4b79 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -25,14 +25,14 @@ required-features = ["diesel", "diesel-async", "sailfish"] [dependencies] viz = "0.10" -hyper = "1.5" +hyper = "1.0" hyper-util = "0.1" http-body-util = "0.1" atoi = "2.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1" mime = "0.3" -rand = { version = "0.8", features = ["small_rng"] } +rand = { version = "0.9", features = ["small_rng"] } thiserror = "2.0" futures-util = "0.3" @@ -66,3 +66,5 @@ sailfish = { version = "0.9", optional = true } [profile.release] lto = true codegen-units = 1 +strip = true +opt-level = 3 diff --git a/frameworks/Rust/viz/src/db_pg.rs b/frameworks/Rust/viz/src/db_pg.rs index bb280fafc10..da7a5a0be5f 100644 --- a/frameworks/Rust/viz/src/db_pg.rs +++ b/frameworks/Rust/viz/src/db_pg.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, fmt::Write, io, sync::Arc}; use futures_util::{stream::FuturesUnordered, StreamExt, TryFutureExt, TryStreamExt}; -use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; +use rand::{rng, rngs::SmallRng, Rng, SeedableRng}; use tokio::pin; use tokio_postgres::{connect, types::ToSql, Client, NoTls, Statement}; use viz::{Error, IntoResponse, Response, StatusCode}; @@ -105,19 +105,19 @@ impl PgConnection { } pub async fn get_world(&self) -> Result { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let random_id = (rng.gen::() % 10_000 + 1) as i32; + let mut rng = SmallRng::from_rng(&mut rng()); + let random_id = (rng.random::() % 10_000 + 1) as i32; self.query_one_world(random_id).await } pub async fn get_worlds(&self, num: u16) -> Result, PgError> { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let worlds = FuturesUnordered::new(); for _ in 0..num { - let id = (rng.gen::() % 10_000 + 1) as i32; + let id = (rng.random::() % 10_000 + 1) as i32; worlds.push(self.query_one_world(id)); } @@ -125,13 +125,13 @@ impl PgConnection { } pub async fn update(&self, num: u16) -> Result, PgError> { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let worlds = FuturesUnordered::new(); for _ in 0..num { - let id = (rng.gen::() % 10_000 + 1) as i32; - let rid = (rng.gen::() % 10_000 + 1) as i32; + let id = (rng.random::() % 10_000 + 1) as i32; + let rid = (rng.random::() % 10_000 + 1) as i32; worlds.push(self.query_one_world(id).map_ok(move |mut world| { world.randomnumber = rid; diff --git a/frameworks/Rust/viz/src/main.rs b/frameworks/Rust/viz/src/main.rs index 0bde892034a..4daffd4916c 100644 --- a/frameworks/Rust/viz/src/main.rs +++ b/frameworks/Rust/viz/src/main.rs @@ -2,7 +2,7 @@ use serde::Serialize; use viz::{ - header::{HeaderValue, SERVER}, + header::{HeaderValue, CONTENT_TYPE, SERVER}, Bytes, Error, Request, Response, ResponseExt, Result, Router, }; @@ -22,18 +22,24 @@ async fn plaintext(_: Request) -> Result { } async fn json(_: Request) -> Result { - let mut res = Response::with( - http_body_util::Full::new(Bytes::from( - serde_json::to_vec(&Message { - message: "Hello, World!", - }) - .unwrap(), - )), - mime::APPLICATION_JSON.as_ref(), + let mut resp = Response::builder() + .body( + http_body_util::Full::new(Bytes::from( + serde_json::to_vec(&Message { + message: "Hello, World!", + }) + .unwrap(), + )) + .into(), + ) + .unwrap(); + let headers = resp.headers_mut(); + headers.insert(SERVER, HeaderValue::from_static("Viz")); + headers.insert( + CONTENT_TYPE, + HeaderValue::from_static(mime::APPLICATION_JSON.as_ref()), ); - res.headers_mut() - .insert(SERVER, HeaderValue::from_static("Viz")); - Ok(res) + Ok(resp) } #[tokio::main] diff --git a/frameworks/Rust/viz/viz-diesel.dockerfile b/frameworks/Rust/viz/viz-diesel.dockerfile index 62eec4e7ebd..9dac40c5efe 100644 --- a/frameworks/Rust/viz/viz-diesel.dockerfile +++ b/frameworks/Rust/viz/viz-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.83 +FROM rust:1.85 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz-pg.dockerfile b/frameworks/Rust/viz/viz-pg.dockerfile index e45d0db4402..d0ee0ebed7a 100644 --- a/frameworks/Rust/viz/viz-pg.dockerfile +++ b/frameworks/Rust/viz/viz-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.83 +FROM rust:1.85 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz-sqlx.dockerfile b/frameworks/Rust/viz/viz-sqlx.dockerfile index 62bd3cac1d8..734fccc8d4a 100644 --- a/frameworks/Rust/viz/viz-sqlx.dockerfile +++ b/frameworks/Rust/viz/viz-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.83 +FROM rust:1.85 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz.dockerfile b/frameworks/Rust/viz/viz.dockerfile index 16abf430a9f..df606181820 100644 --- a/frameworks/Rust/viz/viz.dockerfile +++ b/frameworks/Rust/viz/viz.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.83 +FROM rust:1.85 ADD ./ /viz WORKDIR /viz From 7c3a5bf26bcc7c9456934c7ed93bd083d15ca0d4 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Tue, 25 Mar 2025 23:16:55 +0700 Subject: [PATCH 1311/1766] Runtime improvements (#9722) * upgrade ktor depds * Update build.gradle.kts * Update pom.xml * Update pom.xml * some optimizations * improved r2dbc * upgrade kotlin version * fixed update * cleanup * cleanup 2 * fix db params * simplify update * added null checks * revert /update change * cleanup update --------- Co-authored-by: Ilya Nemtsev --- frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml | 2 +- .../org/jetbrains/ktor/benchmarks/Hello.kt | 41 +++++++++++----- .../ktor/benchmarks/models/Fortune.kt | 2 +- .../ktor/benchmarks/models/Message.kt | 7 ++- .../jetbrains/ktor/benchmarks/models/World.kt | 2 +- .../ktor-r2dbc/src/main/resources/logback.xml | 20 ++++---- frameworks/Kotlin/ktor/ktor.dockerfile | 2 +- frameworks/Kotlin/ktor/ktor/pom.xml | 2 +- .../org/jetbrains/ktor/benchmarks/Hello.kt | 49 +++++++++++-------- 9 files changed, 80 insertions(+), 47 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml index fc814702884..75b1efc4cc0 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml @@ -12,7 +12,7 @@ org.jetbrains.ktor tech-empower-framework-benchmark - 2.0.21 + 2.1.20 1.10.1 3.1.1 1.8.0 diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index 461c6e303e8..ac5d03fdbe8 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -32,6 +32,14 @@ import org.jetbrains.ktor.benchmarks.models.World import reactor.core.publisher.Flux import reactor.core.publisher.Mono import kotlin.random.Random +import java.time.Duration + +private val json = Json { + prettyPrint = false + isLenient = true + ignoreUnknownKeys = true + coerceInputValues = true +} fun Application.main() { val config = ApplicationConfig("application.conf") @@ -40,6 +48,7 @@ fun Application.main() { install(DefaultHeaders) val helloWorldContent = TextContent("Hello, World!", ContentType.Text.Plain) + val helloWorldMsg = Message("Hello, world!") routing { get("/plaintext") { @@ -47,7 +56,7 @@ fun Application.main() { } get("/json") { - call.respondText(Json.encodeToString(Message("Hello, world!")), ContentType.Application.Json) + call.respondText(json.encodeToString(helloWorldMsg), ContentType.Application.Json) } get("/db") { @@ -55,7 +64,7 @@ fun Application.main() { val request = getWorld(dbConnFactory, random) val result = request.awaitFirstOrNull() - call.respondText(Json.encodeToString(result), ContentType.Application.Json) + call.respondText(json.encodeToString(result), ContentType.Application.Json) } fun selectWorlds(queries: Int, random: Random): Flow = flow { @@ -74,7 +83,7 @@ fun Application.main() { } } - call.respondText(Json.encodeToString(result), ContentType.Application.Json) + call.respondText(json.encodeToString(result), ContentType.Application.Json) } get("/fortunes") { @@ -135,7 +144,7 @@ fun Application.main() { } } - call.respondText(Json.encodeToString(worldsUpdated), ContentType.Application.Json) + call.respondText(json.encodeToString(worldsUpdated), ContentType.Application.Json) } } } @@ -143,13 +152,20 @@ fun Application.main() { private fun getWorld( dbConnFactory: ConnectionFactory, random: Random ): Mono = Mono.usingWhen(dbConnFactory.create(), { connection -> - Mono.from(connection.createStatement(WORLD_QUERY).bind(0, random.nextInt(DB_ROWS) + 1).execute()).flatMap { r -> - Mono.from(r.map { row, _ -> - World( - row.get(0, Int::class.java)!!, row.get(1, Int::class.java)!! - ) - }) - } + Mono.from(connection.createStatement(WORLD_QUERY) + .bind("$1", random.nextInt(DB_ROWS) + 1) + .execute()) + .flatMap { r -> + Mono.from(r.map { row, _ -> + val id = row.get(0, Int::class.java) + val randomNumber = row.get(1, Int::class.java) + if (id != null && randomNumber != null) { + World(id, randomNumber) + } else { + throw IllegalStateException("Database returned null values for required fields") + } + }) + } }, Connection::close) private fun configurePostgresR2DBC(config: ApplicationConfig): ConnectionFactory { @@ -170,6 +186,9 @@ private fun configurePostgresR2DBC(config: ApplicationConfig): ConnectionFactory val cp = ConnectionPoolConfiguration.builder(cf) .initialSize(config.property("db.initPoolSize").getString().toInt()) .maxSize(config.property("db.maxPoolSize").getString().toInt()) + .maxIdleTime(Duration.ofSeconds(30)) + .maxAcquireTime(Duration.ofSeconds(5)) + .validationQuery("SELECT 1") .build() return ConnectionPool(cp) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt index 40b75ef4354..9484e01ab95 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt @@ -3,4 +3,4 @@ package org.jetbrains.ktor.benchmarks.models import kotlinx.serialization.Serializable @Serializable -class Fortune(val id: Int, var message: String) +data class Fortune(val id: Int, var message: String) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt index fc9bd1fada1..916169fbaf8 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt @@ -3,4 +3,9 @@ package org.jetbrains.ktor.benchmarks.models import kotlinx.serialization.Serializable @Serializable -class Message(val message: String) +data class Message(val message: String) + +// Cache common messages to reduce allocations +object MessageCache { + val helloWorld = Message("Hello, world!") +} diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt index 0c35be5c969..8b44731ccdf 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt @@ -3,4 +3,4 @@ package org.jetbrains.ktor.benchmarks.models import kotlinx.serialization.Serializable @Serializable -class World(val id: Int, var randomNumber: Int) +data class World(val id: Int, var randomNumber: Int) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml index 9fd0f518971..3f5ba85f95f 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml @@ -1,21 +1,21 @@ - %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + %msg%n - - true - - - + + true + + - + - - - + + + + diff --git a/frameworks/Kotlin/ktor/ktor.dockerfile b/frameworks/Kotlin/ktor/ktor.dockerfile index 076a51a1416..522fa558851 100644 --- a/frameworks/Kotlin/ktor/ktor.dockerfile +++ b/frameworks/Kotlin/ktor/ktor.dockerfile @@ -10,4 +10,4 @@ COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-net EXPOSE 9090 -CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+AlwaysPreTouch", "-XX:+UseStringDeduplication", "-jar", "app.jar"] diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 991f453b16a..93c927a496c 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -12,7 +12,7 @@ org.jetbrains.ktor tech-empower-framework-benchmark - 2.0.21 + 2.1.20 3.1.1 1.8.0 0.12.0 diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index a83a16f326b..17e8a8d8429 100644 --- a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -20,6 +20,7 @@ import org.jetbrains.ktor.benchmarks.Constants.WORLD_QUERY import java.sql.Connection import java.util.concurrent.ThreadLocalRandom import kotlin.random.Random +import kotlinx.serialization.Contextual @Serializable data class Message(val message: String) @@ -30,15 +31,26 @@ data class World(val id: Int, var randomNumber: Int) @Serializable data class Fortune(val id: Int, var message: String) +// Optimized JSON instance with better performance settings +private val json = Json { + prettyPrint = false + isLenient = true + ignoreUnknownKeys = true + coerceInputValues = true +} + fun Application.main() { val dbRows = 10000 - val poolSize = 48 + val poolSize = Runtime.getRuntime().availableProcessors() * 2 val pool = HikariDataSource(HikariConfig().apply { configurePostgres(poolSize) }) - val databaseDispatcher = Dispatchers.IO + + // Create a dedicated dispatcher for database operations + val databaseDispatcher = Dispatchers.IO.limitedParallelism(poolSize) install(DefaultHeaders) val helloWorldContent = TextContent("Hello, World!", ContentType.Text.Plain) + val jsonResponse = json.encodeToString(Message("Hello, world!")) routing { get("/plaintext") { @@ -46,7 +58,7 @@ fun Application.main() { } get("/json") { - call.respondText(Json.encodeToString(Message("Hello, world!")), ContentType.Application.Json) + call.respondText(jsonResponse, ContentType.Application.Json) } get("/db") { @@ -56,7 +68,6 @@ fun Application.main() { pool.connection.use { connection -> connection.prepareStatement(WORLD_QUERY).use { statement -> statement.setInt(1, random.nextInt(dbRows) + 1) - statement.executeQuery().use { rs -> rs.next() World(rs.getInt(1), rs.getInt(2)) @@ -65,7 +76,7 @@ fun Application.main() { } } - call.respondText(Json.encodeToString(world), ContentType.Application.Json) + call.respondText(json.encodeToString(world), ContentType.Application.Json) } fun Connection.selectWorlds(queries: Int, random: Random): List { @@ -73,14 +84,12 @@ fun Application.main() { prepareStatement(WORLD_QUERY).use { statement -> repeat(queries) { statement.setInt(1, random.nextInt(dbRows) + 1) - statement.executeQuery().use { rs -> rs.next() result += World(rs.getInt(1), rs.getInt(2)) } } } - return result } @@ -92,7 +101,7 @@ fun Application.main() { pool.connection.use { it.selectWorlds(queries, random) } } - call.respondText(Json.encodeToString(result), ContentType.Application.Json) + call.respondText(json.encodeToString(result), ContentType.Application.Json) } get("/fortunes") { @@ -137,22 +146,20 @@ fun Application.main() { withContext(databaseDispatcher) { pool.connection.use { connection -> result = connection.selectWorlds(queries, random) - result.forEach { it.randomNumber = random.nextInt(dbRows) + 1 } connection.prepareStatement(UPDATE_QUERY).use { updateStatement -> - for ((id, randomNumber) in result) { - updateStatement.setInt(1, randomNumber) - updateStatement.setInt(2, id) - updateStatement.addBatch() - } - - updateStatement.executeBatch() + for ((id, randomNumber) in result) { + updateStatement.setInt(1, randomNumber) + updateStatement.setInt(2, id) + updateStatement.addBatch() } + updateStatement.executeBatch() + } } } - call.respondText(Json.encodeToString(result), ContentType.Application.Json) + call.respondText(json.encodeToString(result), ContentType.Application.Json) } } } @@ -160,7 +167,6 @@ fun Application.main() { fun HikariConfig.configurePostgres(poolSize: Int) { jdbcUrl = "jdbc:postgresql://tfb-database/hello_world?useSSL=false" driverClassName = org.postgresql.Driver::class.java.name - configureCommon(poolSize) } @@ -172,9 +178,13 @@ fun HikariConfig.configureCommon(poolSize: Int) { addDataSourceProperty("useUnbufferedInput", "false") addDataSourceProperty("prepStmtCacheSize", "4096") addDataSourceProperty("prepStmtCacheSqlLimit", "2048") - connectionTimeout = 10000 + connectionTimeout = 5000 maximumPoolSize = poolSize minimumIdle = poolSize + idleTimeout = 300000 // 5 minutes + maxLifetime = 600000 // 10 minutes + validationTimeout = 5000 + leakDetectionThreshold = 60000 } fun HikariConfig.configureMySql(poolSize: Int) { @@ -186,7 +196,6 @@ fun HikariConfig.configureMySql(poolSize: Int) { fun ApplicationCall.queries() = request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 - object Constants { const val WORLD_QUERY = "SELECT id, randomNumber FROM World WHERE id = ?" const val FORTUNES_QUERY = "SELECT id, message FROM fortune" From cb11c212c0516c7a1362da604cec29d40a9cbd49 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Tue, 25 Mar 2025 06:17:14 -1000 Subject: [PATCH 1312/1766] upgrade to tio-boot-1.9.4 (#9729) Co-authored-by: litongjava --- frameworks/Java/tio-boot/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index cb358e64621..49cd3e8f3da 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -11,7 +11,7 @@ 1.8 ${java.version} ${java.version} - 1.9.3 + 1.9.4 com.litongjava.tio.http.server.MainApp From b60e904fc331138a005be6e7e1f485b61ff225d3 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Tue, 25 Mar 2025 06:17:49 -1000 Subject: [PATCH 1313/1766] upgrade to 3.7.3.v20250401 Tio server (#9730) * upgrade to 3.7.3.v20250401-RELEASE * add logback * change name to handler * remove tio-core * add tio-utils --------- Co-authored-by: litongjava --- frameworks/Java/tio-http-server/pom.xml | 21 ++++++++++++------- .../litongjava/tio/http/server/MainApp.java | 12 +++++------ .../CacheHandler.java} | 4 ++-- .../DbHandler.java} | 4 ++-- .../IndexHandler.java} | 4 ++-- 5 files changed, 25 insertions(+), 20 deletions(-) rename frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/{controller/CacheController.java => handler/CacheHandler.java} (94%) rename frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/{controller/DbController.java => handler/DbHandler.java} (98%) rename frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/{controller/IndexController.java => handler/IndexHandler.java} (94%) diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index f6fc4055259..29e1dbee22b 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -1,6 +1,4 @@ - + 4.0.0 com.litongjava tio-http-server-benchmark @@ -18,17 +16,18 @@ com.litongjava tio-http-server - 3.7.3.v20250301-RELEASE + 3.7.3.v20250401-RELEASE - + + com.litongjava - tio-core - 3.7.3.v20250305-RELEASE + tio-utils + 3.7.3.v20250401-RELEASE com.litongjava java-db - 1.5.0 + 1.5.1 junit @@ -62,6 +61,12 @@ 4.0.3 + + ch.qos.logback + logback-classic + 1.2.13 + + diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java index 6de2f4cbedb..470dab91c46 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/MainApp.java @@ -5,10 +5,10 @@ import com.litongjava.tio.http.server.config.EhCachePluginConfig; import com.litongjava.tio.http.server.config.EnjoyEngineConfig; import com.litongjava.tio.http.server.config.MysqlDbConfig; -import com.litongjava.tio.http.server.controller.CacheController; -import com.litongjava.tio.http.server.controller.DbController; -import com.litongjava.tio.http.server.controller.IndexController; +import com.litongjava.tio.http.server.handler.CacheHandler; +import com.litongjava.tio.http.server.handler.DbHandler; import com.litongjava.tio.http.server.handler.DefaultHttpRequestDispatcher; +import com.litongjava.tio.http.server.handler.IndexHandler; import com.litongjava.tio.http.server.router.DefaultHttpRequestRouter; import com.litongjava.tio.http.server.router.HttpRequestRouter; import com.litongjava.tio.server.ServerTioConfig; @@ -21,20 +21,20 @@ public static void main(String[] args) { EnvUtils.buildCmdArgsMap(args); EnvUtils.load(); // add route - IndexController controller = new IndexController(); + IndexHandler controller = new IndexHandler(); HttpRequestRouter simpleHttpRoutes = new DefaultHttpRequestRouter(); simpleHttpRoutes.add("/", controller::index); simpleHttpRoutes.add("/plaintext", controller::plaintext); simpleHttpRoutes.add("/json", controller::json); - DbController dbQueryController = new DbController(); + DbHandler dbQueryController = new DbHandler(); simpleHttpRoutes.add("/db", dbQueryController::db); simpleHttpRoutes.add("/queries", dbQueryController::queries); simpleHttpRoutes.add("/updates", dbQueryController::updates); simpleHttpRoutes.add("/fortunes", dbQueryController::fortunes); - CacheController cacheController = new CacheController(); + CacheHandler cacheController = new CacheHandler(); simpleHttpRoutes.add("/cachedQuery", cacheController::cachedQuery); // config server diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/CacheHandler.java similarity index 94% rename from frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java rename to frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/CacheHandler.java index ef48b3990db..8f951d73f2d 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/CacheController.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/CacheHandler.java @@ -1,4 +1,4 @@ -package com.litongjava.tio.http.server.controller; +package com.litongjava.tio.http.server.handler; import java.util.List; import java.util.Map; @@ -14,7 +14,7 @@ import com.litongjava.tio.http.common.HttpResponse; import com.litongjava.tio.http.server.utils.RandomUtils; -public class CacheController { +public class CacheHandler { // private Logger log = LoggerFactory.getLogger(this.getClass()); public HttpResponse cachedQuery(HttpRequest request) { diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/DbHandler.java similarity index 98% rename from frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java rename to frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/DbHandler.java index 782543a81e0..ff6426874b8 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/DbController.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/DbHandler.java @@ -1,4 +1,4 @@ -package com.litongjava.tio.http.server.controller; +package com.litongjava.tio.http.server.handler; import java.util.ArrayList; import java.util.Comparator; @@ -22,7 +22,7 @@ import com.litongjava.tio.http.server.util.Resps; import com.litongjava.tio.http.server.utils.RandomUtils; -public class DbController { +public class DbHandler { public HttpResponse db(HttpRequest request) { Integer id = request.getInt("id"); diff --git a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/IndexController.java b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java similarity index 94% rename from frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/IndexController.java rename to frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java index cf87426dda3..ccc3e9600b1 100644 --- a/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/controller/IndexController.java +++ b/frameworks/Java/tio-http-server/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java @@ -1,4 +1,4 @@ -package com.litongjava.tio.http.server.controller; +package com.litongjava.tio.http.server.handler; import com.alibaba.fastjson2.JSON; import com.litongjava.tio.http.common.HeaderName; @@ -12,7 +12,7 @@ * ab -k -n1000000 -c10 http://127.0.0.1:8080/json * ab -k -n1000000 -c10 http://127.0.0.1:8080/plaintext */ -public class IndexController { +public class IndexHandler { private static final String HELLO_WORLD = "Hello, World!"; private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD.getBytes(); From 59274ba6d036d39f48d5fa68621c62d72f7059bd Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 25 Mar 2025 17:18:28 +0100 Subject: [PATCH 1314/1766] [php] Update date for headers (#9731) --- frameworks/PHP/cakephp/server.php | 4 ++-- frameworks/PHP/comet/app.php | 4 ++-- frameworks/PHP/cyberphp/src/Response.php | 8 ++++---- frameworks/PHP/imi/Listener/WorkermanWorkerStart.php | 4 ++-- frameworks/PHP/laravel/server-man.php | 4 ++-- frameworks/PHP/leaf/server.php | 4 ++-- frameworks/PHP/mark/start.php | 4 ++-- frameworks/PHP/slim/server.php | 4 ++-- frameworks/PHP/symfony/server.php | 4 ++-- frameworks/PHP/webman/support/bootstrap/Date.php | 4 ++-- frameworks/PHP/workerman/Date.php | 6 +++--- frameworks/PHP/yii2/server.php | 4 ++-- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/frameworks/PHP/cakephp/server.php b/frameworks/PHP/cakephp/server.php index 5a6a09ae35d..0bec9788d42 100644 --- a/frameworks/PHP/cakephp/server.php +++ b/frameworks/PHP/cakephp/server.php @@ -36,9 +36,9 @@ class HeaderDate public static function init(): void { - self::$date = self::NAME.gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME.gmdate(DATE_RFC7231); Timer::add(1, static function () { - self::$date = self::NAME.gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME.gmdate(DATE_RFC7231); }); } } diff --git a/frameworks/PHP/comet/app.php b/frameworks/PHP/comet/app.php index 51300a8f213..857853bc9ec 100644 --- a/frameworks/PHP/comet/app.php +++ b/frameworks/PHP/comet/app.php @@ -24,9 +24,9 @@ $app->init( function() { ORM::init(); - Storage::$date = gmdate('D, d M Y H:i:s').' GMT'; + Storage::$date = gmdate(DATE_RFC7231); Timer::add(1, function() { - Storage::$date = gmdate('D, d M Y H:i:s').' GMT'; + Storage::$date = gmdate(DATE_RFC7231); }); }); diff --git a/frameworks/PHP/cyberphp/src/Response.php b/frameworks/PHP/cyberphp/src/Response.php index 7e6698231e1..d2b689aacdb 100644 --- a/frameworks/PHP/cyberphp/src/Response.php +++ b/frameworks/PHP/cyberphp/src/Response.php @@ -127,7 +127,7 @@ public static function json(mixed $data, int $status = 200, array $headers = []) } $headers['Content-Type'] = 'application/json; charset=utf-8'; - $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + $headers['Date'] = gmdate(DATE_RFC7231); return new static($json, $status, $headers); } @@ -137,7 +137,7 @@ public static function json(mixed $data, int $status = 200, array $headers = []) public static function html(string $html, int $status = 200, array $headers = []): static { $headers['Content-Type'] = 'text/html; charset=utf-8'; - $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + $headers['Date'] = gmdate(DATE_RFC7231); return new static($html, $status, $headers); } @@ -147,7 +147,7 @@ public static function html(string $html, int $status = 200, array $headers = [] public static function text(string $text, int $status = 200, array $headers = []): static { $headers['Content-Type'] = 'text/plain; charset=utf-8'; - $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + $headers['Date'] = gmdate(DATE_RFC7231); return new static($text, $status, $headers); } /** @@ -156,7 +156,7 @@ public static function text(string $text, int $status = 200, array $headers = [] public static function file(string $file, string $filename, int $status = 200, array $headers = []): static { $headers['Content-Type'] = 'application/octet-stream'; - $headers['Date'] = gmdate('D, d M Y H:i:s').' GMT'; + $headers['Date'] = gmdate(DATE_RFC7231); $headers['Content-Disposition'] = 'attachment; filename="' . $filename . '"'; return new static(file_get_contents($file), $status, $headers); } diff --git a/frameworks/PHP/imi/Listener/WorkermanWorkerStart.php b/frameworks/PHP/imi/Listener/WorkermanWorkerStart.php index 6ef1c980163..9ed362f6781 100644 --- a/frameworks/PHP/imi/Listener/WorkermanWorkerStart.php +++ b/frameworks/PHP/imi/Listener/WorkermanWorkerStart.php @@ -19,9 +19,9 @@ class WorkermanWorkerStart implements IEventListener */ public function handle(EventParam $e): void { - App::set('test_date', gmdate('D, d M Y H:i:s').' GMT'); + App::set('test_date', gmdate(DATE_RFC7231)); Timer::tick(1000, function() { - App::set('test_date', gmdate('D, d M Y H:i:s').' GMT'); + App::set('test_date', gmdate(DATE_RFC7231)); }); } diff --git a/frameworks/PHP/laravel/server-man.php b/frameworks/PHP/laravel/server-man.php index 489d4d611ee..c8769a35efd 100644 --- a/frameworks/PHP/laravel/server-man.php +++ b/frameworks/PHP/laravel/server-man.php @@ -12,9 +12,9 @@ $http_worker->count = (int) shell_exec('nproc') * 4; $http_worker->name = 'AdapterMan-Laravel'; $http_worker->onWorkerStart = static function () { - Header::$date = gmdate('D, d M Y H:i:s').' GMT'; + Header::$date = gmdate(DATE_RFC7231); Timer::add(1, function() { - Header::$date = gmdate('D, d M Y H:i:s').' GMT'; + Header::$date = gmdate(DATE_RFC7231); }); //init(); require __DIR__.'/start.php'; diff --git a/frameworks/PHP/leaf/server.php b/frameworks/PHP/leaf/server.php index c2d7355fbb7..b10ee532f8e 100644 --- a/frameworks/PHP/leaf/server.php +++ b/frameworks/PHP/leaf/server.php @@ -38,9 +38,9 @@ class HeaderDate public static function init(): void { - self::$date = self::NAME . gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME . gmdate(DATE_RFC7231); Timer::add(1, static function() { - self::$date = self::NAME . gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME . gmdate(DATE_RFC7231); }); } } \ No newline at end of file diff --git a/frameworks/PHP/mark/start.php b/frameworks/PHP/mark/start.php index b38fd3519ef..b1f96ce9ffd 100644 --- a/frameworks/PHP/mark/start.php +++ b/frameworks/PHP/mark/start.php @@ -27,12 +27,12 @@ ], \json_encode(['message' => 'Hello, World!'])); }); -$date = gmdate('D, d M Y H:i:s').' GMT'; +$date = gmdate(DATE_RFC7231); $api->onWorkerStart = static function () { Timer::add(1, function () { global $date; - $date = gmdate('D, d M Y H:i:s').' GMT'; + $date = gmdate(DATE_RFC7231); }); }; diff --git a/frameworks/PHP/slim/server.php b/frameworks/PHP/slim/server.php index 35f6c3fe62a..132751f7060 100644 --- a/frameworks/PHP/slim/server.php +++ b/frameworks/PHP/slim/server.php @@ -38,9 +38,9 @@ class HeaderDate public static function init(): void { - self::$date = self::NAME . gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME . gmdate(DATE_RFC7231); Timer::add(1, static function() { - self::$date = self::NAME . gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME . gmdate(DATE_RFC7231); }); } } \ No newline at end of file diff --git a/frameworks/PHP/symfony/server.php b/frameworks/PHP/symfony/server.php index 4b1691a91a4..73ba068f5ea 100644 --- a/frameworks/PHP/symfony/server.php +++ b/frameworks/PHP/symfony/server.php @@ -13,9 +13,9 @@ $http_worker->name = 'AdapterMan-Symfony'; $http_worker->onWorkerStart = static function () { - Header::$date = gmdate('D, d M Y H:i:s').' GMT'; + Header::$date = gmdate(DATE_RFC7231); Timer::add(1, function() { - Header::$date = gmdate('D, d M Y H:i:s').' GMT'; + Header::$date = gmdate(DATE_RFC7231); }); //init(); require __DIR__.'/start.php'; diff --git a/frameworks/PHP/webman/support/bootstrap/Date.php b/frameworks/PHP/webman/support/bootstrap/Date.php index c4ac4f2bc57..0101c5ad44f 100644 --- a/frameworks/PHP/webman/support/bootstrap/Date.php +++ b/frameworks/PHP/webman/support/bootstrap/Date.php @@ -30,9 +30,9 @@ class Date implements Bootstrap { */ public static function start($worker) { - self::$date = gmdate('D, d M Y H:i:s').' GMT'; + self::$date = gmdate(DATE_RFC7231); Timer::add(1, function() { - self::$date = gmdate('D, d M Y H:i:s').' GMT'; + self::$date = gmdate(DATE_RFC7231); }); } diff --git a/frameworks/PHP/workerman/Date.php b/frameworks/PHP/workerman/Date.php index d09638da713..d3df8c47523 100644 --- a/frameworks/PHP/workerman/Date.php +++ b/frameworks/PHP/workerman/Date.php @@ -4,12 +4,12 @@ class Date { - public $date = null; + public $date; public function __construct() { - $this->date = gmdate('D, d M Y H:i:s').' GMT'; + $this->date = gmdate(DATE_RFC7231); Timer::add(1, function() { - $this->date = gmdate('D, d M Y H:i:s').' GMT'; + $this->date = gmdate(DATE_RFC7231); }); } } \ No newline at end of file diff --git a/frameworks/PHP/yii2/server.php b/frameworks/PHP/yii2/server.php index 6cef4a7e10e..a4efcec4ed9 100644 --- a/frameworks/PHP/yii2/server.php +++ b/frameworks/PHP/yii2/server.php @@ -33,9 +33,9 @@ class WorkerTimer public static function init() { - self::$date = 'Date: '.gmdate('D, d M Y H:i:s').' GMT'; + self::$date = 'Date: ' . gmdate(DATE_RFC7231); Timer::add(1, function() { - WorkerTimer::$date = 'Date: '.gmdate('D, d M Y H:i:s').' GMT'; + WorkerTimer::$date = 'Date: ' . gmdate(DATE_RFC7231); }); } } From 889cb526ee36b6cc2f1a707228ec437bddfe5bf8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 25 Mar 2025 17:18:51 +0100 Subject: [PATCH 1315/1766] [ruby/sinatra] Remove Agoo (#9732) Agoo is a less commonly used server and can be somewhat unstable. Iodine has better results. --- frameworks/Ruby/sinatra/Gemfile | 5 ----- frameworks/Ruby/sinatra/Gemfile.lock | 5 ----- frameworks/Ruby/sinatra/benchmark_config.json | 22 ------------------- .../sinatra-postgres-agoo-mri.dockerfile | 20 ----------------- 4 files changed, 52 deletions(-) delete mode 100644 frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 180ba944492..5aa6b339e27 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -23,8 +23,3 @@ end group :unicorn, optional: true do gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false end - -group :agoo, optional: true do - gem 'agoo', require: false - gem 'rackup' -end diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index bd47b9778a6..083a4557c9f 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -20,7 +20,6 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - agoo (2.15.13) base64 (0.2.0) benchmark (0.4.0) bigdecimal (3.1.9) @@ -49,8 +48,6 @@ GEM rack-session (2.1.0) base64 (>= 0.1.0) rack (>= 3.0.0) - rackup (2.2.1) - rack (>= 3) raindrops (0.20.1) ruby2_keywords (0.0.5) securerandom (0.4.1) @@ -77,13 +74,11 @@ PLATFORMS DEPENDENCIES activerecord (~> 8.0) - agoo iodine (~> 0.7) json (~> 2.8) mysql2 (~> 0.5) pg (~> 1.5) puma (~> 6.4) - rackup sinatra (~> 4.0) unicorn (~> 6.1) diff --git a/frameworks/Ruby/sinatra/benchmark_config.json b/frameworks/Ruby/sinatra/benchmark_config.json index 58481db7cd5..7b4aea2fdeb 100644 --- a/frameworks/Ruby/sinatra/benchmark_config.json +++ b/frameworks/Ruby/sinatra/benchmark_config.json @@ -44,28 +44,6 @@ "versus": "rack-postgres-puma-mri", "notes": "" }, - "postgres-agoo-mri": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Agoo", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-postgres-agoo-mri", - "versus": "rack-postgres-agoo-mri", - "notes": "" - }, "postgres-iodine-mri": { "json_url": "/json", "db_url": "/db", diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile deleted file mode 100644 index a612c06fc73..00000000000 --- a/frameworks/Ruby/sinatra/sinatra-postgres-agoo-mri.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM ruby:3.4 - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra -WORKDIR /sinatra - -ENV BUNDLE_WITH=postgresql:agoo -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile - -ENV DBTYPE=postgresql - -EXPOSE 8080 - -CMD RACK_ENV=production bundle exec rackup -r agoo -s agoo -p 8080 -q -O workers=$(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From 1bf0a220fc3adc3c107743af87df61dca7c1fee7 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 25 Mar 2025 17:19:20 +0100 Subject: [PATCH 1316/1766] [ruby/rack] Add Pitchfork server (#9733) Pitchfork is a preforking HTTP server based on Unicorn (which hasn't seen an update since 2021). --- frameworks/Ruby/rack/Gemfile | 4 ++++ frameworks/Ruby/rack/Gemfile.lock | 5 +++++ frameworks/Ruby/rack/README.md | 1 + frameworks/Ruby/rack/benchmark_config.json | 21 ++++++++++++++++++ frameworks/Ruby/rack/config/auto_tune.rb | 0 frameworks/Ruby/rack/config/pitchfork.rb | 11 ++++++++++ frameworks/Ruby/rack/falcon.rb | 0 .../Ruby/rack/rack-pitchfork.dockerfile | 22 +++++++++++++++++++ 8 files changed, 64 insertions(+) mode change 100755 => 100644 frameworks/Ruby/rack/config/auto_tune.rb create mode 100644 frameworks/Ruby/rack/config/pitchfork.rb mode change 100755 => 100644 frameworks/Ruby/rack/falcon.rb create mode 100644 frameworks/Ruby/rack/rack-pitchfork.dockerfile diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index fa5548c1098..afdd8ddf133 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -22,6 +22,10 @@ group :iodine, optional: true do gem 'iodine', '~> 0.7', platforms: %i[ruby mswin] end +group :pitchfork, optional: true do + gem 'pitchfork', '~> 0.17' +end + group :puma, optional: true do gem 'puma', '~> 6.5' end diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 26be8052593..37eb57163ae 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -65,6 +65,7 @@ GEM language_server-protocol (3.17.0.4) lint_roller (1.1.0) localhost (1.3.1) + logger (1.6.6) mapping (1.1.1) memory-leak (0.5.2) metrics (0.12.2) @@ -75,6 +76,9 @@ GEM ast (~> 2.4.1) racc pg (1.5.9) + pitchfork (0.17.0) + logger + rack (>= 2.0) protocol-hpack (1.5.1) protocol-http (0.49.0) protocol-http1 (0.30.0) @@ -139,6 +143,7 @@ DEPENDENCIES jdbc-postgres (~> 42.2) json (~> 2.10) pg (~> 1.5) + pitchfork (~> 0.17) puma (~> 6.5) rack (~> 3.0) rack-test diff --git a/frameworks/Ruby/rack/README.md b/frameworks/Ruby/rack/README.md index 478315eb1d0..92c954d5228 100644 --- a/frameworks/Ruby/rack/README.md +++ b/frameworks/Ruby/rack/README.md @@ -18,6 +18,7 @@ The tests were run with: * [Puma 6.4](http://puma.io/) * [Iodine](https://github.com/boazsegev/iodine) * [Falcon](https://github.com/socketry/falcon) +* [Pitchfork](https://github.com/Shopify/pitchfork) * [Sequel 5](https://sequel.jeremyevans.net/) diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index 26e1087e4ac..e232b0fc4ce 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -106,6 +106,27 @@ "database_os": "Linux", "display_name": "rack-puma-jruby-sequel-raw", "notes": "" + }, + "pitchfork": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "orm": "raw", + "database": "Postgres", + "framework": "rack", + "language": "Ruby", + "platform": "Mri", + "webserver": "Pitchfork", + "os": "Linux", + "database_os": "Linux", + "display_name": "rack-pitchfork-mri-sequel-raw", + "notes": "" } } ] diff --git a/frameworks/Ruby/rack/config/auto_tune.rb b/frameworks/Ruby/rack/config/auto_tune.rb old mode 100755 new mode 100644 diff --git a/frameworks/Ruby/rack/config/pitchfork.rb b/frameworks/Ruby/rack/config/pitchfork.rb new file mode 100644 index 00000000000..218c8c96759 --- /dev/null +++ b/frameworks/Ruby/rack/config/pitchfork.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require_relative 'auto_tune' +require 'sequel' +num_workers, = auto_tune + +worker_processes num_workers + +before_fork do |_server| + Sequel::DATABASES.each(&:disconnect) +end diff --git a/frameworks/Ruby/rack/falcon.rb b/frameworks/Ruby/rack/falcon.rb old mode 100755 new mode 100644 diff --git a/frameworks/Ruby/rack/rack-pitchfork.dockerfile b/frameworks/Ruby/rack/rack-pitchfork.dockerfile new file mode 100644 index 00000000000..586d693eebb --- /dev/null +++ b/frameworks/Ruby/rack/rack-pitchfork.dockerfile @@ -0,0 +1,22 @@ +FROM ruby:3.4 + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +WORKDIR /rack + +COPY Gemfile ./ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'pitchfork' +RUN bundle install --jobs=8 + +COPY . . + +EXPOSE 8080 + +CMD bundle exec pitchfork -c config/pitchfork.rb -o 0.0.0.0 -p 8080 -E production From b58174e5ceec0ced620e1bea9da0374aee10a75a Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 25 Mar 2025 17:19:38 +0100 Subject: [PATCH 1317/1766] [php] Flight update date (#9734) --- frameworks/PHP/flight/server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/PHP/flight/server.php b/frameworks/PHP/flight/server.php index e7bad5ffcf9..dd5ce42c6dd 100644 --- a/frameworks/PHP/flight/server.php +++ b/frameworks/PHP/flight/server.php @@ -36,9 +36,9 @@ class HeaderDate public static function init(): void { - self::$date = self::NAME.gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME . gmdate(DATE_RFC7231); Timer::add(1, static function () { - self::$date = self::NAME.gmdate('D, d M Y H:i:s').' GMT'; + self::$date = self::NAME . gmdate(DATE_RFC7231); }); } } From b4a59b0f3a6affd181902190105870d4d25814fc Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 25 Mar 2025 17:20:21 +0100 Subject: [PATCH 1318/1766] [php] Update CakePHP Workerman to PHP/8.4 (#9735) --- frameworks/PHP/cakephp/cakephp-workerman.dockerfile | 12 ++++++------ frameworks/PHP/cakephp/deploy/conf/cli-php.ini | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/PHP/cakephp/cakephp-workerman.dockerfile b/frameworks/PHP/cakephp/cakephp-workerman.dockerfile index 7d275912de0..ce77247eb6c 100644 --- a/frameworks/PHP/cakephp/cakephp-workerman.dockerfile +++ b/frameworks/PHP/cakephp/cakephp-workerman.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,24 +7,24 @@ 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.3-cli php8.3-mysql php8.3-mbstring php8.3-intl php8.3-xml php8.3-curl > /dev/null + php8.4-cli php8.4-mysql php8.4-mbstring php8.4-intl php8.4-xml php8.4-curl > /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 > /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 apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini EXPOSE 8080 ADD ./ /cakephp WORKDIR /cakephp -RUN composer require joanhey/adapterman:^0.6 +RUN composer require joanhey/adapterman:^0.7 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN chmod -R 777 /cakephp -#COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini +#COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini CMD php -c deploy/conf/cli-php.ini \ server.php start diff --git a/frameworks/PHP/cakephp/deploy/conf/cli-php.ini b/frameworks/PHP/cakephp/deploy/conf/cli-php.ini index bcccffbc63b..e03b6e352a9 100644 --- a/frameworks/PHP/cakephp/deploy/conf/cli-php.ini +++ b/frameworks/PHP/cakephp/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,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 +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit From b39062996b3db760f69fca5f06726f7efc5983b6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 25 Mar 2025 17:20:47 +0100 Subject: [PATCH 1319/1766] [rails] Replace Agoo server with Pitchfork (#9736) Agoo is a less commonly used server and can be somewhat unstable. Pitchfork is a maintained alternative for Unicorn (which hasn't seen updates since 2021). --- frameworks/Ruby/rails/Gemfile | 9 ++++----- frameworks/Ruby/rails/Gemfile.lock | 7 ++++--- frameworks/Ruby/rails/README.md | 1 + frameworks/Ruby/rails/benchmark_config.json | 8 ++++---- frameworks/Ruby/rails/config/pitchfork.rb | 7 +++++++ ...{rails-agoo.dockerfile => rails-pitchfork.dockerfile} | 4 ++-- 6 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 frameworks/Ruby/rails/config/pitchfork.rb rename frameworks/Ruby/rails/{rails-agoo.dockerfile => rails-pitchfork.dockerfile} (76%) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 4adfe82d29e..1a9e362342c 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -12,11 +12,6 @@ group :postgresql, optional: true do gem 'pg', '~> 1.5' end -group :agoo, optional: true do - gem 'agoo', require: false - gem 'rackup' -end - group :iodine, optional: true do gem 'iodine', '~> 0.7', require: false end @@ -28,3 +23,7 @@ end group :puma, optional: true do gem 'puma', '~> 6.5', require: false end + +group :pitchfork, optional: true do + gem 'pitchfork', '~> 0.17' +end diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index bc2ebf4a76b..170c3127452 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -72,7 +72,6 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - agoo (2.15.13) async (2.23.0) console (~> 1.29) fiber-annotation @@ -184,6 +183,9 @@ GEM racc (~> 1.4) openssl (3.3.0) pg (1.5.9) + pitchfork (0.17.0) + logger + rack (>= 2.0) pp (0.6.2) prettyprint prettyprint (0.2.0) @@ -276,12 +278,11 @@ PLATFORMS x86_64-linux DEPENDENCIES - agoo falcon (~> 0.47) iodine (~> 0.7) pg (~> 1.5) + pitchfork (~> 0.17) puma (~> 6.5) - rackup rails (~> 8.0.0) redis (~> 5.0) trilogy (~> 2.8.1) diff --git a/frameworks/Ruby/rails/README.md b/frameworks/Ruby/rails/README.md index 674c60b402f..fff40abd584 100644 --- a/frameworks/Ruby/rails/README.md +++ b/frameworks/Ruby/rails/README.md @@ -17,6 +17,7 @@ The tests were run with: - [Puma 6.4](http://puma.io/) - [Iodine](https://github.com/boazsegev/iodine) - [Falcon](https://github.com/socketry/falcon) +- [Pitchfork](https://github.com/Shopify/pitchfork) - [MySQL](https://dev.mysql.com/) - [PostgreSQL](https://www.postgresql.org/) - [Redis 6](https://redis.io) diff --git a/frameworks/Ruby/rails/benchmark_config.json b/frameworks/Ruby/rails/benchmark_config.json index 3571ea8ca5c..232a4321e56 100644 --- a/frameworks/Ruby/rails/benchmark_config.json +++ b/frameworks/Ruby/rails/benchmark_config.json @@ -91,7 +91,7 @@ "notes": "", "versus": "rack-iodine-mri-sequel-raw" }, - "agoo": { + "pitchfork": { "db_url": "/db", "json_url": "/json", "query_url": "/queries?queries=", @@ -107,12 +107,12 @@ "language": "Ruby", "orm": "Full", "platform": "Rack", - "webserver": "Agoo", + "webserver": "Pitchfork", "os": "Linux", "database_os": "Linux", - "display_name": "rails-agoo", + "display_name": "rails-pitchfork", "notes": "", - "versus": "" + "versus": "rack-pitchfork-mri-sequel-raw" } }] } diff --git a/frameworks/Ruby/rails/config/pitchfork.rb b/frameworks/Ruby/rails/config/pitchfork.rb new file mode 100644 index 00000000000..676ebdf956d --- /dev/null +++ b/frameworks/Ruby/rails/config/pitchfork.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require_relative 'auto_tune' + +num_workers, = auto_tune + +worker_processes num_workers diff --git a/frameworks/Ruby/rails/rails-agoo.dockerfile b/frameworks/Ruby/rails/rails-pitchfork.dockerfile similarity index 76% rename from frameworks/Ruby/rails/rails-agoo.dockerfile rename to frameworks/Ruby/rails/rails-pitchfork.dockerfile index 01254ad42b3..b57d81b28c1 100644 --- a/frameworks/Ruby/rails/rails-agoo.dockerfile +++ b/frameworks/Ruby/rails/rails-pitchfork.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true -ENV BUNDLE_WITH=postgresql:agoo +ENV BUNDLE_WITH=postgresql:pitchfork RUN bundle install --jobs=8 COPY . /rails/ @@ -24,4 +24,4 @@ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 CMD service redis-server start && \ - RACK_ENV=production bundle exec rackup -r agoo -s agoo -p 8080 -q -O workers=$(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) + RACK_ENV=production bundle exec pitchfork -c config/pitchfork.rb From 90aa3ba54587dda567e091a8bfc47106ffa0f3f6 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 25 Mar 2025 17:21:07 +0100 Subject: [PATCH 1320/1766] Php-Unit update to PHP/8.4 (#9737) --- frameworks/PHP/php/php-unit.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/php/php-unit.dockerfile b/frameworks/PHP/php/php-unit.dockerfile index 1fa2d5bbe9d..04a0539eca1 100644 --- a/frameworks/PHP/php/php-unit.dockerfile +++ b/frameworks/PHP/php/php-unit.dockerfile @@ -1,4 +1,4 @@ -FROM unit:php8.3 +FROM unit:php8.4 RUN docker-php-ext-install pdo_mysql opcache > /dev/null From 9be8abfdf3d756ae68ce0b8322a631a7dde3dc5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Wed, 26 Mar 2025 00:21:37 +0800 Subject: [PATCH 1321/1766] Upgrade hyperlane (#9738) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 --- frameworks/Rust/hyperlane/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index ff050f6e959..b05e344c62a 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.56.1" +hyperlane = "4.56.4" rand = "0.9.0" serde = "1.0.219" sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } From 2fd2be7587307e6ff7beccbdf37fb7cf7858fc14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sakib=20Had=C5=BEiavdi=C4=87?= Date: Tue, 25 Mar 2025 17:22:05 +0100 Subject: [PATCH 1322/1766] Optimize sharaf framework SQL (#9739) * Update sharaf dependency on squery that contains a perf fix. Disable sharaf logging and optimize hikaricp * Revert sharaf.dockerfile jar change --- frameworks/Scala/sharaf/build.mill | 7 ++++--- frameworks/Scala/sharaf/sharaf.dockerfile | 2 +- frameworks/Scala/sharaf/src/db.scala | 2 +- frameworks/Scala/sharaf/src/main.scala | 4 +++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frameworks/Scala/sharaf/build.mill b/frameworks/Scala/sharaf/build.mill index be7a09e418d..c1723ad5f09 100644 --- a/frameworks/Scala/sharaf/build.mill +++ b/frameworks/Scala/sharaf/build.mill @@ -7,8 +7,9 @@ object `package` extends RootModule with ScalaModule { def scalaVersion = "3.6.2" def ivyDeps = Agg( ivy"ba.sake::sharaf:0.8.1", - ivy"ba.sake::squery:0.6.4", + ivy"ba.sake::squery:0.7.0", ivy"org.postgresql:postgresql:42.6.0", - ivy"com.zaxxer:HikariCP:5.0.1" + ivy"com.zaxxer:HikariCP:5.0.1", + ivy"org.slf4j:slf4j-nop:2.0.17" // disable logging ) -} \ No newline at end of file +} diff --git a/frameworks/Scala/sharaf/sharaf.dockerfile b/frameworks/Scala/sharaf/sharaf.dockerfile index d15c119240b..e2743d08638 100644 --- a/frameworks/Scala/sharaf/sharaf.dockerfile +++ b/frameworks/Scala/sharaf/sharaf.dockerfile @@ -11,4 +11,4 @@ RUN ./mill assembly EXPOSE 8080 -CMD ["java", "-server", "-Xms1g", "-Xmx1g", "-jar", "out/assembly.dest/out.jar"] +CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-jar", "out/assembly.dest/out.jar"] diff --git a/frameworks/Scala/sharaf/src/db.scala b/frameworks/Scala/sharaf/src/db.scala index 960715e9c12..795d4b02405 100644 --- a/frameworks/Scala/sharaf/src/db.scala +++ b/frameworks/Scala/sharaf/src/db.scala @@ -10,7 +10,7 @@ class DAO { ds.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world") ds.setUsername("benchmarkdbuser") ds.setPassword("benchmarkdbpass") - ds.setMaximumPoolSize(48) + ds.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() * 2 + 1) private val squeryContext = SqueryContext(ds) def getRandomWorld(): WorldRow = squeryContext.run { diff --git a/frameworks/Scala/sharaf/src/main.scala b/frameworks/Scala/sharaf/src/main.scala index a562900fd04..13207509600 100644 --- a/frameworks/Scala/sharaf/src/main.scala +++ b/frameworks/Scala/sharaf/src/main.scala @@ -7,6 +7,8 @@ import ba.sake.sharaf.* @main def run(): Unit = { val dao = DAO() val benchmarkRoutes = BenchmarkRoutes(dao) + // set to slf4j, thus disabling logging (slf4j-nop) + System.setProperty("org.jboss.logging.provider", "slf4j") val server = Undertow .builder() .addHttpListener(8080, "0.0.0.0") @@ -18,5 +20,5 @@ import ba.sake.sharaf.* .setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false) .build() server.start() - println(s"Started HTTP server at localhost:8080") + //println(s"Started HTTP server at localhost:8080") } From 2b00b285811ed89213e9fd3d4f84dc254a02b338 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 09:27:05 -0700 Subject: [PATCH 1323/1766] Bump gunicorn from 19.9.0 to 23.0.0 in /frameworks/Python/bottle (#9741) Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 19.9.0 to 23.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/19.9.0...23.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/bottle/requirements-pypy.txt | 2 +- frameworks/Python/bottle/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Python/bottle/requirements-pypy.txt b/frameworks/Python/bottle/requirements-pypy.txt index 7cfbf108e30..2924995bee7 100644 --- a/frameworks/Python/bottle/requirements-pypy.txt +++ b/frameworks/Python/bottle/requirements-pypy.txt @@ -1,6 +1,6 @@ bottle==0.12.19 bottle-sqlalchemy==0.4.3 -gunicorn==19.9.0 +gunicorn==23.0.0 PyMySQL==0.8.0 SQLAlchemy==1.3.0 tornado==6.4.2 diff --git a/frameworks/Python/bottle/requirements.txt b/frameworks/Python/bottle/requirements.txt index 7f6135dbd5b..b5dd9bbd4c5 100644 --- a/frameworks/Python/bottle/requirements.txt +++ b/frameworks/Python/bottle/requirements.txt @@ -1,7 +1,7 @@ bottle==0.12.25 bottle-sqlalchemy==0.4.3 greenlet==0.4.17 -gunicorn==19.9.0 +gunicorn==23.0.0 meinheld==1.0.2 mysqlclient==1.3.12 SQLAlchemy==1.3.0 From adc4593415d791dc6467042b9b95057e9cc4305a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Thu, 27 Mar 2025 01:22:21 +0800 Subject: [PATCH 1324/1766] Upgeade hyperlane (#9742) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 --- frameworks/Rust/hyperlane/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index b05e344c62a..7a4b0327fea 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.56.4" +hyperlane = "4.56.5" rand = "0.9.0" serde = "1.0.219" sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } From e1bd111e6014ccb45a0915e1349e60aa5f944061 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 27 Mar 2025 20:30:15 +0100 Subject: [PATCH 1325/1766] [ruby/padrino] Disable logging (#9743) +-----------------------+-----+-----+-----+------+-------+---------+--------------+ | branch_name| json| db|query|update|fortune|plaintext|weighted_score| +-----------------------+-----+-----+-----+------+-------+---------+--------------+ | master|48825|23743|11754| 7389| 18988| 74963| 940| |padrino/disable-logging|51384|25087|12025| 8087| 18908| 79184| 999| +-----------------------+-----+-----+-----+------+-------+---------+--------------+ --- frameworks/Ruby/padrino/app/app.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/padrino/app/app.rb b/frameworks/Ruby/padrino/app/app.rb index 8641baa8c39..fca3a95a649 100644 --- a/frameworks/Ruby/padrino/app/app.rb +++ b/frameworks/Ruby/padrino/app/app.rb @@ -32,13 +32,13 @@ class App < Padrino::Application # set :raise_errors, true # Raise exceptions (will stop application) (default for test) # set :dump_errors, true # Exception backtraces are written to STDERR (default for production/development) # set :show_exceptions, true # Shows a stack trace in browser (default for development) - # set :logging, true # Logging in STDOUT for development and file for production (default only for development) + set :logging, false # Logging in STDOUT for development and file for production (default only for development) # set :public_folder, 'foo/bar' # Location for static assets (default root/public) # set :reload, false # Reload application files (default in development) # set :default_builder, 'foo' # Set a custom form builder (default 'StandardFormBuilder') # set :locale_path, 'bar' # Set path for I18n translations (default your_apps_root_path/locale) - disable :sessions # Disabled sessions by default (enable if needed) - disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined) + disable :sessions # Disabled sessions by default (enable if needed) + disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined) # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application) # From eef95df2f7c38b7e5f849557793e640bfa87fe41 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 27 Mar 2025 20:30:28 +0100 Subject: [PATCH 1326/1766] [ruby/grape] Disable logging (#9744) +---------------------+-----+-----+-----+------+---------+--------------+ | branch_name| json| db|query|update|plaintext|weighted_score| +---------------------+-----+-----+-----+------+---------+--------------+ | master|51735|23291|14725| 9348| 22430| 1055| |grape/disable-logging|52475|26622|14651| 10162| 22814| 1115| +---------------------+-----+-----+-----+------+---------+--------------+ --- frameworks/Ruby/grape/config.ru | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/Ruby/grape/config.ru b/frameworks/Ruby/grape/config.ru index 334605c20c4..65396539b64 100644 --- a/frameworks/Ruby/grape/config.ru +++ b/frameworks/Ruby/grape/config.ru @@ -35,6 +35,7 @@ module Acme end class DatabaseQueries < Grape::API + logger nil helpers do def bounded_queries queries = params[:queries].to_i @@ -80,6 +81,7 @@ module Acme header 'Date', Time.now.httpdate if defined?(Puma) header 'Server', 'WebServer' end + logger nil content_type :json, 'application/json' format :json From ab110c2c141a4ec01e548aa7cd394f15ddcdb00c Mon Sep 17 00:00:00 2001 From: Kayden <143221653+Kayden1412@users.noreply.github.com> Date: Fri, 28 Mar 2025 02:30:50 +0700 Subject: [PATCH 1327/1766] [Zig] Update ZZZ (#9745) * chore(main): update date header * chore(README.md): fix typo --- frameworks/Zig/zzz/README.md | 2 +- frameworks/Zig/zzz/src/main.zig | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frameworks/Zig/zzz/README.md b/frameworks/Zig/zzz/README.md index b92aa3c9504..cf8c5c06ce2 100644 --- a/frameworks/Zig/zzz/README.md +++ b/frameworks/Zig/zzz/README.md @@ -1,5 +1,5 @@ -# [ZZZ](https://github.com/tardy-org/zzz) - Web Franework. +# [ZZZ](https://github.com/tardy-org/zzz) - Web Framework. ## Description diff --git a/frameworks/Zig/zzz/src/main.zig b/frameworks/Zig/zzz/src/main.zig index 3f4c1014cc8..a3d51bf4225 100644 --- a/frameworks/Zig/zzz/src/main.zig +++ b/frameworks/Zig/zzz/src/main.zig @@ -76,19 +76,23 @@ pub fn main() !void { } pub fn home_handler(ctx: *const Context, _: void) !Respond { - try ctx.response.headers.put("Date", try ctx.allocator.dupe(u8, date[0..])); return ctx.response.apply(.{ .mime = http.Mime.TEXT, .body = "Hello, World!", .status = .OK, + .headers = &.{ + .{"Date", try ctx.allocator.dupe(u8, date[0..])}, + }, }); } pub fn json_handler(ctx: *const Context, _: void) !Respond { - try ctx.response.headers.put("Date", try ctx.allocator.dupe(u8, date[0..])); return ctx.response.apply(.{ .mime = http.Mime.JSON, .body = try std.json.stringifyAlloc(ctx.allocator, Message{ .message = "Hello, World!" }, .{}), .status = .OK, + .headers = &.{ + .{"Date", try ctx.allocator.dupe(u8, date[0..])}, + }, }); } From a0ebdee082564967b5d929096aac195acc9c06c9 Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Fri, 28 Mar 2025 03:31:24 +0800 Subject: [PATCH 1328/1766] [Update Paozhu] Update built-in variables (#9746) * Paozhu update * Update orm file * [Paozhu] update orm file * update paozhu * update paozhu --- .../paozhu_benchmark/common/cost_define.h | 4 + .../controller/src/techempower.cpp | 11 +- .../orm/include/fortune_mysql.h | 1437 +++++++++-------- .../orm/include/fortunebase.h | 2 +- .../orm/include/world_mysql.h | 1437 +++++++++-------- .../paozhu_benchmark/orm/include/worldbase.h | 2 +- .../view/techempower/fortunes.html | 2 +- .../viewsrc/include/regviewmethod.hpp | 2 +- .../viewsrc/include/viewsrc.h | 2 +- .../viewsrc/view/techempower/fortunes.cpp | 6 +- 10 files changed, 1512 insertions(+), 1393 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h index c4d1a48addf..36a3a013330 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/common/cost_define.h @@ -9,8 +9,12 @@ #define CONST_HTTP_BODY_POST_SIZE 33554432 #define CONST_HTTP_JSON_POST_SIZE 2097152 +#define CONST_HTTP2_SlEEP_MIN_TIME 1100000 + #define CONST_ORM_CLEAR_TIME 7200 #define CONST_ORM_CLEAR_NUMBER 1024 #define CONST_ORM_QUERY_CONNECT_TIMEOUT 30 +#define CONST_ORM_QUERY_LOG_TIME 30 +#define COOKIE_SESSION_NAME "PHPSESSID" #endif \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index f3111732864..14fb3d3c71b 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -6,6 +6,7 @@ #include #include "httppeer.h" #include "techempower.h" +#include "request.h" #include "techempower_json.h" #include "datetime.h" #include "func.h" @@ -43,6 +44,7 @@ asio::awaitable techempowerdb(std::shared_ptr peer) myworld.where("id", rd_num); myworld.limit(1); co_await myworld.async_fetch_one(); + peer->output = myworld.data_tojson(); co_return ""; } @@ -64,6 +66,7 @@ asio::awaitable techempowerqueries(std::shared_ptr peer) } auto myworld = orm::World(); myworld.record.reserve(get_num); + myworld.lock_conn(); for (unsigned int i = 0; i < get_num; i++) { myworld.wheresql.clear(); @@ -71,7 +74,7 @@ asio::awaitable techempowerqueries(std::shared_ptr peer) myworld.where("id", rd_num); co_await myworld.async_fetch_append(); } - + myworld.unlock_conn(); peer->output = myworld.to_json(); co_return ""; } @@ -91,7 +94,7 @@ asio::awaitable techempowerfortunes(std::shared_ptr peer) std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs) { return lhs.message < rhs.message; }); peer->val["list"].set_array(); - OBJ_ARRAY item; + obj_val item; for (unsigned int i = 0; i < myfortune.record.size(); i++) { item["id"] = myfortune.record[i].id; @@ -126,6 +129,7 @@ asio::awaitable techempowerupdates(std::shared_ptr peer) auto myworld = orm::World(); myworld.record.clear(); myworld.record.reserve(get_num); + myworld.lock_conn(); for (unsigned int i = 0; i < get_num; i++) { myworld.wheresql.clear(); @@ -139,6 +143,7 @@ asio::awaitable techempowerupdates(std::shared_ptr peer) co_await myworld.async_update("randomnumber"); } } + myworld.unlock_conn(); peer->output = myworld.to_json(); co_return ""; } @@ -247,4 +252,4 @@ asio::awaitable techempowercached_db(std::shared_ptr peer co_return ""; } -}// namespace http \ No newline at end of file +}// namespace http diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h index 2e403808c05..e0dc89630ee 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h @@ -141,9 +141,9 @@ namespace orm return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -151,14 +151,14 @@ namespace orm else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -173,13 +173,13 @@ namespace orm unsigned int column_num = 0; unsigned int offset = 0; - unsigned int querysql_len = 0; + unsigned int querysql_len = 0; for (; is_sql_item == false;) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -188,10 +188,10 @@ namespace orm for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -252,28 +252,19 @@ namespace orm } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - if (iscache) - { - if (exptime > 0) - { - save_cache(exptime); - exptime = 0; - iscache = false; - } - } return querysql_len; } catch (const std::exception &e) @@ -378,9 +369,9 @@ namespace orm co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -390,12 +381,12 @@ namespace orm select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -403,7 +394,6 @@ namespace orm } //std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -418,7 +408,7 @@ namespace orm { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -426,10 +416,10 @@ namespace orm for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -490,26 +480,17 @@ namespace orm } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - if (iscache) - { - if (exptime > 0) - { - save_cache(exptime); - exptime = 0; - iscache = false; - } - } co_return querysql_len; } catch (const std::exception &e) @@ -655,9 +636,9 @@ namespace orm } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -667,12 +648,12 @@ namespace orm edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -681,7 +662,7 @@ namespace orm unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -690,12 +671,12 @@ namespace orm pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -707,9 +688,8 @@ namespace orm unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -726,7 +706,6 @@ namespace orm } catch (...) { - } return 0; } @@ -807,9 +786,9 @@ namespace orm co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -819,12 +798,12 @@ namespace orm edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -833,7 +812,7 @@ namespace orm unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -841,12 +820,12 @@ namespace orm pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -859,10 +838,10 @@ namespace orm unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -876,7 +855,6 @@ namespace orm } catch (...) { - } co_return 0; } @@ -947,9 +925,9 @@ namespace orm } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -959,13 +937,13 @@ namespace orm edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -974,7 +952,7 @@ namespace orm unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -983,12 +961,12 @@ namespace orm pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -1001,7 +979,7 @@ namespace orm unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -1018,7 +996,6 @@ namespace orm } catch (...) { - } return 0; } @@ -4038,7 +4015,7 @@ M_MODEL& or_leMessage(T val) return *mod; } - M_MODEL &where(const std::string &wq, char bi, http::OBJ_VALUE &obj) + M_MODEL &where(const std::string &wq, char bi, http::obj_val &obj) { if (wheresql.empty()) { @@ -4076,7 +4053,7 @@ M_MODEL& or_leMessage(T val) } return *mod; } - M_MODEL &where(const std::string &wq, http::OBJ_VALUE &obj) + M_MODEL &where(const std::string &wq, http::obj_val &obj) { if (wheresql.empty()) { @@ -5169,9 +5146,9 @@ M_MODEL& or_leMessage(T val) return temprecord; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -5179,21 +5156,21 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return temprecord; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5208,7 +5185,7 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -5217,10 +5194,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return temprecord; } @@ -5296,15 +5273,15 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -5379,18 +5356,18 @@ M_MODEL& or_leMessage(T val) { std::size_t sqlhashid = std::hash{}(sqlstring); - model_meta_cache> &temp_cache = - model_meta_cache>::getinstance(); + model_meta_cache>> &temp_cache = + model_meta_cache>>::getinstance(); temprecord = temp_cache.get(sqlhashid); if (temprecord.size() > 0) { - iscache = false; - model_meta_cache &table_cache = model_meta_cache::getinstance(); - table_fieldname = table_cache.get(sqlhashid); + iscache = false; + model_meta_cache> &table_cache = model_meta_cache>::getinstance(); + table_fieldname = table_cache.get(sqlhashid); model_meta_cache> &tablemap_cache = model_meta_cache>::getinstance(); - table_fieldmap = tablemap_cache.get_obj(sqlhashid); + table_fieldmap = tablemap_cache.get(sqlhashid); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -5400,7 +5377,7 @@ M_MODEL& or_leMessage(T val) { return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + try { if (conn_empty()) @@ -5408,9 +5385,9 @@ M_MODEL& or_leMessage(T val) return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -5418,15 +5395,15 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -5450,7 +5427,7 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -5459,10 +5436,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -5495,7 +5472,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ii = 0; ii < field_array.size(); ii++) { field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); - table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldmap.emplace(field_array[ii].org_name, table_fieldname.size()); table_fieldname.push_back(field_array[ii].org_name); } } @@ -5505,7 +5482,7 @@ M_MODEL& or_leMessage(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - std::vector temp_v_record; + std::vector temp_v_record; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; @@ -5531,15 +5508,15 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -5552,12 +5529,12 @@ M_MODEL& or_leMessage(T val) { std::size_t sqlhashid = std::hash{}(sqlstring); - model_meta_cache> &temp_cache = - model_meta_cache>::getinstance(); + model_meta_cache>> &temp_cache = + model_meta_cache>>::getinstance(); temp_cache.save(sqlhashid, temprecord, exptime); exptime += 1; - model_meta_cache &table_cache = model_meta_cache::getinstance(); + model_meta_cache> &table_cache = model_meta_cache>::getinstance(); table_cache.save(sqlhashid, table_fieldname, exptime); model_meta_cache> &tablemap_cache = @@ -5625,7 +5602,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; return *mod; @@ -5645,9 +5622,9 @@ M_MODEL& or_leMessage(T val) return *mod; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -5655,20 +5632,20 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } - if(select_conn->isdebug) + } + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return *mod; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5685,9 +5662,9 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { - iserror = true; + iserror = true; error_msg = select_conn->error_msg; select_conn.reset(); return *mod; @@ -5695,10 +5672,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return *mod; } @@ -5763,15 +5740,15 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -5843,7 +5820,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; co_return 0; @@ -5863,9 +5840,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -5874,20 +5851,20 @@ M_MODEL& or_leMessage(T val) { select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - - if(n==0) + + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5904,7 +5881,7 @@ M_MODEL& or_leMessage(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -5912,10 +5889,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -5980,17 +5957,17 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } if (iscache) { if (exptime > 0) @@ -6057,7 +6034,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; return *mod; @@ -6068,18 +6045,18 @@ M_MODEL& or_leMessage(T val) { return *mod; } - + try { - + if (conn_empty()) { return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -6087,20 +6064,20 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6117,7 +6094,7 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -6126,10 +6103,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -6194,19 +6171,19 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - + if (iscache) { if (exptime > 0) @@ -6274,7 +6251,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; co_return 1; @@ -6295,9 +6272,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -6307,18 +6284,18 @@ M_MODEL& or_leMessage(T val) select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6337,7 +6314,7 @@ M_MODEL& or_leMessage(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -6345,10 +6322,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -6413,17 +6390,17 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } if (iscache) { if (exptime > 0) @@ -6488,7 +6465,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; return 0; @@ -6509,9 +6486,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -6519,21 +6496,21 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6548,7 +6525,7 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -6557,10 +6534,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -6640,15 +6617,15 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -6657,7 +6634,7 @@ M_MODEL& or_leMessage(T val) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -6718,7 +6695,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; co_return 0; @@ -6740,9 +6717,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -6751,20 +6728,20 @@ M_MODEL& or_leMessage(T val) { select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - - if (n==0) + + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6781,7 +6758,7 @@ M_MODEL& or_leMessage(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -6789,10 +6766,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -6872,22 +6849,22 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } if (iscache) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -6950,79 +6927,174 @@ M_MODEL& or_leMessage(T val) model_meta_cache &temp_cache = model_meta_cache::getinstance(); return temp_cache.check(cache_key_name); } - std::vector get_cache_data(std::size_t cache_key_name) - { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - auto cache_data = temp_cache.get(cache_key_name); - return cache_data; - } - typename B_BASE::meta get_cache_obj(std::size_t cache_key_name) - { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - auto cache_data = temp_cache.get_obj(cache_key_name); - return cache_data; - } - M_MODEL &get_cache(std::size_t cache_key_name) + + bool get_data_cache(std::size_t cache_key_name) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - B_BASE::record = temp_cache.get(cache_key_name); - if (B_BASE::record.size() == 0) + try { - B_BASE::record_reset(); + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::data = temp_cache.get(cache_key_name); + return true; } - else + catch (const std::exception &e) { - B_BASE::data = B_BASE::record[0]; + error_msg = std::string(e.what()); } - return *mod; + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + B_BASE::data_reset(); + return false; } int update_cache(int exp_time = 0) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - std::size_t sqlhashid = std::hash{}(sqlstring); + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); return temp_cache.update(sqlhashid, exp_time); } int update_cache(std::size_t cache_key_name, int exp_time) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); return temp_cache.update(cache_key_name, exp_time); } bool save_cache(int exp_time = 0) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - std::size_t sqlhashid = std::hash{}(sqlstring); + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); temp_cache.save(sqlhashid, B_BASE::record, exp_time); return true; } - bool save_cache(std::size_t cache_key_name, typename B_BASE::meta &cache_data, int exp_time = 0) + bool save_data_cache(int exp_time = 0) { model_meta_cache &temp_cache = model_meta_cache::getinstance(); - temp_cache.save(cache_key_name, cache_data, exp_time); + std::size_t sqlhashid = std::hash{}(sqlstring); + temp_cache.save(sqlhashid, B_BASE::data, exp_time); return true; } - bool save_cache(std::size_t cache_key_name, std::vector &cache_data, int exp_time = 0) + bool save_data_cache(const std::string &cache_key_name, const typename B_BASE::meta &cache_data, int exp_time = 0) { model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, const std::vector &cache_data, int exp_time = 0) + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); temp_cache.save(cache_key_name, cache_data, exp_time); return true; } - bool get_cacherecord(std::size_t cache_key_name) + bool save_cache(const std::string cache_key_name, const std::vector &cache_data, int exp_time = 0) + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + bool save_vector_cache(const std::string cache_key_name, const std::vector &cache_data, int exp_time = 0) + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + bool save_cache(const std::string cache_key_name, const typename B_BASE::meta &cache_data, int exp_time = 0) { model_meta_cache &temp_cache = model_meta_cache::getinstance(); - B_BASE::record = temp_cache.get(cache_key_name); - if (B_BASE::record.size() == 0) + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + B_BASE::meta &get_cache(const std::string &cache_key_name) + { + try { - return false; + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + return temp_cache.get(sqlhashid); } - else + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + throw "Not in cache"; + } + + std::vector &get_vector_cache(const std::string &cache_key_name) + { + try + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + return temp_cache.get(sqlhashid); + } + catch (const std::exception &e) { - B_BASE::data = B_BASE::record[0]; + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + throw "Not in cache"; + } + + bool get_record_cache(std::size_t cache_key_name) + { + try + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); return true; } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + B_BASE::record.clear(); + return false; } - http::OBJ_VALUE fetch_json() + http::obj_val fetch_json() { effect_num = 0; if (selectsql.empty()) @@ -7060,14 +7132,14 @@ M_MODEL& or_leMessage(T val) sqlstring.append(limitsql); } - http::OBJ_VALUE valuetemp; + http::obj_val valuetemp; valuetemp.set_array(); if (iserror) { return valuetemp; } - + try { if (conn_empty()) @@ -7075,9 +7147,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -7085,26 +7157,25 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; std::vector field_array; - unsigned char action_setup = 0; unsigned int column_num = 0; @@ -7115,7 +7186,7 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -7124,10 +7195,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -7164,23 +7235,23 @@ M_MODEL& or_leMessage(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - http::OBJ_VALUE json_temp_v; + http::obj_val json_temp_v; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); - std::string temp_str; + std::string temp_str; temp_str.resize(name_length); std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); - if(field_array[ij].name.size()>0) + if (field_array[ij].name.size() > 0) { //or alias name - json_temp_v[field_array[ij].name]=std::move(temp_str); + json_temp_v[field_array[ij].name] = std::move(temp_str); } - else if(field_array[ij].org_name.size()>0) + else if (field_array[ij].org_name.size() > 0) { - json_temp_v[field_array[ij].org_name]=std::move(temp_str); + json_temp_v[field_array[ij].org_name] = std::move(temp_str); } tempnum = tempnum + name_length; } @@ -7199,18 +7270,17 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - } catch (const std::exception &e) { @@ -7226,7 +7296,7 @@ M_MODEL& or_leMessage(T val) return valuetemp; } - asio::awaitable async_fetch_json() + asio::awaitable async_fetch_json() { effect_num = 0; if (selectsql.empty()) @@ -7264,14 +7334,14 @@ M_MODEL& or_leMessage(T val) sqlstring.append(limitsql); } - http::OBJ_VALUE valuetemp; + http::obj_val valuetemp; valuetemp.set_array(); if (iserror) { co_return valuetemp; } - + try { if (conn_empty()) @@ -7279,9 +7349,9 @@ M_MODEL& or_leMessage(T val) co_return valuetemp; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -7289,25 +7359,24 @@ M_MODEL& or_leMessage(T val) else { select_conn = co_await conn_obj->async_get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return valuetemp; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; std::vector field_array; - unsigned char action_setup = 0; unsigned int column_num = 0; @@ -7318,7 +7387,7 @@ M_MODEL& or_leMessage(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return valuetemp; @@ -7326,10 +7395,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -7366,23 +7435,23 @@ M_MODEL& or_leMessage(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - http::OBJ_VALUE json_temp_v; + http::obj_val json_temp_v; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); - std::string temp_str; + std::string temp_str; temp_str.resize(name_length); std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); - if(field_array[ij].name.size()>0) + if (field_array[ij].name.size() > 0) { //or alias name - json_temp_v[field_array[ij].name]=std::move(temp_str); + json_temp_v[field_array[ij].name] = std::move(temp_str); } - else if(field_array[ij].org_name.size()>0) + else if (field_array[ij].org_name.size() > 0) { - json_temp_v[field_array[ij].org_name]=std::move(temp_str); + json_temp_v[field_array[ij].org_name] = std::move(temp_str); } tempnum = tempnum + name_length; } @@ -7401,18 +7470,17 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - } catch (const std::exception &e) { @@ -7452,7 +7520,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; return 0; @@ -7465,7 +7533,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -7473,9 +7541,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -7483,22 +7551,21 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } - std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -7515,7 +7582,7 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -7524,10 +7591,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -7576,7 +7643,7 @@ M_MODEL& or_leMessage(T val) assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; } - + effect_num++; } } @@ -7591,22 +7658,22 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { - conn_obj->back_select_conn(std::move(select_conn)); + conn_obj->back_select_conn(std::move(select_conn)); } if (iscache) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -7652,7 +7719,7 @@ M_MODEL& or_leMessage(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; co_return 0; @@ -7665,7 +7732,7 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - + try { if (conn_empty()) @@ -7673,9 +7740,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -7685,18 +7752,18 @@ M_MODEL& or_leMessage(T val) select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -7713,7 +7780,7 @@ M_MODEL& or_leMessage(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -7721,10 +7788,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -7773,7 +7840,7 @@ M_MODEL& or_leMessage(T val) assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; } - + effect_num++; } } @@ -7788,22 +7855,22 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { - conn_obj->back_select_conn(std::move(select_conn)); + conn_obj->back_select_conn(std::move(select_conn)); } if (iscache) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -7887,9 +7954,9 @@ M_MODEL& or_leMessage(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -7899,13 +7966,13 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -7914,22 +7981,22 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); return 0; - } + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -7942,7 +8009,7 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -7959,7 +8026,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } return 0; } @@ -8018,7 +8084,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -8026,9 +8092,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8037,13 +8103,13 @@ M_MODEL& or_leMessage(T val) { edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8052,7 +8118,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8062,12 +8128,12 @@ M_MODEL& or_leMessage(T val) temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8080,7 +8146,7 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8097,7 +8163,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } return 0; } @@ -8165,9 +8230,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8177,12 +8242,12 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8191,7 +8256,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8199,18 +8264,18 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); - iserror = true; + iserror = true; } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { @@ -8218,10 +8283,10 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8235,7 +8300,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } co_return 0; } @@ -8302,9 +8366,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8314,12 +8378,12 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8328,7 +8392,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8336,18 +8400,18 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); - iserror = true; + iserror = true; } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { @@ -8355,10 +8419,10 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8372,7 +8436,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } co_return 0; } @@ -8397,7 +8460,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -8406,9 +8469,9 @@ M_MODEL& or_leMessage(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8418,12 +8481,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8432,7 +8495,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8441,12 +8504,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8459,7 +8522,7 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8476,7 +8539,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } return 0; } @@ -8544,9 +8606,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8556,12 +8618,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8570,7 +8632,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8579,12 +8641,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8597,7 +8659,7 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8614,7 +8676,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } return 0; } @@ -8683,9 +8744,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8695,21 +8756,21 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8717,12 +8778,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8735,10 +8796,10 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8752,7 +8813,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } co_return 0; } @@ -8778,7 +8838,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -8786,9 +8846,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8798,12 +8858,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8812,7 +8872,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8821,12 +8881,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8839,7 +8899,7 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8856,7 +8916,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } return 0; } @@ -8890,9 +8949,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8902,21 +8961,21 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8924,12 +8983,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8941,12 +9000,11 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8960,7 +9018,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } co_return 0; } @@ -9024,7 +9081,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -9032,9 +9089,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9044,12 +9101,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9058,7 +9115,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9067,12 +9124,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -9084,9 +9141,8 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9103,7 +9159,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } return 0; } @@ -9174,7 +9229,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -9183,9 +9238,9 @@ M_MODEL& or_leMessage(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9195,12 +9250,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9209,7 +9264,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9218,14 +9273,14 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9236,7 +9291,7 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9253,7 +9308,6 @@ M_MODEL& or_leMessage(T val) } catch (...) { - } return 0; } @@ -9271,7 +9325,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -9280,9 +9334,9 @@ M_MODEL& or_leMessage(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9292,12 +9346,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9306,7 +9360,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9315,12 +9369,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9332,10 +9386,10 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9369,7 +9423,7 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - + try { if (conn_empty()) @@ -9377,9 +9431,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -9389,21 +9443,21 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -9411,12 +9465,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9428,13 +9482,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -9465,7 +9519,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -9473,9 +9527,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9485,12 +9539,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9499,7 +9553,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9508,12 +9562,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9525,10 +9579,10 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9562,7 +9616,7 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - + try { if (conn_empty()) @@ -9570,9 +9624,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -9582,21 +9636,21 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -9604,12 +9658,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9620,13 +9674,13 @@ M_MODEL& or_leMessage(T val) else if ((unsigned char)temp_pack_data.data[0] == 0x00) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -9657,7 +9711,7 @@ M_MODEL& or_leMessage(T val) { return 0; } - + try { if (conn_empty()) @@ -9665,9 +9719,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9677,12 +9731,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9691,7 +9745,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9700,12 +9754,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9716,13 +9770,13 @@ M_MODEL& or_leMessage(T val) else if ((unsigned char)temp_pack_data.data[0] == 0x00) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } return insert_last_id; } catch (const std::exception &e) @@ -9753,7 +9807,7 @@ M_MODEL& or_leMessage(T val) { co_return 0; } - + try { if (conn_empty()) @@ -9761,9 +9815,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -9773,21 +9827,21 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -9795,12 +9849,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9812,13 +9866,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -9835,7 +9889,6 @@ M_MODEL& or_leMessage(T val) co_return 0; } - long long save(bool isrealnew = false) { effect_num = 0; @@ -9888,9 +9941,9 @@ M_MODEL& or_leMessage(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9900,12 +9953,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9914,7 +9967,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9923,14 +9976,14 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9939,10 +9992,9 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9950,15 +10002,15 @@ M_MODEL& or_leMessage(T val) } else { - sqlstring = B_BASE::_makeinsertsql(); + sqlstring = B_BASE::_makeinsertsql(); if (conn_empty()) { return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9968,12 +10020,12 @@ M_MODEL& or_leMessage(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9982,7 +10034,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9991,14 +10043,14 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -10008,10 +10060,10 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -10075,9 +10127,9 @@ M_MODEL& or_leMessage(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -10087,12 +10139,12 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -10101,7 +10153,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -10109,18 +10161,18 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); - } + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); - iserror = true; + iserror = true; } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { @@ -10128,7 +10180,7 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -10151,16 +10203,16 @@ M_MODEL& or_leMessage(T val) } else { - sqlstring = B_BASE::_makeinsertsql(); + sqlstring = B_BASE::_makeinsertsql(); try { if (conn_empty()) { co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -10170,12 +10222,12 @@ M_MODEL& or_leMessage(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -10184,7 +10236,7 @@ M_MODEL& or_leMessage(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -10192,12 +10244,12 @@ M_MODEL& or_leMessage(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -10209,13 +10261,13 @@ M_MODEL& or_leMessage(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -10242,32 +10294,33 @@ M_MODEL& or_leMessage(T val) std::vector table_fieldname; std::map table_fieldmap; - if(rawsql.size()>10) + if (rawsql.size() > 10) { - unsigned int i=0; - for(;iget_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -10292,20 +10345,20 @@ M_MODEL& or_leMessage(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(rawsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -10322,7 +10375,7 @@ M_MODEL& or_leMessage(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -10331,10 +10384,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -10367,7 +10420,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ii = 0; ii < field_array.size(); ii++) { field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); - table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldmap.emplace(field_array[ii].org_name, table_fieldname.size()); table_fieldname.push_back(field_array[ii].org_name); } } @@ -10377,7 +10430,7 @@ M_MODEL& or_leMessage(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - std::vector temp_v_record; + std::vector temp_v_record; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; @@ -10403,14 +10456,14 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(rawsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(rawsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -10438,32 +10491,33 @@ M_MODEL& or_leMessage(T val) std::vector table_fieldname; std::map table_fieldmap; - if(rawsql.size()>10) + if (rawsql.size() > 10) { - unsigned int i=0; - for(;iasync_get_select_conn(); } @@ -10487,20 +10541,20 @@ M_MODEL& or_leMessage(T val) else { select_conn = co_await conn_obj->async_get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(rawsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -10517,7 +10571,7 @@ M_MODEL& or_leMessage(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); @@ -10525,10 +10579,10 @@ M_MODEL& or_leMessage(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -10561,7 +10615,7 @@ M_MODEL& or_leMessage(T val) for (unsigned int ii = 0; ii < field_array.size(); ii++) { field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); - table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldmap.emplace(field_array[ii].org_name, table_fieldname.size()); table_fieldname.push_back(field_array[ii].org_name); } } @@ -10571,7 +10625,7 @@ M_MODEL& or_leMessage(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - std::vector temp_v_record; + std::vector temp_v_record; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; @@ -10597,17 +10651,17 @@ M_MODEL& or_leMessage(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(rawsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(rawsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); } catch (const std::exception &e) @@ -10698,7 +10752,7 @@ M_MODEL& or_leMessage(T val) { if (conn_obj) { - return false; + return false; } error_msg = "conn_obj is null"; iserror = true; @@ -10706,23 +10760,24 @@ M_MODEL& or_leMessage(T val) } void lock_conn() { - islock_conn = true; + islock_conn = true; } void unlock_conn() { - islock_conn = false; + islock_conn = false; if (conn_obj) { - if(select_conn) + if (select_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - if(edit_conn) + if (edit_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } } } + public: std::string selectsql; std::string wheresql; diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h index 0c2957cb67b..4c4f331cfc5 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_FORTUNEBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Thu, 13 Mar 2025 08:50:20 GMT +*本文件为自动生成 Wed, 26 Mar 2025 14:12:09 GMT ***/ #include #include diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h index 6d4f2b60aec..92e82f65391 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h @@ -141,9 +141,9 @@ namespace orm return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -151,14 +151,14 @@ namespace orm else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -173,13 +173,13 @@ namespace orm unsigned int column_num = 0; unsigned int offset = 0; - unsigned int querysql_len = 0; + unsigned int querysql_len = 0; for (; is_sql_item == false;) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -188,10 +188,10 @@ namespace orm for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -252,28 +252,19 @@ namespace orm } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - if (iscache) - { - if (exptime > 0) - { - save_cache(exptime); - exptime = 0; - iscache = false; - } - } return querysql_len; } catch (const std::exception &e) @@ -378,9 +369,9 @@ namespace orm co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -390,12 +381,12 @@ namespace orm select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -403,7 +394,6 @@ namespace orm } //std::size_t n = co_await asio::async_write(*conn->socket, asio::buffer(conn->send_data), asio::use_awaitable); - pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -418,7 +408,7 @@ namespace orm { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -426,10 +416,10 @@ namespace orm for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -490,26 +480,17 @@ namespace orm } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - if (iscache) - { - if (exptime > 0) - { - save_cache(exptime); - exptime = 0; - iscache = false; - } - } co_return querysql_len; } catch (const std::exception &e) @@ -655,9 +636,9 @@ namespace orm } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -667,12 +648,12 @@ namespace orm edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -681,7 +662,7 @@ namespace orm unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -690,12 +671,12 @@ namespace orm pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -707,9 +688,8 @@ namespace orm unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -726,7 +706,6 @@ namespace orm } catch (...) { - } return 0; } @@ -807,9 +786,9 @@ namespace orm co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -819,12 +798,12 @@ namespace orm edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -833,7 +812,7 @@ namespace orm unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -841,12 +820,12 @@ namespace orm pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -859,10 +838,10 @@ namespace orm unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -876,7 +855,6 @@ namespace orm } catch (...) { - } co_return 0; } @@ -947,9 +925,9 @@ namespace orm } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -959,13 +937,13 @@ namespace orm edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(countsql); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -974,7 +952,7 @@ namespace orm unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -983,12 +961,12 @@ namespace orm pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(countsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(countsql, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -1001,7 +979,7 @@ namespace orm unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -1018,7 +996,6 @@ namespace orm } catch (...) { - } return 0; } @@ -3878,7 +3855,7 @@ M_MODEL& or_leRandomnumber(T val) return *mod; } - M_MODEL &where(const std::string &wq, char bi, http::OBJ_VALUE &obj) + M_MODEL &where(const std::string &wq, char bi, http::obj_val &obj) { if (wheresql.empty()) { @@ -3916,7 +3893,7 @@ M_MODEL& or_leRandomnumber(T val) } return *mod; } - M_MODEL &where(const std::string &wq, http::OBJ_VALUE &obj) + M_MODEL &where(const std::string &wq, http::obj_val &obj) { if (wheresql.empty()) { @@ -5009,9 +4986,9 @@ M_MODEL& or_leRandomnumber(T val) return temprecord; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -5019,21 +4996,21 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return temprecord; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5048,7 +5025,7 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -5057,10 +5034,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return temprecord; } @@ -5136,15 +5113,15 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -5219,18 +5196,18 @@ M_MODEL& or_leRandomnumber(T val) { std::size_t sqlhashid = std::hash{}(sqlstring); - model_meta_cache> &temp_cache = - model_meta_cache>::getinstance(); + model_meta_cache>> &temp_cache = + model_meta_cache>>::getinstance(); temprecord = temp_cache.get(sqlhashid); if (temprecord.size() > 0) { - iscache = false; - model_meta_cache &table_cache = model_meta_cache::getinstance(); - table_fieldname = table_cache.get(sqlhashid); + iscache = false; + model_meta_cache> &table_cache = model_meta_cache>::getinstance(); + table_fieldname = table_cache.get(sqlhashid); model_meta_cache> &tablemap_cache = model_meta_cache>::getinstance(); - table_fieldmap = tablemap_cache.get_obj(sqlhashid); + table_fieldmap = tablemap_cache.get(sqlhashid); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -5240,7 +5217,7 @@ M_MODEL& or_leRandomnumber(T val) { return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + try { if (conn_empty()) @@ -5248,9 +5225,9 @@ M_MODEL& or_leRandomnumber(T val) return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -5258,15 +5235,15 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -5290,7 +5267,7 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -5299,10 +5276,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -5335,7 +5312,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ii = 0; ii < field_array.size(); ii++) { field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); - table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldmap.emplace(field_array[ii].org_name, table_fieldname.size()); table_fieldname.push_back(field_array[ii].org_name); } } @@ -5345,7 +5322,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - std::vector temp_v_record; + std::vector temp_v_record; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; @@ -5371,15 +5348,15 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -5392,12 +5369,12 @@ M_MODEL& or_leRandomnumber(T val) { std::size_t sqlhashid = std::hash{}(sqlstring); - model_meta_cache> &temp_cache = - model_meta_cache>::getinstance(); + model_meta_cache>> &temp_cache = + model_meta_cache>>::getinstance(); temp_cache.save(sqlhashid, temprecord, exptime); exptime += 1; - model_meta_cache &table_cache = model_meta_cache::getinstance(); + model_meta_cache> &table_cache = model_meta_cache>::getinstance(); table_cache.save(sqlhashid, table_fieldname, exptime); model_meta_cache> &tablemap_cache = @@ -5465,7 +5442,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; return *mod; @@ -5485,9 +5462,9 @@ M_MODEL& or_leRandomnumber(T val) return *mod; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -5495,20 +5472,20 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } - if(select_conn->isdebug) + } + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return *mod; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5525,9 +5502,9 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { - iserror = true; + iserror = true; error_msg = select_conn->error_msg; select_conn.reset(); return *mod; @@ -5535,10 +5512,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return *mod; } @@ -5603,15 +5580,15 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -5683,7 +5660,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; co_return 0; @@ -5703,9 +5680,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -5714,20 +5691,20 @@ M_MODEL& or_leRandomnumber(T val) { select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - - if(n==0) + + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5744,7 +5721,7 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -5752,10 +5729,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -5820,17 +5797,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } if (iscache) { if (exptime > 0) @@ -5897,7 +5874,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; return *mod; @@ -5908,18 +5885,18 @@ M_MODEL& or_leRandomnumber(T val) { return *mod; } - + try { - + if (conn_empty()) { return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -5927,20 +5904,20 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -5957,7 +5934,7 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -5966,10 +5943,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -6034,19 +6011,19 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - + if (iscache) { if (exptime > 0) @@ -6114,7 +6091,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_record_cache(sqlhashid)) { iscache = false; co_return 1; @@ -6135,9 +6112,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -6147,18 +6124,18 @@ M_MODEL& or_leRandomnumber(T val) select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6177,7 +6154,7 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -6185,10 +6162,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -6253,17 +6230,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } if (iscache) { if (exptime > 0) @@ -6328,7 +6305,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; return 0; @@ -6349,9 +6326,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -6359,21 +6336,21 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6388,7 +6365,7 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -6397,10 +6374,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -6480,15 +6457,15 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -6497,7 +6474,7 @@ M_MODEL& or_leRandomnumber(T val) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -6558,7 +6535,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; co_return 0; @@ -6580,9 +6557,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -6591,20 +6568,20 @@ M_MODEL& or_leRandomnumber(T val) { select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - - if (n==0) + + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -6621,7 +6598,7 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -6629,10 +6606,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -6712,22 +6689,22 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } if (iscache) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -6790,79 +6767,174 @@ M_MODEL& or_leRandomnumber(T val) model_meta_cache &temp_cache = model_meta_cache::getinstance(); return temp_cache.check(cache_key_name); } - std::vector get_cache_data(std::size_t cache_key_name) - { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - auto cache_data = temp_cache.get(cache_key_name); - return cache_data; - } - typename B_BASE::meta get_cache_obj(std::size_t cache_key_name) - { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - auto cache_data = temp_cache.get_obj(cache_key_name); - return cache_data; - } - M_MODEL &get_cache(std::size_t cache_key_name) + + bool get_data_cache(std::size_t cache_key_name) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - B_BASE::record = temp_cache.get(cache_key_name); - if (B_BASE::record.size() == 0) + try { - B_BASE::record_reset(); + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + B_BASE::data = temp_cache.get(cache_key_name); + return true; } - else + catch (const std::exception &e) { - B_BASE::data = B_BASE::record[0]; + error_msg = std::string(e.what()); } - return *mod; + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + B_BASE::data_reset(); + return false; } int update_cache(int exp_time = 0) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - std::size_t sqlhashid = std::hash{}(sqlstring); + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); return temp_cache.update(sqlhashid, exp_time); } int update_cache(std::size_t cache_key_name, int exp_time) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); return temp_cache.update(cache_key_name, exp_time); } bool save_cache(int exp_time = 0) { - model_meta_cache &temp_cache = model_meta_cache::getinstance(); - std::size_t sqlhashid = std::hash{}(sqlstring); + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(sqlstring); temp_cache.save(sqlhashid, B_BASE::record, exp_time); return true; } - bool save_cache(std::size_t cache_key_name, typename B_BASE::meta &cache_data, int exp_time = 0) + bool save_data_cache(int exp_time = 0) { model_meta_cache &temp_cache = model_meta_cache::getinstance(); - temp_cache.save(cache_key_name, cache_data, exp_time); + std::size_t sqlhashid = std::hash{}(sqlstring); + temp_cache.save(sqlhashid, B_BASE::data, exp_time); return true; } - bool save_cache(std::size_t cache_key_name, std::vector &cache_data, int exp_time = 0) + bool save_data_cache(const std::string &cache_key_name, const typename B_BASE::meta &cache_data, int exp_time = 0) { model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + + bool save_cache(std::size_t cache_key_name, const std::vector &cache_data, int exp_time = 0) + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); temp_cache.save(cache_key_name, cache_data, exp_time); return true; } - bool get_cacherecord(std::size_t cache_key_name) + bool save_cache(const std::string cache_key_name, const std::vector &cache_data, int exp_time = 0) + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + bool save_vector_cache(const std::string cache_key_name, const std::vector &cache_data, int exp_time = 0) + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + bool save_cache(const std::string cache_key_name, const typename B_BASE::meta &cache_data, int exp_time = 0) { model_meta_cache &temp_cache = model_meta_cache::getinstance(); - B_BASE::record = temp_cache.get(cache_key_name); - if (B_BASE::record.size() == 0) + std::size_t sqlhashid = std::hash{}(cache_key_name); + temp_cache.save(sqlhashid, cache_data, exp_time); + return true; + } + B_BASE::meta &get_cache(const std::string &cache_key_name) + { + try { - return false; + model_meta_cache &temp_cache = model_meta_cache::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + return temp_cache.get(sqlhashid); } - else + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + throw "Not in cache"; + } + + std::vector &get_vector_cache(const std::string &cache_key_name) + { + try + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + std::size_t sqlhashid = std::hash{}(cache_key_name); + return temp_cache.get(sqlhashid); + } + catch (const std::exception &e) { - B_BASE::data = B_BASE::record[0]; + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + throw "Not in cache"; + } + + bool get_record_cache(std::size_t cache_key_name) + { + try + { + model_meta_cache> &temp_cache = model_meta_cache>::getinstance(); + B_BASE::record = temp_cache.get(cache_key_name); return true; } + catch (const std::exception &e) + { + error_msg = std::string(e.what()); + } + catch (const std::string &e) + { + error_msg = e; + } + catch (const char *e) + { + error_msg = e; + } + catch (...) + { + } + B_BASE::record.clear(); + return false; } - http::OBJ_VALUE fetch_json() + http::obj_val fetch_json() { effect_num = 0; if (selectsql.empty()) @@ -6900,14 +6972,14 @@ M_MODEL& or_leRandomnumber(T val) sqlstring.append(limitsql); } - http::OBJ_VALUE valuetemp; + http::obj_val valuetemp; valuetemp.set_array(); if (iserror) { return valuetemp; } - + try { if (conn_empty()) @@ -6915,9 +6987,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -6925,26 +6997,25 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; std::vector field_array; - unsigned char action_setup = 0; unsigned int column_num = 0; @@ -6955,7 +7026,7 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -6964,10 +7035,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -7004,23 +7075,23 @@ M_MODEL& or_leRandomnumber(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - http::OBJ_VALUE json_temp_v; + http::obj_val json_temp_v; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); - std::string temp_str; + std::string temp_str; temp_str.resize(name_length); std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); - if(field_array[ij].name.size()>0) + if (field_array[ij].name.size() > 0) { //or alias name - json_temp_v[field_array[ij].name]=std::move(temp_str); + json_temp_v[field_array[ij].name] = std::move(temp_str); } - else if(field_array[ij].org_name.size()>0) + else if (field_array[ij].org_name.size() > 0) { - json_temp_v[field_array[ij].org_name]=std::move(temp_str); + json_temp_v[field_array[ij].org_name] = std::move(temp_str); } tempnum = tempnum + name_length; } @@ -7039,18 +7110,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - } catch (const std::exception &e) { @@ -7066,7 +7136,7 @@ M_MODEL& or_leRandomnumber(T val) return valuetemp; } - asio::awaitable async_fetch_json() + asio::awaitable async_fetch_json() { effect_num = 0; if (selectsql.empty()) @@ -7104,14 +7174,14 @@ M_MODEL& or_leRandomnumber(T val) sqlstring.append(limitsql); } - http::OBJ_VALUE valuetemp; + http::obj_val valuetemp; valuetemp.set_array(); if (iserror) { co_return valuetemp; } - + try { if (conn_empty()) @@ -7119,9 +7189,9 @@ M_MODEL& or_leRandomnumber(T val) co_return valuetemp; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -7129,25 +7199,24 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = co_await conn_obj->async_get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return valuetemp; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; std::vector field_array; - unsigned char action_setup = 0; unsigned int column_num = 0; @@ -7158,7 +7227,7 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return valuetemp; @@ -7166,10 +7235,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -7206,23 +7275,23 @@ M_MODEL& or_leRandomnumber(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - http::OBJ_VALUE json_temp_v; + http::obj_val json_temp_v; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; name_length = select_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], tempnum); - std::string temp_str; + std::string temp_str; temp_str.resize(name_length); std::memcpy(temp_str.data(), (unsigned char *)&temp_pack_data.data[tempnum], name_length); - if(field_array[ij].name.size()>0) + if (field_array[ij].name.size() > 0) { //or alias name - json_temp_v[field_array[ij].name]=std::move(temp_str); + json_temp_v[field_array[ij].name] = std::move(temp_str); } - else if(field_array[ij].org_name.size()>0) + else if (field_array[ij].org_name.size() > 0) { - json_temp_v[field_array[ij].org_name]=std::move(temp_str); + json_temp_v[field_array[ij].org_name] = std::move(temp_str); } tempnum = tempnum + name_length; } @@ -7241,18 +7310,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - } catch (const std::exception &e) { @@ -7292,7 +7360,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; return 0; @@ -7305,7 +7373,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -7313,9 +7381,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -7323,22 +7391,21 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } - std::size_t n = select_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -7355,7 +7422,7 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -7364,10 +7431,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return 0; } @@ -7416,7 +7483,7 @@ M_MODEL& or_leRandomnumber(T val) assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; } - + effect_num++; } } @@ -7431,22 +7498,22 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { - conn_obj->back_select_conn(std::move(select_conn)); + conn_obj->back_select_conn(std::move(select_conn)); } if (iscache) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -7492,7 +7559,7 @@ M_MODEL& or_leRandomnumber(T val) if (iscache) { std::size_t sqlhashid = std::hash{}(sqlstring); - if (get_cacherecord(sqlhashid)) + if (get_data_cache(sqlhashid)) { iscache = false; co_return 0; @@ -7505,7 +7572,7 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - + try { if (conn_empty()) @@ -7513,9 +7580,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } //auto conn = co_await conn_obj->async_get_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = co_await conn_obj->async_get_select_conn(); } @@ -7525,18 +7592,18 @@ M_MODEL& or_leRandomnumber(T val) select_conn = co_await conn_obj->async_get_select_conn(); } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return 0; } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -7553,7 +7620,7 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return 0; @@ -7561,10 +7628,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return 0; } @@ -7613,7 +7680,7 @@ M_MODEL& or_leRandomnumber(T val) assign_field_value(field_pos[ij], (unsigned char *)&temp_pack_data.data[tempnum], name_length, B_BASE::data); tempnum = tempnum + name_length; } - + effect_num++; } } @@ -7628,22 +7695,22 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { - conn_obj->back_select_conn(std::move(select_conn)); + conn_obj->back_select_conn(std::move(select_conn)); } if (iscache) { if (exptime > 0) { - save_cache(exptime); + save_data_cache(exptime); exptime = 0; iscache = false; } @@ -7727,9 +7794,9 @@ M_MODEL& or_leRandomnumber(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -7739,13 +7806,13 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -7754,22 +7821,22 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); return 0; - } + } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -7782,7 +7849,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -7799,7 +7866,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } return 0; } @@ -7858,7 +7924,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -7866,9 +7932,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -7877,13 +7943,13 @@ M_MODEL& or_leRandomnumber(T val) { edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -7892,7 +7958,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -7902,12 +7968,12 @@ M_MODEL& or_leRandomnumber(T val) temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -7920,7 +7986,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -7937,7 +8003,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } return 0; } @@ -8005,9 +8070,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8017,12 +8082,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8031,7 +8096,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8039,18 +8104,18 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); - iserror = true; + iserror = true; } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { @@ -8058,10 +8123,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8075,7 +8140,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } co_return 0; } @@ -8142,9 +8206,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8154,12 +8218,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8168,7 +8232,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8176,18 +8240,18 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); - iserror = true; + iserror = true; } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { @@ -8195,10 +8259,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8212,7 +8276,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } co_return 0; } @@ -8237,7 +8300,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -8246,9 +8309,9 @@ M_MODEL& or_leRandomnumber(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8258,12 +8321,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8272,7 +8335,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8281,12 +8344,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8299,7 +8362,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8316,7 +8379,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } return 0; } @@ -8384,9 +8446,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8396,12 +8458,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8410,7 +8472,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8419,12 +8481,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8437,7 +8499,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8454,7 +8516,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } return 0; } @@ -8523,9 +8584,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8535,21 +8596,21 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8557,12 +8618,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8575,10 +8636,10 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8592,7 +8653,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } co_return 0; } @@ -8618,7 +8678,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -8626,9 +8686,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8638,12 +8698,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8652,7 +8712,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8661,12 +8721,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8679,7 +8739,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8696,7 +8756,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } return 0; } @@ -8730,9 +8789,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -8742,21 +8801,21 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -8764,12 +8823,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8781,12 +8840,11 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return effect_num; } catch (const std::exception &e) @@ -8800,7 +8858,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } co_return 0; } @@ -8864,7 +8921,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -8872,9 +8929,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -8884,12 +8941,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8898,7 +8955,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -8907,12 +8964,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } if ((unsigned char)temp_pack_data.data[0] == 0xFF) @@ -8924,9 +8981,8 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -8943,7 +8999,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } return 0; } @@ -9014,7 +9069,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -9023,9 +9078,9 @@ M_MODEL& or_leRandomnumber(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9035,12 +9090,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9049,7 +9104,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9058,14 +9113,14 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9076,7 +9131,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9093,7 +9148,6 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - } return 0; } @@ -9111,7 +9165,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -9120,9 +9174,9 @@ M_MODEL& or_leRandomnumber(T val) } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9132,12 +9186,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9146,7 +9200,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9155,12 +9209,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9172,10 +9226,10 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9209,7 +9263,7 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - + try { if (conn_empty()) @@ -9217,9 +9271,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -9229,21 +9283,21 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -9251,12 +9305,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9268,13 +9322,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -9305,7 +9359,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -9313,9 +9367,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9325,12 +9379,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9339,7 +9393,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9348,12 +9402,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9365,10 +9419,10 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9402,7 +9456,7 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - + try { if (conn_empty()) @@ -9410,9 +9464,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -9422,21 +9476,21 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -9444,12 +9498,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9460,13 +9514,13 @@ M_MODEL& or_leRandomnumber(T val) else if ((unsigned char)temp_pack_data.data[0] == 0x00) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -9497,7 +9551,7 @@ M_MODEL& or_leRandomnumber(T val) { return 0; } - + try { if (conn_empty()) @@ -9505,9 +9559,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9517,12 +9571,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9531,7 +9585,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9540,12 +9594,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9556,13 +9610,13 @@ M_MODEL& or_leRandomnumber(T val) else if ((unsigned char)temp_pack_data.data[0] == 0x00) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } return insert_last_id; } catch (const std::exception &e) @@ -9593,7 +9647,7 @@ M_MODEL& or_leRandomnumber(T val) { co_return 0; } - + try { if (conn_empty()) @@ -9601,9 +9655,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -9613,21 +9667,21 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); co_return 0; } - + unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -9635,12 +9689,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -9652,13 +9706,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -9675,7 +9729,6 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - long long save(bool isrealnew = false) { effect_num = 0; @@ -9728,9 +9781,9 @@ M_MODEL& or_leRandomnumber(T val) return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9740,12 +9793,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9754,7 +9807,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9763,14 +9816,14 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); @@ -9779,10 +9832,9 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9790,15 +9842,15 @@ M_MODEL& or_leRandomnumber(T val) } else { - sqlstring = B_BASE::_makeinsertsql(); + sqlstring = B_BASE::_makeinsertsql(); if (conn_empty()) { return 0; } //auto conn = conn_obj->get_edit_conn(); - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = conn_obj->get_edit_conn(); } @@ -9808,12 +9860,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = conn_obj->get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = edit_conn->write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9822,7 +9874,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = edit_conn->read_loop(); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9831,14 +9883,14 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } - + long long insert_last_id = 0; if ((unsigned char)temp_pack_data.data[0] == 0xFF) { @@ -9848,10 +9900,10 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9915,9 +9967,9 @@ M_MODEL& or_leRandomnumber(T val) co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -9927,12 +9979,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -9941,7 +9993,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -9949,18 +10001,18 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); - } + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); + } if ((unsigned char)temp_pack_data.data[0] == 0xFF) { error_msg = temp_pack_data.data.substr(3); - iserror = true; + iserror = true; } else if ((unsigned char)temp_pack_data.data[0] == 0x00) { @@ -9968,7 +10020,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } @@ -9991,16 +10043,16 @@ M_MODEL& or_leRandomnumber(T val) } else { - sqlstring = B_BASE::_makeinsertsql(); + sqlstring = B_BASE::_makeinsertsql(); try { if (conn_empty()) { co_return 0; } - if(islock_conn) + if (islock_conn) { - if(!edit_conn) + if (!edit_conn) { edit_conn = co_await conn_obj->async_get_edit_conn(); } @@ -10010,12 +10062,12 @@ M_MODEL& or_leRandomnumber(T val) edit_conn = co_await conn_obj->async_get_edit_conn(); } - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->begin_time(); } std::size_t n = co_await edit_conn->async_write_sql(sqlstring); - if(n==0) + if (n == 0) { error_msg = edit_conn->error_msg; edit_conn.reset(); @@ -10024,7 +10076,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int offset = 0; n = co_await edit_conn->async_read_loop(); - if (n==0) + if (n == 0) { edit_conn.reset(); co_return 0; @@ -10032,12 +10084,12 @@ M_MODEL& or_leRandomnumber(T val) pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; edit_conn->read_field_pack(edit_conn->_cache_data, n, offset, temp_pack_data); - if(edit_conn->isdebug) + if (edit_conn->isdebug) { edit_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= edit_conn->count_time(); - conn_mar.push_log(sqlstring,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = edit_conn->count_time(); + conn_mar.push_log(sqlstring, std::to_string(du_time)); } long long insert_last_id = 0; @@ -10049,13 +10101,13 @@ M_MODEL& or_leRandomnumber(T val) { unsigned int d_offset = 1; - effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); - insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); - } + } co_return insert_last_id; } catch (const std::exception &e) @@ -10082,32 +10134,33 @@ M_MODEL& or_leRandomnumber(T val) std::vector table_fieldname; std::map table_fieldmap; - if(rawsql.size()>10) + if (rawsql.size() > 10) { - unsigned int i=0; - for(;iget_select_conn(); - if(islock_conn) + if (islock_conn) { - if(!select_conn) + if (!select_conn) { select_conn = conn_obj->get_select_conn(); } @@ -10132,20 +10185,20 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = conn_obj->get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = select_conn->write_sql(rawsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -10162,7 +10215,7 @@ M_MODEL& or_leRandomnumber(T val) { n = select_conn->read_loop(); offset = 0; - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); @@ -10171,10 +10224,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -10207,7 +10260,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ii = 0; ii < field_array.size(); ii++) { field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); - table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldmap.emplace(field_array[ii].org_name, table_fieldname.size()); table_fieldname.push_back(field_array[ii].org_name); } } @@ -10217,7 +10270,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - std::vector temp_v_record; + std::vector temp_v_record; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; @@ -10243,14 +10296,14 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(rawsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(rawsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); } @@ -10278,32 +10331,33 @@ M_MODEL& or_leRandomnumber(T val) std::vector table_fieldname; std::map table_fieldmap; - if(rawsql.size()>10) + if (rawsql.size() > 10) { - unsigned int i=0; - for(;iasync_get_select_conn(); } @@ -10327,20 +10381,20 @@ M_MODEL& or_leRandomnumber(T val) else { select_conn = co_await conn_obj->async_get_select_conn(); - } + } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->begin_time(); } std::size_t n = co_await select_conn->async_write_sql(rawsql); - if(n==0) + if (n == 0) { error_msg = select_conn->error_msg; select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } - + pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; bool is_sql_item = false; @@ -10357,7 +10411,7 @@ M_MODEL& or_leRandomnumber(T val) { n = co_await select_conn->async_read_loop(); offset = 0; - if (n==0) + if (n == 0) { select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); @@ -10365,10 +10419,10 @@ M_MODEL& or_leRandomnumber(T val) for (; offset < n;) { select_conn->read_field_pack(select_conn->_cache_data, n, offset, temp_pack_data); - if(temp_pack_data.error > 0) + if (temp_pack_data.error > 0) { - iserror = true; - error_msg =temp_pack_data.data; + iserror = true; + error_msg = temp_pack_data.data; select_conn.reset(); co_return std::make_tuple(table_fieldname, table_fieldmap, temprecord); } @@ -10401,7 +10455,7 @@ M_MODEL& or_leRandomnumber(T val) for (unsigned int ii = 0; ii < field_array.size(); ii++) { field_pos.push_back(B_BASE::findcolpos(field_array[ii].org_name)); - table_fieldmap.insert({field_array[ii].org_name,table_fieldname.size()}); + table_fieldmap.emplace(field_array[ii].org_name, table_fieldname.size()); table_fieldname.push_back(field_array[ii].org_name); } } @@ -10411,7 +10465,7 @@ M_MODEL& or_leRandomnumber(T val) unsigned int column_num = field_array.size(); unsigned int tempnum = 0; - std::vector temp_v_record; + std::vector temp_v_record; for (unsigned int ij = 0; ij < column_num; ij++) { unsigned long long name_length = 0; @@ -10437,17 +10491,17 @@ M_MODEL& or_leRandomnumber(T val) } } } - if(select_conn->isdebug) + if (select_conn->isdebug) { select_conn->finish_time(); - auto &conn_mar = get_orm_connect_mar(); - long long du_time= select_conn->count_time(); - conn_mar.push_log(rawsql,std::to_string(du_time)); + auto &conn_mar = get_orm_connect_mar(); + long long du_time = select_conn->count_time(); + conn_mar.push_log(rawsql, std::to_string(du_time)); } - if(!islock_conn) + if (!islock_conn) { conn_obj->back_select_conn(std::move(select_conn)); - } + } co_return std::make_tuple(std::move(table_fieldname), std::move(table_fieldmap), std::move(temprecord)); } catch (const std::exception &e) @@ -10538,7 +10592,7 @@ M_MODEL& or_leRandomnumber(T val) { if (conn_obj) { - return false; + return false; } error_msg = "conn_obj is null"; iserror = true; @@ -10546,23 +10600,24 @@ M_MODEL& or_leRandomnumber(T val) } void lock_conn() { - islock_conn = true; + islock_conn = true; } void unlock_conn() { - islock_conn = false; + islock_conn = false; if (conn_obj) { - if(select_conn) + if (select_conn) { conn_obj->back_select_conn(std::move(select_conn)); } - if(edit_conn) + if (edit_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } } } + public: std::string selectsql; std::string wheresql; diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h index 0fee4b832c8..dd15e43112e 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_WORLDBASEMATA_H /* *This file is auto create from cli -*本文件为自动生成 Thu, 13 Mar 2025 08:50:20 GMT +*本文件为自动生成 Wed, 26 Mar 2025 14:12:09 GMT ***/ #include #include diff --git a/frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html b/frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html index b9079541143..49eba6d9cb6 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html +++ b/frameworks/C++/paozhu/paozhu_benchmark/view/techempower/fortunes.html @@ -1,5 +1,5 @@ Fortunes<%c for(auto &a:obj["list"].as_array()){ -%><%c +%><%c } %>
      idmessage
      <%c echo<<%c echo<
      <%c echo<<%c echo<
      \ No newline at end of file diff --git a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp index 98a52eeada1..de0d64c6dc9 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/regviewmethod.hpp @@ -17,7 +17,7 @@ namespace http { void _initview_method_regto(VIEW_REG &_viewmetholdreg) { - //create time: Mon, 30 Dec 2024 15:45:45 GMT + //create time: Thu, 27 Mar 2025 01:00:54 GMT _viewmetholdreg.emplace("techempower/fortunes",http::view::techempower::fortunes); diff --git a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h index 8991765bf19..cb67a0bc66a 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/include/viewsrc.h @@ -16,7 +16,7 @@ namespace view { namespace techempower{ - std::string fortunes(const struct view_param &vinfo,http::OBJ_VALUE &obj); + std::string fortunes(const struct view_param &vinfo,http::obj_val &obj); } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp index b29f89356b5..caada3e2e47 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/viewsrc/view/techempower/fortunes.cpp @@ -21,7 +21,7 @@ namespace http { namespace view { namespace techempower{ - std::string fortunes([[maybe_unused]] const struct view_param &vinfo,[[maybe_unused]] http::OBJ_VALUE &obj) + std::string fortunes([[maybe_unused]] const struct view_param &vinfo,[[maybe_unused]] http::obj_val &obj) { std::ostringstream echo; @@ -32,9 +32,9 @@ namespace view { for(auto &a:obj["list"].as_array()){ echo<<""; - echo<"; - echo<"; } From e8a1aecfa204f28d7ec02b7731a70463d6425509 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 22:36:51 +0000 Subject: [PATCH 1329/1766] Bump next from 15.2.3 to 15.2.4 in /frameworks/TypeScript/nextjs Bumps [next](https://github.com/vercel/next.js) from 15.2.3 to 15.2.4. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.2.3...v15.2.4) --- updated-dependencies: - dependency-name: next dependency-version: 15.2.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../TypeScript/nextjs/package-lock.json | 80 +++++++++---------- frameworks/TypeScript/nextjs/package.json | 2 +- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/frameworks/TypeScript/nextjs/package-lock.json b/frameworks/TypeScript/nextjs/package-lock.json index 40fc15b10e4..68185dc81d0 100644 --- a/frameworks/TypeScript/nextjs/package-lock.json +++ b/frameworks/TypeScript/nextjs/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "kysely": "^0.27.5", - "next": "^15.2.3", + "next": "^15.2.4", "pg": "^8.13.1", "react": "^19.0.0", "react-dom": "^19.0.0" @@ -394,15 +394,15 @@ } }, "node_modules/@next/env": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.3.tgz", - "integrity": "sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz", + "integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.3.tgz", - "integrity": "sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz", + "integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==", "cpu": [ "arm64" ], @@ -416,9 +416,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.3.tgz", - "integrity": "sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz", + "integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==", "cpu": [ "x64" ], @@ -432,9 +432,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.3.tgz", - "integrity": "sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz", + "integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==", "cpu": [ "arm64" ], @@ -448,9 +448,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.3.tgz", - "integrity": "sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz", + "integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==", "cpu": [ "arm64" ], @@ -464,9 +464,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.3.tgz", - "integrity": "sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz", + "integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==", "cpu": [ "x64" ], @@ -480,9 +480,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.3.tgz", - "integrity": "sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz", + "integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==", "cpu": [ "x64" ], @@ -496,9 +496,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.3.tgz", - "integrity": "sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz", + "integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==", "cpu": [ "arm64" ], @@ -512,9 +512,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.3.tgz", - "integrity": "sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz", + "integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==", "cpu": [ "x64" ], @@ -780,12 +780,12 @@ } }, "node_modules/next": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/next/-/next-15.2.3.tgz", - "integrity": "sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz", + "integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==", "license": "MIT", "dependencies": { - "@next/env": "15.2.3", + "@next/env": "15.2.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", @@ -800,14 +800,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.2.3", - "@next/swc-darwin-x64": "15.2.3", - "@next/swc-linux-arm64-gnu": "15.2.3", - "@next/swc-linux-arm64-musl": "15.2.3", - "@next/swc-linux-x64-gnu": "15.2.3", - "@next/swc-linux-x64-musl": "15.2.3", - "@next/swc-win32-arm64-msvc": "15.2.3", - "@next/swc-win32-x64-msvc": "15.2.3", + "@next/swc-darwin-arm64": "15.2.4", + "@next/swc-darwin-x64": "15.2.4", + "@next/swc-linux-arm64-gnu": "15.2.4", + "@next/swc-linux-arm64-musl": "15.2.4", + "@next/swc-linux-x64-gnu": "15.2.4", + "@next/swc-linux-x64-musl": "15.2.4", + "@next/swc-win32-arm64-msvc": "15.2.4", + "@next/swc-win32-x64-msvc": "15.2.4", "sharp": "^0.33.5" }, "peerDependencies": { diff --git a/frameworks/TypeScript/nextjs/package.json b/frameworks/TypeScript/nextjs/package.json index 4b71a8daca5..d1e98eb62e3 100644 --- a/frameworks/TypeScript/nextjs/package.json +++ b/frameworks/TypeScript/nextjs/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "kysely": "^0.27.5", - "next": "^15.2.3", + "next": "^15.2.4", "pg": "^8.13.1", "react": "^19.0.0", "react-dom": "^19.0.0" From b16b0d8a2584ad8cc0ec432ef9023a6ab9b54976 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Fri, 4 Apr 2025 21:10:27 +0500 Subject: [PATCH 1330/1766] ntex: Use released version (#9747) --- frameworks/Rust/ntex/Cargo.toml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index ba3133f31b8..e4b476f46cd 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -69,6 +69,8 @@ neon-uring = ["ntex/neon-uring"] [dependencies] ntex = "2.12" ntex-compio = "0.2" +ntex-neon = "0.1.13" +ntex-net = "2.5.9" 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"] } @@ -88,12 +90,6 @@ tokio-postgres = { git="https://github.com/fafhrd91/postgres.git", branch="ntex- [target.'cfg(target_os = "linux")'.dependencies] compio-driver = { version = "*", features = ["io-uring"]} -[patch.crates-io] -ntex = { git = "https://github.com/ntex-rs/ntex.git" } -ntex-io = { git = "https://github.com/ntex-rs/ntex.git" } -ntex-net = { git = "https://github.com/ntex-rs/ntex.git" } -ntex-rt = { git = "https://github.com/ntex-rs/ntex.git" } - [profile.release] opt-level = 3 codegen-units = 1 From e04fbbbdf959645b2e98d50cec8355d442d6bfee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Sat, 5 Apr 2025 00:10:49 +0800 Subject: [PATCH 1331/1766] Upgrade hyperlane (#9748) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime --- frameworks/Rust/hyperlane/Cargo.toml | 9 +- frameworks/Rust/hyperlane/src/db.rs | 82 +++++++++---------- frameworks/Rust/hyperlane/src/lazy.rs | 4 +- frameworks/Rust/hyperlane/src/main.rs | 13 ++- .../Rust/hyperlane/src/request_middleware.rs | 4 +- .../Rust/hyperlane/src/response_middleware.rs | 4 +- frameworks/Rust/hyperlane/src/route.rs | 51 +++++------- frameworks/Rust/hyperlane/src/server.rs | 27 +++++- 8 files changed, 103 insertions(+), 91 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 7a4b0327fea..66cbc75cbb8 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,10 +18,11 @@ exclude = [ ] [dependencies] -hyperlane = "4.56.5" -rand = "0.9.0" -serde = "1.0.219" -sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } +hyperlane = "=4.65.0" +num_cpus = "=1.16.0" +rand = "=0.9.0" +serde = "=1.0.219" +sqlx = { version = "=0.8.3", features = ["runtime-tokio", "postgres"] } [profile.dev] incremental = false diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 09d2edd97a2..92d7253438d 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -1,18 +1,12 @@ use crate::*; -pub async fn get_db_connection() -> DbPoolConnection { - if let Some(db_pool) = DB.get() { - return db_pool.clone(); - }; - let db_pool: DbPoolConnection = connection_db().await; - DB.set(db_pool.clone()) - .expect("Failed to initialize DB_POOL"); - db_pool +pub fn get_db_connection() -> &'static DbPoolConnection { + &DB } #[cfg(feature = "dev")] pub async fn create_database() { - let db_pool: DbPoolConnection = get_db_connection().await; + let db_pool: &DbPoolConnection = get_db_connection(); let _ = query(&format!("CREATE DATABASE {};", DATABASE_NAME)) .execute(&db_pool) .await; @@ -20,7 +14,7 @@ pub async fn create_database() { #[cfg(feature = "dev")] pub async fn create_table() { - let db_pool: DbPoolConnection = get_db_connection().await; + let db_pool: &DbPoolConnection = get_db_connection(); let _ = query(&format!( "CREATE TABLE IF NOT EXISTS {} ( id SERIAL PRIMARY KEY, randomNumber INT NOT NULL @@ -41,7 +35,7 @@ pub async fn create_table() { #[cfg(feature = "dev")] pub async fn insert_records() { - let db_pool: DbPoolConnection = get_db_connection().await; + let db_pool: &DbPoolConnection = get_db_connection(); let row: PgRow = query(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME_WORLD)) .fetch_one(&db_pool) .await @@ -76,21 +70,21 @@ pub async fn insert_records() { let _ = query(&sql).execute(&db_pool).await; } -pub async fn init_cache() { +pub async fn init_cache() -> Vec { let mut res: Vec = Vec::with_capacity(RANDOM_MAX as usize); - let db_pool: DbPoolConnection = get_db_connection().await; + let db_pool: &DbPoolConnection = get_db_connection(); let sql: String = format!( "SELECT id, randomNumber FROM {} LIMIT {}", TABLE_NAME_WORLD, RANDOM_MAX ); - if let Ok(rows) = query(&sql).fetch_all(&db_pool).await { + if let Ok(rows) = query(&sql).fetch_all(db_pool).await { for row in rows { let id: i32 = row.get(KEY_ID); let random_number: i32 = row.get(KEY_RANDOM_NUMBER); res.push(QueryRow::new(id, random_number)); } } - let _ = CACHE.set(res); + res } pub async fn connection_db() -> DbPoolConnection { @@ -106,18 +100,10 @@ pub async fn connection_db() -> DbPoolConnection { DATABASE_NAME ), }; - let pool_size: u32 = (get_thread_count() << 2).max(10).min(100) as u32; - let max_pool_size: u32 = option_env!("POSTGRES_MAX_POOL_SIZE") - .unwrap_or(&pool_size.to_string()) - .parse::() - .unwrap_or(pool_size); - let min_pool_size: u32 = option_env!("POSTGRES_MIN_POOL_SIZE") - .unwrap_or(&pool_size.to_string()) - .parse::() - .unwrap_or(pool_size); + let pool_size: u32 = num_cpus::get() as u32; let pool: DbPoolConnection = PgPoolOptions::new() - .max_connections(max_pool_size) - .min_connections(min_pool_size) + .max_connections(100) + .min_connections(pool_size) .max_lifetime(None) .test_before_acquire(false) .idle_timeout(None) @@ -130,10 +116,10 @@ pub async fn connection_db() -> DbPoolConnection { pub async fn get_update_data( limit: Queries, ) -> (String, Vec, Vec, Vec) { - let db_pool: DbPoolConnection = get_db_connection().await; + let db_pool: &DbPoolConnection = get_db_connection(); let mut query_res_list: Vec = Vec::with_capacity(limit as usize); - let rows: Vec = get_some_row_id(limit, &db_pool).await; - let mut sql = format!("UPDATE {} SET randomNumber = CASE id ", TABLE_NAME_WORLD); + let rows: Vec = get_some_row_id(limit, db_pool).await; + let mut sql: String = format!("UPDATE {} SET randomNumber = CASE id ", TABLE_NAME_WORLD); let mut id_list: Vec = Vec::with_capacity(rows.len()); let mut value_list: Vec = Vec::with_capacity(rows.len() * 2); let mut random_numbers: Vec = Vec::with_capacity(rows.len()); @@ -159,14 +145,13 @@ pub async fn get_update_data( } pub async fn init_db() { - get_db_connection().await; #[cfg(feature = "dev")] { create_database().await; create_table().await; insert_records().await; } - init_cache().await; + black_box(init_cache().await); } pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { @@ -176,7 +161,7 @@ pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRow { let sql: String = format!( - "SELECT id, randomNumber FROM {} WHERE id = {} LIMIT 1", + "SELECT id, randomNumber FROM {} WHERE id = {}", TABLE_NAME_WORLD, id ); if let Ok(rows) = query(&sql).fetch_one(db_pool).await { @@ -187,7 +172,7 @@ pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRo } pub async fn update_world_rows(limit: Queries) -> Vec { - let db_pool: DbPoolConnection = get_db_connection().await; + let db_pool: &DbPoolConnection = get_db_connection(); let (sql, data, id_list, random_numbers) = get_update_data(limit).await; let mut query_builder: query::Query<'_, Postgres, postgres::PgArguments> = query(&sql); for (id, random_number) in id_list.iter().zip(random_numbers.iter()) { @@ -196,23 +181,34 @@ pub async fn update_world_rows(limit: Queries) -> Vec { for id in &id_list { query_builder = query_builder.bind(id); } - let _ = query_builder.execute(&db_pool).await; + let _ = query_builder.execute(db_pool).await; data } pub async fn all_world_row() -> Vec { - let db_pool: DbPoolConnection = get_db_connection().await; + let db_pool: &DbPoolConnection = get_db_connection(); let sql: String = format!("SELECT id, message FROM {}", TABLE_NAME_FORTUNE); - let res: Vec = query(&sql).fetch_all(&db_pool).await.unwrap_or_default(); + let res: Vec = query(&sql).fetch_all(db_pool).await.unwrap_or_default(); return res; } pub async fn get_some_row_id(limit: Queries, db_pool: &DbPoolConnection) -> Vec { - let futures: Vec<_> = (0..limit) - .map(|_| async { - let id: i32 = get_random_id(); - query_world_row(db_pool, id).await - }) - .collect(); - join_all(futures).await + let semaphore: Arc = Arc::new(Semaphore::new(32)); + let mut tasks: Vec> = Vec::with_capacity(limit as usize); + for _ in 0..limit { + let _ = semaphore.clone().acquire_owned().await.map(|permit| { + let db_pool: DbPoolConnection = db_pool.clone(); + tasks.push(spawn(async move { + let id: i32 = get_random_id(); + let res: QueryRow = query_world_row(&db_pool, id).await; + drop(permit); + res + })); + }); + } + join_all(tasks) + .await + .into_iter() + .filter_map(Result::ok) + .collect() } diff --git a/frameworks/Rust/hyperlane/src/lazy.rs b/frameworks/Rust/hyperlane/src/lazy.rs index 6e95d5019b0..a792c04b13b 100644 --- a/frameworks/Rust/hyperlane/src/lazy.rs +++ b/frameworks/Rust/hyperlane/src/lazy.rs @@ -1,4 +1,4 @@ use crate::*; -pub static DB: OnceCell = OnceCell::new(); -pub static CACHE: OnceCell> = OnceCell::new(); +pub static DB: Lazy = Lazy::new(|| block_on(async { connection_db().await })); +pub static CACHE: Lazy> = Lazy::new(|| block_on(async { init_cache().await })); diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index e240a6aa862..0b7ce0a26de 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -10,11 +10,12 @@ pub(crate) mod utils; pub(crate) use constant::*; pub(crate) use db::*; -pub(crate) use futures::future::join_all; pub(crate) use hyperlane::{ - once_cell::sync::OnceCell, + futures::{executor::block_on, future::join_all}, + once_cell::sync::Lazy, serde::*, serde_json::{Value, json}, + tokio::{spawn, sync::Semaphore, task::JoinHandle}, *, }; pub(crate) use lazy::*; @@ -27,12 +28,10 @@ pub(crate) use sqlx::{ postgres::{PgPoolOptions, PgRow}, *, }; -pub(crate) use std::fmt; +pub(crate) use std::{fmt, hint::black_box, sync::Arc}; pub(crate) use r#type::*; pub(crate) use utils::*; -#[tokio::main] -async fn main() { - init_db().await; - run_server().await; +fn main() { + run_server(); } diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 4696f51e867..8b658d6207e 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -1,7 +1,7 @@ use crate::*; -pub async fn request(controller_data: ControllerData) { - let _ = controller_data +pub async fn request(ctx: Context) { + let _ = ctx .set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) .await .set_response_header(CONTENT_TYPE, APPLICATION_JSON) diff --git a/frameworks/Rust/hyperlane/src/response_middleware.rs b/frameworks/Rust/hyperlane/src/response_middleware.rs index 81fb0c368e9..85e8f422ebf 100644 --- a/frameworks/Rust/hyperlane/src/response_middleware.rs +++ b/frameworks/Rust/hyperlane/src/response_middleware.rs @@ -1,5 +1,5 @@ use crate::*; -pub async fn response(controller_data: ControllerData) { - let _ = controller_data.send().await; +pub async fn response(ctx: Context) { + let _ = ctx.send().await; } diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 22f8f24af23..8ed6ec4e460 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -1,46 +1,46 @@ use crate::*; -pub async fn json(controller_data: ControllerData) { +pub async fn json(ctx: Context) { let json: Value = json!({ "message": RESPONSEDATA_STR }); - let _ = controller_data + let _ = ctx .set_response_body(serde_json::to_string(&json).unwrap_or_default()) .await; } -pub async fn plaintext(controller_data: ControllerData) { - let _ = controller_data +pub async fn plaintext(ctx: Context) { + let _ = ctx .set_response_header(CONTENT_TYPE, TEXT_PLAIN) .await .set_response_body(RESPONSEDATA_BIN) .await; } -pub async fn db(controller_data: ControllerData) { - let db_connection: DbPoolConnection = get_db_connection().await; - let query_row: QueryRow = random_world_row(&db_connection).await; - let _ = controller_data +pub async fn db(ctx: Context) { + let db_connection: &DbPoolConnection = get_db_connection(); + let query_row: QueryRow = random_world_row(db_connection).await; + let _ = ctx .set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) .await; } -pub async fn queries(controller_data: ControllerData) { - let queries: Queries = controller_data +pub async fn queries(ctx: Context) { + let queries: Queries = ctx .get_request_query("q") .await .and_then(|queries| queries.parse::().ok()) .unwrap_or_default() .min(ROW_LIMIT as Queries) .max(1); - let db_pool: DbPoolConnection = get_db_connection().await; - let data: Vec = get_some_row_id(queries, &db_pool).await; - let _ = controller_data + let db_pool: &DbPoolConnection = get_db_connection(); + let data: Vec = get_some_row_id(queries, db_pool).await; + let _ = ctx .set_response_body(serde_json::to_string(&data).unwrap_or_default()) .await; } -pub async fn fortunes(controller_data: ControllerData) { +pub async fn fortunes(ctx: Context) { let all_rows: Vec = all_world_row().await; let mut fortunes_list: Vec = all_rows .iter() @@ -56,15 +56,14 @@ pub async fn fortunes(controller_data: ControllerData) { )); fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); let res: String = FortunesTemplate::new(fortunes_list).to_string(); - controller_data - .set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) + ctx.set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) .await .set_response_body(res) .await; } -pub async fn updates(controller_data: ControllerData) { - let queries: Queries = controller_data +pub async fn updates(ctx: Context) { + let queries: Queries = ctx .get_request_query("q") .await .and_then(|queries| queries.parse::().ok()) @@ -72,27 +71,21 @@ pub async fn updates(controller_data: ControllerData) { .min(ROW_LIMIT as Queries) .max(1); let res: Vec = update_world_rows(queries).await; - let _ = controller_data + let _ = ctx .set_response_body(serde_json::to_string(&res).unwrap_or_default()) .await; } -pub async fn cached_queries(controller_data: ControllerData) { - let count: Queries = controller_data +pub async fn cached_queries(ctx: Context) { + let count: Queries = ctx .get_request_query("c") .await .and_then(|queries| queries.parse::().ok()) .unwrap_or_default() .min(ROW_LIMIT as Queries) .max(1); - let res: Vec = CACHE - .get() - .unwrap_or(&Vec::new()) - .iter() - .take(count as usize) - .cloned() - .collect(); - let _ = controller_data + let res: Vec = CACHE.iter().take(count as usize).cloned().collect(); + let _ = ctx .set_response_body(serde_json::to_string(&res).unwrap_or_default()) .await; } diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 1730e1b0ef7..72883143580 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -1,9 +1,23 @@ use crate::*; +use tokio::runtime::{Builder, Runtime}; -pub async fn run_server() { +fn runtime() -> Runtime { + Builder::new_multi_thread() + .worker_threads(get_thread_count()) + .thread_stack_size(2097152) + .max_blocking_threads(5120) + .max_io_events_per_tick(5120) + .enable_all() + .build() + .unwrap() +} + +async fn init_server() { let server: Server = Server::new(); server.host("0.0.0.0").await; server.port(8080).await; + server.disable_linger().await; + server.disable_nodelay().await; server.disable_log().await; server.disable_inner_log().await; server.disable_inner_print().await; @@ -18,5 +32,14 @@ pub async fn run_server() { server.route("/upda", updates).await; server.request_middleware(request).await; server.response_middleware(response).await; - server.listen().await; + server.listen().await.unwrap(); +} + +async fn init() { + init_db().await; + init_server().await; +} + +pub fn run_server() { + runtime().block_on(init()); } From d052086d88818933aa312e43569292964293880e Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Sat, 5 Apr 2025 00:11:14 +0800 Subject: [PATCH 1332/1766] [rust/viz]: use multiple current thread runtimes in json (#9750) --- frameworks/Rust/viz/Cargo.toml | 2 + frameworks/Rust/viz/src/main.rs | 19 ++++--- frameworks/Rust/viz/src/main_diesel.rs | 7 ++- frameworks/Rust/viz/src/main_pg.rs | 30 +++-------- frameworks/Rust/viz/src/main_sqlx.rs | 7 ++- frameworks/Rust/viz/src/server.rs | 75 ++++++++++++++++++-------- 6 files changed, 84 insertions(+), 56 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index 72d159b4b79..bd461396428 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -35,6 +35,8 @@ mime = "0.3" rand = { version = "0.9", features = ["small_rng"] } thiserror = "2.0" futures-util = "0.3" +socket2 = "0.5.8" +num_cpus = "1.16.0" [target.'cfg(not(unix))'.dependencies] nanorand = { version = "0.7" } diff --git a/frameworks/Rust/viz/src/main.rs b/frameworks/Rust/viz/src/main.rs index 4daffd4916c..3552b23920c 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, CONTENT_TYPE, SERVER}, - Bytes, Error, Request, Response, ResponseExt, Result, Router, + Bytes, Request, Response, ResponseExt, Result, Router, }; mod server; @@ -14,6 +14,7 @@ struct Message { message: &'static str, } +#[inline(always)] async fn plaintext(_: Request) -> Result { let mut res = Response::text("Hello, World!"); res.headers_mut() @@ -21,8 +22,9 @@ async fn plaintext(_: Request) -> Result { Ok(res) } +#[inline(always)] async fn json(_: Request) -> Result { - let mut resp = Response::builder() + let mut res = Response::builder() .body( http_body_util::Full::new(Bytes::from( serde_json::to_vec(&Message { @@ -33,20 +35,23 @@ async fn json(_: Request) -> Result { .into(), ) .unwrap(); - let headers = resp.headers_mut(); + let headers = res.headers_mut(); headers.insert(SERVER, HeaderValue::from_static("Viz")); headers.insert( CONTENT_TYPE, HeaderValue::from_static(mime::APPLICATION_JSON.as_ref()), ); - Ok(resp) + Ok(res) } -#[tokio::main] -async fn main() -> Result<()> { +async fn app() { let app = Router::new() .get("/plaintext", plaintext) .get("/json", json); - server::serve(app).await.map_err(Error::Boxed) + server::serve(app).await.unwrap(); +} + +fn main() { + server::run(app) } diff --git a/frameworks/Rust/viz/src/main_diesel.rs b/frameworks/Rust/viz/src/main_diesel.rs index 688b1e207da..ec3a002c2a7 100644 --- a/frameworks/Rust/viz/src/main_diesel.rs +++ b/frameworks/Rust/viz/src/main_diesel.rs @@ -77,8 +77,7 @@ async fn updates(req: Request) -> Result { Ok(res) } -#[tokio::main] -async fn main() { +async fn app() { let max = available_parallelism().map(|n| n.get()).unwrap_or(16) as u32; let pool = Pool::::builder() @@ -99,3 +98,7 @@ async fn main() { server::serve(app).await.unwrap() } + +fn main() { + server::run(app) +} diff --git a/frameworks/Rust/viz/src/main_pg.rs b/frameworks/Rust/viz/src/main_pg.rs index f7a0748ef57..4898ca8f24a 100644 --- a/frameworks/Rust/viz/src/main_pg.rs +++ b/frameworks/Rust/viz/src/main_pg.rs @@ -1,7 +1,4 @@ -use std::{ - sync::Arc, - thread::{available_parallelism, spawn}, -}; +use std::sync::Arc; use viz::{ header::{HeaderValue, SERVER}, @@ -76,26 +73,7 @@ async fn updates(req: Request) -> Result { Ok(res) } -fn main() { - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - - for _ in 1..available_parallelism().map(|n| n.get()).unwrap_or(16) { - spawn(move || { - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - rt.block_on(serve()); - }); - } - - rt.block_on(serve()); -} - -async fn serve() { +async fn app() { let conn = PgConnection::connect(DB_URL).await; let app = Router::new() @@ -107,3 +85,7 @@ async fn serve() { server::serve(app).await.unwrap() } + +fn main() { + server::run(app) +} diff --git a/frameworks/Rust/viz/src/main_sqlx.rs b/frameworks/Rust/viz/src/main_sqlx.rs index 7685a9f6165..e2aff0ff98f 100644 --- a/frameworks/Rust/viz/src/main_sqlx.rs +++ b/frameworks/Rust/viz/src/main_sqlx.rs @@ -79,8 +79,7 @@ async fn updates(mut req: Request) -> Result { Ok(res) } -#[tokio::main] -async fn main() -> Result<()> { +async fn app() -> Result<()> { let max = available_parallelism().map(|n| n.get()).unwrap_or(16) as u32; let pool = PgPoolOptions::new() @@ -103,6 +102,10 @@ async fn main() -> Result<()> { server::serve(app).await.map_err(Error::Boxed) } +fn main() { + server::run(app) +} + markup::define! { FortunesTemplate(items: Vec) { {markup::doctype()} diff --git a/frameworks/Rust/viz/src/server.rs b/frameworks/Rust/viz/src/server.rs index d70c1de8531..99386fb71dc 100644 --- a/frameworks/Rust/viz/src/server.rs +++ b/frameworks/Rust/viz/src/server.rs @@ -1,49 +1,82 @@ use std::error::Error; +use std::future::Future; use std::io; use std::net::{Ipv4Addr, SocketAddr}; use std::sync::Arc; +use std::thread; +use socket2::{Domain, SockAddr, Socket}; use hyper::server::conn::http1::Builder; use hyper_util::rt::TokioIo; -use tokio::net::{TcpListener, TcpSocket}; +use tokio::{net::TcpListener, runtime}; use viz::{Responder, Router, 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"); + let socket = create_socket(addr).expect("couldn't bind to addr"); + let listener = TcpListener::from_std(socket.into())?; + + let tree = Arc::::new(router.into()); + + let mut http = Builder::new(); + http.pipeline_flush(true); println!("Started viz server at 8080"); loop { let (tcp, _) = listener.accept().await?; - let io = TokioIo::new(tcp); + tcp.set_nodelay(true).expect("couldn't set TCP_NODELAY!"); + + let http = http.clone(); let tree = tree.clone(); - tokio::task::spawn(async move { - Builder::new() - .pipeline_flush(true) - .serve_connection(io, Responder::>::new(tree, None)) - .with_upgrades() + tokio::spawn(async move { + http + .serve_connection( + TokioIo::new(tcp), + Responder::>::new(tree, None), + ) .await }); } } -fn reuse_listener(addr: SocketAddr) -> io::Result { - let socket = match addr { - SocketAddr::V4(_) => TcpSocket::new_v4()?, - SocketAddr::V6(_) => TcpSocket::new_v6()?, +fn create_socket(addr: SocketAddr) -> Result { + let domain = match addr { + SocketAddr::V4(_) => Domain::IPV4, + SocketAddr::V6(_) => Domain::IPV6, }; - + let addr = SockAddr::from(addr); + let socket = Socket::new(domain, socket2::Type::STREAM, None)?; + let backlog = 4096; #[cfg(unix)] - { - if let Err(e) = socket.set_reuseport(true) { - eprintln!("error setting SO_REUSEPORT: {e}"); - } + socket.set_reuse_port(true)?; + socket.set_reuse_address(true)?; + socket.set_nodelay(true)?; + socket.set_nonblocking(true)?; + socket.bind(&addr)?; + socket.listen(backlog)?; + + Ok(socket) +} + +pub fn run(f: fn() -> Fut) +where + Fut: Future + Send + 'static, +{ + for _ in 1..num_cpus::get() { + let runtime = runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + thread::spawn(move || { + runtime.block_on(f()); + }); } - socket.set_reuseaddr(true)?; - socket.bind(addr)?; - socket.listen(1024) + let runtime = runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + runtime.block_on(f()); } From d9c0bf9fcca524640059891d0e3cf17df7129c78 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Fri, 4 Apr 2025 06:12:29 -1000 Subject: [PATCH 1333/1766] aio socket (#9752) * add aio-socket * update HttpServer --------- Co-authored-by: litongjava --- frameworks/Java/aio-socket/.dockerignore | 19 ++ frameworks/Java/aio-socket/.gitignore | 3 + frameworks/Java/aio-socket/README.md | 77 ++++++++ .../Java/aio-socket/aio-socket.dockerfile | 19 ++ .../Java/aio-socket/benchmark_config.json | 23 +++ frameworks/Java/aio-socket/config.toml | 15 ++ frameworks/Java/aio-socket/pom.xml | 90 ++++++++++ .../aio/http/server/HttpServer.java | 169 ++++++++++++++++++ .../aio/http/server/model/Fortune.java | 23 +++ .../aio/http/server/model/Message.java | 13 ++ .../aio/http/server/model/World.java | 32 ++++ .../aio/http/server/utils/RandomUtils.java | 36 ++++ .../src/main/resources/app.properties | 9 + .../aio-socket/src/main/resources/ehcache.xml | 9 + .../aio-socket/src/main/resources/logback.xml | 55 ++++++ .../main/resources/templates/fortunes.html | 20 +++ 16 files changed, 612 insertions(+) create mode 100644 frameworks/Java/aio-socket/.dockerignore create mode 100644 frameworks/Java/aio-socket/.gitignore create mode 100644 frameworks/Java/aio-socket/README.md create mode 100644 frameworks/Java/aio-socket/aio-socket.dockerfile create mode 100644 frameworks/Java/aio-socket/benchmark_config.json create mode 100644 frameworks/Java/aio-socket/config.toml create mode 100644 frameworks/Java/aio-socket/pom.xml create mode 100644 frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/HttpServer.java create mode 100644 frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Fortune.java create mode 100644 frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Message.java create mode 100644 frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/World.java create mode 100644 frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/utils/RandomUtils.java create mode 100644 frameworks/Java/aio-socket/src/main/resources/app.properties create mode 100644 frameworks/Java/aio-socket/src/main/resources/ehcache.xml create mode 100644 frameworks/Java/aio-socket/src/main/resources/logback.xml create mode 100644 frameworks/Java/aio-socket/src/main/resources/templates/fortunes.html diff --git a/frameworks/Java/aio-socket/.dockerignore b/frameworks/Java/aio-socket/.dockerignore new file mode 100644 index 00000000000..cba5dfe3c3b --- /dev/null +++ b/frameworks/Java/aio-socket/.dockerignore @@ -0,0 +1,19 @@ +.github +.git +.DS_Store +docs +kubernetes +node_modules +/.svelte-kit +/package +.env +.env.* +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +__pycache__ +.env +_old +uploads +.ipynb_checkpoints +**/*.db +_test \ No newline at end of file diff --git a/frameworks/Java/aio-socket/.gitignore b/frameworks/Java/aio-socket/.gitignore new file mode 100644 index 00000000000..2f089945614 --- /dev/null +++ b/frameworks/Java/aio-socket/.gitignore @@ -0,0 +1,3 @@ +/target/ +logs +.settings \ No newline at end of file diff --git a/frameworks/Java/aio-socket/README.md b/frameworks/Java/aio-socket/README.md new file mode 100644 index 00000000000..118b271982c --- /dev/null +++ b/frameworks/Java/aio-socket/README.md @@ -0,0 +1,77 @@ +# t-io Benchmarking Test + +This is the tio-server portion of a [benchmarking test suite](../) comparing a variety of web development platforms. + +## Controller + +These implementations use the tio-server's controller. + +### Plaintext Test + +* [Plaintext test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + +### JSON Serialization Test + +* [JSON test source](src/main/java/com/litongjava/tio/http/server/controller/IndexController.java) + + +## Versions +3.7.3.v20231218-RELEASE (https://gitee.com/litongjava/t-io) + +## Test URLs + +All implementations use the same URLs. + +### Plaintext Test + + http://localhost:8080/plaintext + +### JSON Encoding Test + + http://localhost:8080/json + + + + ## Hot to run + ### install mysql 8 + - 1.please instal mysql 8.0.32,example cmd + ``` + docker run --restart=always -d --name mysql_8 --hostname mysql \ +-p 3306:3306 \ +-e 'MYSQL_ROOT_PASSWORD=robot_123456#' -e 'MYSQL_ROOT_HOST=%' -e 'MYSQL_DATABASE=hello_world' \ +mysql/mysql-server:8.0.32 \ +--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1 + ``` + - 2.create database schema hello_world + - 3.create tablle,[example](sql/hello_world.sql) + - 4.import data + + ### docker + ``` + docker build -t tio-server-benchmark -f tio-server.dockerfile . +``` +The run is to specify the mysql database +``` +docker run --rm -p 8080:8080 \ +-e JDBC_URL="jdbc:mysql://192.168.3.9/hello_world" \ +-e JDBC_USER="root" \ +-e JDBC_PSWD="robot_123456#" \ +tio-server-benchmark +``` + +### windows + +-windows +``` +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar --JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false --JDBC_USER=root --JDBC_PSWD=robot_123456# +``` +or +``` +set JDBC_URL=jdbc:mysql://192.168.3.9/hello_world +set jdbc.user=root +set JDBC_PSWD=robot_123456# +D:\java\jdk1.8.0_121\bin\java -jar target\tio-server-benchmark-1.0.jar +``` + + + diff --git a/frameworks/Java/aio-socket/aio-socket.dockerfile b/frameworks/Java/aio-socket/aio-socket.dockerfile new file mode 100644 index 00000000000..7aa11987383 --- /dev/null +++ b/frameworks/Java/aio-socket/aio-socket.dockerfile @@ -0,0 +1,19 @@ +FROM litongjava/maven:3.8.8-jdk8u391 AS builder +WORKDIR /app + +COPY pom.xml pom.xml +RUN mvn dependency:go-offline -q + +COPY src src +RUN mvn package -Passembly -q +RUN ls -l && ls -l target + +FROM litongjava/jre:8u391-stable-slim + +WORKDIR /app + +COPY --from=builder /app/target/aio-socket-benchmark-1.0-jar-with-dependencies.jar /app/aio-socket-benchmark-1.0.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC","-cp", "/app/aio-socket-benchmark-1.0.jar","com.litongjava.aio.http.server.HttpServer"] \ No newline at end of file diff --git a/frameworks/Java/aio-socket/benchmark_config.json b/frameworks/Java/aio-socket/benchmark_config.json new file mode 100644 index 00000000000..135582cd342 --- /dev/null +++ b/frameworks/Java/aio-socket/benchmark_config.json @@ -0,0 +1,23 @@ +{ + "framework": "aio-socket", + "tests": [{ + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "aio-socket", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "t-io", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "aio-socket", + "notes": "aio-socket", + "versus": "t-io" + } + }] +} diff --git a/frameworks/Java/aio-socket/config.toml b/frameworks/Java/aio-socket/config.toml new file mode 100644 index 00000000000..31b198ee34b --- /dev/null +++ b/frameworks/Java/aio-socket/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "t-io" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "t-io" +webserver = "None" +versus = "t-io" diff --git a/frameworks/Java/aio-socket/pom.xml b/frameworks/Java/aio-socket/pom.xml new file mode 100644 index 00000000000..2b5dacefe65 --- /dev/null +++ b/frameworks/Java/aio-socket/pom.xml @@ -0,0 +1,90 @@ + + 4.0.0 + com.litongjava + aio-socket-benchmark + 1.0 + ${project.artifactId} + + UTF-8 + 1.8 + ${java.version} + ${java.version} + com.litongjava.aio.http.server.HttpServer + + + + com.litongjava + aio-socket + 1.0.1 + + + com.alibaba + fastjson + 2.0.39 + + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + false + + + + + maven-assembly-plugin + 3.1.0 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/HttpServer.java b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/HttpServer.java new file mode 100644 index 00000000000..fa954b4cef4 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/HttpServer.java @@ -0,0 +1,169 @@ +package com.litongjava.aio.http.server; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousChannelGroup; +import java.nio.channels.AsynchronousSocketChannel; +import java.nio.channels.CompletionHandler; +import java.nio.charset.StandardCharsets; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.ZoneId; +import java.util.concurrent.ThreadFactory; + +import com.alibaba.fastjson.JSON; +import com.litongjava.aio.http.server.model.Message; +import com.litongjava.enhance.buffer.BufferPage; +import com.litongjava.enhance.buffer.BufferPagePool; +import com.litongjava.enhance.buffer.VirtualBuffer; +import com.litongjava.enhance.channel.EnhanceAsynchronousChannelProvider; +import com.litongjava.enhance.channel.EnhanceAsynchronousServerSocketChannel; + +public class HttpServer { + + private static int cpuNum = Runtime.getRuntime().availableProcessors(); + private static BufferPagePool pool = new BufferPagePool(0, 1024 * cpuNum, true); + private static BufferPage bufferPage = pool.allocateBufferPage(); + private static final String HELLO_WORLD = "Hello, World!"; + + public static void main(String[] args) throws Exception { + + // 创建异步通道提供者 + EnhanceAsynchronousChannelProvider provider = new EnhanceAsynchronousChannelProvider(false); + + // 创建通道组 + AsynchronousChannelGroup group = provider.openAsynchronousChannelGroup(2, new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "http-server-thread"); + } + }); + + // 创建服务器通道并绑定端口 + EnhanceAsynchronousServerSocketChannel server = (EnhanceAsynchronousServerSocketChannel) provider.openAsynchronousServerSocketChannel(group); + server.bind(new InetSocketAddress(8080), 0); + + System.out.println("HTTP Server 正在监听端口 8080 ..."); + + // 异步接受连接 + server.accept(null, new CompletionHandler() { + @Override + public void completed(AsynchronousSocketChannel channel, Object attachment) { + // 继续接收其他连接 + server.accept(null, this); + handleClient(channel); + } + + @Override + public void failed(Throwable exc, Object attachment) { + exc.printStackTrace(); + } + }); + + // 主线程阻塞 + Thread.currentThread().join(); + } + + private static void handleClient(AsynchronousSocketChannel channel) { + VirtualBuffer virtualBuffer = bufferPage.allocate(8192); + ByteBuffer buffer = virtualBuffer.buffer(); + + channel.read(buffer, virtualBuffer, new CompletionHandler() { + @Override + public void completed(Integer result, VirtualBuffer attachment) { + try { + if (result > 0) { + buffer.flip(); + byte[] bytes = new byte[buffer.remaining()]; + buffer.get(bytes); + String request = new String(bytes, StandardCharsets.UTF_8); + + // 生成当前时间,格式为 RFC 1123 格式 + String date = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneId.of("GMT"))); + + ByteBuffer responseBuffer; + if (request.startsWith("GET /plaintext")) { + String body = "Hello, World!"; + String httpResponse = "HTTP/1.1 200 OK\r\n" + + "Content-Length: " + body.getBytes(StandardCharsets.UTF_8).length + "\r\n" + + "Server: aio-socket\r\n" + + "Content-Type: text/plain\r\n" + + "Date: " + date + "\r\n" + + "\r\n" + + body; + responseBuffer = ByteBuffer.wrap(httpResponse.getBytes(StandardCharsets.UTF_8)); + + } else if (request.startsWith("GET /json")) { + String jsonString = JSON.toJSONString(new Message(HELLO_WORLD)); + int length = jsonString.getBytes(StandardCharsets.UTF_8).length; + String httpResponse = "HTTP/1.1 200 OK\r\n" + + "Content-Length: " + length + "\r\n" + + "Server: aio-socket\r\n" + + "Content-Type: application/json\r\n" + + "Date: " + date + "\r\n" + + "\r\n" + + jsonString; + responseBuffer = ByteBuffer.wrap(httpResponse.getBytes(StandardCharsets.UTF_8)); + } else { + String body = "Hello, World!"; + String httpResponse = "HTTP/1.1 200 OK\r\n" + + "Content-Length: " + body.getBytes(StandardCharsets.UTF_8).length + "\r\n" + + "Content-Type: text/plain\r\n" + + "Date: " + date + "\r\n" + + "\r\n" + + body; + responseBuffer = ByteBuffer.wrap(httpResponse.getBytes(StandardCharsets.UTF_8)); + } + + // 异步写响应 + channel.write(responseBuffer, attachment, new CompletionHandler() { + @Override + public void completed(Integer result, VirtualBuffer attachment) { + try { + channel.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + attachment.clean(); + } + } + + @Override + public void failed(Throwable exc, VirtualBuffer attachment) { + exc.printStackTrace(); + try { + channel.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + attachment.clean(); + } + } + }); + } else { + try { + channel.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } finally { + // 注意:如果在写操作中已经归还了虚拟缓冲区,则不要重复释放 + } + } + + @Override + public void failed(Throwable exc, VirtualBuffer attachment) { + exc.printStackTrace(); + try { + channel.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + attachment.clean(); + } + } + }); + } +} diff --git a/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Fortune.java b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Fortune.java new file mode 100644 index 00000000000..76f56b22dc9 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Fortune.java @@ -0,0 +1,23 @@ +package com.litongjava.aio.http.server.model; + +public final class Fortune { + + public Long id; + public String message; + + public Fortune() { + } + + public Fortune(Long id, String message) { + this.id = id; + this.message = message; + } + + public Long getId() { + return id; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Message.java b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Message.java new file mode 100644 index 00000000000..2365bf4d708 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/Message.java @@ -0,0 +1,13 @@ +package com.litongjava.aio.http.server.model; + +public final class Message { + private final String message; + + public Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/World.java b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/World.java new file mode 100644 index 00000000000..3fec0068ea5 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/model/World.java @@ -0,0 +1,32 @@ +package com.litongjava.aio.http.server.model; + +public final class World { + + public int id; + public int randomnumber; + + protected World() { + } + + public World(int id, int randomnumber) { + this.id = id; + this.randomnumber = randomnumber; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getRandomnumber() { + return randomnumber; + } + + public void setRandomnumber(int randomnumber) { + this.randomnumber = randomnumber; + } + +} \ No newline at end of file diff --git a/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/utils/RandomUtils.java b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/utils/RandomUtils.java new file mode 100644 index 00000000000..c2b73f8dca2 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/java/com/litongjava/aio/http/server/utils/RandomUtils.java @@ -0,0 +1,36 @@ +package com.litongjava.aio.http.server.utils; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +public class RandomUtils { + + private static final int MIN_WORLD_NUMBER = 1; + private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001; + // private static final int MAX_WORLD_NUMBER_PLUS_ONE = 30; + + public static int randomWorldNumber() { + return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE); + } + + public static IntStream randomWorldNumbers() { + return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE) + // distinct() allows us to avoid using Hibernate's first-level cache in + // the JPA-based implementation. Using a cache like that would bypass + // querying the database, which would violate the test requirements. + .distinct(); + } + + public static int parseQueryCount(String textValue) { + if (textValue == null) { + return 1; + } + int parsedValue; + try { + parsedValue = Integer.parseInt(textValue); + } catch (NumberFormatException e) { + return 1; + } + return Math.min(500, Math.max(1, parsedValue)); + } +} diff --git a/frameworks/Java/aio-socket/src/main/resources/app.properties b/frameworks/Java/aio-socket/src/main/resources/app.properties new file mode 100644 index 00000000000..52083ea13ff --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/resources/app.properties @@ -0,0 +1,9 @@ +http.response.header.showServer=true +server.port=8080 +#JDBC_URL=jdbc:mysql://192.168.3.9/hello_world?useSSL=false&allowPublicKeyRetrieval=true +#JDBC_USER=root +#JDBC_PSWD=robot_123456# + +JDBC_URL=jdbc:mysql://tfb-database/hello_world +JDBC_USER=benchmarkdbuser +JDBC_PSWD=benchmarkdbpass \ No newline at end of file diff --git a/frameworks/Java/aio-socket/src/main/resources/ehcache.xml b/frameworks/Java/aio-socket/src/main/resources/ehcache.xml new file mode 100644 index 00000000000..79b79e49479 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/resources/ehcache.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/frameworks/Java/aio-socket/src/main/resources/logback.xml b/frameworks/Java/aio-socket/src/main/resources/logback.xml new file mode 100644 index 00000000000..6065c075e78 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/resources/logback.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + ${LOG_HOME}/log.%d{yyyyMMddHH}.%i.log + + 180 + + 100MB + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frameworks/Java/aio-socket/src/main/resources/templates/fortunes.html b/frameworks/Java/aio-socket/src/main/resources/templates/fortunes.html new file mode 100644 index 00000000000..1f6817df007 --- /dev/null +++ b/frameworks/Java/aio-socket/src/main/resources/templates/fortunes.html @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + #for(fortune : fortunes) + + + + + #end +
      idmessage
      #(fortune.id)#escape(fortune.message)
      + + From 3d9567b15190c4a6f31119d6d81b82e9850a9211 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:12:56 +0200 Subject: [PATCH 1334/1766] [csharp/tetsuweb] Remove Tetsuweb (#9753) TetsuWeb hasn't seen an update in 6 years: https://github.com/gkbrk/TetsuWeb/tree/master Also most downloads are probably for the TechEmpower tests: https://www.nuget.org/packages/Tetsu.Web/0.1.5#versions-body-tab --- frameworks/CSharp/tetsuweb/.gitignore | 37 ------------------- .../tetsuweb/Benchmark/Benchmark.csproj | 13 ------- .../CSharp/tetsuweb/Benchmark/Program.cs | 26 ------------- frameworks/CSharp/tetsuweb/README.md | 15 -------- .../CSharp/tetsuweb/benchmark_config.json | 24 ------------ frameworks/CSharp/tetsuweb/config.toml | 15 -------- .../CSharp/tetsuweb/tetsuweb.dockerfile | 12 ------ 7 files changed, 142 deletions(-) delete mode 100644 frameworks/CSharp/tetsuweb/.gitignore delete mode 100644 frameworks/CSharp/tetsuweb/Benchmark/Benchmark.csproj delete mode 100644 frameworks/CSharp/tetsuweb/Benchmark/Program.cs delete mode 100644 frameworks/CSharp/tetsuweb/README.md delete mode 100644 frameworks/CSharp/tetsuweb/benchmark_config.json delete mode 100644 frameworks/CSharp/tetsuweb/config.toml delete mode 100644 frameworks/CSharp/tetsuweb/tetsuweb.dockerfile diff --git a/frameworks/CSharp/tetsuweb/.gitignore b/frameworks/CSharp/tetsuweb/.gitignore deleted file mode 100644 index 708c4155fa7..00000000000 --- a/frameworks/CSharp/tetsuweb/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -[Oo]bj/ -[Bb]in/ -TestResults/ -.nuget/ -*.sln.ide/ -_ReSharper.*/ -.idea/ -packages/ -artifacts/ -PublishProfiles/ -.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/tetsuweb/Benchmark/Benchmark.csproj b/frameworks/CSharp/tetsuweb/Benchmark/Benchmark.csproj deleted file mode 100644 index 2968d8c6b86..00000000000 --- a/frameworks/CSharp/tetsuweb/Benchmark/Benchmark.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - Exe - net5.0 - - - - - - - - diff --git a/frameworks/CSharp/tetsuweb/Benchmark/Program.cs b/frameworks/CSharp/tetsuweb/Benchmark/Program.cs deleted file mode 100644 index bb3663e8a1f..00000000000 --- a/frameworks/CSharp/tetsuweb/Benchmark/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using Newtonsoft.Json; -using Tetsu.Web; - -namespace Benchmark { - public class Program { - public static void Main() { - var server = new Server(); - - server.Handle("/plaintext", ctx => - ctx.Response.TextContent = "Hello, World!"); - - server.Handle("/json", ctx => { - ctx.Response.SetHeader("Content-Type", "application/json"); - ctx.Response.TextContent = JsonConvert.SerializeObject(new { - message = "Hello, World!" - }); - }); - - server.AddMiddleware(ctx => - ctx.Response.SetHeader("Date", DateTime.UtcNow.ToString("r"))); - - server.Listen("0.0.0.0", 1234).Wait(); - } - } -} diff --git a/frameworks/CSharp/tetsuweb/README.md b/frameworks/CSharp/tetsuweb/README.md deleted file mode 100644 index 84f38ef7f86..00000000000 --- a/frameworks/CSharp/tetsuweb/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Tetsu.Web Benchmark - -## Infrastructure Software Versions - -**Language** - -* C# - -**Platforms** - -* .NET Core (Windows and Linux) - -**Web Stack** - -* [Tetsu.Web](https://github.com/gkbrk/TetsuWeb) diff --git a/frameworks/CSharp/tetsuweb/benchmark_config.json b/frameworks/CSharp/tetsuweb/benchmark_config.json deleted file mode 100644 index 9d081d854af..00000000000 --- a/frameworks/CSharp/tetsuweb/benchmark_config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "framework": "tetsuweb", - "tests": [{ - "default": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "port": 1234, - "approach": "Realistic", - "classification": "Micro", - "database": "None", - "framework": "Tetsu", - "language": "C#", - "orm": "Raw", - "platform": ".NET", - "flavor": "CoreCLR", - "webserver": "Tetsu", - "os": "Linux", - "database_os": "Linux", - "display_name": "Tetsu.Web", - "notes": "", - "versus": "aspcore" - } - }] -} diff --git a/frameworks/CSharp/tetsuweb/config.toml b/frameworks/CSharp/tetsuweb/config.toml deleted file mode 100644 index e290ddacab9..00000000000 --- a/frameworks/CSharp/tetsuweb/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "tetsuweb" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = ".NET" -webserver = "Tetsu" -versus = "aspcore" diff --git a/frameworks/CSharp/tetsuweb/tetsuweb.dockerfile b/frameworks/CSharp/tetsuweb/tetsuweb.dockerfile deleted file mode 100644 index 8cdda17ad1e..00000000000 --- a/frameworks/CSharp/tetsuweb/tetsuweb.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build -WORKDIR /app -COPY Benchmark . -RUN dotnet publish -c Release -o out - -FROM mcr.microsoft.com/dotnet/runtime:5.0 -WORKDIR /app -COPY --from=build /app/out ./ - -EXPOSE 8080 - -ENTRYPOINT ["dotnet", "Benchmark.dll"] From 6b07457ece568dd69abbf7e857d762fcc70082f7 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:13:11 +0200 Subject: [PATCH 1335/1766] [csharp/zysocket] Remove Zysocket-v (#9756) Zysocket-V hasn't been updated for 4 years: https://github.com/luyikk/zysocket-v Also most downloads are probably for the TechEmpower tests: https://www.nuget.org/packages/ZYSocketServerV --- .../CSharp/zysocket-v/PlatformBenchmarks.sln | 25 --- .../PlatformBenchmarks/AsciiString.cs | 48 ----- .../PlatformBenchmarks/ConcurrentRandom.cs | 31 --- .../zysocket-v/PlatformBenchmarks/DBRaw.cs | 123 ----------- .../zysocket-v/PlatformBenchmarks/Fortune.cs | 24 --- .../zysocket-v/PlatformBenchmarks/GMTDate.cs | 186 ---------------- .../PlatformBenchmarks/HttpHandler.cs | 200 ------------------ .../PlatformBenchmarks/HttpToken.cs | 9 - .../PlatformBenchmarks/JsonMessage.cs | 15 -- .../PlatformBenchmarks.csproj | 17 -- .../zysocket-v/PlatformBenchmarks/Program.cs | 19 -- .../PublishProfiles/FolderProfile.pubxml | 13 -- .../zysocket-v/PlatformBenchmarks/World.cs | 15 -- .../PlatformBenchmarks/ZYHttpServer.cs | 85 -------- .../zysocket-v/PlatformBenchmarks/db.cs | 29 --- .../zysocket-v/PlatformBenchmarks/fortunes.cs | 58 ----- .../zysocket-v/PlatformBenchmarks/json.cs | 22 -- .../PlatformBenchmarks/plaintext.cs | 19 -- .../zysocket-v/PlatformBenchmarks/queries.cs | 41 ---- frameworks/CSharp/zysocket-v/README.md | 23 -- .../CSharp/zysocket-v/benchmark_config.json | 29 --- frameworks/CSharp/zysocket-v/config.toml | 18 -- .../CSharp/zysocket-v/zysocket-v.dockerfile | 13 -- 23 files changed, 1062 deletions(-) delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks.sln delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/AsciiString.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/ConcurrentRandom.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/DBRaw.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/Fortune.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/GMTDate.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpHandler.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpToken.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/JsonMessage.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/PlatformBenchmarks.csproj delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/Program.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/Properties/PublishProfiles/FolderProfile.pubxml delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/World.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/ZYHttpServer.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/db.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/fortunes.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/json.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/plaintext.cs delete mode 100644 frameworks/CSharp/zysocket-v/PlatformBenchmarks/queries.cs delete mode 100644 frameworks/CSharp/zysocket-v/README.md delete mode 100644 frameworks/CSharp/zysocket-v/benchmark_config.json delete mode 100644 frameworks/CSharp/zysocket-v/config.toml delete mode 100644 frameworks/CSharp/zysocket-v/zysocket-v.dockerfile diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks.sln b/frameworks/CSharp/zysocket-v/PlatformBenchmarks.sln deleted file mode 100644 index 3879a0a6231..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29230.47 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlatformBenchmarks", "PlatformBenchmarks\PlatformBenchmarks.csproj", "{E4500562-635D-4DB9-99AE-B321F52A7C46}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E4500562-635D-4DB9-99AE-B321F52A7C46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4500562-635D-4DB9-99AE-B321F52A7C46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4500562-635D-4DB9-99AE-B321F52A7C46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4500562-635D-4DB9-99AE-B321F52A7C46}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9FD9812E-E78B-4B9F-8526-8C85458ABA2E} - EndGlobalSection -EndGlobal diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/AsciiString.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/AsciiString.cs deleted file mode 100644 index 054160be587..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/AsciiString.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace PlatformBenchmarks -{ - public readonly struct AsciiString : IEquatable - { - private readonly byte[] _data; - - public AsciiString(string s) => _data = Encoding.ASCII.GetBytes(s); - - public int Length => _data.Length; - - public byte[] Data => _data; - - public ReadOnlySpan AsSpan() => _data; - - public static implicit operator ReadOnlySpan(AsciiString str) => str._data; - public static implicit operator byte[](AsciiString str) => str._data; - - public static implicit operator AsciiString(string str) => new AsciiString(str); - - public static explicit operator string(AsciiString str) => str.ToString(); - - public bool Equals(AsciiString other) => ReferenceEquals(_data, other._data) || SequenceEqual(_data, other._data); - private bool SequenceEqual(byte[] data1, byte[] data2) => new Span(data1).SequenceEqual(data2); - - public static bool operator ==(AsciiString a, AsciiString b) => a.Equals(b); - public static bool operator !=(AsciiString a, AsciiString b) => !a.Equals(b); - public override bool Equals(object other) => (other is AsciiString) && Equals((AsciiString)other); - - public override int GetHashCode() - { - // Copied from x64 version of string.GetLegacyNonRandomizedHashCode() - // https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/String.Comparison.cs - var data = _data; - int hash1 = 5381; - int hash2 = hash1; - foreach (int b in data) - { - hash1 = ((hash1 << 5) + hash1) ^ b; - } - return hash1 + (hash2 * 1566083941); - } - - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/ConcurrentRandom.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/ConcurrentRandom.cs deleted file mode 100644 index a75abc3bb31..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/ConcurrentRandom.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading; - -namespace PlatformBenchmarks -{ - public class ConcurrentRandom - { - private static int nextSeed = 0; - - // Random isn't thread safe - [ThreadStatic] - private static Random _random; - - private static Random Random => _random ?? CreateRandom(); - - [MethodImpl(MethodImplOptions.NoInlining)] - private static Random CreateRandom() - { - _random = new Random(Interlocked.Increment(ref nextSeed)); - return _random; - } - - public int Next(int minValue, int maxValue) - { - return Random.Next(minValue, maxValue); - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/DBRaw.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/DBRaw.cs deleted file mode 100644 index 7af234af557..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/DBRaw.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Text; -using System.Threading.Tasks; - -namespace PlatformBenchmarks -{ - public class RawDb - { - - private readonly ConcurrentRandom _random; - - private readonly DbProviderFactory _dbProviderFactory; - - private readonly string _connectionString; - - public RawDb(ConcurrentRandom random, DbProviderFactory dbProviderFactory) - { - _random = random; - _dbProviderFactory = dbProviderFactory; - _connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; - //_connectionString = "Server=192.168.1.55;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; - OnCreateCommand(); - } - - private void OnCreateCommand() - { - SingleCommand = new Npgsql.NpgsqlCommand(); - SingleCommand.CommandText = "SELECT id, randomnumber FROM world WHERE id = @Id"; - var id = SingleCommand.CreateParameter(); - id.ParameterName = "@Id"; - id.DbType = DbType.Int32; - id.Value = _random.Next(1, 10001); - SingleCommand.Parameters.Add(id); - FortuneCommand = new Npgsql.NpgsqlCommand(); - FortuneCommand.CommandText = "SELECT id, message FROM fortune"; - } - - private DbCommand SingleCommand; - - private DbCommand FortuneCommand; - - public async Task LoadSingleQueryRow() - { - using (var db = _dbProviderFactory.CreateConnection()) - { - db.ConnectionString = _connectionString; - await db.OpenAsync(); - SingleCommand.Connection = db; - SingleCommand.Parameters[0].Value = _random.Next(1, 10001); - return await ReadSingleRow(db, SingleCommand); - - } - } - - async Task ReadSingleRow(DbConnection connection, DbCommand cmd) - { - using (var rdr = await cmd.ExecuteReaderAsync(CommandBehavior.SingleRow)) - { - await rdr.ReadAsync(); - - return new World - { - Id = rdr.GetInt32(0), - RandomNumber = rdr.GetInt32(1) - }; - } - } - - public async Task LoadMultipleQueriesRows(int count) - { - using (var db = _dbProviderFactory.CreateConnection()) - { - db.ConnectionString = _connectionString; - await db.OpenAsync(); - return await LoadMultipleRows(count, db); - } - - } - - private async Task LoadMultipleRows(int count, DbConnection db) - { - SingleCommand.Connection = db; - SingleCommand.Parameters[0].Value = _random.Next(1, 10001); - var result = new World[count]; - for (int i = 0; i < result.Length; i++) - { - result[i] = await ReadSingleRow(db, SingleCommand); - SingleCommand.Parameters[0].Value = _random.Next(1, 10001); - } - return result; - - } - - public async Task> LoadFortunesRows() - { - var result = new List(); - - using (var db = _dbProviderFactory.CreateConnection()) - { - db.ConnectionString = _connectionString; - await db.OpenAsync(); - FortuneCommand.Connection = db; - using (var rdr = await FortuneCommand.ExecuteReaderAsync(CommandBehavior.CloseConnection)) - { - while (await rdr.ReadAsync()) - { - result.Add(new Fortune - { - Id = rdr.GetInt32(0), - Message = rdr.GetString(1) - }); - } - } - } - result.Add(new Fortune { Message = "Additional fortune added at request time." }); - result.Sort(); - return result; - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Fortune.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Fortune.cs deleted file mode 100644 index d970799d5ad..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Fortune.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace PlatformBenchmarks -{ - public class Fortune : IComparable, IComparable - { - public int Id { get; set; } - - public string Message { get; set; } - - public int CompareTo(object obj) - { - return CompareTo((Fortune)obj); - } - - public int CompareTo(Fortune other) - { - // Performance critical, using culture insensitive comparison - return String.CompareOrdinal(Message, other.Message); - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/GMTDate.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/GMTDate.cs deleted file mode 100644 index 8cba0e9ae9c..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/GMTDate.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; - -namespace PlatformBenchmarks -{ - internal class GMTDate - { - private List mWeekBuffers = new List(); - - public List mYears = new List(); - - public List mMoth = new List(); - - public List mNumber = new List(); - - private byte _1 = 58; - - private byte _s = 32; - - private byte _r = 13; - - private byte _n = 10; - - private byte[] GMT = new byte[3] - { - 71, - 77, - 84 - }; - - private static GMTDate mDefault; - - private Timer mUpdateTime; - - public static GMTDate Default - { - get - { - if (mDefault == null) - { - mDefault = new GMTDate(); - mDefault.Init(); - } - return mDefault; - } - } - - public ArraySegment DATE - { - get; - set; - } - - public GMTDate() - { - mWeekBuffers.Add(Encoding.ASCII.GetBytes("Sun")); - mWeekBuffers.Add(Encoding.ASCII.GetBytes("Mon")); - mWeekBuffers.Add(Encoding.ASCII.GetBytes("Tue")); - mWeekBuffers.Add(Encoding.ASCII.GetBytes("Wed")); - mWeekBuffers.Add(Encoding.ASCII.GetBytes("Thu")); - mWeekBuffers.Add(Encoding.ASCII.GetBytes("Fri")); - mWeekBuffers.Add(Encoding.ASCII.GetBytes("Sat")); - for (int j = 1970; j < 2470; j++) - { - mYears.Add(Encoding.ASCII.GetBytes(j.ToString())); - } - for (int i = 0; i <= 100; i++) - { - mNumber.Add(Encoding.ASCII.GetBytes(i.ToString("00"))); - } - mMoth.Add(Encoding.ASCII.GetBytes("Jan")); - mMoth.Add(Encoding.ASCII.GetBytes("Feb")); - mMoth.Add(Encoding.ASCII.GetBytes("Mar")); - mMoth.Add(Encoding.ASCII.GetBytes("Apr")); - mMoth.Add(Encoding.ASCII.GetBytes("May")); - mMoth.Add(Encoding.ASCII.GetBytes("Jun")); - mMoth.Add(Encoding.ASCII.GetBytes("Jul")); - mMoth.Add(Encoding.ASCII.GetBytes("Aug")); - mMoth.Add(Encoding.ASCII.GetBytes("Sep")); - mMoth.Add(Encoding.ASCII.GetBytes("Oct")); - mMoth.Add(Encoding.ASCII.GetBytes("Nov")); - mMoth.Add(Encoding.ASCII.GetBytes("Dec")); - } - - private void Init() - { - DATE = GetData(inLine: true); - mUpdateTime = new Timer(delegate - { - DATE = GetData(inLine: true); - }, null, 1000, 1000); - } - - private ArraySegment GetData(bool inLine = false) - { - return GetData(DateTime.Now, inLine); - } - - private ArraySegment GetData(DateTime date, bool inLine = false) - { - date = date.ToUniversalTime(); - int offset13 = 0; - byte[] GTM_BUFFER = new byte[50]; - Encoding.ASCII.GetBytes("Date: ", 0, 6, GTM_BUFFER, 0); - offset13 = 6; - byte[] buffer = GTM_BUFFER; - byte[] sub8 = mWeekBuffers[(int)date.DayOfWeek]; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = sub8[2]; - offset13++; - buffer[offset13] = 44; - offset13++; - buffer[offset13] = _s; - offset13++; - sub8 = mNumber[date.Day]; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = _s; - offset13++; - sub8 = mMoth[date.Month - 1]; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = sub8[2]; - offset13++; - buffer[offset13] = _s; - offset13++; - sub8 = mYears[date.Year - 1970]; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = sub8[2]; - offset13++; - buffer[offset13] = sub8[3]; - offset13++; - buffer[offset13] = _s; - offset13++; - sub8 = mNumber[date.Hour]; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = _1; - offset13++; - sub8 = mNumber[date.Minute]; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = _1; - offset13++; - sub8 = mNumber[date.Second]; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = _s; - offset13++; - sub8 = GMT; - buffer[offset13] = sub8[0]; - offset13++; - buffer[offset13] = sub8[1]; - offset13++; - buffer[offset13] = sub8[2]; - offset13++; - if (inLine) - { - buffer[offset13] = _r; - offset13++; - buffer[offset13] = _n; - offset13++; - } - return new ArraySegment(GTM_BUFFER, 0, offset13); - } - } - -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpHandler.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpHandler.cs deleted file mode 100644 index e0e11b7f93d..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpHandler.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System; -using System.Buffers; -using System.Text; -using System.Threading.Tasks; -using ZYSocket; -using ZYSocket.FiberStream; - -namespace PlatformBenchmarks -{ - public partial class HttpHandler - { - private static AsciiString _line = new AsciiString("\r\n"); - - private static AsciiString _2line = new AsciiString("\r\n\r\n"); - - private static AsciiString _httpsuccess = new AsciiString("HTTP/1.1 200 OK\r\n"); - - private static readonly AsciiString _headerServer = "Server: zysocket\r\n"; - - private static readonly AsciiString _headerContentLength = "Content-Length: "; - - private static readonly AsciiString _headerContentLengthZero = "Content-Length: 0\r\n"; - - private static readonly AsciiString _headerContentTypeText = "Content-Type: text/plain\r\n"; - - private static readonly AsciiString _headerContentTypeHtml = "Content-Type: text/html; charset=UTF-8\r\n"; - - private static readonly AsciiString _headerContentTypeJson = "Content-Type: application/json\r\n"; - - private static readonly AsciiString _path_Json = "/json"; - - private static readonly AsciiString _path_Db = "/db"; - - private static readonly AsciiString _path_Queries = "/queries"; - - private static readonly AsciiString _path_Plaintext = "/plaintext"; - - private static readonly AsciiString _path_Fortunes = "/fortunes"; - - private static readonly AsciiString _result_plaintext = "Hello, World!"; - - private static readonly byte[] LenData = new byte[10] { 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 }; - - private static byte _Space = 32; - - private static byte _question = 63; - - - public HttpHandler() - { - - } - - public void Default(IFiberRw fiberRw,ref WriteBytes write) - { - write.Write(" zysocket server
      "); - write.Write($"error not found!"); - - var length = write.Stream.Length - fiberRw.UserToken.HttpHandlerPostion; - write.Stream.Position = fiberRw.UserToken.ContentPostion.postion; - write.Write(length.ToString(), false); - write.Flush(); - } - - private async Task OnCompleted(IFiberRw fiberRw, WriteBytes write) - { - Task WSend() - { - var length = write.Stream.Length - fiberRw.UserToken.HttpHandlerPostion; - write.Stream.Position = fiberRw.UserToken.ContentPostion.postion; - write.Write(length.ToString(), false); - write.Flush(false); - return fiberRw.Flush(); - } - - if (fiberRw.UserToken != null) - await await fiberRw.Sync.Ask(WSend); - } - - private int AnalysisUrl(ReadOnlySpan url) - { - for (int i = 0; i < url.Length; i++) - { - if (url[i] == _question) - return i; - } - return -1; - - } - - public async Task Receive(IFiberRw fiberRw, Memory memory_r, WriteBytes write) - { - var data = (await fiberRw.ReadLine(memory_r)); - ReadHander(fiberRw,ref data,ref write); - fiberRw.StreamReadFormat.Position = fiberRw.StreamReadFormat.Length; - } - - - private void ReadHander(IFiberRw fiberRw,ref Memory linedata,ref WriteBytes write) - { - - var token = fiberRw.UserToken; - ReadOnlySpan line = linedata.Span; - ReadOnlySpan url = line; - - int offset2 = 0; - int count = 0; - for (int i = 0; i < line.Length; i++) - { - if (line[i] == _Space) - { - if (count != 0) - { - url = line.Slice(offset2, i - offset2); - break; - } - offset2 = i + 1; - count++; - } - } - - - int queryIndex = AnalysisUrl(url); - ReadOnlySpan queryString = default; - ReadOnlySpan baseUrl; - if (queryIndex > 0) - { - baseUrl = url.Slice(0, queryIndex); - queryString = url.Slice(queryIndex + 1, url.Length - queryIndex - 1); - } - else - { - baseUrl = url; - } - OnWriteHeader(ref write); - - if (baseUrl.Length == _path_Plaintext.Length && baseUrl.StartsWith(_path_Plaintext)) - { - write.Write(_headerContentTypeText.Data, 0, _headerContentTypeText.Length); - OnWriteContentLength(write, token); - Plaintext(fiberRw, write); - } - else if (baseUrl.Length == _path_Json.Length && baseUrl.StartsWith(_path_Json)) - { - write.Write(_headerContentTypeJson.Data, 0, _headerContentTypeJson.Length); - OnWriteContentLength(write, token); - Json(fiberRw, write); - } - else if (baseUrl.Length == _path_Db.Length && baseUrl.StartsWith(_path_Db)) - { - write.Write(_headerContentTypeJson.Data, 0, _headerContentTypeJson.Length); - OnWriteContentLength(write, token); - db(fiberRw, write); - } - else if (baseUrl.Length == _path_Queries.Length && baseUrl.StartsWith(_path_Queries)) - { - write.Write(_headerContentTypeJson.Data, 0, _headerContentTypeJson.Length); - OnWriteContentLength(write, token); - queries(Encoding.ASCII.GetString(queryString),fiberRw, write); - } - else if (baseUrl.Length == _path_Fortunes.Length && baseUrl.StartsWith(_path_Fortunes)) - { - write.Write(_headerContentTypeHtml.Data, 0, _headerContentTypeHtml.Length); - OnWriteContentLength(write, token); - fortunes(fiberRw, write); - } - else - { - write.Write(_headerContentTypeHtml.Data, 0, _headerContentTypeHtml.Length); - OnWriteContentLength(write, token); - Default( fiberRw, ref write); - } - - } - - - private void OnWriteHeader(ref WriteBytes write) - { - write.Write(_httpsuccess.Data, 0, _httpsuccess.Length); - write.Write(_headerServer.Data, 0, _headerServer.Length); - ArraySegment date = GMTDate.Default.DATE; - write.Write(date.Array, date.Offset, date.Count); - } - - - - private void OnWriteContentLength(WriteBytes write, HttpToken token) - { - write.Write(_headerContentLength.Data, 0, _headerContentLength.Length); - token.ContentPostion = write.Allocate(LenData); - write.Write(_2line, 0, 4); - token.HttpHandlerPostion = (int)write.Stream.Position; - } - - - - - - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpToken.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpToken.cs deleted file mode 100644 index a1dff0166e6..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/HttpToken.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace PlatformBenchmarks -{ - public class HttpToken - { - public (int postion, int size) ContentPostion { get; set; } - public long HttpHandlerPostion { get; set; } - public RawDb Db { get; set; } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/JsonMessage.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/JsonMessage.cs deleted file mode 100644 index 5a2e3b27c8e..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/JsonMessage.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace PlatformBenchmarks -{ - public struct JsonMessage - { - public string message - { - get; - set; - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/PlatformBenchmarks.csproj b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/PlatformBenchmarks.csproj deleted file mode 100644 index 90f99f0507b..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/PlatformBenchmarks.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - Exe - netcoreapp3.0 - 8.0 - true - - - - - - - - - - diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Program.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Program.cs deleted file mode 100644 index 3ca384da857..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; - -namespace PlatformBenchmarks -{ - class Program - { - public static void Main(string[] args) - { - new HostBuilder().ConfigureServices(delegate (HostBuilderContext hostContext, IServiceCollection services) - { - services.AddHostedService(); - - }).Build().Run(); - - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Properties/PublishProfiles/FolderProfile.pubxml b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Properties/PublishProfiles/FolderProfile.pubxml deleted file mode 100644 index d0d006df42c..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/Properties/PublishProfiles/FolderProfile.pubxml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - FileSystem - Release - Any CPU - net5.0 - bin\Release\netcoreapp2.2\publish\ - - \ No newline at end of file diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/World.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/World.cs deleted file mode 100644 index 7a0c4567e27..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/World.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - -namespace PlatformBenchmarks -{ - [StructLayout(LayoutKind.Sequential, Size = 8)] - public struct World - { - public int Id { get; set; } - - public int RandomNumber { get; set; } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/ZYHttpServer.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/ZYHttpServer.cs deleted file mode 100644 index ff7fd9ce3cc..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/ZYHttpServer.cs +++ /dev/null @@ -1,85 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using ZYSocket; -using ZYSocket.Server; -using ZYSocket.Server.Builder; - -namespace PlatformBenchmarks -{ - public class ZYHttpServer : IHostedService - { - public ISocketServer SocketServer { get; private set; } - public IServiceProvider serviceProvider { get; private set; } - - public HttpHandler @HttpHandler { get; private set; } - - public ZYHttpServer() - { - ArraySegment date = GMTDate.Default.DATE; - var containerBuilder = new ServiceCollection(); - new SockServBuilder(containerBuilder, p => - { - return new ZYSocketSuper(p) - { - BinaryInput = new BinaryInputHandler(BinaryInputHandler), - Connetions = new ConnectionFilter(ConnectionFilter), - MessageInput = new DisconnectHandler(DisconnectHandler) - }; - }) - .ConfigServer(p => - { - p.Port = 8080; - p.MaxBufferSize = 1024; - p.MaxConnectCout = 20000; - }); - - serviceProvider = containerBuilder.BuildServiceProvider(); - SocketServer = serviceProvider.GetRequiredService(); - @HttpHandler = new HttpHandler(); - } - - - public Task StartAsync(CancellationToken cancellationToken) - { - SocketServer.Start(); - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - SocketServer.Stop(); - return Task.CompletedTask; - } - - bool ConnectionFilter(ISockAsyncEvent socketAsync) => true; - - void DisconnectHandler(string message, ISockAsyncEvent socketAsync, int erorr) - { - socketAsync.UserToken = null; - socketAsync.AcceptSocket.Dispose(); - } - - - async void BinaryInputHandler(ISockAsyncEvent socketAsync) - { - var fiberRw = await socketAsync.GetFiberRw(); - fiberRw.UserToken = new HttpToken - { - Db = new RawDb(new ConcurrentRandom(), Npgsql.NpgsqlFactory.Instance) - }; - - using var data_r = fiberRw.GetMemory(1024); - using var write = new WriteBytes(fiberRw); - for (; ; ) - { - await HttpHandler.Receive(fiberRw, data_r.Memory, write); - } - - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/db.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/db.cs deleted file mode 100644 index 9a2fac87c71..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/db.cs +++ /dev/null @@ -1,29 +0,0 @@ - -using Swifter.Json; -using System; -using System.Threading.Tasks; -using ZYSocket; -using ZYSocket.FiberStream; - -namespace PlatformBenchmarks -{ - public partial class HttpHandler - { - - public async void db(IFiberRw fiberRw, WriteBytes write) - { - try - { - var data = await fiberRw.UserToken.Db.LoadSingleQueryRow(); - await JsonFormatter.SerializeObjectAsync(data, write.Stream, System.Text.Encoding.UTF8); - } - catch (Exception e_) - { - write.Write(e_.Message); - } - - await OnCompleted(fiberRw, write); - - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/fortunes.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/fortunes.cs deleted file mode 100644 index 643ddb541d8..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/fortunes.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Threading.Tasks; -using ZYSocket; -using ZYSocket.FiberStream; - -namespace PlatformBenchmarks -{ - public partial class HttpHandler - { - - private readonly static AsciiString _fortunesTableStart = "Fortunes"; - private readonly static AsciiString _fortunesRowStart = ""; - private readonly static AsciiString _fortunesTableEnd = "
      idmessage
      "; - private readonly static AsciiString _fortunesColumn = ""; - private readonly static AsciiString _fortunesRowEnd = "
      "; - - public async void fortunes(IFiberRw fiberRw, WriteBytes write) - { - - - try - { - var data = await fiberRw.UserToken.Db.LoadFortunesRows(); - - Task WSend() - { - write.Write(_fortunesTableStart.Data, 0, _fortunesTableStart.Length); - foreach (var item in data) - { - write.Write(_fortunesRowStart.Data, 0, _fortunesRowStart.Length); - write.Write(item.Id.ToString(CultureInfo.InvariantCulture),false); - write.Write(_fortunesColumn.Data, 0, _fortunesColumn.Length); - write.Write(System.Web.HttpUtility.HtmlEncode(item.Message),false); - write.Write(_fortunesRowEnd.Data, 0, _fortunesRowEnd.Length); - } - write.Write(_fortunesTableEnd.Data, 0, _fortunesTableEnd.Length); - - var length = write.Stream.Length - fiberRw.UserToken.HttpHandlerPostion; - write.Stream.Position = fiberRw.UserToken.ContentPostion.postion; - write.Write(length.ToString(), false); - write.Flush(false); - return fiberRw.Flush(); - } - if (fiberRw.UserToken != null) - await await fiberRw.Sync.Ask(WSend); - } - catch (Exception e_) - { - write.Write(e_.Message); - await OnCompleted(fiberRw, write); - } - - - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/json.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/json.cs deleted file mode 100644 index ffae41e70b6..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/json.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Swifter.Json; -using System; -using System.Threading.Tasks; -using ZYSocket; -using ZYSocket.FiberStream; - -namespace PlatformBenchmarks -{ - public partial class HttpHandler - { - public async void Json(IFiberRw fiberRw,WriteBytes write) - { - JsonMessage jsonMessage = default(JsonMessage); - jsonMessage.message = "Hello, World!"; - JsonFormatter.SerializeObject(jsonMessage,write.Stream,System.Text.Encoding.UTF8); - var length = write.Stream.Length - fiberRw.UserToken.HttpHandlerPostion; - write.Stream.Position = fiberRw.UserToken.ContentPostion.postion; - write.Write(length.ToString(), false); - await write.Flush(); - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/plaintext.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/plaintext.cs deleted file mode 100644 index 3975047e5b9..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/plaintext.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Threading.Tasks; -using ZYSocket; -using ZYSocket.FiberStream; - -namespace PlatformBenchmarks -{ - public partial class HttpHandler - { - public async void Plaintext( IFiberRw fiberRw, WriteBytes write) - { - write.Write(_result_plaintext.Data, 0, _result_plaintext.Length); - var length = write.Stream.Length - fiberRw.UserToken.HttpHandlerPostion; - write.Stream.Position = fiberRw.UserToken.ContentPostion.postion; - write.Write(length.ToString(), false); - await write.Flush(); - } - } -} diff --git a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/queries.cs b/frameworks/CSharp/zysocket-v/PlatformBenchmarks/queries.cs deleted file mode 100644 index 5d6ed0ee6a6..00000000000 --- a/frameworks/CSharp/zysocket-v/PlatformBenchmarks/queries.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Swifter.Json; -using System; -using ZYSocket; -using ZYSocket.FiberStream; - -namespace PlatformBenchmarks -{ - public partial class HttpHandler - { - public async void queries(string queryString, IFiberRw fiberRw, WriteBytes write) - { - int count = 1; - if (!string.IsNullOrEmpty(queryString)) - { - var values = queryString.Split('='); - if (values.Length > 1) - { - if (int.TryParse(values[1], out int size)) - { - count = size; - } - } - } - if (count > 500) - count = 500; - if (count < 1) - count = 1; - try - { - var data = await fiberRw.UserToken.Db.LoadMultipleQueriesRows(count); - - await JsonFormatter.SerializeObjectAsync(data, write.Stream, System.Text.Encoding.UTF8); - } - catch (Exception e_) - { - write.Write(e_.Message); - } - await OnCompleted(fiberRw, write); - } - } -} diff --git a/frameworks/CSharp/zysocket-v/README.md b/frameworks/CSharp/zysocket-v/README.md deleted file mode 100644 index 967311371e7..00000000000 --- a/frameworks/CSharp/zysocket-v/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# [ZYSOCKET-V](https://github.com/luyikk/zysocket-v)(.Net) Benchmarking Test -This includes tests for plaintext, json, db. - -## Infrastructure Software Versions -**Language** - -* C# 7.2 - -**Platforms** - -* .NET Core (Windows and Linux) - -**Web Servers** - -* [ZYSOCKET-V](https://github.com/luyikk/zysocket-v) - -## Paths & Source for Tests - -* [Plaintext](PlatformBenchmarks/Program.cs): "/plaintext" -* [JSON Serialization](PlatformBenchmarks/Program.cs): "/json" -* [Single query](PlatformBenchmarks/Program.cs): "/db" -* [Multiple query](PlatformBenchmarks/Program.cs): "/queries" -* [Fortune](PlatformBenchmarks/Program.cs): "/fortune" diff --git a/frameworks/CSharp/zysocket-v/benchmark_config.json b/frameworks/CSharp/zysocket-v/benchmark_config.json deleted file mode 100644 index d2d83161b68..00000000000 --- a/frameworks/CSharp/zysocket-v/benchmark_config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "framework": "zysocket-v", - "tests": [ - { - "default": { - "fortune_url": "/fortunes", - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "zysocket-v", - "language": "C#", - "orm": "Raw", - "platform": ".NET", - "flavor": "CoreCLR", - "webserver": "zysocket-v", - "os": "Linux", - "database_os": "Linux", - "display_name": "zysocket-v", - "notes": "", - "versus": "aspcore-mvc" - } - } - ] -} diff --git a/frameworks/CSharp/zysocket-v/config.toml b/frameworks/CSharp/zysocket-v/config.toml deleted file mode 100644 index b21e6a223c6..00000000000 --- a/frameworks/CSharp/zysocket-v/config.toml +++ /dev/null @@ -1,18 +0,0 @@ -[framework] -name = "zysocket-v" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = ".NET" -webserver = "zysocket-v" -versus = "aspcore-mvc" diff --git a/frameworks/CSharp/zysocket-v/zysocket-v.dockerfile b/frameworks/CSharp/zysocket-v/zysocket-v.dockerfile deleted file mode 100644 index 9739314dda6..00000000000 --- a/frameworks/CSharp/zysocket-v/zysocket-v.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build -WORKDIR /app -COPY PlatformBenchmarks . -RUN dotnet publish -c Release -o out - -FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime -ENV COMPlus_ReadyToRun 0 -WORKDIR /app -COPY --from=build /app/out ./ - -EXPOSE 8080 - -ENTRYPOINT ["dotnet", "PlatformBenchmarks.dll"] From 8cd78ddcb443ad0f22786d3f5836d1c4e14cbae7 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:13:28 +0200 Subject: [PATCH 1336/1766] [ruby/rage] Use ActiveRecord 8.0 (#9757) Also commit Gemfile.lock to git. Lock files make test runs more deterministic and predictable. --- frameworks/Ruby/rage/Gemfile | 2 +- frameworks/Ruby/rage/Gemfile.lock | 64 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 frameworks/Ruby/rage/Gemfile.lock diff --git a/frameworks/Ruby/rage/Gemfile b/frameworks/Ruby/rage/Gemfile index 89c3affcb58..ad9ccba5aa8 100644 --- a/frameworks/Ruby/rage/Gemfile +++ b/frameworks/Ruby/rage/Gemfile @@ -3,7 +3,7 @@ source "https://rubygems.org" gem "rage-rb", "~> 1.10" gem "pg", "~> 1.0" -gem "activerecord", "~> 7.2.0", require: "active_record" +gem "activerecord", "~> 8.0.0", require: "active_record" # Build JSON APIs with ease # gem "alba" diff --git a/frameworks/Ruby/rage/Gemfile.lock b/frameworks/Ruby/rage/Gemfile.lock new file mode 100644 index 00000000000..7e698f046f2 --- /dev/null +++ b/frameworks/Ruby/rage/Gemfile.lock @@ -0,0 +1,64 @@ +GEM + remote: https://rubygems.org/ + specs: + activemodel (8.0.2) + activesupport (= 8.0.2) + activerecord (8.0.2) + activemodel (= 8.0.2) + activesupport (= 8.0.2) + timeout (>= 0.4.0) + activesupport (8.0.2) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + base64 (0.2.0) + benchmark (0.4.0) + bigdecimal (3.1.9) + concurrent-ruby (1.3.5) + connection_pool (2.5.0) + drb (2.2.1) + i18n (1.14.7) + concurrent-ruby (~> 1.0) + logger (1.7.0) + minitest (5.25.5) + pg (1.5.9) + rack (2.2.10) + rack-test (2.2.0) + rack (>= 1.3) + rage-iodine (4.0.0) + rage-rb (1.11.0) + rack (~> 2.0) + rack-test (~> 2.1) + rage-iodine (~> 4.0) + rake (>= 12.0) + thor (~> 1.0) + zeitwerk (~> 2.6) + rake (13.2.1) + securerandom (0.4.1) + thor (1.3.2) + timeout (0.4.3) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + uri (1.0.3) + zeitwerk (2.7.1) + +PLATFORMS + ruby + x86_64-darwin-23 + +DEPENDENCIES + activerecord (~> 8.0.0) + pg (~> 1.0) + rage-rb (~> 1.10) + +BUNDLED WITH + 2.6.2 From 3e18e52f00fa6550f2134dc65a06a0435c433fb4 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:13:55 +0200 Subject: [PATCH 1337/1766] [ruby/rage-sequel] Get ids outside of database connection (#9758) +-----------+----------------------------+-----+ | name| branch_name|query| +-----------+----------------------------+-----+ |rage-sequel| master|40616| |rage-sequel| rage/ids-outside-connection|41392| --- .../rage-sequel/app/controllers/benchmarks_controller.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb b/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb index 082905ccda8..4765293093d 100644 --- a/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb +++ b/frameworks/Ruby/rage-sequel/app/controllers/benchmarks_controller.rb @@ -13,8 +13,9 @@ def db end def queries + ids = requested_ids worlds = DB.synchronize do - requested_ids.map do |id| + ids.map do |id| World.with_pk(id) end end @@ -34,9 +35,10 @@ def fortunes def updates worlds = nil + ids = requested_ids DB.synchronize do - worlds = requested_ids.map do |id| + worlds = ids.map do |id| world = World.with_pk(id) new_value = random_id new_value = random_id while new_value == world.randomnumber From c7d7c58e69c0bf1824ad8185651f9a79aa433137 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:14:12 +0200 Subject: [PATCH 1338/1766] [ruby/roda-sequel] Use an instance variable for Fortunes (#9759) It seems 00416748fb572cfc20acba63d762d5565b315bae slowed things down instead. This reverts those template changes. --- frameworks/Ruby/roda-sequel/hello_world.rb | 10 +++++----- frameworks/Ruby/roda-sequel/views/fortunes.erb | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/hello_world.rb b/frameworks/Ruby/roda-sequel/hello_world.rb index 10d1a653035..a3da529b8d2 100644 --- a/frameworks/Ruby/roda-sequel/hello_world.rb +++ b/frameworks/Ruby/roda-sequel/hello_world.rb @@ -3,7 +3,7 @@ # Our Rack application to be executed by rackup class HelloWorld < Roda plugin :hooks - plugin :render, escape: true, assume_fixed_locals: true, template_opts: { extract_fixed_locals: true}, layout_opts: { cache_key: "default_layout" } + plugin :render, escape: true, layout_opts: { cache_key: "default_layout" } def bounded_queries queries = request.params["queries"].to_i @@ -57,13 +57,13 @@ def set_default_headers(response) # Test type 4: Fortunes r.is "fortunes" do response[CONTENT_TYPE] = HTML_TYPE - fortunes = Fortune.all - fortunes << Fortune.new( + @fortunes = Fortune.all + @fortunes << Fortune.new( id: 0, message: "Additional fortune added at request time." ) - fortunes.sort_by!(&:message) - view :fortunes, locals: { fortunes: fortunes } + @fortunes.sort_by!(&:message) + view :fortunes end # Test type 5: Database updates diff --git a/frameworks/Ruby/roda-sequel/views/fortunes.erb b/frameworks/Ruby/roda-sequel/views/fortunes.erb index 6b1f763da43..e3dbcf66239 100644 --- a/frameworks/Ruby/roda-sequel/views/fortunes.erb +++ b/frameworks/Ruby/roda-sequel/views/fortunes.erb @@ -3,7 +3,7 @@ id message -<% fortunes.each do |fortune| %> +<% @fortunes.each do |fortune| %> <%= fortune.id %> <%= fortune.message %> From a85fdb31327c44d0126387c0e5c1e517ae8b794a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:14:32 +0200 Subject: [PATCH 1339/1766] [C++/ulib] Remove ULib (#9760) It seems ULib isn't running anymore in the tests as all tests are tagged as broken. The framework also has been updated in 5 years: https://github.com/stefanocasazza/ULib --- frameworks/C++/ulib/README.md | 134 ------- frameworks/C++/ulib/benchmark_config.json | 160 -------- frameworks/C++/ulib/config.toml | 108 ----- frameworks/C++/ulib/src/cached_worlds.usp | 56 --- frameworks/C++/ulib/src/db.usp | 45 --- frameworks/C++/ulib/src/edb.usp | 14 - frameworks/C++/ulib/src/equery.usp | 14 - frameworks/C++/ulib/src/eupdate.usp | 28 -- frameworks/C++/ulib/src/fortune.h | 316 --------------- frameworks/C++/ulib/src/fortune.usp | 67 ---- frameworks/C++/ulib/src/fortuneNoSql.h | 115 ------ frameworks/C++/ulib/src/json.usp | 52 --- frameworks/C++/ulib/src/libFortune.cxx | 14 - frameworks/C++/ulib/src/libFortuneNoSql.cxx | 8 - frameworks/C++/ulib/src/libWorld.cxx | 17 - frameworks/C++/ulib/src/libWorldNoSql.cxx | 16 - frameworks/C++/ulib/src/mdb.usp | 14 - frameworks/C++/ulib/src/mfortune.usp | 14 - frameworks/C++/ulib/src/mquery.usp | 14 - frameworks/C++/ulib/src/mupdate.usp | 14 - frameworks/C++/ulib/src/plaintext.usp | 30 -- frameworks/C++/ulib/src/query.usp | 62 --- frameworks/C++/ulib/src/rdb.usp | 14 - frameworks/C++/ulib/src/rfortune.usp | 14 - frameworks/C++/ulib/src/rquery.usp | 14 - frameworks/C++/ulib/src/rupdate.usp | 14 - frameworks/C++/ulib/src/update.usp | 99 ----- frameworks/C++/ulib/src/world.h | 368 ------------------ frameworks/C++/ulib/src/worldNoSql.h | 270 ------------- frameworks/C++/ulib/ulib-json.dockerfile | 82 ---- frameworks/C++/ulib/ulib-json_fit.dockerfile | 82 ---- frameworks/C++/ulib/ulib-mongodb.dockerfile | 91 ----- frameworks/C++/ulib/ulib-mysql.dockerfile | 87 ----- .../C++/ulib/ulib-plaintext_fit.dockerfile | 82 ---- frameworks/C++/ulib/ulib-postgres.dockerfile | 87 ----- .../C++/ulib/ulib-postgres_fit.dockerfile | 87 ----- frameworks/C++/ulib/ulib.dockerfile | 82 ---- 37 files changed, 2785 deletions(-) delete mode 100644 frameworks/C++/ulib/README.md delete mode 100644 frameworks/C++/ulib/benchmark_config.json delete mode 100644 frameworks/C++/ulib/config.toml delete mode 100644 frameworks/C++/ulib/src/cached_worlds.usp delete mode 100644 frameworks/C++/ulib/src/db.usp delete mode 100644 frameworks/C++/ulib/src/edb.usp delete mode 100644 frameworks/C++/ulib/src/equery.usp delete mode 100644 frameworks/C++/ulib/src/eupdate.usp delete mode 100644 frameworks/C++/ulib/src/fortune.h delete mode 100644 frameworks/C++/ulib/src/fortune.usp delete mode 100644 frameworks/C++/ulib/src/fortuneNoSql.h delete mode 100644 frameworks/C++/ulib/src/json.usp delete mode 100644 frameworks/C++/ulib/src/libFortune.cxx delete mode 100644 frameworks/C++/ulib/src/libFortuneNoSql.cxx delete mode 100644 frameworks/C++/ulib/src/libWorld.cxx delete mode 100644 frameworks/C++/ulib/src/libWorldNoSql.cxx delete mode 100644 frameworks/C++/ulib/src/mdb.usp delete mode 100644 frameworks/C++/ulib/src/mfortune.usp delete mode 100644 frameworks/C++/ulib/src/mquery.usp delete mode 100644 frameworks/C++/ulib/src/mupdate.usp delete mode 100644 frameworks/C++/ulib/src/plaintext.usp delete mode 100644 frameworks/C++/ulib/src/query.usp delete mode 100644 frameworks/C++/ulib/src/rdb.usp delete mode 100644 frameworks/C++/ulib/src/rfortune.usp delete mode 100644 frameworks/C++/ulib/src/rquery.usp delete mode 100644 frameworks/C++/ulib/src/rupdate.usp delete mode 100644 frameworks/C++/ulib/src/update.usp delete mode 100644 frameworks/C++/ulib/src/world.h delete mode 100644 frameworks/C++/ulib/src/worldNoSql.h delete mode 100644 frameworks/C++/ulib/ulib-json.dockerfile delete mode 100644 frameworks/C++/ulib/ulib-json_fit.dockerfile delete mode 100644 frameworks/C++/ulib/ulib-mongodb.dockerfile delete mode 100644 frameworks/C++/ulib/ulib-mysql.dockerfile delete mode 100644 frameworks/C++/ulib/ulib-plaintext_fit.dockerfile delete mode 100644 frameworks/C++/ulib/ulib-postgres.dockerfile delete mode 100644 frameworks/C++/ulib/ulib-postgres_fit.dockerfile delete mode 100644 frameworks/C++/ulib/ulib.dockerfile diff --git a/frameworks/C++/ulib/README.md b/frameworks/C++/ulib/README.md deleted file mode 100644 index 6fc50e63b7f..00000000000 --- a/frameworks/C++/ulib/README.md +++ /dev/null @@ -1,134 +0,0 @@ -#ULib Benchmarking Test - -This is the [ULib](http://stefanocasazza.github.io/ULib/) portion of a [benchmarking test suite](https://github.com/TechEmpower/FrameworkBenchmarks) comparing a variety of web development platforms. - -### JSON Encoding Test - -* [JSON test source](src/json.usp) - -### Data-Store/Database Mapping Test - -* [Database test source (SQL)](src/db.usp) -* [Database test source (REDIS)](src/rdb.usp) -* [Database test source (MONGODB)](src/mdb.usp) -* [Database test source (ELASTICSEARCH)](src/edb.usp) - -### Variable Query Test - -* [Variable Query test source (SQL)](src/query.usp) -* [Variable Query test source (REDIS)](src/rquery.usp) -* [Variable Query test source (MONGODB)](src/mquery.usp) -* [Variable Query test source (ELASTICSEARCH)](src/equery.usp) - -### Variable Query (caching) Test - -* [Variable Query caching test source (SQL)](src/cached_worlds.usp) - -### Fortune Query Test - -* [Fortune Query test source (SQL)](src/fortune.usp) -* [Fortune Query test source (REDIS)](src/rfortune.usp) -* [Fortune Query test source (MONGODB)](src/mfortune.usp) - -### Variable Query (update) Test - -* [Variable Query (update) test source (SQL)](src/update.usp) -* [Variable Query (update) test source (REDIS)](src/rupdate.usp) -* [Variable Query (update) test source (MONGODB)](src/mupdate.usp) -* [Variable Query (update) test source (ELASTICSEARCH)](src/eupdate.usp) - -### Plaintext Test - -* [Plaintext test source](src/plaintext.usp) - -## Infrastructure Software Versions -The tests were run with: - -* [ULib Version 2.4.2](https://github.com/stefanocasazza/ULib/archive/v2.4.2.tar.gz) - -Output -====== - -[/json](http://www.techempower.com/benchmarks/#section=json) ------ -``` -HTTP/1.1 200 OK -Date: Thu, 03 Jul 2014 10:11:10 GMT -Server: ULib -Content-Length: 27 -Content-Type: application/json - -{"message":"Hello, World!"} -``` - -[/db](http://www.techempower.com/benchmarks/#section=db) ---- -``` -HTTP/1.1 200 OK -Date: Thu, 03 Jul 2014 10:14:51 GMT -Server: ULib -Content-Length: 31 -Content-Type: application/json - -{"id":6227,"randomNumber":8489} -``` - -[/query?queries=10](http://www.techempower.com/benchmarks/#section=query) -------------------- -``` -HTTP/1.1 200 OK -Date: Thu, 03 Jul 2014 10:14:51 GMT -Server: ULib -Content-Length: 320 -Content-Type: application/json - -[{"id":6851,"randomNumber":7598},{"id":3968,"randomNumber":7325},{"id":8159,"randomNumber":348},{"id":9560,"randomNumber":7333},{"id":9938,"randomNumber":9080},{"id":1598,"randomNumber":1623},{"id":3280,"randomNumber":8707},{"id":4521,"randomNumber":6063},{"id":8173,"randomNumber":3690},{"id":3648,"randomNumber":8803}] -``` - -[/cached_worlds?queries=10](http://www.techempower.com/benchmarks/#section=caching) -------------------- -``` -HTTP/1.1 200 OK -Date: Thu, 03 Jul 2014 10:14:51 GMT -Server: ULib -Content-Length: 320 -Content-Type: application/json - -[{"id":6851,"randomNumber":7598},{"id":3968,"randomNumber":7325},{"id":8159,"randomNumber":348},{"id":9560,"randomNumber":7333},{"id":9938,"randomNumber":9080},{"id":1598,"randomNumber":1623},{"id":3280,"randomNumber":8707},{"id":4521,"randomNumber":6063},{"id":8173,"randomNumber":3690},{"id":3648,"randomNumber":8803}] -``` - -[/fortune](http://www.techempower.com/benchmarks/#section=fortune) ---------- -``` -HTTP/1.1 200 OK -Date: Thu, 03 Jul 2014 10:14:51 GMT -Server: ULib -Content-Type: text/html; charset=UTF-8 -Content-Length: 1227 - -Fortunes
      idmessage
      11<script>alert("This should not be displayed in a browser alert box.");</script>
      4A bad random number generator: 1, 1, 1, 1, 1, 4.33e+67, 1, 1, 1
      5A computer program does what you tell it to do, not what you want it to do.
      2A computer scientist is someone who fixes things that aren't broken.
      8A list is only as strong as its weakest link. — Donald Knuth
      0Additional fortune added at request time.
      3After enough decimal places, nobody gives a damn.
      7Any program that runs right is obsolete.
      10Computers make very fast, very accurate mistakes.
      6Emacs is a nice operating system, but I prefer UNIX. — Tom Christaensen
      9Feature: A bug with seniority.
      1fortune: No such file or directory
      12フレームワークのベンチマーク
      -``` - -[/update?queries=10](http://www.techempower.com/benchmarks/#section=update) -------------------- -``` -HTTP/1.1 200 OK -Date: Thu, 03 Jul 2014 10:14:51 GMT -Server: ULib -Content-Length: 319 -Content-Type: application/json - -[{"id":7171,"randomNumber":351},{"id":6019,"randomNumber":9725},{"id":8118,"randomNumber":4023},{"id":7965,"randomNumber":1388},{"id":7797,"randomNumber":2249},{"id":112,"randomNumber":1108},{"id":6127,"randomNumber":4323},{"id":2597,"randomNumber":7509},{"id":2978,"randomNumber":7883},{"id":1111,"randomNumber":2228}] -``` - -[/plaintext](http://www.techempower.com/benchmarks/#section=plaintext) ----------- -``` -HTTP/1.1 200 OK -Date: Thu, 03 Jul 2014 10:14:51 GMT -Server: ULib -Content-Type: text/plain -Content-Length: 13 - -Hello, World! -``` diff --git a/frameworks/C++/ulib/benchmark_config.json b/frameworks/C++/ulib/benchmark_config.json deleted file mode 100644 index 86e4e513f40..00000000000 --- a/frameworks/C++/ulib/benchmark_config.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "framework": "ulib", - "tests": [{ - "default": { - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib", - "notes": "", - "versus": "", - "tags": ["broken"] - }, - "plaintext_fit": { - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib-fit", - "notes": "", - "versus": "", - "tags": ["broken"] - }, - "json": { - "json_url": "/json", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib", - "notes": "", - "versus": "", - "tags": ["broken"] - }, - "json_fit": { - "json_url": "/json", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib-fit", - "notes": "", - "versus": "", - "tags": ["broken"] - }, - "mysql": { - "db_url": "/db", - "query_url": "/query?queries=", - "fortune_url": "/fortune", - "cached_query_url": "/cached_worlds?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "MySQL", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib-mysql", - "notes": "", - "versus": "", - "tags": ["broken"] - }, - "postgres": { - "db_url": "/db", - "fortune_url": "/fortune", - "update_url": "/update?queries=", - "cached_query_url": "/cached_worlds?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib-postgres", - "notes": "", - "versus": "", - "tags": ["broken"] - }, - "postgres_fit": { - "db_url": "/db", - "fortune_url": "/fortune", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib-fit", - "notes": "", - "versus": "", - "tags": ["broken"] - }, - "mongodb": { - "setup_file": "setup_mongodb", - "db_url": "/mdb", - "query_url": "/mquery?queries=", - "fortune_url": "/mfortune", - "update_url": "/mupdate?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "MongoDB", - "framework": "None", - "language": "C++", - "orm": "Micro", - "platform": "None", - "webserver": "ULib", - "os": "Linux", - "database_os": "Linux", - "display_name": "ULib-mongodb", - "notes": "", - "versus": "", - "tags": ["broken"] - } - }] -} diff --git a/frameworks/C++/ulib/config.toml b/frameworks/C++/ulib/config.toml deleted file mode 100644 index 4288ea05d7d..00000000000 --- a/frameworks/C++/ulib/config.toml +++ /dev/null @@ -1,108 +0,0 @@ -[framework] -name = "ulib" - -[plaintext_fit] -urls.plaintext = "/plaintext" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" - -[postgres] -urls.db = "/db" -urls.update = "/update?queries=" -urls.fortune = "/fortune" -urls.cached_query = "/cached_worlds?queries=" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" - -[main] -urls.plaintext = "/plaintext" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" - -[mongodb] -urls.db = "/mdb" -urls.query = "/mquery?queries=" -urls.update = "/mupdate?queries=" -urls.fortune = "/mfortune" -approach = "Realistic" -classification = "Platform" -database = "MongoDB" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" - -[json_fit] -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" - -[postgres_fit] -urls.db = "/db" -urls.fortune = "/fortune" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" - -[json] -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" - -[mysql] -urls.db = "/db" -urls.query = "/query?queries=" -urls.fortune = "/fortune" -urls.cached_query = "/cached_worlds?queries=" -approach = "Realistic" -classification = "Platform" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "ULib" -versus = "" diff --git a/frameworks/C++/ulib/src/cached_worlds.usp b/frameworks/C++/ulib/src/cached_worlds.usp deleted file mode 100644 index aa9025ba32a..00000000000 --- a/frameworks/C++/ulib/src/cached_worlds.usp +++ /dev/null @@ -1,56 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/db.usp b/frameworks/C++/ulib/src/db.usp deleted file mode 100644 index f1f8f9d2abe..00000000000 --- a/frameworks/C++/ulib/src/db.usp +++ /dev/null @@ -1,45 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/edb.usp b/frameworks/C++/ulib/src/edb.usp deleted file mode 100644 index 5e87c864293..00000000000 --- a/frameworks/C++/ulib/src/edb.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/equery.usp b/frameworks/C++/ulib/src/equery.usp deleted file mode 100644 index f05bcfbfebc..00000000000 --- a/frameworks/C++/ulib/src/equery.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/eupdate.usp b/frameworks/C++/ulib/src/eupdate.usp deleted file mode 100644 index 483fd82c825..00000000000 --- a/frameworks/C++/ulib/src/eupdate.usp +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/fortune.h b/frameworks/C++/ulib/src/fortune.h deleted file mode 100644 index af237428531..00000000000 --- a/frameworks/C++/ulib/src/fortune.h +++ /dev/null @@ -1,316 +0,0 @@ -// fortune.h - -#ifndef FORTUNE_H -#define FORTUNE_H 1 - -#include -#include -#include -#include -#include -#include - -#ifdef U_STATIC_ORM_DRIVER_PGSQL -# include -# include -#endif - -class U_EXPORT Fortune { -public: - uint32_t id; - UString message; - - Fortune(uint32_t _id) : id(_id), message(101U) - { - U_TRACE_CTOR(5, Fortune, "%u", _id) - } - - Fortune(uint32_t _id, const UString& _message) : id(_id), message(_message) - { - U_TRACE_CTOR(5, Fortune, "%u,%V", _id, _message.rep) - } - - Fortune(const Fortune& f) : id(f.id), message(f.message) - { - U_TRACE_CTOR(5, Fortune, "%p", &f) - } - - ~Fortune() - { - U_TRACE_DTOR(5, Fortune) - } - - // SERVICE - - bool operator<(const Fortune& other) const { return cmp_obj(&message, &other.message); } - - static int cmp_obj(const void* a, const void* b) - { - U_TRACE(5, "Fortune::cmp_obj(%p,%p)", a, b) - -# ifdef U_STDCPP_ENABLE - /** - * The comparison function must follow a strict-weak-ordering - * - * 1) For all x, it is not the case that x < x (irreflexivity) - * 2) For all x, y, if x < y then it is not the case that y < x (asymmetry) - * 3) For all x, y, and z, if x < y and y < z then x < z (transitivity) - * 4) For all x, y, and z, if x is incomparable with y, and y is incomparable with z, then x is incomparable with z (transitivity of incomparability) - */ - - return (((const Fortune*)a)->message.compare(((const Fortune*)b)->message) < 0); -# else - return (*(const Fortune**)a)->message.compare((*(const Fortune**)b)->message); -# endif - } - - // JSON - - void toJSON(UString& json) - { - U_TRACE(5, "Fortune::toJSON(%V)", json.rep) - - json.toJSON(U_JSON_METHOD_HANDLER(id, unsigned int)); - json.toJSON(U_JSON_METHOD_HANDLER(message, UString)); - } - - void fromJSON(UValue& json) - { - U_TRACE(5, "Fortune::fromJSON(%p)", &json) - - json.fromJSON(U_JSON_METHOD_HANDLER(id, unsigned int)); - json.fromJSON(U_JSON_METHOD_HANDLER(message, UString)); - } - - // ORM - - void bindParam(UOrmStatement* stmt) - { - U_TRACE(5, "Fortune::bindParam(%p)", stmt) - - stmt->bindParam(U_ORM_TYPE_HANDLER(id, unsigned int)); - stmt->bindParam(U_ORM_TYPE_HANDLER(message, UString)); - } - - void bindResult(UOrmStatement* stmt) - { - U_TRACE(5, "Fortune::bindResult(%p)", stmt) - - stmt->bindResult(U_ORM_TYPE_HANDLER(id, unsigned int)); - stmt->bindResult(U_ORM_TYPE_HANDLER(message, UString)); - } - - static uint32_t uid; - static char* pwbuffer; - static UString* pmessage; - static UVector* pvfortune; - - static UOrmSession* psql_fortune; - static UOrmStatement* pstmt_fortune; - -#ifdef U_STATIC_ORM_DRIVER_PGSQL - static PGconn* conn; - static UPgSqlStatement* pstmt; - - static void sendQueryPrepared() - { - U_TRACE_NO_PARAM(5, "Fortune::sendQueryPrepared()") - - (void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 0, 0, 0, 0, 1); - } -#endif - - static void replace(uint32_t i, uint32_t _id, const char* msg, uint32_t len) - { - U_TRACE(5, "Fortune::replace(%u,%u,%.*S,%u)", i, _id, len, msg, len) - - U_INTERNAL_ASSERT_POINTER(pvfortune) - - Fortune* elem = pvfortune->at(i); - - elem->id = _id; - - UXMLEscape::encode(msg, len, elem->message); - } - - static void replace(uint32_t i) { replace(i, uid, U_STRING_TO_PARAM(*pmessage)); } - static void replace(uint32_t i, uint32_t _id) { replace(i, _id, U_STRING_TO_PARAM(*pmessage)); } - static void replace(uint32_t i, const UString& message) { replace(i, i+1, U_STRING_TO_PARAM(message)); } - static void replace(uint32_t i, uint32_t _id, const UString& message) { replace(i, _id, U_STRING_TO_PARAM(message)); } - - static void initQuery() - { - U_TRACE_NO_PARAM(5, "::initQuery()") - - char* ptr = UClientImage_Base::wbuffer->data(); - - U_INTERNAL_DUMP("wbuffer(%u) = %#.10S", UClientImage_Base::wbuffer->size(), ptr) - - if (u_get_unalignedp64(ptr+48) != U_MULTICHAR_CONSTANT64('h','a','r','s','e','t','=','U')) - { - u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-')); - u_put_unalignedp64(ptr+8, U_MULTICHAR_CONSTANT64('L','e','n','g','t','h',':',' ')); - u_put_unalignedp64(ptr+16, U_MULTICHAR_CONSTANT64('x','x','x','x','x','x','x','x')); - u_put_unalignedp64(ptr+24, U_MULTICHAR_CONSTANT64('\r','\n','C','o','n','t','e','n')); - u_put_unalignedp64(ptr+32, U_MULTICHAR_CONSTANT64('t','-','T','y','p','e',':',' ')); - u_put_unalignedp64(ptr+40, U_MULTICHAR_CONSTANT64('t','e','x','t','/','h','t','m')); - u_put_unalignedp64(ptr+48, U_MULTICHAR_CONSTANT64('l',';',' ','c','h','a','r','s')); - u_put_unalignedp64(ptr+56, U_MULTICHAR_CONSTANT64('e','t','=','U','T','F','-','8')); - u_put_unalignedp64(ptr+64, U_MULTICHAR_CONSTANT64('\r','\n','\r','\n','<','!','d','o')); - u_put_unalignedp64(ptr+72, U_MULTICHAR_CONSTANT64('c','t','y','p','e',' ','h','t')); - u_put_unalignedp64(ptr+80, U_MULTICHAR_CONSTANT64('m','l','>','<','h','t','m','l')); - u_put_unalignedp64(ptr+88, U_MULTICHAR_CONSTANT64('>','<','h','e','a','d','>','<')); - u_put_unalignedp64(ptr+96, U_MULTICHAR_CONSTANT64('t','i','t','l','e','>','F','o')); - u_put_unalignedp64(ptr+104, U_MULTICHAR_CONSTANT64('r','t','u','n','e','s','<','/')); - u_put_unalignedp64(ptr+112, U_MULTICHAR_CONSTANT64('t','i','t','l','e','>','<','/')); - u_put_unalignedp64(ptr+120, U_MULTICHAR_CONSTANT64('h','e','a','d','>','<','b','o')); - u_put_unalignedp64(ptr+128, U_MULTICHAR_CONSTANT64('d','y','>','<','t','a','b','l')); - u_put_unalignedp64(ptr+136, U_MULTICHAR_CONSTANT64('e','>','<','t','r','>','<','t')); - u_put_unalignedp64(ptr+144, U_MULTICHAR_CONSTANT64('h','>','i','d','<','/','t','h')); - u_put_unalignedp64(ptr+152, U_MULTICHAR_CONSTANT64('>','<','t','h','>','m','e','s')); - u_put_unalignedp64(ptr+160, U_MULTICHAR_CONSTANT64('s','a','g','e','<','/','t','h')); - u_put_unalignedp64(ptr+168, U_MULTICHAR_CONSTANT64('>','<','/','t','r','>','\0','\0')); - - pwbuffer = ptr + U_CONSTANT_SIZE("Content-Length: xxxxxxxx\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n" - "Fortunes"); - } - - U_INTERNAL_ASSERT_EQUALS(u_get_unalignedp64(UClientImage_Base::wbuffer->data()), U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-')) - } - - static void endQuery() - { - U_TRACE_NO_PARAM(5, "::endQuery()") - - U_INTERNAL_ASSERT_POINTER(pvfortune) - - Fortune* elem = pvfortune->last(); - - elem->id = 0; - elem->message.rep->replace(U_CONSTANT_TO_PARAM("Additional fortune added at request time.")); - - pvfortune->sort(Fortune::cmp_obj); - - char* ptr = pwbuffer; - uint32_t content_length = U_CONSTANT_SIZE("Fortunes
      idmessage
      "); - - for (uint32_t sz, i = 0, n = pvfortune->size(); i < n; ++i) - { - elem = pvfortune->at(i); - - u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64('<','t','r','>','<','t','d','>')); - - ptr = u_num2str32(elem->id, ptr+8); - - u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64('<','/','t','d','>','<','t','d')); - ptr += 8; - - *ptr++ = '>'; - - (void) memcpy(ptr, elem->message.data(), sz = elem->message.size()); - ptr += sz; - - u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64('<','/','t','d','>','<','/','t')); - u_put_unalignedp16(ptr+8, U_MULTICHAR_CONSTANT16('r','>')); - ptr += 8+2; - } - - u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64('<','/','t','a','b','l','e','>')); - u_put_unalignedp64(ptr+8, U_MULTICHAR_CONSTANT64('<','/','b','o','d','y','>','<')); - u_put_unalignedp64(ptr+16, U_MULTICHAR_CONSTANT64('/','h','t','m','l','>','\0','\0')); - - content_length += (ptr - pwbuffer) + U_CONSTANT_SIZE("
      idmessage
      "); - - ptr = pwbuffer - U_CONSTANT_SIZE("xxxxxxxx\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n" - "Fortunes"); - - u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64(' ',' ',' ',' ',' ',' ',' ',' ')); - - (void) u_num2str32(content_length, ptr); - - UClientImage_Base::wbuffer->size_adjust_constant(U_CONSTANT_SIZE("Content-Length: xxxxxxxx\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n") + content_length); - } - - static void doQuery(vPF handlerQuery) - { - U_TRACE(5, "Fortune::doQuery(%p)", handlerQuery) - - initQuery(); - handlerQuery(); - endQuery(); - } - - static void handlerInitSql() - { - U_TRACE_NO_PARAM(5, "Fortune::handlerInitSql()") - -# ifdef U_STATIC_ORM_DRIVER_PGSQL - U_INTERNAL_DUMP("UServer_Base::handler_db2 = %p", UServer_Base::handler_db2) - - if (UServer_Base::handler_db2 == U_NULLPTR) UServer_Base::handler_db2 = new UEventDB(); -# endif - } - - static void handlerFork() - { - U_TRACE_NO_PARAM(5, "Fortune::handlerFork()") - - pmessage = new UString(101U); - - pvfortune = new UVector(); - - Fortune* elem; - - for (uint32_t i = 0; i < 13; ++i) - { - elem = new Fortune(i+1); - - pvfortune->push(elem); - } - } - - static void handlerForkSql() - { - U_TRACE_NO_PARAM(5, "Fortune::handlerForkSql()") - - if (psql_fortune == U_NULLPTR) - { - psql_fortune = new UOrmSession(U_CONSTANT_TO_PARAM("fortune")); - - if (psql_fortune->isReady() == false) - { - U_WARNING("Fortune::handlerForkSql(): we cound't connect to db"); - - U_DELETE(psql_fortune) - - psql_fortune = U_NULLPTR; - - return; - } - - pstmt_fortune = new UOrmStatement(*psql_fortune, U_CONSTANT_TO_PARAM("SELECT id, message FROM Fortune")); - - handlerFork(); - - pstmt_fortune->into(uid, *pmessage); - -# ifdef U_STATIC_ORM_DRIVER_PGSQL - if (UOrmDriver::isPGSQL()) - { - UOrmDriverPgSql* pdrv = (UOrmDriverPgSql*)psql_fortune->getDriver(); - - conn = (PGconn*)pdrv->UOrmDriver::connection; - pstmt = (UPgSqlStatement*)pstmt_fortune->getStatement(); - - pstmt->prepareStatement(pdrv); - - UServer_Base::handler_db2->setConnection(conn); - } -# endif - } - } - -private: - U_DISALLOW_ASSIGN(Fortune) -}; -#endif diff --git a/frameworks/C++/ulib/src/fortune.usp b/frameworks/C++/ulib/src/fortune.usp deleted file mode 100644 index 038402a2585..00000000000 --- a/frameworks/C++/ulib/src/fortune.usp +++ /dev/null @@ -1,67 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/fortuneNoSql.h b/frameworks/C++/ulib/src/fortuneNoSql.h deleted file mode 100644 index 880304e011e..00000000000 --- a/frameworks/C++/ulib/src/fortuneNoSql.h +++ /dev/null @@ -1,115 +0,0 @@ -// fortuneNoSql.h - -#ifndef FORTUNE_NO_SQL_H -#define FORTUNE_NO_SQL_H 1 - -#include "fortune.h" - -#include -#include - -#ifdef USE_MONGODB -# include -#endif - -class U_EXPORT FortuneNoSql { -public: - -#ifdef USE_MONGODB - static UMongoDBClient* mc; -#endif - - static void handlerQueryMongoDB() - { - U_TRACE(5, "FortuneNoSql::handlerQueryMongoDB()") - - U_INTERNAL_ASSERT_POINTER(Fortune::pmessage) - -# ifdef USE_MONGODB - (void) mc->findAll(); - - for (uint32_t i = 0, n = mc->vitem.size(); i < n; ++i) - { - (void) U_JFIND(mc->vitem[i], "message", *Fortune::pmessage); - - Fortune::replace(i, i+1); - - Fortune::pmessage->clear(); - } -# endif - } - - static void handlerForkMongoDB() - { - U_TRACE_NO_PARAM(5, "FortuneNoSql::handlerForkMongoDB()") - -# ifdef USE_MONGODB - if (mc == U_NULLPTR) - { - U_NEW(UMongoDBClient, mc, UMongoDBClient); - - if (mc->connect(U_NULLPTR, 0) == false) - { - U_WARNING("FortuneNoSql::handlerForkMongoDB(): connection failed"); - - U_DELETE(mc) - - mc = U_NULLPTR; - - return; - } - - if (mc->selectCollection("hello_world", "fortune") == false) - { - U_WARNING("FortuneNoSql::handlerForkMongoDB(): selectCollection() failed"); - - U_DELETE(mc) - - mc = U_NULLPTR; - - return; - } - - Fortune::handlerFork(); - } -# endif - } - - static UREDISClient_Base* rc; - - static void handlerQueryREDIS() - { - U_TRACE(5, "FortuneNoSql::handlerQueryREDIS()") - - (void) rc->lrange(U_CONSTANT_TO_PARAM("fortunes 0 -1")); - - for (uint32_t i = 0, n = rc->vitem.size(); i < n; ++i) Fortune::replace(i, rc->vitem[i]); - } - - static void handlerForkREDIS() - { - U_TRACE_NO_PARAM(5, "Fortune::handlerForkREDIS()") - - if (rc == U_NULLPTR) - { - U_NEW(UREDISClient, rc, UREDISClient); - - if (rc->connect() == false) - { - U_WARNING("FortuneNoSql::handlerForkREDIS(): %V", rc->UClient_Base::getResponse().rep); - - U_DELETE(rc) - - rc = U_NULLPTR; - - return; - } - - Fortune::handlerFork(); - } - } - -private: - U_DISALLOW_ASSIGN(FortuneNoSql) -}; -#endif diff --git a/frameworks/C++/ulib/src/json.usp b/frameworks/C++/ulib/src/json.usp deleted file mode 100644 index 9afe75aefa0..00000000000 --- a/frameworks/C++/ulib/src/json.usp +++ /dev/null @@ -1,52 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/libFortune.cxx b/frameworks/C++/ulib/src/libFortune.cxx deleted file mode 100644 index 1348e76e96d..00000000000 --- a/frameworks/C++/ulib/src/libFortune.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// fortune.cpp - -#include "fortune.h" - -char* Fortune::pwbuffer; -uint32_t Fortune::uid; -UString* Fortune::pmessage; -UOrmSession* Fortune::psql_fortune; -UOrmStatement* Fortune::pstmt_fortune; -UVector* Fortune::pvfortune; -#ifdef U_STATIC_ORM_DRIVER_PGSQL -PGconn* Fortune::conn; -UPgSqlStatement* Fortune::pstmt; -#endif diff --git a/frameworks/C++/ulib/src/libFortuneNoSql.cxx b/frameworks/C++/ulib/src/libFortuneNoSql.cxx deleted file mode 100644 index 7b05a9c15c7..00000000000 --- a/frameworks/C++/ulib/src/libFortuneNoSql.cxx +++ /dev/null @@ -1,8 +0,0 @@ -// fortuneNoSql.cpp - -#include "fortuneNoSql.h" - -#ifdef USE_MONGODB -UMongoDBClient* FortuneNoSql::mc; -#endif -UREDISClient_Base* FortuneNoSql::rc; diff --git a/frameworks/C++/ulib/src/libWorld.cxx b/frameworks/C++/ulib/src/libWorld.cxx deleted file mode 100644 index 214d809dc6b..00000000000 --- a/frameworks/C++/ulib/src/libWorld.cxx +++ /dev/null @@ -1,17 +0,0 @@ -// world.cpp - -#include "world.h" - -char World::wbuffer[18000]; -char* World::ptr; -char* World::pwbuffer; -World* World::pworld_query; -uint32_t World::rnum; -uint32_t World::rnumber[501]; -UOrmSession* World::psql_query; -UOrmStatement* World::pstmt_query; -#ifdef U_STATIC_ORM_DRIVER_PGSQL -char World::num2str[sizeof(unsigned int)]; -PGconn* World::conn; -UPgSqlStatement* World::pstmt; -#endif diff --git a/frameworks/C++/ulib/src/libWorldNoSql.cxx b/frameworks/C++/ulib/src/libWorldNoSql.cxx deleted file mode 100644 index 95b6895fd03..00000000000 --- a/frameworks/C++/ulib/src/libWorldNoSql.cxx +++ /dev/null @@ -1,16 +0,0 @@ -// worldNoSql.cpp - -#include "worldNoSql.h" - -#ifdef USE_MONGODB -bson_t* WorldNoSql::query; -UMongoDBClient* WorldNoSql::mc; -#endif -char WorldNoSql::rc_buffer[128]; -char WorldNoSql::es_buffer1[128]; -char WorldNoSql::es_buffer2[128]; -char* WorldNoSql::pbuffer1; -char* WorldNoSql::pbuffer2; -UString* WorldNoSql::str_rnumber; -UREDISClient_Base* WorldNoSql::rc; -UElasticSearchClient* WorldNoSql::es; diff --git a/frameworks/C++/ulib/src/mdb.usp b/frameworks/C++/ulib/src/mdb.usp deleted file mode 100644 index ffc16cd5f97..00000000000 --- a/frameworks/C++/ulib/src/mdb.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/mfortune.usp b/frameworks/C++/ulib/src/mfortune.usp deleted file mode 100644 index 7900caaa028..00000000000 --- a/frameworks/C++/ulib/src/mfortune.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/mquery.usp b/frameworks/C++/ulib/src/mquery.usp deleted file mode 100644 index 4c507a18912..00000000000 --- a/frameworks/C++/ulib/src/mquery.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/mupdate.usp b/frameworks/C++/ulib/src/mupdate.usp deleted file mode 100644 index 4fec5c328c1..00000000000 --- a/frameworks/C++/ulib/src/mupdate.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/plaintext.usp b/frameworks/C++/ulib/src/plaintext.usp deleted file mode 100644 index 40f909bc57c..00000000000 --- a/frameworks/C++/ulib/src/plaintext.usp +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/frameworks/C++/ulib/src/query.usp b/frameworks/C++/ulib/src/query.usp deleted file mode 100644 index 9c2004196e8..00000000000 --- a/frameworks/C++/ulib/src/query.usp +++ /dev/null @@ -1,62 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/rdb.usp b/frameworks/C++/ulib/src/rdb.usp deleted file mode 100644 index 564229833b1..00000000000 --- a/frameworks/C++/ulib/src/rdb.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/rfortune.usp b/frameworks/C++/ulib/src/rfortune.usp deleted file mode 100644 index 51f89828028..00000000000 --- a/frameworks/C++/ulib/src/rfortune.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/rquery.usp b/frameworks/C++/ulib/src/rquery.usp deleted file mode 100644 index 7173c2db981..00000000000 --- a/frameworks/C++/ulib/src/rquery.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/rupdate.usp b/frameworks/C++/ulib/src/rupdate.usp deleted file mode 100644 index de4a0e85549..00000000000 --- a/frameworks/C++/ulib/src/rupdate.usp +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/update.usp b/frameworks/C++/ulib/src/update.usp deleted file mode 100644 index fc24a960a0c..00000000000 --- a/frameworks/C++/ulib/src/update.usp +++ /dev/null @@ -1,99 +0,0 @@ - - - - diff --git a/frameworks/C++/ulib/src/world.h b/frameworks/C++/ulib/src/world.h deleted file mode 100644 index a458e375a34..00000000000 --- a/frameworks/C++/ulib/src/world.h +++ /dev/null @@ -1,368 +0,0 @@ -// world.h - -#ifndef WORLD_H -#define WORLD_H 1 - -#include -#include -#include -#include -#include - -#ifdef U_STATIC_ORM_DRIVER_PGSQL -# include -# include -#endif - -class U_EXPORT World { -public: - uint32_t id, randomNumber; - - World() - { - U_TRACE_CTOR(5, World, "") - - // coverity[uninit_ctor] -# ifdef U_COVERITY_FALSE_POSITIVE - id = randomNumber = 0; -# endif - } - - World(uint32_t _id, uint32_t _randomNumber) : id(_id), randomNumber(_randomNumber) - { - U_TRACE_CTOR(5, World, "%u,%u", _id, _randomNumber) - } - - World(const World& w) : id(w.id), randomNumber(w.randomNumber) - { - U_TRACE_CTOR(5, World, "%p", &w) - - U_MEMORY_TEST_COPY(w) - } - - ~World() - { - U_TRACE_DTOR(5, World) - } - - // JSON - - void toJSON(UString& json) - { - U_TRACE(5, "World::toJSON(%V)", json.rep) - - json.toJSON(U_JSON_METHOD_HANDLER(id, unsigned int)); - json.toJSON(U_JSON_METHOD_HANDLER(randomNumber, unsigned int)); - } - - void fromJSON(UValue& json) - { - U_TRACE(5, "World::fromJSON(%p)", &json) - - json.fromJSON(U_JSON_METHOD_HANDLER(id, unsigned int)); - json.fromJSON(U_JSON_METHOD_HANDLER(randomNumber, unsigned int)); - } - - // ORM - - void bindParam(UOrmStatement* stmt) - { - U_TRACE(5, "World::bindParam(%p)", stmt) - - stmt->bindParam(U_ORM_TYPE_HANDLER(id, unsigned int)); - stmt->bindParam(U_ORM_TYPE_HANDLER(randomNumber, unsigned int)); - } - - void bindResult(UOrmStatement* stmt) - { - U_TRACE(5, "World::bindResult(%p)", stmt) - - stmt->bindResult(U_ORM_TYPE_HANDLER(id, unsigned int)); - stmt->bindResult(U_ORM_TYPE_HANDLER(randomNumber, unsigned int)); - } - - // SERVICE - - bool operator<(const World& other) const { return cmp_obj(&id, &other.id); } - - static int cmp_obj(const void* a, const void* b) - { - U_TRACE(5, "World::cmp_obj(%p,%p)", a, b) - -# ifdef U_STDCPP_ENABLE - /** - * The comparison function must follow a strict-weak-ordering - * - * 1) For all x, it is not the case that x < x (irreflexivity) - * 2) For all x, y, if x < y then it is not the case that y < x (asymmetry) - * 3) For all x, y, and z, if x < y and y < z then x < z (transitivity) - * 4) For all x, y, and z, if x is incomparable with y, and y is incomparable with z, then x is incomparable with z (transitivity of incomparability) - */ - - return (((const World*)a)->id < (((const World*)b)->id)); -# else - return (*(const World**)a)->id < ((*(const World**)b)->id); -# endif - } - - static char* ptr; - static char* pwbuffer; - static char wbuffer[18000]; - static uint32_t rnum, rnumber[501]; - - static World* pworld_query; - static UOrmSession* psql_query; - static UOrmStatement* pstmt_query; - -#ifdef U_STATIC_ORM_DRIVER_PGSQL - static PGconn* conn; - static UPgSqlStatement* pstmt; - static char num2str[sizeof(unsigned int)]; - - static void _sendQueryPrepared() - { - U_TRACE_NO_PARAM(5, "World::_sendQueryPrepared()") - - (void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1); - } - - static void sendQueryPrepared() - { - U_TRACE_NO_PARAM(5, "World::sendQueryPrepared()") - - U_INTERNAL_ASSERT_MAJOR(rnumber[0], 0) - - *(unsigned int*)num2str = htonl(rnumber[0]); - - _sendQueryPrepared(); - } - - static void sendQueryPrepared(uint32_t i) - { - U_TRACE(5, "World::sendQueryPrepared(%u)", i) - - U_INTERNAL_ASSERT_MAJOR(rnumber[i], 0) - - *(unsigned int*)num2str = htonl(rnumber[i]); - - _sendQueryPrepared(); - } -#endif - - static void initOneResult() - { - U_TRACE_NO_PARAM(5, "World::initOneResult()") - - U_INTERNAL_DUMP("wbuffer = %#.10S", wbuffer) - - if (u_get_unalignedp64(wbuffer+52) != U_MULTICHAR_CONSTANT64('\r','\n','{','"','i','d','"',':')) - { - u_put_unalignedp64(wbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-')); - u_put_unalignedp64(wbuffer+8, U_MULTICHAR_CONSTANT64('L','e','n','g','t','h',':',' ')); - u_put_unalignedp32(wbuffer+16, U_MULTICHAR_CONSTANT32('3','1','\r','\n')); - u_put_unalignedp64(wbuffer+20, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-')); - u_put_unalignedp64(wbuffer+28, U_MULTICHAR_CONSTANT64('T','y','p','e',':',' ','a','p')); - u_put_unalignedp64(wbuffer+36, U_MULTICHAR_CONSTANT64('p','l','i','c','a','t','i','o')); - u_put_unalignedp64(wbuffer+44, U_MULTICHAR_CONSTANT64('n','/','j','s','o','n','\r','\n')); - u_put_unalignedp64(wbuffer+52, U_MULTICHAR_CONSTANT64('\r','\n','{','"','i','d','"',':')); - - pwbuffer = u_num2str32(rnumber[0], wbuffer + U_CONSTANT_SIZE("Content-Length: 31\r\nContent-Type: application/json\r\n\r\n{\"id\":")); - - u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m')); - u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':')); - } - - U_INTERNAL_ASSERT_EQUALS(u_get_unalignedp64(wbuffer), U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-')) - } - - static void endOneResult() - { - U_TRACE_NO_PARAM(5, "World::endOneResult()") - - *ptr = '}'; - - uint32_t len = ptr-wbuffer+1, - body_len = len - U_CONSTANT_SIZE("Content-Length: 31\r\nContent-Type: application/json\r\n\r\n"); - - U_NUM2STR16(wbuffer+U_CONSTANT_SIZE("Content-Length: "), body_len); - - UClientImage_Base::wbuffer->setConstant(wbuffer, len); - } - - static void handlerOneResult(uint32_t random) - { - U_TRACE(5, "World::handlerOneResult(%u)", random) - - initOneResult(); - - ptr = u_num2str32(random, pwbuffer+16); - - endOneResult(); - } - - static void initResult() - { - U_TRACE_NO_PARAM(5, "World::initResult()") - - U_INTERNAL_DUMP("wbuffer = %#.10S", wbuffer) - - if (u_get_unalignedp64(wbuffer+56) != U_MULTICHAR_CONSTANT64('\n','[','{','"','i','d','"',':')) - { - u_put_unalignedp64(wbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-')); - u_put_unalignedp64(wbuffer+8, U_MULTICHAR_CONSTANT64('L','e','n','g','t','h',':',' ')); - u_put_unalignedp64(wbuffer+16, U_MULTICHAR_CONSTANT64('1','3','3','3','1','\r','\n','C')); - u_put_unalignedp64(wbuffer+24, U_MULTICHAR_CONSTANT64('o','n','t','e','n','t','-','T')); - u_put_unalignedp64(wbuffer+32, U_MULTICHAR_CONSTANT64('y','p','e',':',' ','a','p','p')); - u_put_unalignedp64(wbuffer+40, U_MULTICHAR_CONSTANT64('l','i','c','a','t','i','o','n')); - u_put_unalignedp64(wbuffer+48, U_MULTICHAR_CONSTANT64('/','j','s','o','n','\r','\n','\r')); - u_put_unalignedp64(wbuffer+56, U_MULTICHAR_CONSTANT64('\n','[','{','"','i','d','"',':')); - - pwbuffer = u_num2str32(rnumber[0], wbuffer + U_CONSTANT_SIZE("Content-Length: 13331\r\nContent-Type: application/json\r\n\r\n[{\"id\":")); - - u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m')); - u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':')); - } - - U_INTERNAL_ASSERT_EQUALS(u_get_unalignedp64(wbuffer), U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-')) - - ptr = pwbuffer; - } - - static void endResult() - { - U_TRACE_NO_PARAM(5, "World::endResult()") - - *(ptr-1) = ']'; - - uint32_t len = ptr-wbuffer, - body_len = len - U_CONSTANT_SIZE("Content-Length: 13331\r\nContent-Type: application/json\r\n\r\n"); - - ptr = u_num2str32(body_len, wbuffer + U_CONSTANT_SIZE("Content-Length: ")); - - while (*ptr != '\r') *ptr++ = ' '; - - UClientImage_Base::wbuffer->setConstant(wbuffer, len); - } - - static void addResult(uint32_t i) - { - U_TRACE(5, "World::addResult(%u)", i) - - U_INTERNAL_ASSERT_MAJOR(i, 0) - - u_put_unalignedp32(ptr, U_MULTICHAR_CONSTANT32('{','"','i','d')); - u_put_unalignedp16(ptr+4, U_MULTICHAR_CONSTANT16('"',':')); - - ptr = u_num2str32(rnumber[i], ptr+6); - - u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m')); - u_put_unalignedp64(ptr+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':')); - } - - static void addRandom(uint32_t random) - { - U_TRACE(5, "World::addRandom(%u)", random) - - ptr = u_num2str32(random, ptr+16); - - u_put_unalignedp16(ptr, U_MULTICHAR_CONSTANT16('}',',')); - ptr += 2; - } - - static void handlerResult(uint32_t i, uint32_t random) - { - U_TRACE(5, "World::handlerResult(%u,%u)", i, random) - - if (i) addResult(i); - - addRandom(random); - } - - static void doUpdateNoSql(vPFu handlerUpdateNoSql) - { - U_TRACE(5, "World::doUpdateNoSql(%p)", handlerUpdateNoSql) - - initResult(); - - for (uint32_t i = 0, n = UHTTP::getFormFirstNumericValue(1, 500); i < n; ++i) - { - handlerUpdateNoSql(i); - - handlerResult(i, rnum); - } - - endResult(); - } - - static void handlerInitSql() - { - U_TRACE_NO_PARAM(5, "World::handlerInitSql()") - -# ifdef U_STATIC_ORM_DRIVER_PGSQL - U_INTERNAL_DUMP("UServer_Base::handler_db1 = %p", UServer_Base::handler_db1) - - if (UServer_Base::handler_db1 == U_NULLPTR) - { - U_NEW(UEventDB, UServer_Base::handler_db1, UEventDB); - } -# endif - } - - static void handlerFork() - { - U_TRACE_NO_PARAM(5, "World::handlerFork()") - - if (rnumber[0] == 0) for (uint32_t i = 0; i <= 500; ++i) rnumber[i] = u_get_num_random_range1(10000); - } - - static void handlerForkSql() - { - U_TRACE_NO_PARAM(5, "World::handlerForkSql()") - - if (psql_query == U_NULLPTR) - { - U_NEW(UOrmSession, psql_query, UOrmSession(U_CONSTANT_TO_PARAM("hello_world"))); - - if (psql_query->isReady() == false) - { - U_WARNING("World::handlerForkSql(): we cound't connect to db"); - - U_DELETE(psql_query) - - psql_query = U_NULLPTR; - - return; - } - - U_NEW(UOrmStatement, pstmt_query, UOrmStatement(*psql_query, U_CONSTANT_TO_PARAM("SELECT randomNumber, id FROM World WHERE id = ?"))); - - U_NEW(World, pworld_query, World); - - pstmt_query->use( pworld_query->id); - pstmt_query->into(pworld_query->randomNumber); - -# ifdef U_STATIC_ORM_DRIVER_PGSQL - if (UOrmDriver::isPGSQL()) - { - UOrmDriverPgSql* pdrv = (UOrmDriverPgSql*)psql_query->getDriver(); - - conn = (PGconn*)pdrv->UOrmDriver::connection; - pstmt = (UPgSqlStatement*)pstmt_query->getStatement(); - - (void) pstmt->setBindParam(pdrv); - - pstmt->paramValues[0] = num2str; - pstmt->paramLengths[0] = sizeof(unsigned int); - - UServer_Base::handler_db1->setConnection(conn); - } -# endif - - handlerFork(); - } - } - -private: - U_DISALLOW_ASSIGN(World) -}; -#endif diff --git a/frameworks/C++/ulib/src/worldNoSql.h b/frameworks/C++/ulib/src/worldNoSql.h deleted file mode 100644 index 58c4df17f54..00000000000 --- a/frameworks/C++/ulib/src/worldNoSql.h +++ /dev/null @@ -1,270 +0,0 @@ -// worldNoSql.h - -#ifndef WORLD_NO_SQL_H -#define WORLD_NO_SQL_H 1 - -#include "world.h" - -#include -#include - -#ifdef USE_MONGODB -# include -#endif - -class U_EXPORT WorldNoSql { -public: - - static UString* str_rnumber; - - static void doOneQuery(vPFu handlerQuery) - { - U_TRACE(5, "WorldNoSql::doOneQuery(%p)", handlerQuery) - - handlerQuery(World::rnumber[0]); - - uint32_t sz = str_rnumber->size(); - - World::initOneResult(); - - (void) memcpy(World::pwbuffer+16, str_rnumber->data(), sz); - - World::ptr = World::pwbuffer+16+sz; - - World::endOneResult(); - - str_rnumber->clear(); - } - - static void handlerResult(uint32_t i) - { - U_TRACE(5, "WorldNoSql::handlerResult(%u)", i) - - U_INTERNAL_ASSERT_POINTER(str_rnumber) - U_INTERNAL_ASSERT_POINTER(World::pwbuffer) - - if (i) World::addResult(i); - - uint32_t sz = str_rnumber->size(); - - (void) memcpy(World::ptr+16, str_rnumber->data(), sz); - World::ptr += 16+ sz; - - u_put_unalignedp16(World::ptr, U_MULTICHAR_CONSTANT16('}',',')); - World::ptr += 2; - - str_rnumber->clear(); - } - - static void doQuery(vPFu handlerQuery) - { - U_TRACE(5, "WorldNoSql::doQuery(%p)", handlerQuery) - - World::initResult(); - - for (uint32_t i = 0, n = UHTTP::getFormFirstNumericValue(1, 500); i < n; ++i) - { - handlerQuery(World::rnumber[i]); - - handlerResult(i); - } - - World::endResult(); - } - - static void handlerFork() - { - U_TRACE_NO_PARAM(5, "WorldNoSql::handlerFork()") - - if (str_rnumber == U_NULLPTR) U_NEW_STRING(str_rnumber, UString); - - World::handlerFork(); - - U_INTERNAL_ASSERT_POINTER(str_rnumber) - } - -#ifdef USE_MONGODB - static bson_t* query; - static UMongoDBClient* mc; -#endif - - static void handlerQueryMongoDB(uint32_t uid) - { - U_TRACE(5, "WorldNoSql::handlerQueryMongoDB(%u)", uid) - - U_INTERNAL_ASSERT_POINTER(str_rnumber) - -# ifdef USE_MONGODB - (void) mc->findOne(uid, query); - (void) U_JFIND(mc->vitem[0], "randomNumber", *str_rnumber); - - uint32_t pos = str_rnumber->find_first_of('.'); - - if (pos != U_NOT_FOUND) str_rnumber->size_adjust_constant(pos); -# endif - } - - static void handlerUpdateMongoDB(uint32_t i) - { - U_TRACE(5, "WorldNoSql::handlerUpdateMongoDB(%u)", i) - -# ifdef USE_MONGODB - (void) mc->findOne(World::rnumber[i], query); - (void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random_range1(10000)); -# endif - } - - static void handlerForkMongoDB() - { - U_TRACE_NO_PARAM(5, "WorldNoSql::handlerForkMongoDB()") - -# ifdef USE_MONGODB - if (mc == U_NULLPTR) - { - U_NEW(UMongoDBClient, mc, UMongoDBClient); - - if (mc->connect(U_NULLPTR, 0) == false) - { - U_WARNING("WorldNoSql::handlerForkMongoDB(): connection failed"); - - U_DELETE(mc) - - mc = U_NULLPTR; - - return; - } - - if (mc->selectCollection("hello_world", "world") == false) - { - U_WARNING("WorldNoSql::handlerForkMongoDB(): selectCollection() failed"); - - U_DELETE(mc) - - mc = U_NULLPTR; - - return; - } - - query = (bson_t*) U_SYSCALL_NO_PARAM(bson_new); - - handlerFork(); - } -# endif - } - - static char rc_buffer[128]; - static UREDISClient_Base* rc; - - static void handlerQueryREDIS(uint32_t uid) - { - U_TRACE(5, "WorldNoSql::handlerQueryREDIS(%u)", uid) - - U_INTERNAL_ASSERT_POINTER(str_rnumber) - - char* ptr = rc_buffer+U_CONSTANT_SIZE("world:"); - - (void) rc->get(ptr, U_CONSTANT_SIZE("world:")+u_num2str32(uid, ptr)-ptr); - - *str_rnumber = rc->vitem[0]; - } - - static void handlerUpdateREDIS(uint32_t i) - { - U_TRACE(5, "WorldNoSql::handlerUpdateREDIS(%u)", i) - - char* start = rc_buffer+U_CONSTANT_SIZE("world:"); - char* ptr = u_num2str32(World::rnumber[i], start); - - (void) rc->get(start, ptr-start); - - *ptr = ' '; - ptr = u_num2str32(World::rnum = u_get_num_random_range1(10000), ptr+1); - - (void) rc->mset(start, ptr-start); - } - - static void handlerForkREDIS() - { - U_TRACE_NO_PARAM(5, "WorldNoSql::handlerForkREDIS()") - - if (rc == U_NULLPTR) - { - U_NEW(UREDISClient, rc, UREDISClient); - - if (rc->connect() == false) - { - U_WARNING("WorldNoSql::handlerForkREDIS(): %V", rc->UClient_Base::getResponse().rep); - - U_DELETE(rc) - - rc = U_NULLPTR; - - return; - } - - U_MEMCPY(rc_buffer, "world:", U_CONSTANT_SIZE("world:")); - - handlerFork(); - } - } - - static char* pbuffer1; - static char* pbuffer2; - static char es_buffer1[128]; - static char es_buffer2[128]; - static UElasticSearchClient* es; - -# define U_QLEN U_CONSTANT_SIZE("{\"query\":{\"match\":{\"_id\":\"") - - static void handlerQueryElasticSearch(uint32_t uid) - { - U_TRACE(5, "WorldNoSql::handlerQueryElasticSearch(%u)", uid) - - U_INTERNAL_ASSERT_POINTER(str_rnumber) - - (void) es->sendPOST(U_CONSTANT_TO_PARAM("/tfb/world/_search"), es_buffer1, U_QLEN+ - u__snprintf(es_buffer1+ U_QLEN, - sizeof(es_buffer1)-U_QLEN, U_CONSTANT_TO_PARAM("%u\"}}}"), uid)); - - (void) U_JFIND(es->getContent(), "randomNumber", *str_rnumber); - } - - static void handlerUpdateElasticSearch(uint32_t i) - { - U_TRACE(5, "WorldNoSql::handlerUpdateElasticSearch(%u)", i) - - uint32_t len1 = u__snprintf(pbuffer1, 100, U_CONSTANT_TO_PARAM("%u/_update"), World::rnumber[i]), - len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random_range1(10000)); - - (void) es->sendPOST(es_buffer1, len1+U_CONSTANT_SIZE("/tfb/world/"), es_buffer2, len2+U_CONSTANT_SIZE("{\"doc\":{\"_id\":\"")); - } - - static void handlerForkElasticSearch() - { - U_TRACE_NO_PARAM(5, "WorldNoSql::handlerForkElasticSearch()") - - if (es == U_NULLPTR) - { - U_NEW(UElasticSearchClient, es, UElasticSearchClient); - - if (es->connect() == false) - { - U_WARNING("WorldNoSql::handlerForkElasticSearch(): connection disabled or failed"); - - U_DELETE(es) - - es = U_NULLPTR; - - return; - } - - U_MEMCPY(es_buffer1, "{\"query\":{\"match\":{\"_id\":\"", U_QLEN); - - handlerFork(); - } - } - -private: - U_DISALLOW_ASSIGN(WorldNoSql) -}; -#endif diff --git a/frameworks/C++/ulib/ulib-json.dockerfile b/frameworks/C++/ulib/ulib-json.dockerfile deleted file mode 100644 index b7ed9f51c3b..00000000000 --- a/frameworks/C++/ulib/ulib-json.dockerfile +++ /dev/null @@ -1,82 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(( 3 * $(nproc) / 2 ))" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET 0" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 256" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --disable-static --disable-examples \ - --without-ssl --disable-HCRS --without-pcre --without-expat \ - --without-libz --without-libuuid --disable-HPRS --without-magic --without-libares \ - --enable-static-server-plugin=http - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - make json.la && \ - cp .libs/json.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV UMEMPOOL="58,0,0,41,273,-15,-14,-20,36" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg diff --git a/frameworks/C++/ulib/ulib-json_fit.dockerfile b/frameworks/C++/ulib/ulib-json_fit.dockerfile deleted file mode 100644 index 9d4e97e204f..00000000000 --- a/frameworks/C++/ulib/ulib-json_fit.dockerfile +++ /dev/null @@ -1,82 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(nproc)" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET 0" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 256" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --disable-static --disable-examples \ - --without-ssl --disable-HCRS --without-pcre --without-expat \ - --without-libz --without-libuuid --disable-HPRS --without-magic --without-libares \ - --enable-static-server-plugin=http - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - make json.la && \ - cp .libs/json.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV UMEMPOOL="58,0,0,41,273,-15,-14,-20,36" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg diff --git a/frameworks/C++/ulib/ulib-mongodb.dockerfile b/frameworks/C++/ulib/ulib-mongodb.dockerfile deleted file mode 100644 index 7c9e6d9d40a..00000000000 --- a/frameworks/C++/ulib/ulib-mongodb.dockerfile +++ /dev/null @@ -1,91 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN wget -q https://github.com/mongodb/mongo-c-driver/releases/download/1.4.0/mongo-c-driver-1.4.0.tar.gz -RUN tar xf mongo-c-driver-1.4.0.tar.gz -RUN cd mongo-c-driver-1.4.0/ && \ - ./configure --prefix=${IROOT} --libdir=${IROOT} --disable-automatic-init-and-cleanup && \ - make && make install - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(( 3 * $(nproc) / 2 ))" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET -2" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 256" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --disable-static --disable-examples \ - --without-ssl --disable-HCRS --without-pcre --without-expat \ - --without-libz --without-libuuid --disable-HPRS --without-magic --without-libares \ - --enable-static-server-plugin=http \ - --with-mongodb --with-mongodb-includes="-I$IROOT/include/libbson-1.0 -I$IROOT/include/libmongoc-1.0" --with-mongodb-ldflags="-L$IROOT" - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - AM_LDFLAGS="-lFortune -lFortuneNoSql" make mfortune.la && \ - AM_LDFLAGS="-lWorld -lWorldNoSql" make mdb.la mquery.la mupdate.la && \ - cp .libs/mdb.so .libs/mquery.so .libs/mupdate.so .libs/mfortune.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV MONGODB_HOST=tfb-database -ENV UMEMPOOL="96,0,0,97,16417,-14,-20,-18,26" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg diff --git a/frameworks/C++/ulib/ulib-mysql.dockerfile b/frameworks/C++/ulib/ulib-mysql.dockerfile deleted file mode 100644 index b14a0aadb00..00000000000 --- a/frameworks/C++/ulib/ulib-mysql.dockerfile +++ /dev/null @@ -1,87 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(nproc)" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET -2" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 256" >> $ULIB_ROOT/benchmark.cfg -RUN echo "ORM_DRIVER mysql" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --with-mysql \ - --disable-static --disable-examples \ - --without-ssl --disable-HCRS --without-pcre --without-expat \ - --without-libz --without-libuuid --disable-HPRS --without-magic --without-libares \ - --enable-static-orm-driver='mysql' --enable-static-server-plugin=http - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - AM_LDFLAGS="-lFortune" make fortune.la && \ - AM_LDFLAGS="-lWorld" make db.la query.la update.la cached_worlds.la && \ - cp .libs/db.so .libs/query.so .libs/update.so .libs/fortune.so .libs/cached_worlds.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV ORM_DRIVER="mysql" -ENV ORM_OPTION="host=tfb-database user=benchmarkdbuser password=benchmarkdbpass character-set=utf8 dbname=hello_world" -ENV UMEMPOOL="96,0,0,97,16417,-14,-20,-18,26" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg diff --git a/frameworks/C++/ulib/ulib-plaintext_fit.dockerfile b/frameworks/C++/ulib/ulib-plaintext_fit.dockerfile deleted file mode 100644 index 68394f88119..00000000000 --- a/frameworks/C++/ulib/ulib-plaintext_fit.dockerfile +++ /dev/null @@ -1,82 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(nproc)" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET 0" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 16384" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --disable-static --disable-examples \ - --without-ssl --without-pcre --without-expat \ - --without-libz --without-libuuid --without-magic --without-libares \ - --enable-static-server-plugin=http - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - make plaintext.la && \ - cp .libs/plaintext.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV UMEMPOOL="58,0,0,41,16401,-14,-15,11,25" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg diff --git a/frameworks/C++/ulib/ulib-postgres.dockerfile b/frameworks/C++/ulib/ulib-postgres.dockerfile deleted file mode 100644 index 02fedb51354..00000000000 --- a/frameworks/C++/ulib/ulib-postgres.dockerfile +++ /dev/null @@ -1,87 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin libldap-dev && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(( 2 * $(nproc)))" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET -2" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 256" >> $ULIB_ROOT/benchmark.cfg -RUN echo "ORM_DRIVER pgsql" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --disable-static --disable-examples \ - --with-pgsql \ - --without-ssl --disable-HCRS --without-pcre --without-expat \ - --without-libz --without-libuuid --disable-HPRS --without-magic --without-libares \ - --enable-static-orm-driver='pgsql' --enable-static-server-plugin=http - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - AM_LDFLAGS="-lFortune" make fortune.la && \ - AM_LDFLAGS="-lWorld" make db.la query.la update.la cached_worlds.la && \ - cp .libs/db.so .libs/query.so .libs/update.so .libs/fortune.so .libs/cached_worlds.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV ORM_DRIVER="pgsql" -ENV UMEMPOOL="96,0,0,97,16417,-14,-20,-18,26" -ENV ORM_OPTION="host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world client_encoding=UTF8" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg diff --git a/frameworks/C++/ulib/ulib-postgres_fit.dockerfile b/frameworks/C++/ulib/ulib-postgres_fit.dockerfile deleted file mode 100644 index 9266d9baa3a..00000000000 --- a/frameworks/C++/ulib/ulib-postgres_fit.dockerfile +++ /dev/null @@ -1,87 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin libldap-dev && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(nproc)" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET -2" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 256" >> $ULIB_ROOT/benchmark.cfg -RUN echo "ORM_DRIVER pgsql" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --disable-static --disable-examples \ - --with-pgsql \ - --without-ssl --disable-HCRS --without-pcre --without-expat \ - --without-libz --without-libuuid --disable-HPRS --without-magic --without-libares \ - --enable-static-orm-driver='pgsql' --enable-static-server-plugin=http - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - AM_LDFLAGS="-lFortune" make fortune.la && \ - AM_LDFLAGS="-lWorld" make db.la query.la update.la cached_worlds.la && \ - cp .libs/db.so .libs/query.so .libs/update.so .libs/fortune.so .libs/cached_worlds.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV ORM_DRIVER="pgsql" -ENV UMEMPOOL="96,0,0,97,16417,-14,-20,-18,26" -ENV ORM_OPTION="host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world client_encoding=UTF8" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg diff --git a/frameworks/C++/ulib/ulib.dockerfile b/frameworks/C++/ulib/ulib.dockerfile deleted file mode 100644 index d9630d12886..00000000000 --- a/frameworks/C++/ulib/ulib.dockerfile +++ /dev/null @@ -1,82 +0,0 @@ -FROM ubuntu:18.04 - -COPY ./ ./ - -RUN apt-get update -yqq && \ - apt-get install -yqq software-properties-common build-essential curl locales wget unzip git \ - libmysqlclient-dev libpq-dev \ - libpcre3 libpcre3-dev \ - libssl-dev libcurl4-openssl-dev \ - zlib1g-dev \ - libreadline6-dev \ - libbz2-dev \ - libxslt-dev libgdbm-dev ncurses-dev \ - libffi-dev libtool bison libevent-dev \ - liborc-0.4-0 \ - libmcrypt-dev libicu-dev \ - re2c libnuma-dev \ - postgresql-server-dev-all libcap2-bin && \ - add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ - apt-get update -yqq && \ - apt-get install -yqq gcc-8 g++-8 - -RUN locale-gen en_US.UTF-8 - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV DEBIAN_FRONTEND noninteractive - -ENV CC=gcc-8 -ENV CXX=g++-8 -ENV AR=gcc-ar-8 -ENV RANLIB=gcc-ranlib-8 -ENV IROOT=/install -ENV ULIB_ROOT=$IROOT/ULib -ENV ULIB_VERSION=2.4.2 -ENV ULIB_DOCUMENT_ROOT=$ULIB_ROOT/ULIB_DOCUMENT_ROOT - -WORKDIR $IROOT - -RUN mkdir -p $ULIB_DOCUMENT_ROOT -RUN wget -q -O ULib-${ULIB_VERSION}.tar.gz https://github.com/stefanocasazza/ULib/archive/v${ULIB_VERSION}.tar.gz -RUN tar xf ULib-${ULIB_VERSION}.tar.gz - -WORKDIR $IROOT/ULib-$ULIB_VERSION - -# AVOID "configure: error: newly created file is older than distributed files! Check your system clock" -RUN cp /src/* src/ulib/net/server/plugin/usp -RUN find . -exec touch {} \; - -RUN echo "userver {" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PORT 8080" >> $ULIB_ROOT/benchmark.cfg -RUN echo "PREFORK_CHILD $(( 3 * $(nproc) / 2 ))" >> $ULIB_ROOT/benchmark.cfg -RUN echo "TCP_LINGER_SET 0" >> $ULIB_ROOT/benchmark.cfg -RUN echo "LISTEN_BACKLOG 16384" >> $ULIB_ROOT/benchmark.cfg -RUN echo "DOCUMENT_ROOT $ULIB_DOCUMENT_ROOT " >> $ULIB_ROOT/benchmark.cfg -RUN echo "}" >> $ULIB_ROOT/benchmark.cfg - -RUN USP_FLAGS="-DAS_cpoll_cppsp_DO" \ - ./configure --prefix=$ULIB_ROOT \ - --disable-static --disable-examples \ - --without-ssl --without-pcre --without-expat \ - --without-libz --without-libuuid --without-magic --without-libares \ - --enable-static-server-plugin=http - -RUN make install && \ - cd examples/userver && make install && \ - cd ../../src/ulib/net/server/plugin/usp && \ - make plaintext.la && \ - cp .libs/plaintext.so $ULIB_DOCUMENT_ROOT - -ENV PATH=${ULIB_ROOT}/bin:${PATH} - -ADD ./ /ulib -WORKDIR /ulib - -ENV UMEMPOOL="58,0,0,41,16401,-14,-15,11,25" - -EXPOSE 8080 - -CMD setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp && \ - $IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg From 76d504059dcd36907ae8bd78864fffd9aa45cc77 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Fri, 4 Apr 2025 18:14:50 +0200 Subject: [PATCH 1340/1766] [php] Remove ZendFramework (#9761) --- frameworks/PHP/zend/benchmark_config.json | 27 - frameworks/PHP/zend/composer.json | 20 - frameworks/PHP/zend/composer.lock | 982 --------- frameworks/PHP/zend/config.toml | 18 - .../PHP/zend/config/application.config.php | 18 - .../zend/config/autoload/benchmarks.local.php | 13 - frameworks/PHP/zend/deploy/conf/php-fpm.conf | 551 ----- frameworks/PHP/zend/deploy/conf/php.ini | 1914 ----------------- frameworks/PHP/zend/deploy/nginx.conf | 43 - frameworks/PHP/zend/deploy/php-zend-framework | 9 - .../Controller/BenchController.php | 103 - .../src/FrameworkBenchmarks/Entity/World.php | 41 - .../src/FrameworkBenchmarks/Module.php | 95 - .../BenchControllerServiceFactory.php | 40 - frameworks/PHP/zend/public/.htaccess | 16 - frameworks/PHP/zend/public/index.php | 6 - frameworks/PHP/zend/zend.dockerfile | 28 - 17 files changed, 3924 deletions(-) delete mode 100644 frameworks/PHP/zend/benchmark_config.json delete mode 100644 frameworks/PHP/zend/composer.json delete mode 100644 frameworks/PHP/zend/composer.lock delete mode 100644 frameworks/PHP/zend/config.toml delete mode 100644 frameworks/PHP/zend/config/application.config.php delete mode 100644 frameworks/PHP/zend/config/autoload/benchmarks.local.php delete mode 100644 frameworks/PHP/zend/deploy/conf/php-fpm.conf delete mode 100644 frameworks/PHP/zend/deploy/conf/php.ini delete mode 100644 frameworks/PHP/zend/deploy/nginx.conf delete mode 100644 frameworks/PHP/zend/deploy/php-zend-framework delete mode 100644 frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Controller/BenchController.php delete mode 100644 frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Entity/World.php delete mode 100644 frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Module.php delete mode 100644 frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/ServiceFactory/BenchControllerServiceFactory.php delete mode 100644 frameworks/PHP/zend/public/.htaccess delete mode 100644 frameworks/PHP/zend/public/index.php delete mode 100644 frameworks/PHP/zend/zend.dockerfile diff --git a/frameworks/PHP/zend/benchmark_config.json b/frameworks/PHP/zend/benchmark_config.json deleted file mode 100644 index 47743cd8a36..00000000000 --- a/frameworks/PHP/zend/benchmark_config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "framework": "zend", - "tests": [{ - "default": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "update_url": "/updates?queries=", - "query_url": "/queries?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "MySQL", - "framework": "Zend", - "language": "PHP", - "flavor": "PHP7", - "orm": "Full", - "platform": "FPM/FastCGI", - "webserver": "nginx", - "os": "Linux", - "database_os": "Linux", - "display_name": "zend", - "notes": "", - "versus": "php" - } - }] -} diff --git a/frameworks/PHP/zend/composer.json b/frameworks/PHP/zend/composer.json deleted file mode 100644 index ddce9e0aa74..00000000000 --- a/frameworks/PHP/zend/composer.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "zendframework/skeleton-application", - "description": "Skeleton Application for ZF", - "license": "BSD-3-Clause", - "keywords": [ - "framework", - "zf2" - ], - "homepage": "http://framework.zend.com/", - "require": { - "php": "^7.2", - "zendframework/zend-mvc": "^3.0.1", - "zendframework/zend-db": "^2.9.3" - }, - "autoload": { - "psr-0": { - "FrameworkBenchmarks": "module/FrameworkBenchmarks/src" - } - } -} diff --git a/frameworks/PHP/zend/composer.lock b/frameworks/PHP/zend/composer.lock deleted file mode 100644 index f4060f2da30..00000000000 --- a/frameworks/PHP/zend/composer.lock +++ /dev/null @@ -1,982 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "1a71e90b2e2a74968245456d36c1f4e8", - "packages": [ - { - "name": "container-interop/container-interop", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/container-interop/container-interop.git", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "shasum": "" - }, - "require": { - "psr/container": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "homepage": "https://github.com/container-interop/container-interop", - "time": "2017-02-14T19:40:03+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "zendframework/zend-config", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-config.git", - "reference": "6796f5dcba52c84ef2501d7313618989b5ef3023" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-config/zipball/6796f5dcba52c84ef2501d7313618989b5ef3023", - "reference": "6796f5dcba52c84ef2501d7313618989b5ef3023", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^5.6 || ^7.0", - "psr/container": "^1.0", - "zendframework/zend-stdlib": "^2.7.7 || ^3.1" - }, - "conflict": { - "container-interop/container-interop": "<1.2.0" - }, - "require-dev": { - "malukenho/docheader": "^0.1.6", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-filter": "^2.7.2", - "zendframework/zend-i18n": "^2.7.4", - "zendframework/zend-servicemanager": "^2.7.8 || ^3.3" - }, - "suggest": { - "zendframework/zend-filter": "^2.7.2; install if you want to use the Filter processor", - "zendframework/zend-i18n": "^2.7.4; install if you want to use the Translator processor", - "zendframework/zend-servicemanager": "^2.7.8 || ^3.3; if you need an extensible plugin manager for use with the Config Factory" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev", - "dev-develop": "3.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Config\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides a nested object property based user interface for accessing this configuration data within application code", - "keywords": [ - "ZendFramework", - "config", - "zf" - ], - "time": "2018-04-24T19:26:44+00:00" - }, - { - "name": "zendframework/zend-db", - "version": "2.9.3", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-db.git", - "reference": "5b4f2c42f94c9f7f4b2f456a0ebe459fab12b3d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-db/zipball/5b4f2c42f94c9f7f4b2f456a0ebe459fab12b3d9", - "reference": "5b4f2c42f94c9f7f4b2f456a0ebe459fab12b3d9", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.25 || ^6.4.4", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", - "zendframework/zend-hydrator": "^1.1 || ^2.1", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" - }, - "suggest": { - "zendframework/zend-eventmanager": "Zend\\EventManager component", - "zendframework/zend-hydrator": "Zend\\Hydrator component for using HydratingResultSets", - "zendframework/zend-servicemanager": "Zend\\ServiceManager component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.9-dev", - "dev-develop": "2.10-dev" - }, - "zf": { - "component": "Zend\\Db", - "config-provider": "Zend\\Db\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Zend\\Db\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Database abstraction layer, SQL abstraction, result set abstraction, and RowDataGateway and TableDataGateway implementations", - "keywords": [ - "ZendFramework", - "db", - "zf" - ], - "time": "2018-04-09T13:21:36+00:00" - }, - { - "name": "zendframework/zend-escaper", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-escaper.git", - "reference": "31d8aafae982f9568287cb4dce987e6aff8fd074" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/31d8aafae982f9568287cb4dce987e6aff8fd074", - "reference": "31d8aafae982f9568287cb4dce987e6aff8fd074", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Escaper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", - "keywords": [ - "ZendFramework", - "escaper", - "zf" - ], - "time": "2018-04-25T15:48:53+00:00" - }, - { - "name": "zendframework/zend-eventmanager", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0" - }, - "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://github.com/zendframework/zend-eventmanager", - "keywords": [ - "event", - "eventmanager", - "events", - "zf2" - ], - "time": "2018-04-25T15:33:34+00:00" - }, - { - "name": "zendframework/zend-http", - "version": "2.8.2", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-http.git", - "reference": "2c8aed3d25522618573194e7cc51351f8cd4a45b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-http/zipball/2c8aed3d25522618573194e7cc51351f8cd4a45b", - "reference": "2c8aed3d25522618573194e7cc51351f8cd4a45b", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "zendframework/zend-loader": "^2.5.1", - "zendframework/zend-stdlib": "^3.1 || ^2.7.7", - "zendframework/zend-uri": "^2.5.2", - "zendframework/zend-validator": "^2.10.1" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.3", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-config": "^3.1 || ^2.6" - }, - "suggest": { - "paragonie/certainty": "For automated management of cacert.pem" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8.x-dev", - "dev-develop": "2.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Http\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", - "keywords": [ - "ZendFramework", - "http", - "http client", - "zend", - "zf" - ], - "time": "2018-08-13T18:47:03+00:00" - }, - { - "name": "zendframework/zend-json", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-json.git", - "reference": "4dd940e8e6f32f1d36ea6b0677ea57c540c7c19c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-json/zipball/4dd940e8e6f32f1d36ea6b0677ea57c540c7c19c", - "reference": "4dd940e8e6f32f1d36ea6b0677ea57c540c7c19c", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-stdlib": "^2.7.7 || ^3.1" - }, - "suggest": { - "zendframework/zend-json-server": "For implementing JSON-RPC servers", - "zendframework/zend-xml2json": "For converting XML documents to JSON" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev", - "dev-develop": "3.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Json\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", - "keywords": [ - "ZendFramework", - "json", - "zf" - ], - "time": "2018-01-04T17:51:34+00:00" - }, - { - "name": "zendframework/zend-loader", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-loader.git", - "reference": "78f11749ea340f6ca316bca5958eef80b38f9b6c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/78f11749ea340f6ca316bca5958eef80b38f9b6c", - "reference": "78f11749ea340f6ca316bca5958eef80b38f9b6c", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.4", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Loader\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Autoloading and plugin loading strategies", - "keywords": [ - "ZendFramework", - "loader", - "zf" - ], - "time": "2018-04-30T15:20:54+00:00" - }, - { - "name": "zendframework/zend-modulemanager", - "version": "2.8.2", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-modulemanager.git", - "reference": "394df6e12248ac430a312d4693f793ee7120baa6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/394df6e12248ac430a312d4693f793ee7120baa6", - "reference": "394df6e12248ac430a312d4693f793ee7120baa6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "zendframework/zend-config": "^3.1 || ^2.6", - "zendframework/zend-eventmanager": "^3.2 || ^2.6.3", - "zendframework/zend-stdlib": "^3.1 || ^2.7" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.8 || ^5.7.15", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-console": "^2.6", - "zendframework/zend-di": "^2.6", - "zendframework/zend-loader": "^2.5", - "zendframework/zend-mvc": "^3.0 || ^2.7", - "zendframework/zend-servicemanager": "^3.0.3 || ^2.7.5" - }, - "suggest": { - "zendframework/zend-console": "Zend\\Console component", - "zendframework/zend-loader": "Zend\\Loader component if you are not using Composer autoloading for your modules", - "zendframework/zend-mvc": "Zend\\Mvc component", - "zendframework/zend-servicemanager": "Zend\\ServiceManager component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev", - "dev-develop": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\ModuleManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Modular application system for zend-mvc applications", - "homepage": "https://github.com/zendframework/zend-modulemanager", - "keywords": [ - "ZendFramework", - "modulemanager", - "zf" - ], - "time": "2017-12-02T06:11:18+00:00" - }, - { - "name": "zendframework/zend-mvc", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-mvc.git", - "reference": "236e7e1e3757e988fa06530c0a3f96a148858ae8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/236e7e1e3757e988fa06530c0a3f96a148858ae8", - "reference": "236e7e1e3757e988fa06530c0a3f96a148858ae8", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.2", - "php": "^5.6 || ^7.0", - "zendframework/zend-eventmanager": "^3.2", - "zendframework/zend-http": "^2.7", - "zendframework/zend-modulemanager": "^2.8", - "zendframework/zend-router": "^3.0.2", - "zendframework/zend-servicemanager": "^3.3", - "zendframework/zend-stdlib": "^3.1", - "zendframework/zend-view": "^2.9" - }, - "require-dev": { - "http-interop/http-middleware": "^0.4.1", - "phpunit/phpunit": "^6.4.4 || ^5.7.14", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-json": "^2.6.1 || ^3.0", - "zendframework/zend-psr7bridge": "^1.0", - "zendframework/zend-stratigility": "^2.0.1" - }, - "suggest": { - "http-interop/http-middleware": "^0.4.1 to be used together with zend-stratigility", - "zendframework/zend-json": "(^2.6.1 || ^3.0) To auto-deserialize JSON body content in AbstractRestfulController extensions, when json_decode is unavailable", - "zendframework/zend-log": "^2.9.1 To provide log functionality via LogFilterManager, LogFormatterManager, and LogProcessorManager", - "zendframework/zend-mvc-console": "zend-mvc-console provides the ability to expose zend-mvc as a console application", - "zendframework/zend-mvc-i18n": "zend-mvc-i18n provides integration with zend-i18n, including a translation bridge and translatable route segments", - "zendframework/zend-mvc-plugin-fileprg": "To provide Post/Redirect/Get functionality around forms that container file uploads", - "zendframework/zend-mvc-plugin-flashmessenger": "To provide flash messaging capabilities between requests", - "zendframework/zend-mvc-plugin-identity": "To access the authenticated identity (per zend-authentication) in controllers", - "zendframework/zend-mvc-plugin-prg": "To provide Post/Redirect/Get functionality within controllers", - "zendframework/zend-paginator": "^2.7 To provide pagination functionality via PaginatorPluginManager", - "zendframework/zend-psr7bridge": "(^0.2) To consume PSR-7 middleware within the MVC workflow", - "zendframework/zend-servicemanager-di": "zend-servicemanager-di provides utilities for integrating zend-di and zend-servicemanager in your zend-mvc application", - "zendframework/zend-stratigility": "zend-stratigility is required to use middleware pipes in the MiddlewareListener" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev", - "dev-develop": "3.2-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Mvc\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Zend Framework's event-driven MVC layer, including MVC Applications, Controllers, and Plugins", - "keywords": [ - "ZendFramework", - "mvc", - "zf" - ], - "time": "2017-11-24T06:32:07+00:00" - }, - { - "name": "zendframework/zend-router", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-router.git", - "reference": "a80a7427afb8f736b9aeeb341a78dae855849291" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-router/zipball/a80a7427afb8f736b9aeeb341a78dae855849291", - "reference": "a80a7427afb8f736b9aeeb341a78dae855849291", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.2", - "php": "^5.6 || ^7.0", - "zendframework/zend-http": "^2.8.1", - "zendframework/zend-servicemanager": "^2.7.8 || ^3.3", - "zendframework/zend-stdlib": "^2.7.7 || ^3.1" - }, - "conflict": { - "zendframework/zend-mvc": "<3.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.22 || ^6.4.1", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-i18n": "^2.7.4" - }, - "suggest": { - "zendframework/zend-i18n": "^2.7.4, if defining translatable HTTP path segments" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev", - "dev-develop": "3.3.x-dev" - }, - "zf": { - "component": "Zend\\Router", - "config-provider": "Zend\\Router\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Zend\\Router\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Flexible routing system for HTTP and console applications", - "keywords": [ - "ZendFramework", - "mvc", - "routing", - "zend", - "zf" - ], - "time": "2018-08-01T22:24:35+00:00" - }, - { - "name": "zendframework/zend-servicemanager", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-servicemanager.git", - "reference": "9f35a104b8d4d3b32da5f4a3b6efc0dd62e5af42" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/9f35a104b8d4d3b32da5f4a3b6efc0dd62e5af42", - "reference": "9f35a104b8d4d3b32da5f4a3b6efc0dd62e5af42", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.2", - "php": "^5.6 || ^7.0", - "psr/container": "^1.0", - "zendframework/zend-stdlib": "^3.1" - }, - "provide": { - "container-interop/container-interop-implementation": "^1.2", - "psr/container-implementation": "^1.0" - }, - "require-dev": { - "mikey179/vfsstream": "^1.6.5", - "ocramius/proxy-manager": "^1.0 || ^2.0", - "phpbench/phpbench": "^0.13.0", - "phpunit/phpunit": "^5.7.25 || ^6.4.4", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "suggest": { - "ocramius/proxy-manager": "ProxyManager 1.* to handle lazy initialization of services", - "zendframework/zend-stdlib": "zend-stdlib ^2.5 if you wish to use the MergeReplaceKey or MergeRemoveKey features in Config instances" - }, - "bin": [ - "bin/generate-deps-for-config-factory", - "bin/generate-factory-for-class" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev", - "dev-develop": "4.0-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\ServiceManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Factory-Driven Dependency Injection Container", - "keywords": [ - "PSR-11", - "ZendFramework", - "dependency-injection", - "di", - "dic", - "service-manager", - "servicemanager", - "zf" - ], - "time": "2018-01-29T16:48:37+00:00" - }, - { - "name": "zendframework/zend-stdlib", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-stdlib.git", - "reference": "66536006722aff9e62d1b331025089b7ec71c065" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065", - "reference": "66536006722aff9e62d1b331025089b7ec71c065", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpbench/phpbench": "^0.13", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev", - "dev-develop": "3.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Stdlib\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "SPL extensions, array utilities, error handlers, and more", - "keywords": [ - "ZendFramework", - "stdlib", - "zf" - ], - "time": "2018-08-28T21:34:05+00:00" - }, - { - "name": "zendframework/zend-uri", - "version": "2.6.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-uri.git", - "reference": "3b6463645c6766f78ce537c70cb4fdabee1e725f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/3b6463645c6766f78ce537c70cb4fdabee1e725f", - "reference": "3b6463645c6766f78ce537c70cb4fdabee1e725f", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "zendframework/zend-escaper": "^2.5", - "zendframework/zend-validator": "^2.10" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.4", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Uri\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "A component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", - "keywords": [ - "ZendFramework", - "uri", - "zf" - ], - "time": "2018-04-30T13:40:08+00:00" - }, - { - "name": "zendframework/zend-validator", - "version": "2.11.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-validator.git", - "reference": "f0789b4c4c099afdd2ecc58cc209a26c64bd4f17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/f0789b4c4c099afdd2ecc58cc209a26c64bd4f17", - "reference": "f0789b4c4c099afdd2ecc58cc209a26c64bd4f17", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.1", - "php": "^5.6 || ^7.0", - "zendframework/zend-stdlib": "^2.7.6 || ^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.8 || ^5.7.15", - "psr/http-message": "^1.0", - "zendframework/zend-cache": "^2.6.1", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-config": "^2.6", - "zendframework/zend-db": "^2.7", - "zendframework/zend-filter": "^2.6", - "zendframework/zend-http": "^2.5.4", - "zendframework/zend-i18n": "^2.6", - "zendframework/zend-math": "^2.6", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", - "zendframework/zend-session": "^2.8", - "zendframework/zend-uri": "^2.5" - }, - "suggest": { - "psr/http-message": "psr/http-message, required when validating PSR-7 UploadedFileInterface instances via the Upload and UploadFile validators", - "zendframework/zend-db": "Zend\\Db component, required by the (No)RecordExists validator", - "zendframework/zend-filter": "Zend\\Filter component, required by the Digits validator", - "zendframework/zend-i18n": "Zend\\I18n component to allow translation of validation error messages", - "zendframework/zend-i18n-resources": "Translations of validator messages", - "zendframework/zend-math": "Zend\\Math component, required by the Csrf validator", - "zendframework/zend-servicemanager": "Zend\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", - "zendframework/zend-session": "Zend\\Session component, ^2.8; required by the Csrf validator", - "zendframework/zend-uri": "Zend\\Uri component, required by the Uri and Sitemap\\Loc validators" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11.x-dev", - "dev-develop": "2.12.x-dev" - }, - "zf": { - "component": "Zend\\Validator", - "config-provider": "Zend\\Validator\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Zend\\Validator\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides a set of commonly needed validators", - "homepage": "https://github.com/zendframework/zend-validator", - "keywords": [ - "validator", - "zf2" - ], - "time": "2018-12-13T21:23:15+00:00" - }, - { - "name": "zendframework/zend-view", - "version": "2.11.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-view.git", - "reference": "0428d6b2a67c7058451394921c90c5576ac5b373" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-view/zipball/0428d6b2a67c7058451394921c90c5576ac5b373", - "reference": "0428d6b2a67c7058451394921c90c5576ac5b373", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", - "zendframework/zend-json": "^2.6.1 || ^3.0", - "zendframework/zend-loader": "^2.5", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.15 || ^6.0.8", - "zendframework/zend-authentication": "^2.5", - "zendframework/zend-cache": "^2.6.1", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-config": "^2.6", - "zendframework/zend-console": "^2.6", - "zendframework/zend-escaper": "^2.5", - "zendframework/zend-feed": "^2.7", - "zendframework/zend-filter": "^2.6.1", - "zendframework/zend-http": "^2.5.4", - "zendframework/zend-i18n": "^2.6", - "zendframework/zend-log": "^2.7", - "zendframework/zend-modulemanager": "^2.7.1", - "zendframework/zend-mvc": "^2.7.14 || ^3.0", - "zendframework/zend-navigation": "^2.5", - "zendframework/zend-paginator": "^2.5", - "zendframework/zend-permissions-acl": "^2.6", - "zendframework/zend-router": "^3.0.1", - "zendframework/zend-serializer": "^2.6.1", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", - "zendframework/zend-session": "^2.8.1", - "zendframework/zend-uri": "^2.5" - }, - "suggest": { - "zendframework/zend-authentication": "Zend\\Authentication component", - "zendframework/zend-escaper": "Zend\\Escaper component", - "zendframework/zend-feed": "Zend\\Feed component", - "zendframework/zend-filter": "Zend\\Filter component", - "zendframework/zend-http": "Zend\\Http component", - "zendframework/zend-i18n": "Zend\\I18n component", - "zendframework/zend-mvc": "Zend\\Mvc component", - "zendframework/zend-mvc-plugin-flashmessenger": "zend-mvc-plugin-flashmessenger component, if you want to use the FlashMessenger view helper with zend-mvc versions 3 and up", - "zendframework/zend-navigation": "Zend\\Navigation component", - "zendframework/zend-paginator": "Zend\\Paginator component", - "zendframework/zend-permissions-acl": "Zend\\Permissions\\Acl component", - "zendframework/zend-servicemanager": "Zend\\ServiceManager component", - "zendframework/zend-uri": "Zend\\Uri component" - }, - "bin": [ - "bin/templatemap_generator.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11.x-dev", - "dev-develop": "2.12.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\View\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides a system of helpers, output filters, and variable escaping", - "homepage": "https://github.com/zendframework/zend-view", - "keywords": [ - "view", - "zf2" - ], - "time": "2018-12-10T16:37:55+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.2" - }, - "platform-dev": [] -} diff --git a/frameworks/PHP/zend/config.toml b/frameworks/PHP/zend/config.toml deleted file mode 100644 index 5064274cae5..00000000000 --- a/frameworks/PHP/zend/config.toml +++ /dev/null @@ -1,18 +0,0 @@ -[framework] -name = "zend" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -approach = "Realistic" -classification = "Fullstack" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "FPM/FastCGI" -webserver = "nginx" -versus = "php" diff --git a/frameworks/PHP/zend/config/application.config.php b/frameworks/PHP/zend/config/application.config.php deleted file mode 100644 index 25dde8b67ec..00000000000 --- a/frameworks/PHP/zend/config/application.config.php +++ /dev/null @@ -1,18 +0,0 @@ - array( - 'Zend\Router', - 'Zend\Db', - 'FrameworkBenchmarks', - ), - 'module_listener_options' => array( - 'module_paths' => array(), - 'config_glob_paths' => array( - 'config/autoload/{,*.}{global,local}.php', - ), - 'config_cache_enabled' => true, - 'config_cache_key' => 'config_cache', - 'cache_dir' => 'data/cache', - 'check_dependencies' => false, - ), -); diff --git a/frameworks/PHP/zend/config/autoload/benchmarks.local.php b/frameworks/PHP/zend/config/autoload/benchmarks.local.php deleted file mode 100644 index 78528842719..00000000000 --- a/frameworks/PHP/zend/config/autoload/benchmarks.local.php +++ /dev/null @@ -1,13 +0,0 @@ - array( - 'driver' => 'Pdo', - 'dsn' => 'mysql:dbname=hello_world;host=tfb-database;port=3306', - 'username' => 'benchmarkdbuser', - 'password' => 'benchmarkdbpass', - 'driver_options' => array( - PDO::ATTR_PERSISTENT => true - ), - ), -); diff --git a/frameworks/PHP/zend/deploy/conf/php-fpm.conf b/frameworks/PHP/zend/deploy/conf/php-fpm.conf deleted file mode 100644 index 9c4744138df..00000000000 --- a/frameworks/PHP/zend/deploy/conf/php-fpm.conf +++ /dev/null @@ -1,551 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;; -; FPM Configuration ; -;;;;;;;;;;;;;;;;;;;;; - -; All relative paths in this configuration file are relative to PHP's install -; prefix (/usr). This prefix can be dynamically changed by using the -; '-p' argument from the command line. - -;;;;;;;;;;;;;;;;;; -; Global Options ; -;;;;;;;;;;;;;;;;;; - -[global] -; Pid file -; Note: the default prefix is /var -; Default Value: none -pid = /run/php/php7.3-fpm.pid - -; Error log file -; If it's set to "syslog", log is sent to syslogd instead of being written -; into a local file. -; Note: the default prefix is /var -; Default Value: log/php-fpm.log -;error_log = /var/log/php7.3-fpm.log -error_log = /dev/stderr - - -; syslog_facility is used to specify what type of program is logging the -; message. This lets syslogd specify that messages from different facilities -; will be handled differently. -; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON) -; Default Value: daemon -;syslog.facility = daemon - -; syslog_ident is prepended to every message. If you have multiple FPM -; instances running on the same server, you can change the default value -; which must suit common needs. -; Default Value: php-fpm -;syslog.ident = php-fpm - -; Log level -; Possible Values: alert, error, warning, notice, debug -; Default Value: notice -;log_level = notice - -; If this number of child processes exit with SIGSEGV or SIGBUS within the time -; interval set by emergency_restart_interval then FPM will restart. A value -; of '0' means 'Off'. -; Default Value: 0 -;emergency_restart_threshold = 0 - -; Interval of time used by emergency_restart_interval to determine when -; a graceful restart will be initiated. This can be useful to work around -; accidental corruptions in an accelerator's shared memory. -; Available Units: s(econds), m(inutes), h(ours), or d(ays) -; Default Unit: seconds -; Default Value: 0 -;emergency_restart_interval = 0 - -; Time limit for child processes to wait for a reaction on signals from master. -; Available units: s(econds), m(inutes), h(ours), or d(ays) -; Default Unit: seconds -; Default Value: 0 -;process_control_timeout = 0 - -; The maximum number of processes FPM will fork. This has been designed to control -; the global number of processes when using dynamic PM within a lot of pools. -; Use it with caution. -; Note: A value of 0 indicates no limit -; Default Value: 0 -; process.max = 128 - -; Specify the nice(2) priority to apply to the master process (only if set) -; The value can vary from -19 (highest priority) to 20 (lowest priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool process will inherit the master process priority -; unless specified otherwise -; Default Value: no set -; process.priority = -19 - -; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging. -; Default Value: yes -;daemonize = yes - -; Set open file descriptor rlimit for the master process. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit for the master process. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Specify the event mechanism FPM will use. The following is available: -; - select (any POSIX os) -; - poll (any POSIX os) -; - epoll (linux >= 2.5.44) -; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0) -; - /dev/poll (Solaris >= 7) -; - port (Solaris >= 10) -; Default Value: not set (auto detection) -;events.mechanism = epoll - -; When FPM is built with systemd integration, specify the interval, -; in seconds, between health report notification to systemd. -; Set to 0 to disable. -; Available Units: s(econds), m(inutes), h(ours) -; Default Unit: seconds -; Default value: 10 -systemd_interval = 0 - -;;;;;;;;;;;;;;;;;;;; -; Pool Definitions ; -;;;;;;;;;;;;;;;;;;;; - -; Multiple pools of child processes may be started with different listening -; ports and different management options. The name of the pool will be -; used in logs and stats. There is no limitation on the number of pools which -; FPM can handle. Your system will tell you anyway :) - -; Include one or more files. If glob(3) exists, it is used to include a bunch of -; files from a glob(3) pattern. This directive can be used everywhere in the -; file. -; Relative path can also be used. They will be prefixed by: -; - the global prefix if it's been set (-p argument) -; - /usr otherwise -;include=/etc/php/7.3/fpm/pool.d/*.conf - -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[www] - -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = www-data -group = www-data - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /run/php/php7.3-fpm.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -listen.backlog = 65535 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = static - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 1024 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 512 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 50 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 512 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.3/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; Depth of slow log stack trace. -; Default Value: 20 -;request_slowlog_trace_depth = 20 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_terminate_timeout = 0 - -; Set open file descriptor rlimit. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -;chdir = /var/www - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M \ No newline at end of file diff --git a/frameworks/PHP/zend/deploy/conf/php.ini b/frameworks/PHP/zend/deploy/conf/php.ini deleted file mode 100644 index d2e924cf326..00000000000 --- a/frameworks/PHP/zend/deploy/conf/php.ini +++ /dev/null @@ -1,1914 +0,0 @@ -[PHP] - -;;;;;;;;;;;;;;;;;;; -; About php.ini ; -;;;;;;;;;;;;;;;;;;; -; PHP's initialization file, generally called php.ini, is responsible for -; configuring many of the aspects of PHP's behavior. - -; PHP attempts to find and load this configuration from a number of locations. -; The following is a summary of its search order: -; 1. SAPI module specific location. -; 2. The PHPRC environment variable. (As of PHP 5.2.0) -; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) -; 4. Current working directory (except CLI) -; 5. The web server's directory (for SAPI modules), or directory of PHP -; (otherwise in Windows) -; 6. The directory from the --with-config-file-path compile time option, or the -; Windows directory (C:\windows or C:\winnt) -; See the PHP docs for more specific information. -; http://php.net/configuration.file - -; The syntax of the file is extremely simple. Whitespace and lines -; beginning with a semicolon are silently ignored (as you probably guessed). -; Section headers (e.g. [Foo]) are also silently ignored, even though -; they might mean something in the future. - -; Directives following the section heading [PATH=/www/mysite] only -; apply to PHP files in the /www/mysite directory. Directives -; following the section heading [HOST=www.example.com] only apply to -; PHP files served from www.example.com. Directives set in these -; special sections cannot be overridden by user-defined INI files or -; at runtime. Currently, [PATH=] and [HOST=] sections only work under -; CGI/FastCGI. -; http://php.net/ini.sections - -; Directives are specified using the following syntax: -; directive = value -; Directive names are *case sensitive* - foo=bar is different from FOO=bar. -; Directives are variables used to configure PHP or PHP extensions. -; There is no name validation. If PHP can't find an expected -; directive because it is not set or is mistyped, a default value will be used. - -; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one -; of the INI constants (On, Off, True, False, Yes, No and None) or an expression -; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a -; previously set variable or directive (e.g. ${foo}) - -; Expressions in the INI file are limited to bitwise operators and parentheses: -; | bitwise OR -; ^ bitwise XOR -; & bitwise AND -; ~ bitwise NOT -; ! boolean NOT - -; Boolean flags can be turned on using the values 1, On, True or Yes. -; They can be turned off using the values 0, Off, False or No. - -; An empty string can be denoted by simply not writing anything after the equal -; sign, or by using the None keyword: - -; foo = ; sets foo to an empty string -; foo = None ; sets foo to an empty string -; foo = "None" ; sets foo to the string 'None' - -; If you use constants in your value, and these constants belong to a -; dynamically loaded extension (either a PHP extension or a Zend extension), -; you may only use these constants *after* the line that loads the extension. - -;;;;;;;;;;;;;;;;;;; -; About this file ; -;;;;;;;;;;;;;;;;;;; -; PHP comes packaged with two INI files. One that is recommended to be used -; in production environments and one that is recommended to be used in -; development environments. - -; php.ini-production contains settings which hold security, performance and -; best practices at its core. But please be aware, these settings may break -; compatibility with older or less security conscience applications. We -; recommending using the production ini in production and testing environments. - -; php.ini-development is very similar to its production variant, except it is -; much more verbose when it comes to errors. We recommend using the -; development version only in development environments, as errors shown to -; application users can inadvertently leak otherwise secure information. - -; This is php.ini-production INI file. - -;;;;;;;;;;;;;;;;;;; -; Quick Reference ; -;;;;;;;;;;;;;;;;;;; -; The following are all the settings which are different in either the production -; or development versions of the INIs with respect to PHP's default behavior. -; Please see the actual settings later in the document for more details as to why -; we recommend these changes in PHP's behavior. - -; display_errors -; Default Value: On -; Development Value: On -; Production Value: Off - -; display_startup_errors -; Default Value: Off -; Development Value: On -; Production Value: Off - -; error_reporting -; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED -; Development Value: E_ALL -; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT - -; html_errors -; Default Value: On -; Development Value: On -; Production value: On - -; log_errors -; Default Value: Off -; Development Value: On -; Production Value: On - -; max_input_time -; Default Value: -1 (Unlimited) -; Development Value: 60 (60 seconds) -; Production Value: 60 (60 seconds) - -; output_buffering -; Default Value: Off -; Development Value: 4096 -; Production Value: 4096 - -; register_argc_argv -; Default Value: On -; Development Value: Off -; Production Value: Off - -; request_order -; Default Value: None -; Development Value: "GP" -; Production Value: "GP" - -; session.gc_divisor -; Default Value: 100 -; Development Value: 1000 -; Production Value: 1000 - -; session.sid_bits_per_character -; Default Value: 4 -; Development Value: 5 -; Production Value: 5 - -; short_open_tag -; Default Value: On -; Development Value: Off -; Production Value: Off - -; track_errors -; Default Value: Off -; Development Value: On -; Production Value: Off - -; variables_order -; Default Value: "EGPCS" -; Development Value: "GPCS" -; Production Value: "GPCS" - -;;;;;;;;;;;;;;;;;;;; -; php.ini Options ; -;;;;;;;;;;;;;;;;;;;; -; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" -;user_ini.filename = ".user.ini" - -; To disable this feature set this option to empty value -;user_ini.filename = - -; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) -;user_ini.cache_ttl = 300 - -;;;;;;;;;;;;;;;;;;;; -; Language Options ; -;;;;;;;;;;;;;;;;;;;; - -; Enable the PHP scripting language engine under Apache. -; http://php.net/engine -engine = On - -; This directive determines whether or not PHP will recognize code between -; tags as PHP source which should be processed as such. It is -; generally recommended that should be used and that this feature -; should be disabled, as enabling it may result in issues when generating XML -; documents, however this remains supported for backward compatibility reasons. -; Note that this directive does not control the would work. -; http://php.net/syntax-highlighting -;highlight.string = #DD0000 -;highlight.comment = #FF9900 -;highlight.keyword = #007700 -;highlight.default = #0000BB -;highlight.html = #000000 - -; If enabled, the request will be allowed to complete even if the user aborts -; the request. Consider enabling it if executing long requests, which may end up -; being interrupted by the user or a browser timing out. PHP's default behavior -; is to disable this feature. -; http://php.net/ignore-user-abort -;ignore_user_abort = On - -; Determines the size of the realpath cache to be used by PHP. This value should -; be increased on systems where PHP opens many files to reflect the quantity of -; the file operations performed. -; http://php.net/realpath-cache-size -realpath_cache_size = 4096k - -; Duration of time, in seconds for which to cache realpath information for a given -; file or directory. For systems with rarely changing files, consider increasing this -; value. -; http://php.net/realpath-cache-ttl -realpath_cache_ttl = 600 - -; Enables or disables the circular reference collector. -; http://php.net/zend.enable-gc -zend.enable_gc = On - -; If enabled, scripts may be written in encodings that are incompatible with -; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such -; encodings. To use this feature, mbstring extension must be enabled. -; Default: Off -;zend.multibyte = Off - -; Allows to set the default encoding for the scripts. This value will be used -; unless "declare(encoding=...)" directive appears at the top of the script. -; Only affects if zend.multibyte is set. -; Default: "" -;zend.script_encoding = - -;;;;;;;;;;;;;;;;; -; Miscellaneous ; -;;;;;;;;;;;;;;;;; - -; Decides whether PHP may expose the fact that it is installed on the server -; (e.g. by adding its signature to the Web server header). It is no security -; threat in any way, but it makes it possible to determine whether you use PHP -; on your server or not. -; http://php.net/expose-php -expose_php = Off - -;;;;;;;;;;;;;;;;;;; -; Resource Limits ; -;;;;;;;;;;;;;;;;;;; - -; Maximum execution time of each script, in seconds -; http://php.net/max-execution-time -; Note: This directive is hardcoded to 0 for the CLI SAPI -max_execution_time = 30 - -; Maximum amount of time each script may spend parsing request data. It's a good -; idea to limit this time on productions servers in order to eliminate unexpectedly -; long running scripts. -; Note: This directive is hardcoded to -1 for the CLI SAPI -; Default Value: -1 (Unlimited) -; Development Value: 60 (60 seconds) -; Production Value: 60 (60 seconds) -; http://php.net/max-input-time -max_input_time = 60 - -; Maximum input variable nesting level -; http://php.net/max-input-nesting-level -;max_input_nesting_level = 64 - -; How many GET/POST/COOKIE input variables may be accepted -; max_input_vars = 1000 - -; Maximum amount of memory a script may consume (128MB) -; http://php.net/memory-limit -memory_limit = 128M - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Error handling and logging ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; This directive informs PHP of which errors, warnings and notices you would like -; it to take action for. The recommended way of setting values for this -; directive is through the use of the error level constants and bitwise -; operators. The error level constants are below here for convenience as well as -; some common settings and their meanings. -; By default, PHP is set to take action on all errors, notices and warnings EXCEPT -; those related to E_NOTICE and E_STRICT, which together cover best practices and -; recommended coding standards in PHP. For performance reasons, this is the -; recommend error reporting setting. Your production server shouldn't be wasting -; resources complaining about best practices and coding standards. That's what -; development servers and development settings are for. -; Note: The php.ini-development file has this setting as E_ALL. This -; means it pretty much reports everything which is exactly what you want during -; development and early testing. -; -; Error Level Constants: -; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) -; E_ERROR - fatal run-time errors -; E_RECOVERABLE_ERROR - almost fatal run-time errors -; E_WARNING - run-time warnings (non-fatal errors) -; E_PARSE - compile-time parse errors -; E_NOTICE - run-time notices (these are warnings which often result -; from a bug in your code, but it's possible that it was -; intentional (e.g., using an uninitialized variable and -; relying on the fact it is automatically initialized to an -; empty string) -; E_STRICT - run-time notices, enable to have PHP suggest changes -; to your code which will ensure the best interoperability -; and forward compatibility of your code -; E_CORE_ERROR - fatal errors that occur during PHP's initial startup -; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's -; initial startup -; E_COMPILE_ERROR - fatal compile-time errors -; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) -; E_USER_ERROR - user-generated error message -; E_USER_WARNING - user-generated warning message -; E_USER_NOTICE - user-generated notice message -; E_DEPRECATED - warn about code that will not work in future versions -; of PHP -; E_USER_DEPRECATED - user-generated deprecation warnings -; -; Common Values: -; E_ALL (Show all errors, warnings and notices including coding standards.) -; E_ALL & ~E_NOTICE (Show all errors, except for notices) -; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) -; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) -; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED -; Development Value: E_ALL -; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT -; http://php.net/error-reporting -error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT - -; This directive controls whether or not and where PHP will output errors, -; notices and warnings too. Error output is very useful during development, but -; it could be very dangerous in production environments. Depending on the code -; which is triggering the error, sensitive information could potentially leak -; out of your application such as database usernames and passwords or worse. -; For production environments, we recommend logging errors rather than -; sending them to STDOUT. -; Possible Values: -; Off = Do not display any errors -; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) -; On or stdout = Display errors to STDOUT -; Default Value: On -; Development Value: On -; Production Value: Off -; http://php.net/display-errors -display_errors = Off - -; The display of errors which occur during PHP's startup sequence are handled -; separately from display_errors. PHP's default behavior is to suppress those -; errors from clients. Turning the display of startup errors on can be useful in -; debugging configuration problems. We strongly recommend you -; set this to 'off' for production servers. -; Default Value: Off -; Development Value: On -; Production Value: Off -; http://php.net/display-startup-errors -display_startup_errors = Off - -; Besides displaying errors, PHP can also log errors to locations such as a -; server-specific log, STDERR, or a location specified by the error_log -; directive found below. While errors should not be displayed on productions -; servers they should still be monitored and logging is a great way to do that. -; Default Value: Off -; Development Value: On -; Production Value: On -; http://php.net/log-errors -log_errors = On - -; Set maximum length of log_errors. In error_log information about the source is -; added. The default is 1024 and 0 allows to not apply any maximum length at all. -; http://php.net/log-errors-max-len -log_errors_max_len = 1024 - -; Do not log repeated messages. Repeated errors must occur in same file on same -; line unless ignore_repeated_source is set true. -; http://php.net/ignore-repeated-errors -ignore_repeated_errors = Off - -; Ignore source of message when ignoring repeated messages. When this setting -; is On you will not log errors with repeated messages from different files or -; source lines. -; http://php.net/ignore-repeated-source -ignore_repeated_source = Off - -; If this parameter is set to Off, then memory leaks will not be shown (on -; stdout or in the log). This has only effect in a debug compile, and if -; error reporting includes E_WARNING in the allowed list -; http://php.net/report-memleaks -report_memleaks = On - -; This setting is on by default. -;report_zend_debug = 0 - -; Store the last error/warning message in $php_errormsg (boolean). Setting this value -; to On can assist in debugging and is appropriate for development servers. It should -; however be disabled on production servers. -; This directive is DEPRECATED. -; Default Value: Off -; Development Value: Off -; Production Value: Off -; http://php.net/track-errors -;track_errors = Off - -; Turn off normal error reporting and emit XML-RPC error XML -; http://php.net/xmlrpc-errors -;xmlrpc_errors = 0 - -; An XML-RPC faultCode -;xmlrpc_error_number = 0 - -; When PHP displays or logs an error, it has the capability of formatting the -; error message as HTML for easier reading. This directive controls whether -; the error message is formatted as HTML or not. -; Note: This directive is hardcoded to Off for the CLI SAPI -; Default Value: On -; Development Value: On -; Production value: On -; http://php.net/html-errors -html_errors = On - -; If html_errors is set to On *and* docref_root is not empty, then PHP -; produces clickable error messages that direct to a page describing the error -; or function causing the error in detail. -; You can download a copy of the PHP manual from http://php.net/docs -; and change docref_root to the base URL of your local copy including the -; leading '/'. You must also specify the file extension being used including -; the dot. PHP's default behavior is to leave these settings empty, in which -; case no links to documentation are generated. -; Note: Never use this feature for production boxes. -; http://php.net/docref-root -; Examples -;docref_root = "/phpmanual/" - -; http://php.net/docref-ext -;docref_ext = .html - -; String to output before an error message. PHP's default behavior is to leave -; this setting blank. -; http://php.net/error-prepend-string -; Example: -;error_prepend_string = "" - -; String to output after an error message. PHP's default behavior is to leave -; this setting blank. -; http://php.net/error-append-string -; Example: -;error_append_string = "" - -; Log errors to specified file. PHP's default behavior is to leave this value -; empty. -; http://php.net/error-log -; Example: -;error_log = php_errors.log -; Log errors to syslog (Event Log on Windows). -;error_log = syslog - -;windows.show_crt_warning -; Default value: 0 -; Development value: 0 -; Production value: 0 - -;;;;;;;;;;;;;;;;; -; Data Handling ; -;;;;;;;;;;;;;;;;; - -; The separator used in PHP generated URLs to separate arguments. -; PHP's default setting is "&". -; http://php.net/arg-separator.output -; Example: -;arg_separator.output = "&" - -; List of separator(s) used by PHP to parse input URLs into variables. -; PHP's default setting is "&". -; NOTE: Every character in this directive is considered as separator! -; http://php.net/arg-separator.input -; Example: -;arg_separator.input = ";&" - -; This directive determines which super global arrays are registered when PHP -; starts up. G,P,C,E & S are abbreviations for the following respective super -; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty -; paid for the registration of these arrays and because ENV is not as commonly -; used as the others, ENV is not recommended on productions servers. You -; can still get access to the environment variables through getenv() should you -; need to. -; Default Value: "EGPCS" -; Development Value: "GPCS" -; Production Value: "GPCS"; -; http://php.net/variables-order -variables_order = "GPCS" - -; This directive determines which super global data (G,P & C) should be -; registered into the super global array REQUEST. If so, it also determines -; the order in which that data is registered. The values for this directive -; are specified in the same manner as the variables_order directive, -; EXCEPT one. Leaving this value empty will cause PHP to use the value set -; in the variables_order directive. It does not mean it will leave the super -; globals array REQUEST empty. -; Default Value: None -; Development Value: "GP" -; Production Value: "GP" -; http://php.net/request-order -request_order = "GP" - -; This directive determines whether PHP registers $argv & $argc each time it -; runs. $argv contains an array of all the arguments passed to PHP when a script -; is invoked. $argc contains an integer representing the number of arguments -; that were passed when the script was invoked. These arrays are extremely -; useful when running scripts from the command line. When this directive is -; enabled, registering these variables consumes CPU cycles and memory each time -; a script is executed. For performance reasons, this feature should be disabled -; on production servers. -; Note: This directive is hardcoded to On for the CLI SAPI -; Default Value: On -; Development Value: Off -; Production Value: Off -; http://php.net/register-argc-argv -register_argc_argv = Off - -; When enabled, the ENV, REQUEST and SERVER variables are created when they're -; first used (Just In Time) instead of when the script starts. If these -; variables are not used within a script, having this directive on will result -; in a performance gain. The PHP directive register_argc_argv must be disabled -; for this directive to have any affect. -; http://php.net/auto-globals-jit -auto_globals_jit = On - -; Whether PHP will read the POST data. -; This option is enabled by default. -; Most likely, you won't want to disable this option globally. It causes $_POST -; and $_FILES to always be empty; the only way you will be able to read the -; POST data will be through the php://input stream wrapper. This can be useful -; to proxy requests or to process the POST data in a memory efficient fashion. -; http://php.net/enable-post-data-reading -;enable_post_data_reading = Off - -; Maximum size of POST data that PHP will accept. -; Its value may be 0 to disable the limit. It is ignored if POST data reading -; is disabled through enable_post_data_reading. -; http://php.net/post-max-size -post_max_size = 8M - -; Automatically add files before PHP document. -; http://php.net/auto-prepend-file -auto_prepend_file = - -; Automatically add files after PHP document. -; http://php.net/auto-append-file -auto_append_file = - -; By default, PHP will output a media type using the Content-Type header. To -; disable this, simply set it to be empty. -; -; PHP's built-in default media type is set to text/html. -; http://php.net/default-mimetype -default_mimetype = "text/html" - -; PHP's default character set is set to UTF-8. -; http://php.net/default-charset -default_charset = "UTF-8" - -; PHP internal character encoding is set to empty. -; If empty, default_charset is used. -; http://php.net/internal-encoding -;internal_encoding = - -; PHP input character encoding is set to empty. -; If empty, default_charset is used. -; http://php.net/input-encoding -;input_encoding = - -; PHP output character encoding is set to empty. -; If empty, default_charset is used. -; See also output_buffer. -; http://php.net/output-encoding -;output_encoding = - -;;;;;;;;;;;;;;;;;;;;;;;;; -; Paths and Directories ; -;;;;;;;;;;;;;;;;;;;;;;;;; - -; UNIX: "/path1:/path2" -;include_path = ".:/usr/share/php" -; -; Windows: "\path1;\path2" -;include_path = ".;c:\php\includes" -; -; PHP's default setting for include_path is ".;/path/to/php/pear" -; http://php.net/include-path - -; The root of the PHP pages, used only if nonempty. -; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root -; if you are running php as a CGI under any web server (other than IIS) -; see documentation for security issues. The alternate is to use the -; cgi.force_redirect configuration below -; http://php.net/doc-root -doc_root = - -; The directory under which PHP opens the script using /~username used only -; if nonempty. -; http://php.net/user-dir -user_dir = - -; Directory in which the loadable extensions (modules) reside. -; http://php.net/extension-dir -; extension_dir = "./" -; On windows: -; extension_dir = "ext" - -; Directory where the temporary files should be placed. -; Defaults to the system default (see sys_get_temp_dir) -; sys_temp_dir = "/tmp" - -; Whether or not to enable the dl() function. The dl() function does NOT work -; properly in multithreaded servers, such as IIS or Zeus, and is automatically -; disabled on them. -; http://php.net/enable-dl -enable_dl = Off - -; cgi.force_redirect is necessary to provide security running PHP as a CGI under -; most web servers. Left undefined, PHP turns this on by default. You can -; turn it off here AT YOUR OWN RISK -; **You CAN safely turn this off for IIS, in fact, you MUST.** -; http://php.net/cgi.force-redirect -;cgi.force_redirect = 1 - -; if cgi.nph is enabled it will force cgi to always sent Status: 200 with -; every request. PHP's default behavior is to disable this feature. -;cgi.nph = 1 - -; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape -; (iPlanet) web servers, you MAY need to set an environment variable name that PHP -; will look for to know it is OK to continue execution. Setting this variable MAY -; cause security issues, KNOW WHAT YOU ARE DOING FIRST. -; http://php.net/cgi.redirect-status-env -;cgi.redirect_status_env = - -; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's -; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok -; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting -; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting -; of zero causes PHP to behave as before. Default is 1. You should fix your scripts -; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. -; http://php.net/cgi.fix-pathinfo - cgi.fix_pathinfo=0 - -; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside -; of the web tree and people will not be able to circumvent .htaccess security. -; http://php.net/cgi.dicard-path -;cgi.discard_path=1 - -; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate -; security tokens of the calling client. This allows IIS to define the -; security context that the request runs under. mod_fastcgi under Apache -; does not currently support this feature (03/17/2002) -; Set to 1 if running under IIS. Default is zero. -; http://php.net/fastcgi.impersonate -;fastcgi.impersonate = 1 - -; Disable logging through FastCGI connection. PHP's default behavior is to enable -; this feature. -;fastcgi.logging = 0 - -; cgi.rfc2616_headers configuration option tells PHP what type of headers to -; use when sending HTTP response code. If set to 0, PHP sends Status: header that -; is supported by Apache. When this option is set to 1, PHP will send -; RFC2616 compliant header. -; Default is zero. -; http://php.net/cgi.rfc2616-headers -;cgi.rfc2616_headers = 0 - -; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! -; (shebang) at the top of the running script. This line might be needed if the -; script support running both as stand-alone script and via PHP CGI<. PHP in CGI -; mode skips this line and ignores its content if this directive is turned on. -; http://php.net/cgi.check-shebang-line -;cgi.check_shebang_line=1 - -;;;;;;;;;;;;;;;; -; File Uploads ; -;;;;;;;;;;;;;;;; - -; Whether to allow HTTP file uploads. -; http://php.net/file-uploads -file_uploads = On - -; Temporary directory for HTTP uploaded files (will use system default if not -; specified). -; http://php.net/upload-tmp-dir -;upload_tmp_dir = - -; Maximum allowed size for uploaded files. -; http://php.net/upload-max-filesize -upload_max_filesize = 2M - -; Maximum number of files that can be uploaded via a single request -max_file_uploads = 20 - -;;;;;;;;;;;;;;;;;; -; Fopen wrappers ; -;;;;;;;;;;;;;;;;;; - -; Whether to allow the treatment of URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-fopen -allow_url_fopen = On - -; Whether to allow include/require to open URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-include -allow_url_include = Off - -; Define the anonymous ftp password (your email address). PHP's default setting -; for this is empty. -; http://php.net/from -;from="john@doe.com" - -; Define the User-Agent string. PHP's default setting for this is empty. -; http://php.net/user-agent -;user_agent="PHP" - -; Default timeout for socket based streams (seconds) -; http://php.net/default-socket-timeout -default_socket_timeout = 60 - -; If your scripts have to deal with files from Macintosh systems, -; or you are running on a Mac and need to deal with files from -; unix or win32 systems, setting this flag will cause PHP to -; automatically detect the EOL character in those files so that -; fgets() and file() will work regardless of the source of the file. -; http://php.net/auto-detect-line-endings -;auto_detect_line_endings = Off - -;;;;;;;;;;;;;;;;;;;;;; -; Dynamic Extensions ; -;;;;;;;;;;;;;;;;;;;;;; - -; If you wish to have an extension loaded automatically, use the following -; syntax: -; -; extension=modulename -; -; For example: -; -; extension=mysqli -; -; When the extension library to load is not located in the default extension -; directory, You may specify an absolute path to the library file: -; -; extension=/path/to/extension/mysqli.so -; -; Note : The syntax used in previous PHP versions ('extension=.so' and -; 'extension='php_.dll') is supported for legacy reasons and may be -; deprecated in a future PHP major version. So, when it is possible, please -; move to the new ('extension=) syntax. -; -; Notes for Windows environments : -; -; - ODBC support is built in, so no dll is needed for it. -; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) -; extension folders as well as the separate PECL DLL download (PHP 5+). -; Be sure to appropriately set the extension_dir directive. -; -;extension=bz2 -;extension=curl -;extension=fileinfo -;extension=gd2 -;extension=gettext -;extension=gmp -;extension=intl -;extension=imap -;extension=interbase -;extension=ldap -;extension=mbstring -;extension=exif ; Must be after mbstring as it depends on it -;extension=mysqli -;extension=oci8_12c ; Use with Oracle Database 12c Instant Client -;extension=openssl -;extension=pdo_firebird -;extension=pdo_mysql -;extension=pdo_oci -;extension=pdo_odbc -;extension=pdo_pgsql -;extension=pdo_sqlite -;extension=pgsql -;extension=shmop - -; The MIBS data available in the PHP distribution must be installed. -; See http://www.php.net/manual/en/snmp.installation.php -;extension=snmp - -;extension=soap -;extension=sockets -;extension=sqlite3 -;extension=tidy -;extension=xmlrpc -;extension=xsl - -;;;;;;;;;;;;;;;;;;; -; Module Settings ; -;;;;;;;;;;;;;;;;;;; - -[CLI Server] -; Whether the CLI web server uses ANSI color coding in its terminal output. -cli_server.color = On - -[Date] -; Defines the default timezone used by the date functions -; http://php.net/date.timezone -date.timezone = UTC - -; http://php.net/date.default-latitude -;date.default_latitude = 31.7667 - -; http://php.net/date.default-longitude -;date.default_longitude = 35.2333 - -; http://php.net/date.sunrise-zenith -;date.sunrise_zenith = 90.583333 - -; http://php.net/date.sunset-zenith -;date.sunset_zenith = 90.583333 - -[filter] -; http://php.net/filter.default -;filter.default = unsafe_raw - -; http://php.net/filter.default-flags -;filter.default_flags = - -[iconv] -; Use of this INI entry is deprecated, use global input_encoding instead. -; If empty, default_charset or input_encoding or iconv.input_encoding is used. -; The precedence is: default_charset < intput_encoding < iconv.input_encoding -;iconv.input_encoding = - -; Use of this INI entry is deprecated, use global internal_encoding instead. -; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. -; The precedence is: default_charset < internal_encoding < iconv.internal_encoding -;iconv.internal_encoding = - -; Use of this INI entry is deprecated, use global output_encoding instead. -; If empty, default_charset or output_encoding or iconv.output_encoding is used. -; The precedence is: default_charset < output_encoding < iconv.output_encoding -; To use an output encoding conversion, iconv's output handler must be set -; otherwise output encoding conversion cannot be performed. -;iconv.output_encoding = - -[intl] -;intl.default_locale = -; This directive allows you to produce PHP errors when some error -; happens within intl functions. The value is the level of the error produced. -; Default is 0, which does not produce any errors. -;intl.error_level = E_WARNING -;intl.use_exceptions = 0 - -[sqlite3] -;sqlite3.extension_dir = - -[Pcre] -;PCRE library backtracking limit. -; http://php.net/pcre.backtrack-limit -;pcre.backtrack_limit=100000 - -;PCRE library recursion limit. -;Please note that if you set this value to a high number you may consume all -;the available process stack and eventually crash PHP (due to reaching the -;stack size limit imposed by the Operating System). -; http://php.net/pcre.recursion-limit -;pcre.recursion_limit=100000 - -;Enables or disables JIT compilation of patterns. This requires the PCRE -;library to be compiled with JIT support. -;pcre.jit=1 - -[Pdo] -; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" -; http://php.net/pdo-odbc.connection-pooling -;pdo_odbc.connection_pooling=strict - -;pdo_odbc.db2_instance_name - -[Pdo_mysql] -; If mysqlnd is used: Number of cache slots for the internal result set cache -; http://php.net/pdo_mysql.cache_size -pdo_mysql.cache_size = 2000 - -; Default socket name for local MySQL connects. If empty, uses the built-in -; MySQL defaults. -; http://php.net/pdo_mysql.default-socket -pdo_mysql.default_socket= - -[Phar] -; http://php.net/phar.readonly -;phar.readonly = On - -; http://php.net/phar.require-hash -;phar.require_hash = On - -;phar.cache_list = - -[mail function] -; For Win32 only. -; http://php.net/smtp -SMTP = localhost -; http://php.net/smtp-port -smtp_port = 25 - -; For Win32 only. -; http://php.net/sendmail-from -;sendmail_from = me@example.com - -; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). -; http://php.net/sendmail-path -;sendmail_path = - -; Force the addition of the specified parameters to be passed as extra parameters -; to the sendmail binary. These parameters will always replace the value of -; the 5th parameter to mail(). -;mail.force_extra_parameters = - -; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename -mail.add_x_header = On - -; The path to a log file that will log all mail() calls. Log entries include -; the full path of the script, line number, To address and headers. -;mail.log = -; Log mail to syslog (Event Log on Windows). -;mail.log = syslog - -[ODBC] -; http://php.net/odbc.default-db -;odbc.default_db = Not yet implemented - -; http://php.net/odbc.default-user -;odbc.default_user = Not yet implemented - -; http://php.net/odbc.default-pw -;odbc.default_pw = Not yet implemented - -; Controls the ODBC cursor model. -; Default: SQL_CURSOR_STATIC (default). -;odbc.default_cursortype - -; Allow or prevent persistent links. -; http://php.net/odbc.allow-persistent -odbc.allow_persistent = On - -; Check that a connection is still valid before reuse. -; http://php.net/odbc.check-persistent -odbc.check_persistent = On - -; Maximum number of persistent links. -1 means no limit. -; http://php.net/odbc.max-persistent -odbc.max_persistent = -1 - -; Maximum number of links (persistent + non-persistent). -1 means no limit. -; http://php.net/odbc.max-links -odbc.max_links = -1 - -; Handling of LONG fields. Returns number of bytes to variables. 0 means -; passthru. -; http://php.net/odbc.defaultlrl -odbc.defaultlrl = 4096 - -; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. -; See the documentation on odbc_binmode and odbc_longreadlen for an explanation -; of odbc.defaultlrl and odbc.defaultbinmode -; http://php.net/odbc.defaultbinmode -odbc.defaultbinmode = 1 - -;birdstep.max_links = -1 - -[Interbase] -; Allow or prevent persistent links. -ibase.allow_persistent = 1 - -; Maximum number of persistent links. -1 means no limit. -ibase.max_persistent = -1 - -; Maximum number of links (persistent + non-persistent). -1 means no limit. -ibase.max_links = -1 - -; Default database name for ibase_connect(). -;ibase.default_db = - -; Default username for ibase_connect(). -;ibase.default_user = - -; Default password for ibase_connect(). -;ibase.default_password = - -; Default charset for ibase_connect(). -;ibase.default_charset = - -; Default timestamp format. -ibase.timestampformat = "%Y-%m-%d %H:%M:%S" - -; Default date format. -ibase.dateformat = "%Y-%m-%d" - -; Default time format. -ibase.timeformat = "%H:%M:%S" - -[MySQLi] - -; Maximum number of persistent links. -1 means no limit. -; http://php.net/mysqli.max-persistent -mysqli.max_persistent = -1 - -; Allow accessing, from PHP's perspective, local files with LOAD DATA statements -; http://php.net/mysqli.allow_local_infile -;mysqli.allow_local_infile = On - -; Allow or prevent persistent links. -; http://php.net/mysqli.allow-persistent -mysqli.allow_persistent = On - -; Maximum number of links. -1 means no limit. -; http://php.net/mysqli.max-links -mysqli.max_links = -1 - -; If mysqlnd is used: Number of cache slots for the internal result set cache -; http://php.net/mysqli.cache_size -mysqli.cache_size = 2000 - -; Default port number for mysqli_connect(). If unset, mysqli_connect() will use -; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the -; compile-time value defined MYSQL_PORT (in that order). Win32 will only look -; at MYSQL_PORT. -; http://php.net/mysqli.default-port -mysqli.default_port = 3306 - -; Default socket name for local MySQL connects. If empty, uses the built-in -; MySQL defaults. -; http://php.net/mysqli.default-socket -mysqli.default_socket = - -; Default host for mysql_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-host -mysqli.default_host = - -; Default user for mysql_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-user -mysqli.default_user = - -; Default password for mysqli_connect() (doesn't apply in safe mode). -; Note that this is generally a *bad* idea to store passwords in this file. -; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") -; and reveal this password! And of course, any users with read access to this -; file will be able to reveal the password as well. -; http://php.net/mysqli.default-pw -mysqli.default_pw = - -; Allow or prevent reconnect -mysqli.reconnect = Off - -[mysqlnd] -; Enable / Disable collection of general statistics by mysqlnd which can be -; used to tune and monitor MySQL operations. -; http://php.net/mysqlnd.collect_statistics -mysqlnd.collect_statistics = Off - -; Enable / Disable collection of memory usage statistics by mysqlnd which can be -; used to tune and monitor MySQL operations. -; http://php.net/mysqlnd.collect_memory_statistics -mysqlnd.collect_memory_statistics = Off - -; Records communication from all extensions using mysqlnd to the specified log -; file. -; http://php.net/mysqlnd.debug -;mysqlnd.debug = - -; Defines which queries will be logged. -; http://php.net/mysqlnd.log_mask -;mysqlnd.log_mask = 0 - -; Default size of the mysqlnd memory pool, which is used by result sets. -; http://php.net/mysqlnd.mempool_default_size -;mysqlnd.mempool_default_size = 16000 - -; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. -; http://php.net/mysqlnd.net_cmd_buffer_size -;mysqlnd.net_cmd_buffer_size = 2048 - -; Size of a pre-allocated buffer used for reading data sent by the server in -; bytes. -; http://php.net/mysqlnd.net_read_buffer_size -;mysqlnd.net_read_buffer_size = 32768 - -; Timeout for network requests in seconds. -; http://php.net/mysqlnd.net_read_timeout -;mysqlnd.net_read_timeout = 31536000 - -; SHA-256 Authentication Plugin related. File with the MySQL server public RSA -; key. -; http://php.net/mysqlnd.sha256_server_public_key -;mysqlnd.sha256_server_public_key = - -[OCI8] - -; Connection: Enables privileged connections using external -; credentials (OCI_SYSOPER, OCI_SYSDBA) -; http://php.net/oci8.privileged-connect -;oci8.privileged_connect = Off - -; Connection: The maximum number of persistent OCI8 connections per -; process. Using -1 means no limit. -; http://php.net/oci8.max-persistent -;oci8.max_persistent = -1 - -; Connection: The maximum number of seconds a process is allowed to -; maintain an idle persistent connection. Using -1 means idle -; persistent connections will be maintained forever. -; http://php.net/oci8.persistent-timeout -;oci8.persistent_timeout = -1 - -; Connection: The number of seconds that must pass before issuing a -; ping during oci_pconnect() to check the connection validity. When -; set to 0, each oci_pconnect() will cause a ping. Using -1 disables -; pings completely. -; http://php.net/oci8.ping-interval -;oci8.ping_interval = 60 - -; Connection: Set this to a user chosen connection class to be used -; for all pooled server requests with Oracle 11g Database Resident -; Connection Pooling (DRCP). To use DRCP, this value should be set to -; the same string for all web servers running the same application, -; the database pool must be configured, and the connection string must -; specify to use a pooled server. -;oci8.connection_class = - -; High Availability: Using On lets PHP receive Fast Application -; Notification (FAN) events generated when a database node fails. The -; database must also be configured to post FAN events. -;oci8.events = Off - -; Tuning: This option enables statement caching, and specifies how -; many statements to cache. Using 0 disables statement caching. -; http://php.net/oci8.statement-cache-size -;oci8.statement_cache_size = 20 - -; Tuning: Enables statement prefetching and sets the default number of -; rows that will be fetched automatically after statement execution. -; http://php.net/oci8.default-prefetch -;oci8.default_prefetch = 100 - -; Compatibility. Using On means oci_close() will not close -; oci_connect() and oci_new_connect() connections. -; http://php.net/oci8.old-oci-close-semantics -;oci8.old_oci_close_semantics = Off - -[PostgreSQL] -; Allow or prevent persistent links. -; http://php.net/pgsql.allow-persistent -pgsql.allow_persistent = On - -; Detect broken persistent links always with pg_pconnect(). -; Auto reset feature requires a little overheads. -; http://php.net/pgsql.auto-reset-persistent -pgsql.auto_reset_persistent = Off - -; Maximum number of persistent links. -1 means no limit. -; http://php.net/pgsql.max-persistent -pgsql.max_persistent = -1 - -; Maximum number of links (persistent+non persistent). -1 means no limit. -; http://php.net/pgsql.max-links -pgsql.max_links = -1 - -; Ignore PostgreSQL backends Notice message or not. -; Notice message logging require a little overheads. -; http://php.net/pgsql.ignore-notice -pgsql.ignore_notice = 0 - -; Log PostgreSQL backends Notice message or not. -; Unless pgsql.ignore_notice=0, module cannot log notice message. -; http://php.net/pgsql.log-notice -pgsql.log_notice = 0 - -[bcmath] -; Number of decimal digits for all bcmath functions. -; http://php.net/bcmath.scale -bcmath.scale = 0 - -[browscap] -; http://php.net/browscap -;browscap = extra/browscap.ini - -[Session] -; Handler used to store/retrieve data. -; http://php.net/session.save-handler -session.save_handler = files - -; Argument passed to save_handler. In the case of files, this is the path -; where data files are stored. Note: Windows users have to change this -; variable in order to use PHP's session functions. -; -; The path can be defined as: -; -; session.save_path = "N;/path" -; -; where N is an integer. Instead of storing all the session files in -; /path, what this will do is use subdirectories N-levels deep, and -; store the session data in those directories. This is useful if -; your OS has problems with many files in one directory, and is -; a more efficient layout for servers that handle many sessions. -; -; NOTE 1: PHP will not create this directory structure automatically. -; You can use the script in the ext/session dir for that purpose. -; NOTE 2: See the section on garbage collection below if you choose to -; use subdirectories for session storage -; -; The file storage module creates files using mode 600 by default. -; You can change that by using -; -; session.save_path = "N;MODE;/path" -; -; where MODE is the octal representation of the mode. Note that this -; does not overwrite the process's umask. -; http://php.net/session.save-path -;session.save_path = "/var/lib/php/sessions" - -; Whether to use strict session mode. -; Strict session mode does not accept uninitialized session ID and regenerate -; session ID if browser sends uninitialized session ID. Strict mode protects -; applications from session fixation via session adoption vulnerability. It is -; disabled by default for maximum compatibility, but enabling it is encouraged. -; https://wiki.php.net/rfc/strict_sessions -session.use_strict_mode = 0 - -; Whether to use cookies. -; http://php.net/session.use-cookies -session.use_cookies = 1 - -; http://php.net/session.cookie-secure -;session.cookie_secure = - -; This option forces PHP to fetch and use a cookie for storing and maintaining -; the session id. We encourage this operation as it's very helpful in combating -; session hijacking when not specifying and managing your own session id. It is -; not the be-all and end-all of session hijacking defense, but it's a good start. -; http://php.net/session.use-only-cookies -session.use_only_cookies = 1 - -; Name of the session (used as cookie name). -; http://php.net/session.name -session.name = PHPSESSID - -; Initialize session on request startup. -; http://php.net/session.auto-start -session.auto_start = 0 - -; Lifetime in seconds of cookie or, if 0, until browser is restarted. -; http://php.net/session.cookie-lifetime -session.cookie_lifetime = 0 - -; The path for which the cookie is valid. -; http://php.net/session.cookie-path -session.cookie_path = / - -; The domain for which the cookie is valid. -; http://php.net/session.cookie-domain -session.cookie_domain = - -; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. -; http://php.net/session.cookie-httponly -session.cookie_httponly = - -; Handler used to serialize data. php is the standard serializer of PHP. -; http://php.net/session.serialize-handler -session.serialize_handler = php - -; Defines the probability that the 'garbage collection' process is started -; on every session initialization. The probability is calculated by using -; gc_probability/gc_divisor. Where session.gc_probability is the numerator -; and gc_divisor is the denominator in the equation. Setting this value to 1 -; when the session.gc_divisor value is 100 will give you approximately a 1% chance -; the gc will run on any give request. -; Default Value: 1 -; Development Value: 1 -; Production Value: 1 -; http://php.net/session.gc-probability -session.gc_probability = 0 - -; Defines the probability that the 'garbage collection' process is started on every -; session initialization. The probability is calculated by using the following equation: -; gc_probability/gc_divisor. Where session.gc_probability is the numerator and -; session.gc_divisor is the denominator in the equation. Setting this value to 1 -; when the session.gc_divisor value is 100 will give you approximately a 1% chance -; the gc will run on any give request. Increasing this value to 1000 will give you -; a 0.1% chance the gc will run on any give request. For high volume production servers, -; this is a more efficient approach. -; Default Value: 100 -; Development Value: 1000 -; Production Value: 1000 -; http://php.net/session.gc-divisor -session.gc_divisor = 1000 - -; After this number of seconds, stored data will be seen as 'garbage' and -; cleaned up by the garbage collection process. -; http://php.net/session.gc-maxlifetime -session.gc_maxlifetime = 1440 - -; NOTE: If you are using the subdirectory option for storing session files -; (see session.save_path above), then garbage collection does *not* -; happen automatically. You will need to do your own garbage -; collection through a shell script, cron entry, or some other method. -; For example, the following script would is the equivalent of -; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): -; find /path/to/sessions -cmin +24 -type f | xargs rm - -; Check HTTP Referer to invalidate externally stored URLs containing ids. -; HTTP_REFERER has to contain this substring for the session to be -; considered as valid. -; http://php.net/session.referer-check -session.referer_check = - -; Set to {nocache,private,public,} to determine HTTP caching aspects -; or leave this empty to avoid sending anti-caching headers. -; http://php.net/session.cache-limiter -session.cache_limiter = nocache - -; Document expires after n minutes. -; http://php.net/session.cache-expire -session.cache_expire = 180 - -; trans sid support is disabled by default. -; Use of trans sid may risk your users' security. -; Use this option with caution. -; - User may send URL contains active session ID -; to other person via. email/irc/etc. -; - URL that contains active session ID may be stored -; in publicly accessible computer. -; - User may access your site with the same session ID -; always using URL stored in browser's history or bookmarks. -; http://php.net/session.use-trans-sid -session.use_trans_sid = 0 - -; Set session ID character length. This value could be between 22 to 256. -; Shorter length than default is supported only for compatibility reason. -; Users should use 32 or more chars. -; http://php.net/session.sid-length -; Default Value: 32 -; Development Value: 26 -; Production Value: 26 -session.sid_length = 26 - -; The URL rewriter will look for URLs in a defined set of HTML tags. -; is special; if you include them here, the rewriter will -; add a hidden field with the info which is otherwise appended -; to URLs. tag's action attribute URL will not be modified -; unless it is specified. -; Note that all valid entries require a "=", even if no value follows. -; Default Value: "a=href,area=href,frame=src,form=" -; Development Value: "a=href,area=href,frame=src,form=" -; Production Value: "a=href,area=href,frame=src,form=" -; http://php.net/url-rewriter.tags -session.trans_sid_tags = "a=href,area=href,frame=src,form=" - -; URL rewriter does not rewrite absolute URLs by default. -; To enable rewrites for absolute pathes, target hosts must be specified -; at RUNTIME. i.e. use ini_set() -; tags is special. PHP will check action attribute's URL regardless -; of session.trans_sid_tags setting. -; If no host is defined, HTTP_HOST will be used for allowed host. -; Example value: php.net,www.php.net,wiki.php.net -; Use "," for multiple hosts. No spaces are allowed. -; Default Value: "" -; Development Value: "" -; Production Value: "" -;session.trans_sid_hosts="" - -; Define how many bits are stored in each character when converting -; the binary hash data to something readable. -; Possible values: -; 4 (4 bits: 0-9, a-f) -; 5 (5 bits: 0-9, a-v) -; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") -; Default Value: 4 -; Development Value: 5 -; Production Value: 5 -; http://php.net/session.hash-bits-per-character -session.sid_bits_per_character = 5 - -; Enable upload progress tracking in $_SESSION -; Default Value: On -; Development Value: On -; Production Value: On -; http://php.net/session.upload-progress.enabled -;session.upload_progress.enabled = On - -; Cleanup the progress information as soon as all POST data has been read -; (i.e. upload completed). -; Default Value: On -; Development Value: On -; Production Value: On -; http://php.net/session.upload-progress.cleanup -;session.upload_progress.cleanup = On - -; A prefix used for the upload progress key in $_SESSION -; Default Value: "upload_progress_" -; Development Value: "upload_progress_" -; Production Value: "upload_progress_" -; http://php.net/session.upload-progress.prefix -;session.upload_progress.prefix = "upload_progress_" - -; The index name (concatenated with the prefix) in $_SESSION -; containing the upload progress information -; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" -; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" -; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" -; http://php.net/session.upload-progress.name -;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" - -; How frequently the upload progress should be updated. -; Given either in percentages (per-file), or in bytes -; Default Value: "1%" -; Development Value: "1%" -; Production Value: "1%" -; http://php.net/session.upload-progress.freq -;session.upload_progress.freq = "1%" - -; The minimum delay between updates, in seconds -; Default Value: 1 -; Development Value: 1 -; Production Value: 1 -; http://php.net/session.upload-progress.min-freq -;session.upload_progress.min_freq = "1" - -; Only write session data when session data is changed. Enabled by default. -; http://php.net/session.lazy-write -;session.lazy_write = On - -[Assertion] -; Switch whether to compile assertions at all (to have no overhead at run-time) -; -1: Do not compile at all -; 0: Jump over assertion at run-time -; 1: Execute assertions -; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) -; Default Value: 1 -; Development Value: 1 -; Production Value: -1 -; http://php.net/zend.assertions -zend.assertions = -1 - -; Assert(expr); active by default. -; http://php.net/assert.active -;assert.active = On - -; Throw an AssertationException on failed assertions -; http://php.net/assert.exception -;assert.exception = On - -; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) -; http://php.net/assert.warning -;assert.warning = On - -; Don't bail out by default. -; http://php.net/assert.bail -;assert.bail = Off - -; User-function to be called if an assertion fails. -; http://php.net/assert.callback -;assert.callback = 0 - -; Eval the expression with current error_reporting(). Set to true if you want -; error_reporting(0) around the eval(). -; http://php.net/assert.quiet-eval -;assert.quiet_eval = 0 - -[COM] -; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs -; http://php.net/com.typelib-file -;com.typelib_file = - -; allow Distributed-COM calls -; http://php.net/com.allow-dcom -;com.allow_dcom = true - -; autoregister constants of a components typlib on com_load() -; http://php.net/com.autoregister-typelib -;com.autoregister_typelib = true - -; register constants casesensitive -; http://php.net/com.autoregister-casesensitive -;com.autoregister_casesensitive = false - -; show warnings on duplicate constant registrations -; http://php.net/com.autoregister-verbose -;com.autoregister_verbose = true - -; The default character set code-page to use when passing strings to and from COM objects. -; Default: system ANSI code page -;com.code_page= - -[mbstring] -; language for internal character representation. -; This affects mb_send_mail() and mbstring.detect_order. -; http://php.net/mbstring.language -;mbstring.language = Japanese - -; Use of this INI entry is deprecated, use global internal_encoding instead. -; internal/script encoding. -; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) -; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. -; The precedence is: default_charset < internal_encoding < iconv.internal_encoding -;mbstring.internal_encoding = - -; Use of this INI entry is deprecated, use global input_encoding instead. -; http input encoding. -; mbstring.encoding_traslation = On is needed to use this setting. -; If empty, default_charset or input_encoding or mbstring.input is used. -; The precedence is: default_charset < intput_encoding < mbsting.http_input -; http://php.net/mbstring.http-input -;mbstring.http_input = - -; Use of this INI entry is deprecated, use global output_encoding instead. -; http output encoding. -; mb_output_handler must be registered as output buffer to function. -; If empty, default_charset or output_encoding or mbstring.http_output is used. -; The precedence is: default_charset < output_encoding < mbstring.http_output -; To use an output encoding conversion, mbstring's output handler must be set -; otherwise output encoding conversion cannot be performed. -; http://php.net/mbstring.http-output -;mbstring.http_output = - -; enable automatic encoding translation according to -; mbstring.internal_encoding setting. Input chars are -; converted to internal encoding by setting this to On. -; Note: Do _not_ use automatic encoding translation for -; portable libs/applications. -; http://php.net/mbstring.encoding-translation -;mbstring.encoding_translation = Off - -; automatic encoding detection order. -; "auto" detect order is changed according to mbstring.language -; http://php.net/mbstring.detect-order -;mbstring.detect_order = auto - -; substitute_character used when character cannot be converted -; one from another -; http://php.net/mbstring.substitute-character -;mbstring.substitute_character = none - -; overload(replace) single byte functions by mbstring functions. -; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), -; etc. Possible values are 0,1,2,4 or combination of them. -; For example, 7 for overload everything. -; 0: No overload -; 1: Overload mail() function -; 2: Overload str*() functions -; 4: Overload ereg*() functions -; http://php.net/mbstring.func-overload -;mbstring.func_overload = 0 - -; enable strict encoding detection. -; Default: Off -;mbstring.strict_detection = On - -; This directive specifies the regex pattern of content types for which mb_output_handler() -; is activated. -; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) -;mbstring.http_output_conv_mimetype= - -[gd] -; Tell the jpeg decode to ignore warnings and try to create -; a gd image. The warning will then be displayed as notices -; disabled by default -; http://php.net/gd.jpeg-ignore-warning -;gd.jpeg_ignore_warning = 1 - -[exif] -; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. -; With mbstring support this will automatically be converted into the encoding -; given by corresponding encode setting. When empty mbstring.internal_encoding -; is used. For the decode settings you can distinguish between motorola and -; intel byte order. A decode setting cannot be empty. -; http://php.net/exif.encode-unicode -;exif.encode_unicode = ISO-8859-15 - -; http://php.net/exif.decode-unicode-motorola -;exif.decode_unicode_motorola = UCS-2BE - -; http://php.net/exif.decode-unicode-intel -;exif.decode_unicode_intel = UCS-2LE - -; http://php.net/exif.encode-jis -;exif.encode_jis = - -; http://php.net/exif.decode-jis-motorola -;exif.decode_jis_motorola = JIS - -; http://php.net/exif.decode-jis-intel -;exif.decode_jis_intel = JIS - -[Tidy] -; The path to a default tidy configuration file to use when using tidy -; http://php.net/tidy.default-config -;tidy.default_config = /usr/local/lib/php/default.tcfg - -; Should tidy clean and repair output automatically? -; WARNING: Do not use this option if you are generating non-html content -; such as dynamic images -; http://php.net/tidy.clean-output -tidy.clean_output = Off - -[soap] -; Enables or disables WSDL caching feature. -; http://php.net/soap.wsdl-cache-enabled -soap.wsdl_cache_enabled=1 - -; Sets the directory name where SOAP extension will put cache files. -; http://php.net/soap.wsdl-cache-dir -soap.wsdl_cache_dir="/tmp" - -; (time to live) Sets the number of second while cached file will be used -; instead of original one. -; http://php.net/soap.wsdl-cache-ttl -soap.wsdl_cache_ttl=86400 - -; Sets the size of the cache limit. (Max. number of WSDL files to cache) -soap.wsdl_cache_limit = 5 - -[sysvshm] -; A default size of the shared memory segment -;sysvshm.init_mem = 10000 - -[ldap] -; Sets the maximum number of open links or -1 for unlimited. -ldap.max_links = -1 - -[dba] -;dba.default_handler= - -[opcache] -; Determines if Zend OPCache is enabled -opcache.enable=1 - -; Determines if Zend OPCache is enabled for the CLI version of PHP -;opcache.enable_cli=0 - -; The OPcache shared memory storage size. -;opcache.memory_consumption=128 - -; The amount of memory for interned strings in Mbytes. -;opcache.interned_strings_buffer=8 - -; The maximum number of keys (scripts) in the OPcache hash table. -; Only numbers between 200 and 1000000 are allowed. -;opcache.max_accelerated_files=10000 - -; The maximum percentage of "wasted" memory until a restart is scheduled. -;opcache.max_wasted_percentage=5 - -; When this directive is enabled, the OPcache appends the current working -; directory to the script key, thus eliminating possible collisions between -; files with the same name (basename). Disabling the directive improves -; performance, but may break existing applications. -;opcache.use_cwd=1 - -; When disabled, you must reset the OPcache manually or restart the -; webserver for changes to the filesystem to take effect. -opcache.validate_timestamps=0 - -; How often (in seconds) to check file timestamps for changes to the shared -; memory storage allocation. ("1" means validate once per second, but only -; once per request. "0" means always validate) -;opcache.revalidate_freq=2 - -; Enables or disables file search in include_path optimization -;opcache.revalidate_path=0 - -; If disabled, all PHPDoc comments are dropped from the code to reduce the -; size of the optimized code. -opcache.save_comments=0 - -; Allow file existence override (file_exists, etc.) performance feature. -opcache.enable_file_override=1 - -; A bitmask, where each bit enables or disables the appropriate OPcache -; passes -;opcache.optimization_level=0xffffffff - -;opcache.inherited_hack=1 -;opcache.dups_fix=0 - -; The location of the OPcache blacklist file (wildcards allowed). -; Each OPcache blacklist file is a text file that holds the names of files -; that should not be accelerated. The file format is to add each filename -; to a new line. The filename may be a full path or just a file prefix -; (i.e., /var/www/x blacklists all the files and directories in /var/www -; that start with 'x'). Line starting with a ; are ignored (comments). -;opcache.blacklist_filename= - -; Allows exclusion of large files from being cached. By default all files -; are cached. -;opcache.max_file_size=0 - -; Check the cache checksum each N requests. -; The default value of "0" means that the checks are disabled. -;opcache.consistency_checks=0 - -; How long to wait (in seconds) for a scheduled restart to begin if the cache -; is not being accessed. -;opcache.force_restart_timeout=180 - -; OPcache error_log file name. Empty string assumes "stderr". -;opcache.error_log= - -; All OPcache errors go to the Web server log. -; By default, only fatal errors (level 0) or errors (level 1) are logged. -; You can also enable warnings (level 2), info messages (level 3) or -; debug messages (level 4). -;opcache.log_verbosity_level=1 - -; Preferred Shared Memory back-end. Leave empty and let the system decide. -;opcache.preferred_memory_model= - -; Protect the shared memory from unexpected writing during script execution. -; Useful for internal debugging only. -;opcache.protect_memory=0 - -; Allows calling OPcache API functions only from PHP scripts which path is -; started from specified string. The default "" means no restriction -;opcache.restrict_api= - -; Mapping base of shared memory segments (for Windows only). All the PHP -; processes have to map shared memory into the same address space. This -; directive allows to manually fix the "Unable to reattach to base address" -; errors. -;opcache.mmap_base= - -; Enables and sets the second level cache directory. -; It should improve performance when SHM memory is full, at server restart or -; SHM reset. The default "" disables file based caching. -;opcache.file_cache= - -; Enables or disables opcode caching in shared memory. -;opcache.file_cache_only=0 - -; Enables or disables checksum validation when script loaded from file cache. -;opcache.file_cache_consistency_checks=1 - -; Implies opcache.file_cache_only=1 for a certain process that failed to -; reattach to the shared memory (for Windows only). Explicitly enabled file -; cache is required. -;opcache.file_cache_fallback=1 - -; Enables or disables copying of PHP code (text segment) into HUGE PAGES. -; This should improve performance, but requires appropriate OS configuration. -opcache.huge_code_pages=1 - -; Validate cached file permissions. -;opcache.validate_permission=0 - -; Prevent name collisions in chroot'ed environment. -;opcache.validate_root=0 - -[curl] -; A default value for the CURLOPT_CAINFO option. This is required to be an -; absolute path. -;curl.cainfo = - -[openssl] -; The location of a Certificate Authority (CA) file on the local filesystem -; to use when verifying the identity of SSL/TLS peers. Most users should -; not specify a value for this directive as PHP will attempt to use the -; OS-managed cert stores in its absence. If specified, this value may still -; be overridden on a per-stream basis via the "cafile" SSL stream context -; option. -;openssl.cafile= - -; If openssl.cafile is not specified or if the CA file is not found, the -; directory pointed to by openssl.capath is searched for a suitable -; certificate. This value must be a correctly hashed certificate directory. -; Most users should not specify a value for this directive as PHP will -; attempt to use the OS-managed cert stores in its absence. If specified, -; this value may still be overridden on a per-stream basis via the "capath" -; SSL stream context option. -;openssl.capath= - -; Local Variables: -; tab-width: 4 -; End: \ No newline at end of file diff --git a/frameworks/PHP/zend/deploy/nginx.conf b/frameworks/PHP/zend/deploy/nginx.conf deleted file mode 100644 index 3fea2eb49b2..00000000000 --- a/frameworks/PHP/zend/deploy/nginx.conf +++ /dev/null @@ -1,43 +0,0 @@ -user www-data; -worker_processes auto; -error_log stderr error; -worker_rlimit_nofile 200000; - -events { - worker_connections 16384; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - access_log off; - server_tokens off; - - sendfile on; - - keepalive_timeout 65; - keepalive_disable none; - keepalive_requests 10000; - - upstream fastcgi_backend { - server unix:/var/run/php/php7.3-fpm.sock; - keepalive 40; - } - - server { - listen 8080; - server_name localhost; - - root /zend/public/; - index index.php; - - location / { - fastcgi_pass fastcgi_backend; - fastcgi_keep_conn on; - fastcgi_param SCRIPT_FILENAME $document_root/index.php; - fastcgi_param PATH_INFO $uri; - include /etc/nginx/fastcgi_params; - } - } -} diff --git a/frameworks/PHP/zend/deploy/php-zend-framework b/frameworks/PHP/zend/deploy/php-zend-framework deleted file mode 100644 index fc48b0f8f0c..00000000000 --- a/frameworks/PHP/zend/deploy/php-zend-framework +++ /dev/null @@ -1,9 +0,0 @@ - - Alias /php-zend-framework/ "/home/ubuntu/FrameworkBenchmarks/php-zend-framework/public/" - - Options Indexes FollowSymLinks MultiViews - #AllowOverride None - Order allow,deny - allow from all - - diff --git a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Controller/BenchController.php b/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Controller/BenchController.php deleted file mode 100644 index f685d1b73e9..00000000000 --- a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Controller/BenchController.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @link http://www.techempower.com/benchmarks - */ -class BenchController extends AbstractActionController -{ - /** - * @var \Zend\Db\TableGateway\TableGateway - */ - protected $tableGateway; - - /** - * @param TableGateway $tableGateway - */ - public function __construct(TableGateway $tableGateway) - { - $this->tableGateway = $tableGateway; - } - - public function jsonAction() - { - return new JsonModel(array('message' => 'Hello, World!')); - } - - /** - * @return \Zend\View\Model\JsonModel - */ - public function dbAction() - { - $result = $this->tableGateway->select(array('id' => mt_rand(1, 10000))); - - foreach ($result as $return) { - return new JsonModel($return); - } - - return $this->notFoundAction(); - } - - /** - * @return \Zend\View\Model\JsonModel - */ - public function queriesAction() - { - /* @var $request \Zend\Http\Request */ - $request = $this->getRequest(); - $queries = (int) $request->getQuery('queries', 1); - $queries = max(1, $queries); - $queries = min(500, $queries); - - $worlds = array(); - - for ($i = 0; $i < $queries; $i += 1) { - foreach ($this->tableGateway->select(array('id' => mt_rand(1, 10000))) as $found) { - $worlds[] = $found; - } - } - - return new JsonModel($worlds); - } - - public function updatesAction() - { - $request = $this->getRequest(); - $queries = (int) $request->getQuery('queries', 1); - $queries = max(1, $queries); - $queries = min(500, $queries); - - $worlds = array(); - - for ($i = 0; $i < $queries; $i += 1) { - $id = mt_rand(1, 10000); - foreach ($this->tableGateway->select(array('id' => $id)) as $found) { - $random_number = mt_rand(1, 10000); - $found->randomNumber = $random_number; - $this->tableGateway->update(array('randomNumber' => $random_number), array('id' => $id)); - $worlds[] = $found; - } - } - - return new JsonModel($worlds); - } - - public function plaintextAction() - { - $response = $this->getResponse(); - $response->getHeaders()->addHeaders(array('COntent-Type' => 'text/plain')); - $response->setContent('Hello, World!'); - return $response; - } -} diff --git a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Entity/World.php b/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Entity/World.php deleted file mode 100644 index 462a563e443..00000000000 --- a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Entity/World.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @link http://www.techempower.com/benchmarks - */ -class World extends ArrayObject -{ - /** - * @var int - */ - public $id; - - /** - * @var int - */ - public $randomNumber; - - /** - * @param array $data - */ - public function exchangeArray($data) - { - $this->id = (int) $data['id']; - $this->randomNumber = (int) $data['randomNumber']; - } - - /** - * @return array - */ - public function toArray() - { - return array('id' => $this->id, 'randomNumber' => $this->randomNumber); - } -} diff --git a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Module.php b/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Module.php deleted file mode 100644 index 1eb6c0e2761..00000000000 --- a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/Module.php +++ /dev/null @@ -1,95 +0,0 @@ - - * @link http://www.techempower.com/benchmarks - */ -class Module -{ - /** - * @return array - */ - public function getConfig() - { - return array( - 'router' => array( - 'routes' => array( - 'plaintext' => array( - 'type' => 'Zend\Router\Http\Literal', - 'options' => array( - 'route' => '/plaintext', - 'defaults' => array( - 'controller' => 'FrameworkBenchmarks\Controller\BenchController', - 'action' => 'plaintext', - ), - ), - ), - 'json' => array( - 'type' => 'Zend\Router\Http\Literal', - 'options' => array( - 'route' => '/json', - 'defaults' => array( - 'controller' => 'FrameworkBenchmarks\Controller\BenchController', - 'action' => 'json', - ), - ), - ), - 'db' => array( - 'type' => 'Zend\Router\Http\Literal', - 'options' => array( - 'route' => '/db', - 'defaults' => array( - 'controller' => 'FrameworkBenchmarks\Controller\BenchController', - 'action' => 'db', - ), - ), - ), - 'queries' => array( - 'type' => 'Zend\Router\Http\Literal', - 'options' => array( - 'route' => '/queries', - 'defaults' => array( - 'controller' => 'FrameworkBenchmarks\Controller\BenchController', - 'action' => 'queries', - ), - ), - ), - 'updates' => array( - 'type' => 'Zend\Router\Http\Literal', - 'options' => array( - 'route' => '/updates', - 'defaults' => array( - 'controller' => 'FrameworkBenchmarks\Controller\BenchController', - 'action' => 'updates', - ), - ), - ), - ), - ), - 'db' => array( - 'driver' => 'Pdo', - 'dsn' => 'mysql:dbname=hello_world;host=localhost', - ), - 'controllers' => array( - 'factories' => array( - 'FrameworkBenchmarks\Controller\BenchController' - => 'FrameworkBenchmarks\ServiceFactory\BenchControllerServiceFactory' - ), - ), - 'service_manager' => array( - 'factories' => array( - 'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', - ), - ), - 'view_manager' => array( - 'strategies' => array( - 'ViewJsonStrategy', - ), - ), - ); - } -} diff --git a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/ServiceFactory/BenchControllerServiceFactory.php b/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/ServiceFactory/BenchControllerServiceFactory.php deleted file mode 100644 index 8d455eac51a..00000000000 --- a/frameworks/PHP/zend/module/FrameworkBenchmarks/src/FrameworkBenchmarks/ServiceFactory/BenchControllerServiceFactory.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @link http://www.techempower.com/benchmarks - */ -class BenchControllerServiceFactory -{ - /** - * {@inheritDoc} - * - * @return \FrameworkBenchmarks\Controller\DbController - */ - public function __invoke(\Psr\Container\ContainerInterface $container) - { - /* @var $dbAdapter \Zend\Db\Adapter\AdapterInterface */ - $dbAdapter = $container->get('Zend\Db\Adapter\Adapter'); - $resultSetPrototype = new ResultSet(); - - $resultSetPrototype->setArrayObjectPrototype(new World()); - - return new BenchController(new TableGateway('World', $dbAdapter, null, $resultSetPrototype)); - } -} diff --git a/frameworks/PHP/zend/public/.htaccess b/frameworks/PHP/zend/public/.htaccess deleted file mode 100644 index a02263cb14a..00000000000 --- a/frameworks/PHP/zend/public/.htaccess +++ /dev/null @@ -1,16 +0,0 @@ -RewriteEngine On -# The following rule tells Apache that if the requested filename -# exists, simply serve it. -RewriteCond %{REQUEST_FILENAME} -s [OR] -RewriteCond %{REQUEST_FILENAME} -l [OR] -RewriteCond %{REQUEST_FILENAME} -d -RewriteRule ^.*$ - [NC,L] -# The following rewrites all other queries to index.php. The -# condition ensures that if you are using Apache aliases to do -# mass virtual hosting, the base path will be prepended to -# allow proper resolution of the index.php file; it will work -# in non-aliased environments as well, providing a safe, one-size -# fits all solution. -RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ -RewriteRule ^(.*) - [E=BASE:%1] -RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] \ No newline at end of file diff --git a/frameworks/PHP/zend/public/index.php b/frameworks/PHP/zend/public/index.php deleted file mode 100644 index e92f18ca1fc..00000000000 --- a/frameworks/PHP/zend/public/index.php +++ /dev/null @@ -1,6 +0,0 @@ -run(); diff --git a/frameworks/PHP/zend/zend.dockerfile b/frameworks/PHP/zend/zend.dockerfile deleted file mode 100644 index e5ef5281c8c..00000000000 --- a/frameworks/PHP/zend/zend.dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM ubuntu:20.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 php7.4 php7.4-common php7.4-cli php7.4-fpm php7.4-mysql > /dev/null -RUN apt-get install -yqq php7.4-xml php7.4-mbstring > /dev/null - -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer - -COPY deploy/conf/* /etc/php/7.4/fpm/ - -ADD ./ /zend -WORKDIR /zend - -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/7.4/fpm/php-fpm.conf ; fi; - -RUN mkdir -p data/cache -RUN chmod 777 data/cache - -RUN composer install --optimize-autoloader --classmap-authoritative --quiet --no-dev - -EXPOSE 8080 - -CMD service php7.4-fpm start && \ - nginx -c /zend/deploy/nginx.conf -g "daemon off;" From 1d584f8e3916a0e36dc9bbf91cd147c00a5dfadb Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:15:29 +0200 Subject: [PATCH 1341/1766] [ruby/rack] Add Passenger server (#9762) Passenger has been removed from most framework tests. This adds it to Rack, so we at least test it once. --- frameworks/Ruby/rack/Gemfile | 5 +++ frameworks/Ruby/rack/Gemfile.lock | 10 ++++++ frameworks/Ruby/rack/benchmark_config.json | 21 +++++++++++++ frameworks/Ruby/rack/hello_world.rb | 12 +------ .../Ruby/rack/rack-passenger.dockerfile | 31 +++++++++++++++++++ 5 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 frameworks/Ruby/rack/rack-passenger.dockerfile diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index afdd8ddf133..e220b4f26a0 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -22,6 +22,11 @@ group :iodine, optional: true do gem 'iodine', '~> 0.7', platforms: %i[ruby mswin] end +group :passenger, optional: true do + gem 'base64' # required by passenger on Ruby 3.4 + gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false +end + group :pitchfork, optional: true do gem 'pitchfork', '~> 0.17' end diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 37eb57163ae..f4306e62409 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -32,6 +32,7 @@ GEM async-service (0.13.0) async async-container (~> 0.16) + base64 (0.2.0) bigdecimal (3.1.9) concurrent-ruby (1.3.5) connection_pool (2.5.0) @@ -75,6 +76,10 @@ GEM parser (3.3.7.1) ast (~> 2.4.1) racc + passenger (6.0.26) + rack (>= 1.6.13) + rackup (>= 2.0.0) + rake (>= 12.3.3) pg (1.5.9) pitchfork (0.17.0) logger @@ -95,8 +100,11 @@ GEM rack (3.1.11) rack-test (2.2.0) rack (>= 1.3) + rackup (2.2.1) + rack (>= 3) rainbow (3.1.1) raindrops (0.20.1) + rake (13.2.1) regexp_parser (2.10.0) rubocop (1.73.2) json (~> 2.3) @@ -137,11 +145,13 @@ PLATFORMS x86_64-linux DEPENDENCIES + base64 connection_pool (~> 2.4) falcon (~> 0.47) iodine (~> 0.7) jdbc-postgres (~> 42.2) json (~> 2.10) + passenger (~> 6.0) pg (~> 1.5) pitchfork (~> 0.17) puma (~> 6.5) diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index e232b0fc4ce..6a31e20fa4c 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -107,6 +107,27 @@ "display_name": "rack-puma-jruby-sequel-raw", "notes": "" }, + "passenger": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "orm": "raw", + "database": "Postgres", + "framework": "rack", + "language": "Ruby", + "platform": "Jruby", + "webserver": "Passenger", + "os": "Linux", + "database_os": "Linux", + "display_name": "rack-passenger-mri-sequel-raw", + "notes": "" + }, "pitchfork": { "json_url": "/json", "plaintext_url": "/plaintext", diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index fa1b0fa6e60..a0c32d2421d 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -25,17 +25,7 @@ class HelloWorld PLAINTEXT_TYPE = 'text/plain' DATE = 'Date' SERVER = 'Server' - SERVER_STRING = if defined?(Puma) - 'Puma' - elsif defined?(Iodine) - 'Iodine' - elsif defined?(Unicorn) - 'Unicorn' - elsif defined?(Falcon) - 'Falcon' - else - 'Ruby Rack' - end + SERVER_STRING = 'Rack' TEMPLATE_PREFIX = ' diff --git a/frameworks/Ruby/rack/rack-passenger.dockerfile b/frameworks/Ruby/rack/rack-passenger.dockerfile new file mode 100644 index 00000000000..1b4d069d1f7 --- /dev/null +++ b/frameworks/Ruby/rack/rack-passenger.dockerfile @@ -0,0 +1,31 @@ +FROM ruby:3.4 + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +WORKDIR /rack + +COPY Gemfile ./ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'passenger' +RUN bundle install --jobs=8 + +COPY . . + +# TODO: https://github.com/phusion/passenger/issues/1916 +ENV _PASSENGER_FORCE_HTTP_SESSION=true + +RUN ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1 > instances + +EXPOSE 8080 + +CMD bundle exec passenger start --log-level 1 \ + --engine builtin --disable-turbocaching --disable-security-update-check \ + --spawn-method direct --max-pool-size $(cat instances) --min-instances $(cat instances) --max-request-queue-size 1024 \ + --address 0.0.0.0 --port 8080 --environment production + From 26cfbc0c6345896e7c14b760a5f15b8f564e731c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:15:47 +0200 Subject: [PATCH 1342/1766] [c++/paozhu] Remove build artifacts from root directory (#9763) These probably shouldn't have been committed. --- CMakeCache.txt | 505 ---------- CMakeFiles/3.31.5/CMakeCCompiler.cmake | 81 -- CMakeFiles/3.31.5/CMakeCXXCompiler.cmake | 101 -- .../3.31.5/CMakeDetermineCompilerABI_C.bin | Bin 4424 -> 0 bytes .../3.31.5/CMakeDetermineCompilerABI_CXX.bin | Bin 4408 -> 0 bytes CMakeFiles/3.31.5/CMakeSystem.cmake | 15 - .../3.31.5/CompilerIdC/CMakeCCompilerId.c | 904 ----------------- .../3.31.5/CompilerIdC/CMakeCCompilerId.o | Bin 1528 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 919 ------------------ .../3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o | Bin 1536 -> 0 bytes CMakeFiles/CMakeConfigureLog.yaml | 471 --------- CMakeFiles/cmake.check_cache | 1 - 12 files changed, 2997 deletions(-) delete mode 100644 CMakeCache.txt delete mode 100644 CMakeFiles/3.31.5/CMakeCCompiler.cmake delete mode 100644 CMakeFiles/3.31.5/CMakeCXXCompiler.cmake delete mode 100755 CMakeFiles/3.31.5/CMakeDetermineCompilerABI_C.bin delete mode 100755 CMakeFiles/3.31.5/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 CMakeFiles/3.31.5/CMakeSystem.cmake delete mode 100644 CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c delete mode 100644 CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o delete mode 100644 CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o delete mode 100644 CMakeFiles/CMakeConfigureLog.yaml delete mode 100644 CMakeFiles/cmake.check_cache diff --git a/CMakeCache.txt b/CMakeCache.txt deleted file mode 100644 index 628d4cdc769..00000000000 --- a/CMakeCache.txt +++ /dev/null @@ -1,505 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /Users/hzq/cpp/FrameworkBenchmarks -# It was generated by CMake: /usr/local/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//Path to a library. -BRDEC_LIB_DIR:FILEPATH=BRDEC_LIB_DIR-NOTFOUND - -//Path to a library. -BR_LIB_DIR:FILEPATH=BR_LIB_DIR-NOTFOUND - -//Path to a library. -Brotli:FILEPATH=Brotli-NOTFOUND - -//Path to a program. -CMAKE_ADDR2LINE:FILEPATH=CMAKE_ADDR2LINE-NOTFOUND - -//Path to a program. -CMAKE_AR:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING=Release - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//CXX compiler -CMAKE_CXX_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - -//Flags used by the CXX compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the CXX compiler during DEBUG builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g - -//Flags used by the CXX compiler during MINSIZEREL builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the CXX compiler during RELEASE builds. -CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//C compiler -CMAKE_C_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - -//Flags used by the C compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the C compiler during DEBUG builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the C compiler during RELEASE builds. -CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Path to a program. -CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND - -//Flags used by the linker during all build types. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= - -//Value Computed by CMake. -CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/pkgRedirects - -//Path to a program. -CMAKE_INSTALL_NAME_TOOL:FILEPATH=/usr/bin/install_name_tool - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make - -//Flags used by the linker during the creation of modules during -// all build types. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=CMAKE_OBJCOPY-NOTFOUND - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/objdump - -//Build architectures for OSX -CMAKE_OSX_ARCHITECTURES:STRING= - -//Minimum OS X version to target for deployment (at runtime); newer -// APIs weak linked. Set to empty string for default value. -CMAKE_OSX_DEPLOYMENT_TARGET:STRING=14.7 - -//The product will be built against the headers and libraries located -// inside the indicated SDK. -CMAKE_OSX_SYSROOT:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Paozhu_web_framework - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib - -//Path to a program. -CMAKE_READELF:FILEPATH=CMAKE_READELF-NOTFOUND - -//Flags used by the linker during the creation of shared libraries -// during all build types. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_STRIP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip - -//Path to a program. -CMAKE_TAPI:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//choose ON to enable -ENABLE_BOOST:BOOL=OFF - -//choose ON to enable -ENABLE_GD:BOOL=ON - -//choose ON to enable -ENABLE_VCPKG:BOOL=OFF - -//choose ON to enable -ENABLE_WIN_VCPKG:BOOL=OFF - -//Path to a library. -FREETYPE_LIB_DIR:FILEPATH=/usr/local/opt/freetype/lib/libfreetype.dylib - -//Path to a library. -GD_LIB_DIR:FILEPATH=/usr/local/opt/gd/lib/libgd.dylib - -//Path to a file. -MYSQL_INCLUDE_DIR:PATH=/usr/local/mysql/include - -//Path to a library. -MYSQL_LIBRARY:FILEPATH=/usr/local/mysql/lib/libmysqlclient.dylib - -//Path to a file. -MYSQL_ROOT_DIR:PATH=/usr/local - -//Path to a library. -OPENSSL_CRYPTO_LIBRARY:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libcrypto.dylib - -//Path to a file. -OPENSSL_INCLUDE_DIR:PATH=/usr/local/Cellar/openssl@3/3.4.1/include - -//Path to a library. -OPENSSL_SSL_LIBRARY:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libssl.dylib - -//Arguments to supply to pkg-config -PKG_CONFIG_ARGN:STRING= - -//pkg-config executable -PKG_CONFIG_EXECUTABLE:FILEPATH=/usr/local/bin/pkg-config - -//Path to a library. -PNG_LIB_DIR:FILEPATH=/usr/local/opt/libpng/lib/libpng.dylib - -//Value Computed by CMake -Paozhu_web_framework_BINARY_DIR:STATIC=/Users/hzq/cpp/FrameworkBenchmarks - -//Value Computed by CMake -Paozhu_web_framework_IS_TOP_LEVEL:STATIC=ON - -//Value Computed by CMake -Paozhu_web_framework_SOURCE_DIR:STATIC=/Users/hzq/cpp - -//Path to a library. -QR_LIB_DIR:FILEPATH=/usr/local/opt/qrencode/lib/libqrencode.dylib - -//Path to a file. -ZLIB_INCLUDE_DIR:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include - -//Path to a library. -ZLIB_LIBRARY_DEBUG:FILEPATH=ZLIB_LIBRARY_DEBUG-NOTFOUND - -//Path to a library. -ZLIB_LIBRARY_RELEASE:FILEPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/libz.tbd - -//Path to a library. -pkgcfg_lib__OPENSSL_crypto:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libcrypto.dylib - -//Path to a library. -pkgcfg_lib__OPENSSL_ssl:FILEPATH=/usr/local/Cellar/openssl@3/3.4.1/lib/libssl.dylib - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_ADDR2LINE -CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hzq/cpp/FrameworkBenchmarks -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/usr/local/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/bin/ctest -//ADVANCED property for variable: CMAKE_CXX_COMPILER -CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_DLLTOOL -CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=/usr/local/bin/ccmake -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=MACHO -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hzq/cpp -//ADVANCED property for variable: CMAKE_INSTALL_NAME_TOOL -CMAKE_INSTALL_NAME_TOOL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_READELF -CMAKE_READELF-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/usr/local/share/cmake -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_TAPI -CMAKE_TAPI-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/usr/bin/uname -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//Details about finding OpenSSL -FIND_PACKAGE_MESSAGE_DETAILS_OpenSSL:INTERNAL=[/usr/local/Cellar/openssl@3/3.4.1/lib/libcrypto.dylib][/usr/local/Cellar/openssl@3/3.4.1/include][c ][v3.4.1()] -//Details about finding ZLIB -FIND_PACKAGE_MESSAGE_DETAILS_ZLIB:INTERNAL=[/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/libz.tbd][/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include][c ][v1.2.12()] -//Details about finding mysql -FIND_PACKAGE_MESSAGE_DETAILS_mysql:INTERNAL=[/usr/local][v()] -//ADVANCED property for variable: OPENSSL_CRYPTO_LIBRARY -OPENSSL_CRYPTO_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENSSL_INCLUDE_DIR -OPENSSL_INCLUDE_DIR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENSSL_SSL_LIBRARY -OPENSSL_SSL_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: PKG_CONFIG_ARGN -PKG_CONFIG_ARGN-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE -PKG_CONFIG_EXECUTABLE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: ZLIB_INCLUDE_DIR -ZLIB_INCLUDE_DIR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: ZLIB_LIBRARY_DEBUG -ZLIB_LIBRARY_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: ZLIB_LIBRARY_RELEASE -ZLIB_LIBRARY_RELEASE-ADVANCED:INTERNAL=1 -_OPENSSL_CFLAGS:INTERNAL=-I/usr/local/Cellar/openssl@3/3.4.1/include -_OPENSSL_CFLAGS_I:INTERNAL= -_OPENSSL_CFLAGS_OTHER:INTERNAL= -_OPENSSL_FOUND:INTERNAL=1 -_OPENSSL_INCLUDEDIR:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/include -_OPENSSL_INCLUDE_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/include -_OPENSSL_LDFLAGS:INTERNAL=-L/usr/local/Cellar/openssl@3/3.4.1/lib;-lssl;-lcrypto -_OPENSSL_LDFLAGS_OTHER:INTERNAL= -_OPENSSL_LIBDIR:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib -_OPENSSL_LIBRARIES:INTERNAL=ssl;crypto -_OPENSSL_LIBRARY_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib -_OPENSSL_LIBS:INTERNAL= -_OPENSSL_LIBS_L:INTERNAL= -_OPENSSL_LIBS_OTHER:INTERNAL= -_OPENSSL_LIBS_PATHS:INTERNAL= -_OPENSSL_MODULE_NAME:INTERNAL=openssl -_OPENSSL_PREFIX:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1 -_OPENSSL_STATIC_CFLAGS:INTERNAL=-I/usr/local/Cellar/openssl@3/3.4.1/include -_OPENSSL_STATIC_CFLAGS_I:INTERNAL= -_OPENSSL_STATIC_CFLAGS_OTHER:INTERNAL= -_OPENSSL_STATIC_INCLUDE_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/include -_OPENSSL_STATIC_LDFLAGS:INTERNAL=-L/usr/local/Cellar/openssl@3/3.4.1/lib;-lssl;-lcrypto -_OPENSSL_STATIC_LDFLAGS_OTHER:INTERNAL= -_OPENSSL_STATIC_LIBDIR:INTERNAL= -_OPENSSL_STATIC_LIBRARIES:INTERNAL=ssl;crypto -_OPENSSL_STATIC_LIBRARY_DIRS:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib -_OPENSSL_STATIC_LIBS:INTERNAL= -_OPENSSL_STATIC_LIBS_L:INTERNAL= -_OPENSSL_STATIC_LIBS_OTHER:INTERNAL= -_OPENSSL_STATIC_LIBS_PATHS:INTERNAL= -_OPENSSL_VERSION:INTERNAL=3.4.1 -_OPENSSL_openssl_INCLUDEDIR:INTERNAL= -_OPENSSL_openssl_LIBDIR:INTERNAL= -_OPENSSL_openssl_PREFIX:INTERNAL= -_OPENSSL_openssl_VERSION:INTERNAL= -__pkg_config_arguments__OPENSSL:INTERNAL=QUIET;openssl -__pkg_config_checked__OPENSSL:INTERNAL=1 -//ADVANCED property for variable: pkgcfg_lib__OPENSSL_crypto -pkgcfg_lib__OPENSSL_crypto-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: pkgcfg_lib__OPENSSL_ssl -pkgcfg_lib__OPENSSL_ssl-ADVANCED:INTERNAL=1 -prefix_result:INTERNAL=/usr/local/Cellar/openssl@3/3.4.1/lib - diff --git a/CMakeFiles/3.31.5/CMakeCCompiler.cmake b/CMakeFiles/3.31.5/CMakeCCompiler.cmake deleted file mode 100644 index bb8540e2ff3..00000000000 --- a/CMakeFiles/3.31.5/CMakeCCompiler.cmake +++ /dev/null @@ -1,81 +0,0 @@ -set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "AppleClang") -set(CMAKE_C_COMPILER_VERSION "16.0.0.16000026") -set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_C_STANDARD_LATEST "23") -set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") -set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -set(CMAKE_C17_COMPILE_FEATURES "c_std_17") -set(CMAKE_C23_COMPILE_FEATURES "c_std_23") - -set(CMAKE_C_PLATFORM_ID "Darwin") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_C_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") -set(CMAKE_C_COMPILER_AR "") -set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") -set(CMAKE_C_COMPILER_RANLIB "") -set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") -set(CMAKE_LINKER_LINK "") -set(CMAKE_LINKER_LLD "") -set(CMAKE_C_COMPILER_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") -set(CMAKE_C_COMPILER_LINKER_ID "AppleClang") -set(CMAKE_C_COMPILER_LINKER_VERSION 1115.7.3) -set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) -set(CMAKE_MT "") -set(CMAKE_TAPI "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi") -set(CMAKE_COMPILER_IS_GNUCC ) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) -set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "8") -set(CMAKE_C_COMPILER_ABI "") -set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_C_LIBRARY_ARCHITECTURE "") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include") -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks") diff --git a/CMakeFiles/3.31.5/CMakeCXXCompiler.cmake b/CMakeFiles/3.31.5/CMakeCXXCompiler.cmake deleted file mode 100644 index c7424f026f2..00000000000 --- a/CMakeFiles/3.31.5/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,101 +0,0 @@ -set(CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "AppleClang") -set(CMAKE_CXX_COMPILER_VERSION "16.0.0.16000026") -set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -set(CMAKE_CXX_COMPILER_WRAPPER "") -set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98") -set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_CXX_STANDARD_LATEST "23") -set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") -set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") -set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") -set(CMAKE_CXX26_COMPILE_FEATURES "") - -set(CMAKE_CXX_PLATFORM_ID "Darwin") -set(CMAKE_CXX_SIMULATE_ID "") -set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_CXX_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") -set(CMAKE_CXX_COMPILER_AR "") -set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") -set(CMAKE_CXX_COMPILER_RANLIB "") -set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") -set(CMAKE_LINKER_LINK "") -set(CMAKE_LINKER_LLD "") -set(CMAKE_CXX_COMPILER_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") -set(CMAKE_CXX_COMPILER_LINKER_ID "AppleClang") -set(CMAKE_CXX_COMPILER_LINKER_VERSION 1115.7.3) -set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) -set(CMAKE_MT "") -set(CMAKE_TAPI "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi") -set(CMAKE_COMPILER_IS_GNUCXX ) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) - -foreach (lang IN ITEMS C OBJC OBJCXX) - if (CMAKE_${lang}_COMPILER_ID_RUN) - foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) - list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) - endforeach() - endif() -endforeach() - -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) -set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -set(CMAKE_CXX_COMPILER_ABI "") -set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include") -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks") -set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "") - -set(CMAKE_CXX_COMPILER_IMPORT_STD "") -### Imported target for C++23 standard library -set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Unsupported generator: Unix Makefiles") - - - diff --git a/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_C.bin b/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_C.bin deleted file mode 100755 index 7d275c141229e74eb817c16a7516320ade785bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4424 zcmeHK&ubGw6rMCGtymlF!5{d8oTPeaiwcIKkd|(daM``4d6 zLL`zxh%R^%I-!)y6~ESQ_$R*{1Yy5LeTX>Hud^BU zQr7*4p6^J{U#Tb@<@ZYWo7d-vsr%oot^c%T-!Uev1MQ$sL^rLMse)lnZ&m9XLTsrL ze6omK*EkEz_a%q3@NHn~{Tb^9*5mM5IE^)Qz6ERk#qb;=1MhsCyn)Nwm3u&%H)1aMy>%hrr7#g{LoLVSkF)i}i}e)GM}Ffmnf9fmnf9fmnf9 zfmnf9fmnh6LxKBd^UJRBgJhbI_swSg+pf_fGMDe}o6ov$VVi!R>P;H0rqR;DJcDmj zW+XTl2|hJi3m*}&?8%wYn)k@9tVm}gs1`@E2csvlLfF>KWN9>LNVi&XonqA*mwDT; zChW0rL{;ZYjlh+as^eCR(^jD{ZAinOu*Ph3;=FS~b&9T>T{zq1u+nd1j-=((xBcOK z)Q2u7RVNi!BUHOWsJUtc0XnU-faj02gcN6(Ad#f_a0#Eii`dHbHR*1;%XM67&0WHs z#4*movO^?sVtvW;#Q=`-3~dPBk6w#T?;#&*!h8mk n_+ch$DvvOcib)u6KZ7iJtJ3uyZ^;*ja%C?F%I-lL|Dyc@n83pj diff --git a/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_CXX.bin b/CMakeFiles/3.31.5/CMakeDetermineCompilerABI_CXX.bin deleted file mode 100755 index b296b6a08d9df22cd1c94e57cf070d94c2662347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4408 zcmeHK&ubG=5PoS=TCq08gD5KGBx<3*6p6)RTe{6I#%-x7l!h{GvfE}M-IQd5ja2Bx zLlE)cKOl(zf#^*H4?Xr@=*3$Ek3~fM=Ix8STkA#ewga>8ee-5!=Y6}E@9_KApM63k zl0t|c_z-*r;F-u^C&VSV4kuci$!V+F(gH`LmWaYr5%FJhF(~ zQaB4d2Fx>Dgzo?|-=DDVVm%9AgtPHC=>8|1^Dl@ECZK!>O+^FwA{;?`iiNWIK#-l?K)6c(uFbn1>4-b!wk6}sz0f9+FC~ia~%AT(j&p8NbtGVS^JELVa_j1Hk>DRZIi4WuU;I>cBLmyg)ohU z`O>7}IgQ)51YUogj*Oe}2dCTYf3Um8(!WT_E*9D3F zyED!}asT;RlCLFN&5z$XuAgvM)`b$Pj^|bFZq6@h C{m3K$ diff --git a/CMakeFiles/3.31.5/CMakeSystem.cmake b/CMakeFiles/3.31.5/CMakeSystem.cmake deleted file mode 100644 index 4ba5c26de72..00000000000 --- a/CMakeFiles/3.31.5/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Darwin-23.6.0") -set(CMAKE_HOST_SYSTEM_NAME "Darwin") -set(CMAKE_HOST_SYSTEM_VERSION "23.6.0") -set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") - - - -set(CMAKE_SYSTEM "Darwin-23.6.0") -set(CMAKE_SYSTEM_NAME "Darwin") -set(CMAKE_SYSTEM_VERSION "23.6.0") -set(CMAKE_SYSTEM_PROCESSOR "x86_64") - -set(CMAKE_CROSSCOMPILING "FALSE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c b/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index 8d8bb038bb3..00000000000 --- a/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,904 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - -#if !defined(__has_include) -/* If the compiler does not have __has_include, pretend the answer is - always no. */ -# define __has_include(x) 0 -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, - except that a few beta releases use the old format with V=2021. */ -# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) - /* The third version component from --version is an update index, - but no macro is provided for it. */ -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) -# define COMPILER_ID "IntelLLVM" -#if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -#endif -#if defined(__GNUC__) -# define SIMULATE_ID "GNU" -#endif -/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and - * later. Look for 6 digit vs. 8 digit version number to decide encoding. - * VVVV is no smaller than the current year when a version is released. - */ -#if __INTEL_LLVM_COMPILER < 1000000L -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -#else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -#endif -#if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -#endif -#if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -#elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -#endif -#if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -#endif -#if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -#endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__open_xl__) && defined(__clang__) -# define COMPILER_ID "IBMClang" -# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) -# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) -# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) - - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(__clang__) && defined(__cray__) -# define COMPILER_ID "CrayClang" -# define COMPILER_VERSION_MAJOR DEC(__cray_major__) -# define COMPILER_VERSION_MINOR DEC(__cray_minor__) -# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TASKING__) -# define COMPILER_ID "Tasking" - # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) - # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) -# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) - -#elif defined(__ORANGEC__) -# define COMPILER_ID "OrangeC" -# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) && defined(__ti__) -# define COMPILER_ID "TIClang" - # define COMPILER_VERSION_MAJOR DEC(__ti_major__) - # define COMPILER_VERSION_MINOR DEC(__ti_minor__) - # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) -# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) -# define COMPILER_ID "LCC" -# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) -# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) -# if defined(__LCC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) -# endif -# if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define SIMULATE_ID "GNU" -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(_ADI_COMPILER) -# define COMPILER_ID "ADSP" -#if defined(__VERSIONNUM__) - /* __VERSIONNUM__ = 0xVVRRPPTT */ -# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) -# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) -# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) -# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -# elif defined(_ADI_COMPILER) -# define PLATFORM_ID "ADSP" - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__clang__) && defined(__ti__) -# if defined(__ARM_ARCH) -# define ARCHITECTURE_ID "Arm" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -# elif defined(__ADSPSHARC__) -# define ARCHITECTURE_ID "SHARC" - -# elif defined(__ADSPBLACKFIN__) -# define ARCHITECTURE_ID "Blackfin" - -#elif defined(__TASKING__) - -# if defined(__CTC__) || defined(__CPTC__) -# define ARCHITECTURE_ID "TriCore" - -# elif defined(__CMCS__) -# define ARCHITECTURE_ID "MCS" - -# elif defined(__CARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__CARC__) -# define ARCHITECTURE_ID "ARC" - -# elif defined(__C51__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__CPCP__) -# define ARCHITECTURE_ID "PCP" - -# else -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#define C_STD_99 199901L -#define C_STD_11 201112L -#define C_STD_17 201710L -#define C_STD_23 202311L - -#ifdef __STDC_VERSION__ -# define C_STD __STDC_VERSION__ -#endif - -#if !defined(__STDC__) && !defined(__clang__) -# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) -# define C_VERSION "90" -# else -# define C_VERSION -# endif -#elif C_STD > C_STD_17 -# define C_VERSION "23" -#elif C_STD > C_STD_11 -# define C_VERSION "17" -#elif C_STD > C_STD_99 -# define C_VERSION "11" -#elif C_STD >= C_STD_99 -# define C_VERSION "99" -#else -# define C_VERSION "90" -#endif -const char* info_language_standard_default = - "INFO" ":" "standard_default[" C_VERSION "]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o b/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o deleted file mode 100644 index 2841bb77a683b7540ec18d6ad9c9412889cfc437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1528 zcmbVMzl#$=6rSA0TtK}`VR3>B0WDHVazzAf5|TY4=$#x9gb>CdyGa(3P1tNS92}%k z2#4SwU}5QBU}mPZ}&|$i5#ep%zW?XH*c7?`Sj!K*@h6Yb%6~l zj`d~@TN(>;6)QvbIr5o`ARjnK+u#(m5)_0;>Dwbe)I+;!KB`8x)?Tqfd_gbR0*<&C z>l{KU8w1~S+!i~fT;|g}9>*=Z;DW4PNlHukDoT*DT&xx&JH_|RuxkoFqMV|?3sKr! zLw`MY5M6k+zXJ2!;ff@9@HxG=X7kZR_ymXcB!M>R$T;p8vOWdC12Q#FX(nqlTp(fULWV4Zy z%ad;>PlqiCpUcw|1+K6fJ3J7vQ7V?Yw2^#?tQ+uO!z!Hp3PkrUikqqDYo*Kj|Kk~Q zFiS=sh`BZ-5U*nF0wG2Y8%ES1F3=ijAo3G5dxR;*BqJd36Cyt`1a5&i&7GIn*55t3 zDW2u{b+$8XH`(51`+#gTRABot*{nmwADH7ddy>Xrs9LuC^C4F=R)>J&dal^ymlLw9 O9G881z}Te862AdX80ZQB diff --git a/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp b/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp deleted file mode 100644 index da6c824af3a..00000000000 --- a/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.cpp +++ /dev/null @@ -1,919 +0,0 @@ -/* This source file must have a .cpp extension so that all C++ compilers - recognize the extension without flags. Borland does not know .cxx for - example. */ -#ifndef __cplusplus -# error "A C compiler has been selected for C++." -#endif - -#if !defined(__has_include) -/* If the compiler does not have __has_include, pretend the answer is - always no. */ -# define __has_include(x) 0 -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, - except that a few beta releases use the old format with V=2021. */ -# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) - /* The third version component from --version is an update index, - but no macro is provided for it. */ -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) -# define COMPILER_ID "IntelLLVM" -#if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -#endif -#if defined(__GNUC__) -# define SIMULATE_ID "GNU" -#endif -/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and - * later. Look for 6 digit vs. 8 digit version number to decide encoding. - * VVVV is no smaller than the current year when a version is released. - */ -#if __INTEL_LLVM_COMPILER < 1000000L -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -#else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -#endif -#if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -#endif -#if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -#elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -#endif -#if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -#endif -#if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -#endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__open_xl__) && defined(__clang__) -# define COMPILER_ID "IBMClang" -# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) -# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) -# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) - - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(__clang__) && defined(__cray__) -# define COMPILER_ID "CrayClang" -# define COMPILER_VERSION_MAJOR DEC(__cray_major__) -# define COMPILER_VERSION_MINOR DEC(__cray_minor__) -# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TASKING__) -# define COMPILER_ID "Tasking" - # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) - # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) -# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) - -#elif defined(__ORANGEC__) -# define COMPILER_ID "OrangeC" -# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) && defined(__ti__) -# define COMPILER_ID "TIClang" - # define COMPILER_VERSION_MAJOR DEC(__ti_major__) - # define COMPILER_VERSION_MINOR DEC(__ti_minor__) - # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) -# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) -# define COMPILER_ID "LCC" -# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) -# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) -# if defined(__LCC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) -# endif -# if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define SIMULATE_ID "GNU" -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(_ADI_COMPILER) -# define COMPILER_ID "ADSP" -#if defined(__VERSIONNUM__) - /* __VERSIONNUM__ = 0xVVRRPPTT */ -# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) -# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) -# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) -# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -# elif defined(_ADI_COMPILER) -# define PLATFORM_ID "ADSP" - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__clang__) && defined(__ti__) -# if defined(__ARM_ARCH) -# define ARCHITECTURE_ID "Arm" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -# elif defined(__ADSPSHARC__) -# define ARCHITECTURE_ID "SHARC" - -# elif defined(__ADSPBLACKFIN__) -# define ARCHITECTURE_ID "Blackfin" - -#elif defined(__TASKING__) - -# if defined(__CTC__) || defined(__CPTC__) -# define ARCHITECTURE_ID "TriCore" - -# elif defined(__CMCS__) -# define ARCHITECTURE_ID "MCS" - -# elif defined(__CARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__CARC__) -# define ARCHITECTURE_ID "ARC" - -# elif defined(__C51__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__CPCP__) -# define ARCHITECTURE_ID "PCP" - -# else -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#define CXX_STD_98 199711L -#define CXX_STD_11 201103L -#define CXX_STD_14 201402L -#define CXX_STD_17 201703L -#define CXX_STD_20 202002L -#define CXX_STD_23 202302L - -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) -# if _MSVC_LANG > CXX_STD_17 -# define CXX_STD _MSVC_LANG -# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) -# define CXX_STD CXX_STD_20 -# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 -# define CXX_STD CXX_STD_20 -# elif _MSVC_LANG > CXX_STD_14 -# define CXX_STD CXX_STD_17 -# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) -# define CXX_STD CXX_STD_14 -# elif defined(__INTEL_CXX11_MODE__) -# define CXX_STD CXX_STD_11 -# else -# define CXX_STD CXX_STD_98 -# endif -#elif defined(_MSC_VER) && defined(_MSVC_LANG) -# if _MSVC_LANG > __cplusplus -# define CXX_STD _MSVC_LANG -# else -# define CXX_STD __cplusplus -# endif -#elif defined(__NVCOMPILER) -# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) -# define CXX_STD CXX_STD_20 -# else -# define CXX_STD __cplusplus -# endif -#elif defined(__INTEL_COMPILER) || defined(__PGI) -# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) -# define CXX_STD CXX_STD_17 -# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) -# define CXX_STD CXX_STD_14 -# else -# define CXX_STD __cplusplus -# endif -#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) -# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) -# define CXX_STD CXX_STD_14 -# else -# define CXX_STD __cplusplus -# endif -#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) -# define CXX_STD CXX_STD_11 -#else -# define CXX_STD __cplusplus -#endif - -const char* info_language_standard_default = "INFO" ":" "standard_default[" -#if CXX_STD > CXX_STD_23 - "26" -#elif CXX_STD > CXX_STD_20 - "23" -#elif CXX_STD > CXX_STD_17 - "20" -#elif CXX_STD > CXX_STD_14 - "17" -#elif CXX_STD > CXX_STD_11 - "14" -#elif CXX_STD >= CXX_STD_11 - "11" -#else - "98" -#endif -"]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} diff --git a/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o b/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o deleted file mode 100644 index db2cc10625b7caefd672fde07d6e4ac504a380cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmbVM&ubGw6rQv(4X9}j9xAvH&_hp> z6v02hgGc`Yk6t{~gWxqsFWw@Ery^4Q-tL=h66wJ{GV{Hk-@IX7_RFvDr)xq)Rs}Y! zDAv0bY$+_rRjf_2&ycTF1o^}{+6Jef6{8?TO3xm7fgacu^I;{lwf2S;;`4jK=5s{F zq0S+cvOe(Kw$o&%l#6_t$K|+17o3yjD@kc7PlX9mmI{?ZXeareo9vo^k0>YT??RY1 z)6ief8H5*J?k~@Lceo-B9{kP};_LQR-IGJ-Y1^@++$qf`A2MHxon?^uS4MLjTDY>5 zc1t!~)wP3y<^JAsQJ(o)nvd;^LbO=*A&Y$jD=16MLUbtkS z=$$F&Jo2DC{&sBsrqc1Vlk#}@%RX)Orfcm|Y^$*ebsyQ8-)BkXyuKdcUI8XVJ zIjw!XySu%&MbFpn*lxAZ?|1BCM>)-!@FV?>@)|w2TP-OUPs?8A)>~E92cB{)$*qrdWJUwCH3agQWeGwTYBgso^@z=<@0sl3u{OKQGbl;+oNWNGpUe@1_ z=g7f48+{-~(U3rhv5gHhMh1viGKdQ^XQTp*(d@yFB^l$40N+oD`q(}&0pdJ&egJzN z2d3CAvaP=Zu(s3aNg9KpYTEMOhg{BB9s-W*xxyFm Z(M~4ov-0x^*;Q?a^YoOlN#jLr`~}c;>5>2d diff --git a/CMakeFiles/CMakeConfigureLog.yaml b/CMakeFiles/CMakeConfigureLog.yaml deleted file mode 100644 index 0667d47946f..00000000000 --- a/CMakeFiles/CMakeConfigureLog.yaml +++ /dev/null @@ -1,471 +0,0 @@ - ---- -events: - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineSystem.cmake:205 (message)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - The system is: Darwin - 23.6.0 - x86_64 - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Compiling the C compiler identification source file "CMakeCCompilerId.c" failed. - Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - Build flags: - Id flags: - - The output was: - 1 - ld: library 'System' not found - cc: error: linker command failed with exit code 1 (use -v to see invocation) - - - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. - Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - Build flags: - Id flags: -c - - The output was: - 0 - - - Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" - - The C compiler identification is AppleClang, found in: - /Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.o - - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed. - Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - Build flags: - Id flags: - - The output was: - 1 - ld: library 'c++' not found - c++: error: linker command failed with exit code 1 (use -v to see invocation) - - - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. - Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - Build flags: - Id flags: -c - - The output was: - 0 - - - Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" - - The CXX compiler identification is AppleClang, found in: - /Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/3.31.5/CompilerIdCXX/CMakeCXXCompilerId.o - - - - kind: "try_compile-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" - - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - checks: - - "Detecting C compiler ABI info" - directories: - source: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC" - binary: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC" - cmakeVariables: - CMAKE_C_FLAGS: "" - CMAKE_C_FLAGS_DEBUG: "-g" - CMAKE_EXE_LINKER_FLAGS: "" - CMAKE_OSX_ARCHITECTURES: "" - CMAKE_OSX_DEPLOYMENT_TARGET: "14.7" - CMAKE_OSX_SYSROOT: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk" - buildResult: - variable: "CMAKE_C_ABI_COMPILED" - cached: true - stdout: | - Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC' - - Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_148e9/fast - /Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_148e9.dir/build.make CMakeFiles/cmTC_148e9.dir/build - Building C object CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl,-v -MD -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c - Apple clang version 16.0.0 (clang-1600.0.26.6) - Target: x86_64-apple-darwin23.6.0 - Thread model: posix - InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - cc: warning: -Wl,-v: 'linker' input unused [-Wunused-command-line-argument] - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -x c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c - clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0 - ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include" - ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks" - #include "..." search starts here: - #include <...> search starts here: - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory) - End of search list. - Linking C executable cmTC_148e9 - /usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_148e9.dir/link.txt --verbose=1 - Apple clang version 16.0.0 (clang-1600.0.26.6) - Target: x86_64-apple-darwin23.6.0 - Thread model: posix - InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_148e9 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a - @(#)PROGRAM:ld PROJECT:ld-1115.7.3 - BUILD 23:50:35 Dec 5 2024 - configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em - will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em - LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) - TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) - Library search paths: - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift - Framework search paths: - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -o cmTC_148e9 - - exitCode: 0 - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:113 (message)" - - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Effective list of requested architectures (possibly empty) : "" - Effective list of architectures found in the ABI info binary: "x86_64" - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" - - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Parsed C implicit include dir info: rv=done - found start of include info - found start of implicit include info - add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] - add: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] - add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - end of search list found - collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] - collapse include dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] - collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - implicit include dirs: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - - - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" - - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Parsed C implicit link information: - link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] - linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] - ignore line: [Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC'] - ignore line: [] - ignore line: [Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_148e9/fast] - ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_148e9.dir/build.make CMakeFiles/cmTC_148e9.dir/build] - ignore line: [Building C object CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o] - ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl -v -MD -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c] - ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] - ignore line: [Target: x86_64-apple-darwin23.6.0] - ignore line: [Thread model: posix] - ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] - ignore line: [cc: warning: -Wl -v: 'linker' input unused [-Wunused-command-line-argument]] - ignore line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-b3BWrC -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -x c /usr/local/share/cmake/Modules/CMakeCCompilerABI.c] - ignore line: [clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0] - ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include"] - ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks"] - ignore line: [#include "..." search starts here:] - ignore line: [#include <...> search starts here:] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory)] - ignore line: [End of search list.] - ignore line: [Linking C executable cmTC_148e9] - ignore line: [/usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_148e9.dir/link.txt --verbose=1] - ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] - ignore line: [Target: x86_64-apple-darwin23.6.0] - ignore line: [Thread model: posix] - ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] - link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_148e9 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore - arg [-demangle] ==> ignore - arg [-lto_library] ==> ignore, skip following value - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> skip value of -lto_library - arg [-dynamic] ==> ignore - arg [-arch] ==> ignore - arg [x86_64] ==> ignore - arg [-platform_version] ==> ignore - arg [macos] ==> ignore - arg [14.7.0] ==> ignore - arg [15.2] ==> ignore - arg [-syslibroot] ==> ignore - arg [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk] ==> ignore - arg [-mllvm] ==> ignore - arg [-enable-linkonceodr-outlining] ==> ignore - arg [-o] ==> ignore - arg [cmTC_148e9] ==> ignore - arg [-search_paths_first] ==> ignore - arg [-headerpad_max_install_names] ==> ignore - arg [-v] ==> ignore - arg [CMakeFiles/cmTC_148e9.dir/CMakeCCompilerABI.c.o] ==> ignore - arg [-lSystem] ==> lib [System] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] - linker tool for 'C': /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld - Library search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] - Framework search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] - remove lib [System] - remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] - collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] - collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] - collapse framework dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] - implicit libs: [] - implicit objs: [] - implicit dirs: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] - implicit fwks: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] - - - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" - - "/usr/local/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Running the C compiler's linker: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "-v" - @(#)PROGRAM:ld PROJECT:ld-1115.7.3 - BUILD 23:50:35 Dec 5 2024 - configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em - will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em - LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) - TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) - - - kind: "try_compile-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" - - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - checks: - - "Detecting CXX compiler ABI info" - directories: - source: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX" - binary: "/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX" - cmakeVariables: - CMAKE_CXX_FLAGS: "" - CMAKE_CXX_FLAGS_DEBUG: "-g" - CMAKE_CXX_SCAN_FOR_MODULES: "OFF" - CMAKE_EXE_LINKER_FLAGS: "" - CMAKE_OSX_ARCHITECTURES: "" - CMAKE_OSX_DEPLOYMENT_TARGET: "14.7" - CMAKE_OSX_SYSROOT: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk" - buildResult: - variable: "CMAKE_CXX_ABI_COMPILED" - cached: true - stdout: | - Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX' - - Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_8ba91/fast - /Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_8ba91.dir/build.make CMakeFiles/cmTC_8ba91.dir/build - Building CXX object CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl,-v -MD -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp - Apple clang version 16.0.0 (clang-1600.0.26.6) - Target: x86_64-apple-darwin23.6.0 - Thread model: posix - InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - c++: warning: -Wl,-v: 'linker' input unused [-Wunused-command-line-argument] - ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1" - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1 -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdeprecated-macro -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -x c++ /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp - clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0 - ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include" - ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks" - #include "..." search starts here: - #include <...> search starts here: - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1 - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory) - End of search list. - Linking CXX executable cmTC_8ba91 - /usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8ba91.dir/link.txt --verbose=1 - Apple clang version 16.0.0 (clang-1600.0.26.6) - Target: x86_64-apple-darwin23.6.0 - Thread model: posix - InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_8ba91 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a - @(#)PROGRAM:ld PROJECT:ld-1115.7.3 - BUILD 23:50:35 Dec 5 2024 - configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em - will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em - LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) - TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) - Library search paths: - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift - Framework search paths: - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_8ba91 - - exitCode: 0 - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:113 (message)" - - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Effective list of requested architectures (possibly empty) : "" - Effective list of architectures found in the ABI info binary: "x86_64" - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" - - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Parsed CXX implicit include dir info: rv=done - found start of include info - found start of implicit include info - add: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] - add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] - add: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] - add: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - end of search list found - collapse include dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] - collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] - collapse include dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] - collapse include dir [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] ==> [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - implicit include dirs: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - - - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" - - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Parsed CXX implicit link information: - link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] - linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] - ignore line: [Change Dir: '/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX'] - ignore line: [] - ignore line: [Run Build Command(s): /usr/local/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_8ba91/fast] - ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_8ba91.dir/build.make CMakeFiles/cmTC_8ba91.dir/build] - ignore line: [Building CXX object CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o] - ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mmacosx-version-min=14.7 -v -Wl -v -MD -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp] - ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] - ignore line: [Target: x86_64-apple-darwin23.6.0] - ignore line: [Thread model: posix] - ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] - ignore line: [c++: warning: -Wl -v: 'linker' input unused [-Wunused-command-line-argument]] - ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1"] - ignore line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx14.7.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=15.2 -fvisibility-inlines-hidden-static-local-var -fno-modulemap-allow-subdirectory-search -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 1115.7.3 -v -fcoverage-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16 -dependency-file CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o.d -skip-unused-modulemap-deps -MT CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1 -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdeprecated-macro -fdebug-compilation-dir=/Users/hzq/cpp/FrameworkBenchmarks/CMakeFiles/CMakeScratch/TryCompile-oFV5KX -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -x c++ /usr/local/share/cmake/Modules/CMakeCXXCompilerABI.cpp] - ignore line: [clang -cc1 version 16.0.0 (clang-1600.0.26.6) default target x86_64-apple-darwin23.6.0] - ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/local/include"] - ignore line: [ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/Library/Frameworks"] - ignore line: [#include "..." search starts here:] - ignore line: [#include <...> search starts here:] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/c++/v1] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/include] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include] - ignore line: [ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks (framework directory)] - ignore line: [End of search list.] - ignore line: [Linking CXX executable cmTC_8ba91] - ignore line: [/usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8ba91.dir/link.txt --verbose=1] - ignore line: [Apple clang version 16.0.0 (clang-1600.0.26.6)] - ignore line: [Target: x86_64-apple-darwin23.6.0] - ignore line: [Thread model: posix] - ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] - link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 14.7.0 15.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -mllvm -enable-linkonceodr-outlining -o cmTC_8ba91 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore - arg [-demangle] ==> ignore - arg [-lto_library] ==> ignore, skip following value - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> skip value of -lto_library - arg [-dynamic] ==> ignore - arg [-arch] ==> ignore - arg [x86_64] ==> ignore - arg [-platform_version] ==> ignore - arg [macos] ==> ignore - arg [14.7.0] ==> ignore - arg [15.2] ==> ignore - arg [-syslibroot] ==> ignore - arg [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk] ==> ignore - arg [-mllvm] ==> ignore - arg [-enable-linkonceodr-outlining] ==> ignore - arg [-o] ==> ignore - arg [cmTC_8ba91] ==> ignore - arg [-search_paths_first] ==> ignore - arg [-headerpad_max_install_names] ==> ignore - arg [-v] ==> ignore - arg [CMakeFiles/cmTC_8ba91.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore - arg [-lc++] ==> lib [c++] - arg [-lSystem] ==> lib [System] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] - linker tool for 'CXX': /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld - Library search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] - Framework search paths: [;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] - remove lib [System] - remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a] - collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib] - collapse library dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] - collapse framework dir [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] ==> [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] - implicit libs: [c++] - implicit objs: [] - implicit dirs: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/lib/swift] - implicit fwks: [/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/Library/Frameworks] - - - - - kind: "message-v1" - backtrace: - - "/usr/local/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" - - "/usr/local/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" - - "/usr/local/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:26 (PROJECT)" - message: | - Running the CXX compiler's linker: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" "-v" - @(#)PROGRAM:ld PROJECT:ld-1115.7.3 - BUILD 23:50:35 Dec 5 2024 - configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em - will use ld-classic for: armv6 armv7 armv7s i386 armv6m armv7k armv7m armv7em - LTO support using: LLVM version 16.0.0 (static support for 29, runtime is 29) - TAPI support using: Apple TAPI version 16.0.0 (tapi-1600.0.11.9) -... diff --git a/CMakeFiles/cmake.check_cache b/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd731726..00000000000 --- a/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file From cfe9dc9d4963099092ac14f840a6e4fb01eaf9c8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Fri, 4 Apr 2025 18:16:08 +0200 Subject: [PATCH 1343/1766] [ruby/hanami] Don't make extra query for update (#9764) --- frameworks/Ruby/hanami/app/actions/updates/index.rb | 2 +- frameworks/Ruby/hanami/app/repos/world_repo.rb | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/hanami/app/actions/updates/index.rb b/frameworks/Ruby/hanami/app/actions/updates/index.rb index 88c85a2ff60..3e68be733be 100644 --- a/frameworks/Ruby/hanami/app/actions/updates/index.rb +++ b/frameworks/Ruby/hanami/app/actions/updates/index.rb @@ -13,7 +13,7 @@ class Index < HelloWorld::Action def handle(request, response) worlds = ALL_IDS.sample(queries(request)).map do |id| - world_repo.update(id) + world_repo.update_random_number(id) end response.format = :json response.body = worlds.to_json diff --git a/frameworks/Ruby/hanami/app/repos/world_repo.rb b/frameworks/Ruby/hanami/app/repos/world_repo.rb index 40baa32c089..42a5c6f8a7c 100644 --- a/frameworks/Ruby/hanami/app/repos/world_repo.rb +++ b/frameworks/Ruby/hanami/app/repos/world_repo.rb @@ -7,13 +7,12 @@ def find(id) worlds.by_pk(id).one end - def update(id) - world = worlds.by_pk(id) - world_hash = world.one.to_h + def update_random_number(id) + world = find(id) + world_hash = world.to_h new_value = random_id new_value = random_id while new_value == world_hash[:randomnumber] - world_hash[:randomnumber] = new_value - world.changeset(:update, **world_hash).commit + worlds.where(id: id).update({ randomnumber: new_value }) world_hash end From 40b97c5db222bab3c7c7950ff43b5ee573dae090 Mon Sep 17 00:00:00 2001 From: Hamilton Greene Date: Fri, 4 Apr 2025 12:29:59 -0400 Subject: [PATCH 1344/1766] [FSharp] Fix: Improve FSharp Falco benchmarks by moving to Dapper (#9766) Co-authored-by: HAMY --- frameworks/FSharp/falco/src/App/App.fsproj | 1 + frameworks/FSharp/falco/src/App/Program.fs | 36 +++++----------------- 2 files changed, 8 insertions(+), 29 deletions(-) diff --git a/frameworks/FSharp/falco/src/App/App.fsproj b/frameworks/FSharp/falco/src/App/App.fsproj index d6b5bd70732..6c7dcff0aba 100644 --- a/frameworks/FSharp/falco/src/App/App.fsproj +++ b/frameworks/FSharp/falco/src/App/App.fsproj @@ -15,6 +15,7 @@ + diff --git a/frameworks/FSharp/falco/src/App/Program.fs b/frameworks/FSharp/falco/src/App/Program.fs index 6a974bfc230..7d6f19e5584 100644 --- a/frameworks/FSharp/falco/src/App/Program.fs +++ b/frameworks/FSharp/falco/src/App/Program.fs @@ -1,6 +1,7 @@ module Program open System.Data +open Dapper open Falco open Falco.Markup open Falco.Routing @@ -26,38 +27,15 @@ type Fortune = message = "Additional fortune added at request time." } let handleFortunes (connStr : string) : HttpHandler = fun ctx -> task { - use conn = new NpgsqlConnection(connStr) - - use comd = conn.CreateCommand() - comd.CommandText <- "SELECT id, message FROM fortune" - - do! conn.OpenAsync() - use! redr = comd.ExecuteReaderAsync(CommandBehavior.SequentialAccess) - - let! dbFortunes = - task { - let mutable shouldContinue = true - let fortunes = ResizeArray() - while shouldContinue do - let! fortunesRead = redr.ReadAsync() - - if not fortunesRead then - shouldContinue <- false - else - fortunes.Add { id = redr.GetInt32(0) - message = redr.GetString(1) } - return fortunes |> List.ofSeq - } - - redr.Dispose() - comd.Dispose() - conn.Dispose() + use conn = new NpgsqlConnection(connStr) + let! data = conn.QueryAsync("SELECT id, message FROM fortune") + let fortunes = data.AsList() + fortunes.Add(Fortune.Default) let sortedFortunes = - Fortune.Default :: - dbFortunes - |> List.sortBy (fun f -> f.message) + fortunes + |> Seq.sortBy (fun f -> f.message) let html = Elem.html [] [ From ebf8e71ce1de2141356d5f90ba31372312a80f82 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Apr 2025 20:53:11 +0000 Subject: [PATCH 1345/1766] Bump openssl in /frameworks/Rust/ohkami/rt_async-std Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.69 to 0.10.72. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.69...openssl-v0.10.72) --- updated-dependencies: - dependency-name: openssl dependency-version: 0.10.72 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/ohkami/rt_async-std/Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Rust/ohkami/rt_async-std/Cargo.lock b/frameworks/Rust/ohkami/rt_async-std/Cargo.lock index ef927a959c9..8893a3fae9b 100644 --- a/frameworks/Rust/ohkami/rt_async-std/Cargo.lock +++ b/frameworks/Rust/ohkami/rt_async-std/Cargo.lock @@ -1219,9 +1219,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.69" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.8.0", "cfg-if", @@ -1251,9 +1251,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", From de5836d32fed1c7e56eacda968f87a705527a4c9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 7 Apr 2025 19:13:41 +0200 Subject: [PATCH 1346/1766] [php/hamlet] Remove Hamlet (#9782) Hamlet is tagged as broken for all tests. The framework doesn't have much activity. The http part hasn't been updated for 4 years. https://github.com/hamlet-framework/http --- frameworks/PHP/hamlet/.gitignore | 2 - .../PHP/hamlet/Benchmark/Application.php | 45 ----------- .../Benchmark/Entities/FortuneEntity.php | 27 ------- .../PHP/hamlet/Benchmark/Entities/Message.php | 29 ------- .../Benchmark/Entities/RandomNumber.php | 34 -------- .../Benchmark/Entities/fortune.mustache | 18 ----- .../Repositories/FortuneRepository.php | 21 ----- .../Repositories/WorldRepository.php | 34 -------- .../Resources/CachedQueriesResource.php | 30 ------- .../hamlet/Benchmark/Resources/DbResource.php | 23 ------ .../Benchmark/Resources/FortuneResource.php | 23 ------ .../Benchmark/Resources/HelloJsonResource.php | 17 ---- .../Benchmark/Resources/HelloTextResource.php | 17 ---- .../Benchmark/Resources/QueriesCountTrait.php | 25 ------ .../Benchmark/Resources/QueriesResource.php | 24 ------ .../Benchmark/Resources/UpdateResource.php | 32 -------- frameworks/PHP/hamlet/README.md | 9 --- frameworks/PHP/hamlet/benchmark_config.json | 80 ------------------- frameworks/PHP/hamlet/composer-swoole.json | 18 ----- frameworks/PHP/hamlet/composer-workerman.json | 18 ----- frameworks/PHP/hamlet/composer.json | 17 ---- frameworks/PHP/hamlet/config.toml | 54 ------------- frameworks/PHP/hamlet/deploy/fpm/nginx.conf | 62 -------------- frameworks/PHP/hamlet/deploy/fpm/php-fpm.conf | 17 ---- frameworks/PHP/hamlet/deploy/fpm/php.ini | 21 ----- .../PHP/hamlet/hamlet-swoole.dockerfile | 25 ------ .../PHP/hamlet/hamlet-workerman.dockerfile | 36 --------- frameworks/PHP/hamlet/hamlet.dockerfile | 27 ------- frameworks/PHP/hamlet/index.php | 15 ---- frameworks/PHP/hamlet/swoole.php | 18 ----- frameworks/PHP/hamlet/workerman.php | 17 ---- 31 files changed, 835 deletions(-) delete mode 100644 frameworks/PHP/hamlet/.gitignore delete mode 100644 frameworks/PHP/hamlet/Benchmark/Application.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Entities/FortuneEntity.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Entities/Message.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Entities/RandomNumber.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Entities/fortune.mustache delete mode 100644 frameworks/PHP/hamlet/Benchmark/Repositories/FortuneRepository.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Repositories/WorldRepository.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/CachedQueriesResource.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/DbResource.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/FortuneResource.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/HelloJsonResource.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/HelloTextResource.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/QueriesCountTrait.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/QueriesResource.php delete mode 100644 frameworks/PHP/hamlet/Benchmark/Resources/UpdateResource.php delete mode 100644 frameworks/PHP/hamlet/README.md delete mode 100644 frameworks/PHP/hamlet/benchmark_config.json delete mode 100644 frameworks/PHP/hamlet/composer-swoole.json delete mode 100644 frameworks/PHP/hamlet/composer-workerman.json delete mode 100644 frameworks/PHP/hamlet/composer.json delete mode 100644 frameworks/PHP/hamlet/config.toml delete mode 100644 frameworks/PHP/hamlet/deploy/fpm/nginx.conf delete mode 100644 frameworks/PHP/hamlet/deploy/fpm/php-fpm.conf delete mode 100644 frameworks/PHP/hamlet/deploy/fpm/php.ini delete mode 100644 frameworks/PHP/hamlet/hamlet-swoole.dockerfile delete mode 100644 frameworks/PHP/hamlet/hamlet-workerman.dockerfile delete mode 100644 frameworks/PHP/hamlet/hamlet.dockerfile delete mode 100644 frameworks/PHP/hamlet/index.php delete mode 100644 frameworks/PHP/hamlet/swoole.php delete mode 100644 frameworks/PHP/hamlet/workerman.php diff --git a/frameworks/PHP/hamlet/.gitignore b/frameworks/PHP/hamlet/.gitignore deleted file mode 100644 index d1502b087b4..00000000000 --- a/frameworks/PHP/hamlet/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -vendor/ -composer.lock diff --git a/frameworks/PHP/hamlet/Benchmark/Application.php b/frameworks/PHP/hamlet/Benchmark/Application.php deleted file mode 100644 index f4cc693e55a..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Application.php +++ /dev/null @@ -1,45 +0,0 @@ -getPath()) { - case '/plaintext': - return new HelloTextResource; - case '/json': - return new HelloJsonResource; - case '/db': - return new DbResource($this->database); - case '/queries': - return new QueriesResource($this->database); - case '/cached-worlds': - return new CachedQueriesResource($this->getCache($request), $this->database); - case '/fortunes': - return new FortuneResource($this->database); - case '/update': - return new UpdateResource($this->database); - } - return new NotFoundResource; - } - - protected function getCache(Request $request): CacheItemPoolInterface - { - if (!$this->cache) { - $this->cache = new ApcuCachePool; - } - return $this->cache; - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Entities/FortuneEntity.php b/frameworks/PHP/hamlet/Benchmark/Entities/FortuneEntity.php deleted file mode 100644 index fbdbbb27809..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Entities/FortuneEntity.php +++ /dev/null @@ -1,27 +0,0 @@ - $this->messages - ]; - } - - protected function getTemplatePath(): string - { - return __DIR__ . '/fortune.mustache'; - } - - public function getKey(): string - { - return md5(var_export($this->messages, true)); - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Entities/Message.php b/frameworks/PHP/hamlet/Benchmark/Entities/Message.php deleted file mode 100644 index c078b1b6d01..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Entities/Message.php +++ /dev/null @@ -1,29 +0,0 @@ -id; - } - - public function message(): string - { - return $this->message; - } - - public function jsonSerialize(): array - { - return [ - 'id' => $this->id, - 'message' => $this->message - ]; - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Entities/RandomNumber.php b/frameworks/PHP/hamlet/Benchmark/Entities/RandomNumber.php deleted file mode 100644 index 669f6ce773d..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Entities/RandomNumber.php +++ /dev/null @@ -1,34 +0,0 @@ -id; - } - - public function number(): int - { - return $this->randomNumber; - } - - public function withNumber(int $number): self - { - return new self($this->id, $number); - } - - public function jsonSerialize(): array - { - return [ - 'id' => $this->id, - 'randomNumber' => $this->randomNumber - ]; - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Entities/fortune.mustache b/frameworks/PHP/hamlet/Benchmark/Entities/fortune.mustache deleted file mode 100644 index 20265b750a3..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Entities/fortune.mustache +++ /dev/null @@ -1,18 +0,0 @@ - - -Fortunes - -
      idmessage
      - - - - - {{# messages }} - - - - - {{/ messages }} -
      idmessage
      {{ id }}{{ message }}
      - - diff --git a/frameworks/PHP/hamlet/Benchmark/Repositories/FortuneRepository.php b/frameworks/PHP/hamlet/Benchmark/Repositories/FortuneRepository.php deleted file mode 100644 index a2044cab081..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Repositories/FortuneRepository.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - public function findAll(): callable - { - return fn (Session $session) => - $session->prepare('SELECT id, message FROM Fortune') - ->processAll() - ->selectAll()->cast(Message::class) - ->collectAll(); - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Repositories/WorldRepository.php b/frameworks/PHP/hamlet/Benchmark/Repositories/WorldRepository.php deleted file mode 100644 index 003a4dc7a19..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Repositories/WorldRepository.php +++ /dev/null @@ -1,34 +0,0 @@ - - $session->prepare('SELECT id, randomNumber FROM World WHERE id = ?') - ->bindInteger($id) - ->processOne() - ->selectAll()->cast(RandomNumber::class) - ->collectHead(); - } - - /** - * @return callable(Session):void - */ - public function updateNumber(RandomNumber $number): callable - { - return fn (Session $session) => - $session->prepare('UPDATE World SET randomNumber = ? WHERE id = ?') - ->bindInteger($number->number()) - ->bindInteger($number->id()) - ->execute(); - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Resources/CachedQueriesResource.php b/frameworks/PHP/hamlet/Benchmark/Resources/CachedQueriesResource.php deleted file mode 100644 index 715deacfe65..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Resources/CachedQueriesResource.php +++ /dev/null @@ -1,30 +0,0 @@ -getQueriesCount($request); - $key = 'count.' . $count; - $item = $this->cache->getItem($key); - if ($item->isHit()) { - return $item->get(); - } - $response = parent::getResponse($request); - $this->cache->save(new CacheItem($key, true, $response)); - return $response; - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Resources/DbResource.php b/frameworks/PHP/hamlet/Benchmark/Resources/DbResource.php deleted file mode 100644 index 2ef8ea8ce35..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Resources/DbResource.php +++ /dev/null @@ -1,23 +0,0 @@ -database->withSession($repository->findById($id)); - return new SimpleOKResponse(new JsonEntity($record)); - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Resources/FortuneResource.php b/frameworks/PHP/hamlet/Benchmark/Resources/FortuneResource.php deleted file mode 100644 index 48540164488..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Resources/FortuneResource.php +++ /dev/null @@ -1,23 +0,0 @@ -database->withSession($repository->findAll()); - $messages[] = new Message(0, 'Additional fortune added at request time.'); - usort($messages, function (Message $a, Message $b): int { - return $a->message() <=> $b->message(); - }); - return new SimpleOKResponse(new FortuneEntity($messages)); - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Resources/HelloJsonResource.php b/frameworks/PHP/hamlet/Benchmark/Resources/HelloJsonResource.php deleted file mode 100644 index 095c5cd77b7..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Resources/HelloJsonResource.php +++ /dev/null @@ -1,17 +0,0 @@ - 'Hello, World!']); - return new SimpleOKResponse($entity); - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Resources/HelloTextResource.php b/frameworks/PHP/hamlet/Benchmark/Resources/HelloTextResource.php deleted file mode 100644 index 3a1531288d7..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Resources/HelloTextResource.php +++ /dev/null @@ -1,17 +0,0 @@ -hasQueryParam('queries')) { - $count = $request->getQueryParam('queries', _int()); - if ($count < 1) { - return 1; - } elseif (500 < $count) { - return 500; - } else { - return $count; - } - } else { - return 1; - } - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Resources/QueriesResource.php b/frameworks/PHP/hamlet/Benchmark/Resources/QueriesResource.php deleted file mode 100644 index b4999592096..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Resources/QueriesResource.php +++ /dev/null @@ -1,24 +0,0 @@ -getQueriesCount($request); - $payload = $this->database->withSessions(array_map( - fn () => $repository->findById(mt_rand(1, 10000)), - range(1, $count) - )); - return new SimpleOKResponse(new JsonEntity($payload)); - } -} diff --git a/frameworks/PHP/hamlet/Benchmark/Resources/UpdateResource.php b/frameworks/PHP/hamlet/Benchmark/Resources/UpdateResource.php deleted file mode 100644 index e6e1b79bcc6..00000000000 --- a/frameworks/PHP/hamlet/Benchmark/Resources/UpdateResource.php +++ /dev/null @@ -1,32 +0,0 @@ -getQueriesCount($request); - $entries = $this->database->withSessions(array_map( - fn () => $repository->findById(mt_rand(1, 10000)), - range(1, $count), - )); - $modifiedEntries = array_map( - fn ($entry) => $entry->withNumber(mt_rand(1, 10000)), - $entries - ); - $this->database->withSessions(array_map( - fn ($modifiedEntry) => $repository->updateNumber($modifiedEntry), - $modifiedEntries - )); - return new SimpleOKResponse(new JsonEntity($modifiedEntries)); - } -} diff --git a/frameworks/PHP/hamlet/README.md b/frameworks/PHP/hamlet/README.md deleted file mode 100644 index 7c7c35cfc21..00000000000 --- a/frameworks/PHP/hamlet/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Hamlet Framework Benchmarking Test - -This is the [Hamlet Framework](https://github.com/hamlet-framework) portion of a [benchmarking test suite](../) - -Current submission tests the following configurations: - -- Hamlet -- Hamlet + Swoole -- Hamlet + Workerman diff --git a/frameworks/PHP/hamlet/benchmark_config.json b/frameworks/PHP/hamlet/benchmark_config.json deleted file mode 100644 index b8fda2f4f31..00000000000 --- a/frameworks/PHP/hamlet/benchmark_config.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "framework": "hamlet", - "tests": [{ - "default": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "cached_query_url": "/cached-worlds?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "mysql", - "framework": "hamlet", - "language": "PHP", - "flavor": "PHP8.1", - "orm": "micro", - "platform": "FPM/FastCGI", - "webserver": "nginx", - "os": "Linux", - "database_os": "Linux", - "display_name": "hamlet", - "notes": "", - "versus": "php", - "tags": ["broken"] - }, - "swoole": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "cached_query_url": "/cached-worlds?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "mysql", - "framework": "hamlet", - "language": "PHP", - "flavor": "PHP8", - "orm": "micro", - "platform": "swoole", - "webserver": "none", - "os": "Linux", - "database_os": "Linux", - "display_name": "hamlet-swoole", - "notes": "", - "versus": "swoole", - "tags": ["broken"] - }, - "workerman": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "cached_query_url": "/cached-worlds?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "mysql", - "framework": "hamlet", - "language": "PHP", - "flavor": "PHP8", - "orm": "micro", - "platform": "workerman", - "webserver": "none", - "os": "Linux", - "database_os": "Linux", - "display_name": "hamlet-workerman", - "notes": "", - "versus": "workerman", - "tags": ["broken"] - } - }] -} diff --git a/frameworks/PHP/hamlet/composer-swoole.json b/frameworks/PHP/hamlet/composer-swoole.json deleted file mode 100644 index edf1d00158e..00000000000 --- a/frameworks/PHP/hamlet/composer-swoole.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "config": { - "optimize-autoloader": true, - "classmap-authoritative": true - }, - "require": { - "php": "^8", - "hamlet-framework/http" : "@stable", - "hamlet-framework/http-swoole": "@stable", - "hamlet-framework/db-mysql-swoole": "@stable", - "cache/array-adapter": "@stable" - }, - "autoload": { - "psr-4": { - "Benchmark\\": "Benchmark/" - } - } -} diff --git a/frameworks/PHP/hamlet/composer-workerman.json b/frameworks/PHP/hamlet/composer-workerman.json deleted file mode 100644 index de39b11968c..00000000000 --- a/frameworks/PHP/hamlet/composer-workerman.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "config": { - "optimize-autoloader": true, - "classmap-authoritative": true - }, - "require": { - "php": "^8", - "hamlet-framework/http" : "@stable", - "hamlet-framework/http-workerman": "@stable", - "hamlet-framework/db-pdo": "@stable", - "cache/array-adapter": "@stable" - }, - "autoload": { - "psr-4": { - "Benchmark\\": "Benchmark/" - } - } -} diff --git a/frameworks/PHP/hamlet/composer.json b/frameworks/PHP/hamlet/composer.json deleted file mode 100644 index 2a8d4f7ec0e..00000000000 --- a/frameworks/PHP/hamlet/composer.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "config": { - "optimize-autoloader": true, - "classmap-authoritative": true - }, - "require": { - "php": "^8", - "hamlet-framework/http" : "@stable", - "hamlet-framework/db-pdo": "@stable", - "cache/apcu-adapter": "@stable" - }, - "autoload": { - "psr-4": { - "Benchmark\\": "Benchmark/" - } - } -} diff --git a/frameworks/PHP/hamlet/config.toml b/frameworks/PHP/hamlet/config.toml deleted file mode 100644 index 81b9f6f2509..00000000000 --- a/frameworks/PHP/hamlet/config.toml +++ /dev/null @@ -1,54 +0,0 @@ -[framework] -name = "hamlet" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.cached_query = "/cached-worlds?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "mysql" -database_os = "Linux" -os = "Linux" -orm = "micro" -platform = "FPM/FastCGI" -webserver = "nginx" -versus = "php" - -[workerman] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "mysql" -database_os = "Linux" -os = "Linux" -orm = "micro" -platform = "workerman" -webserver = "none" -versus = "workerman" - -[swoole] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "mysql" -database_os = "Linux" -os = "Linux" -orm = "micro" -platform = "swoole" -webserver = "none" -versus = "swoole" diff --git a/frameworks/PHP/hamlet/deploy/fpm/nginx.conf b/frameworks/PHP/hamlet/deploy/fpm/nginx.conf deleted file mode 100644 index 313fc4d26a9..00000000000 --- a/frameworks/PHP/hamlet/deploy/fpm/nginx.conf +++ /dev/null @@ -1,62 +0,0 @@ -user www-data; -worker_processes auto; -error_log stderr error; -worker_rlimit_nofile 200000; - -events { - worker_connections 32768; - multi_accept on; -} - -http { - access_log off; - server_tokens off; - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - keepalive_disable none; - keepalive_requests 1000; - - #the bench don't use any static file - #open_file_cache max=2000 inactive=20s; - #open_file_cache_valid 60s; - #open_file_cache_min_uses 5; - #open_file_cache_errors off; - - fastcgi_buffers 256 16k; - fastcgi_buffer_size 128k; - fastcgi_connect_timeout 120s; - fastcgi_send_timeout 120s; - fastcgi_read_timeout 120s; - fastcgi_busy_buffers_size 256k; - fastcgi_temp_file_write_size 256k; - reset_timedout_connection on; - server_names_hash_bucket_size 100; - - upstream fastcgi_backend { - server unix:/var/run/php-fpm.sock; - keepalive 40; - } - - server { - listen 8080; - server_name localhost; - - root /app; - index index.php; - - location / { - try_files $uri $uri/ /index.php?$uri&$args; - } - - location ~ \.php$ { - fastcgi_pass fastcgi_backend; - fastcgi_keep_conn on; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - include /etc/nginx/fastcgi_params; - } - } -} diff --git a/frameworks/PHP/hamlet/deploy/fpm/php-fpm.conf b/frameworks/PHP/hamlet/deploy/fpm/php-fpm.conf deleted file mode 100644 index bf0d342c46e..00000000000 --- a/frameworks/PHP/hamlet/deploy/fpm/php-fpm.conf +++ /dev/null @@ -1,17 +0,0 @@ -[global] -pid = /var/run/php-fpm.pid -error_log = /dev/stderr -systemd_interval = 0 - -[www] -user = www-data -group = www-data -listen = /var/run/php-fpm.sock -listen.backlog = 65535 -listen.owner = www-data -listen.group = www-data -pm = static -pm.max_children = 1024 -pm.start_servers = 512 -pm.min_spare_servers = 50 -pm.max_spare_servers = 512 diff --git a/frameworks/PHP/hamlet/deploy/fpm/php.ini b/frameworks/PHP/hamlet/deploy/fpm/php.ini deleted file mode 100644 index 498eb1221b6..00000000000 --- a/frameworks/PHP/hamlet/deploy/fpm/php.ini +++ /dev/null @@ -1,21 +0,0 @@ -opcache.enable_file_override = 1 -opcache.memory_consumption = 96 -opcache.interned_strings_buffer = 16 -opcache.max_accelerated_files = 10000 -opcache.save_comments = 1 -opcache.consistency_checks = 0 -opcache.enable = 1 -opcache.enable_cli=1 -opcache.optimization_level = 0xFFFFFFFF -opcache.huge_code_pages = 0 -opcache.validate_timestamps = 0 -opcache.jit_buffer_size = 128M -opcache.jit = 1255 - -realpath_cache_ttl = 1200 -memory_limit = 512M - -display_errors = 0 -error_reporting = E_ALL -zend.assertions = 0 -assert.exception = 0 diff --git a/frameworks/PHP/hamlet/hamlet-swoole.dockerfile b/frameworks/PHP/hamlet/hamlet-swoole.dockerfile deleted file mode 100644 index a1133c483ae..00000000000 --- a/frameworks/PHP/hamlet/hamlet-swoole.dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM php:8.0 - -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole - -RUN docker-php-ext-install mysqli > /dev/null && \ - docker-php-ext-enable mysqli - -RUN apt-get update -yqq && \ - apt-get install -yqq git unzip - -COPY ./deploy/fpm/php.ini /usr/local/etc/php/conf.d/hamlet.ini - -RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - -ADD ./ /php -WORKDIR /php -COPY ./composer-swoole.json composer.json -RUN chmod -R 777 /php - -RUN composer update --no-dev --quiet - -EXPOSE 8080 - -CMD php /php/swoole.php diff --git a/frameworks/PHP/hamlet/hamlet-workerman.dockerfile b/frameworks/PHP/hamlet/hamlet-workerman.dockerfile deleted file mode 100644 index e632ee1dd8a..00000000000 --- a/frameworks/PHP/hamlet/hamlet-workerman.dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -FROM php:8.0-zts - -ENV PHP_VERSION 8.0 -ENV PARALLEL_VERSION 360c667b7632a639a983f17c5d97b92cbe4f7c95 - -RUN docker-php-ext-install pdo_mysql > /dev/null && docker-php-ext-enable pdo_mysql -RUN docker-php-ext-install sockets > /dev/null && docker-php-ext-enable sockets -RUN docker-php-ext-install pcntl > /dev/null && docker-php-ext-enable pcntl - -RUN apt-get update -yqq > /dev/null \ - && apt-get install -yqq git unzip libevent-dev libssl-dev > /dev/null - -RUN git clone https://github.com/krakjoe/parallel \ - && cd parallel \ - && git checkout 360c667b7632a639a983f17c5d97b92cbe4f7c95 \ - && phpize > /dev/null \ - && ./configure --enable-parallel > /dev/null \ - && make > /dev/null \ - && make install > /dev/null - -RUN pecl install event-3.0.5 > /dev/null \ - && echo "extension=event.so" > /usr/local/etc/php/conf.d/event.ini - -COPY deploy/fpm/php.ini /usr/local/etc/php/conf.d/hamlet.ini - -RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - -ADD ./ /hamlet -WORKDIR /hamlet -COPY ./composer-workerman.json composer.json - -RUN composer update --no-dev --quiet - -EXPOSE 8080 - -CMD php /hamlet/workerman.php start diff --git a/frameworks/PHP/hamlet/hamlet.dockerfile b/frameworks/PHP/hamlet/hamlet.dockerfile deleted file mode 100644 index 9c85515a040..00000000000 --- a/frameworks/PHP/hamlet/hamlet.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM ubuntu:20.04 - -ENV PHP_VERSION 8.1 -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 curl \ - php${PHP_VERSION}-cli php${PHP_VERSION}-fpm php${PHP_VERSION}-apcu php${PHP_VERSION}-pdo-mysql php${PHP_VERSION}-dev > /dev/null - -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer - -ADD ./ /app -WORKDIR /app - -RUN composer update --no-dev --quiet - -COPY deploy/fpm/php-fpm.conf /etc/php/${PHP_VERSION}/fpm/php-fpm.conf -COPY deploy/fpm/php.ini /etc/php/${PHP_VERSION}/fpm/php.ini - -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/${PHP_VERSION}/fpm/php-fpm.conf ; fi; - -EXPOSE 8080 - -CMD service php${PHP_VERSION}-fpm start \ - && nginx -c /app/deploy/fpm/nginx.conf -g "daemon off;" diff --git a/frameworks/PHP/hamlet/index.php b/frameworks/PHP/hamlet/index.php deleted file mode 100644 index 09141793d1b..00000000000 --- a/frameworks/PHP/hamlet/index.php +++ /dev/null @@ -1,15 +0,0 @@ - Date: Mon, 7 Apr 2025 19:13:51 +0200 Subject: [PATCH 1347/1766] [php/sw-sf-less] Remove sw-sf-less (#9781) sw-sf-less has been tagged as broken for 2 years. The repo hasn't been updated in 3 years: https://github.com/luoxiaojun1992/sw-fw-less There also is a 5 year old open issue about abandoned dependencies: https://github.com/luoxiaojun1992/sw-fw-less/issues/6 --- frameworks/PHP/sw-fw-less/.env | 8 -- frameworks/PHP/sw-fw-less/.gitignore | 6 - frameworks/PHP/sw-fw-less/README.md | 51 -------- .../PHP/sw-fw-less/app/models/Fortune.php | 10 -- .../PHP/sw-fw-less/app/models/World.php | 10 -- .../sw-fw-less/app/services/TestService.php | 121 ------------------ .../PHP/sw-fw-less/benchmark_config.json | 31 ----- frameworks/PHP/sw-fw-less/composer.json | 44 ------- frameworks/PHP/sw-fw-less/config.toml | 19 --- frameworks/PHP/sw-fw-less/config/app.php | 88 ------------- .../PHP/sw-fw-less/config/coroutine.php | 6 - frameworks/PHP/sw-fw-less/config/events.php | 40 ------ frameworks/PHP/sw-fw-less/config/log.php | 11 -- .../PHP/sw-fw-less/config/middleware.php | 18 --- frameworks/PHP/sw-fw-less/config/mysql.php | 23 ---- .../PHP/sw-fw-less/config/providers.php | 30 ----- frameworks/PHP/sw-fw-less/config/router.php | 15 --- frameworks/PHP/sw-fw-less/config/server.php | 23 ---- frameworks/PHP/sw-fw-less/start.php | 12 -- .../PHP/sw-fw-less/sw-fw-less.dockerfile | 33 ----- 20 files changed, 599 deletions(-) delete mode 100644 frameworks/PHP/sw-fw-less/.env delete mode 100644 frameworks/PHP/sw-fw-less/.gitignore delete mode 100644 frameworks/PHP/sw-fw-less/README.md delete mode 100644 frameworks/PHP/sw-fw-less/app/models/Fortune.php delete mode 100644 frameworks/PHP/sw-fw-less/app/models/World.php delete mode 100644 frameworks/PHP/sw-fw-less/app/services/TestService.php delete mode 100755 frameworks/PHP/sw-fw-less/benchmark_config.json delete mode 100644 frameworks/PHP/sw-fw-less/composer.json delete mode 100644 frameworks/PHP/sw-fw-less/config.toml delete mode 100644 frameworks/PHP/sw-fw-less/config/app.php delete mode 100644 frameworks/PHP/sw-fw-less/config/coroutine.php delete mode 100644 frameworks/PHP/sw-fw-less/config/events.php delete mode 100644 frameworks/PHP/sw-fw-less/config/log.php delete mode 100644 frameworks/PHP/sw-fw-less/config/middleware.php delete mode 100644 frameworks/PHP/sw-fw-less/config/mysql.php delete mode 100644 frameworks/PHP/sw-fw-less/config/providers.php delete mode 100644 frameworks/PHP/sw-fw-less/config/router.php delete mode 100644 frameworks/PHP/sw-fw-less/config/server.php delete mode 100644 frameworks/PHP/sw-fw-less/start.php delete mode 100644 frameworks/PHP/sw-fw-less/sw-fw-less.dockerfile diff --git a/frameworks/PHP/sw-fw-less/.env b/frameworks/PHP/sw-fw-less/.env deleted file mode 100644 index a1f35255fd2..00000000000 --- a/frameworks/PHP/sw-fw-less/.env +++ /dev/null @@ -1,8 +0,0 @@ -## MySQL -MYSQL_DSN="mysql:dbname=hello_world;host=tfb-database;port=3306" -MYSQL_USERNAME=benchmarkdbuser -MYSQL_PASSWD=benchmarkdbpass -MYSQL_POOL_SIZE=10 -MYSQL_SWITCH=1 -MYSQL_POOL_CHANGE_EVENT=0 -MYSQL_REPORT_POOL_CHANGE=0 \ No newline at end of file diff --git a/frameworks/PHP/sw-fw-less/.gitignore b/frameworks/PHP/sw-fw-less/.gitignore deleted file mode 100644 index 588e36cc131..00000000000 --- a/frameworks/PHP/sw-fw-less/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/vendor/ -/.idea -/.idea/ -/runtime -/runtime/ -/composer.lock \ No newline at end of file diff --git a/frameworks/PHP/sw-fw-less/README.md b/frameworks/PHP/sw-fw-less/README.md deleted file mode 100644 index 949cce2368e..00000000000 --- a/frameworks/PHP/sw-fw-less/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# [Sw-Fw-Less](https://github.com/luoxiaojun1992/sw-fw-less) Benchmarking Test - -This is the [Sw-Fw-Less](https://github.com/luoxiaojun1992/sw-fw-less) portion of a [benchmarking test suite](../) comparing a variety of web development platforms. - -### JSON Encoding Test - -* [JSON test source](app/services/TestService.php) - -### Plaintext Test - -* [Plaintext test source](app/services/TestService.php) - -### Data-Store/Database Mapping Test - -* [DB test controller](app/services/TestService.php) -* [DB test model](app/models/World.php) - -### Fortunes Test -* [Fortunes test controller](app/services/TestService.php) -* [Fortunes test model](app/models/Fortune.php) - - -## Infrastructure Software Versions -The tests were run with: -* [PHP 7.4](https://www.php.net/) -* [Swoole v4.5.6](https://www.swoole.com/) - -## Test URLs -### JSON Encoding Test - -http://localhost:9501/json - -### Plaintext Test - -http://localhost:9501/plaintext - -### Data-Store/Database Mapping Test - -http://localhost:9501/db - -### Variable Query Test - -http://localhost:9501/queries/2 - -### Data Updates Test - -http://localhost:9501/updates/2 - -### Fortunes Test - -http://localhost:9501/fortunes diff --git a/frameworks/PHP/sw-fw-less/app/models/Fortune.php b/frameworks/PHP/sw-fw-less/app/models/Fortune.php deleted file mode 100644 index 50d37a727b5..00000000000 --- a/frameworks/PHP/sw-fw-less/app/models/Fortune.php +++ /dev/null @@ -1,10 +0,0 @@ - 'Hello, World!']; - } - - public function db() - { - $world = World::select()->cols(['*'])->where('`id` = :id') - ->bindValue(':id', random_int(1, 10000)) - ->first(); - - return $world ? $world->toArray() : []; - } - - public function queries($queries = 1) - { - $queries = $this->clamp($queries); - - $rows = []; - while ($queries--) { - $row = World::select()->cols(['*'])->where('`id` = :id') - ->bindValue(':id', random_int(1, 10000)) - ->first(); - $rows[] = $row ? $row->toArray() : []; - } - - return $rows; - } - - public function fortunes() - { - $rows = Fortune::select()->cols(['*'])->get(); - - $insert = new Fortune(); - $insert->id = 0; - $insert->message = 'Additional fortune added at request time.'; - - $rows[] = $insert; - - usort($rows, function ($left, $right) { - return strcmp($left->message, $right->message); - }); - - return Response::output($this->renderFortunes($rows), 200, ['Content-Type' => 'text/html;charset=utf-8']); - } - - private function renderFortunes($fortunes) - { - $html = << - -Fortunes - - - - - %s -
      idmessage
      - - -EOF; - - $fortuneRows = ''; - foreach ($fortunes as $fortune) { - $fortuneRows .= ' ' . htmlspecialchars($fortune->id) . - '' . htmlspecialchars($fortune->message) . '' . PHP_EOL; - } - - return sprintf($html, $fortuneRows); - } - - public function updates($queries = 1) - { - $queries = $this->clamp($queries); - - $rows = []; - - while ($queries--) { - $row = World::select()->cols(['*'])->where('`id` = :id') - ->bindValue(':id', random_int(1, 10000)) - ->first(); - if ($row) { - $row->randomNumber = random_int(1, 10000); - $row->save(); - - $rows[] = $row->toArray(); - } else { - $rows[] = []; - } - } - - return $rows; - } - - public function plaintext() - { - return Response::output('Hello, World!', 200, ['Content-Type' => 'text/plain']); - } - - private function clamp($value): int - { - if (! is_numeric($value) || $value < 1) { - return 1; - } - if ($value > 500) { - return 500; - } - return (int)$value; - } -} diff --git a/frameworks/PHP/sw-fw-less/benchmark_config.json b/frameworks/PHP/sw-fw-less/benchmark_config.json deleted file mode 100755 index 5274a2a7268..00000000000 --- a/frameworks/PHP/sw-fw-less/benchmark_config.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "framework": "sw-fw-less", - "tests": [ - { - "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries/", - "fortune_url": "/fortunes", - "update_url": "/updates/", - "plaintext_url": "/plaintext", - "port": 9501, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "Sw-Fw-Less", - "language": "PHP", - "flavor": "None", - "orm": "Full", - "platform": "swoole", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Sw-Fw-Less", - "notes": "", - "versus": "swoole", - "tags": ["broken"] - } - } - ] -} diff --git a/frameworks/PHP/sw-fw-less/composer.json b/frameworks/PHP/sw-fw-less/composer.json deleted file mode 100644 index 90e38601f9a..00000000000 --- a/frameworks/PHP/sw-fw-less/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "luoxiaojun/sw-fw-less-app", - "description": "Swoole Http Server App", - "type": "project", - "keywords": [ - "swoole", - "framework", - "coroutine", - "php", - "app" - ], - "require": { - "php": ">=7.1", - "ext-json": "*", - "ext-pdo": "*", - "ext-swoole": ">=4.4.0", - "luoxiaojun/sw-fw-less": "dev-master" - }, - "suggest": { - "ext-redis": "*" - }, - "license": "apache-2.0", - "authors": [ - { - "name": "luoxiaojun", - "email": "luoxiaojun1992@sina.cn" - } - ], - "autoload": { - "psr-4": {"App\\": "app/"} - }, - "scripts": { - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ] - }, - "config": { - "sort-packages": true, - "optimize-autoloader": true, - "preferred-install": "dist" - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/frameworks/PHP/sw-fw-less/config.toml b/frameworks/PHP/sw-fw-less/config.toml deleted file mode 100644 index 4c03bee7d3d..00000000000 --- a/frameworks/PHP/sw-fw-less/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "sw-fw-less" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries/" -urls.update = "/updates/" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Micro" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "swoole" -webserver = "None" -versus = "swoole" diff --git a/frameworks/PHP/sw-fw-less/config/app.php b/frameworks/PHP/sw-fw-less/config/app.php deleted file mode 100644 index 9c497c3b7af..00000000000 --- a/frameworks/PHP/sw-fw-less/config/app.php +++ /dev/null @@ -1,88 +0,0 @@ - [ - 'origin' => env('CORS_ORIGIN', ''), - 'switch' => envInt('CORS_SWITCH', 0), - ], - - //Timezone - 'timezone' => env('TIMEZONE', null), - - //Monitor - 'monitor' => [ - 'switch' => envInt('MONITOR_SWITCH', 0), - ], - - //Throttle - 'throttle' => [ - 'metric' => function(\SwFwLess\components\http\Request $request){ - return $request->getRoute(); - }, - 'period' => envInt('THROTTLE_PERIOD', 60), - 'throttle' => envInt('THROTTLE_THROTTLE', 10000), - ], - - //RedLock - 'red_lock' => [ - 'connection' => env('RED_LOCK_CONNECTION', 'red_lock'), - ], - - //RateLimit - 'rate_limit' => [ - 'connection' => env('RATE_LIMIT_CONNECTION', 'rate_limit'), - ], - - //Cache - 'cache' => [ - 'connection' => env('CACHE_CONNECTION', 'cache'), //redis connection - 'update_lock_ttl' => envInt('CACHE_UPDATE_LOCK_TTL', 10), - ], - - //Hot Reload - 'hot_reload' => [ - 'switch' => envInt('HOT_RELOAD_SWITCH', 0), - 'watch_dirs' => [ - __DIR__ . '/', - __DIR__ . '/../app/', - __DIR__ . '/../vendor/', - __DIR__ . '/../', - ], - 'excluded_dirs' => [], - 'watch_suffixes' => ['.php', '.env'], - 'driver' => env('HOT_RELOAD_DRIVER', \Kwf\FileWatcher\Watcher::class), //HuangYi\Watcher\Watcher::class is another choice - ], - - //Error handler - 'error_handler' => [ - 'err_formatter' => function (\Throwable $e) { - return nl2br($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - }, - ], - - //Ip Restriction - 'ip_restriction' => [ - 'ips' => env('IP_RESTRICTION_IPS'), - 'api_prefix' => env('IP_RESTRICTION_API_PREFIX'), - ], - - //Scheduler - 'scheduler' => [ -// [ -// 'schedule' => '* * * * *', -// 'jobs' => function () { -// echo 'Every minute', PHP_EOL; -// }, -// ], -// [ -// 'schedule' => '*/2 * * * *', -// 'jobs' => function () { -// echo 'Every two minutes', PHP_EOL; -// }, -// ], - ], - - //You can turn off the switch to improve the performance - 'route_di_switch' => envBool('ROUTE_DI_SWITCH', false), -]; diff --git a/frameworks/PHP/sw-fw-less/config/coroutine.php b/frameworks/PHP/sw-fw-less/config/coroutine.php deleted file mode 100644 index ca102cdcbcc..00000000000 --- a/frameworks/PHP/sw-fw-less/config/coroutine.php +++ /dev/null @@ -1,6 +0,0 @@ - envInt('COROUTINE_PREEMPTIVE_SCHEDULER', 0), - 'hook_flags' => SWOOLE_HOOK_ALL, -]; diff --git a/frameworks/PHP/sw-fw-less/config/events.php b/frameworks/PHP/sw-fw-less/config/events.php deleted file mode 100644 index c81f2ce7605..00000000000 --- a/frameworks/PHP/sw-fw-less/config/events.php +++ /dev/null @@ -1,40 +0,0 @@ - [ - function (\Cake\Event\Event $event) { - $count = $event->getData('count'); - - if (\SwFwLess\components\Config::get('redis.report_pool_change')) { - \SwFwLess\components\swoole\counter\Counter::incr('monitor:pool:redis', $count); - } - }, - ], - \SwFwLess\components\mysql\MysqlPool::EVENT_MYSQL_POOL_CHANGE => [ - function (\Cake\Event\Event $event) { - $count = $event->getData('count'); - - if (\SwFwLess\components\Config::get('mysql.report_pool_change')) { - \SwFwLess\components\swoole\counter\Counter::incr('monitor:pool:mysql', $count); - } - }, - ], - \SwFwLess\components\amqp\ConnectionPool::EVENT_AMQP_POOL_CHANGE => [ - function (\Cake\Event\Event $event) { - $count = $event->getData('count'); - - if (\SwFwLess\components\Config::get('amqp.report_pool_change')) { - \SwFwLess\components\swoole\counter\Counter::incr('monitor:pool:amqp', $count); - } - }, - ], - \SwFwLess\components\hbase\HbasePool::EVENT_HBASE_POOL_CHANGE => [ - function (\Cake\Event\Event $event) { - $count = $event->getData('count'); - - if (\SwFwLess\components\Config::get('hbase.report_pool_change')) { - \SwFwLess\components\swoole\counter\Counter::incr('monitor:pool:hbase', $count); - } - }, - ], -]; diff --git a/frameworks/PHP/sw-fw-less/config/log.php b/frameworks/PHP/sw-fw-less/config/log.php deleted file mode 100644 index 3e3a8b8f500..00000000000 --- a/frameworks/PHP/sw-fw-less/config/log.php +++ /dev/null @@ -1,11 +0,0 @@ - env('LOG_PATH', __DIR__ . '/../runtime/logs/app-{date}.log'), - 'level' => envInt('LOG_LEVEL', \Monolog\Logger::DEBUG), - 'pool_size' => envInt('LOG_POOL_SIZE', 100), - 'buffer_max_size' => envInt('LOG_BUFFER_MAX_SIZE', 10), - 'name' => env('LOG_NAME', 'sw-fw-less'), - 'reserve_days' => envInt('LOG_RESERVE_DAYS', 3), - 'switch' => envInt('LOG_SWITCH', 0), -]; diff --git a/frameworks/PHP/sw-fw-less/config/middleware.php b/frameworks/PHP/sw-fw-less/config/middleware.php deleted file mode 100644 index bc4dc44ae4c..00000000000 --- a/frameworks/PHP/sw-fw-less/config/middleware.php +++ /dev/null @@ -1,18 +0,0 @@ - [ -// \SwFwLess\components\zipkin\Middleware::class, -// \SwFwLess\components\chaos\Middleware::class, -// \SwFwLess\middlewares\Cors::class, -// \SwFwLess\components\auth\Middleware::class, -// \SwFwLess\middlewares\IpRestriction::class, - ], - 'routeMiddleware' => [ -// \SwFwLess\components\ratelimit\Middleware::class, - ], - 'aliases' => [ - 'cors' => \SwFwLess\middlewares\Cors::class, - 'auth' => \SwFwLess\components\auth\Middleware::class, - ], -]; diff --git a/frameworks/PHP/sw-fw-less/config/mysql.php b/frameworks/PHP/sw-fw-less/config/mysql.php deleted file mode 100644 index 33d4d727ea8..00000000000 --- a/frameworks/PHP/sw-fw-less/config/mysql.php +++ /dev/null @@ -1,23 +0,0 @@ - env('MYSQL_DEFAULT', 'default'), - 'connections' => [ - env('MYSQL_DEFAULT', 'default') => [ - 'dsn' => env('MYSQL_DSN', 'mysql:dbname=sw_test;host=127.0.0.1'), - 'username' => env('MYSQL_USERNAME', 'root'), - 'passwd' => env('MYSQL_PASSWD', null), - 'options' => [ - \PDO::ATTR_CASE => \PDO::CASE_NATURAL, - \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, - \PDO::ATTR_ORACLE_NULLS => \PDO::NULL_NATURAL, - \PDO::ATTR_STRINGIFY_FETCHES => false, - \PDO::ATTR_EMULATE_PREPARES => false, - ], - 'pool_size' => envInt('MYSQL_POOL_SIZE', 5), - ], - ], - 'switch' => envInt('MYSQL_SWITCH', 0), - 'pool_change_event' => envInt('MYSQL_POOL_CHANGE_EVENT', 0), - 'report_pool_change' => envInt('MYSQL_REPORT_POOL_CHANGE', 0), -]; diff --git a/frameworks/PHP/sw-fw-less/config/providers.php b/frameworks/PHP/sw-fw-less/config/providers.php deleted file mode 100644 index 8e885a94ac4..00000000000 --- a/frameworks/PHP/sw-fw-less/config/providers.php +++ /dev/null @@ -1,30 +0,0 @@ - [ - ['GET', '/json', [TestService::class, 'json']], - ['GET', '/db', [TestService::class, 'db']], - ['GET', '/queries/[{queries}]', [TestService::class, 'queries']], - ['GET', '/fortunes', [TestService::class, 'fortunes']], - ['GET', '/updates/[{queries}]', [TestService::class, 'updates']], - ['GET', '/plaintext', [TestService::class, 'plaintext']], - ], - 'group' => [], -]; diff --git a/frameworks/PHP/sw-fw-less/config/server.php b/frameworks/PHP/sw-fw-less/config/server.php deleted file mode 100644 index c90bd44d5fc..00000000000 --- a/frameworks/PHP/sw-fw-less/config/server.php +++ /dev/null @@ -1,23 +0,0 @@ - env('SERVER_HOST', '0.0.0.0'), - 'port' => envInt('SERVER_PORT', 9501), - 'worker_num' => envInt('SERVER_WORKER_NUM', swoole_cpu_num() * 2), - 'daemonize' => envBool('SERVER_DAEMONIZE', false), - 'backlog' => envInt('SERVER_BACKLOG', 128), - 'max_request' => envInt('SERVER_MAX_REQUEST', 0), - 'dispatch_mode' => envInt('SERVER_DISPATCH_MODE', 2), - 'open_http2_protocol' => envBool('SERVER_OPEN_HTTP2', false), - 'task_worker_num' => envInt('SERVER_TASK_WORKER_NUM', 0), - 'task_enable_coroutine' => envBool('SERVER_TASK_ENABLE_COROUTINE', false), - 'open_tcp_nodelay' => envBool('SERVER_OPEN_TCP_NODELAY', true), - 'max_coroutine' => envInt('SERVER_MAX_COROUTINE', 1000000), - 'socket_buffer_size' => envInt('SERVER_SOCKET_BUFFER_SIZE', 2 * 1024 * 1024), -]; - -if (!empty($pidFile = env('SERVER_PID_FILE'))) { - $serverConfig['pid_file'] = $pidFile; -} - -return $serverConfig; diff --git a/frameworks/PHP/sw-fw-less/start.php b/frameworks/PHP/sw-fw-less/start.php deleted file mode 100644 index b5b58592280..00000000000 --- a/frameworks/PHP/sw-fw-less/start.php +++ /dev/null @@ -1,12 +0,0 @@ -run(); diff --git a/frameworks/PHP/sw-fw-less/sw-fw-less.dockerfile b/frameworks/PHP/sw-fw-less/sw-fw-less.dockerfile deleted file mode 100644 index 6cd83a9597f..00000000000 --- a/frameworks/PHP/sw-fw-less/sw-fw-less.dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM php:7.4 - -RUN pecl install swoole > /dev/null && \ - docker-php-ext-enable swoole - -RUN docker-php-ext-install pdo_mysql > /dev/null - -RUN apt -yqq update > /dev/null && \ - apt -yqq install git unzip > /dev/null - -# Composer -RUN curl -sS https://getcomposer.org/installer | php \ - && mv composer.phar /usr/local/bin/composer \ - && composer self-update --clean-backups - -# Bcmath extension required by amqp composer package -RUN docker-php-ext-install bcmath > /dev/null - -# Sockets extension -RUN docker-php-ext-install sockets > /dev/null - -ADD . /var/www/sw-fw-less - -WORKDIR /var/www/sw-fw-less - -RUN composer install --no-dev --quiet > /dev/null \ - && composer dump-autoload -o - -EXPOSE 9501 - -ENTRYPOINT ["php", "/var/www/sw-fw-less/start.php"] - -LABEL luoxiaojun1992 \ No newline at end of file From 9dc6136cb6d07e9a204c6c126a5a68ea3d395353 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 7 Apr 2025 19:14:26 +0200 Subject: [PATCH 1348/1766] [php/cyberphp] Remove Cyberphp (#9780) The frameworks repo seems to have been removed: https://github.com/eoioer/cyberphp --- frameworks/PHP/cyberphp/README.md | 26 -- frameworks/PHP/cyberphp/app/config.php | 57 ----- .../PHP/cyberphp/app/controller/Index.php | 74 ------ frameworks/PHP/cyberphp/app/helpers.php | 84 ------- frameworks/PHP/cyberphp/app/route.php | 14 -- .../cyberphp/app/views/errors/exception.html | 62 ----- frameworks/PHP/cyberphp/benchmark_config.json | 30 --- frameworks/PHP/cyberphp/bootstrap.php | 41 ---- frameworks/PHP/cyberphp/composer.json | 29 --- frameworks/PHP/cyberphp/cyberphp.dockerfile | 26 -- frameworks/PHP/cyberphp/php.ini | 11 - frameworks/PHP/cyberphp/public/favicon.ico | Bin 16958 -> 0 bytes frameworks/PHP/cyberphp/public/index.php | 23 -- frameworks/PHP/cyberphp/server.php | 85 ------- frameworks/PHP/cyberphp/src/App.php | 154 ------------ frameworks/PHP/cyberphp/src/Middleware.php | 48 ---- frameworks/PHP/cyberphp/src/Request.php | 232 ------------------ frameworks/PHP/cyberphp/src/Response.php | 218 ---------------- frameworks/PHP/cyberphp/src/Route.php | 61 ----- frameworks/PHP/cyberphp/src/Utility.php | 47 ---- 20 files changed, 1322 deletions(-) delete mode 100755 frameworks/PHP/cyberphp/README.md delete mode 100644 frameworks/PHP/cyberphp/app/config.php delete mode 100644 frameworks/PHP/cyberphp/app/controller/Index.php delete mode 100644 frameworks/PHP/cyberphp/app/helpers.php delete mode 100644 frameworks/PHP/cyberphp/app/route.php delete mode 100644 frameworks/PHP/cyberphp/app/views/errors/exception.html delete mode 100755 frameworks/PHP/cyberphp/benchmark_config.json delete mode 100644 frameworks/PHP/cyberphp/bootstrap.php delete mode 100644 frameworks/PHP/cyberphp/composer.json delete mode 100644 frameworks/PHP/cyberphp/cyberphp.dockerfile delete mode 100644 frameworks/PHP/cyberphp/php.ini delete mode 100644 frameworks/PHP/cyberphp/public/favicon.ico delete mode 100644 frameworks/PHP/cyberphp/public/index.php delete mode 100644 frameworks/PHP/cyberphp/server.php delete mode 100644 frameworks/PHP/cyberphp/src/App.php delete mode 100644 frameworks/PHP/cyberphp/src/Middleware.php delete mode 100644 frameworks/PHP/cyberphp/src/Request.php delete mode 100644 frameworks/PHP/cyberphp/src/Response.php delete mode 100644 frameworks/PHP/cyberphp/src/Route.php delete mode 100644 frameworks/PHP/cyberphp/src/Utility.php diff --git a/frameworks/PHP/cyberphp/README.md b/frameworks/PHP/cyberphp/README.md deleted file mode 100755 index bc25c16fc20..00000000000 --- a/frameworks/PHP/cyberphp/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# CyberPHP Benchmarking Test - -## Test URLs -### JSON - -http://localhost:8080/json - -### PLAINTEXT - -http://localhost:8080/plaintext - -### DB - -http://localhost:8080/db - -### QUERY - -http://localhost:8080/queries/[count] - -### UPDATE - -http://localhost:8080/updates/[count] - -### FORTUNES - -http://localhost:8080/fortunes diff --git a/frameworks/PHP/cyberphp/app/config.php b/frameworks/PHP/cyberphp/app/config.php deleted file mode 100644 index ba727ea087a..00000000000 --- a/frameworks/PHP/cyberphp/app/config.php +++ /dev/null @@ -1,57 +0,0 @@ - 'Cyber', - // Request middleware runs after obtaining request body and before parsing route - // Mainly used for blacklist, whitelist, system maintenance, request filtering, data access, etc. - 'request_middleware' => [ - // \app\common\middleware\IpBlacklistMiddleware::class,// IP blacklist middleware - // \app\middleware\RateLimitMiddleware::class,// Rate limit middleware - // \app\middleware\SecurityMiddleware::class, // Security protection (CSRF/XSS filtering/SQL injection) middleware - ], - // Business middleware runs after parsing route and before executing controller method - // Mainly used for common business such as user authentication - 'middleware' => [ - // \app\common\middleware\Route1Middleware::class, - // \app\common\middleware\Route2Middleware::class, - ], - 'orm' => 'pdo', - 'pdo' => [ - 'dsn' => 'pgsql:host=tfb-database;dbname=hello_world', - 'username' => 'benchmarkdbuser', - 'password' => 'benchmarkdbpass', - 'options' => [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,PDO::ATTR_EMULATE_PREPARES => false] - ], - 'eloquent' => [ - 'driver' => 'mysql', - 'host' => '127.0.0.1', - 'database' => 'lavaman', - 'username' => 'root', - 'password' => 'root', - 'charset' => 'utf8mb4', - 'prefix' => '', - ], - 'thinkorm' => [ - 'default' => 'mysql', - 'connections' => [ - 'mysql' => [ - 'type' => 'mysql', // Database type - 'hostname' => '127.0.0.1',// Server address - 'database' => 'lavaman',// Database name - 'username' => 'root',// Database username - 'password' => 'root',// Database password - 'hostport' => '',// Database connection port - 'params' => [], - 'charset' => 'utf8mb4',// Database encoding default utf8 - 'prefix' => '',// Table prefix - ], - ], - ], - 'cookie' => [ - 'expires' => 0, - 'path' => '/', - 'domain' => '', - 'secure' => true, - 'httponly' => true, - 'samesite' => 'Lax' // None, Lax, Strict - ] -]; \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/app/controller/Index.php b/frameworks/PHP/cyberphp/app/controller/Index.php deleted file mode 100644 index b1466094bab..00000000000 --- a/frameworks/PHP/cyberphp/app/controller/Index.php +++ /dev/null @@ -1,74 +0,0 @@ - 'Hello, World!']); - } - - public function plaintext() - { - return Response::text('Hello, World!'); - } - - public function db() - { - $prepare = app()->dbWorld; - $prepare->execute([mt_rand(1, 10000)]); - $data = $prepare->fetch(); - return Response::json($data); - } - public function fortunes() - { - $fortune = app()->dbFortune; - $fortune->execute(); - $arr = $fortune->fetchAll(\PDO::FETCH_KEY_PAIR); - $arr[0] = 'Additional fortune added at request time.'; - \asort($arr); - $html = ''; - foreach ($arr as $id => $message) { - $message = \htmlspecialchars($message, \ENT_QUOTES, 'UTF-8'); - $html .= "$id$message"; - } - return Response::html("Fortunes$html
      idmessage
      "); - } - - public function queries($q=1) - { - $statement = app()->dbWorld; - $query_count = max(min(intval($q), 500), 1); - $arr = []; - while ($query_count--) { - $statement->execute([mt_rand(1, 10000)]); - $arr[] = $statement->fetch(); - } - return Response::json($arr); - } - - public function updates($q=1) - { - static $updates = []; - - $random = app()->dbWorld; - $count = max(min(intval($q), 500), 1); - - $worlds = $keys = $values = []; - for ($i = 0; $i < $count; ++ $i) { - $values[] = $keys[] = $id = mt_rand(1, 10000); - $random->execute([$id]); - $row = $random->fetch(); - $values[] = $row['randomNumber'] = mt_rand(1, 10000); - $worlds[] = $row; - } - if (!isset($updates[$count])) { - $sql = 'UPDATE World SET randomNumber = CASE id' . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $count) . 'END WHERE id IN (' . str_repeat('?::INTEGER,', $count - 1) . '?::INTEGER)'; - $updates[$count] = app()->db->prepare($sql); - } - $updates[$count]->execute([...$values, ...$keys]); - - return Response::json($worlds); - } -} diff --git a/frameworks/PHP/cyberphp/app/helpers.php b/frameworks/PHP/cyberphp/app/helpers.php deleted file mode 100644 index 0b55349f7e3..00000000000 --- a/frameworks/PHP/cyberphp/app/helpers.php +++ /dev/null @@ -1,84 +0,0 @@ -getConfig($key) ?? $default; - } -} - -function renderExceptionPage($e, $debug = true, $templateFile = ''): string -{ - // Determine template path - $templateFile = !empty($templateFile) ? $templateFile : __DIR__ . '/views/errors/exception.html'; - // Prepare template variables - $data = [ - 'code' => $e->getCode(), - 'message' => $debug ? $e->getMessage() : 'The current server is experiencing an error, please contact the administrator or try again later.', - 'error' => $e->getMessage(), - ]; - // Add more information in debug mode - if ($debug) { - $data['trace'] = []; - $data['file'] = $e->getFile(); - $data['line'] = $e->getLine(); - $traceFiles = $e->getTrace(); - array_unshift($traceFiles, ['file' => $data['file'], 'line' => $data['line']]); - foreach ($traceFiles as $v) { - try { - if (isset($v['file']) && isset($v['line'])) { - $startline = max(1, $v['line'] - 10); - $contents = file($v['file']); - $data['trace'][] = [ - 'file' => $v['file'], - 'line' => $v['line'], - 'source0' => $contents ? array_slice($contents, 0, 1) : '', - 'source' => [ - 'startline' => $startline, - 'content' => array_slice($contents, $startline - 1, 16) - ] - ]; - } - } catch (\Throwable $e) { - continue; - } - } - } - // Render error page - if (!file_exists($templateFile)) { - $msg = '

      Error ' . $data['code'] . '

      '; - $msg .= '
      Sorry, the server encountered an error
      '; - $msg .= '

      ' . htmlspecialchars($data['message']) . '

      '; - $msg .= ''; - return $msg; - } - extract($data); - ob_start(); - include $templateFile; - return ob_get_clean(); -} \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/app/route.php b/frameworks/PHP/cyberphp/app/route.php deleted file mode 100644 index e224ec394c3..00000000000 --- a/frameworks/PHP/cyberphp/app/route.php +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - An Error Occurred - - - -
      -

      Error

      -

      Sorry, an error occurred

      -
      - - - $v) { ?> -
      -
      # Line
      -
      -
    3. '.htmlentities($v['source0'][0]).'
    4. '; - } - if (!empty($v['source'])) { - echo '
        '; - foreach ((array) $v['source']['content'] as $key => $value) { - if (($key + $v['source']['startline']) == $v['line']) { - echo '
      1. '.htmlentities($value).'
      2. '; - } else { - echo '
      3. '.htmlentities($value).'
      4. '; - } - } - echo '
      '; - } - ?>
      -
      -
      - - - Return to Home - - - \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/benchmark_config.json b/frameworks/PHP/cyberphp/benchmark_config.json deleted file mode 100755 index 689f889ef03..00000000000 --- a/frameworks/PHP/cyberphp/benchmark_config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "framework": "cyberphp", - "tests": [ - { - "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries/", - "fortune_url": "/fortunes", - "update_url": "/updates/", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "cyberphp", - "language": "PHP", - "flavor": "PHP8", - "orm": "Raw", - "platform": "workerman", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "cyberphp", - "notes": "", - "versus": "workerman" - } - } - ] -} diff --git a/frameworks/PHP/cyberphp/bootstrap.php b/frameworks/PHP/cyberphp/bootstrap.php deleted file mode 100644 index f9d1a350d25..00000000000 --- a/frameworks/PHP/cyberphp/bootstrap.php +++ /dev/null @@ -1,41 +0,0 @@ - __DIR__ .'/app/route.php', - - // Application configuration file location can be modified freely - - // Key represents the name of the sub-application; sub-applications not listed cannot be accessed - 'config' => [ - // Default configuration - '' => require 'app/config.php', - // If a sub-application does not mention a configuration, the content of the default configuration file will be used - // 'admin'=> (require 'app/admin/config.php') + (require 'app/config.php'), - - // Or only use the default configuration - // 'phone'=> require 'app/config.php', - - // Or do not use the default configuration, directly use your custom sub-application configuration, you can change the name freely - // 'phone'=> require 'app/config_phone.php', - - // Or this way, each configuration item is introduced separately - // 'admin'=> [ - // 'app_name' => 'admin', - // 'request_middleware' => require 'app/admin/config_request_middleware.php', - // 'middleware' => require 'app/admin/config_middleware.php', - // 'database' => require 'app/admin/config_database.php', - // 'cookie' => require 'app/admin/config_cookie.php', - // 'database' => require 'app/admin/config_database.php', - // ], - ], - - // Create route manager - 'Route' => \DI\create(\Cyber\Route::class), - 'Middleware' => \DI\create(\Cyber\Middleware::class), - - // Create request object for handling HTTP requests - 'Request' => \DI\create(\Cyber\Request::class), - // Create response object for generating HTTP responses - 'Response' => \DI\create(\Cyber\Response::class), -]; \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/composer.json b/frameworks/PHP/cyberphp/composer.json deleted file mode 100644 index 68678af9697..00000000000 --- a/frameworks/PHP/cyberphp/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "eoioer/cyberphp", - "authors": [ - { - "name": "eoioer", - "email": "eoioer@qq.com" - } - ], - "type": "project", - "description": "The Fastest and Smallest PHP Framework", - "license": "MIT", - "require": { - "php": ">=8.3", - "php-di/php-di": "^7.0", - "nikic/fast-route": "^1.3", - "workerman/workerman": "^4.1" - }, - "autoload": { - "psr-4": { - "app\\": "app/", - "Cyber\\": "src/" - }, - "files": [ - "app/helpers.php" - ] - }, - "minimum-stability": "stable", - "prefer-stable": true -} diff --git a/frameworks/PHP/cyberphp/cyberphp.dockerfile b/frameworks/PHP/cyberphp/cyberphp.dockerfile deleted file mode 100644 index e1c91791a05..00000000000 --- a/frameworks/PHP/cyberphp/cyberphp.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM ubuntu:24.04 - -ENV TEST_TYPE default - -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 > /dev/null && \ - apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null - -RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-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.4-dev libevent-dev git > /dev/null -RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini - -WORKDIR /cyberphp -COPY --link . . - -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -COPY php.ini /etc/php/8.4/cli/conf.d/10-opcache.ini - -EXPOSE 8080 - -CMD php /cyberphp/server.php start \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/php.ini b/frameworks/PHP/cyberphp/php.ini deleted file mode 100644 index f4817cc9e3a..00000000000 --- a/frameworks/PHP/cyberphp/php.ini +++ /dev/null @@ -1,11 +0,0 @@ -zend_extension=opcache.so -opcache.enable=1 -opcache.enable_cli=1 -opcache.validate_timestamps=0 -opcache.save_comments=0 -opcache.enable_file_override=1 -opcache.huge_code_pages=1 -mysqlnd.collect_statistics = Off -memory_limit = 512M -opcache.jit_buffer_size=128M -opcache.jit=tracing \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/public/favicon.ico b/frameworks/PHP/cyberphp/public/favicon.ico deleted file mode 100644 index ada4d61b845d9977de4d8250fa815e3dd5037149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 - if (!$response instanceof Response) { - $response = Response::html($response ?? ''); - } - echo $response->send(); -} catch (Exception $e) { - echo renderExceptionPage($e); -} catch (Throwable $e) { - echo renderExceptionPage($e); -} diff --git a/frameworks/PHP/cyberphp/server.php b/frameworks/PHP/cyberphp/server.php deleted file mode 100644 index e9a354b2ce9..00000000000 --- a/frameworks/PHP/cyberphp/server.php +++ /dev/null @@ -1,85 +0,0 @@ -count = 4; - -// Initialize ThinkPHP application -$app = \Cyber\App::bootstrap(__DIR__.'/bootstrap.php'); - -/** - * Callback function to handle HTTP requests - * @param TcpConnection $connection Client connection object - * @param WorkermanRequest $request HTTP request object - */ -$http_worker->onMessage = function(TcpConnection $connection, WorkermanRequest $request) use ($app) { - // Initialize request object - $_GET = $request->get(); // Get GET parameters - $_POST = $request->post(); // Get POST parameters - $_FILES = $request->file(); // Get file uploads - $_COOKIE = $request->cookie(); // Get COOKIE - - // Merge server variables - $_SERVER = array_merge($_SERVER, [ - 'RAW_BODY' => $request->rawBody(), // Raw request body - 'REQUEST_METHOD' => $request->method(), // Request method - 'REQUEST_URI' => $request->uri(), // Request URI - 'QUERY_STRING' => $request->queryString(), // Query string - 'REMOTE_ADDR' => $connection->getRemoteIp(), // Client IP - 'REMOTE_PORT' => $connection->getRemotePort(), // Client port - 'SERVER_PROTOCOL' => 'HTTP/'.$request->protocolVersion(), // Protocol version - ]); - - // Handle request headers - foreach ($request->header() as $key => $value) { - $_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $key))] = $value; - } - - try { - ob_start(); // Start output buffering - $response = $app->run(); // Run ThinkPHP application - - // Handle response - if(!$response instanceof Response){ - // If not a Response object, directly output content - echo $response; - $content = ob_get_clean(); - $connection->send($content); - }else{ - // If it is a Response object, send HTTP response - echo $response->send(); - $content = ob_get_clean(); - $connection->send(new Workerman\Protocols\Http\Response( - $response->getStatusCode(), // Status code - $response->getHeaders(), // Response headers - $content // Response content - )); - } - } catch (Exception $e) { - // Catch exceptions and render error page - $connection->send(renderExceptionPage($e)); - } catch (Throwable $e) { - // Catch all errors - $connection->send(renderExceptionPage($e)); - } -}; - -/** - * Run all Worker instances - * This method will block the current process until all Workers stop - */ -Worker::runAll(); diff --git a/frameworks/PHP/cyberphp/src/App.php b/frameworks/PHP/cyberphp/src/App.php deleted file mode 100644 index 288e969e0a9..00000000000 --- a/frameworks/PHP/cyberphp/src/App.php +++ /dev/null @@ -1,154 +0,0 @@ -start_time = time(); - - /* Build container instance */ - $this->container = new Container($containerConfig); - - /* Load route configuration */ - $routes = require $this->container->get('route_path'); - /* Create route manager */ - $this->route = $this->container->get('Route'); - /* Call route dispatcher */ - $this->route->dispatcher($routes); - - /* Configuration */ - $this->config = $this->container->get('config'); - /* Request object */ - $this->request = $this->container->get('Request'); - - /* Database */ - $pdo = new PDO(...$this->getConfig('pdo')); - $this->db = $pdo; - $this->dbWorld = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); - $this->dbFortune = $pdo->prepare('SELECT id,message FROM Fortune'); - - } - /** - * Run application - */ - public function run() - { - $this->timestamps = time(); - /* cli mode maintains database connection */ - if (php_sapi_name() === 'cli' and time() - $this->start_time > 1) { - $this->start_time = time(); - $pdo = new PDO(...$this->getConfig('pdo')); - $this->db = $pdo; - $this->dbWorld = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); - $this->dbFortune = $pdo->prepare('SELECT id,message FROM Fortune'); - } - - /* Return response */ - return $this->route->handleRoute(); - } - - /** - * Get the current application configuration - * $app->getConfig(); // Returns the entire configuration content of the current application - * $app->getConfig('app_name'); // Get the value of ['app_name'] in the current application configuration - * $app->getConfig('cookie.expires'); // Get the value of ['cookie']['expires'] - * $app->getConfig(null, 'admin'); // Returns the entire configuration content of the admin application - * $app->getConfig('app_name', 'admin'); // Get the value of ['app_name'] in the admin application configuration - * $app->getConfig('cookie.expires','admin'); // Get the value of ['cookie']['expires'] in the admin application configuration - */ - public function getConfig($key = null, $appName = null): mixed - { - $appName = $appName ?? $this->appName ?? ''; - $config = $this->config[$appName] ?? null; - // Get the entire application configuration - if ($key === null) { - return $config; - } - // Split the key into an array - $keys = explode('.', $key); - // Traverse the key array and get the configuration layer by layer - foreach ($keys as $k) { - if (is_array($config) && array_key_exists($k, $config)) { - $config = $config[$k]; - } else { - return null; // If a layer does not exist, return null - } - } - return $config; // Return the final configuration value - } - /** - * Initialize the application - * @param string $bootstrap Configuration file - * @return self - */ - public static function bootstrap($bootstrap = null): self - { - if (!$bootstrap) { - throw new \Exception('App::bootstrap parameter does not exist'); - } - if (self::$instance === null) { - /* Load container configuration file */ - if (!file_exists($bootstrap) || !is_readable($bootstrap)) { - throw new \Exception("App::bootstrap parameter {$bootstrap} path error"); - } - $containerConfig = require_once $bootstrap; - self::$instance = new self($containerConfig); - return self::$instance; - }else{ - throw new \Exception('Application has started'); - } - } - /** - * Get the application singleton instance - * @return self - */ - public static function getInstance(): self - { - if (self::$instance === null) { - throw new \Exception('Application has not started'); - } - return self::$instance; - } -} diff --git a/frameworks/PHP/cyberphp/src/Middleware.php b/frameworks/PHP/cyberphp/src/Middleware.php deleted file mode 100644 index c482ebe1347..00000000000 --- a/frameworks/PHP/cyberphp/src/Middleware.php +++ /dev/null @@ -1,48 +0,0 @@ -request; - foreach ($requestMiddlewares as $middleware) { - if (!class_exists($middleware)) { - throw new \Exception("The parameter class {$middleware} for processing the request middleware does not exist"); - } - $instance = app()->container->get($middleware); - if (!method_exists($instance, 'handle')) { - throw new \Exception("The parameter class {$middleware} for processing the request middleware does not have a handle method"); - } - /* Call the handle method of the request data middleware */ - $request = $instance->handle($request); - } - return $request; - } - - public function handle(array $Middlewares, callable $finalHandler) - { - $request = app()->request; - $container = app()->container; - // Start wrapping the handler from the last middleware layer by layer - $response = array_reduce( - array_reverse($Middlewares), - function($next, $middleware) use ($request,$container) { - if (!class_exists($middleware)) { - throw new \Exception("The middleware parameter class {$middleware} does not exist"); - } - $instance = $container->get($middleware); - if (!method_exists($instance, 'handle')) { - throw new \Exception("The middleware parameter class {$middleware} does not have a handle method"); - } - return function() use ($instance, $request, $next) { - return $instance->handle($request, $next); - }; - }, - $finalHandler - ); - // Execute the middleware chain - return $response(); - } -} \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/src/Request.php b/frameworks/PHP/cyberphp/src/Request.php deleted file mode 100644 index ec54d88b94c..00000000000 --- a/frameworks/PHP/cyberphp/src/Request.php +++ /dev/null @@ -1,232 +0,0 @@ - $value) { - if (strpos($key, 'HTTP_') === 0) { - $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($key, 5))))); - $headers[$key] = $value; - } - } - ksort($headers); - return $headers; - } - return $_SERVER['HTTP_'.strtoupper(str_replace('-', '_', $key))] ?? $default; - } - /** - * Set request header - * @param string $key Header information name - * @param string $value Header information value - * @return void - */ - public function setHeader(string $key, string $value): void - { - if(is_array($key)){ - foreach ($key as $k => $v) { - $_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $k))] = $v; - } - }else{ - $_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $key))] = $value; - } - } -} diff --git a/frameworks/PHP/cyberphp/src/Response.php b/frameworks/PHP/cyberphp/src/Response.php deleted file mode 100644 index d2b689aacdb..00000000000 --- a/frameworks/PHP/cyberphp/src/Response.php +++ /dev/null @@ -1,218 +0,0 @@ - 'OK', - 201 => 'Created', - 204 => 'No Content', - - // 3xx Redirection - 301 => 'Moved Permanently', - 302 => 'Found', - 304 => 'Not Modified', - - // 4xx Client Errors - 400 => 'Bad Request', - 401 => 'Unauthorized', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 408 => 'Request Timeout', - 422 => 'Unprocessable Entity', - 429 => 'Too Many Requests', - - // 5xx Server Errors - 500 => 'Internal Server Error', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout' - ]; - - protected string $content = ''; - protected int $statusCode = 200; - protected array $headers = []; - protected bool $sent = false; - - public function __construct(string $content = '', int $statusCode = 200, array $headers = []) - { - $this->content = $content; - $this->statusCode = $statusCode; - $this->headers = $headers; - } - - /** - * Get status code description - */ - public function getStatusText(): string - { - return self::HTTP_STATUS[$this->statusCode]; - } - /** - * Get response body - */ - public function getStatusCode(): int - { - return $this->statusCode; - } - /** - * Get response body - */ - public function getContent(): string - { - return $this->content; - } - - /** - * Get all response headers - */ - public function getHeaders(): array - { - return $this->headers; - } - - /** - * Add response header - * - * @throws Exception - */ - public function withHeader(string $name, string|array $value): static - { - // Validate header name legality - if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/', $name)) { - throw new Exception('Header name can only contain letters, numbers, and special characters'); - } - if (empty($name)) { - throw new Exception('Header name cannot be empty'); - } - - $clone = clone $this; - $clone->headers[$name] = is_array($value) ? $value : [$value]; - return $clone; - } - - /** - * Add multiple response headers - */ - public function withHeaders(array $headers): static - { - $clone = clone $this; - foreach ($headers as $name => $value) { - $clone = $clone->withHeader($name, $value); - } - return $clone; - } - - /** - * Create JSON response - * - * @throws Exception - */ - public static function json(mixed $data, int $status = 200, array $headers = []): static - { - try { - $json = json_encode($data, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); - } catch (\JsonException $e) { - throw new Exception('Unable to encode data to JSON', 0, $e); - } - - $headers['Content-Type'] = 'application/json; charset=utf-8'; - $headers['Date'] = gmdate(DATE_RFC7231); - return new static($json, $status, $headers); - } - - /** - * Create HTML response - */ - public static function html(string $html, int $status = 200, array $headers = []): static - { - $headers['Content-Type'] = 'text/html; charset=utf-8'; - $headers['Date'] = gmdate(DATE_RFC7231); - return new static($html, $status, $headers); - } - - /** - * Create text response - */ - public static function text(string $text, int $status = 200, array $headers = []): static - { - $headers['Content-Type'] = 'text/plain; charset=utf-8'; - $headers['Date'] = gmdate(DATE_RFC7231); - return new static($text, $status, $headers); - } - /** - * Create file response - */ - public static function file(string $file, string $filename, int $status = 200, array $headers = []): static - { - $headers['Content-Type'] = 'application/octet-stream'; - $headers['Date'] = gmdate(DATE_RFC7231); - $headers['Content-Disposition'] = 'attachment; filename="' . $filename . '"'; - return new static(file_get_contents($file), $status, $headers); - } - - /** - * Create redirect response - * - * @throws Exception - */ - public static function redirect(string $url, int $status = 302, array $headers = []): static - { - if (!filter_var($url, FILTER_VALIDATE_URL) && !str_starts_with($url, '/')) { - throw new Exception('Invalid URL format'); - } - return new static('', $status, array_merge($headers, ['Location' => $url])); - } - - /** - * Send response - * - * @throws Exception - */ - public function send(): void - { - if ($this->isSent()) { - throw new Exception('Response already sent'); - } - if (!headers_sent()) { - // // 发送状态码 - http_response_code($this->statusCode); - - // // 确保有 Content-Type 头 - if (!isset($this->headers['Content-Type'])) { - $this->headers['Content-Type'] = ['text/html; charset=utf-8']; - } - - // // 发送响应头 - foreach ($this->headers as $name => $values) { - $values = (array) $values; - foreach ($values as $value) { - header($name . ': ' . $value, false); - } - } - } - - // // 发送响应内容 - echo $this->content; - - // $this->sent = true; - } - - /** - * Check if the response has been sent - */ - public function isSent(): bool - { - return $this->sent; - } -} diff --git a/frameworks/PHP/cyberphp/src/Route.php b/frameworks/PHP/cyberphp/src/Route.php deleted file mode 100644 index b1b70f4f873..00000000000 --- a/frameworks/PHP/cyberphp/src/Route.php +++ /dev/null @@ -1,61 +0,0 @@ -dispatcher = FastRoute\simpleDispatcher(function (RouteCollector $r) use ($routes) { - foreach ($routes as $route) { - // Check the number of array members. Three members indicate a single route configuration. - if (count($route) == 3) { - $r->addRoute(preg_split('/\s*,\s*/', $route[1]), $route[0], $route[2]); - // Two members indicate a group route. - } elseif (count($route) == 2) { - $r->addGroup($route[0], function (RouteCollector $r) use ($route) { - foreach ($route[1] as $childRoute) { - $r->addRoute(preg_split('/\s*,\s*/', trim($childRoute[1])), $childRoute[0], $childRoute[2]); - } - }); - } - } - }); - } - public function handleRoute() - { - $request = app()->request; - $container = app()->container; - // Parse the current route - $routeInfo = $this->dispatcher->dispatch($request->getMethod(), $request->getPathInfo()); - if ($routeInfo[0] == 0) { - throw new \Exception('Page not found', 404); - } elseif ($routeInfo[0] == 2) { - throw new \Exception('Request method error', 405); - } elseif ($routeInfo[0] == 1) { - $handler = $routeInfo[1]; - $vars = $routeInfo[2]; - $parameters = [...array_values($vars)]; - - // Create a closure to pass to your middleware to execute the final handler - $finalHandler = function() use ($handler, $parameters, $container) { - // If handler is a string (controller@method) - if (is_string($handler)) { - list($controller, $method) = explode('@', $handler); - $ctrl = $container->get($controller); - return $ctrl->$method(...$parameters); - } elseif (is_callable($handler)) { - return $handler(...$parameters); - } else { - throw new \Exception('Route handler configuration error'); - } - }; - return $finalHandler(); - } - } -} \ No newline at end of file diff --git a/frameworks/PHP/cyberphp/src/Utility.php b/frameworks/PHP/cyberphp/src/Utility.php deleted file mode 100644 index 17ab3948176..00000000000 --- a/frameworks/PHP/cyberphp/src/Utility.php +++ /dev/null @@ -1,47 +0,0 @@ - 'Handling JSON data', - 'mbstring' => 'Handling multibyte strings', - 'pdo' => 'Database connection', - 'pdo_mysql' => 'MySQL database support', - 'openssl' => 'Encryption and HTTPS support' - ]; - // Check required extensions - $missingExtensions = []; - foreach ($requiredExtensions as $extension => $purpose) { - if (!extension_loaded($extension)) { - $missingExtensions[] = sprintf( - "- %s (%s)", - $extension, - $purpose - ); - } - } - // If there are missing required extensions, throw an exception - if (!empty($missingExtensions)) { - throw new \Exception(sprintf( - "Missing required PHP extensions:\n%s\nPlease install these extensions before running the program.", - implode("\n", $missingExtensions) - )); - } - return true; - } -} From b6cb97b3fe8c45739c0caa0539bb57bf2c1cffad Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 7 Apr 2025 19:14:36 +0200 Subject: [PATCH 1349/1766] [go/evio] Remove Evio (#9777) Evio hasn't been updated in 3 years. The last commit removed the FUNDING.yml https://github.com/tidwall/evio It also only supports the plaintext test, which is no longer allowed. --- frameworks/Go/evio/README.md | 9 - frameworks/Go/evio/benchmark_config.json | 41 ---- frameworks/Go/evio/config.toml | 26 --- frameworks/Go/evio/evio-stdlib.dockerfile | 11 -- frameworks/Go/evio/evio.dockerfile | 11 -- frameworks/Go/evio/src/go.mod | 7 - frameworks/Go/evio/src/go.sum | 4 - frameworks/Go/evio/src/main.go | 225 ---------------------- 8 files changed, 334 deletions(-) delete mode 100644 frameworks/Go/evio/README.md delete mode 100644 frameworks/Go/evio/benchmark_config.json delete mode 100644 frameworks/Go/evio/config.toml delete mode 100644 frameworks/Go/evio/evio-stdlib.dockerfile delete mode 100644 frameworks/Go/evio/evio.dockerfile delete mode 100644 frameworks/Go/evio/src/go.mod delete mode 100644 frameworks/Go/evio/src/go.sum delete mode 100644 frameworks/Go/evio/src/main.go diff --git a/frameworks/Go/evio/README.md b/frameworks/Go/evio/README.md deleted file mode 100644 index 1d147be1529..00000000000 --- a/frameworks/Go/evio/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# [evio](https://github.com/tidwall/evio) (GoLang) Benchmarking Test - -This is the go portion of a [benchmarking test suite](https://www.techempower.com/benchmarks/) comparing a variety of web development platforms. - -"Golang Evio" - -## Test URLs - - http://localhost:8080/plaintext diff --git a/frameworks/Go/evio/benchmark_config.json b/frameworks/Go/evio/benchmark_config.json deleted file mode 100644 index 6c4d3495911..00000000000 --- a/frameworks/Go/evio/benchmark_config.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "framework": "evio", - "tests": [{ - "default": { - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "evio", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Evio", - "notes": "", - "versus": "go" - }, - "stdlib": { - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "evio", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Evio", - "notes": "", - "versus": "go" - } - }] -} \ No newline at end of file diff --git a/frameworks/Go/evio/config.toml b/frameworks/Go/evio/config.toml deleted file mode 100644 index 82b63effc16..00000000000 --- a/frameworks/Go/evio/config.toml +++ /dev/null @@ -1,26 +0,0 @@ -[framework] -name = "evio" - -[main] -urls.plaintext = "/plaintext" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" - -[stdlib] -urls.plaintext = "/plaintext" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" diff --git a/frameworks/Go/evio/evio-stdlib.dockerfile b/frameworks/Go/evio/evio-stdlib.dockerfile deleted file mode 100644 index 941bc78797b..00000000000 --- a/frameworks/Go/evio/evio-stdlib.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM docker.io/golang:1.19 - -WORKDIR /evio - -COPY ./src /evio - -RUN GOAMD64=v3 go build -ldflags="-s -w" -o app . - -EXPOSE 8080 - -CMD ./app -stdlib diff --git a/frameworks/Go/evio/evio.dockerfile b/frameworks/Go/evio/evio.dockerfile deleted file mode 100644 index b8fa848ac18..00000000000 --- a/frameworks/Go/evio/evio.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM docker.io/golang:1.19 - -WORKDIR /evio - -COPY ./src /evio - -RUN GOAMD64=v3 go build -ldflags="-s -w" -o app . - -EXPOSE 8080 - -CMD ./app diff --git a/frameworks/Go/evio/src/go.mod b/frameworks/Go/evio/src/go.mod deleted file mode 100644 index f7858c6290a..00000000000 --- a/frameworks/Go/evio/src/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module evio/app - -go 1.19 - -require github.com/tidwall/evio v1.0.8 - -require github.com/kavu/go_reuseport v1.5.0 // indirect diff --git a/frameworks/Go/evio/src/go.sum b/frameworks/Go/evio/src/go.sum deleted file mode 100644 index a23d6dc0c9e..00000000000 --- a/frameworks/Go/evio/src/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/kavu/go_reuseport v1.5.0 h1:UNuiY2OblcqAtVDE8Gsg1kZz8zbBWg907sP1ceBV+bk= -github.com/kavu/go_reuseport v1.5.0/go.mod h1:CG8Ee7ceMFSMnx/xr25Vm0qXaj2Z4i5PWoUx+JZ5/CU= -github.com/tidwall/evio v1.0.8 h1:+M7lh83rL4KwEObDGtXP3J1wE5utH80LeaAhrKCGVfE= -github.com/tidwall/evio v1.0.8/go.mod h1:MJhRp4iVVqx/n/5mJk77oKmSABVhC7yYykcJiKaFYYw= diff --git a/frameworks/Go/evio/src/main.go b/frameworks/Go/evio/src/main.go deleted file mode 100644 index c24aa24aea8..00000000000 --- a/frameworks/Go/evio/src/main.go +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2017 Joshua J Baker. All rights reserved. -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file. - -package main - -import ( - "flag" - "fmt" - "log" - "strconv" - "strings" - "time" - - "github.com/tidwall/evio" -) - -var res string - -type request struct { - proto, method string - path, query string - head, body string - remoteAddr string -} - -func main() { - var port int - var loops int - var unixsocket string - var stdlib bool - - flag.StringVar(&unixsocket, "unixsocket", "", "unix socket") - flag.IntVar(&port, "port", 8080, "server port") - flag.BoolVar(&stdlib, "stdlib", false, "use stdlib") - flag.IntVar(&loops, "loops", -1, "num loops") - flag.Parse() - - res = "Hello, World!" - - var events evio.Events - events.NumLoops = loops - - events.Serving = func(srv evio.Server) (action evio.Action) { - log.Printf("http server started on port %d (loops: %d)", port, srv.NumLoops) - if unixsocket != "" { - log.Printf("http server started at %s", unixsocket) - } - if stdlib { - log.Printf("http server is using stdlib") - } - return - } - - events.Opened = func(c evio.Conn) (out []byte, opts evio.Options, action evio.Action) { - c.SetContext(&evio.InputStream{}) - return - } - - events.Closed = func(c evio.Conn, err error) (action evio.Action) { - return - } - - events.Data = func(c evio.Conn, in []byte) (out []byte, action evio.Action) { - if in == nil { - return - } - is := c.Context().(*evio.InputStream) - data := is.Begin(in) - - // buf := bufio.NewReader(bytes.NewReader(data)) - // req, err := http.ReadRequest(buf) - // if err != nil { - // log.Println(err) - // is.End(data) - // return - // } - // t := &http.Response{ - // Status: "200 OK", - // StatusCode: 200, - // Proto: "HTTP/1.1", - // ProtoMajor: 1, - // ProtoMinor: 1, - // Body: ioutil.NopCloser(bytes.NewBufferString(res)), - // ContentLength: int64(len(res)), - // Request: req, - // Header: make(http.Header, 0), - // } - // resp := bytes.NewBuffer(nil) - // t.Write(resp) - // out = resp.Bytes() - - // process the pipeline - var req request - for { - leftover, err := parsereq(data, &req) - if err != nil { - // bad thing happened - out = appendresp(out, "500 Error", "", err.Error()+"\n") - action = evio.Close - break - } else if len(leftover) == len(data) { - // request not ready, yet - break - } - // handle the request - req.remoteAddr = c.RemoteAddr().String() - out = appendhandle(out, &req) - data = leftover - } - is.End(data) - return - } - var ssuf string - if stdlib { - ssuf = "-net" - } - // We at least want the single http address. - addrs := []string{fmt.Sprintf("tcp"+ssuf+"://:%d", port)} - if unixsocket != "" { - addrs = append(addrs, fmt.Sprintf("unix"+ssuf+"://%s", unixsocket)) - } - // Start serving! - log.Fatal(evio.Serve(events, addrs...)) -} - -// appendhandle handles the incoming request and appends the response to -// the provided bytes, which is then returned to the caller. -func appendhandle(b []byte, req *request) []byte { - return appendresp(b, "200 OK", "", res) -} - -// appendresp will append a valid http response to the provide bytes. -// The status param should be the code plus text such as "200 OK". -// The head parameter should be a series of lines ending with "\r\n" or empty. -func appendresp(b []byte, status, head, body string) []byte { - b = append(b, "HTTP/1.1"...) - b = append(b, ' ') - b = append(b, status...) - b = append(b, '\r', '\n') - b = append(b, "Server: evio\r\n"...) - b = append(b, "Content-Type: text/plain\r\n"...) - b = append(b, "Date: "...) - b = time.Now().AppendFormat(b, "Mon, 02 Jan 2006 15:04:05 GMT") - b = append(b, '\r', '\n') - if len(body) > 0 { - b = append(b, "Content-Length: "...) - b = strconv.AppendInt(b, int64(len(body)), 10) - b = append(b, '\r', '\n') - } - b = append(b, head...) - b = append(b, '\r', '\n') - if len(body) > 0 { - b = append(b, body...) - } - return b -} - -// parsereq is a very simple http request parser. This operation -// waits for the entire payload to be buffered before returning a -// valid request. -func parsereq(data []byte, req *request) (leftover []byte, err error) { - sdata := string(data) - var i, s int - var top string - var clen int - var q = -1 - // method, path, proto line - for ; i < len(sdata); i++ { - if sdata[i] == ' ' { - req.method = sdata[s:i] - for i, s = i+1, i+1; i < len(sdata); i++ { - if sdata[i] == '?' && q == -1 { - q = i - s - } else if sdata[i] == ' ' { - if q != -1 { - req.path = sdata[s:q] - req.query = req.path[q+1 : i] - } else { - req.path = sdata[s:i] - } - for i, s = i+1, i+1; i < len(sdata); i++ { - if sdata[i] == '\n' && sdata[i-1] == '\r' { - req.proto = sdata[s:i] - i, s = i+1, i+1 - break - } - } - break - } - } - break - } - } - if req.proto == "" { - return data, fmt.Errorf("malformed request") - } - top = sdata[:s] - for ; i < len(sdata); i++ { - if i > 1 && sdata[i] == '\n' && sdata[i-1] == '\r' { - line := sdata[s : i-1] - s = i + 1 - if line == "" { - req.head = sdata[len(top)+2 : i+1] - i++ - if clen > 0 { - if len(sdata[i:]) < clen { - break - } - req.body = sdata[i : i+clen] - i += clen - } - return data[i:], nil - } - if strings.HasPrefix(line, "Content-Length:") { - n, err := strconv.ParseInt(strings.TrimSpace(line[len("Content-Length:"):]), 10, 64) - if err == nil { - clen = int(n) - } - } - } - } - // not enough data - return data, nil -} From 1cc38734236557e3e3f49007740e9d20cb25edbc Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 7 Apr 2025 19:14:50 +0200 Subject: [PATCH 1350/1766] [go/gearbox] Remove Gearbox (#9778) Gearbox hasn't been updated in 3 years: https://github.com/gogearbox/gearbox Issues are ignored: https://github.com/gogearbox/gearbox/issues The linked domain "gogearbox.com" no longer works. --- frameworks/Go/gearbox/README.md | 18 -- frameworks/Go/gearbox/benchmark_config.json | 55 ---- frameworks/Go/gearbox/config.toml | 38 --- .../Go/gearbox/gearbox-prefork.dockerfile | 13 - frameworks/Go/gearbox/gearbox.dockerfile | 13 - frameworks/Go/gearbox/src/go.mod | 31 -- frameworks/Go/gearbox/src/go.sum | 222 -------------- frameworks/Go/gearbox/src/main.go | 289 ------------------ .../Go/gearbox/src/templates/fortune.go | 53 ---- .../Go/gearbox/src/templates/fortune.qtpl | 15 - .../Go/gearbox/src/templates/fortune.qtpl.go | 81 ----- 11 files changed, 828 deletions(-) delete mode 100644 frameworks/Go/gearbox/README.md delete mode 100644 frameworks/Go/gearbox/benchmark_config.json delete mode 100644 frameworks/Go/gearbox/config.toml delete mode 100644 frameworks/Go/gearbox/gearbox-prefork.dockerfile delete mode 100644 frameworks/Go/gearbox/gearbox.dockerfile delete mode 100644 frameworks/Go/gearbox/src/go.mod delete mode 100644 frameworks/Go/gearbox/src/go.sum delete mode 100644 frameworks/Go/gearbox/src/main.go delete mode 100644 frameworks/Go/gearbox/src/templates/fortune.go delete mode 100644 frameworks/Go/gearbox/src/templates/fortune.qtpl delete mode 100644 frameworks/Go/gearbox/src/templates/fortune.qtpl.go diff --git a/frameworks/Go/gearbox/README.md b/frameworks/Go/gearbox/README.md deleted file mode 100644 index b96364ebace..00000000000 --- a/frameworks/Go/gearbox/README.md +++ /dev/null @@ -1,18 +0,0 @@ -

      - - - -

      - -

      - gearbox ⚙️is a web framework for building micro services written in Go with a focus on high performance. It's built on fasthttp which is up to 10x faster than net/http -

      - -## Test URLs -* http://localhost:8080/json -* http://localhost:8080/db -* http://localhost:8080/queries?queries=[1-500] -* http://localhost:8080/cached-worlds?count=[1-500] -* http://localhost:8080/fortune -* http://localhost:8080/update?queries=[1-500] -* http://localhost:8080/plaintext diff --git a/frameworks/Go/gearbox/benchmark_config.json b/frameworks/Go/gearbox/benchmark_config.json deleted file mode 100644 index d8b77581c08..00000000000 --- a/frameworks/Go/gearbox/benchmark_config.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "framework": "gearbox", - "tests": [ - { - "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?q=", - "fortune_url": "/fortunes", - "cached_query_url": "/cached-worlds?q=", - "update_url": "/update?q=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "gearbox", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Gearbox", - "notes": "", - "versus": "go" - }, - "prefork": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?q=", - "fortune_url": "/fortunes", - "cached_query_url": "/cached-worlds?q=", - "update_url": "/update?q=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "gearbox", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Gearbox prefork", - "notes": "", - "versus": "go" - } - } - ] -} \ No newline at end of file diff --git a/frameworks/Go/gearbox/config.toml b/frameworks/Go/gearbox/config.toml deleted file mode 100644 index fdbd00e15e6..00000000000 --- a/frameworks/Go/gearbox/config.toml +++ /dev/null @@ -1,38 +0,0 @@ -[framework] -name = "gearbox" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?q=" -urls.update = "/update?q=" -urls.fortune = "/fortunes" -urls.cached_query = "/cached-worlds?q=" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" - -[prefork] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?q=" -urls.update = "/update?q=" -urls.fortune = "/fortunes" -urls.cached_query = "/cached-worlds?q=" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" diff --git a/frameworks/Go/gearbox/gearbox-prefork.dockerfile b/frameworks/Go/gearbox/gearbox-prefork.dockerfile deleted file mode 100644 index c7863feabf7..00000000000 --- a/frameworks/Go/gearbox/gearbox-prefork.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM docker.io/golang:1.19 - -WORKDIR /gearbox - -COPY ./src /gearbox - -RUN go generate -x ./templates - -RUN GOAMD64=v3 go build -ldflags="-s -w" -o app . - -EXPOSE 8080 - -CMD ./app -prefork diff --git a/frameworks/Go/gearbox/gearbox.dockerfile b/frameworks/Go/gearbox/gearbox.dockerfile deleted file mode 100644 index 8a78ce290a5..00000000000 --- a/frameworks/Go/gearbox/gearbox.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM docker.io/golang:1.19 - -WORKDIR /gearbox - -COPY ./src /gearbox - -RUN go generate -x ./templates - -RUN GOAMD64=v3 go build -ldflags="-s -w" -o app . - -EXPOSE 8080 - -CMD ./app diff --git a/frameworks/Go/gearbox/src/go.mod b/frameworks/Go/gearbox/src/go.mod deleted file mode 100644 index 79708752ac5..00000000000 --- a/frameworks/Go/gearbox/src/go.mod +++ /dev/null @@ -1,31 +0,0 @@ -module gearbox/app - -go 1.19 - -require ( - github.com/gogearbox/gearbox v1.2.4 - 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.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.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 - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // 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.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 deleted file mode 100644 index 443a9ec1b19..00000000000 --- a/frameworks/Go/gearbox/src/go.sum +++ /dev/null @@ -1,222 +0,0 @@ -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/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/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/gogearbox/gearbox v1.2.4 h1:h7GNxGRltV63UCGl0smFWKAhScMkFlc5dCZi9k/fFqo= -github.com/gogearbox/gearbox v1.2.4/go.mod h1:IIUyEDzcMVjnA8bkUM7etHHrgzVj70naUDlE2QZk/QU= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -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.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= -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.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.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.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= -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/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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/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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -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/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/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.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= -github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= -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= -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.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= -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/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.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= -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/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-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= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/frameworks/Go/gearbox/src/main.go b/frameworks/Go/gearbox/src/main.go deleted file mode 100644 index 5e933cf4421..00000000000 --- a/frameworks/Go/gearbox/src/main.go +++ /dev/null @@ -1,289 +0,0 @@ -package main - -import ( - "context" - "fmt" - "math/rand" - "os" - "runtime" - "sort" - "strconv" - "sync" - - "gearbox/app/templates" - - "github.com/gogearbox/gearbox" - pgx "github.com/jackc/pgx/v4" - "github.com/jackc/pgx/v4/pgxpool" -) - -var ( - child bool - db *pgxpool.Pool - cachedWorlds Worlds -) - -const ( - queryparam = "q" - helloworld = "Hello, World!" - worldcount = 10000 - worldselectsql = "SELECT id, randomNumber FROM World WHERE id = $1" - worldupdatesql = "UPDATE World SET randomNumber = $1 WHERE id = $2" - worldcachesql = "SELECT * FROM World LIMIT $1" - fortuneselectsql = "SELECT id, message FROM Fortune" - contentType = "Content-Type" - contentTypeHTML = "text/html; charset=utf-8" -) - -func hasArgument(arg string) bool { - for i := range os.Args[1:] { - if os.Args[1:][i] == arg { - return true - } - } - return false -} - -func main() { - initDatabase() - - settings := &gearbox.Settings{ - ServerName: "go", - DisableHeaderNormalizing: true, - } - - if hasArgument("-prefork") { - settings.Prefork = true - } - if hasArgument("-prefork-child") { - child = true - } - - gb := gearbox.New(settings) - gb.Get("/plaintext", plaintextHandler) - gb.Get("/json", jsonHandler) - gb.Get("/db", dbHandler) - gb.Get("/update", updateHandler) - gb.Get("/queries", queriesHandler) - gb.Get("/fortunes", templateHandler) - gb.Get("/cached-worlds", cachedHandler) - gb.Start(":8080") -} - -// Message ... -type Message struct { - Message string `json:"message"` -} - -// Worlds ... -type Worlds []World - -// World ... -type World struct { - ID int32 `json:"id"` - RandomNumber int32 `json:"randomNumber"` -} - -// JSONpool ... -var JSONpool = sync.Pool{ - New: func() interface{} { - return new(Message) - }, -} - -// AcquireJSON ... -func AcquireJSON() *Message { - return JSONpool.Get().(*Message) -} - -// ReleaseJSON ... -func ReleaseJSON(json *Message) { - json.Message = "" - JSONpool.Put(json) -} - -// WorldPool ... -var WorldPool = sync.Pool{ - New: func() interface{} { - return new(World) - }, -} - -// AcquireWorld ... -func AcquireWorld() *World { - return WorldPool.Get().(*World) -} - -// ReleaseWorld ... -func ReleaseWorld(w *World) { - w.ID = 0 - w.RandomNumber = 0 - WorldPool.Put(w) -} - -// WorldsPool ... -var WorldsPool = sync.Pool{ - New: func() interface{} { - return make(Worlds, 0, 500) - }, -} - -// AcquireWorlds ... -func AcquireWorlds() Worlds { - return WorldsPool.Get().(Worlds) -} - -// ReleaseWorlds ...ReleaseWorlds -func ReleaseWorlds(w Worlds) { - w = w[:0] - WorldsPool.Put(w) -} - -// initDatabase : -func initDatabase() { - maxConn := runtime.NumCPU() - if maxConn == 0 { - maxConn = 8 - } - if child { - maxConn = maxConn - } else { - maxConn = maxConn * 4 - } - - var err error - db, err = pgxpool.Connect(context.Background(), fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s pool_max_conns=%d", "tfb-database", 5432, "benchmarkdbuser", "benchmarkdbpass", "hello_world", maxConn)) - if err != nil { - panic(err) - } - populateCache() -} - -// this will populate the cached worlds for the cache test -func populateCache() { - worlds := make(Worlds, worldcount) - rows, err := db.Query(context.Background(), worldcachesql, worldcount) - if err != nil { - panic(err) - } - for i := 0; i < worldcount; i++ { - w := &worlds[i] - if !rows.Next() { - break - } - if err := rows.Scan(&w.ID, &w.RandomNumber); err != nil { - panic(err) - } - //db.QueryRow(context.Background(), worldselectsql, RandomWorld()).Scan(&w.ID, &w.RandomNumber) - } - cachedWorlds = worlds -} - -// jsonHandler : -func jsonHandler(ctx gearbox.Context) { - m := AcquireJSON() - m.Message = helloworld - ctx.SendJSON(&m) - ReleaseJSON(m) -} - -// dbHandler : -func dbHandler(ctx gearbox.Context) { - w := AcquireWorld() - db.QueryRow(context.Background(), worldselectsql, RandomWorld()).Scan(&w.ID, &w.RandomNumber) - ctx.SendJSON(&w) - ReleaseWorld(w) -} - -// Frameworks/Go/fasthttp/src/server-postgresql/server.go#104 -func templateHandler(ctx gearbox.Context) { - rows, _ := db.Query(context.Background(), fortuneselectsql) - - var f templates.Fortune - fortunes := make([]templates.Fortune, 0) - for rows.Next() { - _ = rows.Scan(&f.ID, &f.Message) - fortunes = append(fortunes, f) - } - rows.Close() - fortunes = append(fortunes, templates.Fortune{ - Message: "Additional fortune added at request time.", - }) - - sort.Slice(fortunes, func(i, j int) bool { - return fortunes[i].Message < fortunes[j].Message - }) - - ctx.Set(contentType, contentTypeHTML) - - templates.WriteFortunePage(ctx.Context(), fortunes) -} - -// queriesHandler : -func queriesHandler(ctx gearbox.Context) { - n := QueriesCount(ctx) - worlds := AcquireWorlds()[:n] - for i := 0; i < n; i++ { - w := &worlds[i] - db.QueryRow(context.Background(), worldselectsql, RandomWorld()).Scan(&w.ID, &w.RandomNumber) - } - ctx.SendJSON(&worlds) - ReleaseWorlds(worlds) -} - -// updateHandler : -func updateHandler(ctx gearbox.Context) { - n := QueriesCount(ctx) - worlds := AcquireWorlds()[:n] - for i := 0; i < n; i++ { - w := &worlds[i] - db.QueryRow(context.Background(), worldselectsql, RandomWorld()).Scan(&w.ID, &w.RandomNumber) - w.RandomNumber = int32(RandomWorld()) - } - // sorting is required for insert deadlock prevention. - sort.Slice(worlds, func(i, j int) bool { - return worlds[i].ID < worlds[j].ID - }) - - batch := pgx.Batch{} - for _, w := range worlds { - batch.Queue(worldupdatesql, w.RandomNumber, w.ID) - } - db.SendBatch(context.Background(), &batch).Close() - ctx.SendJSON(&worlds) - ReleaseWorlds(worlds) -} - -var helloworldRaw = []byte("Hello, World!") - -// plaintextHandler : -func plaintextHandler(ctx gearbox.Context) { - ctx.SendBytes(helloworldRaw) -} - -// cachedHandler : -func cachedHandler(ctx gearbox.Context) { - n := QueriesCount(ctx) - worlds := AcquireWorlds()[:n] - for i := 0; i < n; i++ { - worlds[i] = cachedWorlds[RandomWorld()-1] - } - ctx.SendJSON(&worlds) - ReleaseWorlds(worlds) -} - -// RandomWorld : -func RandomWorld() int { - return rand.Intn(worldcount) + 1 -} - -// QueriesCount : -func QueriesCount(ctx gearbox.Context) int { - n, _ := strconv.Atoi(ctx.Query(queryparam)) - if n < 1 { - n = 1 - } else if n > 500 { - n = 500 - } - return n -} diff --git a/frameworks/Go/gearbox/src/templates/fortune.go b/frameworks/Go/gearbox/src/templates/fortune.go deleted file mode 100644 index 1d41ca2c80d..00000000000 --- a/frameworks/Go/gearbox/src/templates/fortune.go +++ /dev/null @@ -1,53 +0,0 @@ -package templates - -import ( - "sync" -) - -type Fortune struct { - ID int `json:"id,omitempty"` - Message string `json:"message,omitempty"` -} - -type Fortunes struct { - F []Fortune -} - -//go:generate go run github.com/valyala/quicktemplate/qtc - -var fortunePool = &sync.Pool{ - New: func() interface{} { - return new(Fortune) - }, -} - -var fortunesPool = &sync.Pool{ - New: func() interface{} { - return &Fortunes{ - F: make([]Fortune, 0), - } - }, -} - -// AcquireFortune returns new message from pool. -func AcquireFortune() *Fortune { - return fortunePool.Get().(*Fortune) -} - -// ReleaseFortune resets the message and return it to the pool. -func ReleaseFortune(f *Fortune) { - f.ID = 0 - f.Message = "" - fortunePool.Put(f) -} - -// AcquireFortunes returns new fortunes from pool. -func AcquireFortunes() *Fortunes { - return fortunesPool.Get().(*Fortunes) -} - -// ReleaseFortunes resets the fortunes and return it to the pool. -func ReleaseFortunes(f *Fortunes) { - f.F = f.F[:0] - fortunesPool.Put(f) -} diff --git a/frameworks/Go/gearbox/src/templates/fortune.qtpl b/frameworks/Go/gearbox/src/templates/fortune.qtpl deleted file mode 100644 index d387990d4ae..00000000000 --- a/frameworks/Go/gearbox/src/templates/fortune.qtpl +++ /dev/null @@ -1,15 +0,0 @@ -{% func FortunePage(rows []Fortune) %} - - -Fortunes - - - - -{% for _, r := range rows %} - -{% endfor %} -
      idmessage
      {%d int(r.ID) %}{%s r.Message %}
      - - -{% endfunc %} diff --git a/frameworks/Go/gearbox/src/templates/fortune.qtpl.go b/frameworks/Go/gearbox/src/templates/fortune.qtpl.go deleted file mode 100644 index 8af0bbf4f10..00000000000 --- a/frameworks/Go/gearbox/src/templates/fortune.qtpl.go +++ /dev/null @@ -1,81 +0,0 @@ -// Code generated by qtc from "fortune.qtpl". DO NOT EDIT. -// See https://github.com/valyala/quicktemplate for details. - -//line fortune.qtpl:1 -package templates - -//line fortune.qtpl:1 -import ( - qtio422016 "io" - - qt422016 "github.com/valyala/quicktemplate" -) - -//line fortune.qtpl:1 -var ( - _ = qtio422016.Copy - _ = qt422016.AcquireByteBuffer -) - -//line fortune.qtpl:1 -func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) { -//line fortune.qtpl:1 - qw422016.N().S(` - - -Fortunes - - - - -`) -//line fortune.qtpl:9 - for _, r := range rows { -//line fortune.qtpl:9 - qw422016.N().S(` - -`) -//line fortune.qtpl:11 - } -//line fortune.qtpl:11 - qw422016.N().S(` -
      idmessage
      `) -//line fortune.qtpl:10 - qw422016.N().D(int(r.ID)) -//line fortune.qtpl:10 - qw422016.N().S(``) -//line fortune.qtpl:10 - qw422016.E().S(r.Message) -//line fortune.qtpl:10 - qw422016.N().S(`
      - - -`) -//line fortune.qtpl:15 -} - -//line fortune.qtpl:15 -func WriteFortunePage(qq422016 qtio422016.Writer, rows []Fortune) { -//line fortune.qtpl:15 - qw422016 := qt422016.AcquireWriter(qq422016) -//line fortune.qtpl:15 - StreamFortunePage(qw422016, rows) -//line fortune.qtpl:15 - qt422016.ReleaseWriter(qw422016) -//line fortune.qtpl:15 -} - -//line fortune.qtpl:15 -func FortunePage(rows []Fortune) string { -//line fortune.qtpl:15 - qb422016 := qt422016.AcquireByteBuffer() -//line fortune.qtpl:15 - WriteFortunePage(qb422016, rows) -//line fortune.qtpl:15 - qs422016 := string(qb422016.B) -//line fortune.qtpl:15 - qt422016.ReleaseByteBuffer(qb422016) -//line fortune.qtpl:15 - return qs422016 -//line fortune.qtpl:15 -} From 7d09bf94cd608d8e86ef2c30c6f518f38335c1f2 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 7 Apr 2025 19:15:03 +0200 Subject: [PATCH 1351/1766] [go/clevergo] Remove Clevergo (#9776) Clevergo hasn't seen updates in 4 years and the repo has been archived: https://github.com/clevergo/clevergo --- frameworks/Go/clevergo/README.md | 12 - frameworks/Go/clevergo/benchmark_config.json | 30 --- frameworks/Go/clevergo/clevergo.dockerfile | 10 - frameworks/Go/clevergo/config.toml | 19 -- frameworks/Go/clevergo/go.mod | 10 - frameworks/Go/clevergo/go.sum | 21 -- frameworks/Go/clevergo/main.go | 218 ------------------- 7 files changed, 320 deletions(-) delete mode 100755 frameworks/Go/clevergo/README.md delete mode 100755 frameworks/Go/clevergo/benchmark_config.json delete mode 100644 frameworks/Go/clevergo/clevergo.dockerfile delete mode 100644 frameworks/Go/clevergo/config.toml delete mode 100644 frameworks/Go/clevergo/go.mod delete mode 100644 frameworks/Go/clevergo/go.sum delete mode 100644 frameworks/Go/clevergo/main.go diff --git a/frameworks/Go/clevergo/README.md b/frameworks/Go/clevergo/README.md deleted file mode 100755 index 6587302c373..00000000000 --- a/frameworks/Go/clevergo/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# [CleverGo](https://github.com/clevergo/clevergo) Benchmarking Test - -[CleverGo](https://github.com/clevergo/clevergo) is a lightweight, feature rich and high performance web framework writing in Go. - -## Test URLs - -http://localhost:8080/json -http://localhost:8080/plaintext -http://localhost:8080/db -http://localhost:8080/query?queries= -http://localhost:8080/update?queries= -http://localhost:8080/fortunes diff --git a/frameworks/Go/clevergo/benchmark_config.json b/frameworks/Go/clevergo/benchmark_config.json deleted file mode 100755 index fdd62b07751..00000000000 --- a/frameworks/Go/clevergo/benchmark_config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "framework": "clevergo", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?n=", - "fortune_url": "/fortunes", - "update_url": "/updates?n=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "mysql", - "framework": "CleverGo", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "CleverGo", - "notes": "", - "versus": "go" - } - } - ] -} diff --git a/frameworks/Go/clevergo/clevergo.dockerfile b/frameworks/Go/clevergo/clevergo.dockerfile deleted file mode 100644 index 38f766b256d..00000000000 --- a/frameworks/Go/clevergo/clevergo.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM docker.io/golang:1.19 - -ADD ./ /clevergo -WORKDIR /clevergo - -RUN GOAMD64=v3 go build -o app main.go - -EXPOSE 8080 - -CMD ./app diff --git a/frameworks/Go/clevergo/config.toml b/frameworks/Go/clevergo/config.toml deleted file mode 100644 index cd48ff7609a..00000000000 --- a/frameworks/Go/clevergo/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "clevergo" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?n=" -urls.update = "/updates?n=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Micro" -database = "mysql" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" diff --git a/frameworks/Go/clevergo/go.mod b/frameworks/Go/clevergo/go.mod deleted file mode 100644 index b6b39a0d8b6..00000000000 --- a/frameworks/Go/clevergo/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module clevergo/app - -go 1.19 - -require ( - clevergo.tech/clevergo v0.6.0 - github.com/go-sql-driver/mysql v1.6.0 -) - -require clevergo.tech/log v0.3.0 // indirect diff --git a/frameworks/Go/clevergo/go.sum b/frameworks/Go/clevergo/go.sum deleted file mode 100644 index 59a8f1efa51..00000000000 --- a/frameworks/Go/clevergo/go.sum +++ /dev/null @@ -1,21 +0,0 @@ -clevergo.tech/clevergo v0.6.0 h1:smn2Kch2YhmRgU1fh3KAxaXHtmMBfZ1r2dPxxnSuFbI= -clevergo.tech/clevergo v0.6.0/go.mod h1:DKjcOs3CrayCTcm5j7gDht2p9u/zakSKClz9cObvO3E= -clevergo.tech/log v0.3.0 h1:9ryDHGeOD3BUSUuJEW3be8QtdnjjavoBkknoRCA7dp8= -clevergo.tech/log v0.3.0/go.mod h1:61sruy0OB79q5JJlxlyi+6eZzVf/bxbUbXnL0KIzsVw= -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/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -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/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frameworks/Go/clevergo/main.go b/frameworks/Go/clevergo/main.go deleted file mode 100644 index 0b3d9819f3a..00000000000 --- a/frameworks/Go/clevergo/main.go +++ /dev/null @@ -1,218 +0,0 @@ -package main - -import ( - "database/sql" - "html/template" - "log" - "math/rand" - "net/http" - "runtime" - "sort" - "strconv" - - "clevergo.tech/clevergo" - _ "github.com/go-sql-driver/mysql" -) - -type Fortune struct { - ID uint16 `json:"id"` - Message string `json:"message"` -} - -type Fortunes []*Fortune - -func (s Fortunes) Len() int { - return len(s) -} - -func (s Fortunes) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -type FortunesByMessage struct { - Fortunes -} - -func (f FortunesByMessage) Less(i, j int) bool { - return f.Fortunes[i].Message < f.Fortunes[j].Message -} - -var ( - // Template - fortuneHTML = ` - - - Fortunes - - - - - - - - {{range .}} - - - - - {{end}} -
      idmessage
      {{ .ID }}{{ .Message }}
      - -` - fortuneTmpl = template.Must(template.New("fortune").Parse(fortuneHTML)) - - // Database - db *sql.DB - dbDSN = "benchmarkdbuser:benchmarkdbpass@tcp(tfb-database:3306)/hello_world" - worldSelect = "SELECT id, randomNumber FROM World WHERE id = ?" - worldUpdate = "UPDATE World SET randomNumber = ? WHERE id = ?" - fortuneSelect = "SELECT id, message FROM Fortune" - worldSelectStmt *sql.Stmt - worldUpdateStmt *sql.Stmt - fortuneSelectStmt *sql.Stmt - worldRowCount = 10000 - maxConnections = 256 - - helloWorld = "Hello, World!" -) - -func init() { - runtime.GOMAXPROCS(runtime.NumCPU()) -} - -func initialize() (err error) { - db, err = sql.Open("mysql", dbDSN) - if err != nil { - log.Fatalf("Error opening database: %v", err) - } - db.SetMaxIdleConns(maxConnections) - db.SetMaxOpenConns(maxConnections) - worldSelectStmt, err = db.Prepare(worldSelect) - if err != nil { - log.Fatal(err) - } - worldUpdateStmt, err = db.Prepare(worldUpdate) - if err != nil { - log.Fatal(err) - } - fortuneSelectStmt, err = db.Prepare(fortuneSelect) - if err != nil { - log.Fatal(err) - } - - return -} - -func main() { - if err := initialize(); err != nil { - log.Fatal(err) - } - - app := clevergo.Pure() - app.Use(clevergo.ServerHeader("CleverGo")) - app.Get("/plaintext", plaintextHandler) - app.Get("/json", jsonHandler) - app.Get("/db", dbHandler) - app.Get("/queries", queriesHandler) - app.Get("/fortunes", fortunesHandler) - app.Get("/updates", updateHandler) - log.Println(app.Run(":8080")) -} - -func dbHandler(c *clevergo.Context) error { - world := new(World) - if err := fetchRandomWorld(world); err != nil { - return err - } - return c.JSON(http.StatusOK, world) -} - -func getQueryCount(q string) int { - n, err := strconv.Atoi(q) - if err != nil || n < 1 { - return 1 - } - if n > 500 { - return 500 - } - return n -} - -type World struct { - ID uint16 `json:"id"` - RandomNumber uint16 `json:"randomNumber"` -} - -func fetchRandomWorld(w *World) error { - n := randomWorldNum() - return worldSelectStmt.QueryRow(n).Scan(&w.ID, &w.RandomNumber) -} - -func randomWorldNum() int { - return rand.Intn(worldRowCount) + 1 -} - -func queriesHandler(c *clevergo.Context) error { - n := getQueryCount(c.QueryParam("n")) - worlds := make([]World, n) - for i := 0; i < n; i++ { - if err := fetchRandomWorld(&worlds[i]); err != nil { - return err - } - } - - return c.JSON(http.StatusOK, worlds) -} - -func fortunesHandler(c *clevergo.Context) error { - rows, err := fortuneSelectStmt.Query() - if err != nil { - return err - } - defer rows.Close() - - fortunes := make(Fortunes, 0) - for rows.Next() { // Fetch rows - f := new(Fortune) - if err := rows.Scan(&f.ID, &f.Message); err != nil { - return err - } - fortunes = append(fortunes, f) - } - fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."}) - sort.Sort(FortunesByMessage{fortunes}) - - return fortuneTmpl.Execute(c.Response, fortunes) -} - -func updateHandler(c *clevergo.Context) error { - n := getQueryCount(c.QueryParam("n")) - worlds := make([]World, n) - for i := 0; i < n; i++ { - // Fetch and modify - w := &worlds[i] - if err := fetchRandomWorld(&worlds[i]); err != nil { - return err - } - w.RandomNumber = uint16(randomWorldNum()) - - // Update - if _, err := worldUpdateStmt.Exec(w.RandomNumber, w.ID); err != nil { - return err - } - } - - return c.JSON(http.StatusOK, worlds) -} - -func plaintextHandler(c *clevergo.Context) error { - return c.String(http.StatusOK, helloWorld) -} - -type Message struct { - Message string `json:"message"` -} - -func jsonHandler(c *clevergo.Context) error { - return c.JSON(http.StatusOK, Message{"Hello, World!"}) -} From f977e34c3578bef1489b6ec90b69a813ef41d667 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 7 Apr 2025 19:15:14 +0200 Subject: [PATCH 1352/1766] [go/aah] Remove aah (#9775) Aah hasn't seen an update in 5 years: https://github.com/go-aah/aah It seems to be no longer active: https://github.com/go-aah/aah/issues/277 --- frameworks/Go/aah/README.md | 26 --- frameworks/Go/aah/aah-mysql.dockerfile | 22 -- frameworks/Go/aah/aah-postgresql.dockerfile | 22 -- frameworks/Go/aah/aah.dockerfile | 22 -- frameworks/Go/aah/benchmark_config.json | 73 ------- frameworks/Go/aah/config.toml | 47 ----- frameworks/Go/aah/src/benchmark/aah.project | 43 ---- .../aah/src/benchmark/app/controllers/app.go | 122 ------------ .../Go/aah/src/benchmark/app/db/mysql.go | 63 ------ .../Go/aah/src/benchmark/app/db/postgresql.go | 66 ------ frameworks/Go/aah/src/benchmark/app/init.go | 28 --- .../Go/aah/src/benchmark/app/models/models.go | 188 ------------------ .../Go/aah/src/benchmark/config/aah.conf | 50 ----- .../src/benchmark/config/env/bm-default.conf | 12 -- .../src/benchmark/config/env/bm-mysql.conf | 21 -- .../benchmark/config/env/bm-postgresql.conf | 24 --- .../Go/aah/src/benchmark/config/routes.conf | 76 ------- .../Go/aah/src/benchmark/config/security.conf | 12 -- frameworks/Go/aah/src/benchmark/go.mod | 33 --- frameworks/Go/aah/src/benchmark/go.sum | 66 ------ .../src/benchmark/views/layouts/master.html | 7 - .../benchmark/views/pages/app/fortunes.html | 10 - 22 files changed, 1033 deletions(-) delete mode 100644 frameworks/Go/aah/README.md delete mode 100644 frameworks/Go/aah/aah-mysql.dockerfile delete mode 100644 frameworks/Go/aah/aah-postgresql.dockerfile delete mode 100644 frameworks/Go/aah/aah.dockerfile delete mode 100644 frameworks/Go/aah/benchmark_config.json delete mode 100644 frameworks/Go/aah/config.toml delete mode 100644 frameworks/Go/aah/src/benchmark/aah.project delete mode 100644 frameworks/Go/aah/src/benchmark/app/controllers/app.go delete mode 100644 frameworks/Go/aah/src/benchmark/app/db/mysql.go delete mode 100644 frameworks/Go/aah/src/benchmark/app/db/postgresql.go delete mode 100644 frameworks/Go/aah/src/benchmark/app/init.go delete mode 100644 frameworks/Go/aah/src/benchmark/app/models/models.go delete mode 100644 frameworks/Go/aah/src/benchmark/config/aah.conf delete mode 100644 frameworks/Go/aah/src/benchmark/config/env/bm-default.conf delete mode 100644 frameworks/Go/aah/src/benchmark/config/env/bm-mysql.conf delete mode 100644 frameworks/Go/aah/src/benchmark/config/env/bm-postgresql.conf delete mode 100644 frameworks/Go/aah/src/benchmark/config/routes.conf delete mode 100644 frameworks/Go/aah/src/benchmark/config/security.conf delete mode 100644 frameworks/Go/aah/src/benchmark/go.mod delete mode 100644 frameworks/Go/aah/src/benchmark/go.sum delete mode 100644 frameworks/Go/aah/src/benchmark/views/layouts/master.html delete mode 100644 frameworks/Go/aah/src/benchmark/views/pages/app/fortunes.html diff --git a/frameworks/Go/aah/README.md b/frameworks/Go/aah/README.md deleted file mode 100644 index d154da40489..00000000000 --- a/frameworks/Go/aah/README.md +++ /dev/null @@ -1,26 +0,0 @@ -

      - -

      Benchmark Application

      -

      aah - A secure, flexible, rapid Go web framework

      -

      - -Visit official website https://aahframework.org to learn more about `aah` framework. - -### Test URLs - - * http://localhost:8080/json - * http://localhost:8080/plaintext - -### Test URLs - w/ MySQL Datasource - - * http://localhost:8080/db - * http://localhost:8080/db/queries?count=[1-500] - * http://localhost:8080/db/fortunes - * http://localhost:8080/db/updates?count=[1-500] - -### Test URLs - w/ PostgreSQL Datasource - - * http://localhost:8080/pg-db - * http://localhost:8080/pg-db/queries?count=[1-500] - * http://localhost:8080/pg-db/fortunes - * http://localhost:8080/pg-db/updates?count=[1-500] diff --git a/frameworks/Go/aah/aah-mysql.dockerfile b/frameworks/Go/aah/aah-mysql.dockerfile deleted file mode 100644 index 626642cecd8..00000000000 --- a/frameworks/Go/aah/aah-mysql.dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM golang:1.14 - -RUN apt-get update -yqq - -ADD ./ /aah -WORKDIR /aah - -ENV GOPATH /aah -ENV PATH ${GOPATH}/bin:${PATH} -ENV GO111MODULE on - -RUN curl -sL https://aahframework.org/install-cli | bash -s v0.13.3 - -WORKDIR /aah/src/benchmark - -RUN aah --version -RUN mkdir -p views/common -RUN aah build --single - -EXPOSE 8080 - -CMD build/bin/benchmark run --envprofile bm_mysql diff --git a/frameworks/Go/aah/aah-postgresql.dockerfile b/frameworks/Go/aah/aah-postgresql.dockerfile deleted file mode 100644 index 37e3f352549..00000000000 --- a/frameworks/Go/aah/aah-postgresql.dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM golang:1.14 - -RUN apt-get update -yqq - -ADD ./ /aah -WORKDIR /aah - -ENV GOPATH /aah -ENV PATH ${GOPATH}/bin:${PATH} -ENV GO111MODULE on - -RUN curl -sL https://aahframework.org/install-cli | bash -s v0.13.3 - -WORKDIR /aah/src/benchmark - -RUN aah --version -RUN mkdir -p views/common -RUN aah build --single - -EXPOSE 8080 - -CMD build/bin/benchmark run --envprofile bm_postgresql diff --git a/frameworks/Go/aah/aah.dockerfile b/frameworks/Go/aah/aah.dockerfile deleted file mode 100644 index 7d813662574..00000000000 --- a/frameworks/Go/aah/aah.dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM golang:1.14 - -RUN apt-get update -yqq - -ADD ./ /aah -WORKDIR /aah - -ENV GOPATH /aah -ENV PATH ${GOPATH}/bin:${PATH} -ENV GO111MODULE on - -RUN curl -sL https://aahframework.org/install-cli | bash -s v0.13.3 - -WORKDIR /aah/src/benchmark - -RUN aah --version -RUN mkdir -p views/common -RUN aah build --single - -EXPOSE 8080 - -CMD build/bin/benchmark run --envprofile bm_default diff --git a/frameworks/Go/aah/benchmark_config.json b/frameworks/Go/aah/benchmark_config.json deleted file mode 100644 index 1f3fef2ed34..00000000000 --- a/frameworks/Go/aah/benchmark_config.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "framework": "aah", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "MySQL", - "framework": "aah", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "aah", - "notes": "", - "versus": "go", - "tags": ["broken"] - }, - "mysql": { - "dockerfile": "aah.dockerfile", - "docker_cmd": "build/bin/benchmark run --envprofile bm_mysql", - "db_url": "/db", - "query_url": "/db/queries?count=", - "fortune_url": "/db/fortunes", - "update_url": "/db/updates?count=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "MySQL", - "framework": "aah", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "aah-mysql", - "notes": "", - "versus": "go", - "tags": ["broken"] - }, - "postgresql": { - "dockerfile": "aah.dockerfile", - "docker_cmd": "build/bin/benchmark run --envprofile bm_postgresql", - "db_url": "/pg-db", - "query_url": "/pg-db/queries?count=", - "fortune_url": "/pg-db/fortunes", - "update_url": "/pg-db/updates?count=", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "Postgres", - "framework": "aah", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "aah-postgresql", - "notes": "", - "versus": "go", - "tags": ["broken"] - } - }] -} diff --git a/frameworks/Go/aah/config.toml b/frameworks/Go/aah/config.toml deleted file mode 100644 index 72075e170a8..00000000000 --- a/frameworks/Go/aah/config.toml +++ /dev/null @@ -1,47 +0,0 @@ -[framework] -name = "aah" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Fullstack" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" - -[postgresql] -urls.db = "/pg-db" -urls.query = "/pg-db/queries?count=" -urls.update = "/pg-db/updates?count=" -urls.fortune = "/pg-db/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" -dockerfile = "aah.dockerfile" - -[mysql] -urls.db = "/db" -urls.query = "/db/queries?count=" -urls.update = "/db/updates?count=" -urls.fortune = "/db/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" -dockerfile = "aah.dockerfile" diff --git a/frameworks/Go/aah/src/benchmark/aah.project b/frameworks/Go/aah/src/benchmark/aah.project deleted file mode 100644 index b204a8b7be2..00000000000 --- a/frameworks/Go/aah/src/benchmark/aah.project +++ /dev/null @@ -1,43 +0,0 @@ -######################################## -# benchmark - aah framework project -# -# Note: Add it to version control -######################################## - -# Build section is used during aah application compile and build command. -build { - # Application binary name - # Default value is `name` attribute value from `aah.conf` - #binary_name = "benchmark" - - # Used as fallback if - # - `git commit sha` or - # - `AAH_APP_VERSION` environment value is not available. - version = "0.0.1" - - # If application is missing any dependencies in `build import path` - # during a compile and build, aah CLI will try to get dependencies - # using 'go get '. - # Default value is `false`. - #dep_get = true - - # Log level is used for aah CLI tool logging. - # Default value is `info`. - #log_level = "info" - - flags = ["-i"] - - ldflags = "" - - tags = "" - - # AST excludes is used for `aah.Context` inspection and generating aah - # application main Go file. Valid exclude patterns - # refer: https://golang.org/pkg/path/filepath/#Match - ast_excludes = ["*_test.go", ".*", "*.bak", "*.tmp", "vendor"] - - # Packing excludes is used to exclude file/directory during aah application - # build archive. Valid exclude patterns - # refer: https://golang.org/pkg/path/filepath/#Match - excludes = ["*.go", "*_test.go", ".*", "*.bak", "*.tmp", "vendor", "app", "build", "tests", "logs"] -} diff --git a/frameworks/Go/aah/src/benchmark/app/controllers/app.go b/frameworks/Go/aah/src/benchmark/app/controllers/app.go deleted file mode 100644 index 307961eff1b..00000000000 --- a/frameworks/Go/aah/src/benchmark/app/controllers/app.go +++ /dev/null @@ -1,122 +0,0 @@ -package controllers - -import ( - "strconv" - - "benchmark/app/models" - - "aahframe.work" -) - -const helloWorldString = "Hello, World!" - -// AppController struct application controller -type AppController struct { - *aah.Context -} - -// Plaintext method is for `/plaintext` test. -func (c *AppController) Plaintext() { - c.Reply().Text(helloWorldString) -} - -// JSON method is for `/json` test. -func (c *AppController) JSON() { - c.Reply().JSON(models.Message{Message: helloWorldString}) -} - -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// MySQL DB based implementation -//___________________________________________________________________________ - -// World returns one world record randomly for `/db` test. -func (c *AppController) World() { - world := new(models.World) - if err := models.MySQLFetchRandomWorld(world); err != nil { - c.Reply().InternalServerError().Text(err.Error()) - return - } - c.Reply().JSON(world) -} - -// Worlds returns one world record randomly for `/db/queries` test. -func (c *AppController) Worlds() { - c.handleResult(models.MySQLRandomWorlds(c.getCount())) -} - -// UpdateWorlds updates record and returns those records for `/db/updates` test. -func (c *AppController) UpdateWorlds() { - c.handleResult(models.MySQLUpdateRandomWorlds(c.getCount())) -} - -// Fortunes method is for `/db/fortunes` test. -func (c *AppController) Fortunes() { - fortunes, err := models.MySQLFortunes() - if err != nil { - c.Reply().InternalServerError().Text(err.Error()) - return - } - - c.Reply().HTML(aah.Data{ - "Fortunes": fortunes, - }) -} - -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// PostgreSQL DB based implementation -//___________________________________________________________________________ - -// PGWorld returns one world record randomly for `/pg-db` test. -func (c *AppController) PGWorld() { - world := new(models.World) - if err := models.PGFetchRandomWorld(world); err != nil { - c.Reply().InternalServerError().Text(err.Error()) - return - } - c.Reply().JSON(world) -} - -// PGWorlds returns one world record randomly for `/pg-db/queries` test. -func (c *AppController) PGWorlds() { - c.handleResult(models.PGRandomWorlds(c.getCount())) -} - -// PGUpdateWorlds updates record and returns those records for `/pg-db/updates` test. -func (c *AppController) PGUpdateWorlds() { - c.handleResult(models.PGUpdateRandomWorlds(c.getCount())) -} - -// PGFortunes method is for `/pg-db/fortunes` test. -func (c *AppController) PGFortunes() { - fortunes, err := models.PGFortunes() - if err != nil { - c.Reply().InternalServerError().Text(err.Error()) - return - } - - c.Reply().HTMLf("fortunes.html", aah.Data{ - "Fortunes": fortunes, - }) -} - -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// Unexported methods -//___________________________________________________________________________ - -func (c *AppController) getCount() int { - cnt, err := strconv.Atoi(c.Req.QueryValue("count")) - if err != nil || cnt < 1 { - cnt = 1 - } else if cnt > 500 { - cnt = 500 - } - return cnt -} - -func (c *AppController) handleResult(worlds []models.World, err error) { - if err != nil { - c.Reply().InternalServerError().Text(err.Error()) - return - } - c.Reply().JSON(worlds) -} diff --git a/frameworks/Go/aah/src/benchmark/app/db/mysql.go b/frameworks/Go/aah/src/benchmark/app/db/mysql.go deleted file mode 100644 index 65c7aaf2501..00000000000 --- a/frameworks/Go/aah/src/benchmark/app/db/mysql.go +++ /dev/null @@ -1,63 +0,0 @@ -package db - -import ( - "database/sql" - "runtime" - - "aahframe.work" - - // mysql driver - _ "github.com/go-sql-driver/mysql" -) - -// MySQL database connection and prepared statements -var ( - MySQL *sql.DB - MSworldSelectStmt *sql.Stmt - MSworldUpdateStmt *sql.Stmt - MSfortuneSelectStmt *sql.Stmt - - mysqlMaxConnCount = runtime.NumCPU() * 2 -) - -// InitMySQLDatabase initializes the Database. -func InitMySQLDatabase(_ *aah.Event) { - app := aah.App() - if !app.IsEnvProfile("bm_mysql") { - return - } - - cfg := app.Config() - var err error - MySQL, err = sql.Open( - cfg.StringDefault("datasource.benchmark.mysql.driver", "mysql"), - cfg.StringDefault("datasource.benchmark.mysql.url", ""), - ) - if err != nil { - app.Log().Fatal(err) - } - - if err = MySQL.Ping(); err != nil { - app.Log().Fatal(err) - } - - MySQL.SetMaxIdleConns(mysqlMaxConnCount) - MySQL.SetMaxOpenConns(mysqlMaxConnCount) - - if MSworldSelectStmt, err = MySQL.Prepare("SELECT id, randomNumber FROM World WHERE id = ?"); err != nil { - app.Log().Fatal(err) - } - if MSworldUpdateStmt, err = MySQL.Prepare("UPDATE World SET randomNumber = ? WHERE id = ?"); err != nil { - app.Log().Fatal(err) - } - if MSfortuneSelectStmt, err = MySQL.Prepare("SELECT id, message FROM Fortune"); err != nil { - app.Log().Fatal(err) - } -} - -// CloseMySQLDatabase initializes the Database. -func CloseMySQLDatabase(_ *aah.Event) { - if MySQL != nil { - _ = MySQL.Close() - } -} diff --git a/frameworks/Go/aah/src/benchmark/app/db/postgresql.go b/frameworks/Go/aah/src/benchmark/app/db/postgresql.go deleted file mode 100644 index b05561c97c9..00000000000 --- a/frameworks/Go/aah/src/benchmark/app/db/postgresql.go +++ /dev/null @@ -1,66 +0,0 @@ -package db - -import ( - "runtime" - - "aahframe.work" - - "github.com/jackc/pgx" -) - -// PostgreSQL database connection and statements -var ( - PostgreSQL *pgx.ConnPool - PGWorldSelectStmt *pgx.PreparedStatement - PGWorldUpdateStmt *pgx.PreparedStatement - PGFortuneSelectStmt *pgx.PreparedStatement - - postgresqlMaxConnCount = runtime.NumCPU() * 4 -) - -// InitPostgreSQLDatabase initializes the Database. -func InitPostgreSQLDatabase(_ *aah.Event) { - app := aah.App() - if !app.IsEnvProfile("bm_postgresql") { - return - } - - cfg := app.Config() - config := pgx.ConnPoolConfig{ - ConnConfig: pgx.ConnConfig{ - Host: cfg.StringDefault("datasource.benchmark.postgresql.host", ""), - Port: uint16(cfg.IntDefault("datasource.benchmark.postgresql.port", 5432)), - User: cfg.StringDefault("datasource.benchmark.postgresql.user", ""), - Password: cfg.StringDefault("datasource.benchmark.postgresql.password", ""), - Database: cfg.StringDefault("datasource.benchmark.postgresql.dbname", ""), - }, - MaxConnections: postgresqlMaxConnCount, - } - - config.AfterConnect = func(conn *pgx.Conn) error { - var err error - if PGWorldSelectStmt, err = conn.Prepare("worldSelectStmt", "SELECT id, randomNumber FROM World WHERE id = $1"); err != nil { - app.Log().Fatal(err) - } - if PGWorldUpdateStmt, err = conn.Prepare("worldUpdateStmt", "UPDATE World SET randomNumber = $1 WHERE id = $2"); err != nil { - app.Log().Fatal(err) - } - if PGFortuneSelectStmt, err = conn.Prepare("fortuneSelectStmt", "SELECT id, message FROM Fortune"); err != nil { - app.Log().Fatal(err) - } - return nil - } - - var err error - PostgreSQL, err = pgx.NewConnPool(config) - if err != nil { - app.Log().Fatal(err) - } -} - -// ClosePostgreSQLDatabase initializes the Database. -func ClosePostgreSQLDatabase(_ *aah.Event) { - if PostgreSQL != nil { - PostgreSQL.Close() - } -} diff --git a/frameworks/Go/aah/src/benchmark/app/init.go b/frameworks/Go/aah/src/benchmark/app/init.go deleted file mode 100644 index a4e59ed3ac7..00000000000 --- a/frameworks/Go/aah/src/benchmark/app/init.go +++ /dev/null @@ -1,28 +0,0 @@ -// aah application initialization - configuration, server extensions, middleware's, etc. -// Customize it per application use case. - -package main - -import ( - "benchmark/app/db" - - "aahframe.work" -) - -func init() { - app := aah.App() - - app.OnStart(db.InitMySQLDatabase) - app.OnStart(db.InitPostgreSQLDatabase) - app.OnStart(func(_ *aah.Event) { - app.SecurityManager().AntiCSRF.Enabled = false - }) - - app.OnPostShutdown(db.CloseMySQLDatabase) - app.OnPostShutdown(db.ClosePostgreSQLDatabase) - - app.HTTPEngine().Middlewares( - aah.RouteMiddleware, - aah.ActionMiddleware, - ) -} diff --git a/frameworks/Go/aah/src/benchmark/app/models/models.go b/frameworks/Go/aah/src/benchmark/app/models/models.go deleted file mode 100644 index 1c79d855228..00000000000 --- a/frameworks/Go/aah/src/benchmark/app/models/models.go +++ /dev/null @@ -1,188 +0,0 @@ -package models - -import ( - "fmt" - "math/rand" - "sort" - - "benchmark/app/db" -) - -var worldRowCount = 10000 - -type ( - // Message is used for JSON reply. - Message struct { - Message string `json:"message"` - } - - // World is used for database operation. - World struct { - ID uint16 `json:"id"` - RandomNumber uint16 `json:"randomNumber"` - } - - // Fortune is used for database and reply. - Fortune struct { - ID uint16 `json:"id"` - Message string `json:"message"` - } - - // Fortunes slice - Fortunes []*Fortune -) - -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// MySQL DB based implementation -//___________________________________________________________________________ - -// MySQLFetchRandomWorld method returns one world record info. -func MySQLFetchRandomWorld(w *World) error { - err := db.MSworldSelectStmt.QueryRow(randomWorldNum()).Scan(&w.ID, &w.RandomNumber) - return err -} - -// MySQLRandomWorlds method returns world record from db randomly. -func MySQLRandomWorlds(count int) ([]World, error) { - worlds := make([]World, count) - var err error - for i := 0; i < count; i++ { - w := &worlds[i] - if err = MySQLFetchRandomWorld(w); err != nil { - return nil, err - } - } - return worlds, nil -} - -// MySQLUpdateRandomWorlds method updates random world records. -func MySQLUpdateRandomWorlds(count int) ([]World, error) { - worlds := make([]World, count) - var err error - for i := 0; i < count; i++ { - w := &worlds[i] - if err = MySQLFetchRandomWorld(w); err != nil { - return nil, err - } - - w.RandomNumber = uint16(randomWorldNum()) - if _, err = db.MSworldUpdateStmt.Exec(w.RandomNumber, w.ID); err != nil { - return nil, err - } - } - return worlds, nil -} - -// MySQLFortunes method returns fortunes records -func MySQLFortunes() (Fortunes, error) { - rows, err := db.MSfortuneSelectStmt.Query() - if err != nil { - return nil, err - } - - fortunes := make(Fortunes, 0) - for rows.Next() { - var fortune Fortune - if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil { - return nil, err - } - fortunes = append(fortunes, &fortune) - } - _ = rows.Close() - - fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."}) - sortFortunesByMessage(fortunes) - return fortunes, nil -} - -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// PostgreSQL DB based implementation -//___________________________________________________________________________ - -// PGFetchRandomWorld method returns one world record info. -func PGFetchRandomWorld(w *World) error { - return db.PostgreSQL.QueryRow("worldSelectStmt", randomWorldNum()).Scan(&w.ID, &w.RandomNumber) -} - -// PGRandomWorlds method returns world record from db randomly. -func PGRandomWorlds(count int) ([]World, error) { - worlds := make([]World, count) - var err error - for i := 0; i < count; i++ { - w := &worlds[i] - if err = PGFetchRandomWorld(w); err != nil { - return nil, err - } - } - return worlds, nil -} - -// PGUpdateRandomWorlds method updates random world records. -func PGUpdateRandomWorlds(count int) ([]World, error) { - worlds := make([]World, count) - var err error - for i := 0; i < count; i++ { - w := &worlds[i] - if err = PGFetchRandomWorld(w); err != nil { - return nil, err - } - w.RandomNumber = uint16(randomWorldNum()) - } - - // sorting is required for insert deadlock prevention. - sortWorldsByID(worlds) - - txn, err := db.PostgreSQL.Begin() - if err != nil { - return nil, fmt.Errorf("Error starting transaction: %s", err) - } - for i := 0; i < count; i++ { - w := &worlds[i] - if _, err = txn.Exec("worldUpdateStmt", w.RandomNumber, w.ID); err != nil { - return nil, fmt.Errorf("Error updating world row %d: %s", i, err) - } - } - if err = txn.Commit(); err != nil { - return nil, fmt.Errorf("Error when commiting world rows: %s", err) - } - - return worlds, nil -} - -// PGFortunes method returns fortunes records -func PGFortunes() (Fortunes, error) { - rows, err := db.PostgreSQL.Query("fortuneSelectStmt") - if err != nil { - return nil, err - } - - fortunes := make(Fortunes, 0) - for rows.Next() { - var fortune Fortune - if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil { - return nil, err - } - fortunes = append(fortunes, &fortune) - } - rows.Close() - - fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."}) - sortFortunesByMessage(fortunes) - return fortunes, nil -} - -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// Unexported methods -//___________________________________________________________________________ - -func randomWorldNum() int { - return rand.Intn(worldRowCount) + 1 -} - -func sortFortunesByMessage(fortunes Fortunes) { - sort.Slice(fortunes, func(i, j int) bool { return fortunes[i].Message < fortunes[j].Message }) -} - -func sortWorldsByID(worlds []World) { - sort.Slice(worlds, func(i, j int) bool { return worlds[i].ID < worlds[j].ID }) -} diff --git a/frameworks/Go/aah/src/benchmark/config/aah.conf b/frameworks/Go/aah/src/benchmark/config/aah.conf deleted file mode 100644 index df619ec86da..00000000000 --- a/frameworks/Go/aah/src/benchmark/config/aah.conf +++ /dev/null @@ -1,50 +0,0 @@ -# ----------------------------------------------------------------------------- -# benchmark - aah Application Configuration -# -# Refer documentation to explore and customize the configurations. -# Doc: https://docs.aahframework.org/app-config.html -# ----------------------------------------------------------------------------- - -name = "benchmark" -desc = "aah framework web application" -type = "web" - -server { - header = "aah" -} - -request { - id { - enable = false - } -} - -render { - default = "html" - gzip { - enable = false - } -} - -cache { - static { - default_cache_control = "public, max-age=31536000" - } -} - -view { - engine = "go" - ext = ".html" - delimiters = "{{.}}" -} - -include "./security.conf" - -env { - active = "bm_default" - - # ------------------------------------------------- - # Including Environment profile configurations - # ------------------------------------------------- - include "./env/*.conf" -} diff --git a/frameworks/Go/aah/src/benchmark/config/env/bm-default.conf b/frameworks/Go/aah/src/benchmark/config/env/bm-default.conf deleted file mode 100644 index 3ba63c7af53..00000000000 --- a/frameworks/Go/aah/src/benchmark/config/env/bm-default.conf +++ /dev/null @@ -1,12 +0,0 @@ -# --------------------------------- -# Default Benchmark profile -# --------------------------------- - -bm_default { - - log { - receiver = "console" - level = "error" - } - -} \ No newline at end of file diff --git a/frameworks/Go/aah/src/benchmark/config/env/bm-mysql.conf b/frameworks/Go/aah/src/benchmark/config/env/bm-mysql.conf deleted file mode 100644 index e76817b6487..00000000000 --- a/frameworks/Go/aah/src/benchmark/config/env/bm-mysql.conf +++ /dev/null @@ -1,21 +0,0 @@ -# --------------------------------- -# MySQL Benchmark profile -# --------------------------------- - -bm_mysql { - - log { - receiver = "console" - level = "error" - } - - datasource { - benchmark { - mysql { - driver = "mysql" - url = "benchmarkdbuser:benchmarkdbpass@tcp(tfb-database:3306)/hello_world" - } - } - } - -} \ No newline at end of file diff --git a/frameworks/Go/aah/src/benchmark/config/env/bm-postgresql.conf b/frameworks/Go/aah/src/benchmark/config/env/bm-postgresql.conf deleted file mode 100644 index d5706d3d181..00000000000 --- a/frameworks/Go/aah/src/benchmark/config/env/bm-postgresql.conf +++ /dev/null @@ -1,24 +0,0 @@ -# --------------------------------- -# PostgreSQL Benchmark profile -# --------------------------------- - -bm_postgresql { - - log { - receiver = "console" - level = "error" - } - - datasource { - benchmark { - postgresql { - host = "tfb-database" - port = 5432 - dbname = "hello_world" - user = "benchmarkdbuser" - password = "benchmarkdbpass" - } - } - } - -} \ No newline at end of file diff --git a/frameworks/Go/aah/src/benchmark/config/routes.conf b/frameworks/Go/aah/src/benchmark/config/routes.conf deleted file mode 100644 index e4624897820..00000000000 --- a/frameworks/Go/aah/src/benchmark/config/routes.conf +++ /dev/null @@ -1,76 +0,0 @@ -# ----------------------------------------------------------------------------- -# benchmark - Application Routes Configuration -# -# Refer documentation to explore and configure routes. -# Doc: https://docs.aahframework.org/routing.html -# ----------------------------------------------------------------------------- - -domains { - - localhost { - name = "benchmark routes" - host = "localhost" - - routes { - - json { - path = "/json" - controller = "AppController" - action = "JSON" - } - - plaintext { - path = "/plaintext" - controller = "AppController" - action = "Plaintext" - } - - # For MySQL datasource - db { - path = "/db" - controller = "AppController" - action = "World" - - routes { - dbs { - path = "/queries" - action = "Worlds" - } - fortunes { - path = "/fortunes" - action = "Fortunes" - } - updates { - path = "/updates" - action = "UpdateWorlds" - } - } - } - - # For PostgreSQL datasource - pg_db { - path = "/pg-db" - controller = "AppController" - action = "PGWorld" - - routes { - pg_dbs { - path = "/queries" - action = "PGWorlds" - } - pg_fortunes { - path = "/fortunes" - action = "PGFortunes" - } - pg_updates { - path = "/updates" - action = "PGUpdateWorlds" - } - } - } - - } # end - routes - - } # end - localhost - -} # end - domains diff --git a/frameworks/Go/aah/src/benchmark/config/security.conf b/frameworks/Go/aah/src/benchmark/config/security.conf deleted file mode 100644 index c81a5160d35..00000000000 --- a/frameworks/Go/aah/src/benchmark/config/security.conf +++ /dev/null @@ -1,12 +0,0 @@ -# ----------------------------------------------------------------------------- -# benchmark - Application Security Configuration -# -# Refer documentation to explore and customize the configurations. -# Doc: https://docs.aahframework.org/security-config.html -# ----------------------------------------------------------------------------- - -security { - http_header { - enable = false - } -} diff --git a/frameworks/Go/aah/src/benchmark/go.mod b/frameworks/Go/aah/src/benchmark/go.mod deleted file mode 100644 index 09e57fa883b..00000000000 --- a/frameworks/Go/aah/src/benchmark/go.mod +++ /dev/null @@ -1,33 +0,0 @@ -module benchmark - -require ( - aahframe.work v0.12.4 - github.com/go-sql-driver/mysql v1.4.1 - github.com/jackc/pgx v3.3.0+incompatible -) - -require ( - cloud.google.com/go v0.30.0 // indirect - github.com/cockroachdb/apd v1.1.0 // indirect - github.com/go-aah/forge v0.8.0 // indirect - github.com/go-playground/locales v0.12.1 // indirect - github.com/go-playground/universal-translator v0.16.0 // indirect - github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee // indirect - github.com/gobwas/pool v0.2.0 // indirect - github.com/gobwas/ws v1.0.0 // indirect - github.com/golang/protobuf v1.3.1 // indirect - github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect - github.com/lib/pq v1.10.7 // indirect - github.com/pkg/errors v0.8.1 // indirect - 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.21.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - gopkg.in/go-playground/assert.v1 v1.2.1 // indirect - 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 deleted file mode 100644 index b946b8eccff..00000000000 --- a/frameworks/Go/aah/src/benchmark/go.sum +++ /dev/null @@ -1,66 +0,0 @@ -aahframe.work v0.12.4 h1:Hcp1EP7T8Y+qh1ukFjTqXjImqKxyk03nuvACm81OTfU= -aahframe.work v0.12.4/go.mod h1:Ogn3OQKcq9W59XSAZzPqk4g2PpFH9h2Px1PFPnoGmvs= -cloud.google.com/go v0.30.0 h1:xKvyLgk56d0nksWq49J0UyGEeUIicTl4+UBiX1NPX9g= -cloud.google.com/go v0.30.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -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/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/go-aah/forge v0.8.0 h1:sk4Z523B9ay3JQF4At97U7kecB5yTIm0J2UM/qRVXbQ= -github.com/go-aah/forge v0.8.0/go.mod h1:+pz2ywtYKCMzKtHa2kyKIOBw2XhQpj+dgch/vMGWyqo= -github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.0 h1:1WdyfgUcImUfVBvYbsW2krIsnko+1QU2t45soaF8v1M= -github.com/gobwas/ws v1.0.0/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90= -github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -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/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced h1:4oqSq7eft7MdPKBGQK11X9WYUxmj6ZLgGTqYIbY1kyw= -golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -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= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v9 v9.21.0 h1:wSDJGBpQBYC1wLpVnGHLmshm2JicoSNdrb38Zj+8yHI= -gopkg.in/go-playground/validator.v9 v9.21.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= diff --git a/frameworks/Go/aah/src/benchmark/views/layouts/master.html b/frameworks/Go/aah/src/benchmark/views/layouts/master.html deleted file mode 100644 index f06a329b50e..00000000000 --- a/frameworks/Go/aah/src/benchmark/views/layouts/master.html +++ /dev/null @@ -1,7 +0,0 @@ - - -{{ template "title" . }} - -{{ template "body" . }} - - diff --git a/frameworks/Go/aah/src/benchmark/views/pages/app/fortunes.html b/frameworks/Go/aah/src/benchmark/views/pages/app/fortunes.html deleted file mode 100644 index afe58dcc0af..00000000000 --- a/frameworks/Go/aah/src/benchmark/views/pages/app/fortunes.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ define "title" -}}Fortunes{{- end }} - -{{ define "body" -}} - - -{{- range .Fortunes }} - -{{- end }} -
      idmessage
      {{ .ID }}{{ .Message }}
      -{{- end }} From 4c41eed17553519d26f2be589889f7f4ee8712cf Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 7 Apr 2025 19:15:40 +0200 Subject: [PATCH 1353/1766] [go/martini] Remove Martini (#9774) Martini hasn't seen an update in 9 years: https://github.com/go-martini/martini --- frameworks/Go/martini/README.md | 0 frameworks/Go/martini/benchmark_config.json | 29 ---- frameworks/Go/martini/config.toml | 18 --- frameworks/Go/martini/go.mod | 10 -- frameworks/Go/martini/go.sum | 6 - frameworks/Go/martini/main.go | 148 -------------------- frameworks/Go/martini/martini.dockerfile | 10 -- frameworks/Go/martini/randomNumber.go | 9 -- frameworks/Go/martini/sanitizeQueries.go | 25 ---- 9 files changed, 255 deletions(-) delete mode 100644 frameworks/Go/martini/README.md delete mode 100644 frameworks/Go/martini/benchmark_config.json delete mode 100644 frameworks/Go/martini/config.toml delete mode 100644 frameworks/Go/martini/go.mod delete mode 100644 frameworks/Go/martini/go.sum delete mode 100644 frameworks/Go/martini/main.go delete mode 100644 frameworks/Go/martini/martini.dockerfile delete mode 100644 frameworks/Go/martini/randomNumber.go delete mode 100644 frameworks/Go/martini/sanitizeQueries.go diff --git a/frameworks/Go/martini/README.md b/frameworks/Go/martini/README.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/Go/martini/benchmark_config.json b/frameworks/Go/martini/benchmark_config.json deleted file mode 100644 index fbf0a94cfb8..00000000000 --- a/frameworks/Go/martini/benchmark_config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "framework": "martini", - "tests": [ - { - "default": { - "json_url": "/bench/json", - "db_url": "/bench/single", - "query_url": "/bench/multiple?queries=", - "update_url": "/bench/update?queries=", - "plaintext_url": "/bench/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "martini", - "language": "Go", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "martini", - "notes": "", - "versus": "go" - } - } - ] -} diff --git a/frameworks/Go/martini/config.toml b/frameworks/Go/martini/config.toml deleted file mode 100644 index 58b7fec1bc9..00000000000 --- a/frameworks/Go/martini/config.toml +++ /dev/null @@ -1,18 +0,0 @@ -[framework] -name = "martini" - -[main] -urls.plaintext = "/bench/plaintext" -urls.json = "/bench/json" -urls.db = "/bench/single" -urls.query = "/bench/multiple?queries=" -urls.update = "/bench/update?queries=" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "go" diff --git a/frameworks/Go/martini/go.mod b/frameworks/Go/martini/go.mod deleted file mode 100644 index f5af950e26b..00000000000 --- a/frameworks/Go/martini/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module martini - -go 1.19 - -require ( - github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab - github.com/lib/pq v1.10.7 -) - -require github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 // indirect diff --git a/frameworks/Go/martini/go.sum b/frameworks/Go/martini/go.sum deleted file mode 100644 index 7f8410d7c13..00000000000 --- a/frameworks/Go/martini/go.sum +++ /dev/null @@ -1,6 +0,0 @@ -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/frameworks/Go/martini/main.go b/frameworks/Go/martini/main.go deleted file mode 100644 index 09e1a392f9e..00000000000 --- a/frameworks/Go/martini/main.go +++ /dev/null @@ -1,148 +0,0 @@ -package main - -import ( - "database/sql" - "encoding/json" - "log" - "net/http" - "time" - - "github.com/go-martini/martini" - _ "github.com/lib/pq" -) - -var ( - db *sql.DB - worldSelectPrepared *sql.Stmt - worldUpdatePrepared *sql.Stmt - fortuneSelectPrepared *sql.Stmt -) - -type World struct { - Id uint16 `json:"id"` - RandomNumber uint16 `json:"randomNumber"` -} - - -func main() { - initDB() - - m := martini.Classic() - - m.Use(setRequiredHeaders) - - m.Group("/bench", func (r martini.Router) { - r.Get("/plaintext", plaintextHandler) - r.Get("/json" , jsonHandler) - r.Get("/single" , singleQueryHandler) - r.Get("/multiple" , multipleQueriesHandler) - r.Get("/update" , updatesHandler) - }) - - m.RunOnAddr(":8080") -} - -// Initialize the connection to the database -func initDB() { - driverName := "postgres" - connectionString := "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world?sslmode=disable" - worldSelect := "SELECT id, randomNumber FROM World WHERE id = $1" - worldUpdate := "UPDATE World SET randomNumber = $1 WHERE id = $2" - fortuneSelect := "SELECT id, message FROM Fortune" - // worldRowCount := 10000 - maxConnections := 256 - - db, err := sql.Open(driverName, connectionString) - - if err != nil { - log.Fatalf("Error opening database: %v", err) - } - - db.SetMaxIdleConns(maxConnections) - db.SetMaxOpenConns(maxConnections) - - worldSelectPrepared, err = db.Prepare(worldSelect) - if err != nil { - log.Fatal(err) - } - worldUpdatePrepared, err = db.Prepare(worldUpdate) - if err != nil { - log.Fatal(err) - } - fortuneSelectPrepared, err = db.Prepare(fortuneSelect) - if err != nil { - log.Fatal(err) - } -} - -// Create middleware to add Server and Date headers to all -// routes. -func setRequiredHeaders(w http.ResponseWriter, r *http.Request) { - t := time.Now(); - - w.Header().Set("Server", "Martini") - w.Header().Set("Date", t.Format(time.RFC1123)) -} - -// Route handlers -func plaintextHandler() string { - return "Hello, World!" -} - -func jsonHandler(w http.ResponseWriter) []byte { - message := map[string]interface{}{"message": "Hello, World!"} - w.Header().Set("Content-Type", "application/json") - - res, _ := json.Marshal(message); - return res -} - -func singleQueryHandler(w http.ResponseWriter) { - var world World - - w.Header().Set("Content-Type", "application/json") - - err := worldSelectPrepared.QueryRow(RandomNumber()).Scan(&world.Id, &world.RandomNumber) - if err != nil { - log.Fatalf("Error scanning world row: %s", err.Error()) - } - - // No need to return anything as we are writing straight - // to the response itself - json.NewEncoder(w).Encode(&world) -} - -func multipleQueriesHandler(w http.ResponseWriter, r *http.Request) { - queries := SanitizeQueries(r) - worlds := make([]World, queries) - - w.Header().Set("Content-Type", "application/json") - - for i := 0; i < queries; i += 1 { - err := worldSelectPrepared.QueryRow(RandomNumber()).Scan(&worlds[i].Id, &worlds[i].RandomNumber) - - if err != nil { - log.Fatalf("Error scanning world row: %v", err) - } - } - - json.NewEncoder(w).Encode(worlds) -} - -func updatesHandler(w http.ResponseWriter, r *http.Request) { - queries := SanitizeQueries(r) - - worlds := make([]World, queries) - for i := 0; i < queries; i++ { - if err := worldSelectPrepared.QueryRow(RandomNumber()).Scan(&worlds[i].Id, &worlds[i].RandomNumber); err != nil { - log.Fatalf("Error scanning world row: %v", err) - } - worlds[i].RandomNumber = uint16(RandomNumber()) - if _, err := worldUpdatePrepared.Exec(worlds[i].RandomNumber, worlds[i].Id); err != nil { - log.Fatalf("Error updating world row: %v", err) - } - } - - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(worlds) -} diff --git a/frameworks/Go/martini/martini.dockerfile b/frameworks/Go/martini/martini.dockerfile deleted file mode 100644 index e538810471f..00000000000 --- a/frameworks/Go/martini/martini.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM docker.io/golang:1.19 - -WORKDIR /home -COPY . . - -RUN go mod download - -EXPOSE 8080 - -CMD GOAMD64=v3 go run . diff --git a/frameworks/Go/martini/randomNumber.go b/frameworks/Go/martini/randomNumber.go deleted file mode 100644 index 8231cc48859..00000000000 --- a/frameworks/Go/martini/randomNumber.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -import "math/rand" - -func RandomNumber() uint16 { - max := 10000 - - return uint16(rand.Intn(max) + 1) -} diff --git a/frameworks/Go/martini/sanitizeQueries.go b/frameworks/Go/martini/sanitizeQueries.go deleted file mode 100644 index cc51bc5a1e8..00000000000 --- a/frameworks/Go/martini/sanitizeQueries.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "net/http" - "strconv" -) - -func SanitizeQueries(r *http.Request) int { - n := 1 - max := 500 - min := 1 - - if nStr := r.URL.Query().Get("queries"); len(nStr) > 0 { - n, _ = strconv.Atoi(nStr) - } - - - if n < min { - return min - } else if n > max { - return max - } - - return n -} From f479884794b488149e84f13d063a6a179a982fe8 Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Mon, 7 Apr 2025 18:17:41 +0100 Subject: [PATCH 1354/1766] [rust/axum] dependencies and performance (#9785) * feat: upgraded deps, rust version and edition * feat: avoid creating SmallRng when only one number is required * feat: update rust version --- frameworks/Rust/axum/Cargo.lock | 523 ++++++++++++------ frameworks/Rust/axum/Cargo.toml | 38 +- frameworks/Rust/axum/README.md | 3 +- frameworks/Rust/axum/axum.dockerfile | 2 +- frameworks/Rust/axum/src/common/mod.rs | 8 +- frameworks/Rust/axum/src/main_mongo.rs | 10 +- frameworks/Rust/axum/src/main_mongo_raw.rs | 10 +- frameworks/Rust/axum/src/main_pg.rs | 7 +- frameworks/Rust/axum/src/main_pg_pool.rs | 9 +- frameworks/Rust/axum/src/main_sqlx.rs | 11 +- frameworks/Rust/axum/src/mongo/database.rs | 3 +- .../Rust/axum/src/mongo_raw/database.rs | 3 +- frameworks/Rust/axum/src/pg/database.rs | 9 +- frameworks/Rust/axum/src/pg_pool/database.rs | 2 - frameworks/Rust/axum/src/server.rs | 2 +- 15 files changed, 396 insertions(+), 244 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index bdc3610a8a8..758f68a8f64 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -24,10 +24,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -104,13 +104,13 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.9" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" dependencies = [ - "async-trait", "axum-core", "bytes", + "form_urlencoded", "futures-util", "http", "http-body", @@ -137,13 +137,12 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.5" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" dependencies = [ - "async-trait", "bytes", - "futures-util", + "futures-core", "http", "http-body", "http-body-util", @@ -157,7 +156,7 @@ dependencies = [ [[package]] name = "axum-techempower" -version = "0.2.1" +version = "0.3.0" dependencies = [ "axum", "axum-core", @@ -174,7 +173,7 @@ dependencies = [ "mongodb", "num_cpus", "quick_cache", - "rand", + "rand 0.9.0", "serde", "serde_json", "serde_path_to_error", @@ -267,18 +266,20 @@ dependencies = [ [[package]] name = "bson" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068208f2b6fcfa27a7f1ee37488d2bb8ba2640f68f5475d08e1d9130696aba59" +checksum = "af8113ff51309e2779e8785a246c10fb783e8c2452f134d6257fd71cc03ccd6c" dependencies = [ "ahash", - "base64 0.13.1", + "base64 0.22.1", "bitvec", + "getrandom 0.2.15", + "getrandom 0.3.2", "hex", "indexmap 2.7.0", "js-sys", "once_cell", - "rand", + "rand 0.9.0", "serde", "serde_bytes", "serde_json", @@ -300,9 +301,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" @@ -349,6 +350,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "tiny-keccak", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -409,6 +430,12 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + [[package]] name = "crypto-common" version = "0.1.6" @@ -462,9 +489,9 @@ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "deadpool" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6541a3916932fe57768d4be0b1ffb5ec7cbf74ca8c903fdfd5c0fe8aa958f0ed" +checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f" dependencies = [ "deadpool-runtime", "num_cpus", @@ -480,7 +507,7 @@ checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" dependencies = [ "async-trait", "deadpool", - "getrandom", + "getrandom 0.2.15", "serde", "tokio", "tokio-postgres", @@ -517,6 +544,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "derive-where" version = "1.2.7" @@ -689,6 +727,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -823,7 +867,21 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", "wasm-bindgen", ] @@ -854,11 +912,11 @@ dependencies = [ [[package]] name = "halfbrown" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", "serde", ] @@ -870,27 +928,22 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" - [[package]] name = "hashlink" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -927,8 +980,8 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand", - "thiserror", + "rand 0.8.5", + "thiserror 1.0.69", "tinyvec", "tokio", "tracing", @@ -948,10 +1001,10 @@ dependencies = [ "lru-cache", "once_cell", "parking_lot", - "rand", + "rand 0.8.5", "resolv-conf", "smallvec", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -1042,9 +1095,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -1301,9 +1354,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1320,9 +1373,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libm" @@ -1332,9 +1385,9 @@ checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmimalloc-sys" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" +checksum = "6b20daca3a4ac14dbdc753c5e90fc7b490a48a9131daed3c9a9ced7b2defd37b" dependencies = [ "cc", "libc", @@ -1346,7 +1399,6 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ - "cc", "pkg-config", "vcpkg", ] @@ -1394,6 +1446,54 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "macro_magic" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "macro_magic_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" +dependencies = [ + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.91", +] + [[package]] name = "match_cfg" version = "0.1.0" @@ -1402,9 +1502,9 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "md-5" @@ -1424,9 +1524,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mimalloc" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633" +checksum = "03cb1f88093fe50061ca1195d336ffec131347c7b833db31f9ab62a2d1b7925f" dependencies = [ "libmimalloc-sys", ] @@ -1437,12 +1537,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.8.2" @@ -1459,15 +1553,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] name = "mongodb" -version = "3.1.1" +version = "3.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1f6edf7fe8828429647a2200f684681ca6d5a33b45edc3140c81390d852301" +checksum = "fdf4261933e5113914caec01c4bb16a7502bdaa9cf80fd87191765e7d9ff16b2" dependencies = [ "async-trait", "base64 0.13.1", @@ -1485,12 +1579,13 @@ dependencies = [ "hickory-proto", "hickory-resolver", "hmac", + "macro_magic", "md-5", "mongodb-internal-macros", "once_cell", "pbkdf2", "percent-encoding", - "rand", + "rand 0.8.5", "rustc_version_runtime", "rustls 0.21.12", "rustls-pemfile 1.0.4", @@ -1504,7 +1599,7 @@ dependencies = [ "stringprep", "strsim", "take_mut", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-rustls", "tokio-util", @@ -1516,25 +1611,16 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.1.1" +version = "3.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b07bfd601af78e39384707a8e80041946c98260e3e0190e294ee7435823e6bf" +checksum = "619176c99deef0d50be51ce3193e9efd6a56ab0f4e6a38d5fd614880d148c7ae" dependencies = [ + "macro_magic", "proc-macro2", "quote", "syn 2.0.91", ] -[[package]] -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" @@ -1547,7 +1633,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -1642,12 +1728,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pbkdf2" version = "0.11.0" @@ -1731,9 +1811,9 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "postgres-protocol" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" dependencies = [ "base64 0.22.1", "byteorder", @@ -1742,16 +1822,16 @@ dependencies = [ "hmac", "md-5", "memchr", - "rand", + "rand 0.9.0", "sha2", "stringprep", ] [[package]] name = "postgres-types" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ "bytes", "fallible-iterator", @@ -1770,7 +1850,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -1800,13 +1880,13 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick_cache" -version = "0.6.9" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d7c94f8935a9df96bb6380e8592c70edf497a643f94bd23b2f76b399385dbf4" +checksum = "8f8ed0655cbaf18a26966142ad23b95d8ab47221c50c4f73a1db7d0d2d6e3da8" dependencies = [ "ahash", "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.2", "parking_lot", ] @@ -1819,6 +1899,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -1832,8 +1918,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.24", ] [[package]] @@ -1843,7 +1940,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1852,7 +1959,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", ] [[package]] @@ -1931,7 +2047,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -1951,7 +2067,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "signature", "spki", "subtle", @@ -2103,9 +2219,9 @@ checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -2121,9 +2237,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -2132,9 +2248,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "indexmap 2.7.0", "itoa", @@ -2145,9 +2261,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ "itoa", "serde", @@ -2250,16 +2366,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] name = "simd-json" -version = "0.14.3" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" +checksum = "10b5602e4f1f7d358956f94cac1eff59220f34cf9e26d49f5fde5acef851cbed" dependencies = [ - "getrandom", + "getrandom 0.3.2", "halfbrown", "ref-cast", "serde", @@ -2306,9 +2422,9 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2333,21 +2449,11 @@ dependencies = [ "der", ] -[[package]] -name = "sqlformat" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" -dependencies = [ - "nom", - "unicode_categories", -] - [[package]] name = "sqlx" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2358,30 +2464,25 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" dependencies = [ - "atoi", - "byteorder", "bytes", "crc", "crossbeam-queue", "either", "event-listener", - "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.14.5", + "hashbrown 0.15.2", "hashlink", - "hex", "indexmap 2.7.0", "log", "memchr", "once_cell", - "paste", "percent-encoding", "rustls 0.23.20", "rustls-pemfile 2.2.0", @@ -2389,8 +2490,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "sqlformat", - "thiserror", + "thiserror 2.0.12", "tokio", "tokio-stream", "tracing", @@ -2400,9 +2500,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" dependencies = [ "proc-macro2", "quote", @@ -2413,9 +2513,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" dependencies = [ "dotenvy", "either", @@ -2439,9 +2539,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" +checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" dependencies = [ "atoi", "base64 0.22.1", @@ -2466,7 +2566,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand", + "rand 0.8.5", "rsa", "serde", "sha1", @@ -2474,16 +2574,16 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.12", "tracing", "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64 0.22.1", @@ -2494,7 +2594,6 @@ dependencies = [ "etcetera", "futures-channel", "futures-core", - "futures-io", "futures-util", "hex", "hkdf", @@ -2505,23 +2604,23 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand", + "rand 0.8.5", "serde", "serde_json", "sha2", "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.12", "tracing", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" dependencies = [ "atoi", "flume", @@ -2639,7 +2738,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -2653,6 +2761,17 @@ dependencies = [ "syn 2.0.91", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "time" version = "0.3.37" @@ -2684,6 +2803,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinystr" version = "0.7.6" @@ -2711,9 +2839,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", @@ -2729,9 +2857,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -2760,9 +2888,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" dependencies = [ "async-trait", "byteorder", @@ -2777,7 +2905,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "rand", + "rand 0.9.0", "socket2", "tokio", "tokio-util", @@ -2957,12 +3085,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - [[package]] name = "untrusted" version = "0.9.0" @@ -2998,8 +3120,9 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom", + "getrandom 0.2.15", "serde", + "wasm-bindgen", ] [[package]] @@ -3020,9 +3143,9 @@ checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" [[package]] name = "value-trait" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" +checksum = "0508fce11ad19e0aab49ce20b6bec7f8f82902ded31df1c9fc61b90f0eb396b8" dependencies = [ "float-cmp", "halfbrown", @@ -3048,6 +3171,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasite" version = "0.1.0" @@ -3056,20 +3188,21 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", @@ -3081,9 +3214,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3091,9 +3224,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -3104,15 +3237,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -3339,6 +3475,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -3485,7 +3630,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", ] [[package]] @@ -3499,6 +3653,17 @@ dependencies = [ "syn 2.0.91", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "zerofrom" version = "0.1.5" diff --git a/frameworks/Rust/axum/Cargo.toml b/frameworks/Rust/axum/Cargo.toml index 335a3b7f451..7aeee088323 100644 --- a/frameworks/Rust/axum/Cargo.toml +++ b/frameworks/Rust/axum/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "axum-techempower" -version = "0.2.1" +version = "0.3.0" authors = ["Dragos Varovici "] -edition = "2021" +edition = "2024" [[bin]] name = "axum" @@ -39,49 +39,49 @@ simd-json = [ ] [dependencies] -axum = { version = "0.7.9", default-features = false, features = [ +axum = { version = "0.8.3", default-features = false, features = [ "json", "query", "http1", "tokio", ] } -deadpool = { version = "0.12.1", features = ["rt_tokio_1", "serde", "managed"] } +deadpool = { version = "0.12.2", features = ["rt_tokio_1", "serde", "managed"] } deadpool-postgres = { version = "0.14.1", features = ["rt_tokio_1", "serde"] } dotenv = "0.15.0" futures = "0.3.31" futures-util = "0.3.31" -mongodb = { version = "3.1.1", features = [ +mongodb = { version = "3.2.3", features = [ "zstd-compression", "snappy-compression", "zlib-compression", ] } num_cpus = "1.16.0" -rand = { version = "0.8.5", features = ["small_rng"] } -serde = { version = "1.0.216", features = ["derive"] } -serde_json = "1.0.134" -sqlx = { version = "0.8.2", features = [ +rand = { version = "0.9.0", features = ["small_rng"] } +serde = { version = "1.0.219", features = ["derive"] } +serde_json = "1.0.140" +sqlx = { version = "0.8.3", features = [ "postgres", "macros", "runtime-tokio", "tls-rustls", ] } -tokio = { version = "1.42.0", features = ["full"] } +tokio = { version = "1.44.2", features = ["full"] } tokio-pg-mapper = { version = "0.2.0" } tokio-pg-mapper-derive = { version = "0.2.0" } -tokio-postgres = { version = "0.7.12" } +tokio-postgres = { version = "0.7.13" } tower = { version = "0.5.2", features = ["util"] } tower-http = { version = "0.6.2", features = ["set-header"] } yarte = "0.15.7" -simd-json = { version = "0.14.3", optional = true } -axum-core = { version = "0.4.5", optional = true } +simd-json = { version = "0.15.0", optional = true } +axum-core = { version = "0.5.2", optional = true } mime = { version = "0.3.17", optional = true } -bytes = { version = "1.9.0", optional = true } -serde_path_to_error = { version = "0.1.16", optional = true } -socket2 = "0.5.8" -hyper = { version = "1.5", features = ["server", "http1"] } +bytes = { version = "1.10.1", optional = true } +serde_path_to_error = { version = "0.1.17", optional = true } +socket2 = "0.5.9" +hyper = { version = "1.6", features = ["server", "http1"] } hyper-util = { version = "0.1", features = ["tokio", "server-auto", "http1"] } -quick_cache = "0.6.9" -mimalloc = "0.1.43" +quick_cache = "0.6.12" +mimalloc = "0.1.45" [profile.release] diff --git a/frameworks/Rust/axum/README.md b/frameworks/Rust/axum/README.md index eb1e4ff594c..da95959dafa 100755 --- a/frameworks/Rust/axum/README.md +++ b/frameworks/Rust/axum/README.md @@ -40,5 +40,4 @@ built with Tokio, Tower, and Hyper. - Use of PostgreSQL prepared statements cache (where supported). - Use of PostgreSQL arrays to execute multi-row database updates with a single `UPDATE` query. - This is permitted by the [test requirements](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates), step (ix). -- More performance improvements are to be expected in version 0.8: - - https://github.com/tokio-rs/axum/issues/1827 +- Use of a fast PRNG \ No newline at end of file diff --git a/frameworks/Rust/axum/axum.dockerfile b/frameworks/Rust/axum/axum.dockerfile index 1bfb8fdf9c1..f1316cf10e0 100644 --- a/frameworks/Rust/axum/axum.dockerfile +++ b/frameworks/Rust/axum/axum.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/rust:1.83-slim-bookworm AS builder +FROM docker.io/rust:1.86-slim-bookworm AS builder RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config libssl-dev \ diff --git a/frameworks/Rust/axum/src/common/mod.rs b/frameworks/Rust/axum/src/common/mod.rs index cae34d182cf..f3488fbab9b 100644 --- a/frameworks/Rust/axum/src/common/mod.rs +++ b/frameworks/Rust/axum/src/common/mod.rs @@ -1,7 +1,7 @@ use std::{env, str::FromStr}; use core::fmt::Debug; -use rand::{distributions::Uniform, rngs::SmallRng, Rng}; +use rand::{distr::Uniform, rngs::SmallRng, Rng, RngCore}; pub mod models; pub mod utils; @@ -36,14 +36,14 @@ where /// Generate a single integer in the range 1 to 10,000 (inclusive) #[allow(dead_code)] #[inline(always)] -pub fn random_id(rng: &mut SmallRng) -> i32 { - rng.gen_range(1..10_001) +pub fn random_id(rng: &mut impl RngCore) -> i32 { + rng.random_range(1..=10_000) } /// Generate an iterator of integers in the range 1 to 10,000 (inclusive) #[allow(dead_code)] #[inline(always)] pub fn random_ids(rng: &mut SmallRng, count: usize) -> impl Iterator + use<'_> { - rng.sample_iter(Uniform::new(1, 10_001)) + rng.sample_iter(Uniform::new_inclusive(1, 10_000).unwrap()) .take(count) } \ No newline at end of file diff --git a/frameworks/Rust/axum/src/main_mongo.rs b/frameworks/Rust/axum/src/main_mongo.rs index f15e0f521fb..a08c8095257 100644 --- a/frameworks/Rust/axum/src/main_mongo.rs +++ b/frameworks/Rust/axum/src/main_mongo.rs @@ -21,7 +21,7 @@ use mongodb::{ options::{ClientOptions, Compressor}, Client, }; -use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng}; +use rand::{rngs::SmallRng, rng, SeedableRng}; use yarte::Template; use mimalloc::MiMalloc; @@ -43,9 +43,7 @@ pub struct FortunesTemplate<'a> { } async fn db(DatabaseConnection(db): DatabaseConnection) -> impl IntoResponse { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - - let random_id = (rng.gen::() % 10_000 + 1) as i32; + let random_id = random_id(&mut rng()); let world = find_world_by_id(db, random_id) .await @@ -60,7 +58,7 @@ async fn queries( ) -> impl IntoResponse { let q = parse_params(params); - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let worlds = find_worlds(db, &mut rng, q).await; let results = worlds.expect("worlds could not be retrieved"); @@ -73,7 +71,7 @@ async fn updates( ) -> impl IntoResponse { let q = parse_params(params); - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let worlds = find_worlds(db.clone(), &mut rng, q) .await diff --git a/frameworks/Rust/axum/src/main_mongo_raw.rs b/frameworks/Rust/axum/src/main_mongo_raw.rs index b36dd2d8030..64c9141c239 100644 --- a/frameworks/Rust/axum/src/main_mongo_raw.rs +++ b/frameworks/Rust/axum/src/main_mongo_raw.rs @@ -32,12 +32,10 @@ use mongodb::{ options::{ClientOptions, Compressor}, Client, }; -use rand::{rngs::SmallRng, thread_rng, SeedableRng}; +use rand::{rngs::SmallRng, rng, SeedableRng}; async fn db(DatabaseConnection(db): DatabaseConnection) -> impl IntoResponse { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - - let random_id = random_id(&mut rng); + let random_id = random_id(&mut rng()); let world = find_world_by_id(db, random_id) .await @@ -52,7 +50,7 @@ async fn queries( ) -> impl IntoResponse { let q = parse_params(params); - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let worlds = find_worlds(db, &mut rng, q).await; let results = worlds.expect("worlds could not be retrieved"); @@ -65,7 +63,7 @@ async fn updates( ) -> impl IntoResponse { let q = parse_params(params); - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let worlds = find_worlds(db.clone(), &mut rng, q) .await diff --git a/frameworks/Rust/axum/src/main_pg.rs b/frameworks/Rust/axum/src/main_pg.rs index 94788bbd254..3fb88378546 100644 --- a/frameworks/Rust/axum/src/main_pg.rs +++ b/frameworks/Rust/axum/src/main_pg.rs @@ -5,7 +5,7 @@ use axum::{ extract::Query, http::StatusCode, response::IntoResponse, routing::get, Router, }; use dotenv::dotenv; -use rand::{rngs::SmallRng, thread_rng, SeedableRng}; +use rand::rng; use yarte::Template; use mimalloc::MiMalloc; @@ -33,10 +33,9 @@ pub struct FortunesTemplate<'a> { } async fn db(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResponse { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - + let id = random_id(&mut rng()); let world = conn - .fetch_world_by_id(random_id(&mut rng)) + .fetch_world_by_id(id) .await .expect("error loading world"); diff --git a/frameworks/Rust/axum/src/main_pg_pool.rs b/frameworks/Rust/axum/src/main_pg_pool.rs index a6d5764748e..c99545331de 100644 --- a/frameworks/Rust/axum/src/main_pg_pool.rs +++ b/frameworks/Rust/axum/src/main_pg_pool.rs @@ -13,7 +13,7 @@ use common::simd_json::Json; use common::{random_ids, SELECT_ALL_FORTUNES, SELECT_WORLD_BY_ID, UPDATE_WORLDS}; use dotenv::dotenv; use futures_util::{stream::FuturesUnordered, TryStreamExt}; -use rand::{rngs::SmallRng, thread_rng, SeedableRng}; +use rand::{rngs::SmallRng, rng, SeedableRng}; use yarte::Template; use mimalloc::MiMalloc; @@ -38,8 +38,7 @@ pub struct FortunesTemplate<'a> { } async fn db(DatabaseClient(client): DatabaseClient) -> impl IntoResponse { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - let random_id = random_id(&mut rng); + let random_id = random_id(&mut rng()); let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); let world = fetch_world_by_id(&client, random_id, select) @@ -55,7 +54,7 @@ async fn queries( ) -> impl IntoResponse { let q = parse_params(params); - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); let future_worlds = FuturesUnordered::new(); @@ -98,7 +97,7 @@ async fn updates( ) -> impl IntoResponse { let q = parse_params(params); - let mut rng = SmallRng::from_entropy(); + let mut rng = SmallRng::from_rng(&mut rng()); let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); let update = &client.prepare_cached(UPDATE_WORLDS).await.unwrap(); diff --git a/frameworks/Rust/axum/src/main_sqlx.rs b/frameworks/Rust/axum/src/main_sqlx.rs index 7c8f90d6807..276bdd5da32 100644 --- a/frameworks/Rust/axum/src/main_sqlx.rs +++ b/frameworks/Rust/axum/src/main_sqlx.rs @@ -13,7 +13,7 @@ use axum::{ }; use dotenv::dotenv; use quick_cache::sync::Cache; -use rand::{rngs::SmallRng, thread_rng, SeedableRng}; +use rand::{rngs::SmallRng, rng, SeedableRng}; use sqlx::models::World; use yarte::Template; use mimalloc::MiMalloc; @@ -42,10 +42,9 @@ pub struct FortunesTemplate<'a> { } async fn db(State(AppState { db, .. }): State) -> impl IntoResponse { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - + let id = random_id(&mut rng()); let world: World = ::sqlx::query_as(common::SELECT_WORLD_BY_ID) - .bind(random_id(&mut rng)) + .bind(id) .fetch_one(&mut *db.acquire().await.unwrap()) .await .expect("error loading world"); @@ -57,7 +56,7 @@ async fn queries( State(AppState { db, .. }): State, Query(params): Query, ) -> impl IntoResponse { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let count = parse_params(params); let mut worlds: Vec = Vec::with_capacity(count); @@ -100,7 +99,7 @@ async fn cache( Query(params): Query, ) -> impl IntoResponse { let count = parse_params(params); - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let mut worlds: Vec> = Vec::with_capacity(count); for id in random_ids(&mut rng, count) { diff --git a/frameworks/Rust/axum/src/mongo/database.rs b/frameworks/Rust/axum/src/mongo/database.rs index be581e4505c..85d0e5c9221 100644 --- a/frameworks/Rust/axum/src/mongo/database.rs +++ b/frameworks/Rust/axum/src/mongo/database.rs @@ -1,6 +1,6 @@ use std::{convert::Infallible, io}; -use axum::{async_trait, extract::FromRequestParts, http::request::Parts}; +use axum::{extract::FromRequestParts, http::request::Parts}; use futures_util::{stream::FuturesUnordered, StreamExt, TryStreamExt}; use mongodb::{bson::doc, Database}; use rand::rngs::SmallRng; @@ -9,7 +9,6 @@ use crate::common::{models::{Fortune, World}, random_ids}; pub struct DatabaseConnection(pub Database); -#[async_trait] impl FromRequestParts for DatabaseConnection { type Rejection = Infallible; diff --git a/frameworks/Rust/axum/src/mongo_raw/database.rs b/frameworks/Rust/axum/src/mongo_raw/database.rs index 22b113ce68c..72642894db8 100644 --- a/frameworks/Rust/axum/src/mongo_raw/database.rs +++ b/frameworks/Rust/axum/src/mongo_raw/database.rs @@ -1,6 +1,6 @@ use std::{convert::Infallible, io}; -use axum::{async_trait, extract::FromRequestParts, http::request::Parts}; +use axum::{extract::FromRequestParts, http::request::Parts}; use futures_util::{stream::FuturesUnordered, TryStreamExt}; use mongodb::{ bson::{doc, RawDocumentBuf}, @@ -12,7 +12,6 @@ use crate::common::{models::World, random_ids}; pub struct DatabaseConnection(pub Database); -#[async_trait] impl FromRequestParts for DatabaseConnection { type Rejection = Infallible; diff --git a/frameworks/Rust/axum/src/pg/database.rs b/frameworks/Rust/axum/src/pg/database.rs index b9cff086c5a..e834f74c23d 100644 --- a/frameworks/Rust/axum/src/pg/database.rs +++ b/frameworks/Rust/axum/src/pg/database.rs @@ -1,8 +1,8 @@ use std::{convert::Infallible, io, sync::Arc}; -use axum::{async_trait, extract::FromRequestParts, http::request::Parts}; +use axum::{extract::FromRequestParts, http::request::Parts}; use futures::{stream::futures_unordered::FuturesUnordered, StreamExt, TryStreamExt}; -use rand::{rngs::SmallRng, thread_rng, SeedableRng}; +use rand::{rngs::SmallRng, rng, SeedableRng}; use tokio::pin; use tokio_postgres::{connect, Client, NoTls, Statement}; @@ -78,7 +78,7 @@ impl PgConnection { } pub async fn fetch_random_worlds(&self, num: usize) -> Result, PgError> { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let futures = FuturesUnordered::new(); @@ -93,7 +93,7 @@ impl PgConnection { let mut worlds = self.fetch_random_worlds(num).await?; // Update the worlds with new random numbers - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rng()); let mut ids = Vec::with_capacity(num); let mut nids = Vec::with_capacity(num); @@ -139,7 +139,6 @@ impl PgConnection { pub struct DatabaseConnection(pub Arc); -#[async_trait] impl FromRequestParts> for DatabaseConnection { type Rejection = Infallible; diff --git a/frameworks/Rust/axum/src/pg_pool/database.rs b/frameworks/Rust/axum/src/pg_pool/database.rs index e1a43f34f23..cf32fa1558b 100644 --- a/frameworks/Rust/axum/src/pg_pool/database.rs +++ b/frameworks/Rust/axum/src/pg_pool/database.rs @@ -5,7 +5,6 @@ use crate::{ pg_pool::models::{Fortune, World}, }; use axum::{ - async_trait, extract::FromRequestParts, http::{request::Parts, StatusCode}, }; @@ -55,7 +54,6 @@ pub async fn create_pool( pub struct DatabaseClient(pub Client); -#[async_trait] impl FromRequestParts for DatabaseClient { type Rejection = (StatusCode, String); diff --git a/frameworks/Rust/axum/src/server.rs b/frameworks/Rust/axum/src/server.rs index 6d861277c10..52705143dba 100644 --- a/frameworks/Rust/axum/src/server.rs +++ b/frameworks/Rust/axum/src/server.rs @@ -37,7 +37,7 @@ fn set_socket_options(addr: SocketAddr) -> io::Result { } /// Build an Axum server with consistent configuration, using the high-level API exposed -/// by Axum 0.7. This is intended for convenience and intentionally does not provide much +/// by Axum 0.8. This is intended for convenience and intentionally does not provide much /// customisability. #[allow(dead_code)] pub async fn serve(app: Router<()>, port: Option) { From b8a43f47d770b1e98d7e3abeb05f051810f7da33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 18:03:38 +0000 Subject: [PATCH 1355/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/fastwsgi Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 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 6ffecb787c6..85ba54c7e95 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.4 +Jinja2==3.1.6 cachetools==5.3.0 asyncache==0.3.1 From 203931bac2a45c99503a970a051ed7fdda79436b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 18:07:15 +0000 Subject: [PATCH 1356/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/falcon Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 c5da990116d..97f6b1390f8 100644 --- a/frameworks/Python/falcon/requirements.txt +++ b/frameworks/Python/falcon/requirements.txt @@ -1,2 +1,2 @@ falcon==3.1.1 -jinja2==3.1.4 +jinja2==3.1.6 From dc369c814826cc29f333cfe7d4da552ddd3d4860 Mon Sep 17 00:00:00 2001 From: Sergey Kovalev <44sergey@gmail.com> Date: Mon, 7 Apr 2025 23:31:45 +0400 Subject: [PATCH 1357/1766] Aiohttp switch to orjson (#9767) * Aiohttp switch to orjson * ensure that update runs over unique ids --- frameworks/Python/aiohttp/app/views.py | 44 ++++++++++++++-------- frameworks/Python/aiohttp/requirements.txt | 7 ++-- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/frameworks/Python/aiohttp/app/views.py b/frameworks/Python/aiohttp/app/views.py index 8fd659aa93f..ef2b04ed7bc 100644 --- a/frameworks/Python/aiohttp/app/views.py +++ b/frameworks/Python/aiohttp/app/views.py @@ -1,12 +1,12 @@ -from functools import partial from operator import attrgetter, itemgetter from pathlib import Path -from random import randint +from random import randint, sample import jinja2 -import ujson -from aiohttp.web import Response, json_response +import orjson +from aiohttp.web import Response from sqlalchemy import select +from sqlalchemy.orm.attributes import flag_modified from .models import sa_fortunes, sa_worlds, Fortune, World @@ -16,7 +16,6 @@ READ_SELECT_ORM = select(World.randomnumber) WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$2 WHERE id=$1' -json_response = partial(json_response, dumps=ujson.dumps) template_path = Path(__file__).parent / 'templates' / 'fortune.jinja' template = jinja2.Template(template_path.read_text()) sort_fortunes_orm = attrgetter('message') @@ -34,6 +33,11 @@ def get_num_queries(request): return 500 return num_queries +def json_response(payload): + return Response( + body=orjson.dumps(payload), + content_type="application/json", + ) async def json(request): """ @@ -74,7 +78,7 @@ async def multiple_database_queries_orm(request): result = [] async with request.app['db_session']() as sess: for id_ in ids: - num = await sess.scalar(READ_SELECT_ORM.filter_by(id=id_)) + num = await sess.scalar(READ_SELECT_ORM.where(World.id == id_)) result.append({'id': id_, 'randomNumber': num}) return json_response(result) @@ -128,14 +132,21 @@ async def updates(request): Test 5 ORM """ num_queries = get_num_queries(request) - updates = [(randint(1, 10000), randint(1, 10000)) for _ in range(num_queries)] - updates.sort() - worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] + + ids = sample(range(1, 10000 + 1), num_queries) + ids.sort() + worlds = [] async with request.app['db_session'].begin() as sess: - for id_, number in updates: - world = await sess.get(World, id_, populate_existing=True) - world.randomnumber = number + for row_id in ids: + random_number = randint(1, 10000) + world = await sess.get(World, row_id, populate_existing=True) + world.randomnumber = random_number + # force sqlalchemy to UPDATE entry even if the value has not changed + # doesn't make sense in a real application, added only for pass `tfb verify` + flag_modified(world, "randomnumber") + worlds.append({'id': row_id, 'randomNumber': random_number}) + return json_response(worlds) async def updates_raw(request): @@ -143,15 +154,16 @@ async def updates_raw(request): Test 5 RAW """ num_queries = get_num_queries(request) - updates = [(randint(1, 10000), randint(1, 10000)) for _ in range(num_queries)] - updates.sort() + ids = sample(range(1, 10000 + 1), num_queries) + ids.sort() + updates = [(row_id, randint(1, 10000)) for row_id in ids] worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] async with request.app['pg'].acquire() as conn: stmt = await conn.prepare(READ_ROW_SQL) - for id_, _ in updates: + for row_id in ids: # the result of this is the int previous random number which we don't actually use - await stmt.fetchval(id_) + await stmt.fetchval(row_id) await conn.executemany(WRITE_ROW_SQL, updates) return json_response(worlds) diff --git a/frameworks/Python/aiohttp/requirements.txt b/frameworks/Python/aiohttp/requirements.txt index 82efc712810..aec2ed27c64 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,8 +1,7 @@ -aiohttp==3.11.14 +aiohttp==3.11.16 asyncpg==0.30.0 gunicorn==23.0.0 -jinja2==3.1.5 -psycopg2==2.9.10 +jinja2==3.1.6 SQLAlchemy==2.0.39 -ujson==5.10.0 +orjson==3.10.16 uvloop==0.21.0 From 4ef142b6c7e87d678c7f0549ddef294898baa8fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Tue, 8 Apr 2025 03:32:09 +0800 Subject: [PATCH 1358/1766] Upgrade hyperlane (#9784) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml --- frameworks/Rust/hyperlane/.gitignore | 3 +- frameworks/Rust/hyperlane/Cargo.lock | 2381 ++++++++++++++++++++++++++ frameworks/Rust/hyperlane/Cargo.toml | 10 +- 3 files changed, 2387 insertions(+), 7 deletions(-) create mode 100644 frameworks/Rust/hyperlane/Cargo.lock diff --git a/frameworks/Rust/hyperlane/.gitignore b/frameworks/Rust/hyperlane/.gitignore index af8e65c2e7a..c0ed7d09f10 100644 --- a/frameworks/Rust/hyperlane/.gitignore +++ b/frameworks/Rust/hyperlane/.gitignore @@ -1,3 +1,2 @@ /target -/logs -Cargo.lock \ No newline at end of file +/logs \ No newline at end of file diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock new file mode 100644 index 00000000000..7d463f2e48a --- /dev/null +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -0,0 +1,2381 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "async-func" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cf3fe5910b9139e5f8b4bdb4a0923d5aaae21fb45cb64e22d4b43ac70da5ad" +dependencies = [ + "tokio", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clonelicious" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc3dfae702af156917c65f4ccc70687088331f0b694e5e687453e4d68a16b496" + +[[package]] +name = "color-output" +version = "6.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5427d1c209887c8f2e528a64e0849a517fd14fe74d54904af57cb9446cf20b4" +dependencies = [ + "hyperlane-time", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.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]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "file-operation" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66e0c123d53cd593ab9a38d5078c8483e890259dfec47bd453dfc09e6c052aca" +dependencies = [ + "tokio", +] + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "halfbrown" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" +dependencies = [ + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http-compress" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def62accac840ecbddc4170585171192f4b0cf879fb4dc4e454699f476feff12" +dependencies = [ + "brotli", + "flate2", + "twox-hash", +] + +[[package]] +name = "http-constant" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711a0d020705f9eca6b58b4f23b6e815ecdafb6a8deeadd8ee6f49164b24e0c9" + +[[package]] +name = "http-type" +version = "3.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ebd70871ed728abc4ec31ec2044bb2d31382a371586a780ce2647049bc10d64" +dependencies = [ + "ahash", + "dashmap", + "futures", + "hex", + "http-compress", + "http-constant", + "lombok-macros", + "num_cpus", + "once_cell", + "serde", + "serde-xml-rs", + "serde_json", + "serde_urlencoded", + "simd-json", + "std-macro-extensions", + "tokio", + "twox-hash", + "url", + "urlencoding", +] + +[[package]] +name = "hyperlane" +version = "4.77.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d05f78e4b2f883f81ace0a2569e78b565739643970157d9ff16b832ae1196e" +dependencies = [ + "async-func", + "clonelicious", + "color-output", + "file-operation", + "http-type", + "hyperlane-log", + "hyperlane-time", + "recoverable-spawn", + "recoverable-thread-pool", + "server-manager", +] + +[[package]] +name = "hyperlane-log" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15882faec87a44fc4285b5b5f0324c3b853dbc3cd2cfd4942ada9ba05828e0ee" +dependencies = [ + "file-operation", + "hyperlane-time", + "lombok-macros", + "tokio", +] + +[[package]] +name = "hyperlane-time" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4737d903a4e4ed8c82c13d4878faebc117e06bd3386d7002bad4347558209de" + +[[package]] +name = "hyperlane_techempower" +version = "0.0.1" +dependencies = [ + "hyperlane", + "num_cpus", + "rand 0.9.0", + "serde", + "sqlx", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lombok-macros" +version = "1.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff7e8bfea5ff4ba05d8e287c4459438454d86face7b93552b43c51790481a42" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[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 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.24", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.24", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "recoverable-spawn" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc61deaa201c349799f432212c2fdbd81f0587ba6cd10eed29c86cf207fe477" +dependencies = [ + "once_cell", + "tokio", +] + +[[package]] +name = "recoverable-thread-pool" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0896f8322a96307d443bc472bbac0f80f2df18ce6967e5d0952c0e11203ff" +dependencies = [ + "lombok-macros", + "recoverable-spawn", + "tokio", +] + +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[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.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-xml-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +dependencies = [ + "log", + "serde", + "thiserror 1.0.69", + "xml-rs", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "server-manager" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a91c52599e0a322858a971d3111ceed3cbb265eb90469473f10cba416b791e" +dependencies = [ + "tokio", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +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 0.6.4", +] + +[[package]] +name = "simd-json" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b5602e4f1f7d358956f94cac1eff59220f34cf9e26d49f5fde5acef851cbed" +dependencies = [ + "getrandom 0.3.2", + "halfbrown", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[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 = "sqlx" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +dependencies = [ + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.2", + "hashlink", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +dependencies = [ + "atoi", + "base64", + "bitflags", + "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", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.12", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.12", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "std-macro-extensions" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18041dd0553c6b667fdb69c22643e977473d070c88d1a220ec4c2536e6c9eb6d" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "twox-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +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 = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "value-trait" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0508fce11ad19e0aab49ce20b6bec7f8f82902ded31df1c9fc61b90f0eb396b8" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "whoami" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +dependencies = [ + "redox_syscall", + "wasite", +] + +[[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.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xml-rs" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 66cbc75cbb8..c536f5a2ec6 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,11 +18,11 @@ exclude = [ ] [dependencies] -hyperlane = "=4.65.0" -num_cpus = "=1.16.0" -rand = "=0.9.0" -serde = "=1.0.219" -sqlx = { version = "=0.8.3", features = ["runtime-tokio", "postgres"] } +hyperlane = "4.77.0" +num_cpus = "1.16.0" +rand = "0.9.0" +serde = "1.0.219" +sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } [profile.dev] incremental = false From c2755c71e6e6f11580169a047c7b07d6f166d2df Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Mon, 7 Apr 2025 21:33:13 +0200 Subject: [PATCH 1359/1766] Upgrade to Vert.x 5.0.0.CR6 (#9786) --- frameworks/Java/vertx/README.md | 2 +- frameworks/Java/vertx/pom.xml | 25 ++-- .../Java/vertx/src/main/java/vertx/App.java | 137 +++++++++++------- .../java/vertx/rocker/BufferRockerOutput.java | 7 +- .../Java/vertx/vertx-postgres.dockerfile | 6 +- frameworks/Java/vertx/vertx.dockerfile | 2 +- 6 files changed, 106 insertions(+), 73 deletions(-) diff --git a/frameworks/Java/vertx/README.md b/frameworks/Java/vertx/README.md index 47a3f1d2673..1e8ef72450e 100644 --- a/frameworks/Java/vertx/README.md +++ b/frameworks/Java/vertx/README.md @@ -33,7 +33,7 @@ This is the Vert.x portion of a [benchmarking test suite](../) comparing a varie ## Versions * [Java 17](https://jdk.java.net) -* [vertx 4.3.8](http://vertx.io/) +* [vertx 5.0.0.CR6](http://vertx.io/) ## Test URLs diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 4230d89326b..a827456676c 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -10,22 +10,26 @@ 17 vertx.App - 4.5.9 + 5.0.0.CR6 + 4.2.0.Final 2.16.1 - 4.1.111.Final - 0.0.25.Final io.vertx vertx-core - ${stack.version} + ${vertx.version} + + + io.vertx + vertx-core-logging + ${vertx.version} io.vertx vertx-pg-client - ${stack.version} + ${vertx.version} com.dslplatform @@ -151,14 +155,9 @@ - io.vertx - vertx-io_uring-incubator - ${stack.version} - - - io.netty.incubator - netty-incubator-transport-native-io_uring - ${netty.io_uring.version} + io.netty + netty-transport-native-io_uring + ${netty.version} linux-x86_64 diff --git a/frameworks/Java/vertx/src/main/java/vertx/App.java b/frameworks/Java/vertx/src/main/java/vertx/App.java index 5afa269ae9e..ca9d0929cca 100755 --- a/frameworks/Java/vertx/src/main/java/vertx/App.java +++ b/frameworks/Java/vertx/src/main/java/vertx/App.java @@ -3,7 +3,10 @@ import com.fizzed.rocker.ContentType; import com.fizzed.rocker.RockerOutputFactory; import io.netty.util.concurrent.MultithreadEventExecutorGroup; -import io.vertx.core.impl.VertxInternal; +import io.vertx.core.impl.SysProps; +import io.vertx.core.internal.VertxInternal; +import io.vertx.core.internal.logging.Logger; +import io.vertx.core.internal.logging.LoggerFactory; import io.vertx.pgclient.*; import io.vertx.core.*; import io.vertx.core.buffer.Buffer; @@ -13,8 +16,6 @@ import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerResponse; import io.vertx.core.json.JsonObject; -import io.vertx.core.logging.Logger; -import io.vertx.core.logging.LoggerFactory; import io.vertx.sqlclient.*; import io.vertx.sqlclient.impl.SqlClientInternal; import vertx.model.*; @@ -73,21 +74,20 @@ static int getQueries(HttpServerRequest request) { private static final String PATH_FORTUNES = "/fortunes"; private static final String PATH_CACHING = "/cached-queries"; - private static final Handler> NULL_HANDLER = null; - private static final CharSequence RESPONSE_TYPE_PLAIN = HttpHeaders.createOptimized("text/plain"); private static final CharSequence RESPONSE_TYPE_HTML = HttpHeaders.createOptimized("text/html; charset=UTF-8"); - static final CharSequence RESPONSE_TYPE_JSON = HttpHeaders.createOptimized("application/json"); + private static final CharSequence RESPONSE_TYPE_JSON = HttpHeaders.createOptimized("application/json"); 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 HEADER_SERVER = HttpHeaders.createOptimized("server"); - private static final CharSequence HEADER_DATE = HttpHeaders.createOptimized("date"); - private static final CharSequence HEADER_CONTENT_TYPE = HttpHeaders.createOptimized("content-type"); - private static final CharSequence HEADER_CONTENT_LENGTH = HttpHeaders.createOptimized("content-length"); + private static final CharSequence HEADER_SERVER = HttpHeaders.SERVER; + private static final CharSequence HEADER_DATE = HttpHeaders.DATE; + private static final CharSequence HEADER_CONTENT_TYPE = HttpHeaders.CONTENT_TYPE; + private static final CharSequence HEADER_CONTENT_LENGTH = HttpHeaders.CONTENT_LENGTH; private static final CharSequence HELLO_WORLD_LENGTH = HttpHeaders.createOptimized("" + HELLO_WORLD.length()); + private static final CharSequence JSON_LENGTH = HttpHeaders.createOptimized("" + new Message("Hello, World!").toJson().length()); private static final CharSequence SERVER = HttpHeaders.createOptimized("vert.x"); private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; @@ -114,7 +114,8 @@ static Integer boxedRandomWorldNumber() { private HttpServer server; private SqlClientInternal client; private CharSequence dateString; - private CharSequence[] plaintextHeaders; + private MultiMap plaintextHeaders; + private MultiMap jsonHeaders; private final RockerOutputFactory factory = BufferRockerOutput.factory(ContentType.RAW); @@ -125,19 +126,43 @@ static Integer boxedRandomWorldNumber() { private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[500]; private WorldCache WORLD_CACHE; + private MultiMap plaintextHeaders() { + return HttpHeaders + .headers() + .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_PLAIN) + .add(HEADER_SERVER, SERVER) + .add(HEADER_DATE, dateString) + .add(HEADER_CONTENT_LENGTH, HELLO_WORLD_LENGTH) + .copy(false); + } + + private MultiMap jsonHeaders() { + return HttpHeaders + .headers() + .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) + .add(HEADER_SERVER, SERVER) + .add(HEADER_DATE, dateString) + .add(HEADER_CONTENT_LENGTH, JSON_LENGTH) + .copy(false); + } + @Override public void start(Promise startPromise) throws Exception { int port = 8080; - server = vertx.createHttpServer(new HttpServerOptions()) + server = vertx + .createHttpServer(new HttpServerOptions() + .setHttp2ClearTextEnabled(false) + .setStrictThreadMode(true)) .requestHandler(App.this); dateString = createDateHeader(); - plaintextHeaders = new CharSequence[] { - HEADER_CONTENT_TYPE, RESPONSE_TYPE_PLAIN, - HEADER_SERVER, SERVER, - HEADER_DATE, dateString, - HEADER_CONTENT_LENGTH, HELLO_WORLD_LENGTH }; + plaintextHeaders = plaintextHeaders(); + jsonHeaders = jsonHeaders(); JsonObject config = config(); - vertx.setPeriodic(1000, id -> plaintextHeaders[5] = dateString = createDateHeader()); + vertx.setPeriodic(1000, id -> { + dateString = createDateHeader(); + plaintextHeaders = plaintextHeaders(); + jsonHeaders = jsonHeaders(); + }); PgConnectOptions options = new PgConnectOptions(); options.setDatabase(config.getString("database", "hello_world")); options.setHost(config.getString("host", "tfb-database")); @@ -261,26 +286,19 @@ private void sendError(HttpServerRequest req, Throwable cause) { private void handlePlainText(HttpServerRequest request) { HttpServerResponse response = request.response(); - MultiMap headers = response.headers(); - for (int i = 0;i < plaintextHeaders.length; i+= 2) { - headers.add(plaintextHeaders[i], plaintextHeaders[i + 1]); - } - response.end(HELLO_WORLD_BUFFER, NULL_HANDLER); + response.headers().setAll(plaintextHeaders); + response.end(HELLO_WORLD_BUFFER); } private void handleJson(HttpServerRequest request) { HttpServerResponse response = request.response(); - MultiMap headers = response.headers(); - headers - .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) - .add(HEADER_SERVER, SERVER) - .add(HEADER_DATE, dateString); - response.end(new Message("Hello, World!").toJson(), NULL_HANDLER); + response.headers().setAll(jsonHeaders); + response.end(new Message("Hello, World!").toJson()); } private void handleDb(HttpServerRequest req) { HttpServerResponse resp = req.response(); - SELECT_WORLD_QUERY.execute(Tuple.of(boxedRandomWorldNumber()), res -> { + SELECT_WORLD_QUERY.execute(Tuple.of(boxedRandomWorldNumber())).onComplete(res -> { if (res.succeeded()) { RowIterator resultSet = res.result().iterator(); if (!resultSet.hasNext()) { @@ -293,7 +311,7 @@ private void handleDb(HttpServerRequest req) { headers.add(HttpHeaders.SERVER, SERVER); headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); - resp.end(word.toJson(), NULL_HANDLER); + resp.end(word.toJson()); } else { sendError(req, res.cause()); } @@ -322,7 +340,9 @@ public Queries(HttpServerRequest req) { private void handle() { client.group(c -> { for (int i = 0; i < queries; i++) { - c.preparedQuery(SELECT_WORLD).execute(Tuple.of(boxedRandomWorldNumber()), this); + c.preparedQuery(SELECT_WORLD) + .execute(Tuple.of(boxedRandomWorldNumber())) + .onComplete(this); } }); } @@ -346,7 +366,7 @@ public void handle(AsyncResult> ar) { headers.add(HttpHeaders.SERVER, SERVER); headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); - resp.end(World.toJson(worlds), NULL_HANDLER); + resp.end(World.toJson(worlds)); } } } @@ -370,7 +390,7 @@ public void handle() { for (int i = 0; i < worldsToUpdate.length; i++) { final Integer id = boxedRandomWorldNumber(); final int index = i; - preparedQuery.execute(Tuple.of(id), res -> { + preparedQuery.execute(Tuple.of(id)).onComplete(res -> { if (!failed) { if (res.failed()) { failed = true; @@ -395,7 +415,9 @@ private void randomWorldsQueryCompleted() { params.add(world.getId()); params.add(world.getRandomNumber()); } - AGGREGATED_UPDATE_WORLD_QUERY[worldsToUpdate.length - 1].execute(Tuple.wrap(params), updateResult -> { + AGGREGATED_UPDATE_WORLD_QUERY[worldsToUpdate.length - 1] + .execute(Tuple.wrap(params)) + .onComplete(updateResult -> { if (updateResult.failed()) { sendError(request, updateResult.cause()); return; @@ -411,12 +433,14 @@ private void sendResponse() { headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); Buffer buff = WorldJsonSerializer.toJsonBuffer(worldsToUpdate); - res.end(buff, null); + res.end(buff); } } private void handleFortunes(HttpServerRequest req) { - SELECT_FORTUNE_QUERY.execute(ar -> { + SELECT_FORTUNE_QUERY + .execute() + .onComplete(ar -> { HttpServerResponse response = req.response(); if (ar.succeeded()) { SqlResult> result = ar.result(); @@ -432,7 +456,7 @@ private void handleFortunes(HttpServerRequest req) { headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_HTML); FortunesTemplate template = FortunesTemplate.template(fortunes); - response.end(template.render(factory).buffer(), NULL_HANDLER); + response.end(template.render(factory).buffer()); } else { sendError(req, ar.cause()); } @@ -457,7 +481,7 @@ private void handleCaching(HttpServerRequest req) { .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) .add(HEADER_SERVER, SERVER) .add(HEADER_DATE, dateString); - response.end(CachedWorld.toJson(worlds), NULL_HANDLER); + response.end(CachedWorld.toJson(worlds)); } public static void main(String[] args) throws Exception { @@ -471,24 +495,30 @@ public static void main(String[] args) throws Exception { } } JsonObject config = new JsonObject(new String(Files.readAllBytes(new File(args[0]).toPath()))); - Vertx vertx = Vertx.vertx(new VertxOptions().setEventLoopPoolSize(eventLoopPoolSize).setPreferNativeTransport(true)); + Vertx vertx = Vertx.vertx(new VertxOptions() + .setEventLoopPoolSize(eventLoopPoolSize) + .setPreferNativeTransport(true) + .setDisableTCCL(true) + ); vertx.exceptionHandler(err -> { err.printStackTrace(); }); - printConfig(vertx); - vertx.deployVerticle(App.class.getName(), - new DeploymentOptions().setInstances(eventLoopPoolSize).setConfig(config), event -> { - if (event.succeeded()) { - logger.info("Server listening on port " + 8080); - } else { - logger.error("Unable to start your application", event.cause()); - } - }); + printConfig((VertxInternal) vertx); + vertx.deployVerticle( + App.class.getName(), + new DeploymentOptions().setInstances(eventLoopPoolSize).setConfig(config)) + .onComplete(event -> { + if (event.succeeded()) { + logger.info("Server listening on port " + 8080); + } else { + logger.error("Unable to start your application", event.cause()); + } + }); } - private static void printConfig(Vertx vertx) { + private static void printConfig(VertxInternal vertx) { boolean nativeTransport = vertx.isNativeTransportEnabled(); - String transport = ((VertxInternal) vertx).transport().getClass().getSimpleName(); + String transport = vertx.transport().getClass().getSimpleName(); String version = "unknown"; try { InputStream in = Vertx.class.getClassLoader().getResourceAsStream("META-INF/vertx/vertx-version.txt"); @@ -513,5 +543,10 @@ private static void printConfig(Vertx vertx) { logger.info("Event Loop Size: " + ((MultithreadEventExecutorGroup)vertx.nettyEventLoopGroup()).executorCount()); logger.info("Native transport : " + nativeTransport); logger.info("Transport : " + transport); + logger.info("Netty buffer bound check : " + System.getProperty("io.netty.buffer.checkBounds")); + logger.info("Netty buffer accessibility check : " + System.getProperty("io.netty.buffer.checkAccessible")); + for (SysProps sysProp : SysProps.values()) { + logger.info(sysProp.name + " : " + sysProp.get()); + } } } diff --git a/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java b/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java index 326d45e3e96..36d1144f5d6 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java +++ b/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java @@ -5,7 +5,8 @@ import com.fizzed.rocker.RockerOutputFactory; import io.netty.buffer.ByteBuf; import io.vertx.core.buffer.Buffer; -import io.vertx.core.buffer.impl.PartialPooledByteBufAllocator; +import io.vertx.core.impl.buffer.VertxByteBufAllocator; +import io.vertx.core.internal.buffer.BufferInternal; import java.io.IOException; import java.nio.charset.Charset; @@ -21,8 +22,8 @@ public static RockerOutputFactory factory(ContentType conten }; } - private final ByteBuf buff = PartialPooledByteBufAllocator.INSTANCE.directBuffer(); - private final Buffer buffer = Buffer.buffer(buff); + private final ByteBuf buff = VertxByteBufAllocator.DEFAULT.directBuffer(); + private final Buffer buffer = BufferInternal.buffer(buff); private final ContentType contentType; BufferRockerOutput(ContentType contentType) { diff --git a/frameworks/Java/vertx/vertx-postgres.dockerfile b/frameworks/Java/vertx/vertx-postgres.dockerfile index dec7fa545a3..95e731f2d9a 100644 --- a/frameworks/Java/vertx/vertx-postgres.dockerfile +++ b/frameworks/Java/vertx/vertx-postgres.dockerfile @@ -16,13 +16,11 @@ CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ -XX:+UseParallelGC \ -Djava.lang.Integer.IntegerCache.high=10000 \ -Dvertx.disableMetrics=true \ - -Dvertx.disableH2c=true \ -Dvertx.disableWebsockets=true \ - -Dvertx.flashPolicyHandler=false \ - -Dvertx.threadChecks=false \ -Dvertx.disableContextTimings=true \ - -Dvertx.disableTCCL=true \ -Dvertx.disableHttpHeadersValidation=true \ + -Dvertx.cacheImmutableHttpResponseHeaders=true \ + -Dvertx.internCommonHttpRequestHeadersToLowerCase=true \ -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ diff --git a/frameworks/Java/vertx/vertx.dockerfile b/frameworks/Java/vertx/vertx.dockerfile index 2fe2a27a2c2..27c34140e64 100644 --- a/frameworks/Java/vertx/vertx.dockerfile +++ b/frameworks/Java/vertx/vertx.dockerfile @@ -6,4 +6,4 @@ RUN mvn package -q EXPOSE 8080 -CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableWebsockets=true", "-Dvertx.disableContextTimings=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.cacheImmutableHttpResponseHeaders=true", "-Dvertx.internCommonHttpRequestHeadersToLowerCase=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] From 91fcc074e16d9e6c575b817ca9e36528adc9139a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 02:08:03 +0000 Subject: [PATCH 1360/1766] Bump tokio from 1.44.1 to 1.44.2 in /frameworks/Rust/hyper Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.44.1 to 1.44.2. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.44.1...tokio-1.44.2) --- updated-dependencies: - dependency-name: tokio dependency-version: 1.44.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Rust/hyper/Cargo.lock | 8 ++++---- frameworks/Rust/hyper/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Rust/hyper/Cargo.lock b/frameworks/Rust/hyper/Cargo.lock index 7c1a5d6a4c6..5158b30a40c 100644 --- a/frameworks/Rust/hyper/Cargo.lock +++ b/frameworks/Rust/hyper/Cargo.lock @@ -262,7 +262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -835,7 +835,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1052,9 +1052,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.1" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", diff --git a/frameworks/Rust/hyper/Cargo.toml b/frameworks/Rust/hyper/Cargo.toml index b94bb0cbbae..9eb7ef7ccbc 100644 --- a/frameworks/Rust/hyper/Cargo.toml +++ b/frameworks/Rust/hyper/Cargo.toml @@ -34,7 +34,7 @@ serde_json = "1.0.140" socket2 = { version = "0.5.8", features = ["all"] } strum = { version = "0.27.1", features = ["derive"] } thiserror = "2.0.12" -tokio = { version = "1.44.1", features = [ +tokio = { version = "1.44.2", features = [ "rt", "rt-multi-thread", "net", From 19fd7c81ae8ba17f7aabdd301c1a1b48b1bdf363 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 02:12:06 +0000 Subject: [PATCH 1361/1766] Bump tokio from 1.43.0 to 1.43.1 in /frameworks/Rust/ohkami/rt_tokio Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.43.0 to 1.43.1. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.43.0...tokio-1.43.1) --- updated-dependencies: - dependency-name: tokio dependency-version: 1.43.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Rust/ohkami/rt_tokio/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/ohkami/rt_tokio/Cargo.lock b/frameworks/Rust/ohkami/rt_tokio/Cargo.lock index 5423ff0e7dd..0c4a16e9d35 100644 --- a/frameworks/Rust/ohkami/rt_tokio/Cargo.lock +++ b/frameworks/Rust/ohkami/rt_tokio/Cargo.lock @@ -1745,9 +1745,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" dependencies = [ "backtrace", "bytes", From d80f33aa5469807b08058e72de3c1f910d1554c3 Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Wed, 9 Apr 2025 00:00:28 +0800 Subject: [PATCH 1362/1766] [C++] paozhu ORM update (#9795) * Paozhu update * Update orm file * [Paozhu] update orm file * update paozhu * update paozhu * [C++ paozhu] update ORM --- .../orm/include/fortune_mysql.h | 350 ++++++++++++++---- .../orm/include/fortunebase.h | 4 +- .../orm/include/world_mysql.h | 350 ++++++++++++++---- .../paozhu_benchmark/orm/include/worldbase.h | 4 +- 4 files changed, 542 insertions(+), 166 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h index e0dc89630ee..083b73125ad 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h @@ -1,6 +1,11 @@ #ifndef _ORM_DEFAULT_FORTUNE_OPERATE_H #define _ORM_DEFAULT_FORTUNE_OPERATE_H - +/* + * @author 黄自权 huangziquan + * @date 2022-05-04 + * @update 2025-03-12 + * @dest ORM MySQL中间连接层 + */ #include #include #include @@ -9311,26 +9316,26 @@ M_MODEL& or_leMessage(T val) } return 0; } - long long insert(typename B_BASE::meta &insert_data) + std::tuple insert(typename B_BASE::meta &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } try { if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); @@ -9355,7 +9360,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9364,7 +9369,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9388,12 +9393,14 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9406,29 +9413,29 @@ M_MODEL& or_leMessage(T val) catch (...) { } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_insert(typename B_BASE::meta &insert_data) + asio::awaitable> async_insert(typename B_BASE::meta &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -9452,7 +9459,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9460,7 +9467,7 @@ M_MODEL& or_leMessage(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9484,12 +9491,14 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + //co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9502,29 +9511,29 @@ M_MODEL& or_leMessage(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - long long insert(std::vector &insert_data) + std::tuple insert(std::vector &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } try { if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -9548,7 +9557,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9557,7 +9566,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9581,12 +9590,14 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9599,29 +9610,29 @@ M_MODEL& or_leMessage(T val) catch (...) { } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_insert(std::vector &insert_data) + asio::awaitable> async_insert(std::vector &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -9645,7 +9656,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9653,7 +9664,7 @@ M_MODEL& or_leMessage(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9676,12 +9687,14 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + //co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9694,29 +9707,29 @@ M_MODEL& or_leMessage(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - long long insert() + std::tuple insert() { effect_num = 0; sqlstring = B_BASE::_makeinsertsql(); if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } try { if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -9740,7 +9753,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9749,7 +9762,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9772,12 +9785,14 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9790,29 +9805,29 @@ M_MODEL& or_leMessage(T val) catch (...) { } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_insert() + asio::awaitable> async_insert() { effect_num = 0; sqlstring = B_BASE::_makeinsertsql(); if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -9836,7 +9851,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9844,7 +9859,7 @@ M_MODEL& or_leMessage(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9868,12 +9883,14 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + //co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9886,10 +9903,10 @@ M_MODEL& or_leMessage(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - long long save(bool isrealnew = false) + std::tuple save(bool isrealnew = false) { effect_num = 0; if (B_BASE::getPK() > 0 && isrealnew == false) @@ -9908,7 +9925,7 @@ M_MODEL& or_leMessage(T val) sqlstring.append(" where "); if (wheresql.empty()) { - return 0; + return std::make_tuple(0, 0); } else { @@ -9929,16 +9946,16 @@ M_MODEL& or_leMessage(T val) if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -9962,7 +9979,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9971,7 +9988,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9998,14 +10015,15 @@ M_MODEL& or_leMessage(T val) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return effect_num; + //return effect_num; + return std::make_tuple(effect_num, 0); } else { sqlstring = B_BASE::_makeinsertsql(); if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -10029,7 +10047,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -10038,7 +10056,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -10062,17 +10080,19 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_save(bool isrealnew = false) + asio::awaitable> async_save(bool isrealnew = false) { effect_num = 0; if (B_BASE::getPK() > 0 && isrealnew == false) @@ -10091,7 +10111,7 @@ M_MODEL& or_leMessage(T val) sqlstring.append(" where "); if (wheresql.empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } else { @@ -10112,19 +10132,19 @@ M_MODEL& or_leMessage(T val) if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -10148,7 +10168,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -10156,7 +10176,7 @@ M_MODEL& or_leMessage(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -10184,12 +10204,13 @@ M_MODEL& or_leMessage(T val) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return effect_num; + co_return std::make_tuple(effect_num, 0); + //co_return effect_num; } catch (const std::exception &e) { error_msg = std::string(e.what()); - co_return 0; + co_return std::make_tuple(0, 0); } catch (const std::string &e) { @@ -10197,9 +10218,9 @@ M_MODEL& or_leMessage(T val) } catch (...) { - co_return 0; + co_return std::make_tuple(0, 0); } - co_return 0; + co_return std::make_tuple(0, 0); } else { @@ -10208,7 +10229,7 @@ M_MODEL& or_leMessage(T val) { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) { @@ -10231,7 +10252,7 @@ M_MODEL& or_leMessage(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -10239,7 +10260,7 @@ M_MODEL& or_leMessage(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -10263,12 +10284,14 @@ M_MODEL& or_leMessage(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); + //co_return insert_last_id; } catch (const std::exception &e) { @@ -10281,9 +10304,9 @@ M_MODEL& or_leMessage(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - co_return 0; + co_return std::make_tuple(0, 0); } std::tuple, std::map, std::vector>> @@ -10733,16 +10756,181 @@ M_MODEL& or_leMessage(T val) } M_MODEL &get() { return *mod; } std::string get_query() { return sqlstring; } - M_MODEL &start_commit() + + M_MODEL &begin_commit() { + if (!conn_empty()) + { + return *mod; + } + islock_conn = true; + + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } + sqlstring="start transaction"; + edit_conn->write_sql(sqlstring); iscommit = true; + + return *mod; } - M_MODEL &end_commit() + M_MODEL &rollback() { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + return *mod; + } + if (!conn_empty()) + { + return *mod; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } + sqlstring="rollback"; + edit_conn->write_sql(sqlstring); + iscommit = false; + islock_conn = false; return *mod; } + M_MODEL &commit() + { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + return *mod; + } + if (!conn_empty()) + { + return *mod; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn =conn_obj->get_edit_conn(); + } + sqlstring="commit"; + edit_conn->write_sql(sqlstring); + + iscommit = false; + islock_conn = false; + return *mod; + } + + + asio::awaitable async_begin_commit() + { + if (!conn_empty()) + { + co_return false; + } + islock_conn = true; + + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + sqlstring="start transaction"; + co_await edit_conn->async_write_sql(sqlstring); + iscommit = true; + + co_return false; + } + asio::awaitable async_rollback() + { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + co_return false; + } + if (!conn_empty()) + { + co_return false; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + sqlstring="rollback"; + co_await edit_conn->async_write_sql(sqlstring); + + iscommit = false; + islock_conn = false; + co_return true; + } + + asio::awaitable async_commit() + { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + co_return false; + } + if (!conn_empty()) + { + co_return false; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + sqlstring="commit"; + co_await edit_conn->async_write_sql(sqlstring); + + iscommit = false; + islock_conn = false; + co_return true; + } unsigned int effect() { diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h index 4c4f331cfc5..69ed9e6577b 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h @@ -1,8 +1,8 @@ #ifndef ORM_DEFAULT_FORTUNEBASEMATA_H #define ORM_DEFAULT_FORTUNEBASEMATA_H /* -*This file is auto create from cli -*本文件为自动生成 Wed, 26 Mar 2025 14:12:09 GMT +*This file is auto create from paozhu_cli +*本文件为自动生成 Tue, 08 Apr 2025 07:55:59 GMT ***/ #include #include diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h index 92e82f65391..f19be184169 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h @@ -1,6 +1,11 @@ #ifndef _ORM_DEFAULT_WORLD_OPERATE_H #define _ORM_DEFAULT_WORLD_OPERATE_H - +/* + * @author 黄自权 huangziquan + * @date 2022-05-04 + * @update 2025-03-12 + * @dest ORM MySQL中间连接层 + */ #include #include #include @@ -9151,26 +9156,26 @@ M_MODEL& or_leRandomnumber(T val) } return 0; } - long long insert(typename B_BASE::meta &insert_data) + std::tuple insert(typename B_BASE::meta &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } try { if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); @@ -9195,7 +9200,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9204,7 +9209,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9228,12 +9233,14 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9246,29 +9253,29 @@ M_MODEL& or_leRandomnumber(T val) catch (...) { } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_insert(typename B_BASE::meta &insert_data) + asio::awaitable> async_insert(typename B_BASE::meta &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -9292,7 +9299,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9300,7 +9307,7 @@ M_MODEL& or_leRandomnumber(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9324,12 +9331,14 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + //co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9342,29 +9351,29 @@ M_MODEL& or_leRandomnumber(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - long long insert(std::vector &insert_data) + std::tuple insert(std::vector &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } try { if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -9388,7 +9397,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9397,7 +9406,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9421,12 +9430,14 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9439,29 +9450,29 @@ M_MODEL& or_leRandomnumber(T val) catch (...) { } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_insert(std::vector &insert_data) + asio::awaitable> async_insert(std::vector &insert_data) { effect_num = 0; sqlstring = B_BASE::_makerecordinsertsql(insert_data); if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -9485,7 +9496,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9493,7 +9504,7 @@ M_MODEL& or_leRandomnumber(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9516,12 +9527,14 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + //co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9534,29 +9547,29 @@ M_MODEL& or_leRandomnumber(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - long long insert() + std::tuple insert() { effect_num = 0; sqlstring = B_BASE::_makeinsertsql(); if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } try { if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -9580,7 +9593,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9589,7 +9602,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9612,12 +9625,14 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9630,29 +9645,29 @@ M_MODEL& or_leRandomnumber(T val) catch (...) { } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_insert() + asio::awaitable> async_insert() { effect_num = 0; sqlstring = B_BASE::_makeinsertsql(); if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -9676,7 +9691,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9684,7 +9699,7 @@ M_MODEL& or_leRandomnumber(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9708,12 +9723,14 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + //co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); } catch (const std::exception &e) { @@ -9726,10 +9743,10 @@ M_MODEL& or_leRandomnumber(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - long long save(bool isrealnew = false) + std::tuple save(bool isrealnew = false) { effect_num = 0; if (B_BASE::getPK() > 0 && isrealnew == false) @@ -9748,7 +9765,7 @@ M_MODEL& or_leRandomnumber(T val) sqlstring.append(" where "); if (wheresql.empty()) { - return 0; + return std::make_tuple(0, 0); } else { @@ -9769,16 +9786,16 @@ M_MODEL& or_leRandomnumber(T val) if (iscommit) { iscommit = false; - return 0; + return std::make_tuple(0, 0); } if (iserror) { - return 0; + return std::make_tuple(0, 0); } if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -9802,7 +9819,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9811,7 +9828,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9838,14 +9855,15 @@ M_MODEL& or_leRandomnumber(T val) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return effect_num; + //return effect_num; + return std::make_tuple(effect_num, 0); } else { sqlstring = B_BASE::_makeinsertsql(); if (conn_empty()) { - return 0; + return std::make_tuple(0, 0); } //auto conn = conn_obj->get_edit_conn(); if (islock_conn) @@ -9869,7 +9887,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9878,7 +9896,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - return 0; + return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -9902,17 +9920,19 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - return insert_last_id; + //return insert_last_id; + return std::make_tuple(effect_num, insert_last_id); } - return 0; + return std::make_tuple(0, 0); } - asio::awaitable async_save(bool isrealnew = false) + asio::awaitable> async_save(bool isrealnew = false) { effect_num = 0; if (B_BASE::getPK() > 0 && isrealnew == false) @@ -9931,7 +9951,7 @@ M_MODEL& or_leRandomnumber(T val) sqlstring.append(" where "); if (wheresql.empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } else { @@ -9952,19 +9972,19 @@ M_MODEL& or_leRandomnumber(T val) if (iscommit) { iscommit = false; - co_return 0; + co_return std::make_tuple(0, 0); } if (iserror) { - co_return 0; + co_return std::make_tuple(0, 0); } try { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) @@ -9988,7 +10008,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -9996,7 +10016,7 @@ M_MODEL& or_leRandomnumber(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -10024,12 +10044,13 @@ M_MODEL& or_leRandomnumber(T val) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return effect_num; + co_return std::make_tuple(effect_num, 0); + //co_return effect_num; } catch (const std::exception &e) { error_msg = std::string(e.what()); - co_return 0; + co_return std::make_tuple(0, 0); } catch (const std::string &e) { @@ -10037,9 +10058,9 @@ M_MODEL& or_leRandomnumber(T val) } catch (...) { - co_return 0; + co_return std::make_tuple(0, 0); } - co_return 0; + co_return std::make_tuple(0, 0); } else { @@ -10048,7 +10069,7 @@ M_MODEL& or_leRandomnumber(T val) { if (conn_empty()) { - co_return 0; + co_return std::make_tuple(0, 0); } if (islock_conn) { @@ -10071,7 +10092,7 @@ M_MODEL& or_leRandomnumber(T val) { error_msg = edit_conn->error_msg; edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } unsigned int offset = 0; @@ -10079,7 +10100,7 @@ M_MODEL& or_leRandomnumber(T val) if (n == 0) { edit_conn.reset(); - co_return 0; + co_return std::make_tuple(0, 0); } pack_info_t temp_pack_data; temp_pack_data.seq_id = 1; @@ -10103,12 +10124,14 @@ M_MODEL& or_leRandomnumber(T val) unsigned int d_offset = 1; effect_num = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); insert_last_id = edit_conn->pack_real_num((unsigned char *)&temp_pack_data.data[0], d_offset); + B_BASE::setPK(insert_last_id); } if (!islock_conn) { conn_obj->back_edit_conn(std::move(edit_conn)); } - co_return insert_last_id; + co_return std::make_tuple(effect_num, insert_last_id); + //co_return insert_last_id; } catch (const std::exception &e) { @@ -10121,9 +10144,9 @@ M_MODEL& or_leRandomnumber(T val) catch (...) { } - co_return 0; + co_return std::make_tuple(0, 0); } - co_return 0; + co_return std::make_tuple(0, 0); } std::tuple, std::map, std::vector>> @@ -10573,16 +10596,181 @@ M_MODEL& or_leRandomnumber(T val) } M_MODEL &get() { return *mod; } std::string get_query() { return sqlstring; } - M_MODEL &start_commit() + + M_MODEL &begin_commit() { + if (!conn_empty()) + { + return *mod; + } + islock_conn = true; + + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } + sqlstring="start transaction"; + edit_conn->write_sql(sqlstring); iscommit = true; + + return *mod; } - M_MODEL &end_commit() + M_MODEL &rollback() { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + return *mod; + } + if (!conn_empty()) + { + return *mod; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn = conn_obj->get_edit_conn(); + } + sqlstring="rollback"; + edit_conn->write_sql(sqlstring); + iscommit = false; + islock_conn = false; return *mod; } + M_MODEL &commit() + { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + return *mod; + } + if (!conn_empty()) + { + return *mod; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = conn_obj->get_edit_conn(); + } + } + else + { + edit_conn =conn_obj->get_edit_conn(); + } + sqlstring="commit"; + edit_conn->write_sql(sqlstring); + + iscommit = false; + islock_conn = false; + return *mod; + } + + + asio::awaitable async_begin_commit() + { + if (!conn_empty()) + { + co_return false; + } + islock_conn = true; + + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + sqlstring="start transaction"; + co_await edit_conn->async_write_sql(sqlstring); + iscommit = true; + + co_return false; + } + asio::awaitable async_rollback() + { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + co_return false; + } + if (!conn_empty()) + { + co_return false; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + sqlstring="rollback"; + co_await edit_conn->async_write_sql(sqlstring); + + iscommit = false; + islock_conn = false; + co_return true; + } + + asio::awaitable async_commit() + { + if(iscommit==false) + { + error_msg = "not begin_commit"; + iserror = true; + co_return false; + } + if (!conn_empty()) + { + co_return false; + } + if (islock_conn) + { + if (!edit_conn) + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + } + else + { + edit_conn = co_await conn_obj->async_get_edit_conn(); + } + sqlstring="commit"; + co_await edit_conn->async_write_sql(sqlstring); + + iscommit = false; + islock_conn = false; + co_return true; + } unsigned int effect() { diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h index dd15e43112e..0101db0f660 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h @@ -1,8 +1,8 @@ #ifndef ORM_DEFAULT_WORLDBASEMATA_H #define ORM_DEFAULT_WORLDBASEMATA_H /* -*This file is auto create from cli -*本文件为自动生成 Wed, 26 Mar 2025 14:12:09 GMT +*This file is auto create from paozhu_cli +*本文件为自动生成 Tue, 08 Apr 2025 07:55:59 GMT ***/ #include #include From d7920aff9a215ff7da21e4cf030ca31239840294 Mon Sep 17 00:00:00 2001 From: Bruce Hamilton <150327496+bjhham@users.noreply.github.com> Date: Tue, 8 Apr 2025 19:00:35 +0200 Subject: [PATCH 1363/1766] Updates and cleanup for Ktor benchmarks (#9790) --- frameworks/Kotlin/ktor/Readme.md | 5 +- frameworks/Kotlin/ktor/benchmark_config.json | 8 +- .../Kotlin/ktor/ktor-asyncdb/build.gradle.kts | 7 +- .../ktor-asyncdb/src/main/kotlin/Models.kt | 10 + .../ktor-asyncdb/src/main/kotlin/Responses.kt | 20 ++ .../ktor/ktor-asyncdb/src/main/kotlin/main.kt | 90 +++----- .../src/main/resources/application.conf | 12 ++ .../src/main/resources/logback.xml | 21 ++ .../ktor/ktor-exposed/app/build.gradle.kts | 2 +- .../ktor-exposed/app/src/main/kotlin/App.kt | 3 +- .../Kotlin/ktor/ktor-pgclient.dockerfile | 2 +- .../Kotlin/ktor/ktor-pgclient/README.md | 12 +- .../ktor/ktor-pgclient/build.gradle.kts | 7 +- .../ktor-pgclient/src/main/kotlin/Models.kt | 10 + .../src/main/kotlin/Responses.kt | 20 ++ .../ktor-pgclient/src/main/kotlin/main.kt | 85 +++----- .../src/main/resources/application.conf | 12 ++ .../src/main/resources/logback.xml | 21 ++ frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml | 9 +- .../org/jetbrains/ktor/benchmarks/Hello.kt | 51 ++--- .../org/jetbrains/ktor/benchmarks/Models.kt | 12 ++ .../jetbrains/ktor/benchmarks/Responses.kt | 22 ++ .../ktor/benchmarks/models/Fortune.kt | 6 - .../ktor/benchmarks/models/Message.kt | 11 - .../jetbrains/ktor/benchmarks/models/World.kt | 6 - frameworks/Kotlin/ktor/ktor/README.md | 2 + frameworks/Kotlin/ktor/ktor/pom.xml | 11 +- .../org/jetbrains/ktor/benchmarks/Database.kt | 32 +++ .../org/jetbrains/ktor/benchmarks/Hello.kt | 203 ------------------ .../org/jetbrains/ktor/benchmarks/Models.kt | 12 ++ .../jetbrains/ktor/benchmarks/Responses.kt | 22 ++ .../org/jetbrains/ktor/benchmarks/main.kt | 151 +++++++++++++ .../ktor/src/main/resources/application.conf | 2 +- 33 files changed, 497 insertions(+), 402 deletions(-) create mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Models.kt create mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Responses.kt create mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/application.conf create mode 100644 frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml create mode 100644 frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Models.kt create mode 100644 frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Responses.kt create mode 100644 frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/application.conf create mode 100644 frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt create mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt delete mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt delete mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt delete mode 100644 frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt create mode 100644 frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Database.kt delete mode 100644 frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt create mode 100644 frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt create mode 100644 frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt create mode 100644 frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/main.kt diff --git a/frameworks/Kotlin/ktor/Readme.md b/frameworks/Kotlin/ktor/Readme.md index 80366c2f893..a0e83a1e29e 100644 --- a/frameworks/Kotlin/ktor/Readme.md +++ b/frameworks/Kotlin/ktor/Readme.md @@ -1,4 +1,7 @@ See subprojects * [Ktor](ktor/) Ktor using traditional JDBC using various servers -* [Ktor-asyncdb](ktor-asyncdb/) Ktor with Netty-based PostgreSQL clients \ No newline at end of file +* [Ktor-jasync](ktor-asyncdb/) Ktor with Netty-based PostgreSQL clients +* [Ktor-r2dbc](ktor-r2dbc/) Ktor with R2DBC for reactive database access +* [Ktor-exposed](ktor-exposed/) Ktor with the Exposed database abstraction library +* [Ktor-pgclient](ktor-pgclient/) Ktor with Reactive PostgreSQL Client \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/benchmark_config.json b/frameworks/Kotlin/ktor/benchmark_config.json index 5a9b1816736..17373df20ee 100644 --- a/frameworks/Kotlin/ktor/benchmark_config.json +++ b/frameworks/Kotlin/ktor/benchmark_config.json @@ -101,7 +101,7 @@ "query_url": "/query/?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", - "port": 8080, + "port": 9090, "approach": "Realistic", "classification": "Fullstack", "database": "Postgres", @@ -125,7 +125,7 @@ "update_url": "/updates?queries=", "fortune_url": "/fortunes", - "port": 8080, + "port": 9090, "approach": "Realistic", "classification": "Micro", "database": "Postgres", @@ -145,7 +145,7 @@ "query_url": "/queries?queries=", "update_url": "/updates?queries=", "fortune_url": "/fortunes", - "port": 8080, + "port": 9090, "approach": "Realistic", "classification": "Micro", "database": "postgres", @@ -164,7 +164,7 @@ "exposed-dao": { "db_url": "/db", "fortune_url": "/fortunes", - "port": 8080, + "port": 9090, "approach": "Realistic", "classification": "Micro", "database": "postgres", diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts index 029a0973171..0622963101a 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle.kts @@ -13,11 +13,11 @@ repositories { } application { - mainClass.set("MainKt") + mainClass = "io.ktor.server.netty.EngineMain" } -val ktor_version = "2.3.12" -val kotlinx_serialization_version = "1.7.3" +val ktor_version = "3.1.2" +val kotlinx_serialization_version = "1.8.1" dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version") @@ -26,6 +26,7 @@ dependencies { implementation("io.ktor:ktor-server-default-headers:$ktor_version") implementation("io.ktor:ktor-server-html-builder:$ktor_version") implementation("com.github.jasync-sql:jasync-postgresql:2.2.4") + implementation("ch.qos.logback:logback-classic:1.5.12") } java { diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Models.kt b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Models.kt new file mode 100644 index 00000000000..72db920aefb --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Models.kt @@ -0,0 +1,10 @@ +import kotlinx.serialization.Serializable + +@Serializable +data class Message(val message: String) + +@Serializable +data class World(val id: Int, var randomNumber: Int) + +@Serializable +data class Fortune(val id: Int, var message: String) \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Responses.kt b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Responses.kt new file mode 100644 index 00000000000..9a1a92b7071 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/Responses.kt @@ -0,0 +1,20 @@ +import io.ktor.http.* +import io.ktor.http.content.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.serialization.json.Json + +// Optimized JSON instance with better performance settings +internal val json = Json { + prettyPrint = false + isLenient = true + ignoreUnknownKeys = true + coerceInputValues = true +} + +internal suspend inline fun RoutingCall.respondJson(response: E) { + respond(TextContent( + json.encodeToString(response), + ContentType.Application.Json + )) +} \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt index e9f4221d8ed..488dced6cec 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt @@ -3,31 +3,16 @@ import com.github.jasync.sql.db.QueryResult import com.github.jasync.sql.db.SuspendingConnection import com.github.jasync.sql.db.asSuspending import com.github.jasync.sql.db.postgresql.PostgreSQLConnectionBuilder -import io.ktor.http.ContentType import io.ktor.server.application.* -import io.ktor.server.engine.embeddedServer import io.ktor.server.html.* -import io.ktor.server.netty.Netty import io.ktor.server.plugins.defaultheaders.* import io.ktor.server.response.* import io.ktor.server.routing.* import kotlinx.coroutines.* import kotlinx.html.* -import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import java.lang.IllegalArgumentException import kotlin.random.Random import kotlin.random.nextInt -@Serializable -data class Message(val message: String) - -@Serializable -data class World(val id: Int, val randomNumber: Int) - -data class Fortune(val id: Int, val message: String) - val rand = Random(1) interface Repository { @@ -121,57 +106,46 @@ class FortuneTemplate(private val fortunes: List, private val main: Mai } } -fun main(args: Array) { - val db = when(args.firstOrNull()) { - "jasync-sql" -> JasyncRepository() - else -> throw IllegalArgumentException("Must specify a postgres client") - } +fun Application.main() { - val server = embeddedServer(Netty, 8080, configure = { - shareWorkGroup = true - }) { - install(DefaultHeaders) - routing { - get("/plaintext") { - call.respondText("Hello, World!") - } + val db = JasyncRepository() - get("/json") { - call.respondText( - Json.encodeToString(Message("Hello, World!")), - ContentType.Application.Json - ) - } + install(DefaultHeaders) + routing { + get("/plaintext") { + call.respondText("Hello, World!") + } - get("/db") { - call.respondText(Json.encodeToString(db.getWorld()), ContentType.Application.Json) - } + get("/json") { + call.respondJson(Message("Hello, World!")) + } - get("/query/") { - val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 - val worlds = (1..queries).map { db.getWorld() } - call.respondText(Json.encodeToString(worlds), ContentType.Application.Json) - } + get("/db") { + call.respondJson(db.getWorld()) + } - get("/fortunes") { - val newFortune = Fortune(0, "Additional fortune added at request time.") - val fortunes = db.getFortunes().toMutableList() - fortunes.add(newFortune) - fortunes.sortBy { it.message } - call.respondHtmlTemplate(FortuneTemplate(fortunes)) { } - } + get("/query/") { + val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 + val worlds = (1..queries).map { db.getWorld() } + call.respondJson(worlds) + } - get("/updates") { - val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 - val worlds = (1..queries).map { db.getWorld() } - val newWorlds = worlds.map { it.copy(randomNumber = rand.nextInt(1..10000)) } + get("/fortunes") { + val newFortune = Fortune(0, "Additional fortune added at request time.") + val fortunes = db.getFortunes().toMutableList() + fortunes.add(newFortune) + fortunes.sortBy { it.message } + call.respondHtmlTemplate(FortuneTemplate(fortunes)) { } + } - db.updateWorlds(newWorlds) + get("/updates") { + val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 + val worlds = (1..queries).map { db.getWorld() } + val newWorlds = worlds.map { it.copy(randomNumber = rand.nextInt(1..10000)) } - call.respondText(Json.encodeToString(newWorlds), ContentType.Application.Json) - } + db.updateWorlds(newWorlds) + + call.respondJson(newWorlds) } } - - server.start(wait = true) } diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/application.conf b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/application.conf new file mode 100644 index 00000000000..ad95fb429f0 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/application.conf @@ -0,0 +1,12 @@ +ktor { + deployment { + port = 9090 + autoreload = false + watch = [ ] + shareWorkGroup = true + } + + application { + modules = [MainKt.main] + } +} diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml new file mode 100644 index 00000000000..9fd0f518971 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml @@ -0,0 +1,21 @@ + + + + %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + true + + + + + + + + + + + + diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts index 63db97d7dd2..56398c64112 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts @@ -9,7 +9,7 @@ repositories { mavenCentral() } -val ktorVersion = "3.1.1" +val ktorVersion = "3.1.2" val kotlinxSerializationVersion = "1.8.0" val exposedVersion = "0.59.0" diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt b/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt index 513a20b7ab7..50ffd37975d 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/src/main/kotlin/App.kt @@ -13,7 +13,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.html.* import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass @@ -70,7 +69,7 @@ enum class ExposedMode { fun main(args: Array) { val exposedMode = valueOf(args.first()) - embeddedServer(Netty, port = 8080) { module(exposedMode) }.start(wait = true) + embeddedServer(Netty, port = 9090) { module(exposedMode) }.start(wait = true) } fun Application.module(exposedMode: ExposedMode) { diff --git a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile index 301f5e55c31..dfee699ede7 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-pgclient.dockerfile @@ -10,6 +10,6 @@ FROM amazoncorretto:21-al2023-headless WORKDIR /app COPY --from=build /app/build/libs/ktor-pgclient.jar ktor-pgclient.jar -EXPOSE 8080 +EXPOSE 9090 CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "ktor-pgclient.jar"] diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/README.md b/frameworks/Kotlin/ktor/ktor-pgclient/README.md index a1e9827a659..024a9950fc6 100755 --- a/frameworks/Kotlin/ktor/ktor-pgclient/README.md +++ b/frameworks/Kotlin/ktor/ktor-pgclient/README.md @@ -7,27 +7,27 @@ The client features batching, pipelining and supports coroutines. ### Plain Text Test - http://localhost:8080/plaintext + http://localhost:9090/plaintext ### JSON Encoding Test - http://localhost:8080/json + http://localhost:9090/json ### Single Query Test - http://localhost:8080/db + http://localhost:9090/db ### Multiple Queries Test - http://localhost:8080/query?queries= + http://localhost:9090/query?queries= ### Database updates Test - http://localhost:8080/updates?queries= + http://localhost:9090/updates?queries= ### Fortunes Test - http://localhost:8080/fortunes + http://localhost:9090/fortunes ## build diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts index 60524844558..c98ef463979 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-pgclient/build.gradle.kts @@ -13,20 +13,21 @@ repositories { } application { - mainClass.set("MainKt") + mainClass = "io.ktor.server.netty.EngineMain" } -val ktor_version = "2.3.12" +val ktor_version = "3.1.2" val vertx_version = "4.5.11" dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1") implementation("io.ktor:ktor-server-netty:$ktor_version") implementation("io.ktor:ktor-server-html-builder-jvm:$ktor_version") implementation("io.ktor:ktor-server-default-headers-jvm:$ktor_version") implementation("io.vertx:vertx-pg-client:$vertx_version") implementation("io.vertx:vertx-lang-kotlin:$vertx_version") implementation("io.vertx:vertx-lang-kotlin-coroutines:$vertx_version") + implementation("ch.qos.logback:logback-classic:1.5.12") } java { diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Models.kt b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Models.kt new file mode 100644 index 00000000000..72db920aefb --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Models.kt @@ -0,0 +1,10 @@ +import kotlinx.serialization.Serializable + +@Serializable +data class Message(val message: String) + +@Serializable +data class World(val id: Int, var randomNumber: Int) + +@Serializable +data class Fortune(val id: Int, var message: String) \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Responses.kt b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Responses.kt new file mode 100644 index 00000000000..9a1a92b7071 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/Responses.kt @@ -0,0 +1,20 @@ +import io.ktor.http.* +import io.ktor.http.content.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.serialization.json.Json + +// Optimized JSON instance with better performance settings +internal val json = Json { + prettyPrint = false + isLenient = true + ignoreUnknownKeys = true + coerceInputValues = true +} + +internal suspend inline fun RoutingCall.respondJson(response: E) { + respond(TextContent( + json.encodeToString(response), + ContentType.Application.Json + )) +} \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt index c8e74244f99..1afafc28fcd 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt +++ b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/kotlin/main.kt @@ -1,32 +1,16 @@ -import io.ktor.http.* import io.ktor.server.application.* -import io.ktor.server.engine.* import io.ktor.server.html.* -import io.ktor.server.netty.* import io.ktor.server.plugins.defaultheaders.* import io.ktor.server.response.* import io.ktor.server.routing.* -import io.vertx.kotlin.coroutines.await import io.vertx.kotlin.coroutines.coAwait 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 kotlinx.html.* -import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json import java.util.concurrent.ThreadLocalRandom -@Serializable -data class Message(val message: String) - -@Serializable -data class World(val id: Int, val randomNumber: Int) - -data class Fortune(val id: Int, val message: String) - val rand: ThreadLocalRandom get() = ThreadLocalRandom.current() @@ -125,54 +109,45 @@ class FortuneTemplate( } } -fun main() { +fun Application.main() { val db = PgclientRepository() - val server = embeddedServer(Netty, 8080, configure = { - shareWorkGroup = true - }) { - install(DefaultHeaders) - routing { - get("/plaintext") { - call.respondText("Hello, World!") - } + install(DefaultHeaders) + routing { + get("/plaintext") { + call.respondText("Hello, World!") + } - get("/json") { - call.respondText( - Json.encodeToString(Message("Hello, World!")), - ContentType.Application.Json - ) - } + get("/json") { + call.respondJson(Message("Hello, World!")) + } - get("/db") { - call.respondText(Json.encodeToString(db.getWorld()), ContentType.Application.Json) - } + get("/db") { + call.respondJson(db.getWorld()) + } - get("/query") { - val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 - val worlds = List(queries) { db.getWorld() } - call.respondText(Json.encodeToString(worlds), ContentType.Application.Json) - } + get("/query") { + val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 + val worlds = List(queries) { db.getWorld() } + call.respondJson(worlds) + } - get("/fortunes") { - val newFortune = Fortune(0, "Additional fortune added at request time.") - val fortunes = db.getFortunes().toMutableList() - fortunes.add(newFortune) - fortunes.sortBy { it.message } - call.respondHtmlTemplate(FortuneTemplate(fortunes)) { } - } + get("/fortunes") { + val newFortune = Fortune(0, "Additional fortune added at request time.") + val fortunes = db.getFortunes().toMutableList() + fortunes.add(newFortune) + fortunes.sortBy { it.message } + call.respondHtmlTemplate(FortuneTemplate(fortunes)) { } + } - get("/updates") { - val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 - val worlds = List(queries) { db.getWorld() } - val newWorlds = worlds.map { it.copy(randomNumber = rand.nextInt(1, 10001)) } + get("/updates") { + val queries = call.parameters["queries"]?.toBoxedInt(1..500) ?: 1 + val worlds = List(queries) { db.getWorld() } + val newWorlds = worlds.map { it.copy(randomNumber = rand.nextInt(1, 10001)) } - db.updateWorlds(newWorlds) + db.updateWorlds(newWorlds) - call.respondText(Json.encodeToString(newWorlds), ContentType.Application.Json) - } + call.respondJson(newWorlds) } } - - server.start(wait = true) } diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/application.conf b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/application.conf new file mode 100644 index 00000000000..ad95fb429f0 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/application.conf @@ -0,0 +1,12 @@ +ktor { + deployment { + port = 9090 + autoreload = false + watch = [ ] + shareWorkGroup = true + } + + application { + modules = [MainKt.main] + } +} diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml new file mode 100644 index 00000000000..9fd0f518971 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml @@ -0,0 +1,21 @@ + + + + %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + true + + + + + + + + + + + + diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml index 75b1efc4cc0..cffd5da8488 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml @@ -14,8 +14,8 @@ 2.1.20 1.10.1 - 3.1.1 - 1.8.0 + 3.1.2 + 1.8.1 0.12.0 UTF-8 1.5.12 @@ -42,6 +42,11 @@ kotlinx-serialization-json ${serialization.version} + + org.jetbrains.kotlinx + kotlinx-serialization-json-io + ${serialization.version} + org.jetbrains.kotlinx kotlinx-html-jvm diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index ac5d03fdbe8..b0a05351157 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -4,7 +4,7 @@ import io.ktor.http.* import io.ktor.http.content.* import io.ktor.server.application.* import io.ktor.server.config.* -import io.ktor.server.html.* +import io.ktor.server.html.respondHtml import io.ktor.server.plugins.defaultheaders.* import io.ktor.server.response.* import io.ktor.server.routing.* @@ -20,35 +20,25 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.reactive.awaitFirst import kotlinx.coroutines.reactive.awaitFirstOrNull import kotlinx.html.* -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import org.jetbrains.ktor.benchmarks.Constants.DB_ROWS -import org.jetbrains.ktor.benchmarks.Constants.FORTUNES_QUERY -import org.jetbrains.ktor.benchmarks.Constants.UPDATE_QUERY -import org.jetbrains.ktor.benchmarks.Constants.WORLD_QUERY -import org.jetbrains.ktor.benchmarks.models.Fortune -import org.jetbrains.ktor.benchmarks.models.Message -import org.jetbrains.ktor.benchmarks.models.World import reactor.core.publisher.Flux import reactor.core.publisher.Mono -import kotlin.random.Random import java.time.Duration +import kotlin.random.Random -private val json = Json { - prettyPrint = false - isLenient = true - ignoreUnknownKeys = true - coerceInputValues = true -} +const val HELLO_WORLD = "Hello, World!" +const val WORLD_QUERY = "SELECT id, randomnumber FROM world WHERE id = $1" +const val FORTUNES_QUERY = "SELECT id, message FROM fortune" +const val UPDATE_QUERY = "UPDATE world SET randomnumber = $1 WHERE id = $2" +const val DB_ROWS = 10000 fun Application.main() { val config = ApplicationConfig("application.conf") val dbConnFactory = configurePostgresR2DBC(config) - install(DefaultHeaders) - val helloWorldContent = TextContent("Hello, World!", ContentType.Text.Plain) - val helloWorldMsg = Message("Hello, world!") + val random = Random.Default + + install(DefaultHeaders) routing { get("/plaintext") { @@ -56,15 +46,14 @@ fun Application.main() { } get("/json") { - call.respondText(json.encodeToString(helloWorldMsg), ContentType.Application.Json) + call.respondJson(Message(HELLO_WORLD)) } get("/db") { - val random = Random.Default val request = getWorld(dbConnFactory, random) val result = request.awaitFirstOrNull() - call.respondText(json.encodeToString(result), ContentType.Application.Json) + call.respondJson(result) } fun selectWorlds(queries: Int, random: Random): Flow = flow { @@ -75,7 +64,6 @@ fun Application.main() { get("/queries") { val queries = call.queries() - val random = Random.Default val result = buildList { selectWorlds(queries, random).collect { @@ -83,7 +71,7 @@ fun Application.main() { } } - call.respondText(json.encodeToString(result), ContentType.Application.Json) + call.respondJson(result) } get("/fortunes") { @@ -124,7 +112,6 @@ fun Application.main() { get("/updates") { val queries = call.queries() - val random = Random.Default val worlds = selectWorlds(queries, random) @@ -144,7 +131,7 @@ fun Application.main() { } } - call.respondText(json.encodeToString(worldsUpdated), ContentType.Application.Json) + call.respondJson(worldsUpdated) } } } @@ -194,12 +181,4 @@ private fun configurePostgresR2DBC(config: ApplicationConfig): ConnectionFactory return ConnectionPool(cp) } -private fun ApplicationCall.queries() = request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 - - -object Constants { - const val WORLD_QUERY = "SELECT id, randomnumber FROM world WHERE id = $1" - const val FORTUNES_QUERY = "SELECT id, message FROM fortune" - const val UPDATE_QUERY = "UPDATE world SET randomnumber = $1 WHERE id = $2" - const val DB_ROWS = 10000 -} +private fun ApplicationCall.queries() = request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt new file mode 100644 index 00000000000..b4325257282 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt @@ -0,0 +1,12 @@ +package org.jetbrains.ktor.benchmarks + +import kotlinx.serialization.Serializable + +@Serializable +data class Message(val message: String) + +@Serializable +data class World(val id: Int, var randomNumber: Int) + +@Serializable +data class Fortune(val id: Int, var message: String) \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt new file mode 100644 index 00000000000..07f21a06cf0 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt @@ -0,0 +1,22 @@ +package org.jetbrains.ktor.benchmarks + +import io.ktor.http.* +import io.ktor.http.content.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.serialization.json.Json + +// Optimized JSON instance with better performance settings +internal val json = Json { + prettyPrint = false + isLenient = true + ignoreUnknownKeys = true + coerceInputValues = true +} + +internal suspend inline fun RoutingCall.respondJson(response: E) { + respond(TextContent( + json.encodeToString(response), + ContentType.Application.Json + )) +} \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt deleted file mode 100644 index 9484e01ab95..00000000000 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Fortune.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.jetbrains.ktor.benchmarks.models - -import kotlinx.serialization.Serializable - -@Serializable -data class Fortune(val id: Int, var message: String) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt deleted file mode 100644 index 916169fbaf8..00000000000 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/Message.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.jetbrains.ktor.benchmarks.models - -import kotlinx.serialization.Serializable - -@Serializable -data class Message(val message: String) - -// Cache common messages to reduce allocations -object MessageCache { - val helloWorld = Message("Hello, world!") -} diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt deleted file mode 100644 index 8b44731ccdf..00000000000 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/models/World.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.jetbrains.ktor.benchmarks.models - -import kotlinx.serialization.Serializable - -@Serializable -data class World(val id: Int, var randomNumber: Int) diff --git a/frameworks/Kotlin/ktor/ktor/README.md b/frameworks/Kotlin/ktor/ktor/README.md index 31f2755e24c..02a13760b07 100644 --- a/frameworks/Kotlin/ktor/ktor/README.md +++ b/frameworks/Kotlin/ktor/ktor/README.md @@ -39,6 +39,8 @@ Please note that the server holds tty so you may need nohup. See `setup.sh` for [Leonid Stashevsky](https://github.com/e5l) +[Bruce Hamilton](https://github.com/bjhham) + [Sergey Mashkov](https://github.com/cy6erGn0m) [Ilya Ryzhenkov](https://github.com/orangy) diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 93c927a496c..1ae4aa0b3d5 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -13,12 +13,12 @@ 2.1.20 - 3.1.1 - 1.8.0 + 3.1.2 + 1.8.1 0.12.0 UTF-8 5.1.0 - 1.2.13 + 1.5.12 8.0.33 42.7.4 @@ -39,6 +39,11 @@ kotlinx-serialization-json ${serialization.version} + + org.jetbrains.kotlinx + kotlinx-serialization-json-io + ${serialization.version} + org.jetbrains.kotlinx kotlinx-html-jvm diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Database.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Database.kt new file mode 100644 index 00000000000..ee57ad5126d --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Database.kt @@ -0,0 +1,32 @@ +package org.jetbrains.ktor.benchmarks + +import com.zaxxer.hikari.HikariConfig + +fun HikariConfig.configurePostgres(poolSize: Int) { + jdbcUrl = "jdbc:postgresql://tfb-database/hello_world?useSSL=false" + driverClassName = org.postgresql.Driver::class.java.name + configureCommon(poolSize) +} + +fun HikariConfig.configureCommon(poolSize: Int) { + username = "benchmarkdbuser" + password = "benchmarkdbpass" + addDataSourceProperty("cacheServerConfiguration", true) + addDataSourceProperty("cachePrepStmts", "true") + addDataSourceProperty("useUnbufferedInput", "false") + addDataSourceProperty("prepStmtCacheSize", "4096") + addDataSourceProperty("prepStmtCacheSqlLimit", "2048") + connectionTimeout = 5000 + maximumPoolSize = poolSize + minimumIdle = poolSize + idleTimeout = 300000 // 5 minutes + maxLifetime = 600000 // 10 minutes + validationTimeout = 5000 + leakDetectionThreshold = 60000 +} + +fun HikariConfig.configureMySql(poolSize: Int) { + jdbcUrl = "jdbc:mysql://tfb-database:3306/hello_world?useSSL=false" + driverClassName = com.mysql.jdbc.Driver::class.java.name + configureCommon(poolSize) +} \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt deleted file mode 100644 index 17e8a8d8429..00000000000 --- a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ /dev/null @@ -1,203 +0,0 @@ -package org.jetbrains.ktor.benchmarks - -import com.zaxxer.hikari.HikariConfig -import com.zaxxer.hikari.HikariDataSource -import io.ktor.http.* -import io.ktor.http.content.* -import io.ktor.server.application.* -import io.ktor.server.html.* -import io.ktor.server.plugins.defaultheaders.* -import io.ktor.server.response.* -import io.ktor.server.routing.* -import kotlinx.coroutines.* -import kotlinx.html.* -import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import org.jetbrains.ktor.benchmarks.Constants.FORTUNES_QUERY -import org.jetbrains.ktor.benchmarks.Constants.UPDATE_QUERY -import org.jetbrains.ktor.benchmarks.Constants.WORLD_QUERY -import java.sql.Connection -import java.util.concurrent.ThreadLocalRandom -import kotlin.random.Random -import kotlinx.serialization.Contextual - -@Serializable -data class Message(val message: String) - -@Serializable -data class World(val id: Int, var randomNumber: Int) - -@Serializable -data class Fortune(val id: Int, var message: String) - -// Optimized JSON instance with better performance settings -private val json = Json { - prettyPrint = false - isLenient = true - ignoreUnknownKeys = true - coerceInputValues = true -} - -fun Application.main() { - val dbRows = 10000 - val poolSize = Runtime.getRuntime().availableProcessors() * 2 - val pool = HikariDataSource(HikariConfig().apply { configurePostgres(poolSize) }) - - // Create a dedicated dispatcher for database operations - val databaseDispatcher = Dispatchers.IO.limitedParallelism(poolSize) - - install(DefaultHeaders) - - val helloWorldContent = TextContent("Hello, World!", ContentType.Text.Plain) - val jsonResponse = json.encodeToString(Message("Hello, world!")) - - routing { - get("/plaintext") { - call.respond(helloWorldContent) - } - - get("/json") { - call.respondText(jsonResponse, ContentType.Application.Json) - } - - get("/db") { - val random = Random.Default - - val world = withContext(databaseDispatcher) { - pool.connection.use { connection -> - connection.prepareStatement(WORLD_QUERY).use { statement -> - statement.setInt(1, random.nextInt(dbRows) + 1) - statement.executeQuery().use { rs -> - rs.next() - World(rs.getInt(1), rs.getInt(2)) - } - } - } - } - - call.respondText(json.encodeToString(world), ContentType.Application.Json) - } - - fun Connection.selectWorlds(queries: Int, random: Random): List { - val result = ArrayList(queries) - prepareStatement(WORLD_QUERY).use { statement -> - repeat(queries) { - statement.setInt(1, random.nextInt(dbRows) + 1) - statement.executeQuery().use { rs -> - rs.next() - result += World(rs.getInt(1), rs.getInt(2)) - } - } - } - return result - } - - get("/queries") { - val queries = call.queries() - val random = Random.Default - - val result = withContext(databaseDispatcher) { - pool.connection.use { it.selectWorlds(queries, random) } - } - - call.respondText(json.encodeToString(result), ContentType.Application.Json) - } - - get("/fortunes") { - val result = mutableListOf() - withContext(databaseDispatcher) { - pool.connection.use { connection -> - connection.prepareStatement(FORTUNES_QUERY).use { statement -> - statement.executeQuery().use { rs -> - while (rs.next()) { - result += Fortune(rs.getInt(1), rs.getString(2)) - } - } - } - } - } - result.add(Fortune(0, "Additional fortune added at request time.")) - result.sortBy { it.message } - call.respondHtml { - head { title { +"Fortunes" } } - body { - table { - tr { - th { +"id" } - th { +"message" } - } - for (fortune in result) { - tr { - td { +fortune.id.toString() } - td { +fortune.message } - } - } - } - } - } - } - - get("/updates") { - val queries = call.queries() - val random = Random.Default - val result: List - - withContext(databaseDispatcher) { - pool.connection.use { connection -> - result = connection.selectWorlds(queries, random) - result.forEach { it.randomNumber = random.nextInt(dbRows) + 1 } - - connection.prepareStatement(UPDATE_QUERY).use { updateStatement -> - for ((id, randomNumber) in result) { - updateStatement.setInt(1, randomNumber) - updateStatement.setInt(2, id) - updateStatement.addBatch() - } - updateStatement.executeBatch() - } - } - } - - call.respondText(json.encodeToString(result), ContentType.Application.Json) - } - } -} - -fun HikariConfig.configurePostgres(poolSize: Int) { - jdbcUrl = "jdbc:postgresql://tfb-database/hello_world?useSSL=false" - driverClassName = org.postgresql.Driver::class.java.name - configureCommon(poolSize) -} - -fun HikariConfig.configureCommon(poolSize: Int) { - username = "benchmarkdbuser" - password = "benchmarkdbpass" - addDataSourceProperty("cacheServerConfiguration", true) - addDataSourceProperty("cachePrepStmts", "true") - addDataSourceProperty("useUnbufferedInput", "false") - addDataSourceProperty("prepStmtCacheSize", "4096") - addDataSourceProperty("prepStmtCacheSqlLimit", "2048") - connectionTimeout = 5000 - maximumPoolSize = poolSize - minimumIdle = poolSize - idleTimeout = 300000 // 5 minutes - maxLifetime = 600000 // 10 minutes - validationTimeout = 5000 - leakDetectionThreshold = 60000 -} - -fun HikariConfig.configureMySql(poolSize: Int) { - jdbcUrl = "jdbc:mysql://tfb-database:3306/hello_world?useSSL=false" - driverClassName = com.mysql.jdbc.Driver::class.java.name - configureCommon(poolSize) -} - -fun ApplicationCall.queries() = - request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 - -object Constants { - const val WORLD_QUERY = "SELECT id, randomNumber FROM World WHERE id = ?" - const val FORTUNES_QUERY = "SELECT id, message FROM fortune" - const val UPDATE_QUERY = "UPDATE World SET randomNumber = ? WHERE id = ?" -} \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt new file mode 100644 index 00000000000..b4325257282 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Models.kt @@ -0,0 +1,12 @@ +package org.jetbrains.ktor.benchmarks + +import kotlinx.serialization.Serializable + +@Serializable +data class Message(val message: String) + +@Serializable +data class World(val id: Int, var randomNumber: Int) + +@Serializable +data class Fortune(val id: Int, var message: String) \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt new file mode 100644 index 00000000000..07f21a06cf0 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Responses.kt @@ -0,0 +1,22 @@ +package org.jetbrains.ktor.benchmarks + +import io.ktor.http.* +import io.ktor.http.content.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.serialization.json.Json + +// Optimized JSON instance with better performance settings +internal val json = Json { + prettyPrint = false + isLenient = true + ignoreUnknownKeys = true + coerceInputValues = true +} + +internal suspend inline fun RoutingCall.respondJson(response: E) { + respond(TextContent( + json.encodeToString(response), + ContentType.Application.Json + )) +} \ No newline at end of file diff --git a/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/main.kt b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/main.kt new file mode 100644 index 00000000000..eea3566b953 --- /dev/null +++ b/frameworks/Kotlin/ktor/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/main.kt @@ -0,0 +1,151 @@ +package org.jetbrains.ktor.benchmarks + +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource +import io.ktor.http.* +import io.ktor.http.content.* +import io.ktor.server.application.* +import io.ktor.server.html.respondHtml +import io.ktor.server.plugins.defaultheaders.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.withContext +import kotlinx.html.* +import java.sql.Connection +import java.util.StringJoiner +import kotlin.random.Random + +const val HELLO_WORLD = "Hello, World!" +const val WORLD_QUERY = "SELECT id, randomNumber FROM World WHERE id = ?" +const val FORTUNES_QUERY = "SELECT id, message FROM fortune" +const val DB_ROWS = 10_000 + +@OptIn(ExperimentalCoroutinesApi::class) +fun Application.main() { + val poolSize = Runtime.getRuntime().availableProcessors() * 2 + val pool = HikariDataSource(HikariConfig().apply { configurePostgres(poolSize) }) + + // Create a dedicated dispatcher for database operations + val databaseDispatcher = Dispatchers.IO.limitedParallelism(poolSize) + val helloWorldContent = TextContent(HELLO_WORLD, ContentType.Text.Plain) + val random = Random.Default + + install(DefaultHeaders) + + routing { + get("/plaintext") { + call.respond(helloWorldContent) + } + + get("/json") { + call.respondJson(Message(HELLO_WORLD)) + } + + get("/db") { + val world = withContext(databaseDispatcher) { + pool.connection.use { connection -> + connection.prepareStatement(WORLD_QUERY).use { statement -> + statement.setInt(1, random.nextInt(DB_ROWS) + 1) + statement.executeQuery().use { rs -> + rs.next() + World(rs.getInt(1), rs.getInt(2)) + } + } + } + } + call.respondJson(world) + } + + fun Connection.selectWorlds(queries: Int): Array = + prepareStatement(WORLD_QUERY).use { statement -> + Array(queries) { i -> + statement.setInt(1, random.nextInt(DB_ROWS) + 1) + statement.executeQuery().use { rs -> + rs.next() + World(rs.getInt(1), rs.getInt(2)) + } + } + } + + get("/queries") { + val queries = call.queries() + val result = withContext(databaseDispatcher) { + pool.connection.use { it.selectWorlds(queries) } + } + call.respondJson(result) + } + + get("/fortunes") { + val result = mutableListOf() + withContext(databaseDispatcher) { + pool.connection.use { connection -> + connection.prepareStatement(FORTUNES_QUERY).use { statement -> + statement.executeQuery().use { rs -> + while (rs.next()) { + result += Fortune(rs.getInt(1), rs.getString(2)) + } + } + } + } + } + result.add(Fortune(0, "Additional fortune added at request time.")) + result.sortBy { it.message } + call.respondHtml { + head { title { +"Fortunes" } } + body { + table { + tr { + th { +"id" } + th { +"message" } + } + for (fortune in result) { + tr { + td { +fortune.id.toString() } + td { +fortune.message } + } + } + } + } + } + } + + get("/updates") { + val queries = call.queries() + val result: Array + + withContext(databaseDispatcher) { + pool.connection.use { connection -> + result = connection.selectWorlds(queries) + + val updateSql = StringJoiner( + ", ", + "UPDATE World SET randomNumber = temp.randomNumber FROM (VALUES ", + " ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = World.id" + ) + + for (i in result.indices) { + result[i].randomNumber = random.nextInt(DB_ROWS) + 1 + updateSql.add("(?, ?)") + } + + connection.prepareStatement(updateSql.toString()).use { statement -> + var paramIndex = 0 + for (world in result) { + statement.setInt(++paramIndex, world.id) + statement.setInt(++paramIndex, world.randomNumber) + } + statement.executeUpdate() + } + } + } + + call.respondJson(result) + } + } +} + + +fun ApplicationCall.queries() = + request.queryParameters["queries"]?.toIntOrNull()?.coerceIn(1, 500) ?: 1 diff --git a/frameworks/Kotlin/ktor/ktor/src/main/resources/application.conf b/frameworks/Kotlin/ktor/ktor/src/main/resources/application.conf index 8faba62906a..ad26f4f1ddc 100644 --- a/frameworks/Kotlin/ktor/ktor/src/main/resources/application.conf +++ b/frameworks/Kotlin/ktor/ktor/src/main/resources/application.conf @@ -7,6 +7,6 @@ ktor { } application { - modules = [ org.jetbrains.ktor.benchmarks.HelloKt.main ] + modules = [org.jetbrains.ktor.benchmarks.MainKt.main] } } From 22a6a52350d5cf2cec7a58eb32511d4b5f2a7a2f Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Tue, 8 Apr 2025 18:01:02 +0100 Subject: [PATCH 1364/1766] [aiohttp] Tweaks (#9783) * [aiohttp] Tweaks * Rename aiohttp.dockerfile to aiohttp-orm.dockerfile * Rename aiohttp-pg-raw.dockerfile to aiohttp.dockerfile * Update benchmark_config.json * Update config.toml * Update benchmark_config.json * Update requirements.txt * Update frameworks/Python/aiohttp/requirements.txt * Update config.toml * Update benchmark_config.json * Update views.py * Update views.py * Update views.py * Update views.py * Update views.py * Update main.py * Update views.py * Update views.py * Update views.py * Update views.py * Update views.py * Update views.py * Update views.py * aiohtp orm use bindparam --------- Co-authored-by: s_kovalev --- ...-raw.dockerfile => aiohttp-orm.dockerfile} | 2 +- frameworks/Python/aiohttp/aiohttp.dockerfile | 2 +- frameworks/Python/aiohttp/app/main.py | 4 +- frameworks/Python/aiohttp/app/views.py | 71 ++++++++++++------- .../Python/aiohttp/benchmark_config.json | 12 ++-- frameworks/Python/aiohttp/config.toml | 6 +- frameworks/Python/aiohttp/requirements.txt | 2 +- 7 files changed, 58 insertions(+), 41 deletions(-) rename frameworks/Python/aiohttp/{aiohttp-pg-raw.dockerfile => aiohttp-orm.dockerfile} (91%) diff --git a/frameworks/Python/aiohttp/aiohttp-pg-raw.dockerfile b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile similarity index 91% rename from frameworks/Python/aiohttp/aiohttp-pg-raw.dockerfile rename to frameworks/Python/aiohttp/aiohttp-orm.dockerfile index f6dda6f5ef5..fe1648e3ff4 100644 --- a/frameworks/Python/aiohttp/aiohttp-pg-raw.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile @@ -7,7 +7,7 @@ WORKDIR aiohttp RUN pip3 install cython==3.0.11 && \ pip3 install -r /aiohttp/requirements.txt -ENV CONNECTION=RAW +WORKDIR /aiohttp EXPOSE 8080 diff --git a/frameworks/Python/aiohttp/aiohttp.dockerfile b/frameworks/Python/aiohttp/aiohttp.dockerfile index fe1648e3ff4..f6dda6f5ef5 100644 --- a/frameworks/Python/aiohttp/aiohttp.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp.dockerfile @@ -7,7 +7,7 @@ WORKDIR aiohttp RUN pip3 install cython==3.0.11 && \ pip3 install -r /aiohttp/requirements.txt -WORKDIR /aiohttp +ENV CONNECTION=RAW EXPOSE 8080 diff --git a/frameworks/Python/aiohttp/app/main.py b/frameworks/Python/aiohttp/app/main.py index 30680138c33..6ed65ed19d7 100644 --- a/frameworks/Python/aiohttp/app/main.py +++ b/frameworks/Python/aiohttp/app/main.py @@ -64,13 +64,13 @@ async def db_ctx(app: web.Application): def setup_routes(app): if CONNECTION_ORM: - app.router.add_get('/json', json) app.router.add_get('/db', single_database_query_orm) app.router.add_get('/queries/{queries:.*}', multiple_database_queries_orm) app.router.add_get('/fortunes', fortunes) app.router.add_get('/updates/{queries:.*}', updates) - app.router.add_get('/plaintext', plaintext) else: + app.router.add_get('/json', json) + app.router.add_get('/plaintext', plaintext) app.router.add_get('/db', single_database_query_raw) app.router.add_get('/queries/{queries:.*}', multiple_database_queries_raw) app.router.add_get('/fortunes', fortunes_raw) diff --git a/frameworks/Python/aiohttp/app/views.py b/frameworks/Python/aiohttp/app/views.py index ef2b04ed7bc..932969ed23d 100644 --- a/frameworks/Python/aiohttp/app/views.py +++ b/frameworks/Python/aiohttp/app/views.py @@ -1,19 +1,37 @@ +import random from operator import attrgetter, itemgetter from pathlib import Path -from random import randint, sample +import aiohttp.web import jinja2 +import sqlalchemy +import sqlalchemy.orm import orjson -from aiohttp.web import Response -from sqlalchemy import select -from sqlalchemy.orm.attributes import flag_modified -from .models import sa_fortunes, sa_worlds, Fortune, World +from . import models + +# In current versions of Python (tested 3.9 and 3.12), from ... import ... +# creates variables that are atleast 4x slower to reference: +# > python3 -m timeit 'from random import sample' 'sample' +# 500000 loops, best of 5: 823 nsec per loop +# > python3 -m timeit 'import random' 'random.sample' +# 2000000 loops, best of 5: 161 nsec per loop +# > python3 -m timeit 'import random; sample = random.sample' 'sample' +# 2000000 loops, best of 5: 161 nsec per loop +dumps = orjson.dumps +randint = random.randint +sample = random.sample +Response = aiohttp.web.Response +select = sqlalchemy.select +flag_modified = sqlalchemy.orm.attributes.flag_modified +Fortune = models.Fortune +World = models.World ADDITIONAL_FORTUNE_ORM = Fortune(id=0, message='Additional fortune added at request time.') ADDITIONAL_FORTUNE_ROW = {'id': 0, 'message': 'Additional fortune added at request time.'} READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' -READ_SELECT_ORM = select(World.randomnumber) +READ_SELECT_ORM = select(World.randomnumber).where(World.id == sqlalchemy.bindparam("id")) +READ_FORTUNES_ORM = select(Fortune.id, Fortune.message) WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$2 WHERE id=$1' template_path = Path(__file__).parent / 'templates' / 'fortune.jinja' @@ -33,12 +51,14 @@ def get_num_queries(request): return 500 return num_queries + def json_response(payload): return Response( - body=orjson.dumps(payload), + body=dumps(payload), content_type="application/json", ) + async def json(request): """ Test 1 @@ -52,7 +72,7 @@ async def single_database_query_orm(request): """ id_ = randint(1, 10000) async with request.app['db_session']() as sess: - num = await sess.scalar(select(World.randomnumber).filter_by(id=id_)) + num = await sess.scalar(READ_SELECT_ORM, {"id": id_}) return json_response({'id': id_, 'randomNumber': num}) @@ -78,7 +98,7 @@ async def multiple_database_queries_orm(request): result = [] async with request.app['db_session']() as sess: for id_ in ids: - num = await sess.scalar(READ_SELECT_ORM.where(World.id == id_)) + num = await sess.scalar(READ_SELECT_ORM, {"id": id_}) result.append({'id': id_, 'randomNumber': num}) return json_response(result) @@ -107,7 +127,7 @@ async def fortunes(request): Test 4 ORM """ async with request.app['db_session']() as sess: - ret = await sess.execute(select(Fortune.id, Fortune.message)) + ret = await sess.execute(READ_FORTUNES_ORM) fortunes = ret.all() fortunes.append(ADDITIONAL_FORTUNE_ORM) fortunes.sort(key=sort_fortunes_orm) @@ -132,21 +152,18 @@ async def updates(request): Test 5 ORM """ num_queries = get_num_queries(request) - - ids = sample(range(1, 10000 + 1), num_queries) - ids.sort() - worlds = [] + update_ids = sample(range(1, 10001), num_queries) + update_ids.sort() + updates = tuple(zip(update_ids, sample(range(1, 10001), num_queries))) + worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] async with request.app['db_session'].begin() as sess: - for row_id in ids: - random_number = randint(1, 10000) - world = await sess.get(World, row_id, populate_existing=True) - world.randomnumber = random_number - # force sqlalchemy to UPDATE entry even if the value has not changed - # doesn't make sense in a real application, added only for pass `tfb verify` + for id_, number in updates: + world = await sess.get(World, id_, populate_existing=True) + world.randomnumber = number + # Force sqlalchemy to UPDATE entry even if the value has not changed + # doesn't make sense in a real application, added only to pass tests. flag_modified(world, "randomnumber") - worlds.append({'id': row_id, 'randomNumber': random_number}) - return json_response(worlds) async def updates_raw(request): @@ -154,16 +171,16 @@ async def updates_raw(request): Test 5 RAW """ num_queries = get_num_queries(request) - ids = sample(range(1, 10000 + 1), num_queries) - ids.sort() - updates = [(row_id, randint(1, 10000)) for row_id in ids] + update_ids = sample(range(1, 10001), num_queries) + update_ids.sort() + updates = tuple(zip(update_ids, sample(range(1, 10001), num_queries))) worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] async with request.app['pg'].acquire() as conn: stmt = await conn.prepare(READ_ROW_SQL) - for row_id in ids: + for id_, _ in updates: # the result of this is the int previous random number which we don't actually use - await stmt.fetchval(row_id) + await stmt.fetchval(id_) await conn.executemany(WRITE_ROW_SQL, updates) return json_response(worlds) diff --git a/frameworks/Python/aiohttp/benchmark_config.json b/frameworks/Python/aiohttp/benchmark_config.json index dad6b2fcc87..ab4257e12bf 100644 --- a/frameworks/Python/aiohttp/benchmark_config.json +++ b/frameworks/Python/aiohttp/benchmark_config.json @@ -15,15 +15,15 @@ "framework": "aiohttp", "language": "Python", "flavor": "Python3", - "orm": "Full", + "orm": "Raw", "platform": "asyncio", "webserver": "gunicorn", "os": "Linux", "database_os": "Linux", "display_name": "aiohttp", - "notes": "uses aiopg with sqlalchemy for database access" + "notes": "uses asyncpg for database access" }, - "pg-raw": { + "orm": { "db_url": "/db", "query_url": "/queries/", "fortune_url": "/fortunes", @@ -35,13 +35,13 @@ "framework": "aiohttp", "language": "Python", "flavor": "Python3", - "orm": "Raw", + "orm": "Full", "platform": "asyncio", "webserver": "gunicorn", "os": "Linux", "database_os": "Linux", - "display_name": "aiohttp-pg-raw", - "notes": "uses asyncpg for database access", + "display_name": "aiohttp-orm", + "notes": "uses sqlalchemy for database access", "versus": "default" } }] diff --git a/frameworks/Python/aiohttp/config.toml b/frameworks/Python/aiohttp/config.toml index d22b4c5bcc2..dd9088e497d 100644 --- a/frameworks/Python/aiohttp/config.toml +++ b/frameworks/Python/aiohttp/config.toml @@ -13,12 +13,12 @@ classification = "Micro" database = "Postgres" database_os = "Linux" os = "Linux" -orm = "Full" +orm = "Raw" platform = "asyncio" webserver = "gunicorn" versus = "None" -[pg-raw] +[orm] urls.db = "/db" urls.query = "/queries/" urls.update = "/updates/" @@ -28,7 +28,7 @@ classification = "Micro" database = "Postgres" database_os = "Linux" os = "Linux" -orm = "Raw" +orm = "Full" platform = "asyncio" webserver = "gunicorn" versus = "default" diff --git a/frameworks/Python/aiohttp/requirements.txt b/frameworks/Python/aiohttp/requirements.txt index aec2ed27c64..99681a2600a 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -2,6 +2,6 @@ aiohttp==3.11.16 asyncpg==0.30.0 gunicorn==23.0.0 jinja2==3.1.6 -SQLAlchemy==2.0.39 +SQLAlchemy==2.0.40 orjson==3.10.16 uvloop==0.21.0 From 373d13ad5915bcce0e02f03c5959dd265ce27699 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 10:02:28 -0700 Subject: [PATCH 1365/1766] Bump tokio from 1.29.1 to 1.44.2 in /frameworks/Rust/actix (#9793) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.29.1 to 1.44.2. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.29.1...tokio-1.44.2) --- updated-dependencies: - dependency-name: tokio dependency-version: 1.44.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Rust/actix/Cargo.lock | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/frameworks/Rust/actix/Cargo.lock b/frameworks/Rust/actix/Cargo.lock index 321ff2870fa..319b6121912 100644 --- a/frameworks/Rust/actix/Cargo.lock +++ b/frameworks/Rust/actix/Cargo.lock @@ -130,7 +130,7 @@ dependencies = [ "actix-utils", "futures-core", "futures-util", - "mio", + "mio 0.8.8", "num_cpus", "socket2 0.4.9", "tokio", @@ -1811,6 +1811,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + [[package]] name = "mongodb" version = "3.2.1" @@ -2816,29 +2827,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", - "mio", - "num_cpus", + "mio 1.0.3", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.4.9", + "socket2 0.5.8", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", From 39d73f17d31595e14d212bc562e238e10efec5e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 10:11:00 -0700 Subject: [PATCH 1366/1766] Bump tokio from 1.36.0 to 1.44.2 in /frameworks/Rust/rocket (#9794) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.36.0 to 1.44.2. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.36.0...tokio-1.44.2) --- updated-dependencies: - dependency-name: tokio dependency-version: 1.44.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Rust/rocket/Cargo.lock | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index 68a60d48670..e42bcbef9fa 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -989,6 +989,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.52.0", +] + [[package]] name = "multer" version = "2.1.0" @@ -1053,7 +1064,7 @@ dependencies = [ "kqueue", "libc", "log", - "mio", + "mio 0.8.10", "walkdir", "windows-sys 0.48.0", ] @@ -2207,27 +2218,26 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", "libc", - "mio", - "num_cpus", + "mio 1.0.3", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", From 07f447efcbf121dcc6a9d30ca98f9e966a4a4e4b Mon Sep 17 00:00:00 2001 From: vividsnow Date: Thu, 10 Apr 2025 18:18:22 +0300 Subject: [PATCH 1367/1766] [perl/feersum] bump dependency (#9799) --- frameworks/Perl/feersum/cpanfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Perl/feersum/cpanfile b/frameworks/Perl/feersum/cpanfile index 12b329a825a..02a462a22e4 100644 --- a/frameworks/Perl/feersum/cpanfile +++ b/frameworks/Perl/feersum/cpanfile @@ -1,8 +1,8 @@ -requires 'Feersum', '== 1.504'; +requires 'Feersum', '== 1.505'; requires 'JSON::XS', '== 4.03'; requires 'DBD::MariaDB', '== 1.23'; requires 'DBD::Pg', '== 3.18.0'; requires 'AnyEvent', '== 7.17'; requires 'Async::Interrupt', '== 1.26'; requires 'Text::Xslate', '== v3.5.9'; -requires 'LMDB_File', '== 0.13'; +requires 'LMDB_File', '== 0.14'; From fd07befd5651523c594840a1f980fdf5245a8a6b Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Thu, 10 Apr 2025 16:19:12 +0100 Subject: [PATCH 1368/1766] [aiohttp] Revert globals (#9798) --- frameworks/Python/aiohttp/app/views.py | 33 +++++++------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/frameworks/Python/aiohttp/app/views.py b/frameworks/Python/aiohttp/app/views.py index 932969ed23d..c5e76da736f 100644 --- a/frameworks/Python/aiohttp/app/views.py +++ b/frameworks/Python/aiohttp/app/views.py @@ -1,36 +1,19 @@ -import random from operator import attrgetter, itemgetter from pathlib import Path +from random import randint, sample -import aiohttp.web import jinja2 -import sqlalchemy -import sqlalchemy.orm -import orjson - -from . import models - -# In current versions of Python (tested 3.9 and 3.12), from ... import ... -# creates variables that are atleast 4x slower to reference: -# > python3 -m timeit 'from random import sample' 'sample' -# 500000 loops, best of 5: 823 nsec per loop -# > python3 -m timeit 'import random' 'random.sample' -# 2000000 loops, best of 5: 161 nsec per loop -# > python3 -m timeit 'import random; sample = random.sample' 'sample' -# 2000000 loops, best of 5: 161 nsec per loop -dumps = orjson.dumps -randint = random.randint -sample = random.sample -Response = aiohttp.web.Response -select = sqlalchemy.select -flag_modified = sqlalchemy.orm.attributes.flag_modified -Fortune = models.Fortune -World = models.World +from aiohttp.web import Response +from orjson import dumps +from sqlalchemy import bindparam, select +from sqlalchemy.orm.attributes import flag_modified + +from .models import Fortune, World ADDITIONAL_FORTUNE_ORM = Fortune(id=0, message='Additional fortune added at request time.') ADDITIONAL_FORTUNE_ROW = {'id': 0, 'message': 'Additional fortune added at request time.'} READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' -READ_SELECT_ORM = select(World.randomnumber).where(World.id == sqlalchemy.bindparam("id")) +READ_SELECT_ORM = select(World.randomnumber).where(World.id == bindparam("id")) READ_FORTUNES_ORM = select(Fortune.id, Fortune.message) WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$2 WHERE id=$1' From 7d7f2238ca67330952c6c624d6992ca4a1c23b0a Mon Sep 17 00:00:00 2001 From: Sergey Kovalev Date: Thu, 10 Apr 2025 19:20:48 +0400 Subject: [PATCH 1369/1766] aiohttp base nginx setup (#9796) * aiohttp base nginx setup * apply review fixes * tune nginx worker settings * use linux socket * use nginx as default aiohttp server * remove gunicorn from requirements --- frameworks/Python/aiohttp/README.md | 2 +- .../aiohttp/aiohttp-gunicorn.dockerfile | 14 ++++ .../Python/aiohttp/aiohttp-orm.dockerfile | 14 +++- frameworks/Python/aiohttp/aiohttp.dockerfile | 12 +++- frameworks/Python/aiohttp/app/app.py | 14 ++++ .../Python/aiohttp/benchmark_config.json | 27 +++++++- frameworks/Python/aiohttp/config.toml | 21 +++++- frameworks/Python/aiohttp/nginx-entrypoint.sh | 64 +++++++++++++++++++ frameworks/Python/aiohttp/requirements.txt | 1 - 9 files changed, 157 insertions(+), 12 deletions(-) create mode 100644 frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile create mode 100644 frameworks/Python/aiohttp/app/app.py create mode 100644 frameworks/Python/aiohttp/nginx-entrypoint.sh diff --git a/frameworks/Python/aiohttp/README.md b/frameworks/Python/aiohttp/README.md index 280e739f8a0..f323e61a7e8 100644 --- a/frameworks/Python/aiohttp/README.md +++ b/frameworks/Python/aiohttp/README.md @@ -35,7 +35,7 @@ This will switch which database engine the app uses to execute queries with test ### Server -gunicorn+uvloop on CPython +nginx+uvloop on CPython ## Test URLs diff --git a/frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile b/frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile new file mode 100644 index 00000000000..6fb96c40f5a --- /dev/null +++ b/frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile @@ -0,0 +1,14 @@ +FROM python:3.13 + +ADD ./ /aiohttp + +WORKDIR aiohttp + +RUN pip3 install cython==3.0.11 gunicorn==23.0.0 && \ + pip3 install -r /aiohttp/requirements.txt + +ENV CONNECTION=RAW + +EXPOSE 8080 + +CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py \ No newline at end of file diff --git a/frameworks/Python/aiohttp/aiohttp-orm.dockerfile b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile index fe1648e3ff4..8b9a759057f 100644 --- a/frameworks/Python/aiohttp/aiohttp-orm.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile @@ -1,14 +1,22 @@ FROM python:3.13 -ADD ./ /aiohttp +RUN apt-get update && apt-get install -y nginx -WORKDIR aiohttp +ADD ./requirements.txt /aiohttp/requirements.txt RUN pip3 install cython==3.0.11 && \ pip3 install -r /aiohttp/requirements.txt +ADD ./ /aiohttp + WORKDIR /aiohttp +ENV CONNECTION=ORM + EXPOSE 8080 -CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py +RUN chmod +x /aiohttp/nginx-entrypoint.sh + +ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"] + + diff --git a/frameworks/Python/aiohttp/aiohttp.dockerfile b/frameworks/Python/aiohttp/aiohttp.dockerfile index f6dda6f5ef5..da72d75bbab 100644 --- a/frameworks/Python/aiohttp/aiohttp.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp.dockerfile @@ -1,14 +1,20 @@ FROM python:3.13 -ADD ./ /aiohttp +RUN apt-get update && apt-get install -y nginx -WORKDIR aiohttp +ADD ./requirements.txt /aiohttp/requirements.txt RUN pip3 install cython==3.0.11 && \ pip3 install -r /aiohttp/requirements.txt +ADD ./ /aiohttp + +WORKDIR /aiohttp + ENV CONNECTION=RAW EXPOSE 8080 -CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py +RUN chmod +x /aiohttp/nginx-entrypoint.sh + +ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"] \ No newline at end of file diff --git a/frameworks/Python/aiohttp/app/app.py b/frameworks/Python/aiohttp/app/app.py new file mode 100644 index 00000000000..cea253aecbb --- /dev/null +++ b/frameworks/Python/aiohttp/app/app.py @@ -0,0 +1,14 @@ +import uvloop +from aiohttp import web +import argparse +from .main import create_app + + +if __name__ == '__main__': + uvloop.install() + parser = argparse.ArgumentParser() + parser.add_argument('--socket', type=str, required=True) + args = parser.parse_args() + + app = create_app() + web.run_app(app, path=args.socket) \ No newline at end of file diff --git a/frameworks/Python/aiohttp/benchmark_config.json b/frameworks/Python/aiohttp/benchmark_config.json index ab4257e12bf..b341ad5c384 100644 --- a/frameworks/Python/aiohttp/benchmark_config.json +++ b/frameworks/Python/aiohttp/benchmark_config.json @@ -17,12 +17,35 @@ "flavor": "Python3", "orm": "Raw", "platform": "asyncio", - "webserver": "gunicorn", + "webserver": "nginx", "os": "Linux", "database_os": "Linux", "display_name": "aiohttp", "notes": "uses asyncpg for database access" }, + "gunicorn": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "fortune_url": "/fortunes", + "update_url": "/updates/", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "aiohttp", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "nginx", + "os": "Linux", + "database_os": "Linux", + "display_name": "aiohttp-gunicorn", + "notes": "uses gunicorn as proxy server", + "versus": "default" + }, "orm": { "db_url": "/db", "query_url": "/queries/", @@ -37,7 +60,7 @@ "flavor": "Python3", "orm": "Full", "platform": "asyncio", - "webserver": "gunicorn", + "webserver": "nginx", "os": "Linux", "database_os": "Linux", "display_name": "aiohttp-orm", diff --git a/frameworks/Python/aiohttp/config.toml b/frameworks/Python/aiohttp/config.toml index dd9088e497d..da12a838108 100644 --- a/frameworks/Python/aiohttp/config.toml +++ b/frameworks/Python/aiohttp/config.toml @@ -15,9 +15,26 @@ database_os = "Linux" os = "Linux" orm = "Raw" platform = "asyncio" -webserver = "gunicorn" +webserver = "nginx" versus = "None" +[gunicorn] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "asyncio" +webserver = "gunicorn" +versus = "default" + [orm] urls.db = "/db" urls.query = "/queries/" @@ -30,5 +47,5 @@ database_os = "Linux" os = "Linux" orm = "Full" platform = "asyncio" -webserver = "gunicorn" +webserver = "nginx" versus = "default" diff --git a/frameworks/Python/aiohttp/nginx-entrypoint.sh b/frameworks/Python/aiohttp/nginx-entrypoint.sh new file mode 100644 index 00000000000..8cca36df363 --- /dev/null +++ b/frameworks/Python/aiohttp/nginx-entrypoint.sh @@ -0,0 +1,64 @@ +#!/bin/sh +set -e +CORES=$(nproc) +echo "$CORES cores detected, starting $CORES aiohttp workers..." + +for i in $(seq 0 $((CORES-1))); do + SOCKET="/run/aiohttp-$i.sock" + echo "Starting worker on socket $SOCKET" + python3 -O -m app.app --socket $SOCKET & +done + +echo "Waiting for all workers to be ready..." +for i in $(seq 0 $((CORES-1))); do + SOCKET="/run/aiohttp-$i.sock" + until [ -S "$SOCKET" ]; do + echo "Waiting for socket $SOCKET..." + sleep 0.2 + done + chown root:www-data "$SOCKET" + chmod 660 "$SOCKET" +done + +cat > /aiohttp/nginx.conf <> /aiohttp/nginx.conf +done + +cat >> /aiohttp/nginx.conf < Date: Fri, 11 Apr 2025 00:21:27 +0900 Subject: [PATCH 1370/1766] Update Go and all Go dependencies to their latest versions (#9771) --- .../Go/atreugo/atreugo-prefork.dockerfile | 2 +- frameworks/Go/atreugo/atreugo.dockerfile | 2 +- frameworks/Go/atreugo/src/go.mod | 33 +- frameworks/Go/atreugo/src/go.sum | 89 +-- .../Go/chi/chi-gojay-prefork.dockerfile | 2 +- frameworks/Go/chi/chi-gojay.dockerfile | 2 +- frameworks/Go/chi/chi-prefork.dockerfile | 2 +- frameworks/Go/chi/chi-scratch.dockerfile | 2 +- .../Go/chi/chi-sjson-prefork.dockerfile | 2 +- frameworks/Go/chi/chi-sjson.dockerfile | 2 +- frameworks/Go/chi/chi.dockerfile | 2 +- frameworks/Go/chi/src/chi-gojay/go.mod | 4 +- frameworks/Go/chi/src/chi-gojay/go.sum | 8 +- frameworks/Go/chi/src/chi-sjson/go.mod | 4 +- frameworks/Go/chi/src/chi-sjson/go.sum | 8 +- frameworks/Go/chi/src/chi/go.mod | 6 +- frameworks/Go/chi/src/chi/go.sum | 12 +- frameworks/Go/echo/echo.dockerfile | 2 +- frameworks/Go/echo/src/go.mod | 31 +- frameworks/Go/echo/src/go.sum | 64 +- .../Go/fasthttp/fasthttp-prefork.dockerfile | 2 +- frameworks/Go/fasthttp/fasthttp.dockerfile | 2 +- frameworks/Go/fasthttp/src/go.mod | 27 +- frameworks/Go/fasthttp/src/go.sum | 88 ++- frameworks/Go/fiber/fiber-prefork.dockerfile | 2 +- frameworks/Go/fiber/fiber.dockerfile | 2 +- frameworks/Go/fiber/src/go.mod | 27 +- frameworks/Go/fiber/src/go.sum | 50 +- frameworks/Go/gin/gin-gorm.dockerfile | 2 +- frameworks/Go/gin/gin-gorm/go.mod | 62 +- frameworks/Go/gin/gin-gorm/go.sum | 288 ++------ frameworks/Go/gin/gin-scratch.dockerfile | 2 +- frameworks/Go/gin/gin-src/go.mod | 44 +- frameworks/Go/gin/gin-src/go.sum | 99 +-- frameworks/Go/gin/gin-std/go.mod | 44 +- frameworks/Go/gin/gin-std/go.sum | 97 +-- frameworks/Go/gin/gin.dockerfile | 2 +- frameworks/Go/gnet/gnet.dockerfile | 2 +- frameworks/Go/gnet/src/go.mod | 12 +- frameworks/Go/gnet/src/go.sum | 77 +-- .../Go/go-std/go-mgo-prefork.dockerfile | 2 +- frameworks/Go/go-std/go-mgo.dockerfile | 2 +- frameworks/Go/go-std/go-my-prefork.dockerfile | 2 +- frameworks/Go/go-std/go-my.dockerfile | 2 +- .../Go/go-std/go-pgx-easyjson.dockerfile | 2 +- .../go-std/go-pgx-prefork-easyjson.dockerfile | 2 +- .../go-pgx-prefork-quicktemplate.dockerfile | 2 +- .../Go/go-std/go-pgx-prefork.dockerfile | 2 +- .../Go/go-std/go-pgx-quicktemplate.dockerfile | 2 +- frameworks/Go/go-std/go-pgx.dockerfile | 2 +- frameworks/Go/go-std/go.dockerfile | 2 +- frameworks/Go/go-std/src/go.mod | 15 +- frameworks/Go/go-std/src/go.sum | 39 +- frameworks/Go/goframe/goframe.dockerfile | 2 +- frameworks/Go/goframe/src/go.mod | 67 +- frameworks/Go/goframe/src/go.sum | 288 ++++---- frameworks/Go/goji/goji.dockerfile | 2 +- frameworks/Go/goji/src/go.mod | 8 +- frameworks/Go/goji/src/go.sum | 6 +- frameworks/Go/gramework/gramework.dockerfile | 2 +- frameworks/Go/gramework/src/go.mod | 35 +- frameworks/Go/gramework/src/go.sum | 631 ++++++++++++++++-- frameworks/Go/hertz/go.mod | 51 +- frameworks/Go/hertz/go.sum | 179 +++-- frameworks/Go/hertz/hertz-gorm.dockerfile | 2 +- frameworks/Go/hertz/hertz-gorm/go.mod | 58 +- frameworks/Go/hertz/hertz-gorm/go.sum | 311 +++------ frameworks/Go/hertz/hertz.dockerfile | 2 +- frameworks/Go/kami/kami.dockerfile | 2 +- frameworks/Go/kami/src/go.mod | 14 +- frameworks/Go/kami/src/go.sum | 50 +- frameworks/Go/pine/pine.dockerfile | 2 +- frameworks/Go/pine/src/go.mod | 2 +- frameworks/Go/pine/src/go.sum | 4 +- frameworks/Go/revel/revel-fast.dockerfile | 2 +- frameworks/Go/revel/revel-jet.dockerfile | 2 +- frameworks/Go/revel/revel-qbs.dockerfile | 2 +- frameworks/Go/revel/revel-raw.dockerfile | 2 +- frameworks/Go/revel/revel.dockerfile | 2 +- .../silverlining-prefork.dockerfile | 2 +- .../Go/silverlining/silverlining.dockerfile | 2 +- frameworks/Go/silverlining/src/go.mod | 14 +- frameworks/Go/silverlining/src/go.sum | 26 +- frameworks/Go/webgo/src/go.mod | 14 +- frameworks/Go/webgo/src/go.sum | 19 +- frameworks/Go/webgo/webgo.dockerfile | 2 +- 86 files changed, 1677 insertions(+), 1416 deletions(-) diff --git a/frameworks/Go/atreugo/atreugo-prefork.dockerfile b/frameworks/Go/atreugo/atreugo-prefork.dockerfile index 40cc16b1797..2f930396493 100644 --- a/frameworks/Go/atreugo/atreugo-prefork.dockerfile +++ b/frameworks/Go/atreugo/atreugo-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /atreugo diff --git a/frameworks/Go/atreugo/atreugo.dockerfile b/frameworks/Go/atreugo/atreugo.dockerfile index 22f114ee7a4..3a6db2415fd 100644 --- a/frameworks/Go/atreugo/atreugo.dockerfile +++ b/frameworks/Go/atreugo/atreugo.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /atreugo diff --git a/frameworks/Go/atreugo/src/go.mod b/frameworks/Go/atreugo/src/go.mod index a8b0f986fef..46944099dc5 100644 --- a/frameworks/Go/atreugo/src/go.mod +++ b/frameworks/Go/atreugo/src/go.mod @@ -1,26 +1,27 @@ module atreugo/src -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/jackc/pgx/v5 v5.5.4 - github.com/savsgio/atreugo/v11 v11.9.7 - github.com/valyala/quicktemplate v1.7.0 + github.com/jackc/pgx/v5 v5.7.4 + github.com/savsgio/atreugo/v11 v11.13.2 + github.com/valyala/quicktemplate v1.8.0 ) require ( - github.com/andybalholm/brotli v1.0.4 // indirect - github.com/fasthttp/router v1.4.12 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/fasthttp/router v1.5.4 // indirect github.com/jackc/pgpassfile v1.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/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // 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 + github.com/valyala/fasthttp v1.60.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect ) diff --git a/frameworks/Go/atreugo/src/go.sum b/frameworks/Go/atreugo/src/go.sum index 628a4244926..0850edc3bd7 100644 --- a/frameworks/Go/atreugo/src/go.sum +++ b/frameworks/Go/atreugo/src/go.sum @@ -1,73 +1,50 @@ -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/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= 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/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/fasthttp/router v1.4.12 h1:QEgK+UKARaC1bAzJgnIhdUMay6nwp+YFq6VGPlyKN1o= -github.com/fasthttp/router v1.4.12/go.mod h1:41Qdc4Z4T2pWVVtATHCnoUnOtxdBoeKEYJTXhHwbxCQ= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fasthttp/router v1.5.4 h1:oxdThbBwQgsDIYZ3wR1IavsNl6ZS9WdjKukeMikOnC8= +github.com/fasthttp/router v1.5.4/go.mod h1:3/hysWq6cky7dTfzaaEPZGdptwjwx0qzTgFCKEWRjgc= 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-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= -github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo= -github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= +github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= 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/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/savsgio/atreugo/v11 v11.13.2 h1:F1XHN2slrHKokg3ESLS6O2+hvlKqPJcBRuhJBEFJbn8= +github.com/savsgio/atreugo/v11 v11.13.2/go.mod h1:PloaYuHYZpXc7vkxXbMmqqorLlGZVAI4KFzVrynx5qo= +github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 h1:D0vL7YNisV2yqE55+q0lFuGse6U8lxlg7fYTctlT5Gc= +github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= 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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= -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= -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-20220214200702-86341886e292/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/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= -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/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.3/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.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= +github.com/valyala/fasthttp v1.60.0 h1:kBRYS0lOhVJ6V+bYN8PqAHELKHtXqwq9zNMLKx1MBsw= +github.com/valyala/fasthttp v1.60.0/go.mod h1:iY4kDgV3Gc6EqhRZ8icqcmlG6bqhcDXfuHgTO4FXCvc= +github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= +github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frameworks/Go/chi/chi-gojay-prefork.dockerfile b/frameworks/Go/chi/chi-gojay-prefork.dockerfile index 5c9eec667f7..9381a8601b2 100644 --- a/frameworks/Go/chi/chi-gojay-prefork.dockerfile +++ b/frameworks/Go/chi/chi-gojay-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.23.1 +FROM docker.io/golang:1.24.2 ADD ./src/chi-gojay /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-gojay.dockerfile b/frameworks/Go/chi/chi-gojay.dockerfile index c9a6de386d5..05a5eb524dd 100644 --- a/frameworks/Go/chi/chi-gojay.dockerfile +++ b/frameworks/Go/chi/chi-gojay.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.23.1 +FROM docker.io/golang:1.24.2 ADD ./src/chi-gojay /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-prefork.dockerfile b/frameworks/Go/chi/chi-prefork.dockerfile index fb363d7b06a..5a86cae27bf 100644 --- a/frameworks/Go/chi/chi-prefork.dockerfile +++ b/frameworks/Go/chi/chi-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.23.1 +FROM docker.io/golang:1.24.2 ADD ./src/chi /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-scratch.dockerfile b/frameworks/Go/chi/chi-scratch.dockerfile index 2361e658ca7..baad2c7b074 100644 --- a/frameworks/Go/chi/chi-scratch.dockerfile +++ b/frameworks/Go/chi/chi-scratch.dockerfile @@ -1,5 +1,5 @@ # build layer -FROM docker.io/golang:1.23.1-alpine as builder +FROM docker.io/golang:1.24.2-alpine as builder ADD ./src/chi /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-sjson-prefork.dockerfile b/frameworks/Go/chi/chi-sjson-prefork.dockerfile index 97071fe5e22..dc949b5f137 100644 --- a/frameworks/Go/chi/chi-sjson-prefork.dockerfile +++ b/frameworks/Go/chi/chi-sjson-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.23.1 +FROM docker.io/golang:1.24.2 ADD ./src/chi-sjson /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi-sjson.dockerfile b/frameworks/Go/chi/chi-sjson.dockerfile index 99a2204147f..6942fb43636 100644 --- a/frameworks/Go/chi/chi-sjson.dockerfile +++ b/frameworks/Go/chi/chi-sjson.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.23.1 +FROM docker.io/golang:1.24.2 ADD ./src/chi-sjson /chi WORKDIR /chi diff --git a/frameworks/Go/chi/chi.dockerfile b/frameworks/Go/chi/chi.dockerfile index 6facc00990f..2378ae07c9e 100644 --- a/frameworks/Go/chi/chi.dockerfile +++ b/frameworks/Go/chi/chi.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.23.1 +FROM docker.io/golang:1.24.2 ADD ./src/chi /chi WORKDIR /chi diff --git a/frameworks/Go/chi/src/chi-gojay/go.mod b/frameworks/Go/chi/src/chi-gojay/go.mod index f8c266996ec..24337489ee9 100644 --- a/frameworks/Go/chi/src/chi-gojay/go.mod +++ b/frameworks/Go/chi/src/chi-gojay/go.mod @@ -3,8 +3,8 @@ module chi/server go 1.23.1 require ( - github.com/go-chi/chi/v5 v5.1.0 - github.com/go-sql-driver/mysql v1.8.1 + github.com/go-chi/chi/v5 v5.2.1 + github.com/go-sql-driver/mysql v1.9.1 ) require filippo.io/edwards25519 v1.1.0 // indirect diff --git a/frameworks/Go/chi/src/chi-gojay/go.sum b/frameworks/Go/chi/src/chi-gojay/go.sum index 701d0184cbb..383118b55e6 100644 --- a/frameworks/Go/chi/src/chi-gojay/go.sum +++ b/frameworks/Go/chi/src/chi-gojay/go.sum @@ -1,6 +1,6 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= -github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8= +github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= diff --git a/frameworks/Go/chi/src/chi-sjson/go.mod b/frameworks/Go/chi/src/chi-sjson/go.mod index f8c266996ec..24337489ee9 100644 --- a/frameworks/Go/chi/src/chi-sjson/go.mod +++ b/frameworks/Go/chi/src/chi-sjson/go.mod @@ -3,8 +3,8 @@ module chi/server go 1.23.1 require ( - github.com/go-chi/chi/v5 v5.1.0 - github.com/go-sql-driver/mysql v1.8.1 + github.com/go-chi/chi/v5 v5.2.1 + github.com/go-sql-driver/mysql v1.9.1 ) require filippo.io/edwards25519 v1.1.0 // indirect diff --git a/frameworks/Go/chi/src/chi-sjson/go.sum b/frameworks/Go/chi/src/chi-sjson/go.sum index 701d0184cbb..383118b55e6 100644 --- a/frameworks/Go/chi/src/chi-sjson/go.sum +++ b/frameworks/Go/chi/src/chi-sjson/go.sum @@ -1,6 +1,6 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= -github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8= +github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= diff --git a/frameworks/Go/chi/src/chi/go.mod b/frameworks/Go/chi/src/chi/go.mod index 906b029b388..e2fd954ff4b 100644 --- a/frameworks/Go/chi/src/chi/go.mod +++ b/frameworks/Go/chi/src/chi/go.mod @@ -3,9 +3,9 @@ module chi/server go 1.23.1 require ( - github.com/go-chi/chi/v5 v5.1.0 - github.com/go-sql-driver/mysql v1.8.1 - github.com/mailru/easyjson v0.7.7 + github.com/go-chi/chi/v5 v5.2.1 + github.com/go-sql-driver/mysql v1.9.1 + github.com/mailru/easyjson v0.9.0 ) require ( diff --git a/frameworks/Go/chi/src/chi/go.sum b/frameworks/Go/chi/src/chi/go.sum index b39d37edbe5..cac59f89c15 100644 --- a/frameworks/Go/chi/src/chi/go.sum +++ b/frameworks/Go/chi/src/chi/go.sum @@ -1,10 +1,10 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= -github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8= +github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= 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/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= diff --git a/frameworks/Go/echo/echo.dockerfile b/frameworks/Go/echo/echo.dockerfile index ab6a616d4d9..ccb80b19211 100644 --- a/frameworks/Go/echo/echo.dockerfile +++ b/frameworks/Go/echo/echo.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.22 +FROM docker.io/golang:1.24.2 ADD ./src /echo WORKDIR /echo diff --git a/frameworks/Go/echo/src/go.mod b/frameworks/Go/echo/src/go.mod index cb54749b3ad..53560874b16 100644 --- a/frameworks/Go/echo/src/go.mod +++ b/frameworks/Go/echo/src/go.mod @@ -1,25 +1,26 @@ module echo/app -go 1.22 -toolchain go1.23.7 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/jackc/pgx/v5 v5.6.0 - github.com/labstack/echo/v4 v4.9.0 + github.com/jackc/pgx/v5 v5.7.4 + github.com/labstack/echo/v4 v4.13.3 ) require ( github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/labstack/gommon v0.3.1 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.1 // indirect - golang.org/x/crypto v0.35.0 // indirect - golang.org/x/net v0.36.0 // indirect - golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/text v0.22.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect ) diff --git a/frameworks/Go/echo/src/go.sum b/frameworks/Go/echo/src/go.sum index cb3bf5a04a1..d818aa63045 100644 --- a/frameworks/Go/echo/src/go.sum +++ b/frameworks/Go/echo/src/go.sum @@ -3,49 +3,43 @@ 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/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-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.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -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/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY= -github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= -github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= -github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= +github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= +github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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/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.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= -golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= -golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -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.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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/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= diff --git a/frameworks/Go/fasthttp/fasthttp-prefork.dockerfile b/frameworks/Go/fasthttp/fasthttp-prefork.dockerfile index 168ead214b6..01cbcf4a4ed 100644 --- a/frameworks/Go/fasthttp/fasthttp-prefork.dockerfile +++ b/frameworks/Go/fasthttp/fasthttp-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /fasthttp diff --git a/frameworks/Go/fasthttp/fasthttp.dockerfile b/frameworks/Go/fasthttp/fasthttp.dockerfile index 0fb465487ba..b7b74b0a7ab 100644 --- a/frameworks/Go/fasthttp/fasthttp.dockerfile +++ b/frameworks/Go/fasthttp/fasthttp.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /fasthttp diff --git a/frameworks/Go/fasthttp/src/go.mod b/frameworks/Go/fasthttp/src/go.mod index 59cdcddeacd..b7f1bc305c5 100644 --- a/frameworks/Go/fasthttp/src/go.mod +++ b/frameworks/Go/fasthttp/src/go.mod @@ -1,28 +1,29 @@ module fasthttp/app -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - 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 + github.com/jackc/pgx/v4 v4.18.3 + github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 + github.com/valyala/fasthttp v1.60.0 + github.com/valyala/quicktemplate v1.8.0 ) require ( - github.com/andybalholm/brotli v1.0.4 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // 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.3 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgtype v1.14.4 // indirect github.com/jackc/puddle v1.3.0 // indirect - github.com/klauspost/compress v1.15.10 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/tcplisten v1.0.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 + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect ) diff --git a/frameworks/Go/fasthttp/src/go.sum b/frameworks/Go/fasthttp/src/go.sum index b8c91b7aa99..b99b3205212 100644 --- a/frameworks/Go/fasthttp/src/go.sum +++ b/frameworks/Go/fasthttp/src/go.sum @@ -1,9 +1,7 @@ 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/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= 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= @@ -17,9 +15,7 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG 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= @@ -50,31 +46,31 @@ github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwX 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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.4 h1:fKuNiCumbKTAIxQwXfB/nsrnkEI6bPJrrSiMKgbJ2j8= +github.com/jackc/pgtype v1.14.4/go.mod h1:aKeozOde08iifGosdJpz9MBZonJOUJxqNpPBcMJTlVA= 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.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jackc/pgx/v4 v4.18.3/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= 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/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/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= 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= @@ -100,8 +96,8 @@ 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/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/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 h1:D0vL7YNisV2yqE55+q0lFuGse6U8lxlg7fYTctlT5Gc= +github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= 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= @@ -110,21 +106,26 @@ 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/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= -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= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/valyala/fasthttp v1.60.0 h1:kBRYS0lOhVJ6V+bYN8PqAHELKHtXqwq9zNMLKx1MBsw= +github.com/valyala/fasthttp v1.60.0/go.mod h1:iY4kDgV3Gc6EqhRZ8icqcmlG6bqhcDXfuHgTO4FXCvc= +github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= +github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 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= @@ -144,24 +145,30 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U 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.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= 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/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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/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/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/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= @@ -173,24 +180,31 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w 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.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 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= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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= @@ -198,7 +212,10 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw 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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= @@ -211,4 +228,5 @@ 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= diff --git a/frameworks/Go/fiber/fiber-prefork.dockerfile b/frameworks/Go/fiber/fiber-prefork.dockerfile index 43995ca7de7..13e45eb4cba 100644 --- a/frameworks/Go/fiber/fiber-prefork.dockerfile +++ b/frameworks/Go/fiber/fiber-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.23-alpine as builder +FROM golang:1.24.2-alpine as builder WORKDIR /fiber diff --git a/frameworks/Go/fiber/fiber.dockerfile b/frameworks/Go/fiber/fiber.dockerfile index 38f97b03d56..fc82a07891c 100644 --- a/frameworks/Go/fiber/fiber.dockerfile +++ b/frameworks/Go/fiber/fiber.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.23-alpine as builder +FROM golang:1.24.2-alpine as builder WORKDIR /fiber diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index 30a1e290884..78edf82d7fd 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -1,30 +1,31 @@ module fiber/app -go 1.23 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/goccy/go-json v0.10.3 - github.com/gofiber/fiber/v2 v2.52.5 - github.com/jackc/pgx/v5 v5.7.1 + github.com/goccy/go-json v0.10.5 + github.com/gofiber/fiber/v2 v2.52.6 + github.com/jackc/pgx/v5 v5.7.4 github.com/valyala/quicktemplate v1.8.0 ) require ( - github.com/andybalholm/brotli v1.1.0 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.55.0 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect + github.com/valyala/fasthttp v1.60.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index dd7b67f4e56..e2f76bc1971 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -1,27 +1,26 @@ -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= 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/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= -github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= +github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= -github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= +github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -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/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 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.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= @@ -38,22 +37,21 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= -github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= +github.com/valyala/fasthttp v1.60.0 h1:kBRYS0lOhVJ6V+bYN8PqAHELKHtXqwq9zNMLKx1MBsw= +github.com/valyala/fasthttp v1.60.0/go.mod h1:iY4kDgV3Gc6EqhRZ8icqcmlG6bqhcDXfuHgTO4FXCvc= github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/frameworks/Go/gin/gin-gorm.dockerfile b/frameworks/Go/gin/gin-gorm.dockerfile index dee2eceff93..665b4849c1c 100644 --- a/frameworks/Go/gin/gin-gorm.dockerfile +++ b/frameworks/Go/gin/gin-gorm.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.20-bullseye as build-env +FROM docker.io/golang:1.24.2 as build-env WORKDIR /src/ COPY ./gin-gorm /src/ diff --git a/frameworks/Go/gin/gin-gorm/go.mod b/frameworks/Go/gin/gin-gorm/go.mod index f2e364dcfef..4e73bd0d4e2 100644 --- a/frameworks/Go/gin/gin-gorm/go.mod +++ b/frameworks/Go/gin/gin-gorm/go.mod @@ -1,51 +1,49 @@ module gin-gorm/app -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/gin-gonic/gin v1.9.1 - gorm.io/driver/postgres v1.3.10 - gorm.io/gorm v1.23.9 + github.com/gin-gonic/gin v1.10.0 + gorm.io/driver/postgres v1.5.11 + gorm.io/gorm v1.25.12 ) require ( - github.com/bytedance/sonic v1.9.1 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect + github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.0.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/gofrs/uuid v4.3.0+incompatible // indirect + github.com/go-playground/validator/v10 v10.26.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // 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.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/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.4 // indirect + github.com/jackc/puddle/v2 v2.2.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 - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/lib/pq v1.10.7 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/kr/text v0.1.0 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/shopspring/decimal v1.3.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect 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.21.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.15.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect + google.golang.org/protobuf v1.36.6 // 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 dd864315456..8d103d7745f 100644 --- a/frameworks/Go/gin/gin-gorm/go.sum +++ b/frameworks/Go/gin/gin-gorm/go.sum @@ -1,268 +1,110 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -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/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 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/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -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/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= +github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -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/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/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= +github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 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= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -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/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= -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/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -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/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/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= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= +github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -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/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -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/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/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= 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/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/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/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= 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/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -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/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.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-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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -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/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.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -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.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= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 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= -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/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 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= -gorm.io/driver/postgres v1.3.10 h1:Fsd+pQpFMGlGxxVMUPJhNo8gG8B1lKtk8QQ4/VZZAJw= -gorm.io/driver/postgres v1.3.10/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw= -gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.9 h1:NSHG021i+MCznokeXR3udGaNyFyBQJW8MbjrJMVCfGw= -gorm.io/gorm v1.23.9/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= +gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/frameworks/Go/gin/gin-scratch.dockerfile b/frameworks/Go/gin/gin-scratch.dockerfile index 997e4c236ee..859a0b13b79 100644 --- a/frameworks/Go/gin/gin-scratch.dockerfile +++ b/frameworks/Go/gin/gin-scratch.dockerfile @@ -1,5 +1,5 @@ # build layer -FROM docker.io/golang:1.19-alpine as builder +FROM docker.io/golang:1.24.2-alpine as builder WORKDIR /gin COPY ./gin-std /gin diff --git a/frameworks/Go/gin/gin-src/go.mod b/frameworks/Go/gin/gin-src/go.mod index 1ab84a0a5b2..35027ca96d1 100644 --- a/frameworks/Go/gin/gin-src/go.mod +++ b/frameworks/Go/gin/gin-src/go.mod @@ -1,35 +1,39 @@ module gin -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/gin-gonic/gin v1.9.1 - github.com/go-sql-driver/mysql v1.6.0 + github.com/gin-gonic/gin v1.10.0 + github.com/go-sql-driver/mysql v1.9.1 ) require ( - github.com/bytedance/sonic v1.9.1 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.0.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/go-playground/validator/v10 v10.26.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect 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.21.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.15.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect + google.golang.org/protobuf v1.36.6 // 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 8c28f90b980..c7fbc425b01 100644 --- a/frameworks/Go/gin/gin-src/go.sum +++ b/frameworks/Go/gin/gin-src/go.sum @@ -1,83 +1,90 @@ -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 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/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= +github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -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/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= +github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 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= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -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/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 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= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/frameworks/Go/gin/gin-std/go.mod b/frameworks/Go/gin/gin-std/go.mod index 06097ea951c..0706138f01d 100644 --- a/frameworks/Go/gin/gin-std/go.mod +++ b/frameworks/Go/gin/gin-std/go.mod @@ -1,36 +1,40 @@ module gin-std/server -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/gin-gonic/gin v1.9.1 - github.com/go-sql-driver/mysql v1.6.0 + github.com/gin-gonic/gin v1.10.0 + github.com/go-sql-driver/mysql v1.9.1 ) require ( - github.com/bytedance/sonic v1.9.1 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.0.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/go-playground/validator/v10 v10.26.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect 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.21.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.15.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect + google.golang.org/protobuf v1.36.6 // 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 0549623560d..101235e7c85 100644 --- a/frameworks/Go/gin/gin-std/go.sum +++ b/frameworks/Go/gin/gin-std/go.sum @@ -1,83 +1,88 @@ -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 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/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= +github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -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/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= +github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 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= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -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/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 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= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/frameworks/Go/gin/gin.dockerfile b/frameworks/Go/gin/gin.dockerfile index b0f145a8448..b814898ae18 100644 --- a/frameworks/Go/gin/gin.dockerfile +++ b/frameworks/Go/gin/gin.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /gin COPY ./gin-std /gin diff --git a/frameworks/Go/gnet/gnet.dockerfile b/frameworks/Go/gnet/gnet.dockerfile index bf9715306d8..4786d869d72 100644 --- a/frameworks/Go/gnet/gnet.dockerfile +++ b/frameworks/Go/gnet/gnet.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:latest +FROM docker.io/golang:1.24.2 WORKDIR /gnet diff --git a/frameworks/Go/gnet/src/go.mod b/frameworks/Go/gnet/src/go.mod index 77b8811ce55..567d3bf13c2 100644 --- a/frameworks/Go/gnet/src/go.mod +++ b/frameworks/Go/gnet/src/go.mod @@ -4,16 +4,16 @@ go 1.23.1 require ( github.com/evanphx/wildcat v0.0.0-20141114174135-e7012f664567 - github.com/panjf2000/gnet/v2 v2.5.7 + github.com/panjf2000/gnet/v2 v2.7.2 ) require ( + github.com/panjf2000/ants/v2 v2.11.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/vektra/errors v0.0.0-20140903201135-c64d83aba85a // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.21.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) diff --git a/frameworks/Go/gnet/src/go.sum b/frameworks/Go/gnet/src/go.sum index e39645c8777..d754f38b357 100644 --- a/frameworks/Go/gnet/src/go.sum +++ b/frameworks/Go/gnet/src/go.sum @@ -1,75 +1,30 @@ -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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/evanphx/wildcat v0.0.0-20141114174135-e7012f664567 h1:7+oQw6YjB/kk9x27AEC7DMXudqERHD583hZpno18lRw= github.com/evanphx/wildcat v0.0.0-20141114174135-e7012f664567/go.mod h1:XNGflD53X+hfdCAt1NGeBUgiUpe9QmweW/zI1gV26Zw= -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/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= -github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= -github.com/panjf2000/gnet/v2 v2.5.7 h1:EGGIfLYEVAp2l5WSYT2XddSjpQ642PjwphbWhcJ0WBY= -github.com/panjf2000/gnet/v2 v2.5.7/go.mod h1:ppopMJ8VrDbJu8kDsqFQTgNmpMS8Le5CmPxISf+Sauk= -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/panjf2000/ants/v2 v2.11.2 h1:AVGpMSePxUNpcLaBO34xuIgM1ZdKOiGnpxLXixLi5Jo= +github.com/panjf2000/ants/v2 v2.11.2/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= +github.com/panjf2000/gnet/v2 v2.7.2 h1:c+QhXBKi/Qfdi4fh8ju6xiShGQHS1lHSEk6euFzJaIk= +github.com/panjf2000/gnet/v2 v2.7.2/go.mod h1:PIMw/8ILZsN/4K11bqDtSE1rEVPoFtjFlc0Q4edkncA= 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/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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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/vektra/errors v0.0.0-20140903201135-c64d83aba85a h1:lUVfiMMY/te9icPKBqOKkBIMZNxSpM90dxokDeCcfBg= github.com/vektra/errors v0.0.0-20140903201135-c64d83aba85a/go.mod h1:KUxJS71XlMs+ztT+RzsLRoWUQRUpECo/+Rb0EBk8/Wc= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.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.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/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.0-20210107192922-496545a6307b/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= diff --git a/frameworks/Go/go-std/go-mgo-prefork.dockerfile b/frameworks/Go/go-std/go-mgo-prefork.dockerfile index b72c35635db..f340258c824 100644 --- a/frameworks/Go/go-std/go-mgo-prefork.dockerfile +++ b/frameworks/Go/go-std/go-mgo-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-mgo.dockerfile b/frameworks/Go/go-std/go-mgo.dockerfile index dc3460db891..05a4806f81a 100644 --- a/frameworks/Go/go-std/go-mgo.dockerfile +++ b/frameworks/Go/go-std/go-mgo.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-my-prefork.dockerfile b/frameworks/Go/go-std/go-my-prefork.dockerfile index 13e6cc93bed..763cf2f55ed 100644 --- a/frameworks/Go/go-std/go-my-prefork.dockerfile +++ b/frameworks/Go/go-std/go-my-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-my.dockerfile b/frameworks/Go/go-std/go-my.dockerfile index d456038999f..14d06b09885 100644 --- a/frameworks/Go/go-std/go-my.dockerfile +++ b/frameworks/Go/go-std/go-my.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-pgx-easyjson.dockerfile b/frameworks/Go/go-std/go-pgx-easyjson.dockerfile index 6f790e15990..21608a57ace 100644 --- a/frameworks/Go/go-std/go-pgx-easyjson.dockerfile +++ b/frameworks/Go/go-std/go-pgx-easyjson.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile b/frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile index 3da0370bffd..e1640ae49e0 100644 --- a/frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile +++ b/frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile b/frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile index 2745a7fc93e..765f771efcd 100644 --- a/frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile +++ b/frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-pgx-prefork.dockerfile b/frameworks/Go/go-std/go-pgx-prefork.dockerfile index 2745a7fc93e..765f771efcd 100644 --- a/frameworks/Go/go-std/go-pgx-prefork.dockerfile +++ b/frameworks/Go/go-std/go-pgx-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile b/frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile index efad70a7bfb..fd754e6c9e3 100644 --- a/frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile +++ b/frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go-pgx.dockerfile b/frameworks/Go/go-std/go-pgx.dockerfile index efad70a7bfb..fd754e6c9e3 100644 --- a/frameworks/Go/go-std/go-pgx.dockerfile +++ b/frameworks/Go/go-std/go-pgx.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/go.dockerfile b/frameworks/Go/go-std/go.dockerfile index cb38aec3676..8b361d8de97 100644 --- a/frameworks/Go/go-std/go.dockerfile +++ b/frameworks/Go/go-std/go.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /go-std diff --git a/frameworks/Go/go-std/src/go.mod b/frameworks/Go/go-std/src/go.mod index e164c404d53..5b0257bab2c 100644 --- a/frameworks/Go/go-std/src/go.mod +++ b/frameworks/Go/go-std/src/go.mod @@ -1,16 +1,19 @@ module go-std/app -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-sql-driver/mysql v1.9.1 github.com/jackc/pgx v3.6.2+incompatible - github.com/mailru/easyjson v0.7.7 - github.com/valyala/quicktemplate v1.7.0 + github.com/mailru/easyjson v0.9.0 + github.com/valyala/quicktemplate v1.8.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 ) require ( + filippo.io/edwards25519 v1.1.0 // indirect github.com/cockroachdb/apd v1.1.0 // indirect github.com/gofrs/uuid v4.3.0+incompatible // indirect github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect @@ -21,8 +24,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.17.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/text v0.23.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 6118e45288d..43b561e4d10 100644 --- a/frameworks/Go/go-std/src/go.sum +++ b/frameworks/Go/go-std/src/go.sum @@ -1,21 +1,18 @@ -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= 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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= 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/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o= github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= 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/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/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= @@ -26,8 +23,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/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/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -37,24 +34,12 @@ github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5g github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= 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/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/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.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= -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/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.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= +github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= +github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/frameworks/Go/goframe/goframe.dockerfile b/frameworks/Go/goframe/goframe.dockerfile index 5f68f2a8b9e..8a1252fa7c7 100644 --- a/frameworks/Go/goframe/goframe.dockerfile +++ b/frameworks/Go/goframe/goframe.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 ADD ./src /goframe WORKDIR /goframe diff --git a/frameworks/Go/goframe/src/go.mod b/frameworks/Go/goframe/src/go.mod index 6a931c78b4c..ee265ecc7d0 100644 --- a/frameworks/Go/goframe/src/go.mod +++ b/frameworks/Go/goframe/src/go.mod @@ -1,50 +1,55 @@ module goframe/app -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/bytedance/sonic v1.4.0 - github.com/gogf/gf/v2 v2.1.4 - github.com/jackc/pgx/v4 v4.18.2 - github.com/valyala/quicktemplate v1.7.0 + github.com/bytedance/sonic v1.13.2 + github.com/gogf/gf/v2 v2.9.0 + github.com/jackc/pgx/v4 v4.18.3 + github.com/valyala/quicktemplate v1.8.0 ) require ( - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06 // indirect - github.com/clbanning/mxj/v2 v2.5.5 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/BurntSushi/toml v1.5.0 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grokify/html-strip-tags-go v0.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // 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.3 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgtype v1.14.4 // 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 - github.com/mattn/go-colorable v0.1.9 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/magiconair/properties v1.8.9 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - go.opentelemetry.io/otel v1.7.0 // indirect - 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.21.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/sdk v1.35.0 // indirect + go.opentelemetry.io/otel/trace v1.35.0 // indirect + golang.org/x/arch v0.15.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.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 12dd4e52b19..50336211cdc 100644 --- a/frameworks/Go/goframe/src/go.sum +++ b/frameworks/Go/goframe/src/go.sum @@ -1,20 +1,17 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= 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/bytedance/sonic v1.4.0 h1:d6vgPhwgHfpmEiz/9Fzea9fGzWY7RO1TQEySBiRwDLY= -github.com/bytedance/sonic v1.4.0/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06 h1:1sDoSuDPWzhkdzNVxCxtIaKiAe96ESVPv8coGwc1gZ4= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E= -github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= +github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 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= @@ -23,56 +20,33 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do 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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/goccy/go-json v0.9.4 h1:L8MLKG2mvVXiQu07qB6hmfqeSYQdOnqPot2GhsIwIaI= -github.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 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/gogf/gf/v2 v2.1.4 h1:zebl7kahNnU+0o7hcLx81svcTdp5fYdW9ZnZagXyLt4= -github.com/gogf/gf/v2 v2.1.4/go.mod h1:thvkyb43RWUu/m05sRm4CbH9r7t7/FrW2M56L9Ystwk= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/gogf/gf/v2 v2.9.0 h1:semN5Q5qGjDQEv4620VzxcJzJlSD07gmyJ9Sy9zfbHk= +github.com/gogf/gf/v2 v2.9.0/go.mod h1:sWGQw+pLILtuHmbOxoe0D+0DdaXxbleT57axOLH2vKI= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0= -github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= +github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= 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= @@ -103,83 +77,74 @@ github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwX 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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/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.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.4 h1:fKuNiCumbKTAIxQwXfB/nsrnkEI6bPJrrSiMKgbJ2j8= +github.com/jackc/pgtype v1.14.4/go.mod h1:aKeozOde08iifGosdJpz9MBZonJOUJxqNpPBcMJTlVA= 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.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jackc/pgx/v4 v4.18.3/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= 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/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 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/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= 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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= +github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= 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-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 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/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +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.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= 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/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 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= @@ -192,43 +157,42 @@ 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/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 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.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= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.4 h1:cuiLzLnaMeBhRmEv00Lpk3tkYrcxpmbU81tAY4Dw0tc= -github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 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/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/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= +github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= -go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= -go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= -go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= -go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= 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/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 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= @@ -236,8 +200,8 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E 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/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= 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= @@ -245,73 +209,69 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U 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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= 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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -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.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= 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= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/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-20180909124046-d0be0721c37e/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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/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-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 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= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= 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.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.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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= @@ -321,38 +281,22 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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-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 v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/frameworks/Go/goji/goji.dockerfile b/frameworks/Go/goji/goji.dockerfile index 6da1e062bdb..8d23a8d14e8 100644 --- a/frameworks/Go/goji/goji.dockerfile +++ b/frameworks/Go/goji/goji.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 ADD ./src /goji WORKDIR /goji diff --git a/frameworks/Go/goji/src/go.mod b/frameworks/Go/goji/src/go.mod index 1eb8744a13e..04fe1ba3336 100644 --- a/frameworks/Go/goji/src/go.mod +++ b/frameworks/Go/goji/src/go.mod @@ -1,8 +1,12 @@ module server -go 1.19 +go 1.21.0 + +toolchain go1.24.1 require ( - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-sql-driver/mysql v1.9.1 github.com/zenazn/goji v1.0.1 ) + +require filippo.io/edwards25519 v1.1.0 // indirect diff --git a/frameworks/Go/goji/src/go.sum b/frameworks/Go/goji/src/go.sum index e4e91956bb5..4637fbf3f4a 100644 --- a/frameworks/Go/goji/src/go.sum +++ b/frameworks/Go/goji/src/go.sum @@ -1,4 +1,6 @@ -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= diff --git a/frameworks/Go/gramework/gramework.dockerfile b/frameworks/Go/gramework/gramework.dockerfile index 8e8ca15a775..0300eae4d3d 100644 --- a/frameworks/Go/gramework/gramework.dockerfile +++ b/frameworks/Go/gramework/gramework.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.12 +FROM golang:1.24.2 WORKDIR /gramework diff --git a/frameworks/Go/gramework/src/go.mod b/frameworks/Go/gramework/src/go.mod index a0d6e1e03c0..dd29af0c71e 100644 --- a/frameworks/Go/gramework/src/go.mod +++ b/frameworks/Go/gramework/src/go.mod @@ -1,8 +1,35 @@ module gramework/src +go 1.24.1 + +require ( + github.com/apex/log v1.9.0 + github.com/gramework/gramework v1.8.0 +) + require ( - github.com/apex/log v1.1.0 - github.com/fatih/color v1.7.0 // indirect - github.com/gramework/gramework v1.6.2 - github.com/mattn/go-colorable v0.1.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cloudfoundry/gosigar v1.3.91 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/css v1.0.1 // indirect + github.com/gramework/utils v0.0.0-20190202181041-3c30a162ea26 // indirect + github.com/kirillDanshin/go-accept-headers v0.0.0-20130320203746-c78f304b1b09 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/microcosm-cc/bluemonday v1.0.27 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.60.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect ) diff --git a/frameworks/Go/gramework/src/go.sum b/frameworks/Go/gramework/src/go.sum index 0e58de2ce99..d09a0267907 100644 --- a/frameworks/Go/gramework/src/go.sum +++ b/frameworks/Go/gramework/src/go.sum @@ -1,81 +1,606 @@ -github.com/apex/log v1.0.0 h1:5UWeZC54mWVtOGSCjtuvDPgY/o0QxmjQgvYZ27pLVGQ= -github.com/apex/log v1.0.0/go.mod h1:yA770aXIDQrhVOIGurT/pVdfCpSq1GQV/auzMN5fzvY= -github.com/apex/log v1.1.0 h1:J5rld6WVFi6NxA6m8GJ1LJqu3+GiTFIt3mYv27gdQWI= -github.com/apex/log v1.1.0/go.mod h1:yA770aXIDQrhVOIGurT/pVdfCpSq1GQV/auzMN5fzvY= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/VictoriaMetrics/fastcache v1.7.0/go.mod h1:n7Sl+ioh/HlWeYHLSIBIE8TcZFHg/+xgvomWSS5xuEE= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= +github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= +github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/cloudfoundry/gosigar v1.1.0 h1:V/dVCzhKOdIU3WRB5inQU20s4yIgL9Dxx/Mhi0SF8eM= -github.com/cloudfoundry/gosigar v1.1.0/go.mod h1:3qLfc2GlfmwOx2+ZDaRGH3Y9fwQ0sQeaAleo2GV5pH0= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudfoundry/gosigar v1.3.2/go.mod h1:tZGd29SDghYXnEP3vX7AGanIGEVZhGWcp/2HGSt1FXg= +github.com/cloudfoundry/gosigar v1.3.91 h1:kQ01WlgD2eOT73JjIwbtxRuc+tETue9U4HrmdJFkQEQ= +github.com/cloudfoundry/gosigar v1.3.91/go.mod h1:4prTPsneAn5biiNbw+mVUxJNeAYxOEcgkqvQ7L3UIzE= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +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-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fasthttp/websocket v1.4.3/go.mod h1:5r4oKssgS7W6Zn6mPWap3NWzNPJNzUUh3baWTOhcYQk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gocarina/gocsv v0.0.0-20190129143436-91f6fc13d488 h1:KKvJw2OFJn3Bh+BziYCFit6r4I70pjEfy9vtNXoxqD0= -github.com/gocarina/gocsv v0.0.0-20190129143436-91f6fc13d488/go.mod h1:/oj50ZdPq/cUjA02lMZhijk5kR31SEydKyqah1OgBuo= -github.com/gocarina/gocsv/v2 v2.0.0-20181019111052-71f99b1720d2/go.mod h1:g7SrNGzi3lNWhpogl2lrJ6qaoQDLAwPRiWedc4B0Grs= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/gocarina/gocsv v0.0.0-20210516172204-ca9e8a8ddea8/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gramework/gramework v1.6.2 h1:zaIz5Di9OEEWP2z2QztxRonqXBmqpkAj8i7+5BcwfQ4= -github.com/gramework/gramework v1.6.2/go.mod h1:QxHQqlQnDgQCtn7hp/M4fep9c8CYL/MTblVgMsQvqpQ= -github.com/gramework/runtimer v0.0.0-20171029174549-045ac3154a31 h1:ph474iyIY7FlcYg3PeMXtvWiwVhZEfo3Z9/LtTy+Pfo= -github.com/gramework/runtimer v0.0.0-20171029174549-045ac3154a31/go.mod h1:wJlXrZVkOeGRLwODHvQcpRKopvHHsPovXNB9AB1rqwQ= -github.com/gramework/utils v0.0.0-20180427183540-d82c91416f14 h1:KBCnx7osefkcnowspN4ChqmMedSUTB9C4r3rhwrVOUk= -github.com/gramework/utils v0.0.0-20180427183540-d82c91416f14/go.mod h1:62TH8ocqQEUeIL3WbQeqYWNe/jlWnqU3ero9T1WPXsk= -github.com/graph-gophers/graphql-go v0.0.0-20180806175703-94da0f0031f9/go.mod h1:aRnZGurV3LlZ1Y+ygyx1mAV6OUfq+nu6OgpJ6jKgZ3g= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= +github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= +github.com/gramework/gramework v1.8.0 h1:cYrp2Ss9wd0ZRJCfwxFsfvslu69mOjTZ1CMrLC0GlQA= +github.com/gramework/gramework v1.8.0/go.mod h1:59mpi71VX5AIKppxZNl5F4bshkPRUeYQRHI8iCl3+nQ= +github.com/gramework/utils v0.0.0-20190202181041-3c30a162ea26 h1:mmSirDkAeuEyGfCOLpKJRvumbJl/E5badSGxXnLt9uY= +github.com/gramework/utils v0.0.0-20190202181041-3c30a162ea26/go.mod h1:62TH8ocqQEUeIL3WbQeqYWNe/jlWnqU3ero9T1WPXsk= +github.com/graph-gophers/graphql-go v1.2.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kirillDanshin/go-accept-headers v0.0.0-20130320203746-c78f304b1b09 h1:8QCKmCB7k/3XCUaisDYqSpZ/KrEsh8h3gRpeBCwOg3Q= github.com/kirillDanshin/go-accept-headers v0.0.0-20130320203746-c78f304b1b09/go.mod h1:bzzcb9Lqedgb3IPjVjtnwhBK6v5gTLrKYimXqT4a+vw= -github.com/klauspost/compress v1.4.0 h1:8nsMz3tWa9SWWPL60G1V6CUsf4lLjWLTNEtibhe8gh8= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e h1:+lIPJOWl+jSiJOc70QXJ07+2eg2Jy2EC7Mi11BWujeM= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microcosm-cc/bluemonday v1.0.15/go.mod h1:ZLvAzeakRwrGnzQEvstVzVt3ZpqOF2+sdFr0Om+ce30= +github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= +github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/onsi/ginkgo v1.2.1-0.20160409220416-2c2e9bb47b4e/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= +github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= +github.com/onsi/gomega v1.2.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.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/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= +github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/savsgio/gotils v0.0.0-20200608150037-a5f6f5aef16c/go.mod h1:TWNAOTaVzGOXq8RbEvHnhzA/A2sLZzgn0m6URjnukY8= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +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/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/valyala/bytebufferpool v0.0.0-20160817181652-e746df99fe4a h1:AOcehBWpFhYPYw0ioDTppQzgI8pAAahVCiMSKTp9rbo= -github.com/valyala/bytebufferpool v0.0.0-20160817181652-e746df99fe4a/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v0.0.0-20180831062205-5f6439b6df1c h1:Nsg22GybT+aOCsERTjVHvT+8ysOsUeBAM1/34qrKRTU= -github.com/valyala/fasthttp v0.0.0-20180831062205-5f6439b6df1c/go.mod h1:+g/po7GqyG5E+1CNgquiIxJnsXEi5vwFn5weFujbO78= -golang.org/x/crypto v0.0.0-20180830192347-182538f80094 h1:rVTAlhYa4+lCfNxmAIEOGQRoD23UqP72M3+rSWVGDTg= -golang.org/x/crypto v0.0.0-20180830192347-182538f80094/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= +github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= +github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj52Uc= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +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.14.0/go.mod h1:ol1PCaL0dX20wC0htZ7sYCsvCYmrouYra0zHzaclZhE= +github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/fasthttp v1.60.0 h1:kBRYS0lOhVJ6V+bYN8PqAHELKHtXqwq9zNMLKx1MBsw= +github.com/valyala/fasthttp v1.60.0/go.mod h1:iY4kDgV3Gc6EqhRZ8icqcmlG6bqhcDXfuHgTO4FXCvc= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/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-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20171107184841-a337091b0525/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20171114162044-bf42f188b9bc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181023152157-44b849a8bc13 h1:ICvJQ9FL9kAAfwGwpoAmcE1O51M0zE++iVRxQ3xyiGE= -golang.org/x/sys v0.0.0-20181023152157-44b849a8bc13/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/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-20210603081109-ebe580a85c40/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-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.1.1-0.20171102192421-88f656faf3f3/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= +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/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/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.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/frameworks/Go/hertz/go.mod b/frameworks/Go/hertz/go.mod index ef35c591ff5..4119d421b62 100644 --- a/frameworks/Go/hertz/go.mod +++ b/frameworks/Go/hertz/go.mod @@ -1,36 +1,37 @@ module hertz -go 1.20 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/cloudwego/hertz v0.7.1 - github.com/goccy/go-json v0.10.2 - github.com/jackc/pgx/v5 v5.5.4 + github.com/cloudwego/hertz v0.9.6 + github.com/goccy/go-json v0.10.5 + github.com/jackc/pgx/v5 v5.7.4 ) 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/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/bytedance/gopkg v0.1.2 // indirect + github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/cloudwego/gopkg v0.1.4 // indirect + github.com/cloudwego/netpoll v0.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/jackc/pgpassfile v1.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/cpuid/v2 v2.0.9 // indirect - github.com/nyaruka/phonenumbers v1.0.55 // indirect - github.com/tidwall/gjson v1.14.4 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/nyaruka/phonenumbers v1.6.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/pretty v1.2.1 // 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.31.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/arch v0.15.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect + google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/frameworks/Go/hertz/go.sum b/frameworks/Go/hertz/go.sum index c1251e56bc9..7c4f93bbbfe 100644 --- a/frameworks/Go/hertz/go.sum +++ b/frameworks/Go/hertz/go.sum @@ -1,52 +1,53 @@ -github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I= -github.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM= -github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 h1:PtwsQyQJGxf8iaPptPNaduEIu9BnrNms+pcRdHAxZaM= -github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= -github.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw= -github.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.1 h1:NqAHCaGaTzro0xMmnTCLUyRlbEP6r8MCA1cJUrH3Pu4= -github.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/cloudwego/hertz v0.7.1 h1:4M8l4zvAE6yNxzfozpxHLMnRSRRPslKNw/McH5/qFns= -github.com/cloudwego/hertz v0.7.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs= -github.com/cloudwego/netpoll v0.5.0 h1:oRrOp58cPCvK2QbMozZNDESvrxQaEHW2dCimmwH1lcU= -github.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= +github.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ= +github.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/mockey v1.2.12 h1:aeszOmGw8CPX8CRx1DZ/Glzb1yXvhjDh6jdFBNZjsU4= +github.com/bytedance/mockey v1.2.12/go.mod h1:3ZA4MQasmqC87Tw0w7Ygdy7eHIc2xgpZ8Pona5rsYIk= +github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/gopkg v0.1.4 h1:EoQiCG4sTonTPHxOGE0VlQs+sQR+Hsi2uN0qqwu8O50= +github.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI= +github.com/cloudwego/hertz v0.9.6 h1:Kj5SSPlKBC32NIN7+B/tt8O1pdDz8brMai00rqqjULQ= +github.com/cloudwego/hertz v0.9.6/go.mod h1:X5Ez52XhtszU4t+CTBGIJI4PqmcI1oSf8ULBz0SWfLo= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cloudwego/netpoll v0.7.0 h1:bDrxQaNfijRI1zyGgXHQoE/nYegL0nr+ijO1Norelc4= +github.com/cloudwego/netpoll v0.7.0/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU= 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/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -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.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= -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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= -github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk= -github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= -github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0= -github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ= 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-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/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= +github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg= -github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +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/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/nyaruka/phonenumbers v1.6.0 h1:r9ax45fFg+YLUs2X4bNXm5RAxWl00hYjFgNlv32vtHk= +github.com/nyaruka/phonenumbers v1.6.0/go.mod h1:7gjs+Lchqm49adhAKB5cdcng5ZXgt6x7Jgvi0ZorUtU= 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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= @@ -56,51 +57,87 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -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.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 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.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -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= -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.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 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/check.v1 v1.0.0-20180628173108-788fd7840127/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/frameworks/Go/hertz/hertz-gorm.dockerfile b/frameworks/Go/hertz/hertz-gorm.dockerfile index c12fc259573..d33ba5dcc6b 100644 --- a/frameworks/Go/hertz/hertz-gorm.dockerfile +++ b/frameworks/Go/hertz/hertz-gorm.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20 +FROM golang:1.24.2 ENV GO111MODULE=on WORKDIR /src/ diff --git a/frameworks/Go/hertz/hertz-gorm/go.mod b/frameworks/Go/hertz/hertz-gorm/go.mod index 761cb65fa64..ad2a290dbdd 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.mod +++ b/frameworks/Go/hertz/hertz-gorm/go.mod @@ -1,43 +1,41 @@ module hertz-gorm/main -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/cloudwego/hertz v0.7.0 - github.com/goccy/go-json v0.10.2 - gorm.io/driver/postgres v1.4.5 - gorm.io/gorm v1.25.4 + github.com/cloudwego/hertz v0.9.6 + github.com/goccy/go-json v0.10.5 + gorm.io/driver/postgres v1.5.11 + gorm.io/gorm v1.25.12 ) 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/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/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.14.3 // indirect - github.com/jackc/pgio v1.0.0 // indirect + github.com/bytedance/gopkg v0.1.2 // indirect + github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/cloudwego/gopkg v0.1.4 // indirect + github.com/cloudwego/netpoll v0.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/jackc/pgpassfile v1.0.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/pgx/v4 v4.18.2 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.4 // indirect + github.com/jackc/puddle/v2 v2.2.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 - github.com/nyaruka/phonenumbers v1.0.55 // indirect - github.com/tidwall/gjson v1.14.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/nyaruka/phonenumbers v1.6.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/pretty v1.2.1 // 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.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 + golang.org/x/arch v0.15.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect + google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/frameworks/Go/hertz/hertz-gorm/go.sum b/frameworks/Go/hertz/hertz-gorm/go.sum index 8dba8ad80e8..c67048d46ea 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.sum +++ b/frameworks/Go/hertz/hertz-gorm/go.sum @@ -1,270 +1,151 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I= -github.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM= -github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 h1:PtwsQyQJGxf8iaPptPNaduEIu9BnrNms+pcRdHAxZaM= -github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= -github.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw= -github.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.1 h1:NqAHCaGaTzro0xMmnTCLUyRlbEP6r8MCA1cJUrH3Pu4= -github.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/cloudwego/hertz v0.7.0 h1:9LFXPqHkGBNH/k/Y1h3udEloS5LVPNOUWekDfH0bQNM= -github.com/cloudwego/hertz v0.7.0/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs= -github.com/cloudwego/netpoll v0.5.0 h1:oRrOp58cPCvK2QbMozZNDESvrxQaEHW2dCimmwH1lcU= -github.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= -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/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/gopkg v0.1.2 h1:8o2feYuxknDpN+O7kPwvSXfMEKfYvJYiA2K7aonoMEQ= +github.com/bytedance/gopkg v0.1.2/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/mockey v1.2.12 h1:aeszOmGw8CPX8CRx1DZ/Glzb1yXvhjDh6jdFBNZjsU4= +github.com/bytedance/mockey v1.2.12/go.mod h1:3ZA4MQasmqC87Tw0w7Ygdy7eHIc2xgpZ8Pona5rsYIk= +github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/gopkg v0.1.4 h1:EoQiCG4sTonTPHxOGE0VlQs+sQR+Hsi2uN0qqwu8O50= +github.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI= +github.com/cloudwego/hertz v0.9.6 h1:Kj5SSPlKBC32NIN7+B/tt8O1pdDz8brMai00rqqjULQ= +github.com/cloudwego/hertz v0.9.6/go.mod h1:X5Ez52XhtszU4t+CTBGIJI4PqmcI1oSf8ULBz0SWfLo= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cloudwego/netpoll v0.7.0 h1:bDrxQaNfijRI1zyGgXHQoE/nYegL0nr+ijO1Norelc4= +github.com/cloudwego/netpoll v0.7.0/go.mod h1:PI+YrmyS7cIr0+SD4seJz3Eo3ckkXdu2ZVKBLhURLNU= 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/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -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/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -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/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= -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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= -github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk= -github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= -github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0= -github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ= -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/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= -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/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -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/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/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= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= +github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= 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/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/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg= -github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U= -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/nyaruka/phonenumbers v1.6.0 h1:r9ax45fFg+YLUs2X4bNXm5RAxWl00hYjFgNlv32vtHk= +github.com/nyaruka/phonenumbers v1.6.0/go.mod h1:7gjs+Lchqm49adhAKB5cdcng5ZXgt6x7Jgvi0ZorUtU= 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/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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 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/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -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/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= 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-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/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/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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/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.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 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-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.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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= -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/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -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.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 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= -gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= -gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= -gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= -gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= +gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/frameworks/Go/hertz/hertz.dockerfile b/frameworks/Go/hertz/hertz.dockerfile index 60252e31ffd..6af119c4351 100644 --- a/frameworks/Go/hertz/hertz.dockerfile +++ b/frameworks/Go/hertz/hertz.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.20 +FROM docker.io/golang:1.24.2 WORKDIR /hertz diff --git a/frameworks/Go/kami/kami.dockerfile b/frameworks/Go/kami/kami.dockerfile index fe22e5dd266..115e9b5e14c 100644 --- a/frameworks/Go/kami/kami.dockerfile +++ b/frameworks/Go/kami/kami.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 COPY ./src /kami WORKDIR /kami diff --git a/frameworks/Go/kami/src/go.mod b/frameworks/Go/kami/src/go.mod index 3297e41f3f6..6d7a0c8db8e 100644 --- a/frameworks/Go/kami/src/go.mod +++ b/frameworks/Go/kami/src/go.mod @@ -1,16 +1,20 @@ module kami -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-sql-driver/mysql v1.9.1 github.com/guregu/kami v2.2.1+incompatible - golang.org/x/net v0.23.0 + golang.org/x/net v0.38.0 ) require ( + filippo.io/edwards25519 v1.1.0 // indirect github.com/dimfeld/httptreemux v5.0.1+incompatible // indirect - github.com/golang/protobuf v1.3.1 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/zenazn/goji v1.0.1 // indirect - google.golang.org/appengine v1.6.7 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/frameworks/Go/kami/src/go.sum b/frameworks/Go/kami/src/go.sum index e49331ae883..fa26ea93444 100644 --- a/frameworks/Go/kami/src/go.sum +++ b/frameworks/Go/kami/src/go.sum @@ -1,20 +1,50 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/dimfeld/httptreemux v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA= github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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/guregu/kami v2.2.1+incompatible h1:G8vzA3Bx2jnm+AQOHXtHW0vTSQ7tQqfxLc5nuHFtkgI= github.com/guregu/kami v2.2.1+incompatible/go.mod h1:EWmehSBHxCbnLPj3XytBR5sht/UebNLwwFYpGcfbptQ= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/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-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= 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= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= diff --git a/frameworks/Go/pine/pine.dockerfile b/frameworks/Go/pine/pine.dockerfile index 4517e2bd98d..85a527400c5 100644 --- a/frameworks/Go/pine/pine.dockerfile +++ b/frameworks/Go/pine/pine.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.23 +FROM docker.io/golang:1.24.2 COPY ./src /pine WORKDIR /pine diff --git a/frameworks/Go/pine/src/go.mod b/frameworks/Go/pine/src/go.mod index 6b8dddc4972..f7fafc6c61b 100644 --- a/frameworks/Go/pine/src/go.mod +++ b/frameworks/Go/pine/src/go.mod @@ -2,4 +2,4 @@ module pine go 1.23.0 -require github.com/BryanMwangi/pine v1.0.6 +require github.com/BryanMwangi/pine v1.1.1 diff --git a/frameworks/Go/pine/src/go.sum b/frameworks/Go/pine/src/go.sum index f28dc6678fd..9e0303ed548 100644 --- a/frameworks/Go/pine/src/go.sum +++ b/frameworks/Go/pine/src/go.sum @@ -1,2 +1,2 @@ -github.com/BryanMwangi/pine v1.0.6 h1:35JN1FQkStoCikeVQJ2423mO5STLNEPkA/AgnjslAmg= -github.com/BryanMwangi/pine v1.0.6/go.mod h1:j6+gT+N2HeeJHc9Z60rUOnEmNC+s/Gdmh2e9oB/eScI= +github.com/BryanMwangi/pine v1.1.1 h1:E/c2Cude6LNa77554imIPbz4sZagOARiPP2bX2FG3fo= +github.com/BryanMwangi/pine v1.1.1/go.mod h1:yfO8j8e/St7qQmj3LkKNoZWZGqav2fkAJcDU6NACAp8= diff --git a/frameworks/Go/revel/revel-fast.dockerfile b/frameworks/Go/revel/revel-fast.dockerfile index eea3b0fc55d..57ae4455eda 100644 --- a/frameworks/Go/revel/revel-fast.dockerfile +++ b/frameworks/Go/revel/revel-fast.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.14 +FROM golang:1.24.2 ADD ./ /revel WORKDIR /revel diff --git a/frameworks/Go/revel/revel-jet.dockerfile b/frameworks/Go/revel/revel-jet.dockerfile index 1b13e4eae97..e33c0464efb 100644 --- a/frameworks/Go/revel/revel-jet.dockerfile +++ b/frameworks/Go/revel/revel-jet.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.14 +FROM golang:1.24.2 ADD ./ /revel WORKDIR /revel diff --git a/frameworks/Go/revel/revel-qbs.dockerfile b/frameworks/Go/revel/revel-qbs.dockerfile index 220d3539291..8252703fb1a 100644 --- a/frameworks/Go/revel/revel-qbs.dockerfile +++ b/frameworks/Go/revel/revel-qbs.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.14 +FROM golang:1.24.2 ADD ./ /revel WORKDIR /revel diff --git a/frameworks/Go/revel/revel-raw.dockerfile b/frameworks/Go/revel/revel-raw.dockerfile index e1c908592e9..1f10775f1bc 100644 --- a/frameworks/Go/revel/revel-raw.dockerfile +++ b/frameworks/Go/revel/revel-raw.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.14 +FROM golang:1.24.2 ADD ./ /revel WORKDIR /revel diff --git a/frameworks/Go/revel/revel.dockerfile b/frameworks/Go/revel/revel.dockerfile index 27c933f6d6d..9956c4e0d76 100644 --- a/frameworks/Go/revel/revel.dockerfile +++ b/frameworks/Go/revel/revel.dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.14 +FROM golang:1.24.2 ADD ./ /revel WORKDIR /revel diff --git a/frameworks/Go/silverlining/silverlining-prefork.dockerfile b/frameworks/Go/silverlining/silverlining-prefork.dockerfile index 73595cc1dc7..4883e2f9e58 100644 --- a/frameworks/Go/silverlining/silverlining-prefork.dockerfile +++ b/frameworks/Go/silverlining/silverlining-prefork.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /silverlining diff --git a/frameworks/Go/silverlining/silverlining.dockerfile b/frameworks/Go/silverlining/silverlining.dockerfile index 11b32b1d20c..b8c4e505521 100644 --- a/frameworks/Go/silverlining/silverlining.dockerfile +++ b/frameworks/Go/silverlining/silverlining.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 WORKDIR /silverlining diff --git a/frameworks/Go/silverlining/src/go.mod b/frameworks/Go/silverlining/src/go.mod index 11b0d6425f0..5566b7e6b80 100644 --- a/frameworks/Go/silverlining/src/go.mod +++ b/frameworks/Go/silverlining/src/go.mod @@ -1,14 +1,16 @@ module silverlining/app -go 1.19 +go 1.23.0 -require github.com/go-www/silverlining v1.2.1 +toolchain go1.24.1 + +require github.com/go-www/silverlining v1.3.3 require ( github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect - github.com/gobwas/ws v1.1.0 // indirect - github.com/goccy/go-json v0.9.11 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect - golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 // indirect + github.com/gobwas/ws v1.4.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect + golang.org/x/sys v0.31.0 // indirect ) diff --git a/frameworks/Go/silverlining/src/go.sum b/frameworks/Go/silverlining/src/go.sum index 4b29ae74b21..cf8f13f37b1 100644 --- a/frameworks/Go/silverlining/src/go.sum +++ b/frameworks/Go/silverlining/src/go.sum @@ -1,19 +1,23 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/go-www/silverlining v1.2.1 h1:c5Jq+hTYlPlaM9Xd4V7VmdGkyx2WrwgKiWo3t+tHSr0= -github.com/go-www/silverlining v1.2.1/go.mod h1:19uoOu+jstnafSPQ9hhZNP+/nd0gTRmyAhMG25uXy8o= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-www/silverlining v1.3.3 h1:JNt561V3tvXBD0sw/slQP5UhvADeVxXN0AnT9WiG0yA= +github.com/go-www/silverlining v1.3.3/go.mod h1:eh9Fljz24Qn4zHyXInelstw4c89RqlS8R0s7oKtBdJw= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= -github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= -github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= +github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= +github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= 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/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frameworks/Go/webgo/src/go.mod b/frameworks/Go/webgo/src/go.mod index dedb5b8dbe2..79016d6bef6 100644 --- a/frameworks/Go/webgo/src/go.mod +++ b/frameworks/Go/webgo/src/go.mod @@ -1,6 +1,8 @@ module webgo -go 1.19 +go 1.23.0 + +toolchain go1.24.1 require ( github.com/JaCoB1123/web v0.5.3 @@ -8,10 +10,10 @@ require ( ) require ( - github.com/tidwall/gjson v1.14.3 // indirect + github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // 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 + github.com/tidwall/pretty v1.2.1 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/term v0.30.0 // indirect ) diff --git a/frameworks/Go/webgo/src/go.sum b/frameworks/Go/webgo/src/go.sum index aa60740b3ad..02ce773fc11 100644 --- a/frameworks/Go/webgo/src/go.sum +++ b/frameworks/Go/webgo/src/go.sum @@ -1,27 +1,28 @@ github.com/JaCoB1123/web v0.5.3 h1:PLoZorwPqDgRNStHxbbSBXbXdiBDmJP3bgBeFXO8Jhg= github.com/JaCoB1123/web v0.5.3/go.mod h1:wX1fuLSacW6lNgIVFGTyCDsUuDyWa92iy9xXCZCidUU= 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= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= 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/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -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.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= 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/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/frameworks/Go/webgo/webgo.dockerfile b/frameworks/Go/webgo/webgo.dockerfile index 28ee3a317b2..94d40bf5105 100644 --- a/frameworks/Go/webgo/webgo.dockerfile +++ b/frameworks/Go/webgo/webgo.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/golang:1.19 +FROM docker.io/golang:1.24.2 ADD ./src /webgo WORKDIR /webgo From c3132d0faae271efdd8b9dbb04598d19edd34f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Thu, 10 Apr 2025 23:25:34 +0800 Subject: [PATCH 1371/1766] [CSharp] Add TouchSocket (#9768) * [CSharp] Add TouchSocket * Modification: Performance testing * Update: TouchSocket version * Optimization: Response Status Word * Add:gitignorefile * fixed:http date header * fixed:default docker file * Update benchmark_config.json `aspcore` was renamed to `aspnetcore` a while ago --------- Co-authored-by: Mike Smith --- frameworks/CSharp/touchsocket/.gitignore | 343 ++++++++++++++++++ frameworks/CSharp/touchsocket/Benchmarks.sln | 31 ++ frameworks/CSharp/touchsocket/README.md | 10 + .../CSharp/touchsocket/benchmark_config.json | 44 +++ frameworks/CSharp/touchsocket/config.toml | 28 ++ .../src/TouchSocketHttp/NuGet.Config | 7 + .../src/TouchSocketHttp/Program.cs | 99 +++++ .../TouchSocketHttp/TouchSocketHttp.csproj | 17 + .../src/TouchSocketWebApi/NuGet.Config | 7 + .../src/TouchSocketWebApi/Program.cs | 94 +++++ .../TouchSocketWebApi.csproj | 19 + .../appsettings.Development.json | 8 + .../src/TouchSocketWebApi/appsettings.json | 8 + .../touchsocket/touchsocket-http.dockerfile | 13 + .../CSharp/touchsocket/touchsocket.dockerfile | 13 + 15 files changed, 741 insertions(+) create mode 100644 frameworks/CSharp/touchsocket/.gitignore create mode 100644 frameworks/CSharp/touchsocket/Benchmarks.sln create mode 100644 frameworks/CSharp/touchsocket/README.md create mode 100644 frameworks/CSharp/touchsocket/benchmark_config.json create mode 100644 frameworks/CSharp/touchsocket/config.toml create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttp/NuGet.Config create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi/NuGet.Config create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.Development.json create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.json create mode 100644 frameworks/CSharp/touchsocket/touchsocket-http.dockerfile create mode 100644 frameworks/CSharp/touchsocket/touchsocket.dockerfile diff --git a/frameworks/CSharp/touchsocket/.gitignore b/frameworks/CSharp/touchsocket/.gitignore new file mode 100644 index 00000000000..d20fe97fddd --- /dev/null +++ b/frameworks/CSharp/touchsocket/.gitignore @@ -0,0 +1,343 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ +# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true +**/wwwroot/lib/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb +*.snupkg +SHFB/Help diff --git a/frameworks/CSharp/touchsocket/Benchmarks.sln b/frameworks/CSharp/touchsocket/Benchmarks.sln new file mode 100644 index 00000000000..9e760787179 --- /dev/null +++ b/frameworks/CSharp/touchsocket/Benchmarks.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31717.71 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketWebApi", "src\TouchSocketWebApi\TouchSocketWebApi.csproj", "{6BD9363A-D77F-5D90-8444-2BC37495C920}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketHttp", "src\TouchSocketHttp\TouchSocketHttp.csproj", "{A7FB43AB-672B-8854-68D7-C2B383B0BC04}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6BD9363A-D77F-5D90-8444-2BC37495C920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BD9363A-D77F-5D90-8444-2BC37495C920}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BD9363A-D77F-5D90-8444-2BC37495C920}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BD9363A-D77F-5D90-8444-2BC37495C920}.Release|Any CPU.Build.0 = Release|Any CPU + {A7FB43AB-672B-8854-68D7-C2B383B0BC04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A7FB43AB-672B-8854-68D7-C2B383B0BC04}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7FB43AB-672B-8854-68D7-C2B383B0BC04}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A7FB43AB-672B-8854-68D7-C2B383B0BC04}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {69C5D834-F31B-4F07-97EC-E4DD5AF417DE} + EndGlobalSection +EndGlobal diff --git a/frameworks/CSharp/touchsocket/README.md b/frameworks/CSharp/touchsocket/README.md new file mode 100644 index 00000000000..22524d6f70a --- /dev/null +++ b/frameworks/CSharp/touchsocket/README.md @@ -0,0 +1,10 @@ +# touchsocket benchmarks + +See [touchsocket](https://touchsocket.net/) for more information. + +## Infrastructure Software Versions + +**Language** + +* C# 8.0 + diff --git a/frameworks/CSharp/touchsocket/benchmark_config.json b/frameworks/CSharp/touchsocket/benchmark_config.json new file mode 100644 index 00000000000..7590b2a1866 --- /dev/null +++ b/frameworks/CSharp/touchsocket/benchmark_config.json @@ -0,0 +1,44 @@ +{ + "framework": "touchsocket", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "framework": "touchsocket.webapi", + "language": "C#", + "orm": "Raw", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "touchsocket", + "os": "Linux", + "database_os": "Linux", + "display_name": "touchsocket.webapi", + "notes": "", + "versus": "aspnetcore-mvc" + }, + "http": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "touchsocket.http", + "language": "C#", + "orm": "Micro", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "touchsocket", + "os": "Linux", + "database_os": "Linux", + "display_name": "touchsocket.http", + "notes": "", + "versus": "aspnetcore" + } + } + ] +} diff --git a/frameworks/CSharp/touchsocket/config.toml b/frameworks/CSharp/touchsocket/config.toml new file mode 100644 index 00000000000..4e386939aff --- /dev/null +++ b/frameworks/CSharp/touchsocket/config.toml @@ -0,0 +1,28 @@ +[framework] +name = "touchsocket" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "touchsocket.webapi" +versus = "aspcore-mvc" + +[http] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "touchsocket.http" +versus = "aspcore" diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/NuGet.Config b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/NuGet.Config new file mode 100644 index 00000000000..f05d5867888 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/NuGet.Config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs new file mode 100644 index 00000000000..f326d1bd78c --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs @@ -0,0 +1,99 @@ +using System.Text; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Sockets; +using static System.Net.Mime.MediaTypeNames; +using HttpContent = TouchSocket.Http.HttpContent; + +namespace TouchSocketHttp; + +public class Program +{ + static async Task Main(string[] args) + { + int port = 8080; + + Console.WriteLine(DateHelper.DateString); + var service = new MyHttpService(); + + await service.SetupAsync(new TouchSocketConfig() + .SetListenIPHosts(port) + .SetNoDelay(true) + .SetMaxCount(1000000) + .SetBacklog(1000) + .ConfigureContainer(a => + { + a.AddConsoleLogger(); + })); + + await service.StartAsync(); + service.Logger.Info($"server is started,port:{port}"); + while (true) + { + Console.ReadLine(); + } + } +} + +sealed class MyHttpService : HttpService +{ + protected override MyHttpSessionClient NewClient() + { + return new MyHttpSessionClient(); + } +} + +sealed class MyHttpSessionClient : HttpSessionClient +{ + private readonly HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); + private readonly HttpContent m_contentJson = new StringHttpContent("{\"message\":\"Hello, World!\"}", Encoding.UTF8, $"application/json"); + + protected override async Task OnReceivedHttpRequest(HttpContext httpContext) + { + var request = httpContext.Request; + var response = httpContext.Response; + + switch (request.RelativeURL) + { + case "/plaintext": + { + response.StatusCode = 200; + response.StatusMessage = "success"; + response.Headers.Add(HttpHeaders.Server, "T"); + response.Headers.Add(HttpHeaders.Date, DateHelper.DateString); + response.Content = m_contentPlaintext; + await response.AnswerAsync().ConfigureAwait(false); + } + break; + case "/json": + { + response.StatusCode = 200; + response.StatusMessage = "success"; + response.Headers.Add(HttpHeaders.Server, "T"); + response.Headers.Add(HttpHeaders.Date, DateHelper.DateString); + response.Content = m_contentJson; + await response.AnswerAsync().ConfigureAwait(false); + } + break; + default: + response.SetStatus(404, "not find"); + await response.AnswerAsync().ConfigureAwait(false); + break; + } + } +} + +static class DateHelper +{ + static Timer m_timer; + static DateHelper() + { + m_timer = new Timer((state) => + { + DateString = DateTime.UtcNow.ToGMTString(); + }, null, 0, 1000); + } + + public static string DateString { get; private set; } +} + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj new file mode 100644 index 00000000000..861df016264 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + Exe + enable + true + + dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb6-47d798a5a131 + true + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/NuGet.Config b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/NuGet.Config new file mode 100644 index 00000000000..f05d5867888 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/NuGet.Config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs new file mode 100644 index 00000000000..9ff88e76fa2 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -0,0 +1,94 @@ +using System.Text; +using System.Text.Json.Serialization; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Rpc; +using TouchSocket.Sockets; +using TouchSocket.WebApi; +using TouchSocket.WebApi.Swagger; +using HttpContent = TouchSocket.Http.HttpContent; + +namespace TouchSocketWebApi; + +public class Program +{ + public static void Main(string[] args) + { + var builder = Host.CreateApplicationBuilder(args); + + builder.Services.AddServiceHostedService(config => + { + config.SetListenIPHosts(8080) + .SetNoDelay(true) + .SetMaxCount(1000000) + .SetBacklog(1000) + .ConfigureContainer(a => + { + a.AddConsoleLogger(); + a.AddRpcStore(store => + { + store.RegisterServer(); + }); + }) + .ConfigurePlugins(a => + { + a.UseCheckClear(); + + a.UseWebApi() + .ConfigureConverter(converter => + { + converter.Clear(); + converter.AddSystemTextJsonSerializerFormatter(options => + { + options.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default); + }); + }); + +#if DEBUG + a.UseSwagger() + .UseLaunchBrowser(); +#endif + + a.UseDefaultHttpServicePlugin(); + }); + }); + + var host = builder.Build(); + host.Run(); + } +} + +public partial class ApiServer : RpcServer +{ + private HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); + + public static MyJson MyJson { get; set; } = new MyJson() { Message = "Hello, World!" }; + + [Router("/plaintext")] + [WebApi(Method = HttpMethodType.Get)] + public async Task Plaintext(IWebApiCallContext callContext) + { + var response= callContext.HttpContext.Response; + response.SetStatus(200, "success"); + response.Content= m_contentPlaintext; + await response.AnswerAsync(); + } + + [Router("/json")] + [WebApi(Method = HttpMethodType.Get)] + public MyJson Json() + { + return MyJson; + } +} + +[JsonSerializable(typeof(MyJson))]//ʵ1 +internal partial class AppJsonSerializerContext : JsonSerializerContext +{ + +} + +public class MyJson +{ + public string? Message { get; set; } +} \ No newline at end of file diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj new file mode 100644 index 00000000000..87b1299e11e --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + true + + dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb6-47d798a5a131 + true + + + + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.Development.json b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.Development.json new file mode 100644 index 00000000000..b2dcdb67421 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.json b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.json new file mode 100644 index 00000000000..b2dcdb67421 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/frameworks/CSharp/touchsocket/touchsocket-http.dockerfile b/frameworks/CSharp/touchsocket/touchsocket-http.dockerfile new file mode 100644 index 00000000000..ba6b39ac880 --- /dev/null +++ b/frameworks/CSharp/touchsocket/touchsocket-http.dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /app +COPY src/TouchSocketHttp . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "TouchSocketHttp.dll"] diff --git a/frameworks/CSharp/touchsocket/touchsocket.dockerfile b/frameworks/CSharp/touchsocket/touchsocket.dockerfile new file mode 100644 index 00000000000..a65674ef5d3 --- /dev/null +++ b/frameworks/CSharp/touchsocket/touchsocket.dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /app +COPY src/TouchSocketWebApi . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "TouchSocketWebApi.dll"] From 60cc7d6ed81d63d0510fddfca43807dd3ca818f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 08:25:58 -0700 Subject: [PATCH 1372/1766] Bump koa from 2.15.4 to 2.16.1 in /frameworks/JavaScript/koa (#9797) Bumps [koa](https://github.com/koajs/koa) from 2.15.4 to 2.16.1. - [Release notes](https://github.com/koajs/koa/releases) - [Changelog](https://github.com/koajs/koa/blob/master/History.md) - [Commits](https://github.com/koajs/koa/compare/2.15.4...v2.16.1) --- updated-dependencies: - dependency-name: koa dependency-version: 2.16.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/koa/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/koa/package.json b/frameworks/JavaScript/koa/package.json index eb4a7970a04..353a1d3990b 100644 --- a/frameworks/JavaScript/koa/package.json +++ b/frameworks/JavaScript/koa/package.json @@ -7,7 +7,7 @@ "dependencies": { "bluebird": "3.5.1", "handlebars": "4.3.0", - "koa": "2.15.4", + "koa": "2.16.1", "koa-bodyparser": "4.2.0", "koa-hbs": "1.0.0", "koa-router": "7.4.0", From c6006d61731bbc644ce30e3023b92241b5a88512 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 08:26:05 -0700 Subject: [PATCH 1373/1766] Bump crossbeam-channel from 0.5.11 to 0.5.15 in /frameworks/Rust/rocket (#9802) Bumps [crossbeam-channel](https://github.com/crossbeam-rs/crossbeam) from 0.5.11 to 0.5.15. - [Release notes](https://github.com/crossbeam-rs/crossbeam/releases) - [Changelog](https://github.com/crossbeam-rs/crossbeam/blob/master/CHANGELOG.md) - [Commits](https://github.com/crossbeam-rs/crossbeam/compare/crossbeam-channel-0.5.11...crossbeam-channel-0.5.15) --- updated-dependencies: - dependency-name: crossbeam-channel dependency-version: 0.5.15 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Rust/rocket/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index e42bcbef9fa..3e193d9a3eb 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -251,9 +251,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] From 7825db0ddb955052b944acce66fd536d9ade03bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 08:26:11 -0700 Subject: [PATCH 1374/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/fastapi (#9803) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 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 478fdc103e4..0c5b386b1e4 100644 --- a/frameworks/Python/fastapi/requirements.txt +++ b/frameworks/Python/fastapi/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 fastapi==0.109.1 -Jinja2==3.1.4 +Jinja2==3.1.6 ujson==5.7.0 From f42aa5cb259da5ea4b4a02d89994970e55e27ff5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 15:27:14 +0000 Subject: [PATCH 1375/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/api_hour Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 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 5db05703f22..8da47e213a8 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==23.0.0 hiredis==0.2.0 -Jinja2==3.1.4 +Jinja2==3.1.6 MarkupSafe==0.23 piprot==0.9.1 psycopg2==2.7.5 From f0741bd70c46dad0810cbd5aa18f2fdff6901032 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 15:29:40 +0000 Subject: [PATCH 1376/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/bareasgi Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 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 fb7559bce4a..53f1ec21fd9 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.4 +Jinja2==3.1.6 MarkupSafe==2.1.1 orjson==3.8.0 priority==2.0.0 From befda32440c492fdb8185ff16f31975d6963dea6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 15:33:34 +0000 Subject: [PATCH 1377/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/apidaora Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 c1247103499..4fec7b15d4f 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.1.4 +jinja2==3.1.6 uvloop==0.14.0 uvicorn==0.11.7 apidaora==0.26.0 From 520d2bbfc0be12a4bf468c723d8ede999fadb287 Mon Sep 17 00:00:00 2001 From: Lucas <77930083+lucascompython@users.noreply.github.com> Date: Thu, 10 Apr 2025 17:11:58 +0100 Subject: [PATCH 1378/1766] update python and pypy versions, and all the dependency versions (#9801) --- .../Python/fastapi/fastapi-gunicorn-orjson.dockerfile | 4 ++-- frameworks/Python/fastapi/fastapi-gunicorn-orm.dockerfile | 4 ++-- .../Python/fastapi/fastapi-hypercorn-orjson.dockerfile | 4 ++-- frameworks/Python/fastapi/fastapi-hypercorn.dockerfile | 4 ++-- .../Python/fastapi/fastapi-nginx-unit-orjson.dockerfile | 4 ++-- frameworks/Python/fastapi/fastapi-nginx-unit.dockerfile | 4 ++-- .../Python/fastapi/fastapi-socketify-asgi-pypy.dockerfile | 4 ++-- frameworks/Python/fastapi/fastapi-socketify-asgi.dockerfile | 6 +++--- frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile | 4 ++-- frameworks/Python/fastapi/fastapi-uvicorn.dockerfile | 4 ++-- frameworks/Python/fastapi/fastapi.dockerfile | 4 ++-- frameworks/Python/fastapi/requirements-gunicorn.txt | 2 +- frameworks/Python/fastapi/requirements-hypercorn.txt | 2 +- frameworks/Python/fastapi/requirements-orjson.txt | 2 +- frameworks/Python/fastapi/requirements-socketify-pypy.txt | 4 ++-- frameworks/Python/fastapi/requirements-socketify.txt | 6 +++--- frameworks/Python/fastapi/requirements-sqlalchemy.txt | 4 ++-- frameworks/Python/fastapi/requirements-uvicorn.txt | 6 +++--- frameworks/Python/fastapi/requirements.txt | 6 +++--- 19 files changed, 39 insertions(+), 39 deletions(-) diff --git a/frameworks/Python/fastapi/fastapi-gunicorn-orjson.dockerfile b/frameworks/Python/fastapi/fastapi-gunicorn-orjson.dockerfile index ac1f4c475f5..4f0712849e5 100644 --- a/frameworks/Python/fastapi/fastapi-gunicorn-orjson.dockerfile +++ b/frameworks/Python/fastapi/fastapi-gunicorn-orjson.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11 +FROM python:3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-orjson.txt requirements-gunicorn.txt requirements-uvicorn.txt ./ diff --git a/frameworks/Python/fastapi/fastapi-gunicorn-orm.dockerfile b/frameworks/Python/fastapi/fastapi-gunicorn-orm.dockerfile index fdc730bc121..64dab70e99b 100644 --- a/frameworks/Python/fastapi/fastapi-gunicorn-orm.dockerfile +++ b/frameworks/Python/fastapi/fastapi-gunicorn-orm.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11 +FROM python:3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-sqlalchemy.txt requirements-gunicorn.txt requirements-uvicorn.txt ./ diff --git a/frameworks/Python/fastapi/fastapi-hypercorn-orjson.dockerfile b/frameworks/Python/fastapi/fastapi-hypercorn-orjson.dockerfile index 231a1c218cc..fc50bd7ddae 100644 --- a/frameworks/Python/fastapi/fastapi-hypercorn-orjson.dockerfile +++ b/frameworks/Python/fastapi/fastapi-hypercorn-orjson.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11 +FROM python:3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-orjson.txt requirements-hypercorn.txt ./ diff --git a/frameworks/Python/fastapi/fastapi-hypercorn.dockerfile b/frameworks/Python/fastapi/fastapi-hypercorn.dockerfile index 761073478a7..58f2d166d12 100644 --- a/frameworks/Python/fastapi/fastapi-hypercorn.dockerfile +++ b/frameworks/Python/fastapi/fastapi-hypercorn.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11 +FROM python:3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-hypercorn.txt ./ diff --git a/frameworks/Python/fastapi/fastapi-nginx-unit-orjson.dockerfile b/frameworks/Python/fastapi/fastapi-nginx-unit-orjson.dockerfile index c8d825ad1e0..af3ed2bd75d 100644 --- a/frameworks/Python/fastapi/fastapi-nginx-unit-orjson.dockerfile +++ b/frameworks/Python/fastapi/fastapi-nginx-unit-orjson.dockerfile @@ -1,11 +1,11 @@ -FROM nginx/unit:1.29.1-python3.11 +FROM nginx/unit:1.29.1-python3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-orjson.txt ./ diff --git a/frameworks/Python/fastapi/fastapi-nginx-unit.dockerfile b/frameworks/Python/fastapi/fastapi-nginx-unit.dockerfile index 2c68413be7a..261c84d5520 100644 --- a/frameworks/Python/fastapi/fastapi-nginx-unit.dockerfile +++ b/frameworks/Python/fastapi/fastapi-nginx-unit.dockerfile @@ -1,11 +1,11 @@ -FROM nginx/unit:1.29.1-python3.11 +FROM nginx/unit:1.29.1-python3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt ./ diff --git a/frameworks/Python/fastapi/fastapi-socketify-asgi-pypy.dockerfile b/frameworks/Python/fastapi/fastapi-socketify-asgi-pypy.dockerfile index 8881c600daa..39a7e0c5b05 100644 --- a/frameworks/Python/fastapi/fastapi-socketify-asgi-pypy.dockerfile +++ b/frameworks/Python/fastapi/fastapi-socketify-asgi-pypy.dockerfile @@ -1,4 +1,4 @@ -FROM pypy:3.9-bullseye +FROM pypy:3.11-bookworm WORKDIR /fastapi @@ -13,4 +13,4 @@ COPY . ./ EXPOSE 8080 -CMD python ./app-socketify-asgi.py \ No newline at end of file +CMD python ./app-socketify-asgi.py diff --git a/frameworks/Python/fastapi/fastapi-socketify-asgi.dockerfile b/frameworks/Python/fastapi/fastapi-socketify-asgi.dockerfile index 7af7345cd37..58c39a397cd 100644 --- a/frameworks/Python/fastapi/fastapi-socketify-asgi.dockerfile +++ b/frameworks/Python/fastapi/fastapi-socketify-asgi.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-bullseye +FROM python:3.13-bullseye WORKDIR /fastapi @@ -6,7 +6,7 @@ RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN apt-get update; apt-get install libuv1 -y -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements-socketify.txt ./ @@ -16,4 +16,4 @@ COPY . ./ EXPOSE 8080 -CMD python ./app-socketify-asgi.py \ No newline at end of file +CMD python ./app-socketify-asgi.py diff --git a/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile b/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile index 2a8bfca032a..35e6b7d0030 100644 --- a/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile +++ b/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11 +FROM python:3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-orjson.txt requirements-uvicorn.txt ./ diff --git a/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile b/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile index 8a29e86ff26..7da0ea40ce3 100644 --- a/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile +++ b/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11 +FROM python:3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-uvicorn.txt ./ diff --git a/frameworks/Python/fastapi/fastapi.dockerfile b/frameworks/Python/fastapi/fastapi.dockerfile index 3f0791259e0..7208575d191 100644 --- a/frameworks/Python/fastapi/fastapi.dockerfile +++ b/frameworks/Python/fastapi/fastapi.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11 +FROM python:3.13 WORKDIR /fastapi RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -RUN pip3 install cython==0.29.33 +RUN pip3 install cython==3.0.12 COPY requirements.txt requirements-gunicorn.txt requirements-uvicorn.txt ./ diff --git a/frameworks/Python/fastapi/requirements-gunicorn.txt b/frameworks/Python/fastapi/requirements-gunicorn.txt index 9d41f264a67..4afe40e70ce 100644 --- a/frameworks/Python/fastapi/requirements-gunicorn.txt +++ b/frameworks/Python/fastapi/requirements-gunicorn.txt @@ -1 +1 @@ -gunicorn==20.1.0 +gunicorn==23.0.0 diff --git a/frameworks/Python/fastapi/requirements-hypercorn.txt b/frameworks/Python/fastapi/requirements-hypercorn.txt index 3d99222e2c6..3e0a21f2fe2 100644 --- a/frameworks/Python/fastapi/requirements-hypercorn.txt +++ b/frameworks/Python/fastapi/requirements-hypercorn.txt @@ -1 +1 @@ -hypercorn==0.14.3 +hypercorn==0.17.3 diff --git a/frameworks/Python/fastapi/requirements-orjson.txt b/frameworks/Python/fastapi/requirements-orjson.txt index 93befc16cdf..c4a1a897890 100644 --- a/frameworks/Python/fastapi/requirements-orjson.txt +++ b/frameworks/Python/fastapi/requirements-orjson.txt @@ -1 +1 @@ -orjson==3.8.7 +orjson==3.10.16 diff --git a/frameworks/Python/fastapi/requirements-socketify-pypy.txt b/frameworks/Python/fastapi/requirements-socketify-pypy.txt index 8882bf571a5..d9e462113ce 100644 --- a/frameworks/Python/fastapi/requirements-socketify-pypy.txt +++ b/frameworks/Python/fastapi/requirements-socketify-pypy.txt @@ -1,2 +1,2 @@ -fastapi==0.109.1 -git+https://github.com/cirospaciari/socketify.py.git@main#socketify \ No newline at end of file +fastapi==0.115.12 +git+https://github.com/cirospaciari/socketify.py.git@main#socketify diff --git a/frameworks/Python/fastapi/requirements-socketify.txt b/frameworks/Python/fastapi/requirements-socketify.txt index 5f4e0c71b78..1a2da3e0ef2 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.109.1 -git+https://github.com/cirospaciari/socketify.py.git@main#socketify \ No newline at end of file +orjson==3.10.16 +fastapi==0.115.12 +git+https://github.com/cirospaciari/socketify.py.git@main#socketify diff --git a/frameworks/Python/fastapi/requirements-sqlalchemy.txt b/frameworks/Python/fastapi/requirements-sqlalchemy.txt index 15b6756829e..2c6c181a0fe 100644 --- a/frameworks/Python/fastapi/requirements-sqlalchemy.txt +++ b/frameworks/Python/fastapi/requirements-sqlalchemy.txt @@ -1,2 +1,2 @@ -psycopg2==2.9.5 -SQLAlchemy==1.4.45 +psycopg2==2.9.10 +SQLAlchemy==2.0.40 diff --git a/frameworks/Python/fastapi/requirements-uvicorn.txt b/frameworks/Python/fastapi/requirements-uvicorn.txt index acd5eba32da..18c6d74e2ad 100644 --- a/frameworks/Python/fastapi/requirements-uvicorn.txt +++ b/frameworks/Python/fastapi/requirements-uvicorn.txt @@ -1,3 +1,3 @@ -uvicorn==0.20.0 -uvloop==0.17.0 -httptools==0.5.0 +uvicorn==0.34.0 +uvloop==0.21.0 +httptools==0.6.4 diff --git a/frameworks/Python/fastapi/requirements.txt b/frameworks/Python/fastapi/requirements.txt index 0c5b386b1e4..51c4ec7c426 100644 --- a/frameworks/Python/fastapi/requirements.txt +++ b/frameworks/Python/fastapi/requirements.txt @@ -1,4 +1,4 @@ -asyncpg==0.27.0 -fastapi==0.109.1 +asyncpg==0.30.0 +fastapi==0.115.12 Jinja2==3.1.6 -ujson==5.7.0 +ujson==5.10.0 \ No newline at end of file From 6443b71f75538e3a87768664d0a5be3c55129cef Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Fri, 11 Apr 2025 18:12:30 +0200 Subject: [PATCH 1379/1766] Upgrade to JDK 24, Netty 4.2 and Virtual Thread Experimental support (#9800) * Upgrade to JDK 24, Netty 4.2 and Virtual Thread Experimental support * Improving Virtual Thread performance --- frameworks/Java/netty/.sdkmanrc | 3 + frameworks/Java/netty/benchmark_config.json | 19 ++++ frameworks/Java/netty/config.toml | 13 +++ frameworks/Java/netty/netty-loom.dockerfile | 15 +++ frameworks/Java/netty/netty.dockerfile | 12 ++- frameworks/Java/netty/pom.xml | 17 ++-- frameworks/Java/netty/run_netty.sh | 14 +++ frameworks/Java/netty/run_netty_loom.sh | 18 ++++ .../netty/src/main/java/hello/Constants.java | 24 +++++ .../main/java/hello/HelloServerHandler.java | 99 ++++++------------- .../java/hello/HelloServerInitializer.java | 8 +- .../src/main/java/hello/HelloWebServer.java | 90 +++++++++-------- .../src/main/java/hello/HttpResponses.java | 45 +++++++++ .../src/main/java/hello/IoMultiplexer.java | 56 ++++++++++- .../netty/src/main/java/hello/JsonUtils.java | 78 +++++++++++++++ .../loom/HelloLoomServerInitializer.java | 21 ++++ .../src/main/java/hello/loom/LoomSupport.java | 71 +++++++++++++ .../MultithreadVirtualEventExecutorGroup.java | 56 +++++++++++ .../loom/VirtualThreadHelloServerHandler.java | 46 +++++++++ .../loom/VirtualThreadNettyScheduler.java | 95 ++++++++++++++++++ 20 files changed, 672 insertions(+), 128 deletions(-) create mode 100644 frameworks/Java/netty/.sdkmanrc create mode 100644 frameworks/Java/netty/netty-loom.dockerfile create mode 100755 frameworks/Java/netty/run_netty.sh create mode 100755 frameworks/Java/netty/run_netty_loom.sh create mode 100644 frameworks/Java/netty/src/main/java/hello/Constants.java create mode 100644 frameworks/Java/netty/src/main/java/hello/HttpResponses.java create mode 100644 frameworks/Java/netty/src/main/java/hello/JsonUtils.java create mode 100644 frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java create mode 100644 frameworks/Java/netty/src/main/java/hello/loom/LoomSupport.java create mode 100644 frameworks/Java/netty/src/main/java/hello/loom/MultithreadVirtualEventExecutorGroup.java create mode 100644 frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java create mode 100644 frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadNettyScheduler.java diff --git a/frameworks/Java/netty/.sdkmanrc b/frameworks/Java/netty/.sdkmanrc new file mode 100644 index 00000000000..2478fa5a19d --- /dev/null +++ b/frameworks/Java/netty/.sdkmanrc @@ -0,0 +1,3 @@ +# Enable auto-env through the sdkman_auto_env config +# Add key=value pairs of SDKs to use below +java=24-oracle diff --git a/frameworks/Java/netty/benchmark_config.json b/frameworks/Java/netty/benchmark_config.json index 0202931297c..79c322fef4e 100644 --- a/frameworks/Java/netty/benchmark_config.json +++ b/frameworks/Java/netty/benchmark_config.json @@ -19,6 +19,25 @@ "display_name": "netty", "notes": "", "versus": "netty" + }, + "loom": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "netty", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "netty", + "notes": "", + "versus": "netty" } }] } diff --git a/frameworks/Java/netty/config.toml b/frameworks/Java/netty/config.toml index 3780eace78d..bea6d72db37 100644 --- a/frameworks/Java/netty/config.toml +++ b/frameworks/Java/netty/config.toml @@ -13,3 +13,16 @@ orm = "Raw" platform = "Netty" webserver = "None" versus = "netty" + +[loom] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "netty" diff --git a/frameworks/Java/netty/netty-loom.dockerfile b/frameworks/Java/netty/netty-loom.dockerfile new file mode 100644 index 00000000000..1405909b099 --- /dev/null +++ b/frameworks/Java/netty/netty-loom.dockerfile @@ -0,0 +1,15 @@ +FROM maven:3.9.9-eclipse-temurin-24-noble as maven +WORKDIR /netty +COPY pom.xml pom.xml +COPY src src +RUN mvn compile assembly:single -q + +FROM maven:3.9.9-eclipse-temurin-24-noble +WORKDIR /netty +COPY --from=maven /netty/target/app.jar app.jar +COPY run_netty_loom.sh run_netty_loom.sh + +EXPOSE 8080 +# see https://github.com/netty/netty/issues/14942 +# remember to run this with --privileged since https://github.com/TechEmpower/FrameworkBenchmarks/blob/c94f7f95bd751f86a57dea8b63fb8f336bdbbde3/toolset/utils/docker_helper.py#L239 does it +ENTRYPOINT "./run_netty_loom.sh" \ No newline at end of file diff --git a/frameworks/Java/netty/netty.dockerfile b/frameworks/Java/netty/netty.dockerfile index 25636ca4f2f..ecc8cd4269d 100644 --- a/frameworks/Java/netty/netty.dockerfile +++ b/frameworks/Java/netty/netty.dockerfile @@ -1,13 +1,15 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.9.9-eclipse-temurin-24-noble as maven WORKDIR /netty COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:11.0.3-jdk-slim +FROM maven:3.9.9-eclipse-temurin-24-noble WORKDIR /netty -COPY --from=maven /netty/target/netty-example-0.1-jar-with-dependencies.jar app.jar +COPY --from=maven /netty/target/app.jar app.jar +COPY run_netty.sh run_netty.sh EXPOSE 8080 - -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.iouring.iosqeAsyncThreshold=32000", "-jar", "app.jar"] +# see https://github.com/netty/netty/issues/14942 +# remember to run this with --privileged since https://github.com/TechEmpower/FrameworkBenchmarks/blob/c94f7f95bd751f86a57dea8b63fb8f336bdbbde3/toolset/utils/docker_helper.py#L239 does it +ENTRYPOINT "./run_netty.sh" \ No newline at end of file diff --git a/frameworks/Java/netty/pom.xml b/frameworks/Java/netty/pom.xml index 3b1f26781de..c9be856b254 100644 --- a/frameworks/Java/netty/pom.xml +++ b/frameworks/Java/netty/pom.xml @@ -9,10 +9,9 @@ 0.1 - 11 - 11 - 4.1.108.Final - 0.0.21.Final + 24 + 24 + 4.2.0.Final jar @@ -21,7 +20,7 @@ io.netty - netty-codec-http + netty-all ${netty.version} @@ -40,9 +39,9 @@ - io.netty.incubator - netty-incubator-transport-native-io_uring - ${io_uring.version} + io.netty + netty-transport-native-io_uring + ${netty.version} linux-x86_64 @@ -74,6 +73,7 @@ maven-assembly-plugin + app hello.HelloWebServer @@ -82,6 +82,7 @@ jar-with-dependencies + false diff --git a/frameworks/Java/netty/run_netty.sh b/frameworks/Java/netty/run_netty.sh new file mode 100755 index 00000000000..413dff9e601 --- /dev/null +++ b/frameworks/Java/netty/run_netty.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# PROFILING: -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints +JAVA_OPTIONS="--enable-native-access=ALL-UNNAMED \ + -Dio.netty.noUnsafe=false \ + --sun-misc-unsafe-memory-access=allow \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ + -XX:+UseNUMA \ + -XX:+UseParallelGC \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + $@" + +java $JAVA_OPTIONS -jar app.jar diff --git a/frameworks/Java/netty/run_netty_loom.sh b/frameworks/Java/netty/run_netty_loom.sh new file mode 100755 index 00000000000..6cc9085441f --- /dev/null +++ b/frameworks/Java/netty/run_netty_loom.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# PROFILING: -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints +JAVA_OPTIONS="--enable-native-access=ALL-UNNAMED \ + -Dio.netty.noUnsafe=false \ + --sun-misc-unsafe-memory-access=allow \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ + -XX:+UseNUMA \ + -XX:+UseParallelGC \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + -Dhello.eventloop.carrier=true \ + -XX:+UnlockExperimentalVMOptions \ + -XX:-DoJVMTIVirtualThreadTransitions \ + -Djdk.trackAllThreads=false \ + $@" + +java $JAVA_OPTIONS -jar app.jar diff --git a/frameworks/Java/netty/src/main/java/hello/Constants.java b/frameworks/Java/netty/src/main/java/hello/Constants.java new file mode 100644 index 00000000000..63da7d66851 --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/Constants.java @@ -0,0 +1,24 @@ +package hello; + +import io.netty.util.AsciiString; +import io.netty.util.CharsetUtil; + +public class Constants { + + public static final byte[] STATIC_PLAINTEXT = "Hello, World!".getBytes(CharsetUtil.UTF_8); + public static final int STATIC_PLAINTEXT_LEN = STATIC_PLAINTEXT.length; + + public static final CharSequence PLAINTEXT_CLHEADER_VALUE = AsciiString.cached(String.valueOf(STATIC_PLAINTEXT_LEN)); + public static final int JSON_LEN = jsonLen(); + public static final CharSequence JSON_CLHEADER_VALUE = AsciiString.cached(String.valueOf(JSON_LEN)); + public static final CharSequence SERVER_NAME = AsciiString.cached("Netty"); + + private static int jsonLen() { + return JsonUtils.serializeMsg(newMsg()).length; + } + + public static Message newMsg() { + return new Message("Hello, World!"); + } + +} diff --git a/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java b/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java index c82e008c4d6..ffed975ab09 100644 --- a/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java +++ b/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java @@ -1,28 +1,20 @@ package hello; -import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH; -import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE; -import static io.netty.handler.codec.http.HttpHeaderNames.DATE; -import static io.netty.handler.codec.http.HttpHeaderNames.SERVER; -import static io.netty.handler.codec.http.HttpHeaderValues.APPLICATION_JSON; -import static io.netty.handler.codec.http.HttpHeaderValues.TEXT_PLAIN; +import static hello.HttpResponses.makeJsonResponse; +import static hello.HttpResponses.makePlaintextResponse; +import static hello.JsonUtils.acquireJsonStreamFromEventLoop; +import static hello.JsonUtils.releaseJsonStreamFromEventLoop; import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND; -import static io.netty.handler.codec.http.HttpResponseStatus.OK; import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; -import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Date; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import com.jsoniter.output.JsonStream; -import com.jsoniter.output.JsonStreamPool; -import com.jsoniter.spi.JsonException; -import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; @@ -33,51 +25,21 @@ import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.LastHttpContent; import io.netty.util.AsciiString; -import io.netty.util.CharsetUtil; import io.netty.util.ReferenceCountUtil; import io.netty.util.concurrent.FastThreadLocal; public class HelloServerHandler extends ChannelInboundHandlerAdapter { - private static final FastThreadLocal FORMAT = new FastThreadLocal() { - @Override - protected DateFormat initialValue() { - return new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z"); - } - }; - - private static Message newMsg() { - return new Message("Hello, World!"); - } - - private static byte[] serializeMsg(Message obj) { - JsonStream stream = JsonStreamPool.borrowJsonStream(); - try { - stream.reset(null); - stream.writeVal(Message.class, obj); - return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); - } catch (IOException e) { - throw new JsonException(e); - } finally { - JsonStreamPool.returnJsonStream(stream); - } - } - - private static int jsonLen() { - return serializeMsg(newMsg()).length; - } + private static final FastThreadLocal FORMAT = new FastThreadLocal<>() { + @Override + protected DateFormat initialValue() { + return new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z"); + } + }; - private static final byte[] STATIC_PLAINTEXT = "Hello, World!".getBytes(CharsetUtil.UTF_8); - private static final int STATIC_PLAINTEXT_LEN = STATIC_PLAINTEXT.length; + protected volatile AsciiString date = new AsciiString(FORMAT.get().format(new Date())); - private static final CharSequence PLAINTEXT_CLHEADER_VALUE = AsciiString.cached(String.valueOf(STATIC_PLAINTEXT_LEN)); - private static final int JSON_LEN = jsonLen(); - private static final CharSequence JSON_CLHEADER_VALUE = AsciiString.cached(String.valueOf(JSON_LEN)); - private static final CharSequence SERVER_NAME = AsciiString.cached("Netty"); - - private volatile CharSequence date = new AsciiString(FORMAT.get().format(new Date())); - - HelloServerHandler(ScheduledExecutorService service) { + public HelloServerHandler(ScheduledExecutorService service) { service.scheduleWithFixedDelay(new Runnable() { private final DateFormat format = FORMAT.get(); @@ -118,42 +80,39 @@ private void process(ChannelHandlerContext ctx, HttpRequest request) throws Exce String uri = request.uri(); switch (uri) { case "/plaintext": - writePlainResponse(ctx, Unpooled.wrappedBuffer(STATIC_PLAINTEXT)); + writePlainResponse(ctx, date); return; case "/json": - byte[] json = serializeMsg(newMsg()); - writeJsonResponse(ctx, Unpooled.wrappedBuffer(json)); + // even for the virtual thread case we expect virtual threads to be executed inlined! + var stream = acquireJsonStreamFromEventLoop(); + try { + writeJsonResponse(ctx, stream, date); + } finally { + releaseJsonStreamFromEventLoop(stream); + } return; } + // we drain in-flight responses before closing the connection + channelReadComplete(ctx); FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, NOT_FOUND, Unpooled.EMPTY_BUFFER, false); - ctx.write(response).addListener(ChannelFutureListener.CLOSE); - } - - private void writePlainResponse(ChannelHandlerContext ctx, ByteBuf buf) { - ctx.write(makeResponse(buf, TEXT_PLAIN, PLAINTEXT_CLHEADER_VALUE), ctx.voidPromise()); + ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); } - private void writeJsonResponse(ChannelHandlerContext ctx, ByteBuf buf) { - ctx.write(makeResponse(buf, APPLICATION_JSON, JSON_CLHEADER_VALUE), ctx.voidPromise()); + protected void writePlainResponse(ChannelHandlerContext ctx, AsciiString date) { + ctx.write(makePlaintextResponse(date), ctx.voidPromise()); } - private FullHttpResponse makeResponse(ByteBuf buf, CharSequence contentType, CharSequence contentLength) { - final FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, buf, false); - response.headers() - .set(CONTENT_TYPE, contentType) - .set(SERVER, SERVER_NAME) - .set(DATE, date) - .set(CONTENT_LENGTH, contentLength); - return response; + protected void writeJsonResponse(ChannelHandlerContext ctx, JsonStream stream, AsciiString date) { + ctx.write(makeJsonResponse(stream, date), ctx.voidPromise()); } @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { ctx.close(); } @Override - public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } } diff --git a/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java b/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java index 060dd49930c..67692802a83 100644 --- a/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java +++ b/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java @@ -14,7 +14,7 @@ public class HelloServerInitializer extends ChannelInitializer { - private final ScheduledExecutorService service; + protected final ScheduledExecutorService service; public HelloServerInitializer(ScheduledExecutorService service) { this.service = service; @@ -46,6 +46,10 @@ protected boolean isContentAlwaysEmpty(final HttpMessage msg) { return false; } }) - .addLast("handler", new HelloServerHandler(service)); + .addLast("handler", newHelloServerHandler(service)); + } + + protected HelloServerHandler newHelloServerHandler(ScheduledExecutorService service) { + return new HelloServerHandler(service); } } diff --git a/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java b/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java index 84cc86ab273..cca8e555113 100644 --- a/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java +++ b/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java @@ -2,30 +2,35 @@ import java.net.InetSocketAddress; +import hello.loom.HelloLoomServerInitializer; +import hello.loom.LoomSupport; +import hello.loom.MultithreadVirtualEventExecutorGroup; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.ServerChannel; -import io.netty.channel.epoll.Epoll; import io.netty.channel.epoll.EpollChannelOption; -import io.netty.channel.epoll.EpollEventLoopGroup; -import io.netty.channel.epoll.EpollServerSocketChannel; -import io.netty.channel.kqueue.KQueue; -import io.netty.channel.kqueue.KQueueServerSocketChannel; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.incubator.channel.uring.IOUring; -import io.netty.incubator.channel.uring.IOUringChannelOption; -import io.netty.incubator.channel.uring.IOUringEventLoopGroup; -import io.netty.incubator.channel.uring.IOUringServerSocketChannel; +import io.netty.channel.uring.IoUringChannelOption; import io.netty.util.ResourceLeakDetector; import io.netty.util.ResourceLeakDetector.Level; public class HelloWebServer { + private static final boolean EVENT_LOOP_CARRIER = Boolean.getBoolean("hello.eventloop.carrier"); + private static final IoMultiplexer PREFERRED_TRANSPORT; + static { ResourceLeakDetector.setLevel(Level.DISABLED); + String transportName = System.getProperty("hello.transport"); + if (transportName != null) { + try { + PREFERRED_TRANSPORT = IoMultiplexer.valueOf(transportName); + } catch (IllegalArgumentException e) { + System.err.println("Invalid transport name: " + transportName); + throw e; + } + } else { + PREFERRED_TRANSPORT = IoMultiplexer.type(); + } } private final int port; @@ -35,47 +40,46 @@ public HelloWebServer(int port) { } public void run() throws Exception { - // Configure the server. - if (IOUring.isAvailable()) { - doRun(new IOUringEventLoopGroup(Runtime.getRuntime().availableProcessors()), IOUringServerSocketChannel.class, IoMultiplexer.IO_URING); - } else - if (Epoll.isAvailable()) { - doRun(new EpollEventLoopGroup(), EpollServerSocketChannel.class, IoMultiplexer.EPOLL); - } else if (KQueue.isAvailable()) { - doRun(new EpollEventLoopGroup(), KQueueServerSocketChannel.class, IoMultiplexer.KQUEUE); - } else { - doRun(new NioEventLoopGroup(), NioServerSocketChannel.class, IoMultiplexer.JDK); + final var preferredTransport = PREFERRED_TRANSPORT; + System.out.printf("Using %s IoMultiplexer%n", preferredTransport); + final int coreCount = Runtime.getRuntime().availableProcessors(); + final var group = EVENT_LOOP_CARRIER? + preferredTransport.newVirtualEventExecutorGroup(coreCount) : + preferredTransport.newEventLoopGroup(coreCount); + if (EVENT_LOOP_CARRIER) { + LoomSupport.checkSupported(); + System.out.println("Using EventLoop optimized for Loom"); } - } - - private void doRun(EventLoopGroup loupGroup, Class serverChannelClass, IoMultiplexer multiplexer) throws InterruptedException { try { - InetSocketAddress inet = new InetSocketAddress(port); - - System.out.printf("Using %s IoMultiplexer%n", multiplexer); + final var serverChannelClass = preferredTransport.serverChannelClass(); + var inet = new InetSocketAddress(port); + var b = new ServerBootstrap(); - ServerBootstrap b = new ServerBootstrap(); - - if (multiplexer == IoMultiplexer.EPOLL) { - b.option(EpollChannelOption.SO_REUSEPORT, true); - } - - if (multiplexer == IoMultiplexer.IO_URING) { - b.option(IOUringChannelOption.SO_REUSEPORT, true); - } - b.option(ChannelOption.SO_BACKLOG, 8192); b.option(ChannelOption.SO_REUSEADDR, true); - b.group(loupGroup).channel(serverChannelClass).childHandler(new HelloServerInitializer(loupGroup.next())); + switch (preferredTransport) { + case EPOLL: + b.option(EpollChannelOption.SO_REUSEPORT, true); + break; + case IO_URING: + b.option(IoUringChannelOption.SO_REUSEPORT, true); + break; + } + var channelB = b.group(group).channel(serverChannelClass); + if (EVENT_LOOP_CARRIER) { + channelB.childHandler(new HelloLoomServerInitializer((MultithreadVirtualEventExecutorGroup) group, group.next())); + } else { + channelB.childHandler(new HelloServerInitializer(group.next())); + } b.childOption(ChannelOption.SO_REUSEADDR, true); Channel ch = b.bind(inet).sync().channel(); - System.out.printf("Httpd started. Listening on: %s%n", inet.toString()); + System.out.printf("Httpd started. Listening on: %s%n", inet); ch.closeFuture().sync(); } finally { - loupGroup.shutdownGracefully().sync(); + group.shutdownGracefully().sync(); } } @@ -87,5 +91,7 @@ public static void main(String[] args) throws Exception { port = 8080; } new HelloWebServer(port).run(); + + } } diff --git a/frameworks/Java/netty/src/main/java/hello/HttpResponses.java b/frameworks/Java/netty/src/main/java/hello/HttpResponses.java new file mode 100644 index 00000000000..64b88ccf086 --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/HttpResponses.java @@ -0,0 +1,45 @@ +package hello; + +import static hello.Constants.JSON_CLHEADER_VALUE; +import static hello.Constants.PLAINTEXT_CLHEADER_VALUE; +import static hello.Constants.SERVER_NAME; +import static hello.Constants.STATIC_PLAINTEXT; +import static hello.Constants.newMsg; +import static hello.JsonUtils.serializeMsg; +import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH; +import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE; +import static io.netty.handler.codec.http.HttpHeaderNames.DATE; +import static io.netty.handler.codec.http.HttpHeaderNames.SERVER; +import static io.netty.handler.codec.http.HttpHeaderValues.APPLICATION_JSON; +import static io.netty.handler.codec.http.HttpHeaderValues.TEXT_PLAIN; +import static io.netty.handler.codec.http.HttpResponseStatus.OK; +import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; + +import com.jsoniter.output.JsonStream; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.util.AsciiString; + +public class HttpResponses { + + public static FullHttpResponse makePlaintextResponse(AsciiString date) { + return makeResponse(Unpooled.wrappedBuffer(STATIC_PLAINTEXT), TEXT_PLAIN, PLAINTEXT_CLHEADER_VALUE, date); + } + + public static FullHttpResponse makeJsonResponse(JsonStream stream, AsciiString date) { + return makeResponse(Unpooled.wrappedBuffer(serializeMsg(newMsg(), stream)), APPLICATION_JSON, JSON_CLHEADER_VALUE, date); + } + + private static FullHttpResponse makeResponse(ByteBuf buf, CharSequence contentType, CharSequence contentLength, AsciiString date) { + final FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, buf, false); + response.headers() + .set(CONTENT_TYPE, contentType) + .set(SERVER, SERVER_NAME) + .set(DATE, date) + .set(CONTENT_LENGTH, contentLength); + return response; + } +} diff --git a/frameworks/Java/netty/src/main/java/hello/IoMultiplexer.java b/frameworks/Java/netty/src/main/java/hello/IoMultiplexer.java index 4a58e4f01b5..d50d5e13464 100644 --- a/frameworks/Java/netty/src/main/java/hello/IoMultiplexer.java +++ b/frameworks/Java/netty/src/main/java/hello/IoMultiplexer.java @@ -1,5 +1,59 @@ package hello; +import hello.loom.MultithreadVirtualEventExecutorGroup; +import io.netty.channel.IoHandlerFactory; +import io.netty.channel.MultiThreadIoEventLoopGroup; +import io.netty.channel.ServerChannel; +import io.netty.channel.epoll.Epoll; +import io.netty.channel.epoll.EpollIoHandler; +import io.netty.channel.epoll.EpollServerSocketChannel; +import io.netty.channel.kqueue.KQueue; +import io.netty.channel.kqueue.KQueueIoHandler; +import io.netty.channel.kqueue.KQueueServerSocketChannel; +import io.netty.channel.nio.NioIoHandler; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.uring.IoUring; +import io.netty.channel.uring.IoUringIoHandler; +import io.netty.channel.uring.IoUringServerSocketChannel; + public enum IoMultiplexer { - EPOLL, KQUEUE, JDK, IO_URING + EPOLL, KQUEUE, JDK, IO_URING; + + public Class serverChannelClass() { + return switch (this) { + case EPOLL -> EpollServerSocketChannel.class; + case KQUEUE -> KQueueServerSocketChannel.class; + case JDK -> NioServerSocketChannel.class; + case IO_URING -> IoUringServerSocketChannel.class; + }; + } + + public IoHandlerFactory newIoHandlerFactory() { + return switch (this) { + case EPOLL -> EpollIoHandler.newFactory(); + case KQUEUE -> KQueueIoHandler.newFactory(); + case JDK -> NioIoHandler.newFactory(); + case IO_URING -> IoUringIoHandler.newFactory(); + }; + } + + public MultiThreadIoEventLoopGroup newEventLoopGroup(int nThreads) { + return new MultiThreadIoEventLoopGroup(nThreads, newIoHandlerFactory()); + } + + public MultithreadVirtualEventExecutorGroup newVirtualEventExecutorGroup(int nThreads) { + return new MultithreadVirtualEventExecutorGroup(nThreads, newIoHandlerFactory()); + } + + public static IoMultiplexer type() { + if (IoUring.isAvailable()) { + return IO_URING; + } else if (Epoll.isAvailable()) { + return EPOLL; + } else if (KQueue.isAvailable()) { + return KQUEUE; + } else { + return JDK; + } + } } \ No newline at end of file diff --git a/frameworks/Java/netty/src/main/java/hello/JsonUtils.java b/frameworks/Java/netty/src/main/java/hello/JsonUtils.java new file mode 100644 index 00000000000..4b7ca5723ed --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/JsonUtils.java @@ -0,0 +1,78 @@ +package hello; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.util.Arrays; + +import com.jsoniter.output.JsonStream; +import com.jsoniter.output.JsonStreamPool; +import com.jsoniter.spi.Config; +import com.jsoniter.spi.JsonException; + +import io.netty.util.concurrent.FastThreadLocal; + +public class JsonUtils { + + private static final VarHandle INDENTATION; + + static { + try { + var lookup = MethodHandles.privateLookupIn(JsonStream.class, MethodHandles.lookup()); + INDENTATION = lookup.findVarHandle(JsonStream.class, "indention", int.class); + var dummy = new JsonStream(null, 32); + INDENTATION.set(dummy, 4); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void setIndentation(JsonStream stream, int value) { + INDENTATION.set(stream, value); // Plain store + } + + private static final FastThreadLocal JSON_STREAM = new FastThreadLocal<>(); + + public static JsonStream acquireJsonStreamFromEventLoop() { + var stream = JSON_STREAM.get(); + if (stream == null) { + stream = new JsonStream(null, 512) { + // this is to save virtual threads to use thread locals + @Override + public Config currentConfig() { + return Config.INSTANCE; + } + }; + } else { + stream.reset(null); + JSON_STREAM.set(null); + } + return stream; + } + + public static JsonStream releaseJsonStreamFromEventLoop(JsonStream jsonStream) { + jsonStream.configCache = null; + setIndentation(jsonStream, 0); + JSON_STREAM.set(jsonStream); + return jsonStream; + } + + public static byte[] serializeMsg(Message message) { + var stream = JsonStreamPool.borrowJsonStream(); + try { + return serializeMsg(message, stream); + } finally { + // Reset the stream to avoid memory leaks + JsonStreamPool.returnJsonStream(stream); + } + } + + public static byte[] serializeMsg(Message obj, JsonStream stream) { + try { + stream.writeVal(Message.class, obj); + return Arrays.copyOfRange(stream.buffer().data(), 0, stream.buffer().tail()); + } catch (IOException e) { + throw new JsonException(e); + } + } +} diff --git a/frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java b/frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java new file mode 100644 index 00000000000..afa5db2cac5 --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java @@ -0,0 +1,21 @@ +package hello.loom; + +import java.util.concurrent.ScheduledExecutorService; + +import hello.HelloServerHandler; +import hello.HelloServerInitializer; + +public class HelloLoomServerInitializer extends HelloServerInitializer { + + private final MultithreadVirtualEventExecutorGroup group; + + public HelloLoomServerInitializer(MultithreadVirtualEventExecutorGroup group, ScheduledExecutorService service) { + super(service); + this.group = group; + } + + @Override + protected HelloServerHandler newHelloServerHandler(ScheduledExecutorService service) { + return new VirtualThreadHelloServerHandler(service, group); + } +} diff --git a/frameworks/Java/netty/src/main/java/hello/loom/LoomSupport.java b/frameworks/Java/netty/src/main/java/hello/loom/LoomSupport.java new file mode 100644 index 00000000000..2349072bbd2 --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/loom/LoomSupport.java @@ -0,0 +1,71 @@ +package hello.loom; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; +import java.util.concurrent.Executor; + +public final class LoomSupport { + private static final boolean SUPPORTED; + private static Throwable FAILURE; + + private static final MethodHandle SCHEDULER; + + static { + boolean sup; + MethodHandle scheduler; + try { + // this is required to override the default scheduler + MethodHandles.Lookup lookup = MethodHandles.lookup(); + Field schedulerField = Class.forName("java.lang.ThreadBuilders$VirtualThreadBuilder") + .getDeclaredField("scheduler"); + schedulerField.setAccessible(true); + scheduler = lookup.unreflectSetter(schedulerField); + + // this is to make sure we fail earlier! + var builder = Thread.ofVirtual(); + scheduler.invoke(builder, new Executor() { + @Override + public void execute(Runnable command) { + + } + }); + + FAILURE = null; + + sup = true; + } catch (Throwable e) { + scheduler = null; + sup = false; + FAILURE = e; + } + + SCHEDULER = scheduler; + SUPPORTED = sup; + } + + private LoomSupport() { + } + + public static boolean isSupported() { + return SUPPORTED; + } + + public static void checkSupported() { + if (!isSupported()) { + throw new UnsupportedOperationException(FAILURE); + } + } + + + public static Thread.Builder.OfVirtual setVirtualThreadFactoryScheduler(Thread.Builder.OfVirtual builder, + Executor vthreadScheduler) { + checkSupported(); + try { + SCHEDULER.invoke(builder, vthreadScheduler); + return builder; + } catch (Throwable e) { + throw new RuntimeException(e); + } + } +} diff --git a/frameworks/Java/netty/src/main/java/hello/loom/MultithreadVirtualEventExecutorGroup.java b/frameworks/Java/netty/src/main/java/hello/loom/MultithreadVirtualEventExecutorGroup.java new file mode 100644 index 00000000000..bd099534700 --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/loom/MultithreadVirtualEventExecutorGroup.java @@ -0,0 +1,56 @@ +package hello.loom; + +import java.util.IdentityHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadFactory; + +import io.netty.channel.IoEventLoop; +import io.netty.channel.IoHandlerFactory; +import io.netty.channel.MultiThreadIoEventLoopGroup; +import io.netty.util.concurrent.FastThreadLocal; +import io.netty.util.concurrent.FastThreadLocalThread; + +public class MultithreadVirtualEventExecutorGroup extends MultiThreadIoEventLoopGroup { + + public static final int RESUMED_CONTINUATIONS_EXPECTED_COUNT = Integer.getInteger("io.netty.loom.resumed.continuations", 1024); + private ThreadFactory threadFactory; + private IdentityHashMap schedulers; + private final FastThreadLocal v_thread_factory = new FastThreadLocal<>() { + @Override + protected ThreadFactory initialValue() { + var scheduler = schedulers.get(Thread.currentThread()); + if (scheduler == null) { + return null; + } + return LoomSupport.setVirtualThreadFactoryScheduler(Thread.ofVirtual(), scheduler).factory(); + } + }; + + public MultithreadVirtualEventExecutorGroup(int nThreads, IoHandlerFactory ioHandlerFactory) { + super(nThreads, (Executor) command -> { + throw new UnsupportedOperationException("this executor is not supposed to be used"); + }, ioHandlerFactory); + } + + public ThreadFactory eventLoopVirtualThreadFactory() { + if (!(Thread.currentThread() instanceof FastThreadLocalThread)) { + throw new IllegalStateException("this method should be called from event loop fast thread local threads"); + } + return v_thread_factory.get(); + } + + @Override + protected IoEventLoop newChild(Executor executor, IoHandlerFactory ioHandlerFactory, + @SuppressWarnings("unused") Object... args) { + if (threadFactory == null) { + threadFactory = newDefaultThreadFactory(); + } + var scheduler = new VirtualThreadNettyScheduler(this, threadFactory, ioHandlerFactory, RESUMED_CONTINUATIONS_EXPECTED_COUNT); + if (schedulers == null) { + schedulers = new IdentityHashMap<>(); + } + schedulers.put(scheduler.getCarrierThread(), scheduler); + return scheduler.ioEventLoop(); + } + +} diff --git a/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java b/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java new file mode 100644 index 00000000000..9b93088fe0f --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java @@ -0,0 +1,46 @@ +package hello.loom; + +import java.util.ArrayDeque; +import java.util.concurrent.ScheduledExecutorService; + +import com.jsoniter.output.JsonStream; + +import hello.HelloServerHandler; +import hello.HttpResponses; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.util.AsciiString; + +public class VirtualThreadHelloServerHandler extends HelloServerHandler { + + private final ArrayDeque responses = new ArrayDeque<>(); + private final MultithreadVirtualEventExecutorGroup group; + + public VirtualThreadHelloServerHandler(ScheduledExecutorService service, MultithreadVirtualEventExecutorGroup group) { + super(service); + this.group = group; + } + + @Override + protected void writePlainResponse(ChannelHandlerContext ctx, AsciiString date) { + group.eventLoopVirtualThreadFactory().newThread(() -> { + responses.add(HttpResponses.makePlaintextResponse(date)); + }).start(); + } + + @Override + protected void writeJsonResponse(ChannelHandlerContext ctx, JsonStream stream, AsciiString date) { + group.eventLoopVirtualThreadFactory().newThread(() -> { + responses.add(HttpResponses.makeJsonResponse(stream, date)); + }).start(); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) { + var responses = this.responses; + for (int i = 0, count = responses.size(); i < count; i++) { + ctx.write(responses.poll()); + } + ctx.flush(); + } +} diff --git a/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadNettyScheduler.java b/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadNettyScheduler.java new file mode 100644 index 00000000000..8a6f59ca346 --- /dev/null +++ b/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadNettyScheduler.java @@ -0,0 +1,95 @@ +package hello.loom; + +import java.util.concurrent.Executor; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +import io.netty.channel.IoEventLoopGroup; +import io.netty.channel.IoHandlerFactory; +import io.netty.channel.ManualIoEventLoop; +import io.netty.util.internal.shaded.org.jctools.queues.MpscUnboundedArrayQueue; + +public class VirtualThreadNettyScheduler implements Executor { + + private static final long MAX_WAIT_TASKS_NS = TimeUnit.SECONDS.toNanos(1); + private static final long MAX_RUN_CONTINUATIONS_NS = TimeUnit.SECONDS.toNanos(1); + + private final MpscUnboundedArrayQueue externalContinuations; + private final ManualIoEventLoop ioEventLoop; + private final Thread carrierThread; + + + public VirtualThreadNettyScheduler(IoEventLoopGroup parent, ThreadFactory threadFactory, IoHandlerFactory ioHandlerFactory, int resumedContinuationsExpectedCount) { + this.externalContinuations = new MpscUnboundedArrayQueue<>(resumedContinuationsExpectedCount); + this.carrierThread = threadFactory.newThread(this::internalRun); + this.ioEventLoop = new ManualIoEventLoop(parent, carrierThread, ioHandlerFactory); + // we can start the carrier only after all the fields are initialized + carrierThread.start(); + } + + public Thread getCarrierThread() { + return carrierThread; + } + + public ManualIoEventLoop ioEventLoop() { + return ioEventLoop; + } + + private void internalRun() { + var ioEventLoop = this.ioEventLoop; + while (!ioEventLoop.isShuttingDown()) { + // runnning I/O and async tasks within Netty without blocking + int workDone = ioEventLoop.runNow(); + workDone += runExternalContinuations(MAX_RUN_CONTINUATIONS_NS); + if (workDone == 0 && externalContinuations.isEmpty()) { + ioEventLoop.run(MAX_WAIT_TASKS_NS); + } + } + while (!ioEventLoop.isTerminated()) { + ioEventLoop.runNow(); + runExternalContinuations(MAX_RUN_CONTINUATIONS_NS); + } + while (!externalContinuations.isEmpty()) { + runExternalContinuations(MAX_RUN_CONTINUATIONS_NS); + } + } + + private int runExternalContinuations(long deadlineNs) { + final long startDrainingNs = System.nanoTime(); + int executed = 0; + for (; ; ) { + var continuation = this.externalContinuations.poll(); + if (continuation == null) { + break; + } + try { + continuation.run(); + } catch (Throwable t) { + // this shouldn't really happen + } + executed++; + long elapsedNs = System.nanoTime() - startDrainingNs; + if (elapsedNs >= deadlineNs) { + return executed; + } + } + return executed; + } + + @Override + public void execute(Runnable command) { + // TODO improve it using a reject handler? It's not too strict!? + if (ioEventLoop.isShuttingDown()) { + throw new RejectedExecutionException("event loop is shutting down"); + } + if (ioEventLoop.inEventLoop(Thread.currentThread())) { + command.run(); + } else { + externalContinuations.offer(command); + // wakeup won't happen if we're shutting down! + ioEventLoop.wakeup(); + } + } + +} From 678c848d10be07ac0e1454666261c1b40172f3ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sat, 12 Apr 2025 00:13:14 +0800 Subject: [PATCH 1380/1766] upgrade feat (#9808) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 适配最新版 * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket --- frameworks/Java/smart-socket/pom.xml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index ce10ecfc94b..b3af9102555 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -11,7 +11,7 @@ 21 21 2.17.1 - 2.9.1 + 3.1-SNAPSHOT 5.0.0 0.9.23 @@ -20,12 +20,12 @@ tech.smartboot.feat feat-cloud-starter - 0.8.2 + 0.8.3-SNAPSHOT io.github.smartboot.socket aio-pro - 1.6.56 + 1.5.57 tech.smartboot.servlet @@ -88,9 +88,15 @@ https://repo.maven.apache.org/maven2 - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots + Central Portal Snapshots + central-portal-snapshots + https://central.sonatype.com/repository/maven-snapshots/ + + false + + + true + From 49c393a63cbc6ceea60e18b125a1177788aa9a98 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Apr 2025 16:13:41 +0000 Subject: [PATCH 1381/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/blacksheep Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 a93cbff6efa..c30bac3dc23 100644 --- a/frameworks/Python/blacksheep/requirements.txt +++ b/frameworks/Python/blacksheep/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 -Jinja2==3.1.4 +Jinja2==3.1.6 blacksheep==1.2.13 ujson==5.7.0 From fb78929b969fe59b02e34639ee0c630fffb67cbf Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Mon, 14 Apr 2025 19:01:09 +0200 Subject: [PATCH 1382/1766] [Python] Bump Granian to 2.2 (#9811) --- frameworks/Python/granian/app_asgi.py | 28 +++++++++++++++---- frameworks/Python/granian/app_rsgi.py | 16 +++++++---- .../Python/granian/granian-rsgi.dockerfile | 2 +- .../Python/granian/granian-wrk.dockerfile | 2 +- .../Python/granian/granian-wsgi.dockerfile | 2 +- frameworks/Python/granian/granian.dockerfile | 2 +- frameworks/Python/granian/requirements.txt | 2 +- frameworks/Python/granian/run.py | 4 +-- 8 files changed, 40 insertions(+), 18 deletions(-) diff --git a/frameworks/Python/granian/app_asgi.py b/frameworks/Python/granian/app_asgi.py index f7cc2324175..35e09133777 100644 --- a/frameworks/Python/granian/app_asgi.py +++ b/frameworks/Python/granian/app_asgi.py @@ -55,8 +55,6 @@ async def pg_setup(): with Path('templates/fortune.html').open('r') as f: template = jinja2.Template(f.read()) -asyncio.get_event_loop().run_until_complete(pg_setup()) - def get_num_queries(scope): try: @@ -178,6 +176,26 @@ async def handle_404(scope, receive, send): } -def main(scope, receive, send): - handler = routes.get(scope['path'], handle_404) - return handler(scope, receive, send) +class App: + __slots__ = ["_handler"] + + def __init__(self): + self._handler = self._lifespan + + def __call__(self, scope, receive, send): + return self._handler(scope, receive, send) + + async def _lifespan(self, scope, receive, send): + if scope['type'] == 'lifespan': + message = await receive() + if message['type'] == 'lifespan.startup': + await pg_setup() + self._handler = self._asgi + await send({'type': 'lifespan.startup.complete'}) + + def _asgi(self, scope, receive, send): + handler = routes.get(scope['path'], handle_404) + return handler(scope, receive, send) + + +main = App() diff --git a/frameworks/Python/granian/app_rsgi.py b/frameworks/Python/granian/app_rsgi.py index dc1eeba7e2c..04a777460b1 100644 --- a/frameworks/Python/granian/app_rsgi.py +++ b/frameworks/Python/granian/app_rsgi.py @@ -1,4 +1,3 @@ -import asyncio import os from operator import itemgetter @@ -37,8 +36,6 @@ async def pg_setup(): with Path('templates/fortune.html').open('r') as f: template = jinja2.Template(f.read()) -asyncio.get_event_loop().run_until_complete(pg_setup()) - def get_num_queries(scope): try: @@ -152,6 +149,13 @@ async def handle_404(scope, proto): } -def main(scope, proto): - handler = routes.get(scope.path, handle_404) - return handler(scope, proto) +class App: + def __rsgi_init__(self, loop): + loop.run_until_complete(pg_setup()) + + def __rsgi__(self, scope, proto): + handler = routes.get(scope.path, handle_404) + return handler(scope, proto) + + +main = App() diff --git a/frameworks/Python/granian/granian-rsgi.dockerfile b/frameworks/Python/granian/granian-rsgi.dockerfile index 315493dc7ca..cba5380d5fd 100644 --- a/frameworks/Python/granian/granian-rsgi.dockerfile +++ b/frameworks/Python/granian/granian-rsgi.dockerfile @@ -8,4 +8,4 @@ RUN pip install -r /granian/requirements.txt EXPOSE 8080 -CMD python run.py rsgi runtime +CMD python run.py rsgi mt diff --git a/frameworks/Python/granian/granian-wrk.dockerfile b/frameworks/Python/granian/granian-wrk.dockerfile index 533a5bc722a..50a1e008ae8 100644 --- a/frameworks/Python/granian/granian-wrk.dockerfile +++ b/frameworks/Python/granian/granian-wrk.dockerfile @@ -8,4 +8,4 @@ RUN pip install -r /granian/requirements.txt EXPOSE 8080 -CMD python run.py rsgi workers +CMD python run.py rsgi st diff --git a/frameworks/Python/granian/granian-wsgi.dockerfile b/frameworks/Python/granian/granian-wsgi.dockerfile index 9ddcee211ff..1ecac416f49 100644 --- a/frameworks/Python/granian/granian-wsgi.dockerfile +++ b/frameworks/Python/granian/granian-wsgi.dockerfile @@ -8,4 +8,4 @@ RUN pip install -r /granian/requirements.txt EXPOSE 8080 -CMD python run.py wsgi runtime +CMD python run.py wsgi mt diff --git a/frameworks/Python/granian/granian.dockerfile b/frameworks/Python/granian/granian.dockerfile index 828808b1009..443c501448f 100644 --- a/frameworks/Python/granian/granian.dockerfile +++ b/frameworks/Python/granian/granian.dockerfile @@ -8,4 +8,4 @@ RUN pip install -r /granian/requirements.txt EXPOSE 8080 -CMD python run.py asgi runtime +CMD python run.py asgi mt diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index 1d8e4322ee2..1739b7a2386 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.29.0 -granian>=1.7.0,<1.8.0 +granian[uvloop]>=2.2.0,<2.3.0 jinja2==3.1.4 orjson==3.10.2 diff --git a/frameworks/Python/granian/run.py b/frameworks/Python/granian/run.py index 11bdee8d453..d24d571e4a3 100644 --- a/frameworks/Python/granian/run.py +++ b/frameworks/Python/granian/run.py @@ -6,7 +6,7 @@ if __name__ == '__main__': interface = sys.argv[1] - threading_mode = sys.argv[2] + runtime_mode = sys.argv[2] workers = multiprocessing.cpu_count() if interface == "rsgi": @@ -23,7 +23,7 @@ address="0.0.0.0", port=8080, workers=workers, - threading_mode=threading_mode, + runtime_mode=runtime_mode, blocking_threads=blocking_threads, backlog=16384, interface=interface, From 58c102e101269a69ffab17a3131fdfd5a4878d69 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Mon, 14 Apr 2025 19:01:29 +0200 Subject: [PATCH 1383/1766] [Python] Bump emmett to 2.7, emmett55 to 1.2 (#9812) --- frameworks/Python/emmett/requirements.txt | 2 +- frameworks/Python/emmett/run.py | 2 +- frameworks/Python/emmett55/requirements.txt | 2 +- frameworks/Python/emmett55/run.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Python/emmett/requirements.txt b/frameworks/Python/emmett/requirements.txt index 1621f272390..c322f0a38a1 100644 --- a/frameworks/Python/emmett/requirements.txt +++ b/frameworks/Python/emmett/requirements.txt @@ -1,2 +1,2 @@ -emmett[orjson]>=2.6.0,<2.7.0 +emmett[orjson,uvloop]>=2.7.0,<2.8.0 psycopg2-binary==2.9.9 diff --git a/frameworks/Python/emmett/run.py b/frameworks/Python/emmett/run.py index aad30c549c6..258b6d87ba0 100644 --- a/frameworks/Python/emmett/run.py +++ b/frameworks/Python/emmett/run.py @@ -13,7 +13,7 @@ port=8080, workers=workers, backlog=16384, - threading_mode="runtime", + runtime_mode="mt", http="1", enable_websockets=False, log_level="warn" diff --git a/frameworks/Python/emmett55/requirements.txt b/frameworks/Python/emmett55/requirements.txt index ecf2313a108..341cf834957 100644 --- a/frameworks/Python/emmett55/requirements.txt +++ b/frameworks/Python/emmett55/requirements.txt @@ -1,3 +1,3 @@ asyncpg==0.29.0 -emmett55[orjson]>=1.0.0,<1.1.0 +emmett55[orjson,uvloop]>=1.2.0,<1.3.0 renoir==1.8.0 diff --git a/frameworks/Python/emmett55/run.py b/frameworks/Python/emmett55/run.py index aad30c549c6..258b6d87ba0 100644 --- a/frameworks/Python/emmett55/run.py +++ b/frameworks/Python/emmett55/run.py @@ -13,7 +13,7 @@ port=8080, workers=workers, backlog=16384, - threading_mode="runtime", + runtime_mode="mt", http="1", enable_websockets=False, log_level="warn" From c22863ea0fe5d23541e625377dcf3e38a5ec24bc Mon Sep 17 00:00:00 2001 From: Alpha Ho <666504+alphaho@users.noreply.github.com> Date: Tue, 15 Apr 2025 02:02:13 +0900 Subject: [PATCH 1384/1766] fix: update vertx-web-kotlinx to adhere to the json test requirement (#9813) Which is "For each request, an object mapping the key message to Hello, World! must be instantiated." --- .../Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt | 2 +- frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Models.kt | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt index 2bd701fa083..4dce51388ae 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt +++ b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/MainVerticle.kt @@ -153,7 +153,7 @@ class MainVerticle(val hasDb: Boolean) : CoroutineVerticle(), CoroutineRouterSup fun Router.routes() { get("/json").jsonResponseCoHandler(Serializers.message) { - jsonSerializationMessage + Message("Hello, World!") } get("/db").jsonResponseCoHandler(Serializers.world) { diff --git a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Models.kt b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Models.kt index fc64e2926ec..ae32b278863 100644 --- a/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Models.kt +++ b/frameworks/Kotlin/vertx-web-kotlinx/src/main/kotlin/Models.kt @@ -4,8 +4,6 @@ import kotlin.random.Random @Serializable class Message(val message: String) -val jsonSerializationMessage = Message("Hello, World!") - @Serializable data class World(val id: Int, val randomNumber: Int) From fdcb1712ec3ae0859139c07cfe35d571838dca4b Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Mon, 14 Apr 2025 19:02:53 +0200 Subject: [PATCH 1385/1766] Optimize http headers creation (#9814) * Optimize http headers creation * Further optimize encoding * Ensure enough space in dst buffer * Stop the scheduled tasks on disconnect --- .../main/java/hello/HelloServerHandler.java | 41 +++++++++++-------- .../java/hello/HelloServerInitializer.java | 41 +++++++++++++------ .../src/main/java/hello/HelloWebServer.java | 4 +- .../src/main/java/hello/HttpResponses.java | 39 +++++++++++++----- .../loom/HelloLoomServerInitializer.java | 3 +- .../loom/VirtualThreadHelloServerHandler.java | 9 ++-- 6 files changed, 90 insertions(+), 47 deletions(-) diff --git a/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java b/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java index ffed975ab09..db3f7896940 100644 --- a/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java +++ b/frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java @@ -1,7 +1,6 @@ package hello; -import static hello.HttpResponses.makeJsonResponse; -import static hello.HttpResponses.makePlaintextResponse; +import static hello.HttpResponses.*; import static hello.JsonUtils.acquireJsonStreamFromEventLoop; import static hello.JsonUtils.releaseJsonStreamFromEventLoop; import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND; @@ -11,6 +10,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import com.jsoniter.output.JsonStream; @@ -19,11 +19,7 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.DefaultHttpRequest; -import io.netty.handler.codec.http.FullHttpResponse; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.codec.http.*; import io.netty.util.AsciiString; import io.netty.util.ReferenceCountUtil; import io.netty.util.concurrent.FastThreadLocal; @@ -37,15 +33,19 @@ protected DateFormat initialValue() { } }; - protected volatile AsciiString date = new AsciiString(FORMAT.get().format(new Date())); + private HttpHeaders jsonHeaders = makeJsonHeaders(new AsciiString(FORMAT.get().format(new Date()))); + private HttpHeaders plaintextHeaders = makePlaintextHeaders(new AsciiString(FORMAT.get().format(new Date()))); + private ScheduledFuture refreshHeaders; public HelloServerHandler(ScheduledExecutorService service) { - service.scheduleWithFixedDelay(new Runnable() { + refreshHeaders = service.scheduleWithFixedDelay(new Runnable() { private final DateFormat format = FORMAT.get(); @Override public void run() { - date = new AsciiString(format.format(new Date())); + var date = new AsciiString(format.format(new Date())); + jsonHeaders = makeJsonHeaders(date); + plaintextHeaders = makePlaintextHeaders(date); } }, 1000, 1000, TimeUnit.MILLISECONDS); } @@ -80,13 +80,13 @@ private void process(ChannelHandlerContext ctx, HttpRequest request) throws Exce String uri = request.uri(); switch (uri) { case "/plaintext": - writePlainResponse(ctx, date); + writePlainResponse(ctx, plaintextHeaders); return; case "/json": // even for the virtual thread case we expect virtual threads to be executed inlined! var stream = acquireJsonStreamFromEventLoop(); try { - writeJsonResponse(ctx, stream, date); + writeJsonResponse(ctx, stream, jsonHeaders); } finally { releaseJsonStreamFromEventLoop(stream); } @@ -98,12 +98,12 @@ private void process(ChannelHandlerContext ctx, HttpRequest request) throws Exce ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); } - protected void writePlainResponse(ChannelHandlerContext ctx, AsciiString date) { - ctx.write(makePlaintextResponse(date), ctx.voidPromise()); + protected void writePlainResponse(ChannelHandlerContext ctx, HttpHeaders plaintextHeaders) { + ctx.write(makePlaintextResponse(plaintextHeaders), ctx.voidPromise()); } - protected void writeJsonResponse(ChannelHandlerContext ctx, JsonStream stream, AsciiString date) { - ctx.write(makeJsonResponse(stream, date), ctx.voidPromise()); + protected void writeJsonResponse(ChannelHandlerContext ctx, JsonStream stream, HttpHeaders jsonHeaders) { + ctx.write(makeJsonResponse(stream, jsonHeaders), ctx.voidPromise()); } @Override @@ -115,4 +115,13 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + if (refreshHeaders != null) { + refreshHeaders.cancel(false); + refreshHeaders = null; + } + } } diff --git a/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java b/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java index 67692802a83..5fc354e61a3 100644 --- a/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java +++ b/frameworks/Java/netty/src/main/java/hello/HelloServerInitializer.java @@ -2,28 +2,45 @@ import java.util.concurrent.ScheduledExecutorService; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.DefaultHttpRequest; -import io.netty.handler.codec.http.HttpMessage; -import io.netty.handler.codec.http.HttpMethod; -import io.netty.handler.codec.http.HttpRequestDecoder; -import io.netty.handler.codec.http.HttpResponseEncoder; -import io.netty.handler.codec.http.HttpVersion; +import io.netty.handler.codec.http.*; public class HelloServerInitializer extends ChannelInitializer { - protected final ScheduledExecutorService service; - - public HelloServerInitializer(ScheduledExecutorService service) { - this.service = service; + public HelloServerInitializer() { } @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline() .addLast("encoder", new HttpResponseEncoder() { + + private ByteBuf encodedHeaders; + private HttpHeaders lastSeenHeaders; + + @Override + protected void encodeHeaders(HttpHeaders headers, ByteBuf buf) { + if (lastSeenHeaders != headers) { + updateEncodedHttpHeaders(headers, buf); + } + var encodedHeaders = this.encodedHeaders; + buf.ensureWritable(encodedHeaders.readableBytes()); + encodedHeaders.getBytes(encodedHeaders.readerIndex(), buf, encodedHeaders.readableBytes()); + } + + private void updateEncodedHttpHeaders(HttpHeaders headers, ByteBuf buf) { + if (encodedHeaders == null) { + encodedHeaders = Unpooled.buffer(buf.writableBytes()); + } else { + encodedHeaders.clear().ensureWritable(buf.writableBytes()); + } + super.encodeHeaders(headers, encodedHeaders); + lastSeenHeaders = headers; + } + @Override public boolean acceptOutboundMessage(final Object msg) throws Exception { if (msg.getClass() == DefaultFullHttpResponse.class) { @@ -46,7 +63,7 @@ protected boolean isContentAlwaysEmpty(final HttpMessage msg) { return false; } }) - .addLast("handler", newHelloServerHandler(service)); + .addLast("handler", newHelloServerHandler(ch.eventLoop())); } protected HelloServerHandler newHelloServerHandler(ScheduledExecutorService service) { diff --git a/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java b/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java index cca8e555113..492a44121c9 100644 --- a/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java +++ b/frameworks/Java/netty/src/main/java/hello/HelloWebServer.java @@ -67,9 +67,9 @@ public void run() throws Exception { } var channelB = b.group(group).channel(serverChannelClass); if (EVENT_LOOP_CARRIER) { - channelB.childHandler(new HelloLoomServerInitializer((MultithreadVirtualEventExecutorGroup) group, group.next())); + channelB.childHandler(new HelloLoomServerInitializer((MultithreadVirtualEventExecutorGroup) group)); } else { - channelB.childHandler(new HelloServerInitializer(group.next())); + channelB.childHandler(new HelloServerInitializer()); } b.childOption(ChannelOption.SO_REUSEADDR, true); diff --git a/frameworks/Java/netty/src/main/java/hello/HttpResponses.java b/frameworks/Java/netty/src/main/java/hello/HttpResponses.java index 64b88ccf086..5e36c43a269 100644 --- a/frameworks/Java/netty/src/main/java/hello/HttpResponses.java +++ b/frameworks/Java/netty/src/main/java/hello/HttpResponses.java @@ -20,26 +20,43 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.DefaultHttpHeadersFactory; import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpHeadersFactory; import io.netty.util.AsciiString; public class HttpResponses { - public static FullHttpResponse makePlaintextResponse(AsciiString date) { - return makeResponse(Unpooled.wrappedBuffer(STATIC_PLAINTEXT), TEXT_PLAIN, PLAINTEXT_CLHEADER_VALUE, date); - } + private static final HttpHeadersFactory HEADERS_FACTORY = DefaultHttpHeadersFactory.headersFactory() + .withValidation(false); - public static FullHttpResponse makeJsonResponse(JsonStream stream, AsciiString date) { - return makeResponse(Unpooled.wrappedBuffer(serializeMsg(newMsg(), stream)), APPLICATION_JSON, JSON_CLHEADER_VALUE, date); + public static HttpHeaders makeJsonHeaders(AsciiString date) { + return HEADERS_FACTORY.newHeaders() + .set(CONTENT_TYPE, APPLICATION_JSON) + .set(SERVER, SERVER_NAME) + .set(DATE, date) + .set(CONTENT_LENGTH, JSON_CLHEADER_VALUE); } - private static FullHttpResponse makeResponse(ByteBuf buf, CharSequence contentType, CharSequence contentLength, AsciiString date) { - final FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, buf, false); - response.headers() - .set(CONTENT_TYPE, contentType) + + public static HttpHeaders makePlaintextHeaders(AsciiString date) { + return HEADERS_FACTORY.newHeaders() + .set(CONTENT_TYPE, TEXT_PLAIN) .set(SERVER, SERVER_NAME) .set(DATE, date) - .set(CONTENT_LENGTH, contentLength); - return response; + .set(CONTENT_LENGTH, PLAINTEXT_CLHEADER_VALUE); + } + + public static FullHttpResponse makePlaintextResponse(HttpHeaders plaintextHeaders) { + return makeResponse(Unpooled.wrappedBuffer(STATIC_PLAINTEXT), plaintextHeaders); + } + + public static FullHttpResponse makeJsonResponse(JsonStream stream, HttpHeaders jsonHeaders) { + return makeResponse(Unpooled.wrappedBuffer(serializeMsg(newMsg(), stream)), jsonHeaders); + } + + private static FullHttpResponse makeResponse(ByteBuf buf, HttpHeaders headers) { + return new DefaultFullHttpResponse(HTTP_1_1, OK, buf, headers, HttpHeaders.EMPTY_HEADERS); } } diff --git a/frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java b/frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java index afa5db2cac5..ab407b4ffc5 100644 --- a/frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java +++ b/frameworks/Java/netty/src/main/java/hello/loom/HelloLoomServerInitializer.java @@ -9,8 +9,7 @@ public class HelloLoomServerInitializer extends HelloServerInitializer { private final MultithreadVirtualEventExecutorGroup group; - public HelloLoomServerInitializer(MultithreadVirtualEventExecutorGroup group, ScheduledExecutorService service) { - super(service); + public HelloLoomServerInitializer(MultithreadVirtualEventExecutorGroup group) { this.group = group; } diff --git a/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java b/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java index 9b93088fe0f..9da17a24adb 100644 --- a/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java +++ b/frameworks/Java/netty/src/main/java/hello/loom/VirtualThreadHelloServerHandler.java @@ -9,6 +9,7 @@ import hello.HttpResponses; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpHeaders; import io.netty.util.AsciiString; public class VirtualThreadHelloServerHandler extends HelloServerHandler { @@ -22,16 +23,16 @@ public VirtualThreadHelloServerHandler(ScheduledExecutorService service, Multith } @Override - protected void writePlainResponse(ChannelHandlerContext ctx, AsciiString date) { + protected void writePlainResponse(ChannelHandlerContext ctx, HttpHeaders plainTextHeaders) { group.eventLoopVirtualThreadFactory().newThread(() -> { - responses.add(HttpResponses.makePlaintextResponse(date)); + responses.add(HttpResponses.makePlaintextResponse(plainTextHeaders)); }).start(); } @Override - protected void writeJsonResponse(ChannelHandlerContext ctx, JsonStream stream, AsciiString date) { + protected void writeJsonResponse(ChannelHandlerContext ctx, JsonStream stream, HttpHeaders jsonHeaders) { group.eventLoopVirtualThreadFactory().newThread(() -> { - responses.add(HttpResponses.makeJsonResponse(stream, date)); + responses.add(HttpResponses.makeJsonResponse(stream, jsonHeaders)); }).start(); } From f498f95bfb415eea6c8abc250ba883b2292371d0 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Mon, 14 Apr 2025 18:03:29 +0100 Subject: [PATCH 1386/1766] Upgrade to microdot 2.3 and add orjson (#9815) --- frameworks/Python/microdot/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/Python/microdot/requirements.txt b/frameworks/Python/microdot/requirements.txt index 4d928335e33..2bb6d533047 100644 --- a/frameworks/Python/microdot/requirements.txt +++ b/frameworks/Python/microdot/requirements.txt @@ -5,8 +5,9 @@ asyncpg jinja2 cachetools asyncache +orjson alchemical -microdot>=2.0.1 +microdot>=2.3.1 gunicorn uvicorn[standard] From 1e8b3c4df2306baaa7855d0ac93855ea6d29eb82 Mon Sep 17 00:00:00 2001 From: Alpha Ho <666504+alphaho@users.noreply.github.com> Date: Tue, 15 Apr 2025 02:04:37 +0900 Subject: [PATCH 1387/1766] Add tapir & kyo frameworks (#9816) * Add tapir framework and its variants * upgrade zio-http to 3.2.0 * fix: update zio-http to adhere to the json test requirement That is "For each request, an object mapping the key message to Hello, World! must be instantiated." * upgrade zio-http to use Java 21 * Add kyo-scheduler variants of zio-http and http4s * Upgrade kyo to 0.18.0 * Move kyo-tapir into the tapir folder --- frameworks/Scala/kyo-scheduler/README.md | 24 +++ .../Scala/kyo-scheduler/benchmark_config.json | 49 ++++++ frameworks/Scala/kyo-scheduler/build.sbt | 54 +++++++ frameworks/Scala/kyo-scheduler/config.toml | 32 ++++ .../src/main/resources/application.properties | 4 + .../http4s/src/main/resources/logback.xml | 14 ++ .../benchmark/DatabaseService.scala | 71 +++++++++ .../techempower/benchmark/WebServer.scala | 118 +++++++++++++++ .../http4s/src/main/twirl/index.scala.html | 14 ++ .../kyo-scheduler-http4s.dockerfile | 24 +++ .../kyo-scheduler/kyo-scheduler.dockerfile | 10 ++ .../project/build.properties | 0 .../Scala/kyo-scheduler/project/plugins.sbt | 2 + .../zio-http}/src/main/scala/Payload.scala | 6 +- .../zio-http/src/main/scala/ZioHttp.scala | 45 ++++++ frameworks/Scala/kyo-tapir/README.md | 21 --- .../Scala/kyo-tapir/benchmark_config.json | 26 ---- frameworks/Scala/kyo-tapir/build.sbt | 17 --- frameworks/Scala/kyo-tapir/config.toml | 15 -- .../Scala/kyo-tapir/kyo-tapir.dockerfile | 10 -- frameworks/Scala/tapir/README.md | 28 ++++ frameworks/Scala/tapir/benchmark_config.json | 140 ++++++++++++++++++ frameworks/Scala/tapir/build.sbt | 100 +++++++++++++ .../tapir/common/src/main/scala/Payload.scala | 1 + frameworks/Scala/tapir/config.toml | 93 ++++++++++++ .../scala/TapirHttp4sServerZioBenchmark.scala | 55 +++++++ .../scala/TapirHttp4sServerBenchmark.scala | 50 +++++++ .../scala/TapirNettyCatsServerBenchmark.scala | 54 +++++++ .../scala/TapirNettyKyoServerBenchmark.scala} | 8 +- .../scala/TapirNettyZioServerBenchmark.scala | 57 +++++++ .../src/main/scala/Main.scala | 42 ++++++ .../Scala/tapir/project/build.properties | 1 + .../{kyo-tapir => tapir}/project/plugins.sbt | 0 .../Scala/tapir/tapir-http4s-zio.dockerfile | 11 ++ .../Scala/tapir/tapir-http4s.dockerfile | 11 ++ .../Scala/tapir/tapir-netty-cats.dockerfile | 11 ++ .../Scala/tapir/tapir-netty-kyo.dockerfile | 11 ++ .../Scala/tapir/tapir-netty-zio.dockerfile | 11 ++ .../Scala/tapir/tapir-pekko-http.dockerfile | 11 ++ frameworks/Scala/tapir/tapir.dockerfile | 11 ++ .../scala/TapirZioHttpServerBenchmark.scala | 56 +++++++ frameworks/Scala/zio-http/README.md | 2 +- frameworks/Scala/zio-http/build.sbt | 4 +- .../Scala/zio-http/src/main/scala/Main.scala | 5 +- .../zio-http/src/main/scala/Payload.scala | 6 + frameworks/Scala/zio-http/zio-http.dockerfile | 2 +- 46 files changed, 1236 insertions(+), 101 deletions(-) create mode 100644 frameworks/Scala/kyo-scheduler/README.md create mode 100644 frameworks/Scala/kyo-scheduler/benchmark_config.json create mode 100644 frameworks/Scala/kyo-scheduler/build.sbt create mode 100644 frameworks/Scala/kyo-scheduler/config.toml create mode 100644 frameworks/Scala/kyo-scheduler/http4s/src/main/resources/application.properties create mode 100644 frameworks/Scala/kyo-scheduler/http4s/src/main/resources/logback.xml create mode 100644 frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/DatabaseService.scala create mode 100644 frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/WebServer.scala create mode 100644 frameworks/Scala/kyo-scheduler/http4s/src/main/twirl/index.scala.html create mode 100644 frameworks/Scala/kyo-scheduler/kyo-scheduler-http4s.dockerfile create mode 100644 frameworks/Scala/kyo-scheduler/kyo-scheduler.dockerfile rename frameworks/Scala/{kyo-tapir => kyo-scheduler}/project/build.properties (100%) create mode 100644 frameworks/Scala/kyo-scheduler/project/plugins.sbt rename frameworks/Scala/{kyo-tapir => kyo-scheduler/zio-http}/src/main/scala/Payload.scala (54%) create mode 100644 frameworks/Scala/kyo-scheduler/zio-http/src/main/scala/ZioHttp.scala delete mode 100644 frameworks/Scala/kyo-tapir/README.md delete mode 100644 frameworks/Scala/kyo-tapir/benchmark_config.json delete mode 100644 frameworks/Scala/kyo-tapir/build.sbt delete mode 100644 frameworks/Scala/kyo-tapir/config.toml delete mode 100644 frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile create mode 100644 frameworks/Scala/tapir/README.md create mode 100644 frameworks/Scala/tapir/benchmark_config.json create mode 100644 frameworks/Scala/tapir/build.sbt create mode 100644 frameworks/Scala/tapir/common/src/main/scala/Payload.scala create mode 100644 frameworks/Scala/tapir/config.toml create mode 100644 frameworks/Scala/tapir/http4s-server-zio/src/main/scala/TapirHttp4sServerZioBenchmark.scala create mode 100644 frameworks/Scala/tapir/http4s-server/src/main/scala/TapirHttp4sServerBenchmark.scala create mode 100644 frameworks/Scala/tapir/netty-cats-server/src/main/scala/TapirNettyCatsServerBenchmark.scala rename frameworks/Scala/{kyo-tapir/src/main/scala/Main.scala => tapir/netty-kyo-server/src/main/scala/TapirNettyKyoServerBenchmark.scala} (83%) create mode 100644 frameworks/Scala/tapir/netty-zio-server/src/main/scala/TapirNettyZioServerBenchmark.scala create mode 100644 frameworks/Scala/tapir/pekko-http-server/src/main/scala/Main.scala create mode 100644 frameworks/Scala/tapir/project/build.properties rename frameworks/Scala/{kyo-tapir => tapir}/project/plugins.sbt (100%) create mode 100644 frameworks/Scala/tapir/tapir-http4s-zio.dockerfile create mode 100644 frameworks/Scala/tapir/tapir-http4s.dockerfile create mode 100644 frameworks/Scala/tapir/tapir-netty-cats.dockerfile create mode 100644 frameworks/Scala/tapir/tapir-netty-kyo.dockerfile create mode 100644 frameworks/Scala/tapir/tapir-netty-zio.dockerfile create mode 100644 frameworks/Scala/tapir/tapir-pekko-http.dockerfile create mode 100644 frameworks/Scala/tapir/tapir.dockerfile create mode 100644 frameworks/Scala/tapir/zio-http-server/src/main/scala/TapirZioHttpServerBenchmark.scala create mode 100644 frameworks/Scala/zio-http/src/main/scala/Payload.scala diff --git a/frameworks/Scala/kyo-scheduler/README.md b/frameworks/Scala/kyo-scheduler/README.md new file mode 100644 index 00000000000..38244346a1f --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/README.md @@ -0,0 +1,24 @@ +# kyo-scheduler Benchmarking Test + +This is a simple test to benchmark the performance of the kyo-scheduler libraries along with different backends in Scala. + +### Test Type Implementation Source Code + +* JSON +* PLAINTEXT + +## Software Versions + +* [Java OpenJDK 21](https://adoptium.net/temurin/releases/) +* [Kyo 0.17.0](https://github.com/getkyo/kyo) +* [Scala 3.6.4 and Scala 2.13.16](https://www.scala-lang.org/) + +### Server Implementations + +* [ZIO Http](https://zio.dev/zio-http/) +* [http4s](https://http4s.org/) + +## Test URLs + +* JSON - http://localhost:8080/json +* PLAINTEXT - http://localhost:8080/plaintext diff --git a/frameworks/Scala/kyo-scheduler/benchmark_config.json b/frameworks/Scala/kyo-scheduler/benchmark_config.json new file mode 100644 index 00000000000..e665c94a2fe --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/benchmark_config.json @@ -0,0 +1,49 @@ +{ + "framework": "kyo-scheduler", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "zio-http", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "zio-http with kyo-scheduler", + "notes": "https://zio.dev/zio-http/", + "versus": "None" + }, + "http4s": { + "orm": "Raw", + "database_os": "Linux", + "json_url": "/json", + "plaintext_url": "/plaintext", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "db_url": "/db", + "framework": "http4s", + "language": "Scala", + "platform": "NIO2", + "webserver": "blaze", + "os": "Linux", + "display_name": "http4s with kyo-scheduler", + "notes": "https://http4s.org/", + "flavor": "None", + "versus": "None" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/Scala/kyo-scheduler/build.sbt b/frameworks/Scala/kyo-scheduler/build.sbt new file mode 100644 index 00000000000..22db16be04d --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/build.sbt @@ -0,0 +1,54 @@ +name := "kyo-scheduler-benchmark" + +ThisBuild / version := "1.0.0" + +val kyoVersion = "0.18.0" + +val commonAssemblySettings = assembly / assemblyMergeStrategy := { + case x if x.contains("io.netty.versions.properties") => MergeStrategy.discard + case x if x.contains("module-info.class") => MergeStrategy.discard + case x => + val oldStrategy = (assembly / assemblyMergeStrategy).value + oldStrategy(x) +} + +// based on the framework/Scala/zio-http implementation +lazy val `zio-http` = (project in file("zio-http")) + .settings( + scalaVersion := "3.6.4", + name := "zio-http-kyo-scheduler-benchmark", + libraryDependencies ++= Seq( + "dev.zio" %% "zio-http" % "3.2.0", + "io.getkyo" %% "kyo-scheduler-zio" % kyoVersion, + ), + commonAssemblySettings + ) + +val http4sVersion = "0.23.22" +val http4sBlazeVersion = "0.23.15" +val http4sTwirlVersion = "0.23.17" + +// based on the framework/Scala/http4s implementation +lazy val http4s = (project in file("http4s")) + .settings( + scalaVersion := "2.13.16", + name := "http4s-kyo-scheduler-benchmark", + libraryDependencies ++= Seq( + "org.http4s" %% "http4s-blaze-server" % http4sBlazeVersion, + "org.http4s" %% "http4s-dsl" % http4sVersion, + "org.http4s" %% "http4s-twirl" % http4sTwirlVersion, + "org.http4s" %% "http4s-circe" % http4sVersion, + // Optional for auto-derivation of JSON codecs + "io.circe" %% "circe-generic" % "0.14.5", + "org.typelevel" %% "cats-effect" % "3.5.1", + "co.fs2" %% "fs2-core" % "3.7.0", + "co.fs2" %% "fs2-io" % "3.7.0", + "io.getquill" %% "quill-jasync-postgres" % "3.19.0", + "io.getquill" %% "quill-jasync" % "3.19.0", + "ch.qos.logback" % "logback-classic" % "1.4.8", + "io.getkyo" %% "kyo-scheduler-cats" % kyoVersion, + ), + commonAssemblySettings, + addCompilerPlugin("com.olegpy" %% "better-monadic-for" % "0.3.1") + ) + .enablePlugins(SbtTwirl) \ No newline at end of file diff --git a/frameworks/Scala/kyo-scheduler/config.toml b/frameworks/Scala/kyo-scheduler/config.toml new file mode 100644 index 00000000000..515c42b6557 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/config.toml @@ -0,0 +1,32 @@ +[framework] +name = "kyo-scheduler" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" + +[http4s] +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 = "NIO2" +webserver = "blaze" +versus = "None" diff --git a/frameworks/Scala/kyo-scheduler/http4s/src/main/resources/application.properties b/frameworks/Scala/kyo-scheduler/http4s/src/main/resources/application.properties new file mode 100644 index 00000000000..614284866be --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/http4s/src/main/resources/application.properties @@ -0,0 +1,4 @@ +ctx.port=5432 +ctx.username=benchmarkdbuser +ctx.password=benchmarkdbpass +ctx.database=hello_world diff --git a/frameworks/Scala/kyo-scheduler/http4s/src/main/resources/logback.xml b/frameworks/Scala/kyo-scheduler/http4s/src/main/resources/logback.xml new file mode 100644 index 00000000000..378a2fc929b --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/http4s/src/main/resources/logback.xml @@ -0,0 +1,14 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/DatabaseService.scala b/frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/DatabaseService.scala new file mode 100644 index 00000000000..a08883458b9 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/DatabaseService.scala @@ -0,0 +1,71 @@ +package http4s.techempower.benchmark + +import java.util.concurrent.{Executor, ThreadLocalRandom} + +import scala.concurrent.{ExecutionContext, ExecutionContextExecutor} +import cats.effect.{IO => CatsIO} +import cats.syntax.all._ +import io.getquill._ + +class DatabaseService(ctx: PostgresJAsyncContext[LowerCase.type], executor: Executor) { + implicit val dbExecutionContext: ExecutionContextExecutor = ExecutionContext.fromExecutor(executor) + import ctx._ + + def close(): CatsIO[Unit] = { + CatsIO(ctx.close()) + } + + // Provide a random number between 1 and 10000 (inclusive) + private def randomWorldId() = + CatsIO(ThreadLocalRandom.current().nextInt(1, 10001)) + + // Update the randomNumber field with a random number + def updateRandomNumber(world: World): CatsIO[World] = + for { + randomId <- randomWorldId() + } yield world.copy(randomNumber = randomId) + + // Select a World object from the database by ID + def selectWorld(id: Int): CatsIO[World] = + CatsIO.fromFuture( + CatsIO.delay( + ctx + .run(quote { + query[World].filter(_.id == lift(id)) + }) + .map(rq => rq.head) + ) + ) + + // Select a random World object from the database + def selectRandomWorld(): CatsIO[World] = + for { + randomId <- randomWorldId() + world <- selectWorld(randomId) + } yield world + + // Select a specified number of random World objects from the database + def getWorlds(numQueries: Int): CatsIO[List[World]] = + (0 until numQueries).toList.traverse(_ => selectRandomWorld()) + + // Update the randomNumber field with a new random number, for a list of World objects + def getNewWorlds(worlds: List[World]): CatsIO[List[World]] = + worlds.map(updateRandomNumber).sequence + + // Update the randomNumber column in the database for a specified set of World objects, + // this uses a batch update SQL call. + def updateWorlds(newWorlds: List[World]): CatsIO[Int] = { + val u = quote { + liftQuery(newWorlds).foreach { world => + query[World] + .filter(_.id == world.id) + .update(_.randomNumber -> world.randomNumber) + } + } + CatsIO.fromFuture(CatsIO.delay(ctx.run(u).map(_.length))) + } + + // Retrieve all fortunes from the database + def getFortunes(): CatsIO[List[Fortune]] = + CatsIO.fromFuture(CatsIO.delay(ctx.run(query[Fortune]).map(_.toList))) +} diff --git a/frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/WebServer.scala b/frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/WebServer.scala new file mode 100644 index 00000000000..ffabe43f354 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/http4s/src/main/scala/http4s/techempower/benchmark/WebServer.scala @@ -0,0 +1,118 @@ +package http4s.techempower.benchmark + + +import java.util.concurrent.Executors +import cats.effect.{ExitCode, IO, Resource} +import com.typesafe.config.ConfigValueFactory +import io.circe.generic.auto._ +import io.circe.syntax._ +import io.getquill.util.LoadConfig +import io.getquill.LowerCase +import io.getquill.PostgresJAsyncContext +import org.http4s._ +import org.http4s.dsl._ +import org.http4s.circe._ +import org.http4s.implicits._ +import org.http4s.blaze.server.BlazeServerBuilder +import org.http4s.headers.Server +import org.http4s.twirl._ + +final case class Message(message: String) +final case class World(id: Int, randomNumber: Int) +final case class Fortune(id: Int, message: String) + +// Extract queries parameter (with default and min/maxed) +object Queries { + def unapply(params: Map[String, Seq[String]]): Option[Int] = + Some(params.getOrElse("queries", Nil).headOption match { + case None => 1 + case Some(x) => + Math.max(1, Math.min(500, scala.util.Try(x.toInt).getOrElse(1))) + }) +} + +// based on the framework/Scala/http4s implementation +object WebServer extends kyo.KyoSchedulerIOApp with Http4sDsl[IO] { + def makeDatabaseService( + host: String, + poolSize: Int + ): Resource[IO, DatabaseService] = { + for { + executor <- Resource(IO { + val pool = Executors.newFixedThreadPool(poolSize) + (pool, IO(pool.shutdown())) + }) + ctx <- Resource.fromAutoCloseable(IO(new PostgresJAsyncContext( + LowerCase, + LoadConfig("ctx") + .withValue("host", ConfigValueFactory.fromAnyRef(host)) + .withValue( + "maxActiveConnections", + ConfigValueFactory.fromAnyRef(poolSize) + ) + ))) + } yield new DatabaseService(ctx, executor) + } + + // Add a new fortune to an existing list, and sort by message. + def getSortedFortunes(old: List[Fortune]): List[Fortune] = { + val newFortune = Fortune(0, "Additional fortune added at request time.") + (newFortune :: old).sortBy(_.message) + } + + // Add Server header container server address + def addServerHeader(service: HttpRoutes[IO]): HttpRoutes[IO] = + cats.data.Kleisli { req: Request[IO] => + service.run(req).map(_.putHeaders(server)) + } + + val server = Server(ProductId("http4s", None)) + + // HTTP service definition + def service(db: DatabaseService) = + addServerHeader(HttpRoutes.of[IO] { + case GET -> Root / "plaintext" => + Ok("Hello, World!") + + case GET -> Root / "json" => + Ok(Message("Hello, World!").asJson) + + case GET -> Root / "db" => + Ok(db.selectRandomWorld().map(_.asJson)) + + case GET -> Root / "queries" :? Queries(numQueries) => + Ok(db.getWorlds(numQueries).map(_.asJson)) + + case GET -> Root / "fortunes" => + Ok(for { + oldFortunes <- db.getFortunes() + newFortunes = getSortedFortunes(oldFortunes) + } yield html.index(newFortunes)) + + case GET -> Root / "updates" :? Queries(numQueries) => + Ok(for { + worlds <- db.getWorlds(numQueries) + newWorlds <- db.getNewWorlds(worlds) + _ <- db.updateWorlds(newWorlds) + } yield newWorlds.asJson) + }) + + // Given a fully constructed HttpService, start the server and wait for completion + def startServer(service: HttpRoutes[IO]) = + BlazeServerBuilder[IO] + .bindHttp(8080, "0.0.0.0") + .withHttpApp(service.orNotFound) + .withSocketKeepAlive(true) + .resource + + // Entry point when starting service + override def run(args: List[String]): IO[ExitCode] = + (for { + db <- makeDatabaseService( + args.headOption.getOrElse("localhost"), + sys.env.get("DB_POOL_SIZE").map(_.toInt).getOrElse(64) + ) + server <- startServer(service(db)) + } yield server) + .use(_ => IO.never) +} diff --git a/frameworks/Scala/kyo-scheduler/http4s/src/main/twirl/index.scala.html b/frameworks/Scala/kyo-scheduler/http4s/src/main/twirl/index.scala.html new file mode 100644 index 00000000000..70dfcc42ca1 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/http4s/src/main/twirl/index.scala.html @@ -0,0 +1,14 @@ +@import http4s.techempower.benchmark.Fortune +@(fortunes: Seq[Fortune]) + + +Fortunes + + + + @for(fortune <- fortunes) { + + } +
      idmessage
      @fortune.id@fortune.message
      + + \ No newline at end of file diff --git a/frameworks/Scala/kyo-scheduler/kyo-scheduler-http4s.dockerfile b/frameworks/Scala/kyo-scheduler/kyo-scheduler-http4s.dockerfile new file mode 100644 index 00000000000..6ecf32cc149 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/kyo-scheduler-http4s.dockerfile @@ -0,0 +1,24 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 + +WORKDIR /kyo-scheduler-benchmark +COPY http4s http4s +COPY project project +COPY build.sbt build.sbt +RUN sbt http4s/assembly + +EXPOSE 8080 + +CMD java \ + -server \ + -Xms2g \ + -Xmx2g \ + -XX:NewSize=1g \ + -XX:MaxNewSize=1g \ + -XX:InitialCodeCacheSize=256m \ + -XX:ReservedCodeCacheSize=256m \ + -XX:+UseParallelGC \ + -XX:+AlwaysPreTouch \ + -Dcats.effect.stackTracingMode=disabled \ + -jar \ + /kyo-scheduler-benchmark/http4s/target/scala-2.13/http4s-kyo-scheduler-benchmark-assembly-1.0.0.jar \ + tfb-database diff --git a/frameworks/Scala/kyo-scheduler/kyo-scheduler.dockerfile b/frameworks/Scala/kyo-scheduler/kyo-scheduler.dockerfile new file mode 100644 index 00000000000..3b7645aeda6 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/kyo-scheduler.dockerfile @@ -0,0 +1,10 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /kyo-scheduler-benchmark +COPY zio-http zio-http +COPY project project +COPY build.sbt build.sbt +RUN sbt zio-http/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-Dio.netty.leakDetection.level=disabled", "-Dio.netty.recycler.maxCapacityPerThread=0", "-jar", "/kyo-scheduler-benchmark/zio-http/target/scala-3.6.4/zio-http-kyo-scheduler-benchmark-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/project/build.properties b/frameworks/Scala/kyo-scheduler/project/build.properties similarity index 100% rename from frameworks/Scala/kyo-tapir/project/build.properties rename to frameworks/Scala/kyo-scheduler/project/build.properties diff --git a/frameworks/Scala/kyo-scheduler/project/plugins.sbt b/frameworks/Scala/kyo-scheduler/project/plugins.sbt new file mode 100644 index 00000000000..5bd83c79d15 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/project/plugins.sbt @@ -0,0 +1,2 @@ +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") +addSbtPlugin("com.typesafe.play" % "sbt-twirl" % "1.6.1") \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/src/main/scala/Payload.scala b/frameworks/Scala/kyo-scheduler/zio-http/src/main/scala/Payload.scala similarity index 54% rename from frameworks/Scala/kyo-tapir/src/main/scala/Payload.scala rename to frameworks/Scala/kyo-scheduler/zio-http/src/main/scala/Payload.scala index 53b27e476c2..4806bf3380d 100644 --- a/frameworks/Scala/kyo-tapir/src/main/scala/Payload.scala +++ b/frameworks/Scala/kyo-scheduler/zio-http/src/main/scala/Payload.scala @@ -1,8 +1,6 @@ -import sttp.tapir.Schema -import zio.json.* +import zio.json.{DeriveJsonCodec, JsonCodec} case class Payload(message: String) object Payload { given JsonCodec[Payload] = DeriveJsonCodec.gen - given Schema[Payload] = Schema.derived -} \ No newline at end of file +} diff --git a/frameworks/Scala/kyo-scheduler/zio-http/src/main/scala/ZioHttp.scala b/frameworks/Scala/kyo-scheduler/zio-http/src/main/scala/ZioHttp.scala new file mode 100644 index 00000000000..448fd878f56 --- /dev/null +++ b/frameworks/Scala/kyo-scheduler/zio-http/src/main/scala/ZioHttp.scala @@ -0,0 +1,45 @@ +import zio._ +import zio.http._ +import zio.http.netty.NettyConfig +import zio.http.netty.NettyConfig.LeakDetectionLevel +import zio.json.* + +import java.lang.{Runtime => JRuntime} + +// based on the framework/Scala/zio-http implementation +object ZioHttp extends kyo.KyoSchedulerZIOAppDefault { + + private val plainTextMessage: String = "hello, world!" + + private val STATIC_SERVER_NAME = "zio-http" + private val NUM_PROCESSORS = JRuntime.getRuntime.availableProcessors() + + val app: Routes[Any, Response] = Routes( + Method.GET / "/plaintext" -> + Handler.fromResponse( + Response + .text(plainTextMessage) + .addHeader(Header.Server(STATIC_SERVER_NAME)), + ), + Method.GET / "/json" -> + Handler.fromResponse( + Response + .json(Payload(plainTextMessage).toJson) + .addHeader(Header.Server(STATIC_SERVER_NAME)), + ), + ) + + private val config = Server.Config.default + .port(8080) + .enableRequestStreaming + + private val nettyConfig = NettyConfig.default + .leakDetection(LeakDetectionLevel.DISABLED) + .maxThreads(NUM_PROCESSORS) + + private val configLayer = ZLayer.succeed(config) + private val nettyConfigLayer = ZLayer.succeed(nettyConfig) + + val run: UIO[ExitCode] = + Server.serve(app).provide(configLayer, nettyConfigLayer, Server.customized).exitCode +} \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/README.md b/frameworks/Scala/kyo-tapir/README.md deleted file mode 100644 index 4fcc3d2c677..00000000000 --- a/frameworks/Scala/kyo-tapir/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Kyo Tapir Benchmarking Test - -This is a simple test to benchmark the performance of the Kyo and Tapir libraries in Scala. - -### Test Type Implementation Source Code - -* [JSON](src/main/scala/Main.scala) -* [PLAINTEXT](src/main/scala/Main.scala) - -## Software Versions - -* [Java OpenJDK 21](https://adoptium.net/temurin/releases/) -* [Scala 3.6.3](https://www.scala-lang.org/) -* [Kyo 0.16.2](https://github.com/getkyo/kyo) -* [Tapir 1.11.15](https://tapir.softwaremill.com) -* [ZIO Json 0.7.32](https://zio.dev/zio-json/) - -## Test URLs - -* JSON - http://localhost:9999/json -* PLAINTEXT - http://localhost:9999/plaintext diff --git a/frameworks/Scala/kyo-tapir/benchmark_config.json b/frameworks/Scala/kyo-tapir/benchmark_config.json deleted file mode 100644 index 3b005996a8f..00000000000 --- a/frameworks/Scala/kyo-tapir/benchmark_config.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "framework": "kyo-tapir", - "tests": [ - { - "default": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "port": 9999, - "database": "None", - "approach": "Realistic", - "classification": "Micro", - "framework": "kyo-tapir", - "language": "Scala", - "flavor": "None", - "orm": "Raw", - "platform": "Netty", - "webserver": "None", - "database_os": "Linux", - "os": "Linux", - "display_name": "kyo-tapir", - "notes": "", - "versus": "None" - } - } - ] -} \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/build.sbt b/frameworks/Scala/kyo-tapir/build.sbt deleted file mode 100644 index c7ee01108fc..00000000000 --- a/frameworks/Scala/kyo-tapir/build.sbt +++ /dev/null @@ -1,17 +0,0 @@ -name := "kyo-tapir" -version := "1.0.0" -scalaVersion := "3.6.3" -lazy val root = (project in file(".")) - .settings( - libraryDependencies ++= Seq( - "io.getkyo" %% "kyo-tapir" % "0.16.2", - "com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.11.15", - "dev.zio" %% "zio-json" % "0.7.32" - ), - assembly / assemblyMergeStrategy := { - case x if x.contains("io.netty.versions.properties") => MergeStrategy.discard - case x => - val oldStrategy = (assembly / assemblyMergeStrategy).value - oldStrategy(x) - } - ) diff --git a/frameworks/Scala/kyo-tapir/config.toml b/frameworks/Scala/kyo-tapir/config.toml deleted file mode 100644 index f210a34bf48..00000000000 --- a/frameworks/Scala/kyo-tapir/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "kyo-tapir" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Micro" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Netty" -webserver = "None" -versus = "None" \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile b/frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile deleted file mode 100644 index 4dc5370acf2..00000000000 --- a/frameworks/Scala/kyo-tapir/kyo-tapir.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.7_3.6.3 - -WORKDIR /kyo-tapir -COPY src src -COPY project project -COPY build.sbt build.sbt -RUN sbt assembly - -EXPOSE 9999 -CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-Dio.netty.leakDetection.level=disabled", "-Dio.netty.recycler.maxCapacityPerThread=0", "-jar", "/kyo-tapir/target/scala-3.6.3/kyo-tapir-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/README.md b/frameworks/Scala/tapir/README.md new file mode 100644 index 00000000000..8375201828c --- /dev/null +++ b/frameworks/Scala/tapir/README.md @@ -0,0 +1,28 @@ +# Tapir Benchmarking Test + +This is a simple test to benchmark the performance of the Tapir libraries along with different backends in Scala. + +### Test Type Implementation Source Code + +* JSON +* PLAINTEXT + +## Software Versions + +* [Java OpenJDK 21](https://adoptium.net/temurin/releases/) +* [Scala 3.6.4](https://www.scala-lang.org/) +* [Tapir 1.11.24](https://tapir.softwaremill.com) + +### Backend Implementations +* [Tapir running as zio-http server](https://tapir.softwaremill.com/en/latest/server/ziohttp.html) +* [Tapir running as http4s server](https://tapir.softwaremill.com/en/latest/server/http4s.html) +* [as an http4s server using ZIO](https://tapir.softwaremill.com/en/latest/server/zio-http4s.html) +* [Tapir running as Netty-based server(Cats)](https://tapir.softwaremill.com/en/latest/server/netty.html) +* [Tapir running as Netty-based server(Kyo)](https://getkyo.io/#/?id=routes-http-server-via-tapir) +* [Tapir running as Netty-based server(ZIO)](https://tapir.softwaremill.com/en/latest/server/netty.html) +* [Tapir running as pekko-http server](https://tapir.softwaremill.com/en/latest/server/pekkohttp.html) + +## Test URLs + +* JSON - http://localhost:8080/json +* PLAINTEXT - http://localhost:8080/plaintext diff --git a/frameworks/Scala/tapir/benchmark_config.json b/frameworks/Scala/tapir/benchmark_config.json new file mode 100644 index 00000000000..96c27368335 --- /dev/null +++ b/frameworks/Scala/tapir/benchmark_config.json @@ -0,0 +1,140 @@ +{ + "framework": "tapir", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "tapir as zio-http server", + "notes": "https://tapir.softwaremill.com/en/latest/server/ziohttp.html", + "versus": "None" + }, + "http4s": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "tapir as http4s server", + "notes": "https://tapir.softwaremill.com/en/latest/server/http4s.html", + "versus": "None" + }, + "http4s-zio": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "tapir as http4s server using ZIO", + "notes": "https://tapir.softwaremill.com/en/latest/server/zio-http4s.html", + "versus": "None" + }, + "netty-cats": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "tapir as netty(cats) server", + "notes": "https://tapir.softwaremill.com/en/latest/server/netty.html", + "versus": "None" + }, + "netty-kyo": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "tapir as netty(kyo) server", + "notes": "https://getkyo.io/#/?id=routes-http-server-via-tapir", + "versus": "None" + }, + "netty-zio": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "tapir as netty(zio) server", + "notes": "https://tapir.softwaremill.com/en/latest/server/netty.html", + "versus": "None" + }, + "pekko-http": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "database": "None", + "approach": "Realistic", + "classification": "Micro", + "framework": "tapir", + "language": "Scala", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "database_os": "Linux", + "os": "Linux", + "display_name": "tapir as pekko-http server", + "notes": "https://tapir.softwaremill.com/en/latest/server/pekkohttp.html", + "versus": "None" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/Scala/tapir/build.sbt b/frameworks/Scala/tapir/build.sbt new file mode 100644 index 00000000000..99947e9a16c --- /dev/null +++ b/frameworks/Scala/tapir/build.sbt @@ -0,0 +1,100 @@ +name := "tapir-benchmark" + +ThisBuild / version := "1.0.0" +ThisBuild / scalaVersion := "3.6.4" + +val tapirVersion = "1.11.24" + +val commonAssemblySettings = assembly / assemblyMergeStrategy := { + case x if x.contains("io.netty.versions.properties") => MergeStrategy.discard + case x if x.contains("module-info.class") => MergeStrategy.discard + case x => + val oldStrategy = (assembly / assemblyMergeStrategy).value + oldStrategy(x) +} + +lazy val common = (project in file("common")) + .settings( + name := "tapir-benchmark-common" + ) + +lazy val `zio-http-server` = (project in file("zio-http-server")) + .dependsOn(common) + .settings( + name := "tapir-zio-http-server", + libraryDependencies ++= Seq( + "com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % tapirVersion, + "com.softwaremill.sttp.tapir" %% "tapir-json-zio" % tapirVersion + ), + commonAssemblySettings + ) + +lazy val `http4s-server` = (project in file("http4s-server")) + .dependsOn(common) + .settings( + name := "tapir-http4s-server", + libraryDependencies ++= Seq( + "com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % tapirVersion, + "com.softwaremill.sttp.tapir" %% "tapir-json-circe" % tapirVersion, + "org.http4s" %% "http4s-blaze-server" % "0.23.17", + ), + commonAssemblySettings + ) + +lazy val `http4s-server-zio` = (project in file("http4s-server-zio")) + .dependsOn(common) + .settings( + name := "tapir-http4s-server-zio", + libraryDependencies ++= Seq( + "com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % tapirVersion, + "com.softwaremill.sttp.tapir" %% "tapir-json-circe" % tapirVersion, + "org.http4s" %% "http4s-blaze-server" % "0.23.17", + "dev.zio" %% "zio-interop-cats" % "23.1.0.5" + ), + commonAssemblySettings + ) + +lazy val `netty-kyo-server` = (project in file("netty-kyo-server")) + .dependsOn(common) + .settings( + name := "tapir-netty-kyo-server", + libraryDependencies ++= Seq( + "io.getkyo" %% "kyo-tapir" % "0.18.0", + "com.softwaremill.sttp.tapir" %% "tapir-json-zio" % tapirVersion + ), + commonAssemblySettings + ) + +lazy val `netty-zio-server` = (project in file("netty-zio-server")) + .dependsOn(common) + .settings( + name := "tapir-netty-zio-server", + libraryDependencies ++= Seq( + "com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % tapirVersion, + "com.softwaremill.sttp.tapir" %% "tapir-json-zio" % tapirVersion, + ), + commonAssemblySettings + ) + +lazy val `netty-cats-server` = (project in file("netty-cats-server")) + .dependsOn(common) + .settings( + name := "tapir-netty-cats-server", + libraryDependencies ++= Seq( + "com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % tapirVersion, + "com.softwaremill.sttp.tapir" %% "tapir-json-circe" % tapirVersion, + "org.http4s" %% "http4s-blaze-server" % "0.23.17", + ), + commonAssemblySettings + ) + +lazy val `pekko-http-server` = (project in file("pekko-http-server")) + .dependsOn(common) + .settings( + name := "tapir-pekko-http-server", + libraryDependencies ++= Seq( + "com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % tapirVersion, + "com.softwaremill.sttp.tapir" %% "tapir-json-circe" % tapirVersion, + ), + commonAssemblySettings + ) diff --git a/frameworks/Scala/tapir/common/src/main/scala/Payload.scala b/frameworks/Scala/tapir/common/src/main/scala/Payload.scala new file mode 100644 index 00000000000..2b886ef91b8 --- /dev/null +++ b/frameworks/Scala/tapir/common/src/main/scala/Payload.scala @@ -0,0 +1 @@ +case class Payload(message: String) diff --git a/frameworks/Scala/tapir/config.toml b/frameworks/Scala/tapir/config.toml new file mode 100644 index 00000000000..895f262659b --- /dev/null +++ b/frameworks/Scala/tapir/config.toml @@ -0,0 +1,93 @@ +[framework] +name = "tapir" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" + +[http4s] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" + +[http4s-zio] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" + +[netty-cats] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" + +[netty-kyo] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" + +[netty-zio] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" + +[pekko-http] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Netty" +webserver = "None" +versus = "None" \ No newline at end of file diff --git a/frameworks/Scala/tapir/http4s-server-zio/src/main/scala/TapirHttp4sServerZioBenchmark.scala b/frameworks/Scala/tapir/http4s-server-zio/src/main/scala/TapirHttp4sServerZioBenchmark.scala new file mode 100644 index 00000000000..8e93bd7445c --- /dev/null +++ b/frameworks/Scala/tapir/http4s-server-zio/src/main/scala/TapirHttp4sServerZioBenchmark.scala @@ -0,0 +1,55 @@ +import io.circe.generic.auto.* +import org.http4s.HttpRoutes +import org.http4s.blaze.server.BlazeServerBuilder +import org.http4s.server.Router +import sttp.model.{Header, HeaderNames, StatusCode} +import sttp.tapir.generic.auto.* +import sttp.tapir.json.circe.* +import sttp.tapir.server.http4s.ztapir.ZHttp4sServerInterpreter +import sttp.tapir.ztapir.* +import zio.* + +import java.time.format.DateTimeFormatter +import java.time.{Clock, LocalDateTime, ZoneOffset, ZonedDateTime} +import java.util.Date +import java.util.concurrent.locks.LockSupport +import scala.concurrent.ExecutionContext +import zio.interop.catz.* + +object TapirHttp4sServerZioBenchmark extends ZIOAppDefault: + private val STATIC_SERVER_NAME = "tapir-http4s-server-zio" + + private val plainTextMessage: String = "Hello, World!" + + private val plaintextEndpoint: ZServerEndpoint[Any, Any] = + endpoint.get.in("plaintext") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(stringBody) + .zServerLogic(_ => ZIO.succeed(plainTextMessage)) + + private val jsonEndpoint: ZServerEndpoint[Any, Any] = + endpoint.get.in("json") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(jsonBody[Payload]) + .zServerLogic(_ => ZIO.succeed(Payload(plainTextMessage))) + + + private val declaredPort = 8080 + private val declaredHost = "0.0.0.0" + + private val routes: HttpRoutes[Task] = ZHttp4sServerInterpreter() + .from(List(plaintextEndpoint, jsonEndpoint)) + .toRoutes + + implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global + + override def run: URIO[Any, ExitCode] = + ZIO.executor.flatMap(executor => + BlazeServerBuilder[Task] + .withExecutionContext(executor.asExecutionContext) + .bindHttp(8080, declaredHost) + .withHttpApp(Router("/" -> routes).orNotFound) + .serve + .compile + .drain + ).exitCode diff --git a/frameworks/Scala/tapir/http4s-server/src/main/scala/TapirHttp4sServerBenchmark.scala b/frameworks/Scala/tapir/http4s-server/src/main/scala/TapirHttp4sServerBenchmark.scala new file mode 100644 index 00000000000..f8dadd8d446 --- /dev/null +++ b/frameworks/Scala/tapir/http4s-server/src/main/scala/TapirHttp4sServerBenchmark.scala @@ -0,0 +1,50 @@ +import cats.effect.{ExitCode, IO, IOApp} +import io.circe.generic.auto.* +import org.http4s.HttpRoutes +import org.http4s.blaze.server.BlazeServerBuilder +import org.http4s.server.Router +import sttp.model.{Header, HeaderNames, StatusCode} +import sttp.tapir.* +import sttp.tapir.generic.auto.* +import sttp.tapir.json.circe.* +import sttp.tapir.server.http4s.Http4sServerInterpreter + +import java.time.format.DateTimeFormatter +import java.time.{Clock, LocalDateTime, ZoneOffset, ZonedDateTime} +import java.util.Date +import java.util.concurrent.locks.LockSupport +import scala.concurrent.ExecutionContext + +object TapirHttp4sServerBenchmark extends IOApp: + private val STATIC_SERVER_NAME = "tapir-http4s-server" + + private val plainTextMessage: String = "Hello, World!" + + val plaintextEndpoint = + endpoint.get.in("plaintext") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(stringBody) + .serverLogic(_ => IO.pure[Either[Unit, String]](Right(plainTextMessage))) + + val jsonEndpoint = + endpoint.get.in("json") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(jsonBody[Payload]) + .serverLogic(_ => IO.pure[Either[Unit, Payload]](Right(Payload(plainTextMessage)))) + + + private val declaredPort = 8080 + private val declaredHost = "0.0.0.0" + + val routes = Http4sServerInterpreter[IO]().toRoutes(List(plaintextEndpoint, jsonEndpoint)) + + implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global + + override def run(args: List[String]): IO[ExitCode] = + BlazeServerBuilder[IO] + .withExecutionContext(ec) + .bindHttp(declaredPort, declaredHost) + .withHttpApp(Router("/" -> routes).orNotFound) + .resource + .useForever + .as(ExitCode.Success) diff --git a/frameworks/Scala/tapir/netty-cats-server/src/main/scala/TapirNettyCatsServerBenchmark.scala b/frameworks/Scala/tapir/netty-cats-server/src/main/scala/TapirNettyCatsServerBenchmark.scala new file mode 100644 index 00000000000..824b538a079 --- /dev/null +++ b/frameworks/Scala/tapir/netty-cats-server/src/main/scala/TapirNettyCatsServerBenchmark.scala @@ -0,0 +1,54 @@ +import cats.effect.{IO, IOApp} +import io.circe.generic.auto.* +import sttp.model.{Header, HeaderNames} +import sttp.tapir.* +import sttp.tapir.generic.auto.* +import sttp.tapir.json.circe.* +import sttp.tapir.server.netty.cats.NettyCatsServer + +import java.time.Instant + +object TapirNettyCatsServerBenchmark extends IOApp.Simple: + private val STATIC_SERVER_NAME = "tapir-netty-cats-server" + + private val plainTextMessage: String = "Hello, World!" + + val plaintextEndpoint = + endpoint.get.in("plaintext") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(header[String](HeaderNames.Date)) + .out(stringBody) + .serverLogic(_ => + for { + now <- IO.realTime.map(time => Instant.ofEpochMilli(time.toMillis)) + } yield Right(Header.toHttpDateString(now) -> plainTextMessage) + ) + + val jsonEndpoint = + endpoint.get.in("json") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(header[String](HeaderNames.Date)) + .out(jsonBody[Payload]) + .serverLogic(_ => + for { + now <- IO.realTime.map(time => Instant.ofEpochMilli(time.toMillis)) + } yield Right(Header.toHttpDateString(now) -> Payload(plainTextMessage)) + ) + + + private val declaredPort = 8080 + private val declaredHost = "0.0.0.0" + + override def run = NettyCatsServer + .io() + .use { server => + for { + _ <- server + .port(declaredPort) + .host(declaredHost) + .addEndpoint(plaintextEndpoint) + .addEndpoint(jsonEndpoint) + .start() + _ <- IO.never + } yield () + } diff --git a/frameworks/Scala/kyo-tapir/src/main/scala/Main.scala b/frameworks/Scala/tapir/netty-kyo-server/src/main/scala/TapirNettyKyoServerBenchmark.scala similarity index 83% rename from frameworks/Scala/kyo-tapir/src/main/scala/Main.scala rename to frameworks/Scala/tapir/netty-kyo-server/src/main/scala/TapirNettyKyoServerBenchmark.scala index 6c543de17e2..f8cbdb4618c 100644 --- a/frameworks/Scala/kyo-tapir/src/main/scala/Main.scala +++ b/frameworks/Scala/tapir/netty-kyo-server/src/main/scala/TapirNettyKyoServerBenchmark.scala @@ -3,12 +3,16 @@ import sttp.model.{Header, HeaderNames} import sttp.tapir.* import sttp.tapir.json.zio.* import sttp.tapir.server.netty.* +import zio.json.* -object Main extends KyoApp { +object TapirNettyKyoServerBenchmark extends KyoApp { private val STATIC_SERVER_NAME = "kyo-tapir" private val plainTextMessage: String = "Hello, World!" + private given JsonCodec[Payload] = DeriveJsonCodec.gen + private given Schema[Payload] = Schema.derived + run { val plaintextRoute: Unit < Routes = Routes.add( @@ -38,7 +42,7 @@ object Main extends KyoApp { .withSocketKeepAlive .copy(lingerTimeout = None) - val server = NettyKyoServer(config).host("0.0.0.0").port(9999) + val server = NettyKyoServer(config).host("0.0.0.0").port(8080) val binding: NettyKyoServerBinding < Async = Routes.run(server)(plaintextRoute.andThen(jsonRoute)) diff --git a/frameworks/Scala/tapir/netty-zio-server/src/main/scala/TapirNettyZioServerBenchmark.scala b/frameworks/Scala/tapir/netty-zio-server/src/main/scala/TapirNettyZioServerBenchmark.scala new file mode 100644 index 00000000000..fbd2fa34477 --- /dev/null +++ b/frameworks/Scala/tapir/netty-zio-server/src/main/scala/TapirNettyZioServerBenchmark.scala @@ -0,0 +1,57 @@ +import sttp.model.{Header, HeaderNames} +import sttp.tapir.Schema +import sttp.tapir.json.zio.* +import sttp.tapir.server.netty.zio.NettyZioServer +import sttp.tapir.ztapir.* +import zio.* +import zio.json.* +import sttp.tapir.server.netty.* + +object TapirNettyZioServerBenchmark extends ZIOAppDefault { + private val STATIC_SERVER_NAME = "tapir-netty-zio-server" + + private val plainTextMessage: String = "Hello, World!" + + given JsonCodec[Payload] = DeriveJsonCodec.gen + given Schema[Payload] = Schema.derived + + override def run = { + val plaintextRoute: ZServerEndpoint[Any, Any] = + endpoint.get.in("plaintext") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(header[String](HeaderNames.Date)) + .out(stringBody) + .zServerLogic { _ => + for { + now <- Clock.currentDateTime + } yield Header.toHttpDateString(now.toInstant) -> plainTextMessage + } + + val jsonRoute: ZServerEndpoint[Any, Any] = + endpoint.get.in("json") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(header[String](HeaderNames.Date)) + .out(jsonBody[Payload]) + .zServerLogic { _ => + for { + now <- Clock.currentDateTime + } yield Header.toHttpDateString(now.toInstant) -> Payload(plainTextMessage) + } + + val config = NettyConfig.default + .withSocketKeepAlive + .copy(lingerTimeout = None) + + + + val server = NettyZioServer[Any](config) + .addEndpoint(plaintextRoute) + .addEndpoint(jsonRoute) + .host("0.0.0.0") + .port(8080) + + server.start().flatMap { _ => + ZIO.never + } + } +} \ No newline at end of file diff --git a/frameworks/Scala/tapir/pekko-http-server/src/main/scala/Main.scala b/frameworks/Scala/tapir/pekko-http-server/src/main/scala/Main.scala new file mode 100644 index 00000000000..ebcdd901368 --- /dev/null +++ b/frameworks/Scala/tapir/pekko-http-server/src/main/scala/Main.scala @@ -0,0 +1,42 @@ +import io.circe.generic.auto.* +import org.apache.pekko.actor.ActorSystem +import org.apache.pekko.http.scaladsl.Http +import sttp.model.HeaderNames +import sttp.tapir.* +import sttp.tapir.json.circe.* +import sttp.tapir.server.pekkohttp.PekkoHttpServerInterpreter + +import scala.concurrent.Future + +@main def tapirPekkoServerBenchmark(): Unit = { + implicit val actorSystem: ActorSystem = ActorSystem() + import actorSystem.dispatcher + + val STATIC_SERVER_NAME = "tapir-pekko-http-server" + + val plainTextMessage: String = "Hello, World!" + + given Schema[Payload] = Schema.derived + + val plaintextRoute = + endpoint.get + .in("plaintext") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(stringBody) + .serverLogic[Future] { _ => + Future.successful(Right(plainTextMessage)) + } + + val jsonRoute = + endpoint.get + .in("json") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(jsonBody[Payload]) + .serverLogic[Future] { _ => + Future.successful(Right(Payload(plainTextMessage))) + } + + val route = PekkoHttpServerInterpreter().toRoute(List(plaintextRoute, jsonRoute)) + + Http().newServerAt("0.0.0.0", 8080).bindFlow(route) +} \ No newline at end of file diff --git a/frameworks/Scala/tapir/project/build.properties b/frameworks/Scala/tapir/project/build.properties new file mode 100644 index 00000000000..00a19d65b65 --- /dev/null +++ b/frameworks/Scala/tapir/project/build.properties @@ -0,0 +1 @@ +sbt.version = 1.10.11 \ No newline at end of file diff --git a/frameworks/Scala/kyo-tapir/project/plugins.sbt b/frameworks/Scala/tapir/project/plugins.sbt similarity index 100% rename from frameworks/Scala/kyo-tapir/project/plugins.sbt rename to frameworks/Scala/tapir/project/plugins.sbt diff --git a/frameworks/Scala/tapir/tapir-http4s-zio.dockerfile b/frameworks/Scala/tapir/tapir-http4s-zio.dockerfile new file mode 100644 index 00000000000..7ef30135459 --- /dev/null +++ b/frameworks/Scala/tapir/tapir-http4s-zio.dockerfile @@ -0,0 +1,11 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /tapir-benchmark +COPY http4s-server-zio http4s-server-zio +COPY common common +COPY project project +COPY build.sbt build.sbt +RUN sbt http4s-server-zio/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-jar", "/tapir-benchmark/http4s-server-zio/target/scala-3.6.4/tapir-http4s-server-zio-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/tapir-http4s.dockerfile b/frameworks/Scala/tapir/tapir-http4s.dockerfile new file mode 100644 index 00000000000..892210bc692 --- /dev/null +++ b/frameworks/Scala/tapir/tapir-http4s.dockerfile @@ -0,0 +1,11 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /tapir-benchmark +COPY http4s-server http4s-server +COPY common common +COPY project project +COPY build.sbt build.sbt +RUN sbt http4s-server/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-jar", "/tapir-benchmark/http4s-server/target/scala-3.6.4/tapir-http4s-server-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/tapir-netty-cats.dockerfile b/frameworks/Scala/tapir/tapir-netty-cats.dockerfile new file mode 100644 index 00000000000..5dec450e3d5 --- /dev/null +++ b/frameworks/Scala/tapir/tapir-netty-cats.dockerfile @@ -0,0 +1,11 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /tapir-benchmark +COPY netty-cats-server netty-cats-server +COPY common common +COPY project project +COPY build.sbt build.sbt +RUN sbt netty-cats-server/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-Dio.netty.leakDetection.level=disabled", "-Dio.netty.recycler.maxCapacityPerThread=0", "-jar", "/tapir-benchmark/netty-cats-server/target/scala-3.6.4/tapir-netty-cats-server-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/tapir-netty-kyo.dockerfile b/frameworks/Scala/tapir/tapir-netty-kyo.dockerfile new file mode 100644 index 00000000000..ed7a5991624 --- /dev/null +++ b/frameworks/Scala/tapir/tapir-netty-kyo.dockerfile @@ -0,0 +1,11 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /tapir-benchmark +COPY netty-kyo-server netty-kyo-server +COPY common common +COPY project project +COPY build.sbt build.sbt +RUN sbt netty-kyo-server/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-Dio.netty.leakDetection.level=disabled", "-Dio.netty.recycler.maxCapacityPerThread=0", "-jar", "/tapir-benchmark/netty-kyo-server/target/scala-3.6.4/tapir-netty-kyo-server-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/tapir-netty-zio.dockerfile b/frameworks/Scala/tapir/tapir-netty-zio.dockerfile new file mode 100644 index 00000000000..aa9c3607080 --- /dev/null +++ b/frameworks/Scala/tapir/tapir-netty-zio.dockerfile @@ -0,0 +1,11 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /tapir-benchmark +COPY netty-zio-server netty-zio-server +COPY common common +COPY project project +COPY build.sbt build.sbt +RUN sbt netty-zio-server/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-Dio.netty.leakDetection.level=disabled", "-Dio.netty.recycler.maxCapacityPerThread=0", "-jar", "/tapir-benchmark/netty-zio-server/target/scala-3.6.4/tapir-netty-zio-server-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/tapir-pekko-http.dockerfile b/frameworks/Scala/tapir/tapir-pekko-http.dockerfile new file mode 100644 index 00000000000..f21480ae5be --- /dev/null +++ b/frameworks/Scala/tapir/tapir-pekko-http.dockerfile @@ -0,0 +1,11 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /tapir-benchmark +COPY pekko-http-server pekko-http-server +COPY common common +COPY project project +COPY build.sbt build.sbt +RUN sbt pekko-http-server/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-jar", "/tapir-benchmark/pekko-http-server/target/scala-3.6.4/tapir-pekko-http-server-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/tapir.dockerfile b/frameworks/Scala/tapir/tapir.dockerfile new file mode 100644 index 00000000000..33e2438eea7 --- /dev/null +++ b/frameworks/Scala/tapir/tapir.dockerfile @@ -0,0 +1,11 @@ +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_3.6.4 + +WORKDIR /tapir-benchmark +COPY zio-http-server zio-http-server +COPY common common +COPY project project +COPY build.sbt build.sbt +RUN sbt zio-http-server/assembly + +EXPOSE 8080 +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-Dio.netty.leakDetection.level=disabled", "-Dio.netty.recycler.maxCapacityPerThread=0", "-jar", "/tapir-benchmark/zio-http-server/target/scala-3.6.4/tapir-zio-http-server-assembly-1.0.0.jar"] \ No newline at end of file diff --git a/frameworks/Scala/tapir/zio-http-server/src/main/scala/TapirZioHttpServerBenchmark.scala b/frameworks/Scala/tapir/zio-http-server/src/main/scala/TapirZioHttpServerBenchmark.scala new file mode 100644 index 00000000000..59e189b01bd --- /dev/null +++ b/frameworks/Scala/tapir/zio-http-server/src/main/scala/TapirZioHttpServerBenchmark.scala @@ -0,0 +1,56 @@ +import sttp.model.{Header, HeaderNames} +import sttp.tapir.Schema +import sttp.tapir.json.zio.* +import sttp.tapir.server.ziohttp.ZioHttpInterpreter +import sttp.tapir.ztapir.* +import zio.* +import zio.http.netty.NettyConfig +import zio.http.netty.NettyConfig.LeakDetectionLevel +import zio.http.{Request, Response, Routes, Server} +import zio.json.* + +import java.lang.Runtime as JRuntime + +object TapirZioHttpServerBenchmark extends ZIOAppDefault { + private val STATIC_SERVER_NAME = "zio-http-tapir" + + private val plainTextMessage: String = "Hello, World!" + private val NUM_PROCESSORS = JRuntime.getRuntime.availableProcessors() + + given JsonCodec[Payload] = DeriveJsonCodec.gen + given Schema[Payload] = Schema.derived + + override def run = { + val plaintextRoute: ZServerEndpoint[Any, Any] = + endpoint.get.in("plaintext") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(stringBody) + .zServerLogic { _ => + ZIO.succeed(plainTextMessage) + } + + val jsonRoute: ZServerEndpoint[Any, Any] = + endpoint.get.in("json") + .out(header(HeaderNames.Server, STATIC_SERVER_NAME)) + .out(jsonBody[Payload]) + .zServerLogic { _ => + ZIO.succeed(Payload(plainTextMessage)) + } + + val app = ZioHttpInterpreter().toHttp(List(plaintextRoute, jsonRoute)) + + + val config = Server.Config.default + .port(8080) + .enableRequestStreaming + + val nettyConfig = NettyConfig.default + .leakDetection(LeakDetectionLevel.DISABLED) + .maxThreads(NUM_PROCESSORS) + + val configLayer = ZLayer.succeed(config) + val nettyConfigLayer = ZLayer.succeed(nettyConfig) + + Server.serve(app).provide(configLayer, nettyConfigLayer, Server.customized).exitCode + } +} \ No newline at end of file diff --git a/frameworks/Scala/zio-http/README.md b/frameworks/Scala/zio-http/README.md index b5ea957391f..e9eb2759004 100644 --- a/frameworks/Scala/zio-http/README.md +++ b/frameworks/Scala/zio-http/README.md @@ -9,7 +9,7 @@ This is the ZIO Http portion of a [benchmarking test suite](../) comparing a var ## Versions -* [Java OpenJDK 11](https://openjdk.java.net/) +* [Java OpenJDK 21](https://openjdk.java.net/) ## Test URLs diff --git a/frameworks/Scala/zio-http/build.sbt b/frameworks/Scala/zio-http/build.sbt index a985d9b5dc9..4c0157b1354 100644 --- a/frameworks/Scala/zio-http/build.sbt +++ b/frameworks/Scala/zio-http/build.sbt @@ -1,9 +1,9 @@ name := "zio-http" version := "1.0.0" -scalaVersion := "2.13.14" +scalaVersion := "2.13.16" lazy val root = (project in file(".")) .settings( - libraryDependencies += "dev.zio" %% "zio-http" % "3.0.0-RC10", + libraryDependencies += "dev.zio" %% "zio-http" % "3.2.0", testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"), assembly / assemblyMergeStrategy := { case x if x.contains("io.netty.versions.properties") => MergeStrategy.discard diff --git a/frameworks/Scala/zio-http/src/main/scala/Main.scala b/frameworks/Scala/zio-http/src/main/scala/Main.scala index 8af102fd7f6..652a4a43357 100644 --- a/frameworks/Scala/zio-http/src/main/scala/Main.scala +++ b/frameworks/Scala/zio-http/src/main/scala/Main.scala @@ -2,12 +2,13 @@ import zio._ import zio.http._ import zio.http.netty.NettyConfig import zio.http.netty.NettyConfig.LeakDetectionLevel +import zio.json.EncoderOps + import java.lang.{Runtime => JRuntime} object Main extends ZIOAppDefault { private val plainTextMessage: String = "hello, world!" - private val jsonMessage: String = """{"message": "hello, world!"}""" private val STATIC_SERVER_NAME = "zio-http" private val NUM_PROCESSORS = JRuntime.getRuntime.availableProcessors() @@ -22,7 +23,7 @@ object Main extends ZIOAppDefault { Method.GET / "/json" -> Handler.fromResponse( Response - .json(jsonMessage) + .json(Payload(plainTextMessage).toJson) .addHeader(Header.Server(STATIC_SERVER_NAME)), ), ) diff --git a/frameworks/Scala/zio-http/src/main/scala/Payload.scala b/frameworks/Scala/zio-http/src/main/scala/Payload.scala new file mode 100644 index 00000000000..86b4fc705d7 --- /dev/null +++ b/frameworks/Scala/zio-http/src/main/scala/Payload.scala @@ -0,0 +1,6 @@ +import zio.json.{DeriveJsonCodec, JsonCodec} + +case class Payload(message: String) +object Payload { + implicit val codec: JsonCodec[Payload] = DeriveJsonCodec.gen +} \ No newline at end of file diff --git a/frameworks/Scala/zio-http/zio-http.dockerfile b/frameworks/Scala/zio-http/zio-http.dockerfile index f05ead620fe..5c814e5887a 100644 --- a/frameworks/Scala/zio-http/zio-http.dockerfile +++ b/frameworks/Scala/zio-http/zio-http.dockerfile @@ -1,4 +1,4 @@ -FROM hseeberger/scala-sbt:11.0.12_1.5.5_2.13.6 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 WORKDIR /zhttp COPY src src From 2999989ecaef7621aab8c605b01dadbdb1156c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Tue, 15 Apr 2025 01:05:01 +0800 Subject: [PATCH 1388/1766] Upgrade hyperlane (#9817) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml --- frameworks/Rust/hyperlane/Cargo.lock | 59 ++++++++++--------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- .../Rust/hyperlane/src/request_middleware.rs | 2 +- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 7d463f2e48a..d32d72d8a04 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -173,11 +173,11 @@ checksum = "fc3dfae702af156917c65f4ccc70687088331f0b694e5e687453e4d68a16b496" [[package]] name = "color-output" -version = "6.5.5" +version = "6.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5427d1c209887c8f2e528a64e0849a517fd14fe74d54904af57cb9446cf20b4" +checksum = "74d465b5dc60106412924964948f7e5c0c1f023e6b45fa451aad4110480bd750" dependencies = [ - "hyperlane-time", + "hyperlane-time 0.4.0", ] [[package]] @@ -362,9 +362,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "file-operation" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e0c123d53cd593ab9a38d5078c8483e890259dfec47bd453dfc09e6c052aca" +checksum = "ef3359808cbde3797c90abf4faed2f559acc51b6cefb384583e5fe0e62945119" dependencies = [ "tokio", ] @@ -638,9 +638,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def62accac840ecbddc4170585171192f4b0cf879fb4dc4e454699f476feff12" +checksum = "dce740ff69923dba33591c2c625bb49ccc098264c19e72d004b6fecca7c7d7d7" dependencies = [ "brotli", "flate2", @@ -649,15 +649,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711a0d020705f9eca6b58b4f23b6e815ecdafb6a8deeadd8ee6f49164b24e0c9" +checksum = "c978c76917568ef84ce5020d6b1fa49ce74a4dd65bc290b93b1355a81aebdb9e" [[package]] name = "http-type" -version = "3.61.2" +version = "3.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ebd70871ed728abc4ec31ec2044bb2d31382a371586a780ce2647049bc10d64" +checksum = "b636cec6e80b206725f9bf79c36ebccbee37ead35fdbca1b7583ee99f495a602" dependencies = [ "ahash", "dashmap", @@ -682,9 +682,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.77.0" +version = "4.84.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d05f78e4b2f883f81ace0a2569e78b565739643970157d9ff16b832ae1196e" +checksum = "65f71c235dd571f014fc5426a30f9f4ba42cf341007e4dc2797eec75da16c36d" dependencies = [ "async-func", "clonelicious", @@ -692,7 +692,6 @@ dependencies = [ "file-operation", "http-type", "hyperlane-log", - "hyperlane-time", "recoverable-spawn", "recoverable-thread-pool", "server-manager", @@ -700,21 +699,27 @@ dependencies = [ [[package]] name = "hyperlane-log" -version = "1.11.2" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15882faec87a44fc4285b5b5f0324c3b853dbc3cd2cfd4942ada9ba05828e0ee" +checksum = "caf0482aced2eb7960f268032c44327a3234eb3eea4ef6c80680e1ef83a94535" dependencies = [ "file-operation", - "hyperlane-time", + "hyperlane-time 0.5.0", "lombok-macros", "tokio", ] [[package]] name = "hyperlane-time" -version = "0.2.1" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa55a670a0db8677da642e02e3bd61d4fca3765b9d943f9429e4b0e5c5fd7e5" + +[[package]] +name = "hyperlane-time" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4737d903a4e4ed8c82c13d4878faebc117e06bd3386d7002bad4347558209de" +checksum = "075b6f8b97160e2af0a15d047f189c537939c824e9f96762dec226fd2f62a2ab" [[package]] name = "hyperlane_techempower" @@ -953,9 +958,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lombok-macros" -version = "1.9.6" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff7e8bfea5ff4ba05d8e287c4459438454d86face7b93552b43c51790481a42" +checksum = "f7c4d9a6dbaf4cdb37d7b148e86ca3aa688b499eff0fb44ea566d9770fb28451" dependencies = [ "proc-macro2", "quote", @@ -1258,9 +1263,9 @@ dependencies = [ [[package]] name = "recoverable-thread-pool" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0896f8322a96307d443bc472bbac0f80f2df18ce6967e5d0952c0e11203ff" +checksum = "1c492038cf040045396f083da49acefb762bb82739431e54dfd224a18d34bbb9" dependencies = [ "lombok-macros", "recoverable-spawn", @@ -1405,9 +1410,9 @@ dependencies = [ [[package]] name = "server-manager" -version = "3.1.3" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a91c52599e0a322858a971d3111ceed3cbb265eb90469473f10cba416b791e" +checksum = "f91c4f62e3f523a86b32faa645e4798300df473eab061651af180abbf4c7bb0e" dependencies = [ "tokio", ] @@ -1716,9 +1721,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "std-macro-extensions" -version = "0.22.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18041dd0553c6b667fdb69c22643e977473d070c88d1a220ec4c2536e6c9eb6d" +checksum = "a607e0efa86ea0eaa1985e254fd8412d8d2d2aa5e46af96b67a6b188677dcbeb" [[package]] name = "stringprep" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index c536f5a2ec6..16838acbca6 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.77.0" +hyperlane = "4.84.0" num_cpus = "1.16.0" rand = "0.9.0" serde = "1.0.219" diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 8b658d6207e..d2da9d540f9 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -8,7 +8,7 @@ pub async fn request(ctx: Context) { .await .set_response_header(SERVER, HYPERLANE) .await - .set_response_header(DATE, current_date_gmt()) + .set_response_header(DATE, gmt()) .await .set_response_status_code(200) .await; From 809537ee92f16311d6f7c0cd7eda8dc290ce9586 Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Mon, 14 Apr 2025 19:07:03 +0200 Subject: [PATCH 1389/1766] [ Kotlin / Hexagon ] Update Hexagon version and disable native image benchmarks (#9819) * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Fix native image settings * Change implementations * Update version * Add tests for new adapter * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Disable native benchmarks * Update configuration --- .../Kotlin/hexagon/benchmark_config.json | 46 ------------------ frameworks/Kotlin/hexagon/build.gradle | 17 ++++--- frameworks/Kotlin/hexagon/config.toml | 36 -------------- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 6 +-- frameworks/Kotlin/hexagon/gradlew.bat | 4 +- .../hexagon/hexagon-helidon-native.dockerfile | 2 +- .../hexagon-helidon-pgclient.dockerfile | 4 +- .../Kotlin/hexagon/hexagon-helidon.dockerfile | 4 +- .../hexagon/hexagon-jdk-pgclient.dockerfile | 4 +- .../Kotlin/hexagon/hexagon-jdk.dockerfile | 4 +- .../hexagon/hexagon-jetty-native.dockerfile | 2 +- .../hexagon-nettyepoll-pgclient.dockerfile | 4 +- .../hexagon/hexagon-nettyepoll.dockerfile | 4 +- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 4 +- .../src/main/kotlin/Benchmark.kt | 1 + .../helidon_pgclient/native-image.properties | 2 + .../src/main/kotlin/Benchmark.kt | 16 +++++- .../src/main/kotlin/Benchmark.kt | 3 +- .../src/main/kotlin/Benchmark.kt | 3 +- 22 files changed, 54 insertions(+), 116 deletions(-) create mode 100644 frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/helidon_pgclient/native-image.properties diff --git a/frameworks/Kotlin/hexagon/benchmark_config.json b/frameworks/Kotlin/hexagon/benchmark_config.json index f858301bddd..3791218d0c8 100644 --- a/frameworks/Kotlin/hexagon/benchmark_config.json +++ b/frameworks/Kotlin/hexagon/benchmark_config.json @@ -25,29 +25,6 @@ "notes": "http://hexagonkt.com", "versus": "servlet" }, - "jetty-native": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/query?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "cached_query_url": "/cached-queries?count=", - "plaintext_url": "/plaintext", - "port": 9090, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Servlet", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Jetty Native PostgreSQL", - "notes": "http://hexagonkt.com", - "versus": "servlet" - }, "jdk": { "json_url": "/json", "db_url": "/db", @@ -163,29 +140,6 @@ "notes": "http://hexagonkt.com", "versus": "helidon-helidon" }, - "helidon-native": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/query?queries=", - "fortune_url": "/fortunes", - "update_url": "/update?queries=", - "cached_query_url": "/cached-queries?count=", - "plaintext_url": "/plaintext", - "port": 9090, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Hexagon", - "language": "Kotlin", - "orm": "Raw", - "platform": "Helidon", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Hexagon Helidon Native PgClient", - "notes": "http://hexagonkt.com", - "versus": "helidon-helidon" - }, "helidon-pgclient": { "json_url": "/json", "db_url": "/db", diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 97818fa7924..2e098bc1760 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,7 +1,7 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.1.0" apply false - id "org.graalvm.buildtools.native" version "0.10.5" apply false + id "org.jetbrains.kotlin.jvm" version "2.1.20" apply false + id "org.graalvm.buildtools.native" version "0.10.6" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagontk" ext { - hexagonVersion = "4.0.1" - jettyVersion = "12.0.16" - nettyVersion = "4.1.118.Final" + hexagonVersion = "4.1.1" + jettyVersion = "12.0.19" + nettyVersion = "4.2.0.Final" - hikariVersion = "6.2.1" + hikariVersion = "6.3.0" postgresqlVersion = "42.7.5" - vertxVersion = "4.5.12" + vertxVersion = "5.0.0.CR6" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagontk.BenchmarkKt" @@ -30,5 +30,6 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.12.1" +// gradleVersion = "8.14.0" + gradleVersion = "release-candidate" } diff --git a/frameworks/Kotlin/hexagon/config.toml b/frameworks/Kotlin/hexagon/config.toml index c9e89f53241..c7d5be77ece 100644 --- a/frameworks/Kotlin/hexagon/config.toml +++ b/frameworks/Kotlin/hexagon/config.toml @@ -73,24 +73,6 @@ platform = "Netty" webserver = "None" versus = "netty" -[nettyepoll-native] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/query?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -urls.cached_query = "/cached-queries?count=" -approach = "Realistic" -classification = "Micro" -database = "postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Netty" -webserver = "None" -versus = "netty" - [nettyepoll-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" @@ -127,24 +109,6 @@ platform = "Helidon" webserver = "None" versus = "helidon-helidon" -[helidon-native] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/query?queries=" -urls.update = "/update?queries=" -urls.fortune = "/fortunes" -urls.cached_query = "/cached-queries?count=" -approach = "Realistic" -classification = "Micro" -database = "postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "Helidon" -webserver = "None" -versus = "helidon-helidon" - [helidon-pgclient] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 34943 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

      Gn4F+B~IivciU9^t0j-Mgao3 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 DDw4oP diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index e18bc253b85..bb3521c6063 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.12.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-rc-1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index f3b75f3b0d4..23d15a93670 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -205,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat index 9d21a21834d..db3a6ac207e 100644 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ b/frameworks/Kotlin/hexagon/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index 25a78904f79..3158876f7db 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM container-registry.oracle.com/graalvm/native-image:21-muslib-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:24-muslib-ol9 as build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index 2ad89ca5713..3effb8623a3 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/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 632cc8720b5..04c375f2d3e 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile index 485fff941e5..1cfcd6cb6d2 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl ARG PROJECT=hexagon_jdk_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile index b82e52e1100..71bafcce051 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-23-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-23-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl ARG PROJECT=hexagon_jdk_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile index b8efc965eb3..f301ecc3d55 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM container-registry.oracle.com/graalvm/native-image:21-muslib-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:24-muslib-ol9 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 90c5a0d03c8..509625769d2 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/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl ARG PROJECT=hexagon_nettyepoll_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 35a0e4729b7..5686ba65a55 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl ARG PROJECT=hexagon_nettyepoll_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index dfc6c521a1d..e9411ce8d37 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 2654c706db1..6613348410c 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-21-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-21-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt index 2a97cb6ab07..61018ea73bf 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/kotlin/Benchmark.kt @@ -23,6 +23,7 @@ fun main() { validatePath = systemSettingOrNull("validatePath") ?: false, validateRequestHeaders = systemSettingOrNull("validateRequestHeaders") ?: false, validateResponseHeaders = systemSettingOrNull("validateResponseHeaders") ?: false, + smartAsyncWrites = true, ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, Settings()) diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/helidon_pgclient/native-image.properties b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/helidon_pgclient/native-image.properties new file mode 100644 index 00000000000..85b899d04fb --- /dev/null +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_pgclient/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/helidon_pgclient/native-image.properties @@ -0,0 +1,2 @@ +Args= \ + --initialize-at-build-time=io.vertx.core.impl.buffer.VertxByteBufAllocator diff --git a/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt index 9cbf992c8f4..d5165e88359 100644 --- a/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_helidon_postgresql/src/main/kotlin/Benchmark.kt @@ -1,17 +1,31 @@ package com.hexagontk +import com.hexagontk.core.Platform.systemSettingOrNull import com.hexagontk.core.media.TEXT_HTML import com.hexagontk.core.urlOf import com.hexagontk.http.server.helidon.HelidonHttpServer import com.hexagontk.store.BenchmarkSqlStore import com.hexagontk.templates.jte.Jte +import java.time.Duration fun main() { val settings = Settings() val store = BenchmarkSqlStore("postgresql") val templateEngine = Jte(TEXT_HTML, precompiled = true) val templateUrl = urlOf("classpath:fortunes.jte") - val engine = HelidonHttpServer() + val engine = HelidonHttpServer( + backlog = systemSettingOrNull("backlog") ?: (8 * 1024), + writeQueueLength = systemSettingOrNull("writeQueueLength") ?: (8 * 1024), + readTimeout = Duration.parse(systemSettingOrNull("readTimeout") ?: "PT0S"), + connectTimeout = Duration.parse(systemSettingOrNull("connectTimeout") ?: "PT0S"), + tcpNoDelay = systemSettingOrNull("tcpNoDelay") ?: true, + receiveLog = systemSettingOrNull("receiveLog") ?: false, + sendLog = systemSettingOrNull("sendLog") ?: false, + validatePath = systemSettingOrNull("validatePath") ?: false, + validateRequestHeaders = systemSettingOrNull("validateRequestHeaders") ?: false, + validateResponseHeaders = systemSettingOrNull("validateResponseHeaders") ?: false, + smartAsyncWrites = true, + ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) benchmark.server.start() diff --git a/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt index d5cdace42f1..58c811603f4 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jdk_pgclient/src/main/kotlin/Benchmark.kt @@ -1,5 +1,6 @@ package com.hexagontk +import com.hexagontk.core.Platform.systemSettingOrNull import com.hexagontk.core.media.TEXT_HTML import com.hexagontk.core.urlOf import com.hexagontk.http.server.jdk.JdkHttpServer @@ -17,7 +18,7 @@ fun main() { val templateUrl = urlOf("classpath:fortunes.jte") val engine = JdkHttpServer( executor = newVirtualThreadPerTaskExecutor(), - backlog = 2_048 + backlog = systemSettingOrNull("backlog") ?: (8 * 1024), ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) diff --git a/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt index 67d2a3dfba2..2ca266d7829 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jdk_postgresql/src/main/kotlin/Benchmark.kt @@ -1,5 +1,6 @@ package com.hexagontk +import com.hexagontk.core.Platform.systemSettingOrNull import com.hexagontk.core.media.TEXT_HTML import com.hexagontk.core.urlOf import com.hexagontk.http.server.jdk.JdkHttpServer @@ -17,7 +18,7 @@ fun main() { val templateUrl = urlOf("classpath:fortunes.jte") val engine = JdkHttpServer( executor = newVirtualThreadPerTaskExecutor(), - backlog = 2_048 + backlog = systemSettingOrNull("backlog") ?: (8 * 1024), ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) From 564f4fda25c6c4fa9db06e3107007ed175140719 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 10:07:30 -0700 Subject: [PATCH 1390/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/aioworkers (#9822) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 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 4735f269313..454d35c9d59 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.4 +Jinja2==3.1.6 From 585fcb6a62b13e71d52a745e956f0d377b56cf2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 11:29:14 -0700 Subject: [PATCH 1391/1766] Bump golang.org/x/crypto in /frameworks/Go/goravel/src/fiber (#9823) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.24.0 to 0.35.0. - [Commits](https://github.com/golang/crypto/compare/v0.24.0...v0.35.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.35.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/goravel/src/fiber/go.mod | 11 ++++++----- frameworks/Go/goravel/src/fiber/go.sum | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/frameworks/Go/goravel/src/fiber/go.mod b/frameworks/Go/goravel/src/fiber/go.mod index 8c5b49edc32..e8ef6a81e1a 100644 --- a/frameworks/Go/goravel/src/fiber/go.mod +++ b/frameworks/Go/goravel/src/fiber/go.mod @@ -1,6 +1,7 @@ module goravel go 1.22 +toolchain go1.24.1 require ( github.com/bytedance/sonic v1.11.9 @@ -160,14 +161,14 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.24.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/net v0.26.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/term v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.171.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/frameworks/Go/goravel/src/fiber/go.sum b/frameworks/Go/goravel/src/fiber/go.sum index a22d712901e..1ad640938ec 100644 --- a/frameworks/Go/goravel/src/fiber/go.sum +++ b/frameworks/Go/goravel/src/fiber/go.sum @@ -723,8 +723,8 @@ golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0 golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -840,8 +840,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -905,8 +905,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -917,8 +917,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -935,8 +935,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 10377b776da810d268c0354f66f3b302c3ba5a77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Apr 2025 08:54:51 -0700 Subject: [PATCH 1392/1766] Bump golang.org/x/net in /frameworks/Go/ronykit/src (#9832) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.23.0 to 0.38.0. - [Commits](https://github.com/golang/net/compare/v0.23.0...v0.38.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.38.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/ronykit/src/go.mod | 4 ++-- frameworks/Go/ronykit/src/go.sum | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Go/ronykit/src/go.mod b/frameworks/Go/ronykit/src/go.mod index 068e9493033..34a588b8500 100644 --- a/frameworks/Go/ronykit/src/go.mod +++ b/frameworks/Go/ronykit/src/go.mod @@ -27,7 +27,7 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.50.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sys v0.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/ronykit/src/go.sum b/frameworks/Go/ronykit/src/go.sum index 95adb04bb84..655a26a3d44 100644 --- a/frameworks/Go/ronykit/src/go.sum +++ b/frameworks/Go/ronykit/src/go.sum @@ -62,13 +62,13 @@ github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From d189d8a7b49238ce97e0a125ca4f7cd126a474da Mon Sep 17 00:00:00 2001 From: Kayden <143221653+Kayden1412@users.noreply.github.com> Date: Fri, 18 Apr 2025 22:55:55 +0700 Subject: [PATCH 1393/1766] [Zig]: Update ZZZ (#9826) * Update zzz.dockerfile * Update zzz.dockerfile * Update zzz.dockerfile * Update zzz.dockerfile * Native optimized * Update zzz.dockerfile --- frameworks/Zig/zzz/zzz.dockerfile | 39 ++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/frameworks/Zig/zzz/zzz.dockerfile b/frameworks/Zig/zzz/zzz.dockerfile index 8411a39ba09..135445cadfa 100644 --- a/frameworks/Zig/zzz/zzz.dockerfile +++ b/frameworks/Zig/zzz/zzz.dockerfile @@ -1,21 +1,38 @@ -FROM debian:12.9 +FROM debian:12-slim AS build -WORKDIR /app +RUN useradd -m ziguser +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + wget xz-utils \ + ca-certificates && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +ARG ZIG_VER=0.14.0 +RUN wget https://ziglang.org/download/${ZIG_VER}/zig-linux-$(uname -m)-${ZIG_VER}.tar.xz + +RUN tar -xvf zig-linux-$(uname -m)-${ZIG_VER}.tar.xz + +RUN mv zig-linux-$(uname -m)-${ZIG_VER} /usr/local/zig + +ENV PATH="/usr/local/zig:$PATH" + +WORKDIR /home/ziguser COPY src src -COPY build.zig.zon build.zig.zon COPY build.zig build.zig +COPY build.zig.zon build.zig.zon -ARG ZIG_VER=0.14.0 +USER ziguser -RUN apt-get update && apt-get install -y curl xz-utils ca-certificates +RUN zig build -Doptimize=ReleaseFast -Dcpu=native +RUN ls -RUN curl https://ziglang.org/download/${ZIG_VER}/zig-linux-$(uname -m)-${ZIG_VER}.tar.xz -o zig-linux.tar.xz && \ - tar xf zig-linux.tar.xz && \ - mv zig-linux-$(uname -m)-${ZIG_VER}/ /opt/zig +FROM debian:12-slim -RUN /opt/zig/zig build -Doptimize=ReleaseFast +RUN apt-get -qq update +RUN apt-get -qy install ca-certificates +COPY --from=build /home/ziguser/zig-out/bin/zzz /server EXPOSE 8080 - -CMD ["zig-out/bin/zzz"] +ENTRYPOINT ./server From c29f3d903121ae30945fe956e0c5894d2f0eb20d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Fri, 18 Apr 2025 23:56:57 +0800 Subject: [PATCH 1394/1766] Upgrade hyperlane (#9825) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update --- frameworks/Rust/hyperlane/Cargo.lock | 75 ++++++++++--------- frameworks/Rust/hyperlane/Cargo.toml | 3 +- frameworks/Rust/hyperlane/src/const.rs | 17 +++++ frameworks/Rust/hyperlane/src/constant.rs | 16 ---- frameworks/Rust/hyperlane/src/db.rs | 4 +- frameworks/Rust/hyperlane/src/main.rs | 6 +- .../Rust/hyperlane/src/request_middleware.rs | 2 - .../Rust/hyperlane/src/response_middleware.rs | 5 -- frameworks/Rust/hyperlane/src/route.rs | 17 +++-- frameworks/Rust/hyperlane/src/server.rs | 11 ++- 10 files changed, 74 insertions(+), 82 deletions(-) create mode 100644 frameworks/Rust/hyperlane/src/const.rs delete mode 100644 frameworks/Rust/hyperlane/src/constant.rs delete mode 100644 frameworks/Rust/hyperlane/src/response_middleware.rs diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index d32d72d8a04..98d910ea035 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -324,9 +324,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -655,9 +655,9 @@ checksum = "c978c76917568ef84ce5020d6b1fa49ce74a4dd65bc290b93b1355a81aebdb9e" [[package]] name = "http-type" -version = "3.63.0" +version = "3.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b636cec6e80b206725f9bf79c36ebccbee37ead35fdbca1b7583ee99f495a602" +checksum = "228db23663f214e42497ed0fc66ddab4c7fea8039998823e49d516f559a92e5f" dependencies = [ "ahash", "dashmap", @@ -682,9 +682,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.84.0" +version = "4.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65f71c235dd571f014fc5426a30f9f4ba42cf341007e4dc2797eec75da16c36d" +checksum = "97c0552d7d2f270ca1fec64766617809aa82b86ad4424d8c31515ed79d2f121e" dependencies = [ "async-func", "clonelicious", @@ -726,7 +726,6 @@ name = "hyperlane_techempower" version = "0.0.1" dependencies = [ "hyperlane", - "num_cpus", "rand 0.9.0", "serde", "sqlx", @@ -873,9 +872,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -930,9 +929,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -985,9 +984,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] @@ -1274,9 +1273,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ "bitflags", ] @@ -1329,9 +1328,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ "bitflags", "errno", @@ -1490,18 +1489,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1528,9 +1527,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +checksum = "14e22987355fbf8cfb813a0cf8cd97b1b4ec834b94dbd759a9e8679d41fabe83" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1541,10 +1540,11 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +checksum = "55c4720d7d4cd3d5b00f61d03751c685ad09c33ae8290c8a2c11335e0604300b" dependencies = [ + "base64", "bytes", "crc", "crossbeam-queue", @@ -1574,9 +1574,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +checksum = "175147fcb75f353ac7675509bc58abb2cb291caf0fd24a3623b8f7e3eb0a754b" dependencies = [ "proc-macro2", "quote", @@ -1587,9 +1587,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +checksum = "1cde983058e53bfa75998e1982086c5efe3c370f3250bf0357e344fa3352e32b" dependencies = [ "dotenvy", "either", @@ -1613,9 +1613,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +checksum = "847d2e5393a4f39e47e4f36cab419709bc2b83cbe4223c60e86e1471655be333" dependencies = [ "atoi", "base64", @@ -1655,9 +1655,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +checksum = "cc35947a541b9e0a2e3d85da444f1c4137c13040267141b208395a0d0ca4659f" dependencies = [ "atoi", "base64", @@ -1692,9 +1692,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +checksum = "6c48291dac4e5ed32da0927a0b981788be65674aeb62666d19873ab4289febde" dependencies = [ "atoi", "flume", @@ -1709,6 +1709,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", + "thiserror 2.0.12", "tracing", "url", ] @@ -2268,9 +2269,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "yoke" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 16838acbca6..f274f2108d5 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,8 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.84.0" -num_cpus = "1.16.0" +hyperlane = "4.86.0" rand = "0.9.0" serde = "1.0.219" sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } diff --git a/frameworks/Rust/hyperlane/src/const.rs b/frameworks/Rust/hyperlane/src/const.rs new file mode 100644 index 00000000000..93728efd2e4 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/const.rs @@ -0,0 +1,17 @@ +pub const RESPONSEDATA_STR: &str = "Hello, World!"; +pub const RESPONSEDATA_BIN: &[u8] = b"Hello, World!"; +pub const DATABASE_TYPE: &str = "postgres"; +pub const DATABASE_HOST: &str = "tfb-database"; +pub const DATABASE_USER_NAME: &str = "benchmarkdbuser"; +pub const DATABASE_USER_PASSWORD: &str = "benchmarkdbpass"; +pub const DATABASE_PORT: usize = 5_432; +pub const DATABASE_NAME: &str = "hello_world"; +pub const TABLE_NAME_WORLD: &str = "World"; +pub const TABLE_NAME_FORTUNE: &str = "Fortune"; +pub const ROW_LIMIT: i32 = 500; +pub const RANDOM_MAX: i32 = 10_000; +pub const RANDOM_MAX_ADD_ONE: u32 = 10_001; +pub const KEY_ID: &str = "id"; +pub const KEY_RANDOM_NUMBER: &str = "randomnumber"; +pub const KEY_MESSAGE: &str = "message"; +pub const DB_MAX_CONNECTIONS: u32 = 100; diff --git a/frameworks/Rust/hyperlane/src/constant.rs b/frameworks/Rust/hyperlane/src/constant.rs deleted file mode 100644 index 3c09d6f416a..00000000000 --- a/frameworks/Rust/hyperlane/src/constant.rs +++ /dev/null @@ -1,16 +0,0 @@ -pub static RESPONSEDATA_STR: &str = "Hello, World!"; -pub static RESPONSEDATA_BIN: &[u8] = b"Hello, World!"; -pub static DATABASE_TYPE: &str = "postgres"; -pub static DATABASE_HOST: &str = "tfb-database"; -pub static DATABASE_USER_NAME: &str = "benchmarkdbuser"; -pub static DATABASE_USER_PASSWORD: &str = "benchmarkdbpass"; -pub static DATABASE_PORT: usize = 5_432; -pub static DATABASE_NAME: &str = "hello_world"; -pub static TABLE_NAME_WORLD: &str = "World"; -pub static TABLE_NAME_FORTUNE: &str = "Fortune"; -pub static ROW_LIMIT: i32 = 500; -pub static RANDOM_MAX: i32 = 10_000; -pub static RANDOM_MAX_ADD_ONE: u32 = 10_001; -pub static KEY_ID: &str = "id"; -pub static KEY_RANDOM_NUMBER: &str = "randomnumber"; -pub static KEY_MESSAGE: &str = "message"; diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 92d7253438d..bafba28ca6d 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -100,9 +100,9 @@ pub async fn connection_db() -> DbPoolConnection { DATABASE_NAME ), }; - let pool_size: u32 = num_cpus::get() as u32; + let pool_size: u32 = (get_thread_count() as u32).min(DB_MAX_CONNECTIONS); let pool: DbPoolConnection = PgPoolOptions::new() - .max_connections(100) + .max_connections(DB_MAX_CONNECTIONS) .min_connections(pool_size) .max_lifetime(None) .test_before_acquire(false) diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index 0b7ce0a26de..e4b739e7c6a 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -1,14 +1,13 @@ -pub(crate) mod constant; +pub(crate) mod r#const; pub(crate) mod db; pub(crate) mod lazy; pub(crate) mod request_middleware; -pub(crate) mod response_middleware; pub(crate) mod route; pub(crate) mod server; pub(crate) mod r#type; pub(crate) mod utils; -pub(crate) use constant::*; +pub(crate) use r#const::*; pub(crate) use db::*; pub(crate) use hyperlane::{ futures::{executor::block_on, future::join_all}, @@ -21,7 +20,6 @@ pub(crate) use hyperlane::{ pub(crate) use lazy::*; pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng}; pub(crate) use request_middleware::*; -pub(crate) use response_middleware::*; pub(crate) use route::*; pub(crate) use server::*; pub(crate) use sqlx::{ diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index d2da9d540f9..592dbb89170 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -9,7 +9,5 @@ pub async fn request(ctx: Context) { .set_response_header(SERVER, HYPERLANE) .await .set_response_header(DATE, gmt()) - .await - .set_response_status_code(200) .await; } diff --git a/frameworks/Rust/hyperlane/src/response_middleware.rs b/frameworks/Rust/hyperlane/src/response_middleware.rs deleted file mode 100644 index 85e8f422ebf..00000000000 --- a/frameworks/Rust/hyperlane/src/response_middleware.rs +++ /dev/null @@ -1,5 +0,0 @@ -use crate::*; - -pub async fn response(ctx: Context) { - let _ = ctx.send().await; -} diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 8ed6ec4e460..b92ae44b881 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -5,7 +5,7 @@ pub async fn json(ctx: Context) { "message": RESPONSEDATA_STR }); let _ = ctx - .set_response_body(serde_json::to_string(&json).unwrap_or_default()) + .send_response(200, serde_json::to_string(&json).unwrap_or_default()) .await; } @@ -13,7 +13,7 @@ pub async fn plaintext(ctx: Context) { let _ = ctx .set_response_header(CONTENT_TYPE, TEXT_PLAIN) .await - .set_response_body(RESPONSEDATA_BIN) + .send_response(200, RESPONSEDATA_BIN) .await; } @@ -21,7 +21,7 @@ pub async fn db(ctx: Context) { let db_connection: &DbPoolConnection = get_db_connection(); let query_row: QueryRow = random_world_row(db_connection).await; let _ = ctx - .set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) + .send_response(200, serde_json::to_string(&query_row).unwrap_or_default()) .await; } @@ -36,7 +36,7 @@ pub async fn queries(ctx: Context) { let db_pool: &DbPoolConnection = get_db_connection(); let data: Vec = get_some_row_id(queries, db_pool).await; let _ = ctx - .set_response_body(serde_json::to_string(&data).unwrap_or_default()) + .send_response(200, serde_json::to_string(&data).unwrap_or_default()) .await; } @@ -56,9 +56,10 @@ pub async fn fortunes(ctx: Context) { )); fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); let res: String = FortunesTemplate::new(fortunes_list).to_string(); - ctx.set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) + let _ = ctx + .set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) .await - .set_response_body(res) + .send_response(200, res) .await; } @@ -72,7 +73,7 @@ pub async fn updates(ctx: Context) { .max(1); let res: Vec = update_world_rows(queries).await; let _ = ctx - .set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .send_response(200, serde_json::to_string(&res).unwrap_or_default()) .await; } @@ -86,6 +87,6 @@ pub async fn cached_queries(ctx: Context) { .max(1); let res: Vec = CACHE.iter().take(count as usize).cloned().collect(); let _ = ctx - .set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .send_response(200, serde_json::to_string(&res).unwrap_or_default()) .await; } diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 72883143580..c26882a7ce5 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -3,8 +3,8 @@ use tokio::runtime::{Builder, Runtime}; fn runtime() -> Runtime { Builder::new_multi_thread() - .worker_threads(get_thread_count()) - .thread_stack_size(2097152) + .worker_threads(get_thread_count() >> 1) + .thread_stack_size(1_048_576) .max_blocking_threads(5120) .max_io_events_per_tick(5120) .enable_all() @@ -21,8 +21,9 @@ async fn init_server() { server.disable_log().await; server.disable_inner_log().await; server.disable_inner_print().await; - server.http_line_buffer_size(512).await; - server.websocket_buffer_size(512).await; + server.http_line_buffer_size(256).await; + server.websocket_buffer_size(256).await; + server.request_middleware(request).await; server.route("/plaintext", plaintext).await; server.route("/json", json).await; server.route("/cached-quer", cached_queries).await; @@ -30,8 +31,6 @@ async fn init_server() { server.route("/query", queries).await; server.route("/fortunes", fortunes).await; server.route("/upda", updates).await; - server.request_middleware(request).await; - server.response_middleware(response).await; server.listen().await.unwrap(); } From be13fbfc03b856699549f83801cb6a893141f896 Mon Sep 17 00:00:00 2001 From: Alpha Ho <666504+alphaho@users.noreply.github.com> Date: Sat, 19 Apr 2025 00:57:28 +0900 Subject: [PATCH 1395/1766] fix otavia to adhere to the json test requirement (#9818) * fix otavia to adhere to the json test requirement * differentiate the display_name of different otavia variants --- .../src/app/controller/JsonController.scala | 17 +++++++++++++++++ .../otavia/benchmark/src/app/startup.scala | 7 +++++-- frameworks/Scala/otavia/benchmark_config.json | 4 ++-- 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 frameworks/Scala/otavia/benchmark/src/app/controller/JsonController.scala diff --git a/frameworks/Scala/otavia/benchmark/src/app/controller/JsonController.scala b/frameworks/Scala/otavia/benchmark/src/app/controller/JsonController.scala new file mode 100644 index 00000000000..4d7cf7c9dd9 --- /dev/null +++ b/frameworks/Scala/otavia/benchmark/src/app/controller/JsonController.scala @@ -0,0 +1,17 @@ +package app.controller + +import app.controller.JsonController.JsonRequest +import app.model.Message +import cc.otavia.core.actor.StateActor +import cc.otavia.http.server.{HttpRequest, HttpResponse} +import cc.otavia.core.stack.{AskStack, StackYield} + +class JsonController extends StateActor[JsonRequest] { + override protected def resumeAsk(stack: AskStack[JsonRequest]): StackYield = { + stack.`return`(HttpResponse.builder.setContent(Message("Hello, World!")).build()) + } +} +object JsonController { + object JsonRequest extends HttpRequest[Nothing, HttpResponse[Message]] + type JsonRequest = JsonRequest.type +} \ No newline at end of file diff --git a/frameworks/Scala/otavia/benchmark/src/app/startup.scala b/frameworks/Scala/otavia/benchmark/src/app/startup.scala index 32eb0c2e539..8b81bbf8ad7 100644 --- a/frameworks/Scala/otavia/benchmark/src/app/startup.scala +++ b/frameworks/Scala/otavia/benchmark/src/app/startup.scala @@ -2,7 +2,7 @@ package app import app.controller.DBController.* import app.controller.FortuneController.* -import app.controller.{DBController, FortuneController} +import app.controller.* import app.model.* import app.util.FortunesRender import cc.otavia.core.actor.ChannelsActor.{Bind, ChannelEstablished} @@ -28,18 +28,20 @@ private class ServerMain(val port: Int = 8080) extends MainActor(Array.empty) { override def main0(stack: NoticeStack[MainActor.Args]): StackYield = stack.state match case _: StartState => + val messageResponseSerde = HttpResponseSerde.json(summon[JsonSerde[Message]]) val worldResponseSerde = HttpResponseSerde.json(summon[JsonSerde[World]]) val worldsResponseSerde = HttpResponseSerde.json(JsonSerde.derived[Seq[World]]) val fortunesResponseSerde = HttpResponseSerde(new FortunesRender(), MediaType.TEXT_HTML_UTF8) val dbController = autowire[DBController]() val fortuneController = autowire[FortuneController]() + val jsonController = autowire[JsonController]() val routers = Seq( // Test 6: plaintext constant[Array[Byte]](GET, "/plaintext", "Hello, World!".getBytes(UTF_8), BytesSerde, TEXT_PLAIN_UTF8), // Test 1: JSON serialization - constant[Message](GET, "/json", Message("Hello, World!"), summon[JsonSerde[Message]], APP_JSON), + get("/json", jsonController, () => JsonController.JsonRequest, messageResponseSerde), // Test 2: Single database query. get("/db", dbController, () => new SingleQueryRequest(), worldResponseSerde), // Test 3: Multiple database queries @@ -67,4 +69,5 @@ private class ServerMain(val port: Int = 8080) extends MainActor(Array.empty) { system.buildActor(() => new Connection(url, user, password), global = true, num = poolSize) system.buildActor(() => new DBController(), global = true, num = system.actorWorkerSize) system.buildActor(() => new FortuneController(), global = true, num = system.actorWorkerSize) + system.buildActor(() => new JsonController(), global = true, num = system.actorWorkerSize) system.buildActor(() => new ServerMain()) diff --git a/frameworks/Scala/otavia/benchmark_config.json b/frameworks/Scala/otavia/benchmark_config.json index 87204fa771d..53182b73c51 100644 --- a/frameworks/Scala/otavia/benchmark_config.json +++ b/frameworks/Scala/otavia/benchmark_config.json @@ -21,7 +21,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "otavia", + "display_name": "otavia (poolSize = 56)", "notes": "", "versus": "Otavia" }, @@ -44,7 +44,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "otavia", + "display_name": "otavia (poolSize = 64)", "notes": "", "versus": "Otavia" } From 1ebc727481469fcfdcc2208b9d25f86b5fe4b397 Mon Sep 17 00:00:00 2001 From: Sergey Kovalev <44sergey@gmail.com> Date: Fri, 18 Apr 2025 19:57:59 +0400 Subject: [PATCH 1396/1766] [aiohttp] - disable reset query and remove explicit call prepare (#9829) * [aiohttp] - disable reset query and remove explicit call prepare * revert import change Co-authored-by: Sam Bull --------- Co-authored-by: Sam Bull --- frameworks/Python/aiohttp/app/main.py | 7 ++++++- frameworks/Python/aiohttp/app/views.py | 8 +++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frameworks/Python/aiohttp/app/main.py b/frameworks/Python/aiohttp/app/main.py index 6ed65ed19d7..ef2b2fd4f8b 100644 --- a/frameworks/Python/aiohttp/app/main.py +++ b/frameworks/Python/aiohttp/app/main.py @@ -37,6 +37,11 @@ def pg_dsn(dialect=None) -> str: ) return url.render_as_string(hide_password=False) +class NoResetConnection(asyncpg.Connection): + __slots__ = () + + def get_reset_query(self): + return '' async def db_ctx(app: web.Application): # number of gunicorn workers = multiprocessing.cpu_count() as per gunicorn_conf.py @@ -52,7 +57,7 @@ async def db_ctx(app: web.Application): app['db_session'] = async_sessionmaker(engine) else: dsn = pg_dsn() - app['pg'] = await asyncpg.create_pool(dsn=dsn, min_size=min_size, max_size=max_size, loop=app.loop) + app['pg'] = await asyncpg.create_pool(dsn=dsn, min_size=min_size, max_size=max_size, loop=app.loop, connection_class=NoResetConnection) yield diff --git a/frameworks/Python/aiohttp/app/views.py b/frameworks/Python/aiohttp/app/views.py index c5e76da736f..aa60ad4164d 100644 --- a/frameworks/Python/aiohttp/app/views.py +++ b/frameworks/Python/aiohttp/app/views.py @@ -66,7 +66,7 @@ async def single_database_query_raw(request): id_ = randint(1, 10000) async with request.app['pg'].acquire() as conn: - r = await conn.fetchval('SELECT id,randomnumber FROM world WHERE id = $1', id_) + r = await conn.fetchval(READ_ROW_SQL, id_) return json_response({'id': id_, 'randomNumber': r}) @@ -96,11 +96,10 @@ async def multiple_database_queries_raw(request): result = [] async with request.app['pg'].acquire() as conn: - stmt = await conn.prepare(READ_ROW_SQL) for id_ in ids: result.append({ 'id': id_, - 'randomNumber': await stmt.fetchval(id_), + 'randomNumber': await conn.fetchval(READ_ROW_SQL, id_), }) return json_response(result) @@ -160,10 +159,9 @@ async def updates_raw(request): worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] async with request.app['pg'].acquire() as conn: - stmt = await conn.prepare(READ_ROW_SQL) for id_, _ in updates: # the result of this is the int previous random number which we don't actually use - await stmt.fetchval(id_) + await conn.fetchval(READ_ROW_SQL, id_) await conn.executemany(WRITE_ROW_SQL, updates) return json_response(worlds) From 1dfe7346489f5e6eb0f0de2ef702ef5c5316d702 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Fri, 18 Apr 2025 22:58:23 +0700 Subject: [PATCH 1397/1766] Make logger less spammy (#9835) * Update logback.xml * Update logback.xml * Update logback.xml * Update logback.xml * Update logback.xml --- .../ktor/ktor-asyncdb/src/main/resources/logback.xml | 6 +++--- .../ktor/ktor-pgclient/src/main/resources/logback.xml | 6 +++--- .../ktor/ktor-r2dbc/src/main/resources/logback.xml | 10 +++++----- .../Kotlin/ktor/ktor/src/main/resources/logback.xml | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml index 9fd0f518971..5aa05dbf60c 100644 --- a/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml +++ b/frameworks/Kotlin/ktor/ktor-asyncdb/src/main/resources/logback.xml @@ -11,11 +11,11 @@ - + - - + + diff --git a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml index 9fd0f518971..5aa05dbf60c 100644 --- a/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml +++ b/frameworks/Kotlin/ktor/ktor-pgclient/src/main/resources/logback.xml @@ -11,11 +11,11 @@ - + - - + + diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml index 3f5ba85f95f..4a21e8cd962 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/logback.xml @@ -10,12 +10,12 @@ - + - - - - + + + + diff --git a/frameworks/Kotlin/ktor/ktor/src/main/resources/logback.xml b/frameworks/Kotlin/ktor/ktor/src/main/resources/logback.xml index 9fd0f518971..5aa05dbf60c 100644 --- a/frameworks/Kotlin/ktor/ktor/src/main/resources/logback.xml +++ b/frameworks/Kotlin/ktor/ktor/src/main/resources/logback.xml @@ -11,11 +11,11 @@ - + - - + + From c69d468a85a348e49382be2c93045177b45e1259 Mon Sep 17 00:00:00 2001 From: Glen De Cauwsemaecker Date: Fri, 18 Apr 2025 18:13:10 +0200 Subject: [PATCH 1398/1766] add rama rust framework to benchmarks (#9830) * add rama rust framework to benchmarks * bytes should not be optional dep for rama benchmark --- frameworks/Rust/rama/.gitignore | 2 + frameworks/Rust/rama/Cargo.lock | 4523 +++++++++++++++++ frameworks/Rust/rama/Cargo.toml | 76 + frameworks/Rust/rama/README.md | 43 + frameworks/Rust/rama/benchmark_config.json | 141 + frameworks/Rust/rama/config.toml | 20 + frameworks/Rust/rama/rama.dockerfile | 24 + frameworks/Rust/rama/run.sh | 3 + frameworks/Rust/rama/rustfmt.toml | 2 + frameworks/Rust/rama/src/common/mod.rs | 49 + frameworks/Rust/rama/src/common/models.rs | 25 + frameworks/Rust/rama/src/common/simd_json.rs | 150 + frameworks/Rust/rama/src/common/utils.rs | 51 + frameworks/Rust/rama/src/main.rs | 44 + frameworks/Rust/rama/src/main_mongo.rs | 151 + frameworks/Rust/rama/src/main_mongo_raw.rs | 122 + frameworks/Rust/rama/src/main_pg.rs | 103 + frameworks/Rust/rama/src/main_pg_pool.rs | 145 + frameworks/Rust/rama/src/main_sqlx.rs | 160 + frameworks/Rust/rama/src/mongo/database.rs | 116 + frameworks/Rust/rama/src/mongo/mod.rs | 1 + .../Rust/rama/src/mongo_raw/database.rs | 107 + frameworks/Rust/rama/src/mongo_raw/mod.rs | 1 + frameworks/Rust/rama/src/pg/database.rs | 154 + frameworks/Rust/rama/src/pg/mod.rs | 2 + frameworks/Rust/rama/src/pg/models.rs | 16 + frameworks/Rust/rama/src/pg_pool/database.rs | 95 + frameworks/Rust/rama/src/pg_pool/mod.rs | 2 + frameworks/Rust/rama/src/pg_pool/models.rs | 19 + frameworks/Rust/rama/src/server.rs | 77 + frameworks/Rust/rama/src/sqlx/database.rs | 36 + frameworks/Rust/rama/src/sqlx/mod.rs | 2 + frameworks/Rust/rama/src/sqlx/models.rs | 16 + .../Rust/rama/templates/fortunes.html.hbs | 5 + 34 files changed, 6483 insertions(+) create mode 100644 frameworks/Rust/rama/.gitignore create mode 100644 frameworks/Rust/rama/Cargo.lock create mode 100644 frameworks/Rust/rama/Cargo.toml create mode 100755 frameworks/Rust/rama/README.md create mode 100755 frameworks/Rust/rama/benchmark_config.json create mode 100644 frameworks/Rust/rama/config.toml create mode 100644 frameworks/Rust/rama/rama.dockerfile create mode 100644 frameworks/Rust/rama/run.sh create mode 100644 frameworks/Rust/rama/rustfmt.toml create mode 100644 frameworks/Rust/rama/src/common/mod.rs create mode 100644 frameworks/Rust/rama/src/common/models.rs create mode 100644 frameworks/Rust/rama/src/common/simd_json.rs create mode 100644 frameworks/Rust/rama/src/common/utils.rs create mode 100644 frameworks/Rust/rama/src/main.rs create mode 100644 frameworks/Rust/rama/src/main_mongo.rs create mode 100644 frameworks/Rust/rama/src/main_mongo_raw.rs create mode 100644 frameworks/Rust/rama/src/main_pg.rs create mode 100644 frameworks/Rust/rama/src/main_pg_pool.rs create mode 100644 frameworks/Rust/rama/src/main_sqlx.rs create mode 100644 frameworks/Rust/rama/src/mongo/database.rs create mode 100644 frameworks/Rust/rama/src/mongo/mod.rs create mode 100644 frameworks/Rust/rama/src/mongo_raw/database.rs create mode 100644 frameworks/Rust/rama/src/mongo_raw/mod.rs create mode 100644 frameworks/Rust/rama/src/pg/database.rs create mode 100644 frameworks/Rust/rama/src/pg/mod.rs create mode 100644 frameworks/Rust/rama/src/pg/models.rs create mode 100644 frameworks/Rust/rama/src/pg_pool/database.rs create mode 100644 frameworks/Rust/rama/src/pg_pool/mod.rs create mode 100644 frameworks/Rust/rama/src/pg_pool/models.rs create mode 100644 frameworks/Rust/rama/src/server.rs create mode 100644 frameworks/Rust/rama/src/sqlx/database.rs create mode 100644 frameworks/Rust/rama/src/sqlx/mod.rs create mode 100644 frameworks/Rust/rama/src/sqlx/models.rs create mode 100644 frameworks/Rust/rama/templates/fortunes.html.hbs diff --git a/frameworks/Rust/rama/.gitignore b/frameworks/Rust/rama/.gitignore new file mode 100644 index 00000000000..b7f7b51783c --- /dev/null +++ b/frameworks/Rust/rama/.gitignore @@ -0,0 +1,2 @@ +.env +target/ diff --git a/frameworks/Rust/rama/Cargo.lock b/frameworks/Rust/rama/Cargo.lock new file mode 100644 index 00000000000..87560fe249d --- /dev/null +++ b/frameworks/Rust/rama/Cargo.lock @@ -0,0 +1,4523 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "annotate-snippets" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "async-compression" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a194f9d963d8099596278594b3107448656ba73831c9d8c783e613ce86da64" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "zstd 0.13.3", + "zstd-safe 7.2.1", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "async-trait" +version = "0.1.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "cfg_aliases", +] + +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bson" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8113ff51309e2779e8785a246c10fb783e8c2452f134d6257fd71cc03ccd6c" +dependencies = [ + "ahash", + "base64 0.22.1", + "bitvec", + "getrandom 0.2.15", + "getrandom 0.3.2", + "hex", + "indexmap 2.7.0", + "js-sys", + "once_cell", + "rand 0.9.0", + "serde", + "serde_bytes", + "serde_json", + "time", + "uuid", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +dependencies = [ + "memchr", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.91", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "deadpool" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f" +dependencies = [ + "deadpool-runtime", + "num_cpus", + "serde", + "tokio", +] + +[[package]] +name = "deadpool-postgres" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" +dependencies = [ + "async-trait", + "deadpool", + "getrandom 0.2.15", + "serde", + "tokio", + "tokio-postgres", + "tracing", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +dependencies = [ + "tokio", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "derive-where" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.91", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +dependencies = [ + "serde", +] + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.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]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generator" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +dependencies = [ + "cfg-if", + "libc", + "log", + "rustversion", + "windows", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.7.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "halfbrown" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" +dependencies = [ + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "headers" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" +dependencies = [ + "base64 0.21.7", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hickory-proto" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad3d6d98c648ed628df039541a5577bee1a7c83e9e16fe3dbedeea4cdfeb971" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror 1.0.69", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-proto" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d844af74f7b799e41c78221be863bade11c430d46042c3b49ca8ae0c6d27287" +dependencies = [ + "async-recursion", + "async-trait", + "cfg-if", + "critical-section", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.9.0", + "ring", + "thiserror 2.0.12", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto 0.24.3", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "hickory-resolver" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a128410b38d6f931fcc6ca5c107a3b02cabd6c05967841269a4ad65d23c44331" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto 0.25.1", + "moka", + "once_cell", + "parking_lot", + "rand 0.9.0", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b20daca3a4ac14dbdc753c5e90fc7b490a48a9131daed3c9a9ced7b2defd37b" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "pin-utils", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "macro_magic" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "macro_magic_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" +dependencies = [ + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mimalloc" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03cb1f88093fe50061ca1195d336ffec131347c7b833db31f9ab62a2d1b7925f" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "moka" +version = "0.12.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "loom", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "mongodb" +version = "3.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf4261933e5113914caec01c4bb16a7502bdaa9cf80fd87191765e7d9ff16b2" +dependencies = [ + "async-trait", + "base64 0.13.1", + "bitflags 1.3.2", + "bson", + "chrono", + "derive-where", + "derive_more", + "flate2", + "futures-core", + "futures-executor", + "futures-io", + "futures-util", + "hex", + "hickory-proto 0.24.3", + "hickory-resolver 0.24.2", + "hmac", + "macro_magic", + "md-5", + "mongodb-internal-macros", + "once_cell", + "pbkdf2", + "percent-encoding", + "rand 0.8.5", + "rustc_version_runtime", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", + "serde", + "serde_bytes", + "serde_with", + "sha-1", + "sha2", + "snap", + "socket2", + "stringprep", + "strsim", + "take_mut", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tokio-util", + "typed-builder", + "uuid", + "webpki-roots 0.25.4", + "zstd 0.11.2+zstd.1.5.2", +] + +[[package]] +name = "mongodb-internal-macros" +version = "3.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619176c99deef0d50be51ce3193e9efd6a56ab0f4e6a38d5fd614880d148c7ae" +dependencies = [ + "macro_magic", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "nanoid" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[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 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "postgres-protocol" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand 0.9.0", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" +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.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy 0.7.35", +] + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "psl" +version = "2.1.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70295efe3fd3db60e81f452e2eacc407b4e6c2e1ff7f763424ae6e16105cee26" +dependencies = [ + "psl-types", +] + +[[package]] +name = "psl-types" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick_cache" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f8ed0655cbaf18a26966142ad23b95d8ab47221c50c4f73a1db7d0d2d6e3da8" +dependencies = [ + "ahash", + "equivalent", + "hashbrown 0.15.2", + "parking_lot", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rama" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9873ebb37d9d1e396d84ad0821c066f5c56fda2d72124cbdde33193d233f209" +dependencies = [ + "rama-core", + "rama-dns", + "rama-http", + "rama-http-backend", + "rama-http-core", + "rama-net", + "rama-tcp", + "rama-tls", + "rama-ua", + "rama-utils", + "rustversion", +] + +[[package]] +name = "rama-core" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870d2a5a1510eb16662848328373670dc5fa479315c895c280630b9902d9c132" +dependencies = [ + "futures-lite", + "parking_lot", + "rama-error", + "rama-macros", + "rama-utils", + "tokio", + "tokio-graceful", + "tracing", +] + +[[package]] +name = "rama-dns" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "944e2de33b5b5d0ed102beb9955893da2a1e9b4e71b7568eee7e8482408e97ba" +dependencies = [ + "hickory-resolver 0.25.1", + "rama-core", + "rama-net", + "rama-utils", + "serde", + "tokio", +] + +[[package]] +name = "rama-error" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619de7c9954ff02305f9749c62aedf1374cd7716cefc66a0d59dec4544d9179b" + +[[package]] +name = "rama-http" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bf643d8b008a39023ad14b66ad047dd6a92c9ef82c74844753f74be89c216f" +dependencies = [ + "async-compression", + "base64 0.22.1", + "bitflags 2.9.0", + "bytes", + "const_format", + "csv", + "futures-lite", + "http-range-header", + "httpdate", + "iri-string", + "matchit", + "mime", + "mime_guess", + "nanoid", + "percent-encoding", + "pin-project-lite", + "rama-core", + "rama-http-types", + "rama-macros", + "rama-net", + "rama-ua", + "rama-utils", + "regex", + "serde", + "serde_html_form", + "serde_json", + "smol_str", + "tokio", + "tokio-util", + "tracing", + "uuid", +] + +[[package]] +name = "rama-http-backend" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28473f8acf125aef82cb00e2739369f34db1aeb057b3132cf699e69fb9a7318d" +dependencies = [ + "const_format", + "futures", + "h2", + "rama-core", + "rama-http-core", + "rama-http-types", + "rama-net", + "rama-tcp", + "rama-utils", + "tokio", + "tracing", +] + +[[package]] +name = "rama-http-core" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e00de69a60643d473641ee8fa4768316f5c9a8b303eed2888de885068ced1947" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-channel", + "futures-core", + "futures-sink", + "futures-util", + "httparse", + "httpdate", + "indexmap 2.7.0", + "itoa", + "pin-project-lite", + "rama-core", + "rama-http-types", + "rama-utils", + "slab", + "smallvec", + "tokio", + "tokio-test", + "tokio-util", + "tracing", + "want", +] + +[[package]] +name = "rama-http-types" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "908aa9d8a0309438df16db698ec24aeaaabde5b03ea52404704f3b841e4c46e5" +dependencies = [ + "bytes", + "const_format", + "csv", + "futures-core", + "futures-lite", + "headers", + "http", + "http-body", + "http-body-util", + "mime", + "mime_guess", + "pin-project-lite", + "rama-core", + "rama-error", + "rama-macros", + "rama-utils", + "serde", + "serde_html_form", + "serde_json", + "smallvec", + "sync_wrapper", + "tracing", +] + +[[package]] +name = "rama-macros" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ef8f1996c1b7b4c1bb1b42dff1d864a91a597b012c0c1819ae3e98c8ef4d9c0" + +[[package]] +name = "rama-net" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6ee75afa01308a12a6ac4b0844bcea13c6a912615520644cec9c90c540eb30" +dependencies = [ + "base64 0.22.1", + "bytes", + "const_format", + "flume", + "futures-lite", + "headers", + "hex", + "ipnet", + "itertools", + "md5", + "parking_lot", + "pin-project-lite", + "psl", + "rama-core", + "rama-http-types", + "rama-macros", + "rama-utils", + "serde", + "sha2", + "smol_str", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "rama-tcp" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45f9cc81d98da859f768ce0268a8547a08a76b9cb4a4378a7cc670a2a899ca5d" +dependencies = [ + "rama-core", + "rama-dns", + "rama-http-types", + "rama-net", + "rama-utils", + "tokio", + "tracing", +] + +[[package]] +name = "rama-techempower" +version = "0.2.0" +dependencies = [ + "bytes", + "deadpool", + "deadpool-postgres", + "dotenv", + "futures", + "futures-util", + "mimalloc", + "mime", + "mongodb", + "num_cpus", + "quick_cache", + "rama", + "rand 0.9.0", + "serde", + "serde_json", + "serde_path_to_error", + "simd-json", + "sqlx", + "tokio", + "tokio-pg-mapper", + "tokio-pg-mapper-derive", + "tokio-postgres", + "yarte", +] + +[[package]] +name = "rama-tls" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0606fa4d075eeeadf9118c2b847d17ff42b08d2a882a31bf7748524bc609b864" +dependencies = [ + "brotli", + "flate2", + "flume", + "itertools", + "parking_lot", + "pin-project-lite", + "rama-core", + "rama-net", + "rama-utils", + "tokio", + "tracing", +] + +[[package]] +name = "rama-ua" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3aae90d38623252c831e3ca99d64762bd4fdb773c6f22b3f8b305c3a85e37dd" +dependencies = [ + "itertools", + "rama-core", + "rama-http-types", + "rama-net", + "rama-utils", + "rand 0.9.0", + "serde", + "serde_json", + "tracing", +] + +[[package]] +name = "rama-utils" +version = "0.2.0-alpha.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5a10484221deae52ae76b83982dfb52f8db21514a0a033b48f0599740cfd76" +dependencies = [ + "parking_lot", + "pin-project-lite", + "rama-macros", + "serde", + "tokio", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.24", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustc_version_runtime" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" +dependencies = [ + "rustc_version", + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + +[[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 = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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 = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "serde_html_form" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" +dependencies = [ + "form_urlencoded", + "indexmap 2.7.0", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "indexmap 2.7.0", + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +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 0.6.4", +] + +[[package]] +name = "simd-json" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b5602e4f1f7d358956f94cac1eff59220f34cf9e26d49f5fde5acef851cbed" +dependencies = [ + "getrandom 0.3.2", + "halfbrown", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "smol_str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9676b89cd56310a87b93dec47b11af744f34d5fc9f367b829474eec0a891350d" +dependencies = [ + "borsh", + "serde", +] + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[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 = "sqlx" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +dependencies = [ + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.2", + "hashlink", + "indexmap 2.7.0", + "log", + "memchr", + "once_cell", + "percent-encoding", + "rustls 0.23.20", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tracing", + "url", + "webpki-roots 0.26.7", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.91", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.91", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.9.0", + "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", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.12", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.9.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.12", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "take_mut" +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.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-graceful" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45740b38b48641855471cd402922e89156bdfbd97b69b45eeff170369cc18c7d" +dependencies = [ + "loom", + "pin-project-lite", + "slab", + "tokio", + "tracing", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "tokio-pg-mapper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f2b78f3566383ffabc553c72bbb2f129962a54886c5c4d8e8c706f84eceab8" +dependencies = [ + "tokio-postgres", +] + +[[package]] +name = "tokio-pg-mapper-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8548f756cd6eb4069c5af0fb0cec57001fb42bd1fb7330d8f24067ee3fa62608" +dependencies = [ + "quote", + "syn 1.0.109", + "tokio-postgres", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.9.0", + "socket2", + "tokio", + "tokio-util", + "whoami", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-test" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" +dependencies = [ + "async-stream", + "bytes", + "futures-core", + "tokio", + "tokio-stream", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typed-builder" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.2", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "v_eval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" +dependencies = [ + "regex", + "syn 1.0.109", +] + +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-trait" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0508fce11ad19e0aab49ce20b6bec7f8f82902ded31df1c9fc61b90f0eb396b8" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.91", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[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" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[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.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[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 = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "yarte" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfce1df93f3b16e5272221a559e60bbbaaa71dbc042a43996d223e51a690aab2" +dependencies = [ + "yarte_derive", + "yarte_helpers", +] + +[[package]] +name = "yarte_codegen" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a79312078b97a195de91a8c1457c2e0d7abd97e6e605f3cdeb01b3c105d2cff" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_helpers", + "yarte_hir", +] + +[[package]] +name = "yarte_derive" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_codegen", + "yarte_helpers", + "yarte_hir", + "yarte_parser", +] + +[[package]] +name = "yarte_helpers" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" +dependencies = [ + "dtoa", + "itoa", + "prettyplease", + "serde", + "syn 1.0.109", + "toml", + "v_htmlescape", +] + +[[package]] +name = "yarte_hir" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee42d2f704a3b1d8bc111d47a705d1302a0943d85e4c230f4e8300ee0dde4a6" +dependencies = [ + "derive_more", + "proc-macro2", + "quote", + "syn 1.0.109", + "v_eval", + "v_htmlescape", + "yarte_helpers", + "yarte_parser", +] + +[[package]] +name = "yarte_parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538f72049cf7104e12d5c444048d112cb8fc788a31308afd912442a381ba860c" +dependencies = [ + "annotate-snippets", + "derive_more", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "unicode-xid", + "yarte_helpers", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe 7.2.1", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-safe" +version = "7.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/frameworks/Rust/rama/Cargo.toml b/frameworks/Rust/rama/Cargo.toml new file mode 100644 index 00000000000..342eb6ac85a --- /dev/null +++ b/frameworks/Rust/rama/Cargo.toml @@ -0,0 +1,76 @@ +[package] +name = "rama-techempower" +version = "0.2.0" +authors = ["Glen Henri J. De Cauwsemaecker "] +edition = "2024" + +[[bin]] +name = "rama" +path = "src/main.rs" + +[[bin]] +name = "rama-sqlx" +path = "src/main_sqlx.rs" + +[[bin]] +name = "rama-pg-pool" +path = "src/main_pg_pool.rs" + +[[bin]] +name = "rama-mongo" +path = "src/main_mongo.rs" + +[[bin]] +name = "rama-mongo-raw" +path = "src/main_mongo_raw.rs" + +[[bin]] +name = "rama-pg" +path = "src/main_pg.rs" + +[features] +default = [] +simd-json = ["dep:simd-json", "dep:mime", "dep:serde_path_to_error"] + +[dependencies] +rama = { version = "0.2.0-alpha.11", default-features = false, features = [ + "http-full", +] } +deadpool = { version = "0.12", features = ["rt_tokio_1", "serde", "managed"] } +deadpool-postgres = { version = "0.14", features = ["rt_tokio_1", "serde"] } +dotenv = "0.15" +futures = "0.3" +futures-util = "0.3" +mongodb = { version = "3.2", features = [ + "zstd-compression", + "snappy-compression", + "zlib-compression", +] } +num_cpus = "1.16" +rand = { version = "0.9", features = ["small_rng"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sqlx = { version = "0.8", features = [ + "postgres", + "macros", + "runtime-tokio", + "tls-rustls", +] } +tokio = { version = "1.44", features = ["full"] } +tokio-pg-mapper = { version = "0.2" } +tokio-pg-mapper-derive = { version = "0.2" } +tokio-postgres = { version = "0.7" } +yarte = "0.15" +simd-json = { version = "0.15", optional = true } +mime = { version = "0.3", optional = true } +bytes = { version = "1.10" } +serde_path_to_error = { version = "0.1", optional = true } +quick_cache = "0.6" +mimalloc = "0.1" + + +[profile.release] +lto = "fat" +codegen-units = 1 +strip = true +opt-level = 3 diff --git a/frameworks/Rust/rama/README.md b/frameworks/Rust/rama/README.md new file mode 100755 index 00000000000..a3a50725739 --- /dev/null +++ b/frameworks/Rust/rama/README.md @@ -0,0 +1,43 @@ +# [Rama](https://github.com/plabayo/rama) + +## Description + +Rama (ラマ) is a modular service framework for the Rust language +to move and transform your network packets. + +- [User Guide](https://ramaproxy.org/book/preface.html) +- [API Documentation](https://docs.rs/rama/latest/rama/) +- [Cargo Package (`rama`)](https://crates.io/crates/rama) + +## Variants + +- PostgreSQL using `SQLx`, `tokio_postgres`, and `deadpool`. +- MongoDB with `mongodb`. + +## Test URLs + +- Plaintext: http://localhost:8000/plaintext +- JSON Encoding: http://localhost:8000/json +- Single Row Query: http://localhost:8000/db +- Multi Row Query: http://localhost:8000/queries?q=20 +- Fortunes: http://localhost:8000/fortunes +- Update Query: http://localhost:8000/updates?q=20 +- Cached Query: http://localhost:8000/cached-queries?q=20 + +## Notable Points (both performance and build) + +- Use of `async`. +- Use of the most recent versions of Rust, `rama` and dependencies. +- (Disabled by default) Compile-time swap-in of `simd-json` instead of `serde_json` for faster JSON serialization. +- Release binaries are stripped and compiled with CPU native. +- Sockets configured with `TCP_NODELAY` and to support an increased number of pending connections. +- For very simple benchmarks, use of a separate, single-threaded Tokio runtime for each thread. +- Server configured to serve HTTP/1 only, with no need for websockets. +- Separation of build and deployment containers using multi-stage builds. +- Deployment into Google's minimal `distroless-cc` container. +- Use of pipelined database queries (where supported). +- Streaming database queries (where supported). +- Use of PostgreSQL prepared statements cache (where supported). +- Use of PostgreSQL arrays to execute multi-row database updates with a single `UPDATE` query. + - This is permitted by the [test requirements](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates), step (ix). +- Use of a fast PRNG diff --git a/frameworks/Rust/rama/benchmark_config.json b/frameworks/Rust/rama/benchmark_config.json new file mode 100755 index 00000000000..8b196c76997 --- /dev/null +++ b/frameworks/Rust/rama/benchmark_config.json @@ -0,0 +1,141 @@ +{ + "framework": "rama", + "tests": [ + { + "default": { + "dockerfile": "rama.dockerfile", + "docker_cmd": "/app/rama", + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8000, + "approach": "Realistic", + "classification": "Platform", + "database": "none", + "framework": "Rama", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Rama", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rama", + "notes": "", + "versus": "None" + }, + "sqlx": { + "dockerfile": "rama.dockerfile", + "docker_cmd": "/app/rama-sqlx", + "db_url": "/db", + "fortune_url": "/fortunes", + "cached_query_url": "/cached-queries?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "Rama", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Rama", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rama [Postgresql - sqlx]", + "notes": "", + "versus": "None" + }, + "pg": { + "dockerfile": "rama.dockerfile", + "docker_cmd": "/app/rama-pg", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "Rama", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Rama", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rama [Postgresql]", + "notes": "", + "versus": "None" + }, + "pg-pool": { + "dockerfile": "rama.dockerfile", + "docker_cmd": "/app/rama-pg-pool", + "db_url": "/db", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "fortune_url": "/fortunes", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "Rama", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Rama", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rama [Postgresql - deadpool]", + "notes": "", + "versus": "None" + }, + "mongo": { + "dockerfile": "rama.dockerfile", + "docker_cmd": "/app/rama-mongo", + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "update_url": "/updates?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "mongodb", + "framework": "Rama", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Rama", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rama [Mongodb]", + "notes": "", + "versus": "None" + }, + "mongo-raw": { + "dockerfile": "rama.dockerfile", + "docker_cmd": "/app/rama-mongo-raw", + "db_url": "/db", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "mongodb", + "framework": "Rama", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Rama", + "os": "Linux", + "database_os": "Linux", + "display_name": "Rama [Mongodb raw]", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Rust/rama/config.toml b/frameworks/Rust/rama/config.toml new file mode 100644 index 00000000000..8216c65bea2 --- /dev/null +++ b/frameworks/Rust/rama/config.toml @@ -0,0 +1,20 @@ +[framework] +name = "rama" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?q=" +urls.update = "/updates?q=" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-queries?q=" +approach = "Realistic" +classification = "Fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Rust" +webserver = "Rama" +versus = "None" diff --git a/frameworks/Rust/rama/rama.dockerfile b/frameworks/Rust/rama/rama.dockerfile new file mode 100644 index 00000000000..c61848fb9fb --- /dev/null +++ b/frameworks/Rust/rama/rama.dockerfile @@ -0,0 +1,24 @@ +FROM docker.io/rust:1.86-slim-bookworm AS builder + +RUN apt-get update && apt-get install -y --no-install-recommends \ + pkg-config libssl-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /build +COPY ./Cargo.toml ./Cargo.lock /build/ +RUN cargo fetch +COPY ./templates/ /build/templates +COPY ./src/ /build/src +ENV RUSTFLAGS "-C target-cpu=native" +RUN cargo build --release + +FROM gcr.io/distroless/cc-debian12 +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world +ENV POSTGRES_MIN_POOL_SIZE=56 +ENV POSTGRES_MAX_POOL_SIZE=56 +ENV MONGODB_URL=mongodb://tfb-database:27017 +ENV MONGODB_MIN_POOL_SIZE=28 +ENV MONGODB_MAX_POOL_SIZE=28 +COPY --from=builder /build/target/release/rama* /app/ +EXPOSE 8000 +CMD ["/app/rama"] diff --git a/frameworks/Rust/rama/run.sh b/frameworks/Rust/rama/run.sh new file mode 100644 index 00000000000..9d90dcd73be --- /dev/null +++ b/frameworks/Rust/rama/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +./target/release/rama-techempower diff --git a/frameworks/Rust/rama/rustfmt.toml b/frameworks/Rust/rama/rustfmt.toml new file mode 100644 index 00000000000..94bd11d51d7 --- /dev/null +++ b/frameworks/Rust/rama/rustfmt.toml @@ -0,0 +1,2 @@ +max_width = 89 +reorder_imports = true diff --git a/frameworks/Rust/rama/src/common/mod.rs b/frameworks/Rust/rama/src/common/mod.rs new file mode 100644 index 00000000000..f3488fbab9b --- /dev/null +++ b/frameworks/Rust/rama/src/common/mod.rs @@ -0,0 +1,49 @@ +use std::{env, str::FromStr}; + +use core::fmt::Debug; +use rand::{distr::Uniform, rngs::SmallRng, Rng, RngCore}; +pub mod models; +pub mod utils; + +#[cfg(feature = "simd-json")] +pub mod simd_json; + +#[allow(dead_code)] +pub const SELECT_ALL_FORTUNES: &str = "SELECT * FROM fortune"; +#[allow(dead_code)] +pub const SELECT_WORLD_BY_ID: &str = + "SELECT id, randomnumber FROM world WHERE id = $1 LIMIT 1"; +#[allow(dead_code)] +pub const SELECT_ALL_CACHED_WORLDS: &str = + "SELECT id, randomnumber FROM world ORDER BY id"; +#[allow(dead_code)] +pub const UPDATE_WORLDS: &str = r#"UPDATE world SET randomnumber = new.rnum FROM + (SELECT * FROM UNNEST($1::int[], $2::int[]) AS v(id, rnum) ORDER BY 1) AS new +WHERE world.id = new.id"#; + +/// Return the value of an environment variable. +#[allow(dead_code)] +pub fn get_env(key: &str) -> T +where + ::Err: Debug, +{ + env::var(key) + .unwrap_or_else(|_| panic!("{key} environment variable was not set")) + .parse::() + .unwrap_or_else(|_| panic!("could not parse {key}")) +} + +/// Generate a single integer in the range 1 to 10,000 (inclusive) +#[allow(dead_code)] +#[inline(always)] +pub fn random_id(rng: &mut impl RngCore) -> i32 { + rng.random_range(1..=10_000) +} + +/// Generate an iterator of integers in the range 1 to 10,000 (inclusive) +#[allow(dead_code)] +#[inline(always)] +pub fn random_ids(rng: &mut SmallRng, count: usize) -> impl Iterator + use<'_> { + rng.sample_iter(Uniform::new_inclusive(1, 10_000).unwrap()) + .take(count) +} \ No newline at end of file diff --git a/frameworks/Rust/rama/src/common/models.rs b/frameworks/Rust/rama/src/common/models.rs new file mode 100644 index 00000000000..1644447c3cd --- /dev/null +++ b/frameworks/Rust/rama/src/common/models.rs @@ -0,0 +1,25 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize)] +pub struct Message { + pub message: &'static str, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct Fortune { + pub id: i32, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct FortuneInfo { + pub id: i32, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct World { + pub id: i32, + #[serde(rename = "randomNumber")] + pub random_number: i32, +} diff --git a/frameworks/Rust/rama/src/common/simd_json.rs b/frameworks/Rust/rama/src/common/simd_json.rs new file mode 100644 index 00000000000..1edc869aa1e --- /dev/null +++ b/frameworks/Rust/rama/src/common/simd_json.rs @@ -0,0 +1,150 @@ +#![allow(dead_code)] + +use bytes::{BufMut, BytesMut}; +use rama::http::{ + HeaderMap, HeaderValue, IntoResponse, Request, Response, StatusCode, header, + service::web::extract::{ + Bytes, FromRequest, + body::{BytesRejection, InvalidJsonContentType, JsonRejection}, + }, +}; +use serde::{Serialize, de::DeserializeOwned}; +use simd_json; + +#[derive(Debug, Clone, Copy, Default)] +pub struct Json(pub T); + +pub enum SimdJsonRejection { + Json(JsonRejection), + Bytes(BytesRejection), + Simd(String), +} + +impl IntoResponse for SimdJsonRejection { + fn into_response(self) -> Response { + todo!() + } +} + +impl From for SimdJsonRejection { + fn from(err: JsonRejection) -> Self { + SimdJsonRejection::Json(err) + } +} + +impl From for SimdJsonRejection { + fn from(err: BytesRejection) -> Self { + SimdJsonRejection::Bytes(err) + } +} + +impl From for SimdJsonRejection { + fn from(err: simd_json::Error) -> Self { + SimdJsonRejection::Simd(err.to_string()) + } +} + +impl FromRequest for Json +where + T: DeserializeOwned + Send + Sync + 'static, +{ + type Rejection = SimdJsonRejection; + + async fn from_request(req: Request) -> Result { + if json_content_type(req.headers()) { + let bytes = Bytes::from_request(req).await?; + Self::from_bytes(&bytes) + } else { + Err(SimdJsonRejection::Json( + InvalidJsonContentType::default().into(), + )) + } + } +} + +fn json_content_type(headers: &HeaderMap) -> bool { + let content_type = if let Some(content_type) = headers.get(header::CONTENT_TYPE) { + content_type + } else { + return false; + }; + + let content_type = if let Ok(content_type) = content_type.to_str() { + content_type + } else { + return false; + }; + + let mime = if let Ok(mime) = content_type.parse::() { + mime + } else { + return false; + }; + + let is_json_content_type = mime.type_() == "application" + && (mime.subtype() == "json" + || mime.suffix().map_or(false, |name| name == "json")); + + is_json_content_type +} + +rama::utils::macros::impl_deref!(Json); + +impl From for Json { + fn from(inner: T) -> Self { + Self(inner) + } +} + +impl Json +where + T: DeserializeOwned, +{ + /// Construct a `Json` from a byte slice. Most users should prefer to use the `FromRequest` impl + /// but special cases may require first extracting a `Request` into `Bytes` then optionally + /// constructing a `Json`. + pub fn from_bytes(bytes: &[u8]) -> Result { + let body = &mut bytes.to_owned(); + let deserializer = simd_json::from_slice::(body); + + let value = match deserializer { + Ok(v) => v, + Err(err) => { + let rejection = { SimdJsonRejection::from(err) }; + return Err(rejection); + } + }; + + Ok(Json(value)) + } +} + +impl IntoResponse for Json +where + T: Serialize, +{ + fn into_response(self) -> Response { + // Use a small initial capacity of 128 bytes like serde_json::to_vec + // https://docs.rs/serde_json/1.0.82/src/serde_json/ser.rs.html#2189 + let mut buf = BytesMut::with_capacity(128).writer(); + match simd_json::to_writer(&mut buf, &self.0) { + Ok(()) => ( + [( + header::CONTENT_TYPE, + HeaderValue::from_static(mime::APPLICATION_JSON.as_ref()), + )], + buf.into_inner().freeze(), + ) + .into_response(), + Err(err) => ( + StatusCode::INTERNAL_SERVER_ERROR, + [( + header::CONTENT_TYPE, + HeaderValue::from_static(mime::TEXT_PLAIN_UTF_8.as_ref()), + )], + err.to_string(), + ) + .into_response(), + } + } +} diff --git a/frameworks/Rust/rama/src/common/utils.rs b/frameworks/Rust/rama/src/common/utils.rs new file mode 100644 index 00000000000..17c333d210b --- /dev/null +++ b/frameworks/Rust/rama/src/common/utils.rs @@ -0,0 +1,51 @@ +use bytes::Bytes; +use rama::http::{HeaderValue, IntoResponse, Response, StatusCode, header}; +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +pub struct Params { + q: Option, +} + +#[allow(dead_code)] +#[inline(always)] +pub fn parse_params(params: Params) -> usize { + params + .q + .and_then(|q| q.parse().ok()) + .unwrap_or(1) + .clamp(1, 500) +} + +/// Utility function for mapping any error into a `500 Internal Server Error` +/// response. +#[allow(dead_code)] +pub fn internal_error(err: E) -> (StatusCode, String) +where + E: std::error::Error, +{ + (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()) +} + +#[derive(Clone, Copy, Debug)] +pub struct Utf8Html(pub T); + +impl IntoResponse for Utf8Html +where + T: Into, +{ + fn into_response(self) -> Response { + let mut res = (StatusCode::OK, self.0.into()).into_response(); + res.headers_mut().insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=utf-8"), + ); + res + } +} + +impl From for Utf8Html { + fn from(inner: T) -> Self { + Self(inner) + } +} diff --git a/frameworks/Rust/rama/src/main.rs b/frameworks/Rust/rama/src/main.rs new file mode 100644 index 00000000000..7114b892a93 --- /dev/null +++ b/frameworks/Rust/rama/src/main.rs @@ -0,0 +1,44 @@ +mod common; +mod server; + +use common::models::Message; +use dotenv::dotenv; +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +#[cfg(feature = "simd-json")] +use common::simd_json::Json; +#[cfg(not(feature = "simd-json"))] +use rama::http::response::Json; +use rama::http::{IntoResponse, StatusCode, service::web::Router}; + +/// Return a plaintext static string. +#[inline(always)] +pub async fn plaintext() -> &'static str { + "Hello, World!" +} + +/// Return a JSON message. +#[inline(always)] +pub async fn json() -> impl IntoResponse { + let message = Message { + message: "Hello, World!", + }; + + (StatusCode::OK, Json(message)) +} + +fn main() { + dotenv().ok(); + server::start_tokio(serve_app) +} + +async fn serve_app() { + let app = Router::new() + .get("/plaintext", plaintext) + .get("/json", json); + + server::serve((), app, Some(8000)).await; +} diff --git a/frameworks/Rust/rama/src/main_mongo.rs b/frameworks/Rust/rama/src/main_mongo.rs new file mode 100644 index 00000000000..3323c68a64c --- /dev/null +++ b/frameworks/Rust/rama/src/main_mongo.rs @@ -0,0 +1,151 @@ +mod common; +mod mongo; +mod server; + +use std::time::Duration; + +#[cfg(feature = "simd-json")] +use common::simd_json::Json; +use common::{ + models::{FortuneInfo, World}, + random_id, +}; +use dotenv::dotenv; +use mimalloc::MiMalloc; +use mongodb::{ + Client, + options::{ClientOptions, Compressor}, +}; +#[cfg(not(feature = "simd-json"))] +use rama::http::response::Json; +use rama::http::{ + IntoResponse, StatusCode, + service::web::{Router, extract::Query}, +}; +use rand::{SeedableRng, rng, rngs::SmallRng}; +use yarte::Template; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +use common::{ + get_env, + utils::{Params, Utf8Html, parse_params}, +}; +use mongo::database::{ + DatabaseConnection, fetch_fortunes, find_world_by_id, find_worlds, update_worlds, +}; + +#[derive(Template)] +#[template(path = "fortunes.html.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + +async fn db(DatabaseConnection(db): DatabaseConnection) -> impl IntoResponse { + let random_id = random_id(&mut rng()); + + let world = find_world_by_id(db, random_id) + .await + .expect("world could not be found"); + + (StatusCode::OK, Json(world)) +} + +async fn queries( + DatabaseConnection(db): DatabaseConnection, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + + let mut rng = SmallRng::from_rng(&mut rng()); + let worlds = find_worlds(db, &mut rng, q).await; + let results = worlds.expect("worlds could not be retrieved"); + + (StatusCode::OK, Json(results)) +} + +async fn updates( + DatabaseConnection(db): DatabaseConnection, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + + let mut rng = SmallRng::from_rng(&mut rng()); + + let worlds = find_worlds(db.clone(), &mut rng, q) + .await + .expect("worlds could not be retrieved"); + let mut updated_worlds: Vec = Vec::with_capacity(q); + + for mut world in worlds { + world.random_number = random_id(&mut rng); + updated_worlds.push(world); + } + + update_worlds(db.clone(), updated_worlds.clone()) + .await + .expect("could not update worlds"); + + (StatusCode::OK, Json(updated_worlds.clone())) +} + +async fn fortunes(DatabaseConnection(db): DatabaseConnection) -> impl IntoResponse { + let fortunes = fetch_fortunes(db).await.expect("could not fetch fortunes"); + + let fortune_infos: Vec = fortunes + .iter() + .map(|f| FortuneInfo { + id: f.id, + message: f.message.clone(), + }) + .collect(); + + Utf8Html( + FortunesTemplate { + fortunes: &fortune_infos, + } + .call() + .expect("error rendering template"), + ) +} + +fn main() { + dotenv().ok(); + server::start_tokio(serve_app) +} + +async fn serve_app() { + let database_url: String = get_env("MONGODB_URL"); + let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE"); + let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE"); + + let mut client_options = ClientOptions::parse(database_url).await.unwrap(); + + // setup connection pool + client_options.max_pool_size = Some(max_pool_size); + client_options.min_pool_size = Some(min_pool_size); + client_options.connect_timeout = Some(Duration::from_millis(200)); + + // the server will select the algorithm it supports from the list provided by the driver + client_options.compressors = Some(vec![ + Compressor::Snappy, + Compressor::Zlib { + level: Default::default(), + }, + Compressor::Zstd { + level: Default::default(), + }, + ]); + + let client = Client::with_options(client_options).unwrap(); + let database = client.database("hello_world"); + + let app = Router::new() + .get("/fortunes", fortunes) + .get("/db", db) + .get("/queries", queries) + .get("/updates", updates); + + server::serve(database, app, Some(8000)).await; +} diff --git a/frameworks/Rust/rama/src/main_mongo_raw.rs b/frameworks/Rust/rama/src/main_mongo_raw.rs new file mode 100644 index 00000000000..da7fa5f99d3 --- /dev/null +++ b/frameworks/Rust/rama/src/main_mongo_raw.rs @@ -0,0 +1,122 @@ +mod common; +mod mongo_raw; +mod server; + +use common::{models::World, random_id}; +use mongo_raw::database::{ + DatabaseConnection, find_world_by_id, find_worlds, update_worlds, +}; + +use common::{ + get_env, + utils::{Params, parse_params}, +}; +use rama::http::{ + IntoResponse, StatusCode, + service::web::{Router, extract::Query}, +}; +use std::time::Duration; + +use mimalloc::MiMalloc; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +#[cfg(feature = "simd-json")] +use common::simd_json::Json; +#[cfg(not(feature = "simd-json"))] +use rama::http::response::Json; + +use dotenv::dotenv; +use mongodb::{ + Client, + options::{ClientOptions, Compressor}, +}; +use rand::{SeedableRng, rng, rngs::SmallRng}; + +async fn db(DatabaseConnection(db): DatabaseConnection) -> impl IntoResponse { + let random_id = random_id(&mut rng()); + + let world = find_world_by_id(db, random_id) + .await + .expect("world could not be found"); + + (StatusCode::OK, Json(world)) +} + +async fn queries( + DatabaseConnection(db): DatabaseConnection, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + + let mut rng = SmallRng::from_rng(&mut rng()); + let worlds = find_worlds(db, &mut rng, q).await; + let results = worlds.expect("worlds could not be retrieved"); + + (StatusCode::OK, Json(results)) +} + +async fn updates( + DatabaseConnection(db): DatabaseConnection, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + + let mut rng = SmallRng::from_rng(&mut rng()); + + let worlds = find_worlds(db.clone(), &mut rng, q) + .await + .expect("worlds could not be retrieved"); + let mut updated_worlds: Vec = Vec::with_capacity(q); + + for mut world in worlds { + world.random_number = random_id(&mut rng); + updated_worlds.push(world); + } + + update_worlds(db.clone(), updated_worlds.clone()) + .await + .expect("could not update worlds"); + + (StatusCode::OK, Json(updated_worlds.clone())) +} + +fn main() { + dotenv().ok(); + server::start_tokio(serve_app) +} + +async fn serve_app() { + let database_url: String = get_env("MONGODB_URL"); + let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE"); + let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE"); + + let mut client_options = ClientOptions::parse(database_url).await.unwrap(); + + // setup connection pool + client_options.max_pool_size = Some(max_pool_size); + client_options.min_pool_size = Some(min_pool_size); + client_options.connect_timeout = Some(Duration::from_millis(200)); + + // the server will select the algorithm it supports from the list provided by the driver + client_options.compressors = Some(vec![ + Compressor::Snappy, + Compressor::Zlib { + level: Default::default(), + }, + Compressor::Zstd { + level: Default::default(), + }, + ]); + + let client = Client::with_options(client_options).unwrap(); + let database = client.database("hello_world"); + + let app = Router::new() + .get("/db", db) + .get("/queries", queries) + .get("/updates", updates); + + server::serve(database, app, Some(8000)).await; +} diff --git a/frameworks/Rust/rama/src/main_pg.rs b/frameworks/Rust/rama/src/main_pg.rs new file mode 100644 index 00000000000..79c7ecdf9bc --- /dev/null +++ b/frameworks/Rust/rama/src/main_pg.rs @@ -0,0 +1,103 @@ +mod common; +mod pg; + +use dotenv::dotenv; +use mimalloc::MiMalloc; +use rama::http::{ + IntoResponse, StatusCode, + service::web::{Router, extract::Query}, +}; +use rand::rng; +use yarte::Template; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +#[cfg(feature = "simd-json")] +use common::simd_json::Json; +#[cfg(not(feature = "simd-json"))] +use rama::http::response::Json; + +mod server; + +use common::{ + get_env, random_id, + utils::{Params, Utf8Html, parse_params}, +}; +use pg::database::{DatabaseConnection, PgConnection}; +use pg::models::Fortune; + +#[derive(Template)] +#[template(path = "fortunes.html.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + +async fn db(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResponse { + let id = random_id(&mut rng()); + let world = conn + .fetch_world_by_id(id) + .await + .expect("error loading world"); + + (StatusCode::OK, Json(world)) +} + +async fn queries( + DatabaseConnection(conn): DatabaseConnection, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + + let results = conn + .fetch_random_worlds(q) + .await + .expect("error loading worlds"); + + (StatusCode::OK, Json(results)) +} + +async fn fortunes(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResponse { + let fortunes: Vec = conn + .fetch_all_fortunes() + .await + .expect("error loading fortunes"); + + Utf8Html( + FortunesTemplate { + fortunes: &fortunes, + } + .call() + .expect("error rendering template"), + ) +} + +async fn updates( + DatabaseConnection(conn): DatabaseConnection, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + let worlds = conn.update_worlds(q).await.expect("error updating worlds"); + + (StatusCode::OK, Json(worlds)) +} + +fn main() { + dotenv().ok(); + server::start_tokio(serve_app) +} + +async fn serve_app() { + let database_url: String = get_env("POSTGRES_URL"); + + // Create shared database connection + let pg_connection = PgConnection::connect(database_url).await; + + let app = Router::new() + .get("/fortunes", fortunes) + .get("/db", db) + .get("/queries", queries) + .get("/updates", updates); + + server::serve(pg_connection, app, Some(8000)).await; +} diff --git a/frameworks/Rust/rama/src/main_pg_pool.rs b/frameworks/Rust/rama/src/main_pg_pool.rs new file mode 100644 index 00000000000..907ca1cd792 --- /dev/null +++ b/frameworks/Rust/rama/src/main_pg_pool.rs @@ -0,0 +1,145 @@ +mod common; +mod pg_pool; + +#[cfg(feature = "simd-json")] +use common::simd_json::Json; +#[cfg(not(feature = "simd-json"))] +use rama::http::response::Json; + +use common::{SELECT_ALL_FORTUNES, SELECT_WORLD_BY_ID, UPDATE_WORLDS, random_ids}; +use dotenv::dotenv; +use futures_util::{TryStreamExt, stream::FuturesUnordered}; +use mimalloc::MiMalloc; +use rama::http::{ + IntoResponse, StatusCode, + service::web::{Router, extract::Query}, +}; +use rand::{SeedableRng, rng, rngs::SmallRng}; +use yarte::Template; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +mod server; + +use common::{ + get_env, random_id, + utils::{Params, Utf8Html, parse_params}, +}; +use pg_pool::database::{ + DatabaseClient, PgError, create_pool, fetch_all_fortunes, fetch_world_by_id, +}; +use pg_pool::models::{Fortune, World}; + +#[derive(Template)] +#[template(path = "fortunes.html.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + +async fn db(DatabaseClient(client): DatabaseClient) -> impl IntoResponse { + let random_id = random_id(&mut rng()); + + let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + let world = fetch_world_by_id(&client, random_id, select) + .await + .expect("could not fetch world"); + + (StatusCode::OK, Json(world)) +} + +async fn queries( + DatabaseClient(client): DatabaseClient, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + + let mut rng = SmallRng::from_rng(&mut rng()); + let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + let future_worlds = FuturesUnordered::new(); + + for id in random_ids(&mut rng, q) { + future_worlds.push(fetch_world_by_id(&client, id, select)); + } + + let worlds: Result, PgError> = future_worlds.try_collect().await; + let results = worlds.expect("worlds could not be retrieved"); + + (StatusCode::OK, Json(results)) +} + +async fn fortunes(DatabaseClient(client): DatabaseClient) -> impl IntoResponse { + let select = &client.prepare_cached(SELECT_ALL_FORTUNES).await.unwrap(); + + let mut fortunes = fetch_all_fortunes(client, select) + .await + .expect("could not fetch fortunes"); + + fortunes.push(Fortune { + id: 0, + message: "Additional fortune added at request time.".to_string(), + }); + + fortunes.sort_by(|a, b| a.message.cmp(&b.message)); + + Utf8Html( + FortunesTemplate { + fortunes: &fortunes, + } + .call() + .expect("error rendering template"), + ) +} + +async fn updates( + DatabaseClient(client): DatabaseClient, + Query(params): Query, +) -> impl IntoResponse { + let q = parse_params(params); + + let mut rng = SmallRng::from_rng(&mut rng()); + let select = &client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + let update = &client.prepare_cached(UPDATE_WORLDS).await.unwrap(); + + // Select the random worlds. + let future_worlds = FuturesUnordered::new(); + for id in random_ids(&mut rng, q) { + future_worlds.push(fetch_world_by_id(&client, id, select)); + } + let worlds: Vec = future_worlds.try_collect().await.unwrap(); + + let mut ids = Vec::with_capacity(q); + let mut nids = Vec::with_capacity(q); + let worlds: Vec = worlds + .into_iter() + .map(|mut w| { + w.randomnumber = random_id(&mut rng); + ids.push(w.id); + nids.push(w.randomnumber); + w + }) + .collect(); + + // Update the random worlds in the database. + client.execute(update, &[&ids, &nids]).await.unwrap(); + + (StatusCode::OK, Json(worlds)) +} + +#[tokio::main] +async fn main() { + dotenv().ok(); + + let database_url: String = get_env("POSTGRES_URL"); + let max_pool_size: u32 = get_env("POSTGRES_MAX_POOL_SIZE"); + + let pool = create_pool(database_url, max_pool_size).await; + + let app = Router::new() + .get("/fortunes", fortunes) + .get("/db", db) + .get("/queries", queries) + .get("/updates", updates); + + server::serve(pool, app, Some(8000)).await; +} diff --git a/frameworks/Rust/rama/src/main_sqlx.rs b/frameworks/Rust/rama/src/main_sqlx.rs new file mode 100644 index 00000000000..a5365c34018 --- /dev/null +++ b/frameworks/Rust/rama/src/main_sqlx.rs @@ -0,0 +1,160 @@ +mod common; +mod sqlx; + +use std::sync::Arc; + +use ::sqlx::PgPool; +use dotenv::dotenv; +use mimalloc::MiMalloc; +use quick_cache::sync::Cache; +use rama::{ + Context, + http::{ + IntoResponse, StatusCode, + service::web::{Router, extract::Query}, + }, +}; +use rand::{SeedableRng, rng, rngs::SmallRng}; +use sqlx::models::World; +use yarte::Template; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +#[cfg(not(feature = "simd-json"))] +use rama::http::response::Json; +#[cfg(feature = "simd-json")] +use rama::http::response::Json; + +mod server; + +use common::{ + get_env, random_id, random_ids, + utils::{Params, Utf8Html, parse_params}, +}; +use sqlx::database::create_pool; +use sqlx::models::Fortune; + +#[derive(Template)] +#[template(path = "fortunes.html.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + +async fn db(ctx: Context) -> impl IntoResponse { + let db = ctx.state().db.clone(); + + let id = random_id(&mut rng()); + let world: World = ::sqlx::query_as(common::SELECT_WORLD_BY_ID) + .bind(id) + .fetch_one(&mut *db.acquire().await.unwrap()) + .await + .expect("error loading world"); + + (StatusCode::OK, Json(world)) +} + +async fn queries( + Query(params): Query, + ctx: Context, +) -> impl IntoResponse { + let db = ctx.state().db.clone(); + + let mut rng = SmallRng::from_rng(&mut rng()); + let count = parse_params(params); + let mut worlds: Vec = Vec::with_capacity(count); + + for id in random_ids(&mut rng, count) { + let world: World = ::sqlx::query_as(common::SELECT_WORLD_BY_ID) + .bind(id) + .fetch_one(&mut *db.acquire().await.unwrap()) + .await + .expect("error loading world"); + worlds.push(world); + } + + (StatusCode::OK, Json(worlds)) +} + +async fn fortunes(ctx: Context) -> impl IntoResponse { + let db = ctx.state().db.clone(); + + let mut fortunes: Vec = ::sqlx::query_as(common::SELECT_ALL_FORTUNES) + .fetch_all(&mut *db.acquire().await.unwrap()) + .await + .expect("error loading Fortunes"); + + fortunes.push(Fortune { + id: 0, + message: "Additional fortune added at request time.".to_string(), + }); + + fortunes.sort_by(|a, b| a.message.cmp(&b.message)); + + Utf8Html( + FortunesTemplate { + fortunes: &fortunes, + } + .call() + .expect("error rendering template"), + ) +} + +async fn cache( + Query(params): Query, + ctx: Context, +) -> impl IntoResponse { + let count = parse_params(params); + let mut rng = SmallRng::from_rng(&mut rng()); + let mut worlds: Vec> = Vec::with_capacity(count); + + for id in random_ids(&mut rng, count) { + worlds.push(ctx.state().cache.get(&id)); + } + + (StatusCode::OK, Json(worlds)) +} + +/// Pre-load the cache with all worlds. +async fn preload_cache(AppState { db, cache }: &AppState) { + let worlds: Vec = ::sqlx::query_as(common::SELECT_ALL_CACHED_WORLDS) + .fetch_all(&mut *db.acquire().await.unwrap()) + .await + .expect("error loading worlds"); + + for world in worlds { + cache.insert(world.id, world); + } +} + +/// Application state +#[derive(Clone)] +struct AppState { + db: PgPool, + cache: Arc>, +} + +#[tokio::main] +async fn main() { + dotenv().ok(); + + let database_url: String = get_env("POSTGRES_URL"); + let max_pool_size: u32 = get_env("POSTGRES_MAX_POOL_SIZE"); + let min_pool_size: u32 = get_env("POSTGRES_MIN_POOL_SIZE"); + + let state = AppState { + db: create_pool(database_url, max_pool_size, min_pool_size).await, + cache: Arc::new(Cache::new(10_000)), + }; + + // Prime the cache with CachedWorld objects + preload_cache(&state).await; + + let app = Router::new() + .get("/fortunes", fortunes) + .get("/db", db) + .get("/queries", queries) + .get("/cached-queries", cache); + + server::serve(state, app, Some(8000)).await; +} diff --git a/frameworks/Rust/rama/src/mongo/database.rs b/frameworks/Rust/rama/src/mongo/database.rs new file mode 100644 index 00000000000..f072046fa95 --- /dev/null +++ b/frameworks/Rust/rama/src/mongo/database.rs @@ -0,0 +1,116 @@ +use std::{convert::Infallible, io}; + +use futures_util::{StreamExt, TryStreamExt, stream::FuturesUnordered}; +use mongodb::{Database, bson::doc}; +use rama::{ + Context, + http::{dep::http::request, service::web::extract::FromRequestContextRefPair}, +}; +use rand::rngs::SmallRng; + +use crate::common::{ + models::{Fortune, World}, + random_ids, +}; + +pub struct DatabaseConnection(pub Database); + +impl FromRequestContextRefPair for DatabaseConnection { + type Rejection = Infallible; + + async fn from_request_context_ref_pair( + ctx: &Context, + _parts: &request::Parts, + ) -> Result { + Ok(Self(ctx.state_clone())) + } +} + +#[derive(Debug)] +#[allow(dead_code)] +pub enum MongoError { + Io(io::Error), + Mongo(mongodb::error::Error), +} + +impl From for MongoError { + fn from(err: io::Error) -> Self { + MongoError::Io(err) + } +} + +impl From for MongoError { + fn from(err: mongodb::error::Error) -> Self { + MongoError::Mongo(err) + } +} + +pub async fn find_world_by_id(db: Database, id: i32) -> Result { + let world_collection = db.collection::("world"); + + let filter = doc! { "_id": id as f32 }; + + let world: World = world_collection + .find_one(filter) + .await + .unwrap() + .expect("expected world, found none"); + Ok(world) +} + +pub async fn find_worlds( + db: Database, + rng: &mut SmallRng, + count: usize, +) -> Result, MongoError> { + let future_worlds = FuturesUnordered::new(); + + for id in random_ids(rng, count) { + future_worlds.push(find_world_by_id(db.clone(), id)); + } + + let worlds: Result, MongoError> = future_worlds.try_collect().await; + worlds +} + +pub async fn fetch_fortunes(db: Database) -> Result, MongoError> { + let fortune_collection = db.collection::("fortune"); + + let mut fortune_cursor = fortune_collection + .find(doc! {}) + .await + .expect("fortunes could not be loaded"); + + let mut fortunes: Vec = Vec::new(); + + while let Some(doc) = fortune_cursor.next().await { + fortunes.push(doc.expect("could not load fortune")); + } + + fortunes.push(Fortune { + id: 0, + message: "Additional fortune added at request time.".to_string(), + }); + + fortunes.sort_by(|a, b| a.message.cmp(&b.message)); + Ok(fortunes) +} + +pub async fn update_worlds( + db: Database, + worlds: Vec, +) -> Result { + let mut updates = Vec::new(); + + for world in worlds { + updates.push(doc! { + "q": { "id": world.id }, "u": { "$set": { "randomNumber": world.random_number }} + }); + } + + db.run_command(doc! {"update": "world", "updates": updates, "ordered": false}) + .await + .expect("could not update worlds"); + + Ok(true) +} diff --git a/frameworks/Rust/rama/src/mongo/mod.rs b/frameworks/Rust/rama/src/mongo/mod.rs new file mode 100644 index 00000000000..8fd0a6be869 --- /dev/null +++ b/frameworks/Rust/rama/src/mongo/mod.rs @@ -0,0 +1 @@ +pub mod database; diff --git a/frameworks/Rust/rama/src/mongo_raw/database.rs b/frameworks/Rust/rama/src/mongo_raw/database.rs new file mode 100644 index 00000000000..60625b063d4 --- /dev/null +++ b/frameworks/Rust/rama/src/mongo_raw/database.rs @@ -0,0 +1,107 @@ +use std::{convert::Infallible, io}; + +use futures_util::{TryStreamExt, stream::FuturesUnordered}; +use mongodb::{ + Database, + bson::{RawDocumentBuf, doc}, +}; +use rama::{ + Context, + http::{dep::http::request, service::web::extract::FromRequestContextRefPair}, +}; +use rand::rngs::SmallRng; + +use crate::common::{models::World, random_ids}; + +pub struct DatabaseConnection(pub Database); + +impl FromRequestContextRefPair for DatabaseConnection { + type Rejection = Infallible; + + async fn from_request_context_ref_pair( + ctx: &Context, + _parts: &request::Parts, + ) -> Result { + Ok(Self(ctx.state_clone())) + } +} + +#[derive(Debug)] +#[allow(dead_code)] +pub enum MongoError { + Io(io::Error), + Mongo(mongodb::error::Error), +} + +impl From for MongoError { + fn from(err: io::Error) -> Self { + MongoError::Io(err) + } +} + +impl From for MongoError { + fn from(err: mongodb::error::Error) -> Self { + MongoError::Mongo(err) + } +} + +pub async fn find_world_by_id(db: Database, id: i32) -> Result { + let world_collection = db.collection::("world"); + + let filter = doc! { "_id": id as f32 }; + + let raw: RawDocumentBuf = world_collection + .find_one(filter) + .await + .unwrap() + .expect("expected world, found none"); + + Ok(World { + id: raw + .get("id") + .expect("expected to parse world id") + .expect("could not get world id") + .as_i32() + .expect("could not extract world id"), + random_number: raw + .get("id") + .expect("expected to parse world id") + .expect("could not get world id") + .as_i32() + .expect("could not extract world id"), + }) +} + +pub async fn find_worlds( + db: Database, + rng: &mut SmallRng, + count: usize, +) -> Result, MongoError> { + let future_worlds = FuturesUnordered::new(); + + for id in random_ids(rng, count) { + future_worlds.push(find_world_by_id(db.clone(), id)); + } + + let worlds: Result, MongoError> = future_worlds.try_collect().await; + worlds +} + +pub async fn update_worlds( + db: Database, + worlds: Vec, +) -> Result { + let mut updates = Vec::new(); + + for world in worlds { + updates.push(doc! { + "q": { "id": world.id }, "u": { "$set": { "randomNumber": world.random_number }} + }); + } + + db.run_command(doc! {"update": "world", "updates": updates, "ordered": false}) + .await + .expect("could not update worlds"); + + Ok(true) +} diff --git a/frameworks/Rust/rama/src/mongo_raw/mod.rs b/frameworks/Rust/rama/src/mongo_raw/mod.rs new file mode 100644 index 00000000000..8fd0a6be869 --- /dev/null +++ b/frameworks/Rust/rama/src/mongo_raw/mod.rs @@ -0,0 +1 @@ +pub mod database; diff --git a/frameworks/Rust/rama/src/pg/database.rs b/frameworks/Rust/rama/src/pg/database.rs new file mode 100644 index 00000000000..ea4a90b257d --- /dev/null +++ b/frameworks/Rust/rama/src/pg/database.rs @@ -0,0 +1,154 @@ +use std::{convert::Infallible, io, sync::Arc}; + +use futures::{StreamExt, TryStreamExt, stream::futures_unordered::FuturesUnordered}; +use rama::{ + Context, + http::{dep::http::request, service::web::extract::FromRequestContextRefPair}, +}; +use rand::{SeedableRng, rng, rngs::SmallRng}; +use tokio::pin; +use tokio_postgres::{Client, NoTls, Statement, connect}; + +use crate::common::{self, random_id, random_ids}; + +use super::models::{Fortune, World}; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum PgError { + Io(io::Error), + Pg(tokio_postgres::Error), +} + +impl From for PgError { + fn from(err: io::Error) -> Self { + PgError::Io(err) + } +} + +impl From for PgError { + fn from(err: tokio_postgres::Error) -> Self { + PgError::Pg(err) + } +} + +/// Postgres interface +pub struct PgConnection { + client: Client, + fortune: Statement, + world: Statement, + updates: Statement, +} + +impl PgConnection { + pub async fn connect(db_url: String) -> Arc { + let (cl, conn) = connect(&db_url, NoTls) + .await + .expect("cannot connect to postgresql."); + + // Spawn connection + tokio::spawn(async move { + if let Err(error) = conn.await { + eprintln!("database connection error: {error}"); + } + }); + + // Prepare statements for the connection. + let fortune = cl.prepare(common::SELECT_ALL_FORTUNES).await.unwrap(); + let world = cl.prepare(common::SELECT_WORLD_BY_ID).await.unwrap(); + let updates = cl.prepare(common::UPDATE_WORLDS).await.unwrap(); + + Arc::new(PgConnection { + client: cl, + fortune, + world, + updates, + }) + } +} + +impl PgConnection { + pub async fn fetch_world_by_id(&self, id: i32) -> Result { + self.client + .query_one(&self.world, &[&id]) + .await + .map(|row| { + Ok(World { + id: row.get(0), + randomnumber: row.get(1), + }) + })? + } + + pub async fn fetch_random_worlds(&self, num: usize) -> Result, PgError> { + let mut rng = SmallRng::from_rng(&mut rng()); + + let futures = FuturesUnordered::new(); + + for id in random_ids(&mut rng, num) { + futures.push(self.fetch_world_by_id(id)); + } + + futures.try_collect().await + } + + pub async fn update_worlds(&self, num: usize) -> Result, PgError> { + let mut worlds = self.fetch_random_worlds(num).await?; + + // Update the worlds with new random numbers + let mut rng = SmallRng::from_rng(&mut rng()); + let mut ids = Vec::with_capacity(num); + let mut nids = Vec::with_capacity(num); + + for w in &mut worlds { + w.randomnumber = random_id(&mut rng); + ids.push(w.id); + nids.push(w.randomnumber); + } + + // Update the random worlds in the database. + self.client + .execute(&self.updates, &[&ids, &nids]) + .await + .unwrap(); + + Ok(worlds) + } + + pub async fn fetch_all_fortunes(&self) -> Result, PgError> { + let mut fortunes = vec![Fortune { + id: 0, + message: "Additional fortune added at request time.".parse().unwrap(), + }]; + + let rows = self + .client + .query_raw::<_, _, &[i32; 0]>(&self.fortune, &[]) + .await?; + + pin!(rows); + + while let Some(row) = rows.next().await.transpose()? { + fortunes.push(Fortune { + id: row.get(0), + message: row.get(1), + }); + } + + fortunes.sort_by(|it, next| it.message.cmp(&next.message)); + Ok(fortunes) + } +} + +pub struct DatabaseConnection(pub Arc); + +impl FromRequestContextRefPair> for DatabaseConnection { + type Rejection = Infallible; + + async fn from_request_context_ref_pair( + ctx: &Context>, + _parts: &request::Parts, + ) -> Result { + Ok(Self(ctx.state_clone())) + } +} diff --git a/frameworks/Rust/rama/src/pg/mod.rs b/frameworks/Rust/rama/src/pg/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/rama/src/pg/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/rama/src/pg/models.rs b/frameworks/Rust/rama/src/pg/models.rs new file mode 100644 index 00000000000..0c0df6536f4 --- /dev/null +++ b/frameworks/Rust/rama/src/pg/models.rs @@ -0,0 +1,16 @@ +use serde::{Deserialize, Serialize}; + +#[allow(non_snake_case)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct Fortune { + pub id: i32, + pub message: String, +} + +#[allow(non_snake_case)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct World { + pub id: i32, + #[serde(rename = "randomNumber")] + pub randomnumber: i32, +} diff --git a/frameworks/Rust/rama/src/pg_pool/database.rs b/frameworks/Rust/rama/src/pg_pool/database.rs new file mode 100644 index 00000000000..df3af5a7eba --- /dev/null +++ b/frameworks/Rust/rama/src/pg_pool/database.rs @@ -0,0 +1,95 @@ +use std::io; + +use crate::{ + common::utils::internal_error, + pg_pool::models::{Fortune, World}, +}; +use deadpool_postgres::{Client, Manager, ManagerConfig, RecyclingMethod}; +use futures_util::StreamExt; +use rama::{ + Context, + http::{ + StatusCode, dep::http::request, service::web::extract::FromRequestContextRefPair, + }, +}; +use tokio::pin; +use tokio_pg_mapper::FromTokioPostgresRow; +use tokio_postgres::{NoTls, Row, Statement}; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum PgError { + Io(io::Error), + Pg(tokio_postgres::Error), +} + +impl From for PgError { + fn from(err: io::Error) -> Self { + PgError::Io(err) + } +} + +impl From for PgError { + fn from(err: tokio_postgres::Error) -> Self { + PgError::Pg(err) + } +} + +pub async fn create_pool( + database_url: String, + max_pool_size: u32, +) -> deadpool_postgres::Pool { + let pg_config: tokio_postgres::Config = + database_url.parse().expect("invalid database url"); + + let mgr_config = ManagerConfig { + recycling_method: RecyclingMethod::Fast, + }; + let mgr = Manager::from_config(pg_config, NoTls, mgr_config); + let pool: deadpool_postgres::Pool = deadpool_postgres::Pool::builder(mgr) + .max_size(max_pool_size as usize) + .build() + .unwrap(); + + pool +} + +pub struct DatabaseClient(pub Client); + +impl FromRequestContextRefPair for DatabaseClient { + type Rejection = (StatusCode, String); + + async fn from_request_context_ref_pair( + ctx: &Context, + _parts: &request::Parts, + ) -> Result { + let conn = ctx.state().get().await.map_err(internal_error)?; + Ok(Self(conn)) + } +} + +pub async fn fetch_world_by_id( + client: &Client, + id: i32, + select: &Statement, +) -> Result { + let row: Row = client.query_one(select, &[&id]).await.unwrap(); + + Ok(World::from_row(row).unwrap()) +} + +pub async fn fetch_all_fortunes( + client: Client, + select: &Statement, +) -> Result, PgError> { + let mut fortunes: Vec = Vec::new(); + let rows = client.query_raw::<_, _, &[i32; 0]>(select, &[]).await?; + pin!(rows); + + while let Some(row) = rows.next().await.transpose()? { + fortunes + .push(Fortune::from_row(row).expect("could not convert row to fortune.")); + } + + Ok(fortunes) +} diff --git a/frameworks/Rust/rama/src/pg_pool/mod.rs b/frameworks/Rust/rama/src/pg_pool/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/rama/src/pg_pool/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/rama/src/pg_pool/models.rs b/frameworks/Rust/rama/src/pg_pool/models.rs new file mode 100644 index 00000000000..7dce3021eed --- /dev/null +++ b/frameworks/Rust/rama/src/pg_pool/models.rs @@ -0,0 +1,19 @@ +use serde::{Deserialize, Serialize}; +use tokio_pg_mapper_derive::PostgresMapper; + +#[allow(non_snake_case)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, PostgresMapper)] +#[pg_mapper(table = "Fortune")] +pub struct Fortune { + pub id: i32, + pub message: String, +} + +#[allow(non_snake_case)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, PostgresMapper)] +#[pg_mapper(table = "World")] +pub struct World { + pub id: i32, + #[serde(rename = "randomNumber")] + pub randomnumber: i32, +} diff --git a/frameworks/Rust/rama/src/server.rs b/frameworks/Rust/rama/src/server.rs new file mode 100644 index 00000000000..013656e6307 --- /dev/null +++ b/frameworks/Rust/rama/src/server.rs @@ -0,0 +1,77 @@ +use std::{ + future::Future, + io, + net::{Ipv4Addr, SocketAddr}, +}; + +use rama::{ + Layer, + http::{ + layer::required_header::AddRequiredResponseHeadersLayer, server::HttpServer, + service::web::Router, + }, + net::socket::{Domain, Socket, Type}, + rt::Executor, + tcp::server::TcpListener, +}; + +/// Reuse an existing listener, ensuring that the socket `backlog` +/// is set to enable a higher number of pending connections. +fn set_socket_options(addr: SocketAddr) -> io::Result> { + let socket = match addr { + SocketAddr::V4(_) => Socket::new(Domain::IPV4, Type::STREAM, None)?, + SocketAddr::V6(_) => Socket::new(Domain::IPV6, Type::STREAM, None)?, + }; + + socket.set_reuse_port(true)?; + socket.set_reuse_address(true)?; + socket.set_nonblocking(true)?; + socket.set_nodelay(true)?; + socket.bind(&addr.into())?; + socket.listen(4096)?; + + socket.try_into() +} + +/// Build a Rama server with consistent configuration, using the high-level API exposed +/// by rama 0.2. This is intended for convenience and intentionally does not provide much +/// customisability. +#[allow(dead_code)] +pub async fn serve( + state: State, + app: Router, + port: Option, +) { + let port = port.unwrap_or(8000); + let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, port)); + let listener = set_socket_options(addr).expect("couldn't bind to address"); + println!("started rama server on port: {port}"); + + let app = AddRequiredResponseHeadersLayer::default().layer(app); + let http_service = HttpServer::auto(Executor::default()).service(app); + + listener.with_state(state).serve(http_service).await; +} + +/// Start a single-threaded tokio runtime on multiple threads. +#[allow(dead_code)] +pub fn start_tokio(f: fn() -> Fut) +where + Fut: Future + 'static, +{ + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + + for _ in 1..num_cpus::get() { + std::thread::spawn(move || { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + rt.block_on(f()); + }); + } + rt.block_on(f()); +} diff --git a/frameworks/Rust/rama/src/sqlx/database.rs b/frameworks/Rust/rama/src/sqlx/database.rs new file mode 100644 index 00000000000..1d824144696 --- /dev/null +++ b/frameworks/Rust/rama/src/sqlx/database.rs @@ -0,0 +1,36 @@ +use std::io; + +use sqlx::{postgres::PgPoolOptions, PgPool}; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum PgError { + Io(io::Error), + Pg(sqlx::Error), +} + +impl From for PgError { + fn from(err: io::Error) -> Self { + PgError::Io(err) + } +} + +impl From for PgError { + fn from(err: sqlx::Error) -> Self { + PgError::Pg(err) + } +} + +pub async fn create_pool( + database_url: String, + max_pool_size: u32, + min_pool_size: u32, +) -> PgPool { + PgPoolOptions::new() + .max_connections(max_pool_size) + .min_connections(min_pool_size) + .test_before_acquire(false) + .connect(&database_url) + .await + .unwrap() +} diff --git a/frameworks/Rust/rama/src/sqlx/mod.rs b/frameworks/Rust/rama/src/sqlx/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/rama/src/sqlx/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/rama/src/sqlx/models.rs b/frameworks/Rust/rama/src/sqlx/models.rs new file mode 100644 index 00000000000..270fe941b17 --- /dev/null +++ b/frameworks/Rust/rama/src/sqlx/models.rs @@ -0,0 +1,16 @@ +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)] +pub struct Fortune { + pub id: i32, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)] +pub struct World { + pub id: i32, + #[sqlx(rename = "randomnumber")] + #[serde(rename = "randomNumber")] + pub random_number: i32, +} diff --git a/frameworks/Rust/rama/templates/fortunes.html.hbs b/frameworks/Rust/rama/templates/fortunes.html.hbs new file mode 100644 index 00000000000..b9e25a52a8e --- /dev/null +++ b/frameworks/Rust/rama/templates/fortunes.html.hbs @@ -0,0 +1,5 @@ +Fortunes + {{~# each fortunes ~}} + + {{~/each ~}} +
      idmessage
      {{id}}{{message}}
      From c588c0909487e47d84f013e231e2e1b55659b3ad Mon Sep 17 00:00:00 2001 From: Alpha Ho <666504+alphaho@users.noreply.github.com> Date: Sat, 19 Apr 2025 02:00:48 +0900 Subject: [PATCH 1399/1766] update JDK version to 21 or 17 in Scala frameworks to get the performance improvements from recent JDK versions: (#9837) - akka-http - blaze - cask - finagle - finatra - finch - http4s - otavia - pekko-http - scalene - vertx-web-scala - youi --- .../akka-http-slick-postgres.dockerfile | 2 +- .../akka-http-slick-postgres/build.sbt | 2 +- .../project/build.properties | 2 +- .../project/plugins.sbt | 2 +- .../akka/http/fortune/FortuneRoute.scala | 2 +- .../Scala/akka-http/akka-http.dockerfile | 4 +- .../Scala/akka-http/akka-http/build.sbt | 2 +- .../akka-http/project/build.properties | 2 +- frameworks/Scala/blaze/blaze.dockerfile | 8 +- frameworks/Scala/blaze/build.sbt | 17 +- .../Scala/blaze/project/build.properties | 2 +- frameworks/Scala/blaze/sbt | 579 --------------- frameworks/Scala/cask/build.sbt | 2 +- frameworks/Scala/cask/cask.dockerfile | 4 +- .../Scala/cask/project/build.properties | 2 +- frameworks/Scala/finagle/build.sbt | 2 +- frameworks/Scala/finagle/finagle.dockerfile | 4 +- .../Scala/finagle/project/build.properties | 2 +- frameworks/Scala/finatra/build.sbt | 2 +- frameworks/Scala/finatra/finatra.dockerfile | 4 +- .../Scala/finatra/project/build.properties | 2 +- frameworks/Scala/finch/build.sbt | 2 +- frameworks/Scala/finch/finch.dockerfile | 4 +- .../Scala/finch/project/build.properties | 2 +- .../http4s/blaze/project/build.properties | 2 +- .../Scala/http4s/blaze/project/plugins.sbt | 2 + frameworks/Scala/http4s/http4s.dockerfile | 7 +- frameworks/Scala/http4s/sbt | 664 ------------------ frameworks/Scala/otavia/.mill-version | 2 +- frameworks/Scala/otavia/build.sc | 2 +- .../Scala/otavia/otavia-overshoot.dockerfile | 3 +- frameworks/Scala/otavia/otavia.dockerfile | 3 +- .../Scala/pekko-http/pekko-http.dockerfile | 4 +- .../Scala/pekko-http/pekko-http/build.sbt | 2 +- .../pekko-http/project/build.properties | 2 +- .../Scala/play2-scala/benchmark_config.json | 4 +- .../play2-scala-anorm-netty.dockerfile | 5 +- .../play2-scala/play2-scala-anorm.dockerfile | 5 +- .../play2-scala/play2-scala-anorm/build.sbt | 6 +- .../play2-scala-anorm/conf/application.conf | 6 +- .../project/build.properties | 2 +- .../play2-scala-anorm/project/plugins.sbt | 2 +- .../play2-scala/play2-scala-netty.dockerfile | 4 +- ...play2-scala-reactivemongo-netty.dockerfile | 4 +- .../play2-scala-reactivemongo.dockerfile | 4 +- .../app/controllers/Application.scala | 21 +- .../play2-scala-reactivemongo/build.sbt | 6 +- .../conf/application.conf | 6 +- .../project/build.properties | 2 +- .../project/plugins.sbt | 2 +- .../play2-scala-slick-netty.dockerfile | 4 +- .../play2-scala/play2-scala-slick.dockerfile | 4 +- .../app/controllers/Application.scala | 14 +- .../play2-scala-slick/app/models/World.scala | 10 +- .../play2-scala/play2-scala-slick/build.sbt | 6 +- .../play2-scala-slick/conf/application.conf | 10 +- .../project/build.properties | 2 +- .../play2-scala-slick/project/plugins.sbt | 2 +- .../Scala/play2-scala/play2-scala.dockerfile | 4 +- .../Scala/play2-scala/play2-scala/build.sbt | 2 +- .../play2-scala/conf/application.conf | 6 +- .../play2-scala/project/build.properties | 2 +- .../play2-scala/project/plugins.sbt | 2 +- frameworks/Scala/scalene/scalene.dockerfile | 12 +- frameworks/Scala/sharaf/.mill-version | 2 +- frameworks/Scala/sharaf/sharaf.dockerfile | 2 +- frameworks/Scala/vertx-web-scala/build.sbt | 2 +- .../vertx-web-scala/project/build.properties | 2 +- .../vertx-web-scala.dockerfile | 2 +- frameworks/Scala/youi/build.sbt | 2 +- .../Scala/youi/project/build.properties | 2 +- frameworks/Scala/youi/project/plugins.sbt | 4 +- frameworks/Scala/youi/youi.dockerfile | 2 +- 73 files changed, 146 insertions(+), 1382 deletions(-) delete mode 100755 frameworks/Scala/blaze/sbt delete mode 100755 frameworks/Scala/http4s/sbt diff --git a/frameworks/Scala/akka-http/akka-http-slick-postgres.dockerfile b/frameworks/Scala/akka-http/akka-http-slick-postgres.dockerfile index 992f0518f48..04cc70062f3 100644 --- a/frameworks/Scala/akka-http/akka-http-slick-postgres.dockerfile +++ b/frameworks/Scala/akka-http/akka-http-slick-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM hseeberger/scala-sbt:8u265_1.3.13_2.13.3 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 WORKDIR /akka-http-slick-postgres diff --git a/frameworks/Scala/akka-http/akka-http-slick-postgres/build.sbt b/frameworks/Scala/akka-http/akka-http-slick-postgres/build.sbt index a9ecdaf4c5e..dd2c36af395 100644 --- a/frameworks/Scala/akka-http/akka-http-slick-postgres/build.sbt +++ b/frameworks/Scala/akka-http/akka-http-slick-postgres/build.sbt @@ -62,7 +62,7 @@ lazy val commonSettings = Seq( organization := "net.benchmark.akka.http", organizationName := "Akka", - scalaVersion := "2.13.3", + scalaVersion := "2.13.16", scalacOptions ++= Seq( "-deprecation", "-encoding", diff --git a/frameworks/Scala/akka-http/akka-http-slick-postgres/project/build.properties b/frameworks/Scala/akka-http/akka-http-slick-postgres/project/build.properties index cb6a5a8a90d..cc68b53f1a3 100644 --- a/frameworks/Scala/akka-http/akka-http-slick-postgres/project/build.properties +++ b/frameworks/Scala/akka-http/akka-http-slick-postgres/project/build.properties @@ -1 +1 @@ -sbt.version = 1.3.13 +sbt.version=1.10.11 diff --git a/frameworks/Scala/akka-http/akka-http-slick-postgres/project/plugins.sbt b/frameworks/Scala/akka-http/akka-http-slick-postgres/project/plugins.sbt index 112d7fab73a..4adc260be88 100644 --- a/frameworks/Scala/akka-http/akka-http-slick-postgres/project/plugins.sbt +++ b/frameworks/Scala/akka-http/akka-http-slick-postgres/project/plugins.sbt @@ -1,7 +1,7 @@ addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.0") addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.16") addSbtPlugin("com.lucidchart" % "sbt-scalafmt" % "1.15") -addSbtPlugin("org.wartremover" % "sbt-wartremover" % "2.4.10") +addSbtPlugin("org.wartremover" % "sbt-wartremover" % "3.3.2") addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.3") libraryDependencies += "org.slf4j" % "slf4j-nop" % "1.7.25" // Needed by sbt-git diff --git a/frameworks/Scala/akka-http/akka-http-slick-postgres/src/main/scala/net/benchmark/akka/http/fortune/FortuneRoute.scala b/frameworks/Scala/akka-http/akka-http-slick-postgres/src/main/scala/net/benchmark/akka/http/fortune/FortuneRoute.scala index 61e23375a52..553aa4735d9 100644 --- a/frameworks/Scala/akka-http/akka-http-slick-postgres/src/main/scala/net/benchmark/akka/http/fortune/FortuneRoute.scala +++ b/frameworks/Scala/akka-http/akka-http-slick-postgres/src/main/scala/net/benchmark/akka/http/fortune/FortuneRoute.scala @@ -35,7 +35,7 @@ object FortuneRoute { class FortuneRoute(fr: FortuneRepository, sd: ExecutionContextExecutor)(implicit val system: ActorSystem) { - private implicit val fmar = FortuneRoute.fm + private implicit val fmar: ToEntityMarshaller[Seq[Fortune]] = FortuneRoute.fm private def source(p: DatabasePublisher[Fortune]): Source[Fortune, NotUsed] = { Source diff --git a/frameworks/Scala/akka-http/akka-http.dockerfile b/frameworks/Scala/akka-http/akka-http.dockerfile index bcf2f9db95e..ee5351673cd 100644 --- a/frameworks/Scala/akka-http/akka-http.dockerfile +++ b/frameworks/Scala/akka-http/akka-http.dockerfile @@ -1,4 +1,4 @@ -FROM hseeberger/scala-sbt:8u265_1.3.13_2.13.3 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 WORKDIR /akka-http @@ -23,4 +23,4 @@ RUN sbt clean compile stage EXPOSE 9000 -CMD ["target/universal/stage/bin/akka-http-benchmark", "-Dakka.http.benchmark.mysql.dbhost=tfb-database", "-J-server", "-J-Xms2g", "-J-Xmx2g", "-J-XX:NewSize=1g", "-J-XX:MaxNewSize=1g", "-J-XX:InitialCodeCacheSize=256m", "-J-XX:ReservedCodeCacheSize=256m", "-J-XX:+UseParallelGC", "-J-XX:-UseBiasedLocking", "-J-XX:+AlwaysPreTouch", "-J-XX:+UseNUMA", "-J-XX:+AggressiveOpts"] +CMD ["target/universal/stage/bin/akka-http-benchmark", "-Dakka.http.benchmark.mysql.dbhost=tfb-database", "-J-server", "-J-Xms2g", "-J-Xmx2g", "-J-XX:NewSize=1g", "-J-XX:MaxNewSize=1g", "-J-XX:InitialCodeCacheSize=256m", "-J-XX:ReservedCodeCacheSize=256m", "-J-XX:+UseParallelGC", "-J-XX:+AlwaysPreTouch", "-J-XX:+UseNUMA"] diff --git a/frameworks/Scala/akka-http/akka-http/build.sbt b/frameworks/Scala/akka-http/akka-http/build.sbt index 9e22525b987..b4501a8ab06 100644 --- a/frameworks/Scala/akka-http/akka-http/build.sbt +++ b/frameworks/Scala/akka-http/akka-http/build.sbt @@ -6,7 +6,7 @@ name := "akka-http-benchmark" version := "0.1.0-SNAPSHOT" -scalaVersion := "2.13.8" +scalaVersion := "2.13.16" val akkaV = "2.6.19" val akkaHttpV = "10.2.9" diff --git a/frameworks/Scala/akka-http/akka-http/project/build.properties b/frameworks/Scala/akka-http/akka-http/project/build.properties index 9edb75b77c2..cc68b53f1a3 100644 --- a/frameworks/Scala/akka-http/akka-http/project/build.properties +++ b/frameworks/Scala/akka-http/akka-http/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.4 +sbt.version=1.10.11 diff --git a/frameworks/Scala/blaze/blaze.dockerfile b/frameworks/Scala/blaze/blaze.dockerfile index 23a039acb7b..c7edcc70c4d 100644 --- a/frameworks/Scala/blaze/blaze.dockerfile +++ b/frameworks/Scala/blaze/blaze.dockerfile @@ -1,10 +1,10 @@ -FROM openjdk:15 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 + WORKDIR /blaze COPY project project COPY src src COPY build.sbt build.sbt -COPY sbt sbt -RUN ./sbt assembly -batch && \ +RUN sbt assembly -batch && \ mv target/blaze-assembly-1.0.jar . && \ rm -Rf target && \ rm -Rf project/target && \ @@ -14,4 +14,4 @@ RUN ./sbt assembly -batch && \ EXPOSE 8080 -CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:NewSize=1g", "-XX:MaxNewSize=1g", "-XX:InitialCodeCacheSize=256m", "-XX:ReservedCodeCacheSize=256m", "-XX:+UseParallelGC", "-XX:+UseNUMA", "-XX:-UseBiasedLocking", "-XX:+AlwaysPreTouch", "-jar", "blaze-assembly-1.0.jar", "tfb-database"] +CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:NewSize=1g", "-XX:MaxNewSize=1g", "-XX:InitialCodeCacheSize=256m", "-XX:ReservedCodeCacheSize=256m", "-XX:+UseParallelGC", "-XX:+UseNUMA", "-XX:+AlwaysPreTouch", "-jar", "blaze-assembly-1.0.jar", "tfb-database"] diff --git a/frameworks/Scala/blaze/build.sbt b/frameworks/Scala/blaze/build.sbt index 7b0cd7ed2cc..fa140d872e0 100644 --- a/frameworks/Scala/blaze/build.sbt +++ b/frameworks/Scala/blaze/build.sbt @@ -2,12 +2,19 @@ name := "blaze" version := "1.0" -scalaVersion := "2.13.5" +scalaVersion := "2.13.16" libraryDependencies ++= Seq( - "org.http4s" %% "blaze-http" % "0.14.16", - "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.7.3", - "ch.qos.logback" % "logback-classic" % "1.2.3" + "org.http4s" %% "blaze-http" % "0.14.18", + "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.34.0", + "ch.qos.logback" % "logback-classic" % "1.5.18" ) -crossPaths := false \ No newline at end of file +crossPaths := false + +assembly / assemblyMergeStrategy := { + case x if x.contains("module-info.class") => MergeStrategy.discard + case x => + val oldStrategy = (assembly / assemblyMergeStrategy).value + oldStrategy(x) +} \ No newline at end of file diff --git a/frameworks/Scala/blaze/project/build.properties b/frameworks/Scala/blaze/project/build.properties index f0be67b9f72..cc68b53f1a3 100644 --- a/frameworks/Scala/blaze/project/build.properties +++ b/frameworks/Scala/blaze/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.1 +sbt.version=1.10.11 diff --git a/frameworks/Scala/blaze/sbt b/frameworks/Scala/blaze/sbt deleted file mode 100755 index 8cc9bada4e1..00000000000 --- a/frameworks/Scala/blaze/sbt +++ /dev/null @@ -1,579 +0,0 @@ -#!/usr/bin/env bash -# -# A more capable sbt runner, coincidentally also called sbt. -# Author: Paul Phillips -# https://github.com/paulp/sbt-extras - -set -o pipefail - -declare -r sbt_release_version="1.2.8" -declare -r sbt_unreleased_version="1.3.0-RC1" - -declare -r latest_213="2.13.0" -declare -r latest_212="2.12.8" -declare -r latest_211="2.11.12" -declare -r latest_210="2.10.7" -declare -r latest_29="2.9.3" -declare -r latest_28="2.8.2" - -declare -r buildProps="project/build.properties" - -declare -r sbt_launch_ivy_release_repo="https://repo.typesafe.com/typesafe/ivy-releases" -declare -r sbt_launch_ivy_snapshot_repo="https://repo.scala-sbt.org/scalasbt/ivy-snapshots" -declare -r sbt_launch_mvn_release_repo="https://repo.scala-sbt.org/scalasbt/maven-releases" -declare -r sbt_launch_mvn_snapshot_repo="https://repo.scala-sbt.org/scalasbt/maven-snapshots" - -declare -r default_jvm_opts_common="-Xms512m -Xss2m" -declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" - -declare sbt_jar sbt_dir sbt_create sbt_version sbt_script sbt_new -declare sbt_explicit_version -declare verbose noshare batch trace_level -declare debugUs - -declare java_cmd="java" -declare sbt_launch_dir="$HOME/.sbt/launchers" -declare sbt_launch_repo - -# pull -J and -D options to give to java. -declare -a java_args scalac_args sbt_commands residual_args - -# args to jvm/sbt via files or environment variables -declare -a extra_jvm_opts extra_sbt_opts - -echoerr () { echo >&2 "$@"; } -vlog () { [[ -n "$verbose" ]] && echoerr "$@"; } -die () { echo "Aborting: $*" ; exit 1; } - -setTrapExit () { - # save stty and trap exit, to ensure echo is re-enabled if we are interrupted. - SBT_STTY="$(stty -g 2>/dev/null)" - export SBT_STTY - - # restore stty settings (echo in particular) - onSbtRunnerExit() { - [ -t 0 ] || return - vlog "" - vlog "restoring stty: $SBT_STTY" - stty "$SBT_STTY" - } - - vlog "saving stty: $SBT_STTY" - trap onSbtRunnerExit EXIT -} - -# this seems to cover the bases on OSX, and someone will -# have to tell me about the others. -get_script_path () { - local path="$1" - [[ -L "$path" ]] || { echo "$path" ; return; } - - local -r target="$(readlink "$path")" - if [[ "${target:0:1}" == "/" ]]; then - echo "$target" - else - echo "${path%/*}/$target" - fi -} - -script_path="$(get_script_path "${BASH_SOURCE[0]}")" -declare -r script_path -script_name="${script_path##*/}" -declare -r script_name - -init_default_option_file () { - local overriding_var="${!1}" - local default_file="$2" - if [[ ! -r "$default_file" && "$overriding_var" =~ ^@(.*)$ ]]; then - local envvar_file="${BASH_REMATCH[1]}" - if [[ -r "$envvar_file" ]]; then - default_file="$envvar_file" - fi - fi - echo "$default_file" -} - -sbt_opts_file="$(init_default_option_file SBT_OPTS .sbtopts)" -jvm_opts_file="$(init_default_option_file JVM_OPTS .jvmopts)" - -build_props_sbt () { - [[ -r "$buildProps" ]] && \ - grep '^sbt\.version' "$buildProps" | tr '=\r' ' ' | awk '{ print $2; }' -} - -set_sbt_version () { - sbt_version="${sbt_explicit_version:-$(build_props_sbt)}" - [[ -n "$sbt_version" ]] || sbt_version=$sbt_release_version - export sbt_version -} - -url_base () { - local version="$1" - - case "$version" in - 0.7.*) echo "http://simple-build-tool.googlecode.com" ;; - 0.10.* ) echo "$sbt_launch_ivy_release_repo" ;; - 0.11.[12]) echo "$sbt_launch_ivy_release_repo" ;; - 0.*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]) # ie "*-yyyymmdd-hhMMss" - echo "$sbt_launch_ivy_snapshot_repo" ;; - 0.*) echo "$sbt_launch_ivy_release_repo" ;; - *-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]) # ie "*-yyyymmdd-hhMMss" - echo "$sbt_launch_mvn_snapshot_repo" ;; - *) echo "$sbt_launch_mvn_release_repo" ;; - esac -} - -make_url () { - local version="$1" - - local base="${sbt_launch_repo:-$(url_base "$version")}" - - case "$version" in - 0.7.*) echo "$base/files/sbt-launch-0.7.7.jar" ;; - 0.10.* ) echo "$base/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; - 0.11.[12]) echo "$base/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; - 0.*) echo "$base/org.scala-sbt/sbt-launch/$version/sbt-launch.jar" ;; - 1.5.*) echo "$base/org/scala-sbt/sbt-launch/$version/sbt-launch-$version.jar" ;; - *) echo "$base/org/scala-sbt/sbt-launch/$version/sbt-launch.jar" ;; - esac -} - -addJava () { vlog "[addJava] arg = '$1'" ; java_args+=("$1"); } -addSbt () { vlog "[addSbt] arg = '$1'" ; sbt_commands+=("$1"); } -addScalac () { vlog "[addScalac] arg = '$1'" ; scalac_args+=("$1"); } -addResidual () { vlog "[residual] arg = '$1'" ; residual_args+=("$1"); } - -addResolver () { addSbt "set resolvers += $1"; } -addDebugger () { addJava "-Xdebug" ; addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1"; } -setThisBuild () { - vlog "[addBuild] args = '$*'" - local key="$1" && shift - addSbt "set $key in ThisBuild := $*" -} -setScalaVersion () { - [[ "$1" == *"-SNAPSHOT" ]] && addResolver 'Resolver.sonatypeRepo("snapshots")' - addSbt "++ $1" -} -setJavaHome () { - java_cmd="$1/bin/java" - setThisBuild javaHome "_root_.scala.Some(file(\"$1\"))" - export JAVA_HOME="$1" - export JDK_HOME="$1" - export PATH="$JAVA_HOME/bin:$PATH" -} - -getJavaVersion() { - local -r str=$("$1" -version 2>&1 | grep -E -e '(java|openjdk) version' | awk '{ print $3 }' | tr -d '"') - - # java -version on java8 says 1.8.x - # but on 9 and 10 it's 9.x.y and 10.x.y. - if [[ "$str" =~ ^1\.([0-9]+)\..*$ ]]; then - echo "${BASH_REMATCH[1]}" - elif [[ "$str" =~ ^([0-9]+)\..*$ ]]; then - echo "${BASH_REMATCH[1]}" - elif [[ -n "$str" ]]; then - echoerr "Can't parse java version from: $str" - fi -} - -checkJava() { - # Warn if there is a Java version mismatch between PATH and JAVA_HOME/JDK_HOME - - [[ -n "$JAVA_HOME" && -e "$JAVA_HOME/bin/java" ]] && java="$JAVA_HOME/bin/java" - [[ -n "$JDK_HOME" && -e "$JDK_HOME/lib/tools.jar" ]] && java="$JDK_HOME/bin/java" - - if [[ -n "$java" ]]; then - pathJavaVersion=$(getJavaVersion java) - homeJavaVersion=$(getJavaVersion "$java") - if [[ "$pathJavaVersion" != "$homeJavaVersion" ]]; then - echoerr "Warning: Java version mismatch between PATH and JAVA_HOME/JDK_HOME, sbt will use the one in PATH" - echoerr " Either: fix your PATH, remove JAVA_HOME/JDK_HOME or use -java-home" - echoerr " java version from PATH: $pathJavaVersion" - echoerr " java version from JAVA_HOME/JDK_HOME: $homeJavaVersion" - fi - fi -} - -java_version () { - local -r version=$(getJavaVersion "$java_cmd") - vlog "Detected Java version: $version" - echo "$version" -} - -# MaxPermSize critical on pre-8 JVMs but incurs noisy warning on 8+ -default_jvm_opts () { - local -r v="$(java_version)" - if [[ $v -ge 8 ]]; then - echo "$default_jvm_opts_common" - else - echo "-XX:MaxPermSize=384m $default_jvm_opts_common" - fi -} - -build_props_scala () { - if [[ -r "$buildProps" ]]; then - versionLine="$(grep '^build.scala.versions' "$buildProps")" - versionString="${versionLine##build.scala.versions=}" - echo "${versionString%% .*}" - fi -} - -execRunner () { - # print the arguments one to a line, quoting any containing spaces - vlog "# Executing command line:" && { - for arg; do - if [[ -n "$arg" ]]; then - if printf "%s\n" "$arg" | grep -q ' '; then - printf >&2 "\"%s\"\n" "$arg" - else - printf >&2 "%s\n" "$arg" - fi - fi - done - vlog "" - } - - setTrapExit - - if [[ -n "$batch" ]]; then - "$@" < /dev/null - else - "$@" - fi -} - -jar_url () { make_url "$1"; } - -is_cygwin () { [[ "$(uname -a)" == "CYGWIN"* ]]; } - -jar_file () { - is_cygwin \ - && cygpath -w "$sbt_launch_dir/$1/sbt-launch.jar" \ - || echo "$sbt_launch_dir/$1/sbt-launch.jar" -} - -download_url () { - local url="$1" - local jar="$2" - - echoerr "Downloading sbt launcher for $sbt_version:" - echoerr " From $url" - echoerr " To $jar" - - mkdir -p "${jar%/*}" && { - if command -v curl > /dev/null 2>&1; then - curl --fail --silent --location "$url" --output "$jar" - elif command -v wget > /dev/null 2>&1; then - wget -q -O "$jar" "$url" - fi - } && [[ -r "$jar" ]] -} - -acquire_sbt_jar () { - { - sbt_jar="$(jar_file "$sbt_version")" - [[ -r "$sbt_jar" ]] - } || { - sbt_jar="$HOME/.ivy2/local/org.scala-sbt/sbt-launch/$sbt_version/jars/sbt-launch.jar" - [[ -r "$sbt_jar" ]] - } || { - sbt_jar="$(jar_file "$sbt_version")" - download_url "$(make_url "$sbt_version")" "$sbt_jar" - } -} - -usage () { - set_sbt_version - cat < display stack traces with a max of frames (default: -1, traces suppressed) - -debug-inc enable debugging log for the incremental compiler - -no-colors disable ANSI color codes - -sbt-create start sbt even if current directory contains no sbt project - -sbt-dir path to global settings/plugins directory (default: ~/.sbt/) - -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11+) - -ivy path to local Ivy repository (default: ~/.ivy2) - -no-share use all local caches; no sharing - -offline put sbt in offline mode - -jvm-debug Turn on JVM debugging, open at the given port. - -batch Disable interactive mode - -prompt Set the sbt prompt; in expr, 's' is the State and 'e' is Extracted - -script Run the specified file as a scala script - - # sbt version (default: sbt.version from $buildProps if present, otherwise $sbt_release_version) - -sbt-force-latest force the use of the latest release of sbt: $sbt_release_version - -sbt-version use the specified version of sbt (default: $sbt_release_version) - -sbt-dev use the latest pre-release version of sbt: $sbt_unreleased_version - -sbt-jar use the specified jar as the sbt launcher - -sbt-launch-dir directory to hold sbt launchers (default: $sbt_launch_dir) - -sbt-launch-repo repo url for downloading sbt launcher jar (default: $(url_base "$sbt_version")) - - # scala version (default: as chosen by sbt) - -28 use $latest_28 - -29 use $latest_29 - -210 use $latest_210 - -211 use $latest_211 - -212 use $latest_212 - -213 use $latest_213 - -scala-home use the scala build at the specified directory - -scala-version use the specified version of scala - -binary-version use the specified scala version when searching for dependencies - - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) - -java-home alternate JAVA_HOME - - # passing options to the jvm - note it does NOT use JAVA_OPTS due to pollution - # The default set is used if JVM_OPTS is unset and no -jvm-opts file is found - $(default_jvm_opts) - JVM_OPTS environment variable holding either the jvm args directly, or - the reference to a file containing jvm args if given path is prepended by '@' (e.g. '@/etc/jvmopts') - Note: "@"-file is overridden by local '.jvmopts' or '-jvm-opts' argument. - -jvm-opts file containing jvm args (if not given, .jvmopts in project root is used if present) - -Dkey=val pass -Dkey=val directly to the jvm - -J-X pass option -X directly to the jvm (-J is stripped) - - # passing options to sbt, OR to this runner - SBT_OPTS environment variable holding either the sbt args directly, or - the reference to a file containing sbt args if given path is prepended by '@' (e.g. '@/etc/sbtopts') - Note: "@"-file is overridden by local '.sbtopts' or '-sbt-opts' argument. - -sbt-opts file containing sbt args (if not given, .sbtopts in project root is used if present) - -S-X add -X to sbt's scalacOptions (-S is stripped) -EOM -} - -process_args () { - require_arg () { - local type="$1" - local opt="$2" - local arg="$3" - - if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then - die "$opt requires <$type> argument" - fi - } - while [[ $# -gt 0 ]]; do - case "$1" in - -h|-help) usage; exit 0 ;; - -v) verbose=true && shift ;; - -d) addSbt "--debug" && shift ;; - -w) addSbt "--warn" && shift ;; - -q) addSbt "--error" && shift ;; - -x) debugUs=true && shift ;; - -trace) require_arg integer "$1" "$2" && trace_level="$2" && shift 2 ;; - -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; - -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; - -no-share) noshare=true && shift ;; - -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; - -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;; - -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - -offline) addSbt "set offline in Global := true" && shift ;; - -jvm-debug) require_arg port "$1" "$2" && addDebugger "$2" && shift 2 ;; - -batch) batch=true && shift ;; - -prompt) require_arg "expr" "$1" "$2" && setThisBuild shellPrompt "(s => { val e = Project.extract(s) ; $2 })" && shift 2 ;; - -script) require_arg file "$1" "$2" && sbt_script="$2" && addJava "-Dsbt.main.class=sbt.ScriptMain" && shift 2 ;; - - -sbt-create) sbt_create=true && shift ;; - -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;; - -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;; - -sbt-force-latest) sbt_explicit_version="$sbt_release_version" && shift ;; - -sbt-dev) sbt_explicit_version="$sbt_unreleased_version" && shift ;; - -sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;; - -sbt-launch-repo) require_arg path "$1" "$2" && sbt_launch_repo="$2" && shift 2 ;; - -scala-version) require_arg version "$1" "$2" && setScalaVersion "$2" && shift 2 ;; - -binary-version) require_arg version "$1" "$2" && setThisBuild scalaBinaryVersion "\"$2\"" && shift 2 ;; - -scala-home) require_arg path "$1" "$2" && setThisBuild scalaHome "_root_.scala.Some(file(\"$2\"))" && shift 2 ;; - -java-home) require_arg path "$1" "$2" && setJavaHome "$2" && shift 2 ;; - -sbt-opts) require_arg path "$1" "$2" && sbt_opts_file="$2" && shift 2 ;; - -jvm-opts) require_arg path "$1" "$2" && jvm_opts_file="$2" && shift 2 ;; - - -D*) addJava "$1" && shift ;; - -J*) addJava "${1:2}" && shift ;; - -S*) addScalac "${1:2}" && shift ;; - -28) setScalaVersion "$latest_28" && shift ;; - -29) setScalaVersion "$latest_29" && shift ;; - -210) setScalaVersion "$latest_210" && shift ;; - -211) setScalaVersion "$latest_211" && shift ;; - -212) setScalaVersion "$latest_212" && shift ;; - -213) setScalaVersion "$latest_213" && shift ;; - new) sbt_new=true && : ${sbt_explicit_version:=$sbt_release_version} && addResidual "$1" && shift ;; - *) addResidual "$1" && shift ;; - esac - done -} - -# process the direct command line arguments -process_args "$@" - -# skip #-styled comments and blank lines -readConfigFile() { - local end=false - until $end; do - read -r || end=true - [[ $REPLY =~ ^# ]] || [[ -z $REPLY ]] || echo "$REPLY" - done < "$1" -} - -# if there are file/environment sbt_opts, process again so we -# can supply args to this runner -if [[ -r "$sbt_opts_file" ]]; then - vlog "Using sbt options defined in file $sbt_opts_file" - while read -r opt; do extra_sbt_opts+=("$opt"); done < <(readConfigFile "$sbt_opts_file") -elif [[ -n "$SBT_OPTS" && ! ("$SBT_OPTS" =~ ^@.*) ]]; then - vlog "Using sbt options defined in variable \$SBT_OPTS" - IFS=" " read -r -a extra_sbt_opts <<< "$SBT_OPTS" -else - vlog "No extra sbt options have been defined" -fi - -[[ -n "${extra_sbt_opts[*]}" ]] && process_args "${extra_sbt_opts[@]}" - -# reset "$@" to the residual args -set -- "${residual_args[@]}" -argumentCount=$# - -# set sbt version -set_sbt_version - -checkJava - -# only exists in 0.12+ -setTraceLevel() { - case "$sbt_version" in - "0.7."* | "0.10."* | "0.11."* ) echoerr "Cannot set trace level in sbt version $sbt_version" ;; - *) setThisBuild traceLevel "$trace_level" ;; - esac -} - -# set scalacOptions if we were given any -S opts -[[ ${#scalac_args[@]} -eq 0 ]] || addSbt "set scalacOptions in ThisBuild += \"${scalac_args[*]}\"" - -[[ -n "$sbt_explicit_version" && -z "$sbt_new" ]] && addJava "-Dsbt.version=$sbt_explicit_version" -vlog "Detected sbt version $sbt_version" - -if [[ -n "$sbt_script" ]]; then - residual_args=( "$sbt_script" "${residual_args[@]}" ) -else - # no args - alert them there's stuff in here - (( argumentCount > 0 )) || { - vlog "Starting $script_name: invoke with -help for other options" - residual_args=( shell ) - } -fi - -# verify this is an sbt dir, -create was given or user attempts to run a scala script -[[ -r ./build.sbt || -d ./project || -n "$sbt_create" || -n "$sbt_script" || -n "$sbt_new" ]] || { - cat < -# https://github.com/paulp/sbt-extras -# -# Generated from http://www.opensource.org/licenses/bsd-license.php -# Copyright (c) 2011, Paul Phillips. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the author nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -set -o pipefail - -declare -r sbt_release_version="1.7.1" -declare -r sbt_unreleased_version="1.7.1" - -declare -r latest_213="2.13.8" -declare -r latest_212="2.12.16" -declare -r latest_211="2.11.12" -declare -r latest_210="2.10.7" -declare -r latest_29="2.9.3" -declare -r latest_28="2.8.2" - -declare -r buildProps="project/build.properties" - -declare -r sbt_launch_ivy_release_repo="https://repo.typesafe.com/typesafe/ivy-releases" -declare -r sbt_launch_ivy_snapshot_repo="https://repo.scala-sbt.org/scalasbt/ivy-snapshots" -declare -r sbt_launch_mvn_release_repo="https://repo1.maven.org/maven2" -declare -r sbt_launch_mvn_snapshot_repo="https://repo.scala-sbt.org/scalasbt/maven-snapshots" - -declare -r default_jvm_opts_common="-Xms512m -Xss2m -XX:MaxInlineLevel=18" -declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy -Dsbt.coursier.home=project/.coursier" - -declare sbt_jar sbt_dir sbt_create sbt_version sbt_script sbt_new -declare sbt_explicit_version -declare verbose noshare batch trace_level - -declare java_cmd="java" -declare sbt_launch_dir="$HOME/.sbt/launchers" -declare sbt_launch_repo - -# pull -J and -D options to give to java. -declare -a java_args scalac_args sbt_commands residual_args - -# args to jvm/sbt via files or environment variables -declare -a extra_jvm_opts extra_sbt_opts - -echoerr() { echo >&2 "$@"; } -vlog() { [[ -n "$verbose" ]] && echoerr "$@"; } -die() { - echo "Aborting: $*" - exit 1 -} - -setTrapExit() { - # save stty and trap exit, to ensure echo is re-enabled if we are interrupted. - SBT_STTY="$(stty -g 2>/dev/null)" - export SBT_STTY - - # restore stty settings (echo in particular) - onSbtRunnerExit() { - [ -t 0 ] || return - vlog "" - vlog "restoring stty: $SBT_STTY" - stty "$SBT_STTY" - } - - vlog "saving stty: $SBT_STTY" - trap onSbtRunnerExit EXIT -} - -# this seems to cover the bases on OSX, and someone will -# have to tell me about the others. -get_script_path() { - local path="$1" - [[ -L "$path" ]] || { - echo "$path" - return - } - - local -r target="$(readlink "$path")" - if [[ "${target:0:1}" == "/" ]]; then - echo "$target" - else - echo "${path%/*}/$target" - fi -} - -script_path="$(get_script_path "${BASH_SOURCE[0]}")" -declare -r script_path -script_name="${script_path##*/}" -declare -r script_name - -init_default_option_file() { - local overriding_var="${!1}" - local default_file="$2" - if [[ ! -r "$default_file" && "$overriding_var" =~ ^@(.*)$ ]]; then - local envvar_file="${BASH_REMATCH[1]}" - if [[ -r "$envvar_file" ]]; then - default_file="$envvar_file" - fi - fi - echo "$default_file" -} - -sbt_opts_file="$(init_default_option_file SBT_OPTS .sbtopts)" -sbtx_opts_file="$(init_default_option_file SBTX_OPTS .sbtxopts)" -jvm_opts_file="$(init_default_option_file JVM_OPTS .jvmopts)" - -build_props_sbt() { - [[ -r "$buildProps" ]] && - grep '^sbt\.version' "$buildProps" | tr '=\r' ' ' | awk '{ print $2; }' -} - -set_sbt_version() { - sbt_version="${sbt_explicit_version:-$(build_props_sbt)}" - [[ -n "$sbt_version" ]] || sbt_version=$sbt_release_version - export sbt_version -} - -url_base() { - local version="$1" - - case "$version" in - 0.7.*) echo "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/simple-build-tool" ;; - 0.10.*) echo "$sbt_launch_ivy_release_repo" ;; - 0.11.[12]) echo "$sbt_launch_ivy_release_repo" ;; - 0.*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]) # ie "*-yyyymmdd-hhMMss" - echo "$sbt_launch_ivy_snapshot_repo" ;; - 0.*) echo "$sbt_launch_ivy_release_repo" ;; - *-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]T[0-9][0-9][0-9][0-9][0-9][0-9]) # ie "*-yyyymmddThhMMss" - echo "$sbt_launch_mvn_snapshot_repo" ;; - *) echo "$sbt_launch_mvn_release_repo" ;; - esac -} - -make_url() { - local version="$1" - - local base="${sbt_launch_repo:-$(url_base "$version")}" - - case "$version" in - 0.7.*) echo "$base/sbt-launch-0.7.7.jar" ;; - 0.10.*) echo "$base/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; - 0.11.[12]) echo "$base/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; - 0.*) echo "$base/org.scala-sbt/sbt-launch/$version/sbt-launch.jar" ;; - *) echo "$base/org/scala-sbt/sbt-launch/$version/sbt-launch-${version}.jar" ;; - esac -} - -addJava() { - vlog "[addJava] arg = '$1'" - java_args+=("$1") -} -addSbt() { - vlog "[addSbt] arg = '$1'" - sbt_commands+=("$1") -} -addScalac() { - vlog "[addScalac] arg = '$1'" - scalac_args+=("$1") -} -addResidual() { - vlog "[residual] arg = '$1'" - residual_args+=("$1") -} - -addResolver() { addSbt "set resolvers += $1"; } - -addDebugger() { addJava "-Xdebug" && addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1"; } - -setThisBuild() { - vlog "[addBuild] args = '$*'" - local key="$1" && shift - addSbt "set $key in ThisBuild := $*" -} -setScalaVersion() { - [[ "$1" == *"-SNAPSHOT" ]] && addResolver 'Resolver.sonatypeRepo("snapshots")' - addSbt "++ $1" -} -setJavaHome() { - java_cmd="$1/bin/java" - setThisBuild javaHome "_root_.scala.Some(file(\"$1\"))" - export JAVA_HOME="$1" - export JDK_HOME="$1" - export PATH="$JAVA_HOME/bin:$PATH" -} - -getJavaVersion() { - local -r str=$("$1" -version 2>&1 | grep -E -e '(java|openjdk) version' | awk '{ print $3 }' | tr -d '"') - - # java -version on java8 says 1.8.x - # but on 9 and 10 it's 9.x.y and 10.x.y. - if [[ "$str" =~ ^1\.([0-9]+)(\..*)?$ ]]; then - echo "${BASH_REMATCH[1]}" - # Fixes https://github.com/dwijnand/sbt-extras/issues/326 - elif [[ "$str" =~ ^([0-9]+)(\..*)?(-ea)?$ ]]; then - echo "${BASH_REMATCH[1]}" - elif [[ -n "$str" ]]; then - echoerr "Can't parse java version from: $str" - fi -} - -checkJava() { - # Warn if there is a Java version mismatch between PATH and JAVA_HOME/JDK_HOME - - [[ -n "$JAVA_HOME" && -e "$JAVA_HOME/bin/java" ]] && java="$JAVA_HOME/bin/java" - [[ -n "$JDK_HOME" && -e "$JDK_HOME/lib/tools.jar" ]] && java="$JDK_HOME/bin/java" - - if [[ -n "$java" ]]; then - pathJavaVersion=$(getJavaVersion java) - homeJavaVersion=$(getJavaVersion "$java") - if [[ "$pathJavaVersion" != "$homeJavaVersion" ]]; then - echoerr "Warning: Java version mismatch between PATH and JAVA_HOME/JDK_HOME, sbt will use the one in PATH" - echoerr " Either: fix your PATH, remove JAVA_HOME/JDK_HOME or use -java-home" - echoerr " java version from PATH: $pathJavaVersion" - echoerr " java version from JAVA_HOME/JDK_HOME: $homeJavaVersion" - fi - fi -} - -java_version() { - local -r version=$(getJavaVersion "$java_cmd") - vlog "Detected Java version: $version" - echo "$version" -} - -is_apple_silicon() { [[ "$(uname -s)" == "Darwin" && "$(uname -m)" == "arm64" ]]; } - -# MaxPermSize critical on pre-8 JVMs but incurs noisy warning on 8+ -default_jvm_opts() { - local -r v="$(java_version)" - if [[ $v -ge 17 ]]; then - echo "$default_jvm_opts_common" - elif [[ $v -ge 10 ]]; then - if is_apple_silicon; then - # As of Dec 2020, JVM for Apple Silicon (M1) doesn't support JVMCI - echo "$default_jvm_opts_common" - else - echo "$default_jvm_opts_common -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler" - fi - elif [[ $v -ge 8 ]]; then - echo "$default_jvm_opts_common" - else - echo "-XX:MaxPermSize=384m $default_jvm_opts_common" - fi -} - -execRunner() { - # print the arguments one to a line, quoting any containing spaces - vlog "# Executing command line:" && { - for arg; do - if [[ -n "$arg" ]]; then - if printf "%s\n" "$arg" | grep -q ' '; then - printf >&2 "\"%s\"\n" "$arg" - else - printf >&2 "%s\n" "$arg" - fi - fi - done - vlog "" - } - - setTrapExit - - if [[ -n "$batch" ]]; then - "$@" /dev/null 2>&1; then - curl --fail --silent --location "$url" --output "$jar" - elif command -v wget >/dev/null 2>&1; then - wget -q -O "$jar" "$url" - fi - } && [[ -r "$jar" ]] -} - -acquire_sbt_jar() { - { - sbt_jar="$(jar_file "$sbt_version")" - [[ -r "$sbt_jar" ]] - } || { - sbt_jar="$HOME/.ivy2/local/org.scala-sbt/sbt-launch/$sbt_version/jars/sbt-launch.jar" - [[ -r "$sbt_jar" ]] - } || { - sbt_jar="$(jar_file "$sbt_version")" - jar_url="$(make_url "$sbt_version")" - - echoerr "Downloading sbt launcher for ${sbt_version}:" - echoerr " From ${jar_url}" - echoerr " To ${sbt_jar}" - - download_url "${jar_url}" "${sbt_jar}" - - case "${sbt_version}" in - 0.*) - vlog "SBT versions < 1.0 do not have published MD5 checksums, skipping check" - echo "" - ;; - *) verify_sbt_jar "${sbt_jar}" ;; - esac - } -} - -verify_sbt_jar() { - local jar="${1}" - local md5="${jar}.md5" - md5url="$(make_url "${sbt_version}").md5" - - echoerr "Downloading sbt launcher ${sbt_version} md5 hash:" - echoerr " From ${md5url}" - echoerr " To ${md5}" - - download_url "${md5url}" "${md5}" >/dev/null 2>&1 - - if command -v md5sum >/dev/null 2>&1; then - if echo "$(cat "${md5}") ${jar}" | md5sum -c -; then - rm -rf "${md5}" - return 0 - else - echoerr "Checksum does not match" - return 1 - fi - elif command -v md5 >/dev/null 2>&1; then - if [ "$(md5 -q "${jar}")" == "$(cat "${md5}")" ]; then - rm -rf "${md5}" - return 0 - else - echoerr "Checksum does not match" - return 1 - fi - elif command -v openssl >/dev/null 2>&1; then - if [ "$(openssl md5 -r "${jar}" | awk '{print $1}')" == "$(cat "${md5}")" ]; then - rm -rf "${md5}" - return 0 - else - echoerr "Checksum does not match" - return 1 - fi - else - echoerr "Could not find an MD5 command" - return 1 - fi -} - -usage() { - set_sbt_version - cat < display stack traces with a max of frames (default: -1, traces suppressed) - -debug-inc enable debugging log for the incremental compiler - -no-colors disable ANSI color codes - -sbt-create start sbt even if current directory contains no sbt project - -sbt-dir path to global settings/plugins directory (default: ~/.sbt/) - -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11+) - -ivy path to local Ivy repository (default: ~/.ivy2) - -no-share use all local caches; no sharing - -offline put sbt in offline mode - -jvm-debug Turn on JVM debugging, open at the given port. - -batch Disable interactive mode - -prompt Set the sbt prompt; in expr, 's' is the State and 'e' is Extracted - -script Run the specified file as a scala script - - # sbt version (default: sbt.version from $buildProps if present, otherwise $sbt_release_version) - -sbt-version use the specified version of sbt (default: $sbt_release_version) - -sbt-force-latest force the use of the latest release of sbt: $sbt_release_version - -sbt-dev use the latest pre-release version of sbt: $sbt_unreleased_version - -sbt-jar use the specified jar as the sbt launcher - -sbt-launch-dir directory to hold sbt launchers (default: $sbt_launch_dir) - -sbt-launch-repo repo url for downloading sbt launcher jar (default: $(url_base "$sbt_version")) - - # scala version (default: as chosen by sbt) - -28 use $latest_28 - -29 use $latest_29 - -210 use $latest_210 - -211 use $latest_211 - -212 use $latest_212 - -213 use $latest_213 - -scala-home use the scala build at the specified directory - -scala-version use the specified version of scala - -binary-version use the specified scala version when searching for dependencies - - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) - -java-home alternate JAVA_HOME - - # passing options to the jvm - note it does NOT use JAVA_OPTS due to pollution - # The default set is used if JVM_OPTS is unset and no -jvm-opts file is found - $(default_jvm_opts) - JVM_OPTS environment variable holding either the jvm args directly, or - the reference to a file containing jvm args if given path is prepended by '@' (e.g. '@/etc/jvmopts') - Note: "@"-file is overridden by local '.jvmopts' or '-jvm-opts' argument. - -jvm-opts file containing jvm args (if not given, .jvmopts in project root is used if present) - -Dkey=val pass -Dkey=val directly to the jvm - -J-X pass option -X directly to the jvm (-J is stripped) - - # passing options to sbt, OR to this runner - SBT_OPTS environment variable holding either the sbt args directly, or - the reference to a file containing sbt args if given path is prepended by '@' (e.g. '@/etc/sbtopts') - Note: "@"-file is overridden by local '.sbtopts' or '-sbt-opts' argument. - -sbt-opts file containing sbt args (if not given, .sbtopts in project root is used if present) - -S-X add -X to sbt's scalacOptions (-S is stripped) - - # passing options exclusively to this runner - SBTX_OPTS environment variable holding either the sbt-extras args directly, or - the reference to a file containing sbt-extras args if given path is prepended by '@' (e.g. '@/etc/sbtxopts') - Note: "@"-file is overridden by local '.sbtxopts' or '-sbtx-opts' argument. - -sbtx-opts file containing sbt-extras args (if not given, .sbtxopts in project root is used if present) -EOM - exit 0 -} - -process_args() { - require_arg() { - local type="$1" - local opt="$2" - local arg="$3" - - if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then - die "$opt requires <$type> argument" - fi - } - while [[ $# -gt 0 ]]; do - case "$1" in - -h | -help) usage ;; - -v) verbose=true && shift ;; - -d) addSbt "--debug" && shift ;; - -w) addSbt "--warn" && shift ;; - -q) addSbt "--error" && shift ;; - -x) shift ;; # currently unused - -trace) require_arg integer "$1" "$2" && trace_level="$2" && shift 2 ;; - -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - - -no-colors) addJava "-Dsbt.log.noformat=true" && addJava "-Dsbt.color=false" && shift ;; - -sbt-create) sbt_create=true && shift ;; - -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;; - -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; - -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; - -no-share) noshare=true && shift ;; - -offline) addSbt "set offline in Global := true" && shift ;; - -jvm-debug) require_arg port "$1" "$2" && addDebugger "$2" && shift 2 ;; - -batch) batch=true && shift ;; - -prompt) require_arg "expr" "$1" "$2" && setThisBuild shellPrompt "(s => { val e = Project.extract(s) ; $2 })" && shift 2 ;; - -script) require_arg file "$1" "$2" && sbt_script="$2" && addJava "-Dsbt.main.class=sbt.ScriptMain" && shift 2 ;; - - -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;; - -sbt-force-latest) sbt_explicit_version="$sbt_release_version" && shift ;; - -sbt-dev) sbt_explicit_version="$sbt_unreleased_version" && shift ;; - -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;; - -sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;; - -sbt-launch-repo) require_arg path "$1" "$2" && sbt_launch_repo="$2" && shift 2 ;; - - -28) setScalaVersion "$latest_28" && shift ;; - -29) setScalaVersion "$latest_29" && shift ;; - -210) setScalaVersion "$latest_210" && shift ;; - -211) setScalaVersion "$latest_211" && shift ;; - -212) setScalaVersion "$latest_212" && shift ;; - -213) setScalaVersion "$latest_213" && shift ;; - - -scala-version) require_arg version "$1" "$2" && setScalaVersion "$2" && shift 2 ;; - -binary-version) require_arg version "$1" "$2" && setThisBuild scalaBinaryVersion "\"$2\"" && shift 2 ;; - -scala-home) require_arg path "$1" "$2" && setThisBuild scalaHome "_root_.scala.Some(file(\"$2\"))" && shift 2 ;; - -java-home) require_arg path "$1" "$2" && setJavaHome "$2" && shift 2 ;; - -sbt-opts) require_arg path "$1" "$2" && sbt_opts_file="$2" && shift 2 ;; - -sbtx-opts) require_arg path "$1" "$2" && sbtx_opts_file="$2" && shift 2 ;; - -jvm-opts) require_arg path "$1" "$2" && jvm_opts_file="$2" && shift 2 ;; - - -D*) addJava "$1" && shift ;; - -J*) addJava "${1:2}" && shift ;; - -S*) addScalac "${1:2}" && shift ;; - - new) sbt_new=true && : ${sbt_explicit_version:=$sbt_release_version} && addResidual "$1" && shift ;; - - *) addResidual "$1" && shift ;; - esac - done -} - -# process the direct command line arguments -process_args "$@" - -# skip #-styled comments and blank lines -readConfigFile() { - local end=false - until $end; do - read -r || end=true - [[ $REPLY =~ ^# ]] || [[ -z $REPLY ]] || echo "$REPLY" - done <"$1" -} - -# if there are file/environment sbt_opts, process again so we -# can supply args to this runner -if [[ -r "$sbt_opts_file" ]]; then - vlog "Using sbt options defined in file $sbt_opts_file" - while read -r opt; do extra_sbt_opts+=("$opt"); done < <(readConfigFile "$sbt_opts_file") -elif [[ -n "$SBT_OPTS" && ! ("$SBT_OPTS" =~ ^@.*) ]]; then - vlog "Using sbt options defined in variable \$SBT_OPTS" - IFS=" " read -r -a extra_sbt_opts <<<"$SBT_OPTS" -else - vlog "No extra sbt options have been defined" -fi - -# if there are file/environment sbtx_opts, process again so we -# can supply args to this runner -if [[ -r "$sbtx_opts_file" ]]; then - vlog "Using sbt options defined in file $sbtx_opts_file" - while read -r opt; do extra_sbt_opts+=("$opt"); done < <(readConfigFile "$sbtx_opts_file") -elif [[ -n "$SBTX_OPTS" && ! ("$SBTX_OPTS" =~ ^@.*) ]]; then - vlog "Using sbt options defined in variable \$SBTX_OPTS" - IFS=" " read -r -a extra_sbt_opts <<<"$SBTX_OPTS" -else - vlog "No extra sbt options have been defined" -fi - -[[ -n "${extra_sbt_opts[*]}" ]] && process_args "${extra_sbt_opts[@]}" - -# reset "$@" to the residual args -set -- "${residual_args[@]}" -argumentCount=$# - -# set sbt version -set_sbt_version - -checkJava - -# only exists in 0.12+ -setTraceLevel() { - case "$sbt_version" in - "0.7."* | "0.10."* | "0.11."*) echoerr "Cannot set trace level in sbt version $sbt_version" ;; - *) setThisBuild traceLevel "$trace_level" ;; - esac -} - -# set scalacOptions if we were given any -S opts -[[ ${#scalac_args[@]} -eq 0 ]] || addSbt "set scalacOptions in ThisBuild += \"${scalac_args[*]}\"" - -[[ -n "$sbt_explicit_version" && -z "$sbt_new" ]] && addJava "-Dsbt.version=$sbt_explicit_version" -vlog "Detected sbt version $sbt_version" - -if [[ -n "$sbt_script" ]]; then - residual_args=("$sbt_script" "${residual_args[@]}") -else - # no args - alert them there's stuff in here - ((argumentCount > 0)) || { - vlog "Starting $script_name: invoke with -help for other options" - residual_args=(shell) - } -fi - -# verify this is an sbt dir, -create was given or user attempts to run a scala script -[[ -r ./build.sbt || -d ./project || -n "$sbt_create" || -n "$sbt_script" || -n "$sbt_new" ]] || { - cat < 0) def getRandomWorlds(queries: Int): Future[Seq[Option[JsObject]]] = { @@ -35,7 +36,7 @@ class Application (val controllerComponents: ControllerComponents, reactiveMongo def getFortunes: Future[List[JsObject]] = { fortuneCollection.map(_.find(Json.obj(), Option.empty[JsObject]) - .cursor[JsObject](ReadPreference.primaryPreferred, false).collect[List](Int.MaxValue, (v, t) => Cursor.Fail(t))).flatten + .cursor[JsObject](ReadPreference.primaryPreferred).collect[List](Int.MaxValue, (v, t) => Cursor.Fail(t))).flatten } def updateWorlds(queries: Int): Future[Seq[JsObject]] = { @@ -43,7 +44,7 @@ class Application (val controllerComponents: ControllerComponents, reactiveMongo .map(_.flatten) .map(_.map(oldWorld => { val newWorld = oldWorld ++ Json.obj("randomNumber" -> getNextRandom) - worldCollection.map(_.update(oldWorld, newWorld).map(result => newWorld)).flatten + worldCollection.map(_.update.one(oldWorld, newWorld).map(result => newWorld)).flatten })) .map(Future.sequence(_)) .flatten diff --git a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/build.sbt b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/build.sbt index 484d2038b02..0ea31e4f2c5 100644 --- a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/build.sbt +++ b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/build.sbt @@ -4,11 +4,11 @@ version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayScala, PlayNettyServer).disablePlugins(PlayFilters) -scalaVersion := "2.13.1" +scalaVersion := "2.13.16" libraryDependencies ++= Seq( - "org.reactivemongo" %% "play2-reactivemongo" % "0.20.3-play28", - "org.reactivemongo" %% "reactivemongo-play-json" % "0.20.3-play28", + "org.reactivemongo" %% "play2-reactivemongo" % "1.1.0-play29.RC15", + "org.reactivemongo" %% "reactivemongo-play-json-compat" % "1.1.0-play29.RC15", "com.softwaremill.macwire" %% "macros" % "2.3.3", "com.softwaremill.macwire" %% "util" % "2.3.3" ) diff --git a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/conf/application.conf b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/conf/application.conf index 56322983166..f2d6222c163 100755 --- a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/conf/application.conf +++ b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/conf/application.conf @@ -25,8 +25,8 @@ play.server { option { SO_BACKLOG = 8192 SO_REUSEADDR = true - "io.netty.channel.epoll.EpollChannelOption#SO_REUSEPORT" = true - "io.netty.channel.epoll.EpollChannelOption#TCP_FASTOPEN" = 1 + "io.netty.channel.unix.UnixChannelOption#SO_REUSEPORT" = true + "io.netty.channel.ChannelOption#TCP_FASTOPEN" = 1 child { SO_KEEPALIVE = true @@ -36,7 +36,7 @@ play.server { # The default is 1 since Linux Kernel 3.13 # You can check via "cat /proc/sys/net/ipv4/tcp_fastopen" # However 3 would be better, but we can't change it to that value because we don't have root permission when running the benchmarks - "io.netty.channel.epoll.EpollChannelOption#TCP_FASTOPEN" = 1 + "io.netty.channel.ChannelOption#TCP_FASTOPEN" = 1 } } } diff --git a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/build.properties b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/build.properties index a919a9b5f46..cc68b53f1a3 100644 --- a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/build.properties +++ b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/build.properties @@ -1 +1 @@ -sbt.version=1.3.8 +sbt.version=1.10.11 diff --git a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/plugins.sbt b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/plugins.sbt index 47b7a413447..767dc8b1d7e 100644 --- a/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/plugins.sbt +++ b/frameworks/Scala/play2-scala/play2-scala-reactivemongo/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.1") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.9.7") diff --git a/frameworks/Scala/play2-scala/play2-scala-slick-netty.dockerfile b/frameworks/Scala/play2-scala/play2-scala-slick-netty.dockerfile index 6678a3bf7b4..bf4b513c63b 100644 --- a/frameworks/Scala/play2-scala/play2-scala-slick-netty.dockerfile +++ b/frameworks/Scala/play2-scala/play2-scala-slick-netty.dockerfile @@ -1,4 +1,4 @@ -FROM hseeberger/scala-sbt:8u242_1.3.8_2.13.1 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 WORKDIR /play2 COPY play2-scala-slick . @@ -8,4 +8,4 @@ RUN sbt stage EXPOSE 9000 -CMD target/universal/stage/bin/play2-scala-slick -Dplay.server.provider=play.core.server.NettyServerProvider -J-server -J-Xms1g -J-Xmx1g -J-XX:NewSize=512m -J-XX:+UseG1GC -J-XX:MaxGCPauseMillis=30 -J-XX:-UseBiasedLocking -J-XX:+AlwaysPreTouch -Dthread_count=$(nproc) -Dphysical_cpu_count=$(grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}') -Ddb_pool_size=$(( $(( $(nproc) * 2 )) + 1 )) +CMD target/universal/stage/bin/play2-scala-slick -Dplay.server.provider=play.core.server.NettyServerProvider -J-server -J-Xms1g -J-Xmx1g -J-XX:NewSize=512m -J-XX:+UseG1GC -J-XX:MaxGCPauseMillis=30 -J-XX:+AlwaysPreTouch -Dthread_count=$(nproc) -Dphysical_cpu_count=$(grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}') -Ddb_pool_size=$(( $(( $(nproc) * 2 )) + 1 )) diff --git a/frameworks/Scala/play2-scala/play2-scala-slick.dockerfile b/frameworks/Scala/play2-scala/play2-scala-slick.dockerfile index 50b4a87a59f..b2b45920454 100644 --- a/frameworks/Scala/play2-scala/play2-scala-slick.dockerfile +++ b/frameworks/Scala/play2-scala/play2-scala-slick.dockerfile @@ -1,4 +1,4 @@ -FROM hseeberger/scala-sbt:8u242_1.3.8_2.13.1 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 WORKDIR /play2 COPY play2-scala-slick . @@ -8,4 +8,4 @@ RUN sbt stage EXPOSE 9000 -CMD target/universal/stage/bin/play2-scala-slick -Dplay.server.provider=play.core.server.AkkaHttpServerProvider -J-server -J-Xms1g -J-Xmx1g -J-XX:NewSize=512m -J-XX:+UseG1GC -J-XX:MaxGCPauseMillis=30 -J-XX:-UseBiasedLocking -J-XX:+AlwaysPreTouch -Dthread_count=$(nproc) -Dphysical_cpu_count=$(grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}') -Ddb_pool_size=$(( $(( $(nproc) * 2 )) + 1 )) +CMD target/universal/stage/bin/play2-scala-slick -Dplay.server.provider=play.core.server.AkkaHttpServerProvider -J-server -J-Xms1g -J-Xmx1g -J-XX:NewSize=512m -J-XX:+UseG1GC -J-XX:MaxGCPauseMillis=30 -J-XX:+AlwaysPreTouch -Dthread_count=$(nproc) -Dphysical_cpu_count=$(grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}') -Ddb_pool_size=$(( $(( $(nproc) * 2 )) + 1 )) diff --git a/frameworks/Scala/play2-scala/play2-scala-slick/app/controllers/Application.scala b/frameworks/Scala/play2-scala/play2-scala-slick/app/controllers/Application.scala index f3f7178a03d..2c128a01228 100644 --- a/frameworks/Scala/play2-scala/play2-scala-slick/app/controllers/Application.scala +++ b/frameworks/Scala/play2-scala/play2-scala-slick/app/controllers/Application.scala @@ -23,15 +23,11 @@ class Application @Inject() (fortunesDAO: FortunesDAO, worldDAO: WorldDAO, val c fortunesDAO.getAll() } - def updateWorlds(n: Int): Future[Seq[World]] = { - val worlds: Seq[Future[World]] = for (_ <- 1 to n) yield { - val futureWorld: Future[World] = worldDAO.findById(getNextRandom) - val futureUpdatedWorld: Future[World] = futureWorld.map(_.copy(randomNumber = getNextRandom)) - futureUpdatedWorld.map(world => worldDAO.updateRandom(world)) - futureUpdatedWorld - } - Future.sequence(worlds) - } + def updateWorlds(n: Int): Future[Seq[World]] = for { + worlds <- getRandomWorlds(n) + updatedWorlds = worlds.map(_.copy(randomNumber = getNextRandom)) + _ <- worldDAO.updateRandom(updatedWorlds) + } yield updatedWorlds def getNextRandom: Int = { ThreadLocalRandom.current().nextInt(TestDatabaseRows) + 1 diff --git a/frameworks/Scala/play2-scala/play2-scala-slick/app/models/World.scala b/frameworks/Scala/play2-scala/play2-scala-slick/app/models/World.scala index 739175109ad..e66f347e468 100644 --- a/frameworks/Scala/play2-scala/play2-scala-slick/app/models/World.scala +++ b/frameworks/Scala/play2-scala/play2-scala-slick/app/models/World.scala @@ -34,8 +34,14 @@ class WorldDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) db.run(Worlds.filter(_.id === id).result.head) } - def updateRandom(world: World) = { - db.run(Worlds.filter(_.id === world.id).map(_.randomNumber).update(world.randomNumber)) + def updateRandom(updatedWorlds: Seq[World]): Future[Seq[Int]] = { + val updateActions = updatedWorlds.map { uw => + Worlds.filter(_.id === uw.id).map(_.randomNumber).update(uw.randomNumber) + } + + val combinedUpdateAction: DBIO[Seq[Int]] = DBIO.sequence(updateActions) + + db.run(combinedUpdateAction) } } diff --git a/frameworks/Scala/play2-scala/play2-scala-slick/build.sbt b/frameworks/Scala/play2-scala/play2-scala-slick/build.sbt index ed63d326af0..21629d238c8 100644 --- a/frameworks/Scala/play2-scala/play2-scala-slick/build.sbt +++ b/frameworks/Scala/play2-scala/play2-scala-slick/build.sbt @@ -4,11 +4,11 @@ version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayScala, PlayNettyServer).disablePlugins(PlayFilters) -scalaVersion := "2.13.1" +scalaVersion := "2.13.16" libraryDependencies ++= Seq( guice, - "com.typesafe.play" %% "play-slick" % "5.0.0", - "mysql" % "mysql-connector-java" % "8.0.19", + "com.typesafe.play" %% "play-slick" % "5.3.0", + "mysql" % "mysql-connector-java" % "8.0.33", filters ) diff --git a/frameworks/Scala/play2-scala/play2-scala-slick/conf/application.conf b/frameworks/Scala/play2-scala/play2-scala-slick/conf/application.conf index b521fcfa503..c25f8b35fcb 100755 --- a/frameworks/Scala/play2-scala/play2-scala-slick/conf/application.conf +++ b/frameworks/Scala/play2-scala/play2-scala-slick/conf/application.conf @@ -29,8 +29,8 @@ play.server { option { SO_BACKLOG = 8192 SO_REUSEADDR = true - "io.netty.channel.epoll.EpollChannelOption#SO_REUSEPORT" = true - "io.netty.channel.epoll.EpollChannelOption#TCP_FASTOPEN" = 1 + "io.netty.channel.unix.UnixChannelOption#SO_REUSEPORT" = true + "io.netty.channel.ChannelOption#TCP_FASTOPEN" = 1 child { SO_KEEPALIVE = true @@ -40,7 +40,7 @@ play.server { # The default is 1 since Linux Kernel 3.13 # You can check via "cat /proc/sys/net/ipv4/tcp_fastopen" # However 3 would be better, but we can't change it to that value because we don't have root permission when running the benchmarks - "io.netty.channel.epoll.EpollChannelOption#TCP_FASTOPEN" = 1 + "io.netty.channel.ChannelOption#TCP_FASTOPEN" = 1 } } } @@ -78,7 +78,7 @@ slick.dbs.default { profile="slick.jdbc.MySQLProfile$" db { connectionPool=HikariCP - driver="com.mysql.jdbc.Driver" + driver="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://tfb-database:3306/hello_world" user="benchmarkdbuser" password="benchmarkdbpass" @@ -90,7 +90,7 @@ slick.dbs.default { numThreads=17 numThreads=${?db_pool_size} - queueSize=2000 + queueSize=20000 properties { characterEncoding=UTF-8 diff --git a/frameworks/Scala/play2-scala/play2-scala-slick/project/build.properties b/frameworks/Scala/play2-scala/play2-scala-slick/project/build.properties index a919a9b5f46..cc68b53f1a3 100644 --- a/frameworks/Scala/play2-scala/play2-scala-slick/project/build.properties +++ b/frameworks/Scala/play2-scala/play2-scala-slick/project/build.properties @@ -1 +1 @@ -sbt.version=1.3.8 +sbt.version=1.10.11 diff --git a/frameworks/Scala/play2-scala/play2-scala-slick/project/plugins.sbt b/frameworks/Scala/play2-scala/play2-scala-slick/project/plugins.sbt index 47b7a413447..8ea96fc564c 100644 --- a/frameworks/Scala/play2-scala/play2-scala-slick/project/plugins.sbt +++ b/frameworks/Scala/play2-scala/play2-scala-slick/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.1") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.9.7") \ No newline at end of file diff --git a/frameworks/Scala/play2-scala/play2-scala.dockerfile b/frameworks/Scala/play2-scala/play2-scala.dockerfile index 1f46df4a0bc..e555c2879a4 100644 --- a/frameworks/Scala/play2-scala/play2-scala.dockerfile +++ b/frameworks/Scala/play2-scala/play2-scala.dockerfile @@ -1,4 +1,4 @@ -FROM hseeberger/scala-sbt:8u242_1.3.8_2.13.1 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 WORKDIR /play2 COPY play2-scala . @@ -8,4 +8,4 @@ RUN sbt stage EXPOSE 9000 -CMD target/universal/stage/bin/play2-scala -Dplay.server.provider=play.core.server.AkkaHttpServerProvider -J-server -J-Xms1g -J-Xmx1g -J-XX:NewSize=512m -J-XX:+UseG1GC -J-XX:MaxGCPauseMillis=30 -J-XX:-UseBiasedLocking -J-XX:+AlwaysPreTouch -Dthread_count=$(nproc) -Dphysical_cpu_count=$(grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}') +CMD target/universal/stage/bin/play2-scala -Dplay.server.provider=play.core.server.AkkaHttpServerProvider -J-server -J-Xms1g -J-Xmx1g -J-XX:NewSize=512m -J-XX:+UseG1GC -J-XX:MaxGCPauseMillis=30 -J-XX:+AlwaysPreTouch -Dthread_count=$(nproc) -Dphysical_cpu_count=$(grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}') diff --git a/frameworks/Scala/play2-scala/play2-scala/build.sbt b/frameworks/Scala/play2-scala/play2-scala/build.sbt index 6a78172d066..3604ffba99c 100644 --- a/frameworks/Scala/play2-scala/play2-scala/build.sbt +++ b/frameworks/Scala/play2-scala/play2-scala/build.sbt @@ -4,6 +4,6 @@ version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayScala, PlayNettyServer).disablePlugins(PlayFilters) -scalaVersion := "2.13.1" +scalaVersion := "2.13.16" libraryDependencies += guice \ No newline at end of file diff --git a/frameworks/Scala/play2-scala/play2-scala/conf/application.conf b/frameworks/Scala/play2-scala/play2-scala/conf/application.conf index 458e92dbff2..6b9a46aff98 100755 --- a/frameworks/Scala/play2-scala/play2-scala/conf/application.conf +++ b/frameworks/Scala/play2-scala/play2-scala/conf/application.conf @@ -29,8 +29,8 @@ play.server { option { SO_BACKLOG = 8192 SO_REUSEADDR = true - "io.netty.channel.epoll.EpollChannelOption#SO_REUSEPORT" = true - "io.netty.channel.epoll.EpollChannelOption#TCP_FASTOPEN" = 1 + "io.netty.channel.unix.UnixChannelOption#SO_REUSEPORT" = true + "io.netty.channel.ChannelOption#TCP_FASTOPEN" = 1 child { SO_KEEPALIVE = true @@ -40,7 +40,7 @@ play.server { # The default is 1 since Linux Kernel 3.13 # You can check via "cat /proc/sys/net/ipv4/tcp_fastopen" # However 3 would be better, but we can't change it to that value because we don't have root permission when running the benchmarks - "io.netty.channel.epoll.EpollChannelOption#TCP_FASTOPEN" = 1 + "io.netty.channel.ChannelOption#TCP_FASTOPEN" = 1 } } } diff --git a/frameworks/Scala/play2-scala/play2-scala/project/build.properties b/frameworks/Scala/play2-scala/play2-scala/project/build.properties index a919a9b5f46..cc68b53f1a3 100644 --- a/frameworks/Scala/play2-scala/play2-scala/project/build.properties +++ b/frameworks/Scala/play2-scala/play2-scala/project/build.properties @@ -1 +1 @@ -sbt.version=1.3.8 +sbt.version=1.10.11 diff --git a/frameworks/Scala/play2-scala/play2-scala/project/plugins.sbt b/frameworks/Scala/play2-scala/play2-scala/project/plugins.sbt index 47b7a413447..767dc8b1d7e 100644 --- a/frameworks/Scala/play2-scala/play2-scala/project/plugins.sbt +++ b/frameworks/Scala/play2-scala/play2-scala/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.1") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.9.7") diff --git a/frameworks/Scala/scalene/scalene.dockerfile b/frameworks/Scala/scalene/scalene.dockerfile index 469e2c972ca..1741c321e7d 100644 --- a/frameworks/Scala/scalene/scalene.dockerfile +++ b/frameworks/Scala/scalene/scalene.dockerfile @@ -1,14 +1,4 @@ -FROM adoptopenjdk/openjdk13 - -RUN apt-get update -yqq -RUN apt-get install -yqq gnupg git - -# Install sbt -RUN echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list -RUN echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | tee /etc/apt/sources.list.d/sbt_old.list -RUN curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | apt-key add -RUN apt-get update -yqq -RUN apt-get install -yqq sbt +FROM sbtscala/scala-sbt:eclipse-temurin-17.0.14_7_1.10.11_2.13.16 WORKDIR /scalene COPY project project diff --git a/frameworks/Scala/sharaf/.mill-version b/frameworks/Scala/sharaf/.mill-version index 1b3f5e2da8a..f5f40dc335b 100644 --- a/frameworks/Scala/sharaf/.mill-version +++ b/frameworks/Scala/sharaf/.mill-version @@ -1 +1 @@ -0.12.8 \ No newline at end of file +0.12.10 \ No newline at end of file diff --git a/frameworks/Scala/sharaf/sharaf.dockerfile b/frameworks/Scala/sharaf/sharaf.dockerfile index e2743d08638..44702c90b16 100644 --- a/frameworks/Scala/sharaf/sharaf.dockerfile +++ b/frameworks/Scala/sharaf/sharaf.dockerfile @@ -1,4 +1,4 @@ -FROM eclipse-temurin:21-jdk-ubi9-minimal +FROM nightscape/scala-mill:eclipse-temurin-21.0.6_7-jdk-jammy_0.12.10 WORKDIR /sharaf COPY src src diff --git a/frameworks/Scala/vertx-web-scala/build.sbt b/frameworks/Scala/vertx-web-scala/build.sbt index 668c7c86e16..5a75b7a6502 100644 --- a/frameworks/Scala/vertx-web-scala/build.sbt +++ b/frameworks/Scala/vertx-web-scala/build.sbt @@ -2,7 +2,7 @@ name := "vertx-web-scala" version := "1" -scalaVersion := "2.12.17" +scalaVersion := "2.12.20" lazy val root = (project in file(".")).enablePlugins(SbtTwirl) diff --git a/frameworks/Scala/vertx-web-scala/project/build.properties b/frameworks/Scala/vertx-web-scala/project/build.properties index 46e43a97ed8..cc68b53f1a3 100644 --- a/frameworks/Scala/vertx-web-scala/project/build.properties +++ b/frameworks/Scala/vertx-web-scala/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.2 +sbt.version=1.10.11 diff --git a/frameworks/Scala/vertx-web-scala/vertx-web-scala.dockerfile b/frameworks/Scala/vertx-web-scala/vertx-web-scala.dockerfile index 536e92fe8fe..047d042d2dc 100644 --- a/frameworks/Scala/vertx-web-scala/vertx-web-scala.dockerfile +++ b/frameworks/Scala/vertx-web-scala/vertx-web-scala.dockerfile @@ -1,4 +1,4 @@ -FROM sbtscala/scala-sbt:eclipse-temurin-17.0.5_8_1.8.2_2.12.17 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.12.20 ARG SBT_VERSION=1.8.2 diff --git a/frameworks/Scala/youi/build.sbt b/frameworks/Scala/youi/build.sbt index f9bf305fbbd..9a91d56bdfb 100644 --- a/frameworks/Scala/youi/build.sbt +++ b/frameworks/Scala/youi/build.sbt @@ -1,6 +1,6 @@ name := "youi-server" version := "1.0" -scalaVersion := "2.13.3" +scalaVersion := "2.13.16" libraryDependencies ++= Seq( "io.youi" %% "youi-server" % "0.13.17", diff --git a/frameworks/Scala/youi/project/build.properties b/frameworks/Scala/youi/project/build.properties index b80399a6ad9..af06c851bbb 100644 --- a/frameworks/Scala/youi/project/build.properties +++ b/frameworks/Scala/youi/project/build.properties @@ -1 +1 @@ -sbt.version=1.4.2 \ No newline at end of file +sbt.version=1.10.11 \ No newline at end of file diff --git a/frameworks/Scala/youi/project/plugins.sbt b/frameworks/Scala/youi/project/plugins.sbt index 53ea63437dd..0750d5f24e1 100644 --- a/frameworks/Scala/youi/project/plugins.sbt +++ b/frameworks/Scala/youi/project/plugins.sbt @@ -1 +1,3 @@ -addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.13") \ No newline at end of file +addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.13") + +libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % "always" diff --git a/frameworks/Scala/youi/youi.dockerfile b/frameworks/Scala/youi/youi.dockerfile index 8b69d3a395f..7ff252d0a5e 100644 --- a/frameworks/Scala/youi/youi.dockerfile +++ b/frameworks/Scala/youi/youi.dockerfile @@ -1,4 +1,4 @@ -FROM hseeberger/scala-sbt:8u151-2.12.5-1.1.2 +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 WORKDIR /youi COPY project project COPY src src From 42dd01b26f0bfd37df2e03bd6381e00b5e4031cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 04:50:41 +0000 Subject: [PATCH 1400/1766] Bump nokogiri from 1.18.4 to 1.18.8 in /frameworks/Ruby/rails Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.4 to 1.18.8. - [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.18.4...v1.18.8) --- updated-dependencies: - dependency-name: nokogiri dependency-version: 1.18.8 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 170c3127452..a2f99e86af3 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -174,12 +174,12 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.18.4) + nokogiri (1.18.8) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.4-x86_64-darwin) + nokogiri (1.18.8-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.4-x86_64-linux-gnu) + nokogiri (1.18.8-x86_64-linux-gnu) racc (~> 1.4) openssl (3.3.0) pg (1.5.9) From 14957ae9e4fee933afdb5b365025573f3f0b16dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 05:09:22 +0000 Subject: [PATCH 1401/1766] Bump gunicorn from 20.0.4 to 23.0.0 in /frameworks/Python/apidaora Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 20.0.4 to 23.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/20.0.4...23.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-version: 23.0.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 4fec7b15d4f..532c2b27bdd 100644 --- a/frameworks/Python/apidaora/requirements.txt +++ b/frameworks/Python/apidaora/requirements.txt @@ -1,5 +1,5 @@ asyncpg==0.21.0 -gunicorn==20.0.4 +gunicorn==23.0.0 jinja2==3.1.6 uvloop==0.14.0 uvicorn==0.11.7 From b49cf15afd7a4bd14f514f067ebd5418092cf769 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Tue, 22 Apr 2025 17:29:53 +0200 Subject: [PATCH 1402/1766] Updates to Vert.x (#9855) * Use a reasonnable pipelining limit value * Bump Vert.x to OpenJDK 24 * Update vertx transport section to use io_uring on Linux --- frameworks/Java/vertx/pom.xml | 104 +++++++++++++++--- .../Java/vertx/src/main/java/vertx/App.java | 2 +- .../Java/vertx/vertx-postgres.dockerfile | 8 +- frameworks/Java/vertx/vertx.dockerfile | 4 +- 4 files changed, 99 insertions(+), 19 deletions(-) diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index a827456676c..15bac6dd2a4 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -41,18 +41,6 @@ jsonsergen 0.0.5 - - io.netty - netty-transport-native-kqueue - ${netty.version} - osx-x86_64 - - - io.netty - netty-transport-native-epoll - ${netty.version} - linux-x86_64 - com.github.ben-manes.caffeine caffeine @@ -149,9 +137,30 @@ - Linux + linux-x86_64 + + + linux + x86_64 + + + + + io.netty + netty-transport-native-io_uring + ${netty.version} + linux-x86_64 + + + + + + linux-amd64 - false + + linux + amd64 + @@ -162,6 +171,73 @@ + + + linux-aarch64 + + + linux + aarch64 + + + + + io.netty + netty-transport-native-io_uring + ${netty.version} + linux-aarch_64 + + + + + + osx-x86_64 + + + mac + x86_64 + + + + + io.netty + netty-resolver-dns-native-macos + ${netty.version} + osx-x86_64 + + + io.netty + netty-transport-native-kqueue + ${netty.version} + osx-x86_64 + + + + + + osx-aarch64 + + + mac + aarch64 + + + + + io.netty + netty-resolver-dns-native-macos + ${netty.version} + osx-aarch_64 + + + io.netty + netty-transport-native-kqueue + ${netty.version} + osx-aarch_64 + + + + diff --git a/frameworks/Java/vertx/src/main/java/vertx/App.java b/frameworks/Java/vertx/src/main/java/vertx/App.java index ca9d0929cca..9cadce1efbb 100755 --- a/frameworks/Java/vertx/src/main/java/vertx/App.java +++ b/frameworks/Java/vertx/src/main/java/vertx/App.java @@ -171,7 +171,7 @@ public void start(Promise startPromise) throws Exception { options.setPassword(config.getString("password", "benchmarkdbpass")); options.setCachePreparedStatements(true); options.setPreparedStatementCacheMaxSize(1024); - options.setPipeliningLimit(100_000); // Large pipelining means less flushing and we use a single connection anyway + options.setPipeliningLimit(256); // Large pipelining means less flushing and we use a single connection anyway Future clientsInit = initClients(options); clientsInit .transform(ar -> { diff --git a/frameworks/Java/vertx/vertx-postgres.dockerfile b/frameworks/Java/vertx/vertx-postgres.dockerfile index 95e731f2d9a..afcb00f4866 100644 --- a/frameworks/Java/vertx/vertx-postgres.dockerfile +++ b/frameworks/Java/vertx/vertx-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 as maven +FROM maven:3.9.9-eclipse-temurin-24-noble as maven WORKDIR /vertx COPY src src COPY pom.xml pom.xml @@ -9,6 +9,9 @@ EXPOSE 8080 CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ sed -i "s|tfb-database|$DBIP|g" /vertx/src/main/conf/config.json && \ java \ + --enable-native-access=ALL-UNNAMED \ + --sun-misc-unsafe-memory-access=allow \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ -Xms2G \ -Xmx2G \ -server \ @@ -22,7 +25,8 @@ CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ -Dvertx.cacheImmutableHttpResponseHeaders=true \ -Dvertx.internCommonHttpRequestHeadersToLowerCase=true \ -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ - -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.noUnsafe=false \ + -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ -jar \ target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar \ diff --git a/frameworks/Java/vertx/vertx.dockerfile b/frameworks/Java/vertx/vertx.dockerfile index 27c34140e64..e78d0ff9038 100644 --- a/frameworks/Java/vertx/vertx.dockerfile +++ b/frameworks/Java/vertx/vertx.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 as maven +FROM maven:3.9.9-eclipse-temurin-24-noble as maven WORKDIR /vertx COPY src src COPY pom.xml pom.xml @@ -6,4 +6,4 @@ RUN mvn package -q EXPOSE 8080 -CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableWebsockets=true", "-Dvertx.disableContextTimings=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.cacheImmutableHttpResponseHeaders=true", "-Dvertx.internCommonHttpRequestHeadersToLowerCase=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] +CMD ["java", "--enable-native-access=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "--add-opens=java.base/java.lang=ALL-UNNAMED", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableWebsockets=true", "-Dvertx.disableContextTimings=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.cacheImmutableHttpResponseHeaders=true", "-Dvertx.internCommonHttpRequestHeadersToLowerCase=true", "-Dio.netty.noUnsafe=false", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] From cb3399673e0e83c506960580d296f2344ac6ef22 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Tue, 22 Apr 2025 16:32:13 +0100 Subject: [PATCH 1403/1766] [aiohttp] Disable access logging (#9844) * [aiohttp] Disable access logging * Update requirements.txt * Yanked version --- frameworks/Python/aiohttp/app/app.py | 2 +- frameworks/Python/aiohttp/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Python/aiohttp/app/app.py b/frameworks/Python/aiohttp/app/app.py index cea253aecbb..ae8b74c1414 100644 --- a/frameworks/Python/aiohttp/app/app.py +++ b/frameworks/Python/aiohttp/app/app.py @@ -11,4 +11,4 @@ args = parser.parse_args() app = create_app() - web.run_app(app, path=args.socket) \ No newline at end of file + web.run_app(app, path=args.socket, access_log=None) diff --git a/frameworks/Python/aiohttp/requirements.txt b/frameworks/Python/aiohttp/requirements.txt index 715d878a602..7729cae3c1d 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.11.16 +aiohttp==3.11.18 asyncpg==0.30.0 jinja2==3.1.6 SQLAlchemy==2.0.40 From 49e93a1fe56be9730f877de9b7ceb190198452b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Tue, 22 Apr 2025 23:40:23 +0800 Subject: [PATCH 1404/1766] Upgrade hyperlane (#9843) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' --- frameworks/Rust/hyperlane/Cargo.lock | 117 ++++++++---------- frameworks/Rust/hyperlane/Cargo.toml | 13 +- .../Rust/hyperlane/benchmark_config.json | 94 +++++++++++++- .../hyperlane.cached_query.dockerfile | 15 +++ ...ane.dockerfile => hyperlane.db.dockerfile} | 2 +- .../hyperlane/hyperlane.fortunes.dockerfile | 15 +++ .../Rust/hyperlane/hyperlane.json.dockerfile | 15 +++ .../hyperlane/hyperlane.plaintext.dockerfile | 15 +++ .../Rust/hyperlane/hyperlane.query.dockerfile | 15 +++ .../hyperlane/hyperlane.update.dockerfile | 15 +++ frameworks/Rust/hyperlane/src/db.rs | 38 +++--- frameworks/Rust/hyperlane/src/main.rs | 11 +- .../Rust/hyperlane/src/request_middleware.rs | 25 +++- frameworks/Rust/hyperlane/src/route.rs | 18 +-- frameworks/Rust/hyperlane/src/server.rs | 33 +++-- 15 files changed, 327 insertions(+), 114 deletions(-) create mode 100644 frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile rename frameworks/Rust/hyperlane/{hyperlane.dockerfile => hyperlane.db.dockerfile} (91%) create mode 100644 frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile create mode 100644 frameworks/Rust/hyperlane/hyperlane.json.dockerfile create mode 100644 frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile create mode 100644 frameworks/Rust/hyperlane/hyperlane.query.dockerfile create mode 100644 frameworks/Rust/hyperlane/hyperlane.update.dockerfile diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 98d910ea035..f6b37ff672b 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -173,11 +173,11 @@ checksum = "fc3dfae702af156917c65f4ccc70687088331f0b694e5e687453e4d68a16b496" [[package]] name = "color-output" -version = "6.6.0" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d465b5dc60106412924964948f7e5c0c1f023e6b45fa451aad4110480bd750" +checksum = "47a70e27f954a060626fdba6829cdded6c3dae6376d0e03822363114aaead8a8" dependencies = [ - "hyperlane-time 0.4.0", + "hyperlane-time", ] [[package]] @@ -269,9 +269,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "pem-rfc7468", @@ -362,9 +362,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "file-operation" -version = "0.5.6" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef3359808cbde3797c90abf4faed2f559acc51b6cefb384583e5fe0e62945119" +checksum = "78548b84eac71fe0f185f2169fa960f65af6e49ae2b63fdb729e81cacdf7b5da" dependencies = [ "tokio", ] @@ -638,9 +638,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce740ff69923dba33591c2c625bb49ccc098264c19e72d004b6fecca7c7d7d7" +checksum = "c5f7d507f95e723dd293f5c486554ab1e70692ee97c27fc4a493684f54dc6c9a" dependencies = [ "brotli", "flate2", @@ -649,15 +649,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.42.0" +version = "1.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c978c76917568ef84ce5020d6b1fa49ce74a4dd65bc290b93b1355a81aebdb9e" +checksum = "1292cbdcf2588d15f8bf14cac381785c11ca7634d6a088cad9eebb5068d2652b" [[package]] name = "http-type" -version = "3.64.0" +version = "3.64.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228db23663f214e42497ed0fc66ddab4c7fea8039998823e49d516f559a92e5f" +checksum = "d2d8d89138b251e0a91cdaa261885bcfc959986cba2131d448bdc75f2e18c1d0" dependencies = [ "ahash", "dashmap", @@ -682,9 +682,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.86.0" +version = "4.87.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97c0552d7d2f270ca1fec64766617809aa82b86ad4424d8c31515ed79d2f121e" +checksum = "f0867d16811e67ce0cbf86a0c3fd7947934b1d53e2ee533f2d00e75f926636e8" dependencies = [ "async-func", "clonelicious", @@ -699,34 +699,28 @@ dependencies = [ [[package]] name = "hyperlane-log" -version = "1.16.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf0482aced2eb7960f268032c44327a3234eb3eea4ef6c80680e1ef83a94535" +checksum = "17a47938bb5388e2428ebbe02098c485c2a596b4aae4cc909320394dede527bb" dependencies = [ "file-operation", - "hyperlane-time 0.5.0", + "hyperlane-time", "lombok-macros", "tokio", ] [[package]] name = "hyperlane-time" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aa55a670a0db8677da642e02e3bd61d4fca3765b9d943f9429e4b0e5c5fd7e5" - -[[package]] -name = "hyperlane-time" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "075b6f8b97160e2af0a15d047f189c537939c824e9f96762dec226fd2f62a2ab" +checksum = "d0f69051b8978d37eb5a3d8f700a39159d40d7646f1aef8d2f3e441279f4dfa1" [[package]] name = "hyperlane_techempower" version = "0.0.1" dependencies = [ "hyperlane", - "rand 0.9.0", + "rand 0.9.1", "serde", "sqlx", ] @@ -907,9 +901,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" @@ -957,9 +951,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lombok-macros" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c4d9a6dbaf4cdb37d7b148e86ca3aa688b499eff0fb44ea566d9770fb28451" +checksum = "3ffb76637e1a834f7ad93d96b8be0bcfa6673f08fdcab6c9fbeabc1cb0e8c379" dependencies = [ "proc-macro2", "quote", @@ -1168,9 +1162,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -1203,13 +1197,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.24", ] [[package]] @@ -1252,9 +1245,9 @@ dependencies = [ [[package]] name = "recoverable-spawn" -version = "3.7.1" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcc61deaa201c349799f432212c2fdbd81f0587ba6cd10eed29c86cf207fe477" +checksum = "57702670d1a6eb7e02bbd6c2fafe3587c42eb2ce4e5012ae8632171aa58c21b6" dependencies = [ "once_cell", "tokio", @@ -1262,9 +1255,9 @@ dependencies = [ [[package]] name = "recoverable-thread-pool" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c492038cf040045396f083da49acefb762bb82739431e54dfd224a18d34bbb9" +checksum = "03a8924916abfed76681374565d505b59b2c8bc17f03e3693be2243c324433ed" dependencies = [ "lombok-macros", "recoverable-spawn", @@ -1409,9 +1402,9 @@ dependencies = [ [[package]] name = "server-manager" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91c4f62e3f523a86b32faa645e4798300df473eab061651af180abbf4c7bb0e" +checksum = "7be400c8b4c701205cf9415f5463845319fbaeea0964750cb94f830224145d86" dependencies = [ "tokio", ] @@ -1440,9 +1433,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "c28b4eafe8a2d82f83559ef5941afff1ccba3da8e375c8f148efd75df181bf4f" dependencies = [ "libc", ] @@ -1459,9 +1452,9 @@ dependencies = [ [[package]] name = "simd-json" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10b5602e4f1f7d358956f94cac1eff59220f34cf9e26d49f5fde5acef851cbed" +checksum = "c962f626b54771990066e5435ec8331d1462576cd2d1e62f24076ae014f92112" dependencies = [ "getrandom 0.3.2", "halfbrown", @@ -1527,9 +1520,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e22987355fbf8cfb813a0cf8cd97b1b4ec834b94dbd759a9e8679d41fabe83" +checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1540,9 +1533,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c4720d7d4cd3d5b00f61d03751c685ad09c33ae8290c8a2c11335e0604300b" +checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" dependencies = [ "base64", "bytes", @@ -1574,9 +1567,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175147fcb75f353ac7675509bc58abb2cb291caf0fd24a3623b8f7e3eb0a754b" +checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" dependencies = [ "proc-macro2", "quote", @@ -1587,9 +1580,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cde983058e53bfa75998e1982086c5efe3c370f3250bf0357e344fa3352e32b" +checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" dependencies = [ "dotenvy", "either", @@ -1613,9 +1606,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "847d2e5393a4f39e47e4f36cab419709bc2b83cbe4223c60e86e1471655be333" +checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" dependencies = [ "atoi", "base64", @@ -1655,9 +1648,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc35947a541b9e0a2e3d85da444f1c4137c13040267141b208395a0d0ca4659f" +checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" dependencies = [ "atoi", "base64", @@ -1692,9 +1685,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c48291dac4e5ed32da0927a0b981788be65674aeb62666d19873ab4289febde" +checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" dependencies = [ "atoi", "flume", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index f274f2108d5..9e013fda2da 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,10 +18,10 @@ exclude = [ ] [dependencies] -hyperlane = "4.86.0" -rand = "0.9.0" +hyperlane = "4.87.3" +rand = "0.9.1" serde = "1.0.219" -sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] } +sqlx = { version = "0.8.5", features = ["runtime-tokio", "postgres"] } [profile.dev] incremental = false @@ -43,3 +43,10 @@ strip = "debuginfo" [features] dev = [] +json = [] +plaintext = [] +fortunes = [] +db = [] +query = [] +update = [] +cached_query = [] diff --git a/frameworks/Rust/hyperlane/benchmark_config.json b/frameworks/Rust/hyperlane/benchmark_config.json index 1f810752e18..7864eb27b08 100644 --- a/frameworks/Rust/hyperlane/benchmark_config.json +++ b/frameworks/Rust/hyperlane/benchmark_config.json @@ -2,14 +2,104 @@ "framework": "hyperlane", "tests": [ { - "default": { - "dockerfile": "hyperlane.dockerfile", + "json": { + "dockerfile": "hyperlane.json.dockerfile", "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "hyperlane", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "hyperlane", + "os": "Linux", + "database_os": "Linux", + "display_name": "hyperlane" + }, + "plaintext": { + "dockerfile": "hyperlane.plaintext.dockerfile", "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "hyperlane", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "hyperlane", + "os": "Linux", + "database_os": "Linux", + "display_name": "hyperlane" + }, + "fortunes": { + "dockerfile": "hyperlane.fortunes.dockerfile", "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "hyperlane", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "hyperlane", + "os": "Linux", + "database_os": "Linux", + "display_name": "hyperlane" + }, + "db": { + "dockerfile": "hyperlane.db.dockerfile", "db_url": "/db", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "hyperlane", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "hyperlane", + "os": "Linux", + "database_os": "Linux", + "display_name": "hyperlane" + }, + "query": { + "dockerfile": "hyperlane.query.dockerfile", "query_url": "/query?q=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "hyperlane", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "hyperlane", + "os": "Linux", + "database_os": "Linux", + "display_name": "hyperlane" + }, + "update": { + "dockerfile": "hyperlane.update.dockerfile", "update_url": "/upda?q=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "hyperlane", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "hyperlane", + "os": "Linux", + "database_os": "Linux", + "display_name": "hyperlane" + }, + "cached_query": { + "dockerfile": "hyperlane.cached_query.dockerfile", "cached_query_url": "/cached-quer?c=", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile b/frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile new file mode 100644 index 00000000000..d90fbed9fc8 --- /dev/null +++ b/frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile @@ -0,0 +1,15 @@ +FROM rust:1.85 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld + +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world + +ADD ./ /hyperlane_techempower +WORKDIR /hyperlane_techempower + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features cached_query + +EXPOSE 8080 + +CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.dockerfile b/frameworks/Rust/hyperlane/hyperlane.db.dockerfile similarity index 91% rename from frameworks/Rust/hyperlane/hyperlane.dockerfile rename to frameworks/Rust/hyperlane/hyperlane.db.dockerfile index d9bd815fd04..632f725fc54 100644 --- a/frameworks/Rust/hyperlane/hyperlane.dockerfile +++ b/frameworks/Rust/hyperlane/hyperlane.db.dockerfile @@ -8,7 +8,7 @@ ADD ./ /hyperlane_techempower WORKDIR /hyperlane_techempower RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features db EXPOSE 8080 diff --git a/frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile b/frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile new file mode 100644 index 00000000000..6c17364aab5 --- /dev/null +++ b/frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile @@ -0,0 +1,15 @@ +FROM rust:1.85 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld + +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world + +ADD ./ /hyperlane_techempower +WORKDIR /hyperlane_techempower + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features fortunes + +EXPOSE 8080 + +CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.json.dockerfile b/frameworks/Rust/hyperlane/hyperlane.json.dockerfile new file mode 100644 index 00000000000..225112b5b38 --- /dev/null +++ b/frameworks/Rust/hyperlane/hyperlane.json.dockerfile @@ -0,0 +1,15 @@ +FROM rust:1.85 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld + +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world + +ADD ./ /hyperlane_techempower +WORKDIR /hyperlane_techempower + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features json + +EXPOSE 8080 + +CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile b/frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile new file mode 100644 index 00000000000..f2620d45892 --- /dev/null +++ b/frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile @@ -0,0 +1,15 @@ +FROM rust:1.85 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld + +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world + +ADD ./ /hyperlane_techempower +WORKDIR /hyperlane_techempower + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features plaintext + +EXPOSE 8080 + +CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.query.dockerfile b/frameworks/Rust/hyperlane/hyperlane.query.dockerfile new file mode 100644 index 00000000000..04463e5b6dd --- /dev/null +++ b/frameworks/Rust/hyperlane/hyperlane.query.dockerfile @@ -0,0 +1,15 @@ +FROM rust:1.85 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld + +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world + +ADD ./ /hyperlane_techempower +WORKDIR /hyperlane_techempower + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features query + +EXPOSE 8080 + +CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.update.dockerfile b/frameworks/Rust/hyperlane/hyperlane.update.dockerfile new file mode 100644 index 00000000000..c265407a1ff --- /dev/null +++ b/frameworks/Rust/hyperlane/hyperlane.update.dockerfile @@ -0,0 +1,15 @@ +FROM rust:1.85 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld + +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world + +ADD ./ /hyperlane_techempower +WORKDIR /hyperlane_techempower + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features update + +EXPOSE 8080 + +CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index bafba28ca6d..379645fe5e5 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -119,9 +119,13 @@ pub async fn get_update_data( let db_pool: &DbPoolConnection = get_db_connection(); let mut query_res_list: Vec = Vec::with_capacity(limit as usize); let rows: Vec = get_some_row_id(limit, db_pool).await; - let mut sql: String = format!("UPDATE {} SET randomNumber = CASE id ", TABLE_NAME_WORLD); + let mut sql: String = String::with_capacity(rows.len() * 32); + sql.push_str(&format!( + "UPDATE {} SET randomNumber = CASE id ", + TABLE_NAME_WORLD + )); let mut id_list: Vec = Vec::with_capacity(rows.len()); - let mut value_list: Vec = Vec::with_capacity(rows.len() * 2); + let mut value_list: Vec = Vec::with_capacity(rows.len()); let mut random_numbers: Vec = Vec::with_capacity(rows.len()); for (i, row) in rows.iter().enumerate() { let new_random_number: i32 = get_random_id() as i32; @@ -131,10 +135,8 @@ pub async fn get_update_data( query_res_list.push(QueryRow::new(row.id, new_random_number)); } sql.push_str(&value_list.join(" ")); - let id_params: String = id_list - .iter() - .enumerate() - .map(|(i, _)| format!("${}", (rows.len() * 2 + 1) + i)) + let id_params: String = (0..rows.len()) + .map(|i| format!("${}", (rows.len() * 2 + 1) + i)) .collect::>() .join(","); sql.push_str(&format!( @@ -174,7 +176,7 @@ pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRo pub async fn update_world_rows(limit: Queries) -> Vec { let db_pool: &DbPoolConnection = get_db_connection(); let (sql, data, id_list, random_numbers) = get_update_data(limit).await; - let mut query_builder: query::Query<'_, Postgres, postgres::PgArguments> = query(&sql); + let mut query_builder = query(&sql); for (id, random_number) in id_list.iter().zip(random_numbers.iter()) { query_builder = query_builder.bind(id).bind(random_number); } @@ -194,18 +196,18 @@ pub async fn all_world_row() -> Vec { pub async fn get_some_row_id(limit: Queries, db_pool: &DbPoolConnection) -> Vec { let semaphore: Arc = Arc::new(Semaphore::new(32)); - let mut tasks: Vec> = Vec::with_capacity(limit as usize); - for _ in 0..limit { - let _ = semaphore.clone().acquire_owned().await.map(|permit| { - let db_pool: DbPoolConnection = db_pool.clone(); - tasks.push(spawn(async move { + let tasks: Vec<_> = (0..limit) + .map(|_| { + let semaphore: Arc = semaphore.clone(); + let db_pool: Pool = db_pool.clone(); + spawn(async move { + let _permit: Result = + semaphore.acquire_owned().await; let id: i32 = get_random_id(); - let res: QueryRow = query_world_row(&db_pool, id).await; - drop(permit); - res - })); - }); - } + query_world_row(&db_pool, id).await + }) + }) + .collect(); join_all(tasks) .await .into_iter() diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index e4b739e7c6a..e6c40b0d9e0 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -1,3 +1,6 @@ +#![allow(dead_code)] +#![allow(unused_imports)] + pub(crate) mod r#const; pub(crate) mod db; pub(crate) mod lazy; @@ -14,13 +17,15 @@ pub(crate) use hyperlane::{ once_cell::sync::Lazy, serde::*, serde_json::{Value, json}, - tokio::{spawn, sync::Semaphore, task::JoinHandle}, + tokio::{ + spawn, + sync::{AcquireError, OwnedSemaphorePermit, Semaphore}, + task::JoinHandle, + }, *, }; pub(crate) use lazy::*; pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng}; -pub(crate) use request_middleware::*; -pub(crate) use route::*; pub(crate) use server::*; pub(crate) use sqlx::{ postgres::{PgPoolOptions, PgRow}, diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 592dbb89170..7e7eb1cd7c1 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -1,13 +1,30 @@ use crate::*; pub async fn request(ctx: Context) { - let _ = ctx - .set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) - .await - .set_response_header(CONTENT_TYPE, APPLICATION_JSON) + ctx.set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) .await .set_response_header(SERVER, HYPERLANE) .await .set_response_header(DATE, gmt()) .await; + #[cfg(feature = "plaintext")] + { + ctx.set_response_header(CONTENT_TYPE, TEXT_PLAIN).await; + } + #[cfg(feature = "fortunes")] + { + ctx.set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) + .await; + } + #[cfg(any( + feature = "json", + feature = "db", + feature = "query", + feature = "update", + feature = "cached_query" + ))] + { + ctx.set_response_header(CONTENT_TYPE, APPLICATION_JSON) + .await; + } } diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index b92ae44b881..74f346b9ea7 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -10,11 +10,7 @@ pub async fn json(ctx: Context) { } pub async fn plaintext(ctx: Context) { - let _ = ctx - .set_response_header(CONTENT_TYPE, TEXT_PLAIN) - .await - .send_response(200, RESPONSEDATA_BIN) - .await; + let _ = ctx.send_response(200, RESPONSEDATA_BIN).await; } pub async fn db(ctx: Context) { @@ -25,7 +21,7 @@ pub async fn db(ctx: Context) { .await; } -pub async fn queries(ctx: Context) { +pub async fn query(ctx: Context) { let queries: Queries = ctx .get_request_query("q") .await @@ -56,14 +52,10 @@ pub async fn fortunes(ctx: Context) { )); fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); let res: String = FortunesTemplate::new(fortunes_list).to_string(); - let _ = ctx - .set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) - .await - .send_response(200, res) - .await; + let _ = ctx.send_response(200, res).await; } -pub async fn updates(ctx: Context) { +pub async fn update(ctx: Context) { let queries: Queries = ctx .get_request_query("q") .await @@ -77,7 +69,7 @@ pub async fn updates(ctx: Context) { .await; } -pub async fn cached_queries(ctx: Context) { +pub async fn cached_query(ctx: Context) { let count: Queries = ctx .get_request_query("c") .await diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index c26882a7ce5..e3402d638c5 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -3,6 +3,8 @@ use tokio::runtime::{Builder, Runtime}; fn runtime() -> Runtime { Builder::new_multi_thread() + .worker_threads(get_thread_count() >> 1) + .thread_stack_size(1_048_576) .worker_threads(get_thread_count() >> 1) .thread_stack_size(1_048_576) .max_blocking_threads(5120) @@ -23,18 +25,33 @@ async fn init_server() { server.disable_inner_print().await; server.http_line_buffer_size(256).await; server.websocket_buffer_size(256).await; - server.request_middleware(request).await; - server.route("/plaintext", plaintext).await; - server.route("/json", json).await; - server.route("/cached-quer", cached_queries).await; - server.route("/db", db).await; - server.route("/query", queries).await; - server.route("/fortunes", fortunes).await; - server.route("/upda", updates).await; + server.request_middleware(request_middleware::request).await; + #[cfg(any(feature = "dev", feature = "plaintext"))] + server.route("/plaintext", route::plaintext).await; + #[cfg(any(feature = "dev", feature = "json"))] + server.route("/json", route::json).await; + #[cfg(any(feature = "dev", feature = "cached_query"))] + server.route("/cached-quer", route::cached_query).await; + #[cfg(any(feature = "dev", feature = "db"))] + server.route("/db", route::db).await; + #[cfg(any(feature = "dev", feature = "query"))] + server.route("/query", route::query).await; + #[cfg(any(feature = "dev", feature = "fortunes"))] + server.route("/fortunes", route::fortunes).await; + #[cfg(any(feature = "dev", feature = "update"))] + server.route("/upda", route::update).await; server.listen().await.unwrap(); } async fn init() { + #[cfg(any( + feature = "dev", + feature = "db", + feature = "query", + feature = "update", + feature = "fortunes", + feature = "cached_query", + ))] init_db().await; init_server().await; } From 3db6d5c46e0e026877c9518c5ce3218f5eea2cca Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Tue, 22 Apr 2025 05:40:45 -1000 Subject: [PATCH 1405/1766] upgrade to tio-http-server-3.7.3.v20250415-RELEASE (#9841) Co-authored-by: litongjava --- frameworks/Java/tio-http-server/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index 29e1dbee22b..51de86cf0b7 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -16,13 +16,13 @@ com.litongjava tio-http-server - 3.7.3.v20250401-RELEASE + 3.7.3.v20250415-RELEASE com.litongjava tio-utils - 3.7.3.v20250401-RELEASE + 3.7.3.v20250415-RELEASE com.litongjava From f12e278e5f03183b4ea098f388f74dd59eeca668 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Tue, 22 Apr 2025 05:41:12 -1000 Subject: [PATCH 1406/1766] upgrade to tio-boot-1.9.5 (#9840) Co-authored-by: litongjava --- frameworks/Java/tio-boot/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index 49cd3e8f3da..78d109361d9 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -11,7 +11,7 @@ 1.8 ${java.version} ${java.version} - 1.9.4 + 1.9.5 com.litongjava.tio.http.server.MainApp From 2f23d9c020c41cfd455b25263d647c504b876f3e Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Tue, 22 Apr 2025 16:41:54 +0100 Subject: [PATCH 1407/1766] Update components (#9831) --- frameworks/Java/quarkus/pom.xml | 11 ++++++----- .../quarkus/quarkus-hibernate-reactive.dockerfile | 4 ++-- .../quarkus-reactive-routes-pgclient.dockerfile | 4 ++-- frameworks/Java/quarkus/quarkus-vertx.dockerfile | 4 ++-- frameworks/Java/quarkus/quarkus.dockerfile | 4 ++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/frameworks/Java/quarkus/pom.xml b/frameworks/Java/quarkus/pom.xml index 3782b479cb3..26dcb870c26 100644 --- a/frameworks/Java/quarkus/pom.xml +++ b/frameworks/Java/quarkus/pom.xml @@ -8,16 +8,17 @@ pom - 3.11.0 - 17 + 3.14.0 + 21 UTF-8 UTF-8 quarkus-bom io.quarkus - 3.9.4 + 3.21.2 true - 3.0.0 - 0.0.25.Final + 3.5.2 + + 0.0.26.Final 1.3.0 diff --git a/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile b/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile index c9bd706429a..861dd3b042a 100644 --- a/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile +++ b/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile @@ -1,4 +1,4 @@ -FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 as maven +FROM registry.access.redhat.com/ubi9/openjdk-21:1.22 as maven ENV LANGUAGE='en_US:en' WORKDIR /quarkus @@ -29,7 +29,7 @@ WORKDIR /quarkus/$MODULE RUN mvn package -B -q WORKDIR /quarkus -FROM registry.access.redhat.com/ubi8/openjdk-17-runtime:1.15 +FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.22 ENV LANGUAGE='en_US:en' WORKDIR /quarkus ENV MODULE=resteasy-reactive-hibernate-reactive diff --git a/frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile b/frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile index cfd9baa9b41..21e918be45c 100644 --- a/frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile +++ b/frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 as maven +FROM registry.access.redhat.com/ubi9/openjdk-21:1.22 as maven ENV LANGUAGE='en_US:en' WORKDIR /quarkus @@ -29,7 +29,7 @@ WORKDIR /quarkus/$MODULE RUN mvn package -B -q WORKDIR /quarkus -FROM registry.access.redhat.com/ubi8/openjdk-17-runtime:1.15 +FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.22 ENV LANGUAGE='en_US:en' WORKDIR /quarkus ENV MODULE=reactive-routes-pgclient diff --git a/frameworks/Java/quarkus/quarkus-vertx.dockerfile b/frameworks/Java/quarkus/quarkus-vertx.dockerfile index 48ef610e0cd..6969bc6d7ba 100644 --- a/frameworks/Java/quarkus/quarkus-vertx.dockerfile +++ b/frameworks/Java/quarkus/quarkus-vertx.dockerfile @@ -1,4 +1,4 @@ -FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 as maven +FROM registry.access.redhat.com/ubi9/openjdk-21:1.22 as maven ENV LANGUAGE='en_US:en' WORKDIR /quarkus @@ -29,7 +29,7 @@ WORKDIR /quarkus/$MODULE RUN mvn package -B -q WORKDIR /quarkus -FROM registry.access.redhat.com/ubi8/openjdk-17-runtime:1.15 +FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.22 ENV LANGUAGE='en_US:en' WORKDIR /quarkus ENV MODULE=vertx diff --git a/frameworks/Java/quarkus/quarkus.dockerfile b/frameworks/Java/quarkus/quarkus.dockerfile index 506b0532eea..40ec7a4ded7 100644 --- a/frameworks/Java/quarkus/quarkus.dockerfile +++ b/frameworks/Java/quarkus/quarkus.dockerfile @@ -1,4 +1,4 @@ -FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 as maven +FROM registry.access.redhat.com/ubi9/openjdk-21:1.22 as maven ENV LANGUAGE='en_US:en' WORKDIR /quarkus @@ -29,7 +29,7 @@ WORKDIR /quarkus/$MODULE RUN mvn package -B -q WORKDIR /quarkus -FROM registry.access.redhat.com/ubi8/openjdk-17-runtime:1.15 +FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.22 ENV LANGUAGE='en_US:en' WORKDIR /quarkus ENV MODULE=resteasy-reactive-hibernate From 21caa53ddd6c558124384bbb1a453d251dd73305 Mon Sep 17 00:00:00 2001 From: Sergey Kovalev <44sergey@gmail.com> Date: Tue, 22 Apr 2025 19:42:35 +0400 Subject: [PATCH 1408/1766] [aiohttp] - add raw setup (no-proxy) (#9807) --- .../Python/aiohttp/aiohttp-nginx.dockerfile | 20 ++++++++ .../Python/aiohttp/aiohttp-orm.dockerfile | 8 +--- frameworks/Python/aiohttp/aiohttp.dockerfile | 6 +-- frameworks/Python/aiohttp/app/server.py | 46 +++++++++++++++++++ .../Python/aiohttp/benchmark_config.json | 28 +++++++++-- frameworks/Python/aiohttp/config.toml | 21 ++++++++- 6 files changed, 112 insertions(+), 17 deletions(-) create mode 100644 frameworks/Python/aiohttp/aiohttp-nginx.dockerfile create mode 100644 frameworks/Python/aiohttp/app/server.py diff --git a/frameworks/Python/aiohttp/aiohttp-nginx.dockerfile b/frameworks/Python/aiohttp/aiohttp-nginx.dockerfile new file mode 100644 index 00000000000..9739a8e83bd --- /dev/null +++ b/frameworks/Python/aiohttp/aiohttp-nginx.dockerfile @@ -0,0 +1,20 @@ +FROM python:3.13 + +ADD ./requirements.txt /aiohttp/requirements.txt + +RUN pip3 install cython==3.0.11 && \ + pip3 install -r /aiohttp/requirements.txt + +RUN apt-get update && apt-get install -y nginx + +ADD ./ /aiohttp + +WORKDIR /aiohttp + +ENV CONNECTION=RAW + +EXPOSE 8080 + +RUN chmod +x /aiohttp/nginx-entrypoint.sh + +ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"] \ No newline at end of file diff --git a/frameworks/Python/aiohttp/aiohttp-orm.dockerfile b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile index 8b9a759057f..c113afcd7d5 100644 --- a/frameworks/Python/aiohttp/aiohttp-orm.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile @@ -1,7 +1,5 @@ FROM python:3.13 -RUN apt-get update && apt-get install -y nginx - ADD ./requirements.txt /aiohttp/requirements.txt RUN pip3 install cython==3.0.11 && \ @@ -15,8 +13,4 @@ ENV CONNECTION=ORM EXPOSE 8080 -RUN chmod +x /aiohttp/nginx-entrypoint.sh - -ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"] - - +CMD python3 -O -m app.server \ No newline at end of file diff --git a/frameworks/Python/aiohttp/aiohttp.dockerfile b/frameworks/Python/aiohttp/aiohttp.dockerfile index da72d75bbab..a9ecfff8c07 100644 --- a/frameworks/Python/aiohttp/aiohttp.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp.dockerfile @@ -1,7 +1,5 @@ FROM python:3.13 -RUN apt-get update && apt-get install -y nginx - ADD ./requirements.txt /aiohttp/requirements.txt RUN pip3 install cython==3.0.11 && \ @@ -15,6 +13,4 @@ ENV CONNECTION=RAW EXPOSE 8080 -RUN chmod +x /aiohttp/nginx-entrypoint.sh - -ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"] \ No newline at end of file +CMD python3 -O -m app.server \ No newline at end of file diff --git a/frameworks/Python/aiohttp/app/server.py b/frameworks/Python/aiohttp/app/server.py new file mode 100644 index 00000000000..d28000daaee --- /dev/null +++ b/frameworks/Python/aiohttp/app/server.py @@ -0,0 +1,46 @@ +import os +import socket +import multiprocessing +from aiohttp import web +from .main import create_app +import uvloop + +SERVERS_COUNT = multiprocessing.cpu_count() +BACKLOG = 2048 +SOCKET_BACKLOG = BACKLOG * SERVERS_COUNT + +def start_server(sock, cpu_id): + if hasattr(os, "sched_setaffinity"): + os.sched_setaffinity(0, {cpu_id}) + uvloop.install() + app = create_app() + + web.run_app(app, sock=sock, backlog=BACKLOG, access_log=None) + + +def create_reusable_socket(host='0.0.0.0', port=8080): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + sock.bind((host, port)) + sock.setblocking(False) + sock.set_inheritable(True) + + sock.listen(SOCKET_BACKLOG) + + return sock + + +if __name__ == '__main__': + sock = create_reusable_socket() + workers = [] + for cpu_id in range(SERVERS_COUNT): + worker = multiprocessing.Process(target=start_server, args=(sock, cpu_id)) + worker.daemon = True + worker.start() + workers.append(worker) + + for worker in workers: + worker.join() \ No newline at end of file diff --git a/frameworks/Python/aiohttp/benchmark_config.json b/frameworks/Python/aiohttp/benchmark_config.json index b341ad5c384..366ff434220 100644 --- a/frameworks/Python/aiohttp/benchmark_config.json +++ b/frameworks/Python/aiohttp/benchmark_config.json @@ -17,13 +17,13 @@ "flavor": "Python3", "orm": "Raw", "platform": "asyncio", - "webserver": "nginx", + "webserver": "None", "os": "Linux", "database_os": "Linux", "display_name": "aiohttp", "notes": "uses asyncpg for database access" }, - "gunicorn": { + "nginx": { "json_url": "/json", "db_url": "/db", "query_url": "/queries/", @@ -42,6 +42,28 @@ "webserver": "nginx", "os": "Linux", "database_os": "Linux", + "display_name": "aiohttp-nginx", + "notes": "uses nginx as proxy" + }, + "gunicorn": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "fortune_url": "/fortunes", + "update_url": "/updates/", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "aiohttp", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "gunicorn", + "os": "Linux", + "database_os": "Linux", "display_name": "aiohttp-gunicorn", "notes": "uses gunicorn as proxy server", "versus": "default" @@ -60,7 +82,7 @@ "flavor": "Python3", "orm": "Full", "platform": "asyncio", - "webserver": "nginx", + "webserver": "None", "os": "Linux", "database_os": "Linux", "display_name": "aiohttp-orm", diff --git a/frameworks/Python/aiohttp/config.toml b/frameworks/Python/aiohttp/config.toml index da12a838108..195a408ba2e 100644 --- a/frameworks/Python/aiohttp/config.toml +++ b/frameworks/Python/aiohttp/config.toml @@ -15,9 +15,26 @@ database_os = "Linux" os = "Linux" orm = "Raw" platform = "asyncio" -webserver = "nginx" +webserver = "None" versus = "None" +[nginx] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "asyncio" +webserver = "nginx" +versus = "default" + [gunicorn] urls.plaintext = "/plaintext" urls.json = "/json" @@ -47,5 +64,5 @@ database_os = "Linux" os = "Linux" orm = "Full" platform = "asyncio" -webserver = "nginx" +webserver = "None" versus = "default" From 9d8c3b9515774e08d7e0569e358afcd0a8dca59f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:13:22 +0000 Subject: [PATCH 1409/1766] Bump h11 from 0.12.0 to 0.16.0 in /frameworks/Python/routerling Bumps [h11](https://github.com/python-hyper/h11) from 0.12.0 to 0.16.0. - [Commits](https://github.com/python-hyper/h11/compare/v0.12.0...v0.16.0) --- updated-dependencies: - dependency-name: h11 dependency-version: 0.16.0 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 276a30a5894..9653371b503 100644 --- a/frameworks/Python/routerling/requirements.txt +++ b/frameworks/Python/routerling/requirements.txt @@ -2,7 +2,7 @@ asgiref==3.4.1 asyncpg==0.24.0 click==8.0.1 gunicorn==22.0.0 -h11==0.12.0 +h11==0.16.0 Jinja2==3.1.4 MarkupSafe==2.0.1 routerling==0.3.1 From dbb408cec8b3a4d3c494ed0906bf77b207d3fa6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:19:24 +0000 Subject: [PATCH 1410/1766] Bump h11 from 0.14.0 to 0.16.0 in /frameworks/Python/bareasgi Bumps [h11](https://github.com/python-hyper/h11) from 0.14.0 to 0.16.0. - [Commits](https://github.com/python-hyper/h11/compare/v0.14.0...v0.16.0) --- updated-dependencies: - dependency-name: h11 dependency-version: 0.16.0 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 53f1ec21fd9..357e05a3d00 100644 --- a/frameworks/Python/bareasgi/requirements.txt +++ b/frameworks/Python/bareasgi/requirements.txt @@ -2,7 +2,7 @@ asyncpg==0.26.0 bareasgi==4.3.0 bareasgi-jinja2==4.0.1 bareutils==4.0.2 -h11==0.14.0 +h11==0.16.0 h2==4.1.0 hpack==4.0.0 hypercorn==0.14.3 From 6cc300fdcefa8b42ecc6f7a63a91167f5d38980d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:24:14 +0000 Subject: [PATCH 1411/1766] Bump h11 from 0.13.0 to 0.16.0 in /frameworks/Python/quart Bumps [h11](https://github.com/python-hyper/h11) from 0.13.0 to 0.16.0. - [Commits](https://github.com/python-hyper/h11/compare/v0.13.0...v0.16.0) --- updated-dependencies: - dependency-name: h11 dependency-version: 0.16.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 13e6e269e43..063f2131e0f 100644 --- a/frameworks/Python/quart/requirements.txt +++ b/frameworks/Python/quart/requirements.txt @@ -2,7 +2,7 @@ aiofiles==0.8.0 asyncpg==0.26.0 blinker==1.5 click==8.1.3 -h11==0.13.0 +h11==0.16.0 h2==4.1.0 hpack==4.0.0 hypercorn==0.14.2 From 2696c9869f94bac825e908b5440d95b1f39847ee Mon Sep 17 00:00:00 2001 From: Ajay Kidave <130696958+akclace@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:26:04 -0700 Subject: [PATCH 1412/1766] [clace] - Changed to use no_args handlers (#9857) * Added localhost path * [clace] - Changed to use no_args handlers --- frameworks/Python/clace/app.star | 10 ++++++++-- frameworks/Python/clace/run.sh | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/frameworks/Python/clace/app.star b/frameworks/Python/clace/app.star index 86c0dd68346..017235a9da9 100644 --- a/frameworks/Python/clace/app.star +++ b/frameworks/Python/clace/app.star @@ -1,6 +1,12 @@ +def json_no_args(): + return {'message': 'Hello, world!'} + +def text_no_args(): + return 'Hello, world!' + app = ace.app("testapp", routes = [ - ace.api("/json", lambda req: {'message': 'Hello, world!'}, type=ace.JSON), - ace.api("/plaintext", lambda req: 'Hello, world!', type=ace.TEXT) + ace.api("/json", type=ace.JSON, handler=json_no_args), + ace.api("/plaintext", type=ace.TEXT, handler=text_no_args) ] ) diff --git a/frameworks/Python/clace/run.sh b/frameworks/Python/clace/run.sh index 311de74eaed..e50158afcc5 100755 --- a/frameworks/Python/clace/run.sh +++ b/frameworks/Python/clace/run.sh @@ -6,15 +6,21 @@ cat < /root/clhome/clace.toml console = false file = false access_logging = false +level = "WARN" [http] -host = "0.0.0.0" +host = "" port = 8080 + +[system] +enable_compression = false + +[app_config] +cors.allow_origin = "" EOF clace server start & sleep 2 clace app create --auth=none --approve /clace / -clace app create --auth=none --approve /clace tfb-server:/ tail -f /dev/null From 6629f7c2de9bb9cc46cdffa95fddcfeb1d66ce60 Mon Sep 17 00:00:00 2001 From: nazo Date: Fri, 25 Apr 2025 01:34:05 +0800 Subject: [PATCH 1413/1766] [Python] Upgrade Blacksheep framework (#9828) * feat: upgrade * add: nginx-unit * remove: cur_loop * feat: use Struct * change config.toml * fix: blacksheep-nginx-unit-build --- frameworks/Python/blacksheep/app.py | 178 ++++++------------ .../Python/blacksheep/benchmark_config.json | 23 +++ .../blacksheep-nginx-unit.dockerfile | 17 ++ .../Python/blacksheep/blacksheep.dockerfile | 4 +- frameworks/Python/blacksheep/config.toml | 18 ++ .../blacksheep/requirements-gunicorn.txt | 2 +- .../blacksheep/requirements-hypercorn.txt | 2 +- .../blacksheep/requirements-uvicorn.txt | 6 +- frameworks/Python/blacksheep/requirements.txt | 6 +- frameworks/Python/blacksheep/start-unit.sh | 18 ++ .../blacksheep/unit-config.template.json | 19 ++ 11 files changed, 160 insertions(+), 133 deletions(-) create mode 100644 frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile create mode 100755 frameworks/Python/blacksheep/start-unit.sh create mode 100644 frameworks/Python/blacksheep/unit-config.template.json diff --git a/frameworks/Python/blacksheep/app.py b/frameworks/Python/blacksheep/app.py index b26474cb577..422a987df43 100644 --- a/frameworks/Python/blacksheep/app.py +++ b/frameworks/Python/blacksheep/app.py @@ -1,65 +1,44 @@ +import multiprocessing import os -import ujson import asyncpg -import multiprocessing import random +import asyncio +from operator import itemgetter import blacksheep as bs import jinja2 -from email.utils import formatdate - -try: - from ujson import dumps as jsonify -except: - from json import dumps as jsonify - - -_is_travis = os.environ.get('TRAVIS') == 'true' - -_is_gunicorn = "gunicorn" in os.environ.get("SERVER_SOFTWARE", "") - -_cpu_count = multiprocessing.cpu_count() -if _is_travis: - _cpu_count = 2 - - -#from blacksheep.settings.json import json_settings -#json_settings.use(dumps=jsonify) - -DBDRV = "postgres" -DBHOST = "tfb-database" -DBUSER = "benchmarkdbuser" -DBPSWD = "benchmarkdbpass" +import msgspec +from pathlib import Path 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) - db_pool = None +key = itemgetter(1) -g_response_server = None -g_response_add_date = False - +try: + import uvloop + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) +except Exception: + ... async def setup_db(app): global db_pool db_pool = await asyncpg.create_pool( - user=os.getenv('PGUSER', DBUSER), - password=os.getenv('PGPASS', DBPSWD), + user=os.getenv('PGUSER', "benchmarkdbuser"), + password=os.getenv('PGPASS', "benchmarkdbpass"), database='hello_world', - host=DBHOST, + host="tfb-database", port=5432, min_size=MIN_POOL_SIZE, - max_size=MAX_POOL_SIZE, + max_size=MAX_POOL_SIZE, ) 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) + with Path("templates/fortune.html").open("r") as f: + return jinja2.Template(f.read()) fortune_template = load_fortunes_template() @@ -82,139 +61,92 @@ def get_num_queries(request): return 500 return query_count +ENCODER = msgspec.json.Encoder() +DECODER = msgspec.json.Decoder() +JSON_CONTENT_TYPE = b"application/json" +def jsonify( + data, + status=200, + headers=None, +): + """ + Returns a response with application/json content, + and given status (default HTTP 200 OK). + """ + return bs.Response( + status=status, + headers=headers, + content=bs.Content(content_type=JSON_CONTENT_TYPE, data=ENCODER.encode(data)), + ) -# ------------------------------------------------------------------------------------------ - -async def bs_middleware(request, handler): - global g_response_server, g_response_add_date - response = await handler(request) - if g_response_server: - response.headers[b'Server'] = g_response_server - if g_response_add_date: - response.headers[b'Date'] = formatdate(timeval=None, localtime=False, usegmt=True) - return response +class Result(msgspec.Struct): + id: int + randomNumber: int +# ------------------------------------------------------------------------------------------ -@app.route('/json') +@bs.get('/json') async def json_test(request): - return bs.json( {'message': 'Hello, world!'} ) - + return jsonify( {'message': 'Hello, world!'} ) -@app.route('/db') +@bs.get('/db') async def single_db_query_test(request): row_id = random.randint(1, 10000) async with db_pool.acquire() as db_conn: number = await db_conn.fetchval(READ_ROW_SQL, row_id) - world = {'id': row_id, 'randomNumber': number} - return bs.json(world) + return jsonify(Result(id=row_id, randomNumber=number)) + # return ({'id': row_id, 'randomNumber': number}) -@app.route('/queries') +@bs.get('/queries') async def multiple_db_queries_test(request): num_queries = get_num_queries(request) row_ids = random.sample(range(1, 10000), num_queries) - worlds = [ ] + worlds = [] async with db_pool.acquire() as db_conn: statement = await db_conn.prepare(READ_ROW_SQL) for row_id in row_ids: number = await statement.fetchval(row_id) - worlds.append( {"id": row_id, "randomNumber": number} ) + # worlds.append( {"id": row_id, "randomNumber": number} ) + worlds.append(Result(id=row_id, randomNumber=number)) - return bs.json(worlds) + return jsonify(worlds) -@app.route('/fortunes') +@bs.get('/fortunes') async def fortunes_test(request): async with db_pool.acquire() as db_conn: fortunes = await db_conn.fetch("SELECT * FROM Fortune") fortunes.append(ADDITIONAL_ROW) - fortunes.sort(key = lambda row: row[1]) + fortunes.sort(key = key) data = fortune_template.render(fortunes=fortunes) return bs.html(data) -@app.route('/updates') +@bs.get('/updates') async def db_updates_test(request): num_queries = get_num_queries(request) ids = sorted(random.sample(range(1, 10000 + 1), num_queries)) numbers = sorted(random.sample(range(1, 10000), num_queries)) updates = list(zip(ids, numbers)) - worlds = [ {"id": row_id, "randomNumber": number} for row_id, number in updates ] - + # worlds = [ {"id": row_id, "randomNumber": number} for row_id, number in updates ] + worlds = [Result(id=row_id, randomNumber=number) for row_id, number in updates] async with db_pool.acquire() as db_conn: statement = await db_conn.prepare(READ_ROW_SQL) for row_id, _ in updates: await statement.fetchval(row_id) await db_conn.executemany(WRITE_ROW_SQL, updates) - return bs.json(worlds) + return jsonify(worlds) -@app.route('/plaintext') +@bs.get('/plaintext') async def plaintext_test(request): return bs.Response(200, content=bs.Content(b"text/plain", b'Hello, World!')) #return bs.text('Hello, World!') - -# ----------------------------------------------------------------------------------- - -if __name__ == "__main__": - import optparse - import logging - import re - - parser = optparse.OptionParser("usage: %prog [options]", add_help_option=False) - parser.add_option("-h", "--host", dest="host", default='0.0.0.0', type="string") - parser.add_option("-p", "--port", dest="port", default=8080, type="int") - parser.add_option("-s", "--server", dest="server", default="uvicorn", type="string") - parser.add_option("-w", "--workers", dest="workers", default=0, type="int") - parser.add_option("-k", "--keepalive", dest="keepalive", default=60, type="int") - parser.add_option("-v", "--verbose", dest="verbose", default=0, type="int") - (opt, args) = parser.parse_args() - - workers = _cpu_count - if workers > 0: - workers = opt.workers - - if _is_travis: - workers = 2 - - def run_app(): - global g_response_server, g_response_add_date - - if opt.gateway == "uvicorn": - import uvicorn - log_level = logging.ERROR - uvicorn.run(app, host=opt.host, port=opt.port, workers=1, loop="uvloop", log_level=log_level, access_log=False) - - if opt.server == 'fastwsgi': - import fastwsgi - from blacksheep.utils.aio import get_running_loop - g_response_server = b'FastWSGI' - app.middlewares.append(bs_middleware) - loop = get_running_loop() - loop.run_until_complete(app.start()) - fastwsgi.run(app, host=opt.host, port=opt.port, loglevel=opt.verbose) - - if opt.server == 'socketify': - import socketify - msg = "Listening on http://0.0.0.0:{port} now\n".format(port=opt.port) - socketify.WSGI(app).listen(opt.port, lambda config: logging.info(msg)).run() - - def create_fork(): - n = os.fork() - # n greater than 0 means parent process - if not n > 0: - run_app() - - # fork limiting the cpu count - 1 - for i in range(1, workers): - create_fork() - - run_app() # run app on the main process too :) - diff --git a/frameworks/Python/blacksheep/benchmark_config.json b/frameworks/Python/blacksheep/benchmark_config.json index 7fc1dd7a3a5..fb05ddddbe8 100644 --- a/frameworks/Python/blacksheep/benchmark_config.json +++ b/frameworks/Python/blacksheep/benchmark_config.json @@ -23,6 +23,29 @@ "display_name": "blacksheep", "versus": "None", "notes": "" + }, + "nginx-unit": { + "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": "blacksheep", + "language": "Python", + "flavor": "Python3", + "platform": "ASGI", + "webserver": "nginx-unit", + "os": "Linux", + "orm": "Raw", + "database_os": "Linux", + "database": "Postgres", + "display_name": "blacksheep-nginx-unit", + "versus": "None", + "notes": "" } }] } diff --git a/frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile b/frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile new file mode 100644 index 00000000000..cd09391f6ac --- /dev/null +++ b/frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile @@ -0,0 +1,17 @@ +FROM unit:python3.13-slim + +WORKDIR /blacksheep + +COPY ./ /blacksheep + +RUN pip3 install -U pip +RUN pip3 install Cython==3.0.12 +RUN pip3 install -r /blacksheep/requirements.txt +RUN pip3 install -r /blacksheep/requirements-uvicorn.txt + +RUN chmod +x start-unit.sh + +ENV PGSSLMODE=disable + +EXPOSE 8080 +CMD ["./start-unit.sh"] diff --git a/frameworks/Python/blacksheep/blacksheep.dockerfile b/frameworks/Python/blacksheep/blacksheep.dockerfile index f382fad20bb..e87d8f14e5a 100644 --- a/frameworks/Python/blacksheep/blacksheep.dockerfile +++ b/frameworks/Python/blacksheep/blacksheep.dockerfile @@ -1,11 +1,11 @@ -FROM python:3.11-bullseye +FROM python:3.13 WORKDIR /blacksheep COPY ./ /blacksheep RUN pip3 install -U pip -RUN pip3 install cython==0.29.34 +RUN pip3 install Cython==3.0.12 RUN pip3 install -r /blacksheep/requirements.txt RUN pip3 install -r /blacksheep/requirements-gunicorn.txt RUN pip3 install -r /blacksheep/requirements-uvicorn.txt diff --git a/frameworks/Python/blacksheep/config.toml b/frameworks/Python/blacksheep/config.toml index 287c64b64a8..c37e96092d5 100644 --- a/frameworks/Python/blacksheep/config.toml +++ b/frameworks/Python/blacksheep/config.toml @@ -17,3 +17,21 @@ orm = "Raw" platform = "ASGI" webserver = "uvicorn" versus = "None" + + +[nginx-unit] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "ASGI" +webserver = "nginx-unit" +versus = "None" diff --git a/frameworks/Python/blacksheep/requirements-gunicorn.txt b/frameworks/Python/blacksheep/requirements-gunicorn.txt index 5389b4df825..4afe40e70ce 100644 --- a/frameworks/Python/blacksheep/requirements-gunicorn.txt +++ b/frameworks/Python/blacksheep/requirements-gunicorn.txt @@ -1 +1 @@ -gunicorn==22.0.0 +gunicorn==23.0.0 diff --git a/frameworks/Python/blacksheep/requirements-hypercorn.txt b/frameworks/Python/blacksheep/requirements-hypercorn.txt index 3d99222e2c6..3e0a21f2fe2 100644 --- a/frameworks/Python/blacksheep/requirements-hypercorn.txt +++ b/frameworks/Python/blacksheep/requirements-hypercorn.txt @@ -1 +1 @@ -hypercorn==0.14.3 +hypercorn==0.17.3 diff --git a/frameworks/Python/blacksheep/requirements-uvicorn.txt b/frameworks/Python/blacksheep/requirements-uvicorn.txt index 108304a1202..7a5c5d8140d 100644 --- a/frameworks/Python/blacksheep/requirements-uvicorn.txt +++ b/frameworks/Python/blacksheep/requirements-uvicorn.txt @@ -1,3 +1,3 @@ -uvloop==0.17.0 -uvicorn==0.21.1 -httptools==0.5.0 +uvloop==0.21.0 +uvicorn==0.34.1 +httptools==0.6.4 diff --git a/frameworks/Python/blacksheep/requirements.txt b/frameworks/Python/blacksheep/requirements.txt index c30bac3dc23..9c83c9fad47 100644 --- a/frameworks/Python/blacksheep/requirements.txt +++ b/frameworks/Python/blacksheep/requirements.txt @@ -1,4 +1,4 @@ -asyncpg==0.27.0 +asyncpg==0.30.0 Jinja2==3.1.6 -blacksheep==1.2.13 -ujson==5.7.0 +blacksheep==2.1.0 +msgspec==0.19.0 diff --git a/frameworks/Python/blacksheep/start-unit.sh b/frameworks/Python/blacksheep/start-unit.sh new file mode 100755 index 00000000000..9d2b923e166 --- /dev/null +++ b/frameworks/Python/blacksheep/start-unit.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +NPROC=$(nproc) +sed "s/{{NPROC}}/$NPROC/" unit-config.template.json > nginx-unit-config.json + +unitd --no-daemon --control unix:/var/run/control.unit.sock & + +# wait UNIT started +sleep 1 + +# PUT configure +curl -X PUT \ + --data-binary @nginx-unit-config.json \ + --unix-socket /var/run/control.unit.sock \ + http://localhost/config + +# Then keep the container alive +wait \ No newline at end of file diff --git a/frameworks/Python/blacksheep/unit-config.template.json b/frameworks/Python/blacksheep/unit-config.template.json new file mode 100644 index 00000000000..ee02557db34 --- /dev/null +++ b/frameworks/Python/blacksheep/unit-config.template.json @@ -0,0 +1,19 @@ +{ + "listeners": { + "*:8080": { + "pass": "applications/blacksheep" + } + }, + "applications": { + "blacksheep": { + "type": "python", + "path": "/blacksheep", + "working_directory": "/blacksheep", + "protocol": "asgi", + "module": "app", + "callable": "app", + "processes": {{NPROC}} + } + }, + "access_log": "/dev/null" +} \ No newline at end of file From d5c87a44e508cb8b05abae8a5863d61f0b88f2d2 Mon Sep 17 00:00:00 2001 From: Sergey Kovalev Date: Mon, 28 Apr 2025 20:07:20 +0400 Subject: [PATCH 1414/1766] [aiohttp] - use fetchmany api (#9865) --- frameworks/Python/aiohttp/app/views.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/frameworks/Python/aiohttp/app/views.py b/frameworks/Python/aiohttp/app/views.py index aa60ad4164d..c743cc47054 100644 --- a/frameworks/Python/aiohttp/app/views.py +++ b/frameworks/Python/aiohttp/app/views.py @@ -92,15 +92,11 @@ async def multiple_database_queries_raw(request): """ num_queries = get_num_queries(request) - ids = [randint(1, 10000) for _ in range(num_queries)] + ids = [(randint(1, 10000), ) for _ in range(num_queries)] - result = [] async with request.app['pg'].acquire() as conn: - for id_ in ids: - result.append({ - 'id': id_, - 'randomNumber': await conn.fetchval(READ_ROW_SQL, id_), - }) + rows = await conn.fetchmany(READ_ROW_SQL, ids) + result = [{'id': id_[0], 'randomNumber': row[0]} for id_, row in zip(ids, rows)] return json_response(result) @@ -155,13 +151,13 @@ async def updates_raw(request): num_queries = get_num_queries(request) update_ids = sample(range(1, 10001), num_queries) update_ids.sort() + fetch_params = tuple((i, ) for i in update_ids) updates = tuple(zip(update_ids, sample(range(1, 10001), num_queries))) worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] async with request.app['pg'].acquire() as conn: - for id_, _ in updates: - # the result of this is the int previous random number which we don't actually use - await conn.fetchval(READ_ROW_SQL, id_) + # the result of this is the int previous random number which we don't actually use + await conn.executemany(READ_ROW_SQL, fetch_params) await conn.executemany(WRITE_ROW_SQL, updates) return json_response(worlds) From 4648d5ecadc7644b543123a54e449ecf827a39aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Tue, 29 Apr 2025 00:24:25 +0800 Subject: [PATCH 1415/1766] Update:touchsocket version to 3.1.0 (#9864) --- .../touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj | 2 +- .../CSharp/touchsocket/src/TouchSocketWebApi/Program.cs | 6 +++--- .../src/TouchSocketWebApi/TouchSocketWebApi.csproj | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index 861df016264..aaef77cb15b 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -12,6 +12,6 @@ - + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs index 9ff88e76fa2..52fcf5a4edf 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -58,9 +58,9 @@ public static void Main(string[] args) } } -public partial class ApiServer : RpcServer +public partial class ApiServer : SingletonRpcServer { - private HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); + private readonly HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); public static MyJson MyJson { get; set; } = new MyJson() { Message = "Hello, World!" }; @@ -71,7 +71,7 @@ public async Task Plaintext(IWebApiCallContext callContext) var response= callContext.HttpContext.Response; response.SetStatus(200, "success"); response.Content= m_contentPlaintext; - await response.AnswerAsync(); + await response.AnswerAsync().ConfigureAwait(false); } [Router("/json")] diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index 87b1299e11e..6d44f27c2f5 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -12,8 +12,8 @@ - - - + + + From 9acd664f128a31126e420dc624278a4d46f87b1a Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Tue, 29 Apr 2025 00:25:50 +0800 Subject: [PATCH 1416/1766] [C++]paozhu update orm files (#9863) * Paozhu update * Update orm file * [Paozhu] update orm file * update paozhu * update paozhu * [C++ paozhu] update ORM * update orm files * update orm files --- frameworks/C++/paozhu/paozhu.dockerfile | 4 +- .../controller/src/techempower.cpp | 6 +- .../paozhu_benchmark/models/Fortune.cpp | 2 +- .../paozhu/paozhu_benchmark/models/World.cpp | 2 +- .../paozhu_benchmark/models/include/Fortune.h | 4 +- .../paozhu_benchmark/models/include/World.h | 4 +- .../include/{fortunebase.h => fortune_base.h} | 30 +- .../orm/include/fortune_mysql.h | 614 ++++++++++++++++-- .../orm/include/{worldbase.h => world_base.h} | 30 +- .../orm/include/world_mysql.h | 614 ++++++++++++++++-- 10 files changed, 1133 insertions(+), 177 deletions(-) rename frameworks/C++/paozhu/paozhu_benchmark/orm/include/{fortunebase.h => fortune_base.h} (98%) rename frameworks/C++/paozhu/paozhu_benchmark/orm/include/{worldbase.h => world_base.h} (98%) diff --git a/frameworks/C++/paozhu/paozhu.dockerfile b/frameworks/C++/paozhu/paozhu.dockerfile index f71728d65f2..a5995e66b67 100644 --- a/frameworks/C++/paozhu/paozhu.dockerfile +++ b/frameworks/C++/paozhu/paozhu.dockerfile @@ -94,8 +94,8 @@ RUN mkdir ./paozhu/orm/include COPY ./paozhu_benchmark/orm/orm.h ./paozhu/orm/ -COPY ./paozhu_benchmark/orm/include/fortunebase.h ./paozhu/orm/include/ -COPY ./paozhu_benchmark/orm/include/worldbase.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/fortune_base.h ./paozhu/orm/include/ +COPY ./paozhu_benchmark/orm/include/world_base.h ./paozhu/orm/include/ COPY ./paozhu_benchmark/orm/include/fortune_mysql.h ./paozhu/orm/include/ COPY ./paozhu_benchmark/orm/include/world_mysql.h ./paozhu/orm/include/ diff --git a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp index 14fb3d3c71b..045a53ba2d4 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp @@ -166,9 +166,9 @@ asio::awaitable techempowercached_queries(std::shared_ptr auto myworld = orm::World(); std::string mycacheid = "alldatacache"; - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); - std::vector allcachedata_array; + std::vector allcachedata_array; allcachedata_array.reserve(10000); //create rand data to cache if (temp_cache.check(mycacheid) > -1) @@ -227,7 +227,7 @@ asio::awaitable techempowercached_db(std::shared_ptr peer auto myworld = orm::World(); std::string mycacheid = "my" + std::to_string(get_num); - pzcache> &temp_cache = pzcache>::conn(); + pzcache> &temp_cache = pzcache>::conn(); myworld.record.reserve(get_num); if (temp_cache.check(mycacheid) > -1) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp index 4bb6dd1bc5c..96ede3889a4 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/Fortune.cpp @@ -1,6 +1,6 @@ #include "fortune_mysql.h" -#include "fortunebase.h" +#include "fortune_base.h" #include "Fortune.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp index 970e3427398..eb721c0fda6 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/World.cpp @@ -1,6 +1,6 @@ #include "world_mysql.h" -#include "worldbase.h" +#include "world_base.h" #include "World.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h index 1f53aa1e51d..321ee707da7 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/Fortune.h @@ -1,13 +1,13 @@ #ifndef ORM_DEFAULT_FORTUNE_H #define ORM_DEFAULT_FORTUNE_H #include "fortune_mysql.h" -#include "fortunebase.h" +#include "fortune_base.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ namespace orm { - class Fortune : public fortune_mysql{ + class Fortune : public fortune_mysql{ public: Fortune(std::string dbtag); Fortune(); diff --git a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h index 0967117ebb0..56a5db1620f 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/models/include/World.h @@ -1,13 +1,13 @@ #ifndef ORM_DEFAULT_WORLD_H #define ORM_DEFAULT_WORLD_H #include "world_mysql.h" -#include "worldbase.h" +#include "world_base.h" /* 如果此文件存在不会自动覆盖,没有则会自动生成。 *If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */ namespace orm { - class World : public world_mysql{ + class World : public world_mysql{ public: World(std::string dbtag); World(); diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_base.h similarity index 98% rename from frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h rename to frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_base.h index 69ed9e6577b..ce6dfa47786 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortunebase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_base.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_FORTUNEBASEMATA_H /* *This file is auto create from paozhu_cli -*本文件为自动生成 Tue, 08 Apr 2025 07:55:59 GMT +*本文件为自动生成 Sat, 26 Apr 2025 15:58:21 GMT ***/ #include #include @@ -19,19 +19,19 @@ namespace orm { -struct fortunebase +struct fortune_base { struct meta{ unsigned int id = 0; ///**/ std::string message = ""; ///**/ } data; - std::vector record; + std::vector record; std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . unsigned int _offset=0; -std::vector::iterator begin(){ return record.begin(); } -std::vector::iterator end(){ return record.end(); } -std::vector::const_iterator begin() const{ return record.begin(); } -std::vector::const_iterator end() const{ return record.end(); } +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } static constexpr std::array col_names={"id","message"}; static constexpr std::array col_types={3,253}; static constexpr std::array col_length={0,0}; @@ -75,7 +75,7 @@ break; record.clear(); } void data_reset(){ - fortunebase::meta metatemp; + fortune_base::meta metatemp; data = metatemp; } @@ -610,7 +610,7 @@ tempsql<<"\"message\":\""< getRecord(){ +std::vector getRecord(){ return record; } @@ -1145,7 +1145,7 @@ std::vector getRecord(){ } template,bool>::type = true > - T getVal([[maybe_unused]] fortunebase::meta & iter,[[maybe_unused]] std::string keyname) + T getVal([[maybe_unused]] fortune_base::meta & iter,[[maybe_unused]] std::string keyname) { @@ -1179,7 +1179,7 @@ std::vector getRecord(){ } template,bool>::type = true > - T getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + T getVal([[maybe_unused]] fortune_base::meta & iter,std::string keyname) { unsigned char kpos; kpos=findcolpos(keyname); @@ -1211,7 +1211,7 @@ std::vector getRecord(){ } template::value,bool>::type = true > - std::string getVal([[maybe_unused]] fortunebase::meta & iter,std::string keyname) + std::string getVal([[maybe_unused]] fortune_base::meta & iter,std::string keyname) { unsigned char kpos; diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h index 083b73125ad..5bca5120b86 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/fortune_mysql.h @@ -4005,18 +4005,8 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') - { - } - else - { - wheresql.push_back('='); - } - - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + wheresql.push_back('='); + wheresql.append(std::to_string(val)); return *mod; } @@ -4082,14 +4072,7 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') - { - } - else - { - wheresql.push_back('='); - } + wheresql.push_back('='); if (obj.is_string()) { @@ -4131,9 +4114,7 @@ M_MODEL& or_leMessage(T val) } wheresql.append(wq); wheresql.push_back(bi); - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + wheresql.append(std::to_string(val)); return *mod; } @@ -4192,14 +4173,135 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.push_back('='); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereBT(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('>'); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereBE(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(">="); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereLT(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; } + wheresql.append(wq); + wheresql.append(" < "); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereLE(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" <= "); wheresql.push_back('\''); wheresql.append(val); @@ -4503,19 +4605,167 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.push_back('='); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereBT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } } - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" > "); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereBE(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" >= "); + wheresql.append(std::to_string(val)); return *mod; } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereLT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" < "); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereLE(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" <= "); + wheresql.append(std::to_string(val)); + return *mod; + } + //where and + M_MODEL &whereEQ(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('='); + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + M_MODEL &whereAnd(const std::string &wq, const std::string &val) { if (wheresql.empty()) @@ -4540,22 +4790,80 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.push_back('='); + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + //where string or + + M_MODEL &whereOrBT(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; } + wheresql.append(wq); + wheresql.push_back('>'); wheresql.push_back('\''); wheresql.append(val); wheresql.push_back('\''); + return *mod; + } + M_MODEL &whereOrBE(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(">="); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); return *mod; } - M_MODEL &whereOr(const std::string &wq) + + M_MODEL &whereOrLT(const std::string &wq, const std::string &val) { if (wheresql.empty()) { @@ -4579,11 +4887,15 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); + wheresql.append(" < "); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); return *mod; } - template - requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> - M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + + M_MODEL &whereOrLE(const std::string &wq, const std::string &val) { if (wheresql.empty()) { @@ -4607,20 +4919,49 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.append(" <= "); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + //where or + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrBT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } } - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" > "); + wheresql.append(std::to_string(val)); return *mod; } - M_MODEL &whereOr(const std::string &wq, const std::string &val) + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrBE(const std::string &wq, _SQL_Value val) { if (wheresql.empty()) { @@ -4644,15 +4985,154 @@ M_MODEL& or_leMessage(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.append(" >= "); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrLT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; } + wheresql.append(wq); + wheresql.append(" < "); + wheresql.append(std::to_string(val)); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrLE(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" <= "); + wheresql.append(std::to_string(val)); + return *mod; + } + + M_MODEL &whereOr(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('='); + wheresql.append(std::to_string(val)); + return *mod; + } + M_MODEL &whereOr(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('='); wheresql.push_back('\''); wheresql.append(val); wheresql.push_back('\''); @@ -7021,7 +7501,7 @@ M_MODEL& or_leMessage(T val) temp_cache.save(sqlhashid, cache_data, exp_time); return true; } - B_BASE::meta &get_cache(const std::string &cache_key_name) + typename B_BASE::meta &get_cache(const std::string &cache_key_name) { try { @@ -10764,7 +11244,7 @@ M_MODEL& or_leMessage(T val) return *mod; } islock_conn = true; - + if (islock_conn) { if (!edit_conn) @@ -10776,16 +11256,15 @@ M_MODEL& or_leMessage(T val) { edit_conn = conn_obj->get_edit_conn(); } - sqlstring="start transaction"; + sqlstring = "start transaction"; edit_conn->write_sql(sqlstring); iscommit = true; - return *mod; } M_MODEL &rollback() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10806,16 +11285,16 @@ M_MODEL& or_leMessage(T val) { edit_conn = conn_obj->get_edit_conn(); } - sqlstring="rollback"; + sqlstring = "rollback"; edit_conn->write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; return *mod; } M_MODEL &commit() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10834,17 +11313,16 @@ M_MODEL& or_leMessage(T val) } else { - edit_conn =conn_obj->get_edit_conn(); + edit_conn = conn_obj->get_edit_conn(); } - sqlstring="commit"; + sqlstring = "commit"; edit_conn->write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; return *mod; } - asio::awaitable async_begin_commit() { if (!conn_empty()) @@ -10864,7 +11342,7 @@ M_MODEL& or_leMessage(T val) { edit_conn = co_await conn_obj->async_get_edit_conn(); } - sqlstring="start transaction"; + sqlstring = "start transaction"; co_await edit_conn->async_write_sql(sqlstring); iscommit = true; @@ -10872,7 +11350,7 @@ M_MODEL& or_leMessage(T val) } asio::awaitable async_rollback() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10893,17 +11371,17 @@ M_MODEL& or_leMessage(T val) { edit_conn = co_await conn_obj->async_get_edit_conn(); } - sqlstring="rollback"; + sqlstring = "rollback"; co_await edit_conn->async_write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; co_return true; } asio::awaitable async_commit() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10924,10 +11402,10 @@ M_MODEL& or_leMessage(T val) { edit_conn = co_await conn_obj->async_get_edit_conn(); } - sqlstring="commit"; + sqlstring = "commit"; co_await edit_conn->async_write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; co_return true; } diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_base.h similarity index 98% rename from frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h rename to frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_base.h index 0101db0f660..7b620ca6952 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/worldbase.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_base.h @@ -2,7 +2,7 @@ #define ORM_DEFAULT_WORLDBASEMATA_H /* *This file is auto create from paozhu_cli -*本文件为自动生成 Tue, 08 Apr 2025 07:55:59 GMT +*本文件为自动生成 Sat, 26 Apr 2025 15:58:21 GMT ***/ #include #include @@ -19,19 +19,19 @@ namespace orm { -struct worldbase +struct world_base { struct meta{ unsigned int id = 0; ///**/ int randomnumber = 0; ///**/ } data; - std::vector record; + std::vector record; std::string _rmstag="default";//this value must be default or tag value, tag in mysqlconnect config file . unsigned int _offset=0; -std::vector::iterator begin(){ return record.begin(); } -std::vector::iterator end(){ return record.end(); } -std::vector::const_iterator begin() const{ return record.begin(); } -std::vector::const_iterator end() const{ return record.end(); } +std::vector::iterator begin(){ return record.begin(); } +std::vector::iterator end(){ return record.end(); } +std::vector::const_iterator begin() const{ return record.begin(); } +std::vector::const_iterator end() const{ return record.end(); } static constexpr std::array col_names={"id","randomnumber"}; static constexpr std::array col_types={3,3}; static constexpr std::array col_length={0,0}; @@ -75,7 +75,7 @@ break; record.clear(); } void data_reset(){ - worldbase::meta metatemp; + world_base::meta metatemp; data = metatemp; } @@ -653,7 +653,7 @@ if(data.randomnumber==0){ void from_json(const std::string &json_content) { record.clear(); - worldbase::meta metatemp; + world_base::meta metatemp; data=metatemp; unsigned int json_offset=0; bool isarray=false; @@ -1106,14 +1106,14 @@ if(record[n].randomnumber==0){ int getRandomnumber(){ return data.randomnumber; } void setRandomnumber( int val){ data.randomnumber=val;} -worldbase::meta getnewData(){ +world_base::meta getnewData(){ struct meta newdata; return newdata; } -worldbase::meta getData(){ +world_base::meta getData(){ return data; } -std::vector getRecord(){ +std::vector getRecord(){ return record; } @@ -1200,7 +1200,7 @@ std::vector getRecord(){ } template,bool>::type = true > - T getVal([[maybe_unused]] worldbase::meta & iter,[[maybe_unused]] std::string keyname) + T getVal([[maybe_unused]] world_base::meta & iter,[[maybe_unused]] std::string keyname) { @@ -1237,7 +1237,7 @@ std::vector getRecord(){ } template,bool>::type = true > - T getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + T getVal([[maybe_unused]] world_base::meta & iter,std::string keyname) { unsigned char kpos; kpos=findcolpos(keyname); @@ -1266,7 +1266,7 @@ std::vector getRecord(){ } template::value,bool>::type = true > - std::string getVal([[maybe_unused]] worldbase::meta & iter,std::string keyname) + std::string getVal([[maybe_unused]] world_base::meta & iter,std::string keyname) { unsigned char kpos; diff --git a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h index f19be184169..c48cbc517f4 100644 --- a/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h +++ b/frameworks/C++/paozhu/paozhu_benchmark/orm/include/world_mysql.h @@ -3845,18 +3845,8 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') - { - } - else - { - wheresql.push_back('='); - } - - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + wheresql.push_back('='); + wheresql.append(std::to_string(val)); return *mod; } @@ -3922,14 +3912,7 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') - { - } - else - { - wheresql.push_back('='); - } + wheresql.push_back('='); if (obj.is_string()) { @@ -3971,9 +3954,7 @@ M_MODEL& or_leRandomnumber(T val) } wheresql.append(wq); wheresql.push_back(bi); - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + wheresql.append(std::to_string(val)); return *mod; } @@ -4032,14 +4013,135 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.push_back('='); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereBT(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('>'); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereBE(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(">="); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereLT(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; } + wheresql.append(wq); + wheresql.append(" < "); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + M_MODEL &whereLE(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" <= "); wheresql.push_back('\''); wheresql.append(val); @@ -4343,19 +4445,167 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.push_back('='); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereBT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } } - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" > "); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereBE(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" >= "); + wheresql.append(std::to_string(val)); return *mod; } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereLT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" < "); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereLE(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" <= "); + wheresql.append(std::to_string(val)); + return *mod; + } + //where and + M_MODEL &whereEQ(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" AND "); + } + else + { + if (!iskuohao) + { + wheresql.append(" AND "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('='); + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + M_MODEL &whereAnd(const std::string &wq, const std::string &val) { if (wheresql.empty()) @@ -4380,22 +4630,80 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.push_back('='); + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + + return *mod; + } + //where string or + + M_MODEL &whereOrBT(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; } + wheresql.append(wq); + wheresql.push_back('>'); wheresql.push_back('\''); wheresql.append(val); wheresql.push_back('\''); + return *mod; + } + M_MODEL &whereOrBE(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(">="); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); return *mod; } - M_MODEL &whereOr(const std::string &wq) + + M_MODEL &whereOrLT(const std::string &wq, const std::string &val) { if (wheresql.empty()) { @@ -4419,11 +4727,15 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); + wheresql.append(" < "); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); return *mod; } - template - requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> - M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + + M_MODEL &whereOrLE(const std::string &wq, const std::string &val) { if (wheresql.empty()) { @@ -4447,20 +4759,49 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.append(" <= "); + + wheresql.push_back('\''); + wheresql.append(val); + wheresql.push_back('\''); + return *mod; + } + + //where or + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrBT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } } - std::stringstream _stream; - _stream << val; - wheresql.append(_stream.str()); + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" > "); + wheresql.append(std::to_string(val)); return *mod; } - M_MODEL &whereOr(const std::string &wq, const std::string &val) + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrBE(const std::string &wq, _SQL_Value val) { if (wheresql.empty()) { @@ -4484,15 +4825,154 @@ M_MODEL& or_leRandomnumber(T val) ishascontent = true; } wheresql.append(wq); - char bi = wq.back(); - if (bi == '=' || bi == '>' || bi == '<') + wheresql.append(" >= "); + wheresql.append(std::to_string(val)); + return *mod; + } + + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrLT(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) { } else { - wheresql.push_back('='); + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; } + wheresql.append(wq); + wheresql.append(" < "); + wheresql.append(std::to_string(val)); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOrLE(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.append(" <= "); + wheresql.append(std::to_string(val)); + return *mod; + } + + M_MODEL &whereOr(const std::string &wq) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + return *mod; + } + template + requires std::is_integral_v<_SQL_Value> || std::is_floating_point_v<_SQL_Value> + M_MODEL &whereOr(const std::string &wq, _SQL_Value val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('='); + wheresql.append(std::to_string(val)); + return *mod; + } + M_MODEL &whereOr(const std::string &wq, const std::string &val) + { + if (wheresql.empty()) + { + } + else + { + if (ishascontent) + { + wheresql.append(" OR "); + } + else + { + if (!iskuohao) + { + wheresql.append(" OR "); + } + } + } + if (iskuohao) + { + ishascontent = true; + } + wheresql.append(wq); + wheresql.push_back('='); wheresql.push_back('\''); wheresql.append(val); wheresql.push_back('\''); @@ -6861,7 +7341,7 @@ M_MODEL& or_leRandomnumber(T val) temp_cache.save(sqlhashid, cache_data, exp_time); return true; } - B_BASE::meta &get_cache(const std::string &cache_key_name) + typename B_BASE::meta &get_cache(const std::string &cache_key_name) { try { @@ -10604,7 +11084,7 @@ M_MODEL& or_leRandomnumber(T val) return *mod; } islock_conn = true; - + if (islock_conn) { if (!edit_conn) @@ -10616,16 +11096,15 @@ M_MODEL& or_leRandomnumber(T val) { edit_conn = conn_obj->get_edit_conn(); } - sqlstring="start transaction"; + sqlstring = "start transaction"; edit_conn->write_sql(sqlstring); iscommit = true; - return *mod; } M_MODEL &rollback() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10646,16 +11125,16 @@ M_MODEL& or_leRandomnumber(T val) { edit_conn = conn_obj->get_edit_conn(); } - sqlstring="rollback"; + sqlstring = "rollback"; edit_conn->write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; return *mod; } M_MODEL &commit() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10674,17 +11153,16 @@ M_MODEL& or_leRandomnumber(T val) } else { - edit_conn =conn_obj->get_edit_conn(); + edit_conn = conn_obj->get_edit_conn(); } - sqlstring="commit"; + sqlstring = "commit"; edit_conn->write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; return *mod; } - asio::awaitable async_begin_commit() { if (!conn_empty()) @@ -10704,7 +11182,7 @@ M_MODEL& or_leRandomnumber(T val) { edit_conn = co_await conn_obj->async_get_edit_conn(); } - sqlstring="start transaction"; + sqlstring = "start transaction"; co_await edit_conn->async_write_sql(sqlstring); iscommit = true; @@ -10712,7 +11190,7 @@ M_MODEL& or_leRandomnumber(T val) } asio::awaitable async_rollback() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10733,17 +11211,17 @@ M_MODEL& or_leRandomnumber(T val) { edit_conn = co_await conn_obj->async_get_edit_conn(); } - sqlstring="rollback"; + sqlstring = "rollback"; co_await edit_conn->async_write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; co_return true; } asio::awaitable async_commit() { - if(iscommit==false) + if (iscommit == false) { error_msg = "not begin_commit"; iserror = true; @@ -10764,10 +11242,10 @@ M_MODEL& or_leRandomnumber(T val) { edit_conn = co_await conn_obj->async_get_edit_conn(); } - sqlstring="commit"; + sqlstring = "commit"; co_await edit_conn->async_write_sql(sqlstring); - iscommit = false; + iscommit = false; islock_conn = false; co_return true; } From 0d2c3b32a18193b2bd6f82cb4b1eeb428bb49998 Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Mon, 28 Apr 2025 19:33:29 +0300 Subject: [PATCH 1417/1766] upgrade mORMot to 2.3.10796 - fixed memory corruption (#9862) Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/setup_and_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index af1a30ef7dc..562d471de60 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/e5ece53ec4ac4788d356f17d2d32ea16379a65a9 +URL=https://github.com/synopse/mORMot2/tarball/bfe812b82a35361274324afb203bd6a5b213444a #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 From bcf6799017a59e65b8b7ac6d9e85846a2cfaceb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Tue, 29 Apr 2025 00:34:04 +0800 Subject: [PATCH 1418/1766] Upgrade hyperlane (#9861) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme --- frameworks/Rust/hyperlane/Cargo.lock | 24 ++++++++++++------------ frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/README.md | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index f6b37ff672b..6c312ecc742 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -122,9 +122,9 @@ dependencies = [ [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "cf19e729cdbd51af9a397fb9ef8ac8378007b797f8273cfbfdf45dcaa316167b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.3" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -638,9 +638,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f7d507f95e723dd293f5c486554ab1e70692ee97c27fc4a493684f54dc6c9a" +checksum = "fbec9c630191b7df2029ba5a70558a8fa9b30e0bc73bcdb08ea1d69e9764ed4d" dependencies = [ "brotli", "flate2", @@ -655,9 +655,9 @@ checksum = "1292cbdcf2588d15f8bf14cac381785c11ca7634d6a088cad9eebb5068d2652b" [[package]] name = "http-type" -version = "3.64.2" +version = "3.67.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d8d89138b251e0a91cdaa261885bcfc959986cba2131d448bdc75f2e18c1d0" +checksum = "7db6b0794e5bb36a7bb661c755983428455a2dd1ee80ca579bb54256ceaf2975" dependencies = [ "ahash", "dashmap", @@ -682,9 +682,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.87.3" +version = "4.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0867d16811e67ce0cbf86a0c3fd7947934b1d53e2ee533f2d00e75f926636e8" +checksum = "1f21eb7a2d9b9462603f2df9a47e00504c74df98b5d45a5a62a58ae9e7ee3b4b" dependencies = [ "async-func", "clonelicious", @@ -1355,9 +1355,9 @@ dependencies = [ [[package]] name = "serde-xml-rs" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +checksum = "12ef8209566c27b96b10a096e25abc534e08e9bbbcf8e444b92640f1416dd1c6" dependencies = [ "log", "serde", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 9e013fda2da..300b57fba83 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.87.3" +hyperlane = "4.90.1" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.5", features = ["runtime-tokio", "postgres"] } diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index 20ab5eec3c4..731b60a4650 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -2,7 +2,7 @@ ## Description -Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication. +> Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication. Built with pure Rust and standard library, Hyperlane offers true cross-platform compatibility across Windows, Linux and macOS, with the same API experience on all platforms, powered by Tokio's async runtime for seamless networking without platform-specific dependencies. ## Database From 78254697694365cbee94d17c74f7555f992ddfa4 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 28 Apr 2025 22:59:48 +0200 Subject: [PATCH 1419/1766] [ruby/rack] Upgrade to Ruby 3.5-rc (#9866) --- frameworks/Ruby/rack/Gemfile | 2 ++ frameworks/Ruby/rack/Gemfile.lock | 1 + frameworks/Ruby/rack/rack-falcon.dockerfile | 2 +- frameworks/Ruby/rack/rack-iodine.dockerfile | 2 +- frameworks/Ruby/rack/rack-passenger.dockerfile | 2 +- frameworks/Ruby/rack/rack-pitchfork.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 2 +- frameworks/Ruby/rack/rack.dockerfile | 2 +- 8 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index e220b4f26a0..d9542044e1f 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -24,6 +24,7 @@ end group :passenger, optional: true do gem 'base64' # required by passenger on Ruby 3.4 + gem 'logger' # required by passenger on Ruby 3.5 gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false end @@ -36,6 +37,7 @@ group :puma, optional: true do end group :unicorn, optional: true do + gem 'logger' # required by unicorn on Ruby 3.5 gem 'unicorn', '~> 6.1', platforms: %i[ruby mswin] end diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index f4306e62409..68e903e172d 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -151,6 +151,7 @@ DEPENDENCIES iodine (~> 0.7) jdbc-postgres (~> 42.2) json (~> 2.10) + logger passenger (~> 6.0) pg (~> 1.5) pitchfork (~> 0.17) diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index 90abab433ad..572953b2e0b 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack-iodine.dockerfile b/frameworks/Ruby/rack/rack-iodine.dockerfile index 9b4908fb177..dfb4a14214f 100644 --- a/frameworks/Ruby/rack/rack-iodine.dockerfile +++ b/frameworks/Ruby/rack/rack-iodine.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack-passenger.dockerfile b/frameworks/Ruby/rack/rack-passenger.dockerfile index 1b4d069d1f7..fa2eef0c9b9 100644 --- a/frameworks/Ruby/rack/rack-passenger.dockerfile +++ b/frameworks/Ruby/rack/rack-passenger.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack-pitchfork.dockerfile b/frameworks/Ruby/rack/rack-pitchfork.dockerfile index 586d693eebb..c659dd52f7a 100644 --- a/frameworks/Ruby/rack/rack-pitchfork.dockerfile +++ b/frameworks/Ruby/rack/rack-pitchfork.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index ed1df927dc1..3968f0f6af0 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 0964890b059..63121a0ab02 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 ENV RUBY_MN_THREADS=1 From 4cd320b1e226d6356783e368b4f17e687f007f57 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 28 Apr 2025 23:00:05 +0200 Subject: [PATCH 1420/1766] [ruby/sinatra] Upgrade to Ruby 3.5-rc (#9867) --- .../sinatra-sequel-postgres-iodine-mri.dockerfile | 2 +- .../sinatra-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-postgres.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra.dockerfile | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile index bf29d5a1e9e..7d3e1f20c14 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc 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 eb430e68f49..50801f63715 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.4 +FROM ruby:3.5-rc 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 4b2196eabd2..fbd5ccb65c3 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.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index 5ba93d67b8c..3ec82224ff8 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile index 30dac9dc01a..a78a053763f 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc 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 4cc75bd9383..59ee177fd7e 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.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 338fd9d04d4..42a0b7ad813 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index db9fccb2d5a..ac4a1618ed3 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 From b685ea7866154c6e574297d3e4867ec4d282a3d5 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 28 Apr 2025 23:00:24 +0200 Subject: [PATCH 1421/1766] [ruby/rails] Upgrade to Ruby 3.5-rc (#9868) --- frameworks/Ruby/rails/rails-falcon.dockerfile | 2 +- frameworks/Ruby/rails/rails-iodine.dockerfile | 2 +- frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails-pitchfork.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/rails/rails-falcon.dockerfile b/frameworks/Ruby/rails/rails-falcon.dockerfile index 7940230ea33..6ede5622c05 100644 --- a/frameworks/Ruby/rails/rails-falcon.dockerfile +++ b/frameworks/Ruby/rails/rails-falcon.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server diff --git a/frameworks/Ruby/rails/rails-iodine.dockerfile b/frameworks/Ruby/rails/rails-iodine.dockerfile index b91de6b668d..ceab1c1ba4f 100644 --- a/frameworks/Ruby/rails/rails-iodine.dockerfile +++ b/frameworks/Ruby/rails/rails-iodine.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index dcea5fa9a56..07fe63a04b4 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server diff --git a/frameworks/Ruby/rails/rails-pitchfork.dockerfile b/frameworks/Ruby/rails/rails-pitchfork.dockerfile index b57d81b28c1..66b26a16b55 100644 --- a/frameworks/Ruby/rails/rails-pitchfork.dockerfile +++ b/frameworks/Ruby/rails/rails-pitchfork.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc 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 e4288a62451..6773d8236b0 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server From 8b56fe53d93983d8de769e2ce6416908e83ae09c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 28 Apr 2025 23:00:45 +0200 Subject: [PATCH 1422/1766] [ruby/roda] Upgrade to Ruby 3.5-rc (#9869) --- frameworks/Ruby/roda-sequel/Gemfile | 1 + frameworks/Ruby/roda-sequel/Gemfile.lock | 2 ++ .../Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile | 2 +- .../roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 2 +- 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index d021a2b4bb9..19b7adb1f11 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -25,5 +25,6 @@ group :puma, optional: true do end group :unicorn, optional: true do + gem 'logger' # required by unicorn on Ruby 3.5 gem "unicorn", "~> 6.1", platforms: %i[ruby mswin], require: false end diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index a2e9337de97..47ed8648d3b 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -7,6 +7,7 @@ GEM iodine (0.7.58) json (2.10.2) kgio (2.11.4) + logger (1.7.0) mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) @@ -36,6 +37,7 @@ DEPENDENCIES erubi (~> 1.12) iodine (~> 0.7) json (~> 2.8) + logger mysql2 (~> 0.5) pg (~> 1.4) puma (~> 6.2) diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile index 850c7fe36f9..b8990b4ba3c 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc 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 035f02cc40a..cc307f54a13 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.4 +FROM ruby:3.5-rc 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 6c731ee6b97..0db48567b65 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.4 +FROM ruby:3.5-rc 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 02319f0499d..7a19e414a63 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ADD ./ /roda-sequel WORKDIR /roda-sequel From f2888e45945ac0f3df53d89d6d0aafe3534735c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 01:54:37 +0000 Subject: [PATCH 1423/1766] Bump net-imap from 0.5.6 to 0.5.7 in /frameworks/Ruby/rails Bumps [net-imap](https://github.com/ruby/net-imap) from 0.5.6 to 0.5.7. - [Release notes](https://github.com/ruby/net-imap/releases) - [Commits](https://github.com/ruby/net-imap/compare/v0.5.6...v0.5.7) --- updated-dependencies: - dependency-name: net-imap dependency-version: 0.5.7 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 a2f99e86af3..a630af74eca 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -164,7 +164,7 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.4) - net-imap (0.5.6) + net-imap (0.5.7) date net-protocol net-pop (0.1.2) From 50c9bd18a22a86acff7c2d9c2f08490b99847f83 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 29 Apr 2025 18:01:07 +0200 Subject: [PATCH 1424/1766] [ruby/rage] Upgrade to Ruby 3.5-rc (#9871) Ruby 3.5 requires including logger gem as a dependency. --- frameworks/Ruby/rage-sequel/Gemfile | 1 + frameworks/Ruby/rage-sequel/Gemfile.lock | 4 +++- frameworks/Ruby/rage-sequel/rage-sequel.dockerfile | 2 +- frameworks/Ruby/rage/rage.dockerfile | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/Gemfile b/frameworks/Ruby/rage-sequel/Gemfile index 4ee2e620f6e..c3d6bfb0968 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile +++ b/frameworks/Ruby/rage-sequel/Gemfile @@ -5,3 +5,4 @@ gem "rage-rb", "~> 1.10" gem "pg", "~> 1.0" gem 'sequel', '~> 5.0' gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false +gem 'logger' # required for ruby 3.5 diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index 866b6c60c06..b870586e216 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -2,6 +2,7 @@ GEM remote: https://rubygems.org/ specs: bigdecimal (3.1.9) + logger (1.7.0) pg (1.5.9) rack (2.2.13) rack-test (2.2.0) @@ -21,13 +22,14 @@ GEM pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) thor (1.3.2) - zeitwerk (2.7.1) + zeitwerk (2.7.2) PLATFORMS ruby x86_64-darwin-20 DEPENDENCIES + logger pg (~> 1.0) rage-rb (~> 1.10) sequel (~> 5.0) diff --git a/frameworks/Ruby/rage-sequel/rage-sequel.dockerfile b/frameworks/Ruby/rage-sequel/rage-sequel.dockerfile index 096b256fe18..41bfd349920 100644 --- a/frameworks/Ruby/rage-sequel/rage-sequel.dockerfile +++ b/frameworks/Ruby/rage-sequel/rage-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc EXPOSE 8080 WORKDIR /rage-sequel diff --git a/frameworks/Ruby/rage/rage.dockerfile b/frameworks/Ruby/rage/rage.dockerfile index 4cc3098ae77..e73bb58f8c9 100644 --- a/frameworks/Ruby/rage/rage.dockerfile +++ b/frameworks/Ruby/rage/rage.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc EXPOSE 8080 WORKDIR /rage From bb2e66a5708032ac32041a147d26b2572856ad04 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 29 Apr 2025 18:01:24 +0200 Subject: [PATCH 1425/1766] [ruby/rack-sequel] Upgrade to Ruby 3.5-rc (#9872) --- frameworks/Ruby/rack-sequel/Gemfile | 1 + frameworks/Ruby/rack-sequel/Gemfile.lock | 2 ++ .../rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 2 +- 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 93632125c9e..bd353d6210f 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -19,4 +19,5 @@ end group :unicorn, optional: true do gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false + gem 'logger' # required by unicorn on Ruby 3.5 end diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 6216dbfb065..2758d3347a1 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -4,6 +4,7 @@ GEM bigdecimal (3.1.9) json (2.10.1) kgio (2.11.4) + logger (1.7.0) mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) @@ -27,6 +28,7 @@ PLATFORMS DEPENDENCIES json (~> 2.8) + logger mysql2 (~> 0.4) pg (~> 1.5) puma (~> 6.5) 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 e7271257774..a5d76c285a1 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.4 +FROM ruby:3.5-rc ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index ac998e5fa9b..aa704ec8fe3 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.4 +FROM ruby:3.5-rc 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 bc49545a709..c966eaa1c04 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.4 +FROM ruby:3.5-rc ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index 1c87d624525..76a88efab27 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ADD ./ /rack-sequel From e3652b6a81873ab7079968fad411a7280ec5c971 Mon Sep 17 00:00:00 2001 From: Thomas Segismont Date: Wed, 30 Apr 2025 18:44:50 +0200 Subject: [PATCH 1426/1766] [Quarkus] Mutiny combinedWith has been deprecated for removal (#9873) Follows-up on https://github.com/TechEmpower/FrameworkBenchmarks/pull/9831 --- .../main/java/io/quarkus/benchmark/resource/DbResource.java | 4 ++-- .../java/io/quarkus/benchmark/repository/WorldRepository.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 index e2533434d24..4237a81f8dc 100644 --- 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 @@ -40,7 +40,7 @@ public void queries(final RoutingContext rc) { }); Uni.combine().all().unis(worlds) - .combinedWith(v -> Arrays.asList(ret)) + .with(v -> Arrays.asList(ret)) .subscribe().with(list -> { sendJson(rc, new JsonArray(list)); }, @@ -61,7 +61,7 @@ public void updates(final RoutingContext rc) { }); Uni.combine().all().unis(worlds) - .combinedWith(v -> null) + .with(v -> null) .flatMap(v -> worldRepository.update(wordsToUpdate)) .map(updated -> wordsToUpdate) .subscribe().with(updatedWordsOrderedById -> { diff --git a/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java b/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java index 6aba8d45b00..90130a91022 100644 --- a/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java +++ b/frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java @@ -31,7 +31,7 @@ public Uni createData() { world.setRandomNumber(random.getNextRandom()); unis[i] = s.persist(world).map(v -> null); } - return Uni.combine().all().unis(unis).combinedWith(l -> null) + return Uni.combine().all().unis(unis).with(l -> null) .flatMap(v -> s.flush()) .map(v -> null); }); From c7c036e534c9fdf1bb1dee45415720d91b96dcb0 Mon Sep 17 00:00:00 2001 From: rio Date: Thu, 1 May 2025 03:26:28 +0900 Subject: [PATCH 1427/1766] Add extensions used in Laravel, Symfony. (#9874) * [php] Add extension for Laravel * Add PHP extension instead of polyfill * Change php.ini to the same settings as the Symfony Framework * [php] Add extension for Symfony * Add PHP extension instead of polyfill * Change php.ini to the same settings as the Symfony Framework --- frameworks/PHP/laravel/deploy/conf/php.ini | 4 ++-- frameworks/PHP/laravel/laravel.dockerfile | 2 +- frameworks/PHP/symfony/symfony.dockerfile | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/laravel/deploy/conf/php.ini b/frameworks/PHP/laravel/deploy/conf/php.ini index 98e34225e0d..6254bf9b20e 100644 --- a/frameworks/PHP/laravel/deploy/conf/php.ini +++ b/frameworks/PHP/laravel/deploy/conf/php.ini @@ -1770,14 +1770,14 @@ opcache.enable=1 opcache.enable_cli=1 ; The OPcache shared memory storage size. -;opcache.memory_consumption=128 +opcache.memory_consumption=256 ; The amount of memory for interned strings in Mbytes. ;opcache.interned_strings_buffer=8 ; The maximum number of keys (scripts) in the OPcache hash table. ; Only numbers between 200 and 1000000 are allowed. -;opcache.max_accelerated_files=10000 +opcache.max_accelerated_files=20000 ; The maximum percentage of "wasted" memory until a restart is scheduled. ;opcache.max_wasted_percentage=5 diff --git a/frameworks/PHP/laravel/laravel.dockerfile b/frameworks/PHP/laravel/laravel.dockerfile index 9b79ea86854..13ca827c6d3 100644 --- a/frameworks/PHP/laravel/laravel.dockerfile +++ b/frameworks/PHP/laravel/laravel.dockerfile @@ -7,7 +7,7 @@ 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.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl > /dev/null + php8.4-bcmath php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl php8.4-intl > /dev/null COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer diff --git a/frameworks/PHP/symfony/symfony.dockerfile b/frameworks/PHP/symfony/symfony.dockerfile index b9abd5c8361..2ce94a53eb6 100644 --- a/frameworks/PHP/symfony/symfony.dockerfile +++ b/frameworks/PHP/symfony/symfony.dockerfile @@ -7,8 +7,8 @@ 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.4-cli php8.4-fpm php8.4-pgsql \ - php8.4-mbstring php8.4-xml php8.4-curl php8.4-dev > /dev/null + php8.4-bcmath php8.4-cli php8.4-fpm php8.4-pgsql \ + php8.4-mbstring php8.4-xml php8.4-curl php8.4-dev php8.4-intl > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer From a1203fb0a3d593d7c32ddcf1dc7173cb03959361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Tue, 6 May 2025 00:07:28 +0800 Subject: [PATCH 1428/1766] upgrade feat (#9875) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 适配最新版 * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade feat * upgrade feat * upgrade feat --- frameworks/Java/smart-socket/pom.xml | 4 ++-- .../main/java/org/smartboot/http/MultipleQueriesHandler.java | 2 +- .../src/main/java/org/smartboot/http/SingleQueryHandler.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index b3af9102555..f16d0f03860 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -20,12 +20,12 @@ tech.smartboot.feat feat-cloud-starter - 0.8.3-SNAPSHOT + 0.9.0 io.github.smartboot.socket aio-pro - 1.5.57 + 1.5.62-SNAPSHOT tech.smartboot.servlet diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index 200f8ee2606..3ead0475962 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -27,7 +27,7 @@ public MultipleQueriesHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, CompletableFuture completableFuture) throws IOException { + public void handle(HttpRequest httpRequest, CompletableFuture completableFuture) throws IOException { HttpResponse response = httpRequest.getResponse(); Thread.startVirtualThread(() -> { try { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java index 326ac0e8782..c6f9f78b263 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java @@ -26,7 +26,7 @@ public SingleQueryHandler(DataSource dataSource) { } @Override - public void handle(HttpRequest httpRequest, CompletableFuture completableFuture) throws IOException { + public void handle(HttpRequest httpRequest, CompletableFuture completableFuture) throws IOException { HttpResponse response = httpRequest.getResponse(); Thread.startVirtualThread(() -> { try { From 5dfe7539c96c979eab2b14e1e79ad7e03a0a5fa6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 5 May 2025 18:07:51 +0200 Subject: [PATCH 1429/1766] [ruby] Update json gem to 2.11.3 (#9876) --- frameworks/Ruby/grape/Gemfile.lock | 2 +- frameworks/Ruby/hanami/Gemfile.lock | 2 +- frameworks/Ruby/padrino/Gemfile.lock | 2 +- frameworks/Ruby/rack-sequel/Gemfile.lock | 2 +- frameworks/Ruby/rack/Gemfile.lock | 2 +- frameworks/Ruby/rails/Gemfile.lock | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/grape/Gemfile.lock b/frameworks/Ruby/grape/Gemfile.lock index 1ccedb35a78..9fe2d5f8f8e 100644 --- a/frameworks/Ruby/grape/Gemfile.lock +++ b/frameworks/Ruby/grape/Gemfile.lock @@ -51,7 +51,7 @@ GEM zeitwerk i18n (1.14.7) concurrent-ruby (~> 1.0) - json (2.10.1) + json (2.11.3) kgio (2.11.4) logger (1.6.6) minitest (5.25.4) diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index 99f2203709c..478f58d77e6 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -111,7 +111,7 @@ GEM zeitwerk (~> 2.6) hansi (0.2.1) ice_nine (0.11.2) - json (2.10.2) + json (2.11.3) logger (1.6.6) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) diff --git a/frameworks/Ruby/padrino/Gemfile.lock b/frameworks/Ruby/padrino/Gemfile.lock index 850309a3430..2f1018f2f48 100644 --- a/frameworks/Ruby/padrino/Gemfile.lock +++ b/frameworks/Ruby/padrino/Gemfile.lock @@ -66,7 +66,7 @@ GEM drb (2.2.1) i18n (1.14.7) concurrent-ruby (~> 1.0) - json (2.10.2) + json (2.11.3) kgio (2.11.4) logger (1.6.6) mail (2.8.1) diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 2758d3347a1..e6f1ab330b7 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -2,7 +2,7 @@ GEM remote: https://rubygems.org/ specs: bigdecimal (3.1.9) - json (2.10.1) + json (2.11.3) kgio (2.11.4) logger (1.7.0) mysql2 (0.5.6) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 68e903e172d..95b91118ef6 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -61,7 +61,7 @@ GEM io-event (1.9.0) io-stream (0.6.1) iodine (0.7.58) - json (2.10.2) + json (2.11.3) kgio (2.11.4) language_server-protocol (3.17.0.4) lint_roller (1.1.0) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index a630af74eca..99b78fbb016 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -146,7 +146,7 @@ GEM pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - json (2.10.1) + json (2.11.3) localhost (1.3.1) logger (1.6.6) loofah (2.24.0) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 47ed8648d3b..ee13d01c007 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -5,7 +5,7 @@ GEM bigdecimal (3.1.9) erubi (1.13.1) iodine (0.7.58) - json (2.10.2) + json (2.11.3) kgio (2.11.4) logger (1.7.0) mysql2 (0.5.6) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 83fa4b0a229..048bb1d0518 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -4,7 +4,7 @@ GEM base64 (0.2.0) bigdecimal (3.1.9) iodine (0.7.58) - json (2.10.1) + json (2.11.3) kgio (2.11.4) logger (1.6.6) mustermann (3.0.3) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 083a4557c9f..cdca9846541 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -29,7 +29,7 @@ GEM i18n (1.14.7) concurrent-ruby (~> 1.0) iodine (0.7.58) - json (2.10.1) + json (2.11.3) kgio (2.11.4) logger (1.6.6) minitest (5.25.4) From 984876a50e6c5eb7d79a822021859e29f2b47594 Mon Sep 17 00:00:00 2001 From: Panov Yury <35775430+PanovYury@users.noreply.github.com> Date: Mon, 5 May 2025 21:13:59 +0500 Subject: [PATCH 1430/1766] update deno and oak versions and using postgresjs (#9877) Co-authored-by: = <=> --- frameworks/TypeScript/oak/README.md | 22 +- .../TypeScript/oak/benchmark_config.json | 36 +- frameworks/TypeScript/oak/deno.json | 8 + frameworks/TypeScript/oak/deno.lock | 391 ++++++++++++++++++ .../TypeScript/oak/oak-postgresjs.dockerfile | 19 + frameworks/TypeScript/oak/oak.dockerfile | 11 +- frameworks/TypeScript/oak/src/deps.ts | 20 - frameworks/TypeScript/oak/src/helpers.ts | 3 +- frameworks/TypeScript/oak/src/main.ts | 17 +- frameworks/TypeScript/oak/src/models.ts | 19 - frameworks/TypeScript/oak/src/postgres.ts | 35 ++ frameworks/TypeScript/oak/src/routes.ts | 68 +-- frameworks/TypeScript/oak/src/types.ts | 9 + frameworks/TypeScript/oak/src/utils.ts | 23 +- frameworks/TypeScript/oak/tsconfig.json | 6 - 15 files changed, 559 insertions(+), 128 deletions(-) create mode 100644 frameworks/TypeScript/oak/deno.json create mode 100644 frameworks/TypeScript/oak/deno.lock create mode 100644 frameworks/TypeScript/oak/oak-postgresjs.dockerfile delete mode 100644 frameworks/TypeScript/oak/src/deps.ts delete mode 100644 frameworks/TypeScript/oak/src/models.ts create mode 100644 frameworks/TypeScript/oak/src/postgres.ts create mode 100644 frameworks/TypeScript/oak/src/types.ts delete mode 100644 frameworks/TypeScript/oak/tsconfig.json diff --git a/frameworks/TypeScript/oak/README.md b/frameworks/TypeScript/oak/README.md index 4cd56cbd62c..9a5dc9d02da 100755 --- a/frameworks/TypeScript/oak/README.md +++ b/frameworks/TypeScript/oak/README.md @@ -2,13 +2,13 @@ ### Test Type Implementation Source Code -- [PLAINTEXT](src/routes.ts#L15) -- [JSON](src/routes.ts#L16) -- [DB](src/routes.ts#L17) -- [QUERY](src/routes.ts#L24) -- [UPDATE](src/routes.ts#L37) -- [FORTUNES](src/routes.ts#L53) -- [CACHED QUERY](src/routes.ts#L67) +- [PLAINTEXT](src/routes.ts#L18) +- [JSON](src/routes.ts#L19) +- [DB](src/routes.ts#L25) +- [QUERY](src/routes.ts#L29) +- [UPDATE](src/routes.ts#L39) +- [FORTUNES](src/routes.ts#L59) +- [CACHED QUERY](src/routes.ts#L73) ## Important Libraries @@ -16,7 +16,7 @@ The tests were run with: - [deno](https://deno.land) - [oak](https://deno.land/x/oak/) -- [cotton](https://deno.land/x/cotton/) +- [Postgres.js](https://github.com/porsager/postgres/) ## Test URLs @@ -34,11 +34,11 @@ http://localhost:8080/db ### QUERY -http://localhost:8080/query?q= +http://localhost:8080/queries?q= ### UPDATE -http://localhost:8080/update?q= +http://localhost:8080/updates?q= ### FORTUNES @@ -46,4 +46,4 @@ http://localhost:8080/fortunes ### CACHED QUERY -http://localhost:8080/cached_query?q= \ No newline at end of file +http://localhost:8080/cached_queries?q= \ No newline at end of file diff --git a/frameworks/TypeScript/oak/benchmark_config.json b/frameworks/TypeScript/oak/benchmark_config.json index aa9486a9c51..f2aed687002 100755 --- a/frameworks/TypeScript/oak/benchmark_config.json +++ b/frameworks/TypeScript/oak/benchmark_config.json @@ -3,6 +3,27 @@ "tests": [ { "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "oak", + "language": "TypeScript", + "flavor": "deno", + "orm": "None", + "platform": "deno", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "oak", + "notes": "", + "versus": "nodejs" + } + }, + { + "postgresjs": { "json_url": "/json", "plaintext_url": "/plaintext", "db_url": "/db", @@ -12,20 +33,19 @@ "cached_query_url": "/cached_queries?q=", "port": 8080, "approach": "Realistic", - "classification": "Platform", + "classification": "Micro", "database": "postgres", - "framework": "None", - "language": "Typescript", + "database_os": "Linux", + "framework": "oak", + "language": "TypeScript", "flavor": "deno", - "orm": "Micro", + "orm": "Raw", "platform": "deno", "webserver": "None", "os": "Linux", - "database_os": "Linux", - "display_name": "oak", + "display_name": "oak [postgresjs]", "notes": "", - "versus": "nodejs", - "tags": ["broken"] + "versus": "nodejs" } } ] diff --git a/frameworks/TypeScript/oak/deno.json b/frameworks/TypeScript/oak/deno.json new file mode 100644 index 00000000000..27f10ea36d7 --- /dev/null +++ b/frameworks/TypeScript/oak/deno.json @@ -0,0 +1,8 @@ +{ + "imports": { + "oak": "jsr:@oak/oak@17.1.4", + "postgres": "https://deno.land/x/postgresjs@v3.4.5/mod.js", + "lru-cache": "jsr:@std/cache@0.2.0/lru-cache", + "html": "https://deno.land/x/literal_html@1.1.0/mod.ts" + } +} diff --git a/frameworks/TypeScript/oak/deno.lock b/frameworks/TypeScript/oak/deno.lock new file mode 100644 index 00000000000..49179a1be72 --- /dev/null +++ b/frameworks/TypeScript/oak/deno.lock @@ -0,0 +1,391 @@ +{ + "version": "4", + "specifiers": { + "jsr:@oak/commons@1": "1.0.1", + "jsr:@oak/oak@17.1.4": "17.1.4", + "jsr:@std/assert@1": "1.0.13", + "jsr:@std/bytes@1": "1.0.5", + "jsr:@std/cache@0.2.0": "0.2.0", + "jsr:@std/crypto@1": "1.0.4", + "jsr:@std/encoding@1": "1.0.10", + "jsr:@std/encoding@^1.0.10": "1.0.10", + "jsr:@std/http@1": "1.0.15", + "jsr:@std/media-types@1": "1.1.0", + "jsr:@std/path@1": "1.0.9", + "npm:path-to-regexp@^6.3.0": "6.3.0" + }, + "jsr": { + "@oak/commons@1.0.1": { + "integrity": "889ff210f0b4292591721be07244ecb1b5c118742f5273c70cf30d7cd4184d0c", + "dependencies": [ + "jsr:@std/assert", + "jsr:@std/bytes", + "jsr:@std/crypto", + "jsr:@std/encoding@1", + "jsr:@std/http", + "jsr:@std/media-types" + ] + }, + "@oak/oak@17.1.4": { + "integrity": "60530b582bf276ff741e39cc664026781aa08dd5f2bc5134d756cc427bf2c13e", + "dependencies": [ + "jsr:@oak/commons", + "jsr:@std/assert", + "jsr:@std/bytes", + "jsr:@std/http", + "jsr:@std/media-types", + "jsr:@std/path", + "npm:path-to-regexp" + ] + }, + "@std/assert@1.0.13": { + "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29" + }, + "@std/bytes@1.0.5": { + "integrity": "4465dd739d7963d964c809202ebea6d5c6b8e3829ef25c6a224290fbb8a1021e" + }, + "@std/cache@0.2.0": { + "integrity": "63a2ccd5a9e7c03e430f7d34dfcfd0d0cfc90731a1eaf8208f4c66e418fc3035" + }, + "@std/crypto@1.0.4": { + "integrity": "cee245c453bd5366207f4d8aa25ea3e9c86cecad2be3fefcaa6cb17203d79340" + }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, + "@std/http@1.0.15": { + "integrity": "435a4934b4e196e82a8233f724da525f7b7112f3566502f28815e94764c19159", + "dependencies": [ + "jsr:@std/encoding@^1.0.10" + ] + }, + "@std/media-types@1.1.0": { + "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" + }, + "@std/path@1.0.9": { + "integrity": "260a49f11edd3db93dd38350bf9cd1b4d1366afa98e81b86167b4e3dd750129e" + } + }, + "npm": { + "path-to-regexp@6.3.0": { + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" + } + }, + "remote": { + "https://deno.land/std@0.132.0/_deno_unstable.ts": "23a1a36928f1b6d3b0170aaa67de09af12aa998525f608ff7331b9fb364cbde6", + "https://deno.land/std@0.132.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", + "https://deno.land/std@0.132.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617", + "https://deno.land/std@0.132.0/_wasm_crypto/crypto.mjs": "3b383eb715e8bfe61b4450ef0644b2653429c88d494807c86c5235979f62e56b", + "https://deno.land/std@0.132.0/_wasm_crypto/crypto.wasm.mjs": "0ad9ecc0d03ca8a083d9109db22e7507f019f63cf55b82ea618ab58855617577", + "https://deno.land/std@0.132.0/_wasm_crypto/mod.ts": "30a93c8b6b6c5b269e96a3e95d2c045d86a496814a8737443b77cad941d6a0b5", + "https://deno.land/std@0.132.0/async/abortable.ts": "87aa7230be8360c24ad437212311c9e8d4328854baec27b4c7abb26e85515c06", + "https://deno.land/std@0.132.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0", + "https://deno.land/std@0.132.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620", + "https://deno.land/std@0.132.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a", + "https://deno.land/std@0.132.0/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c", + "https://deno.land/std@0.132.0/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f", + "https://deno.land/std@0.132.0/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e", + "https://deno.land/std@0.132.0/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082", + "https://deno.land/std@0.132.0/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f", + "https://deno.land/std@0.132.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", + "https://deno.land/std@0.132.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", + "https://deno.land/std@0.132.0/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9", + "https://deno.land/std@0.132.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f", + "https://deno.land/std@0.132.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130", + "https://deno.land/std@0.132.0/encoding/hex.ts": "7f023e1e51cfd6b189682e602e8640939e7be71a300a2fcf3daf8f84dc609bbc", + "https://deno.land/std@0.132.0/flags/mod.ts": "430cf2d1c26e00286373b2647ebdca637f7558505e88e9c108a4742cd184c916", + "https://deno.land/std@0.132.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", + "https://deno.land/std@0.132.0/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379", + "https://deno.land/std@0.132.0/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5", + "https://deno.land/std@0.132.0/fs/exists.ts": "cb734d872f8554ea40b8bff77ad33d4143c1187eac621a55bf37781a43c56f6d", + "https://deno.land/std@0.132.0/hash/sha256.ts": "803846c7a5a8a5a97f31defeb37d72f519086c880837129934f5d6f72102a8e8", + "https://deno.land/std@0.132.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", + "https://deno.land/std@0.132.0/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d", + "https://deno.land/std@0.132.0/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9", + "https://deno.land/std@0.132.0/node/_crypto/constants.ts": "49011c87be4e45407ef5e99e96bde3f08656ebd8e6dfc99048c703dd0ce53952", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/base/buffer.js": "73beb8294eb29bd61458bbaaeeb51dfad4ec9c9868a62207a061d908f1637261", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/base/node.js": "4b777980d2a23088698fd2ff065bb311a2c713497d359e674cb6ef6baf267a0f", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/base/reporter.js": "8e4886e8ae311c9a92caf58bbbd8670326ceeae97430f4884e558e4acf8e8598", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/constants/der.js": "354b255479bff22a31d25bf08b217a295071700e37d0991cc05cac9f95e5e7ca", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/decoders/der.js": "c6faf66761daa43fbf79221308443893587c317774047b508a04c570713b76fb", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/decoders/pem.js": "8316ef7ce2ce478bc3dc1e9df1b75225d1eb8fb5d1378f8adf0cf19ecea5b501", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/encoders/der.js": "408336c88d17c5605ea64081261cf42267d8f9fda90098cb560aa6635bb00877", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/encoders/pem.js": "42a00c925b68c0858d6de0ba41ab89935b39fae9117bbf72a9abb2f4b755a2e7", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/mod.js": "7b78859707be10a0a1e4faccdd28cd5a4f71ad74a3e7bebda030757da97cd232", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/bn.js/bn.js": "abd1badd659fd0ae54e6a421a573a25aef4e795edc392178360cf716b144286d", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/aes.js": "1cf4c354c5bb341ffc9ab7207f471229835b021947225bce2e1642f26643847a", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/auth_cipher.js": "19b4dbb903e8406eb733176e6318d5e1a3bd382b67b72f7cf8e1c46cc6321ba4", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/decrypter.js": "05c1676942fd8e95837115bc2d1371bcf62e9bf19f6c3348870961fc64ddad0b", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/encrypter.js": "93ec98ab26fbeb5969eae2943e42fb66780f377b9b0ff0ecc32a9ed11201b142", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/ghash.js": "667b64845764a84f0096ef8cf7debed1a5f15ac9af26b379848237be57da399a", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/incr32.js": "4a7f0107753e4390b4ccc4dbd5200c5527d43f894f768e131903df30a09dfd67", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/mod.js": "d8eb88e7a317467831473621f32e60d7db9d981f6a2ae45d2fb2af170eab2d22", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cbc.js": "9790799cff181a074686c885708cb8eb473aeb3c86ff2e8d0ff911ae6c1e4431", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cfb.js": "a4e36ede6f26d8559d8f0528a134592761c706145a641bd9ad1100763e831cdb", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cfb1.js": "c6372f4973a68ca742682e81d1165e8869aaabf0091a8b963d4d60e5ee8e6f6a", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cfb8.js": "bd29eebb89199b056ff2441f7fb5e0300f458e13dcaaddbb8bc00cbdb199db67", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/ctr.js": "9c2cbac1fc8f9b58334faacb98e6c57e8c3712f673ea4cf2d528a2894998ab2f", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/ecb.js": "9629d193433688f0cfc432eca52838db0fb28d9eb4f45563df952bde50b59763", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/mod.js": "7d8516ef8a20565539eb17cad5bb70add02ac06d1891e8f47cb981c22821787e", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/ofb.js": "c23abaa6f1ec5343e9d7ba61d702acb3d81a0bd3d34dd2004e36975dc043d6ff", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/stream_cipher.js": "a533a03a2214c6b5934ce85a59eb1e04239fd6f429017c7ca3c443ec7e07e68f", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/xor.ts": "4417711c026eb9a07475067cd31fa601e88c2d6ababd606d33d1e74da6fcfd09", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_rsa.js": "de8c98d2379a70d8c239b4886e2b3a11c7204eec39ae6b65d978d0d516ee6b08", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/cipher_base.js": "f565ad9daf3b3dd3b68381bed848da94fb093a9e4e5a48c92f47e26cc229df39", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/evp_bytes_to_key.ts": "8bd9fa445576b3e39586bdbef7c907f1dfda201bf22602d2ca1c6d760366311e", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/asn1.js": "4f33b0197ffbe9cff62e5bad266e6b40d55874ea653552bb32ed251ad091f70a", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/certificate.js": "aab306870830a81ad188db8fa8e037d7f5dd6c5abdabbd9739558245d1a12224", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/fix_proc.js": "af3052b76f441878e102ffcfc7420692e65777af765e96f786310ae1acf7f76a", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/mod.js": "e923a13b27089a99eeb578d2ffb9b4cfe8ce690918fec05d0024fa126f3e1ce3", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/mgf.js": "5b81dc1680829b564fc5a00b842fb9c88916e4639b4fa27fa8bb6b759d272371", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/mod.js": "eb8b64d7a58ee3823c1b642e799cc7ed1257d99f4d4aefa2b4796dd112ec094a", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/private_decrypt.js": "0050df879f7c1338132c45056835f64e32140e2a2d5d03c1366ccce64855f632", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/public_encrypt.js": "0132cb4fb8f72593278474884195b9c52b4e9ba33d8ddd22116d07a07f47005a", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/with_public.js": "7373dac9b53b8331ccf3521c854a131dcb304a2e4d34cd116649118f7919ed0c", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/xor.js": "900c6fc8b95e1861d796193c41988f5f70a09c7059e42887a243d0113ecaf0fd", + "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/randombytes.ts": "f465cd8e114a3c110297e0143445b12125d729b25bada5bd88d5b30cf612d7dd", + "https://deno.land/std@0.132.0/node/_crypto/hash.ts": "6a84a079412d09ead27b900590f0bede9924bc7ce522b8b7d55183a2aaf63a68", + "https://deno.land/std@0.132.0/node/_crypto/pbkdf2.ts": "00af38578729b3060371dfee70dae502a5848b4cc4787c48f634195cab1ce89a", + "https://deno.land/std@0.132.0/node/_crypto/randomBytes.ts": "04e276bcbfa55b3502c7169deab3f2bf58bbc5e9727634f8a150eff734338e90", + "https://deno.land/std@0.132.0/node/_crypto/randomFill.ts": "019ff2a8330c3ede6e65af28c5a8e3dee9d404975749c8dadf6ba11ccc28528e", + "https://deno.land/std@0.132.0/node/_crypto/randomInt.ts": "2db981c2baf4ddac07b6da71f90677f4acf4dc2d93f351563fdd084d645b8413", + "https://deno.land/std@0.132.0/node/_crypto/scrypt.ts": "caf07a6b8afa6ac582f80f99ed7dc7fefd5476fcd2aad771b8440e5b883d6d70", + "https://deno.land/std@0.132.0/node/_crypto/timingSafeEqual.ts": "4a4ef17e482889d9d82138d5ffc0e787c32c04b1f12b28d076b1a69ceca46af1", + "https://deno.land/std@0.132.0/node/_crypto/types.ts": "d3fae758c5b62f63d8126c76eec31a5559a2f34305defb5fe2a7d9034057ff54", + "https://deno.land/std@0.132.0/node/_dns/_utils.ts": "42494c8b8fa1c13eb134c5696744f77197717fa857e4d05147f2395a739b0a40", + "https://deno.land/std@0.132.0/node/_events.mjs": "d7d56df4b9f69e445064bad5e5558978fb18c18c439bbb62fa13149b40d7fb99", + "https://deno.land/std@0.132.0/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5", + "https://deno.land/std@0.132.0/node/_fs/_fs_access.ts": "0700488320d37208d000b94767ab37208d469550767edab69b65b09a330f245d", + "https://deno.land/std@0.132.0/node/_fs/_fs_appendFile.ts": "5dca59d7f2ec33316d75da3d6a12d39f5c35b429bddf83f4b2c030b3a289d4b3", + "https://deno.land/std@0.132.0/node/_fs/_fs_chmod.ts": "8fc25677b82a2643686e6f8270a8f1bee87dd60986334591450699e199dac7d5", + "https://deno.land/std@0.132.0/node/_fs/_fs_chown.ts": "57858c54d376648fc3c8cf5a8ad4f7f19fb153b75fac3ed41df0332d757e7de9", + "https://deno.land/std@0.132.0/node/_fs/_fs_close.ts": "785a9d1a6d615e8aa9f5a4ac50c9a131931f8b0e17b3d4671cd1fd25a5c10f2b", + "https://deno.land/std@0.132.0/node/_fs/_fs_common.ts": "6a373d1583d9ec5cc7a8ff1072d77dc999e35282a320b7477038a2b209c304d3", + "https://deno.land/std@0.132.0/node/_fs/_fs_constants.ts": "5c20b190fc6b7cfdaf12a30ba545fc787db2c7bbe87ed5b890da99578116a339", + "https://deno.land/std@0.132.0/node/_fs/_fs_copy.ts": "675eb02a2dfc20dab1186bf6ed0a33b1abae656f440bc0a3ce74f385e0052eef", + "https://deno.land/std@0.132.0/node/_fs/_fs_dir.ts": "8a05f72e32dd568b41ef45f8f55f1f54e9a306a7588475fa7014289cd12872d9", + "https://deno.land/std@0.132.0/node/_fs/_fs_dirent.ts": "649c0a794e7b8d930cdd7e6a168b404aa0448bf784e0cfbe1bd6d25b99052273", + "https://deno.land/std@0.132.0/node/_fs/_fs_exists.ts": "83e9ca6ea1ab3c6c7c3fc45f3c1287ee88839f08140ac11056441537450055bb", + "https://deno.land/std@0.132.0/node/_fs/_fs_fdatasync.ts": "bbd078fea6c62c64d898101d697aefbfbb722797a75e328a82c2a4f2e7eb963d", + "https://deno.land/std@0.132.0/node/_fs/_fs_fstat.ts": "559ff6ff094337db37b0f3108aeaecf42672795af45b206adbd90105afebf9c6", + "https://deno.land/std@0.132.0/node/_fs/_fs_fsync.ts": "590be69ce5363dd4f8867f244cfabe8df89d40f86bbbe44fd00d69411d0b798e", + "https://deno.land/std@0.132.0/node/_fs/_fs_ftruncate.ts": "8eb2a9fcf026bd9b85dc07a22bc452c48db4be05ab83f5f2b6a0549e15c1f75f", + "https://deno.land/std@0.132.0/node/_fs/_fs_futimes.ts": "c753cb9e9f129a11d1110ed43905b8966ac2a1d362ed69d5a34bb44513b00082", + "https://deno.land/std@0.132.0/node/_fs/_fs_link.ts": "3f9ccce31c2e56284fbcf2c65ec2e6fed1d9e67a9997410223486ac5092888e3", + "https://deno.land/std@0.132.0/node/_fs/_fs_lstat.ts": "571cea559d270e3b2e7fc585b0eb051899f6d0e54b1786f5e2cee3e9f71e7f27", + "https://deno.land/std@0.132.0/node/_fs/_fs_mkdir.ts": "68421a23b6d3c2d0142a6d0b3ccdd87903f9c8f98d6754aba554ab4c6b435bb8", + "https://deno.land/std@0.132.0/node/_fs/_fs_mkdtemp.ts": "86eaec96c63ea178c749fa856115a345e9797baecad22297b9ef98e3d62b90e2", + "https://deno.land/std@0.132.0/node/_fs/_fs_open.ts": "b1ca72addd2723b2a5a876378e72609fbe168adad2006f5d7b4f1868beef65ca", + "https://deno.land/std@0.132.0/node/_fs/_fs_read.ts": "3b4ef96aad20f3f29a859125ebeac8c9461574743f70c2a7ef301b8505f7d036", + "https://deno.land/std@0.132.0/node/_fs/_fs_readFile.ts": "3eae6c930e08c1279d400c0f5a008e6d96949ff3a4f5bf7d43e1b94b94ce3854", + "https://deno.land/std@0.132.0/node/_fs/_fs_readdir.ts": "a546f01387b7c49ddc1bd78d0e123a9668c710c56cffb4d9577ef46703cab463", + "https://deno.land/std@0.132.0/node/_fs/_fs_readlink.ts": "00553cd155f3bea565ffe43d7f0c10d75e895455562e1e8ea153e8f4e7ac04c7", + "https://deno.land/std@0.132.0/node/_fs/_fs_realpath.ts": "3ec236e4ad3c171203043422939973b6a948200ec4802425db41fa60c860dde9", + "https://deno.land/std@0.132.0/node/_fs/_fs_rename.ts": "3be71e8f43275c349b7abb9343b6e6764df09fabcbd2d316f8ac170ea556c645", + "https://deno.land/std@0.132.0/node/_fs/_fs_rm.ts": "a9328f99d925d7c74d31361d466ca33475aa7c6d1d6f037a49ce1ed996f0a0b4", + "https://deno.land/std@0.132.0/node/_fs/_fs_rmdir.ts": "b74007891357e709b37e6721eb355a1c4f25575995bb7c961a3c40f03ebc624c", + "https://deno.land/std@0.132.0/node/_fs/_fs_stat.ts": "bd47ce0bfc2b867392abc6ec95878ab4f6dddb94af73903d6fa1a02ba3e26af8", + "https://deno.land/std@0.132.0/node/_fs/_fs_streams.ts": "0e54bd4e41b462a701d6729ea17db01624aa48109e402fea8eecf13be324cf16", + "https://deno.land/std@0.132.0/node/_fs/_fs_symlink.ts": "0bddc37c5092f847634bd41cee0b643b9c03fc541c0e635cf35da1fcb4d0f7fa", + "https://deno.land/std@0.132.0/node/_fs/_fs_truncate.ts": "e2d380f7a81f69c4d4db30c442558ba8d8dea561e5097af41022bb5724e494e5", + "https://deno.land/std@0.132.0/node/_fs/_fs_unlink.ts": "c537ca98e507972d65f0b113a179b5f5083f0da3e6f9fae29895fd2a9660c18a", + "https://deno.land/std@0.132.0/node/_fs/_fs_utimes.ts": "c4446b7e39bf6977eca4364360501a97b96db9ea41e0cdf49abddab73481a175", + "https://deno.land/std@0.132.0/node/_fs/_fs_watch.ts": "2338de777458021d39cb9f0a5f3ea1bd9109a7ca2c2ad6ec41029df1753838f8", + "https://deno.land/std@0.132.0/node/_fs/_fs_write.mjs": "8c130b8b9522e1e4b08e687eb27939240260c115fda1e38e99c57b4f3af6481f", + "https://deno.land/std@0.132.0/node/_fs/_fs_writeFile.ts": "79d176021c8ceae0d956763a33834166ebc3f1691ed9219a21674b2374f115c3", + "https://deno.land/std@0.132.0/node/_fs/_fs_writev.mjs": "274df0a109010862c8f8b320dc7784de9bd9425fe2a6afd05f1f06f547a25cba", + "https://deno.land/std@0.132.0/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1", + "https://deno.land/std@0.132.0/node/_options.ts": "27f3c1269a700d330cc046cf748aa9178b8fc39d1473de625688e07cb0eb9d28", + "https://deno.land/std@0.132.0/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce", + "https://deno.land/std@0.132.0/node/_process/process.ts": "84644b184053835670f79652d1ce3312c9ad079c211e6207ebefeedf159352a3", + "https://deno.land/std@0.132.0/node/_process/stdio.mjs": "971c3b086040d8521562155db13f22f9971d5c42c852b2081d4d2f0d8b6ab6bd", + "https://deno.land/std@0.132.0/node/_process/streams.mjs": "555062e177ad05f887147651fdda25fa55098475fcf142c8d162b8fe14097bbb", + "https://deno.land/std@0.132.0/node/_stream.mjs": "07f6cbabaad0382fb4b9a25e70ac3093a44022b859247f64726746e6373f1c91", + "https://deno.land/std@0.132.0/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf", + "https://deno.land/std@0.132.0/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615", + "https://deno.land/std@0.132.0/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600", + "https://deno.land/std@0.132.0/node/crypto.ts": "fffbc3fc3dcc16ea986d3e89eed5f70db7dfef2c18d1205a8c8fe5327ee0192d", + "https://deno.land/std@0.132.0/node/dns.ts": "ae2abd1bc8ac79543fe4d702f2aa3607101dc788b6eeba06e06436cb42ee3779", + "https://deno.land/std@0.132.0/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd", + "https://deno.land/std@0.132.0/node/fs.ts": "21a3189c460bd37ac3f6734e040587125b7c8435c0a9da4e6c57544a3aca81c2", + "https://deno.land/std@0.132.0/node/internal/assert.mjs": "118327c8866266534b30d3a36ad978204af7336dc2db3158b8167192918d4e06", + "https://deno.land/std@0.132.0/node/internal/async_hooks.ts": "8eca5b80f58ffb259e9b3a73536dc2fe2e67d07fd24bfe2aee325a4aa435edb3", + "https://deno.land/std@0.132.0/node/internal/blob.mjs": "52080b2f40b114203df67f8a6650f9fe3c653912b8b3ef2f31f029853df4db53", + "https://deno.land/std@0.132.0/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7", + "https://deno.land/std@0.132.0/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9", + "https://deno.land/std@0.132.0/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e", + "https://deno.land/std@0.132.0/node/internal/dtrace.ts": "50dd0e77b0269e47ff673bdb9ad0ef0ea3a3c53ac30c1695883ce4748e04ca14", + "https://deno.land/std@0.132.0/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f", + "https://deno.land/std@0.132.0/node/internal/errors.ts": "25f91691225b001660e6e64745ecd336fbf562cf0185e8896ff013c2d0226794", + "https://deno.land/std@0.132.0/node/internal/fs/streams.ts": "c925db185efdf56c35cde8270c07d61698b80603a90e07caf1cb4ff80abf195b", + "https://deno.land/std@0.132.0/node/internal/fs/utils.mjs": "2a571ecbd169b444f07b7193306f108fdcb4bfd9b394b33716ad05edf30e899e", + "https://deno.land/std@0.132.0/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03", + "https://deno.land/std@0.132.0/node/internal/idna.ts": "a8bdd28431f06630d8aad85d3cb8fd862459107af228c8805373ad2080f1c587", + "https://deno.land/std@0.132.0/node/internal/net.ts": "1239886cd2508a68624c2dae8abf895e8aa3bb15a748955349f9ac5539032238", + "https://deno.land/std@0.132.0/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a", + "https://deno.land/std@0.132.0/node/internal/process/per_thread.mjs": "a42b1dcfb009ad5039144a999a35a429e76112f9322febbe353eda9d1879d936", + "https://deno.land/std@0.132.0/node/internal/querystring.ts": "c3b23674a379f696e505606ddce9c6feabe9fc497b280c56705c340f4028fe74", + "https://deno.land/std@0.132.0/node/internal/stream_base_commons.ts": "934a9e69f46f2de644956edfa9fb040af7861e326fe5325dab38ef9caf2940bc", + "https://deno.land/std@0.132.0/node/internal/streams/_utils.ts": "77fceaa766679847e4d4c3c96b2573c00a790298d90551e8e4df1d5e0fdaad3b", + "https://deno.land/std@0.132.0/node/internal/streams/add-abort-signal.mjs": "5623b83fa64d439cc4a1f09ae47ec1db29512cc03479389614d8f62a37902f5e", + "https://deno.land/std@0.132.0/node/internal/streams/buffer_list.mjs": "c6a7b29204fae025ff5e9383332acaea5d44bc7c522a407a79b8f7a6bc6c312d", + "https://deno.land/std@0.132.0/node/internal/streams/compose.mjs": "b522daab35a80ae62296012a4254fd7edfc0366080ffe63ddda4e38fe6b6803e", + "https://deno.land/std@0.132.0/node/internal/streams/destroy.mjs": "9c9bbeb172a437041d529829f433df72cf0b63ae49f3ee6080a55ffbef7572ad", + "https://deno.land/std@0.132.0/node/internal/streams/duplex.mjs": "b014087cd04f79b8a4028d8b9423b987e07bbfacf3b5df518cb752ac3657580f", + "https://deno.land/std@0.132.0/node/internal/streams/end-of-stream.mjs": "38be76eaceac231dfde643e72bc0940625446bf6d1dbd995c91c5ba9fd59b338", + "https://deno.land/std@0.132.0/node/internal/streams/from.mjs": "134255c698ed63b33199911eb8e042f8f67e9682409bb11552e6120041ed1872", + "https://deno.land/std@0.132.0/node/internal/streams/legacy.mjs": "6ea28db95d4503447473e62f0b23ff473bfe1751223c33a3c5816652e93b257a", + "https://deno.land/std@0.132.0/node/internal/streams/passthrough.mjs": "a51074193b959f3103d94de41e23a78dfcff532bdba53af9146b86340d85eded", + "https://deno.land/std@0.132.0/node/internal/streams/pipeline.mjs": "9890b121759ede869174ef70c011fde964ca94d81f2ed97b8622d7cb17b49285", + "https://deno.land/std@0.132.0/node/internal/streams/readable.mjs": "a70c41171ae25c556b52785b0c178328014bd33d8c0e4d229d4adaac7414b6ca", + "https://deno.land/std@0.132.0/node/internal/streams/state.mjs": "9ef917392a9d8005a6e038260c5fd31518d2753aea0bc9e39824c199310434cb", + "https://deno.land/std@0.132.0/node/internal/streams/transform.mjs": "3b361abad2ac78f7ccb6f305012bafdc0e983dfa4bb6ecddb4626e34a781a5f5", + "https://deno.land/std@0.132.0/node/internal/streams/utils.mjs": "06c21d0db0d51f1bf1e3225a661c3c29909be80355d268e64ee5922fc5eb6c5e", + "https://deno.land/std@0.132.0/node/internal/streams/writable.mjs": "ad4e2b176ffdf752c8e678ead3a514679a5a8d652f4acf797115dceb798744d5", + "https://deno.land/std@0.132.0/node/internal/timers.mjs": "b43e24580cec2dd50f795e4342251a79515c0db21630c25b40fdc380a78b74e7", + "https://deno.land/std@0.132.0/node/internal/url.ts": "eacef0ace4f4c5394e9818a81499f4871b2a993d1bd3b902047e44a381ef0e22", + "https://deno.land/std@0.132.0/node/internal/util.mjs": "2f0c8ff553c175ea6e4ed13d7cd7cd6b86dc093dc2f783c6c3dfc63f60a0943e", + "https://deno.land/std@0.132.0/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e", + "https://deno.land/std@0.132.0/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb", + "https://deno.land/std@0.132.0/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa", + "https://deno.land/std@0.132.0/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60", + "https://deno.land/std@0.132.0/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a", + "https://deno.land/std@0.132.0/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519", + "https://deno.land/std@0.132.0/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b", + "https://deno.land/std@0.132.0/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94", + "https://deno.land/std@0.132.0/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2", + "https://deno.land/std@0.132.0/node/internal_binding/async_wrap.ts": "f06b8a403ad871248eb064190d27bf6fefdbe948991e71a18d7077390d5773f9", + "https://deno.land/std@0.132.0/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9", + "https://deno.land/std@0.132.0/node/internal_binding/cares_wrap.ts": "25b7b5d56612b2985260b673021828d6511a1c83b4c1927f5732cad2f2a718af", + "https://deno.land/std@0.132.0/node/internal_binding/config.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/connection_wrap.ts": "0380444ee94d5bd7b0b09921223d16729c9762a94e80b7f51eda49c7f42e6d0a", + "https://deno.land/std@0.132.0/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc", + "https://deno.land/std@0.132.0/node/internal_binding/contextify.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/credentials.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/crypto.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/errors.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/fs.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/fs_dir.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/fs_event_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/handle_wrap.ts": "e59df84b1fb1b9823b09774b3e512d9c0029b4557400d09dd02cd7661c2c4830", + "https://deno.land/std@0.132.0/node/internal_binding/heap_utils.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/http_parser.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/icu.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/inspector.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/js_stream.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/messaging.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/mod.ts": "f68e74e8eed84eaa6b0de24f0f4c47735ed46866d7ee1c5a5e7c0667b4f0540f", + "https://deno.land/std@0.132.0/node/internal_binding/module_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/native_module.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/natives.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/node_file.ts": "c96ee0b2af319a3916de950a6c4b0d5fb00d09395c51cd239c54d95d62567aaf", + "https://deno.land/std@0.132.0/node/internal_binding/node_options.ts": "3cd5706153d28a4f5944b8b162c1c61b7b8e368a448fb1a2cff9f7957d3db360", + "https://deno.land/std@0.132.0/node/internal_binding/options.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/os.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/performance.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/pipe_wrap.ts": "00e942327f8e1c4b74a5888a82f0e16ba775cd09af804f96b6f6849b7eab1719", + "https://deno.land/std@0.132.0/node/internal_binding/process_methods.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/report.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/serdes.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/signal_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/spawn_sync.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/stream_wrap.ts": "d6e96f4b89d82ad5cc9b243c3d3880c9d85086165da54a7d85821a63491e5abf", + "https://deno.land/std@0.132.0/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227", + "https://deno.land/std@0.132.0/node/internal_binding/symbols.ts": "51cfca9bb6132d42071d4e9e6b68a340a7f274041cfcba3ad02900886e972a6c", + "https://deno.land/std@0.132.0/node/internal_binding/task_queue.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/tcp_wrap.ts": "10c64d5e092a8bff99cfe05adea716e4e52f4158662a5821790953e47e2cc21c", + "https://deno.land/std@0.132.0/node/internal_binding/timers.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/tls_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/trace_events.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/tty_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7", + "https://deno.land/std@0.132.0/node/internal_binding/udp_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/url.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7", + "https://deno.land/std@0.132.0/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba", + "https://deno.land/std@0.132.0/node/internal_binding/v8.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/worker.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/internal_binding/zlib.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", + "https://deno.land/std@0.132.0/node/net.ts": "dfcb7e412abb3d5c55edde7d823b0ccb9601f7d40555ae3c862810c78b176185", + "https://deno.land/std@0.132.0/node/os.ts": "943d3294a7a00f39491148cd2097cdbf101233a421262223bb20ae702c059df5", + "https://deno.land/std@0.132.0/node/path.ts": "c65858e9cbb52dbc0dd348eefcdc41e82906c39cfa7982f2d4d805e828414b8c", + "https://deno.land/std@0.132.0/node/path/_constants.ts": "bd26f24a052b7d6b746151f4a236d29ab3c2096883bb6449c2fa499494406672", + "https://deno.land/std@0.132.0/node/path/_interface.ts": "6034ee29f6f295460ec82db1a94df9269aecbb0eceb81be72e9d843f8e8a97e6", + "https://deno.land/std@0.132.0/node/path/_util.ts": "9d4735fc05f8f1fb94406450e84e23fd201dc3fef5298b009e44cfa4e797b8f0", + "https://deno.land/std@0.132.0/node/path/common.ts": "f41a38a0719a1e85aa11c6ba3bea5e37c15dd009d705bd8873f94c833568cbc4", + "https://deno.land/std@0.132.0/node/path/glob.ts": "d6b64a24f148855a6e8057a171a2f9910c39e492e4ccec482005205b28eb4533", + "https://deno.land/std@0.132.0/node/path/mod.ts": "62e21dc6e1fe2e9742fce85de631a7b067d968544fe66954578e6d73c97369a2", + "https://deno.land/std@0.132.0/node/path/posix.ts": "9dd5fc83c4ae0e0b700bef43c88c67e276840c187a66d4d6a661440cf1fecc52", + "https://deno.land/std@0.132.0/node/path/separator.ts": "c908c9c28ebe7f1fea67daaccf84b63af90d882fe986f9fa03af9563a852723a", + "https://deno.land/std@0.132.0/node/path/win32.ts": "f869ee449b6dee69b13e2d1f8f7f1d01c7ae1e67fa573eab789429929f7a3864", + "https://deno.land/std@0.132.0/node/process.ts": "699f47f2f177556e17e2f7d0dcd3705ff5065cbdf72029e534c1540404d6f501", + "https://deno.land/std@0.132.0/node/querystring.ts": "967b8a7b00a73ebe373666deb3a7e501f164bac27bb342fde7221ecbb3522689", + "https://deno.land/std@0.132.0/node/stream.ts": "d127faa074a9e3886e4a01dcfe9f9a6a4b5641f76f6acc356e8ded7da5dc2c81", + "https://deno.land/std@0.132.0/node/stream/promises.mjs": "b263c09f2d6bd715dc514fab3f99cca84f442e2d23e87adbe76e32ea46fc87e6", + "https://deno.land/std@0.132.0/node/string_decoder.ts": "51ce85a173d2e36ac580d418bb48b804adb41732fc8bd85f7d5d27b7accbc61f", + "https://deno.land/std@0.132.0/node/timers.ts": "2d66fcd21e37acf76c3a699a97230da57cc21382c8e885b3c5377b37efd0f06c", + "https://deno.land/std@0.132.0/node/url.ts": "bc0bde2774854b6a377c4c61fa73e5a28283cbeb7f8703479f44e471219c33a8", + "https://deno.land/std@0.132.0/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630", + "https://deno.land/std@0.132.0/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60", + "https://deno.land/std@0.132.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.132.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.132.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", + "https://deno.land/std@0.132.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.132.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", + "https://deno.land/std@0.132.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7", + "https://deno.land/std@0.132.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb", + "https://deno.land/std@0.132.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.132.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e", + "https://deno.land/std@0.132.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", + "https://deno.land/std@0.132.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392", + "https://deno.land/std@0.132.0/testing/asserts.ts": "b0ef969032882b1f7eb1c7571e313214baa1485f7b61cf35807b2434e254365c", + "https://deno.land/x/literal_html@1.1.0/mod.ts": "52b0de822cc5529d6051584fe98c5b8d75f2bfb063f1df86df7b07513cc353a2", + "https://deno.land/x/oak@v17.1.4/application.ts": "69fb6462eed013562ee61239e60ea77e5df3abb2b0df34568593b9774d72e98f", + "https://deno.land/x/oak@v17.1.4/body.ts": "f91d8e0298abbabe6acb543d1090e2a41aa665375918a575d72bd6b98b538e40", + "https://deno.land/x/oak@v17.1.4/context.ts": "e04c3d67d68ee01a279aeded457b0d66255450593dacab22251e7eb0cf6a92e5", + "https://deno.land/x/oak@v17.1.4/deps.ts": "c71a9421d2ead7803468cd40559cf122ee91d4e81e8a3a98706956f6654e2550", + "https://deno.land/x/oak@v17.1.4/http_server_bun.ts": "c7f3eb6464d4f047fcc9335e632ffb6bfc24e5ef7dc9a53017a6e453d4197e4b", + "https://deno.land/x/oak@v17.1.4/http_server_native.ts": "34bab402cc9b6fdf53706699ac2c2ab88faf5c14be2ae18aa105bdc4fd6a8471", + "https://deno.land/x/oak@v17.1.4/http_server_native_request.ts": "aa98a2f4bbf6f7651c62eb0332a95a1b0faff1d76f7a07fa8bd600766eb24488", + "https://deno.land/x/oak@v17.1.4/http_server_node.ts": "bfbf7585fcda5a1464cd0f904ec97cbb4d67367757f3ed8cdc99a590a94b34e1", + "https://deno.land/x/oak@v17.1.4/middleware.ts": "a701caf9d872b93d26759f77c7ad545cb29bc3d197c8375b79b2fbe7e9e60958", + "https://deno.land/x/oak@v17.1.4/middleware/etag.ts": "f5cf8eb2a7c99ae7e11a4e31dc60beda398aec7a08be343e0de6b632f8064e4d", + "https://deno.land/x/oak@v17.1.4/middleware/proxy.ts": "e611b7d45f58a1b2caa1cb6c435774822d7b56aa136b8dbb8691fb52d07c5182", + "https://deno.land/x/oak@v17.1.4/middleware/serve.ts": "66f1e405ac006bfa863e8852092e03951b93dd4ba8381996a719d93d00aa62fe", + "https://deno.land/x/oak@v17.1.4/mod.ts": "1f42341a6138310eceaf7b8e9b72be4d2a913817d1e823090dee4e7d27c68e98", + "https://deno.land/x/oak@v17.1.4/node_shims.ts": "e411aef698dca26dfc577d8581ddab678f528bd52bf681337f3c3bcc73845a0a", + "https://deno.land/x/oak@v17.1.4/request.ts": "5123fd70841a540809702059527a192d22f78042db1bfc4a01eebd77ec25b0fb", + "https://deno.land/x/oak@v17.1.4/response.ts": "483f8ddd7618325e6ac28f88a3ea9926a09b3c90fa53b481a7a5202d23a0755f", + "https://deno.land/x/oak@v17.1.4/router.ts": "e8eb2f88806dfdd303f3a663fefb7d9e614342bf40738692e9ef4b2243e1bccd", + "https://deno.land/x/oak@v17.1.4/send.ts": "42faed583f218ed85d5da7704f36b385537947ec4de6125e20ad8acbfe8d8f68", + "https://deno.land/x/oak@v17.1.4/testing.ts": "d6489e78d689da08b9896cd0b9b9add243466b407ce6fd63d38e29f8c0a19f5c", + "https://deno.land/x/oak@v17.1.4/types.ts": "0e74c6c46e0fcfddd87e90fe0216c4ae50c73b113e06d3bdc4283afc7b2570d6", + "https://deno.land/x/oak@v17.1.4/utils/clone_state.ts": "5a0784d802b86cc3dbf415dfd286025f03a261b3a8f9b3b6fd671be8e51ff027", + "https://deno.land/x/oak@v17.1.4/utils/consts.ts": "9e14324837558d7af3d4bfc8ba5f13216a0b5d2f8dac14a3a782bc1bbfb756ef", + "https://deno.land/x/oak@v17.1.4/utils/create_promise_with_resolvers.ts": "f7eeaf65ffa7b6cef03b8dc3fa3a3e35ae5553c6abf1a2260d7797e076acd63a", + "https://deno.land/x/oak@v17.1.4/utils/decode.ts": "434802a09534a26cc8b8cd009ecc422b4695d22859021fe34f8093784b2483b7", + "https://deno.land/x/oak@v17.1.4/utils/decode_component.ts": "d68e6da33bf6e733d218c0b7ce7112520640e836f4cfa2760c4aee8facf1c581", + "https://deno.land/x/oak@v17.1.4/utils/encode_url.ts": "16b213d70f5e211fb3633f97c704f9613d2f8033669d59e0c9ca4fc26551fad6", + "https://deno.land/x/oak@v17.1.4/utils/resolve_path.ts": "aa39d54a003b38fee55f340a0cba3f93a7af85b8ddd5fbfb049a98fc0109b36d", + "https://deno.land/x/oak@v17.1.4/utils/streams.ts": "c85ae197f5046d58d5a3e42221254a6c8e63172f9f01b77631e480e1dcc90e05", + "https://deno.land/x/oak@v17.1.4/utils/type_guards.ts": "92ab7dae4bc5ce10206fb21ca13bedd13a4638848be15f9752146aedeab1fea4", + "https://deno.land/x/postgresjs@v3.4.5/mod.js": "cb68f17d6d90df318934deccdb469d740be0888e7a597a9e7eea7100ce36a252", + "https://deno.land/x/postgresjs@v3.4.5/polyfills.js": "318eb01f2b4cc33a46c59f3ddc11f22a56d6b1db8b7719b2ad7decee63a5bd47", + "https://deno.land/x/postgresjs@v3.4.5/src/bytes.js": "f2de43bdc8fa5dc4b169f2c70d5d8b053a3dea8f85ef011d7b27dec69e14ebb7", + "https://deno.land/x/postgresjs@v3.4.5/src/connection.js": "e63062451fb6a7284c14540b3f268d1373c3028fb0f3b234056ad56569190e8f", + "https://deno.land/x/postgresjs@v3.4.5/src/errors.js": "85cfbed9a5ab0db41ab8e97b806c881af29807dfe99bc656fdf1a18c1c13b6c6", + "https://deno.land/x/postgresjs@v3.4.5/src/index.js": "9dca008e765675f8218d4e2e3ccc75359cc2240f7be4e80bf6735e92b5562e3a", + "https://deno.land/x/postgresjs@v3.4.5/src/large.js": "f3e770cdb7cc695f7b50687b4c6c4b7252129515486ec8def98b7582ee7c54ef", + "https://deno.land/x/postgresjs@v3.4.5/src/query.js": "67c45a5151032aa46b587abc15381fe4efd97c696e5c1b53082b8161309c4ee2", + "https://deno.land/x/postgresjs@v3.4.5/src/queue.js": "15e6345adb6708bf3b99ad39fc2231c2fb61de5f6cba4b7a7a6be881482a4ec3", + "https://deno.land/x/postgresjs@v3.4.5/src/result.js": "001ff5e0c8d634674f483d07fbcd620a797e3101f842d6c20ca3ace936260465", + "https://deno.land/x/postgresjs@v3.4.5/src/subscribe.js": "9e4d0c3e573a6048e77ee2f15abbd5bcd17da9ca85a78c914553472c6d6c169b", + "https://deno.land/x/postgresjs@v3.4.5/src/types.js": "471f4a6c35412aa202a7c177c0a7e5a7c3bd225f01bbde67c947894c1b8bf6ed" + }, + "workspace": { + "dependencies": [ + "jsr:@oak/oak@17.1.4", + "jsr:@std/cache@0.2.0" + ] + } +} diff --git a/frameworks/TypeScript/oak/oak-postgresjs.dockerfile b/frameworks/TypeScript/oak/oak-postgresjs.dockerfile new file mode 100644 index 00000000000..6ad423e49c7 --- /dev/null +++ b/frameworks/TypeScript/oak/oak-postgresjs.dockerfile @@ -0,0 +1,19 @@ +FROM denoland/deno:2.3.1 + +EXPOSE 8080 + +WORKDIR /app + +USER deno + +ENV PG_NAME hello_world +ENV PG_HOST tfb-database +ENV PG_USER benchmarkdbuser +ENV PG_PSWD benchmarkdbpass +ENV DATABASE postgres + +COPY . . + +RUN deno install --entrypoint ./src/main.ts + +CMD ["deno", "serve", "--parallel", "--port", "8080", "--host", "0.0.0.0", "-A", "./src/main.ts"] diff --git a/frameworks/TypeScript/oak/oak.dockerfile b/frameworks/TypeScript/oak/oak.dockerfile index a1a1e14d90a..647757427ce 100644 --- a/frameworks/TypeScript/oak/oak.dockerfile +++ b/frameworks/TypeScript/oak/oak.dockerfile @@ -1,4 +1,4 @@ -FROM denoland/deno +FROM denoland/deno:2.3.1 EXPOSE 8080 @@ -6,7 +6,8 @@ WORKDIR /app USER deno -COPY ./src/deps.ts . -RUN deno cache deps.ts -ADD ./src . -CMD [ "run", "--allow-all", "main.ts" ] +COPY . . + +RUN deno install --entrypoint ./src/main.ts + +CMD ["deno", "serve", "--parallel", "--port", "8080", "--host", "0.0.0.0", "-A", "./src/main.ts"] diff --git a/frameworks/TypeScript/oak/src/deps.ts b/frameworks/TypeScript/oak/src/deps.ts deleted file mode 100644 index 56d02e49232..00000000000 --- a/frameworks/TypeScript/oak/src/deps.ts +++ /dev/null @@ -1,20 +0,0 @@ -export { - Application, - Context, - Router, - Status, -} from "https://deno.land/x/oak@v12.1.0/mod.ts"; -export { getQuery } from "https://deno.land/x/oak@v12.1.0/helpers.ts"; -export type { ResponseBody } from "https://deno.land/x/oak@v12.1.0/response.ts"; - -export { - Column, - connect, - DataType, - Manager, - Model, - Primary, -} from "https://deno.land/x/cotton@v0.7.5/mod.ts"; -export type { DatabaseResult } from "https://deno.land/x/cotton@v0.7.5/src/adapters/adapter.ts"; - -export { html } from "https://deno.land/x/literal_html@1.1.0/mod.ts"; diff --git a/frameworks/TypeScript/oak/src/helpers.ts b/frameworks/TypeScript/oak/src/helpers.ts index b016e6be7d5..74c61998352 100644 --- a/frameworks/TypeScript/oak/src/helpers.ts +++ b/frameworks/TypeScript/oak/src/helpers.ts @@ -1,4 +1,5 @@ -import { Context, ResponseBody, Status } from "./deps.ts"; +import { Context, Status } from "oak"; +import { ResponseBody } from "oak/response"; export function Ok(ctx: Context, body: ResponseBody) { ctx.response.status = Status.OK; diff --git a/frameworks/TypeScript/oak/src/main.ts b/frameworks/TypeScript/oak/src/main.ts index ac2896cf3ec..961a05088be 100644 --- a/frameworks/TypeScript/oak/src/main.ts +++ b/frameworks/TypeScript/oak/src/main.ts @@ -1,10 +1,7 @@ -import { Application, DatabaseResult, Manager } from "./deps.ts"; +import { Application } from "oak"; import { router } from "./routes.ts"; -import { getDbClient } from "./utils.ts"; -const app = new Application< - { manager: Manager; cached_worlds: DatabaseResult[] } ->(); +const app = new Application(); // headers app.use(async (ctx, next) => { @@ -13,15 +10,7 @@ app.use(async (ctx, next) => { await next(); }); -// database handling -app.use(async (ctx, next) => { - const db = await getDbClient(); - ctx.state.manager = db.getManager(); - await next(); - await db.disconnect(); -}); - app.use(router.routes()); app.use(router.allowedMethods()); -await app.listen({ port: 8080 }); +export default { fetch: app.fetch }; diff --git a/frameworks/TypeScript/oak/src/models.ts b/frameworks/TypeScript/oak/src/models.ts deleted file mode 100644 index e55761f6af2..00000000000 --- a/frameworks/TypeScript/oak/src/models.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Column, DataType, Model, Primary } from "./deps.ts"; - -@Model() -export class World { - @Primary() - id!: number; - - @Column({ type: DataType.Number }) - randomnumber!: number; -} - -@Model() -export class Fortune { - @Primary() - id!: number; - - @Column({ type: DataType.String }) - message!: string; -} diff --git a/frameworks/TypeScript/oak/src/postgres.ts b/frameworks/TypeScript/oak/src/postgres.ts new file mode 100644 index 00000000000..ff54f003019 --- /dev/null +++ b/frameworks/TypeScript/oak/src/postgres.ts @@ -0,0 +1,35 @@ +import postgres from 'postgres'; +import type { World, Fortune } from './types.ts'; + +const sql = postgres({ + host: Deno.env.get("PG_HOST"), + user: Deno.env.get("PG_USER"), + database: Deno.env.get("PG_NAME"), + password: Deno.env.get("PG_PSWD"), + max: 1 +}); + +export function allFortunes() { + return sql`select id, message from fortune`; +} + +export function getAllWorlds() { + return sql`SELECT id, randomNumber FROM world`; +} + +export async function getWorld(id: number) { + const result = await sql`select id, randomNumber from world where id = ${id}`; + return result[0]; +} + +export async function bulkUpdate(worlds: World[]) { + const values = 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 ${values}) as update_data (id, randomNumber) + where world.id = (update_data.id)::int`; +} diff --git a/frameworks/TypeScript/oak/src/routes.ts b/frameworks/TypeScript/oak/src/routes.ts index 461ffbda991..68ba897039f 100644 --- a/frameworks/TypeScript/oak/src/routes.ts +++ b/frameworks/TypeScript/oak/src/routes.ts @@ -1,57 +1,63 @@ -import { Fortune, World } from "./models.ts"; +import { Router } from "oak"; +import { LruCache } from "lru-cache"; import { NotFound, Ok } from "./helpers.ts"; +import type { Fortune, World } from "./types.ts"; import { - getDbClient, parseQuery, randomNumber, renderTemplate, } from "./utils.ts"; -import { Router } from "./deps.ts"; - -const cached_worlds = await (await getDbClient()).getManager().query(World) - .limit(10000).all(); +import { + getWorld, + bulkUpdate, + allFortunes, + getAllWorlds +} from "./postgres.ts"; export const router = new Router() .get("/plaintext", (ctx) => Ok(ctx, "Hello, World!")) - .get("/json", (ctx) => Ok(ctx, { message: "Hello, World!" })) - .get("/db", async (ctx) => { - const world = await ctx.state.manager.query(World).where( - "id", - randomNumber(), - ).first(); + .get("/json", (ctx) => Ok(ctx, { message: "Hello, World!" })); + +if (Deno.env.has("DATABASE")) { + const cache = new LruCache(10_000); + (await getAllWorlds()).forEach(world => cache.set(world.id, world)); + + router.get("/db", async (ctx) => { + const world = await getWorld(randomNumber()); Ok(ctx, world); }) .get("/queries", async (ctx) => { - const worlds = []; + const worldsPromises = []; const queries = parseQuery(ctx); for (let i = 0; i < queries; i++) { - const world = await ctx.state.manager.query(World).where( - "id", - randomNumber(), - ).first(); - worlds.push(world); + worldsPromises.push(getWorld(randomNumber())); } + const worlds = await Promise.all(worldsPromises); Ok(ctx, worlds); }) .get("/updates", async (ctx) => { - const worlds = []; + const worldsPromises: Promise[] = []; const queries = parseQuery(ctx); for (let i = 0; i < queries; i++) { - const world = await ctx.state.manager.query(World).where( - "id", - randomNumber(), - ).first(); + const world = getWorld(randomNumber()); + worldsPromises.push(world); + } + + const worlds = await Promise.all(worldsPromises); + + const newWorlds = worlds.map((world) => { world.randomnumber = randomNumber(); - worlds.push(world); + return world; + }); - await ctx.state.manager.save(world); - } - Ok(ctx, worlds); + await bulkUpdate(newWorlds); + + Ok(ctx, newWorlds); }) .get("/fortunes", async (ctx) => { - const fortunes: Fortune[] = await ctx.state.manager.query(Fortune).all(); + const fortunes = await allFortunes(); fortunes.push({ id: 0, message: "Additional fortune added at request time.", @@ -69,8 +75,10 @@ export const router = new Router() const worlds = []; for (let i = 0; i < queries; i++) { - worlds.push(cached_worlds[randomNumber()]); + worlds.push(cache.get(randomNumber())); } Ok(ctx, worlds); }) - .get("/(.*)", (ctx) => NotFound(ctx)); +} + +router.get("/(.*)", (ctx) => NotFound(ctx)); diff --git a/frameworks/TypeScript/oak/src/types.ts b/frameworks/TypeScript/oak/src/types.ts new file mode 100644 index 00000000000..3151435cd66 --- /dev/null +++ b/frameworks/TypeScript/oak/src/types.ts @@ -0,0 +1,9 @@ +export interface World { + id: number; + randomnumber: number; +} + +export interface Fortune { + id: number; + message: string; +} \ No newline at end of file diff --git a/frameworks/TypeScript/oak/src/utils.ts b/frameworks/TypeScript/oak/src/utils.ts index dd097b36393..26acdf5817f 100644 --- a/frameworks/TypeScript/oak/src/utils.ts +++ b/frameworks/TypeScript/oak/src/utils.ts @@ -1,12 +1,18 @@ -import { connect, Context, getQuery, html } from "./deps.ts"; -import { Fortune } from "./models.ts"; +import { html } from "html"; +import { Context } from "oak"; +import type { Fortune } from "./types.ts"; export const randomNumber = () => { return Math.floor(Math.random() * 10000 + 1); }; export const parseQuery = (ctx: Context) => { - return Math.min(parseInt(getQuery(ctx).q) || 1, 500); + const queryParam = ctx.request.url.searchParams.get('q') ?? '1'; + const parseValue = parseInt(queryParam, 10); + if (isNaN(parseValue) || parseValue < 1) { + return 1; + } + return Math.min(parseValue, 500); }; export const renderTemplate = (fortunes: Fortune[]) => { @@ -28,14 +34,3 @@ export const renderTemplate = (fortunes: Fortune[]) => { `; }; - -export async function getDbClient() { - return await connect({ - type: "postgres", - port: 5432, - database: "hello_world", - hostname: "tfb-database", - username: "benchmarkdbuser", - password: "benchmarkdbpass", - }); -} diff --git a/frameworks/TypeScript/oak/tsconfig.json b/frameworks/TypeScript/oak/tsconfig.json deleted file mode 100644 index 6dacb8cc2c5..00000000000 --- a/frameworks/TypeScript/oak/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "experimentalDecorators": true, - "emitDecoratorMetadata": true - } -} From 39ebc1444d2ce2dc50b48044ddcb8652ed4557b8 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Wed, 7 May 2025 19:49:33 +0200 Subject: [PATCH 1431/1766] Update to Vert.x 5.0.0.CR8 (#9882) --- frameworks/Java/vertx/pom.xml | 4 ++-- .../Java/vertx/src/main/java/vertx/App.java | 18 ++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 15bac6dd2a4..7bac1baa546 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -10,8 +10,8 @@ 17 vertx.App - 5.0.0.CR6 - 4.2.0.Final + 5.0.0.CR8 + 4.2.1.Final 2.16.1 diff --git a/frameworks/Java/vertx/src/main/java/vertx/App.java b/frameworks/Java/vertx/src/main/java/vertx/App.java index 9cadce1efbb..f2d54510503 100755 --- a/frameworks/Java/vertx/src/main/java/vertx/App.java +++ b/frameworks/Java/vertx/src/main/java/vertx/App.java @@ -36,7 +36,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -public class App extends AbstractVerticle implements Handler { +public class App extends VerticleBase implements Handler { private static final int NUM_PROCESSORS = Runtime.getRuntime().availableProcessors(); private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(App.class); @@ -147,7 +147,7 @@ private MultiMap jsonHeaders() { } @Override - public void start(Promise startPromise) throws Exception { + public Future start() throws Exception { int port = 8080; server = vertx .createHttpServer(new HttpServerOptions() @@ -173,13 +173,11 @@ public void start(Promise startPromise) throws Exception { options.setPreparedStatementCacheMaxSize(1024); options.setPipeliningLimit(256); // Large pipelining means less flushing and we use a single connection anyway Future clientsInit = initClients(options); - clientsInit + return clientsInit .transform(ar -> { databaseErr = ar.cause(); return server.listen(port); - }) - .mapEmpty() - .onComplete(startPromise); + }); } private Future initClients(PgConnectOptions options) { @@ -275,8 +273,8 @@ public void handle(HttpServerRequest request) { } @Override - public void stop() { - if (server != null) server.close(); + public Future stop() throws Exception { + return server != null ? server.close() : super.stop(); } private void sendError(HttpServerRequest req, Throwable cause) { @@ -338,7 +336,7 @@ public Queries(HttpServerRequest req) { } private void handle() { - client.group(c -> { + client.group(/*queries, */c -> { for (int i = 0; i < queries; i++) { c.preparedQuery(SELECT_WORLD) .execute(Tuple.of(boxedRandomWorldNumber())) @@ -385,7 +383,7 @@ public Update(HttpServerRequest request) { } public void handle() { - client.group(c -> { + client.group(/*worldsToUpdate.length, */c -> { final PreparedQuery> preparedQuery = c.preparedQuery(App.SELECT_WORLD); for (int i = 0; i < worldsToUpdate.length; i++) { final Integer id = boxedRandomWorldNumber(); From 0e515f1fcb810db34f22cdc152a1a489fe118c52 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Wed, 7 May 2025 10:49:54 -0700 Subject: [PATCH 1432/1766] Upgrade lute to the latest version (#9880) * Upgrade lute to the latest version * store plaintext response * fix conditional --- frameworks/Luau/lute/lute.dockerfile | 2 +- frameworks/Luau/lute/rokit.toml | 2 +- frameworks/Luau/lute/src/json.luau | 583 +++++++------------------ frameworks/Luau/lute/src/parallel.luau | 5 +- frameworks/Luau/lute/src/serve.luau | 18 +- frameworks/Luau/lute/src/types.luau | 9 + 6 files changed, 171 insertions(+), 448 deletions(-) create mode 100644 frameworks/Luau/lute/src/types.luau diff --git a/frameworks/Luau/lute/lute.dockerfile b/frameworks/Luau/lute/lute.dockerfile index 2fca69214eb..9a0e49c640d 100644 --- a/frameworks/Luau/lute/lute.dockerfile +++ b/frameworks/Luau/lute/lute.dockerfile @@ -16,4 +16,4 @@ RUN rokit install --no-trust-check COPY ./src . -CMD ["sh", "-c", "lute parallel.luau -- $(nproc)"] +CMD ["sh", "-c", "lute parallel.luau"] diff --git a/frameworks/Luau/lute/rokit.toml b/frameworks/Luau/lute/rokit.toml index 83ad1526885..4b4d444e71c 100644 --- a/frameworks/Luau/lute/rokit.toml +++ b/frameworks/Luau/lute/rokit.toml @@ -4,4 +4,4 @@ # New tools can be added by running `rokit add ` in a terminal. [tools] -lute = "aatxe/lute@0.1.0-nightly.20250322" +lute = "luau-lang/lute@0.1.0-nightly.20250506" diff --git a/frameworks/Luau/lute/src/json.luau b/frameworks/Luau/lute/src/json.luau index bc8c40e1251..a4ba7becbf6 100644 --- a/frameworks/Luau/lute/src/json.luau +++ b/frameworks/Luau/lute/src/json.luau @@ -1,486 +1,197 @@ ---!strict - -local json = { - --- Not actually a nil value, a newproxy stand-in for a null value since Luau has no actual representation of `null` - NULL = newproxy() :: nil, -} - -type JSONPrimitive = nil | number | string | boolean -type Object = { [string]: Value } -type Array = { Value } -export type Value = JSONPrimitive | Array | Object - --- serialization - -type SerializerState = { - buf: buffer, - cursor: number, - prettyPrint: boolean, - depth: number, -} - -local function checkState(state: SerializerState, len: number) - local curLen = buffer.len(state.buf) - - if state.cursor + len < curLen then - return - end - - local newBuffer = buffer.create(curLen * 2) - - buffer.copy(newBuffer, 0, state.buf) - - state.buf = newBuffer -end - -local function writeByte(state: SerializerState, byte: number) - checkState(state, 1) - - buffer.writeu8(state.buf, state.cursor, byte) - - state.cursor += 1 -end - -local function writeSpaces(state: SerializerState) - if state.depth == 0 then - return - end - - if state.prettyPrint then - checkState(state, state.depth * 4) - - for i = 0, state.depth do - buffer.writeu32(state.buf, state.cursor, 0x_20_20_20_20) - state.cursor += 4 - end - else - buffer.writeu8(state.buf, state.cursor, string.byte(" ")) - - state.cursor += 1 - end -end - -local function writeString(state: SerializerState, str: string) - checkState(state, #str) - - buffer.writestring(state.buf, state.cursor, str) - - state.cursor += #str -end - -local serializeAny - +--!native +local COMMA = 44 +local QUOTATION = 34 +local OPEN_BRACKET = 91 +local CLOSE_BRACKET = 93 +local OPEN_BRACE = 123 +local CLOSE_BRACE = 125 +local BACKSLASH = 92 + +-- used for string serialization local ESCAPE_MAP = { - [0x5C] = string.byte("\\"), -- 5C = '\' - [0x08] = string.byte("b"), - [0x0C] = string.byte("f"), - [0x0A] = string.byte("n"), - [0x0D] = string.byte("r"), - [0x09] = string.byte("t"), + [0x5C] = string.byte("\\"), -- 5C = '\' + [0x08] = string.byte("b"), + [0x0C] = string.byte("f"), + [0x0A] = string.byte("n"), + [0x0D] = string.byte("r"), + [0x09] = string.byte("t"), } -local function serializeUnicode(codepoint: number) - if codepoint >= 0x10000 then - local high = math.floor((codepoint - 0x10000) / 0x400) + 0xD800 - local low = ((codepoint - 0x10000) % 0x400) + 0xDC00 - return string.format("\\u%04x\\u%04x", high, low) - end - - return string.format("\\u%04x", codepoint) -end +local types = require("./types") -local function serializeString(state: SerializerState, str: string) - checkState(state, #str) +local buff: buffer = buffer.create(1024) +local size = 1024 +local cursor = 0 - writeByte(state, string.byte('"')) +local function alloc(len: number) + if cursor + len < size then + return + end - for pos, codepoint in utf8.codes(str) do - if ESCAPE_MAP[codepoint] then - writeByte(state, string.byte("\\")) - writeByte(state, ESCAPE_MAP[codepoint]) - elseif codepoint < 32 or codepoint > 126 then - writeString(state, serializeUnicode(codepoint)) - else - writeString(state, utf8.char(codepoint)) - end - end + while cursor + len > size do + size *= 2 + end - writeByte(state, string.byte('"')) + local newbuff = buffer.create(size) + buffer.copy(newbuff, 0, buff) + buff = newbuff end -local function serializeArray(state: SerializerState, array: Array) - state.depth += 1 - - writeByte(state, string.byte("[")) - - if state.prettyPrint and #array ~= 0 then - writeByte(state, string.byte("\n")) - end - - for i, value in array do - if i ~= 1 then - writeByte(state, string.byte(",")) - - if state.prettyPrint then - writeByte(state, string.byte("\n")) - end - end - - if i ~= 1 or state.prettyPrint then - writeSpaces(state) - end - - serializeAny(state, value) - end - - state.depth -= 1 - - if state.prettyPrint and #array ~= 0 then - writeByte(state, string.byte("\n")) - writeSpaces(state) - end - - writeByte(state, string.byte("]")) -end - -local function serializeTable(state: SerializerState, object: Object) - writeByte(state, string.byte("{")) - - if state.prettyPrint then - writeByte(state, string.byte("\n")) - end - - state.depth += 1 - - local first = true - for key, value in object do - if not first then - writeByte(state, string.byte(",")) - writeByte(state, string.byte(" ")) - - if state.prettyPrint then - writeByte(state, string.byte("\n")) - end - end - - first = false - - writeSpaces(state) - - writeByte(state, string.byte('"')) - writeString(state, key) - writeString(state, '": ') - - serializeAny(state, value) - end - - if state.prettyPrint then - writeByte(state, string.byte("\n")) - end - - state.depth -= 1 - - writeSpaces(state) - - writeByte(state, string.byte("}")) +local function WRITE_QUOTATION() + buffer.writeu8(buff, cursor, QUOTATION) + cursor += 1 end -serializeAny = function(state: SerializerState, value: Value) - local valueType = type(value) - - if value == json.NULL then - writeString(state, "null") - elseif valueType == "boolean" then - writeString(state, if value then "true" else "false") - elseif valueType == "number" then - writeString(state, tostring(value)) - elseif valueType == "string" then - serializeString(state, value :: string) - elseif valueType == "table" then - if #(value :: {}) == 0 and next(value :: {}) ~= nil then - serializeTable(state, value :: Object) - else - serializeArray(state, value :: Array) - end - else - error("Unknown value", 2) - end +local function WRITE_COMMA() + buffer.writeu8(buff, cursor, COMMA) + cursor += 1 end --- deserialization +local function writeString(str: string) + local len = #str + alloc(len) -type DeserializerState = { - src: string, - cursor: number, -} + buffer.writestring(buff, cursor, str) -local function deserializerError(state: DeserializerState, msg: string): never - return error(`JSON error - {msg} around {state.cursor}`) + cursor += len end -local function skipWhitespace(state: DeserializerState): boolean - state.cursor = string.find(state.src, "%S", state.cursor) :: number - - if not state.cursor then - return false - end - - return true -end +local function serializeUnicode(codepoint: number) + if codepoint >= 0x10000 then + local high = ((codepoint - 0x10000) // 0x400) + 0xD800 + local low = ((codepoint - 0x10000) % 0x400) + 0xDC00 + return string.format("\\u%04x\\u%04x", high, low) + end -local function currentByte(state: DeserializerState) - return string.byte(state.src, state.cursor) + return string.format("\\u%04x", codepoint) end -local function deserializeNumber(state: DeserializerState) - -- first "segment" - local nStart, nEnd = string.find(state.src, "^[%-%deE]*", state.cursor) - - if not nStart then - -- i dont think this is possible - deserializerError(state, "Could not match a number literal?") - end - - if string.byte(state.src, nEnd :: number + 1) == string.byte(".") then -- decimal! - local decStart, decEnd = string.find(state.src, "^[eE%-+%d]+", nEnd :: number + 2) - - if not decStart then - deserializerError(state, "Trailing '.' in number value") - end - - nEnd = decEnd - end - - local num = tonumber(string.sub(state.src, nStart :: number, nEnd)) - - if not num then - deserializerError(state, "Malformed number value") - end +local function serializeString(str: string) + -- covers the quotations & utf + alloc((#str * 4) + 2) - state.cursor = nEnd :: number + 1 + WRITE_QUOTATION() - return num -end - -local function decodeSurrogatePair(high, low): string? - local highVal = tonumber(high, 16) - local lowVal = tonumber(low, 16) + for pos, codepoint in utf8.codes(str) do + if ESCAPE_MAP[codepoint] then + -- write \ + buffer.writeu8(buff, cursor, BACKSLASH) + cursor += 1 + + buffer.writeu8(buff, cursor, ESCAPE_MAP[codepoint]) + cursor += 1 + elseif codepoint < 32 or codepoint > 126 then + writeString(serializeUnicode(codepoint)) + else + -- we are in ascii + + buffer.writeu8(buff, cursor, codepoint) + cursor += 1 + end + end - if not highVal or not lowVal then - return nil -- Invalid - end - - -- Calculate the actual Unicode codepoint - local codepoint = 0x10000 + ((highVal - 0xD800) * 0x400) + (lowVal - 0xDC00) - return utf8.char(codepoint) + WRITE_QUOTATION() end -local function deserializeString(state: DeserializerState): string - state.cursor += 1 - - local startPos = state.cursor - - if currentByte(state) == string.byte('"') then - state.cursor += 1 - - return "" - end - - while state.cursor <= #state.src do - if currentByte(state) == string.byte('"') then - state.cursor += 1 +local serializeAny: (value: types.Value) -> () - local source = string.sub(state.src, startPos, state.cursor - 2) +local function serializeArray(array: types.Array) + -- open close bracket + -- 1 comma for each array element + alloc(2 + #array) - source = string.gsub( - source, - "\\u([dD]83[dD])\\u(d[cC]%w%w)", - function(high, low) - return decodeSurrogatePair(high, low) - or deserializerError(state, "Invalid unicode surrogate pair") - end :: any - ) - -- Handle regular Unicode escapes - source = string.gsub(source, "\\u(%x%x%x%x)", function(code) - return utf8.char(tonumber(code, 16) :: number) - end) + -- write [ + buffer.writeu8(buff, cursor, OPEN_BRACKET) + cursor += 1 - source = string.gsub(source, "\\\\", "\0") - source = string.gsub(source, "\\b", "\b") - source = string.gsub(source, "\\f", "\f") - source = string.gsub(source, "\\n", "\n") - source = string.gsub(source, "\\r", "\r") - source = string.gsub(source, "\\t", "\t") - source = string.gsub(source, '\\"', '"') - source = string.gsub(source, '\0', '\\') + for _, value in array do + serializeAny(value) + WRITE_COMMA() + end - return source - end + -- get rid of comma + cursor -= 1 - if currentByte(state) == string.byte("\\") then - state.cursor += 1 - end - - state.cursor += 1 - end - - -- error - - state.cursor = startPos - - return deserializerError(state, "Unterminated string") + -- write ] + buffer.writeu8(buff, cursor, CLOSE_BRACKET) + cursor += 1 end -local deserialize - -local function deserializeArray(state: DeserializerState): Array - state.cursor += 1 - - local current: Array = {} +local function serializeTable(object: types.Object) + -- openbrace, newline + alloc(2) - local expectingValue = false - while state.cursor < #state.src do - skipWhitespace(state) + -- write { + buffer.writeu8(buff, cursor, OPEN_BRACE) + cursor += 1 - if currentByte(state) == string.byte(",") then - expectingValue = true - state.cursor += 1 - end + for key, value in object do + -- quotation 2x, colon and comma + alloc(4) - skipWhitespace(state) + WRITE_QUOTATION() + buffer.writestring(buff, cursor, key) + cursor += #key + 2 - if currentByte(state) == string.byte("]") then - break - end + buffer.writestring(buff, cursor - 2, '":') - table.insert(current, deserialize(state)) + serializeAny(value) - expectingValue = false - end + WRITE_COMMA() + end - if expectingValue then - deserializerError(state, "Trailing comma") - end + -- get rid of the comma + cursor -= 1 - if not skipWhitespace(state) or currentByte(state) ~= string.byte("]") then - deserializerError(state, "Unterminated array") - end - - state.cursor += 1 - - return current + -- write } + buffer.writeu8(buff, cursor, CLOSE_BRACE) + cursor += 1 end -local function deserializeObject(state: DeserializerState): Object - state.cursor += 1 - - local current = {} - - local expectingValue = false - while state.cursor < #state.src do - skipWhitespace(state) - - if currentByte(state) == string.byte("}") then - break - end - - skipWhitespace(state) - - if currentByte(state) ~= string.byte('"') then - return deserializerError(state, "Expected a string key") - end - - local key = deserializeString(state) - - skipWhitespace(state) - - if currentByte(state) ~= string.byte(":") then - return deserializerError(state, "Expected ':' for key value pair") - end - - state.cursor += 1 - - local value = deserialize(state) - - current[key] = value +serializeAny = function(value: types.Value) + local valueType = type(value) - if not skipWhitespace(state) then - deserializerError(state, "Unterminated object") - end + if valueType == "string" then + serializeString(value :: string) + elseif valueType == "table" then + if #(value :: {}) == 0 then + serializeTable(value :: types.Object) + else + serializeArray(value :: types.Array) + end + elseif valueType == "number" then + local numstr = tostring(value) - skipWhitespace(state) - - if currentByte(state) == string.byte(",") then - expectingValue = true - state.cursor += 1 - else - expectingValue = false - end - end - - if expectingValue then - return deserializerError(state, "Trailing comma") - end - - if not skipWhitespace(state) or currentByte(state) ~= string.byte("}") then - deserializerError(state, "Unterminated object") - end - - state.cursor += 1 - - return current -end - -deserialize = function(state: DeserializerState): Value - skipWhitespace(state) - - local fourChars = string.sub(state.src, state.cursor, state.cursor + 3) - - if fourChars == "null" then - state.cursor += 4 - return json.NULL - elseif fourChars == "true" then - state.cursor += 4 - return true - elseif string.sub(state.src, state.cursor, state.cursor + 4) == "false" then - state.cursor += 5 - return false - elseif string.match(state.src, "^[%d%.]", state.cursor) then - -- number - return deserializeNumber(state) - elseif string.byte(state.src, state.cursor) == string.byte('"') then - return deserializeString(state) - elseif string.byte(state.src, state.cursor) == string.byte("[") then - return deserializeArray(state) - elseif string.byte(state.src, state.cursor) == string.byte("{") then - return deserializeObject(state) - end - - return deserializerError(state, `Unexpected token '{string.sub(state.src, state.cursor, state.cursor)}'`) + buffer.writestring(buff, cursor, numstr) + cursor += #numstr + elseif value == types.NULL then + -- null as u32 + buffer.writeu32(buff, cursor, 1819047278) + cursor += 4 + elseif value == true then + -- true as u32 + buffer.writeu32(buff, cursor, 1702195828) + cursor += 4 + elseif value == false then + -- false as u32 + u8 + buffer.writeu32(buff, cursor, 1936482662) + buffer.writeu8(buff, cursor + 4, 101) + cursor += 5 + else + error("Unknown value", 2) + end end --- user-facing - -json.serialize = function(value: Value, prettyPrint: boolean?) - local state: SerializerState = { - buf = buffer.create(1024), - cursor = 0, - prettyPrint = prettyPrint or false, - depth = 0, - } - - serializeAny(state, value) +local function serialize(data: types.Value) + buff = buffer.create(1024) + size = 1024 + cursor = 0 - return buffer.readstring(state.buf, 0, state.cursor) -end - -json.deserialize = function(src: string) - local state = { - src = src, - cursor = 0, - } + serializeAny(data) - return deserialize(state) + return buffer.readstring(buff, 0, cursor) end -return table.freeze(json) +return { + serialize = serialize, +} diff --git a/frameworks/Luau/lute/src/parallel.luau b/frameworks/Luau/lute/src/parallel.luau index df3f97a505e..557c4dd0326 100644 --- a/frameworks/Luau/lute/src/parallel.luau +++ b/frameworks/Luau/lute/src/parallel.luau @@ -1,8 +1,9 @@ local vm = require("@lute/vm") +local system = require("@lute/system") -local threadCount = tonumber(...) +local threadCount = system.threadcount() -for i = 1, threadCount do +for _ = 1, threadCount do coroutine.resume(coroutine.create(vm.create("./serve").serve)) end diff --git a/frameworks/Luau/lute/src/serve.luau b/frameworks/Luau/lute/src/serve.luau index 53d34f06b72..1cb525512ad 100644 --- a/frameworks/Luau/lute/src/serve.luau +++ b/frameworks/Luau/lute/src/serve.luau @@ -1,18 +1,20 @@ local net = require("@lute/net") local json = require("./json") +local plaintext = { + status = 200, + headers = { + ["Content-Type"] = "text/plain", + ["Server"] = "Lute", + }, + body = "Hello, world!", +} + return { serve = function() net.serve(function(req) if req.path == "/plaintext" then - return { - status = 200, - headers = { - ["Content-Type"] = "text/plain", - ["Server"] = "Lute", - }, - body = "Hello, world!", - } + return plaintext elseif req.path == "/json" then return { status = 200, diff --git a/frameworks/Luau/lute/src/types.luau b/frameworks/Luau/lute/src/types.luau new file mode 100644 index 00000000000..bf3a5ce3771 --- /dev/null +++ b/frameworks/Luau/lute/src/types.luau @@ -0,0 +1,9 @@ +export type JSONPrimitive = nil | number | string | boolean +export type Object = { [string]: Value } +export type Array = { Value } + +export type Value = JSONPrimitive | Array | Object + +return { + NULL = newproxy() :: nil, +} From dfb5dcbbe51ae753c241ebdc46768359815dea93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Thu, 8 May 2025 01:50:27 +0800 Subject: [PATCH 1433/1766] Upgrade hyperlane (#9879) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' --- frameworks/Rust/hyperlane/Cargo.lock | 100 +++++++++++++-------------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 6c312ecc742..d805171f676 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -24,7 +24,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", "zerocopy 0.7.35", @@ -51,15 +51,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "async-func" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cf3fe5910b9139e5f8b4bdb4a0923d5aaae21fb45cb64e22d4b43ac70da5ad" -dependencies = [ - "tokio", -] - [[package]] name = "atoi" version = "2.0.0" @@ -122,9 +113,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf19e729cdbd51af9a397fb9ef8ac8378007b797f8273cfbfdf45dcaa316167b" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -414,6 +405,15 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "future-fn" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "001452c736697c8f96e4689dc5ab6a89f175981417139a44f1dd1f7c20d430a5" +dependencies = [ + "tokio", +] + [[package]] name = "futures" version = "0.3.31" @@ -526,9 +526,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -561,7 +561,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -573,9 +573,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -588,7 +588,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -638,9 +638,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbec9c630191b7df2029ba5a70558a8fa9b30e0bc73bcdb08ea1d69e9764ed4d" +checksum = "42e8fe2367f50ba59314488b240828c518c17f3b19d48d2555c62d947925d6ac" dependencies = [ "brotli", "flate2", @@ -655,9 +655,9 @@ checksum = "1292cbdcf2588d15f8bf14cac381785c11ca7634d6a088cad9eebb5068d2652b" [[package]] name = "http-type" -version = "3.67.0" +version = "3.68.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db6b0794e5bb36a7bb661c755983428455a2dd1ee80ca579bb54256ceaf2975" +checksum = "7ccd07d720a1fe07d30d1f7f6f0eb5ebda6c0280d113a8211abe382e23872536" dependencies = [ "ahash", "dashmap", @@ -682,14 +682,14 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.90.1" +version = "4.92.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f21eb7a2d9b9462603f2df9a47e00504c74df98b5d45a5a62a58ae9e7ee3b4b" +checksum = "01a1ff97d715538d6207da4e199a8486d3c4d6198777477cda350e409b8da73b" dependencies = [ - "async-func", "clonelicious", "color-output", "file-operation", + "future-fn", "http-type", "hyperlane-log", "recoverable-spawn", @@ -871,7 +871,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -907,9 +907,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" [[package]] name = "libsqlite3-sys" @@ -1157,7 +1157,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy 0.8.25", ] [[package]] @@ -1231,7 +1231,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -1266,9 +1266,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ "bitflags", ] @@ -1321,9 +1321,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags", "errno", @@ -1355,9 +1355,9 @@ dependencies = [ [[package]] name = "serde-xml-rs" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ef8209566c27b96b10a096e25abc534e08e9bbbcf8e444b92640f1416dd1c6" +checksum = "176b7ff880ab6ead7a020e773e9c096467fe347615a3e22ac29300cbdef67a5d" dependencies = [ "log", "serde", @@ -1422,9 +1422,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -1433,9 +1433,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.3" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28b4eafe8a2d82f83559ef5941afff1ccba3da8e375c8f148efd75df181bf4f" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -1547,7 +1547,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "hashlink", "indexmap", "log", @@ -1738,9 +1738,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -2301,11 +2301,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.24", + "zerocopy-derive 0.8.25", ] [[package]] @@ -2321,9 +2321,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 300b57fba83..d6d76c7243d 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.90.1" +hyperlane = "4.92.0" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.5", features = ["runtime-tokio", "postgres"] } From 3991208a208880ee480d29561788ecebf74991ed Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 7 May 2025 20:26:41 +0200 Subject: [PATCH 1434/1766] [php] Update for Workerman/5 (#9881) * [php] Update for Workerman/5 * Use reusePort In Workerman/5 it is NOT automatic --- frameworks/PHP/cakephp/server.php | 3 ++- frameworks/PHP/flight/server.php | 3 ++- frameworks/PHP/kumbiaphp/server.php | 1 + frameworks/PHP/laravel/server-man.php | 3 ++- frameworks/PHP/leaf/server.php | 3 ++- frameworks/PHP/php/deploy/workerman/start.php | 3 ++- frameworks/PHP/slim/server.php | 3 ++- frameworks/PHP/symfony/server.php | 3 ++- frameworks/PHP/yii2/server.php | 3 ++- 9 files changed, 17 insertions(+), 8 deletions(-) diff --git a/frameworks/PHP/cakephp/server.php b/frameworks/PHP/cakephp/server.php index 0bec9788d42..820e178205d 100644 --- a/frameworks/PHP/cakephp/server.php +++ b/frameworks/PHP/cakephp/server.php @@ -2,13 +2,14 @@ require_once __DIR__.'/vendor/autoload.php'; use Adapterman\Adapterman; -use Workerman\Lib\Timer; +use Workerman\Timer; use Workerman\Worker; Adapterman::init(); $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'AdapterMan-CakePHP'; $http_worker->onWorkerStart = static function () { diff --git a/frameworks/PHP/flight/server.php b/frameworks/PHP/flight/server.php index dd5ce42c6dd..826e74e38ec 100644 --- a/frameworks/PHP/flight/server.php +++ b/frameworks/PHP/flight/server.php @@ -2,13 +2,14 @@ require_once __DIR__.'/vendor/autoload.php'; use Adapterman\Adapterman; -use Workerman\Lib\Timer; +use Workerman\Timer; use Workerman\Worker; Adapterman::init(); $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'AdapterMan-Flight'; $http_worker->onWorkerStart = static function () { diff --git a/frameworks/PHP/kumbiaphp/server.php b/frameworks/PHP/kumbiaphp/server.php index 2b3123173da..c47e6ad3994 100644 --- a/frameworks/PHP/kumbiaphp/server.php +++ b/frameworks/PHP/kumbiaphp/server.php @@ -9,6 +9,7 @@ $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'KumbiaPHP'; $http_worker->onWorkerStart = static function () { diff --git a/frameworks/PHP/laravel/server-man.php b/frameworks/PHP/laravel/server-man.php index c8769a35efd..6aa249cce8f 100644 --- a/frameworks/PHP/laravel/server-man.php +++ b/frameworks/PHP/laravel/server-man.php @@ -4,12 +4,13 @@ use Adapterman\Adapterman; use Workerman\Worker; -use Workerman\Lib\Timer; +use Workerman\Timer; Adapterman::init(); $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'AdapterMan-Laravel'; $http_worker->onWorkerStart = static function () { Header::$date = gmdate(DATE_RFC7231); diff --git a/frameworks/PHP/leaf/server.php b/frameworks/PHP/leaf/server.php index b10ee532f8e..4e931b07e33 100644 --- a/frameworks/PHP/leaf/server.php +++ b/frameworks/PHP/leaf/server.php @@ -4,12 +4,13 @@ use Adapterman\Adapterman; use Workerman\Worker; -use Workerman\Lib\Timer; +use Workerman\Timer; Adapterman::init(); $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'AdapterMan-Leaf'; $http_worker->onWorkerStart = static function () { diff --git a/frameworks/PHP/php/deploy/workerman/start.php b/frameworks/PHP/php/deploy/workerman/start.php index 0d1c04d930f..40bb89b521a 100644 --- a/frameworks/PHP/php/deploy/workerman/start.php +++ b/frameworks/PHP/php/deploy/workerman/start.php @@ -2,7 +2,7 @@ use Adapterman\Adapterman; use Workerman\Worker; -use Workerman\Lib\Timer; +use Workerman\Timer; require_once __DIR__ . '/vendor/autoload.php'; @@ -10,6 +10,7 @@ // WebServer $web = new Worker("http://0.0.0.0:8080"); $web->count = (int) shell_exec('nproc') * 4; +$web->reusePort = true; $web->name = 'workerman'; define('WEBROOT', '/php/'); diff --git a/frameworks/PHP/slim/server.php b/frameworks/PHP/slim/server.php index 132751f7060..7eafd061037 100644 --- a/frameworks/PHP/slim/server.php +++ b/frameworks/PHP/slim/server.php @@ -4,12 +4,13 @@ use Adapterman\Adapterman; use Workerman\Worker; -use Workerman\Lib\Timer; +use Workerman\Timer; Adapterman::init(); $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'AdapterMan-Slim'; $http_worker->onWorkerStart = static function () { diff --git a/frameworks/PHP/symfony/server.php b/frameworks/PHP/symfony/server.php index 73ba068f5ea..654861e8426 100644 --- a/frameworks/PHP/symfony/server.php +++ b/frameworks/PHP/symfony/server.php @@ -4,12 +4,13 @@ use Adapterman\Adapterman; use Workerman\Worker; -use Workerman\Lib\Timer; +use Workerman\Timer; Adapterman::init(); $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'AdapterMan-Symfony'; $http_worker->onWorkerStart = static function () { diff --git a/frameworks/PHP/yii2/server.php b/frameworks/PHP/yii2/server.php index a4efcec4ed9..59fe04b19f1 100644 --- a/frameworks/PHP/yii2/server.php +++ b/frameworks/PHP/yii2/server.php @@ -3,7 +3,7 @@ use Adapterman\Adapterman; use Workerman\Worker; -use Workerman\Lib\Timer; +use Workerman\Timer; Adapterman::init(); @@ -11,6 +11,7 @@ $http_worker = new Worker('http://0.0.0.0:8080'); $http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; $http_worker->name = 'AdapterMan-Yii2'; $http_worker->onWorkerStart = static function () { From 87315e2b60f31ba1e921d3798b3ce7ae4b9ce069 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Thu, 8 May 2025 00:48:33 +0200 Subject: [PATCH 1435/1766] [php] Fix Caddy server (#9883) --- frameworks/PHP/php/php-caddy.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/php/php-caddy.dockerfile b/frameworks/PHP/php/php-caddy.dockerfile index 0f75378cccf..3be7ccf8b61 100644 --- a/frameworks/PHP/php/php-caddy.dockerfile +++ b/frameworks/PHP/php/php-caddy.dockerfile @@ -15,7 +15,7 @@ COPY deploy/conf/* /etc/php/8.4/fpm/ RUN apt-get install -y debian-keyring debian-archive-keyring apt-transport-https > /dev/null \ && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg \ && curl -sf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list \ - && apt-get update > /dev/null && apt-get install caddy > /dev/null + && apt-get update > /dev/null && apt-get install caddy=2.9.1 > /dev/null ADD ./ /php WORKDIR /php From 08422a151354c3cf618d4e124bea2c42552cdb01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 14:53:49 +0000 Subject: [PATCH 1436/1766] Bump rack from 3.1.12 to 3.1.14 in /frameworks/Ruby/sinatra-sequel Bumps [rack](https://github.com/rack/rack) from 3.1.12 to 3.1.14. - [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.1.12...v3.1.14) --- updated-dependencies: - dependency-name: rack dependency-version: 3.1.14 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 048bb1d0518..8e68d6c3b3d 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -14,7 +14,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.12) + rack (3.1.14) rack-protection (4.1.1) base64 (>= 0.1.0) logger (>= 1.6.0) From 084f80b24720977f6169ba151fc35e0aae5171cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 15:19:23 +0000 Subject: [PATCH 1437/1766] Bump rack-session from 2.1.0 to 2.1.1 in /frameworks/Ruby/sinatra Bumps [rack-session](https://github.com/rack/rack-session) from 2.1.0 to 2.1.1. - [Release notes](https://github.com/rack/rack-session/releases) - [Changelog](https://github.com/rack/rack-session/blob/v2.1.1/releases.md) - [Commits](https://github.com/rack/rack-session/compare/v2.1.0...v2.1.1) --- updated-dependencies: - dependency-name: rack-session dependency-version: 2.1.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/sinatra/Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index cdca9846541..4ff68e25a81 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -40,12 +40,12 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.11) + rack (3.1.14) rack-protection (4.1.1) base64 (>= 0.1.0) logger (>= 1.6.0) rack (>= 3.0.0, < 4) - rack-session (2.1.0) + rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) raindrops (0.20.1) From 29302b032f60ad4bbc9dd6f5bdd027e48d686795 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 19:21:33 +0000 Subject: [PATCH 1438/1766] Bump rack from 2.2.10 to 2.2.14 in /frameworks/Ruby/rage Bumps [rack](https://github.com/rack/rack) from 2.2.10 to 2.2.14. - [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/v2.2.10...v2.2.14) --- updated-dependencies: - dependency-name: rack dependency-version: 2.2.14 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rage/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rage/Gemfile.lock b/frameworks/Ruby/rage/Gemfile.lock index 7e698f046f2..0a2579e75a9 100644 --- a/frameworks/Ruby/rage/Gemfile.lock +++ b/frameworks/Ruby/rage/Gemfile.lock @@ -31,7 +31,7 @@ GEM logger (1.7.0) minitest (5.25.5) pg (1.5.9) - rack (2.2.10) + rack (2.2.14) rack-test (2.2.0) rack (>= 1.3) rage-iodine (4.0.0) From 090968af8f2421ba55c0966b854ba7157aaaa4a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 20:23:22 +0000 Subject: [PATCH 1439/1766] Bump ring from 0.17.8 to 0.17.14 in /frameworks/Rust/axum Bumps [ring](https://github.com/briansmith/ring) from 0.17.8 to 0.17.14. - [Changelog](https://github.com/briansmith/ring/blob/main/RELEASES.md) - [Commits](https://github.com/briansmith/ring/commits) --- updated-dependencies: - dependency-name: ring dependency-version: 0.17.14 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/axum/Cargo.lock | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 758f68a8f64..66bfde818f7 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -307,9 +307,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.5" +version = "1.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" dependencies = [ "jobserver", "libc", @@ -2041,15 +2041,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] From 6d175fa529c02a4df17c41546ec08f39c904bfe5 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 13 May 2025 22:55:22 +0200 Subject: [PATCH 1440/1766] [ruby/rack] Update JRuby (#9896) --- frameworks/Ruby/rack/rack-jruby.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rack/rack-jruby.dockerfile b/frameworks/Ruby/rack/rack-jruby.dockerfile index f310f8cf62f..00104b585dc 100644 --- a/frameworks/Ruby/rack/rack-jruby.dockerfile +++ b/frameworks/Ruby/rack/rack-jruby.dockerfile @@ -1,4 +1,4 @@ -FROM jruby:9.4-jdk17 +FROM jruby:10.0 RUN apt-get update -y && apt-get install netbase -y From fb3c281c9673dd93d988975b36149230d52e63e2 Mon Sep 17 00:00:00 2001 From: Glen De Cauwsemaecker Date: Tue, 13 May 2025 22:56:39 +0200 Subject: [PATCH 1441/1766] bump rama to 0.2 (#9895) * bump rama to 0.2 rama 0.2 anouncement: * cached query results are not optional json null values are not allowed, instead they prefer to not have the items at all, in case ids did not exist --- frameworks/Rust/rama/Cargo.lock | 378 +++++++++++++++++-- frameworks/Rust/rama/Cargo.toml | 4 +- frameworks/Rust/rama/src/common/simd_json.rs | 5 +- frameworks/Rust/rama/src/common/utils.rs | 26 +- frameworks/Rust/rama/src/main.rs | 7 +- frameworks/Rust/rama/src/main_mongo.rs | 14 +- frameworks/Rust/rama/src/main_mongo_raw.rs | 6 +- frameworks/Rust/rama/src/main_pg.rs | 14 +- frameworks/Rust/rama/src/main_pg_pool.rs | 14 +- frameworks/Rust/rama/src/main_sqlx.rs | 22 +- 10 files changed, 394 insertions(+), 96 deletions(-) diff --git a/frameworks/Rust/rama/Cargo.lock b/frameworks/Rust/rama/Cargo.lock index 87560fe249d..c31e2852e02 100644 --- a/frameworks/Rust/rama/Cargo.lock +++ b/frameworks/Rust/rama/Cargo.lock @@ -91,7 +91,7 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59a194f9d963d8099596278594b3107448656ba73831c9d8c783e613ce86da64" dependencies = [ - "brotli", + "brotli 7.0.0", "flate2", "futures-core", "memchr", @@ -205,6 +205,24 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags 2.9.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.91", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -258,7 +276,18 @@ checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", - "brotli-decompressor", + "brotli-decompressor 4.0.2", +] + +[[package]] +name = "brotli" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor 5.0.0", ] [[package]] @@ -271,6 +300,16 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bson" version = "2.14.0" @@ -323,6 +362,15 @@ dependencies = [ "shlex", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -343,11 +391,33 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-targets 0.52.6", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -707,6 +777,12 @@ dependencies = [ "serde", ] +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + [[package]] name = "enum-as-inner" version = "0.6.1" @@ -812,6 +888,33 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -821,6 +924,22 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "fslock" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "funty" version = "2.0.0" @@ -996,6 +1115,12 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + [[package]] name = "h2" version = "0.4.7" @@ -1174,10 +1299,12 @@ dependencies = [ "cfg-if", "futures-util", "hickory-proto 0.25.1", + "ipconfig", "moka", "once_cell", "parking_lot", "rand 0.9.0", + "resolv-conf", "smallvec", "thiserror 2.0.12", "tokio", @@ -1492,6 +1619,15 @@ dependencies = [ "serde", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -1541,6 +1677,16 @@ version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libm" version = "0.2.11" @@ -1742,6 +1888,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.8" @@ -1863,6 +2015,34 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1955,6 +2135,17 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "overload" version = "0.1.1" @@ -2194,11 +2385,21 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + [[package]] name = "rama" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9873ebb37d9d1e396d84ad0821c066f5c56fda2d72124cbdde33193d233f209" +checksum = "dbfc04ce5f0295c6674d37d22ca388d4d2fd7cc1a7afef33a5ed0a3f3ae098f0" dependencies = [ "rama-core", "rama-dns", @@ -2207,17 +2408,55 @@ dependencies = [ "rama-http-core", "rama-net", "rama-tcp", - "rama-tls", + "rama-tls-boring", + "rama-tower", "rama-ua", "rama-utils", "rustversion", ] +[[package]] +name = "rama-boring" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f9f292c90071be607788a32902eb469aa700cbedb3a7ff89f9e7aea4748a50f" +dependencies = [ + "bitflags 2.9.0", + "foreign-types", + "libc", + "openssl-macros", + "rama-boring-sys", +] + +[[package]] +name = "rama-boring-sys" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4d21214d5d8f7fadddfed54a23ebcbf1c9b7d48bf330866973e6a125e0ff731" +dependencies = [ + "autocfg", + "bindgen", + "cmake", + "fs_extra", + "fslock", +] + +[[package]] +name = "rama-boring-tokio" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad64d69fd3d8a3e02c58bf2869d1dd549fa99bef763cf50839113aa3a9c5e121" +dependencies = [ + "rama-boring", + "rama-boring-sys", + "tokio", +] + [[package]] name = "rama-core" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870d2a5a1510eb16662848328373670dc5fa479315c895c280630b9902d9c132" +checksum = "94bc95e260be6953d91b4dca39a16498424f20ba4cc7516eb4971ed0b083bb42" dependencies = [ "futures-lite", "parking_lot", @@ -2231,9 +2470,9 @@ dependencies = [ [[package]] name = "rama-dns" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944e2de33b5b5d0ed102beb9955893da2a1e9b4e71b7568eee7e8482408e97ba" +checksum = "4bb7832d151b5c08aefab1302cd8a7d1250ce1cc523cb0e7721f64c2f10b1f86" dependencies = [ "hickory-resolver 0.25.1", "rama-core", @@ -2245,20 +2484,21 @@ dependencies = [ [[package]] name = "rama-error" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "619de7c9954ff02305f9749c62aedf1374cd7716cefc66a0d59dec4544d9179b" +checksum = "8afef8edf9f08e7602d2f724b69a7b8fe6fd791e1dc2ca51fa4aa92ebe47963c" [[package]] name = "rama-http" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27bf643d8b008a39023ad14b66ad047dd6a92c9ef82c74844753f74be89c216f" +checksum = "b10c0565cfef10e41c5d92f7e244c6749098c3a3a8df539e70e5e576cb53a17b" dependencies = [ "async-compression", "base64 0.22.1", "bitflags 2.9.0", "bytes", + "chrono", "const_format", "csv", "futures-lite", @@ -2271,7 +2511,9 @@ dependencies = [ "nanoid", "percent-encoding", "pin-project-lite", + "radix_trie", "rama-core", + "rama-http-headers", "rama-http-types", "rama-macros", "rama-net", @@ -2290,15 +2532,17 @@ dependencies = [ [[package]] name = "rama-http-backend" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28473f8acf125aef82cb00e2739369f34db1aeb057b3132cf699e69fb9a7318d" +checksum = "852edae14b952453a0de0c71d5f0868457cdb9e3ec2d35fa620309180eec15bb" dependencies = [ "const_format", "futures", "h2", "rama-core", + "rama-http", "rama-http-core", + "rama-http-headers", "rama-http-types", "rama-net", "rama-tcp", @@ -2309,9 +2553,9 @@ dependencies = [ [[package]] name = "rama-http-core" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00de69a60643d473641ee8fa4768316f5c9a8b303eed2888de885068ced1947" +checksum = "89eab20977f04fa72249831d349cdd6d49c2ffc08d2d07571809dd219fca1f48" dependencies = [ "atomic-waker", "bytes", @@ -2326,6 +2570,7 @@ dependencies = [ "itoa", "pin-project-lite", "rama-core", + "rama-http", "rama-http-types", "rama-utils", "slab", @@ -2337,11 +2582,32 @@ dependencies = [ "want", ] +[[package]] +name = "rama-http-headers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2679fadfd104128546d537cc15cbdff2ce3c4b49d6facb4b09308d8ebb32ce2" +dependencies = [ + "base64 0.22.1", + "bytes", + "httpdate", + "mime", + "rama-core", + "rama-error", + "rama-http-types", + "rama-macros", + "rama-net", + "rama-utils", + "serde", + "sha1", + "tracing", +] + [[package]] name = "rama-http-types" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "908aa9d8a0309438df16db698ec24aeaaabde5b03ea52404704f3b841e4c46e5" +checksum = "22d5ffcadbc046d7e137ae70e92e0bc139893ede6c8f40d9754c7788d64ef1c5" dependencies = [ "bytes", "const_format", @@ -2369,15 +2635,15 @@ dependencies = [ [[package]] name = "rama-macros" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ef8f1996c1b7b4c1bb1b42dff1d864a91a597b012c0c1819ae3e98c8ef4d9c0" +checksum = "41ba53ab8aa7a42286422e8cb6bdc211ebfa584309e994b0d8a06e17b3ab5c73" [[package]] name = "rama-net" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6ee75afa01308a12a6ac4b0844bcea13c6a912615520644cec9c90c540eb30" +checksum = "216e40781e2b0e23cd1ddec4cb5424b5068c54512e20e4c77fad2ba14f06801e" dependencies = [ "base64 0.22.1", "bytes", @@ -2387,8 +2653,9 @@ dependencies = [ "headers", "hex", "ipnet", - "itertools", + "itertools 0.14.0", "md5", + "nom 8.0.0", "parking_lot", "pin-project-lite", "psl", @@ -2406,9 +2673,9 @@ dependencies = [ [[package]] name = "rama-tcp" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f9cc81d98da859f768ce0268a8547a08a76b9cb4a4378a7cc670a2a899ca5d" +checksum = "8541541a5b97e1c4f9caf9a1e6dbdf25d3576fed0d58952ce8f98adf6b90cfc6" dependencies = [ "rama-core", "rama-dns", @@ -2449,17 +2716,20 @@ dependencies = [ ] [[package]] -name = "rama-tls" -version = "0.2.0-alpha.11" +name = "rama-tls-boring" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0606fa4d075eeeadf9118c2b847d17ff42b08d2a882a31bf7748524bc609b864" +checksum = "3aa8aea06efa5fec804d4a6971046e457cd6e26b88e0d86e02bb76fd5dc6e618" dependencies = [ - "brotli", + "brotli 8.0.1", "flate2", "flume", - "itertools", + "itertools 0.14.0", + "moka", "parking_lot", "pin-project-lite", + "rama-boring", + "rama-boring-tokio", "rama-core", "rama-net", "rama-utils", @@ -2467,14 +2737,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "rama-tower" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b17056fb6e6d2a9cf64d71d59580732902bbd6480894c566e950335f5fc6effb" +dependencies = [ + "rama-core", + "rama-http-types", + "tokio", + "tower-layer", + "tower-service", +] + [[package]] name = "rama-ua" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3aae90d38623252c831e3ca99d64762bd4fdb773c6f22b3f8b305c3a85e37dd" +checksum = "65a8650461ae628954a2ffe288879ed4de81518ea2d49f7bbf2f32eb56f539db" dependencies = [ - "itertools", + "itertools 0.14.0", "rama-core", + "rama-http-headers", "rama-http-types", "rama-net", "rama-utils", @@ -2486,9 +2770,9 @@ dependencies = [ [[package]] name = "rama-utils" -version = "0.2.0-alpha.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5a10484221deae52ae76b83982dfb52f8db21514a0a033b48f0599740cfd76" +checksum = "a5f721b2f7d9b3d5016b1720551500216b56eb513faf70d0fc64ebd002694297" dependencies = [ "parking_lot", "pin-project-lite", @@ -2681,6 +2965,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -3494,9 +3784,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -3637,6 +3927,18 @@ dependencies = [ "serde", ] +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" diff --git a/frameworks/Rust/rama/Cargo.toml b/frameworks/Rust/rama/Cargo.toml index 342eb6ac85a..1c4ce26a247 100644 --- a/frameworks/Rust/rama/Cargo.toml +++ b/frameworks/Rust/rama/Cargo.toml @@ -33,9 +33,7 @@ default = [] simd-json = ["dep:simd-json", "dep:mime", "dep:serde_path_to_error"] [dependencies] -rama = { version = "0.2.0-alpha.11", default-features = false, features = [ - "http-full", -] } +rama = { version = "0.2.0", default-features = false, features = ["http-full"] } deadpool = { version = "0.12", features = ["rt_tokio_1", "serde", "managed"] } deadpool-postgres = { version = "0.14", features = ["rt_tokio_1", "serde"] } dotenv = "0.15" diff --git a/frameworks/Rust/rama/src/common/simd_json.rs b/frameworks/Rust/rama/src/common/simd_json.rs index 1edc869aa1e..a1cb766eb07 100644 --- a/frameworks/Rust/rama/src/common/simd_json.rs +++ b/frameworks/Rust/rama/src/common/simd_json.rs @@ -2,11 +2,12 @@ use bytes::{BufMut, BytesMut}; use rama::http::{ - HeaderMap, HeaderValue, IntoResponse, Request, Response, StatusCode, header, + HeaderMap, HeaderValue, Request, Response, StatusCode, header, service::web::extract::{ Bytes, FromRequest, body::{BytesRejection, InvalidJsonContentType, JsonRejection}, }, + service::web::response::IntoResponse, }; use serde::{Serialize, de::DeserializeOwned}; use simd_json; @@ -83,7 +84,7 @@ fn json_content_type(headers: &HeaderMap) -> bool { let is_json_content_type = mime.type_() == "application" && (mime.subtype() == "json" - || mime.suffix().map_or(false, |name| name == "json")); + || mime.suffix().is_some_and(|name| name == "json")); is_json_content_type } diff --git a/frameworks/Rust/rama/src/common/utils.rs b/frameworks/Rust/rama/src/common/utils.rs index 17c333d210b..23b29110b04 100644 --- a/frameworks/Rust/rama/src/common/utils.rs +++ b/frameworks/Rust/rama/src/common/utils.rs @@ -1,5 +1,4 @@ -use bytes::Bytes; -use rama::http::{HeaderValue, IntoResponse, Response, StatusCode, header}; +use rama::http::StatusCode; use serde::Deserialize; #[derive(Debug, Deserialize)] @@ -26,26 +25,3 @@ where { (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()) } - -#[derive(Clone, Copy, Debug)] -pub struct Utf8Html(pub T); - -impl IntoResponse for Utf8Html -where - T: Into, -{ - fn into_response(self) -> Response { - let mut res = (StatusCode::OK, self.0.into()).into_response(); - res.headers_mut().insert( - header::CONTENT_TYPE, - HeaderValue::from_static("text/html; charset=utf-8"), - ); - res - } -} - -impl From for Utf8Html { - fn from(inner: T) -> Self { - Self(inner) - } -} diff --git a/frameworks/Rust/rama/src/main.rs b/frameworks/Rust/rama/src/main.rs index 7114b892a93..d018215254f 100644 --- a/frameworks/Rust/rama/src/main.rs +++ b/frameworks/Rust/rama/src/main.rs @@ -11,8 +11,11 @@ static GLOBAL: MiMalloc = MiMalloc; #[cfg(feature = "simd-json")] use common::simd_json::Json; #[cfg(not(feature = "simd-json"))] -use rama::http::response::Json; -use rama::http::{IntoResponse, StatusCode, service::web::Router}; +use rama::http::service::web::response::Json; +use rama::http::{ + StatusCode, + service::web::{Router, response::IntoResponse}, +}; /// Return a plaintext static string. #[inline(always)] diff --git a/frameworks/Rust/rama/src/main_mongo.rs b/frameworks/Rust/rama/src/main_mongo.rs index 3323c68a64c..c31023205a5 100644 --- a/frameworks/Rust/rama/src/main_mongo.rs +++ b/frameworks/Rust/rama/src/main_mongo.rs @@ -17,10 +17,14 @@ use mongodb::{ options::{ClientOptions, Compressor}, }; #[cfg(not(feature = "simd-json"))] -use rama::http::response::Json; +use rama::http::service::web::response::Json; use rama::http::{ - IntoResponse, StatusCode, - service::web::{Router, extract::Query}, + StatusCode, + service::web::{ + Router, + extract::Query, + response::{Html, IntoResponse}, + }, }; use rand::{SeedableRng, rng, rngs::SmallRng}; use yarte::Template; @@ -30,7 +34,7 @@ static GLOBAL: MiMalloc = MiMalloc; use common::{ get_env, - utils::{Params, Utf8Html, parse_params}, + utils::{Params, parse_params}, }; use mongo::database::{ DatabaseConnection, fetch_fortunes, find_world_by_id, find_worlds, update_worlds, @@ -101,7 +105,7 @@ async fn fortunes(DatabaseConnection(db): DatabaseConnection) -> impl IntoRespon }) .collect(); - Utf8Html( + Html( FortunesTemplate { fortunes: &fortune_infos, } diff --git a/frameworks/Rust/rama/src/main_mongo_raw.rs b/frameworks/Rust/rama/src/main_mongo_raw.rs index da7fa5f99d3..839d2b8ae4a 100644 --- a/frameworks/Rust/rama/src/main_mongo_raw.rs +++ b/frameworks/Rust/rama/src/main_mongo_raw.rs @@ -12,8 +12,8 @@ use common::{ utils::{Params, parse_params}, }; use rama::http::{ - IntoResponse, StatusCode, - service::web::{Router, extract::Query}, + StatusCode, + service::web::{Router, extract::Query, response::IntoResponse}, }; use std::time::Duration; @@ -25,7 +25,7 @@ static GLOBAL: MiMalloc = MiMalloc; #[cfg(feature = "simd-json")] use common::simd_json::Json; #[cfg(not(feature = "simd-json"))] -use rama::http::response::Json; +use rama::http::service::web::response::Json; use dotenv::dotenv; use mongodb::{ diff --git a/frameworks/Rust/rama/src/main_pg.rs b/frameworks/Rust/rama/src/main_pg.rs index 79c7ecdf9bc..74072b1bf3b 100644 --- a/frameworks/Rust/rama/src/main_pg.rs +++ b/frameworks/Rust/rama/src/main_pg.rs @@ -4,8 +4,12 @@ mod pg; use dotenv::dotenv; use mimalloc::MiMalloc; use rama::http::{ - IntoResponse, StatusCode, - service::web::{Router, extract::Query}, + StatusCode, + service::web::{ + Router, + extract::Query, + response::{Html, IntoResponse}, + }, }; use rand::rng; use yarte::Template; @@ -16,13 +20,13 @@ static GLOBAL: MiMalloc = MiMalloc; #[cfg(feature = "simd-json")] use common::simd_json::Json; #[cfg(not(feature = "simd-json"))] -use rama::http::response::Json; +use rama::http::service::web::response::Json; mod server; use common::{ get_env, random_id, - utils::{Params, Utf8Html, parse_params}, + utils::{Params, parse_params}, }; use pg::database::{DatabaseConnection, PgConnection}; use pg::models::Fortune; @@ -63,7 +67,7 @@ async fn fortunes(DatabaseConnection(conn): DatabaseConnection) -> impl IntoResp .await .expect("error loading fortunes"); - Utf8Html( + Html( FortunesTemplate { fortunes: &fortunes, } diff --git a/frameworks/Rust/rama/src/main_pg_pool.rs b/frameworks/Rust/rama/src/main_pg_pool.rs index 907ca1cd792..cf894b155a7 100644 --- a/frameworks/Rust/rama/src/main_pg_pool.rs +++ b/frameworks/Rust/rama/src/main_pg_pool.rs @@ -4,15 +4,19 @@ mod pg_pool; #[cfg(feature = "simd-json")] use common::simd_json::Json; #[cfg(not(feature = "simd-json"))] -use rama::http::response::Json; +use rama::http::service::web::response::Json; use common::{SELECT_ALL_FORTUNES, SELECT_WORLD_BY_ID, UPDATE_WORLDS, random_ids}; use dotenv::dotenv; use futures_util::{TryStreamExt, stream::FuturesUnordered}; use mimalloc::MiMalloc; use rama::http::{ - IntoResponse, StatusCode, - service::web::{Router, extract::Query}, + StatusCode, + service::web::{ + Router, + extract::Query, + response::{Html, IntoResponse}, + }, }; use rand::{SeedableRng, rng, rngs::SmallRng}; use yarte::Template; @@ -24,7 +28,7 @@ mod server; use common::{ get_env, random_id, - utils::{Params, Utf8Html, parse_params}, + utils::{Params, parse_params}, }; use pg_pool::database::{ DatabaseClient, PgError, create_pool, fetch_all_fortunes, fetch_world_by_id, @@ -82,7 +86,7 @@ async fn fortunes(DatabaseClient(client): DatabaseClient) -> impl IntoResponse { fortunes.sort_by(|a, b| a.message.cmp(&b.message)); - Utf8Html( + Html( FortunesTemplate { fortunes: &fortunes, } diff --git a/frameworks/Rust/rama/src/main_sqlx.rs b/frameworks/Rust/rama/src/main_sqlx.rs index a5365c34018..6fcef78c110 100644 --- a/frameworks/Rust/rama/src/main_sqlx.rs +++ b/frameworks/Rust/rama/src/main_sqlx.rs @@ -10,8 +10,12 @@ use quick_cache::sync::Cache; use rama::{ Context, http::{ - IntoResponse, StatusCode, - service::web::{Router, extract::Query}, + StatusCode, + service::web::{ + Router, + extract::Query, + response::{Html, IntoResponse}, + }, }, }; use rand::{SeedableRng, rng, rngs::SmallRng}; @@ -22,15 +26,15 @@ use yarte::Template; static GLOBAL: MiMalloc = MiMalloc; #[cfg(not(feature = "simd-json"))] -use rama::http::response::Json; +use rama::http::service::web::response::Json; #[cfg(feature = "simd-json")] -use rama::http::response::Json; +use rama::http::service::web::response::Json; mod server; use common::{ get_env, random_id, random_ids, - utils::{Params, Utf8Html, parse_params}, + utils::{Params, parse_params}, }; use sqlx::database::create_pool; use sqlx::models::Fortune; @@ -91,7 +95,7 @@ async fn fortunes(ctx: Context) -> impl IntoResponse { fortunes.sort_by(|a, b| a.message.cmp(&b.message)); - Utf8Html( + Html( FortunesTemplate { fortunes: &fortunes, } @@ -106,10 +110,12 @@ async fn cache( ) -> impl IntoResponse { let count = parse_params(params); let mut rng = SmallRng::from_rng(&mut rng()); - let mut worlds: Vec> = Vec::with_capacity(count); + let mut worlds: Vec = Vec::with_capacity(count); for id in random_ids(&mut rng, count) { - worlds.push(ctx.state().cache.get(&id)); + if let Some(world) = ctx.state().cache.get(&id) { + worlds.push(world); + } } (StatusCode::OK, Json(worlds)) From f0fcd83ec8279273d529ebc819f2ddda95ffd0ab Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 13 May 2025 22:57:01 +0200 Subject: [PATCH 1442/1766] [ruby/rack-sequel] Remove failing Unicorn variant (#9893) Unicorn hasn't been updated for 4 years and seems unmaintained. It is currently failing as well. --- frameworks/Ruby/rack-sequel/Gemfile | 5 -- frameworks/Ruby/rack-sequel/Gemfile.lock | 8 --- frameworks/Ruby/rack-sequel/README.md | 4 +- .../Ruby/rack-sequel/benchmark_config.json | 40 ----------- frameworks/Ruby/rack-sequel/boot.rb | 13 ++-- frameworks/Ruby/rack-sequel/config.toml | 68 ------------------- .../Ruby/rack-sequel/config/mri_unicorn.rb | 6 -- ...ack-sequel-postgres-unicorn-mri.dockerfile | 21 ------ .../rack-sequel-unicorn-mri.dockerfile | 21 ------ 9 files changed, 5 insertions(+), 181 deletions(-) delete mode 100644 frameworks/Ruby/rack-sequel/config/mri_unicorn.rb delete mode 100644 frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile delete mode 100644 frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index bd353d6210f..ed430b9168b 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -16,8 +16,3 @@ end group :puma, optional: true do gem 'puma', '~> 6.5', require: false end - -group :unicorn, optional: true do - gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false - gem 'logger' # required by unicorn on Ruby 3.5 -end diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index e6f1ab330b7..8c7db9aaa00 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -3,23 +3,17 @@ GEM specs: bigdecimal (3.1.9) json (2.11.3) - kgio (2.11.4) - logger (1.7.0) mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) rack (3.1.11) - raindrops (0.20.1) sequel (5.90.0) bigdecimal sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) PLATFORMS ruby @@ -28,14 +22,12 @@ PLATFORMS DEPENDENCIES json (~> 2.8) - logger mysql2 (~> 0.4) pg (~> 1.5) puma (~> 6.5) rack (~> 3.0) sequel (~> 5.0) sequel_pg (~> 1.6) - unicorn (~> 6.1) BUNDLED WITH 2.6.2 diff --git a/frameworks/Ruby/rack-sequel/README.md b/frameworks/Ruby/rack-sequel/README.md index 7208afbae55..10c66ab28c3 100644 --- a/frameworks/Ruby/rack-sequel/README.md +++ b/frameworks/Ruby/rack-sequel/README.md @@ -14,9 +14,7 @@ The tests will be run with: * [Ruby 3.4](http://www.ruby-lang.org) * [Puma 6](http://puma.io) -* [Passenger 6](https://www.phusionpassenger.com) -* [Unicorn 5](https://bogomips.org/unicorn/) -* [Rack 2](http://rack.rubyforge.org) +* [Rack 3](http://rack.rubyforge.org) * [Sequel 5](http://sequel.jeremyevans.net) * [MySQL 5.5](https://www.mysql.com) * [Postgres 9.3](https://www.postgresql.org) diff --git a/frameworks/Ruby/rack-sequel/benchmark_config.json b/frameworks/Ruby/rack-sequel/benchmark_config.json index 83d94802995..8c81927c69f 100644 --- a/frameworks/Ruby/rack-sequel/benchmark_config.json +++ b/frameworks/Ruby/rack-sequel/benchmark_config.json @@ -41,46 +41,6 @@ "display_name": "rack-sequel-postgres-puma-mri", "versus": null, "notes": "" - }, - "unicorn-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "rack", - "language": "Ruby", - "orm": "Micro", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "rack-sequel-unicorn-mri", - "versus": "rack-unicorn", - "notes": "" - }, - "postgres-unicorn-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "rack", - "language": "Ruby", - "orm": "Micro", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "rack-sequel-postgres-unicorn-mri", - "versus": null, - "notes": "" } } ] diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index 7c28556dfe3..ff68415ef69 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -9,26 +9,21 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules adapters = { - mysql: { jruby: 'jdbc:mysql', mri: 'mysql2' }, - postgresql: { jruby: 'jdbc:postgresql', mri: 'postgres' } + mysql: 'mysql2', + postgresql: 'postgres' } 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) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 + if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor opts[:pool_timeout] = 10 - else - Sequel.single_threaded = true end Sequel.connect \ '%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}' % { - adapter: adapters.fetch(dbtype).fetch(defined?(JRUBY_VERSION) ? :jruby : :mri), + adapter: (dbtype == :mysql ? 'mysql2' : 'postgresql'), host: 'tfb-database', database: 'hello_world', user: 'benchmarkdbuser', diff --git a/frameworks/Ruby/rack-sequel/config.toml b/frameworks/Ruby/rack-sequel/config.toml index 96a74c4a105..3888d522682 100644 --- a/frameworks/Ruby/rack-sequel/config.toml +++ b/frameworks/Ruby/rack-sequel/config.toml @@ -34,71 +34,3 @@ orm = "Micro" platform = "Rack" webserver = "Puma" versus = "rack-puma-mri" - -[postgres-passenger-mri] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Stripped" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "Rack" -webserver = "Passenger" -versus = "None" - -[postgres-unicorn-mri] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Stripped" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "Rack" -webserver = "Unicorn" -versus = "None" - -[passenger-mri] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Stripped" -classification = "Micro" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "Rack" -webserver = "Passenger" -versus = "None" - -[unicorn-mri] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Stripped" -classification = "Micro" -database = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-unicorn" diff --git a/frameworks/Ruby/rack-sequel/config/mri_unicorn.rb b/frameworks/Ruby/rack-sequel/config/mri_unicorn.rb deleted file mode 100644 index c9a0c55083e..00000000000 --- a/frameworks/Ruby/rack-sequel/config/mri_unicorn.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative 'auto_tune' - -# FWBM only... -num_workers, = auto_tune - -worker_processes num_workers diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile deleted file mode 100644 index a5d76c285a1..00000000000 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM ruby:3.5-rc - -ADD ./ /rack-sequel - -WORKDIR /rack-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -RUN bundle config set with 'postgresql unicorn' -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile - -ENV DBTYPE=postgresql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile deleted file mode 100644 index c966eaa1c04..00000000000 --- a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM ruby:3.5-rc - -ADD ./ /rack-sequel - -WORKDIR /rack-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -RUN bundle config set with 'mysql unicorn' -RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile - -ENV DBTYPE=mysql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production From 255f0477439e235caebf59046bafe6c80636c436 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 13 May 2025 22:57:18 +0200 Subject: [PATCH 1443/1766] [ruby/rack] Correct passenger data (#9892) Passenger runs with mri and the `rack` tests are all Platform. --- frameworks/Ruby/rack/benchmark_config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index 6a31e20fa4c..bfae6aab9f1 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -116,12 +116,12 @@ "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", - "classification": "Micro", + "classification": "Platform", "orm": "raw", "database": "Postgres", "framework": "rack", "language": "Ruby", - "platform": "Jruby", + "platform": "Mri", "webserver": "Passenger", "os": "Linux", "database_os": "Linux", From 3757c9cd0ebe01a25805505248aa904a31ad9c36 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 13 May 2025 22:57:33 +0200 Subject: [PATCH 1444/1766] [ruby/sinatra] Remove Unicorn variant (#9891) Unicorn hasn't been updated for 4 years and seems unmaintained. It isn't the fastest on any of the benchmarks either. --- frameworks/Ruby/sinatra-sequel/Gemfile | 4 -- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 6 -- frameworks/Ruby/sinatra-sequel/README.md | 4 -- .../Ruby/sinatra-sequel/benchmark_config.json | 20 ------ frameworks/Ruby/sinatra-sequel/boot.rb | 16 ++--- frameworks/Ruby/sinatra-sequel/config.toml | 68 ------------------- .../Ruby/sinatra-sequel/config/mri_unicorn.rb | 6 -- ...tra-sequel-postgres-unicorn-mri.dockerfile | 20 ------ frameworks/Ruby/sinatra/Gemfile | 4 -- frameworks/Ruby/sinatra/benchmark_config.json | 20 ------ frameworks/Ruby/sinatra/boot.rb | 15 ++-- frameworks/Ruby/sinatra/config/mri_unicorn.rb | 6 -- .../sinatra-postgres-unicorn-mri.dockerfile | 20 ------ 13 files changed, 13 insertions(+), 196 deletions(-) delete mode 100644 frameworks/Ruby/sinatra-sequel/config/mri_unicorn.rb delete mode 100644 frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile delete mode 100644 frameworks/Ruby/sinatra/config/mri_unicorn.rb delete mode 100644 frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 9c25813a61a..26021a05d64 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -20,7 +20,3 @@ end group :puma, optional: true do gem 'puma', '~> 6.4', require: false end - -group :unicorn, optional: true do - gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false -end diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 8e68d6c3b3d..97028c109e4 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -5,7 +5,6 @@ GEM bigdecimal (3.1.9) iodine (0.7.58) json (2.11.3) - kgio (2.11.4) logger (1.6.6) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) @@ -22,7 +21,6 @@ GEM rack-session (2.1.0) base64 (>= 0.1.0) rack (>= 3.0.0) - raindrops (0.20.1) ruby2_keywords (0.0.5) sequel (5.90.0) bigdecimal @@ -37,9 +35,6 @@ GEM rack-session (>= 2.0.0, < 3) tilt (~> 2.0) tilt (2.6.0) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) PLATFORMS ruby @@ -55,7 +50,6 @@ DEPENDENCIES sequel (~> 5.0) sequel_pg (~> 1.6) sinatra (~> 4.0) - unicorn (~> 6.1) BUNDLED WITH 2.6.2 diff --git a/frameworks/Ruby/sinatra-sequel/README.md b/frameworks/Ruby/sinatra-sequel/README.md index 5c150595ff9..291b26d9151 100644 --- a/frameworks/Ruby/sinatra-sequel/README.md +++ b/frameworks/Ruby/sinatra-sequel/README.md @@ -13,13 +13,9 @@ comparing a variety of web platforms. The tests will be run with: * [Ruby 3.4](http://www.ruby-lang.org) -* [JRuby 9.4](http://jruby.org) * [Puma 6](http://puma.io) -* [Passenger 6](https://www.phusionpassenger.com) -* [Unicorn 5](https://bogomips.org/unicorn/) * [Sinatra 4](http://www.sinatrarb.com) * [Sequel 5](http://sequel.jeremyevans.net) -* [Slim 3](http://slim-lang.com) * [MySQL 5.5](https://www.mysql.com) * [Postgres 9.3](https://www.postgresql.org) diff --git a/frameworks/Ruby/sinatra-sequel/benchmark_config.json b/frameworks/Ruby/sinatra-sequel/benchmark_config.json index 187cb418def..8b09aafbd54 100644 --- a/frameworks/Ruby/sinatra-sequel/benchmark_config.json +++ b/frameworks/Ruby/sinatra-sequel/benchmark_config.json @@ -61,26 +61,6 @@ "display_name": "sinatra-sequel-postgres-iodine-mri", "versus": "rack-sequel-postgres-iodine-mri", "notes": "" - }, - "postgres-unicorn-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-sequel-postgres-unicorn-mri", - "versus": "rack-sequel-postgres-unicorn-mri", - "notes": "" } } ] diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index 3cff8a30069..bf12ee2a818 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -16,8 +16,8 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules adapters = { - :mysql=>{ :jruby=>'jdbc:mysql', :mri=>'mysql2' }, - :postgresql=>{ :jruby=>'jdbc:postgresql', :mri=>'postgres' } + mysql: 'mysql2', + postgresql: 'postgres' } opts = {} @@ -26,17 +26,15 @@ def connect(dbtype) if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor opts[:pool_timeout] = 10 - elsif defined?(Unicorn) - Sequel.single_threaded = true end Sequel.connect \ '%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}' % { - :adapter=>adapters.fetch(dbtype).fetch(defined?(JRUBY_VERSION) ? :jruby : :mri), - :host=>'tfb-database', - :database=>'hello_world', - :user=>'benchmarkdbuser', - :password=>'benchmarkdbpass' + adapter: (dbtype == :mysql ? 'mysql2' : 'postgresql'), + host: 'tfb-database', + database: 'hello_world', + user: 'benchmarkdbuser', + password: 'benchmarkdbpass' }, opts end diff --git a/frameworks/Ruby/sinatra-sequel/config.toml b/frameworks/Ruby/sinatra-sequel/config.toml index 4dd4f8ac1cc..93d9f2ded5c 100644 --- a/frameworks/Ruby/sinatra-sequel/config.toml +++ b/frameworks/Ruby/sinatra-sequel/config.toml @@ -34,71 +34,3 @@ orm = "Full" platform = "Rack" webserver = "Puma" versus = "rack-sequel-puma-mri" - -[postgres-passenger-mri] -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 = "Full" -platform = "Rack" -webserver = "Passenger" -versus = "rack-sequel-postgres-passenger-mri" - -[postgres-unicorn-mri] -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 = "Full" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-sequel-postgres-unicorn-mri" - -[passenger-mri] -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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Rack" -webserver = "Passenger" -versus = "rack-sequel-passenger-mri" - -[unicorn-mri] -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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-sequel-unicorn-mri" diff --git a/frameworks/Ruby/sinatra-sequel/config/mri_unicorn.rb b/frameworks/Ruby/sinatra-sequel/config/mri_unicorn.rb deleted file mode 100644 index c9a0c55083e..00000000000 --- a/frameworks/Ruby/sinatra-sequel/config/mri_unicorn.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative 'auto_tune' - -# FWBM only... -num_workers, = auto_tune - -worker_processes num_workers diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile deleted file mode 100644 index 50801f63715..00000000000 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM ruby:3.5-rc - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra-sequel -WORKDIR /sinatra-sequel - -ENV BUNDLE_WITH=postgresql:unicorn -RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile - -ENV DBTYPE=postgresql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 5aa6b339e27..fc568a99542 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -19,7 +19,3 @@ end group :puma, optional: true do gem 'puma', '~> 6.4', require: false end - -group :unicorn, optional: true do - gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false -end diff --git a/frameworks/Ruby/sinatra/benchmark_config.json b/frameworks/Ruby/sinatra/benchmark_config.json index 7b4aea2fdeb..0d14929dd67 100644 --- a/frameworks/Ruby/sinatra/benchmark_config.json +++ b/frameworks/Ruby/sinatra/benchmark_config.json @@ -65,26 +65,6 @@ "display_name": "sinatra-postgres-iodine-mri", "versus": "rack-postgres-iodine-mri", "notes": "" - }, - "postgres-unicorn-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "sinatra", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "sinatra-postgres-unicorn-mri", - "versus": "rack-postgres-unicorn-mri", - "notes": "" } } ] diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index 9431a3d7c98..55be87eb951 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -15,18 +15,15 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules opts = { - :adapter=>(dbtype == :mysql ? 'mysql2' : 'postgresql'), - :username=>'benchmarkdbuser', - :password=>'benchmarkdbpass', - :host=>'tfb-database', - :database=>'hello_world' + adapter: (dbtype == :mysql ? 'mysql2' : 'postgresql'), + username: 'benchmarkdbuser', + password: 'benchmarkdbpass', + host: 'tfb-database', + database: 'hello_world' } # Determine threading/thread pool size and timeout - if defined?(JRUBY_VERSION) - opts[:pool] = (2 * Math.log(Integer(ENV.fetch('MAX_CONCURRENCY')))).floor - opts[:checkout_timeout] = 10 - elsif defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 + if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:pool] = (2 * Math.log(threads)).floor opts[:checkout_timeout] = 10 else diff --git a/frameworks/Ruby/sinatra/config/mri_unicorn.rb b/frameworks/Ruby/sinatra/config/mri_unicorn.rb deleted file mode 100644 index c9a0c55083e..00000000000 --- a/frameworks/Ruby/sinatra/config/mri_unicorn.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative 'auto_tune' - -# FWBM only... -num_workers, = auto_tune - -worker_processes num_workers diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile deleted file mode 100644 index 59ee177fd7e..00000000000 --- a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM ruby:3.5-rc - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ADD ./ /sinatra -WORKDIR /sinatra - -ENV BUNDLE_WITH=postgresql:unicorn -RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile - -ENV DBTYPE=postgresql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production From d8d44310b4fe2f4adbc8d78e7a8e3602604d492f Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 13 May 2025 22:57:55 +0200 Subject: [PATCH 1445/1766] [ruby/roda-sequel] Remove Unicorn variant (#9890) Unicorn hasn't been updated for 4 years and seems unmaintained. It isn't the fastest on any of the benchmarks either. --- frameworks/Ruby/roda-sequel/Gemfile | 5 -- frameworks/Ruby/roda-sequel/Gemfile.lock | 8 --- frameworks/Ruby/roda-sequel/README.md | 1 - .../Ruby/roda-sequel/benchmark_config.json | 20 ------ frameworks/Ruby/roda-sequel/boot.rb | 11 +-- frameworks/Ruby/roda-sequel/config.toml | 68 ------------------- .../Ruby/roda-sequel/config/mri_unicorn.rb | 6 -- ...oda-sequel-postgres-unicorn-mri.dockerfile | 21 ------ 8 files changed, 1 insertion(+), 139 deletions(-) delete mode 100644 frameworks/Ruby/roda-sequel/config/mri_unicorn.rb delete mode 100644 frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 19b7adb1f11..58ae5773165 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -23,8 +23,3 @@ end group :puma, optional: true do gem "puma", "~> 6.2", require: false end - -group :unicorn, optional: true do - gem 'logger' # required by unicorn on Ruby 3.5 - gem "unicorn", "~> 6.1", platforms: %i[ruby mswin], require: false -end diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index ee13d01c007..53ae69dadaa 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -6,15 +6,12 @@ GEM erubi (1.13.1) iodine (0.7.58) json (2.11.3) - kgio (2.11.4) - logger (1.7.0) mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) rack (3.1.12) - raindrops (0.20.1) roda (3.90.0) rack sequel (5.90.0) @@ -23,9 +20,6 @@ GEM pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) tilt (2.6.0) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) PLATFORMS ruby @@ -37,7 +31,6 @@ DEPENDENCIES erubi (~> 1.12) iodine (~> 0.7) json (~> 2.8) - logger mysql2 (~> 0.5) pg (~> 1.4) puma (~> 6.2) @@ -45,7 +38,6 @@ DEPENDENCIES sequel (~> 5.67) sequel_pg (~> 1.17) tilt (~> 2.1) - unicorn (~> 6.1) BUNDLED WITH 2.6.2 diff --git a/frameworks/Ruby/roda-sequel/README.md b/frameworks/Ruby/roda-sequel/README.md index 19f16452518..195efafd585 100644 --- a/frameworks/Ruby/roda-sequel/README.md +++ b/frameworks/Ruby/roda-sequel/README.md @@ -14,7 +14,6 @@ The tests will be run with: * [Ruby 3.4](http://www.ruby-lang.org) * [Puma 6](http://puma.io) -* [Unicorn 6](https://bogomips.org/unicorn/) * [Iodine](https://github.com/boazsegev/iodine) * [Roda 3](http://roda.jeremyevans.net) * [Sequel 5](http://sequel.jeremyevans.net) diff --git a/frameworks/Ruby/roda-sequel/benchmark_config.json b/frameworks/Ruby/roda-sequel/benchmark_config.json index 3108af70328..f51112ed0f9 100644 --- a/frameworks/Ruby/roda-sequel/benchmark_config.json +++ b/frameworks/Ruby/roda-sequel/benchmark_config.json @@ -65,26 +65,6 @@ "display_name": "roda-sequel-postgres-iodine-mri", "versus": "rack-sequel-postgres-iodine-mri", "notes": "" - }, - "postgres-unicorn-mri": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "roda-sequel", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "roda-sequel-postgres-unicorn-mri", - "versus": "rack-sequel-postgres-unicorn-mri", - "notes": "" } } ] diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index bf22232abd7..346d8614aa3 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -8,14 +8,7 @@ QUERIES_MAX = 500 SEQUEL_NO_ASSOCIATIONS = true -SERVER_STRING = - if defined?(Iodine) - "Iodine" - elsif defined?(Puma) - "Puma" - elsif defined?(Unicorn) - "Unicorn" - end +SERVER_STRING = "roda" Bundler.require(:default) # Load core modules @@ -45,8 +38,6 @@ def connect(dbtype) (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor opts[:pool_timeout] = 10 - elsif defined?(Unicorn) - Sequel.single_threaded = true end Sequel.connect "%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}" % diff --git a/frameworks/Ruby/roda-sequel/config.toml b/frameworks/Ruby/roda-sequel/config.toml index 28a942e4137..a819496996e 100644 --- a/frameworks/Ruby/roda-sequel/config.toml +++ b/frameworks/Ruby/roda-sequel/config.toml @@ -34,71 +34,3 @@ orm = "Full" platform = "Rack" webserver = "Puma" versus = "rack-sequel-puma-mri" - -[postgres-passenger-mri] -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 = "Full" -platform = "Rack" -webserver = "Passenger" -versus = "rack-sequel-postgres-passenger-mri" - -[postgres-unicorn-mri] -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 = "Full" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-sequel-postgres-unicorn-mri" - -[passenger-mri] -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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Rack" -webserver = "Passenger" -versus = "rack-sequel-passenger-mri" - -[unicorn-mri] -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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-sequel-unicorn-mri" diff --git a/frameworks/Ruby/roda-sequel/config/mri_unicorn.rb b/frameworks/Ruby/roda-sequel/config/mri_unicorn.rb deleted file mode 100644 index c9a0c55083e..00000000000 --- a/frameworks/Ruby/roda-sequel/config/mri_unicorn.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative 'auto_tune' - -# FWBM only... -num_workers, = auto_tune - -worker_processes num_workers diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile deleted file mode 100644 index cc307f54a13..00000000000 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM ruby:3.5-rc - -ADD ./ /roda-sequel -WORKDIR /roda-sequel - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set with 'postgresql unicorn' -RUN bundle install --jobs=8 - -ENV DBTYPE=postgresql - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/mri_unicorn.rb -o 0.0.0.0 -p 8080 -E production From fa5004a8d32a8909fd6ffe9a1bd19187f0925c46 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 13 May 2025 16:58:46 -0400 Subject: [PATCH 1446/1766] Add Avaje Jex (#9885) --- frameworks/Java/avaje-jex/README.md | 81 ++++++++ .../Java/avaje-jex/avaje-jex-jetty.dockerfile | 8 + .../avaje-jex/avaje-jex-robaho.dockerfile | 8 + .../Java/avaje-jex/avaje-jex.dockerfile | 8 + .../Java/avaje-jex/benchmark_config.json | 76 ++++++++ frameworks/Java/avaje-jex/config.toml | 53 ++++++ frameworks/Java/avaje-jex/pom.xml | 173 ++++++++++++++++++ .../java/benchmark/DatabaseController.java | 57 ++++++ .../src/main/java/benchmark/Main.java | 27 +++ .../main/java/benchmark/model/Fortune.java | 6 + .../java/benchmark/model/FortuneTemplate.java | 7 + .../src/main/java/benchmark/model/World.java | 38 ++++ .../java/benchmark/repository/DbService.java | 33 ++++ .../benchmark/repository/HikariFactory.java | 29 +++ .../benchmark/repository/JDBCDbService.java | 95 ++++++++++ .../avaje-jex/src/main/java/module-info.java | 19 ++ .../src/main/resources/application.properties | 6 + .../src/main/resources/fortunes.mustache | 20 ++ .../src/main/resources/hikari.properties | 7 + 19 files changed, 751 insertions(+) create mode 100644 frameworks/Java/avaje-jex/README.md create mode 100644 frameworks/Java/avaje-jex/avaje-jex-jetty.dockerfile create mode 100644 frameworks/Java/avaje-jex/avaje-jex-robaho.dockerfile create mode 100644 frameworks/Java/avaje-jex/avaje-jex.dockerfile create mode 100644 frameworks/Java/avaje-jex/benchmark_config.json create mode 100644 frameworks/Java/avaje-jex/config.toml create mode 100644 frameworks/Java/avaje-jex/pom.xml create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/DatabaseController.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/Main.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/model/Fortune.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/model/FortuneTemplate.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/model/World.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/repository/DbService.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java create mode 100644 frameworks/Java/avaje-jex/src/main/java/module-info.java create mode 100644 frameworks/Java/avaje-jex/src/main/resources/application.properties create mode 100644 frameworks/Java/avaje-jex/src/main/resources/fortunes.mustache create mode 100644 frameworks/Java/avaje-jex/src/main/resources/hikari.properties diff --git a/frameworks/Java/avaje-jex/README.md b/frameworks/Java/avaje-jex/README.md new file mode 100644 index 00000000000..54e62058c3d --- /dev/null +++ b/frameworks/Java/avaje-jex/README.md @@ -0,0 +1,81 @@ +# Avaje Jex Benchmarking Test + +## Important Libraries +The tests were run with: +* [Java 24](https://openjdk.java.net) +* [Avaje Http 3.3](https://github.com/avaje/avaje-http) +* [Avaje Inject 11.5](https://github.com/avaje/avaje-inject) +* [Avaje Jex 3.2](https://github.com/avaje/avaje-jex) +* [HikariCP 6.3.0](https://github.com/brettwooldridge/HikariCP) +* [jstachio 1.3.7](https://github.com/jstachio/jstachio) + +[Avaje Jex](https://avaje.io) is a micro web framework for Java's built-in `jdk.httpserver` API. + +```java + Jex.create() + .get("/", ctx -> ctx.text("hello")) + .start(); +``` + +## Test Implementation Source Code + +### Plain Text Test +* [Plain test source](src/main/java/benchmark/Main.java) + +### JSON Encoding Test +* [JSON test source](src/main/java/benchmark/Main.java) + +### Single Query Test +* [Single query test source](src/main/java/benchmark/DatabaseController.java) + +### Multiple Queries Test +* [Multiple queries test source](src/main/java/benchmark/DatabaseController.java) + +### Database Update Test +* [Database update test source](src/main/java/benchmark/DatabaseController.java) + +### Fortunes Test +* [Fortunes test source](src/main/java/benchmark/DatabaseController.java) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/queries?queries= + +### UPDATE + +http://localhost:8080/updates?queries= + +### FORTUNES + +http://localhost:8080/fortunes + +## build + +### java's httpserver impl + + `mvn clean package` + +### robaho's httpserver impl + + `mvn clean package -P robaho` + +### jetty's httpserver impl + + `mvn clean package -P jetty` + +## run + + `java -p ./target/modules/ -m avaje.techempower` \ No newline at end of file diff --git a/frameworks/Java/avaje-jex/avaje-jex-jetty.dockerfile b/frameworks/Java/avaje-jex/avaje-jex-jetty.dockerfile new file mode 100644 index 00000000000..80fc05c124d --- /dev/null +++ b/frameworks/Java/avaje-jex/avaje-jex-jetty.dockerfile @@ -0,0 +1,8 @@ +FROM maven:3.9.9-eclipse-temurin-24 AS build +WORKDIR /avaje-jex +COPY pom.xml pom.xml +COPY src src +RUN mvn package -q -P jetty +EXPOSE 8080 + +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-p", "./target/modules/", "-m", "avaje.techempower"] diff --git a/frameworks/Java/avaje-jex/avaje-jex-robaho.dockerfile b/frameworks/Java/avaje-jex/avaje-jex-robaho.dockerfile new file mode 100644 index 00000000000..d62eb71d124 --- /dev/null +++ b/frameworks/Java/avaje-jex/avaje-jex-robaho.dockerfile @@ -0,0 +1,8 @@ +FROM maven:3.9.9-eclipse-temurin-24 AS build +WORKDIR /avaje-jex +COPY pom.xml pom.xml +COPY src src +RUN mvn package -q -P robaho +EXPOSE 8080 + +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-p", "./target/modules/", "-m", "avaje.techempower"] diff --git a/frameworks/Java/avaje-jex/avaje-jex.dockerfile b/frameworks/Java/avaje-jex/avaje-jex.dockerfile new file mode 100644 index 00000000000..a9c8578c4f5 --- /dev/null +++ b/frameworks/Java/avaje-jex/avaje-jex.dockerfile @@ -0,0 +1,8 @@ +FROM maven:3.9.9-eclipse-temurin-24 AS build +WORKDIR /avaje-jex +COPY pom.xml pom.xml +COPY src src +RUN mvn package -q +EXPOSE 8080 + +CMD ["java", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-p", "./target/modules/", "-m", "avaje.techempower"] diff --git a/frameworks/Java/avaje-jex/benchmark_config.json b/frameworks/Java/avaje-jex/benchmark_config.json new file mode 100644 index 00000000000..90b7a6ed051 --- /dev/null +++ b/frameworks/Java/avaje-jex/benchmark_config.json @@ -0,0 +1,76 @@ +{ + "framework": "avaje-jex", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "avaje-jex", + "language": "Java", + "flavor": "None", + "platform": "httpserver", + "database": "Postgres", + "database_os": "Linux", + "orm": "Raw", + "webserver": "None", + "os": "Linux", + "notes": "avaje-jex using jdk.httpserver", + "display_name": "avaje-jex", + "versus": "httpserver" + }, + "robaho": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "avaje-jex", + "language": "Java", + "flavor": "None", + "platform": "robaho", + "database": "Postgres", + "database_os": "Linux", + "orm": "Raw", + "webserver": "None", + "os": "Linux", + "notes": "avaje-jex using robaho's httpserver", + "display_name": "avaje-jex-robaho", + "versus": "robaho-httpserver" + }, + "jetty": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "avaje-jex", + "language": "Java", + "flavor": "None", + "platform": "Jetty", + "database": "Postgres", + "database_os": "Linux", + "orm": "Raw", + "webserver": "None", + "os": "Linux", + "notes": "avaje-jex using Jetty", + "display_name": "avaje-jex-jetty", + "versus": "jetty" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/Java/avaje-jex/config.toml b/frameworks/Java/avaje-jex/config.toml new file mode 100644 index 00000000000..ec60cda08fa --- /dev/null +++ b/frameworks/Java/avaje-jex/config.toml @@ -0,0 +1,53 @@ +[framework] +name = "avaje-jex" + +[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 = "jdk-httpserver" +webserver = "None" +versus = "httpserver" + +[robaho] +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 = "robaho-httpserver" +webserver = "None" +versus = "robaho-httpserver" + +[jetty] +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 = "Jetty" +webserver = "None" +versus = "jetty" \ No newline at end of file diff --git a/frameworks/Java/avaje-jex/pom.xml b/frameworks/Java/avaje-jex/pom.xml new file mode 100644 index 00000000000..acca218c0c6 --- /dev/null +++ b/frameworks/Java/avaje-jex/pom.xml @@ -0,0 +1,173 @@ + + + 4.0.0 + + io.avaje + avaje-jex-parent + 3.2 + + benchmark + avaje-jex + 1.0 + + + 24 + 2.0.17 + + + + + io.avaje + avaje-config + + + io.avaje + avaje-http-api + + + io.avaje + avaje-inject + + + io.avaje + avaje-jex + + + io.avaje + avaje-jsonb + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-simple + ${slf4j.version} + + + + com.zaxxer + HikariCP + 6.3.0 + + + org.postgresql + postgresql + 42.7.5 + + + + io.jstach + jstachio + 1.3.7 + + + + + io.jstach + jstachio-apt + 1.3.7 + provided + + + io.avaje + avaje-http-jex-generator + provided + + + io.avaje + avaje-inject-generator + provided + + + io.avaje + avaje-jsonb-generator + provided + + + + + + + io.avaje + avaje-provides-maven-plugin + 2.3 + + + + com.spotify.fmt + fmt-maven-plugin + 2.25 + + + + format + + + + + + + + maven-jar-plugin + + ${project.build.directory}/modules + + + benchmark.Main + + + + + + maven-dependency-plugin + + + copy-modules + package + + copy-dependencies + + + ${project.build.directory}/modules + runtime + + + + + + + + + + robaho + + false + + + + io.github.robaho + httpserver + + + + + jetty + + false + + + + org.eclipse.jetty + jetty-http-spi + 12.0.19 + + + + + \ No newline at end of file diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/DatabaseController.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/DatabaseController.java new file mode 100644 index 00000000000..295c01c01b7 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/DatabaseController.java @@ -0,0 +1,57 @@ +package benchmark; + +import benchmark.model.Fortune; +import benchmark.model.FortuneTemplate; +import benchmark.model.World; +import benchmark.repository.DbService; +import io.avaje.http.api.Controller; +import io.avaje.http.api.Get; +import java.sql.SQLException; +import java.util.List; + +@Controller +public class DatabaseController { + + private static final int MIN_QUERIES = 1; + private static final int MAX_QUERIES = 500; + + private final DbService dbService; + + public DatabaseController(DbService dbService) { + + this.dbService = dbService; + } + + @Get("/db") + public World handleSingleDbQuery() throws SQLException { + return dbService.getWorld(1).get(0); + } + + @Get("/queries") + public List handleMultipleDbQueries(String queries) throws SQLException { + int num = getBoundedRowNumber(queries); + return dbService.getWorld(num); + } + + @Get("/fortunes") + public FortuneTemplate handleFortunes() throws SQLException { + List fortuneList = dbService.getFortune(); + return new FortuneTemplate(fortuneList); + } + + @Get("/updates") + public List handleUpdates(String queries) throws SQLException { + int num = getBoundedRowNumber(queries); + return dbService.updateWorld(num); + } + + private static int getBoundedRowNumber(String number) { + int num; + try { + num = Integer.parseInt(number); + } catch (NumberFormatException e) { + num = MIN_QUERIES; + } + return Math.max(MIN_QUERIES, Math.min(num, MAX_QUERIES)); + } +} diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/Main.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/Main.java new file mode 100644 index 00000000000..88666251bf5 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/Main.java @@ -0,0 +1,27 @@ +package benchmark; + +import io.avaje.inject.BeanScope; +import io.avaje.jex.Jex; +import io.avaje.jex.Routing.HttpService; +import io.avaje.jsonb.Jsonb; +import io.avaje.jsonb.Types; +import java.util.Map; + +public class Main { + + public static void main(String[] args) { + + var beans = BeanScope.builder().build(); + var routes = beans.list(HttpService.class); + var type = Jsonb.builder().build().type(Types.mapOf(String.class)); + + Jex.create() + .config(c -> c.compression().disableCompression()) + .get("/plaintext", ctx -> ctx.text("Hello, World!")) + .get("/json", ctx -> ctx.jsonb(type, Map.of("message", "Hello, World!"))) + .before(ctx -> ctx.header("Server", "avaje-jex")) + .error(Exception.class, (ctx, _) -> ctx.status(503).text("503 Service Unavailable")) + .routing(routes) + .start(); + } +} diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/model/Fortune.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/model/Fortune.java new file mode 100644 index 00000000000..b582775b5e6 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/model/Fortune.java @@ -0,0 +1,6 @@ +package benchmark.model; + +import io.avaje.jsonb.Json; + +@Json +public record Fortune(int id, String message) {} diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/model/FortuneTemplate.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/model/FortuneTemplate.java new file mode 100644 index 00000000000..6de30cc4730 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/model/FortuneTemplate.java @@ -0,0 +1,7 @@ +package benchmark.model; + +import io.jstach.jstache.JStache; +import java.util.List; + +@JStache(path = "fortunes.mustache") +public record FortuneTemplate(List fortunes) {} diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/model/World.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/model/World.java new file mode 100644 index 00000000000..473d1bf6efd --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/model/World.java @@ -0,0 +1,38 @@ +package benchmark.model; + +import io.avaje.jsonb.Json; + +@Json +public class World { + + private int id; + private int randomNumber; + + public World() {} + + public World(int id, int randomNumber) { + this.id = id; + this.randomNumber = randomNumber; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getRandomNumber() { + return randomNumber; + } + + public void setRandomNumber(int randomNumber) { + this.randomNumber = randomNumber; + } + + @Override + public String toString() { + return "World{" + "id=" + id + ", randomNumber=" + randomNumber + '}'; + } +} diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/DbService.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/DbService.java new file mode 100644 index 00000000000..551268734e2 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/DbService.java @@ -0,0 +1,33 @@ +package benchmark.repository; + +import benchmark.model.Fortune; +import benchmark.model.World; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +public interface DbService { + + int MIN_RANDOM_NUMBER = 1; + int MAX_RANDOM_NUMBER_PLUS_ONE = 10001; + int defaultFortuneId = 0; + String defaultFortuneMessage = "Additional fortune added at request time."; + + List getWorld(int num) throws SQLException; + + List getFortune() throws SQLException; + + List updateWorld(int num) throws SQLException; + + default int getRandomNumber() { + return ThreadLocalRandom.current().nextInt(MIN_RANDOM_NUMBER, MAX_RANDOM_NUMBER_PLUS_ONE); + } + + default Set getRandomNumberSet(int num) { + Set set = new HashSet<>(); + while (set.size() < num) set.add(getRandomNumber()); + return set; + } +} diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java new file mode 100644 index 00000000000..6b38d6f14a2 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java @@ -0,0 +1,29 @@ +package benchmark.repository; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import io.avaje.config.Config; +import io.avaje.inject.Bean; +import io.avaje.inject.Factory; +import javax.sql.DataSource; + +@Factory +public class HikariFactory { + + @Bean + DataSource dataSource() { + int maxPoolSize; + var env = System.getenv("BENCHMARK_ENV"); + if (Config.get("physicalTag").equals(env)) { + maxPoolSize = Config.getInt("postgresPhysicalPoolSize"); + } else if (Config.get("cloudTag").equals(env)) { + maxPoolSize = Config.getInt("postgresCloudPoolSize"); + } else { + maxPoolSize = Config.getInt("postgresDefaultPoolSize"); + } + + var hikari = new HikariDataSource(new HikariConfig("hikari.properties")); + hikari.setMaximumPoolSize(maxPoolSize); + return hikari; + } +} diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java new file mode 100644 index 00000000000..a4d790d717d --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java @@ -0,0 +1,95 @@ +package benchmark.repository; + +import benchmark.model.Fortune; +import benchmark.model.World; +import jakarta.inject.Singleton; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import javax.sql.DataSource; + +@Singleton +public class JDBCDbService implements DbService { + + private final DataSource datasource; + + public JDBCDbService(DataSource connectionFactory) { + this.datasource = connectionFactory; + } + + @Override + public List getWorld(int num) { + + String select = "select id, randomNumber from World where id = ?"; + List worldList = new ArrayList<>(); + + try (Connection conn = datasource.getConnection(); + PreparedStatement pstm = conn.prepareStatement(select)) { + + for (int randomId : getRandomNumberSet(num)) { + pstm.setInt(1, randomId); + try (ResultSet rs = pstm.executeQuery()) { + rs.next(); + worldList.add(new World(rs.getInt("id"), rs.getInt("randomNumber"))); + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + + return worldList; + } + + @Override + public List getFortune() throws SQLException { + + String select = "select id, message from Fortune"; + List fortuneList = new ArrayList<>(); + + try (Connection conn = datasource.getConnection(); + PreparedStatement pstm = conn.prepareStatement(select); + ResultSet rs = pstm.executeQuery()) { + + while (rs.next()) { + fortuneList.add(new Fortune(rs.getInt("id"), rs.getString("message"))); + } + fortuneList.add(new Fortune(defaultFortuneId, defaultFortuneMessage)); + } + + fortuneList.sort(Comparator.comparing(Fortune::message)); + return fortuneList; + } + + @Override + public List updateWorld(int num) throws SQLException { + + String update = "update World set randomNumber = ? where id = ?"; + List worldList = getWorld(num); + + try (Connection conn = datasource.getConnection(); + PreparedStatement pstm = conn.prepareStatement(update)) { + + conn.setAutoCommit(false); + for (World world : worldList) { + int newRandomNumber; + do { + newRandomNumber = getRandomNumber(); + } while (newRandomNumber == world.getRandomNumber()); + + pstm.setInt(1, newRandomNumber); + pstm.setInt(2, world.getId()); + pstm.addBatch(); + + world.setRandomNumber(newRandomNumber); + } + pstm.executeBatch(); + conn.commit(); + } + + return worldList; + } +} diff --git a/frameworks/Java/avaje-jex/src/main/java/module-info.java b/frameworks/Java/avaje-jex/src/main/java/module-info.java new file mode 100644 index 00000000000..342462fdb08 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/java/module-info.java @@ -0,0 +1,19 @@ +module avaje.techempower { + // jdk.httpserver wrapper + requires jdk.httpserver; + requires io.avaje.jex; + /// Postgres driver and pool + requires java.sql; + requires org.postgresql.jdbc; + requires com.zaxxer.hikari; + // template engine + requires io.jstach.jstachio; + /// Configuration + requires io.avaje.config; + // controller generation + requires io.avaje.http.api; + /// Dependency Injection + requires io.avaje.inject; + /// Json + requires io.avaje.jsonb; +} diff --git a/frameworks/Java/avaje-jex/src/main/resources/application.properties b/frameworks/Java/avaje-jex/src/main/resources/application.properties new file mode 100644 index 00000000000..804296ecc89 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/resources/application.properties @@ -0,0 +1,6 @@ +physicalTag=Citrine +cloudTag=Azure + +postgresPhysicalPoolSize=56 +postgresCloudPoolSize=16 +postgresDefaultPoolSize=10 \ No newline at end of file diff --git a/frameworks/Java/avaje-jex/src/main/resources/fortunes.mustache b/frameworks/Java/avaje-jex/src/main/resources/fortunes.mustache new file mode 100644 index 00000000000..ec4599da71f --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/resources/fortunes.mustache @@ -0,0 +1,20 @@ + + + + Fortunes + + + + + + + + {{#fortunes}} + + + + + {{/fortunes}} +
      idmessage
      {{id}}{{message}}
      + + \ No newline at end of file diff --git a/frameworks/Java/avaje-jex/src/main/resources/hikari.properties b/frameworks/Java/avaje-jex/src/main/resources/hikari.properties new file mode 100644 index 00000000000..f859c5a8763 --- /dev/null +++ b/frameworks/Java/avaje-jex/src/main/resources/hikari.properties @@ -0,0 +1,7 @@ +dataSourceClassName=org.postgresql.ds.PGSimpleDataSource +dataSource.serverName=tfb-database +dataSource.portNumber=5432 +dataSource.user=benchmarkdbuser +dataSource.password=benchmarkdbpass +dataSource.databaseName=hello_world + From 17a58d3eda098b91504cf322970beacdc56bda4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+ltpp-universe@users.noreply.github.com> Date: Wed, 14 May 2025 04:59:06 +0800 Subject: [PATCH 1447/1766] Update hyperlane (#9884) * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' --- frameworks/Rust/hyperlane/Cargo.lock | 204 ++++++++++-------------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/src/server.rs | 10 +- 3 files changed, 85 insertions(+), 131 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index d805171f676..3d9ebec0fb3 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -19,15 +19,15 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.16", + "getrandom 0.3.3", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -68,9 +68,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -197,9 +197,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -537,9 +537,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", @@ -655,9 +655,9 @@ checksum = "1292cbdcf2588d15f8bf14cac381785c11ca7634d6a088cad9eebb5068d2652b" [[package]] name = "http-type" -version = "3.68.0" +version = "3.69.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccd07d720a1fe07d30d1f7f6f0eb5ebda6c0280d113a8211abe382e23872536" +checksum = "eaf5da8da331a56ba2e5b0a8a70432471ecba536d7ad1d9837fa530a357d0979" dependencies = [ "ahash", "dashmap", @@ -682,9 +682,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.92.0" +version = "4.94.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a1ff97d715538d6207da4e199a8486d3c4d6198777477cda350e409b8da73b" +checksum = "3729f28d6eabc3106bff87c6d22e948234edc58cac893ad0b886f9edf6460759" dependencies = [ "clonelicious", "color-output", @@ -727,21 +727,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -750,31 +751,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -782,67 +763,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "idna" version = "1.0.3" @@ -856,9 +824,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -907,9 +875,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libsqlite3-sys" @@ -929,9 +897,9 @@ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" @@ -1151,13 +1119,22 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.25", + "zerocopy", ] [[package]] @@ -1240,7 +1217,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -1456,7 +1433,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c962f626b54771990066e5435ec8331d1462576cd2d1e62f24076ae014f92112" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "halfbrown", "ref-cast", "serde", @@ -1765,7 +1742,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", @@ -1813,9 +1790,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -1838,9 +1815,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -1967,12 +1944,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2248,17 +2219,11 @@ dependencies = [ "bitflags", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xml-rs" @@ -2268,9 +2233,9 @@ checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -2280,9 +2245,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -2290,33 +2255,13 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - [[package]] name = "zerocopy" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "zerocopy-derive", ] [[package]] @@ -2357,11 +2302,22 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -2370,9 +2326,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index d6d76c7243d..d3cc9e2afd8 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.92.0" +hyperlane = "4.94.0" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.5", features = ["runtime-tokio", "postgres"] } diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index e3402d638c5..7beff9e3a6a 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -3,12 +3,10 @@ use tokio::runtime::{Builder, Runtime}; fn runtime() -> Runtime { Builder::new_multi_thread() - .worker_threads(get_thread_count() >> 1) + .worker_threads(get_thread_count()) .thread_stack_size(1_048_576) - .worker_threads(get_thread_count() >> 1) - .thread_stack_size(1_048_576) - .max_blocking_threads(5120) - .max_io_events_per_tick(5120) + .max_blocking_threads(10240) + .max_io_events_per_tick(10240) .enable_all() .build() .unwrap() @@ -40,7 +38,7 @@ async fn init_server() { server.route("/fortunes", route::fortunes).await; #[cfg(any(feature = "dev", feature = "update"))] server.route("/upda", route::update).await; - server.listen().await.unwrap(); + server.run().await.unwrap(); } async fn init() { From 4442bcf569ff560679760963be3a7607611069ef Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 20 May 2025 19:38:13 +0200 Subject: [PATCH 1448/1766] [perl] Remove duplicate json and plaintext [ci skip] (#9898) --- frameworks/Perl/feersum/benchmark_config.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/frameworks/Perl/feersum/benchmark_config.json b/frameworks/Perl/feersum/benchmark_config.json index 84e75044bd2..383b356f644 100644 --- a/frameworks/Perl/feersum/benchmark_config.json +++ b/frameworks/Perl/feersum/benchmark_config.json @@ -29,12 +29,10 @@ }, "mysql": { "dockerfile": "feersum.dockerfile", - "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", "fortune_url": "/fortunes", "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", "cached_query_url": "/cached-queries?count=", "port": 8080, "approach": "Realistic", From ac5a83e843ac6168c9f09754b97a6ee2a4b22f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Wed, 21 May 2025 01:38:47 +0800 Subject: [PATCH 1449/1766] Upgrade hyperlane (#9901) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 146 ++++++++---------------- frameworks/Rust/hyperlane/Cargo.toml | 10 +- frameworks/Rust/hyperlane/README.md | 2 +- frameworks/Rust/hyperlane/src/db.rs | 12 +- frameworks/Rust/hyperlane/src/main.rs | 6 +- frameworks/Rust/hyperlane/src/server.rs | 5 +- 6 files changed, 65 insertions(+), 116 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 3d9ebec0fb3..3a4763d5e75 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -95,9 +95,9 @@ checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -158,15 +158,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clonelicious" -version = "1.1.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3dfae702af156917c65f4ccc70687088331f0b694e5e687453e4d68a16b496" +checksum = "b7d51b119ca46e37c21508debf8d9823521be05a70e32ee5afc7695ae1cfb4ec" [[package]] name = "color-output" -version = "6.6.1" +version = "6.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a70e27f954a060626fdba6829cdded6c3dae6376d0e03822363114aaead8a8" +checksum = "ed260583bcafb40922925d447c098fd5b94e7b2eb8679e87dae2632da0a01357" dependencies = [ "hyperlane-time", ] @@ -313,16 +313,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "etcetera" version = "0.8.0" @@ -345,17 +335,11 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - [[package]] name = "file-operation" -version = "0.5.9" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78548b84eac71fe0f185f2169fa960f65af6e49ae2b63fdb729e81cacdf7b5da" +checksum = "b1b81e9a35a431f57f3304aec4ed6a59c7f1fb82af62b02e18afe197e8e3769d" dependencies = [ "tokio", ] @@ -407,12 +391,9 @@ dependencies = [ [[package]] name = "future-fn" -version = "0.1.0" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "001452c736697c8f96e4689dc5ab6a89f175981417139a44f1dd1f7c20d430a5" -dependencies = [ - "tokio", -] +checksum = "61a60fa5df978d3b02f58da08ae2e47d2bb8b19f765a693eaa9e5e8045b3925d" [[package]] name = "futures" @@ -638,9 +619,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.13.1" +version = "2.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e8fe2367f50ba59314488b240828c518c17f3b19d48d2555c62d947925d6ac" +checksum = "7f1e04c8ee442e52dfbf7e4003f614d8e35ff4e4f6ea9271871abcec8a6d7c85" dependencies = [ "brotli", "flate2", @@ -649,15 +630,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.42.1" +version = "1.42.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1292cbdcf2588d15f8bf14cac381785c11ca7634d6a088cad9eebb5068d2652b" +checksum = "1808d8983c7ca1d289188767327a24d3e6c0c6a741257745fd7fea9f8f7a7635" [[package]] name = "http-type" -version = "3.69.0" +version = "3.69.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf5da8da331a56ba2e5b0a8a70432471ecba536d7ad1d9837fa530a357d0979" +checksum = "03e242a3c26c3365128c36a3cc803a4d3299cdf466dff723acbdee7a3911d045" dependencies = [ "ahash", "dashmap", @@ -682,9 +663,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.94.0" +version = "4.99.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3729f28d6eabc3106bff87c6d22e948234edc58cac893ad0b886f9edf6460759" +checksum = "ee442e23cfd5aa7a08992fdb58e4ae18281bae51a5ee6907e7cd5344f758a81b" dependencies = [ "clonelicious", "color-output", @@ -699,9 +680,9 @@ dependencies = [ [[package]] name = "hyperlane-log" -version = "1.16.1" +version = "1.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17a47938bb5388e2428ebbe02098c485c2a596b4aae4cc909320394dede527bb" +checksum = "dc2fea42cc7c83f7c8436ee6db372fc043a034065d94f9ac6dbbc28e00302d14" dependencies = [ "file-operation", "hyperlane-time", @@ -711,13 +692,13 @@ dependencies = [ [[package]] name = "hyperlane-time" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f69051b8978d37eb5a3d8f700a39159d40d7646f1aef8d2f3e441279f4dfa1" +checksum = "8e7dd4a0e7011c2909328b695546ef47a520969d619d6f0542a56d8f3ef84470" [[package]] name = "hyperlane_techempower" -version = "0.0.1" +version = "0.1.0" dependencies = [ "hyperlane", "rand 0.9.1", @@ -889,12 +870,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - [[package]] name = "litemap" version = "0.8.0" @@ -919,9 +894,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lombok-macros" -version = "1.10.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ffb76637e1a834f7ad93d96b8be0bcfa6673f08fdcab6c9fbeabc1cb0e8c379" +checksum = "89a6c00f977434776490d523145f6de60b6b7d9ce1096c011449484c80100a40" dependencies = [ "proc-macro2", "quote", @@ -1222,9 +1197,9 @@ dependencies = [ [[package]] name = "recoverable-spawn" -version = "3.7.2" +version = "3.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57702670d1a6eb7e02bbd6c2fafe3587c42eb2ce4e5012ae8632171aa58c21b6" +checksum = "6740e68c7a92ceec820bb9e62ade93377b631ee1d4e8252a34a3815446e59f64" dependencies = [ "once_cell", "tokio", @@ -1232,9 +1207,9 @@ dependencies = [ [[package]] name = "recoverable-thread-pool" -version = "2.3.1" +version = "2.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a8924916abfed76681374565d505b59b2c8bc17f03e3693be2243c324433ed" +checksum = "629c4dafeade0bd46f1f9ce78dcb8336ba912b2544d028a8cf714a32a0ffa29f" dependencies = [ "lombok-macros", "recoverable-spawn", @@ -1296,19 +1271,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustix" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - [[package]] name = "ryu" version = "1.0.20" @@ -1379,9 +1341,9 @@ dependencies = [ [[package]] name = "server-manager" -version = "3.2.1" +version = "3.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be400c8b4c701205cf9415f5463845319fbaeea0964750cb94f830224145d86" +checksum = "d6936d74a2263590ed722bdf27315b693b8a84a5dffdb3b47a9b7c0a7b50396b" dependencies = [ "tokio", ] @@ -1497,9 +1459,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1510,9 +1472,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ "base64", "bytes", @@ -1544,9 +1506,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" dependencies = [ "proc-macro2", "quote", @@ -1557,9 +1519,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" dependencies = [ "dotenvy", "either", @@ -1576,16 +1538,15 @@ dependencies = [ "sqlx-postgres", "sqlx-sqlite", "syn", - "tempfile", "tokio", "url", ] [[package]] name = "sqlx-mysql" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64", @@ -1625,9 +1586,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64", @@ -1662,9 +1623,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" dependencies = [ "atoi", "flume", @@ -1692,9 +1653,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "std-macro-extensions" -version = "0.23.0" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a607e0efa86ea0eaa1985e254fd8412d8d2d2aa5e46af96b67a6b188677dcbeb" +checksum = "aa17898d2c4216a85ad32abd51101b6eab0adef954ed1393c4557ba378625ade" [[package]] name = "stringprep" @@ -1735,19 +1696,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom 0.3.3", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - [[package]] name = "thiserror" version = "1.0.69" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index d3cc9e2afd8..6aa15d13e04 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "hyperlane_techempower" -version = "0.0.1" +version = "0.1.0" edition = "2024" -authors = ["ltpp-universe "] +authors = ["root@ltpp.vip"] license = "MIT" description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication.""" keywords = ["http", "request", "response", "tcp", "redirect"] -repository = "https://github.com/ltpp-universe/hyperlane.git" +repository = "https://github.com/eastspire/hyperlane.git" categories = ["network-programming", "web-programming"] exclude = [ "target", @@ -18,10 +18,10 @@ exclude = [ ] [dependencies] -hyperlane = "4.94.0" +hyperlane = "4.99.2" rand = "0.9.1" serde = "1.0.219" -sqlx = { version = "0.8.5", features = ["runtime-tokio", "postgres"] } +sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } [profile.dev] incremental = false diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index 731b60a4650..d2b95b513b9 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -1,4 +1,4 @@ -# [hyperlane](https://github.com/ltpp-universe/hyperlane) web framework +# [hyperlane](https://github.com/eastspire/hyperlane) web framework ## Description diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 379645fe5e5..435ad3f9c79 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -8,7 +8,7 @@ pub fn get_db_connection() -> &'static DbPoolConnection { pub async fn create_database() { let db_pool: &DbPoolConnection = get_db_connection(); let _ = query(&format!("CREATE DATABASE {};", DATABASE_NAME)) - .execute(&db_pool) + .execute(db_pool) .await; } @@ -21,7 +21,7 @@ pub async fn create_table() { );", TABLE_NAME_WORLD )) - .execute(&db_pool) + .execute(db_pool) .await; let _ = query(&format!( "CREATE TABLE IF NOT EXISTS {} ( @@ -29,7 +29,7 @@ pub async fn create_table() { );", TABLE_NAME_FORTUNE )) - .execute(&db_pool) + .execute(db_pool) .await; } @@ -37,7 +37,7 @@ pub async fn create_table() { pub async fn insert_records() { let db_pool: &DbPoolConnection = get_db_connection(); let row: PgRow = query(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME_WORLD)) - .fetch_one(&db_pool) + .fetch_one(db_pool) .await .unwrap(); let count: i64 = row.get(0); @@ -56,7 +56,7 @@ pub async fn insert_records() { TABLE_NAME_WORLD, values.join(",") ); - let _ = query(&sql).execute(&db_pool).await; + let _ = query(&sql).execute(db_pool).await; let mut values: Vec = Vec::new(); for _ in 0..missing_count { let random_number: i32 = get_random_id(); @@ -67,7 +67,7 @@ pub async fn insert_records() { TABLE_NAME_FORTUNE, values.join(",") ); - let _ = query(&sql).execute(&db_pool).await; + let _ = query(&sql).execute(db_pool).await; } pub async fn init_cache() -> Vec { diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index e6c40b0d9e0..da29f0836b2 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -12,12 +12,16 @@ pub(crate) mod utils; pub(crate) use r#const::*; pub(crate) use db::*; +pub(crate) use r#type::*; +pub(crate) use utils::*; + pub(crate) use hyperlane::{ futures::{executor::block_on, future::join_all}, once_cell::sync::Lazy, serde::*, serde_json::{Value, json}, tokio::{ + runtime::{Builder, Runtime}, spawn, sync::{AcquireError, OwnedSemaphorePermit, Semaphore}, task::JoinHandle, @@ -32,8 +36,6 @@ pub(crate) use sqlx::{ *, }; pub(crate) use std::{fmt, hint::black_box, sync::Arc}; -pub(crate) use r#type::*; -pub(crate) use utils::*; fn main() { run_server(); diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 7beff9e3a6a..49ce05c7398 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -1,12 +1,11 @@ use crate::*; -use tokio::runtime::{Builder, Runtime}; fn runtime() -> Runtime { Builder::new_multi_thread() .worker_threads(get_thread_count()) .thread_stack_size(1_048_576) - .max_blocking_threads(10240) - .max_io_events_per_tick(10240) + .max_blocking_threads(1_024_000) + .max_io_events_per_tick(1024000) .enable_all() .build() .unwrap() From 69df72fd2abd08638c7a2dab849c148ff7411d01 Mon Sep 17 00:00:00 2001 From: Vetrichelvan Date: Tue, 20 May 2025 23:24:45 +0530 Subject: [PATCH 1450/1766] fix: remove unmaintained python packages (#9904) --- frameworks/Python/apidaora/README.md | 25 - .../Python/apidaora/apidaora-core.dockerfile | 17 - .../Python/apidaora/apidaora.dockerfile | 17 - frameworks/Python/apidaora/apidaora_conf.py | 14 - .../Python/apidaora/apidaora_core_conf.py | 14 - frameworks/Python/apidaora/app.py | 144 ------ .../Python/apidaora/benchmark_config.json | 53 --- frameworks/Python/apidaora/config.toml | 36 -- frameworks/Python/apidaora/coreapp.py | 143 ------ frameworks/Python/apidaora/requirements.txt | 6 - .../Python/apidaora/templates/fortune.html | 10 - frameworks/Python/async-worker/Pipfile | 17 - frameworks/Python/async-worker/Pipfile.lock | 440 ------------------ frameworks/Python/async-worker/README.md | 14 - .../async-worker/async-worker.dockerfile | 19 - .../Python/async-worker/benchmark_config.json | 20 - .../Python/async-worker/src/__init__.py | 0 .../Python/async-worker/src/hello_world.py | 18 - frameworks/Python/bareasgi/README.md | 22 - frameworks/Python/bareasgi/app.py | 136 ------ .../Python/bareasgi/bareasgi.dockerfile | 11 - .../Python/bareasgi/benchmark_config.json | 30 -- frameworks/Python/bareasgi/config.toml | 19 - frameworks/Python/bareasgi/hypercorn_conf.py | 13 - frameworks/Python/bareasgi/requirements.txt | 17 - .../Python/bareasgi/templates/fortune.html | 10 - frameworks/Python/japronto/README.md | 21 - frameworks/Python/japronto/app.py | 78 ---- frameworks/Python/japronto/app_postgres.py | 51 -- .../Python/japronto/benchmark_config.json | 23 - frameworks/Python/japronto/config.toml | 15 - frameworks/Python/japronto/db.py | 45 -- .../japronto/japronto-postgres.dockerfile | 11 - .../Python/japronto/japronto.dockerfile | 11 - frameworks/Python/japronto/requirements.txt | 4 - .../Python/japronto/requirements_postgres.txt | 3 - frameworks/Python/routerling/README.md | 22 - frameworks/Python/routerling/app.py | 170 ------- .../Python/routerling/benchmark_config.json | 27 -- frameworks/Python/routerling/config.toml | 19 - frameworks/Python/routerling/requirements.txt | 11 - .../Python/routerling/routerling.dockerfile | 17 - frameworks/Python/routerling/settings.py | 14 - .../Python/routerling/templates/fortune.html | 18 - 44 files changed, 1825 deletions(-) delete mode 100755 frameworks/Python/apidaora/README.md delete mode 100644 frameworks/Python/apidaora/apidaora-core.dockerfile delete mode 100644 frameworks/Python/apidaora/apidaora.dockerfile delete mode 100644 frameworks/Python/apidaora/apidaora_conf.py delete mode 100644 frameworks/Python/apidaora/apidaora_core_conf.py delete mode 100755 frameworks/Python/apidaora/app.py delete mode 100755 frameworks/Python/apidaora/benchmark_config.json delete mode 100644 frameworks/Python/apidaora/config.toml delete mode 100644 frameworks/Python/apidaora/coreapp.py delete mode 100644 frameworks/Python/apidaora/requirements.txt delete mode 100644 frameworks/Python/apidaora/templates/fortune.html delete mode 100644 frameworks/Python/async-worker/Pipfile delete mode 100644 frameworks/Python/async-worker/Pipfile.lock delete mode 100644 frameworks/Python/async-worker/README.md delete mode 100644 frameworks/Python/async-worker/async-worker.dockerfile delete mode 100644 frameworks/Python/async-worker/benchmark_config.json delete mode 100644 frameworks/Python/async-worker/src/__init__.py delete mode 100644 frameworks/Python/async-worker/src/hello_world.py delete mode 100755 frameworks/Python/bareasgi/README.md delete mode 100644 frameworks/Python/bareasgi/app.py delete mode 100644 frameworks/Python/bareasgi/bareasgi.dockerfile delete mode 100755 frameworks/Python/bareasgi/benchmark_config.json delete mode 100644 frameworks/Python/bareasgi/config.toml delete mode 100644 frameworks/Python/bareasgi/hypercorn_conf.py delete mode 100644 frameworks/Python/bareasgi/requirements.txt delete mode 100644 frameworks/Python/bareasgi/templates/fortune.html delete mode 100644 frameworks/Python/japronto/README.md delete mode 100644 frameworks/Python/japronto/app.py delete mode 100644 frameworks/Python/japronto/app_postgres.py delete mode 100644 frameworks/Python/japronto/benchmark_config.json delete mode 100644 frameworks/Python/japronto/config.toml delete mode 100644 frameworks/Python/japronto/db.py delete mode 100644 frameworks/Python/japronto/japronto-postgres.dockerfile delete mode 100644 frameworks/Python/japronto/japronto.dockerfile delete mode 100644 frameworks/Python/japronto/requirements.txt delete mode 100644 frameworks/Python/japronto/requirements_postgres.txt delete mode 100755 frameworks/Python/routerling/README.md delete mode 100644 frameworks/Python/routerling/app.py delete mode 100755 frameworks/Python/routerling/benchmark_config.json delete mode 100644 frameworks/Python/routerling/config.toml delete mode 100644 frameworks/Python/routerling/requirements.txt delete mode 100644 frameworks/Python/routerling/routerling.dockerfile delete mode 100644 frameworks/Python/routerling/settings.py delete mode 100644 frameworks/Python/routerling/templates/fortune.html diff --git a/frameworks/Python/apidaora/README.md b/frameworks/Python/apidaora/README.md deleted file mode 100755 index 5a43e7b9070..00000000000 --- a/frameworks/Python/apidaora/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# APIDaora Benchmarking Test - -This is the APIDaora portion of a [benchmarking tests suite](../../) -comparing a variety of web development platforms. - -The information below is specific to APIDaora. 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 - -[**APIDaora**](https://github.com/dutradda/apidaora) is a HTTP/REST API using dataclasses and TypedDict annotation for python3.8+. - -## Test Paths & Sources - -The default test implementations are located within the file ([app.py](app.py)). -The core module test implementations are located within the file ([coreapp.py](coreapp.py)). - -All the tests are based on the ones for FastAPI, as APIDaora is an asgi application and have the same principles of using typing annotations for validation/serialization of data. - -## Resources - -* [APIDaora source code on GitHub](https://github.com/dutradda/apidaora) -* [APIDaora website - documentation](https://dutradda.github.io/apidaora/) diff --git a/frameworks/Python/apidaora/apidaora-core.dockerfile b/frameworks/Python/apidaora/apidaora-core.dockerfile deleted file mode 100644 index 2598be52dd1..00000000000 --- a/frameworks/Python/apidaora/apidaora-core.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM python:3.8 - -ADD templates/fortune.html /apidaora/templates/ - -WORKDIR /apidaora - -ADD requirements.txt /apidaora/ - -RUN pip3 install cython==0.29.13 - -RUN pip3 install -r /apidaora/requirements.txt - -ADD apidaora_core_conf.py coreapp.py /apidaora/ - -EXPOSE 8080 - -CMD gunicorn coreapp:app -k uvicorn.workers.UvicornWorker -c apidaora_core_conf.py diff --git a/frameworks/Python/apidaora/apidaora.dockerfile b/frameworks/Python/apidaora/apidaora.dockerfile deleted file mode 100644 index 0dcdcd1909d..00000000000 --- a/frameworks/Python/apidaora/apidaora.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM python:3.8 - -ADD templates/fortune.html /apidaora/templates/ - -WORKDIR /apidaora - -ADD requirements.txt /apidaora/ - -RUN pip3 install cython==0.29.13 - -RUN pip3 install -r /apidaora/requirements.txt - -ADD apidaora_conf.py app.py /apidaora/ - -EXPOSE 8080 - -CMD gunicorn app:app -k uvicorn.workers.UvicornWorker -c apidaora_conf.py diff --git a/frameworks/Python/apidaora/apidaora_conf.py b/frameworks/Python/apidaora/apidaora_conf.py deleted file mode 100644 index c7e9f3e4c9c..00000000000 --- a/frameworks/Python/apidaora/apidaora_conf.py +++ /dev/null @@ -1,14 +0,0 @@ -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/apidaora.pid' -loglevel = 'error' diff --git a/frameworks/Python/apidaora/apidaora_core_conf.py b/frameworks/Python/apidaora/apidaora_core_conf.py deleted file mode 100644 index 16db2539e21..00000000000 --- a/frameworks/Python/apidaora/apidaora_core_conf.py +++ /dev/null @@ -1,14 +0,0 @@ -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/apidaora-core.pid' -loglevel = 'error' diff --git a/frameworks/Python/apidaora/app.py b/frameworks/Python/apidaora/app.py deleted file mode 100755 index 6c1455e3a82..00000000000 --- a/frameworks/Python/apidaora/app.py +++ /dev/null @@ -1,144 +0,0 @@ -import asyncio -import asyncpg -import os -import jinja2 -from logging import getLogger -from apidaora import appdaora, html, route, text -from random import randint -from operator import itemgetter -from typing import TypedDict, Optional - - -logger = getLogger(__name__) - - -READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' -READ_ROW_SQL_TO_UPDATE = '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.'] - - -async def setup_database(): - global connection_pool - connection_pool = await asyncpg.create_pool( - user=os.getenv('PGUSER', 'benchmarkdbuser'), - password=os.getenv('PGPASS', 'benchmarkdbpass'), - database='hello_world', - host='tfb-database', - port=5432 - ) - - -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) - - -def get_num_queries(queries): - try: - query_count = int(queries) - except (ValueError, TypeError): - return 1 - - if query_count < 1: - return 1 - if query_count > 500: - return 500 - return query_count - - -connection_pool = None -sort_fortunes_key = itemgetter(1) -template = load_fortunes_template() -loop = asyncio.get_event_loop() -loop.run_until_complete(setup_database()) - - -@route.get('/json') -async def json_serialization(): - return {'message': 'Hello, world!'} - - -class DatabaseObject(TypedDict): - id: int - randomNumber: float - - -@route.get('/db') -async def single_database_query(): - row_id = randint(1, 10000) - - async with connection_pool.acquire() as connection: - number = await connection.fetchval(READ_ROW_SQL, row_id) - - return DatabaseObject(id=row_id, randomNumber=number) - - -@route.get('/queries') -async def multiple_database_queries(queries: Optional[str] = None): - num_queries = get_num_queries(queries) - row_ids = [randint(1, 10000) for _ in range(num_queries)] - worlds = [] - - async with connection_pool.acquire() as connection: - statement = await connection.prepare(READ_ROW_SQL) - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append( - DatabaseObject( - id=row_id, - randomNumber=number - ) - ) - - return worlds - - -@route.get('/fortunes') -async def fortunes(): - async with connection_pool.acquire() as connection: - fortunes = await connection.fetch('SELECT * FROM Fortune') - - fortunes.append(ADDITIONAL_ROW) - fortunes.sort(key=sort_fortunes_key) - content = template.render(fortunes=fortunes) - return html(content) - - -@route.get('/updates') -async def database_updates(queries: Optional[str] = None): - worlds = [] - updates = set() - - async with connection_pool.acquire() as connection: - statement = await connection.prepare(READ_ROW_SQL_TO_UPDATE) - - for _ in range(get_num_queries(queries)): - record = await statement.fetchrow(randint(1, 10000)) - world = DatabaseObject( - id=record['id'], randomNumber=record['randomnumber'] - ) - world['randomNumber'] = randint(1, 10000) - worlds.append(world) - updates.add((world['id'], world['randomNumber'])) - - await connection.executemany(WRITE_ROW_SQL, updates) - - return worlds - - -@route.get('/plaintext') -async def plaintext(): - return text('Hello, world!') - - -app = appdaora([ - json_serialization, - single_database_query, - multiple_database_queries, - fortunes, - database_updates, - plaintext -]) diff --git a/frameworks/Python/apidaora/benchmark_config.json b/frameworks/Python/apidaora/benchmark_config.json deleted file mode 100755 index 4859e2dfc75..00000000000 --- a/frameworks/Python/apidaora/benchmark_config.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "framework": "apidaora", - "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", - "database": "Postgres", - "framework": "APIDaora", - "language": "Python", - "flavor": "Python3.8", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "APIDaora", - "notes": "", - "versus": "None" - }, - "core": { - "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", - "database": "Postgres", - "framework": "APIDaora", - "language": "Python", - "flavor": "Python3.8", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "APIDaora Core", - "notes": "", - "versus": "None" - } - } - ] -} diff --git a/frameworks/Python/apidaora/config.toml b/frameworks/Python/apidaora/config.toml deleted file mode 100644 index 6d9599d812d..00000000000 --- a/frameworks/Python/apidaora/config.toml +++ /dev/null @@ -1,36 +0,0 @@ -[framework] -name = "apidaora" - -[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 = "None" -webserver = "None" -versus = "None" - -[core] -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 = "None" -webserver = "None" -versus = "None" diff --git a/frameworks/Python/apidaora/coreapp.py b/frameworks/Python/apidaora/coreapp.py deleted file mode 100644 index e441532a5d1..00000000000 --- a/frameworks/Python/apidaora/coreapp.py +++ /dev/null @@ -1,143 +0,0 @@ -import asyncio -import asyncpg -import os -import jinja2 -import orjson -from logging import getLogger -from random import randint -from operator import itemgetter -from apidaora.asgi.app import asgi_app -from apidaora.asgi.responses import ( - JSON_RESPONSE, HTML_RESPONSE, PLAINTEXT_RESPONSE -) -from apidaora.asgi.router import Route, make_router -from apidaora.method import MethodType - - -logger = getLogger(__name__) - - -READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' -READ_ROW_SQL_TO_UPDATE = '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.'] - - -async def setup_database(): - global connection_pool - connection_pool = await asyncpg.create_pool( - user=os.getenv('PGUSER', 'benchmarkdbuser'), - password=os.getenv('PGPASS', 'benchmarkdbpass'), - database='hello_world', - host='tfb-database', - port=5432 - ) - - -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) - - -def get_num_queries(queries): - try: - query_count = int(queries[0]) - except (ValueError, TypeError): - return 1 - - if query_count < 1: - return 1 - if query_count > 500: - return 500 - return query_count - - -connection_pool = None -sort_fortunes_key = itemgetter(1) -template = load_fortunes_template() -loop = asyncio.get_event_loop() -loop.run_until_complete(setup_database()) - - -def json_serialization(request): - return JSON_RESPONSE, orjson.dumps({'message': 'Hello, world!'}) - - -async def single_database_query(request): - row_id = randint(1, 10000) - - async with connection_pool.acquire() as connection: - number = await connection.fetchval(READ_ROW_SQL, row_id) - - return JSON_RESPONSE, orjson.dumps( - {'id': row_id, 'randomNumber': number} - ) - - -async def multiple_database_queries(request): - num_queries = get_num_queries(request.query_dict.get('queries', 1)) - row_ids = [randint(1, 10000) for _ in range(num_queries)] - worlds = [] - - async with connection_pool.acquire() as connection: - statement = await connection.prepare(READ_ROW_SQL) - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append( - dict( - id=row_id, - randomNumber=number - ) - ) - - return JSON_RESPONSE, orjson.dumps(worlds) - - -async def fortunes(request): - async with connection_pool.acquire() as connection: - fortunes = await connection.fetch('SELECT * FROM Fortune') - - fortunes.append(ADDITIONAL_ROW) - fortunes.sort(key=sort_fortunes_key) - content = template.render(fortunes=fortunes).encode('utf-8') - return HTML_RESPONSE, content - - -async def database_updates(request): - worlds = [] - updates = set() - queries = request.query_dict.get('queries', 1) - - async with connection_pool.acquire() as connection: - statement = await connection.prepare(READ_ROW_SQL_TO_UPDATE) - - for _ in range(get_num_queries(queries)): - record = await statement.fetchrow(randint(1, 10000)) - world = dict( - id=record['id'], randomNumber=record['randomnumber'] - ) - world['randomNumber'] = randint(1, 10000) - worlds.append(world) - updates.add((world['id'], world['randomNumber'])) - - await connection.executemany(WRITE_ROW_SQL, updates) - - return JSON_RESPONSE, orjson.dumps(worlds) - - -def plaintext(request): - return PLAINTEXT_RESPONSE, b'Hello, world!' - - -routes = ( - Route('/json', MethodType.GET, json_serialization), - Route('/db', MethodType.GET, single_database_query), - Route('/queries', MethodType.GET, multiple_database_queries, has_query=True), - Route('/fortunes', MethodType.GET, fortunes), - Route('/updates', MethodType.GET, database_updates, has_query=True), - Route('/plaintext', MethodType.GET, plaintext), -) -router = make_router(routes) -app = asgi_app(router) diff --git a/frameworks/Python/apidaora/requirements.txt b/frameworks/Python/apidaora/requirements.txt deleted file mode 100644 index 532c2b27bdd..00000000000 --- a/frameworks/Python/apidaora/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -asyncpg==0.21.0 -gunicorn==23.0.0 -jinja2==3.1.6 -uvloop==0.14.0 -uvicorn==0.11.7 -apidaora==0.26.0 diff --git a/frameworks/Python/apidaora/templates/fortune.html b/frameworks/Python/apidaora/templates/fortune.html deleted file mode 100644 index 1c90834285d..00000000000 --- a/frameworks/Python/apidaora/templates/fortune.html +++ /dev/null @@ -1,10 +0,0 @@ - - -Fortunes - - - -{% for fortune in fortunes %} -{% endfor %}
      idmessage
      {{ fortune[0] }}{{ fortune[1]|e }}
      - - diff --git a/frameworks/Python/async-worker/Pipfile b/frameworks/Python/async-worker/Pipfile deleted file mode 100644 index 0cf91e337f9..00000000000 --- a/frameworks/Python/async-worker/Pipfile +++ /dev/null @@ -1,17 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -async-worker = "==0.19.1" -cchardet = "==2.1.7" - -[dev-packages] -black = "*" - -[requires] -python_version = "3.9" - -[pipenv] -allow_prereleases = true diff --git a/frameworks/Python/async-worker/Pipfile.lock b/frameworks/Python/async-worker/Pipfile.lock deleted file mode 100644 index 2ecfdb16067..00000000000 --- a/frameworks/Python/async-worker/Pipfile.lock +++ /dev/null @@ -1,440 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "872880755bbf439ce862323482273dd3539044167e90014909fbfe789adaa25a" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.9" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "aioamqp": { - "hashes": [ - "sha256:55fa703a70e71bc958ad546b9ee0c68387cab366c82fc44c0742d6ad0303745a", - "sha256:eef5c23a7fedee079d8326406f5c7a5725dfe36c359373da3499fffa16f79915" - ], - "version": "==0.14.0" - }, - "aiohttp": { - "hashes": [ - "sha256:119feb2bd551e58d83d1b38bfa4cb921af8ddedec9fad7183132db334c3133e0", - "sha256:16d0683ef8a6d803207f02b899c928223eb219111bd52420ef3d7a8aa76227b6", - "sha256:2eb3efe243e0f4ecbb654b08444ae6ffab37ac0ef8f69d3a2ffb958905379daf", - "sha256:2ffea7904e70350da429568113ae422c88d2234ae776519549513c8f217f58a9", - "sha256:40bd1b101b71a18a528ffce812cc14ff77d4a2a1272dfb8b11b200967489ef3e", - "sha256:418597633b5cd9639e514b1d748f358832c08cd5d9ef0870026535bd5eaefdd0", - "sha256:481d4b96969fbfdcc3ff35eea5305d8565a8300410d3d269ccac69e7256b1329", - "sha256:4c1bdbfdd231a20eee3e56bd0ac1cd88c4ff41b64ab679ed65b75c9c74b6c5c2", - "sha256:5563ad7fde451b1986d42b9bb9140e2599ecf4f8e42241f6da0d3d624b776f40", - "sha256:58c62152c4c8731a3152e7e650b29ace18304d086cb5552d317a54ff2749d32a", - "sha256:5b50e0b9460100fe05d7472264d1975f21ac007b35dcd6fd50279b72925a27f4", - "sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de", - "sha256:5dde6d24bacac480be03f4f864e9a67faac5032e28841b00533cd168ab39cad9", - "sha256:5e91e927003d1ed9283dee9abcb989334fc8e72cf89ebe94dc3e07e3ff0b11e9", - "sha256:62bc216eafac3204877241569209d9ba6226185aa6d561c19159f2e1cbb6abfb", - "sha256:6c8200abc9dc5f27203986100579fc19ccad7a832c07d2bc151ce4ff17190076", - "sha256:6ca56bdfaf825f4439e9e3673775e1032d8b6ea63b8953d3812c71bd6a8b81de", - "sha256:71680321a8a7176a58dfbc230789790639db78dad61a6e120b39f314f43f1907", - "sha256:7c7820099e8b3171e54e7eedc33e9450afe7cd08172632d32128bd527f8cb77d", - "sha256:7dbd087ff2f4046b9b37ba28ed73f15fd0bc9f4fdc8ef6781913da7f808d9536", - "sha256:822bd4fd21abaa7b28d65fc9871ecabaddc42767884a626317ef5b75c20e8a2d", - "sha256:8ec1a38074f68d66ccb467ed9a673a726bb397142c273f90d4ba954666e87d54", - "sha256:950b7ef08b2afdab2488ee2edaff92a03ca500a48f1e1aaa5900e73d6cf992bc", - "sha256:99c5a5bf7135607959441b7d720d96c8e5c46a1f96e9d6d4c9498be8d5f24212", - "sha256:b84ad94868e1e6a5e30d30ec419956042815dfaea1b1df1cef623e4564c374d9", - "sha256:bc3d14bf71a3fb94e5acf5bbf67331ab335467129af6416a437bd6024e4f743d", - "sha256:c2a80fd9a8d7e41b4e38ea9fe149deed0d6aaede255c497e66b8213274d6d61b", - "sha256:c44d3c82a933c6cbc21039326767e778eface44fca55c65719921c4b9661a3f7", - "sha256:cc31e906be1cc121ee201adbdf844522ea3349600dd0a40366611ca18cd40e81", - "sha256:d5d102e945ecca93bcd9801a7bb2fa703e37ad188a2f81b1e65e4abe4b51b00c", - "sha256:dd7936f2a6daa861143e376b3a1fb56e9b802f4980923594edd9ca5670974895", - "sha256:dee68ec462ff10c1d836c0ea2642116aba6151c6880b688e56b4c0246770f297", - "sha256:e76e78863a4eaec3aee5722d85d04dcbd9844bc6cd3bfa6aa880ff46ad16bfcb", - "sha256:eab51036cac2da8a50d7ff0ea30be47750547c9aa1aa2cf1a1b710a1827e7dbe", - "sha256:f4496d8d04da2e98cc9133e238ccebf6a13ef39a93da2e87146c8c8ac9768242", - "sha256:fbd3b5e18d34683decc00d9a360179ac1e7a320a5fee10ab8053ffd6deab76e0", - "sha256:feb24ff1226beeb056e247cf2e24bba5232519efb5645121c4aea5b6ad74c1f2" - ], - "markers": "python_version >= '3.6'", - "version": "==3.7.4" - }, - "aiologger": { - "hashes": [ - "sha256:5e1493a2c9819a5d751b9e775c79b9afe628387ee80a1d5e91ff719bb2f511b9" - ], - "version": "==0.5.0" - }, - "async-timeout": { - "hashes": [ - "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", - "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==3.0.1" - }, - "async-worker": { - "hashes": [ - "sha256:ca60175a50430fd06817163d7edb0d19d0978b54fc65d3df59af3663f2c05ba0" - ], - "index": "pypi", - "version": "==0.19.1" - }, - "attrs": { - "hashes": [ - "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", - "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==21.2.0" - }, - "cached-property": { - "hashes": [ - "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f", - "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504" - ], - "version": "==1.5.1" - }, - "cchardet": { - "hashes": [ - "sha256:0b859069bbb9d27c78a2c9eb997e6f4b738db2d7039a03f8792b4058d61d1109", - "sha256:228d2533987c450f39acf7548f474dd6814c446e9d6bd228e8f1d9a2d210f10b", - "sha256:2309ff8fc652b0fc3c0cff5dbb172530c7abb92fe9ba2417c9c0bcf688463c1c", - "sha256:24974b3e40fee9e7557bb352be625c39ec6f50bc2053f44a3d1191db70b51675", - "sha256:273699c4e5cd75377776501b72a7b291a988c6eec259c29505094553ee505597", - "sha256:27a9ba87c9f99e0618e1d3081189b1217a7d110e5c5597b0b7b7c3fedd1c340a", - "sha256:302aa443ae2526755d412c9631136bdcd1374acd08e34f527447f06f3c2ddb98", - "sha256:45456c59ec349b29628a3c6bfb86d818ec3a6fbb7eb72de4ff3bd4713681c0e3", - "sha256:48ba829badef61441e08805cfa474ccd2774be2ff44b34898f5854168c596d4d", - "sha256:50ad671e8d6c886496db62c3bd68b8d55060688c655873aa4ce25ca6105409a1", - "sha256:54341e7e1ba9dc0add4c9d23b48d3a94e2733065c13920e85895f944596f6150", - "sha256:54d0b26fd0cd4099f08fb9c167600f3e83619abefeaa68ad823cc8ac1f7bcc0c", - "sha256:5a25f9577e9bebe1a085eec2d6fdd72b7a9dd680811bba652ea6090fb2ff472f", - "sha256:6b6397d8a32b976a333bdae060febd39ad5479817fabf489e5596a588ad05133", - "sha256:70eeae8aaf61192e9b247cf28969faef00578becd2602526ecd8ae7600d25e0e", - "sha256:80e6faae75ecb9be04a7b258dc4750d459529debb6b8dee024745b7b5a949a34", - "sha256:90086e5645f8a1801350f4cc6cb5d5bf12d3fa943811bb08667744ec1ecc9ccd", - "sha256:a39526c1c526843965cec589a6f6b7c2ab07e3e56dc09a7f77a2be6a6afa4636", - "sha256:b154effa12886e9c18555dfc41a110f601f08d69a71809c8d908be4b1ab7314f", - "sha256:b59ddc615883835e03c26f81d5fc3671fab2d32035c87f50862de0da7d7db535", - "sha256:bd7f262f41fd9caf5a5f09207a55861a67af6ad5c66612043ed0f81c58cdf376", - "sha256:c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf", - "sha256:c6f70139aaf47ffb94d89db603af849b82efdf756f187cdd3e566e30976c519f", - "sha256:c96aee9ebd1147400e608a3eff97c44f49811f8904e5a43069d55603ac4d8c97", - "sha256:ec3eb5a9c475208cf52423524dcaf713c394393e18902e861f983c38eeb77f18", - "sha256:eee4f5403dc3a37a1ca9ab87db32b48dc7e190ef84601068f45397144427cc5e", - "sha256:f16517f3697569822c6d09671217fdeab61dfebc7acb5068634d6b0728b86c0b", - "sha256:f86e0566cb61dc4397297696a4a1b30f6391b50bc52b4f073507a48466b6255a", - "sha256:fdac1e4366d0579fff056d1280b8dc6348be964fda8ebb627c0269e097ab37fa" - ], - "index": "pypi", - "version": "==2.1.7" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "index": "pypi", - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "multidict": { - "hashes": [ - "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a", - "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93", - "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632", - "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656", - "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79", - "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7", - "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d", - "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5", - "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224", - "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26", - "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea", - "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348", - "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6", - "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76", - "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1", - "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f", - "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952", - "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a", - "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37", - "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9", - "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359", - "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8", - "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da", - "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3", - "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d", - "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf", - "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841", - "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d", - "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93", - "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f", - "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647", - "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635", - "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456", - "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda", - "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5", - "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281", - "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80" - ], - "markers": "python_version >= '3.6'", - "version": "==5.1.0" - }, - "pamqp": { - "hashes": [ - "sha256:2f81b5c186f668a67f165193925b6bfd83db4363a6222f599517f29ecee60b02", - "sha256:5cd0f5a85e89f20d5f8e19285a1507788031cfca4a9ea6f067e3cf18f5e294e8" - ], - "version": "==2.3.0" - }, - "prometheus-client": { - "hashes": [ - "sha256:71cd24a2b3eb335cb800c7159f423df1bd4dcd5171b234be15e3f31ec9f622da" - ], - "version": "==0.7.1" - }, - "pydantic": { - "hashes": [ - "sha256:0b71ca069c16470cb00be0acaf0657eb74cbc4ff5f11b42e79647f170956cda3", - "sha256:12ed0b175bba65e29dfc5859cd539d3512f58bb776bf620a3d3338501fd0f389", - "sha256:22fe5756c6c57279234e4c4027a3549507aca29e9ee832d6aa39c367cb43c99f", - "sha256:26821f61623b01d618bd8b3243f790ac8bd7ae31b388c0e41aa586002cf350eb", - "sha256:2bc9e9f5d91a29dec53346efc5c719d82297885d89c8a62b971492fba222c68d", - "sha256:42b8fb1e4e4783c4aa31df44b64714f96aa4deeacbacf3713a8a238ee7df3b2b", - "sha256:4a83d24bcf9ce8e6fa55c379bba1359461eedb85721bfb3151e240871e2b13a8", - "sha256:5759a4b276bda5ac2360f00e9b1e711aaac51fabd155b422d27f3339710f4264", - "sha256:77e04800d19acc2a8fbb95fe3d47ff397ce137aa5a2b32cc23a87bac70dda343", - "sha256:865410a6df71fb60294887770d19c67d499689f7ce64245182653952cdbd4183", - "sha256:91baec8ed771d4c53d71ef549d8e36b0f92a31c32296062d562d1d7074dd1d6e", - "sha256:999cc108933425752e45d1bf2f57d3cf091f2a5e8b9b8afab5b8872d2cc7645f", - "sha256:a0ff36e3f929d76b91d1624c6673dbdc1407358700d117bb7f29d5696c52d288", - "sha256:a989924324513215ad2b2cfd187426e6372f76f507b17361142c0b792294960c", - "sha256:ad2fae68e185cfae5b6d83e7915352ff0b6e5fa84d84bc6a94c3e2de58327114", - "sha256:b4e03c84f4e96e3880c9d34508cccbd0f0df6e7dc14b17f960ea8c71448823a3", - "sha256:c26d380af3e9a8eb9abe3b6337cea28f057b5425330817c918cf74d0a0a2303d", - "sha256:c8a3600435b83a4f28f5379f3bb574576521180f691828268268e9f172f1b1eb", - "sha256:ccc2ab0a240d01847f3d5f0f9e1582d450a2fc3389db33a7af8e7447b205a935", - "sha256:d361d181a3fb53ebfdc2fb1e3ca55a6b2ad717578a5e119c99641afd11b31a47", - "sha256:d5aeab86837f8799df0d84bec1190e6cc0062d5c5374636b5599234f2b39fe0a", - "sha256:edf37d30ea60179ef067add9772cf42299ea6cd490b3c94335a68f1021944ac4" - ], - "markers": "python_full_version >= '3.6.1'", - "version": "==1.8" - }, - "typing-extensions": { - "hashes": [ - "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", - "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", - "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" - ], - "version": "==3.10.0.0" - }, - "yarl": { - "hashes": [ - "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e", - "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434", - "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366", - "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3", - "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec", - "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959", - "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e", - "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c", - "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6", - "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a", - "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6", - "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424", - "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e", - "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f", - "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50", - "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2", - "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc", - "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4", - "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970", - "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10", - "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0", - "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406", - "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896", - "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643", - "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721", - "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478", - "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724", - "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e", - "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8", - "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96", - "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25", - "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76", - "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2", - "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2", - "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c", - "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", - "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" - ], - "markers": "python_version >= '3.6'", - "version": "==1.6.3" - } - }, - "develop": { - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, - "black": { - "hashes": [ - "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", - "markers": "python_version >= '3.8'", - "version": "==24.3.0" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "packaging": { - "hashes": [ - "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" - ], - "markers": "python_version >= '3.7'", - "version": "==24.0" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "platformdirs": { - "hashes": [ - "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.0" - }, - "regex": { - "hashes": [ - "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5", - "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79", - "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31", - "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500", - "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11", - "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14", - "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3", - "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439", - "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c", - "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82", - "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711", - "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093", - "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a", - "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb", - "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8", - "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17", - "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000", - "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d", - "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480", - "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc", - "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0", - "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9", - "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765", - "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e", - "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a", - "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07", - "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f", - "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac", - "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7", - "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed", - "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968", - "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7", - "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2", - "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4", - "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87", - "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8", - "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10", - "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29", - "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605", - "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6", - "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042" - ], - "version": "==2021.4.4" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "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" - } - } -} diff --git a/frameworks/Python/async-worker/README.md b/frameworks/Python/async-worker/README.md deleted file mode 100644 index fbdcb7e215a..00000000000 --- a/frameworks/Python/async-worker/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# [async-worker](https://github.com/async-worker/async-worker) Benchmark Test - -### Server -Server is exposed at `:8080` - -## Test URLs - -### Test 1: JSON Encoding - - http://localhost:8080/json - -### Test 6: Plaintext - - http://localhost:8080/plaintext diff --git a/frameworks/Python/async-worker/async-worker.dockerfile b/frameworks/Python/async-worker/async-worker.dockerfile deleted file mode 100644 index 2023fb97fb9..00000000000 --- a/frameworks/Python/async-worker/async-worker.dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM python:3.9-alpine - -LABEL description="Image used to run async-worker benchmark tests." -LABEL version='0.1' - -ENV ASYNCWORKER_HTTP_HOST=0.0.0.0 -ENV ASYNCWORKER_HTTP_PORT=8080 - -WORKDIR /app - -COPY /src /app -COPY Pipfile /app -COPY Pipfile.lock /app - -RUN apk add --virtual .deps gcc g++ make openssl-dev libxml2 libffi-dev && \ - pip install pipenv && \ - pipenv install --system --ignore-pipfile - -CMD ["python", "./hello_world.py"] diff --git a/frameworks/Python/async-worker/benchmark_config.json b/frameworks/Python/async-worker/benchmark_config.json deleted file mode 100644 index f27f1806581..00000000000 --- a/frameworks/Python/async-worker/benchmark_config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "framework": "async-worker", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "framework": "async-worker", - "language": "Python", - "flavor": "Python3", - "orm": "Raw", - "platform": "asyncio", - "os": "Linux", - "display_name": "async-worker", - "versus": "aiohttp" - } - }] -} diff --git a/frameworks/Python/async-worker/src/__init__.py b/frameworks/Python/async-worker/src/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/frameworks/Python/async-worker/src/hello_world.py b/frameworks/Python/async-worker/src/hello_world.py deleted file mode 100644 index ca785cd583b..00000000000 --- a/frameworks/Python/async-worker/src/hello_world.py +++ /dev/null @@ -1,18 +0,0 @@ -from aiohttp import web -from asyncworker import App - -app = App() - - -@app.http.get(["/plaintext"]) -async def handler(request: web.Request) -> web.Response: - return web.Response(body="Hello, World!") - - -@app.http.get(["/json"]) -async def handler(request: web.Request) -> web.Response: - return web.json_response({"message": "Hello, World!"}) - - -if __name__ == "__main__": - app.run() diff --git a/frameworks/Python/bareasgi/README.md b/frameworks/Python/bareasgi/README.md deleted file mode 100755 index de493eec242..00000000000 --- a/frameworks/Python/bareasgi/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# bareASGI Benchmark Test - -This is the bareASGI portion of a [benchmarking tests suite](../../) -comparing a variety of web development platforms. - -The information below is specific to bareASGI. 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 - -[bareASGI](https://github.com/rob-blackbourn/bareASGI) is a lightweight ASGI web server framework. - -## Test Paths & Sources - -All of the test implementations are located within a single file ([app.py](app.py)). - -## Resources - -* [bareASGI on GitHub](https://github.com/rob-blackbourn/bareASGI) -* [ASGI specification](https://asgi.readthedocs.io/en/latest/) diff --git a/frameworks/Python/bareasgi/app.py b/frameworks/Python/bareasgi/app.py deleted file mode 100644 index 794754dfaf0..00000000000 --- a/frameworks/Python/bareasgi/app.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python3 -from random import randint, sample -import os -import os.path -from typing import Any, Dict, List, Tuple -from urllib.parse import parse_qs - -import asyncpg -import jinja2 -import orjson - -from bareasgi import Application, HttpRequest, HttpResponse, LifespanRequest -from bareasgi_jinja2 import add_jinja2, Jinja2TemplateProvider - -GET_WORLD = "SELECT id, randomnumber FROM world WHERE id = $1" -UPDATE_WORLD = "UPDATE world SET randomNumber = $2 WHERE id = $1" -GET_FORTUNES = "SELECT * FROM fortune" -ADDITIONAL_ROW = (0, "Additional fortune added at request time.") - - -async def on_startup(_request: LifespanRequest) -> None: - app.info['db'] = await asyncpg.create_pool( - user=os.getenv("PGUSER", "benchmarkdbuser"), - password=os.getenv("PGPASS", "benchmarkdbpass"), - database="hello_world", - host="tfb-database", - port=5432, - ) - - -async def on_shutdown(_request: LifespanRequest) -> None: - await app.info['db'].close() - - -async def handle_json_request(_request: HttpRequest) -> HttpResponse: - return HttpResponse.from_json( - {"message": "Hello, World!"}, - encode_bytes=orjson.dumps - ) - - -async def handle_plaintext_request(_request: HttpRequest) -> HttpResponse: - return HttpResponse.from_text("Hello, World!") - - -async def handle_db_request(_request: HttpRequest) -> HttpResponse: - key = randint(1, 10000) - - async with app.info['db'].acquire() as conn: - number = await conn.fetchval(GET_WORLD, key) - - return HttpResponse.from_json( - {"id": key, "randomNumber": number}, - encode_bytes=orjson.dumps - ) - - -def get_query_count(request: HttpRequest): - try: - qs = parse_qs(request.scope["query_string"]) - num_queries = int(qs.get(b'queries', (1, ))[0]) - except ValueError: - num_queries = 1 - if num_queries < 1: - return 1 - if num_queries > 500: - return 500 - - return num_queries - - -async def handle_queries_request(request: HttpRequest) -> HttpResponse: - queries = get_query_count(request) - - worlds: List[Dict[str, Any]] = [] - async with app.info['db'].acquire() as conn: - pst = await conn.prepare(GET_WORLD) - for key in sample(range(1, 10000), queries): - number = await pst.fetchval(key) - worlds.append({"id": key, "randomNumber": number}) - - return HttpResponse.from_json( - worlds, - encode_bytes=orjson.dumps - ) - - -async def handle_updates_request(request: HttpRequest) -> HttpResponse: - queries = get_query_count(request) - updates = [(row_id, randint(1, 10000)) for row_id in sample(range(1, 10000), queries)] - updates.sort() - worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] - - async with app.info['db'].acquire() as connection: - statement = await connection.prepare(GET_WORLD) - for row_id, number in updates: - await statement.fetchval(row_id) - await connection.executemany(UPDATE_WORLD, updates) - - return HttpResponse.from_json( - worlds, - encode_bytes=orjson.dumps - ) - -async def handle_fortunes_request(request: HttpRequest) -> HttpResponse: - async with app.info['db'].acquire() as conn: - rows = await conn.fetch(GET_FORTUNES) - rows.append(ADDITIONAL_ROW) - rows.sort(key=lambda row: row[1]) - - return await Jinja2TemplateProvider.apply( - request, - "fortune.html", - { "fortunes": rows } - ) - -app = Application( - startup_handlers=[on_startup], - shutdown_handlers=[on_shutdown] -) - -here = os.path.abspath(os.path.dirname(__file__)) -env = jinja2.Environment( - loader=jinja2.FileSystemLoader(os.path.join(here, 'templates')), - autoescape=jinja2.select_autoescape(['html', 'xml']), - enable_async=True -) - -add_jinja2(app, env) - -app.http_router.add({"GET"}, "/json", handle_json_request) -app.http_router.add({"GET"}, "/plaintext", handle_plaintext_request) -app.http_router.add({"GET"}, "/db", handle_db_request) -app.http_router.add({"GET"}, "/queries", handle_queries_request) -app.http_router.add({"GET"}, "/updates", handle_updates_request) -app.http_router.add({"GET"}, "/fortunes", handle_fortunes_request) diff --git a/frameworks/Python/bareasgi/bareasgi.dockerfile b/frameworks/Python/bareasgi/bareasgi.dockerfile deleted file mode 100644 index 2306153b5c0..00000000000 --- a/frameworks/Python/bareasgi/bareasgi.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.10 - -ADD ./ /bareasgi - -WORKDIR /bareasgi - -RUN pip install -r /bareasgi/requirements.txt - -EXPOSE 8080 - -CMD hypercorn app:app --config=file:hypercorn_conf.py diff --git a/frameworks/Python/bareasgi/benchmark_config.json b/frameworks/Python/bareasgi/benchmark_config.json deleted file mode 100755 index cb1521cc63d..00000000000 --- a/frameworks/Python/bareasgi/benchmark_config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "framework": "bareasgi", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "fortune_url": "/fortunes", - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "bareasgi", - "language": "Python", - "flavor": "Python3", - "orm": "Raw", - "platform": "asyncio", - "webserver": "Hypercorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "bareASGI", - "notes": "", - "versus": "None" - } - } - ] -} diff --git a/frameworks/Python/bareasgi/config.toml b/frameworks/Python/bareasgi/config.toml deleted file mode 100644 index 4f803119e49..00000000000 --- a/frameworks/Python/bareasgi/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "bareasgi" - -[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 = "None" -webserver = "None" -versus = "None" diff --git a/frameworks/Python/bareasgi/hypercorn_conf.py b/frameworks/Python/bareasgi/hypercorn_conf.py deleted file mode 100644 index 79865d7583c..00000000000 --- a/frameworks/Python/bareasgi/hypercorn_conf.py +++ /dev/null @@ -1,13 +0,0 @@ -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"] -keep_alive_timeout = 120 -loglevel = "error" -worker_class = "uvloop" diff --git a/frameworks/Python/bareasgi/requirements.txt b/frameworks/Python/bareasgi/requirements.txt deleted file mode 100644 index 357e05a3d00..00000000000 --- a/frameworks/Python/bareasgi/requirements.txt +++ /dev/null @@ -1,17 +0,0 @@ -asyncpg==0.26.0 -bareasgi==4.3.0 -bareasgi-jinja2==4.0.1 -bareutils==4.0.2 -h11==0.16.0 -h2==4.1.0 -hpack==4.0.0 -hypercorn==0.14.3 -hyperframe==6.0.1 -jetblack-asgi-typing==0.4.0 -Jinja2==3.1.6 -MarkupSafe==2.1.1 -orjson==3.8.0 -priority==2.0.0 -toml==0.10.2 -uvloop==0.17.0 -wsproto==1.2.0 diff --git a/frameworks/Python/bareasgi/templates/fortune.html b/frameworks/Python/bareasgi/templates/fortune.html deleted file mode 100644 index 1c90834285d..00000000000 --- a/frameworks/Python/bareasgi/templates/fortune.html +++ /dev/null @@ -1,10 +0,0 @@ - - -Fortunes - - - -{% for fortune in fortunes %} -{% endfor %}
      idmessage
      {{ fortune[0] }}{{ fortune[1]|e }}
      - - diff --git a/frameworks/Python/japronto/README.md b/frameworks/Python/japronto/README.md deleted file mode 100644 index e8cc702fac1..00000000000 --- a/frameworks/Python/japronto/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Japronto Benchmark Test - -This is the Japronto portion of a [benchmarking tests suite](../../) -comparing a variety of web development platforms. - -The information below is specific to Japronto. 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 - -[Japronto](https://github.com/squeaky-pl/japronto) is a screaming-fast, scalable, -asynchronous Python 3.5+ HTTP toolkit. - -## 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/japronto/app.py b/frameworks/Python/japronto/app.py deleted file mode 100644 index 040de09a4be..00000000000 --- a/frameworks/Python/japronto/app.py +++ /dev/null @@ -1,78 +0,0 @@ -import os -import sys -import multiprocessing -from wsgiref.handlers import format_date_time -import japronto -import ujson as json -import random -import asyncio -import asyncpg - -db_pool = None - -async def db_setup(): - global db_pool - db_pool = await asyncpg.create_pool( - user = os.getenv('PGUSER', 'benchmarkdbuser'), - password = os.getenv('PGPASS', 'benchmarkdbpass'), - database = 'hello_world', - host = 'tfb-database', - port = 5432 - ) - -READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' - - -def get_headers(): - return { - 'Server': 'Japronto/0.1.2', - 'Date': format_date_time(None), - } - -# ----------------------------------------------------------------------------------- - -def json_view(request): - return request.Response( - text = json.dumps( {'message': 'Hello, world!'} ), - mime_type = 'application/json', - headers = get_headers(), - ) - - -def plaintext_view(request): - return request.Response( - body = b'Hello, world!', - mime_type = 'text/plain', - headers = get_headers(), - ) - - -async def db_view(request): - global db_pool - row_id = random.randint(1, 10000) - async with db_pool.acquire() as connection: - number = await connection.fetchval(READ_ROW_SQL, row_id) - - text = json.dumps( {'id': row_id, 'randomNumber': number} ) - return request.Response(text = text, mime_type = 'application/json', headers = get_headers()) - -# ----------------------------------------------------------------------------------- - -app = japronto.Application() -app.router.add_route('/json', json_view, 'GET') -app.router.add_route('/plaintext', plaintext_view, 'GET') -#app.router.add_route('/db', db_view, 'GET') - -#asyncio.set_event_loop(app.loop) -#app.loop.run_until_complete(db_setup()) - -# ----------------------------------------------------------------------------------- - -if __name__ == '__main__': - _is_travis = os.environ.get('TRAVIS') == 'true' - - workers = int( multiprocessing.cpu_count() ) - if _is_travis: - workers = 2 - - app.run('0.0.0.0', 8080, worker_num = workers) diff --git a/frameworks/Python/japronto/app_postgres.py b/frameworks/Python/japronto/app_postgres.py deleted file mode 100644 index d68a92f026c..00000000000 --- a/frameworks/Python/japronto/app_postgres.py +++ /dev/null @@ -1,51 +0,0 @@ -import multiprocessing -from wsgiref.handlers import format_date_time -import random - -import japronto -import ujson as json - -from db import init_db, close_db - - -def get_headers(): - return { - 'Server': 'Japronto/0.1.1', - 'Date': format_date_time(None), - } - - -def json_view(request): - return request.Response( - text=json.dumps({'message': 'Hello, world!'}), - mime_type='application/json', - headers=get_headers(), - ) - - -def plaintext_view(request): - return request.Response( - body=b'Hello, world!', - mime_type='text/plain', - headers=get_headers(), - ) - - -async def db_view(request): - async with app.db_pool.acquire() as conn: - world = await conn.fetchrow("select id,randomnumber from world where id=%s" % random.randint(1, 10000)) - return request.Response( - text=json.dumps(dict(world)), - mime_type='application/json', headers=get_headers()) - - -app = japronto.Application() -app.on_startup.append(init_db) -app.on_cleanup.append(close_db) -app.router.add_route('/json', json_view, 'GET') -app.router.add_route('/plaintext', plaintext_view, 'GET') -app.router.add_route('/db', db_view, 'GET') - - -if __name__ == '__main__': - app.run('0.0.0.0', 8080, worker_num=multiprocessing.cpu_count()) diff --git a/frameworks/Python/japronto/benchmark_config.json b/frameworks/Python/japronto/benchmark_config.json deleted file mode 100644 index 21bb719516d..00000000000 --- a/frameworks/Python/japronto/benchmark_config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "framework": "japronto", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "framework": "japronto", - "language": "Python", - "flavor": "Python3", - "platform": "None", - "webserver": "None", - "os": "Linux", - "orm": "Raw", - "database_os": "Linux", - "database": "None", - "display_name": "Japronto", - "notes": "" - } - }] -} diff --git a/frameworks/Python/japronto/config.toml b/frameworks/Python/japronto/config.toml deleted file mode 100644 index 8b5d2cbd9ad..00000000000 --- a/frameworks/Python/japronto/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -[framework] -name = "japronto" - -[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/japronto/db.py b/frameworks/Python/japronto/db.py deleted file mode 100644 index 2609377ff84..00000000000 --- a/frameworks/Python/japronto/db.py +++ /dev/null @@ -1,45 +0,0 @@ -import asyncio -from contextlib import asynccontextmanager -import asyncpg -import os - - -class Connection(asyncpg.Connection): - async def reset(self, *, timeout=None): - pass - - -class Pool: - def __init__(self, connect_url, max_size=10, connection_class=None): - self._connect_url = connect_url - self._connection_class = connection_class or Connection - self._queue = asyncio.LifoQueue(max_size) - - def __await__(self): - return self._async_init__().__await__() - - async def _async_init__(self): - for _ in range(self._queue.maxsize): - self._queue.put_nowait(await asyncpg.connect(self._connect_url, connection_class=self._connection_class)) - return self - - @asynccontextmanager - async def acquire(self): - conn = await self._queue.get() - try: - yield conn - finally: - self._queue.put_nowait(conn) - - async def close(self): - for _ in range(self._queue.maxsize): - conn = await self._queue.get() - await conn.close() - - -async def init_db(app): - app.db_pool = await Pool("postgresql://%s:%s@tfb-database:5432/hello_world" % (os.getenv("PGUSER", "benchmarkdbuser"), os.getenv("PSPASS", "benchmarkdbpass")), connection_class=asyncpg.Connection) - - -async def close_db(app): - await asyncio.wait_for(app.db_pool.close(), timeout=1) diff --git a/frameworks/Python/japronto/japronto-postgres.dockerfile b/frameworks/Python/japronto/japronto-postgres.dockerfile deleted file mode 100644 index d868e4b927c..00000000000 --- a/frameworks/Python/japronto/japronto-postgres.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.9.7 - -ADD ./ /japronto - -WORKDIR /japronto - -RUN pip3 install -r /japronto/requirements_postgres.txt - -EXPOSE 8080 - -CMD python3 app_postgres.py diff --git a/frameworks/Python/japronto/japronto.dockerfile b/frameworks/Python/japronto/japronto.dockerfile deleted file mode 100644 index eb91bb3dfa1..00000000000 --- a/frameworks/Python/japronto/japronto.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.8.12 - -ADD ./ /japronto - -WORKDIR /japronto - -RUN pip3 install -r /japronto/requirements.txt - -EXPOSE 8080 - -CMD python3 app.py diff --git a/frameworks/Python/japronto/requirements.txt b/frameworks/Python/japronto/requirements.txt deleted file mode 100644 index e3564875559..00000000000 --- a/frameworks/Python/japronto/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -uvloop==0.17.0 -git+https://github.com/squeaky-pl/japronto.git#egg=japronto -asyncpg==0.27.0 -ujson==5.4.0 diff --git a/frameworks/Python/japronto/requirements_postgres.txt b/frameworks/Python/japronto/requirements_postgres.txt deleted file mode 100644 index 9b268878800..00000000000 --- a/frameworks/Python/japronto/requirements_postgres.txt +++ /dev/null @@ -1,3 +0,0 @@ -git+https://github.com/IterableTrucks/japronto.git@0d848d96dd010f6701729b14e6b8ec0330002b5c -asyncpg==0.25.0 -ujson==5.4.0 diff --git a/frameworks/Python/routerling/README.md b/frameworks/Python/routerling/README.md deleted file mode 100755 index 2e4cb9faa5a..00000000000 --- a/frameworks/Python/routerling/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Routerling Benchmarking Test - -This is the Routerling portion of a [benchmarking tests suite](../../) -comparing a variety of web development platforms. - -The information below is specific to Routerling. 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 - -[Routerling](https://github.com/rayattack/pyrouterling) is a lightweight ASGI framework. - -## Test Paths & Sources - -All of the test implementations are located within a single file ([app.py](app.py)). - -## Resources - -* [Routerling on GitHub](https://github.com/rayattack/pyrouterling) -* [ASGI specification](https://asgi.readthedocs.io/en/latest/) diff --git a/frameworks/Python/routerling/app.py b/frameworks/Python/routerling/app.py deleted file mode 100644 index 291d5da2653..00000000000 --- a/frameworks/Python/routerling/app.py +++ /dev/null @@ -1,170 +0,0 @@ -import asyncio -import asyncpg -import jinja2 -import os -import ujson -from random import randint -from operator import itemgetter -from urllib.parse import parse_qs - -from routerling import Router - - -router = Router() - - -async def setup(): - global pool - pool = await asyncpg.create_pool( - user=os.getenv('PGUSER', 'benchmarkdbuser'), - password=os.getenv('PGPASS', 'benchmarkdbpass'), - database='hello_world', - host='tfb-database', - port=5432 - ) - - -CONTENT_TYPE = 'Content-Type' -JSON = 'application/json' - -READ_ROW_SQL = 'SELECT "randomnumber", "id" 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.'] - - -pool = None -key = itemgetter(1) -json_dumps = ujson.dumps -template = None -path = os.path.join('templates', 'fortune.html') -with open(path, 'r') as template_file: - template_text = template_file.read() - template = jinja2.Template(template_text) - -loop = asyncio.get_event_loop() -loop.run_until_complete(setup()) - - -def get_num_queries(scope): - try: - query_string = scope['query_string'] - query_count = int(parse_qs(query_string)[b'queries'][0]) - except (KeyError, IndexError, ValueError): - return 1 - - if query_count < 1: - return 1 - if query_count > 500: - return 500 - return query_count - - -async def json_serialization(r, w, c): - """ - Test type 1: JSON Serialization - """ - content = json_dumps({'message': 'Hello, world!'}) - w.headers = CONTENT_TYPE, JSON - w.body = content - - -async def single_database_query(r, w, c): - """ - Test type 2: Single database object - """ - row_id = randint(1, 10000) - connection = await pool.acquire() - try: - number = await connection.fetchval(READ_ROW_SQL, row_id) - world = {'id': row_id, 'randomNumber': number} - finally: - await pool.release(connection) - - content = json_dumps(world).encode('utf-8') - w.headers = CONTENT_TYPE, JSON - w.body = content - - -async def multiple_database_queries(r, w, c): - """ - Test type 3: Multiple database queries - """ - num_queries = get_num_queries(r._scope) - row_ids = [randint(1, 10000) for _ in range(num_queries)] - worlds = [] - - connection = await pool.acquire() - try: - statement = await connection.prepare(READ_ROW_SQL) - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append({'id': row_id, 'randomNumber': number}) - finally: - await pool.release(connection) - - content = json_dumps(worlds).encode('utf-8') - w.headers = CONTENT_TYPE, JSON - w.body = content - - -async def fortunes(r, w, c): - """ - Test type 4: Fortunes - """ - connection = await pool.acquire() - try: - fortunes = await connection.fetch('SELECT * FROM Fortune') - finally: - await pool.release(connection) - - fortunes.append(ADDITIONAL_ROW) - fortunes.sort(key=key) - content = template.render(fortunes=fortunes).encode('utf-8') - w.headers = CONTENT_TYPE, 'text/html; charset=utf-8' - w.body = content - - -async def database_updates(r, w, c): - """ - Test type 5: Database updates - """ - num_queries = get_num_queries(r._scope) - updates = [(randint(1, 10000), randint(1, 10000)) for _ in range(num_queries)] - worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] - - connection = await pool.acquire() - try: - statement = await connection.prepare(READ_ROW_SQL) - for row_id, _ in updates: - await statement.fetchval(row_id) - await connection.executemany(WRITE_ROW_SQL, updates) - finally: - await pool.release(connection) - - content = json_dumps(worlds).encode('utf-8') - w.headers = CONTENT_TYPE, JSON - w.body = content - - -async def plaintext(r, w, c): - """ - Test type 6: Plaintext - """ - content = 'Hello, world!' - w.headers = CONTENT_TYPE, 'text/plain; charset=utf-8' - w.body = content - - -async def handle_404(r, w, c): - content = b'Not found' - w.headers = CONTENT_TYPE, b'text/plain; charset=utf-8' - w.body = content - - - -router.HTTP('/json', json_serialization) -router.HTTP('/db', single_database_query) -router.HTTP('/queries', multiple_database_queries) -router.HTTP('/fortunes', fortunes) -router.HTTP('/updates', database_updates) -router.HTTP('/plaintext', plaintext) diff --git a/frameworks/Python/routerling/benchmark_config.json b/frameworks/Python/routerling/benchmark_config.json deleted file mode 100755 index 7ec9ca2895e..00000000000 --- a/frameworks/Python/routerling/benchmark_config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "framework": "routerling", - "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": "Platform", - "framework": "uvicorn", - "language": "Python", - "flavor": "Python3", - "platform": "None", - "webserver": "None", - "os": "Linux", - "orm": "Raw", - "database_os": "Linux", - "database": "Postgres", - "display_name": "routerling", - "notes": "" - } - }] -} diff --git a/frameworks/Python/routerling/config.toml b/frameworks/Python/routerling/config.toml deleted file mode 100644 index daf63bdbf08..00000000000 --- a/frameworks/Python/routerling/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "routerling" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries?queries=" -urls.update = "/updates?queries=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "None" \ No newline at end of file diff --git a/frameworks/Python/routerling/requirements.txt b/frameworks/Python/routerling/requirements.txt deleted file mode 100644 index 9653371b503..00000000000 --- a/frameworks/Python/routerling/requirements.txt +++ /dev/null @@ -1,11 +0,0 @@ -asgiref==3.4.1 -asyncpg==0.24.0 -click==8.0.1 -gunicorn==22.0.0 -h11==0.16.0 -Jinja2==3.1.4 -MarkupSafe==2.0.1 -routerling==0.3.1 -ujson==5.4.0 -uvloop==0.16.0 -uvicorn==0.14.0 diff --git a/frameworks/Python/routerling/routerling.dockerfile b/frameworks/Python/routerling/routerling.dockerfile deleted file mode 100644 index e46173e71e9..00000000000 --- a/frameworks/Python/routerling/routerling.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM python:3.8 - -WORKDIR /routerling - -RUN pip3 install cython==0.29.13 - -ADD requirements.txt /routerling/ - -RUN pip3 install -r /routerling/requirements.txt - -ADD templates/fortune.html /routerling/templates/ - -ADD settings.py app.py /routerling/ - -EXPOSE 8080 - -CMD gunicorn app:router -k uvicorn.workers.UvicornWorker -c settings.py \ No newline at end of file diff --git a/frameworks/Python/routerling/settings.py b/frameworks/Python/routerling/settings.py deleted file mode 100644 index 295745226cd..00000000000 --- a/frameworks/Python/routerling/settings.py +++ /dev/null @@ -1,14 +0,0 @@ -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/routerling.pid' -loglevel = 'error' diff --git a/frameworks/Python/routerling/templates/fortune.html b/frameworks/Python/routerling/templates/fortune.html deleted file mode 100644 index 244205144fd..00000000000 --- a/frameworks/Python/routerling/templates/fortune.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - Fortunes - - - - - - - {% for fortune in fortunes %} - - - - {% endfor %} -
      idmessage
      {{ fortune[0] }}{{ fortune[1]|e }}
      - - \ No newline at end of file From 02db245aee6f080b59308c9a4507b73de628442d Mon Sep 17 00:00:00 2001 From: Sebastian Kreft Date: Tue, 20 May 2025 13:55:21 -0400 Subject: [PATCH 1451/1766] chore: improve uvicorn settings (#9900) In this PR we disable the access log and the `ProxyHeaderMiddleware` (https://www.uvicorn.org/deployment/?h=proxyheaders#proxies-and-forwarded-headers). Disable logging is recommended in point 3 of the General Test Requirements (https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#general-test-requirements) and has been done for other python tests like in https://github.com/TechEmpower/FrameworkBenchmarks/pull/9844/files. The ProxyHeadersMiddleware is enabled by default (trusting localhost) and adds considerable latency. As such it should be disabled if not required by test requirements. Enabling these flags increases performance (req/s) by 85% as seen in the numbers below ``` -- Before wrk http://localhost:8000/async Running 10s test @ http://localhost:8000/async 2 threads and 10 connections Thread Stats Avg Stdev Max +/- Stdev Latency 268.56us 36.54us 3.49ms 96.57% Req/Sec 18.34k 408.35 18.84k 91.58% 368739 requests in 10.10s, 49.23MB read Requests/sec: 36508.05 Transfer/sec: 4.87MB -- After wrk http://localhost:8000/async Running 10s test @ http://localhost:8000/async 2 threads and 10 connections Thread Stats Avg Stdev Max +/- Stdev Latency 143.21us 46.20us 2.00ms 98.02% Req/Sec 33.97k 1.16k 36.29k 82.67% 682461 requests in 10.10s, 91.12MB read Requests/sec: 67570.84 Transfer/sec: 9.02MB ``` Co-authored-by: Sebastian Kreft <911768+sk-@users.noreply.github.com> --- frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile | 2 +- frameworks/Python/fastapi/fastapi-uvicorn.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile b/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile index 35e6b7d0030..59a6e040cd0 100644 --- a/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile +++ b/frameworks/Python/fastapi/fastapi-uvicorn-orjson.dockerfile @@ -15,4 +15,4 @@ COPY . ./ EXPOSE 8080 -CMD uvicorn app:app --host 0.0.0.0 --port 8080 --workers $(nproc) --log-level error +CMD uvicorn app:app --host 0.0.0.0 --port 8080 --workers $(nproc) --log-level error --no-access-log --no-proxy-headers diff --git a/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile b/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile index 7da0ea40ce3..115104e3e49 100644 --- a/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile +++ b/frameworks/Python/fastapi/fastapi-uvicorn.dockerfile @@ -15,4 +15,4 @@ COPY . ./ EXPOSE 8080 -CMD uvicorn app:app --host 0.0.0.0 --port 8080 --workers $(nproc) --log-level error +CMD uvicorn app:app --host 0.0.0.0 --port 8080 --workers $(nproc) --log-level error --no-access-log --no-proxy-headers From 52351a68fdc738694157108878bf10e3c1242917 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Tue, 20 May 2025 19:08:53 +0100 Subject: [PATCH 1452/1766] Aiohttp: Add pypy3 and minor optimisation (#9903) * Aiohttp: minor optimisation * Create aiohttp-pypy.dockerfile * Update benchmark_config.json * Update config.toml * Update aiohttp-pypy.dockerfile * Update aiohttp-gunicorn.dockerfile * Update aiohttp-nginx.dockerfile * Update aiohttp-orm.dockerfile * Update aiohttp.dockerfile * Update requirements.txt * Create requirements-cpython.txt * Update aiohttp-gunicorn.dockerfile * Update aiohttp-nginx.dockerfile * Update aiohttp-orm.dockerfile * Update aiohttp.dockerfile * Update views.py * Update aiohttp-nginx.dockerfile * Update aiohttp-orm.dockerfile * Update aiohttp-pypy.dockerfile * Update aiohttp.dockerfile * Update requirements.txt * Update requirements-cpython.txt * Update app.py * Update config.toml * Update main.py * Update requirements.txt * Update requirements-cpython.txt * Update main.py * Update server.py * Update benchmark_config.json * Update aiohttp-gunicorn.dockerfile * Update aiohttp-nginx.dockerfile * Update aiohttp-orm.dockerfile * Update aiohttp-pypy.dockerfile * Update aiohttp.dockerfile * Update requirements-cpython.txt * Update aiohttp-gunicorn.dockerfile * Update aiohttp-nginx.dockerfile * Update aiohttp-orm.dockerfile * Update aiohttp-pypy.dockerfile * Update aiohttp.dockerfile * Update aiohttp-pypy.dockerfile --- .../aiohttp/aiohttp-gunicorn.dockerfile | 5 ++-- .../Python/aiohttp/aiohttp-nginx.dockerfile | 9 +++---- .../Python/aiohttp/aiohttp-orm.dockerfile | 9 +++---- .../Python/aiohttp/aiohttp-pypy.dockerfile | 13 ++++++++++ frameworks/Python/aiohttp/aiohttp.dockerfile | 9 +++---- frameworks/Python/aiohttp/app/app.py | 10 +++++--- frameworks/Python/aiohttp/app/main.py | 22 ++++++++++------- frameworks/Python/aiohttp/app/server.py | 12 ++++++---- frameworks/Python/aiohttp/app/views.py | 24 +++++++++++-------- .../Python/aiohttp/benchmark_config.json | 22 ++++++++++++++++- frameworks/Python/aiohttp/config.toml | 13 ++++++++++ .../Python/aiohttp/requirements-cpython.txt | 6 +++++ frameworks/Python/aiohttp/requirements.txt | 3 --- 13 files changed, 106 insertions(+), 51 deletions(-) create mode 100644 frameworks/Python/aiohttp/aiohttp-pypy.dockerfile create mode 100644 frameworks/Python/aiohttp/requirements-cpython.txt diff --git a/frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile b/frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile index 6fb96c40f5a..71c8048b2af 100644 --- a/frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile @@ -4,11 +4,10 @@ ADD ./ /aiohttp WORKDIR aiohttp -RUN pip3 install cython==3.0.11 gunicorn==23.0.0 && \ - pip3 install -r /aiohttp/requirements.txt +RUN pip3 install -r /aiohttp/requirements-cpython.txt ENV CONNECTION=RAW EXPOSE 8080 -CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py \ No newline at end of file +CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py diff --git a/frameworks/Python/aiohttp/aiohttp-nginx.dockerfile b/frameworks/Python/aiohttp/aiohttp-nginx.dockerfile index 9739a8e83bd..2c96a25f9b9 100644 --- a/frameworks/Python/aiohttp/aiohttp-nginx.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp-nginx.dockerfile @@ -1,20 +1,17 @@ FROM python:3.13 -ADD ./requirements.txt /aiohttp/requirements.txt - -RUN pip3 install cython==3.0.11 && \ - pip3 install -r /aiohttp/requirements.txt - RUN apt-get update && apt-get install -y nginx ADD ./ /aiohttp WORKDIR /aiohttp +RUN pip3 install -r /aiohttp/requirements-cpython.txt + ENV CONNECTION=RAW EXPOSE 8080 RUN chmod +x /aiohttp/nginx-entrypoint.sh -ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"] \ No newline at end of file +ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"] diff --git a/frameworks/Python/aiohttp/aiohttp-orm.dockerfile b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile index c113afcd7d5..c63f3e1689e 100644 --- a/frameworks/Python/aiohttp/aiohttp-orm.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp-orm.dockerfile @@ -1,16 +1,13 @@ FROM python:3.13 -ADD ./requirements.txt /aiohttp/requirements.txt - -RUN pip3 install cython==3.0.11 && \ - pip3 install -r /aiohttp/requirements.txt - ADD ./ /aiohttp WORKDIR /aiohttp +RUN pip3 install -r /aiohttp/requirements-cpython.txt + ENV CONNECTION=ORM EXPOSE 8080 -CMD python3 -O -m app.server \ No newline at end of file +CMD python3 -O -m app.server diff --git a/frameworks/Python/aiohttp/aiohttp-pypy.dockerfile b/frameworks/Python/aiohttp/aiohttp-pypy.dockerfile new file mode 100644 index 00000000000..bc7770b7e7d --- /dev/null +++ b/frameworks/Python/aiohttp/aiohttp-pypy.dockerfile @@ -0,0 +1,13 @@ +FROM pypy:3.11 + +ADD ./ /aiohttp + +WORKDIR /aiohttp + +RUN pip3 install -r /aiohttp/requirements.txt + +ENV CONNECTION=RAW + +EXPOSE 8080 + +CMD python3 -O -m app.server diff --git a/frameworks/Python/aiohttp/aiohttp.dockerfile b/frameworks/Python/aiohttp/aiohttp.dockerfile index a9ecfff8c07..3edfb605a1c 100644 --- a/frameworks/Python/aiohttp/aiohttp.dockerfile +++ b/frameworks/Python/aiohttp/aiohttp.dockerfile @@ -1,16 +1,13 @@ FROM python:3.13 -ADD ./requirements.txt /aiohttp/requirements.txt - -RUN pip3 install cython==3.0.11 && \ - pip3 install -r /aiohttp/requirements.txt - ADD ./ /aiohttp WORKDIR /aiohttp +RUN pip3 install -r /aiohttp/requirements-cpython.txt + ENV CONNECTION=RAW EXPOSE 8080 -CMD python3 -O -m app.server \ No newline at end of file +CMD python3 -O -m app.server diff --git a/frameworks/Python/aiohttp/app/app.py b/frameworks/Python/aiohttp/app/app.py index ae8b74c1414..40d33382e10 100644 --- a/frameworks/Python/aiohttp/app/app.py +++ b/frameworks/Python/aiohttp/app/app.py @@ -1,11 +1,15 @@ -import uvloop -from aiohttp import web import argparse +import platform + +from aiohttp import web + from .main import create_app if __name__ == '__main__': - uvloop.install() + if platform.python_implementation() != "PyPy": + import uvloop + uvloop.install() parser = argparse.ArgumentParser() parser.add_argument('--socket', type=str, required=True) args = parser.parse_args() diff --git a/frameworks/Python/aiohttp/app/main.py b/frameworks/Python/aiohttp/app/main.py index ef2b2fd4f8b..f334f2ca8a2 100644 --- a/frameworks/Python/aiohttp/app/main.py +++ b/frameworks/Python/aiohttp/app/main.py @@ -1,7 +1,7 @@ -import os import multiprocessing +import os +import platform -import asyncpg from aiohttp import web from sqlalchemy.engine.url import URL from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine @@ -20,6 +20,15 @@ updates_raw, ) +if platform.python_implementation() != "PyPy": + import asyncpg + + class NoResetConnection(asyncpg.Connection): + __slots__ = () + + def get_reset_query(self): + return "" + CONNECTION_ORM = os.getenv('CONNECTION', 'ORM').upper() == 'ORM' @@ -37,12 +46,6 @@ def pg_dsn(dialect=None) -> str: ) return url.render_as_string(hide_password=False) -class NoResetConnection(asyncpg.Connection): - __slots__ = () - - def get_reset_query(self): - return '' - async def db_ctx(app: web.Application): # number of gunicorn workers = multiprocessing.cpu_count() as per gunicorn_conf.py # max_connections = 2000 as per toolset/setup/linux/databases/postgresql/postgresql.conf:64 @@ -84,6 +87,7 @@ def setup_routes(app): def create_app(): app = web.Application() - app.cleanup_ctx.append(db_ctx) + if platform.python_implementation() != "PyPy": + app.cleanup_ctx.append(db_ctx) setup_routes(app) return app diff --git a/frameworks/Python/aiohttp/app/server.py b/frameworks/Python/aiohttp/app/server.py index d28000daaee..c1f48b3d4be 100644 --- a/frameworks/Python/aiohttp/app/server.py +++ b/frameworks/Python/aiohttp/app/server.py @@ -1,9 +1,11 @@ +import multiprocessing import os +import platform import socket -import multiprocessing + from aiohttp import web + from .main import create_app -import uvloop SERVERS_COUNT = multiprocessing.cpu_count() BACKLOG = 2048 @@ -12,7 +14,9 @@ def start_server(sock, cpu_id): if hasattr(os, "sched_setaffinity"): os.sched_setaffinity(0, {cpu_id}) - uvloop.install() + if platform.python_implementation() != "PyPy": + import uvloop + uvloop.install() app = create_app() web.run_app(app, sock=sock, backlog=BACKLOG, access_log=None) @@ -43,4 +47,4 @@ def create_reusable_socket(host='0.0.0.0', port=8080): workers.append(worker) for worker in workers: - worker.join() \ No newline at end of file + worker.join() diff --git a/frameworks/Python/aiohttp/app/views.py b/frameworks/Python/aiohttp/app/views.py index c743cc47054..e52d4255744 100644 --- a/frameworks/Python/aiohttp/app/views.py +++ b/frameworks/Python/aiohttp/app/views.py @@ -1,15 +1,26 @@ +import platform from operator import attrgetter, itemgetter from pathlib import Path from random import randint, sample import jinja2 from aiohttp.web import Response -from orjson import dumps from sqlalchemy import bindparam, select from sqlalchemy.orm.attributes import flag_modified from .models import Fortune, World +if platform.python_implementation() == "PyPy": + from aiohttp.web import json_response +else: + from orjson import dumps + + def json_response(payload): + return Response( + body=dumps(payload), + content_type="application/json", + ) + ADDITIONAL_FORTUNE_ORM = Fortune(id=0, message='Additional fortune added at request time.') ADDITIONAL_FORTUNE_ROW = {'id': 0, 'message': 'Additional fortune added at request time.'} READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' @@ -25,8 +36,8 @@ def get_num_queries(request): try: - num_queries = int(request.match_info.get('queries', 1)) - except ValueError: + num_queries = int(request.match_info['queries']) + except (KeyError, ValueError): return 1 if num_queries < 1: return 1 @@ -35,13 +46,6 @@ def get_num_queries(request): return num_queries -def json_response(payload): - return Response( - body=dumps(payload), - content_type="application/json", - ) - - async def json(request): """ Test 1 diff --git a/frameworks/Python/aiohttp/benchmark_config.json b/frameworks/Python/aiohttp/benchmark_config.json index 366ff434220..487ab2fc7cc 100644 --- a/frameworks/Python/aiohttp/benchmark_config.json +++ b/frameworks/Python/aiohttp/benchmark_config.json @@ -23,6 +23,25 @@ "display_name": "aiohttp", "notes": "uses asyncpg for database access" }, + "pypy": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "aiohttp", + "language": "Python", + "flavor": "Pypy3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "aiohttp-pypy", + "notes": "uses Pypy instead of CPython", + "versus": "default" + }, "nginx": { "json_url": "/json", "db_url": "/db", @@ -43,7 +62,8 @@ "os": "Linux", "database_os": "Linux", "display_name": "aiohttp-nginx", - "notes": "uses nginx as proxy" + "notes": "uses nginx as proxy", + "versus": "default" }, "gunicorn": { "json_url": "/json", diff --git a/frameworks/Python/aiohttp/config.toml b/frameworks/Python/aiohttp/config.toml index 195a408ba2e..47a6c33bb28 100644 --- a/frameworks/Python/aiohttp/config.toml +++ b/frameworks/Python/aiohttp/config.toml @@ -18,6 +18,19 @@ platform = "asyncio" webserver = "None" versus = "None" +[pypy] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "asyncio" +webserver = "None" +versus = "default" + [nginx] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/Python/aiohttp/requirements-cpython.txt b/frameworks/Python/aiohttp/requirements-cpython.txt new file mode 100644 index 00000000000..f49e01d17d2 --- /dev/null +++ b/frameworks/Python/aiohttp/requirements-cpython.txt @@ -0,0 +1,6 @@ +-r requirements.txt + +asyncpg==0.30.0 +gunicorn==23.0.0 +orjson==3.10.16 +uvloop==0.21.0 diff --git a/frameworks/Python/aiohttp/requirements.txt b/frameworks/Python/aiohttp/requirements.txt index 7729cae3c1d..0142f9212d2 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,6 +1,3 @@ aiohttp==3.11.18 -asyncpg==0.30.0 jinja2==3.1.6 SQLAlchemy==2.0.40 -orjson==3.10.16 -uvloop==0.21.0 From 6cbf7d254839f5c1171e6145bbc0be396b89e45b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 10:46:57 -0700 Subject: [PATCH 1453/1766] Bump jinja2 from 3.1.4 to 3.1.6 in /frameworks/Python/flask (#9906) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [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.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 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 bbd623a8f9d..a9a51e871b3 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.1.4 +Jinja2==3.1.6 MarkupSafe==2.1.2 ujson==5.4.0 orjson==3.8.7; implementation_name=='cpython' From 0737238566e0f6f2d86edfba7de5cb995f457a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Thu, 22 May 2025 01:48:01 +0800 Subject: [PATCH 1454/1766] Upgrade hyperlane (#9908) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/src/db.rs | 2 +- frameworks/Rust/hyperlane/src/lazy.rs | 2 +- frameworks/Rust/hyperlane/src/request_middleware.rs | 2 +- frameworks/Rust/hyperlane/src/route.rs | 2 +- frameworks/Rust/hyperlane/src/server.rs | 4 ++-- frameworks/Rust/hyperlane/src/type.rs | 2 +- frameworks/Rust/hyperlane/src/utils.rs | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 435ad3f9c79..eb7c57b779e 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -1,4 +1,4 @@ -use crate::*; +use super::*; pub fn get_db_connection() -> &'static DbPoolConnection { &DB diff --git a/frameworks/Rust/hyperlane/src/lazy.rs b/frameworks/Rust/hyperlane/src/lazy.rs index a792c04b13b..e50d528ce7a 100644 --- a/frameworks/Rust/hyperlane/src/lazy.rs +++ b/frameworks/Rust/hyperlane/src/lazy.rs @@ -1,4 +1,4 @@ -use crate::*; +use super::*; pub static DB: Lazy = Lazy::new(|| block_on(async { connection_db().await })); pub static CACHE: Lazy> = Lazy::new(|| block_on(async { init_cache().await })); diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 7e7eb1cd7c1..ff75877b318 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -1,4 +1,4 @@ -use crate::*; +use super::*; pub async fn request(ctx: Context) { ctx.set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 74f346b9ea7..46442ce2137 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -1,4 +1,4 @@ -use crate::*; +use super::*; pub async fn json(ctx: Context) { let json: Value = json!({ diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 49ce05c7398..f7f50162226 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -1,11 +1,11 @@ -use crate::*; +use super::*; fn runtime() -> Runtime { Builder::new_multi_thread() .worker_threads(get_thread_count()) .thread_stack_size(1_048_576) .max_blocking_threads(1_024_000) - .max_io_events_per_tick(1024000) + .max_io_events_per_tick(1_024_000) .enable_all() .build() .unwrap() diff --git a/frameworks/Rust/hyperlane/src/type.rs b/frameworks/Rust/hyperlane/src/type.rs index b5e47ecd6cd..0e23804c3d7 100644 --- a/frameworks/Rust/hyperlane/src/type.rs +++ b/frameworks/Rust/hyperlane/src/type.rs @@ -1,4 +1,4 @@ -use crate::*; +use super::*; pub type DbPoolConnection = Pool; pub type Queries = i32; diff --git a/frameworks/Rust/hyperlane/src/utils.rs b/frameworks/Rust/hyperlane/src/utils.rs index 2f67531f50e..5b22bbb8447 100644 --- a/frameworks/Rust/hyperlane/src/utils.rs +++ b/frameworks/Rust/hyperlane/src/utils.rs @@ -1,4 +1,4 @@ -use crate::*; +use super::*; pub fn escape_html(input: &str) -> String { let mut result: String = String::new(); From ba6b17c50926ae1192e8d9f35bf012f07dacb1c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 20:11:30 +0000 Subject: [PATCH 1455/1766] Bump github.com/gofiber/fiber/v2 in /frameworks/Go/fiber/src Bumps [github.com/gofiber/fiber/v2](https://github.com/gofiber/fiber) from 2.52.6 to 2.52.7. - [Release notes](https://github.com/gofiber/fiber/releases) - [Commits](https://github.com/gofiber/fiber/compare/v2.52.6...v2.52.7) --- updated-dependencies: - dependency-name: github.com/gofiber/fiber/v2 dependency-version: 2.52.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/fiber/src/go.mod | 2 +- frameworks/Go/fiber/src/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index 78edf82d7fd..a6a9313e5a8 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -6,7 +6,7 @@ toolchain go1.24.1 require ( github.com/goccy/go-json v0.10.5 - github.com/gofiber/fiber/v2 v2.52.6 + github.com/gofiber/fiber/v2 v2.52.7 github.com/jackc/pgx/v5 v5.7.4 github.com/valyala/quicktemplate v1.8.0 ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index e2f76bc1971..0748f8152d9 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -5,8 +5,8 @@ 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/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= -github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/fiber/v2 v2.52.7 h1:6xJpE4sSqErvMiEZo9ZpJLRSVcpkNBvioeqAHKwhTZY= +github.com/gofiber/fiber/v2 v2.52.7/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= From 780ba6d1db2f06a972a0e25d5aba399fc6535a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Sat, 24 May 2025 01:48:56 +0800 Subject: [PATCH 1456/1766] Upgrade hyperlane (#9909) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 78 ++++++++++++++++++++-------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 3a4763d5e75..747c03a3223 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -289,7 +289,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -462,7 +462,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -636,9 +636,9 @@ checksum = "1808d8983c7ca1d289188767327a24d3e6c0c6a741257745fd7fea9f8f7a7635" [[package]] name = "http-type" -version = "3.69.3" +version = "3.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e242a3c26c3365128c36a3cc803a4d3299cdf466dff723acbdee7a3911d045" +checksum = "e60444695a64e58b81fba58839c080906cd056c5564b463894434a4d5dba4cd3" dependencies = [ "ahash", "dashmap", @@ -663,21 +663,33 @@ dependencies = [ [[package]] name = "hyperlane" -version = "4.99.2" +version = "4.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee442e23cfd5aa7a08992fdb58e4ae18281bae51a5ee6907e7cd5344f758a81b" +checksum = "a93bfea0d900c45673c134c9f76c540dbe76d675e44dd516a121041b4b6b0acc" dependencies = [ "clonelicious", "color-output", "file-operation", "future-fn", "http-type", + "hyperlane-broadcast", "hyperlane-log", "recoverable-spawn", "recoverable-thread-pool", "server-manager", ] +[[package]] +name = "hyperlane-broadcast" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77cd3b98eecd545e1acbe203b9d0fbad46e7d9034033c5e3afa07fff9dbcb3e6" +dependencies = [ + "dashmap", + "lombok", + "tokio", +] + [[package]] name = "hyperlane-log" version = "1.16.6" @@ -892,6 +904,17 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "lombok" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fd3ecc97c69dd7420e63ddc37457e143cff962c7301de78e4a6ec62d45abdf7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "lombok-macros" version = "1.11.3" @@ -900,7 +923,7 @@ checksum = "89a6c00f977434776490d523145f6de60b6b7d9ce1096c011449484c80100a40" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1242,7 +1265,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1312,7 +1335,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1514,7 +1537,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn", + "syn 2.0.101", ] [[package]] @@ -1537,7 +1560,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn", + "syn 2.0.101", "tokio", "url", ] @@ -1674,6 +1697,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.101" @@ -1693,7 +1727,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1722,7 +1756,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1733,7 +1767,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1787,7 +1821,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1821,7 +1855,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1964,7 +1998,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -1986,7 +2020,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2199,7 +2233,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] @@ -2220,7 +2254,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2240,7 +2274,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] @@ -2280,5 +2314,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 6aa15d13e04..7221a94d21c 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "4.99.2" +hyperlane = "4.104.1" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } From ea1c76b7fd93a00f9e1b055c913c6da124d09c8c Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Fri, 23 May 2025 18:49:51 +0100 Subject: [PATCH 1457/1766] Swift 6.1 (#9907) * Changes for swift 6.1 Also compile fixes for hummingbird2 postgres * Remove vapor-sqiftql changes * Revert postgres, sql-kit and swiftql vapor builds * newline * Remove Vapor changes * Remove more Vapor changes --- frameworks/Swift/hummingbird-core/README.md | 2 +- .../hummingbird-core.dockerfile | 4 +- frameworks/Swift/hummingbird/README.md | 2 +- .../hummingbird-postgres.dockerfile | 4 +- .../Swift/hummingbird/hummingbird.dockerfile | 4 +- .../hummingbird2-postgres.dockerfile | 4 +- .../hummingbird2/hummingbird2.dockerfile | 4 +- .../hummingbird2/src-postgres/Package.swift | 14 +++--- .../Controllers/FortunesController.swift | 28 ++++++------ .../server/Controllers/WorldController.swift | 44 ++++++++++--------- .../src-postgres/Sources/server/main.swift | 28 +++--------- .../Swift/hummingbird2/src/Package.swift | 14 +++--- .../src/Sources/server/main.swift | 23 +++------- .../Swift/swift-nio/swift-nio.dockerfile | 4 +- 14 files changed, 77 insertions(+), 102 deletions(-) diff --git a/frameworks/Swift/hummingbird-core/README.md b/frameworks/Swift/hummingbird-core/README.md index c8885474760..9f738a83389 100755 --- a/frameworks/Swift/hummingbird-core/README.md +++ b/frameworks/Swift/hummingbird-core/README.md @@ -9,7 +9,7 @@ Hummingbird Core is the HTTP server for the Hummingbird framework. ## Important Libraries This version of Hummingbird requires -* [Swift 5.7](https://swift.org) +* [Swift 5.10](https://swift.org) * [SwiftNIO 2.x](https://github.com/apple/swift-nio/) ## Test URLs diff --git a/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile b/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile index eb6fccc321b..2c474797381 100644 --- a/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile +++ b/frameworks/Swift/hummingbird-core/hummingbird-core.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.10 as build +FROM swift:6.1 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.10-slim +FROM swift:6.1-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird/README.md b/frameworks/Swift/hummingbird/README.md index 3482a31f993..dc7d8af7b9c 100755 --- a/frameworks/Swift/hummingbird/README.md +++ b/frameworks/Swift/hummingbird/README.md @@ -13,7 +13,7 @@ Hummingbird is a lightweight, flexible HTTP server framework written in Swift. ## Important Libraries This version of Hummingbird requires -* [Swift 5.7](https://swift.org) +* [Swift 5.10](https://swift.org) * [SwiftNIO 2.x](https://github.com/apple/swift-nio/) In these tests for database access it uses * [PostgresKit 2.0](https://github.com/vapor/postgres-kit/) diff --git a/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile b/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile index 952c3c47dbf..544e4d8752e 100644 --- a/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile +++ b/frameworks/Swift/hummingbird/hummingbird-postgres.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.10 as build +FROM swift:6.1 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.10-slim +FROM swift:6.1-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird/hummingbird.dockerfile b/frameworks/Swift/hummingbird/hummingbird.dockerfile index eb6fccc321b..2c474797381 100644 --- a/frameworks/Swift/hummingbird/hummingbird.dockerfile +++ b/frameworks/Swift/hummingbird/hummingbird.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.10 as build +FROM swift:6.1 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.10-slim +FROM swift:6.1-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile b/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile index 952c3c47dbf..544e4d8752e 100644 --- a/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile +++ b/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.10 as build +FROM swift:6.1 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.10-slim +FROM swift:6.1-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird2/hummingbird2.dockerfile b/frameworks/Swift/hummingbird2/hummingbird2.dockerfile index eb6fccc321b..2c474797381 100644 --- a/frameworks/Swift/hummingbird2/hummingbird2.dockerfile +++ b/frameworks/Swift/hummingbird2/hummingbird2.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.10 as build +FROM swift:6.1 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.10-slim +FROM swift:6.1-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird2/src-postgres/Package.swift b/frameworks/Swift/hummingbird2/src-postgres/Package.swift index b8028ce6372..838dd261b93 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Package.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.10 +// swift-tools-version:6.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -6,16 +6,14 @@ import PackageDescription let package = Package( name: "server", platforms: [.macOS(.v14)], - products: [ - .executable(name: "server", targets: ["server"]) - ], dependencies: [ - .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0-beta.4"), - .package(url: "https://github.com/hummingbird-project/swift-mustache.git", from: "2.0.0-beta"), + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0"), + .package(url: "https://github.com/hummingbird-project/swift-mustache.git", from: "2.0.0"), .package(url: "https://github.com/vapor/postgres-nio.git", from: "1.21.0"), ], targets: [ - .executableTarget(name: "server", + .executableTarget( + name: "server", dependencies: [ .product(name: "Hummingbird", package: "hummingbird"), .product(name: "Mustache", package: "swift-mustache"), @@ -27,6 +25,6 @@ let package = Package( // builds. See for details. .unsafeFlags(["-cross-module-optimization"], .when(configuration: .release)) ] - ), + ) ] ) diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift index cd8012c6d26..135e5d12b14 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/FortunesController.swift @@ -5,8 +5,9 @@ import PostgresNIO struct HTML: ResponseGenerator, Sendable { let html: String public func response(from request: Request, context: some RequestContext) -> Response { - let buffer = context.allocator.buffer(string: html) - return Response(status: .ok, headers: [.contentType: "text/html; charset=utf-8"], body: .init(byteBuffer: buffer)) + return Response( + status: .ok, headers: [.contentType: "text/html; charset=utf-8"], + body: .init(byteBuffer: .init(string: html))) } } @@ -17,9 +18,10 @@ final class FortunesController: Sendable { init(postgresClient: PostgresClient) { self.postgresClient = postgresClient - self.template = try! MustacheTemplate(string: """ - Fortunes{{#.}}{{/.}}
      idmessage
      {{id}}{{message}}
      - """) + self.template = try! MustacheTemplate( + string: """ + Fortunes{{#.}}{{/.}}
      idmessage
      {{id}}{{message}}
      + """) } var routes: RouteCollection { @@ -28,11 +30,11 @@ final class FortunesController: Sendable { } /// In this test, the framework's ORM is used to fetch all rows from a database - /// table containing an unknown number of Unix fortune cookie messages (the - /// table has 12 rows, but the code cannot have foreknowledge of the table's - /// size). An additional fortune cookie message is inserted into the list at - /// runtime and then the list is sorted by the message text. Finally, the list - /// is delivered to the client using a server-side HTML template. The message + /// table containing an unknown number of Unix fortune cookie messages (the + /// table has 12 rows, but the code cannot have foreknowledge of the table's + /// size). An additional fortune cookie message is inserted into the list at + /// runtime and then the list is sorted by the message text. Finally, the list + /// is delivered to the client using a server-side HTML template. The message /// text must be considered untrusted and properly escaped and the UTF-8 fortune messages must be rendered properly. @Sendable func fortunes(request: Request, context: Context) async throws -> HTML { let rows = try await self.postgresClient.execute(SelectFortuneStatement()) @@ -43,14 +45,14 @@ final class FortunesController: Sendable { fortunes.append(.init(id: 0, message: "Additional fortune added at request time.")) let sortedFortunes = fortunes.sorted { $0.message < $1.message } - return HTML(html: self.template.render(sortedFortunes) ) - + return HTML(html: self.template.render(sortedFortunes)) + } struct SelectFortuneStatement: PostgresPreparedStatement { typealias Row = (Int32, String) - static var sql = "SELECT id, message FROM Fortune" + static let sql = "SELECT id, message FROM Fortune" func makeBindings() throws -> PostgresNIO.PostgresBindings { return .init() diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift index df3a74d4ac8..0764a5e186b 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/Controllers/WorldController.swift @@ -12,20 +12,20 @@ struct WorldController { .get("updates", use: updates) } - /// In this test, each request is processed by fetching a single row from a + /// In this test, each request is processed by fetching a single row from a /// simple database table. That row is then serialized as a JSON response. @Sendable func single(request: Request, context: Context) async throws -> World { let id = Int32.random(in: 1...10_000) let rows = try await self.postgresClient.execute(SelectWorldStatement(id: id)) - guard let row = try await rows.first(where: {_ in true }) else { + guard let row = try await rows.first(where: { _ in true }) else { throw HTTPError(.notFound) } return World(id: row.0, randomNumber: row.1) } - /// In this test, each request is processed by fetching multiple rows from a - /// simple database table and serializing these rows as a JSON response. The - /// test is run multiple times: testing 1, 5, 10, 15, and 20 queries per request. + /// In this test, each request is processed by fetching multiple rows from a + /// simple database table and serializing these rows as a JSON response. The + /// test is run multiple times: testing 1, 5, 10, 15, and 20 queries per request. /// All tests are run at 512 concurrency. @Sendable func multiple(request: Request, context: Context) async throws -> [World] { let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500) @@ -34,23 +34,24 @@ struct WorldController { result.reserveCapacity(queries) for _ in 0.. [World] { let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500) @@ -59,12 +60,15 @@ struct WorldController { result.reserveCapacity(queries) for _ in 0.. PostgresNIO.PostgresBindings { var bindings = PostgresNIO.PostgresBindings(capacity: 1) @@ -93,7 +97,7 @@ struct WorldController { let id: Int32 let randomNumber: Int32 - static var sql = "UPDATE World SET randomnumber = $2 WHERE id = $1" + static let sql = "UPDATE World SET randomnumber = $2 WHERE id = $1" func makeBindings() throws -> PostgresNIO.PostgresBindings { var bindings = PostgresNIO.PostgresBindings(capacity: 2) diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift index 772a52a5430..fa5d5cdf100 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift @@ -13,24 +13,10 @@ extension Int { } struct TechFrameworkRequestContext: RequestContext { - static let jsonEncoder = JSONEncoder() - static let jsonDecoder = JSONDecoder() - - var coreContext: Hummingbird.CoreRequestContextStorage - - // Use a global JSON Encoder - var responseEncoder: JSONEncoder { Self.jsonEncoder } - // Use a global JSON Decoder - var requestDecoder: JSONDecoder { Self.jsonDecoder } + var coreContext: CoreRequestContextStorage init(source: ApplicationRequestContextSource) { - self.init(channel: source.channel, logger: source.logger) - } - - init(channel: any Channel, logger: Logger) { - self.coreContext = CoreRequestContextStorage( - source: ApplicationRequestContextSource(channel: channel, logger: logger) - ) + self.coreContext = CoreRequestContextStorage(source: source) } } @@ -40,15 +26,15 @@ func runApp() async throws { let serverPort = env.get("SERVER_PORT", as: Int.self) ?? 8080 var postgresConfiguration = PostgresClient.Configuration( - host: "tfb-database", - username: "benchmarkdbuser", - password: "benchmarkdbpass", - database: "hello_world", + host: "tfb-database", + username: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", tls: .disable ) postgresConfiguration.options.maximumConnections = 100 let postgresClient = PostgresClient( - configuration: postgresConfiguration, + configuration: postgresConfiguration, eventLoopGroup: MultiThreadedEventLoopGroup.singleton ) let router = Router(context: TechFrameworkRequestContext.self) diff --git a/frameworks/Swift/hummingbird2/src/Package.swift b/frameworks/Swift/hummingbird2/src/Package.swift index a033651a2c3..a512221f486 100644 --- a/frameworks/Swift/hummingbird2/src/Package.swift +++ b/frameworks/Swift/hummingbird2/src/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.10 +// swift-tools-version:6.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -6,16 +6,14 @@ import PackageDescription let package = Package( name: "server", platforms: [.macOS(.v14)], - products: [ - .executable(name: "server", targets: ["server"]) - ], dependencies: [ - .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0-beta"), + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0") ], targets: [ - .target(name: "server", + .executableTarget( + name: "server", dependencies: [ - .product(name: "Hummingbird", package: "hummingbird"), + .product(name: "Hummingbird", package: "hummingbird") ], swiftSettings: [ // Enable better optimizations when building in Release configuration. Despite the use of @@ -23,6 +21,6 @@ let package = Package( // builds. See for details. .unsafeFlags(["-cross-module-optimization"], .when(configuration: .release)) ] - ), + ) ] ) diff --git a/frameworks/Swift/hummingbird2/src/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src/Sources/server/main.swift index 365b9a6a58f..29ece6eadf1 100644 --- a/frameworks/Swift/hummingbird2/src/Sources/server/main.swift +++ b/frameworks/Swift/hummingbird2/src/Sources/server/main.swift @@ -9,23 +9,10 @@ struct Object: ResponseEncodable { } struct TechFrameworkRequestContext: RequestContext { + var coreContext: CoreRequestContextStorage - static let jsonEncoder = JSONEncoder() - static let jsonDecoder = JSONDecoder() - - var coreContext: Hummingbird.CoreRequestContextStorage - - // Use a global JSON Encoder - var responseEncoder: JSONEncoder { Self.jsonEncoder } - // Use a global JSON Decoder - var requestDecoder: JSONDecoder { Self.jsonDecoder } - - init(source: Hummingbird.ApplicationRequestContextSource) { - self.coreContext = CoreRequestContextStorage(source: ApplicationRequestContextSource(channel: source.channel, logger: source.logger)) - } - - init(channel: any Channel, logger: Logger) { - self.coreContext = CoreRequestContextStorage(source: ApplicationRequestContextSource(channel: channel, logger: logger)) + init(source: ApplicationRequestContextSource) { + self.coreContext = CoreRequestContextStorage(source: source) } } @@ -35,10 +22,10 @@ func runApp() async throws { let serverPort = env.get("SERVER_PORT", as: Int.self) ?? 8080 let router = Router(context: TechFrameworkRequestContext.self) - router.get("plaintext") { _,_ in + router.get("plaintext") { _, _ in "Hello, world!" } - router.get("json") { _,_ in + router.get("json") { _, _ in Object(message: "Hello, world!") } let app = Application( diff --git a/frameworks/Swift/swift-nio/swift-nio.dockerfile b/frameworks/Swift/swift-nio/swift-nio.dockerfile index 54a2050f09e..aabc8a12334 100644 --- a/frameworks/Swift/swift-nio/swift-nio.dockerfile +++ b/frameworks/Swift/swift-nio/swift-nio.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:5.10 as build +FROM swift:6.1 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:5.10-slim +FROM swift:6.1-slim WORKDIR /run # Install Swift dependencies From a40500b3108cb9ed93a51137e711c64c4afad3c8 Mon Sep 17 00:00:00 2001 From: gyakkun <5460071+gyakkun@users.noreply.github.com> Date: Sat, 24 May 2025 04:48:20 +0800 Subject: [PATCH 1458/1766] [Java/muserver] Add muserver (#9902) * [Java/muserver] Add muserver. * Create object on request to adhere TFB rules. --- frameworks/Java/muserver/README.md | 60 ++++++ .../Java/muserver/benchmark_config.json | 53 ++++++ .../Java/muserver/muserver-pg.dockerfile | 15 ++ frameworks/Java/muserver/muserver.dockerfile | 15 ++ frameworks/Java/muserver/pom.xml | 95 ++++++++++ frameworks/Java/muserver/run-pg.sh | 9 + frameworks/Java/muserver/run.sh | 9 + .../src/main/java/benchmark/TFBBase.java | 179 ++++++++++++++++++ .../src/main/java/benchmark/TFBPg.java | 8 + .../src/main/java/benchmark/TFBRest.java | 9 + .../main/java/benchmark/model/Fortune.java | 12 ++ .../src/main/java/benchmark/model/World.java | 12 ++ .../java/benchmark/repository/DbFactory.java | 62 ++++++ .../java/benchmark/repository/DbService.java | 33 ++++ .../repository/JDBCConnectionFactory.java | 28 +++ .../benchmark/repository/JDBCDbService.java | 94 +++++++++ .../src/main/resources/environment.properties | 7 + .../src/main/resources/hikari.properties | 7 + .../src/main/resources/templates/fortune.peb | 12 ++ 19 files changed, 719 insertions(+) create mode 100644 frameworks/Java/muserver/README.md create mode 100644 frameworks/Java/muserver/benchmark_config.json create mode 100644 frameworks/Java/muserver/muserver-pg.dockerfile create mode 100644 frameworks/Java/muserver/muserver.dockerfile create mode 100644 frameworks/Java/muserver/pom.xml create mode 100755 frameworks/Java/muserver/run-pg.sh create mode 100755 frameworks/Java/muserver/run.sh create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/TFBBase.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/TFBPg.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/TFBRest.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/model/Fortune.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/model/World.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/repository/DbFactory.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/repository/DbService.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCConnectionFactory.java create mode 100644 frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCDbService.java create mode 100644 frameworks/Java/muserver/src/main/resources/environment.properties create mode 100644 frameworks/Java/muserver/src/main/resources/hikari.properties create mode 100644 frameworks/Java/muserver/src/main/resources/templates/fortune.peb diff --git a/frameworks/Java/muserver/README.md b/frameworks/Java/muserver/README.md new file mode 100644 index 00000000000..935dbb5d8c9 --- /dev/null +++ b/frameworks/Java/muserver/README.md @@ -0,0 +1,60 @@ +# muserver Benchmarking Test + +### Test Type Implementation Source Code + +* [JSON](src/main/java/benchmark/TFBBase.java) +* [PLAINTEXT](src/main/java/benchmark/TFBBase.java) +* [DB](src/main/java/benchmark/TFBBase.java) +* [QUERY](src/main/java/benchmark/TFBBase.java) +* [UPDATE](src/main/java/benchmark/TFBBase.java) +* [FORTUNES](src/main/java/benchmark/TFBBase.java) + +## Important Libraries + +The tests were run with: + +* [Java 21](https://jdk.java.net/21/) +* [muserver 2.1.10](https://muserver.io/) +* [Jackson 2.19.0](https://github.com/FasterXML/jackson) +* [Pebble 3.2.4](https://pebbletemplates.io/) +* [Postgres JDBC Driver 42.7.5](https://jdbc.postgresql.org/) +* [HikariCP 6.3.0](https://github.com/brettwooldridge/HikariCP) + +## Test URLs + +For running default test (TFBRest.java), please append "/rest" to the path. + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/query?queries= + +### CACHED QUERY + +http://localhost:8080/cached_query?queries= + +### UPDATE + +http://localhost:8080/update?queries= + +### FORTUNES + +http://localhost:8080/fortunes + + +## Reference + +The Loom support and IO_URING support are modified from [netty test](https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/Java/netty). + +The database connection part is modified from [Javalin test](https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/Java/javalin). \ No newline at end of file diff --git a/frameworks/Java/muserver/benchmark_config.json b/frameworks/Java/muserver/benchmark_config.json new file mode 100644 index 00000000000..aad8aa5274b --- /dev/null +++ b/frameworks/Java/muserver/benchmark_config.json @@ -0,0 +1,53 @@ +{ + "framework": "muserver", + "tests": [ + { + "default": { + "json_url": "/rest/json", + "plaintext_url": "/rest/plaintext", + "db_url": "/rest/db", + "query_url": "/rest/queries?queries=", + "update_url": "/rest/updates?queries=", + "fortune_url": "/rest/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "muserver", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "mu-rest-pg", + "notes": "Jax-rs rest resource handler implementation", + "versus": "None" + }, + "pg": { + "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": "muserver", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "mu-pg", + "notes": "MuHandler implementation", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Java/muserver/muserver-pg.dockerfile b/frameworks/Java/muserver/muserver-pg.dockerfile new file mode 100644 index 00000000000..17f20f3874c --- /dev/null +++ b/frameworks/Java/muserver/muserver-pg.dockerfile @@ -0,0 +1,15 @@ +FROM maven:3.9.9-eclipse-temurin-21 as maven +WORKDIR /netty +COPY pom.xml pom.xml +COPY src src +RUN mvn compile assembly:single -q + +FROM maven:3.9.9-eclipse-temurin-21 +WORKDIR /netty +COPY --from=maven /netty/target/app.jar app.jar +COPY run-pg.sh run-pg.sh + +EXPOSE 8080 +# see https://github.com/netty/netty/issues/14942 +# remember to run this with --privileged since https://github.com/TechEmpower/FrameworkBenchmarks/blob/c94f7f95bd751f86a57dea8b63fb8f336bdbbde3/toolset/utils/docker_helper.py#L239 does it +ENTRYPOINT "./run-pg.sh" \ No newline at end of file diff --git a/frameworks/Java/muserver/muserver.dockerfile b/frameworks/Java/muserver/muserver.dockerfile new file mode 100644 index 00000000000..75b9397a253 --- /dev/null +++ b/frameworks/Java/muserver/muserver.dockerfile @@ -0,0 +1,15 @@ +FROM maven:3.9.9-eclipse-temurin-21 as maven +WORKDIR /netty +COPY pom.xml pom.xml +COPY src src +RUN mvn compile assembly:single -q + +FROM maven:3.9.9-eclipse-temurin-21 +WORKDIR /netty +COPY --from=maven /netty/target/app.jar app.jar +COPY run.sh run.sh + +EXPOSE 8080 +# see https://github.com/netty/netty/issues/14942 +# remember to run this with --privileged since https://github.com/TechEmpower/FrameworkBenchmarks/blob/c94f7f95bd751f86a57dea8b63fb8f336bdbbde3/toolset/utils/docker_helper.py#L239 does it +ENTRYPOINT "./run.sh" \ No newline at end of file diff --git a/frameworks/Java/muserver/pom.xml b/frameworks/Java/muserver/pom.xml new file mode 100644 index 00000000000..bc4e4156c73 --- /dev/null +++ b/frameworks/Java/muserver/pom.xml @@ -0,0 +1,95 @@ + + + 4.0.0 + + tfb.benchmark + muserver + 0.1 + + + 21 + 21 + + + jar + + + + org.slf4j + slf4j-api + 2.0.17 + + + org.slf4j + slf4j-simple + 2.0.17 + provided + + + io.muserver + mu-server + 2.1.10 + + + org.postgresql + postgresql + 42.7.5 + + + com.zaxxer + HikariCP + 6.3.0 + + + io.pebbletemplates + pebble + 3.2.4 + + + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider + 2.19.0 + + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.14.0 + + false + + + + maven-assembly-plugin + 3.7.1 + + app + + + hello.HelloWebServer + + + + jar-with-dependencies + + false + + + + make-assembly + package + + single + + + + + + + diff --git a/frameworks/Java/muserver/run-pg.sh b/frameworks/Java/muserver/run-pg.sh new file mode 100755 index 00000000000..68eb89117d6 --- /dev/null +++ b/frameworks/Java/muserver/run-pg.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# PROFILING: -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints +JAVA_OPTIONS="-XX:+UseNUMA \ + -XX:+UseZGC \ + -XX:+ZGenerational \ + $@" + +java $JAVA_OPTIONS -cp app.jar benchmark.TFBPg diff --git a/frameworks/Java/muserver/run.sh b/frameworks/Java/muserver/run.sh new file mode 100755 index 00000000000..2b03ca41371 --- /dev/null +++ b/frameworks/Java/muserver/run.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# PROFILING: -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints +JAVA_OPTIONS="-XX:+UseNUMA \ + -XX:+UseZGC \ + -XX:+ZGenerational \ + $@" + +java $JAVA_OPTIONS -cp app.jar benchmark.TFBRest diff --git a/frameworks/Java/muserver/src/main/java/benchmark/TFBBase.java b/frameworks/Java/muserver/src/main/java/benchmark/TFBBase.java new file mode 100644 index 00000000000..f3da599077d --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/TFBBase.java @@ -0,0 +1,179 @@ +package benchmark; + +import benchmark.model.Fortune; +import benchmark.model.World; +import benchmark.repository.DbFactory; +import benchmark.repository.DbService; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; +import io.muserver.Method; +import io.muserver.MuResponse; +import io.muserver.MuServerBuilder; +import io.muserver.Mutils; +import io.muserver.rest.RestHandlerBuilder; +import io.pebbletemplates.pebble.PebbleEngine; +import io.pebbletemplates.pebble.template.PebbleTemplate; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static jakarta.ws.rs.core.MediaType.*; + +public class TFBBase { + public static final Logger LOGGER = LoggerFactory.getLogger(TFBBase.class); + public static PebbleEngine engine = new PebbleEngine.Builder().build(); + public static PebbleTemplate compiledTemplate = engine.getTemplate("templates/fortune.peb"); + + public static MuServerBuilder commonBuilderWithMuHandler() { + var jackson = new ObjectMapper(); + var dbService = DbFactory.INSTANCE.getDbService(DbFactory.DbType.POSTGRES); + return MuServerBuilder.httpServer() + .addHandler((ignore, res) -> { + res.headers().add("Server", "muserver"); + return false; + }) + .addHandler(Method.GET, "/plaintext", (req, res, pp) -> { + var ah = req.handleAsync(); + res.headers().add("content-type", "text/plain"); + ah.write(Mutils.toByteBuffer("Hello, World!"), (optEx) -> ah.complete()); + }) + .addHandler(Method.GET, "/json", (req, res, pp) -> { + res.headers().add("content-type", "application/json"); + jackson.writeValue(res.writer(), Map.of("message", "Hello, World!")); + }) + .addHandler(Method.GET, "/db", (req, res, pp) -> { + res.headers().add("content-type", "application/json"); + jackson.writeValue(res.writer(), dbService.getWorld(1).get(0)); + }) + .addHandler(Method.GET, "/queries", (req, res, pp) -> { + res.headers().add("content-type", "application/json"); + jackson.writeValue( + res.writer(), + dbService.getWorld(getBoundedRowNumber(req.query().get("queries", ""))) + ); + }) + .addHandler(Method.GET, "/fortunes", (req, res, pp) -> { + res.headers().set("content-type", "text/html;charset=utf-8"); + compiledTemplate.evaluate( + res.writer(), + Map.of("fortunes", dbService.getFortune().stream().map(Fortune::toMap).toList())); + }) + .addHandler(Method.GET, "/updates", (req, res, pp) -> { + res.headers().add("content-type", "application/json"); + jackson.writeValue( + res.writer(), + dbService.updateWorld(getBoundedRowNumber(req.query().get("queries", ""))) + ); + }) + .withInterface("0.0.0.0") + .withHttpPort(8080) + .addShutdownHook(true); + } + + public static MuServerBuilder commonBuilderWithRestHandler() { + return MuServerBuilder.httpServer() + .addHandler((req, res) -> { + res.headers().add("Server", "muserver"); + return false; + }) + .addHandler(RestHandlerBuilder.restHandler(new TFBResource( + DbFactory.INSTANCE.getDbService(DbFactory.DbType.POSTGRES), + compiledTemplate + )).addCustomWriter(new JacksonJsonProvider())) + .withInterface("0.0.0.0") + .withHttpPort(8080) + .addShutdownHook(true); + } + + @Path("/rest") + public static class TFBResource { + public final DbService dbService; + public final PebbleTemplate template; + + public TFBResource( + DbService dbService, + PebbleTemplate template + ) { + this.dbService = dbService; + this.template = template; + } + + @GET + @Path("/plaintext") + @Produces(TEXT_PLAIN) + public String plaintext() { + return "Hello, World!"; + } + + @GET + @Path("/json") + @Produces(APPLICATION_JSON) + public Map json() { + return Map.of("message", "Hello, World!"); + } + + @GET + @Path("/db") + @Produces(APPLICATION_JSON) + public World db() { + return dbService.getWorld(1).get(0); + } + + @GET + @Path("/queries") + @Produces(APPLICATION_JSON) + public List queries( + @QueryParam("queries") + String queries + ) { + int num = getBoundedRowNumber(queries); + return dbService.getWorld(num); + } + + + @GET + @Path("/fortunes") + @Produces(TEXT_HTML) + public void fortunes( + @Context MuResponse res + ) throws IOException { + res.headers().set("content-type", "text/html;charset=utf-8"); + List fortuneList = dbService.getFortune(); + var writer = res.writer(); + // writer will be flushed + template.evaluate(writer, Map.of("fortunes", fortuneList.stream().map(Fortune::toMap).toList())); + } + + @GET + @Path("/updates") + @Produces(APPLICATION_JSON) + public List updates( + @QueryParam("queries") + String queries + ) { + return dbService.updateWorld(getBoundedRowNumber(queries)); + } + } + + + private static final int MIN_QUERIES = 1; + private static final int MAX_QUERIES = 500; + + private static int getBoundedRowNumber(String number) { + int num; + try { + num = Integer.parseInt(number); + } catch (NumberFormatException e) { + num = MIN_QUERIES; + } + return Math.max(MIN_QUERIES, Math.min(num, MAX_QUERIES)); + } +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/TFBPg.java b/frameworks/Java/muserver/src/main/java/benchmark/TFBPg.java new file mode 100644 index 00000000000..d8a369628eb --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/TFBPg.java @@ -0,0 +1,8 @@ +package benchmark; + +public class TFBPg extends TFBBase { + public static void main(String[] args) { + var server = commonBuilderWithMuHandler().start(); + LOGGER.info("Server started at {}", server.uri()); + } +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/TFBRest.java b/frameworks/Java/muserver/src/main/java/benchmark/TFBRest.java new file mode 100644 index 00000000000..09c3ce9423d --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/TFBRest.java @@ -0,0 +1,9 @@ +package benchmark; + +public class TFBRest extends TFBBase { + public static void main(String[] args) { + var server = commonBuilderWithRestHandler().start(); + LOGGER.info("Server started at {}", server.uri()); + } + +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/model/Fortune.java b/frameworks/Java/muserver/src/main/java/benchmark/model/Fortune.java new file mode 100644 index 00000000000..5d1daced647 --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/model/Fortune.java @@ -0,0 +1,12 @@ +package benchmark.model; + +import java.util.Map; + +public record Fortune( + int id, + String message +) { + public Map toMap() { + return Map.of("id", id, "message", message); + } +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/model/World.java b/frameworks/Java/muserver/src/main/java/benchmark/model/World.java new file mode 100644 index 00000000000..3de4ff1c8b5 --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/model/World.java @@ -0,0 +1,12 @@ +package benchmark.model; + +import java.util.Objects; + +public record World( + int id, + int randomNumber +) { + public World copy(Integer id, Integer randomNumber) { + return new World(Objects.requireNonNullElse(id, this.id), Objects.requireNonNullElse(randomNumber, this.randomNumber)); + } +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/repository/DbFactory.java b/frameworks/Java/muserver/src/main/java/benchmark/repository/DbFactory.java new file mode 100644 index 00000000000..9371c498906 --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/repository/DbFactory.java @@ -0,0 +1,62 @@ +package benchmark.repository; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public enum DbFactory { + + INSTANCE; + + public enum DbType {POSTGRES} + + public DbService getDbService(DbType type) { + + DbService dbService; + + switch (type) { + case POSTGRES: + dbService = new JDBCDbService(); + break; + default: + dbService = null; + } + + return dbService; + } + + public int getMaxPoolSize(DbType dbType) { + + int maxPoolSize; + String env = System.getenv("BENCHMARK_ENV"); + String propertiesFileName = "/environment.properties"; + File propFile = new File(propertiesFileName); + + try (InputStream is = propFile.isFile() ? + new FileInputStream(propFile) : + this.getClass().getResourceAsStream(propertiesFileName)) { + Properties prop = new Properties(); + prop.load(is); + + switch (dbType) { + case POSTGRES: + if (prop.getProperty("physicalTag").equals(env)) { + maxPoolSize = Integer.parseInt(prop.getProperty("postgresPhysicalPoolSize")); + } else if (prop.getProperty("cloudTag").equals(env)) { + maxPoolSize = Integer.parseInt(prop.getProperty("postgresCloudPoolSize")); + } else { + maxPoolSize = Integer.parseInt(prop.getProperty("postgresDefaultPoolSize")); + } + break; + default: + maxPoolSize = 100; + } + } catch (IOException | NumberFormatException e) { + throw new RuntimeException("Failed to read property file " + propertiesFileName); + } + + return maxPoolSize; + } +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/repository/DbService.java b/frameworks/Java/muserver/src/main/java/benchmark/repository/DbService.java new file mode 100644 index 00000000000..838359969be --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/repository/DbService.java @@ -0,0 +1,33 @@ +package benchmark.repository; + +import benchmark.model.Fortune; +import benchmark.model.World; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +public interface DbService { + + int MIN_RANDOM_NUMBER = 1; + int MAX_RANDOM_NUMBER_PLUS_ONE = 10001; + int defaultFortuneId = 0; + String defaultFortuneMessage = "Additional fortune added at request time."; + + + List getWorld(int num); + List getFortune(); + List updateWorld(int num); + + default int getRandomNumber() { + return ThreadLocalRandom.current().nextInt(MIN_RANDOM_NUMBER, MAX_RANDOM_NUMBER_PLUS_ONE); + } + + default Set getRandomNumberSet(int num) { + Set set = new HashSet<>(); + while (set.size() < num) + set.add(getRandomNumber()); + return set; + } +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCConnectionFactory.java b/frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCConnectionFactory.java new file mode 100644 index 00000000000..195cbd160b3 --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCConnectionFactory.java @@ -0,0 +1,28 @@ +package benchmark.repository; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import java.sql.Connection; +import java.sql.SQLException; + + +public enum JDBCConnectionFactory { + + INSTANCE; + + private final HikariDataSource ds; + + JDBCConnectionFactory() { + String propertiesFileName = "/hikari.properties"; + HikariConfig config = new HikariConfig(propertiesFileName); + int maxPoolSize = DbFactory.INSTANCE.getMaxPoolSize(DbFactory.DbType.POSTGRES); + + ds = new HikariDataSource(config); + ds.setMaximumPoolSize(maxPoolSize); + } + + public Connection getConnection() throws SQLException { + return ds.getConnection(); + } +} diff --git a/frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCDbService.java b/frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCDbService.java new file mode 100644 index 00000000000..5c9278c42c6 --- /dev/null +++ b/frameworks/Java/muserver/src/main/java/benchmark/repository/JDBCDbService.java @@ -0,0 +1,94 @@ +package benchmark.repository; + +import benchmark.model.Fortune; +import benchmark.model.World; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class JDBCDbService implements DbService { + + @Override + public List getWorld(int num) { + + String select = "select id, randomNumber from World where id = ?"; + List worldList = new ArrayList<>(); + + try (Connection conn = JDBCConnectionFactory.INSTANCE.getConnection(); + PreparedStatement pstm = conn.prepareStatement(select)) { + + for (int randomId : getRandomNumberSet(num)) { + pstm.setInt(1, randomId); + try (ResultSet rs = pstm.executeQuery()) { + rs.next(); + World world = new World(rs.getInt("id"),rs.getInt("randomNumber")); + worldList.add(world); + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + + return worldList; + } + + @Override + public List getFortune() { + + String select = "select id, message from Fortune"; + List fortuneList = new ArrayList<>(); + + try (Connection conn = JDBCConnectionFactory.INSTANCE.getConnection(); + PreparedStatement pstm = conn.prepareStatement(select); + ResultSet rs = pstm.executeQuery()) { + + while (rs.next()) { + Fortune fortune = new Fortune(rs.getInt("id"), rs.getString("message")); + fortuneList.add(fortune); + } + fortuneList.add(new Fortune(defaultFortuneId, defaultFortuneMessage)); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + fortuneList.sort(Comparator.comparing(Fortune::message)); + return fortuneList; + } + + @Override + public List updateWorld(int num) { + + String update = "update World set randomNumber = ? where id = ?"; + List worldList = getWorld(num); + List updatedWorldList = new ArrayList<>(num); + + try (Connection conn = JDBCConnectionFactory.INSTANCE.getConnection(); + PreparedStatement pstm = conn.prepareStatement(update)) { + + conn.setAutoCommit(false); + for (World world : worldList) { + int newRandomNumber; + do { + newRandomNumber = getRandomNumber(); + } while (newRandomNumber == world.randomNumber()); + + pstm.setInt(1, newRandomNumber); + pstm.setInt(2, world.id()); + pstm.addBatch(); + + updatedWorldList.add(world.copy(null, newRandomNumber)); + } + pstm.executeBatch(); + conn.commit(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + return updatedWorldList; + } +} diff --git a/frameworks/Java/muserver/src/main/resources/environment.properties b/frameworks/Java/muserver/src/main/resources/environment.properties new file mode 100644 index 00000000000..2a941e54bf0 --- /dev/null +++ b/frameworks/Java/muserver/src/main/resources/environment.properties @@ -0,0 +1,7 @@ +physicalTag=Citrine +cloudTag=Azure + +postgresPhysicalPoolSize=56 +postgresCloudPoolSize=16 +# test in 2c kvm +postgresDefaultPoolSize=10 diff --git a/frameworks/Java/muserver/src/main/resources/hikari.properties b/frameworks/Java/muserver/src/main/resources/hikari.properties new file mode 100644 index 00000000000..f859c5a8763 --- /dev/null +++ b/frameworks/Java/muserver/src/main/resources/hikari.properties @@ -0,0 +1,7 @@ +dataSourceClassName=org.postgresql.ds.PGSimpleDataSource +dataSource.serverName=tfb-database +dataSource.portNumber=5432 +dataSource.user=benchmarkdbuser +dataSource.password=benchmarkdbpass +dataSource.databaseName=hello_world + diff --git a/frameworks/Java/muserver/src/main/resources/templates/fortune.peb b/frameworks/Java/muserver/src/main/resources/templates/fortune.peb new file mode 100644 index 00000000000..8272a990d66 --- /dev/null +++ b/frameworks/Java/muserver/src/main/resources/templates/fortune.peb @@ -0,0 +1,12 @@ + + +Fortunes + + + +{% for f in fortunes %} + +{% endfor %} +
      idmessage
      {{f.id}}{{f.message}}
      + + From 06b0aebba463e966a9b44562e1461d7590593ee0 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 28 May 2025 14:38:01 -0500 Subject: [PATCH 1459/1766] Dart3: update to latest SDK, general cleanup (#9918) Also added in missing new-line chars at the end of a couple of files --- frameworks/Dart/dart3/.gitignore | 2 +- frameworks/Dart/dart3/bin/server.dart | 60 ++++++++++++-------------- frameworks/Dart/dart3/dart3.dockerfile | 4 +- frameworks/Dart/dart3/pubspec.yaml | 2 +- 4 files changed, 31 insertions(+), 37 deletions(-) diff --git a/frameworks/Dart/dart3/.gitignore b/frameworks/Dart/dart3/.gitignore index 8ac40f21809..27fe9f77a4b 100644 --- a/frameworks/Dart/dart3/.gitignore +++ b/frameworks/Dart/dart3/.gitignore @@ -2,4 +2,4 @@ # Created by `dart pub` .dart_tool/ *.lock -!bin \ No newline at end of file +!bin diff --git a/frameworks/Dart/dart3/bin/server.dart b/frameworks/Dart/dart3/bin/server.dart index f2b98dcd197..5859cc51f82 100755 --- a/frameworks/Dart/dart3/bin/server.dart +++ b/frameworks/Dart/dart3/bin/server.dart @@ -2,24 +2,22 @@ import 'dart:convert'; import 'dart:io'; import 'dart:isolate'; -final _encoder = JsonUtf8Encoder(); - -void main(List _) async { - /// Create an [Isolate] containinig an [HttpServer] +void main(List args) async { + /// Create an [Isolate] containing an [HttpServer] /// for each processor after the first for (var i = 1; i < Platform.numberOfProcessors; i++) { - await Isolate.spawn(_startServer, _); + await Isolate.spawn(_startServer, args); } /// Create a [HttpServer] for the first processor - await _startServer(_); + await _startServer(args); } /// Creates and setup a [HttpServer] Future _startServer(List _) async { /// Binds the [HttpServer] on `0.0.0.0:8080`. final server = await HttpServer.bind( - InternetAddress('0.0.0.0', type: InternetAddressType.IPv4), + InternetAddress.anyIPv4, 8080, shared: true, ); @@ -51,39 +49,35 @@ void _sendResponse( int statusCode, { ContentType? type, List bytes = const [], -}) => - request.response - ..statusCode = statusCode - ..headers.contentType = type - ..headers.date = DateTime.now() - ..contentLength = bytes.length - ..add(bytes) - ..close(); +}) => request.response + ..statusCode = statusCode + ..headers.contentType = type + ..headers.date = DateTime.now() + ..contentLength = bytes.length + ..add(bytes) + ..close(); /// Completes the given [request] by writing the [response] as JSON. void _sendJson(HttpRequest request, Object response) => _sendResponse( - request, - HttpStatus.ok, - type: ContentType.json, - bytes: _encoder.convert(response), - ); + request, + HttpStatus.ok, + type: ContentType.json, + bytes: _jsonEncoder.convert(response), +); /// Completes the given [request] by writing the [response] as plain text. void _sendText(HttpRequest request, String response) => _sendResponse( - request, - HttpStatus.ok, - type: ContentType.text, - bytes: utf8.encode(response), - ); + request, + HttpStatus.ok, + type: ContentType.text, + bytes: utf8.encode(response), +); /// Responds with the JSON test to the [request]. -void _jsonTest(HttpRequest request) => _sendJson( - request, - const {'message': 'Hello, World!'}, - ); +void _jsonTest(HttpRequest request) => + _sendJson(request, const {'message': 'Hello, World!'}); /// Responds with the plaintext test to the [request]. -void _plaintextTest(HttpRequest request) => _sendText( - request, - 'Hello, World!', - ); +void _plaintextTest(HttpRequest request) => _sendText(request, 'Hello, World!'); + +final _jsonEncoder = JsonUtf8Encoder(); diff --git a/frameworks/Dart/dart3/dart3.dockerfile b/frameworks/Dart/dart3/dart3.dockerfile index 7e6e9053968..812b7e959ee 100644 --- a/frameworks/Dart/dart3/dart3.dockerfile +++ b/frameworks/Dart/dart3/dart3.dockerfile @@ -1,5 +1,5 @@ -FROM dart:3.5 AS builder +FROM dart:3.8 AS builder COPY . /app WORKDIR /app @@ -11,4 +11,4 @@ COPY --from=builder /runtime/ / COPY --from=builder /app/build /bin EXPOSE 8080 -CMD ["server"] \ No newline at end of file +CMD ["server"] diff --git a/frameworks/Dart/dart3/pubspec.yaml b/frameworks/Dart/dart3/pubspec.yaml index 2b351720c9b..5a99e258055 100644 --- a/frameworks/Dart/dart3/pubspec.yaml +++ b/frameworks/Dart/dart3/pubspec.yaml @@ -1,7 +1,7 @@ name: dartbenchmark description: A benchmark of dart environment: - sdk: '>=3.5.0 <4.0.0' + sdk: ^3.8.0 dev_dependencies: lints: ^4.0.0 From 65fe94562240cfdee23337ec2fe94c20bdd6271b Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Thu, 29 May 2025 02:38:20 +0700 Subject: [PATCH 1460/1766] Upgrade versions 05 2025 (#9914) * Update logback.xml * Update logback.xml * Update logback.xml * Update logback.xml * Update logback.xml * bumped versions all around * updated gradle version, made java settings idential between ktor tests for consistency * removed string cleanup setting, seems to slow down rps --------- Co-authored-by: Ilya Nemtsev --- .../Kotlin/ktor/ktor-exposed-dsl.dockerfile | 2 +- .../ktor/ktor-exposed/app/build.gradle.kts | 12 ++++++------ .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile | 2 +- frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml | 10 +++++----- frameworks/Kotlin/ktor/ktor.dockerfile | 2 +- frameworks/Kotlin/ktor/ktor/pom.xml | 18 +++++++----------- 7 files changed, 22 insertions(+), 26 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile index 495b8b6c0e6..d89f899a9d1 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-exposed-dsl.dockerfile @@ -7,4 +7,4 @@ RUN gradle --no-daemon shadowJar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "app/build/libs/app-all.jar", "Dsl"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+AlwaysPreTouch", "-jar", "app/build/libs/app-all.jar", "Dsl"] diff --git a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts index 56398c64112..1ce1ba7f1fb 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts +++ b/frameworks/Kotlin/ktor/ktor-exposed/app/build.gradle.kts @@ -1,7 +1,7 @@ plugins { application - kotlin("jvm") version "2.0.21" - kotlin("plugin.serialization") version "2.0.0" + kotlin("jvm") version "2.1.21" + kotlin("plugin.serialization") version "2.1.21" id("com.github.johnrengelman.shadow") version "8.1.0" } @@ -9,9 +9,9 @@ repositories { mavenCentral() } -val ktorVersion = "3.1.2" -val kotlinxSerializationVersion = "1.8.0" -val exposedVersion = "0.59.0" +val ktorVersion = "3.1.3" +val kotlinxSerializationVersion = "1.8.1" +val exposedVersion = "0.61.0" dependencies { implementation("io.ktor:ktor-server-core:$ktorVersion") @@ -25,7 +25,7 @@ dependencies { implementation("org.jetbrains.exposed:exposed-dao:$exposedVersion") implementation("org.jetbrains.exposed:exposed-jdbc:$exposedVersion") - implementation("org.postgresql:postgresql:42.7.4") + implementation("org.postgresql:postgresql:42.7.5") implementation("com.zaxxer:HikariCP:5.1.0") runtimeOnly("org.slf4j:slf4j-simple:1.7.36") } diff --git a/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties index 4eaec467050..18362b78bde 100644 --- a/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/ktor/ktor-exposed/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile b/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile index 9281f4974ac..0c7fc7c2e15 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile +++ b/frameworks/Kotlin/ktor/ktor-r2dbc.dockerfile @@ -10,4 +10,4 @@ COPY --from=maven /ktor-r2dbc/target/tech-empower-framework-benchmark-1.0-SNAPSH EXPOSE 9090 -CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml index cffd5da8488..9f0754b9512 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/pom.xml @@ -12,15 +12,15 @@ org.jetbrains.ktor tech-empower-framework-benchmark - 2.1.20 + 2.1.21 1.10.1 - 3.1.2 + 3.1.3 1.8.1 0.12.0 UTF-8 - 1.5.12 + 1.5.13 3.7.1 - 42.7.4 + 42.7.5 1.0.7.RELEASE 1.0.2.RELEASE @@ -150,7 +150,7 @@ maven-assembly-plugin - 3.0.0 + 3.7.1 diff --git a/frameworks/Kotlin/ktor/ktor.dockerfile b/frameworks/Kotlin/ktor/ktor.dockerfile index 522fa558851..c2624695540 100644 --- a/frameworks/Kotlin/ktor/ktor.dockerfile +++ b/frameworks/Kotlin/ktor/ktor.dockerfile @@ -10,4 +10,4 @@ COPY --from=maven /ktor/target/tech-empower-framework-benchmark-1.0-SNAPSHOT-net EXPOSE 9090 -CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+AlwaysPreTouch", "-XX:+UseStringDeduplication", "-jar", "app.jar"] +CMD ["java", "-server","-XX:+UseNUMA", "-XX:+UseG1GC", "-XX:+AlwaysPreTouch", "-jar", "app.jar"] diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 1ae4aa0b3d5..a6adb0a651b 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -12,23 +12,24 @@ org.jetbrains.ktor tech-empower-framework-benchmark - 2.1.20 - 3.1.2 + 2.1.21 + 3.1.3 1.8.1 0.12.0 UTF-8 5.1.0 - 1.5.12 + 1.5.13 8.0.33 - 42.7.4 + 42.7.5 org.jetbrains.kotlin - kotlin-reflect + kotlin-stdlib ${kotlin.version} + org.jetbrains.kotlinx kotlinx-serialization-core @@ -39,11 +40,6 @@ kotlinx-serialization-json ${serialization.version} - - org.jetbrains.kotlinx - kotlinx-serialization-json-io - ${serialization.version} - org.jetbrains.kotlinx kotlinx-html-jvm @@ -150,7 +146,7 @@ maven-assembly-plugin - 3.0.0 + 3.7.1 From 3f4037b8eecf36eb254ecc8e793fa24487f77f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Thu, 29 May 2025 03:38:50 +0800 Subject: [PATCH 1461/1766] Upgrade hyperlane (#9912) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 183 ++++++++++-------- frameworks/Rust/hyperlane/Cargo.toml | 3 +- frameworks/Rust/hyperlane/src/main.rs | 15 +- .../Rust/hyperlane/src/request_middleware.rs | 7 +- frameworks/Rust/hyperlane/src/server.rs | 8 +- 5 files changed, 123 insertions(+), 93 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 747c03a3223..73b27cb721b 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -93,6 +93,12 @@ version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +[[package]] +name = "bin-encode-decode" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d0c660f94a990c6e9015951188fcb5bebc4d21b6dd82244597aab2ad47dc36" + [[package]] name = "bitflags" version = "2.9.1" @@ -156,6 +162,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chunkify" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db978867c272fae07fdf73dddfa74c8e276f9b94cd1a55c676a786e9e54e678" +dependencies = [ + "dashmap", + "file-operation", + "once_cell", + "tokio", + "twox-hash", +] + [[package]] name = "clonelicious" version = "2.0.3" @@ -164,13 +183,19 @@ checksum = "b7d51b119ca46e37c21508debf8d9823521be05a70e32ee5afc7695ae1cfb4ec" [[package]] name = "color-output" -version = "6.6.3" +version = "6.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed260583bcafb40922925d447c098fd5b94e7b2eb8679e87dae2632da0a01357" +checksum = "016afb96f1d207a365d175c64b6f7ddef44ba8dfc6ad60cafd596d9f0b146bb1" dependencies = [ "hyperlane-time", ] +[[package]] +name = "compare_version" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a81172d3a2eb49276707c98711f3ea49a11f5566e4cb3092c738bbb7fd2098b" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -289,7 +314,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -462,7 +487,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -619,9 +644,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.13.4" +version = "2.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1e04c8ee442e52dfbf7e4003f614d8e35ff4e4f6ea9271871abcec8a6d7c85" +checksum = "90935a9ba153dcca173ac3787b8c0b5e74eabc982a9ddf801da885d17ea20c25" dependencies = [ "brotli", "flate2", @@ -636,65 +661,51 @@ checksum = "1808d8983c7ca1d289188767327a24d3e6c0c6a741257745fd7fea9f8f7a7635" [[package]] name = "http-type" -version = "3.72.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e60444695a64e58b81fba58839c080906cd056c5564b463894434a4d5dba4cd3" +checksum = "033ac0e29073bd2c552b135a5074263d1cbf82d3ab8e05849aad867a78d5949a" dependencies = [ - "ahash", "dashmap", - "futures", "hex", "http-compress", "http-constant", "lombok-macros", - "num_cpus", - "once_cell", "serde", "serde-xml-rs", "serde_json", "serde_urlencoded", - "simd-json", "std-macro-extensions", "tokio", - "twox-hash", "url", - "urlencoding", ] [[package]] name = "hyperlane" -version = "4.104.1" +version = "5.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93bfea0d900c45673c134c9f76c540dbe76d675e44dd516a121041b4b6b0acc" +checksum = "c450649ce23878b5b0a757a4faf9ca1ca837ab9bae6c2b82cbc3e207d2f92fc5" dependencies = [ - "clonelicious", - "color-output", - "file-operation", - "future-fn", "http-type", - "hyperlane-broadcast", - "hyperlane-log", - "recoverable-spawn", - "recoverable-thread-pool", - "server-manager", + "lombok-macros", + "serde", ] [[package]] name = "hyperlane-broadcast" -version = "0.2.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77cd3b98eecd545e1acbe203b9d0fbad46e7d9034033c5e3afa07fff9dbcb3e6" +checksum = "d10d26d30398580d6e5535a1f706507aeaa069a30f9959b5299dc066a112a396" dependencies = [ "dashmap", - "lombok", + "lombok-macros", "tokio", ] [[package]] name = "hyperlane-log" -version = "1.16.6" +version = "1.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fea42cc7c83f7c8436ee6db372fc043a034065d94f9ac6dbbc28e00302d14" +checksum = "e822ed456ed2b07e3d038ed2275cabcce56651110bebb20c7d3fd699ce5c4602" dependencies = [ "file-operation", "hyperlane-time", @@ -704,15 +715,51 @@ dependencies = [ [[package]] name = "hyperlane-time" -version = "0.5.4" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c145707425cdd097e117e8b4ee8baeaf8eb265658a5c37d2c4aa0b24fd26a507" + +[[package]] +name = "hyperlane-utils" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7dd4a0e7011c2909328b695546ef47a520969d619d6f0542a56d8f3ef84470" +checksum = "435663d62a9b1cc9f41fa8d89448f8eae8bfe68016b3cefd8106526d3fd59993" +dependencies = [ + "ahash", + "bin-encode-decode", + "chunkify", + "clonelicious", + "color-output", + "compare_version", + "file-operation", + "future-fn", + "futures", + "hex", + "hyperlane-broadcast", + "hyperlane-log", + "log", + "lombok-macros", + "num_cpus", + "once_cell", + "recoverable-spawn", + "recoverable-thread-pool", + "serde", + "serde-xml-rs", + "serde_json", + "serde_urlencoded", + "server-manager", + "simd-json", + "twox-hash", + "url", + "urlencoding", +] [[package]] name = "hyperlane_techempower" version = "0.1.0" dependencies = [ "hyperlane", + "hyperlane-utils", "rand 0.9.1", "serde", "sqlx", @@ -904,26 +951,15 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lombok" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fd3ecc97c69dd7420e63ddc37457e143cff962c7301de78e4a6ec62d45abdf7" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "lombok-macros" -version = "1.11.3" +version = "1.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a6c00f977434776490d523145f6de60b6b7d9ce1096c011449484c80100a40" +checksum = "10cee2ce690915c2b491c9ea0d2d8e3daa3e30bcc55cc15fd9297b2566c4522e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1220,9 +1256,9 @@ dependencies = [ [[package]] name = "recoverable-spawn" -version = "3.7.10" +version = "3.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6740e68c7a92ceec820bb9e62ade93377b631ee1d4e8252a34a3815446e59f64" +checksum = "2e80cb1811dee47b521fb2a022c3a533d378e24816b6e59763c18de10693eb6a" dependencies = [ "once_cell", "tokio", @@ -1230,9 +1266,9 @@ dependencies = [ [[package]] name = "recoverable-thread-pool" -version = "2.3.5" +version = "2.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629c4dafeade0bd46f1f9ce78dcb8336ba912b2544d028a8cf714a32a0ffa29f" +checksum = "47914cafb04d7ac1e20031c17f7831c282d7ed730c86be0480c4db6347b339c5" dependencies = [ "lombok-macros", "recoverable-spawn", @@ -1265,7 +1301,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1335,7 +1371,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1537,7 +1573,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.101", + "syn", ] [[package]] @@ -1560,7 +1596,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.101", + "syn", "tokio", "url", ] @@ -1697,17 +1733,6 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.101" @@ -1727,7 +1752,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1756,7 +1781,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1767,7 +1792,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1797,9 +1822,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -1821,7 +1846,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1855,7 +1880,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1998,7 +2023,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-shared", ] @@ -2020,7 +2045,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2233,7 +2258,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "synstructure", ] @@ -2254,7 +2279,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2274,7 +2299,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "synstructure", ] @@ -2314,5 +2339,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 7221a94d21c..be4adb20497 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,8 @@ exclude = [ ] [dependencies] -hyperlane = "4.104.1" +hyperlane = "5.5.1" +hyperlane-utils = "0.5.0" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index da29f0836b2..09dbb09aa55 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -1,6 +1,5 @@ #![allow(dead_code)] #![allow(unused_imports)] - pub(crate) mod r#const; pub(crate) mod db; pub(crate) mod lazy; @@ -15,11 +14,9 @@ pub(crate) use db::*; pub(crate) use r#type::*; pub(crate) use utils::*; +pub(crate) use std::{fmt, hint::black_box, sync::Arc}; + pub(crate) use hyperlane::{ - futures::{executor::block_on, future::join_all}, - once_cell::sync::Lazy, - serde::*, - serde_json::{Value, json}, tokio::{ runtime::{Builder, Runtime}, spawn, @@ -28,6 +25,13 @@ pub(crate) use hyperlane::{ }, *, }; +pub(crate) use hyperlane_utils::{ + futures::{executor::block_on, future::join_all}, + once_cell::sync::Lazy, + serde::*, + serde_json::{Value, json}, + *, +}; pub(crate) use lazy::*; pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng}; pub(crate) use server::*; @@ -35,7 +39,6 @@ pub(crate) use sqlx::{ postgres::{PgPoolOptions, PgRow}, *, }; -pub(crate) use std::{fmt, hint::black_box, sync::Arc}; fn main() { run_server(); diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index ff75877b318..2550aa4b5fe 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -13,8 +13,11 @@ pub async fn request(ctx: Context) { } #[cfg(feature = "fortunes")] { - ctx.set_response_header(CONTENT_TYPE, content_type_charset(TEXT_HTML, UTF8)) - .await; + ctx.set_response_header( + CONTENT_TYPE, + ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), + ) + .await; } #[cfg(any( feature = "json", diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index f7f50162226..5e17c60d4ed 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -4,8 +4,8 @@ fn runtime() -> Runtime { Builder::new_multi_thread() .worker_threads(get_thread_count()) .thread_stack_size(1_048_576) - .max_blocking_threads(1_024_000) - .max_io_events_per_tick(1_024_000) + .max_blocking_threads(2_048) + .max_io_events_per_tick(1_024) .enable_all() .build() .unwrap() @@ -17,9 +17,7 @@ async fn init_server() { server.port(8080).await; server.disable_linger().await; server.disable_nodelay().await; - server.disable_log().await; - server.disable_inner_log().await; - server.disable_inner_print().await; + server.error_handle(|_: String| {}).await; server.http_line_buffer_size(256).await; server.websocket_buffer_size(256).await; server.request_middleware(request_middleware::request).await; From ca99ef19da3f706f6614ac2041ca523bba86ea0c Mon Sep 17 00:00:00 2001 From: nazo Date: Thu, 29 May 2025 03:41:14 +0800 Subject: [PATCH 1462/1766] [Python/Blacksheep] Adjust the unit startup mode (#9886) * Adjust the unit startup mode * fix * try fix * try fix * try fix * try fix * try fix * rollback * adjust * fix * try change * try change * fix * Tuning * fix * try fix * try fix * add pypy * try fix pypy * fix * fix: app.py -> app-socketify.py * fix: _is_travis * fix error * try fix * try fix * try fix * try fix * try optimization * try fix * rollback * update socketify and fix query --- frameworks/Python/blacksheep/app-socketify.py | 152 ++++++++++++++++++ frameworks/Python/blacksheep/app.py | 72 ++++++--- .../Python/blacksheep/benchmark_config.json | 23 +++ .../blacksheep-nginx-unit.dockerfile | 18 ++- .../blacksheep-pypy-socketify.dockerfile | 15 ++ .../Python/blacksheep/blacksheep.dockerfile | 13 +- .../Python/blacksheep/blacksheep_conf.py | 9 +- frameworks/Python/blacksheep/config.toml | 18 +++ .../blacksheep/requirements-gunicorn.txt | 1 - .../blacksheep/requirements-hypercorn.txt | 1 - .../Python/blacksheep/requirements-pypy.txt | 3 + .../blacksheep/requirements-uvicorn.txt | 6 +- frameworks/Python/blacksheep/requirements.txt | 5 +- frameworks/Python/blacksheep/start-unit.sh | 12 +- ...-config.template.json => unit-config.json} | 4 +- 15 files changed, 301 insertions(+), 51 deletions(-) create mode 100644 frameworks/Python/blacksheep/app-socketify.py create mode 100644 frameworks/Python/blacksheep/blacksheep-pypy-socketify.dockerfile delete mode 100644 frameworks/Python/blacksheep/requirements-gunicorn.txt delete mode 100644 frameworks/Python/blacksheep/requirements-hypercorn.txt create mode 100644 frameworks/Python/blacksheep/requirements-pypy.txt mode change 100755 => 100644 frameworks/Python/blacksheep/start-unit.sh rename frameworks/Python/blacksheep/{unit-config.template.json => unit-config.json} (84%) diff --git a/frameworks/Python/blacksheep/app-socketify.py b/frameworks/Python/blacksheep/app-socketify.py new file mode 100644 index 00000000000..47ed2663804 --- /dev/null +++ b/frameworks/Python/blacksheep/app-socketify.py @@ -0,0 +1,152 @@ +import multiprocessing +import os +import psycopg +import platform +import random +import asyncio +import blacksheep as bs +import jinja2 +from pathlib import Path +from psycopg_pool import AsyncConnectionPool + +READ_ROW_SQL = 'SELECT "id", "randomnumber" FROM "world" WHERE id = %s' +WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=%s WHERE id=%s' +ADDITIONAL_ROW = [0, "Additional fortune added at request time."] +CORE_COUNT = multiprocessing.cpu_count() + +MAX_POOL_SIZE = CORE_COUNT * 2 +MIN_POOL_SIZE = max(1, MAX_POOL_SIZE // 2) +db_pool = None + +async def setup_db(app): + global db_pool + conninfo = ( + f"postgresql://{os.getenv('PGUSER', 'benchmarkdbuser')}:{os.getenv('PGPASS', 'benchmarkdbpass')}" + f"@tfb-database:5432/hello_world" + ) + db_pool = AsyncConnectionPool( + conninfo=conninfo, + min_size=MIN_POOL_SIZE, + max_size=MAX_POOL_SIZE, + open=False, + timeout=5.0, + max_lifetime=1800, + ) + await db_pool.open() + +async def shutdown_db(app): + global db_pool + if db_pool is not None: + await db_pool.close() + db_pool = None + +def load_fortunes_template(): + with Path("templates/fortune.html").open("r") as f: + return jinja2.Template(f.read()) + +fortune_template = load_fortunes_template() + +app = bs.Application() +app.on_start += setup_db +app.on_stop += shutdown_db + +def get_num_queries(request): + try: + value = request.query.get('queries') + if value is None: + return 1 + query_count = int(value[0]) + except (KeyError, IndexError, ValueError): + return 1 + return min(max(query_count, 1), 500) + +JSON_CONTENT_TYPE = b"application/json" + +@bs.get('/json') +async def json_test(request): + return bs.json({'message': 'Hello, world!'}) + +@bs.get('/db') +async def single_db_query_test(request): + row_id = random.randint(1, 10000) + async with db_pool.connection() as db_conn: + async with db_conn.cursor() as cursor: + await cursor.execute(READ_ROW_SQL, (row_id,)) + number = await cursor.fetchone() + return bs.json({'id': row_id, 'randomNumber': number[1]}) + +@bs.get('/queries') +async def multiple_db_queries_test(request): + num_queries = get_num_queries(request) + row_ids = random.sample(range(1, 10000), num_queries) + worlds = [] + async with db_pool.connection() as db_conn: + async with db_conn.cursor() as cursor: + for row_id in row_ids: + await cursor.execute(READ_ROW_SQL, (row_id,)) + number = await cursor.fetchone() + worlds.append({"id": row_id, "randomNumber": number[1]}) + return bs.json(worlds) + +@bs.get('/fortunes') +async def fortunes_test(request): + async with db_pool.connection() as db_conn: + async with db_conn.cursor() as cursor: + await cursor.execute("SELECT * FROM Fortune") + fortunes = await cursor.fetchall() + fortunes.append(ADDITIONAL_ROW) + fortunes.sort(key=lambda row: row[1]) + data = fortune_template.render(fortunes=fortunes) + return bs.html(data) + +@bs.get('/updates') +async def db_updates_test(request): + num_queries = get_num_queries(request) + updates = sorted(zip( + random.sample(range(1, 10000), num_queries), + random.sample(range(1, 10000), num_queries) + ), key=lambda x: x[1]) + worlds = [{"id": row_id, "randomNumber": number} for row_id, number in updates] + for _ in range(5): + async with db_pool.connection() as db_conn: + try: + await db_conn.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED") + async with db_conn.cursor() as cursor: + for row_id, number in updates: + await cursor.execute(READ_ROW_SQL, (row_id,)) + await cursor.fetchone() + for _ in range(5): + try: + await cursor.executemany(WRITE_ROW_SQL, [(number, row_id) for row_id, number in updates]) + return bs.json(worlds) + except psycopg.errors.DeadlockDetected: + await db_conn.rollback() + continue + # await cursor.executemany(WRITE_ROW_SQL, [(number, row_id) for row_id, number in updates]) + except (psycopg.errors.OperationalError, psycopg.errors.PipelineAborted): + await db_conn.rollback() + continue + raise Exception("connect error") + +@bs.get('/plaintext') +async def plaintext_test(request): + return bs.Response(200, content=bs.Content(b"text/plain", b'Hello, World!')) + +if platform.python_implementation() == 'PyPy': + import logging + from socketify import ASGI + workers = int(multiprocessing.cpu_count()) + if os.environ.get('TRAVIS') == 'true': + workers = 2 + + def run_app(): + ASGI(app).listen(8080, lambda config: logging.info(f"Listening on port http://localhost:{config.port} now\n")).run() + + def create_fork(): + n = os.fork() + if not n > 0: + run_app() + + for i in range(1, workers): + create_fork() + run_app() \ No newline at end of file diff --git a/frameworks/Python/blacksheep/app.py b/frameworks/Python/blacksheep/app.py index 422a987df43..80dd48919e9 100644 --- a/frameworks/Python/blacksheep/app.py +++ b/frameworks/Python/blacksheep/app.py @@ -1,28 +1,29 @@ import multiprocessing import os import asyncpg +import platform import random import asyncio -from operator import itemgetter import blacksheep as bs import jinja2 import msgspec from pathlib import Path - -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) -db_pool = None -key = itemgetter(1) - try: import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) except Exception: ... +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_CONNECTIONS = 1900 +CORE_COUNT = multiprocessing.cpu_count() +MAX_POOL_SIZE = max(1,int(os.getenv('MAX_POOL_SIZE', MAX_CONNECTIONS // CORE_COUNT))) +MIN_POOL_SIZE = max(1,int(os.getenv('MIN_POOL_SIZE', MAX_POOL_SIZE // 2))) + +db_pool = None + async def setup_db(app): global db_pool db_pool = await asyncpg.create_pool( @@ -35,6 +36,12 @@ async def setup_db(app): max_size=MAX_POOL_SIZE, ) +async def shutdown_db(app): + """Close asyncpg connection pool for the current process.""" + global db_pool + if db_pool is not None: + await db_pool.close() + db_pool = None def load_fortunes_template(): with Path("templates/fortune.html").open("r") as f: @@ -45,7 +52,7 @@ def load_fortunes_template(): app = bs.Application() app.on_start += setup_db - +app.on_stop += shutdown_db def get_num_queries(request): try: @@ -55,14 +62,9 @@ def get_num_queries(request): query_count = int(value[0]) except (KeyError, IndexError, ValueError): return 1 - if query_count < 1: - return 1 - if query_count > 500: - return 500 - return query_count + return min(max(query_count, 1), 500) ENCODER = msgspec.json.Encoder() -DECODER = msgspec.json.Decoder() JSON_CONTENT_TYPE = b"application/json" def jsonify( data, @@ -122,7 +124,7 @@ async def fortunes_test(request): fortunes = await db_conn.fetch("SELECT * FROM Fortune") fortunes.append(ADDITIONAL_ROW) - fortunes.sort(key = key) + fortunes.sort(key=lambda row: row[1]) data = fortune_template.render(fortunes=fortunes) return bs.html(data) @@ -130,18 +132,17 @@ async def fortunes_test(request): @bs.get('/updates') async def db_updates_test(request): num_queries = get_num_queries(request) - ids = sorted(random.sample(range(1, 10000 + 1), num_queries)) - numbers = sorted(random.sample(range(1, 10000), num_queries)) - updates = list(zip(ids, numbers)) - - # worlds = [ {"id": row_id, "randomNumber": number} for row_id, number in updates ] + updates = list(zip( + random.sample(range(1, 10000), num_queries), + sorted(random.sample(range(1, 10000), num_queries)) + )) worlds = [Result(id=row_id, randomNumber=number) for row_id, number in updates] + # worlds = [ {"id": row_id, "randomNumber": number} for row_id, number in updates ] async with db_pool.acquire() as db_conn: statement = await db_conn.prepare(READ_ROW_SQL) for row_id, _ in updates: await statement.fetchval(row_id) await db_conn.executemany(WRITE_ROW_SQL, updates) - return jsonify(worlds) @@ -150,3 +151,26 @@ async def plaintext_test(request): return bs.Response(200, content=bs.Content(b"text/plain", b'Hello, World!')) #return bs.text('Hello, World!') + +if platform.python_implementation() == 'PyPy': + from socketify import ASGI + workers = int(multiprocessing.cpu_count()) + if _is_travis: + workers = 2 + + def run_app(): + ASGI(app).listen(8080, lambda config: logging.info(f"Listening on port http://localhost:{config.port} now\n")).run() + + + def create_fork(): + n = os.fork() + # n greater than 0 means parent process + if not n > 0: + run_app() + + + # fork limiting the cpu count - 1 + for i in range(1, workers): + create_fork() + + run_app() \ No newline at end of file diff --git a/frameworks/Python/blacksheep/benchmark_config.json b/frameworks/Python/blacksheep/benchmark_config.json index fb05ddddbe8..db211d08363 100644 --- a/frameworks/Python/blacksheep/benchmark_config.json +++ b/frameworks/Python/blacksheep/benchmark_config.json @@ -46,6 +46,29 @@ "display_name": "blacksheep-nginx-unit", "versus": "None", "notes": "" + }, + "pypy-socketify": { + "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": "blacksheep", + "language": "Python", + "flavor": "Python3", + "platform": "ASGI", + "webserver": "Socketify.py", + "os": "Linux", + "orm": "Raw", + "database_os": "Linux", + "database": "Postgres", + "display_name": "Blacksheep [Socketify.py PyPy3]", + "versus": "None", + "notes": "" } }] } diff --git a/frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile b/frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile index cd09391f6ac..3014ba7cfdb 100644 --- a/frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile +++ b/frameworks/Python/blacksheep/blacksheep-nginx-unit.dockerfile @@ -4,14 +4,20 @@ WORKDIR /blacksheep COPY ./ /blacksheep -RUN pip3 install -U pip -RUN pip3 install Cython==3.0.12 -RUN pip3 install -r /blacksheep/requirements.txt -RUN pip3 install -r /blacksheep/requirements-uvicorn.txt +RUN apt-get update; apt-get install libuv1 -y -RUN chmod +x start-unit.sh +RUN pip3 install -U pip -q +RUN pip3 install Cython==3.0.12 -q +RUN pip3 install -r /blacksheep/requirements.txt -q +RUN pip3 install -r /blacksheep/requirements-uvicorn.txt -q ENV PGSSLMODE=disable +RUN CORE_COUNT=$(nproc) && \ + sed -i "s|\"processes\": [0-9]*|\"processes\": $CORE_COUNT|g" /blacksheep/unit-config.json +RUN chmod +x start-unit.sh +ENTRYPOINT [] EXPOSE 8080 -CMD ["./start-unit.sh"] + +# CMD ["unitd", "--no-daemon", "--control", "unix:/var/run/control.unit.sock"] +CMD ["./start-unit.sh"] \ No newline at end of file diff --git a/frameworks/Python/blacksheep/blacksheep-pypy-socketify.dockerfile b/frameworks/Python/blacksheep/blacksheep-pypy-socketify.dockerfile new file mode 100644 index 00000000000..b730747562f --- /dev/null +++ b/frameworks/Python/blacksheep/blacksheep-pypy-socketify.dockerfile @@ -0,0 +1,15 @@ +FROM pypy:3.11-bookworm + +ADD ./ /blacksheep + +WORKDIR /blacksheep + +RUN apt-get update; apt-get install libuv1 libpq5 -y + +RUN pip3 install -r /blacksheep/requirements.txt +RUN pip3 install -r /blacksheep/requirements-pypy.txt + +EXPOSE 8080 + +CMD python ./app-socketify.py + diff --git a/frameworks/Python/blacksheep/blacksheep.dockerfile b/frameworks/Python/blacksheep/blacksheep.dockerfile index e87d8f14e5a..9948bd51766 100644 --- a/frameworks/Python/blacksheep/blacksheep.dockerfile +++ b/frameworks/Python/blacksheep/blacksheep.dockerfile @@ -4,12 +4,13 @@ WORKDIR /blacksheep COPY ./ /blacksheep -RUN pip3 install -U pip -RUN pip3 install Cython==3.0.12 -RUN pip3 install -r /blacksheep/requirements.txt -RUN pip3 install -r /blacksheep/requirements-gunicorn.txt -RUN pip3 install -r /blacksheep/requirements-uvicorn.txt +RUN apt-get update; apt-get install libuv1 -y +RUN pip3 install -U pip -q +RUN pip3 install Cython==3.0.12 -q +RUN pip3 install -r /blacksheep/requirements.txt -q +RUN pip3 install -r /blacksheep/requirements-uvicorn.txt -q +ENV GUNICORN=1 EXPOSE 8080 -CMD gunicorn app:app -k uvicorn.workers.UvicornWorker -c blacksheep_conf.py +CMD gunicorn app:app -k uvicorn_worker.UvicornWorker -c blacksheep_conf.py diff --git a/frameworks/Python/blacksheep/blacksheep_conf.py b/frameworks/Python/blacksheep/blacksheep_conf.py index 4f4e08a729e..7324c9efddb 100644 --- a/frameworks/Python/blacksheep/blacksheep_conf.py +++ b/frameworks/Python/blacksheep/blacksheep_conf.py @@ -2,13 +2,18 @@ import os _is_travis = os.environ.get('TRAVIS') == 'true' +CPU_CORES = multiprocessing.cpu_count() +MAX_CONNECTIONS = 1900 +CONNECTIONS_PER_WORKER = 100 +max_pg_workers = MAX_CONNECTIONS // CONNECTIONS_PER_WORKER -workers = multiprocessing.cpu_count() +workers = CPU_CORES if _is_travis: workers = 2 bind = "0.0.0.0:8080" -keepalive = 120 +keepalive = 1 +timeout = 0 errorlog = '-' pidfile = '/tmp/blacksheep.pid' loglevel = 'error' diff --git a/frameworks/Python/blacksheep/config.toml b/frameworks/Python/blacksheep/config.toml index c37e96092d5..ea30e9cad43 100644 --- a/frameworks/Python/blacksheep/config.toml +++ b/frameworks/Python/blacksheep/config.toml @@ -35,3 +35,21 @@ orm = "Raw" platform = "ASGI" webserver = "nginx-unit" versus = "None" + + +[pypy-socketify] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "ASGI" +webserver = "Socketify.py" +versus = "None" diff --git a/frameworks/Python/blacksheep/requirements-gunicorn.txt b/frameworks/Python/blacksheep/requirements-gunicorn.txt deleted file mode 100644 index 4afe40e70ce..00000000000 --- a/frameworks/Python/blacksheep/requirements-gunicorn.txt +++ /dev/null @@ -1 +0,0 @@ -gunicorn==23.0.0 diff --git a/frameworks/Python/blacksheep/requirements-hypercorn.txt b/frameworks/Python/blacksheep/requirements-hypercorn.txt deleted file mode 100644 index 3e0a21f2fe2..00000000000 --- a/frameworks/Python/blacksheep/requirements-hypercorn.txt +++ /dev/null @@ -1 +0,0 @@ -hypercorn==0.17.3 diff --git a/frameworks/Python/blacksheep/requirements-pypy.txt b/frameworks/Python/blacksheep/requirements-pypy.txt new file mode 100644 index 00000000000..f2c3d4fe9b6 --- /dev/null +++ b/frameworks/Python/blacksheep/requirements-pypy.txt @@ -0,0 +1,3 @@ +psycopg[pool] +git+https://github.com/cirospaciari/socketify.py.git@main#egg=socketify +h11 \ No newline at end of file diff --git a/frameworks/Python/blacksheep/requirements-uvicorn.txt b/frameworks/Python/blacksheep/requirements-uvicorn.txt index 7a5c5d8140d..4784617228a 100644 --- a/frameworks/Python/blacksheep/requirements-uvicorn.txt +++ b/frameworks/Python/blacksheep/requirements-uvicorn.txt @@ -1,3 +1,7 @@ uvloop==0.21.0 -uvicorn==0.34.1 +uvicorn==0.34.2 +uvicorn-worker httptools==0.6.4 +gunicorn==23.0.0 +msgspec==0.19.0 +asyncpg==0.30.0 \ No newline at end of file diff --git a/frameworks/Python/blacksheep/requirements.txt b/frameworks/Python/blacksheep/requirements.txt index 9c83c9fad47..12af6e9f9b2 100644 --- a/frameworks/Python/blacksheep/requirements.txt +++ b/frameworks/Python/blacksheep/requirements.txt @@ -1,4 +1,3 @@ -asyncpg==0.30.0 Jinja2==3.1.6 -blacksheep==2.1.0 -msgspec==0.19.0 +blacksheep==2.3.1 +psycopg \ No newline at end of file diff --git a/frameworks/Python/blacksheep/start-unit.sh b/frameworks/Python/blacksheep/start-unit.sh old mode 100755 new mode 100644 index 9d2b923e166..016ee8c1020 --- a/frameworks/Python/blacksheep/start-unit.sh +++ b/frameworks/Python/blacksheep/start-unit.sh @@ -1,16 +1,18 @@ #!/usr/bin/env bash +CORE_COUNT=$(nproc) +sysctl -w net.core.somaxconn=65535 +sysctl -w net.ipv4.tcp_max_syn_backlog=65535 +ulimit -n 65535 +taskset -c 0-$(($CORE_COUNT-1)) unitd --no-daemon --control unix:/var/run/control.unit.sock & -NPROC=$(nproc) -sed "s/{{NPROC}}/$NPROC/" unit-config.template.json > nginx-unit-config.json - -unitd --no-daemon --control unix:/var/run/control.unit.sock & +# unitd --no-daemon --control unix:/var/run/control.unit.sock & # wait UNIT started sleep 1 # PUT configure curl -X PUT \ - --data-binary @nginx-unit-config.json \ + --data-binary @unit-config.json \ --unix-socket /var/run/control.unit.sock \ http://localhost/config diff --git a/frameworks/Python/blacksheep/unit-config.template.json b/frameworks/Python/blacksheep/unit-config.json similarity index 84% rename from frameworks/Python/blacksheep/unit-config.template.json rename to frameworks/Python/blacksheep/unit-config.json index ee02557db34..186d581296f 100644 --- a/frameworks/Python/blacksheep/unit-config.template.json +++ b/frameworks/Python/blacksheep/unit-config.json @@ -9,10 +9,10 @@ "type": "python", "path": "/blacksheep", "working_directory": "/blacksheep", + "processes": 14, "protocol": "asgi", "module": "app", - "callable": "app", - "processes": {{NPROC}} + "callable": "app" } }, "access_log": "/dev/null" From bcfee4a6ed8debb16ebe2cfba14ff60100eadd09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Fri, 30 May 2025 03:36:45 +0800 Subject: [PATCH 1463/1766] Upgrade hyperlane (#9920) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 30 +++++++++++++-------------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/config.toml | 7 +++++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 73b27cb721b..a0d3e927e05 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -655,15 +655,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.42.4" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1808d8983c7ca1d289188767327a24d3e6c0c6a741257745fd7fea9f8f7a7635" +checksum = "c206e4f9a9bc18a40b387ffdfee9b1204fb692da1eee32d35b6fa9f07447d960" [[package]] name = "http-type" -version = "4.5.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "033ac0e29073bd2c552b135a5074263d1cbf82d3ab8e05849aad867a78d5949a" +checksum = "e1323e4bed6c8f56bc77fdba9141121568cd1fb399ad48fea92919a85c5601e9" dependencies = [ "dashmap", "hex", @@ -681,9 +681,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "5.5.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c450649ce23878b5b0a757a4faf9ca1ca837ab9bae6c2b82cbc3e207d2f92fc5" +checksum = "61cb0781fcf47dc16788eb0b35854de2bc7a7d55432abf89d78f52b9fa2e5117" dependencies = [ "http-type", "lombok-macros", @@ -814,9 +814,9 @@ checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", @@ -830,9 +830,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" @@ -989,13 +989,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1489,9 +1489,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index be4adb20497..96514f0046a 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "5.5.1" +hyperlane = "5.8.0" hyperlane-utils = "0.5.0" rand = "0.9.1" serde = "1.0.219" diff --git a/frameworks/Rust/hyperlane/config.toml b/frameworks/Rust/hyperlane/config.toml index 3871bc56afe..598616e6b2e 100644 --- a/frameworks/Rust/hyperlane/config.toml +++ b/frameworks/Rust/hyperlane/config.toml @@ -2,10 +2,13 @@ name = "hyperlane" [main] -urls.plaintext = "/plaintext" urls.json = "/json" +urls.plaintext = "/plaintext" +urls.fortunes = "/fortunes" urls.db = "/db" -urls.query = "/queries?q=" +urls.query = "/query?q=" +urls.update = "/upda?q=" +urls.cached_query = "/cached-quer?c=" approach = "Realistic" classification = "Micro" database = "Postgres" From 155f7769deaf306cef350db28a75d36627e2b2c0 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 30 May 2025 11:58:58 -0400 Subject: [PATCH 1464/1766] [avaje-jex] tweak hikari settings (#9919) --- frameworks/Java/avaje-jex/pom.xml | 2 +- .../benchmark/repository/HikariFactory.java | 20 ++++++++++++++++--- .../benchmark/repository/JDBCDbService.java | 6 ++---- .../src/main/resources/application.properties | 2 +- .../src/main/resources/hikari.properties | 2 +- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/frameworks/Java/avaje-jex/pom.xml b/frameworks/Java/avaje-jex/pom.xml index acca218c0c6..39e68f6f800 100644 --- a/frameworks/Java/avaje-jex/pom.xml +++ b/frameworks/Java/avaje-jex/pom.xml @@ -58,7 +58,7 @@ org.postgresql postgresql - 42.7.5 + 42.7.6 diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java index 6b38d6f14a2..bcd9e24a1dd 100644 --- a/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/HikariFactory.java @@ -5,6 +5,7 @@ import io.avaje.config.Config; import io.avaje.inject.Bean; import io.avaje.inject.Factory; +import java.util.concurrent.Executors; import javax.sql.DataSource; @Factory @@ -22,8 +23,21 @@ DataSource dataSource() { maxPoolSize = Config.getInt("postgresDefaultPoolSize"); } - var hikari = new HikariDataSource(new HikariConfig("hikari.properties")); - hikari.setMaximumPoolSize(maxPoolSize); - return hikari; + maxPoolSize = Math.max(maxPoolSize, Runtime.getRuntime().availableProcessors() * 2); + HikariConfig hikariConfig = new HikariConfig("hikari.properties"); + + var vtThreadFactory = Thread.ofVirtual().factory(); + hikariConfig.setThreadFactory(vtThreadFactory); + hikariConfig.setScheduledExecutor( + Executors.newScheduledThreadPool(maxPoolSize, vtThreadFactory)); + + // data source properties + hikariConfig.addDataSourceProperty("cachePrepStmts", "true"); + hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250"); + hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + hikariConfig.addDataSourceProperty("ssl", "false"); + hikariConfig.addDataSourceProperty("tcpKeepAlive", "true"); + hikariConfig.setMaximumPoolSize(maxPoolSize); + return new HikariDataSource(hikariConfig); } } diff --git a/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java index a4d790d717d..8cf49d5223a 100644 --- a/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java +++ b/frameworks/Java/avaje-jex/src/main/java/benchmark/repository/JDBCDbService.java @@ -22,7 +22,7 @@ public JDBCDbService(DataSource connectionFactory) { } @Override - public List getWorld(int num) { + public List getWorld(int num) throws SQLException { String select = "select id, randomNumber from World where id = ?"; List worldList = new ArrayList<>(); @@ -37,8 +37,6 @@ public List getWorld(int num) { worldList.add(new World(rs.getInt("id"), rs.getInt("randomNumber"))); } } - } catch (SQLException e) { - throw new RuntimeException(e); } return worldList; @@ -55,7 +53,7 @@ public List getFortune() throws SQLException { ResultSet rs = pstm.executeQuery()) { while (rs.next()) { - fortuneList.add(new Fortune(rs.getInt("id"), rs.getString("message"))); + fortuneList.add(new Fortune(rs.getInt(1), rs.getString(2))); } fortuneList.add(new Fortune(defaultFortuneId, defaultFortuneMessage)); } diff --git a/frameworks/Java/avaje-jex/src/main/resources/application.properties b/frameworks/Java/avaje-jex/src/main/resources/application.properties index 804296ecc89..5976084e167 100644 --- a/frameworks/Java/avaje-jex/src/main/resources/application.properties +++ b/frameworks/Java/avaje-jex/src/main/resources/application.properties @@ -1,6 +1,6 @@ physicalTag=Citrine cloudTag=Azure -postgresPhysicalPoolSize=56 +postgresPhysicalPoolSize=64 postgresCloudPoolSize=16 postgresDefaultPoolSize=10 \ No newline at end of file diff --git a/frameworks/Java/avaje-jex/src/main/resources/hikari.properties b/frameworks/Java/avaje-jex/src/main/resources/hikari.properties index f859c5a8763..85001e992ba 100644 --- a/frameworks/Java/avaje-jex/src/main/resources/hikari.properties +++ b/frameworks/Java/avaje-jex/src/main/resources/hikari.properties @@ -1,4 +1,4 @@ -dataSourceClassName=org.postgresql.ds.PGSimpleDataSource +jdbcUrl=jdbc:postgresql://tfb-database:5432/hello_world dataSource.serverName=tfb-database dataSource.portNumber=5432 dataSource.user=benchmarkdbuser From 735cd6500a05011e937a406391f8b8e0f0189bfb Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Fri, 30 May 2025 05:59:11 -1000 Subject: [PATCH 1465/1766] update to tio-boot v1.9.7 (#9921) --- frameworks/Java/tio-boot/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index 78d109361d9..13cfd714d95 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -11,7 +11,7 @@ 1.8 ${java.version} ${java.version} - 1.9.5 + 1.9.7 com.litongjava.tio.http.server.MainApp From 08e68e4bd23f9f3fd3d586bdd3624e1b25398069 Mon Sep 17 00:00:00 2001 From: Luke Kuzmish <42181698+cosmastech@users.noreply.github.com> Date: Fri, 30 May 2025 12:17:53 -0400 Subject: [PATCH 1466/1766] (Laravel) - force updating to a new number (#9915) * Update Controller.php * ensure random int is valid --- frameworks/PHP/laravel/app/Http/Controllers/Controller.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/PHP/laravel/app/Http/Controllers/Controller.php b/frameworks/PHP/laravel/app/Http/Controllers/Controller.php index a2f98928316..bdc1312e3d4 100644 --- a/frameworks/PHP/laravel/app/Http/Controllers/Controller.php +++ b/frameworks/PHP/laravel/app/Http/Controllers/Controller.php @@ -52,7 +52,8 @@ public function updates($queries = 1) while ($queries--) { $row = World::query()->find(self::randomInt()); - $row->randomNumber = self::randomInt(); + while (($randomInt = self::randomInt()) === $row->randomNumber) {} + $row->randomNumber = $randomInt; $row->save(); $rows[] = $row; From 15e5ef238834615cc6e2a1db078601d3f63b8528 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jun 2025 05:24:22 +0000 Subject: [PATCH 1467/1766] Bump rack from 3.1.11 to 3.1.16 in /frameworks/Ruby/rack-sequel Bumps [rack](https://github.com/rack/rack) from 3.1.11 to 3.1.16. - [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.1.11...v3.1.16) --- updated-dependencies: - dependency-name: rack dependency-version: 3.1.16 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rack-sequel/Gemfile | 2 +- frameworks/Ruby/rack-sequel/Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index ed430b9168b..afb68002dc2 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' gem 'json', '~> 2.8' gem 'sequel', '~> 5.0' -gem 'rack', '~> 3.0' +gem 'rack', '~> 3.1' group :mysql, optional: true do gem 'mysql2', '~> 0.4', platforms: [:ruby, :mswin] diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 8c7db9aaa00..8b3ff5d109d 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -8,7 +8,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.11) + rack (3.1.16) sequel (5.90.0) bigdecimal sequel_pg (1.17.1) @@ -25,7 +25,7 @@ DEPENDENCIES mysql2 (~> 0.4) pg (~> 1.5) puma (~> 6.5) - rack (~> 3.0) + rack (~> 3.1) sequel (~> 5.0) sequel_pg (~> 1.6) From a1b5e6e993278c36031a69d4c9c9557f58376776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Sat, 7 Jun 2025 00:08:41 +0800 Subject: [PATCH 1468/1766] upgrade feat (#9925) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 适配最新版 * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade feat * upgrade feat * upgrade feat * upgrade feat --- frameworks/Java/smart-socket/pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index f16d0f03860..7cf9b85b3e7 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -20,13 +20,13 @@ tech.smartboot.feat feat-cloud-starter - 0.9.0 - - - io.github.smartboot.socket - aio-pro - 1.5.62-SNAPSHOT + 1.1.0-SNAPSHOT + + + + + tech.smartboot.servlet servlet-core From d84235d6e2d4e6d9b774fba03e2c1627848f60c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 00:55:08 +0000 Subject: [PATCH 1469/1766] Bump com.fasterxml.jackson.core:jackson-core Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.9.9 to 2.13.0. - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.9.9...jackson-core-2.13.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-version: 2.13.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/ninja-standalone/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/ninja-standalone/pom.xml b/frameworks/Java/ninja-standalone/pom.xml index 1c3aaafb7ee..3d199e2027e 100644 --- a/frameworks/Java/ninja-standalone/pom.xml +++ b/frameworks/Java/ninja-standalone/pom.xml @@ -51,7 +51,7 @@ com.fasterxml.jackson.core jackson-core - 2.9.9 + 2.13.0 com.fasterxml.jackson.module From f02224fd9317aff19f6c07258020b4833b945d41 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 9 Jun 2025 23:12:59 +0200 Subject: [PATCH 1470/1766] [php] Fix Phalcon and update with PHP/8.4 (#9937) --- frameworks/PHP/phalcon/phalcon-micro.dockerfile | 16 ++++++++-------- .../PHP/phalcon/phalcon-mongodb.dockerfile | 16 ++++++++-------- frameworks/PHP/phalcon/phalcon.dockerfile | 16 ++++++++-------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/frameworks/PHP/phalcon/phalcon-micro.dockerfile b/frameworks/PHP/phalcon/phalcon-micro.dockerfile index 31e405d1af6..8d1d0efd04d 100644 --- a/frameworks/PHP/phalcon/phalcon-micro.dockerfile +++ b/frameworks/PHP/phalcon/phalcon-micro.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.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 -y php-pear php8.4-dev > /dev/null +RUN mkdir -p /etc/php/8.4/fpm/conf.d +RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.4/fpm/conf.d/phalcon.ini RUN apt-get install -yqq nginx git unzip \ - php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/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.3-fpm start && \ +CMD service php8.4-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 e545aa8a4ed..6a2dcceeb19 100644 --- a/frameworks/PHP/phalcon/phalcon-mongodb.dockerfile +++ b/frameworks/PHP/phalcon/phalcon-mongodb.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.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 -y php-pear php8.4-dev > /dev/null +RUN mkdir -p /etc/php/8.4/fpm/conf.d +RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.4/fpm/conf.d/phalcon.ini RUN apt-get install -yqq nginx git unzip \ - php8.3-cli php8.3-fpm php8.3-mbstring php8.3-xml php8.3-mongodb > /dev/null + php8.4-cli php8.4-fpm php8.4-mbstring php8.4-xml php8.4-mongodb > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/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.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /phalcon/deploy/nginx.conf diff --git a/frameworks/PHP/phalcon/phalcon.dockerfile b/frameworks/PHP/phalcon/phalcon.dockerfile index b07d5433f5f..1e872839d97 100644 --- a/frameworks/PHP/phalcon/phalcon.dockerfile +++ b/frameworks/PHP/phalcon/phalcon.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -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.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 -y php-pear php8.4-dev > /dev/null +RUN mkdir -p /etc/php/8.4/fpm/conf.d +RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.4/fpm/conf.d/phalcon.ini RUN apt-get install -yqq nginx git unzip \ - php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml > /dev/null + php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/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.3/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.4/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.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /phalcon/deploy/nginx.conf From 9e334c56f5f98b6105661fc8c0f26f6e5124d226 Mon Sep 17 00:00:00 2001 From: nazo Date: Tue, 10 Jun 2025 05:13:18 +0800 Subject: [PATCH 1471/1766] [Python/Blacksheep] Adjust the number of single-process database connections in the `pypy` (#9936) * Adjust the number of single-process database connections in the `pypy` environment. * fix error --- frameworks/Python/blacksheep/app-socketify.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/Python/blacksheep/app-socketify.py b/frameworks/Python/blacksheep/app-socketify.py index 47ed2663804..a825b1596d0 100644 --- a/frameworks/Python/blacksheep/app-socketify.py +++ b/frameworks/Python/blacksheep/app-socketify.py @@ -13,8 +13,9 @@ WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=%s WHERE id=%s' ADDITIONAL_ROW = [0, "Additional fortune added at request time."] CORE_COUNT = multiprocessing.cpu_count() +MAX_DB_CONNECTIONS = 2000 -MAX_POOL_SIZE = CORE_COUNT * 2 +MAX_POOL_SIZE = min(CORE_COUNT * 2, MAX_DB_CONNECTIONS // CORE_COUNT, 32) MIN_POOL_SIZE = max(1, MAX_POOL_SIZE // 2) db_pool = None From 99c3e0ca413e5434e47af7d7ae38cdfe9a0c843b Mon Sep 17 00:00:00 2001 From: Sergey Kovalev Date: Tue, 10 Jun 2025 01:14:12 +0400 Subject: [PATCH 1472/1766] [aiohttp] - lower connection pool value (#9935) * [aiohttp] - lower connection pool value * [aiohttp] - reduce connection size to 2 --- frameworks/Python/aiohttp/app/main.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frameworks/Python/aiohttp/app/main.py b/frameworks/Python/aiohttp/app/main.py index f334f2ca8a2..a4defbc20c6 100644 --- a/frameworks/Python/aiohttp/app/main.py +++ b/frameworks/Python/aiohttp/app/main.py @@ -49,10 +49,11 @@ def pg_dsn(dialect=None) -> str: async def db_ctx(app: web.Application): # number of gunicorn workers = multiprocessing.cpu_count() as per gunicorn_conf.py # max_connections = 2000 as per toolset/setup/linux/databases/postgresql/postgresql.conf:64 - # give 10% leeway - max_size = min(1800 / multiprocessing.cpu_count(), 160) - max_size = max(int(max_size), 1) - min_size = max(int(max_size / 2), 1) + # since the world table contains only 10,000 rows, a large connection pool is unnecessary + # the server hardware provides 56 CPU cores producing high concurrency + # https://wiki.postgresql.org/wiki/Number_Of_Database_Connections + max_size = 2 + min_size = 2 print(f'connection pool: min size: {min_size}, max size: {max_size}, orm: {CONNECTION_ORM}') if CONNECTION_ORM: dsn = pg_dsn('asyncpg') From a1ca18ac4a7c306056e09da66ce2df23b78ad72f Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:14:39 -1000 Subject: [PATCH 1473/1766] upgrade to tio-boot v1.9.8 (#9933) * update to tio-boot v1.9.7 * upgrade to tio-boot v1.9.8 --- frameworks/Java/tio-boot/pom.xml | 2 +- .../tio/http/server/MainAppConfig.java | 7 +++--- .../{controller => handler}/CacheHandler.java | 2 +- .../{controller => handler}/DbHandler.java | 2 +- .../{controller => handler}/IndexHandler.java | 23 +++++++++---------- .../src/main/resources/app.properties | 4 +++- 6 files changed, 20 insertions(+), 20 deletions(-) rename frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/{controller => handler}/CacheHandler.java (96%) rename frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/{controller => handler}/DbHandler.java (98%) rename frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/{controller => handler}/IndexHandler.java (55%) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index 13cfd714d95..14b3116b5b1 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -11,7 +11,7 @@ 1.8 ${java.version} ${java.version} - 1.9.7 + 1.9.8 com.litongjava.tio.http.server.MainApp diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java index 2852e830fe4..eda7de88674 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java @@ -5,9 +5,9 @@ import com.litongjava.tio.http.server.config.EhCachePluginConfig; import com.litongjava.tio.http.server.config.EnjoyEngineConfig; import com.litongjava.tio.http.server.config.MysqlDbConfig; -import com.litongjava.tio.http.server.controller.CacheHandler; -import com.litongjava.tio.http.server.controller.DbHandler; -import com.litongjava.tio.http.server.controller.IndexHandler; +import com.litongjava.tio.http.server.handler.CacheHandler; +import com.litongjava.tio.http.server.handler.DbHandler; +import com.litongjava.tio.http.server.handler.IndexHandler; import com.litongjava.tio.http.server.router.HttpRequestRouter; import com.litongjava.tio.utils.environment.EnvUtils; @@ -38,7 +38,6 @@ public void config() throws Exception { TioBootServer server = TioBootServer.me(); HttpRequestRouter requestRouter = server.getRequestRouter(); if (requestRouter != null) { - requestRouter.add("/", controller::index); requestRouter.add("/plaintext", controller::plaintext); requestRouter.add("/json", controller::json); diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/CacheHandler.java similarity index 96% rename from frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java rename to frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/CacheHandler.java index c0d1f9c3066..ad11cc294ea 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/CacheHandler.java @@ -1,4 +1,4 @@ -package com.litongjava.tio.http.server.controller; +package com.litongjava.tio.http.server.handler; import java.util.ArrayList; import java.util.List; diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/DbHandler.java similarity index 98% rename from frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java rename to frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/DbHandler.java index 3ab48edeba2..603f4f2b96b 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/DbHandler.java @@ -1,4 +1,4 @@ -package com.litongjava.tio.http.server.controller; +package com.litongjava.tio.http.server.handler; import java.util.ArrayList; import java.util.Comparator; diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java similarity index 55% rename from frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java rename to frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java index 3dd0ba384b9..27047b7344f 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java @@ -1,38 +1,37 @@ -package com.litongjava.tio.http.server.controller; +package com.litongjava.tio.http.server.handler; import com.alibaba.fastjson2.JSON; import com.litongjava.tio.boot.http.TioRequestContext; -import com.litongjava.tio.http.common.HeaderName; -import com.litongjava.tio.http.common.HeaderValue; import com.litongjava.tio.http.common.HttpRequest; import com.litongjava.tio.http.common.HttpResponse; +import com.litongjava.tio.http.common.utils.MimeTypeUtils; import com.litongjava.tio.http.server.model.Message; -import com.litongjava.tio.http.server.util.Resps; /** * ab -k -n1000000 -c10 http://127.0.0.1:8080/json * ab -k -n1000000 -c10 http://127.0.0.1:8080/plaintext */ public class IndexHandler { + private static final String HELLO_WORLD_RN = "Hello, World!\r\n"; + private static final String HELLO_WORLD = "Hello, World!"; - private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD.getBytes(); - - public HttpResponse index(HttpRequest request) { - return Resps.txt(request, "tio-boot"); - } + private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD_RN.getBytes(); + private static byte[] JSON_BYTES = JSON.toJSONBytes(new Message(HELLO_WORLD)); public HttpResponse plaintext(HttpRequest request) { HttpResponse response = TioRequestContext.getResponse(); response.setBody(HELLO_WORLD_BYTES); - response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT); + String mimeTypeStr = MimeTypeUtils.getTextUTF8(); + response.setContentType(mimeTypeStr); return response; } public HttpResponse json(HttpRequest request) { HttpResponse response = TioRequestContext.getResponse(); - response.setBody(JSON.toJSONBytes(new Message(HELLO_WORLD))); - response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON); + response.setBody(JSON_BYTES); + String mimeTypeStr = MimeTypeUtils.getJsonUTF8(); + response.setContentType(mimeTypeStr); return response; } } \ No newline at end of file diff --git a/frameworks/Java/tio-boot/src/main/resources/app.properties b/frameworks/Java/tio-boot/src/main/resources/app.properties index 52083ea13ff..1c202a1c753 100644 --- a/frameworks/Java/tio-boot/src/main/resources/app.properties +++ b/frameworks/Java/tio-boot/src/main/resources/app.properties @@ -6,4 +6,6 @@ server.port=8080 JDBC_URL=jdbc:mysql://tfb-database/hello_world JDBC_USER=benchmarkdbuser -JDBC_PSWD=benchmarkdbpass \ No newline at end of file +JDBC_PSWD=benchmarkdbpass + +#--tio.core.diagnostic=true --server.http.request.printPacket=true \ No newline at end of file From d6fc514fc172d158efed5753496560804789f4e1 Mon Sep 17 00:00:00 2001 From: Sergey Kovalev Date: Tue, 10 Jun 2025 01:15:33 +0400 Subject: [PATCH 1474/1766] [aiohttp] - use batch updates (#9932) --- frameworks/Python/aiohttp/app/views.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/frameworks/Python/aiohttp/app/views.py b/frameworks/Python/aiohttp/app/views.py index e52d4255744..91366d66eb7 100644 --- a/frameworks/Python/aiohttp/app/views.py +++ b/frameworks/Python/aiohttp/app/views.py @@ -27,6 +27,7 @@ def json_response(payload): READ_SELECT_ORM = select(World.randomnumber).where(World.id == bindparam("id")) READ_FORTUNES_ORM = select(Fortune.id, Fortune.message) WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$2 WHERE id=$1' +WRITE_ROW_BATCH_SQL = 'UPDATE "world" w SET "randomnumber"=u.new_val FROM (SELECT unnest($1::int[]) as id, unnest($2::int[]) as new_val) u WHERE w.id = u.id' template_path = Path(__file__).parent / 'templates' / 'fortune.jinja' template = jinja2.Template(template_path.read_text()) @@ -155,15 +156,20 @@ async def updates_raw(request): num_queries = get_num_queries(request) update_ids = sample(range(1, 10001), num_queries) update_ids.sort() - fetch_params = tuple((i, ) for i in update_ids) - updates = tuple(zip(update_ids, sample(range(1, 10001), num_queries))) - worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] + + numbers = sample(range(1, 10001), num_queries) + fetch_params = [(i,) for i in update_ids] + row_updates = [*zip(update_ids, numbers)] async with request.app['pg'].acquire() as conn: # the result of this is the int previous random number which we don't actually use await conn.executemany(READ_ROW_SQL, fetch_params) - await conn.executemany(WRITE_ROW_SQL, updates) + if num_queries <= 5: + await conn.executemany(WRITE_ROW_SQL, row_updates) + else: + await conn.execute(WRITE_ROW_BATCH_SQL, update_ids, numbers) + worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in row_updates] return json_response(worlds) From 25f66f181cde3a478f978714525455040f8929a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 21:15:36 +0000 Subject: [PATCH 1475/1766] Bump com.fasterxml.jackson.core:jackson-core Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.9.9 to 2.13.0. - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.9.9...jackson-core-2.13.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-version: 2.13.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/activeweb/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/activeweb/pom.xml b/frameworks/Java/activeweb/pom.xml index 25171d2d172..ea329127a18 100644 --- a/frameworks/Java/activeweb/pom.xml +++ b/frameworks/Java/activeweb/pom.xml @@ -115,7 +115,7 @@ com.fasterxml.jackson.core jackson-core - 2.9.9 + 2.13.0 com.fasterxml.jackson.core From a56307a1f8be8d3c5cabb55f5eb172ee734c0e74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Tue, 10 Jun 2025 05:16:00 +0800 Subject: [PATCH 1476/1766] Upgrade hyperlane (#9923) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 694 +++++++++++++++++- frameworks/Rust/hyperlane/Cargo.toml | 4 +- .../Rust/hyperlane/src/request_middleware.rs | 4 +- frameworks/Rust/hyperlane/src/route.rs | 24 +- frameworks/Rust/hyperlane/src/server.rs | 4 +- 5 files changed, 682 insertions(+), 48 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index a0d3e927e05..7913099f1c0 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -2,6 +2,182 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "foldhash", + "futures-core", + "http", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand 0.9.1", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "derive_more", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "tracing", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "addr2line" version = "0.24.2" @@ -30,6 +206,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -51,6 +236,15 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "atoi" version = "2.0.0" @@ -156,6 +350,15 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "bytestring" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +dependencies = [ + "bytes", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -164,9 +367,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chunkify" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db978867c272fae07fdf73dddfa74c8e276f9b94cd1a55c676a786e9e54e678" +checksum = "97b2709f42d3cc45eda703223726b05afd42c36f2642e2d292deee1c31b86c69" dependencies = [ "dashmap", "file-operation", @@ -177,9 +380,9 @@ dependencies = [ [[package]] name = "clonelicious" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d51b119ca46e37c21508debf8d9823521be05a70e32ee5afc7695ae1cfb4ec" +checksum = "fd646e01c20889af081dc20be3aeea14aaaeb87f60f68799483ad716baa33020" [[package]] name = "color-output" @@ -294,6 +497,47 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "digest" version = "0.10.7" @@ -332,6 +576,15 @@ dependencies = [ "serde", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -376,6 +629,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", + "libz-rs-sys", "miniz_oxide", ] @@ -399,6 +653,12 @@ dependencies = [ "spin", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foldhash" version = "0.1.5" @@ -416,9 +676,9 @@ dependencies = [ [[package]] name = "future-fn" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a60fa5df978d3b02f58da08ae2e47d2bb8b19f765a693eaa9e5e8045b3925d" +checksum = "472364b0e6f990c5d86b3fb5d99003898ae88af155b82575d6ca67ef554a9426" [[package]] name = "futures" @@ -605,9 +865,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -642,6 +902,23 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "hot-restart" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35c1ce67dc1d078f54ea1ed5293a49f11d63ff3a03b71c046319c31c9e4d243" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-compress" version = "2.13.5" @@ -655,15 +932,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.43.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c206e4f9a9bc18a40b387ffdfee9b1204fb692da1eee32d35b6fa9f07447d960" +checksum = "ebb606af516873026d106412e1f2e3e4ca5d72d5ac1ff97d66169c5bc88eef91" [[package]] name = "http-type" -version = "4.7.0" +version = "4.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1323e4bed6c8f56bc77fdba9141121568cd1fb399ad48fea92919a85c5601e9" +checksum = "181fe4966e416ce9c4213b76423c1fc1e2b16799bd2765fc791d7c063b7eb9ad" dependencies = [ "dashmap", "hex", @@ -674,45 +951,67 @@ dependencies = [ "serde-xml-rs", "serde_json", "serde_urlencoded", - "std-macro-extensions", "tokio", "url", ] +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyperlane" -version = "5.8.0" +version = "5.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cb0781fcf47dc16788eb0b35854de2bc7a7d55432abf89d78f52b9fa2e5117" +checksum = "0ac6e7a9b7f17fd6f10200ffa9d28a6cb4bb468efb5c85dbfa5d3a226882e0c8" dependencies = [ "http-type", + "hyperlane-macros", "lombok-macros", + "regex", "serde", ] [[package]] name = "hyperlane-broadcast" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d10d26d30398580d6e5535a1f706507aeaa069a30f9959b5299dc066a112a396" +checksum = "7764d7256c4a54e929d2d82176108a718b2493ec982b353e382971b1fa02707e" dependencies = [ "dashmap", - "lombok-macros", "tokio", ] [[package]] name = "hyperlane-log" -version = "1.16.9" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e822ed456ed2b07e3d038ed2275cabcce56651110bebb20c7d3fd699ce5c4602" +checksum = "b2a07f72a789eaed32a981cd3f60c5ca10643e23ba7cfb715a9a835cb58cc5d4" dependencies = [ "file-operation", "hyperlane-time", - "lombok-macros", "tokio", ] +[[package]] +name = "hyperlane-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1339da89521c5caaf64be0f44ae82a22421d10c5571dfcd460de56cde4f711a7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "hyperlane-time" version = "0.5.5" @@ -721,9 +1020,9 @@ checksum = "c145707425cdd097e117e8b4ee8baeaf8eb265658a5c37d2c4aa0b24fd26a507" [[package]] name = "hyperlane-utils" -version = "0.5.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435663d62a9b1cc9f41fa8d89448f8eae8bfe68016b3cefd8106526d3fd59993" +checksum = "d67677b6cd6fc734fc97c1e732b219f47416f7d45049dcb8db8f583cd8731a38" dependencies = [ "ahash", "bin-encode-decode", @@ -735,6 +1034,7 @@ dependencies = [ "future-fn", "futures", "hex", + "hot-restart", "hyperlane-broadcast", "hyperlane-log", "log", @@ -749,9 +1049,13 @@ dependencies = [ "serde_urlencoded", "server-manager", "simd-json", + "std-macro-extensions", "twox-hash", "url", "urlencoding", + "utoipa", + "utoipa-rapidoc", + "utoipa-swagger-ui", ] [[package]] @@ -872,6 +1176,12 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + [[package]] name = "indexmap" version = "2.9.0" @@ -880,6 +1190,7 @@ checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.3", + "serde", ] [[package]] @@ -898,6 +1209,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + [[package]] name = "lazy_static" version = "1.5.0" @@ -929,12 +1246,38 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +dependencies = [ + "zlib-rs", +] + [[package]] name = "litemap" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + [[package]] name = "lock_api" version = "0.4.12" @@ -953,9 +1296,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lombok-macros" -version = "1.11.4" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cee2ce690915c2b491c9ea0d2d8e3daa3e30bcc55cc15fd9297b2566c4522e" +checksum = "8233f6e95093f205641478acbae36ebed40d71f6e89329ce92c0d3345aeb15a0" dependencies = [ "proc-macro2", "quote", @@ -978,6 +1321,22 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.8.8" @@ -994,6 +1353,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -1015,6 +1375,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.46" @@ -1047,9 +1413,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -1162,6 +1528,12 @@ dependencies = [ "zerovec", ] +[[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.21" @@ -1266,11 +1638,10 @@ dependencies = [ [[package]] name = "recoverable-thread-pool" -version = "2.3.7" +version = "2.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47914cafb04d7ac1e20031c17f7831c282d7ed730c86be0480c4db6347b339c5" +checksum = "61323b7a7b470393e0a2ef3383ac50c2e19012b4aacea1101051a7cf8dc593fc" dependencies = [ - "lombok-macros", "recoverable-spawn", "tokio", ] @@ -1304,6 +1675,41 @@ dependencies = [ "syn", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "rsa" version = "0.9.8" @@ -1324,6 +1730,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust-embed" +version = "8.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -1336,6 +1776,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[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 = "scopeguard" version = "1.2.0" @@ -1353,9 +1802,9 @@ dependencies = [ [[package]] name = "serde-xml-rs" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176b7ff880ab6ead7a020e773e9c096467fe347615a3e22ac29300cbdef67a5d" +checksum = "53630160a98edebde0123eb4dfd0fce6adff091b2305db3154a9e920206eb510" dependencies = [ "log", "serde", @@ -1400,9 +1849,9 @@ dependencies = [ [[package]] name = "server-manager" -version = "3.2.4" +version = "3.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6936d74a2263590ed722bdf27315b693b8a84a5dffdb3b47a9b7c0a7b50396b" +checksum = "44ef1cee6952595d4726b88ffbb1535f123955c0af5c2dbf508c643efc684c94" dependencies = [ "tokio", ] @@ -1448,6 +1897,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simd-json" version = "0.15.1" @@ -1712,9 +2167,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "std-macro-extensions" -version = "0.23.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa17898d2c4216a85ad32abd51101b6eab0adef954ed1393c4557ba378625ade" +checksum = "a35e64ebd4e130e82fbcd036b66007e97ab95803080c51286cf6ec5cf9c7d546" [[package]] name = "stringprep" @@ -1795,6 +2250,37 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tinystr" version = "0.8.1" @@ -1860,6 +2346,19 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "tracing" version = "0.1.41" @@ -1907,6 +2406,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -1934,6 +2439,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "url" version = "2.5.4" @@ -1957,6 +2468,66 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utoipa" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435c6f69ef38c9017b4b4eea965dfb91e71e53d869e896db40d1cf2441dd75c0" +dependencies = [ + "indexmap", + "serde", + "serde_json", + "utoipa-gen", +] + +[[package]] +name = "utoipa-gen" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77d306bc75294fd52f3e99b13ece67c02c1a2789190a6f31d32f736624326f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "utoipa-rapidoc" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5f8f5abd341cce16bb4f09a8bafc087d4884a004f25fb980e538d51d6501dab" +dependencies = [ + "actix-web", + "serde", + "serde_json", + "utoipa", +] + +[[package]] +name = "utoipa-swagger-ui" +version = "9.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" +dependencies = [ + "actix-web", + "base64", + "mime_guess", + "regex", + "rust-embed", + "serde", + "serde_json", + "url", + "utoipa", + "utoipa-swagger-ui-vendored", + "zip", +] + +[[package]] +name = "utoipa-swagger-ui-vendored" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2eebbbfe4093922c2b6734d7c679ebfebd704a0d7e56dfcb0d05818ce28977d" + [[package]] name = "value-trait" version = "0.11.0" @@ -1981,6 +2552,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2069,6 +2650,15 @@ dependencies = [ "wasite", ] +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -2341,3 +2931,35 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zip" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" +dependencies = [ + "arbitrary", + "crc32fast", + "flate2", + "indexmap", + "memchr", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" + +[[package]] +name = "zopfli" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 96514f0046a..21ac6cb9400 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,8 +18,8 @@ exclude = [ ] [dependencies] -hyperlane = "5.8.0" -hyperlane-utils = "0.5.0" +hyperlane = "5.27.2" +hyperlane-utils = "0.17.0" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 2550aa4b5fe..2c598f982b2 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -1,11 +1,13 @@ use super::*; pub async fn request(ctx: Context) { - ctx.set_response_header(CONNECTION, CONNECTION_KEEP_ALIVE) + ctx.set_response_header(CONNECTION, KEEP_ALIVE) .await .set_response_header(SERVER, HYPERLANE) .await .set_response_header(DATE, gmt()) + .await + .set_response_status_code(200) .await; #[cfg(feature = "plaintext")] { diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 46442ce2137..1eaa40d61d7 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -5,19 +5,23 @@ pub async fn json(ctx: Context) { "message": RESPONSEDATA_STR }); let _ = ctx - .send_response(200, serde_json::to_string(&json).unwrap_or_default()) + .set_response_body(serde_json::to_string(&json).unwrap_or_default()) + .await + .send() .await; } pub async fn plaintext(ctx: Context) { - let _ = ctx.send_response(200, RESPONSEDATA_BIN).await; + let _ = ctx.set_response_body(RESPONSEDATA_BIN).await.send().await; } pub async fn db(ctx: Context) { let db_connection: &DbPoolConnection = get_db_connection(); let query_row: QueryRow = random_world_row(db_connection).await; let _ = ctx - .send_response(200, serde_json::to_string(&query_row).unwrap_or_default()) + .set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) + .await + .send() .await; } @@ -32,7 +36,9 @@ pub async fn query(ctx: Context) { let db_pool: &DbPoolConnection = get_db_connection(); let data: Vec = get_some_row_id(queries, db_pool).await; let _ = ctx - .send_response(200, serde_json::to_string(&data).unwrap_or_default()) + .set_response_body(serde_json::to_string(&data).unwrap_or_default()) + .await + .send() .await; } @@ -52,7 +58,7 @@ pub async fn fortunes(ctx: Context) { )); fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); let res: String = FortunesTemplate::new(fortunes_list).to_string(); - let _ = ctx.send_response(200, res).await; + let _ = ctx.set_response_body(res).await.send().await; } pub async fn update(ctx: Context) { @@ -65,7 +71,9 @@ pub async fn update(ctx: Context) { .max(1); let res: Vec = update_world_rows(queries).await; let _ = ctx - .send_response(200, serde_json::to_string(&res).unwrap_or_default()) + .set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .await + .send() .await; } @@ -79,6 +87,8 @@ pub async fn cached_query(ctx: Context) { .max(1); let res: Vec = CACHE.iter().take(count as usize).cloned().collect(); let _ = ctx - .send_response(200, serde_json::to_string(&res).unwrap_or_default()) + .set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .await + .send() .await; } diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 5e17c60d4ed..9a9cf7544e4 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -17,9 +17,9 @@ async fn init_server() { server.port(8080).await; server.disable_linger().await; server.disable_nodelay().await; - server.error_handle(|_: String| {}).await; + server.error_handler(|_: String| {}).await; server.http_line_buffer_size(256).await; - server.websocket_buffer_size(256).await; + server.ws_buffer_size(256).await; server.request_middleware(request_middleware::request).await; #[cfg(any(feature = "dev", feature = "plaintext"))] server.route("/plaintext", route::plaintext).await; From f3000dda09000fc9312320b38aaefd54ae7d1541 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:45:03 +0000 Subject: [PATCH 1477/1766] Bump org.postgresql:postgresql in /frameworks/Java/jooby Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 3b6edfc79ec..6942156ba5c 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -14,7 +14,7 @@ 3.4.0 4.1.113.Final 2.0.2 - 42.7.4 + 42.7.7 UTF-8 22 22 From 9f8a58e4af3ea2efc8f2a2b1f5cbd2a40b91ff19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:56:32 +0000 Subject: [PATCH 1478/1766] Bump org.postgresql:postgresql in /frameworks/Java/solon Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/solon/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml index 30701fd2661..bd21bbd75df 100644 --- a/frameworks/Java/solon/pom.xml +++ b/frameworks/Java/solon/pom.xml @@ -62,7 +62,7 @@ org.postgresql postgresql - 42.7.4 + 42.7.7 From 16ee4d66a14dea35179e2ee6c840194a379220a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 13:04:47 -0700 Subject: [PATCH 1479/1766] Bump requests from 2.32.0 to 2.32.4 in /frameworks/Python/api_hour (#9940) Bumps [requests](https://github.com/psf/requests) from 2.32.0 to 2.32.4. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.0...v2.32.4) --- updated-dependencies: - dependency-name: requests dependency-version: 2.32.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- 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 8da47e213a8..c5edffe9b2d 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -11,7 +11,7 @@ MarkupSafe==0.23 piprot==0.9.1 psycopg2==2.7.5 PyYAML==5.4 -requests==2.32.0 +requests==2.32.4 requests-futures==0.9.5 setproctitle==1.1.8 ujson==1.33 From 8da5eeb21f6b5ae369d5424e089fdb4d5318b223 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 11 Jun 2025 22:11:18 +0200 Subject: [PATCH 1480/1766] [php] OpenSwoole update to PHP/8.4 (#9943) --- frameworks/PHP/openswoole/openswoole-no-async.dockerfile | 2 +- frameworks/PHP/openswoole/openswoole.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/PHP/openswoole/openswoole-no-async.dockerfile b/frameworks/PHP/openswoole/openswoole-no-async.dockerfile index 98b24e1c497..73762687883 100644 --- a/frameworks/PHP/openswoole/openswoole-no-async.dockerfile +++ b/frameworks/PHP/openswoole/openswoole-no-async.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.3-cli +FROM php:8.4-cli RUN apt-get update && apt-get install -y git > /dev/null diff --git a/frameworks/PHP/openswoole/openswoole.dockerfile b/frameworks/PHP/openswoole/openswoole.dockerfile index f4f57e78a2d..d9d89845e54 100644 --- a/frameworks/PHP/openswoole/openswoole.dockerfile +++ b/frameworks/PHP/openswoole/openswoole.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.3-cli +FROM php:8.4-cli RUN apt-get update && apt-get install -y git > /dev/null From d64e84dc9e4359492d7350c8712279d85ca3eacf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Thu, 12 Jun 2025 04:11:42 +0800 Subject: [PATCH 1481/1766] Upgrade hyperlane (#9941) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 90 ++++++++++++++-------------- frameworks/Rust/hyperlane/Cargo.toml | 4 +- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 7913099f1c0..4b1dd261d27 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -189,9 +189,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" @@ -283,9 +283,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.7.3" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bin-encode-decode" @@ -334,9 +334,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "byteorder" @@ -361,9 +361,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chunkify" @@ -624,9 +624,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "libz-rs-sys", @@ -827,7 +827,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" dependencies = [ - "hashbrown 0.15.3", + "hashbrown 0.15.4", "serde", ] @@ -839,9 +839,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -854,7 +854,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.3", + "hashbrown 0.15.4", ] [[package]] @@ -938,9 +938,9 @@ checksum = "ebb606af516873026d106412e1f2e3e4ca5d72d5ac1ff97d66169c5bc88eef91" [[package]] name = "http-type" -version = "4.21.1" +version = "4.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "181fe4966e416ce9c4213b76423c1fc1e2b16799bd2765fc791d7c063b7eb9ad" +checksum = "c58eb9dcf3a7358d389f79229c64ef0d999199b238dabfb5737e831430effcad" dependencies = [ "dashmap", "hex", @@ -969,9 +969,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyperlane" -version = "5.27.2" +version = "5.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ac6e7a9b7f17fd6f10200ffa9d28a6cb4bb468efb5c85dbfa5d3a226882e0c8" +checksum = "928a96f22386c7101f2902beedb5856a8d298938670c370c1306c0f574f5d66d" dependencies = [ "http-type", "hyperlane-macros", @@ -1003,9 +1003,9 @@ dependencies = [ [[package]] name = "hyperlane-macros" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1339da89521c5caaf64be0f44ae82a22421d10c5571dfcd460de56cde4f711a7" +checksum = "b7fcc6733516b988a4d09e02aa61af142341ce937894f4a93f39d71355be69cd" dependencies = [ "proc-macro2", "quote", @@ -1020,9 +1020,9 @@ checksum = "c145707425cdd097e117e8b4ee8baeaf8eb265658a5c37d2c4aa0b24fd26a507" [[package]] name = "hyperlane-utils" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d67677b6cd6fc734fc97c1e732b219f47416f7d45049dcb8db8f583cd8731a38" +checksum = "ebe33ccb4333deb4f3bb5f101cdc944dc04a7e238e78934e4162029dfc33ef84" dependencies = [ "ahash", "bin-encode-decode", @@ -1189,7 +1189,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "serde", ] @@ -1248,9 +1248,9 @@ dependencies = [ [[package]] name = "libz-rs-sys" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" dependencies = [ "zlib-rs", ] @@ -1280,9 +1280,9 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -1339,9 +1339,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] @@ -1444,9 +1444,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1454,9 +1454,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -1935,9 +1935,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] @@ -2000,7 +2000,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "hashlink", "indexmap", "log", @@ -2373,9 +2373,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" dependencies = [ "proc-macro2", "quote", @@ -2384,20 +2384,20 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] [[package]] name = "twox-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" +checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56" dependencies = [ - "rand 0.8.5", + "rand 0.9.1", ] [[package]] @@ -2948,9 +2948,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" +checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" [[package]] name = "zopfli" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 21ac6cb9400..c01d0687a19 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,8 +18,8 @@ exclude = [ ] [dependencies] -hyperlane = "5.27.2" -hyperlane-utils = "0.17.0" +hyperlane = "5.29.0" +hyperlane-utils = "0.17.1" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } From 4db9e4f47ce2d663d9e378c867289561d3c4592c Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Wed, 11 Jun 2025 21:12:52 +0100 Subject: [PATCH 1482/1766] Update httpserver (#9930) Lift java version -> 25 Use VirtualTaskPerThreadExecutor --- frameworks/Java/httpserver/httpserver-postgres.dockerfile | 6 +++--- frameworks/Java/httpserver/httpserver.dockerfile | 6 +++--- .../Java/httpserver/src/main/java/benchmarks/Server.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Java/httpserver/httpserver-postgres.dockerfile b/frameworks/Java/httpserver/httpserver-postgres.dockerfile index f9441b41a27..c45944e5fe6 100644 --- a/frameworks/Java/httpserver/httpserver-postgres.dockerfile +++ b/frameworks/Java/httpserver/httpserver-postgres.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3-eclipse-temurin-24-alpine as maven WORKDIR /httpserver COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:25-jdk-slim WORKDIR /httpserver COPY --from=maven /httpserver/target/httpserver-1.0-jar-with-dependencies.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "app.jar", "postgres"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-jar", "app.jar", "postgres"] diff --git a/frameworks/Java/httpserver/httpserver.dockerfile b/frameworks/Java/httpserver/httpserver.dockerfile index 9e85735fed8..01aaecc935c 100644 --- a/frameworks/Java/httpserver/httpserver.dockerfile +++ b/frameworks/Java/httpserver/httpserver.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3-eclipse-temurin-24-alpine as maven WORKDIR /httpserver COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:25-jdk-slim WORKDIR /httpserver COPY --from=maven /httpserver/target/httpserver-1.0-jar-with-dependencies.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "app.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java index 60893b4ba2e..9f40faafc2e 100755 --- a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java +++ b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java @@ -132,7 +132,7 @@ public static void main(String[] args) throws Exception { System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "DEBUG"); // create server HttpServer server = HttpServer.create(new InetSocketAddress(port), 1024 * 8); - server.setExecutor(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())); + server.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); // add context handlers server.createContext("/plaintext", createPlaintextHandler()); server.createContext("/json", createJSONHandler()); From cb37ac57d390c1fe8a18108fc23b7431430b74be Mon Sep 17 00:00:00 2001 From: rio Date: Tue, 17 Jun 2025 06:34:20 +0900 Subject: [PATCH 1483/1766] [javascript/just-js] Update 0.1.8 to 0.1.13 (#9947) --- frameworks/JavaScript/just/just.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/JavaScript/just/just.dockerfile b/frameworks/JavaScript/just/just.dockerfile index 9410a4d6c9b..74f5c90902e 100644 --- a/frameworks/JavaScript/just/just.dockerfile +++ b/frameworks/JavaScript/just/just.dockerfile @@ -1,11 +1,11 @@ -FROM debian:buster-slim AS pre-build +FROM debian:bookworm-slim as pre-build RUN apt update RUN apt upgrade -y RUN apt install -y g++ curl make tar gzip libfindbin-libs-perl FROM pre-build AS builder WORKDIR /build -RUN sh -c "$(curl -sSL https://raw.githubusercontent.com/just-js/just/0.1.8/install.sh)" +RUN sh -c "$(curl -sSL https://raw.githubusercontent.com/just-js/just/0.1.13/install.sh)" RUN make -C just install ENV JUST_HOME=/build/just ENV JUST_TARGET=/build/just From 5f109a0ec561f256f9899d2751cc446b42eca5e4 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Mon, 16 Jun 2025 22:35:21 +0100 Subject: [PATCH 1484/1766] Add ring-http-exchange (#9948) --- .../Clojure/ring-http-exchange/README.md | 17 +++ .../ring-http-exchange/benchmark_config.json | 47 ++++++ frameworks/Clojure/ring-http-exchange/pom.xml | 140 ++++++++++++++++++ .../ring-http-exchange-robaho.dockerfile | 13 ++ .../ring-http-exchange.dockerfile | 13 ++ .../src/ring_http_exchange/benchmark.clj | 29 ++++ 6 files changed, 259 insertions(+) create mode 100755 frameworks/Clojure/ring-http-exchange/README.md create mode 100755 frameworks/Clojure/ring-http-exchange/benchmark_config.json create mode 100644 frameworks/Clojure/ring-http-exchange/pom.xml create mode 100644 frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile create mode 100644 frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile create mode 100644 frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj diff --git a/frameworks/Clojure/ring-http-exchange/README.md b/frameworks/Clojure/ring-http-exchange/README.md new file mode 100755 index 00000000000..66d19f7ef4e --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/README.md @@ -0,0 +1,17 @@ +# ring-http-exchange Benchmarking Test + +## Test Type Implementation Source Code +* [JSON](src/ring_http_exchange/benchmark.clj) +* [PLAINTEXT](src/ring_http_exchange/benchmark.clj) + +## Important Libraries +The tests were run with: +* [ring-http-exchange](https://github.com/ruroru/ring-http-exchange) +* [jsonista](https://github.com/metosin/jsonista) + +## Test URLs +### JSON +http://localhost:8080/json + +### PLAINTEXT +http://localhost:8080/plaintext diff --git a/frameworks/Clojure/ring-http-exchange/benchmark_config.json b/frameworks/Clojure/ring-http-exchange/benchmark_config.json new file mode 100755 index 00000000000..bca6c16a2cb --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/benchmark_config.json @@ -0,0 +1,47 @@ +{ + "framework": "ring-http-exchange", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Clojure", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ring-http-exchange", + "notes": "", + "versus": "httpserver" + } + }, + { + "robaho": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Clojure", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ring-http-exchange-robaho", + "notes": "", + "versus": "ring-http-exchange" + } + } + ] +} diff --git a/frameworks/Clojure/ring-http-exchange/pom.xml b/frameworks/Clojure/ring-http-exchange/pom.xml new file mode 100644 index 00000000000..e51d9d5f4c5 --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/pom.xml @@ -0,0 +1,140 @@ + + + 4.0.0 + ring-http-server + ring-http-server + jar + 1.0.0 + ring-http-server + + + EPL-2.0 + https://www.eclipse.org/legal/epl-2.0/ + + + + java + java-test + + + resources + + + + + resources + + + target + target\classes + + + com.theoryinpractise + clojure-maven-plugin + 1.8.3 + true + + + compile-clojure + compile + + compile + + + + test-clojure + test + + test + + + + + + src/ + + + + + maven-assembly-plugin + + + + ring_http_exchange.benchmark + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + + central + https://repo1.maven.org/maven2/ + + false + + + true + + + + clojars + https://repo.clojars.org/ + + true + + + true + + + + + + + + + org.clojure + clojure + 1.11.1 + + + org.clojars.jj + ring-http-exchange + 1.1.0 + + + metosin + jsonista + 0.3.13 + + + + + robaho + + false + + + + io.github.robaho + httpserver + 1.0.23 + + + + + diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile new file mode 100644 index 00000000000..55be60f11f4 --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3-eclipse-temurin-24-alpine as maven +WORKDIR /ring-http-exchange +COPY pom.xml pom.xml +COPY src src +RUN mvn clean clojure:compile -P robaho package + +FROM openjdk:25-jdk-slim +WORKDIR /ring-http-exchange +COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile new file mode 100644 index 00000000000..fe3b450b87a --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3-eclipse-temurin-24-alpine as maven +WORKDIR /ring-http-exchange +COPY pom.xml pom.xml +COPY src src +RUN mvn clean clojure:compile package + +FROM openjdk:25-jdk-slim +WORKDIR /ring-http-exchange +COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj new file mode 100644 index 00000000000..1f7c448e279 --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj @@ -0,0 +1,29 @@ +(ns ring-http-exchange.benchmark + (:gen-class) + (:require [jsonista.core :as json] + [ring-http-exchange.core :as server]) + (:import + (java.util.concurrent Executors))) + +(def ^:private ^:const json-headers {"Server" "ring-http-exchange" + "Content-Type" "application/json"}) +(def ^:private ^:const plaintext-response + {:status 200 + :headers { + "Server" "ring-http-exchange" + "Content-Type" "text/plain"} + :body "Hello, World!"}) + +(defn -main + [& args] + (println "Starting server on port 8080") + (server/run-http-server + (fn [req] + (case (req :uri) + "/json" {:status 200 + :headers json-headers + :body (json/write-value-as-bytes {:message "Hello, World!"})} + plaintext-response)) + {:port 8080 + :host "0.0.0.0" + :executor (Executors/newVirtualThreadPerTaskExecutor)})) From d68cba9c533709e06ef802cc5e16b8532dd7bdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Tue, 17 Jun 2025 05:35:46 +0800 Subject: [PATCH 1485/1766] upgrade feat (#9949) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 适配最新版 * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade feat * upgrade feat * upgrade feat * upgrade feat * upgrade feat --- .../main/java/org/smartboot/http/MultipleQueriesHandler.java | 4 ++-- .../src/main/java/org/smartboot/http/UpdateHandler.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java index 3ead0475962..07147048a34 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java @@ -1,7 +1,7 @@ package org.smartboot.http; -import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.common.FeatUtils; import tech.smartboot.feat.core.server.HttpHandler; import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; @@ -31,7 +31,7 @@ public void handle(HttpRequest httpRequest, CompletableFuture completableF HttpResponse response = httpRequest.getResponse(); Thread.startVirtualThread(() -> { try { - int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); + int queries = Math.min(Math.max(FeatUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500); World[] worlds = new World[queries]; try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) { diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java index b2b37a5f424..85d990a71b4 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java @@ -1,7 +1,7 @@ package org.smartboot.http; -import tech.smartboot.feat.core.common.utils.NumberUtils; +import tech.smartboot.feat.core.common.FeatUtils; import tech.smartboot.feat.core.server.HttpHandler; import tech.smartboot.feat.core.server.HttpRequest; import tech.smartboot.feat.core.server.HttpResponse; @@ -29,7 +29,7 @@ public UpdateHandler(DataSource dataSource) { @Override public void handle(HttpRequest request) throws IOException { HttpResponse response = request.getResponse(); - int queries = Math.min(Math.max(NumberUtils.toInt(request.getParameter("queries"), 1), 1), 500); + int queries = Math.min(Math.max(FeatUtils.toInt(request.getParameter("queries"), 1), 1), 500); World[] worlds = new World[queries]; StringJoiner updateSql = new StringJoiner( ", ", From c304a3fbd5747ba4490f98564297c26b134f3d78 Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Tue, 17 Jun 2025 05:36:10 +0800 Subject: [PATCH 1486/1766] update swoole version to 6.0.2 (#9951) --- frameworks/PHP/swoole/swoole-async-mysql.dockerfile | 10 +++------- frameworks/PHP/swoole/swoole-async-postgres.dockerfile | 10 +++------- frameworks/PHP/swoole/swoole-sync-mysql.dockerfile | 10 +++------- frameworks/PHP/swoole/swoole-sync-postgres.dockerfile | 10 +++------- 4 files changed, 12 insertions(+), 28 deletions(-) diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index 14c0e7ce62a..632481846ba 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -11,14 +11,10 @@ RUN apt update -yqq > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ && apt install git libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-dev -y > /dev/null \ - && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ - && cd /tmp/swoole-src/ && git checkout feat_llhttp \ - && phpize > /dev/null \ - && ./configure > /dev/null \ - && make -j "$(nproc)" > /dev/null \ - && make install > /dev/null \ + && pecl install swoole > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini \ + && php --ri swoole WORKDIR /swoole diff --git a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile index a37608ef746..ed6bdd36f5d 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -11,14 +11,10 @@ RUN apt update -yqq > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ && apt install git libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-dev libpq-dev -y > /dev/null \ - && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ - && cd /tmp/swoole-src/ && git checkout feat_llhttp \ - && phpize > /dev/null \ - && ./configure --enable-swoole-pgsql > /dev/null \ - && make -j "$(nproc)" > /dev/null \ - && make install > /dev/null \ + && pecl install -D 'enable-swoole-pgsql="yes"' swoole > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini \ + && php --ri swoole WORKDIR /swoole diff --git a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile index c845b22b5e6..fa92ac2d197 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -11,14 +11,10 @@ RUN apt update -yqq > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ && apt install git libbrotli-dev php8.4-cli php8.4-pdo-mysql php8.4-dev -y > /dev/null \ - && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ - && cd /tmp/swoole-src/ && git checkout feat_llhttp \ - && phpize > /dev/null \ - && ./configure > /dev/null \ - && make -j "$(nproc)" > /dev/null \ - && make install > /dev/null \ + && pecl install swoole > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini \ + && php --ri swoole WORKDIR /swoole diff --git a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile index eab86dbe337..f27393f8ddd 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -11,14 +11,10 @@ RUN apt update -yqq > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ && apt install git libbrotli-dev php8.4-cli php8.4-pdo-pgsql php8.4-dev libpq-dev -y > /dev/null \ - && cd /tmp && git clone https://github.com/swoole/swoole-src.git \ - && cd /tmp/swoole-src/ && git checkout feat_llhttp \ - && phpize > /dev/null \ - && ./configure > /dev/null \ - && make -j "$(nproc)" > /dev/null \ - && make install > /dev/null \ + && pecl install swoole > /dev/null \ && echo "extension=swoole.so" > /etc/php/8.4/cli/conf.d/50-swoole.ini \ - && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini + && echo "memory_limit=1024M" >> /etc/php/8.4/cli/php.ini \ + && php --ri swoole WORKDIR /swoole From fc5ad274d3c4cc56680defbf00a46105264b76ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 22:44:36 +0000 Subject: [PATCH 1487/1766] Bump org.clojure:clojure in /frameworks/Clojure/ring-http-exchange Bumps [org.clojure:clojure](https://github.com/clojure/clojure) from 1.11.1 to 1.11.2. - [Changelog](https://github.com/clojure/clojure/blob/master/changes.md) - [Commits](https://github.com/clojure/clojure/compare/clojure-1.11.1...clojure-1.11.2) --- updated-dependencies: - dependency-name: org.clojure:clojure dependency-version: 1.11.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Clojure/ring-http-exchange/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Clojure/ring-http-exchange/pom.xml b/frameworks/Clojure/ring-http-exchange/pom.xml index e51d9d5f4c5..2c0f037dc44 100644 --- a/frameworks/Clojure/ring-http-exchange/pom.xml +++ b/frameworks/Clojure/ring-http-exchange/pom.xml @@ -109,7 +109,7 @@ org.clojure clojure - 1.11.1 + 1.11.2 org.clojars.jj From 95ffec9030a685c03fad76ab4f7d497b6605468a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 22:44:36 +0000 Subject: [PATCH 1488/1766] Bump org.postgresql:postgresql in /frameworks/Java/avaje-jex Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.6 to 42.7.7. - [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.7.6...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/avaje-jex/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/avaje-jex/pom.xml b/frameworks/Java/avaje-jex/pom.xml index 39e68f6f800..4ede9b91c6a 100644 --- a/frameworks/Java/avaje-jex/pom.xml +++ b/frameworks/Java/avaje-jex/pom.xml @@ -58,7 +58,7 @@ org.postgresql postgresql - 42.7.6 + 42.7.7 From 3aa401e4cc7b5039df7b70ed557d7ba7e3aa9147 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:36:23 +0100 Subject: [PATCH 1489/1766] Upgrade jdk for voovan and wicket to 25 (#9954) * update wicket to jdk 25 * Update voovan jdk to 25 --------- Co-authored-by: jj --- frameworks/Java/voovan/pom.xml | 4 +- frameworks/Java/voovan/voovan.dockerfile | 13 +- frameworks/Java/wicket/pom.xml | 240 +++++++++++------------ frameworks/Java/wicket/resin.xml | 8 +- frameworks/Java/wicket/wicket.dockerfile | 13 +- 5 files changed, 145 insertions(+), 133 deletions(-) diff --git a/frameworks/Java/voovan/pom.xml b/frameworks/Java/voovan/pom.xml index fec86f88048..853624578a2 100644 --- a/frameworks/Java/voovan/pom.xml +++ b/frameworks/Java/voovan/pom.xml @@ -6,8 +6,8 @@ 0.1 UTF-8 - 11 - 11 + 17 + 17 org.voovan.VoovanTFB diff --git a/frameworks/Java/voovan/voovan.dockerfile b/frameworks/Java/voovan/voovan.dockerfile index 61160d45d63..2ffcb0dbcfc 100644 --- a/frameworks/Java/voovan/voovan.dockerfile +++ b/frameworks/Java/voovan/voovan.dockerfile @@ -1,11 +1,11 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3-eclipse-temurin-24-alpine as maven WORKDIR /voovan COPY pom.xml pom.xml COPY src src COPY config/framework.properties config/framework.properties RUN mvn package -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:25-ea-slim-bullseye WORKDIR /voovan COPY --from=maven /voovan/target/voovan-bench-0.1-jar-with-dependencies.jar app.jar COPY --from=maven /voovan/config/framework.properties config/framework.properties @@ -24,5 +24,12 @@ CMD java -DCheckTimeout=false \ -XX:+AlwaysPreTouch \ -XX:-RestrictContended \ -XX:+UseParallelGC -XX:+UseNUMA \ - -XX:+AggressiveOpts -XX:+UseBiasedLocking \ + --add-opens java.base/java.lang=ALL-UNNAMED \ + --add-opens java.base/java.util=ALL-UNNAMED \ + --add-opens java.base/java.io=ALL-UNNAMED \ + --add-opens java.base/java.nio=ALL-UNNAMED \ + --add-opens java.base/sun.nio.ch=ALL-UNNAMED \ + --add-opens java.base/java.security=ALL-UNNAMED \ + --add-opens java.base/java.util.concurrent=ALL-UNNAMED \ + --add-opens java.base/java.net=ALL-UNNAMED \ -cp ./config:voovan.jar:app.jar org.voovan.VoovanTFB diff --git a/frameworks/Java/wicket/pom.xml b/frameworks/Java/wicket/pom.xml index b7f4576382c..a27fab91670 100644 --- a/frameworks/Java/wicket/pom.xml +++ b/frameworks/Java/wicket/pom.xml @@ -1,128 +1,128 @@ - 4.0.0 - hellowicket - hellowicket - war - 1.0 - Hello Wicket - Wicket project for the TechEmpower Benchmark - - TechEmpower - https://github.com/TechEmpower/FrameworkBenchmarks - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - UTF-8 - 11 - 11 - 2.13.0 - 1.7.25 - 9.19.0 - - - - - org.apache.wicket - wicket-core - ${wicket.version} - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + 4.0.0 + hellowicket + hellowicket + war + 1.0 + Hello Wicket + Wicket project for the TechEmpower Benchmark + + TechEmpower + https://github.com/TechEmpower/FrameworkBenchmarks + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + 17 + 17 + UTF-8 + 2.13.0 + 1.7.25 + 9.19.0 + + + + + org.apache.wicket + wicket-core + ${wicket.version} + - - - com.zaxxer - HikariCP - 5.0.0 - compile - + + + com.zaxxer + HikariCP + 5.0.0 + compile + - - - org.slf4j - slf4j-simple - ${slf4j.version} - + + + org.slf4j + slf4j-simple + ${slf4j.version} + - - com.fasterxml.jackson.module - jackson-module-afterburner - ${jackson.version} - + + com.fasterxml.jackson.module + jackson-module-afterburner + ${jackson.version} + - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + - - mysql - mysql-connector-java - 8.0.28 - - - - - - false - src/main/resources - - - false - src/main/java - - ** - - - **/*.java - - - - - - false - src/test/resources - - - false - src/test/java - - ** - - - **/*.java - - - - - - true - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - false - - - - + + mysql + mysql-connector-java + 8.0.28 + + + + + + false + src/main/resources + + + false + src/main/java + + ** + + + **/*.java + + + + + + false + src/test/resources + + + false + src/test/java + + ** + + + **/*.java + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + false + + + + - - - Apache Nexus - https://repository.apache.org/content/repositories/snapshots/ - - false - - - true - - - + + + Apache Nexus + https://repository.apache.org/content/repositories/snapshots/ + + false + + + true + + + diff --git a/frameworks/Java/wicket/resin.xml b/frameworks/Java/wicket/resin.xml index 5041ba51e4f..090bd3d200d 100755 --- a/frameworks/Java/wicket/resin.xml +++ b/frameworks/Java/wicket/resin.xml @@ -2,12 +2,12 @@ xmlns:resin="http://caucho.com/ns/resin/core"> - - - + + + - + diff --git a/frameworks/Java/wicket/wicket.dockerfile b/frameworks/Java/wicket/wicket.dockerfile index 0ab0578b1ea..3106bd3c480 100644 --- a/frameworks/Java/wicket/wicket.dockerfile +++ b/frameworks/Java/wicket/wicket.dockerfile @@ -1,16 +1,21 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3-eclipse-temurin-24-alpine as maven WORKDIR /wicket COPY src src COPY pom.xml pom.xml RUN mvn compile war:war -q -FROM openjdk:11.0.3-jdk-stretch +FROM alpine/curl:8.1.2 as curl +WORKDIR /wicket +RUN curl -sL http://caucho.com/download/resin-4.0.61.tar.gz >resin.tar.gz + +FROM openjdk:25-ea-slim-bullseye WORKDIR /resin -RUN curl -sL http://caucho.com/download/resin-4.0.61.tar.gz | tar xz --strip-components=1 +COPY --from=curl /wicket/resin.tar.gz . +RUN tar xzf ./resin.tar.gz --strip-components=1 RUN rm -rf webapps/* COPY --from=maven /wicket/target/hellowicket-1.0.war webapps/ROOT.war COPY resin.xml conf/resin.xml EXPOSE 8080 -CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "lib/resin.jar", "console"] +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseParallelGC", "-jar", "lib/resin.jar", "console"] From d91be88805f924833acd464e22f227d5901d386f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Wed, 18 Jun 2025 00:36:39 +0800 Subject: [PATCH 1490/1766] Upgrade hyperlane (#9955) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 8 ++++---- frameworks/Rust/hyperlane/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 4b1dd261d27..2028572a382 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -969,9 +969,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyperlane" -version = "5.29.0" +version = "5.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928a96f22386c7101f2902beedb5856a8d298938670c370c1306c0f574f5d66d" +checksum = "6f38700888cb6e0bf54e6bd30d963c40d3f9a91afb4dbe148ab7b2a53e63d1e7" dependencies = [ "http-type", "hyperlane-macros", @@ -1003,9 +1003,9 @@ dependencies = [ [[package]] name = "hyperlane-macros" -version = "0.1.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7fcc6733516b988a4d09e02aa61af142341ce937894f4a93f39d71355be69cd" +checksum = "2321a4e27d729efe345507e1cfb6573881ce1f568e65f927b8115a55ad9b08f5" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index c01d0687a19..db535708c39 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ ] [dependencies] -hyperlane = "5.29.0" +hyperlane = "5.30.1" hyperlane-utils = "0.17.1" rand = "0.9.1" serde = "1.0.219" From f271aa1c028cc24546a678dad7d876c703e45d54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 19:47:53 +0000 Subject: [PATCH 1491/1766] Bump pg-promise from 10.7.3 to 11.5.5 in /frameworks/JavaScript/express Bumps [pg-promise](https://github.com/vitaly-t/pg-promise) from 10.7.3 to 11.5.5. - [Release notes](https://github.com/vitaly-t/pg-promise/releases) - [Commits](https://github.com/vitaly-t/pg-promise/compare/10.7.3...11.5.5) --- updated-dependencies: - dependency-name: pg-promise dependency-version: 11.5.5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/express/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 9f022f3ac69..143da144588 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -10,7 +10,7 @@ "mongoose": "8.9.5", "mysql2": "3.9.8", "pg": "8.5.0", - "pg-promise": "10.7.3", + "pg-promise": "11.5.5", "pug": "3.0.3", "postgres": "^3.4.3", "slow-json-stringify": "^2.0.1", From 16d4fa630880c7cc1578d72496a1cde44193bff2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 19:55:49 +0000 Subject: [PATCH 1492/1766] Bump org.postgresql:postgresql in /frameworks/Kotlin/kooby Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 4ff8df958da..f89e3b85bf6 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -13,7 +13,7 @@ 3.3.0 - 42.7.4 + 42.7.7 UTF-8 22 22 From 941dca55b6c270129cfc14cc4744f024623d4832 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:00:23 +0000 Subject: [PATCH 1493/1766] Bump github.com/go-chi/chi/v5 in /frameworks/Go/chi/src/chi-sjson Bumps [github.com/go-chi/chi/v5](https://github.com/go-chi/chi) from 5.2.1 to 5.2.2. - [Release notes](https://github.com/go-chi/chi/releases) - [Changelog](https://github.com/go-chi/chi/blob/master/CHANGELOG.md) - [Commits](https://github.com/go-chi/chi/compare/v5.2.1...v5.2.2) --- updated-dependencies: - dependency-name: github.com/go-chi/chi/v5 dependency-version: 5.2.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/chi/src/chi-sjson/go.mod | 2 +- frameworks/Go/chi/src/chi-sjson/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/chi/src/chi-sjson/go.mod b/frameworks/Go/chi/src/chi-sjson/go.mod index 24337489ee9..6c250386303 100644 --- a/frameworks/Go/chi/src/chi-sjson/go.mod +++ b/frameworks/Go/chi/src/chi-sjson/go.mod @@ -3,7 +3,7 @@ module chi/server go 1.23.1 require ( - github.com/go-chi/chi/v5 v5.2.1 + github.com/go-chi/chi/v5 v5.2.2 github.com/go-sql-driver/mysql v1.9.1 ) diff --git a/frameworks/Go/chi/src/chi-sjson/go.sum b/frameworks/Go/chi/src/chi-sjson/go.sum index 383118b55e6..f5cb6c06e7f 100644 --- a/frameworks/Go/chi/src/chi-sjson/go.sum +++ b/frameworks/Go/chi/src/chi-sjson/go.sum @@ -1,6 +1,6 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8= -github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= +github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= From 5709a307ee25a42c11b820b7333979d5ad6e0cc0 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Tue, 24 Jun 2025 02:25:18 +0500 Subject: [PATCH 1494/1766] ntex: Update bench tweaks (#9958) * ntex: Update bench tweaks * fix * wip * wip * wip * wip --- frameworks/Rust/ntex/Cargo.toml | 11 +++--- frameworks/Rust/ntex/src/db.rs | 62 ++++++++++++--------------------- 2 files changed, 28 insertions(+), 45 deletions(-) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index e4b476f46cd..a4baf02318f 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -67,10 +67,10 @@ neon = ["ntex/neon"] neon-uring = ["ntex/neon-uring"] [dependencies] -ntex = "2.12" -ntex-compio = "0.2" -ntex-neon = "0.1.13" -ntex-net = "2.5.9" +ntex = "2.13" +ntex-compio = "0.3" +ntex-neon = "0.1.31" +ntex-net = "2.5.27" 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"] } @@ -80,7 +80,8 @@ env_logger = "0.11" nanorand = { version = "0.7", default-features = false, features = ["std", "wyrand", "tls"] } atoi = "2.0" futures = "0.3" -sonic-rs = "0.4.0" +sonic-rs = "0.5.1" +smallvec = "1.15" serde = { version = "1", features = ["derive"] } serde_json = "1" log = { version = "0.4", features = ["release_max_level_off"] } diff --git a/frameworks/Rust/ntex/src/db.rs b/frameworks/Rust/ntex/src/db.rs index da33f1f6c35..a85b137139c 100644 --- a/frameworks/Rust/ntex/src/db.rs +++ b/frameworks/Rust/ntex/src/db.rs @@ -1,9 +1,8 @@ -#![allow(clippy::uninit_vec)] -use std::{borrow::Cow, cell::RefCell, fmt::Write as FmtWrite}; +use std::{borrow::Cow, cell::RefCell}; use nanorand::{Rng, WyRand}; use ntex::util::{Bytes, BytesMut}; -use tokio_postgres::types::ToSql; +use smallvec::SmallVec; use tokio_postgres::{connect, Client, Statement}; use yarte::TemplateBytesTrait; @@ -33,7 +32,7 @@ pub struct PgConnection { fortune: Statement, world: Statement, rng: WyRand, - updates: Vec, + updates: Statement, buf: RefCell, fbuf: RefCell>, } @@ -48,24 +47,7 @@ impl PgConnection { }); let fortune = cl.prepare("SELECT * FROM fortune").await.unwrap(); - let mut updates = Vec::new(); - for num in 1..=500u16 { - let mut pl: u16 = 1; - let mut q = String::new(); - q.push_str("UPDATE world SET randomnumber = CASE id "); - for _ in 1..=num { - let _ = write!(&mut q, "when ${} then ${} ", pl, pl + 1); - pl += 2; - } - q.push_str("ELSE randomnumber END WHERE id IN ("); - for _ in 1..=num { - let _ = write!(&mut q, "${},", pl); - pl += 1; - } - q.pop(); - q.push(')'); - updates.push(cl.prepare(&q).await.unwrap()); - } + let updates = cl.prepare("UPDATE world w SET randomnumber = u.new_val FROM (SELECT unnest($1::int[]) as id, unnest($2::int[]) as new_val) u WHERE w.id = u.id").await.unwrap(); let world = cl.prepare("SELECT * FROM world WHERE id=$1").await.unwrap(); PgConnection { @@ -124,30 +106,30 @@ impl PgConnection { pub async fn update(&self, num: usize) -> Bytes { let mut rng = nanorand::tls_rng(); - let mut queries = Vec::with_capacity(num); + let mut ids = Vec::with_capacity(num); + let mut numbers = Vec::with_capacity(num); + let mut worlds = SmallVec::<[_; 32]>::new(); + let mut queries = SmallVec::<[_; 32]>::new(); + (0..num).for_each(|_| { let w_id = (rng.generate::() % 10_000 + 1) as i32; - queries.push(self.cl.query_one(&self.world, &[&w_id])); + ids.push(w_id); + numbers.push((rng.generate::() % 10_000 + 1) as i32); }); + ids.sort(); - let mut worlds = Vec::with_capacity(num); - for fut in queries.into_iter() { - let row = fut.await.unwrap(); + (0..num).for_each(|idx| { worlds.push(World { - id: row.get(0), - randomnumber: (rng.generate::() % 10_000 + 1) as i32, + id: ids[idx], + randomnumber: numbers[idx], }); - } - - let mut params: Vec<&dyn ToSql> = Vec::with_capacity(num * 3); - for w in &worlds { - params.push(&w.id); - params.push(&w.randomnumber); - } - for w in &worlds { - params.push(&w.id); - } - let _ = self.cl.query(&self.updates[num - 1], ¶ms).await; + queries.push(self.cl.query_one(&self.world, &[&ids[idx]])); + }); + let _ = self + .cl + .query(&self.updates, &[&ids, &numbers]) + .await + .unwrap(); let mut body = self.buf.borrow_mut(); utils::reserve(&mut body, 2 * 1024); From 0eb6214cfa520d818c69639d3664e0c2590ee5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Tue, 24 Jun 2025 05:25:38 +0800 Subject: [PATCH 1495/1766] Upgrade hyperlane (#9959) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update & fortune * feat: randomNumber * feat: max row 500 * feat: update * feat: Fortune * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 83 ++++++++++++++-------------- frameworks/Rust/hyperlane/Cargo.toml | 4 +- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 2028572a382..6d7e6f52551 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -256,9 +256,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" @@ -798,7 +798,7 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] @@ -865,9 +865,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -932,15 +932,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebb606af516873026d106412e1f2e3e4ca5d72d5ac1ff97d66169c5bc88eef91" +checksum = "67f8cf4294ddfe85d2c2058f33caa9c82baa153a5826c293b2254ca293e6c11c" [[package]] name = "http-type" -version = "4.22.1" +version = "4.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58eb9dcf3a7358d389f79229c64ef0d999199b238dabfb5737e831430effcad" +checksum = "21c518bd37e8924bad5bd524382827cb29f9d7e2e37c825bf6f5bebeb54830c2" dependencies = [ "dashmap", "hex", @@ -969,9 +969,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyperlane" -version = "5.30.1" +version = "5.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f38700888cb6e0bf54e6bd30d963c40d3f9a91afb4dbe148ab7b2a53e63d1e7" +checksum = "57b4662b7605f3d7d16d96389740c0844f0b7b122d523439b8340dd3c3a1de4a" dependencies = [ "http-type", "hyperlane-macros", @@ -1020,9 +1020,9 @@ checksum = "c145707425cdd097e117e8b4ee8baeaf8eb265658a5c37d2c4aa0b24fd26a507" [[package]] name = "hyperlane-utils" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe33ccb4333deb4f3bb5f101cdc944dc04a7e238e78934e4162029dfc33ef84" +checksum = "98bd421d7b580ddbca85a490f08973ead09b3dd3ac778d3a1cf5b3fe41599d86" dependencies = [ "ahash", "bin-encode-decode", @@ -1226,9 +1226,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libm" @@ -1317,9 +1317,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "mime" @@ -1354,7 +1354,7 @@ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -1563,9 +1563,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -1648,9 +1648,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags", ] @@ -1766,9 +1766,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "ryu" @@ -1926,12 +1926,9 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" @@ -2190,9 +2187,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.101" +version = "2.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" dependencies = [ "proc-macro2", "quote", @@ -2373,9 +2370,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -2470,9 +2467,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utoipa" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435c6f69ef38c9017b4b4eea965dfb91e71e53d869e896db40d1cf2441dd75c0" +checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" dependencies = [ "indexmap", "serde", @@ -2482,9 +2479,9 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77d306bc75294fd52f3e99b13ece67c02c1a2789190a6f31d32f736624326f7" +checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" dependencies = [ "proc-macro2", "quote", @@ -2564,9 +2561,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -2854,18 +2851,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index db535708c39..128c0258641 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,8 +18,8 @@ exclude = [ ] [dependencies] -hyperlane = "5.30.1" -hyperlane-utils = "0.17.1" +hyperlane = "5.32.1" +hyperlane-utils = "0.18.0" rand = "0.9.1" serde = "1.0.219" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } From adfc1ff75b440c64e71b4ba2b25757aae0f5c084 Mon Sep 17 00:00:00 2001 From: Kayden <143221653+Kayden1412@users.noreply.github.com> Date: Tue, 24 Jun 2025 04:26:14 +0700 Subject: [PATCH 1496/1766] [Zig] Update ZZZ (#9962) * update zig to 0.14.1 and fix date formating issue on day < 10 * fix(Zig/ZZZ): tar and mv cmd * Update zzz.dockerfile * Update zzz.dockerfile --- frameworks/Zig/zzz/build.zig.zon | 4 +- frameworks/Zig/zzz/src/main.zig | 66 +++++++++++++++++++------------ frameworks/Zig/zzz/zzz.dockerfile | 1 - 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/frameworks/Zig/zzz/build.zig.zon b/frameworks/Zig/zzz/build.zig.zon index 8147f5750a0..58f2a17b2b1 100644 --- a/frameworks/Zig/zzz/build.zig.zon +++ b/frameworks/Zig/zzz/build.zig.zon @@ -5,8 +5,8 @@ .minimum_zig_version = "0.14.0", .dependencies = .{ .zzz = .{ - .url = "git+https://github.com/tardy-org/zzz#90cc62494644e7234efd85ab1df5d65440f9eead", - .hash = "zzz-0.3.0-4HoaJqpQAgDgcImt8cC2cpT59J25JNDynMDt4qLaXDYK", + .url = "git+https://github.com/tardy-org/zzz#18ec7f1129ce4d0573b7c67f011b4d05c7b195d4", + .hash = "zzz-0.3.0-4HoaJrBQAgCXB_66nre0nvYZmAXMxj__gS8sFjpR68Hs", }, }, .paths = .{ diff --git a/frameworks/Zig/zzz/src/main.zig b/frameworks/Zig/zzz/src/main.zig index a3d51bf4225..bfe20def8a0 100644 --- a/frameworks/Zig/zzz/src/main.zig +++ b/frameworks/Zig/zzz/src/main.zig @@ -1,13 +1,11 @@ const std = @import("std"); - +const builtin = @import("builtin"); const zzz = @import("zzz"); const http = zzz.HTTP; - const tardy = zzz.tardy; const Tardy = tardy.Tardy(.auto); const Runtime = tardy.Runtime; const Socket = tardy.Socket; - const Server = http.Server; const Router = http.Router; const Context = http.Context; @@ -21,25 +19,18 @@ pub fn main() !void { const host: []const u8 = "0.0.0.0"; const port: u16 = 8080; - const date_thread = try std.Thread.spawn(.{}, struct { - fn a() !void { - while (true) { - var d = http.Date.init(std.time.timestamp()); - const http_date = d.to_http_date(); - _ = try http_date.into_buf(date[0..]); - std.time.sleep(std.time.ns_per_ms * 985); - } - } - }.a, .{}); - - date_thread.detach(); - var gpa = std.heap.GeneralPurposeAllocator(.{}){}; - defer if (gpa.deinit() == .leak) { - @panic("Memory leak has occurred!"); + + const allocator, const is_debug = switch (builtin.mode) { + .Debug, .ReleaseSafe => .{ gpa.allocator(), true }, + .ReleaseSmall, .ReleaseFast => .{ std.heap.smp_allocator, false }, }; - const allocator = gpa.allocator(); + defer { + if (is_debug and gpa.deinit() == .leak) { + @panic("Memory leak has occurred!"); + } + } var t = try Tardy.init(allocator, .{ .threading = .all, @@ -47,8 +38,8 @@ pub fn main() !void { defer t.deinit(); var router = try Router.init(allocator, &.{ - Route.init("/plaintext").get({}, home_handler).layer(), - Route.init("/json").get({}, json_handler).layer(), + Route.init("/plaintext").get({}, homeHandler).layer(), + Route.init("/json").get({}, jsonHandler).layer(), }, .{}); defer router.deinit(allocator); @@ -66,6 +57,7 @@ pub fn main() !void { EntryParams{ .router = &router, .socket = socket }, struct { fn entry(rt: *Runtime, p: EntryParams) !void { + if (rt.id == 0) try rt.spawn(.{rt}, updateDate, 1024 * 1024 * 4); var server = Server.init(.{ .capture_count_max = 0, }); @@ -75,24 +67,48 @@ pub fn main() !void { ); } -pub fn home_handler(ctx: *const Context, _: void) !Respond { +pub fn homeHandler(ctx: *const Context, _: void) !Respond { return ctx.response.apply(.{ .mime = http.Mime.TEXT, .body = "Hello, World!", .status = .OK, .headers = &.{ - .{"Date", try ctx.allocator.dupe(u8, date[0..])}, + .{ "Date", try ctx.allocator.dupe(u8, date[0..]) }, }, }); } -pub fn json_handler(ctx: *const Context, _: void) !Respond { +pub fn jsonHandler(ctx: *const Context, _: void) !Respond { return ctx.response.apply(.{ .mime = http.Mime.JSON, .body = try std.json.stringifyAlloc(ctx.allocator, Message{ .message = "Hello, World!" }, .{}), .status = .OK, .headers = &.{ - .{"Date", try ctx.allocator.dupe(u8, date[0..])}, + .{ "Date", try ctx.allocator.dupe(u8, date[0..]) }, }, }); } + +pub fn updateDate(rt: *Runtime) !void { + const format = std.fmt.comptimePrint( + "{s}, {s} {s} {s} {s}:{s}:{s} GMT", + .{ + "{[day_name]s}", + "{[day]d:0>2}", + "{[month]s}", + "{[year]d}", + "{[hour]d:0>2}", + "{[minute]d:0>2}", + "{[second]d:0>2}", + }, + ); + while (true) { + var d = http.Date.init(std.time.timestamp()); + + const http_date = d.to_http_date(); + + _ = try std.fmt.bufPrint(&date, format, http_date); + + try tardy.Timer.delay(rt, .{ .nanos = std.time.ns_per_ms * 900 }); + } +} diff --git a/frameworks/Zig/zzz/zzz.dockerfile b/frameworks/Zig/zzz/zzz.dockerfile index 135445cadfa..514196a7497 100644 --- a/frameworks/Zig/zzz/zzz.dockerfile +++ b/frameworks/Zig/zzz/zzz.dockerfile @@ -26,7 +26,6 @@ COPY build.zig.zon build.zig.zon USER ziguser RUN zig build -Doptimize=ReleaseFast -Dcpu=native -RUN ls FROM debian:12-slim From 08f3725296fba11088ce1205027081ad3bf00e85 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Mon, 23 Jun 2025 22:26:42 +0100 Subject: [PATCH 1497/1766] uplift jetty to v12 (#9963) Uplift ring-http-exchange to 1.2.0 Co-authored-by: jj --- frameworks/Clojure/ring-http-exchange/pom.xml | 2 +- .../Java/jetty/jetty-servlet.dockerfile | 4 +- frameworks/Java/jetty/jetty.dockerfile | 4 +- frameworks/Java/jetty/pom.xml | 22 +++---- .../java/hello/handler/HelloWebServer.java | 57 +++++++------------ .../main/java/hello/handler/JsonHandler.java | 49 ++++++++-------- .../java/hello/handler/PlainTextHandler.java | 36 ++++++------ .../hello/servlet/HelloWebServerServlet.java | 6 +- .../main/java/hello/servlet/JsonServlet.java | 18 +++--- .../java/hello/servlet/PlaintextServlet.java | 15 ++--- 10 files changed, 98 insertions(+), 115 deletions(-) diff --git a/frameworks/Clojure/ring-http-exchange/pom.xml b/frameworks/Clojure/ring-http-exchange/pom.xml index 2c0f037dc44..bee1ed47c88 100644 --- a/frameworks/Clojure/ring-http-exchange/pom.xml +++ b/frameworks/Clojure/ring-http-exchange/pom.xml @@ -114,7 +114,7 @@ org.clojars.jj ring-http-exchange - 1.1.0 + 1.2.0 metosin diff --git a/frameworks/Java/jetty/jetty-servlet.dockerfile b/frameworks/Java/jetty/jetty-servlet.dockerfile index 764c2eb58bc..a352022e489 100644 --- a/frameworks/Java/jetty/jetty-servlet.dockerfile +++ b/frameworks/Java/jetty/jetty-servlet.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3-eclipse-temurin-24-alpine as maven WORKDIR /jetty COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -P servlet -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:25-jdk-slim WORKDIR /jetty COPY --from=maven /jetty/target/jetty-example-0.1-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/jetty/jetty.dockerfile b/frameworks/Java/jetty/jetty.dockerfile index f8ff4d716d2..15c208ef4e8 100644 --- a/frameworks/Java/jetty/jetty.dockerfile +++ b/frameworks/Java/jetty/jetty.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3-eclipse-temurin-24-alpine as maven WORKDIR /jetty COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:25-jdk-slim WORKDIR /jetty COPY --from=maven /jetty/target/jetty-example-0.1-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/jetty/pom.xml b/frameworks/Java/jetty/pom.xml index 6156c5603f8..ee615b85538 100644 --- a/frameworks/Java/jetty/pom.xml +++ b/frameworks/Java/jetty/pom.xml @@ -9,9 +9,9 @@ UTF-8 - 11 - 11 - 10.0.24 + 21 + 21 + 12.0.22 hello.handler.HelloWebServer @@ -23,8 +23,8 @@ - org.eclipse.jetty - jetty-server + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} @@ -34,7 +34,7 @@ true org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.14.0 hello/servlet/** @@ -52,14 +52,14 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} - com.sun.activation - jakarta.activation - 1.2.1 + jakarta.activation + jakarta.activation-api + 2.1.3 diff --git a/frameworks/Java/jetty/src/main/java/hello/handler/HelloWebServer.java b/frameworks/Java/jetty/src/main/java/hello/handler/HelloWebServer.java index 85e63461518..0d76a933bef 100644 --- a/frameworks/Java/jetty/src/main/java/hello/handler/HelloWebServer.java +++ b/frameworks/Java/jetty/src/main/java/hello/handler/HelloWebServer.java @@ -1,29 +1,15 @@ package hello.handler; -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.server.Handler; -import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.server.HttpConnectionFactory; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.handler.AbstractHandler; -import org.eclipse.jetty.server.handler.AbstractHandlerContainer; +import org.eclipse.jetty.server.*; +import org.eclipse.jetty.util.Callback; /** * An implementation of the TechEmpower benchmark tests using the Jetty web - * server. + * server. */ -public final class HelloWebServer -{ - public static void main(String[] args) throws Exception - { +public final class HelloWebServer { + public static void main(String[] args) throws Exception { Server server = new Server(8080); ServerConnector connector = server.getBean(ServerConnector.class); HttpConfiguration config = connector.getBean(HttpConnectionFactory.class).getHttpConfiguration(); @@ -36,34 +22,33 @@ public static void main(String[] args) throws Exception server.start(); server.join(); } - - public static class PathHandler extends AbstractHandler - { - JsonHandler _jsonHandler=new JsonHandler(); - PlainTextHandler _plainHandler=new PlainTextHandler(); - - public PathHandler() - { + + public static class PathHandler extends Handler.Abstract { + JsonHandler _jsonHandler = new JsonHandler(); + PlainTextHandler _plainHandler = new PlainTextHandler(); + + public PathHandler() { addBean(_jsonHandler); addBean(_plainHandler); } @Override - public void setServer(Server server) - { + public void setServer(Server server) { super.setServer(server); _jsonHandler.setServer(server); _plainHandler.setServer(server); } @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException - { - if ("/plaintext".equals(target)) - _plainHandler.handle(target,baseRequest,request,response); - else if ("/json".equals(target)) - _jsonHandler.handle(target,baseRequest,request,response); + public boolean handle(Request request, Response response, Callback callback) { + String uri = request.getHttpURI().getPath(); + + if ("/plaintext".equals(uri)) + return _plainHandler.handle(request, response, callback); + else if ("/json".equals(uri)) + return _jsonHandler.handle(request, response, callback); + else + return false; } - } } diff --git a/frameworks/Java/jetty/src/main/java/hello/handler/JsonHandler.java b/frameworks/Java/jetty/src/main/java/hello/handler/JsonHandler.java index e99c9790a5f..8a7da96f576 100644 --- a/frameworks/Java/jetty/src/main/java/hello/handler/JsonHandler.java +++ b/frameworks/Java/jetty/src/main/java/hello/handler/JsonHandler.java @@ -1,34 +1,35 @@ package hello.handler; -import java.io.IOException; -import java.util.Collections; -import java.util.Map; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.eclipse.jetty.http.HttpField; -import org.eclipse.jetty.http.HttpHeader; -import org.eclipse.jetty.http.PreEncodedHttpField; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; -import org.eclipse.jetty.util.ajax.JSON; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +public class JsonHandler extends Handler.Abstract { + + private static final HttpField JSON_HEADER = new HttpField("Content-Type", "application/json"); + private static final String JSON_RESPONSE = "{\"message\": \"Hello, World!\"}"; -public class JsonHandler extends AbstractHandler -{ - private JSON json = new JSON(); - HttpField contentType = new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,"application/json"); @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException - { - baseRequest.setHandled(true); - baseRequest.getResponse().getHttpFields().add(contentType); - Map map = Collections.singletonMap("message","Hello, World!"); - json.append(response.getWriter(),map); + public boolean handle(Request request, Response response, Callback callback) { + try { + response.setStatus(200); + response.getHeaders().add(JSON_HEADER); + + byte[] contentBytes = JSON_RESPONSE.getBytes(StandardCharsets.UTF_8); + ByteBuffer contentBuffer = ByteBuffer.wrap(contentBytes); + response.getHeaders().put("Content-Length", String.valueOf(contentBytes.length)); + + response.write(true, contentBuffer, callback); + } catch (Exception e) { + callback.failed(e); + } + return true; } - -} +} \ No newline at end of file diff --git a/frameworks/Java/jetty/src/main/java/hello/handler/PlainTextHandler.java b/frameworks/Java/jetty/src/main/java/hello/handler/PlainTextHandler.java index fee97b635b9..940110224db 100644 --- a/frameworks/Java/jetty/src/main/java/hello/handler/PlainTextHandler.java +++ b/frameworks/Java/jetty/src/main/java/hello/handler/PlainTextHandler.java @@ -1,31 +1,35 @@ package hello.handler; -import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.eclipse.jetty.http.HttpField; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.http.PreEncodedHttpField; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; -import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; -public class PlainTextHandler extends AbstractHandler -{ - ByteBuffer helloWorld = BufferUtil.toBuffer("Hello, World!"); - HttpField contentType = new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,MimeTypes.Type.TEXT_PLAIN.asString()); +public class PlainTextHandler extends Handler.Abstract { + private static final String RESPONSE_BODY = "Hello, World!"; + private static final HttpField contentType = new PreEncodedHttpField(HttpHeader.CONTENT_TYPE, MimeTypes.Type.TEXT_PLAIN.asString()); @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException - { - baseRequest.setHandled(true); - baseRequest.getResponse().getHttpFields().add(contentType); - baseRequest.getResponse().getHttpOutput().sendContent(helloWorld.slice()); + public boolean handle(Request request, Response response, Callback callback) { + try { + response.setStatus(200); + response.getHeaders().put(contentType); + + byte[] contentBytes = RESPONSE_BODY.getBytes(StandardCharsets.UTF_8); + ByteBuffer contentBuffer = ByteBuffer.wrap(contentBytes); + response.getHeaders().put("Content-Length", String.valueOf(contentBytes.length)); + + response.write(true, contentBuffer, callback); + } catch (Exception e) { + callback.failed(e); + } + return true; } } diff --git a/frameworks/Java/jetty/src/main/java/hello/servlet/HelloWebServerServlet.java b/frameworks/Java/jetty/src/main/java/hello/servlet/HelloWebServerServlet.java index b9ab9af85c9..2859edd1aa7 100644 --- a/frameworks/Java/jetty/src/main/java/hello/servlet/HelloWebServerServlet.java +++ b/frameworks/Java/jetty/src/main/java/hello/servlet/HelloWebServerServlet.java @@ -4,14 +4,14 @@ import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; /** * An implementation of the TechEmpower benchmark tests using the Jetty web * server. */ -public final class HelloWebServerServlet +public final class HelloWebServerServlet { public static void main(String[] args) throws Exception @@ -26,7 +26,7 @@ public static void main(String[] args) throws Exception context.setContextPath("/"); server.setHandler(context); - context.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class,"/"); + context.addServlet(org.eclipse.jetty.ee10.servlet.DefaultServlet.class,"/"); context.addServlet(JsonServlet.class,"/json"); context.addServlet(PlaintextServlet.class,"/plaintext"); diff --git a/frameworks/Java/jetty/src/main/java/hello/servlet/JsonServlet.java b/frameworks/Java/jetty/src/main/java/hello/servlet/JsonServlet.java index 9533083c18c..2d374a0a21d 100644 --- a/frameworks/Java/jetty/src/main/java/hello/servlet/JsonServlet.java +++ b/frameworks/Java/jetty/src/main/java/hello/servlet/JsonServlet.java @@ -4,11 +4,10 @@ import java.util.Collections; import java.util.Map; -import javax.servlet.GenericServlet; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.GenericServlet; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.eclipse.jetty.util.ajax.JSON; @@ -16,16 +15,15 @@ public class JsonServlet extends GenericServlet { - private JSON json = new JSON(); - + private final JSON json = new JSON(); + @Override - public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException + public void service(ServletRequest req, ServletResponse res) throws IOException { HttpServletResponse response= (HttpServletResponse)res; response.setContentType("application/json"); Map map = Collections.singletonMap("message","Hello, World!"); - + json.append(response.getWriter(),map); } - } diff --git a/frameworks/Java/jetty/src/main/java/hello/servlet/PlaintextServlet.java b/frameworks/Java/jetty/src/main/java/hello/servlet/PlaintextServlet.java index 7e72d80b9ad..99b245478f5 100644 --- a/frameworks/Java/jetty/src/main/java/hello/servlet/PlaintextServlet.java +++ b/frameworks/Java/jetty/src/main/java/hello/servlet/PlaintextServlet.java @@ -2,16 +2,11 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.Map; -import javax.activation.MimeType; -import javax.servlet.GenericServlet; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.GenericServlet; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.eclipse.jetty.http.MimeTypes; @@ -19,7 +14,7 @@ public class PlaintextServlet extends GenericServlet { byte[] helloWorld = "Hello, World!".getBytes(StandardCharsets.ISO_8859_1); @Override - public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException + public void service(ServletRequest req, ServletResponse res) throws IOException { HttpServletResponse response= (HttpServletResponse)res; response.setContentType(MimeTypes.Type.TEXT_PLAIN.asString()); From 434b2bc044f5c25a4736c3d1809038789e89fe88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=B0=8F=E9=A9=AC?= <1417262058@qq.com> Date: Tue, 24 Jun 2025 05:27:13 +0800 Subject: [PATCH 1498/1766] Update hserver and hserver-business version (#9964) * Update hserver version 3.7.0 pom.xml * Update hserver version 3.7.0 pom.xml --- frameworks/Java/hserver-business/pom.xml | 2 +- frameworks/Java/hserver/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/hserver-business/pom.xml b/frameworks/Java/hserver-business/pom.xml index 2d72e90fb48..f632bfe0307 100644 --- a/frameworks/Java/hserver-business/pom.xml +++ b/frameworks/Java/hserver-business/pom.xml @@ -11,7 +11,7 @@ hserver-parent cn.hserver - 3.6.M3 + 3.7.0 UTF-8 diff --git a/frameworks/Java/hserver/pom.xml b/frameworks/Java/hserver/pom.xml index 1183e3a8567..1778ca9db75 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -11,7 +11,7 @@ hserver-parent cn.hserver - 3.6.M3 + 3.7.0 UTF-8 From 3c5f3e4603820b457ecdca08e53996d05caaa662 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 15:39:29 +0000 Subject: [PATCH 1499/1766] Bump com.fasterxml.jackson.core:jackson-core Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.13.0 to 2.15.0. - [Changelog](https://github.com/FasterXML/jackson-core/blob/jackson-core-2.15.0/release.properties) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.13.0...jackson-core-2.15.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-version: 2.15.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/ninja-standalone/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/ninja-standalone/pom.xml b/frameworks/Java/ninja-standalone/pom.xml index 3d199e2027e..080be7a670b 100644 --- a/frameworks/Java/ninja-standalone/pom.xml +++ b/frameworks/Java/ninja-standalone/pom.xml @@ -51,7 +51,7 @@ com.fasterxml.jackson.core jackson-core - 2.13.0 + 2.15.0 com.fasterxml.jackson.module From 752257fa975ebd61854fccbc5417b6b5bce71650 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 15:44:57 +0000 Subject: [PATCH 1500/1766] Bump com.fasterxml.jackson.core:jackson-core Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.13.3 to 2.15.0. - [Changelog](https://github.com/FasterXML/jackson-core/blob/jackson-core-2.15.0/release.properties) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.13.3...jackson-core-2.15.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-version: 2.15.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/microhttp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/microhttp/pom.xml b/frameworks/Java/microhttp/pom.xml index 6e4ea1d91eb..75ad3849dfb 100644 --- a/frameworks/Java/microhttp/pom.xml +++ b/frameworks/Java/microhttp/pom.xml @@ -24,7 +24,7 @@ com.fasterxml.jackson.core jackson-core - 2.13.3 + 2.15.0 com.fasterxml.jackson.core From ce686f751055200b12d8bd11a062d6d6f40de2eb Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Fri, 27 Jun 2025 18:45:38 +0100 Subject: [PATCH 1501/1766] build: upgraded dependencies (#9897) --- frameworks/Rust/axum/Cargo.lock | 109 ++++++++++----------------- frameworks/Rust/axum/Cargo.toml | 16 ++-- frameworks/Rust/axum/axum.dockerfile | 4 +- 3 files changed, 50 insertions(+), 79 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 66bfde818f7..90252cc8a57 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -27,7 +27,7 @@ dependencies = [ "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -104,9 +104,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ "axum-core", "bytes", @@ -173,7 +173,7 @@ dependencies = [ "mongodb", "num_cpus", "quick_cache", - "rand 0.9.0", + "rand 0.9.1", "serde", "serde_json", "serde_path_to_error", @@ -279,7 +279,7 @@ dependencies = [ "indexmap 2.7.0", "js-sys", "once_cell", - "rand 0.9.0", + "rand 0.9.1", "serde", "serde_bytes", "serde_json", @@ -1385,9 +1385,9 @@ checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmimalloc-sys" -version = "0.1.41" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b20daca3a4ac14dbdc753c5e90fc7b490a48a9131daed3c9a9ced7b2defd37b" +checksum = "ec9d6fac27761dabcd4ee73571cdb06b7022dc99089acbe5435691edffaac0f4" dependencies = [ "cc", "libc", @@ -1524,9 +1524,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mimalloc" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cb1f88093fe50061ca1195d336ffec131347c7b833db31f9ab62a2d1b7925f" +checksum = "995942f432bbb4822a7e9c3faa87a695185b0d09273ba85f097b54f4e458f2af" dependencies = [ "libmimalloc-sys", ] @@ -1588,7 +1588,7 @@ dependencies = [ "rand 0.8.5", "rustc_version_runtime", "rustls 0.21.12", - "rustls-pemfile 1.0.4", + "rustls-pemfile", "serde", "serde_bytes", "serde_with", @@ -1822,7 +1822,7 @@ dependencies = [ "hmac", "md-5", "memchr", - "rand 0.9.0", + "rand 0.9.1", "sha2", "stringprep", ] @@ -1850,7 +1850,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -1880,9 +1880,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick_cache" -version = "0.6.12" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f8ed0655cbaf18a26966142ad23b95d8ab47221c50c4f73a1db7d0d2d6e3da8" +checksum = "6b450dad8382b1b95061d5ca1eb792081fb082adf48c678791fe917509596d5f" dependencies = [ "ahash", "equivalent", @@ -1924,13 +1924,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.24", ] [[package]] @@ -2146,15 +2145,6 @@ dependencies = [ "base64 0.21.7", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.10.1" @@ -2370,9 +2360,9 @@ dependencies = [ [[package]] name = "simd-json" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10b5602e4f1f7d358956f94cac1eff59220f34cf9e26d49f5fde5acef851cbed" +checksum = "c962f626b54771990066e5435ec8331d1462576cd2d1e62f24076ae014f92112" dependencies = [ "getrandom 0.3.2", "halfbrown", @@ -2450,9 +2440,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2463,10 +2453,11 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" dependencies = [ + "base64 0.22.1", "bytes", "crc", "crossbeam-queue", @@ -2484,7 +2475,6 @@ dependencies = [ "once_cell", "percent-encoding", "rustls 0.23.20", - "rustls-pemfile 2.2.0", "serde", "serde_json", "sha2", @@ -2499,9 +2489,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" dependencies = [ "proc-macro2", "quote", @@ -2512,9 +2502,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" dependencies = [ "dotenvy", "either", @@ -2538,9 +2528,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" dependencies = [ "atoi", "base64 0.22.1", @@ -2580,9 +2570,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" dependencies = [ "atoi", "base64 0.22.1", @@ -2617,9 +2607,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" dependencies = [ "atoi", "flume", @@ -2634,6 +2624,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", + "thiserror 2.0.12", "tracing", "url", ] @@ -2838,9 +2829,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -2904,7 +2895,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.9.0", + "rand 0.9.1", "socket2", "tokio", "tokio-util", @@ -2972,9 +2963,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" +checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" dependencies = [ "bitflags 2.6.0", "bytes", @@ -3629,16 +3620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" -dependencies = [ - "zerocopy-derive 0.8.24", + "zerocopy-derive", ] [[package]] @@ -3652,17 +3634,6 @@ dependencies = [ "syn 2.0.91", ] -[[package]] -name = "zerocopy-derive" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.91", -] - [[package]] name = "zerofrom" version = "0.1.5" diff --git a/frameworks/Rust/axum/Cargo.toml b/frameworks/Rust/axum/Cargo.toml index 7aeee088323..901fac9e8ed 100644 --- a/frameworks/Rust/axum/Cargo.toml +++ b/frameworks/Rust/axum/Cargo.toml @@ -39,7 +39,7 @@ simd-json = [ ] [dependencies] -axum = { version = "0.8.3", default-features = false, features = [ +axum = { version = "0.8.4", default-features = false, features = [ "json", "query", "http1", @@ -56,23 +56,23 @@ mongodb = { version = "3.2.3", features = [ "zlib-compression", ] } num_cpus = "1.16.0" -rand = { version = "0.9.0", features = ["small_rng"] } +rand = { version = "0.9.1", features = ["small_rng"] } serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.140" -sqlx = { version = "0.8.3", features = [ +sqlx = { version = "0.8.5", features = [ "postgres", "macros", "runtime-tokio", "tls-rustls", ] } -tokio = { version = "1.44.2", features = ["full"] } +tokio = { version = "1.45.0", features = ["full"] } tokio-pg-mapper = { version = "0.2.0" } tokio-pg-mapper-derive = { version = "0.2.0" } tokio-postgres = { version = "0.7.13" } tower = { version = "0.5.2", features = ["util"] } -tower-http = { version = "0.6.2", features = ["set-header"] } +tower-http = { version = "0.6.4", features = ["set-header"] } yarte = "0.15.7" -simd-json = { version = "0.15.0", optional = true } +simd-json = { version = "0.15.1", optional = true } axum-core = { version = "0.5.2", optional = true } mime = { version = "0.3.17", optional = true } bytes = { version = "1.10.1", optional = true } @@ -80,8 +80,8 @@ serde_path_to_error = { version = "0.1.17", optional = true } socket2 = "0.5.9" hyper = { version = "1.6", features = ["server", "http1"] } hyper-util = { version = "0.1", features = ["tokio", "server-auto", "http1"] } -quick_cache = "0.6.12" -mimalloc = "0.1.45" +quick_cache = "0.6.14" +mimalloc = "0.1.46" [profile.release] diff --git a/frameworks/Rust/axum/axum.dockerfile b/frameworks/Rust/axum/axum.dockerfile index f1316cf10e0..0805d0112f8 100644 --- a/frameworks/Rust/axum/axum.dockerfile +++ b/frameworks/Rust/axum/axum.dockerfile @@ -17,8 +17,8 @@ ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_w ENV POSTGRES_MIN_POOL_SIZE=56 ENV POSTGRES_MAX_POOL_SIZE=56 ENV MONGODB_URL=mongodb://tfb-database:27017 -ENV MONGODB_MIN_POOL_SIZE=28 -ENV MONGODB_MAX_POOL_SIZE=28 +ENV MONGODB_MIN_POOL_SIZE=56 +ENV MONGODB_MAX_POOL_SIZE=56 COPY --from=builder /build/target/release/axum* /app/ EXPOSE 8000 CMD ["/app/axum"] From a67aa28761805f2401ccdc677b8ed968154237b1 Mon Sep 17 00:00:00 2001 From: LLT21 <43903768+LLT21@users.noreply.github.com> Date: Mon, 30 Jun 2025 17:52:35 +0200 Subject: [PATCH 1502/1766] Correction of appmpower-odbc-pg.dockerfile build and version upgrades (#9966) * Build correction for appmpower-odbc-pg.dockerfile and upgraded versions * appmpower-odbc-pg.dockerfile correction --------- Co-authored-by: LLT21 <> --- .../CSharp/appmpower/appmpower-odbc-my.dockerfile | 9 ++++++--- .../CSharp/appmpower/appmpower-odbc-pg.dockerfile | 11 ++++++----- frameworks/CSharp/appmpower/appmpower.dockerfile | 6 +++--- .../appmpower/src/appMpower.Orm/appMpower.Orm.csproj | 7 ++++++- .../CSharp/appmpower/src/appMpower/appMpower.csproj | 7 ++++--- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile b/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile index 9df17020863..ad6c396e22b 100644 --- a/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:9.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build RUN apt-get update RUN apt-get -yqq install clang zlib1g-dev RUN apt-get update @@ -8,7 +8,7 @@ COPY src . RUN dotnet publish -c Release -o out /p:Database=mysql # Construct the actual image that will run -FROM mcr.microsoft.com/dotnet/aspnet:9.0.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime RUN apt-get update # The following installs standard versions unixodbc and pgsqlodbc @@ -18,6 +18,7 @@ RUN apt-get update WORKDIR /odbc +#TODOGITHUB RUN curl -L -o mariadb-connector-odbc-3.1.20-debian-bookworm-amd64.tar.gz https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.20/mariadb-connector-odbc-3.1.20-debian-bookworm-amd64.tar.gz RUN tar -xvzf mariadb-connector-odbc-3.1.20-debian-bookworm-amd64.tar.gz RUN cp mariadb-connector-odbc-3.1.20-debian-bookworm-amd64/lib/mariadb/libm* /usr/lib/ @@ -45,8 +46,10 @@ WORKDIR /app COPY --from=build /app/out ./ RUN cp /usr/lib/libm* /app -#RUN cp /usr/lib/aarch64-linux-gnu/libodbc* /app +#TODOGITHUB RUN cp /usr/lib/x86_64-linux-gnu/libodbc* /app +#TODOLOCAL +#RUN cp /usr/lib/aarch64-linux-gnu/libodbc* /app EXPOSE 8080 diff --git a/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile b/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile index ebeab3b6186..1cf7855dd7f 100644 --- a/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile @@ -1,13 +1,13 @@ -FROM mcr.microsoft.com/dotnet/sdk:9.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build RUN apt-get update -RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5 +RUN apt-get -yqq install clang zlib1g-dev WORKDIR /app COPY src . RUN dotnet publish -c Release -o out /p:Database=postgresql # Construct the actual image that will run -FROM mcr.microsoft.com/dotnet/aspnet:9.0.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime RUN apt-get update RUN apt-get install -y unixodbc-dev unixodbc odbc-postgresql @@ -27,9 +27,10 @@ ENV ASPNETCORE_URLS http://+:8080 WORKDIR /app COPY --from=build /app/out ./ -#RUN cp /usr/lib/aarch64-linux-gnu/libodbc* /app +#TODOGITHUB RUN cp /usr/lib/x86_64-linux-gnu/libodbc* /app - +#TODOLOCAL +#RUN cp /usr/lib/aarch64-linux-gnu/libodbc* /app EXPOSE 8080 diff --git a/frameworks/CSharp/appmpower/appmpower.dockerfile b/frameworks/CSharp/appmpower/appmpower.dockerfile index d10a8ad3c2e..6621b6b6deb 100644 --- a/frameworks/CSharp/appmpower/appmpower.dockerfile +++ b/frameworks/CSharp/appmpower/appmpower.dockerfile @@ -1,6 +1,6 @@ -FROM mcr.microsoft.com/dotnet/sdk:9.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build RUN apt-get update -RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5 +RUN apt-get -yqq install clang zlib1g-dev WORKDIR /app COPY src . @@ -8,7 +8,7 @@ COPY src . RUN dotnet publish -c Release -o out # Construct the actual image that will run -FROM mcr.microsoft.com/dotnet/aspnet:9.0.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime # Full PGO ENV DOTNET_TieredPGO 1 ENV DOTNET_TC_QuickJitForLoops 1 diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj b/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj index 858f6f66ae4..23a9b6c47cb 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/appMpower.Orm.csproj @@ -8,6 +8,7 @@ true true + linux-x64 @@ -36,7 +37,11 @@ - + + + + + diff --git a/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj b/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj index ba6fe6f7059..5db0aac55f8 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj +++ b/frameworks/CSharp/appmpower/src/appMpower/appMpower.csproj @@ -9,14 +9,15 @@ + - + From 1ec0fb2ebcc4bca86ef41a4d3c91f315f6528a06 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:53:23 +0100 Subject: [PATCH 1503/1766] Add graalvm tests for httpserver/httpserver-robaho/ring-http-exchange (#9968) * Add graalvm to ring-http-exchange Enable running ring-http-exchange on graalvm Change group-id/artifactid/name in pom.xml to ring-http-exchage * Add graalvm to httpserver and httpserver-robago * merge httpserver and httpserver-robaho into single project --------- Co-authored-by: jj --- .../ring-http-exchange/benchmark_config.json | 42 ++++++ .../Clojure/ring-http-exchange/config.toml | 55 +++++++ .../ring-http-exchange-graalvm.dockerfile | 13 ++ ...ng-http-exchange-robaho-graalvm.dockerfile | 13 ++ frameworks/Java/httpserver-robaho/README.md | 32 ---- .../httpserver-robaho/benchmark_config.json | 44 ------ frameworks/Java/httpserver-robaho/config.toml | 27 ---- frameworks/Java/httpserver-robaho/pom.xml | 83 ----------- .../src/main/java/benchmarks/Fortune.java | 25 ---- .../src/main/java/benchmarks/Message.java | 26 ---- .../src/main/java/benchmarks/Server.java | 139 ------------------ .../src/main/resources/fortunes.template.httl | 13 -- frameworks/Java/httpserver/README.md | 16 +- .../Java/httpserver/benchmark_config.json | 77 ++++++++++ frameworks/Java/httpserver/config.toml | 55 +++++++ .../httpserver/httpserver-graalvm.dockerfile | 13 ++ .../httpserver-robaho-graalvm.dockerfile | 13 ++ .../httpserver-robaho-postgres.dockerfile | 4 +- .../httpserver-robaho.dockerfile | 4 +- frameworks/Java/httpserver/pom.xml | 28 +++- .../src/main/java/benchmarks/Message.java | 13 +- .../src/main/java/benchmarks/Server.java | 16 +- 22 files changed, 327 insertions(+), 424 deletions(-) create mode 100644 frameworks/Clojure/ring-http-exchange/config.toml create mode 100644 frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile create mode 100644 frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile delete mode 100755 frameworks/Java/httpserver-robaho/README.md delete mode 100755 frameworks/Java/httpserver-robaho/benchmark_config.json delete mode 100644 frameworks/Java/httpserver-robaho/config.toml delete mode 100644 frameworks/Java/httpserver-robaho/pom.xml delete mode 100644 frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java delete mode 100755 frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java delete mode 100755 frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java delete mode 100644 frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl create mode 100644 frameworks/Java/httpserver/httpserver-graalvm.dockerfile create mode 100644 frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile rename frameworks/Java/{httpserver-robaho => httpserver}/httpserver-robaho-postgres.dockerfile (63%) rename frameworks/Java/{httpserver-robaho => httpserver}/httpserver-robaho.dockerfile (62%) diff --git a/frameworks/Clojure/ring-http-exchange/benchmark_config.json b/frameworks/Clojure/ring-http-exchange/benchmark_config.json index bca6c16a2cb..4c943e97b3f 100755 --- a/frameworks/Clojure/ring-http-exchange/benchmark_config.json +++ b/frameworks/Clojure/ring-http-exchange/benchmark_config.json @@ -40,8 +40,50 @@ "database_os": "Linux", "display_name": "ring-http-exchange-robaho", "notes": "", + "versus": "httpserver-robaho" + } + }, + { + "graalvm": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Clojure", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ring-http-exchange-graalvm", + "notes": "", "versus": "ring-http-exchange" } + }, + { + "robaho-graalvm": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Clojure", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ring-http-exchange-robaho-graalvm", + "notes": "", + "versus": "ring-http-exchange-robaho" + } } ] } diff --git a/frameworks/Clojure/ring-http-exchange/config.toml b/frameworks/Clojure/ring-http-exchange/config.toml new file mode 100644 index 00000000000..48ba799aef5 --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/config.toml @@ -0,0 +1,55 @@ +[framework] +name = "ring-http-exchange" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "httpserver" + + +[graalvm] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "httpserver-graalvm" + +[robaho] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "httpserver-robaho" + +[robaho-graalvm] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "httpserver-robaho-graalvm" diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile new file mode 100644 index 00000000000..f2aed8bf3d7 --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3-eclipse-temurin-24-alpine as maven +WORKDIR /ring-http-exchange +COPY pom.xml pom.xml +COPY src src +RUN mvn clean clojure:compile package + +FROM ghcr.io/graalvm/graalvm-community:24 +WORKDIR /ring-http-exchange +COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile new file mode 100644 index 00000000000..1783b1878eb --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3-eclipse-temurin-24-alpine as maven +WORKDIR /ring-http-exchange +COPY pom.xml pom.xml +COPY src src +RUN mvn clean clojure:compile -P robaho package + +FROM ghcr.io/graalvm/graalvm-community:24 +WORKDIR /ring-http-exchange +COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Java/httpserver-robaho/README.md b/frameworks/Java/httpserver-robaho/README.md deleted file mode 100755 index 9317e30ce2d..00000000000 --- a/frameworks/Java/httpserver-robaho/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# httpserver Benchmarking Test - -This is an alternative version of the [httpserver benchmarking test suite](../httpserver) - -Package [robaho.net.httpserver](https://github.com/robaho/httpserver) provides an implementation of `com.sun.net.httpserver` designed for virtual threads, thus requiring JDK21+. - -It can be used with platform threads using a `cached thread pool` which configures a thread per task, which is more efficient for a small number of clients (embedded systems). - -### Test Type Implementation Source Code - -* [JSON](src/main/java/benchmarks/Server.java) -* [Plaintext](src/main/java/benchmarks/Server.java) -* [Fortunes](src/main/java/benchmarks/Server.java) - -## Important Libraries -The tests were run with: -* [Jackson](https://github.com/FasterXML/jackson) -* [HikariCP](https://github.com/brettwooldridge/HikariCP) -* [HTTL](https://httl.github.io/en/) - -## Test URLs -### JSON - -http://localhost:8080/json - -### Plaintext - -http://localhost:8080/plaintext - -### Fortunes - -http://localhost:8080/fortunes diff --git a/frameworks/Java/httpserver-robaho/benchmark_config.json b/frameworks/Java/httpserver-robaho/benchmark_config.json deleted file mode 100755 index e3a66134723..00000000000 --- a/frameworks/Java/httpserver-robaho/benchmark_config.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "framework": "httpserver-robaho", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "None", - "framework": "None", - "language": "Java", - "flavor": "None", - "orm": "Raw", - "platform": "httpserver", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "httpserver-robaho", - "notes": "", - "versus": "" - }, - "postgres": { - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "None", - "language": "Java", - "flavor": "None", - "orm": "Raw", - "platform": "httpserver", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "httpserver-robaho-postgres", - "notes": "", - "versus": "" - } - } - ] -} diff --git a/frameworks/Java/httpserver-robaho/config.toml b/frameworks/Java/httpserver-robaho/config.toml deleted file mode 100644 index e69305d162c..00000000000 --- a/frameworks/Java/httpserver-robaho/config.toml +++ /dev/null @@ -1,27 +0,0 @@ -[framework] -name = "httpserver-robaho" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -approach = "Realistic" -classification = "Platform" -database = "None" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "httpserver" -webserver = "None" -versus = "" - -[postgres] -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Platform" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "httpserver" -webserver = "None" -versus = "" diff --git a/frameworks/Java/httpserver-robaho/pom.xml b/frameworks/Java/httpserver-robaho/pom.xml deleted file mode 100644 index 550fcab5118..00000000000 --- a/frameworks/Java/httpserver-robaho/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - 4.0.0 - com.techempower - httpserver-robaho - 1.0 - jar - - UTF-8 - 23 - 23 - 23 - - - - com.googlecode.json-simple - json-simple - 1.1.1 - - - org.postgresql - postgresql - 42.7.2 - - - com.zaxxer - HikariCP - 3.3.1 - - - com.github.httl - httl - 1.0.11 - - - org.slf4j - slf4j-simple - 1.7.25 - - - io.github.robaho - httpserver - 1.0.23 - compile - - - - - - true - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - false - - - - maven-assembly-plugin - 3.1.0 - - - - benchmarks.Server - - - - jar-with-dependencies - - - - - make-assembly - package - - single - - - - - - - diff --git a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java deleted file mode 100644 index 2b420fb4764..00000000000 --- a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Fortune.java +++ /dev/null @@ -1,25 +0,0 @@ -package benchmarks; - -public class Fortune implements Comparable { - - private final int id; - private final String message; - - public Fortune(int id, String message) { - this.id = id; - this.message = message; - } - - public int getId() { - return id; - } - - public String getMessage() { - return message; - } - - @Override - public int compareTo(Fortune other) { - return message.compareTo(other.message); - } -} diff --git a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java deleted file mode 100755 index 4c1ad6dc031..00000000000 --- a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Message.java +++ /dev/null @@ -1,26 +0,0 @@ -package benchmarks; - -import java.io.IOException; -import java.io.Writer; -import java.util.Map; - -import org.json.simple.JSONStreamAware; -import org.json.simple.JSONValue; - -public class Message implements JSONStreamAware { - - private final String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - @Override - public void writeJSONString(Writer out) throws IOException { - JSONValue.writeJSONString(Map.of("message",message), out); - } -} diff --git a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java b/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java deleted file mode 100755 index 338200488d0..00000000000 --- a/frameworks/Java/httpserver-robaho/src/main/java/benchmarks/Server.java +++ /dev/null @@ -1,139 +0,0 @@ -package benchmarks; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.net.InetSocketAddress; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.Executors; - -import javax.sql.DataSource; - -import com.sun.net.httpserver.HttpHandler; -import com.sun.net.httpserver.HttpServer; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; - -import httl.Engine; -import httl.Template; - -public class Server { - - private static final String HELLO_TEXT = "Hello, World!"; - private static final byte[] HELLO_BYTES = HELLO_TEXT.getBytes(); - private static final int HELLO_LENGTH = HELLO_BYTES.length; - private static final String SERVER_NAME = "httpserver-robaho"; - - private static List queryFortunes(DataSource ds) throws SQLException { - List fortunes = new ArrayList<>(); - try (Connection conn = ds.getConnection(); - PreparedStatement statement = conn.prepareStatement("SELECT id, message FROM fortune"); - ResultSet resultSet = statement.executeQuery()) { - while (resultSet.next()) - fortunes.add(new Fortune(resultSet.getInt(1), resultSet.getString(2))); - } - return fortunes; - } - - private static DataSource createPostgresDataSource() throws ClassNotFoundException { - Class.forName("org.postgresql.Driver"); - HikariConfig config = new HikariConfig(); - config.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world"); - config.setUsername("benchmarkdbuser"); - config.setPassword("benchmarkdbpass"); - config.setMaximumPoolSize(512); - return new HikariDataSource(config); - } - - private static Template loadTemplate(String filename) throws IOException, ParseException { - Properties props = new Properties(); - props.put("import.packages", "java.util," + Fortune.class.getPackage().getName()); - props.put("input.encoding", "UTF-8"); - props.put("output.encoding", "UTF-8"); - props.put("precompiled", "false"); - Engine engine = Engine.getEngine(props); - return engine.getTemplate(filename); - } - - private static HttpHandler createPlaintextHandler() { - return t -> { - t.getResponseHeaders().add("Content-Type", "text/plain"); - t.getResponseHeaders().add("Server", SERVER_NAME); - t.sendResponseHeaders(200, HELLO_LENGTH); - t.getResponseBody().write(HELLO_BYTES); - t.getResponseBody().close(); - }; - } - - private static HttpHandler createJSONHandler() { - return t -> { - Message m = new Message(HELLO_TEXT); - t.getResponseHeaders().add("Content-Type", "application/json"); - t.getResponseHeaders().add("Server", SERVER_NAME); - var bos = new ByteArrayOutputStream(); - OutputStreamWriter w = new OutputStreamWriter(bos); - m.writeJSONString(w); - w.flush(); - t.sendResponseHeaders(200, bos.size()); - bos.writeTo(t.getResponseBody()); - t.getResponseBody().close(); - }; - } - - private static HttpHandler createFortunesHandler(DataSource ds) throws IOException, ParseException { - Template template = loadTemplate("/fortunes.template.httl"); - return t -> { - try { - // query db - List fortunes = queryFortunes(ds); - fortunes.add(new Fortune(0, "Additional fortune added at request time.")); - Collections.sort(fortunes); - // render template - Map context = new HashMap<>(1); - context.put("fortunes", fortunes); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - template.render(context, out); - byte[] bytes = out.toByteArray(); - // send response - t.getResponseHeaders().add("Content-Type", "text/html; charset=utf-8"); - t.getResponseHeaders().add("Server", SERVER_NAME); - t.sendResponseHeaders(200, bytes.length); - t.getResponseBody().write(bytes); - t.getResponseBody().close(); - } catch (SQLException | ParseException e) { - throw new IOException(e); - } - }; - } - - public static void main(String[] args) throws Exception { - // parse arguments - String settings = args.length > 0 ? args[0] : ""; - int port = args.length > 1 ? Integer.parseInt(args[1]) : 8080; - if (settings.contains("debug")) - System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "DEBUG"); - // create server - HttpServer server = HttpServer.create(new InetSocketAddress(port), 1024 * 8); - server.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); - // server.setExecutor(Executors.newCachedThreadPool()); - // add context handlers - server.createContext("/plaintext", createPlaintextHandler()); - server.createContext("/json", createJSONHandler()); - if (settings.contains("postgres")) { - DataSource ds = createPostgresDataSource(); - server.createContext("/fortunes", createFortunesHandler(ds)); - } - // start server - server.start(); - } -} diff --git a/frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl b/frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl deleted file mode 100644 index 4d87b47658a..00000000000 --- a/frameworks/Java/httpserver-robaho/src/main/resources/fortunes.template.httl +++ /dev/null @@ -1,13 +0,0 @@ - - - -Fortunes - - - - - - -
      idmessage
      ${fortune.id}${fortune.message}
      - - diff --git a/frameworks/Java/httpserver/README.md b/frameworks/Java/httpserver/README.md index 881dcb4f97e..fae36815472 100755 --- a/frameworks/Java/httpserver/README.md +++ b/frameworks/Java/httpserver/README.md @@ -1,26 +1,30 @@ -# httpserver Benchmarking Test - -This is the com.sun.net.httpserver portion of a [benchmarking test suite](../) comparing a variety of web development platforms. +# Benchmarking Test +## httpserver +This is the com.sun.net.httpserver portion of a [benchmarking test suite](../) comparing a variety of web development +platforms. Package [com.sun.net.httpserver](https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html) provides a simple high-level Http server API, which can be used to build embedded HTTP servers. It is built-in to the Oracle JDK and OpenJDK (but is not part of the Java standard and is not available in other JDKs). - - +## Robaho httpserver +This is an alternative version of the [com.sun.net.httpserver](https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html) +Package [robaho.net.httpserver](https://github.com/robaho/httpserver) provides an implementation of `com.sun.net.httpserver` designed for virtual threads, thus requiring JDK21+. ### Test Type Implementation Source Code - * [JSON](src/main/java/benchmarks/Server.java) * [Plaintext](src/main/java/benchmarks/Server.java) * [Fortunes](src/main/java/benchmarks/Server.java) ## Important Libraries + The tests were run with: + * [Jackson](https://github.com/FasterXML/jackson) * [HikariCP](https://github.com/brettwooldridge/HikariCP) * [HTTL](https://httl.github.io/en/) +* [Robaho httpserver](https://github.com/robaho/httpserver) ## Test URLs ### JSON diff --git a/frameworks/Java/httpserver/benchmark_config.json b/frameworks/Java/httpserver/benchmark_config.json index 99f040ca11b..305564d55a8 100755 --- a/frameworks/Java/httpserver/benchmark_config.json +++ b/frameworks/Java/httpserver/benchmark_config.json @@ -38,6 +38,83 @@ "display_name": "httpserver-postgres", "notes": "", "versus": "" + }, + "graalvm": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "httpserver", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "httpserver-graalvm", + "notes": "", + "versus": "httpserver" + } + }, + { + "robaho": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "httpserver", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "httpserver-robaho", + "notes": "", + "versus": "" + }, + "robaho-postgres": { + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "None", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "httpserver", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "httpserver-robaho-postgres", + "notes": "", + "versus": "" + }, + "robaho-graalvm": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "httpserver", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "httpserver-robaho-graalvm", + "notes": "", + "versus": "httpserver-robaho" } } ] diff --git a/frameworks/Java/httpserver/config.toml b/frameworks/Java/httpserver/config.toml index 72dd4414ff3..3531b9e5e9f 100644 --- a/frameworks/Java/httpserver/config.toml +++ b/frameworks/Java/httpserver/config.toml @@ -25,3 +25,58 @@ orm = "Raw" platform = "httpserver" webserver = "None" versus = "" + + +[graalvm] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "httpserver" + + +[robaho] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "httpserver" + + +[robaho-postgres] +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "" + + +[robaho-graalvm] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "httpserver" +webserver = "None" +versus = "httpserver-robaho" diff --git a/frameworks/Java/httpserver/httpserver-graalvm.dockerfile b/frameworks/Java/httpserver/httpserver-graalvm.dockerfile new file mode 100644 index 00000000000..b1d4e09e3d0 --- /dev/null +++ b/frameworks/Java/httpserver/httpserver-graalvm.dockerfile @@ -0,0 +1,13 @@ +FROM maven:3-eclipse-temurin-24-alpine as maven +WORKDIR /httpserver +COPY pom.xml pom.xml +COPY src src +RUN mvn compile assembly:single -q + +FROM ghcr.io/graalvm/graalvm-community:24 +WORKDIR /httpserver +COPY --from=maven /httpserver/target/httpserver-1.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile b/frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile new file mode 100644 index 00000000000..ee9651eb6fe --- /dev/null +++ b/frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile @@ -0,0 +1,13 @@ +FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven +WORKDIR /httpserver-robaho +COPY pom.xml pom.xml +COPY src src +RUN mvn compile -P robaho assembly:single -q + +FROM ghcr.io/graalvm/graalvm-community:24 +WORKDIR /httpserver-robaho +COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-jar", "app.jar"] diff --git a/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile b/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile similarity index 63% rename from frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile rename to frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile index b97d3eb5d2e..8fc18df235d 100644 --- a/frameworks/Java/httpserver-robaho/httpserver-robaho-postgres.dockerfile +++ b/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile @@ -2,11 +2,11 @@ FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven WORKDIR /httpserver-robaho COPY pom.xml pom.xml COPY src src -RUN mvn compile assembly:single -q +RUN mvn compile -P robaho assembly:single -q FROM openjdk:23-jdk-slim WORKDIR /httpserver-robaho -COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar +COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar EXPOSE 8080 diff --git a/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile b/frameworks/Java/httpserver/httpserver-robaho.dockerfile similarity index 62% rename from frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile rename to frameworks/Java/httpserver/httpserver-robaho.dockerfile index f12f0bbdfeb..1ccaff150eb 100644 --- a/frameworks/Java/httpserver-robaho/httpserver-robaho.dockerfile +++ b/frameworks/Java/httpserver/httpserver-robaho.dockerfile @@ -2,11 +2,11 @@ FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven WORKDIR /httpserver-robaho COPY pom.xml pom.xml COPY src src -RUN mvn compile assembly:single -q +RUN mvn compile -P robaho assembly:single -q FROM openjdk:23-jdk-slim WORKDIR /httpserver-robaho -COPY --from=maven /httpserver-robaho/target/httpserver-robaho-1.0-jar-with-dependencies.jar app.jar +COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar EXPOSE 8080 diff --git a/frameworks/Java/httpserver/pom.xml b/frameworks/Java/httpserver/pom.xml index 30577d8801f..5d46cff5c4a 100644 --- a/frameworks/Java/httpserver/pom.xml +++ b/frameworks/Java/httpserver/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 @@ -10,22 +10,21 @@ UTF-8 - 11 - 11 + 21 + 21 com.fasterxml.jackson.core jackson-databind - 2.16.0 + 2.19.1 com.fasterxml.jackson.module jackson-module-afterburner - 2.9.9 + 2.19.1 - org.postgresql postgresql @@ -49,6 +48,21 @@ 1.8.0-beta4 + + + robaho + + false + + + + io.github.robaho + httpserver + 1.0.23 + + + + @@ -59,6 +73,8 @@ 3.8.0 false + 21 + 21
      diff --git a/frameworks/Java/httpserver/src/main/java/benchmarks/Message.java b/frameworks/Java/httpserver/src/main/java/benchmarks/Message.java index 6a84fb9e7ca..3568e9b90d2 100755 --- a/frameworks/Java/httpserver/src/main/java/benchmarks/Message.java +++ b/frameworks/Java/httpserver/src/main/java/benchmarks/Message.java @@ -1,15 +1,4 @@ package benchmarks; -public class Message { +public record Message(String message) {} - private final String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - -} diff --git a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java index 9f40faafc2e..688e6b65df7 100755 --- a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java +++ b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java @@ -8,18 +8,23 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.text.ParseException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; import java.util.concurrent.Executors; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; + import javax.sql.DataSource; + import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.module.afterburner.AfterburnerModule; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; + import httl.Engine; import httl.Template; @@ -72,7 +77,6 @@ private static HttpHandler createPlaintextHandler() { t.getResponseHeaders().add("Server", SERVER_NAME); t.sendResponseHeaders(200, HELLO_LENGTH); t.getResponseBody().write(HELLO_BYTES); - t.getResponseBody().flush(); t.getResponseBody().close(); }; } @@ -116,7 +120,6 @@ private static HttpHandler createFortunesHandler(DataSource ds) throws IOExcepti t.getResponseHeaders().add("Server", SERVER_NAME); t.sendResponseHeaders(200, bytes.length); t.getResponseBody().write(bytes); - t.getResponseBody().flush(); t.getResponseBody().close(); } catch (SQLException | ParseException e) { throw new IOException(e); @@ -133,7 +136,6 @@ public static void main(String[] args) throws Exception { // create server HttpServer server = HttpServer.create(new InetSocketAddress(port), 1024 * 8); server.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); - // add context handlers server.createContext("/plaintext", createPlaintextHandler()); server.createContext("/json", createJSONHandler()); if (settings.contains("postgres")) { From d9e0beef754315ed2704b377cad462dc934dc0ca Mon Sep 17 00:00:00 2001 From: nazo Date: Mon, 30 Jun 2025 23:56:49 +0800 Subject: [PATCH 1504/1766] [Python/Blacksheep] use psqlpy (#9975) * try use psqlpy * fix * fix * try fix * roll back * fix * success fix --- frameworks/Python/blacksheep/app-socketify.py | 88 ++++++++----------- .../Python/blacksheep/requirements-pypy.txt | 2 +- 2 files changed, 39 insertions(+), 51 deletions(-) diff --git a/frameworks/Python/blacksheep/app-socketify.py b/frameworks/Python/blacksheep/app-socketify.py index a825b1596d0..d75fe084db3 100644 --- a/frameworks/Python/blacksheep/app-socketify.py +++ b/frameworks/Python/blacksheep/app-socketify.py @@ -1,22 +1,22 @@ import multiprocessing import os -import psycopg +# import psycopg import platform import random import asyncio import blacksheep as bs import jinja2 from pathlib import Path -from psycopg_pool import AsyncConnectionPool - -READ_ROW_SQL = 'SELECT "id", "randomnumber" FROM "world" WHERE id = %s' -WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=%s WHERE id=%s' +# from psycopg_pool import AsyncConnectionPool +import psqlpy +from psqlpy import ConnectionPoolBuilder +READ_ROW_SQL = 'SELECT "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."] CORE_COUNT = multiprocessing.cpu_count() MAX_DB_CONNECTIONS = 2000 -MAX_POOL_SIZE = min(CORE_COUNT * 2, MAX_DB_CONNECTIONS // CORE_COUNT, 32) -MIN_POOL_SIZE = max(1, MAX_POOL_SIZE // 2) +MAX_POOL_SIZE = min(CORE_COUNT * 2, MAX_DB_CONNECTIONS // CORE_COUNT, 35) db_pool = None async def setup_db(app): @@ -25,15 +25,17 @@ async def setup_db(app): f"postgresql://{os.getenv('PGUSER', 'benchmarkdbuser')}:{os.getenv('PGPASS', 'benchmarkdbpass')}" f"@tfb-database:5432/hello_world" ) - db_pool = AsyncConnectionPool( - conninfo=conninfo, - min_size=MIN_POOL_SIZE, - max_size=MAX_POOL_SIZE, - open=False, - timeout=5.0, - max_lifetime=1800, + db_pool = ( + ConnectionPoolBuilder() + .max_pool_size(MAX_POOL_SIZE) + .user(os.getenv('PGUSER', 'benchmarkdbuser')) + .password(os.getenv('PGPASS', 'benchmarkdbpass')) + .dbname("hello_world") + .host("tfb-database") + .port(5432) + .build() ) - await db_pool.open() + # await db_pool.open() async def shutdown_db(app): global db_pool @@ -70,31 +72,31 @@ async def json_test(request): @bs.get('/db') async def single_db_query_test(request): row_id = random.randint(1, 10000) - async with db_pool.connection() as db_conn: - async with db_conn.cursor() as cursor: - await cursor.execute(READ_ROW_SQL, (row_id,)) - number = await cursor.fetchone() - return bs.json({'id': row_id, 'randomNumber': number[1]}) + async with db_pool.acquire() as connection: + number = await connection.fetch_val( + READ_ROW_SQL, [row_id] + ) + return bs.json({'id': row_id, 'randomNumber': number}) @bs.get('/queries') async def multiple_db_queries_test(request): num_queries = get_num_queries(request) row_ids = random.sample(range(1, 10000), num_queries) worlds = [] - async with db_pool.connection() as db_conn: - async with db_conn.cursor() as cursor: - for row_id in row_ids: - await cursor.execute(READ_ROW_SQL, (row_id,)) - number = await cursor.fetchone() - worlds.append({"id": row_id, "randomNumber": number[1]}) + async with db_pool.acquire() as connection: + for row_id in row_ids: + number = await connection.fetch_val( + READ_ROW_SQL, [row_id] + ) + worlds.append({"id": row_id, "randomNumber": number}) return bs.json(worlds) @bs.get('/fortunes') async def fortunes_test(request): - async with db_pool.connection() as db_conn: - async with db_conn.cursor() as cursor: - await cursor.execute("SELECT * FROM Fortune") - fortunes = await cursor.fetchall() + async with db_pool.acquire() as connection: + fortunes_fetch = await connection.fetch("SELECT * FROM Fortune") + # fortunes = fortunes_fetch.result() + fortunes = [list(item.values()) for item in fortunes_fetch.result()] fortunes.append(ADDITIONAL_ROW) fortunes.sort(key=lambda row: row[1]) data = fortune_template.render(fortunes=fortunes) @@ -108,26 +110,12 @@ async def db_updates_test(request): random.sample(range(1, 10000), num_queries) ), key=lambda x: x[1]) worlds = [{"id": row_id, "randomNumber": number} for row_id, number in updates] - for _ in range(5): - async with db_pool.connection() as db_conn: - try: - await db_conn.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED") - async with db_conn.cursor() as cursor: - for row_id, number in updates: - await cursor.execute(READ_ROW_SQL, (row_id,)) - await cursor.fetchone() - for _ in range(5): - try: - await cursor.executemany(WRITE_ROW_SQL, [(number, row_id) for row_id, number in updates]) - return bs.json(worlds) - except psycopg.errors.DeadlockDetected: - await db_conn.rollback() - continue - # await cursor.executemany(WRITE_ROW_SQL, [(number, row_id) for row_id, number in updates]) - except (psycopg.errors.OperationalError, psycopg.errors.PipelineAborted): - await db_conn.rollback() - continue - raise Exception("connect error") + async with db_pool.acquire() as connection: + for row_id, _ in updates: + await connection.fetch_val(READ_ROW_SQL, [row_id]) + # await db_conn.executemany(WRITE_ROW_SQL, updates) + await connection.execute_many(WRITE_ROW_SQL, updates) + return bs.json(worlds) @bs.get('/plaintext') async def plaintext_test(request): diff --git a/frameworks/Python/blacksheep/requirements-pypy.txt b/frameworks/Python/blacksheep/requirements-pypy.txt index f2c3d4fe9b6..217009599a2 100644 --- a/frameworks/Python/blacksheep/requirements-pypy.txt +++ b/frameworks/Python/blacksheep/requirements-pypy.txt @@ -1,3 +1,3 @@ -psycopg[pool] +psqlpy git+https://github.com/cirospaciari/socketify.py.git@main#egg=socketify h11 \ No newline at end of file From c0a29055d35242acb22dded33cd9f111b117f714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Mon, 30 Jun 2025 23:57:20 +0800 Subject: [PATCH 1505/1766] Upgrade hyperlane (#9976) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 939 +----------------------- frameworks/Rust/hyperlane/Cargo.toml | 8 +- frameworks/Rust/hyperlane/src/main.rs | 12 +- frameworks/Rust/hyperlane/src/server.rs | 4 +- frameworks/Rust/hyperlane/src/utils.rs | 4 + 5 files changed, 39 insertions(+), 928 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 6d7e6f52551..df5b7c8e55a 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -2,182 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "actix-codec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" -dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-sink", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "actix-http" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "base64", - "bitflags", - "bytes", - "bytestring", - "derive_more", - "encoding_rs", - "foldhash", - "futures-core", - "http", - "httparse", - "httpdate", - "itoa", - "language-tags", - "local-channel", - "mime", - "percent-encoding", - "pin-project-lite", - "rand 0.9.1", - "sha1", - "smallvec", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "actix-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "actix-router" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" -dependencies = [ - "bytestring", - "cfg-if", - "http", - "regex-lite", - "serde", - "tracing", -] - -[[package]] -name = "actix-rt" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" -dependencies = [ - "futures-core", - "tokio", -] - -[[package]] -name = "actix-server" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" -dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "futures-util", - "mio", - "socket2", - "tokio", - "tracing", -] - -[[package]] -name = "actix-service" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "actix-utils" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" -dependencies = [ - "local-waker", - "pin-project-lite", -] - -[[package]] -name = "actix-web" -version = "4.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" -dependencies = [ - "actix-codec", - "actix-http", - "actix-macros", - "actix-router", - "actix-rt", - "actix-server", - "actix-service", - "actix-utils", - "actix-web-codegen", - "bytes", - "bytestring", - "cfg-if", - "derive_more", - "encoding_rs", - "foldhash", - "futures-core", - "futures-util", - "impl-more", - "itoa", - "language-tags", - "log", - "mime", - "once_cell", - "pin-project-lite", - "regex-lite", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "socket2", - "time", - "tracing", - "url", -] - -[[package]] -name = "actix-web-codegen" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" -dependencies = [ - "actix-router", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "addr2line" version = "0.24.2" @@ -193,19 +17,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.3", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -236,15 +47,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" -dependencies = [ - "derive_arbitrary", -] - [[package]] name = "atoi" version = "2.0.0" @@ -287,12 +89,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" -[[package]] -name = "bin-encode-decode" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65d0c660f94a990c6e9015951188fcb5bebc4d21b6dd82244597aab2ad47dc36" - [[package]] name = "bitflags" version = "2.9.1" @@ -332,12 +128,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "bumpalo" -version = "3.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" - [[package]] name = "byteorder" version = "1.5.0" @@ -350,55 +140,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -[[package]] -name = "bytestring" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" -dependencies = [ - "bytes", -] - [[package]] name = "cfg-if" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" -[[package]] -name = "chunkify" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b2709f42d3cc45eda703223726b05afd42c36f2642e2d292deee1c31b86c69" -dependencies = [ - "dashmap", - "file-operation", - "once_cell", - "tokio", - "twox-hash", -] - -[[package]] -name = "clonelicious" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd646e01c20889af081dc20be3aeea14aaaeb87f60f68799483ad716baa33020" - -[[package]] -name = "color-output" -version = "6.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016afb96f1d207a365d175c64b6f7ddef44ba8dfc6ad60cafd596d9f0b146bb1" -dependencies = [ - "hyperlane-time", -] - -[[package]] -name = "compare_version" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a81172d3a2eb49276707c98711f3ea49a11f5566e4cb3092c738bbb7fd2098b" - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -497,47 +244,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derive_arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - [[package]] name = "digest" version = "0.10.7" @@ -576,15 +282,6 @@ dependencies = [ "serde", ] -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -613,15 +310,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "file-operation" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b81e9a35a431f57f3304aec4ed6a59c7f1fb82af62b02e18afe197e8e3769d" -dependencies = [ - "tokio", -] - [[package]] name = "flate2" version = "1.1.2" @@ -629,19 +317,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", - "libz-rs-sys", "miniz_oxide", ] -[[package]] -name = "float-cmp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" -dependencies = [ - "num-traits", -] - [[package]] name = "flume" version = "0.11.1" @@ -653,12 +331,6 @@ dependencies = [ "spin", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "foldhash" version = "0.1.5" @@ -674,12 +346,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "future-fn" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "472364b0e6f990c5d86b3fb5d99003898ae88af155b82575d6ca67ef554a9426" - [[package]] name = "futures" version = "0.3.31" @@ -808,11 +474,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", - "wasm-bindgen", ] [[package]] @@ -821,16 +485,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "halfbrown" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" -dependencies = [ - "hashbrown 0.15.4", - "serde", -] - [[package]] name = "hashbrown" version = "0.14.5" @@ -902,23 +556,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "hot-restart" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35c1ce67dc1d078f54ea1ed5293a49f11d63ff3a03b71c046319c31c9e4d243" - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http-compress" version = "2.13.5" @@ -932,15 +569,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.48.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f8cf4294ddfe85d2c2058f33caa9c82baa153a5826c293b2254ca293e6c11c" +checksum = "087d27cd719e5a80b34b1fab3aead80a366ce4e903d198334ede177f391e1fbb" [[package]] name = "http-type" -version = "4.24.1" +version = "4.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21c518bd37e8924bad5bd524382827cb29f9d7e2e37c825bf6f5bebeb54830c2" +checksum = "6831414384644bced5286ecba9ce813f72db3048e83b18f0e65f065e9d7fbe86" dependencies = [ "dashmap", "hex", @@ -955,117 +592,36 @@ dependencies = [ "url", ] -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyperlane" -version = "5.32.1" +version = "5.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b4662b7605f3d7d16d96389740c0844f0b7b122d523439b8340dd3c3a1de4a" +checksum = "2291a6f9a3d60bde6fd9c408313169ea589bce50a433cc6d4be9b83448de84bd" dependencies = [ "http-type", - "hyperlane-macros", "lombok-macros", "regex", "serde", ] -[[package]] -name = "hyperlane-broadcast" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7764d7256c4a54e929d2d82176108a718b2493ec982b353e382971b1fa02707e" -dependencies = [ - "dashmap", - "tokio", -] - -[[package]] -name = "hyperlane-log" -version = "1.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a07f72a789eaed32a981cd3f60c5ca10643e23ba7cfb715a9a835cb58cc5d4" -dependencies = [ - "file-operation", - "hyperlane-time", - "tokio", -] - -[[package]] -name = "hyperlane-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2321a4e27d729efe345507e1cfb6573881ce1f568e65f927b8115a55ad9b08f5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "hyperlane-time" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c145707425cdd097e117e8b4ee8baeaf8eb265658a5c37d2c4aa0b24fd26a507" -[[package]] -name = "hyperlane-utils" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98bd421d7b580ddbca85a490f08973ead09b3dd3ac778d3a1cf5b3fe41599d86" -dependencies = [ - "ahash", - "bin-encode-decode", - "chunkify", - "clonelicious", - "color-output", - "compare_version", - "file-operation", - "future-fn", - "futures", - "hex", - "hot-restart", - "hyperlane-broadcast", - "hyperlane-log", - "log", - "lombok-macros", - "num_cpus", - "once_cell", - "recoverable-spawn", - "recoverable-thread-pool", - "serde", - "serde-xml-rs", - "serde_json", - "serde_urlencoded", - "server-manager", - "simd-json", - "std-macro-extensions", - "twox-hash", - "url", - "urlencoding", - "utoipa", - "utoipa-rapidoc", - "utoipa-swagger-ui", -] - [[package]] name = "hyperlane_techempower" version = "0.1.0" dependencies = [ + "futures", "hyperlane", - "hyperlane-utils", + "hyperlane-time", + "num_cpus", + "once_cell", "rand 0.9.1", "serde", + "serde_json", "sqlx", ] @@ -1176,12 +732,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "impl-more" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" - [[package]] name = "indexmap" version = "2.9.0" @@ -1190,7 +740,6 @@ checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.4", - "serde", ] [[package]] @@ -1199,22 +748,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "language-tags" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" - [[package]] name = "lazy_static" version = "1.5.0" @@ -1231,52 +764,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" -dependencies = [ - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-rs-sys" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" -dependencies = [ - "zlib-rs", -] - -[[package]] -name = "litemap" -version = "0.8.0" +name = "libm" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] -name = "local-channel" -version = "0.1.5" +name = "libsqlite3-sys" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ - "futures-core", - "futures-sink", - "local-waker", + "pkg-config", + "vcpkg", ] [[package]] -name = "local-waker" -version = "0.1.4" +name = "litemap" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" @@ -1321,22 +828,6 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1353,7 +844,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "log", "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -1375,12 +865,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-integer" version = "0.1.46" @@ -1528,12 +1012,6 @@ dependencies = [ "zerovec", ] -[[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.21" @@ -1626,26 +1104,6 @@ dependencies = [ "getrandom 0.3.3", ] -[[package]] -name = "recoverable-spawn" -version = "3.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e80cb1811dee47b521fb2a022c3a533d378e24816b6e59763c18de10693eb6a" -dependencies = [ - "once_cell", - "tokio", -] - -[[package]] -name = "recoverable-thread-pool" -version = "2.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61323b7a7b470393e0a2ef3383ac50c2e19012b4aacea1101051a7cf8dc593fc" -dependencies = [ - "recoverable-spawn", - "tokio", -] - [[package]] name = "redox_syscall" version = "0.5.13" @@ -1655,26 +1113,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "ref-cast" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "regex" version = "1.11.1" @@ -1698,12 +1136,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "regex-lite" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -1730,40 +1162,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rust-embed" -version = "8.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" -dependencies = [ - "sha2", - "walkdir", -] - [[package]] name = "rustc-demangle" version = "0.1.25" @@ -1776,15 +1174,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[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 = "scopeguard" version = "1.2.0" @@ -1847,15 +1236,6 @@ dependencies = [ "serde", ] -[[package]] -name = "server-manager" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44ef1cee6952595d4726b88ffbb1535f123955c0af5c2dbf508c643efc684c94" -dependencies = [ - "tokio", -] - [[package]] name = "sha1" version = "0.10.6" @@ -1897,33 +1277,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simd-json" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c962f626b54771990066e5435ec8331d1462576cd2d1e62f24076ae014f92112" -dependencies = [ - "getrandom 0.3.3", - "halfbrown", - "ref-cast", - "serde", - "serde_json", - "simdutf8", - "value-trait", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "slab" version = "0.4.10" @@ -2162,12 +1515,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "std-macro-extensions" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35e64ebd4e130e82fbcd036b66007e97ab95803080c51286cf6ec5cf9c7d546" - [[package]] name = "stringprep" version = "0.1.5" @@ -2247,37 +1594,6 @@ dependencies = [ "syn", ] -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinystr" version = "0.8.1" @@ -2343,19 +1659,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - [[package]] name = "tracing" version = "0.1.41" @@ -2403,12 +1706,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - [[package]] name = "unicode-bidi" version = "0.3.18" @@ -2436,12 +1733,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "url" version = "2.5.4" @@ -2453,90 +1744,12 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "utoipa" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" -dependencies = [ - "indexmap", - "serde", - "serde_json", - "utoipa-gen", -] - -[[package]] -name = "utoipa-gen" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "utoipa-rapidoc" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5f8f5abd341cce16bb4f09a8bafc087d4884a004f25fb980e538d51d6501dab" -dependencies = [ - "actix-web", - "serde", - "serde_json", - "utoipa", -] - -[[package]] -name = "utoipa-swagger-ui" -version = "9.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" -dependencies = [ - "actix-web", - "base64", - "mime_guess", - "regex", - "rust-embed", - "serde", - "serde_json", - "url", - "utoipa", - "utoipa-swagger-ui-vendored", - "zip", -] - -[[package]] -name = "utoipa-swagger-ui-vendored" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2eebbbfe4093922c2b6734d7c679ebfebd704a0d7e56dfcb0d05818ce28977d" - -[[package]] -name = "value-trait" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0508fce11ad19e0aab49ce20b6bec7f8f82902ded31df1c9fc61b90f0eb396b8" -dependencies = [ - "float-cmp", - "halfbrown", - "itoa", - "ryu", -] - [[package]] name = "vcpkg" version = "0.2.15" @@ -2549,16 +1762,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -2580,63 +1783,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - [[package]] name = "whoami" version = "1.6.0" @@ -2647,15 +1793,6 @@ dependencies = [ "wasite", ] -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -2928,35 +2065,3 @@ dependencies = [ "quote", "syn", ] - -[[package]] -name = "zip" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" -dependencies = [ - "arbitrary", - "crc32fast", - "flate2", - "indexmap", - "memchr", - "zopfli", -] - -[[package]] -name = "zlib-rs" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" - -[[package]] -name = "zopfli" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 128c0258641..f69ffbaf8e1 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -18,10 +18,14 @@ exclude = [ ] [dependencies] -hyperlane = "5.32.1" -hyperlane-utils = "0.18.0" +futures = "0.3.31" +hyperlane = "5.39.0" +hyperlane-time = "0.5.5" +num_cpus = "1.17.0" +once_cell = "1.21.3" rand = "0.9.1" serde = "1.0.219" +serde_json = "1.0.140" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } [profile.dev] diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index 09dbb09aa55..49cad12eb5b 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -16,6 +16,7 @@ pub(crate) use utils::*; pub(crate) use std::{fmt, hint::black_box, sync::Arc}; +pub(crate) use futures::{executor::block_on, future::join_all}; pub(crate) use hyperlane::{ tokio::{ runtime::{Builder, Runtime}, @@ -25,15 +26,12 @@ pub(crate) use hyperlane::{ }, *, }; -pub(crate) use hyperlane_utils::{ - futures::{executor::block_on, future::join_all}, - once_cell::sync::Lazy, - serde::*, - serde_json::{Value, json}, - *, -}; +pub(crate) use hyperlane_time::*; pub(crate) use lazy::*; +pub(crate) use once_cell::sync::Lazy; pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng}; +pub(crate) use serde::*; +pub(crate) use serde_json::{Value, json}; pub(crate) use server::*; pub(crate) use sqlx::{ postgres::{PgPoolOptions, PgRow}, diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 9a9cf7544e4..e469a774c9f 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -17,8 +17,8 @@ async fn init_server() { server.port(8080).await; server.disable_linger().await; server.disable_nodelay().await; - server.error_handler(|_: String| {}).await; - server.http_line_buffer_size(256).await; + server.error_handler(async |_: PanicInfo| {}).await; + server.http_buffer_size(256).await; server.ws_buffer_size(256).await; server.request_middleware(request_middleware::request).await; #[cfg(any(feature = "dev", feature = "plaintext"))] diff --git a/frameworks/Rust/hyperlane/src/utils.rs b/frameworks/Rust/hyperlane/src/utils.rs index 5b22bbb8447..dbd4da546f3 100644 --- a/frameworks/Rust/hyperlane/src/utils.rs +++ b/frameworks/Rust/hyperlane/src/utils.rs @@ -1,5 +1,9 @@ use super::*; +pub fn get_thread_count() -> usize { + num_cpus::get().max(1) +} + pub fn escape_html(input: &str) -> String { let mut result: String = String::new(); for ch in input.chars() { From 9fdd0f6c628c6fcb06baaa49b50756aa22af9a96 Mon Sep 17 00:00:00 2001 From: Outer Heaven Legacy Date: Mon, 30 Jun 2025 21:14:45 +0400 Subject: [PATCH 1506/1766] Add benchmark tests for the Sib (#9969) * Add benchmark tests for the Sib * fix: json --- frameworks/Rust/sib/Cargo.toml | 26 ++++++ frameworks/Rust/sib/README.md | 16 ++++ frameworks/Rust/sib/benchmark_config.json | 24 +++++ frameworks/Rust/sib/sib.dockerfile | 11 +++ frameworks/Rust/sib/src/main.rs | 105 ++++++++++++++++++++++ 5 files changed, 182 insertions(+) create mode 100644 frameworks/Rust/sib/Cargo.toml create mode 100644 frameworks/Rust/sib/README.md create mode 100644 frameworks/Rust/sib/benchmark_config.json create mode 100644 frameworks/Rust/sib/sib.dockerfile create mode 100644 frameworks/Rust/sib/src/main.rs diff --git a/frameworks/Rust/sib/Cargo.toml b/frameworks/Rust/sib/Cargo.toml new file mode 100644 index 00000000000..b27977b5957 --- /dev/null +++ b/frameworks/Rust/sib/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "sib-techempower" +version = "0.0.1" +authors = ["mail@pooya.ai"] +description = "A high-performance, secure, and cross-platform modules optimized for efficiency, scalability, and reliability." +documentation = "https://docs.rs/sib" +edition = "2024" +keywords = ["sib", "networking", "real-time", "streaming", "web"] +license = "Apache-2.0" +repository = "https://github.com/PooyaEimandar/sib" +categories = ["development-tools"] +readme = "README.md" + +[dependencies] +sib = { git = "https://github.com/PooyaEimandar/sib", default-features = false, features = [ + "net-h1-server", +] } +bytes = { version = "1.10.1", default-features = false } +mimalloc = { version = "0.1.47", features = ["secure"] } +num_cpus = { version = "1.16" } +serde = { version = "1.0.219", default-features = false, features = ["derive"] } +serde_json = { version = "1.0.140" } + +[profile.release] +opt-level = 3 +codegen-units = 1 diff --git a/frameworks/Rust/sib/README.md b/frameworks/Rust/sib/README.md new file mode 100644 index 00000000000..d211c71acf7 --- /dev/null +++ b/frameworks/Rust/sib/README.md @@ -0,0 +1,16 @@ +# [SIB](https://github.com/pooyaeimandar/sib) web framework + +## Description + +A high-performance, secure, and cross-platform modules optimized for efficiency, scalability, and reliability. +SIB supports HTTP/1.1 as well as HTTP/3, and uses coroutine-based concurrency via [may](https://github.com/Xudong-Huang/may) along with zero-copy request/response handling, aiming for the lowest possible overhead. + +## Test URLs + +### Test 1: JSON Encoding + + http://localhost:8080/json + +### Test 2: Plaintext + + http://localhost:8080/plaintext diff --git a/frameworks/Rust/sib/benchmark_config.json b/frameworks/Rust/sib/benchmark_config.json new file mode 100644 index 00000000000..91c8ce06b13 --- /dev/null +++ b/frameworks/Rust/sib/benchmark_config.json @@ -0,0 +1,24 @@ +{ + "framework": "sib", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "framework": "may", + "language": "Rust", + "flavor": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "sib", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Rust/sib/sib.dockerfile b/frameworks/Rust/sib/sib.dockerfile new file mode 100644 index 00000000000..e4cf3f2530c --- /dev/null +++ b/frameworks/Rust/sib/sib.dockerfile @@ -0,0 +1,11 @@ +FROM rust:latest + +ADD ./ /sib +WORKDIR /sib + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release + +EXPOSE 8080 + +CMD ["./target/release/sib-techempower"] diff --git a/frameworks/Rust/sib/src/main.rs b/frameworks/Rust/sib/src/main.rs new file mode 100644 index 00000000000..c546157762d --- /dev/null +++ b/frameworks/Rust/sib/src/main.rs @@ -0,0 +1,105 @@ +use bytes::Bytes; +use sib::network::http::{ + h1::{H1Service, H1ServiceFactory}, + message::Status, + session::Session, +}; +use std::{ + fs, + io::{Read, Write}, +}; + +#[global_allocator] +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; + +#[derive(serde::Serialize)] +struct JsonMessage<'a> { + message: &'a str, +} + +impl Default for JsonMessage<'_> { + fn default() -> Self { + JsonMessage { + message: "Hello, World!", + } + } +} + +struct H1Server(pub T); + +struct HService; + +impl H1Service for HService { + fn call(&mut self, session: &mut Session) -> std::io::Result<()> { + if session.req_path() == Some("/json") { + // Respond with JSON + let json = serde_json::to_vec(&JsonMessage::default())?; + session + .status_code(Status::Ok) + .header_str("Content-Type", "application/json")? + .header_str("Content-Length", &json.len().to_string())? + .body(&Bytes::from(json)) + .eom(); + return Ok(()); + } + session + .status_code(Status::Ok) + .header_str("Content-Type", "text/plain")? + .header_str("Content-Length", "13")? + .body(&Bytes::from_static(b"Hello, World!")) + .eom(); + Ok(()) + } +} + +impl H1ServiceFactory for H1Server { + type Service = HService; + + fn service(&self, _id: usize) -> HService { + HService + } +} + +fn main() { + // Print number of CPU cores + let cpus = num_cpus::get(); + println!("CPU cores: {}", cpus); + + // Print total RAM in MB + if let Ok(meminfo) = fs::read_to_string("/proc/meminfo") { + for line in meminfo.lines() { + if line.starts_with("MemTotal:") { + let parts: Vec<&str> = line.split_whitespace().collect(); + if parts.len() >= 2 { + if let Ok(kb) = parts[1].parse::() { + let mb = kb / 1024; + println!("Total RAM: {} MB", mb); + } + } + break; + } + } + } + + // Pick a port and start the server + let addr = "0.0.0.0:8080"; + let mut threads = Vec::with_capacity(cpus); + + for _ in 0..cpus { + let handle = std::thread::spawn(move || { + let id = std::thread::current().id(); + println!("Listening {} on thread: {:?}", addr, id); + H1Server(HService) + .start(addr, cpus, 0, None) + .expect(&format!("h1 server failed to start for thread {:?}", id)) + .join() + .expect(&format!("h1 server failed to joining thread {:?}", id)); + }); + threads.push(handle); + } + + // Wait for all threads to complete (they won’t unless crashed) + for handle in threads { + handle.join().expect("Thread panicked"); + } +} From 6a9a9e4ea663ad4129d8ba27f44a8cb9bd7525e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 18:43:51 +0000 Subject: [PATCH 1507/1766] Bump com.fasterxml.jackson.core:jackson-core Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.13.0 to 2.15.0. - [Changelog](https://github.com/FasterXML/jackson-core/blob/jackson-core-2.15.0/release.properties) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.13.0...jackson-core-2.15.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-version: 2.15.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/activeweb/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/activeweb/pom.xml b/frameworks/Java/activeweb/pom.xml index ea329127a18..2f073f2424d 100644 --- a/frameworks/Java/activeweb/pom.xml +++ b/frameworks/Java/activeweb/pom.xml @@ -115,7 +115,7 @@ com.fasterxml.jackson.core jackson-core - 2.13.0 + 2.15.0 com.fasterxml.jackson.core From a4775c31fd002756b3b58f696549647acde72f81 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Wed, 2 Jul 2025 00:49:52 +0200 Subject: [PATCH 1508/1766] [Python] Bump Granian to 2.4 (#9979) --- frameworks/Python/granian/app_asgi.py | 23 +++++++++++++++------- frameworks/Python/granian/app_rsgi.py | 22 +++++++++++++++------ frameworks/Python/granian/requirements.txt | 8 ++++---- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/frameworks/Python/granian/app_asgi.py b/frameworks/Python/granian/app_asgi.py index 35e09133777..5bac57ae57d 100644 --- a/frameworks/Python/granian/app_asgi.py +++ b/frameworks/Python/granian/app_asgi.py @@ -1,4 +1,3 @@ -import asyncio import os from operator import itemgetter @@ -10,6 +9,15 @@ import jinja2 import orjson +PG_POOL_SIZE = 2 + + +class NoResetConnection(asyncpg.Connection): + __slots__ = () + + def get_reset_query(self): + return "" + async def pg_setup(): global pool @@ -18,7 +26,10 @@ async def pg_setup(): password=os.getenv('PGPASS', 'benchmarkdbpass'), database='hello_world', host='tfb-database', - port=5432 + port=5432, + min_size=PG_POOL_SIZE, + max_size=PG_POOL_SIZE, + connection_class=NoResetConnection, ) @@ -99,10 +110,9 @@ async def route_queries(scope, receive, send): async with pool.acquire() as connection: statement = await connection.prepare(SQL_SELECT) - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append({'id': row_id, 'randomNumber': number}) + rows = await statement.fetchmany([(v,) for v in row_ids]) + worlds = [{'id': row_id, 'randomNumber': number[0]} for row_id, number in zip(row_ids, rows)] await send(JSON_RESPONSE) await send({ 'type': 'http.response.body', @@ -136,8 +146,7 @@ async def route_updates(scope, receive, send): async with pool.acquire() as connection: statement = await connection.prepare(SQL_SELECT) - for row_id, _ in updates: - await statement.fetchval(row_id) + await statement.executemany([(i[0],) for i in updates]) await connection.executemany(SQL_UPDATE, updates) await send(JSON_RESPONSE) diff --git a/frameworks/Python/granian/app_rsgi.py b/frameworks/Python/granian/app_rsgi.py index 04a777460b1..196cc2c822a 100644 --- a/frameworks/Python/granian/app_rsgi.py +++ b/frameworks/Python/granian/app_rsgi.py @@ -9,6 +9,15 @@ import jinja2 import orjson +PG_POOL_SIZE = 2 + + +class NoResetConnection(asyncpg.Connection): + __slots__ = () + + def get_reset_query(self): + return "" + async def pg_setup(): global pool @@ -17,7 +26,10 @@ async def pg_setup(): password=os.getenv('PGPASS', 'benchmarkdbpass'), database='hello_world', host='tfb-database', - port=5432 + port=5432, + min_size=PG_POOL_SIZE, + max_size=PG_POOL_SIZE, + connection_class=NoResetConnection, ) @@ -77,10 +89,9 @@ async def route_queries(scope, proto): async with pool.acquire() as connection: statement = await connection.prepare(SQL_SELECT) - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append({'id': row_id, 'randomNumber': number}) + rows = await statement.fetchmany([(v,) for v in row_ids]) + worlds = [{'id': row_id, 'randomNumber': number[0]} for row_id, number in zip(row_ids, rows)] proto.response_bytes( 200, JSON_HEADERS, @@ -112,8 +123,7 @@ async def route_updates(scope, proto): async with pool.acquire() as connection: statement = await connection.prepare(SQL_SELECT) - for row_id, _ in updates: - await statement.fetchval(row_id) + await statement.executemany([(i[0],) for i in updates]) await connection.executemany(SQL_UPDATE, updates) proto.response_bytes( diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index 1739b7a2386..dd9715142d3 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ -asyncpg==0.29.0 -granian[uvloop]>=2.2.0,<2.3.0 -jinja2==3.1.4 -orjson==3.10.2 +asyncpg==0.30.0 +granian[uvloop]>=2.4.0,<2.5.0 +jinja2==3.1.6 +orjson==3.10.16 From 98cbbfde7b4520e715564093601a556545380265 Mon Sep 17 00:00:00 2001 From: LLT21 <43903768+LLT21@users.noreply.github.com> Date: Mon, 7 Jul 2025 20:46:37 +0200 Subject: [PATCH 1509/1766] MemoryCopy instead of Marshal.Copy + easier connection reuse (#9983) * MemoryCopy instead of Marshal.Copy * Simplier connection reuse * Faster MemoryCopy for all data access --------- Co-authored-by: LLT21 <> --- .../src/appMpower.Orm/Data/DbConnection.cs | 6 +-- .../src/appMpower.Orm/Data/DbConnections.cs | 39 ++----------------- .../appMpower.Orm/Data/DbConnectionsKeyed.cs | 39 ++----------------- .../appMpower/Middleware/CachingMiddelware.cs | 16 +++++++- .../Middleware/FortunesMiddleware.cs | 7 +++- .../Middleware/MultipleQueriesMiddleware.cs | 8 +++- .../Middleware/MultipleUpdatesMiddleware.cs | 8 +++- .../Middleware/SingleQueryMiddleware.cs | 8 +++- 8 files changed, 52 insertions(+), 79 deletions(-) diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs index 1a9c5ae0355..7175e1119b4 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs @@ -54,12 +54,12 @@ private void GetConnection() if (_keyed) { (_number, _odbcConnection, _keyedOdbcCommands) = - DbConnectionsKeyed.GetConnectionBase(_connectionString).GetAwaiter().GetResult(); + DbConnectionsKeyed.GetConnectionBase(_connectionString); } else { - (_number, _odbcConnection, _odbcCommands) = - DbConnections.GetConnectionBase(_connectionString).GetAwaiter().GetResult(); + (_number, _odbcConnection, _odbcCommands) = + DbConnections.GetConnectionBase(_connectionString); } } diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs index b278e54fa57..8897db571fc 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs @@ -5,32 +5,18 @@ namespace appMpower.Orm.Data { internal static class DbConnections { - private static bool _maxConnectionsCreated = false; private static short _createdConnections = 0; - private static short _maxConnections = 500; private static ConcurrentStack<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> _connectionsStack = new(); - private static ConcurrentQueue OdbcCommands)>> _waitingQueue = new(); - internal static async Task<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> GetConnectionBase(string connectionString) + internal static (int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands) GetConnectionBase(string connectionString) { (int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands) dbConnectionBase; if (!_connectionsStack.TryPop(out dbConnectionBase)) { - if (_maxConnectionsCreated) - { - dbConnectionBase = await GetDbConnectionBaseAsync(); - } - else - { - _createdConnections++; - dbConnectionBase = (Number: _maxConnections, OdbcConnection: new OdbcConnection(connectionString), OdbcCommands: new ConcurrentStack()); - - if (_createdConnections == _maxConnections) _maxConnectionsCreated = true; - - //Console.WriteLine("opened connection number: " + dbConnectionBase._number); - } + _createdConnections++; + dbConnectionBase = (Number: _createdConnections, OdbcConnection: new OdbcConnection(connectionString), OdbcCommands: new ConcurrentStack()); } return dbConnectionBase; @@ -38,24 +24,7 @@ internal static class DbConnections internal static void Release((int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands) dbConnectionBase) { - TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> taskCompletionSource; - - if (_waitingQueue.TryDequeue(out taskCompletionSource)) - { - taskCompletionSource.SetResult(dbConnectionBase); - } - else - { - _connectionsStack.Push(dbConnectionBase); - } - } - - private static Task<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)> GetDbConnectionBaseAsync() - { - var taskCompletionSource = new TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, ConcurrentStack OdbcCommands)>(TaskCreationOptions.RunContinuationsAsynchronously); - - _waitingQueue.Enqueue(taskCompletionSource); - return taskCompletionSource.Task; + _connectionsStack.Push(dbConnectionBase); } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs index 25cd4dcbab7..0779d640192 100644 --- a/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs +++ b/frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnectionsKeyed.cs @@ -5,32 +5,18 @@ namespace appMpower.Orm.Data { internal static class DbConnectionsKeyed { - private static bool _maxConnectionsCreated = false; private static short _createdConnections = 0; - private static short _maxConnections = 500; private static ConcurrentStack<(int Number, OdbcConnection OdbcConnection, Dictionary)> _connectionsStack = new(); - private static ConcurrentQueue)>> _waitingQueue = new(); - internal static async Task<(int Number, OdbcConnection OdbcConnection, Dictionary KeyedOdbcCommands)> GetConnectionBase(string connectionString) + internal static (int Number, OdbcConnection OdbcConnection, Dictionary KeyedOdbcCommands) GetConnectionBase(string connectionString) { (int Number, OdbcConnection OdbcConnection, Dictionary KeyedOdbcCommands) dbConnectionBase; if (!_connectionsStack.TryPop(out dbConnectionBase)) { - if (_maxConnectionsCreated) - { - dbConnectionBase = await GetDbConnectionBaseAsync(); - } - else - { - _createdConnections++; - dbConnectionBase = (Number: _maxConnections, OdbcConnection: new OdbcConnection(connectionString), KeyedOdbcCommands: new Dictionary()); - - if (_createdConnections == _maxConnections) _maxConnectionsCreated = true; - - //Console.WriteLine("opened connection number: " + dbConnectionBase._number); - } + _createdConnections++; + dbConnectionBase = (Number: _createdConnections, OdbcConnection: new OdbcConnection(connectionString), KeyedOdbcCommands: new Dictionary()); } return dbConnectionBase; @@ -38,24 +24,7 @@ internal static class DbConnectionsKeyed internal static void Release((int Number, OdbcConnection OdbcConnection, Dictionary KeyedOdbcCommands) dbConnectionBase) { - TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, Dictionary)> taskCompletionSource; - - if (_waitingQueue.TryDequeue(out taskCompletionSource)) - { - taskCompletionSource.SetResult(dbConnectionBase); - } - else - { - _connectionsStack.Push(dbConnectionBase); - } - } - - private static Task<(int Number, OdbcConnection OdbcConnection, Dictionary)> GetDbConnectionBaseAsync() - { - var taskCompletionSource = new TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, Dictionary)>(TaskCreationOptions.RunContinuationsAsynchronously); - - _waitingQueue.Enqueue(taskCompletionSource); - return taskCompletionSource.Task; + _connectionsStack.Push(dbConnectionBase); } } } \ No newline at end of file diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs index 0719f19c5ad..93a91a7529a 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/CachingMiddelware.cs @@ -46,7 +46,13 @@ public unsafe Task Invoke(HttpContext httpContext) { bytePointer = NativeMethods.DbById(i, out payloadLength, out handlePointer); json = new byte[payloadLength]; - Marshal.Copy(bytePointer, json, 0, payloadLength); + //Marshal.Copy(bytePointer, json, 0, payloadLength); + + fixed (byte* dest = json) + { + Buffer.MemoryCopy((void*)bytePointer, dest, payloadLength, payloadLength); + } + NativeMethods.FreeHandlePointer(handlePointer); _cache.Add(i, json); } @@ -72,7 +78,13 @@ public unsafe Task Invoke(HttpContext httpContext) { bytePointer = NativeMethods.DbById(keys[i], out payloadLength, out handlePointer); json = new byte[payloadLength]; - Marshal.Copy(bytePointer, json, 0, payloadLength); + //Marshal.Copy(bytePointer, json, 0, payloadLength); + + fixed (byte* dest = json) + { + Buffer.MemoryCopy((void*)bytePointer, dest, payloadLength, payloadLength); + } + NativeMethods.FreeHandlePointer(handlePointer); _cache.Add(keys[i], json); } diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs index 6321d515887..6e16aaec5fb 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/FortunesMiddleware.cs @@ -70,7 +70,12 @@ public unsafe Task Invoke(HttpContext httpContext) */ byte[] byteArray = new byte[payloadLength]; - Marshal.Copy(bytePointer, byteArray, 0, payloadLength); + //Marshal.Copy(bytePointer, json, 0, payloadLength); + + fixed (byte* dest = byteArray) + { + Buffer.MemoryCopy((void*)bytePointer, dest, payloadLength, payloadLength); + } List fortunes = new List(); diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs index 63964f0b90c..f2e6829f79c 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleQueriesMiddleware.cs @@ -40,7 +40,13 @@ public unsafe Task Invoke(HttpContext httpContext) IntPtr bytePointer = NativeMethods.Query(queries, out payloadLength, out handlePointer); byte[] json = new byte[payloadLength]; - Marshal.Copy(bytePointer, json, 0, payloadLength); + //Marshal.Copy(bytePointer, json, 0, payloadLength); + + fixed (byte* dest = json) + { + Buffer.MemoryCopy((void*)bytePointer, dest, payloadLength, payloadLength); + } + NativeMethods.FreeHandlePointer(handlePointer); response.Headers.Add( diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs index 5308afd3811..672f0d14e0f 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/MultipleUpdatesMiddleware.cs @@ -40,7 +40,13 @@ public unsafe Task Invoke(HttpContext httpContext) IntPtr bytePointer = NativeMethods.Updates(count, out payloadLength, out handlePointer); byte[] json = new byte[payloadLength]; - Marshal.Copy(bytePointer, json, 0, payloadLength); + //Marshal.Copy(bytePointer, json, 0, payloadLength); + + fixed (byte* dest = json) + { + Buffer.MemoryCopy((void*)bytePointer, dest, payloadLength, payloadLength); + } + NativeMethods.FreeHandlePointer(handlePointer); response.Headers.Add( diff --git a/frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs b/frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs index d43de484b66..747a55c5a63 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/Middleware/SingleQueryMiddleware.cs @@ -35,7 +35,13 @@ public unsafe Task Invoke(HttpContext httpContext) IntPtr bytePointer = NativeMethods.Db(out payloadLength, out handlePointer); byte[] json = new byte[payloadLength]; - Marshal.Copy(bytePointer, json, 0, payloadLength); + //Marshal.Copy(bytePointer, json, 0, payloadLength); + + fixed (byte* dest = json) + { + Buffer.MemoryCopy((void*)bytePointer, dest, payloadLength, payloadLength); + } + NativeMethods.FreeHandlePointer(handlePointer); response.Headers.Add( From 36edf868ac46969944cbe6760df932af5cc77608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= <83822098+eastspire@users.noreply.github.com> Date: Tue, 8 Jul 2025 02:46:57 +0800 Subject: [PATCH 1510/1766] Upgrade hyperlane (#9987) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update * feat: update * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: fortunes * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 45 ++++++++++++++++++---------- frameworks/Rust/hyperlane/Cargo.toml | 6 ++-- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index df5b7c8e55a..536749cba52 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -558,9 +558,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.13.5" +version = "2.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90935a9ba153dcca173ac3787b8c0b5e74eabc982a9ddf801da885d17ea20c25" +checksum = "c8e96d49fe9cb2263dd459ed72df6206870f0c0c6befa0bbc79227771c630a4c" dependencies = [ "brotli", "flate2", @@ -569,15 +569,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.50.0" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087d27cd719e5a80b34b1fab3aead80a366ce4e903d198334ede177f391e1fbb" +checksum = "2bcafcd7f8e3b8801c795910e390f461c765065502b294decccb7715d20c3bfa" [[package]] name = "http-type" -version = "4.26.0" +version = "4.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6831414384644bced5286ecba9ce813f72db3048e83b18f0e65f065e9d7fbe86" +checksum = "61b7ebec2f82af03e6e15005e0244ad2e08df1fffccafee3493e70222fa11a10" dependencies = [ "dashmap", "hex", @@ -594,9 +594,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "5.39.0" +version = "5.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2291a6f9a3d60bde6fd9c408313169ea589bce50a433cc6d4be9b83448de84bd" +checksum = "21630ec0514aff461fbd197da6d8436649559f5508806e80c5ddc0ef34287f82" dependencies = [ "http-type", "lombok-macros", @@ -606,9 +606,9 @@ dependencies = [ [[package]] name = "hyperlane-time" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c145707425cdd097e117e8b4ee8baeaf8eb265658a5c37d2c4aa0b24fd26a507" +checksum = "7d7e07007bd67be0c3f07646066d9300ea999fb7d3371610354393101ac2db2c" [[package]] name = "hyperlane_techempower" @@ -742,6 +742,17 @@ dependencies = [ "hashbrown 0.15.4", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "itoa" version = "1.0.15" @@ -803,9 +814,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lombok-macros" -version = "1.12.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8233f6e95093f205641478acbae36ebed40d71f6e89329ce92c0d3345aeb15a0" +checksum = "5a9490d57fd90a670d464a8a464e65a5822d1f34badd8ada1c53c0572f98e10e" dependencies = [ "proc-macro2", "quote", @@ -1534,9 +1545,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.103" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -1621,17 +1632,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "windows-sys 0.52.0", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index f69ffbaf8e1..96d2bc484a9 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -2,7 +2,7 @@ name = "hyperlane_techempower" version = "0.1.0" edition = "2024" -authors = ["root@ltpp.vip"] +authors = ["root@ltpp.vip"] license = "MIT" description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication.""" keywords = ["http", "request", "response", "tcp", "redirect"] @@ -19,8 +19,8 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "5.39.0" -hyperlane-time = "0.5.5" +hyperlane = "5.40.1" +hyperlane-time = "0.5.6" num_cpus = "1.17.0" once_cell = "1.21.3" rand = "0.9.1" From d735d6d2086c738b0b7e9071af47504b5aa7b2ef Mon Sep 17 00:00:00 2001 From: Denis Feklushkin Date: Tue, 8 Jul 2025 02:22:09 +0700 Subject: [PATCH 1511/1766] Vibe.d code improvements (Dlang) (#9982) * Vibe.d code improvements (Dlang) * Vibe.d: sporadic fortunes test failures fix --- frameworks/D/vibed/README.md | 2 +- frameworks/D/vibed/dub.json | 14 +++---- frameworks/D/vibed/dub.selections.json | 36 ++++++++--------- frameworks/D/vibed/source/postgresql.d | 53 ++++++++++---------------- 4 files changed, 45 insertions(+), 60 deletions(-) diff --git a/frameworks/D/vibed/README.md b/frameworks/D/vibed/README.md index ef06b49ed93..fe71e0720f0 100644 --- a/frameworks/D/vibed/README.md +++ b/frameworks/D/vibed/README.md @@ -12,7 +12,7 @@ This is the Vibe.D portion of a benchmarking test suite comparing a variety of w ## Infrastructure Software Versions The tests were run with: -* [Vibe.D v0.9.4](http://vibed.org/) +* [Vibe.D v0.10.2](http://vibed.org/) ## Test URLs ### JSON Encoding Test diff --git a/frameworks/D/vibed/dub.json b/frameworks/D/vibed/dub.json index 9b81c6bdbcd..3940efbe323 100644 --- a/frameworks/D/vibed/dub.json +++ b/frameworks/D/vibed/dub.json @@ -7,14 +7,13 @@ "Sönke Ludwig" ], "dependencies": { - "vibe-d": "0.9.5", - "mir-random": "2.2.15", - "vibe-d:tls": "0.9.5" + "vibe-d": "0.10.2", + "mir-random": "2.2.20", + "vibe-d:tls": "0.10.2" }, "targetType": "executable", "sourcePaths": [], "subConfigurations": { - "vibe-d": "vibe-core", "vibe-d:tls": "notls" }, "versions": [ @@ -30,11 +29,8 @@ "name": "postgresql", "mainSourceFile": "source/postgresql.d", "dependencies": { - "vibe-d-postgresql": "3.1.0-rc.1", - "dpq2": "1.0.17" - }, - "subConfigurations": { - "dpq2": "dynamic" + "vibe-d-postgresql": "3.2.0-rc1", + "dpq2": "1.2.3" } } ], diff --git a/frameworks/D/vibed/dub.selections.json b/frameworks/D/vibed/dub.selections.json index 7ef3c64873f..2b548c24919 100644 --- a/frameworks/D/vibed/dub.selections.json +++ b/frameworks/D/vibed/dub.selections.json @@ -1,26 +1,28 @@ { "fileVersion": 1, "versions": { - "botan": "1.12.19", - "botan-math": "1.0.3", "derelict-pq": "4.0.0", "derelict-util": "3.0.0-beta.2", - "diet-ng": "1.8.1", - "dpq2": "1.0.17", - "eventcore": "0.9.20", - "libasync": "0.8.6", - "memutils": "1.0.4", - "mir-algorithm": "3.14.19", - "mir-core": "1.1.111", - "mir-linux-kernel": "1.0.1", - "mir-random": "2.2.15", - "money": "2.3.1", - "openssl": "3.2.2", + "diet-ng": "1.8.4", + "dpq2": "1.2.3", + "eventcore": "0.9.36", + "mir-algorithm": "3.22.4", + "mir-core": "1.7.3", + "mir-linux-kernel": "1.2.1", + "mir-random": "2.2.20", + "money": "3.0.2", + "openssl": "3.3.4", + "openssl-static": "1.0.5+3.0.8", "silly": "1.1.1", "stdx-allocator": "2.77.5", - "taggedalgebraic": "0.11.22", - "vibe-core": "1.22.4", - "vibe-d": "0.9.5", - "vibe-d-postgresql": "3.1.0-rc.1" + "taggedalgebraic": "1.0.0", + "vibe-container": "1.6.2", + "vibe-core": "2.12.0", + "vibe-d": "0.10.2", + "vibe-d-postgresql": "3.2.0-rc1", + "vibe-http": "1.2.2", + "vibe-inet": "1.1.3", + "vibe-serialization": "1.0.7", + "vibe-stream": "1.1.1" } } diff --git a/frameworks/D/vibed/source/postgresql.d b/frameworks/D/vibed/source/postgresql.d index c853a56dadc..97cd48d3351 100644 --- a/frameworks/D/vibed/source/postgresql.d +++ b/frameworks/D/vibed/source/postgresql.d @@ -16,23 +16,27 @@ enum poolSize = 64; PostgresClient client; -shared static this() -{ - import derelict.pq.pq; - import derelict.util.exception : ShouldThrow; - ShouldThrow myMissingSymCB( string symbolName ) { return ShouldThrow.No; } - DerelictPQ.missingSymbolCallback = &myMissingSymCB; -} - void main() { - runWorkerTaskDist(&runServer); - runApplication(); -} + auto connectionInfo = "host=tfb-database port=5432 " + ~ "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass"; + + client = new PostgresClient(connectionInfo, poolSize, (Connection cn){ + cn.prepareEx("fortune_prpq", "SELECT id, message::text FROM Fortune"); + cn.prepareEx("db_prpq", "SELECT randomNumber, id FROM world WHERE id = $1"); + cn.prepareEx("db_update_prpq", "UPDATE world SET randomNumber = $1 WHERE id = $2"); + } ); + + { + // Establishing each connection in the pool and performing the PREPARE procedures + LockedConnection[poolSize] conns; + + foreach(ref c; conns) + c = client.lockConnection(); + } -void runServer() -{ import std.datetime : seconds; + auto router = new URLRouter; router.registerWebInterface(new WebInterface); router.rebuild(); @@ -42,6 +46,7 @@ void runServer() settings.options |= HTTPServerOption.reusePort; settings.port = 8080; listenHTTP(settings, router); + runEventLoop(); } class WebInterface { @@ -79,7 +84,6 @@ class WebInterface { int id = _uniformVariable(_gen); QueryParams qp; qp.preparedStatementName("db_prpq"); - qp.resultFormat = ValueFormat.BINARY; qp.argsVariadic(id); immutable result = conn.execPrepared(qp).rangify.front; auto w = WorldResponse(id, result[0].as!PGinteger); @@ -109,11 +113,9 @@ class WebInterface { scope data = new WorldResponse[count]; QueryParams qp; qp.preparedStatementName("db_prpq"); - qp.resultFormat = ValueFormat.BINARY; foreach (ref w; data) { int id = _uniformVariable(_gen); qp.argsVariadic(id); - immutable query = "SELECT randomNumber, id FROM world WHERE id = " ~ id.to!string; immutable result = conn.execPrepared(qp).rangify.front; w = WorldResponse(id, result[0].as!PGinteger); } @@ -147,7 +149,6 @@ class WebInterface { import std.uni : isNumber; auto conn = client.lockConnection(); - scope(exit) destroy(conn); int count = 1; if (queries.length && isNumber(queries[0])) @@ -159,24 +160,22 @@ class WebInterface { scope data = new WorldResponse[count]; QueryParams qp; qp.preparedStatementName("db_prpq"); - qp.resultFormat = ValueFormat.BINARY; QueryParams qp_update; qp_update.preparedStatementName("db_update_prpq"); - qp_update.resultFormat = ValueFormat.BINARY; foreach (ref w; data) { int id = _uniformVariable(_gen); qp.argsVariadic(id); - immutable query = "SELECT id, randomNumber FROM world WHERE id = " ~ id.to!string; immutable result = conn.execPrepared(qp).rangify.front; w = WorldResponse(id, result[0].as!PGinteger); // update random number w.randomNumber = _uniformVariable(_gen); qp_update.argsVariadic(w.randomNumber, id); + // persist to DB - conn.sendQueryPrepared(qp_update); + conn.execPrepared(qp_update); } // write response as JSON @@ -203,15 +202,3 @@ struct FortuneResponse { int id; string message; } - -static this() -{ - import std.process : environment; - auto connectionInfo = "host=tfb-database port=5432 " - ~ "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass"; - client = new PostgresClient(connectionInfo, poolSize, (Connection cn){ - cn.prepare("fortune_prpq", "SELECT id, message::text FROM Fortune"); - cn.prepare("db_prpq", "SELECT randomNumber, id FROM world WHERE id = $1"); - cn.prepare("db_update_prpq", "UPDATE world SET randomNumber = $1 WHERE id = $2"); - } ); -} From c92de00fe2ca3a47b7f8e193c23eed25478e3b51 Mon Sep 17 00:00:00 2001 From: Serg Gini Date: Tue, 8 Jul 2025 21:16:07 +0300 Subject: [PATCH 1512/1766] Update benchmark_config.json (#9988) Added /json and /plaintext for Vibe.D --- frameworks/D/vibed/benchmark_config.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/D/vibed/benchmark_config.json b/frameworks/D/vibed/benchmark_config.json index 8c69d8f25ad..af453d64312 100644 --- a/frameworks/D/vibed/benchmark_config.json +++ b/frameworks/D/vibed/benchmark_config.json @@ -73,8 +73,10 @@ "ldc-pgsql": { "db_url": "/db", "query_url": "/queries?queries=", + "plaintext_url": "/plaintext", "fortune_url": "/fortunes", "update_url": "/updates?queries=", + "json_url": "/json", "port": 8080, "approach": "Realistic", "classification": "Platform", From 3c18f02c4c6e1a323b98bd78c5258297dadc4b9a Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Tue, 8 Jul 2025 20:16:52 +0200 Subject: [PATCH 1513/1766] [Python] Review Granian db pools (#9989) --- frameworks/Python/granian/app_asgi.py | 8 +++----- frameworks/Python/granian/app_rsgi.py | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/frameworks/Python/granian/app_asgi.py b/frameworks/Python/granian/app_asgi.py index 5bac57ae57d..d7c7b732c27 100644 --- a/frameworks/Python/granian/app_asgi.py +++ b/frameworks/Python/granian/app_asgi.py @@ -9,7 +9,7 @@ import jinja2 import orjson -PG_POOL_SIZE = 2 +PG_POOL_SIZE = 4 class NoResetConnection(asyncpg.Connection): @@ -109,8 +109,7 @@ async def route_queries(scope, receive, send): worlds = [] async with pool.acquire() as connection: - statement = await connection.prepare(SQL_SELECT) - rows = await statement.fetchmany([(v,) for v in row_ids]) + rows = await connection.fetchmany(SQL_SELECT, [(v,) for v in row_ids]) worlds = [{'id': row_id, 'randomNumber': number[0]} for row_id, number in zip(row_ids, rows)] await send(JSON_RESPONSE) @@ -145,8 +144,7 @@ async def route_updates(scope, receive, send): worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] async with pool.acquire() as connection: - statement = await connection.prepare(SQL_SELECT) - await statement.executemany([(i[0],) for i in updates]) + await connection.executemany(SQL_SELECT, [(i[0],) for i in updates]) await connection.executemany(SQL_UPDATE, updates) await send(JSON_RESPONSE) diff --git a/frameworks/Python/granian/app_rsgi.py b/frameworks/Python/granian/app_rsgi.py index 196cc2c822a..b475137bb66 100644 --- a/frameworks/Python/granian/app_rsgi.py +++ b/frameworks/Python/granian/app_rsgi.py @@ -9,7 +9,7 @@ import jinja2 import orjson -PG_POOL_SIZE = 2 +PG_POOL_SIZE = 4 class NoResetConnection(asyncpg.Connection): @@ -88,8 +88,7 @@ async def route_queries(scope, proto): worlds = [] async with pool.acquire() as connection: - statement = await connection.prepare(SQL_SELECT) - rows = await statement.fetchmany([(v,) for v in row_ids]) + rows = await connection.fetchmany(SQL_SELECT, [(v,) for v in row_ids]) worlds = [{'id': row_id, 'randomNumber': number[0]} for row_id, number in zip(row_ids, rows)] proto.response_bytes( @@ -122,8 +121,7 @@ async def route_updates(scope, proto): worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] async with pool.acquire() as connection: - statement = await connection.prepare(SQL_SELECT) - await statement.executemany([(i[0],) for i in updates]) + await connection.executemany(SQL_SELECT, [(i[0],) for i in updates]) await connection.executemany(SQL_UPDATE, updates) proto.response_bytes( From ef2558b6dd7c9381c718a77512bfd1bb4115978e Mon Sep 17 00:00:00 2001 From: Outer Heaven Legacy Date: Mon, 14 Jul 2025 19:01:08 +0330 Subject: [PATCH 1514/1766] fix: build of sib (#9992) * refactor: rename message to util * fix: clippy --- frameworks/Rust/sib/Cargo.toml | 2 +- frameworks/Rust/sib/src/main.rs | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/sib/Cargo.toml b/frameworks/Rust/sib/Cargo.toml index b27977b5957..3b042bcdf9d 100644 --- a/frameworks/Rust/sib/Cargo.toml +++ b/frameworks/Rust/sib/Cargo.toml @@ -17,7 +17,7 @@ sib = { git = "https://github.com/PooyaEimandar/sib", default-features = false, ] } bytes = { version = "1.10.1", default-features = false } mimalloc = { version = "0.1.47", features = ["secure"] } -num_cpus = { version = "1.16" } +num_cpus = { version = "1.17.0" } serde = { version = "1.0.219", default-features = false, features = ["derive"] } serde_json = { version = "1.0.140" } diff --git a/frameworks/Rust/sib/src/main.rs b/frameworks/Rust/sib/src/main.rs index c546157762d..80e4c6cda74 100644 --- a/frameworks/Rust/sib/src/main.rs +++ b/frameworks/Rust/sib/src/main.rs @@ -1,7 +1,7 @@ use bytes::Bytes; use sib::network::http::{ h1::{H1Service, H1ServiceFactory}, - message::Status, + util::Status, session::Session, }; use std::{ @@ -63,7 +63,7 @@ impl H1ServiceFactory for H1Server { fn main() { // Print number of CPU cores let cpus = num_cpus::get(); - println!("CPU cores: {}", cpus); + println!("CPU cores: {cpus}"); // Print total RAM in MB if let Ok(meminfo) = fs::read_to_string("/proc/meminfo") { @@ -73,7 +73,7 @@ fn main() { if parts.len() >= 2 { if let Ok(kb) = parts[1].parse::() { let mb = kb / 1024; - println!("Total RAM: {} MB", mb); + println!("Total RAM: {mb} MB"); } } break; @@ -88,12 +88,12 @@ fn main() { for _ in 0..cpus { let handle = std::thread::spawn(move || { let id = std::thread::current().id(); - println!("Listening {} on thread: {:?}", addr, id); + println!("Listening {addr} on thread: {id:?}"); H1Server(HService) - .start(addr, cpus, 0, None) - .expect(&format!("h1 server failed to start for thread {:?}", id)) + .start(addr, cpus, 0) + .unwrap_or_else(|_| panic!("h1 server failed to start for thread {id:?}")) .join() - .expect(&format!("h1 server failed to joining thread {:?}", id)); + .unwrap_or_else(|_| panic!("h1 server failed to joining thread {id:?}")); }); threads.push(handle); } From d8194cdfae208388d3c9f108a1bb0690ad053347 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 18:16:00 +0000 Subject: [PATCH 1515/1766] Build(deps): bump org.postgresql:postgresql in /frameworks/Java/muserver Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.5 to 42.7.7. - [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.7.5...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/muserver/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/muserver/pom.xml b/frameworks/Java/muserver/pom.xml index bc4e4156c73..0b40f7a8b6f 100644 --- a/frameworks/Java/muserver/pom.xml +++ b/frameworks/Java/muserver/pom.xml @@ -35,7 +35,7 @@ org.postgresql postgresql - 42.7.5 + 42.7.7 com.zaxxer From 58f074d6923d48e09be2c00b59f6f244bfcf0bc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:36:09 +0000 Subject: [PATCH 1516/1766] Build(deps): bump aiohttp in /frameworks/Python/api_hour Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.10.11 to 3.12.14. - [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.10.11...v3.12.14) --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.12.14 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 c5edffe9b2d..5c128add682 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.10.11 +aiohttp==3.12.14 -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 53fbed6dc78c6fa01b6c4c42bc82621f1fe5a9eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:52:20 +0000 Subject: [PATCH 1517/1766] Build(deps): bump aiohttp in /frameworks/Python/aiohttp Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.11.18 to 3.12.14. - [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.11.18...v3.12.14) --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.12.14 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 0142f9212d2..c5c5d4e3eb2 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,3 +1,3 @@ -aiohttp==3.11.18 +aiohttp==3.12.14 jinja2==3.1.6 SQLAlchemy==2.0.40 From 59172604d68fa952cf5bb8931ad0afe48806fa66 Mon Sep 17 00:00:00 2001 From: Bradley Chatha Date: Tue, 15 Jul 2025 18:27:56 +0100 Subject: [PATCH 1518/1766] [D] Add Juptune Framework (#9991) --- frameworks/D/juptune/README.md | 19 ++ frameworks/D/juptune/benchmark_config.json | 25 ++ frameworks/D/juptune/juptune.dockerfile | 30 +++ frameworks/D/juptune/src/main.d | 274 +++++++++++++++++++++ frameworks/D/juptune/src/meson.build | 25 ++ frameworks/D/juptune/src/tests/common.d | 81 ++++++ frameworks/D/juptune/src/tests/plaintext.d | 41 +++ 7 files changed, 495 insertions(+) create mode 100755 frameworks/D/juptune/README.md create mode 100755 frameworks/D/juptune/benchmark_config.json create mode 100644 frameworks/D/juptune/juptune.dockerfile create mode 100644 frameworks/D/juptune/src/main.d create mode 100644 frameworks/D/juptune/src/meson.build create mode 100644 frameworks/D/juptune/src/tests/common.d create mode 100644 frameworks/D/juptune/src/tests/plaintext.d diff --git a/frameworks/D/juptune/README.md b/frameworks/D/juptune/README.md new file mode 100755 index 00000000000..afdc1ae5708 --- /dev/null +++ b/frameworks/D/juptune/README.md @@ -0,0 +1,19 @@ +# Juptune Benchmarking Test + +Benchmarks for the WIP Juptune library - an upcoming async I/O library based around io_uring. + +### Test Type Implementation Source Code + +* [PLAINTEXT](./src/tests/plaintext.d) + +## Important Libraries + +The tests were run with: + +* [Juptune](https://github.com/Juptune/juptune) + +## Test URLs + +### PLAINTEXT + +http://localhost:8080/plaintext \ No newline at end of file diff --git a/frameworks/D/juptune/benchmark_config.json b/frameworks/D/juptune/benchmark_config.json new file mode 100755 index 00000000000..02b9075844e --- /dev/null +++ b/frameworks/D/juptune/benchmark_config.json @@ -0,0 +1,25 @@ +{ + "framework": "juptune", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "juptune", + "language": "D", + "flavor": "ldc2", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Juptune", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/D/juptune/juptune.dockerfile b/frameworks/D/juptune/juptune.dockerfile new file mode 100644 index 00000000000..5d619ba4bc2 --- /dev/null +++ b/frameworks/D/juptune/juptune.dockerfile @@ -0,0 +1,30 @@ +FROM debian:bookworm-slim + +ARG LDC_VERSION=1.41.0 +ARG JUPTUNE_REF=3a27a36ce2f5f2ff7df7151311e18d9c3660ea8c +ARG TFB_TEST_NAME + +ENV TEST_NAME=${TFB_TEST_NAME} + +# Install system deps & LDC +RUN apt update \ + && apt install -y curl xz-utils gnupg libsodium-dev meson unzip pkg-config \ + && curl -fsS https://dlang.org/install.sh | bash -s ldc-${LDC_VERSION} + +# Install Juptune +WORKDIR /juptune +RUN curl -fsSL https://github.com/Juptune/juptune/archive/${JUPTUNE_REF}.zip -o code.zip \ + && unzip code.zip \ + && cd juptune* \ + && . ~/dlang/ldc-${LDC_VERSION}/activate \ + && meson setup build --buildtype debugoptimized -Ddefault_library=static \ + && meson install -C build + +# Compile everything +WORKDIR /app +COPY ./src/ . +RUN . ~/dlang/ldc-${LDC_VERSION}/activate \ + && meson setup build --buildtype debugoptimized -Ddefault_library=static \ + && meson compile -C build + +ENTRYPOINT [ "/app/build/juptune-tfb" ] \ No newline at end of file diff --git a/frameworks/D/juptune/src/main.d b/frameworks/D/juptune/src/main.d new file mode 100644 index 00000000000..91084b24288 --- /dev/null +++ b/frameworks/D/juptune/src/main.d @@ -0,0 +1,274 @@ +import core.time : msecs; +import std.parallelism : totalCPUs; +import std.process : environment; + +import juptune.core.util, + juptune.core.ds, + juptune.event, + juptune.event.fiber, + juptune.http; + +import tests.common : log; +import tests.plaintext; + +/++++ Constant config ++++/ + +enum SOCKET_BACKLOG_PER_THREAD = 1000; +enum FIBER_CALL_STACK_BYTES = 1024 * 100; +enum HTTP_READ_BUFFER_BYTES = 1024; +enum HTTP_WRITE_BUFFER_BYTES = 1024; + +enum HTTP_CONFIG = Http1Config() + .withReadTimeout(1000.msecs) + .withWriteTimeout(1000.msecs); + +static assert( + HTTP_READ_BUFFER_BYTES + HTTP_WRITE_BUFFER_BYTES < FIBER_CALL_STACK_BYTES / 4, + "To be safe, please ensure the buffer bytes are only a quarter the size of a fiber call stack." +); + +/++++ Globals ++++/ + +__gshared TcpSocket server; // Currently there's no mechanism to directly pass data to new threads, so global state has to be used. + +/++++ Functions ++++/ + +void main() +{ + auto loop = EventLoop( + EventLoopConfig() + .withFiberAllocatorConfig( + FiberAllocatorConfig() + .withBlockStackSize(FIBER_CALL_STACK_BYTES) + ) + ); + + // open() and listen() can't be ran outside of an event loop thread, so currently this is the janky way to setup the server. + loop.addNoGCThread(() @nogc nothrow { + server.open().resultAssert; + server.listen("0.0.0.0:8080", SOCKET_BACKLOG_PER_THREAD*totalCPUs).resultAssert; + juptuneEventLoopCancelThread(); + }); + loop.join(); + + // Then we can setup the proper loop threads. + foreach(i; 0..totalCPUs) + loop.addGCThread(&router); + loop.join(); +} + +// Juptune currently does not provide higher-level server features out of the box, so we have +// to hand-make a custom router. +// +// This is realistic in the sense that building a custom router is a completely valid, supported pattern +// for people who want/need something very specialised. +// +// This is unrealistic in the sense that once Juptune has a native router, the native router would +// almost certainly be used in a case like this (but since that's a TODO, this will have to do for now). +void router() nothrow +{ + try + { + enum Route + { + FAILSAFE, + plaintext, + } + + enum Method + { + FAILSAFE, + get + } + + union RouteInput + { + PlainTextHeaderInput plaintext; + } + + while(!juptuneEventLoopIsThreadCanceled()) + { + TcpSocket client; + + auto result = server.accept(client); + if(result.isError) + { + log("error accepting socket: ", result); + continue; + } + + result = async(function () nothrow { + auto client = juptuneEventLoopGetContext!TcpSocket; + scope(exit) if(client.isOpen) + auto _ = client.close(); + + Http1MessageSummary readSummary, writeSummary; + do + { + if(!client.isOpen) + return; + + // Read & Write primitives + ubyte[HTTP_READ_BUFFER_BYTES] readBuffer; + ubyte[HTTP_WRITE_BUFFER_BYTES] writeBuffer; + auto reader = Http1Reader(client, readBuffer, HTTP_CONFIG); + auto writer = Http1Writer(client, writeBuffer, HTTP_CONFIG); + + // Routing state + Route route; + Method method; + RouteInput input; + + // Error handling + uint errorCode; + string errorMsg; + void setError(uint code, string msg) + { + if(errorMsg !is null) + return; + errorCode = code; + errorMsg = msg; + } + + // Parse request line + { + Http1RequestLine requestLine; + auto result = reader.readRequestLine(requestLine); + if(result.isError) + { + log("readRequestLine() failed: ", result.error, ": ", result.context.slice); + return; + } + + requestLine.access((scope methodString, scope uri){ + switch(methodString) + { + case "GET": + method = Method.get; + break; + + default: + setError(405, "Unexpected method"); + break; + } + + switch(uri.path) + { + case "/plaintext": + route = Route.plaintext; + break; + + default: + setError(404, "Not found"); + break; + } + }); + } + + // Read headers + bool foundEndOfHeaders; + while(!foundEndOfHeaders) + { + auto result = reader.checkEndOfHeaders(foundEndOfHeaders); + if(result.isError) + { + log("checkEndOfHeaders() failed: ", result); + return; + } + else if(foundEndOfHeaders) + break; + + Http1Header header; + result = reader.readHeader(header); + if(result.isError) + { + log("readHeader() failed: ", result); + return; + } + + // Since we're using a custom router, we have the luxury of handling/ignoring headers during routing rather + // than stuffing them all into a hashmap, and doing the processing post-routing. + header.access((scope name, scope value){ + final switch(route) with(Route) + { + case FAILSAFE: break; + + case plaintext: + break; + } + }); + } + + // Read body + Http1BodyChunk chunk; + do { + chunk = Http1BodyChunk(); + auto result = reader.readBody(chunk); + if(result.isError) + { + log("readBody() failed: ", result); + return; + } + + // Likewise, we only need to deal with body data in certain routes, so we can ignore them in others. + chunk.access((scope data){ + final switch(route) with(Route) + { + case FAILSAFE: break; + + case plaintext: + break; + } + }); + } while(chunk.hasDataLeft); + + // Finish reading the message, and either dispatch it to a handler, or report an error back. + auto result = reader.finishMessage(readSummary); + if(result.isError) + { + log("finishMessage() failed: ", result); + return; + } + + if(errorMsg !is null) + { + import tests.common : putServerAndDate; + result = writer.putResponseLine(Http1Version.http11, errorCode, errorMsg).then!( + () => writer.putServerAndDate(), + () => writer.finishHeaders(), + () => writer.finishBody(), + () => writer.finishTrailers(), + () => writer.finishMessage(writeSummary), + ); + if(result.isError) + { + log("finishing a message [error variant] failed: ", result); + return; + } + continue; + } + + final switch(route) with(Route) + { + case FAILSAFE: break; + + case plaintext: + handlePlainText(input.plaintext, writer, writeSummary); + break; + } + } while(!readSummary.connectionClosed && !writeSummary.connectionClosed); + }, client, &asyncMoveSetter!TcpSocket); + if(result.isError) + { + log("error calling async(): ", result); + continue; + } + } + } + catch(Throwable ex) // @suppress(dscanner.suspicious.catch_em_all) + { + import std.exception : assumeWontThrow; + log("uncaught exception: ", ex.msg).assumeWontThrow; + debug log(ex.info).assumeWontThrow; + } +} \ No newline at end of file diff --git a/frameworks/D/juptune/src/meson.build b/frameworks/D/juptune/src/meson.build new file mode 100644 index 00000000000..6178143b97c --- /dev/null +++ b/frameworks/D/juptune/src/meson.build @@ -0,0 +1,25 @@ +#### Project configuration #### + +project('juptune-tfb', 'd') + +#### Sources #### + +srcs = files( + './main.d', + './tests/common.d', + './tests/plaintext.d', +) + +#### Dependencies #### + +juptune_dep = dependency('juptune') + +dep = declare_dependency( + include_directories: include_directories('.'), + sources: srcs, + dependencies: [juptune_dep], +) + +#### Executables #### + +main_exe = executable('juptune-tfb', dependencies: [dep]) \ No newline at end of file diff --git a/frameworks/D/juptune/src/tests/common.d b/frameworks/D/juptune/src/tests/common.d new file mode 100644 index 00000000000..a27ace1e712 --- /dev/null +++ b/frameworks/D/juptune/src/tests/common.d @@ -0,0 +1,81 @@ +module tests.common; + +import juptune.core.util : Result, then; +import juptune.http : Http1Writer; + +enum ENABLE_LOGGING = false; + +void log(Args...)(scope auto ref Args args) +{ + import std.exception : assumeWontThrow; + import std.stdio : writeln; + static if(ENABLE_LOGGING) + writeln(args).assumeWontThrow; +} + +Result putServerAndDate(scope ref Http1Writer writer) nothrow +{ + import std.datetime : Clock, DayOfWeek, Month; + import std.exception : assumeWontThrow; + + char[256] dateBuffer; + size_t dateCursor; + + void put(const(char)[] value) + { + dateBuffer[dateCursor..dateCursor+value.length] = value[0..$]; + dateCursor += value.length; + } + + void putInt(int value) + { + import juptune.core.util.conv : toBase10, IntToCharBuffer; + IntToCharBuffer buffer; + put(toBase10(value, buffer)); + } + + const currTime = Clock.currTime.assumeWontThrow.toUTC(); + final switch(currTime.dayOfWeek) with(DayOfWeek) + { + case mon: put("Mon, "); break; + case tue: put("Tue, "); break; + case wed: put("Wed, "); break; + case thu: put("Thu, "); break; + case fri: put("Fri, "); break; + case sat: put("Sat, "); break; + case sun: put("Sun, "); break; + } + + putInt(currTime.day); + put(" "); + + final switch(currTime.month) with(Month) + { + case jan: put("Jan "); break; + case feb: put("Feb "); break; + case mar: put("Mar "); break; + case apr: put("Apr "); break; + case may: put("May "); break; + case jun: put("Jun "); break; + case jul: put("Jul "); break; + case aug: put("Aug "); break; + case sep: put("Sep "); break; + case oct: put("Oct "); break; + case nov: put("Nov "); break; + case dec: put("Dec "); break; + } + + putInt(currTime.year); + put(" "); + + putInt(currTime.hour); + put(":"); + putInt(currTime.minute); + put(":"); + putInt(currTime.second); + put(" GMT"); + + return writer.putHeader("Server", "Juptune (Linux)").then!( + () => writer.putHeader("Date", dateBuffer[0..dateCursor]) + ); +} \ No newline at end of file diff --git a/frameworks/D/juptune/src/tests/plaintext.d b/frameworks/D/juptune/src/tests/plaintext.d new file mode 100644 index 00000000000..c2a26634b0a --- /dev/null +++ b/frameworks/D/juptune/src/tests/plaintext.d @@ -0,0 +1,41 @@ +module tests.plaintext; + +import juptune.http : Http1Writer, Http1Version, Http1MessageSummary; + +import tests.common : putServerAndDate, log; + +struct PlainTextHeaderInput +{ + // No header input, it's here just so the overarching logic exists. +} + +void handlePlainText( + scope ref PlainTextHeaderInput input, + scope ref Http1Writer writer, + scope ref Http1MessageSummary summary, +) nothrow +{ + import juptune.core.util : then; + import juptune.core.util.conv : IntToCharBuffer, toBase10; + + immutable RESPONSE = "Hello, World!"; + + IntToCharBuffer contentLengthBuffer; + const contentLength = toBase10(RESPONSE.length, contentLengthBuffer); + + auto result = writer.putResponseLine(Http1Version.http11, 200, "OK").then!( + () => writer.putServerAndDate(), + () => writer.putHeader("Content-Length", contentLength), + () => writer.putHeader("Content-Type", "text/plain"), + () => writer.finishHeaders(), + () => writer.putBody("Hello, World!"), + () => writer.finishBody(), + () => writer.finishTrailers(), + () => writer.finishMessage(summary) + ); + if(result.isError) + { + log("writing response [plaintext] failed: ", result); + return; + } +} \ No newline at end of file From 9816b9c94995b4b224e58e545e7d4ffb2fe42d13 Mon Sep 17 00:00:00 2001 From: LLT21 <43903768+LLT21@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:28:19 +0200 Subject: [PATCH 1519/1766] More modern native aot interface (#9994) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: “llt” <“luc.lefever@fidesoft.com”> --- .../appmpower/src/appMpower/NativeMethods.cs | 82 ++++++++----------- 1 file changed, 33 insertions(+), 49 deletions(-) diff --git a/frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs b/frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs index e24104d47fe..89b8a0764e3 100644 --- a/frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs +++ b/frameworks/CSharp/appmpower/src/appMpower/NativeMethods.cs @@ -1,62 +1,46 @@ using System; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -public unsafe partial class NativeMethods +public static partial class NativeMethods { #if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] + private const string LibName = "appMpower.Orm.dylib"; #else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#endif - public static extern void Dbms(int dbms); + private const string LibName = "appMpower.Orm.so"; +#endif -#if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#endif - public static extern void DbProvider(int dbProvider); + [LibraryImport(LibName, EntryPoint = "Dbms", StringMarshalling = StringMarshalling.Utf16)] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] + public static partial void Dbms(int dbms); -#if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl)] -#endif - public static extern void FreeHandlePointer(IntPtr handlePointer); + [LibraryImport(LibName, EntryPoint = "DbProvider", StringMarshalling = StringMarshalling.Utf16)] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] + public static partial void DbProvider(int dbProvider); -#if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#endif - //public static extern byte* Db(out int length); - public static extern IntPtr Db(out int length, out IntPtr handlePointer); + [LibraryImport(LibName, EntryPoint = "FreeHandlePointer")] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] + public static partial void FreeHandlePointer(IntPtr handlePointer); -#if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#endif - public static extern IntPtr Fortunes(out int length, out IntPtr handlePointer); + [LibraryImport(LibName, EntryPoint = "Db", StringMarshalling = StringMarshalling.Utf16)] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] + public static partial IntPtr Db(out int length, out IntPtr handlePointer); -#if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#endif - public static extern IntPtr Query(int queries, out int length, out IntPtr handlePointer); + [LibraryImport(LibName, EntryPoint = "Fortunes", StringMarshalling = StringMarshalling.Utf16)] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] -#if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#endif - public static extern IntPtr Updates(int queries, out int length, out IntPtr handlePointer); + public static partial IntPtr Fortunes(out int length, out IntPtr handlePointer); -#if DEBUG - [DllImport("appMpower.Orm.dylib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#else - [DllImport("appMpower.Orm.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] -#endif - public static extern IntPtr DbById(int id, out int length, out IntPtr handlePointer); -} + [LibraryImport(LibName, EntryPoint = "Query", StringMarshalling = StringMarshalling.Utf16)] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] + public static partial IntPtr Query(int queries, out int length, out IntPtr handlePointer); + + [LibraryImport(LibName, EntryPoint = "Updates", StringMarshalling = StringMarshalling.Utf16)] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] + public static partial IntPtr Updates(int queries, out int length, out IntPtr handlePointer); + + [LibraryImport(LibName, StringMarshalling = StringMarshalling.Utf16)] + [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] + public static partial IntPtr DbById(int id, out int length, out IntPtr handlePointer); + +} \ No newline at end of file From 890ba36aa7c1073602b1adacdd7177e5408f0e1d Mon Sep 17 00:00:00 2001 From: Ali RajabNezhad Date: Tue, 15 Jul 2025 20:59:06 +0330 Subject: [PATCH 1520/1766] [Python] Bump Panther to 5.0.1 (#9995) --- frameworks/Python/panther/app.py | 87 +++++++++----------- frameworks/Python/panther/panther.dockerfile | 18 ++-- frameworks/Python/panther/requirements.txt | 8 +- 3 files changed, 52 insertions(+), 61 deletions(-) diff --git a/frameworks/Python/panther/app.py b/frameworks/Python/panther/app.py index 0b20d44413c..4a257bc02e7 100644 --- a/frameworks/Python/panther/app.py +++ b/frameworks/Python/panther/app.py @@ -1,5 +1,4 @@ import multiprocessing -from pathlib import Path from random import randint, sample import asyncpg @@ -10,19 +9,22 @@ 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) +cpu_count = multiprocessing.cpu_count() +MAX_POOL_SIZE = 1000 // cpu_count +MIN_POOL_SIZE = max(MAX_POOL_SIZE // 2, 1) -pool = None +connection_pool = None + +fortune_template = jinja2.Environment( + loader=jinja2.FileSystemLoader('templates'), + autoescape=True +).get_template('fortune.html') @Event.startup -async def create_db_pool(): - global pool - pool = await asyncpg.create_pool( +async def on_startup(): + global connection_pool + connection_pool = await asyncpg.create_pool( user='benchmarkdbuser', password='benchmarkdbpass', database='hello_world', @@ -34,60 +36,42 @@ async def create_db_pool(): @Event.shutdown -async def clean_db_pool(): - await pool.close() - - -with Path('templates/fortune.html').open() as f: - fortune_template = jinja2.Template(f.read()) - - -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 +async def on_shutdown(): + await connection_pool.close() @API() -async def json_serialization(): +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) + async with connection_pool.acquire() as connection: + number = await connection.fetchval('SELECT id, randomnumber FROM world WHERE id = $1', 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) + try: + count = int(request.query_params.get('queries', 1)) + except (ValueError, TypeError): + count = 1 + row_ids = sample(range(1, 10000), min(max(count, 1), 500)) + async with connection_pool.acquire() as connection: + statement = await connection.prepare('SELECT id, randomnumber FROM world WHERE id = $1') 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: + async with connection_pool.acquire() as connection: fortune_records = await connection.fetch('SELECT * FROM Fortune') - fortune_records.append(ADDITIONAL_ROW) + fortune_records = [(row['id'], row['message']) for row in fortune_records] + fortune_records.append((0, 'Additional fortune added at request time.')) fortune_records.sort(key=lambda row: row[1]) data = fortune_template.render(fortunes=fortune_records) return HTMLResponse(data=data) @@ -95,24 +79,27 @@ async def fortunes(): @API() async def database_updates(request: Request): - num_queries = get_num_queries(request) + try: + count = int(request.query_params.get('queries', 1)) + except (ValueError, TypeError): + count = 1 + num_queries = min(max(count, 1), 500) + updates = list(zip( sample(range(1, 10000), num_queries), sorted(sample(range(1, 10000), num_queries)) )) - 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) + async with connection_pool.acquire() as connection: + statement = await connection.prepare('SELECT id, randomnumber FROM world WHERE id = $1') for _, row_id in updates: await statement.fetchval(row_id) - await connection.executemany(WRITE_ROW_SQL, updates) + await connection.executemany('UPDATE world SET randomnumber = $1 WHERE id = $2', updates) return Response(data=worlds) @API() -async def plaintext(): +def plaintext(): return PlainTextResponse(b'Hello, world!') diff --git a/frameworks/Python/panther/panther.dockerfile b/frameworks/Python/panther/panther.dockerfile index 31ec0377429..1ed09ea2374 100644 --- a/frameworks/Python/panther/panther.dockerfile +++ b/frameworks/Python/panther/panther.dockerfile @@ -1,12 +1,16 @@ -FROM python:3.11-bullseye - +FROM python:3.12 AS builder WORKDIR /panther +RUN python -m venv /opt/venv +RUN pip install --no-cache-dir uv +COPY requirements.txt . +RUN /usr/local/bin/uv pip install -r requirements.txt --python /opt/venv/bin/python -COPY ./ /panther - -RUN pip3 install -U pip -RUN pip3 install -r /panther/requirements.txt +FROM python:3.12-slim AS production +ENV PYTHONUNBUFFERED=1 +ENV PATH="/opt/venv/bin:$PATH" +COPY --from=builder /opt/venv /opt/venv +WORKDIR /panther +COPY . /panther EXPOSE 8080 - CMD gunicorn app:app -k uvicorn.workers.UvicornWorker -c panther_conf.py diff --git a/frameworks/Python/panther/requirements.txt b/frameworks/Python/panther/requirements.txt index 691d573162f..d5fbd99e7b8 100644 --- a/frameworks/Python/panther/requirements.txt +++ b/frameworks/Python/panther/requirements.txt @@ -1,5 +1,5 @@ -panther==4.3.1 -cython==3.0.11 -asyncpg==0.29.0 +panther==5.0.1 +cython==3.1.2 +asyncpg==0.30.0 gunicorn==23.0.0 -uvloop==0.20.0 +uvloop==0.21.0 From 3877be38816130223677a2b421e102215356456c Mon Sep 17 00:00:00 2001 From: "Oleg S." Date: Fri, 18 Jul 2025 21:31:17 +0300 Subject: [PATCH 1521/1766] fastwsgi: Update asyncpg and using methods for async tasks (#9998) --- frameworks/Python/fastwsgi/app-asgi.py | 33 +++++++++++---------- frameworks/Python/fastwsgi/requirements.txt | 8 ++--- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/frameworks/Python/fastwsgi/app-asgi.py b/frameworks/Python/fastwsgi/app-asgi.py index bda51b38cec..a3721c7174b 100644 --- a/frameworks/Python/fastwsgi/app-asgi.py +++ b/frameworks/Python/fastwsgi/app-asgi.py @@ -17,6 +17,14 @@ db_pool = None +PG_POOL_SIZE = 4 + +class NoResetConnection(asyncpg.Connection): + __slots__ = () + + def get_reset_query(self): + return "" + async def db_setup(): global db_pool db_pool = await asyncpg.create_pool( @@ -24,7 +32,10 @@ async def db_setup(): password=os.getenv('PGPASS', 'benchmarkdbpass'), database='hello_world', host='tfb-database', - port=5432 + port=5432, + min_size=PG_POOL_SIZE, + max_size=PG_POOL_SIZE, + connection_class=NoResetConnection, ) READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1' @@ -102,15 +113,10 @@ async def multiple_database_queries(scope, receive, send): row_ids = random.sample(range(1, 10000), num_queries) worlds = [ ] - db_conn = await db_pool.acquire() - try: - statement = await db_conn.prepare(READ_ROW_SQL) - for row_id in row_ids: - number = await statement.fetchval(row_id) - worlds.append( {'id': row_id, 'randomNumber': number} ) - finally: - await db_pool.release(db_conn) + async with db_pool.acquire() as db_conn: + rows = await db_conn.fetchmany(READ_ROW_SQL, [ (v, ) for v in row_ids ] ) + worlds = [ { 'id': row_id, 'randomNumber': number[0] } for row_id, number in zip(row_ids, rows) ] content = jsonify(worlds) await send(JSON_RESPONSE) await send({ @@ -154,14 +160,9 @@ async def database_updates(scope, receive, send): worlds = [ {"id": row_id, "randomNumber": number} for row_id, number in updates ] - db_conn = await db_pool.acquire() - try: - statement = await db_conn.prepare(READ_ROW_SQL) - for row_id, _ in updates: - await statement.fetchval(row_id) + async with db_pool.acquire() as db_conn: + await db_conn.executemany(READ_ROW_SQL, [ (i[0], ) for i in updates ] ) await db_conn.executemany(WRITE_ROW_SQL, updates) - finally: - await db_pool.release(db_conn) content = jsonify(worlds) await send(JSON_RESPONSE) diff --git a/frameworks/Python/fastwsgi/requirements.txt b/frameworks/Python/fastwsgi/requirements.txt index 85ba54c7e95..c98614bf3bd 100644 --- a/frameworks/Python/fastwsgi/requirements.txt +++ b/frameworks/Python/fastwsgi/requirements.txt @@ -1,8 +1,8 @@ click==8.0.1 -ujson==5.7.0 +ujson==5.10.0 #fastwsgi==0.0.9 -git+https://github.com/jamesroberts/fastwsgi.git@5572bb31b859d690be225707b9e7e25af397544b -asyncpg==0.27.0 -Jinja2==3.1.6 +git+https://github.com/jamesroberts/fastwsgi.git@eb6e60babab73e769f49c183cfc46bb270ca84bd +asyncpg==0.30.0 +jinja2==3.1.6 cachetools==5.3.0 asyncache==0.3.1 From 7db8f7e1e3e6fae346ba9606d00b180d0bcf0a70 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 22 Jul 2025 01:52:04 +0200 Subject: [PATCH 1522/1766] [php] Udate Adapterman with JIT (#9990) * Laravel adapterman jit * Symfony adapterman jit * Kumbiaphp adapterman jit * Slim adapterman jit --- .../PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile | 2 +- frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile | 2 +- frameworks/PHP/laravel/laravel-workerman.dockerfile | 7 +++---- frameworks/PHP/slim/slim-workerman-pgsql.dockerfile | 2 +- frameworks/PHP/slim/slim-workerman.dockerfile | 2 +- frameworks/PHP/symfony/symfony-workerman.dockerfile | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile index fa4069b3455..775a825d187 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile @@ -13,7 +13,7 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cliphp.ini /etc/php/8.4/cli/php.ini +COPY deploy/conf/cliphp.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini ADD ./ /kumbiaphp WORKDIR /kumbiaphp diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile index fe1c8ced5ea..9342ce03dbc 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile @@ -12,7 +12,7 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cliphp.ini /etc/php/8.4/cli/php.ini +COPY deploy/conf/cliphp.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini ADD ./ /kumbiaphp WORKDIR /kumbiaphp diff --git a/frameworks/PHP/laravel/laravel-workerman.dockerfile b/frameworks/PHP/laravel/laravel-workerman.dockerfile index eda02b9b70d..8b016a50626 100644 --- a/frameworks/PHP/laravel/laravel-workerman.dockerfile +++ b/frameworks/PHP/laravel/laravel-workerman.dockerfile @@ -4,9 +4,8 @@ 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 > /dev/null && \ - apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null - -RUN apt-get install -yqq git unzip \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null && \ + apt-get install -yqq git unzip \ php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl > /dev/null COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer @@ -26,7 +25,7 @@ RUN mkdir -p bootstrap/cache \ RUN composer require joanhey/adapterman --update-no-dev --no-scripts --quiet RUN php artisan optimize -COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini EXPOSE 8080 diff --git a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile index 2c2088a9d05..37b8f0999b5 100644 --- a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile +++ b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile @@ -15,7 +15,7 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini WORKDIR /slim COPY --link . . diff --git a/frameworks/PHP/slim/slim-workerman.dockerfile b/frameworks/PHP/slim/slim-workerman.dockerfile index 9f8806bc7bd..a8c535bb05c 100644 --- a/frameworks/PHP/slim/slim-workerman.dockerfile +++ b/frameworks/PHP/slim/slim-workerman.dockerfile @@ -14,7 +14,7 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini WORKDIR /slim COPY --link . . diff --git a/frameworks/PHP/symfony/symfony-workerman.dockerfile b/frameworks/PHP/symfony/symfony-workerman.dockerfile index ecf697d198f..480b734100a 100644 --- a/frameworks/PHP/symfony/symfony-workerman.dockerfile +++ b/frameworks/PHP/symfony/symfony-workerman.dockerfile @@ -20,7 +20,7 @@ COPY --link . . RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --no-scripts --quiet RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear -COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini EXPOSE 8080 From 642a5e69eef0a3acb6a433e92bfb4d3a311ec6db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:09:58 +0000 Subject: [PATCH 1523/1766] Build(deps): bump thor from 1.3.2 to 1.4.0 in /frameworks/Ruby/rails --- updated-dependencies: - dependency-name: thor dependency-version: 1.4.0 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 99b78fbb016..1308067065e 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -256,7 +256,7 @@ GEM mapping (~> 1.0) securerandom (0.4.1) stringio (3.1.5) - thor (1.3.2) + thor (1.4.0) timeout (0.4.3) traces (0.15.2) trilogy (2.8.1) From 9660e2c6029c72b935ef4d4fea562e23f326841b Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Tue, 22 Jul 2025 16:41:35 +0100 Subject: [PATCH 1524/1766] [rust/axum] performance improvements (#10001) * build: upgraded dependencies * feat: dependency updates and performance tweaks --- frameworks/Rust/axum/Cargo.lock | 967 ++++++++++++------------ frameworks/Rust/axum/Cargo.toml | 21 +- frameworks/Rust/axum/axum.dockerfile | 2 +- frameworks/Rust/axum/src/main.rs | 10 +- frameworks/Rust/axum/src/main_sqlx.rs | 4 +- frameworks/Rust/axum/src/pg/database.rs | 13 +- frameworks/Rust/axum/src/pg/models.rs | 4 +- frameworks/Rust/axum/src/sqlx/models.rs | 18 +- 8 files changed, 525 insertions(+), 514 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 90252cc8a57..d19c9254f3f 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -13,18 +13,18 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -72,13 +72,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -98,9 +98,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" @@ -173,7 +173,7 @@ dependencies = [ "mongodb", "num_cpus", "quick_cache", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_json", "serde_path_to_error", @@ -191,9 +191,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -224,9 +224,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bitflags" @@ -236,9 +236,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -266,20 +266,20 @@ dependencies = [ [[package]] name = "bson" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8113ff51309e2779e8785a246c10fb783e8c2452f134d6257fd71cc03ccd6c" +checksum = "7969a9ba84b0ff843813e7249eed1678d9b6607ce5a3b8f0a47af3fcf7978e6e" dependencies = [ "ahash", "base64 0.22.1", "bitvec", - "getrandom 0.2.15", - "getrandom 0.3.2", + "getrandom 0.2.16", + "getrandom 0.3.3", "hex", - "indexmap 2.7.0", + "indexmap 2.10.0", "js-sys", "once_cell", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_bytes", "serde_json", @@ -289,9 +289,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -307,9 +307,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.22" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ "jobserver", "libc", @@ -318,21 +318,21 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -365,7 +365,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] @@ -384,18 +384,18 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -408,9 +408,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -432,9 +432,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" @@ -448,9 +448,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -458,34 +458,34 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "deadpool" @@ -507,7 +507,7 @@ checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" dependencies = [ "async-trait", "deadpool", - "getrandom 0.2.15", + "getrandom 0.2.16", "serde", "tokio", "tokio-postgres", @@ -525,9 +525,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "pem-rfc7468", @@ -536,9 +536,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -552,31 +552,31 @@ checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "derive-where" -version = "1.2.7" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -599,7 +599,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -616,15 +616,21 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dtoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ "serde", ] @@ -638,24 +644,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[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.10" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "etcetera" @@ -670,9 +666,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -685,17 +681,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -815,7 +805,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -860,22 +850,22 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", @@ -893,9 +883,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" -version = "0.4.7" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -903,7 +893,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.7.0", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -916,7 +906,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.4", "serde", ] @@ -928,9 +918,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -943,7 +933,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.4", ] [[package]] @@ -954,9 +944,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -966,9 +956,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hickory-proto" -version = "0.24.3" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad3d6d98c648ed628df039541a5577bee1a7c83e9e16fe3dbedeea4cdfeb971" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" dependencies = [ "async-trait", "cfg-if", @@ -990,9 +980,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.2" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" dependencies = [ "cfg-if", "futures-util", @@ -1036,22 +1026,11 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -1070,12 +1049,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -1083,9 +1062,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1115,12 +1094,12 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "hyper", @@ -1131,14 +1110,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -1154,21 +1134,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -1177,31 +1158,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -1209,67 +1170,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.91", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1289,9 +1237,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1310,15 +1258,26 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.4", "serde", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -1333,22 +1292,23 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] @@ -1373,21 +1333,21 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libmimalloc-sys" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9d6fac27761dabcd4ee73571cdb06b7022dc99089acbe5435691edffaac0f4" +checksum = "bf88cd67e9de251c1781dbe2f641a1a3ad66eaae831b8a2c38fbdc5ddae16d4d" dependencies = [ "cc", "libc", @@ -1409,23 +1369,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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -1433,9 +1387,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru-cache" @@ -1455,7 +1409,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -1469,7 +1423,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -1480,7 +1434,7 @@ checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -1491,15 +1445,9 @@ checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.91", + "syn 2.0.104", ] -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matchit" version = "0.8.4" @@ -1518,15 +1466,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "mimalloc" -version = "0.1.46" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995942f432bbb4822a7e9c3faa87a695185b0d09273ba85f097b54f4e458f2af" +checksum = "b1791cbe101e95af5764f06f20f6760521f7158f69dbf9d6baf941ee1bf6bc40" dependencies = [ "libmimalloc-sys", ] @@ -1539,29 +1487,29 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] name = "mongodb" -version = "3.2.3" +version = "3.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf4261933e5113914caec01c4bb16a7502bdaa9cf80fd87191765e7d9ff16b2" +checksum = "d0f8c69f13acf07eae386a2974f48ffd9187ea2aba8defbea9aa34e7e272c5f3" dependencies = [ "async-trait", "base64 0.13.1", @@ -1592,7 +1540,7 @@ dependencies = [ "serde", "serde_bytes", "serde_with", - "sha-1", + "sha1", "sha2", "snap", "socket2", @@ -1611,14 +1559,14 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.2.3" +version = "3.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "619176c99deef0d50be51ce3193e9efd6a56ab0f4e6a38d5fd614880d148c7ae" +checksum = "b9202de265a3a8bbb43f9fe56db27c93137d4f9fb04c093f47e9c7de0c61ac7d" dependencies = [ "macro_magic", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -1676,9 +1624,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -1695,9 +1643,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "parking" @@ -1707,9 +1655,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1717,9 +1665,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -1754,27 +1702,27 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_shared", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1805,9 +1753,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "postgres-protocol" @@ -1822,7 +1770,7 @@ dependencies = [ "hmac", "md-5", "memchr", - "rand 0.9.1", + "rand 0.9.2", "sha2", "stringprep", ] @@ -1838,6 +1786,15 @@ dependencies = [ "postgres-protocol", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1846,9 +1803,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -1865,19 +1822,13 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quick_cache" version = "0.6.14" @@ -1886,24 +1837,24 @@ checksum = "6b450dad8382b1b95061d5ca1eb792081fb082adf48c678791fe917509596d5f" dependencies = [ "ahash", "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.4", "parking_lot", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "radium" @@ -1924,9 +1875,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -1958,7 +1909,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -1967,36 +1918,36 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "de3a5d9f0aba1dbcec1cc47f0ff94a4b778fe55bca98a6dfa92e4e094e57b1c4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", ] [[package]] name = "ref-cast" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -2030,13 +1981,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error", -] +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "ring" @@ -2046,7 +1993,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -2054,9 +2001,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest", @@ -2074,9 +2021,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc_version" @@ -2097,19 +2044,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.38.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - [[package]] name = "rustls" version = "0.21.12" @@ -2124,14 +2058,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -2147,9 +2081,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -2163,9 +2100,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", @@ -2174,15 +2111,39 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] [[package]] name = "scopeguard" @@ -2202,9 +2163,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" @@ -2217,9 +2178,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" dependencies = [ "serde", ] @@ -2232,16 +2193,16 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.10.0", "itoa", "memchr", "ryu", @@ -2272,15 +2233,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.0", + "indexmap 2.10.0", + "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -2290,25 +2253,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.91", -] - -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "syn 2.0.104", ] [[package]] @@ -2324,9 +2276,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2341,9 +2293,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -2364,7 +2316,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c962f626b54771990066e5435ec8331d1462576cd2d1e62f24076ae014f92112" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "halfbrown", "ref-cast", "serde", @@ -2381,24 +2333,21 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] @@ -2411,9 +2360,9 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2440,9 +2389,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2453,9 +2402,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ "base64 0.22.1", "bytes", @@ -2467,14 +2416,14 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.2", + "hashbrown 0.15.4", "hashlink", - "indexmap 2.7.0", + "indexmap 2.10.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.20", + "rustls 0.23.29", "serde", "serde_json", "sha2", @@ -2484,27 +2433,27 @@ dependencies = [ "tokio-stream", "tracing", "url", - "webpki-roots 0.26.7", + "webpki-roots 0.26.11", ] [[package]] name = "sqlx-macros" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "sqlx-macros-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" dependencies = [ "dotenvy", "either", @@ -2520,21 +2469,20 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.91", - "tempfile", + "syn 2.0.104", "tokio", "url", ] [[package]] name = "sqlx-mysql" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.6.0", + "bitflags 2.9.1", "byteorder", "bytes", "crc", @@ -2570,13 +2518,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.6.0", + "bitflags 2.9.1", "byteorder", "crc", "dotenvy", @@ -2607,9 +2555,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" dependencies = [ "atoi", "flume", @@ -2671,9 +2619,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -2688,13 +2636,13 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -2709,19 +2657,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "tempfile" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -2748,7 +2683,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -2759,14 +2694,14 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -2779,15 +2714,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -2804,9 +2739,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -2814,9 +2749,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -2829,17 +2764,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.0" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -2853,7 +2790,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -2895,7 +2832,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.9.1", + "rand 0.9.2", "socket2", "tokio", "tokio-util", @@ -2925,9 +2862,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -2963,11 +2900,11 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "bytes", "http", "pin-project-lite", @@ -3001,20 +2938,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -3032,9 +2969,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-bidi" @@ -3044,9 +2981,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -3092,12 +3029,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -3106,11 +3037,12 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.11.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.3.3", + "js-sys", "serde", "wasm-bindgen", ] @@ -3157,9 +3089,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -3198,7 +3130,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -3220,7 +3152,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3252,18 +3184,27 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] [[package]] name = "whoami" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ "redox_syscall", "wasite", @@ -3272,9 +3213,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -3300,11 +3241,61 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", ] [[package]] @@ -3471,20 +3462,14 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -3591,9 +3576,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -3603,55 +3588,54 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", "synstructure", ] @@ -3661,11 +3645,22 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -3674,13 +3669,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.104", ] [[package]] @@ -3704,9 +3699,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/frameworks/Rust/axum/Cargo.toml b/frameworks/Rust/axum/Cargo.toml index 901fac9e8ed..be0bf32250a 100644 --- a/frameworks/Rust/axum/Cargo.toml +++ b/frameworks/Rust/axum/Cargo.toml @@ -50,42 +50,43 @@ deadpool-postgres = { version = "0.14.1", features = ["rt_tokio_1", "serde"] } dotenv = "0.15.0" futures = "0.3.31" futures-util = "0.3.31" -mongodb = { version = "3.2.3", features = [ +mongodb = { version = "3.2.4", features = [ "zstd-compression", "snappy-compression", "zlib-compression", ] } -num_cpus = "1.16.0" -rand = { version = "0.9.1", features = ["small_rng"] } + +num_cpus = "1.17.0" +rand = { version = "0.9.2", features = ["small_rng"] } serde = { version = "1.0.219", features = ["derive"] } -serde_json = "1.0.140" -sqlx = { version = "0.8.5", features = [ +serde_json = "1.0.141" +sqlx = { version = "0.8.6", features = [ "postgres", "macros", "runtime-tokio", "tls-rustls", ] } -tokio = { version = "1.45.0", features = ["full"] } +tokio = { version = "1.46.1", features = ["full"] } tokio-pg-mapper = { version = "0.2.0" } tokio-pg-mapper-derive = { version = "0.2.0" } tokio-postgres = { version = "0.7.13" } tower = { version = "0.5.2", features = ["util"] } -tower-http = { version = "0.6.4", features = ["set-header"] } +tower-http = { version = "0.6.6", features = ["set-header"] } yarte = "0.15.7" simd-json = { version = "0.15.1", optional = true } axum-core = { version = "0.5.2", optional = true } mime = { version = "0.3.17", optional = true } bytes = { version = "1.10.1", optional = true } serde_path_to_error = { version = "0.1.17", optional = true } -socket2 = "0.5.9" +socket2 = "0.5.10" hyper = { version = "1.6", features = ["server", "http1"] } hyper-util = { version = "0.1", features = ["tokio", "server-auto", "http1"] } quick_cache = "0.6.14" -mimalloc = "0.1.46" +mimalloc = "0.1.47" [profile.release] lto = "fat" codegen-units = 1 -strip = true +# strip = true opt-level = 3 diff --git a/frameworks/Rust/axum/axum.dockerfile b/frameworks/Rust/axum/axum.dockerfile index 0805d0112f8..35167203a19 100644 --- a/frameworks/Rust/axum/axum.dockerfile +++ b/frameworks/Rust/axum/axum.dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/rust:1.86-slim-bookworm AS builder +FROM docker.io/rust:1.88-slim-bookworm AS builder RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config libssl-dev \ diff --git a/frameworks/Rust/axum/src/main.rs b/frameworks/Rust/axum/src/main.rs index ccbb4588eb9..0d79ce33bef 100644 --- a/frameworks/Rust/axum/src/main.rs +++ b/frameworks/Rust/axum/src/main.rs @@ -1,7 +1,7 @@ mod common; mod server; -use axum::{http::StatusCode, response::IntoResponse, routing::get, Router}; +use axum::{response::IntoResponse, routing::get, Router}; use common::models::Message; use dotenv::dotenv; use mimalloc::MiMalloc; @@ -14,20 +14,22 @@ use axum::Json; #[cfg(feature = "simd-json")] use common::simd_json::Json; +const HELLO_WORLD: &str = "Hello, World!"; + /// Return a plaintext static string. #[inline(always)] pub async fn plaintext() -> &'static str { - "Hello, World!" + &HELLO_WORLD } /// Return a JSON message. #[inline(always)] pub async fn json() -> impl IntoResponse { let message = Message { - message: "Hello, World!", + message: HELLO_WORLD, }; - (StatusCode::OK, Json(message)) + Json(message) } fn main() { diff --git a/frameworks/Rust/axum/src/main_sqlx.rs b/frameworks/Rust/axum/src/main_sqlx.rs index 276bdd5da32..692b398d9bb 100644 --- a/frameworks/Rust/axum/src/main_sqlx.rs +++ b/frameworks/Rust/axum/src/main_sqlx.rs @@ -1,7 +1,7 @@ mod common; mod sqlx; -use std::sync::Arc; +use std::{borrow::Cow, sync::Arc}; use ::sqlx::PgPool; use axum::{ @@ -80,7 +80,7 @@ async fn fortunes(State(AppState { db, .. }): State) -> impl IntoRespo fortunes.push(Fortune { id: 0, - message: "Additional fortune added at request time.".to_string(), + message: Cow::Borrowed("Additional fortune added at request time."), }); fortunes.sort_by(|a, b| a.message.cmp(&b.message)); diff --git a/frameworks/Rust/axum/src/pg/database.rs b/frameworks/Rust/axum/src/pg/database.rs index e834f74c23d..fcfcec520b7 100644 --- a/frameworks/Rust/axum/src/pg/database.rs +++ b/frameworks/Rust/axum/src/pg/database.rs @@ -1,4 +1,4 @@ -use std::{convert::Infallible, io, sync::Arc}; +use std::{borrow::Cow, convert::Infallible, io, sync::Arc}; use axum::{extract::FromRequestParts, http::request::Parts}; use futures::{stream::futures_unordered::FuturesUnordered, StreamExt, TryStreamExt}; @@ -99,15 +99,14 @@ impl PgConnection { for w in &mut worlds { w.randomnumber = random_id(&mut rng); - ids.push(w.id); - nids.push(w.randomnumber); + ids.push(&w.id); + nids.push(&w.randomnumber); } // Update the random worlds in the database. self.client .execute(&self.updates, &[&ids, &nids]) - .await - .unwrap(); + .await?; Ok(worlds) } @@ -115,7 +114,7 @@ impl PgConnection { pub async fn fetch_all_fortunes(&self) -> Result, PgError> { let mut fortunes = vec![Fortune { id: 0, - message: "Additional fortune added at request time.".parse().unwrap(), + message: Cow::Borrowed("Additional fortune added at request time."), }]; let rows = self @@ -128,7 +127,7 @@ impl PgConnection { while let Some(row) = rows.next().await.transpose()? { fortunes.push(Fortune { id: row.get(0), - message: row.get(1), + message: Cow::Owned(row.get(1)), }); } diff --git a/frameworks/Rust/axum/src/pg/models.rs b/frameworks/Rust/axum/src/pg/models.rs index 0c0df6536f4..63d0dd081aa 100644 --- a/frameworks/Rust/axum/src/pg/models.rs +++ b/frameworks/Rust/axum/src/pg/models.rs @@ -1,10 +1,12 @@ +use std::borrow::Cow; + use serde::{Deserialize, Serialize}; #[allow(non_snake_case)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub struct Fortune { pub id: i32, - pub message: String, + pub message: Cow<'static, str>, } #[allow(non_snake_case)] diff --git a/frameworks/Rust/axum/src/sqlx/models.rs b/frameworks/Rust/axum/src/sqlx/models.rs index 270fe941b17..a3b4e174bf3 100644 --- a/frameworks/Rust/axum/src/sqlx/models.rs +++ b/frameworks/Rust/axum/src/sqlx/models.rs @@ -1,10 +1,22 @@ +use std::borrow::Cow; + use serde::{Deserialize, Serialize}; -use sqlx::FromRow; +use sqlx::{FromRow, Row}; +use sqlx::postgres::PgRow; -#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub struct Fortune { pub id: i32, - pub message: String, + pub message: Cow<'static, str>, +} + +impl FromRow<'_, PgRow> for Fortune { + fn from_row(row: &PgRow) -> Result { + Ok(Fortune { + id: row.try_get(0usize)?, + message: Cow::Owned(row.try_get(1usize)?) + }) + } } #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)] From 7fac9975edab0ac0a9f4e3a70839c2e276b9ddd0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 08:43:28 -0700 Subject: [PATCH 1525/1766] Build(deps): bump starlette in /frameworks/Python/starlette (#10002) Bumps [starlette](https://github.com/encode/starlette) from 0.40.0 to 0.47.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.40.0...0.47.2) --- updated-dependencies: - dependency-name: starlette dependency-version: 0.47.2 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 b94ce4d5784..93b3b6b9a83 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -6,6 +6,6 @@ Jinja2==3.1.4 MarkupSafe==2.1.1 python-dotenv==0.20.0 PyYAML==6.0 -starlette==0.40.0 +starlette==0.47.2 uvicorn==0.20.0 uvloop==0.17.0 From b749f1f8cf72fbc22a74a91e09170fa703c8a8dd Mon Sep 17 00:00:00 2001 From: TachyonConcepts Date: Tue, 22 Jul 2025 22:43:53 +0700 Subject: [PATCH 1526/1766] =?UTF-8?q?Add=20Tachyon=20=E2=80=94=20a=20very?= =?UTF-8?q?=20slow=20and=20extremely=20unsafe=20Rust=20server=20(#10000)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add TachyonConcept * attach README.md * add link to repo * Add json support for benchmark --------- Co-authored-by: Feuerbach Vladislav Co-authored-by: vladcoderlab --- frameworks/Rust/tachyon-concept/README.md | 43 ++++++++++++++++++ .../tachyon-concept/benchmark_config.json | 45 +++++++++++++++++++ .../tachyon-concept-ub.dockerfile | 10 +++++ .../tachyon-concept.dockerfile | 10 +++++ 4 files changed, 108 insertions(+) create mode 100644 frameworks/Rust/tachyon-concept/README.md create mode 100644 frameworks/Rust/tachyon-concept/benchmark_config.json create mode 100644 frameworks/Rust/tachyon-concept/tachyon-concept-ub.dockerfile create mode 100644 frameworks/Rust/tachyon-concept/tachyon-concept.dockerfile diff --git a/frameworks/Rust/tachyon-concept/README.md b/frameworks/Rust/tachyon-concept/README.md new file mode 100644 index 00000000000..6ba0e93287a --- /dev/null +++ b/frameworks/Rust/tachyon-concept/README.md @@ -0,0 +1,43 @@ +# Tachyon + +[Tachyon Repo](https://github.com/TachyonConcepts/TachyonConcept) + +**Tachyon** is a web server written in 100% `unsafe` Rust. +Yes — **100%**. There isn’t a single `safe` block in the entire codebase. Safety is a suggestion, not a rule. + +This implementation is intentionally modest in scope and **supports only the `/plaintext` benchmark**. No JSON, no databases, no distractions. + +## Goals + +Tachyon is a server that makes no attempt to be fast, correct, or relevant. +It serves plaintext. Slowly. **VERY** slowly. +Nah... really... very slow. + +## Requirements + +- Linux kernel **6.0+** +- Rust **nightly** +- CPU with **AVX2** support + +> We require a modern Linux kernel to ensure our experimental use of io_uring does *not* work on older systems. +> Nightly Rust is used to maintain maximum instability across compiler versions. + +## Running Locally + +```bash +echo "2048 4096 8192" > /proc/sys/net/ipv4/tcp_wmem +echo "8192 16384 32768" > /proc/sys/net/ipv4/tcp_rmem +echo "4096 131072 262144" > /proc/sys/net/ipv4/tcp_mem + +sysctl -w net.core.somaxconn=65535 +sysctl -w net.ipv4.tcp_max_syn_backlog=65535 + +sysctl -w net.ipv4.tcp_fastopen=3 +sysctl -w net.ipv4.tcp_tw_reuse=1 +sysctl -w net.ipv4.tcp_fin_timeout=10 + +ulimit -n 65535 +ulimit -s unlimited + +git clone https://github.com/TachyonConcepts/TachyonConcept +cargo run --release diff --git a/frameworks/Rust/tachyon-concept/benchmark_config.json b/frameworks/Rust/tachyon-concept/benchmark_config.json new file mode 100644 index 00000000000..56db2f7293b --- /dev/null +++ b/frameworks/Rust/tachyon-concept/benchmark_config.json @@ -0,0 +1,45 @@ +{ + "framework": "tachyon-concept", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Rust", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "Tachyon", + "os": "Linux", + "database_os": "Linux", + "display_name": "Tachyon-Concept", + "notes": "", + "versus": "None" + }, + "ub": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "Rust", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "Tachyon", + "os": "Linux", + "database_os": "Linux", + "display_name": "Tachyon-Concept-UB", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Rust/tachyon-concept/tachyon-concept-ub.dockerfile b/frameworks/Rust/tachyon-concept/tachyon-concept-ub.dockerfile new file mode 100644 index 00000000000..4f7ea5501f0 --- /dev/null +++ b/frameworks/Rust/tachyon-concept/tachyon-concept-ub.dockerfile @@ -0,0 +1,10 @@ +FROM rust:latest +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app +RUN rustup install nightly +RUN git clone https://github.com/TachyonConcepts/TachyonConcept . +RUN RUSTFLAGS="-C target-cpu=native -C opt-level=3 -C target-feature=+avx2,+bmi2" cargo install --path . +RUN cargo clean +RUN chmod +x /app/run_ub.sh +EXPOSE 8080 +CMD /app/run_ub.sh \ No newline at end of file diff --git a/frameworks/Rust/tachyon-concept/tachyon-concept.dockerfile b/frameworks/Rust/tachyon-concept/tachyon-concept.dockerfile new file mode 100644 index 00000000000..04aedcc6ac1 --- /dev/null +++ b/frameworks/Rust/tachyon-concept/tachyon-concept.dockerfile @@ -0,0 +1,10 @@ +FROM rust:latest +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app +RUN rustup install nightly +RUN git clone https://github.com/TachyonConcepts/TachyonConcept . +RUN RUSTFLAGS="-C target-cpu=native -C opt-level=3 -C target-feature=+avx2,+bmi2" cargo install --path . +RUN cargo clean +RUN chmod +x /app/run.sh +EXPOSE 8080 +CMD /app/run.sh \ No newline at end of file From 84c5243906c59c4f9604f5c73d59347461188fab Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 28 Jul 2025 17:51:12 +0200 Subject: [PATCH 1527/1766] [php] Mixphp update to PHP/8.4 (#10005) --- frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile | 2 +- .../PHP/mixphp/mixphp-workerman-mysql.dockerfile | 10 +++++----- .../PHP/mixphp/mixphp-workerman-pgsql.dockerfile | 10 +++++----- frameworks/PHP/mixphp/mixphp.dockerfile | 10 +++++----- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile b/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile index 846a3b88a87..ce9292f244a 100644 --- a/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM phpswoole/swoole:5.1.3-php8.3 +FROM phpswoole/swoole:6.0.2-php8.4 RUN docker-php-ext-install pcntl opcache bcmath > /dev/null diff --git a/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile b/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile index 9ac2ffaf0a2..c2a282a9611 100644 --- a/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile @@ -1,16 +1,16 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3-cli php8.3-mbstring php8.3-curl php8.3-xml php8.3-mysql > /dev/null +RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential php8.4-cli php8.4-mbstring php8.4-curl php8.4-xml php8.4-mysql > /dev/null -RUN apt-get install -y php8.3-dev libevent-dev > /dev/null +RUN apt-get install -y php8.4-dev libevent-dev > /dev/null RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY php-jit.ini /etc/php/8.3/cli/php.ini +COPY php-jit.ini /etc/php/8.4/cli/php.ini ADD ./ /mixphp WORKDIR /mixphp diff --git a/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile b/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile index 1f63e1fd91f..85143701159 100644 --- a/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile @@ -1,16 +1,16 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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.3-cli php8.3-mbstring php8.3-curl php8.3-xml php8.3-pgsql > /dev/null +RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential php8.4-cli php8.4-mbstring php8.4-curl php8.4-xml php8.4-pgsql > /dev/null -RUN apt-get install -y php8.3-dev libevent-dev > /dev/null +RUN apt-get install -y php8.4-dev libevent-dev > /dev/null RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY php-jit.ini /etc/php/8.3/cli/php.ini +COPY php-jit.ini /etc/php/8.4/cli/php.ini ADD ./ /mixphp WORKDIR /mixphp diff --git a/frameworks/PHP/mixphp/mixphp.dockerfile b/frameworks/PHP/mixphp/mixphp.dockerfile index bbc64fd8705..360debab252 100644 --- a/frameworks/PHP/mixphp/mixphp.dockerfile +++ b/frameworks/PHP/mixphp/mixphp.dockerfile @@ -1,14 +1,14 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.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 nginx php8.3-fpm php8.3-mysql php8.3-dev > /dev/null +RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential nginx php8.4-fpm php8.4-mysql php8.4-dev > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.4/fpm/ -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 if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.4/fpm/php-fpm.conf ; fi; ADD ./ /mixphp WORKDIR /mixphp @@ -22,5 +22,5 @@ RUN chmod -R 777 /mixphp/runtime/logs EXPOSE 8080 -CMD service php8.3-fpm start && \ +CMD service php8.4-fpm start && \ nginx -c /mixphp/deploy/nginx.conf From bdf4a684a570bee768715b8324f68b07268e7bc9 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 28 Jul 2025 17:51:28 +0200 Subject: [PATCH 1528/1766] [php] Yii2 Adapterman add JIT (#10006) --- frameworks/PHP/yii2/yii2-workerman.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/yii2/yii2-workerman.dockerfile b/frameworks/PHP/yii2/yii2-workerman.dockerfile index 481276b13ca..204aeaf58a8 100644 --- a/frameworks/PHP/yii2/yii2-workerman.dockerfile +++ b/frameworks/PHP/yii2/yii2-workerman.dockerfile @@ -12,7 +12,7 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini WORKDIR /yii2 COPY --link . . From 874181534e8bfbfb63597b7fce7ecc9823a7bfd5 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 28 Jul 2025 17:52:18 +0200 Subject: [PATCH 1529/1766] [php] Slim pgsql update to Adapterman/0.7 (#10007) --- frameworks/PHP/slim/slim-workerman-pgsql.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile index 37b8f0999b5..8a06648dd86 100644 --- a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile +++ b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile @@ -23,7 +23,7 @@ COPY --link . . EXPOSE 8080 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN composer require joanhey/adapterman:^0.6 --quiet +RUN composer require joanhey/adapterman:^0.7 --quiet RUN sed -i 's|/index.php|/start.php|g' server.php From 08de5e840284905b03e86b80f6c20c7f4df704a6 Mon Sep 17 00:00:00 2001 From: Edgar Espina Date: Mon, 28 Jul 2025 11:52:53 -0400 Subject: [PATCH 1530/1766] jooby: upgrade to 4.0 (#10008) - major dependencies upgrade --- frameworks/Java/jooby/pom.xml | 32 ++------ .../src/main/java/com/techempower/App.java | 9 ++- .../src/main/java/com/techempower/Json.java | 23 ++++-- .../src/main/java/com/techempower/MvcApp.java | 4 +- .../main/java/com/techempower/PgClient.java | 78 +++++++++++-------- .../main/java/com/techempower/ReactivePg.java | 42 ++++------ .../main/java/com/techempower/Resource.java | 8 +- .../src/main/java/com/techempower/Util.java | 9 ++- .../src/main/java/com/techempower/World.java | 6 +- .../rocker/BufferRockerOutput.java | 65 ---------------- frameworks/Kotlin/kooby/benchmark_config.json | 6 +- frameworks/Kotlin/kooby/config.toml | 4 +- frameworks/Kotlin/kooby/pom.xml | 16 +--- .../Kotlin/kooby/src/main/kotlin/kooby/App.kt | 5 +- 14 files changed, 119 insertions(+), 188 deletions(-) delete mode 100644 frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index 6942156ba5c..a28a17ba815 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,8 +11,7 @@ jooby - 3.4.0 - 4.1.113.Final + 4.0.2 2.0.2 42.7.7 UTF-8 @@ -38,13 +37,6 @@ ${jooby.version} - - - com.mysql - mysql-connector-j - 8.4.0 - - org.postgresql @@ -55,7 +47,7 @@ io.vertx vertx-pg-client - 4.5.7 + 5.0.1 @@ -72,7 +64,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.6.0 + 3.6.1 add-source @@ -91,7 +83,7 @@ com.fizzed rocker-maven-plugin - 1.4.0 + 2.2.1 generate-rocker-templates @@ -110,7 +102,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 + 3.14.0 @@ -174,14 +166,10 @@ - - com.ongres.scram - client - 2.1 - io.netty netty-resolver-dns-native-macos + osx-aarch_64 @@ -221,14 +209,6 @@ - - io.netty - netty-bom - ${netty.version} - pom - import - - io.jooby jooby-bom diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/App.java b/frameworks/Java/jooby/src/main/java/com/techempower/App.java index 7a75f05d60b..bd43f712c5c 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/App.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/App.java @@ -1,5 +1,6 @@ package com.techempower; +import static com.techempower.Util.boxedRandomWorld; import static com.techempower.Util.randomWorld; import static io.jooby.ExecutionMode.EVENT_LOOP; import static io.jooby.MediaType.JSON; @@ -29,7 +30,6 @@ public class App extends Jooby { private static final byte[] MESSAGE_BYTES = MESSAGE.getBytes(StandardCharsets.US_ASCII); { - var bufferFactory = getBufferFactory(); /** Database: */ install(new HikariModule()); DataSource ds = require(DataSource.class); @@ -37,8 +37,11 @@ public class App extends Jooby { /** Template engine: */ install(new RockerModule()); + var outputFactory = getOutputFactory(); + Json.configure(outputFactory); + var message = outputFactory.wrap(MESSAGE_BYTES); get("/plaintext", ctx -> - ctx.send(bufferFactory.wrap(MESSAGE_BYTES)) + ctx.send(message) ); get("/json", ctx -> ctx @@ -99,7 +102,7 @@ public class App extends Jooby { statement.setInt(1, randomWorld()); try (ResultSet rs = statement.executeQuery()) { rs.next(); - result[i] = new World(rs.getInt("id"), randomWorld()); + result[i] = new World(rs.getInt("id"), boxedRandomWorld()); } // prepare update query updateSql.add("(?, ?)"); diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/Json.java b/frameworks/Java/jooby/src/main/java/com/techempower/Json.java index 2fa2af86ba1..a83db38d49d 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/Json.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/Json.java @@ -6,6 +6,8 @@ import com.dslplatform.json.DslJson; import com.dslplatform.json.JsonWriter; import com.dslplatform.json.runtime.Settings; +import io.jooby.output.Output; +import io.jooby.output.OutputFactory; public class Json { private final static DslJson dslJson = new DslJson<>(Settings.basicSetup()); @@ -15,36 +17,41 @@ public class Json { return dslJson.newWriter(1024); } }; + private static OutputFactory outputFactory; - public static ByteBuffer encode(Message data) { + public static void configure(OutputFactory outputFactory) { + Json.outputFactory =outputFactory.getContextFactory(); + } + + public static Output encode(Message data) { JsonWriter writer = pool.get(); writer.reset(); var converter = new _Message_DslJsonConverter.ObjectFormatConverter(dslJson); converter.write(writer, data); - return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); + return outputFactory.wrap(writer.getByteBuffer(), 0, writer.size()); } - public static ByteBuffer encode(World data) { + public static Output encode(World data) { JsonWriter writer = pool.get(); writer.reset(); var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson); converter.write(writer, data); - return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); + return outputFactory.wrap(writer.getByteBuffer(), 0, writer.size()); } - public static ByteBuffer encode(World[] data) { + public static Output encode(World[] data) { JsonWriter writer = pool.get(); writer.reset(); var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson); writer.serialize(data, converter); - return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); + return outputFactory.wrap(writer.getByteBuffer(), 0, writer.size()); } - public static ByteBuffer encode(List data) { + public static Output encode(List data) { JsonWriter writer = pool.get(); writer.reset(); var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson); writer.serialize(data, converter); - return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size()); + return outputFactory.wrap(writer.getByteBuffer(), 0, writer.size()); } } diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java b/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java index ad40629a635..1b69ad5fc87 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/MvcApp.java @@ -17,7 +17,9 @@ public static void main(String[] args) { /** Template engine: */ app.install(new RockerModule()); - app.mvc(new Resource_(app.require(DataSource.class))); + Json.configure(app.getOutputFactory()); + + app.mvc(new Resource_(app.require(DataSource.class), app.getOutputFactory())); }); } } diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java b/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java index dd5e9197f01..3bb393c8a3d 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java @@ -40,7 +40,45 @@ private static class DbConnection { private PreparedQuery> UPDATE_WORLD_QUERY; private SqlClientInternal updates; @SuppressWarnings("unchecked") - private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[128]; + private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[500]; + } + + public static class PgUpdate { + private DbConnection connection; + + public PgUpdate(DbConnection connection) { + this.connection = connection; + } + + public void selectWorldForUpdate(int queries, BiConsumer>> consumer) { + connection.queries.group(c -> { + PreparedQuery> statement = c.preparedQuery(SELECT_WORLD); + for (int i = 0; i < queries; i++) { + consumer.accept(i, statement); + } + }); + } + + public void updateWorld(World[] worlds, Handler>> handler) { + Arrays.sort(worlds); + int len = worlds.length; + if (0 < len && len <= connection.AGGREGATED_UPDATE_WORLD_QUERY.length) { + List arguments = new ArrayList<>(); + for (World world : worlds) { + arguments.add(world.getId()); + arguments.add(world.getRandomNumber()); + } + Tuple tuple = Tuple.tuple(arguments); + PreparedQuery> query = connection.AGGREGATED_UPDATE_WORLD_QUERY[len - 1]; + query.execute(tuple).onComplete(handler); + } else { + List batch = new ArrayList<>(); + for (World world : worlds) { + batch.add(Tuple.of(world.getRandomNumber(), world.getId())); + } + connection.UPDATE_WORLD_QUERY.executeBatch(batch).onComplete(handler); + } + } } private static class DbConnectionFactory extends ThreadLocal { @@ -129,51 +167,23 @@ public PgClient(Config config) { } public void selectWorld(Tuple row, Handler>> handler) { - this.sqlClient.get().SELECT_WORLD_QUERY.execute(row, handler); + this.sqlClient.get().SELECT_WORLD_QUERY.execute(row).onComplete(handler); } public void selectWorlds(int queries, Handler>> handler) { this.sqlClient.get().queries.group(c -> { for (int i = 0; i < queries; i++) { - c.preparedQuery(SELECT_WORLD).execute(Tuple.of(Util.randomWorld()), handler); + c.preparedQuery(SELECT_WORLD).execute(Tuple.of(Util.boxedRandomWorld())).onComplete(handler); } }); } public void fortunes(Handler>> handler) { - this.sqlClient.get().SELECT_FORTUNE_QUERY.execute(handler); - } - - public void selectWorldForUpdate(int queries, - BiConsumer>> consumer) { - this.sqlClient.get().queries.group(c -> { - PreparedQuery> statement = c.preparedQuery(SELECT_WORLD); - for (int i = 0; i < queries; i++) { - consumer.accept(i, statement); - } - }); + this.sqlClient.get().SELECT_FORTUNE_QUERY.execute().onComplete(handler); } - public void updateWorld(World[] worlds, Handler>> handler) { - Arrays.sort(worlds); - int len = worlds.length; - var connection = this.sqlClient.get(); - if (0 < len && len <= connection.AGGREGATED_UPDATE_WORLD_QUERY.length) { - List arguments = new ArrayList<>(); - for (World world : worlds) { - arguments.add(world.getId()); - arguments.add(world.getRandomNumber()); - } - Tuple tuple = Tuple.tuple(arguments); - PreparedQuery> query = connection.AGGREGATED_UPDATE_WORLD_QUERY[len - 1]; - query.execute(tuple, handler); - } else { - List batch = new ArrayList<>(); - for (World world : worlds) { - batch.add(Tuple.of(world.getRandomNumber(), world.getId())); - } - connection.UPDATE_WORLD_QUERY.executeBatch(batch, handler); - } + public PgUpdate updater() { + return new PgUpdate(sqlClient.get()); } private PgConnectOptions pgPoolOptions(Config config) { diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java index c0eef6fb05a..c14e45e317f 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java @@ -1,15 +1,13 @@ package com.techempower; +import static com.techempower.Util.boxedRandomWorld; import static com.techempower.Util.randomWorld; import static io.jooby.ExecutionMode.EVENT_LOOP; import static io.jooby.MediaType.JSON; import java.util.*; -import com.fizzed.rocker.RockerOutputFactory; -import com.techempower.rocker.BufferRockerOutput; import io.jooby.*; -import io.jooby.rocker.DataBufferOutput; import io.jooby.rocker.RockerModule; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowIterator; @@ -17,22 +15,16 @@ public class ReactivePg extends Jooby { { - /** Reduce the number of resources due we do reactive processing. */ - setServerOptions( - new ServerOptions() - .setIoThreads(Runtime.getRuntime().availableProcessors() + 1) - .setWorkerThreads(Runtime.getRuntime().availableProcessors() + 1) - ); - /** PG client: */ PgClient client = new PgClient(getConfig().getConfig("db")); /** Template engine: */ install(new RockerModule()); + Json.configure(getOutputFactory()); /** Single query: */ get("/db", ctx -> { - client.selectWorld(Tuple.of(randomWorld()), rsp -> { + client.selectWorld(Tuple.of(boxedRandomWorld()), rsp -> { if (rsp.succeeded()) { RowIterator rs = rsp.result().iterator(); Row row = rs.next(); @@ -43,7 +35,7 @@ public class ReactivePg extends Jooby { } }); return ctx; - }).setNonBlocking(true); + }); /** Multiple queries: */ get("/queries", ctx -> { @@ -64,24 +56,24 @@ public class ReactivePg extends Jooby { } }); return ctx; - }).setNonBlocking(true); + }); /** Update queries: */ get("/updates", ctx -> { int queries = Util.queries(ctx); World[] result = new World[queries]; - client.selectWorldForUpdate(queries, (index, statement) -> { - int id = randomWorld(); - statement.execute(Tuple.of(id), selectCallback -> { - if (selectCallback.failed()) { - sendError(ctx, selectCallback.cause()); + var updater = client.updater(); + updater.selectWorldForUpdate(queries, (index, statement) -> { + statement.execute(Tuple.of(boxedRandomWorld())).onComplete(rsp -> { + if (rsp.failed()) { + sendError(ctx, rsp.cause()); return; } result[index] = new World( - selectCallback.result().iterator().next().getInteger(0), - randomWorld()); + rsp.result().iterator().next().getInteger(0), + boxedRandomWorld()); if (index == queries - 1) { - client.updateWorld(result, updateCallback -> { + updater.updateWorld(result, updateCallback -> { if (updateCallback.failed()) { sendError(ctx, updateCallback.cause()); } else { @@ -93,10 +85,9 @@ public class ReactivePg extends Jooby { }); }); return ctx; - }).setNonBlocking(true); + }); /** Fortunes: */ - var factory = BufferRockerOutput.factory(); get("/fortunes", ctx -> { client.fortunes(rsp -> { if (rsp.succeeded()) { @@ -112,15 +103,14 @@ public class ReactivePg extends Jooby { Collections.sort(fortunes); /** render view: */ - views.fortunes template = views.fortunes.template(fortunes); ctx.setResponseType(MediaType.html) - .send(template.render(factory).toBuffer()); + .render(views.fortunes.template(fortunes)); } else { sendError(ctx, rsp.cause()); } }); return ctx; - }).setNonBlocking(true); + }); } private void sendError(Context ctx, Throwable cause) { diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/Resource.java b/frameworks/Java/jooby/src/main/java/com/techempower/Resource.java index b6eca3b4d80..30ea59472c8 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/Resource.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/Resource.java @@ -4,6 +4,8 @@ import io.jooby.annotation.GET; import io.jooby.annotation.Path; import io.jooby.annotation.Dispatch; +import io.jooby.output.Output; +import io.jooby.output.OutputFactory; import views.fortunes; import javax.sql.DataSource; @@ -28,14 +30,16 @@ public class Resource { private static final byte[] MESSAGE_BYTES = MESSAGE.getBytes(StandardCharsets.UTF_8); private final DataSource dataSource; + private final Output message; - public Resource(DataSource dataSource) { + public Resource(DataSource dataSource, OutputFactory factory) { this.dataSource = dataSource; + this.message = factory.wrap(MESSAGE_BYTES); } @GET @Path("/plaintext") public void plaintText(Context ctx) { - ctx.send(MESSAGE_BYTES); + ctx.send(message); } @GET @Path("/json") diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/Util.java b/frameworks/Java/jooby/src/main/java/com/techempower/Util.java index 7fcef41d43d..fd2f14c86ca 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/Util.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/Util.java @@ -1,11 +1,13 @@ package com.techempower; import io.jooby.Context; -import io.jooby.Value; +import io.jooby.value.Value; import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; public class Util { + private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new); public static int queries(Context ctx) { try { @@ -21,4 +23,9 @@ public static int queries(Context ctx) { public static int randomWorld() { return 1 + ThreadLocalRandom.current().nextInt(10000); } + + public static int boxedRandomWorld() { + final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); + return BOXED_RND[rndValue - 1]; + } } diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/World.java b/frameworks/Java/jooby/src/main/java/com/techempower/World.java index d525eeee44a..4b4259cab42 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/World.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/World.java @@ -7,9 +7,9 @@ public class World implements Comparable { private int id; - private int randomNumber; + private Integer randomNumber; - public World(int id, int randomNumber) { + public World(int id, Integer randomNumber) { this.id = id; this.randomNumber = randomNumber; } @@ -18,7 +18,7 @@ public int getId() { return id; } - public int getRandomNumber() { + public Integer getRandomNumber() { return randomNumber; } diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java b/frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java deleted file mode 100644 index 78abf2056e4..00000000000 --- a/frameworks/Java/jooby/src/main/java/com/techempower/rocker/BufferRockerOutput.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.techempower.rocker; - -import com.fizzed.rocker.ContentType; -import com.fizzed.rocker.RockerOutput; -import com.fizzed.rocker.RockerOutputFactory; - -import java.io.IOException; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -public class BufferRockerOutput implements RockerOutput { - private final ByteBuffer buffer; - - public BufferRockerOutput(ByteBuffer buffer) { - this.buffer = buffer; - } - - @Override - public ContentType getContentType() { - return ContentType.RAW; - } - - @Override - public Charset getCharset() { - return StandardCharsets.UTF_8; - } - - @Override - public BufferRockerOutput w(String string) throws IOException { - buffer.put(string.getBytes(getCharset())); - return this; - } - - @Override - public BufferRockerOutput w(byte[] bytes) throws IOException { - buffer.put(bytes); - return this; - } - - @Override - public int getByteLength() { - return buffer.remaining(); - } - - public ByteBuffer toBuffer() { - return buffer.flip(); - } - - public static RockerOutputFactory factory() { - var cache = new ThreadLocal() { - @Override - protected BufferRockerOutput initialValue() { - return new BufferRockerOutput(ByteBuffer.allocateDirect(2048)); - } - }; - return (contentType, charsetName) -> cache.get().reset(); - } - - private BufferRockerOutput reset() { - buffer.clear(); - return this; - } -} diff --git a/frameworks/Kotlin/kooby/benchmark_config.json b/frameworks/Kotlin/kooby/benchmark_config.json index 08782f2bf2b..0d0f5e499dd 100644 --- a/frameworks/Kotlin/kooby/benchmark_config.json +++ b/frameworks/Kotlin/kooby/benchmark_config.json @@ -14,15 +14,15 @@ "framework": "kooby: jooby+kotlin", "language": "Kotlin", "flavor": "None", - "platform": "Undertow", + "platform": "Netty", "database": "Postgres", "database_os": "Linux", "orm": "Raw", "webserver": "None", "os": "Linux", - "notes": "Jooby with Kotlin and Undertow", + "notes": "Jooby with Kotlin and Netty", "display_name": "kooby", - "versus": "undertow" + "versus": "netty" } }] } diff --git a/frameworks/Kotlin/kooby/config.toml b/frameworks/Kotlin/kooby/config.toml index f2434cf8daf..137149046d6 100644 --- a/frameworks/Kotlin/kooby/config.toml +++ b/frameworks/Kotlin/kooby/config.toml @@ -14,6 +14,6 @@ database = "Postgres" database_os = "Linux" os = "Linux" orm = "Raw" -platform = "Undertow" +platform = "Netty" webserver = "None" -versus = "undertow" +versus = "netty" diff --git a/frameworks/Kotlin/kooby/pom.xml b/frameworks/Kotlin/kooby/pom.xml index f89e3b85bf6..c064d54dcd3 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -12,12 +12,12 @@ kooby: jooby+kotlin - 3.3.0 + 4.0.2 42.7.7 UTF-8 22 22 - 2.0.20 + 2.2.0 kooby.AppKt @@ -47,14 +47,6 @@ jooby-rocker - - - - com.mysql - mysql-connector-j - 9.0.0 - - org.postgresql @@ -77,7 +69,7 @@ com.fizzed rocker-maven-plugin - 1.4.0 + 2.2.1 generate-rocker-templates @@ -127,7 +119,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 + 3.14.0 diff --git a/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt b/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt index 958991e29d3..e024fd386a5 100644 --- a/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt +++ b/frameworks/Kotlin/kooby/src/main/kotlin/kooby/App.kt @@ -43,8 +43,9 @@ fun main(args: Array) { install(HikariModule()) val ds = require(DataSource::class) + val message = outputFactory.wrap(MESSAGE_BYTES); get("/plaintext") { - ctx.send(MESSAGE_BYTES) + ctx.send(message) } get("/json") { @@ -158,6 +159,6 @@ private fun nextRandom(rnd: Random): Int { fun Context.queries() = try { this.query("queries").intValue(1).coerceIn(1, 500) -} catch (x: BadRequestException) { +} catch (_: BadRequestException) { 1 } From cb0be72c060ccf4651504bb2712dbdefe6154ad0 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 29 Jul 2025 20:19:59 +0200 Subject: [PATCH 1531/1766] [php] Leaf Adapterman add JIT (#10016) --- frameworks/PHP/leaf/leaf-workerman.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/leaf/leaf-workerman.dockerfile b/frameworks/PHP/leaf/leaf-workerman.dockerfile index f26d9c999ba..c98f11f5c84 100644 --- a/frameworks/PHP/leaf/leaf-workerman.dockerfile +++ b/frameworks/PHP/leaf/leaf-workerman.dockerfile @@ -15,7 +15,7 @@ RUN apt-get install -y libevent-dev php8.4-dev > /dev/null \ && pecl install event-3.1.4 > /dev/null \ && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/php.ini +COPY --link deploy/conf/cli-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini WORKDIR /leaf COPY --link . . From 18be8bb6e8c7f612c5a52dada469bbacf351914e Mon Sep 17 00:00:00 2001 From: AkazawaYun <62974697+AkazawaYun@users.noreply.github.com> Date: Wed, 30 Jul 2025 02:20:32 +0800 Subject: [PATCH 1532/1766] modify and add new test : CSharp/akazawayun.pro (#10017) * add new test : CSharp/akazawayun.pro * modify config and code * add content-type * update url * update package version --- frameworks/CSharp/akazawayun.pro/README.md | 1 + .../akazawayun.pro/akazawayun.pro.dockerfile | 13 ++++++ .../akazawayun.pro/benchmark_config.json | 25 +++++++++++ .../src/AkazawaYun.FrameworkBenchmarks.csproj | 19 +++++++++ .../CSharp/akazawayun.pro/src/Program.cs | 41 +++++++++++++++++++ 5 files changed, 99 insertions(+) create mode 100644 frameworks/CSharp/akazawayun.pro/README.md create mode 100644 frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile create mode 100644 frameworks/CSharp/akazawayun.pro/benchmark_config.json create mode 100644 frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj create mode 100644 frameworks/CSharp/akazawayun.pro/src/Program.cs diff --git a/frameworks/CSharp/akazawayun.pro/README.md b/frameworks/CSharp/akazawayun.pro/README.md new file mode 100644 index 00000000000..0388851ec6a --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/README.md @@ -0,0 +1 @@ +AkazawaYun.PRO(https://akazawayun.cn/#akzLearning#%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8) diff --git a/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile new file mode 100644 index 00000000000..f2549e6f8da --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile @@ -0,0 +1,13 @@ +# 此阶段用于生成项目 +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS publish +WORKDIR /app +COPY src . +RUN dotnet publish -c Release -o /app/publish + +# 此阶段用于运行 +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS runtime +WORKDIR /app +COPY --from=publish /app/publish . + +EXPOSE 2022 +ENTRYPOINT ["dotnet", "AkazawaYun.FrameworkBenchmarks.dll"] \ No newline at end of file diff --git a/frameworks/CSharp/akazawayun.pro/benchmark_config.json b/frameworks/CSharp/akazawayun.pro/benchmark_config.json new file mode 100644 index 00000000000..74968041e6b --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/benchmark_config.json @@ -0,0 +1,25 @@ +{ + "framework": "akazawayun.pro", + "tests": [ + { + "default": { + "display_name": "akazawayun.pro", + "framework": "akazawayun.pro", + "webserver": "akazawayun.pro", + "plaintext_url": "/post/plaintext", + "json_url": "/post/json", + "port": 2022, + "classification": "Micro", + "approach": "Realistic", + "platform": ".NET", + "language": "C#", + "flavor": "CoreCLR", + "os": "Linux", + "database_os": "Linux", + "database": "MySQL", + "orm": "Micro", + "notes": "" + } + } + ] +} diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj new file mode 100644 index 00000000000..caf04a7827b --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj @@ -0,0 +1,19 @@ + + + + Exe + net9.0 + enable + enable + + + + true + true + + + + + + + diff --git a/frameworks/CSharp/akazawayun.pro/src/Program.cs b/frameworks/CSharp/akazawayun.pro/src/Program.cs new file mode 100644 index 00000000000..808424483f4 --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/Program.cs @@ -0,0 +1,41 @@ +using AkazawaYun.PRO7; +using AkazawaYun.PRO7.AkazawaYunWebInterceptor; +using System.Text.Json.Serialization; + +namespace AkazawaYun.FrameworkBenchmarks; + +public class Program : IPostFunction +{ + static async Task Main() + { + akzJson.Config(null, Json.Default); + var server = await akzWebBuilder.Shared.Load().SetDefault().Build() + .Config(itc => + { + itc.AddInterceptor(new akzWebInterceptorNotOnlyPost()); + }).Launch(); + akzLog.Default = akzLog.Output.None; + await Task.Delay(-1); + } + + + public static ValueTask plaintext(HttpReq _) + { + return HttpRes.HttpOK("Hello, World!", ".txt"); + } + public static ValueTask json(HttpReq _) + { + return HttpRes.HttpJson(new JsonResponse + { + message = "Hello, World!" + }); + } +} + +public class JsonResponse +{ + public string? message { get; set; } +} + +[JsonSerializable(typeof(JsonResponse))] +public partial class Json : JsonSerializerContext { } From 89be83df80c1365188cdea51d74bfaadc9c67a72 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 29 Jul 2025 20:20:58 +0200 Subject: [PATCH 1533/1766] Fix bad benchmark_config.json (#10012) --- .../Clojure/ring-http-exchange/benchmark_config.json | 12 +++--------- frameworks/Java/httpserver/benchmark_config.json | 4 +--- frameworks/Kotlin/http4k/benchmark_config.json | 2 +- frameworks/TypeScript/oak/benchmark_config.json | 4 +--- 4 files changed, 6 insertions(+), 16 deletions(-) diff --git a/frameworks/Clojure/ring-http-exchange/benchmark_config.json b/frameworks/Clojure/ring-http-exchange/benchmark_config.json index 4c943e97b3f..0d7e64dcf6a 100755 --- a/frameworks/Clojure/ring-http-exchange/benchmark_config.json +++ b/frameworks/Clojure/ring-http-exchange/benchmark_config.json @@ -20,9 +20,7 @@ "display_name": "ring-http-exchange", "notes": "", "versus": "httpserver" - } - }, - { + }, "robaho": { "json_url": "/json", "plaintext_url": "/plaintext", @@ -41,9 +39,7 @@ "display_name": "ring-http-exchange-robaho", "notes": "", "versus": "httpserver-robaho" - } - }, - { + }, "graalvm": { "json_url": "/json", "plaintext_url": "/plaintext", @@ -62,9 +58,7 @@ "display_name": "ring-http-exchange-graalvm", "notes": "", "versus": "ring-http-exchange" - } - }, - { + }, "robaho-graalvm": { "json_url": "/json", "plaintext_url": "/plaintext", diff --git a/frameworks/Java/httpserver/benchmark_config.json b/frameworks/Java/httpserver/benchmark_config.json index 305564d55a8..16e9cdab907 100755 --- a/frameworks/Java/httpserver/benchmark_config.json +++ b/frameworks/Java/httpserver/benchmark_config.json @@ -57,9 +57,7 @@ "display_name": "httpserver-graalvm", "notes": "", "versus": "httpserver" - } - }, - { + }, "robaho": { "json_url": "/json", "plaintext_url": "/plaintext", diff --git a/frameworks/Kotlin/http4k/benchmark_config.json b/frameworks/Kotlin/http4k/benchmark_config.json index 810be318c33..448f868871c 100755 --- a/frameworks/Kotlin/http4k/benchmark_config.json +++ b/frameworks/Kotlin/http4k/benchmark_config.json @@ -2,7 +2,7 @@ "framework": "http4k", "tests": [ { - "apache": { + "default": { "orm": "Raw", "database_os": "Linux", "cached_query_url": "/cached?queries=", diff --git a/frameworks/TypeScript/oak/benchmark_config.json b/frameworks/TypeScript/oak/benchmark_config.json index f2aed687002..0cfab7d20af 100755 --- a/frameworks/TypeScript/oak/benchmark_config.json +++ b/frameworks/TypeScript/oak/benchmark_config.json @@ -20,9 +20,7 @@ "display_name": "oak", "notes": "", "versus": "nodejs" - } - }, - { + }, "postgresjs": { "json_url": "/json", "plaintext_url": "/plaintext", From 1744452b42a6cd0f86cfce60c1a6d890d41ea902 Mon Sep 17 00:00:00 2001 From: Outer Heaven Legacy Date: Tue, 29 Jul 2025 21:52:30 +0330 Subject: [PATCH 1534/1766] bump sib to v0.0.10 (#10011) --- frameworks/Rust/sib/Cargo.toml | 4 ++-- frameworks/Rust/sib/benchmark_config.json | 2 +- frameworks/Rust/sib/src/main.rs | 29 ++++++++++------------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/frameworks/Rust/sib/Cargo.toml b/frameworks/Rust/sib/Cargo.toml index 3b042bcdf9d..546b0997b78 100644 --- a/frameworks/Rust/sib/Cargo.toml +++ b/frameworks/Rust/sib/Cargo.toml @@ -12,14 +12,14 @@ categories = ["development-tools"] readme = "README.md" [dependencies] -sib = { git = "https://github.com/PooyaEimandar/sib", default-features = false, features = [ +sib = { version = "0.0.10", default-features = false, features = [ "net-h1-server", ] } bytes = { version = "1.10.1", default-features = false } mimalloc = { version = "0.1.47", features = ["secure"] } num_cpus = { version = "1.17.0" } serde = { version = "1.0.219", default-features = false, features = ["derive"] } -serde_json = { version = "1.0.140" } +serde_json = { version = "1.0.141" } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/sib/benchmark_config.json b/frameworks/Rust/sib/benchmark_config.json index 91c8ce06b13..55316d46a37 100644 --- a/frameworks/Rust/sib/benchmark_config.json +++ b/frameworks/Rust/sib/benchmark_config.json @@ -8,7 +8,7 @@ "port": 8080, "approach": "Realistic", "classification": "Fullstack", - "framework": "may", + "framework": "sib", "language": "Rust", "flavor": "None", "platform": "None", diff --git a/frameworks/Rust/sib/src/main.rs b/frameworks/Rust/sib/src/main.rs index 80e4c6cda74..8f649d08cef 100644 --- a/frameworks/Rust/sib/src/main.rs +++ b/frameworks/Rust/sib/src/main.rs @@ -1,12 +1,9 @@ use bytes::Bytes; use sib::network::http::{ - h1::{H1Service, H1ServiceFactory}, - util::Status, - session::Session, + server::HFactory, session::{HService, Session}, util::Status }; use std::{ - fs, - io::{Read, Write}, + fs }; #[global_allocator] @@ -25,12 +22,10 @@ impl Default for JsonMessage<'_> { } } -struct H1Server(pub T); +struct Server; -struct HService; - -impl H1Service for HService { - fn call(&mut self, session: &mut Session) -> std::io::Result<()> { +impl HService for Server { + fn call(&mut self, session: &mut S) -> std::io::Result<()> { if session.req_path() == Some("/json") { // Respond with JSON let json = serde_json::to_vec(&JsonMessage::default())?; @@ -52,11 +47,11 @@ impl H1Service for HService { } } -impl H1ServiceFactory for H1Server { - type Service = HService; +impl HFactory for Server{ + type Service = Server; - fn service(&self, _id: usize) -> HService { - HService + fn service(&self, _id: usize) -> Server { + Server } } @@ -65,6 +60,8 @@ fn main() { let cpus = num_cpus::get(); println!("CPU cores: {cpus}"); + sib::set_num_workers(cpus); + // Print total RAM in MB if let Ok(meminfo) = fs::read_to_string("/proc/meminfo") { for line in meminfo.lines() { @@ -89,8 +86,8 @@ fn main() { let handle = std::thread::spawn(move || { let id = std::thread::current().id(); println!("Listening {addr} on thread: {id:?}"); - H1Server(HService) - .start(addr, cpus, 0) + Server + .start_h1(addr, 0) .unwrap_or_else(|_| panic!("h1 server failed to start for thread {id:?}")) .join() .unwrap_or_else(|_| panic!("h1 server failed to joining thread {id:?}")); From 89fe9b1a9fe6d6e1e42fda6c8f6e195d57956fa5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 21:29:01 +0000 Subject: [PATCH 1535/1766] Build(deps): bump github.com/gofiber/fiber/v2 Bumps [github.com/gofiber/fiber/v2](https://github.com/gofiber/fiber) from 2.52.7 to 2.52.9. - [Release notes](https://github.com/gofiber/fiber/releases) - [Commits](https://github.com/gofiber/fiber/compare/v2.52.7...v2.52.9) --- updated-dependencies: - dependency-name: github.com/gofiber/fiber/v2 dependency-version: 2.52.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/fiber/src/go.mod | 2 +- frameworks/Go/fiber/src/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index a6a9313e5a8..6980da19018 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -6,7 +6,7 @@ toolchain go1.24.1 require ( github.com/goccy/go-json v0.10.5 - github.com/gofiber/fiber/v2 v2.52.7 + github.com/gofiber/fiber/v2 v2.52.9 github.com/jackc/pgx/v5 v5.7.4 github.com/valyala/quicktemplate v1.8.0 ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 0748f8152d9..386b9e79452 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -5,8 +5,8 @@ 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/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/gofiber/fiber/v2 v2.52.7 h1:6xJpE4sSqErvMiEZo9ZpJLRSVcpkNBvioeqAHKwhTZY= -github.com/gofiber/fiber/v2 v2.52.7/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw= +github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= From b56aec2b454b21f897ce8259c08573afcd959d2f Mon Sep 17 00:00:00 2001 From: Edgar Espina Date: Mon, 11 Aug 2025 12:51:03 -0400 Subject: [PATCH 1536/1766] jooby: 4.0.5 (#10040) - --- frameworks/Java/jooby/benchmark_config.json | 6 +++--- frameworks/Java/jooby/config.toml | 4 ++-- frameworks/Java/jooby/pom.xml | 2 +- frameworks/Kotlin/kooby/pom.xml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Java/jooby/benchmark_config.json b/frameworks/Java/jooby/benchmark_config.json index 1632b784b4b..2185d0c0fdf 100644 --- a/frameworks/Java/jooby/benchmark_config.json +++ b/frameworks/Java/jooby/benchmark_config.json @@ -60,15 +60,15 @@ "framework": "Jooby", "language": "Java", "flavor": "None", - "platform": "Undertow", + "platform": "Netty", "database": "Postgres", "database_os": "Linux", "orm": "Raw", "webserver": "None", "os": "Linux", - "notes": "Jooby MVC using Undertow", + "notes": "Jooby MVC using Netty", "display_name": "jooby-jaxrs", - "versus": "undertow" + "versus": "netty" }, "jetty": { "json_url": "/json", diff --git a/frameworks/Java/jooby/config.toml b/frameworks/Java/jooby/config.toml index aa7c6edf89f..4929ae1bfc8 100644 --- a/frameworks/Java/jooby/config.toml +++ b/frameworks/Java/jooby/config.toml @@ -80,6 +80,6 @@ database = "Postgres" database_os = "Linux" os = "Linux" orm = "Raw" -platform = "Undertow" +platform = "Netty" webserver = "None" -versus = "undertow" +versus = "netty" diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index a28a17ba815..d50222ee6f7 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,7 +11,7 @@ jooby - 4.0.2 + 4.0.5 2.0.2 42.7.7 UTF-8 diff --git a/frameworks/Kotlin/kooby/pom.xml b/frameworks/Kotlin/kooby/pom.xml index c064d54dcd3..6e4dbaf8e46 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -12,7 +12,7 @@ kooby: jooby+kotlin - 4.0.2 + 4.0.5 42.7.7 UTF-8 22 From b8d9647d0aca7ed92316cdb465cd0a526aef8a02 Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Mon, 11 Aug 2025 18:51:33 +0200 Subject: [PATCH 1537/1766] [ Kotlin / Hexagon ] Use the latest release (#10043) * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Fix native image settings * Change implementations * Update version * Add tests for new adapter * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Disable native benchmarks * Update configuration * Update configuration * Update dependencies * Update dependencies --- .../nima/services/FortuneHandler.java | 2 +- frameworks/Kotlin/hexagon/build.gradle | 19 +++++++++---------- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../src/main/kotlin/Benchmark.kt | 2 -- .../src/main/kotlin/Benchmark.kt | 2 -- .../hexagon_nettyepoll_pgclient/build.gradle | 3 ++- .../build.gradle | 3 ++- 7 files changed, 15 insertions(+), 18 deletions(-) diff --git a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java index b821f8f9261..173f3549f3b 100644 --- a/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java +++ b/frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java @@ -71,5 +71,5 @@ public void writeBinaryContent(byte[] value) { throw new RuntimeException(e); } } - }; + } } \ No newline at end of file diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 2e098bc1760..56329c753c5 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,7 +1,7 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.1.20" apply false - id "org.graalvm.buildtools.native" version "0.10.6" apply false + id "org.jetbrains.kotlin.jvm" version "2.2.0" apply false + id "org.graalvm.buildtools.native" version "0.11.0" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagontk" ext { - hexagonVersion = "4.1.1" - jettyVersion = "12.0.19" - nettyVersion = "4.2.0.Final" + hexagonVersion = "4.2.3" + jettyVersion = "12.0.23" + nettyVersion = "4.2.3.Final" - hikariVersion = "6.3.0" - postgresqlVersion = "42.7.5" - vertxVersion = "5.0.0.CR6" + hikariVersion = "7.0.1" + postgresqlVersion = "42.7.7" + vertxVersion = "5.0.2" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagontk.BenchmarkKt" @@ -30,6 +30,5 @@ subprojects { } tasks.wrapper { -// gradleVersion = "8.14.0" - gradleVersion = "release-candidate" + gradleVersion = "8.14.3" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index bb3521c6063..d4081da476b 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.14-rc-1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt index 54efe59c383..6bb62708b6c 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/src/main/kotlin/Benchmark.kt @@ -1,6 +1,5 @@ package com.hexagontk -import com.hexagontk.core.Platform.systemFlag import com.hexagontk.core.media.TEXT_HTML import com.hexagontk.core.urlOf import com.hexagontk.http.server.jetty.JettyServletHttpServer @@ -16,7 +15,6 @@ fun main() { sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, sendXPoweredBy = settings.sendXPoweredBy, - useVirtualThreads = systemFlag("virtualThreads"), ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) diff --git a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt index 40d654f2a7f..b3632a893ed 100644 --- a/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt +++ b/frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/src/main/kotlin/Benchmark.kt @@ -1,6 +1,5 @@ package com.hexagontk -import com.hexagontk.core.Platform.systemFlag import com.hexagontk.core.media.TEXT_HTML import com.hexagontk.core.urlOf import com.hexagontk.http.server.jetty.JettyServletHttpServer @@ -16,7 +15,6 @@ fun main() { sendDateHeader = settings.sendDateHeader, sendServerVersion = settings.sendServerVersion, sendXPoweredBy = settings.sendXPoweredBy, - useVirtualThreads = systemFlag("virtualThreads"), ) val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings) diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle index 2a8b788a99f..c73ef55f5bc 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle @@ -3,6 +3,7 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_pgclient")) - api("com.hexagontk.http:http_server_netty_epoll:$hexagonVersion") + api("com.hexagontk.http:http_server_netty:$hexagonVersion") api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") + api("io.netty:netty-transport-native-io_uring:$nettyVersion:linux-x86_64") } diff --git a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle index 3c142f1f1c6..6577f8f90cd 100644 --- a/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle +++ b/frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle @@ -3,6 +3,7 @@ apply(from: "$gradleScripts/application.gradle") dependencies { api(project(":store_sql")) - api("com.hexagontk.http:http_server_netty_epoll:$hexagonVersion") + api("com.hexagontk.http:http_server_netty:$hexagonVersion") api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64") + api("io.netty:netty-transport-native-io_uring:$nettyVersion:linux-x86_64") } From 0d77db6a9c38f34e2d1b4408b5aa8661f87a4930 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Mon, 11 Aug 2025 17:52:01 +0100 Subject: [PATCH 1538/1766] H2O: Fix an assertion failure (#10044) --- frameworks/C/h2o/src/database.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/C/h2o/src/database.c b/frameworks/C/h2o/src/database.c index 9c5c843150f..fd5399d343c 100644 --- a/frameworks/C/h2o/src/database.c +++ b/frameworks/C/h2o/src/database.c @@ -186,7 +186,7 @@ static int flush_connection(h2o_socket_cb cb, db_conn_t *conn) if (send_status < 0) LIBRARY_ERROR("PQflush", PQerrorMessage(conn->conn)); - else if (send_status) + else if (send_status && !h2o_socket_is_writing(conn->sock)) h2o_socket_notify_write(conn->sock, cb); return send_status < 0; From f1f885323ded3cf63dc6ca7de02b99b94af114a7 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Aug 2025 18:52:27 +0200 Subject: [PATCH 1539/1766] [ruby] Update Bundler to 2.7.0 and fix deprecation warnings (#10045) This fixes the following warning: [DEPRECATED] Platform :mswin is deprecated. Please use platform :windows instead. --- frameworks/Ruby/agoo/Gemfile.lock | 2 +- frameworks/Ruby/grape/Gemfile.lock | 2 +- frameworks/Ruby/hanami/Gemfile.lock | 2 +- frameworks/Ruby/padrino/Gemfile | 2 +- frameworks/Ruby/padrino/Gemfile.lock | 2 +- frameworks/Ruby/rack-sequel/Gemfile | 4 ++-- frameworks/Ruby/rack-sequel/Gemfile.lock | 2 +- frameworks/Ruby/rack/Gemfile | 14 +++++++------- frameworks/Ruby/rack/Gemfile.lock | 3 ++- frameworks/Ruby/rage-sequel/Gemfile.lock | 2 +- frameworks/Ruby/rage/Gemfile.lock | 2 +- frameworks/Ruby/rails/Gemfile.lock | 2 +- frameworks/Ruby/roda-sequel/Gemfile | 4 ++-- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile | 6 +++--- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra/Gemfile | 6 +++--- frameworks/Ruby/sinatra/Gemfile.lock | 8 +------- 18 files changed, 31 insertions(+), 36 deletions(-) diff --git a/frameworks/Ruby/agoo/Gemfile.lock b/frameworks/Ruby/agoo/Gemfile.lock index cf3141c5d63..053edac5d9e 100644 --- a/frameworks/Ruby/agoo/Gemfile.lock +++ b/frameworks/Ruby/agoo/Gemfile.lock @@ -23,4 +23,4 @@ DEPENDENCIES rack BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/grape/Gemfile.lock b/frameworks/Ruby/grape/Gemfile.lock index 9fe2d5f8f8e..1c904f7e158 100644 --- a/frameworks/Ruby/grape/Gemfile.lock +++ b/frameworks/Ruby/grape/Gemfile.lock @@ -90,4 +90,4 @@ DEPENDENCIES unicorn (= 6.1.0) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index 478f58d77e6..8226e1f0f7c 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -178,4 +178,4 @@ DEPENDENCIES rom-sql (~> 3.6) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/padrino/Gemfile b/frameworks/Ruby/padrino/Gemfile index 217e0b3649a..47d22ded6ac 100644 --- a/frameworks/Ruby/padrino/Gemfile +++ b/frameworks/Ruby/padrino/Gemfile @@ -13,5 +13,5 @@ group :puma, optional: true do end group :unicorn, optional: true do - gem 'unicorn', '~> 6.1', platforms: [:ruby, :mswin], require: false + gem 'unicorn', '~> 6.1', platforms: [:ruby, :windows], require: false end diff --git a/frameworks/Ruby/padrino/Gemfile.lock b/frameworks/Ruby/padrino/Gemfile.lock index 2f1018f2f48..9917636c697 100644 --- a/frameworks/Ruby/padrino/Gemfile.lock +++ b/frameworks/Ruby/padrino/Gemfile.lock @@ -146,4 +146,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index afb68002dc2..944f2c8cc71 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -5,11 +5,11 @@ gem 'sequel', '~> 5.0' gem 'rack', '~> 3.1' group :mysql, optional: true do - gem 'mysql2', '~> 0.4', platforms: [:ruby, :mswin] + gem 'mysql2', '~> 0.4', platforms: [:ruby, :windows] end group :postgresql, optional: true do - gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] + gem 'pg', '~> 1.5', platforms: [:ruby, :windows] gem 'sequel_pg', '~> 1.6', platforms: :ruby, require: false end diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 8b3ff5d109d..eb62d14787f 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -30,4 +30,4 @@ DEPENDENCIES sequel_pg (~> 1.6) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index d9542044e1f..ec8051585e2 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -9,23 +9,23 @@ gem 'rack', '~> 3.0' gem 'connection_pool', '~> 2.4' gem 'jdbc-postgres', '~> 42.2', platforms: :jruby, require: 'jdbc/postgres' gem 'json', '~> 2.10' -gem 'pg', '~> 1.5', platforms: %i[ruby mswin] +gem 'pg', '~> 1.5', platforms: %i[ruby windows] gem 'sequel' -gem 'sequel_pg', platforms: %i[ruby mswin] +gem 'sequel_pg', platforms: %i[ruby windows] gem 'tzinfo-data', '1.2023.3' group :falcon, optional: true do - gem 'falcon', '~> 0.47', platforms: %i[ruby mswin] + gem 'falcon', '~> 0.47', platforms: %i[ruby windows] end group :iodine, optional: true do - gem 'iodine', '~> 0.7', platforms: %i[ruby mswin] + gem 'iodine', '~> 0.7', platforms: %i[ruby windows] end group :passenger, optional: true do gem 'base64' # required by passenger on Ruby 3.4 gem 'logger' # required by passenger on Ruby 3.5 - gem 'passenger', '~> 6.0', platforms: [:ruby, :mswin], require: false + gem 'passenger', '~> 6.0', platforms: [:ruby, :windows], require: false end group :pitchfork, optional: true do @@ -38,10 +38,10 @@ end group :unicorn, optional: true do gem 'logger' # required by unicorn on Ruby 3.5 - gem 'unicorn', '~> 6.1', platforms: %i[ruby mswin] + gem 'unicorn', '~> 6.1', platforms: %i[ruby windows] end group :development, optional: true do gem 'rack-test' - gem 'rubocop', platforms: %i[ruby mswin] + gem 'rubocop', platforms: %i[ruby windows] end diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 95b91118ef6..b84bbe27496 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -141,6 +141,7 @@ GEM raindrops (~> 0.7) PLATFORMS + arm64-darwin-24 x86_64-darwin-23 x86_64-linux @@ -165,4 +166,4 @@ DEPENDENCIES unicorn (~> 6.1) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index b870586e216..a70dfb560c2 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -36,4 +36,4 @@ DEPENDENCIES sequel_pg (~> 1.6) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/rage/Gemfile.lock b/frameworks/Ruby/rage/Gemfile.lock index 0a2579e75a9..e11d05e427b 100644 --- a/frameworks/Ruby/rage/Gemfile.lock +++ b/frameworks/Ruby/rage/Gemfile.lock @@ -61,4 +61,4 @@ DEPENDENCIES rage-rb (~> 1.10) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 1308067065e..d42971cccd4 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -289,4 +289,4 @@ DEPENDENCIES tzinfo-data BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 58ae5773165..d8468922b5a 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -8,11 +8,11 @@ gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" group :mysql, optional: true do - gem "mysql2", "~> 0.5", platforms: %i[ruby mswin] + gem "mysql2", "~> 0.5", platforms: %i[ruby windows] end group :postgresql, optional: true do - gem "pg", "~> 1.4", platforms: %i[ruby mswin] + gem "pg", "~> 1.4", platforms: %i[ruby windows] gem "sequel_pg", "~> 1.17", platforms: :ruby, require: false end diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 53ae69dadaa..64c215ece23 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -40,4 +40,4 @@ DEPENDENCIES tilt (~> 2.1) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 26021a05d64..d8075931712 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -5,16 +5,16 @@ gem 'sequel', '~> 5.0' gem 'sinatra', '~> 4.0', :require=>'sinatra/base' group :mysql, optional: true do - gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] + gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :windows] end group :postgresql, optional: true do - gem 'pg', '~> 1.5', :platforms=>[:ruby, :mswin] + gem 'pg', '~> 1.5', :platforms=>[:ruby, :windows] gem 'sequel_pg', '~> 1.6', :platforms=>:ruby, :require=>false end group :iodine, optional: true do - gem 'iodine', '~> 0.7', platforms: [:ruby, :mswin], require: false + gem 'iodine', '~> 0.7', platforms: [:ruby, :windows], require: false end group :puma, optional: true do diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 97028c109e4..bf11ecedd6f 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -52,4 +52,4 @@ DEPENDENCIES sinatra (~> 4.0) BUNDLED WITH - 2.6.2 + 2.7.0 diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index fc568a99542..0f9f863b31f 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -5,15 +5,15 @@ gem 'json', '~> 2.8' gem 'sinatra', '~> 4.0', require: 'sinatra/base' group :mysql, optional: true do - gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :mswin] + gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :windows] end group :postgresql, optional: true do - gem 'pg', '~> 1.5', platforms: [:ruby, :mswin] + gem 'pg', '~> 1.5', platforms: [:ruby, :windows] end group :iodine, optional: true do - gem 'iodine', '~> 0.7', platforms: [:ruby, :mswin], require: false + gem 'iodine', '~> 0.7', platforms: [:ruby, :windows], require: false end group :puma, optional: true do diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 4ff68e25a81..b148973d984 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -30,7 +30,6 @@ GEM concurrent-ruby (~> 1.0) iodine (0.7.58) json (2.11.3) - kgio (2.11.4) logger (1.6.6) minitest (5.25.4) mustermann (3.0.3) @@ -48,7 +47,6 @@ GEM rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) - raindrops (0.20.1) ruby2_keywords (0.0.5) securerandom (0.4.1) sinatra (4.1.1) @@ -62,9 +60,6 @@ GEM timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) uri (1.0.3) PLATFORMS @@ -80,7 +75,6 @@ DEPENDENCIES pg (~> 1.5) puma (~> 6.4) sinatra (~> 4.0) - unicorn (~> 6.1) BUNDLED WITH - 2.6.2 + 2.7.0 From 071bcd95de619ae303707db706652ab6f392100b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Aug 2025 18:52:59 +0200 Subject: [PATCH 1540/1766] [rails] Use `bin/rails` to start server (#10046) Calling `rails` directly is deprecated and results in errors on newer versions: 3.5.0+0/rubygems.rb:269:in 'Gem.find_spec_for_exe': can't find gem railties (>= 0.a) with executable rails (Gem::GemNotFoundException) --- frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index 07fe63a04b4..feb5e3ddd55 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -25,4 +25,4 @@ ENV RAILS_ENV=production_mysql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 CMD service redis-server start && \ - rails server + bin/rails server diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 6773d8236b0..2ba009331cd 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -25,4 +25,4 @@ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 CMD service redis-server start && \ - rails server + bin/rails server From 6aca8ddd4b2843e9f092fd6af9ac545a180fec8e Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Aug 2025 18:53:21 +0200 Subject: [PATCH 1541/1766] [php] Phpixie add Adapterman variant (#10026) --- frameworks/PHP/phpixie/benchmark_config.json | 25 +++++++++- .../PHP/phpixie/deploy/conf/adapterman.ini | 16 +++++++ .../PHP/phpixie/phpixie-workerman.dockerfile | 26 ++++++++++ frameworks/PHP/phpixie/phpixie.dockerfile | 4 +- frameworks/PHP/phpixie/server.php | 47 +++++++++++++++++++ frameworks/PHP/phpixie/web/start.php | 19 ++++++++ 6 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 frameworks/PHP/phpixie/deploy/conf/adapterman.ini create mode 100644 frameworks/PHP/phpixie/phpixie-workerman.dockerfile create mode 100644 frameworks/PHP/phpixie/server.php create mode 100644 frameworks/PHP/phpixie/web/start.php diff --git a/frameworks/PHP/phpixie/benchmark_config.json b/frameworks/PHP/phpixie/benchmark_config.json index 4dc078d0066..4481bcdc91e 100755 --- a/frameworks/PHP/phpixie/benchmark_config.json +++ b/frameworks/PHP/phpixie/benchmark_config.json @@ -14,7 +14,7 @@ "database": "MySQL", "framework": "phpixie", "language": "PHP", - "flavor": "PHP7", + "flavor": "PHP8", "orm": "Full", "platform": "FPM/FastCGI", "webserver": "nginx", @@ -23,6 +23,29 @@ "display_name": "phpixie", "notes": "", "versus": "php" + }, + "workerman": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "phpixie", + "language": "PHP", + "flavor": "PHP8", + "orm": "Full", + "platform": "workerman", + "webserver": "none", + "os": "Linux", + "database_os": "Linux", + "display_name": "phpixie [workerman]", + "notes": "", + "versus": "php" } }] } diff --git a/frameworks/PHP/phpixie/deploy/conf/adapterman.ini b/frameworks/PHP/phpixie/deploy/conf/adapterman.ini new file mode 100644 index 00000000000..61e9f49203f --- /dev/null +++ b/frameworks/PHP/phpixie/deploy/conf/adapterman.ini @@ -0,0 +1,16 @@ +opcache.enable=1 +opcache.enable_cli=1 +opcache.validate_timestamps=0 +opcache.save_comments=0 +opcache.enable_file_override=1 +opcache.memory_consumption=256 +opcache.interned_strings_buffer=16 +opcache.huge_code_pages=1 + +mysqlnd.collect_statistics = Off +memory_limit = 512M + +opcache.jit_buffer_size=128M +opcache.jit=tracing + +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit \ No newline at end of file diff --git a/frameworks/PHP/phpixie/phpixie-workerman.dockerfile b/frameworks/PHP/phpixie/phpixie-workerman.dockerfile new file mode 100644 index 00000000000..fd024a84f83 --- /dev/null +++ b/frameworks/PHP/phpixie/phpixie-workerman.dockerfile @@ -0,0 +1,26 @@ +FROM ubuntu:24.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.0 php8.0-common php8.0-cli php8.0-mysql php8.0-xml php8.0-curl > /dev/null + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +RUN apt-get install -y php-pear php8.0-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.0/cli/conf.d/event.ini + +COPY deploy/conf/adapterman.ini /etc/php/8.0/cli/conf.d/20-adapterman.ini + +WORKDIR /phpixie +COPY --link . . + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer require joanhey/adapterman:^0.6 --quiet + +RUN chmod -R 777 /phpixie + +EXPOSE 8080 +CMD php server.php start diff --git a/frameworks/PHP/phpixie/phpixie.dockerfile b/frameworks/PHP/phpixie/phpixie.dockerfile index 47369ef7dcc..152e69a4d25 100644 --- a/frameworks/PHP/phpixie/phpixie.dockerfile +++ b/frameworks/PHP/phpixie/phpixie.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive @@ -11,8 +11,8 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer COPY deploy/conf/* /etc/php/8.0/fpm/ -ADD ./ /phpixie WORKDIR /phpixie +COPY --link . . RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.0/fpm/php-fpm.conf ; fi; diff --git a/frameworks/PHP/phpixie/server.php b/frameworks/PHP/phpixie/server.php new file mode 100644 index 00000000000..ebb29dfa817 --- /dev/null +++ b/frameworks/PHP/phpixie/server.php @@ -0,0 +1,47 @@ +count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; +$http_worker->name = 'AdapterMan Phpixie'; + +$http_worker->onWorkerStart = static function () { + HeaderDate::init(); + //chdir(__DIR__.'/public'); + require 'web/start.php'; +}; + +$http_worker->onMessage = static function ($connection) { + + $connection->send(run()); +}; + +Worker::runAll(); + +class HeaderDate +{ + const NAME = 'Date: '; + + /** + * Date header + * + * @var string + */ + public static $date; + + public static function init(): void + { + self::$date = self::NAME . gmdate(DATE_RFC7231); + Timer::add(1, static function() { + self::$date = self::NAME . gmdate(DATE_RFC7231); + }); + } +} \ No newline at end of file diff --git a/frameworks/PHP/phpixie/web/start.php b/frameworks/PHP/phpixie/web/start.php new file mode 100644 index 00000000000..94472f8f4ae --- /dev/null +++ b/frameworks/PHP/phpixie/web/start.php @@ -0,0 +1,19 @@ +add('', $root.'/classes/'); + +global $pixie; +$pixie = new \App\Pixie(); +$pixie->bootstrap($root); + +function run(): string +{ + global $pixie; + ob_start(); + + $pixie->handle_http_request(); + header(HeaderDate::$date); // To pass the bench, nginx auto add it + + return ob_get_clean(); +} From 019490c675e40e530ca86101e1ae14d05013d9cf Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Mon, 11 Aug 2025 19:53:48 +0300 Subject: [PATCH 1542/1766] Bump Micronaut version, Gradle, JVM, GraalVM (#10029) --- .../Java/micronaut/buildSrc/build.gradle | 2 +- frameworks/Java/micronaut/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Java/micronaut/gradlew | 8 +++++--- frameworks/Java/micronaut/gradlew.bat | 2 ++ .../micronaut-data-jdbc-graalvm.dockerfile | 2 +- .../micronaut/micronaut-data-jdbc.dockerfile | 4 ++-- .../micronaut-data-mongodb-graalvm.dockerfile | 2 +- .../micronaut-data-mongodb.dockerfile | 4 ++-- .../micronaut-data-r2dbc-graalvm.dockerfile | 2 +- .../micronaut/micronaut-data-r2dbc.dockerfile | 4 ++-- .../micronaut/micronaut-graalvm.dockerfile | 2 +- .../micronaut-jdbc-graalvm.dockerfile | 2 +- .../Java/micronaut/micronaut-jdbc.dockerfile | 4 ++-- .../micronaut-r2dbc-graalvm.dockerfile | 2 +- .../Java/micronaut/micronaut-r2dbc.dockerfile | 4 ++-- .../Java/micronaut/micronaut.dockerfile | 4 ++-- 18 files changed, 28 insertions(+), 24 deletions(-) diff --git a/frameworks/Java/micronaut/buildSrc/build.gradle b/frameworks/Java/micronaut/buildSrc/build.gradle index c30089f453e..c0dfaa40cbc 100644 --- a/frameworks/Java/micronaut/buildSrc/build.gradle +++ b/frameworks/Java/micronaut/buildSrc/build.gradle @@ -8,6 +8,6 @@ repositories { } dependencies { - implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.4.4" + implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.5.4" implementation "com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1" } \ No newline at end of file diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index 264330f5525..691f3e86c3c 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion=4.7.1 +micronautVersion=4.9.2 diff --git a/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.jar b/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34877 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�{ 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 diff --git a/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties b/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties index 9355b415575..d4081da476b 100644 --- a/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Java/micronaut/gradlew b/frameworks/Java/micronaut/gradlew index 1aa94a42690..faf93008b77 100755 --- a/frameworks/Java/micronaut/gradlew +++ b/frameworks/Java/micronaut/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -203,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/frameworks/Java/micronaut/gradlew.bat b/frameworks/Java/micronaut/gradlew.bat index 7101f8e4676..9b42019c791 100644 --- a/frameworks/Java/micronaut/gradlew.bat +++ b/frameworks/Java/micronaut/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile index f0b0a8a1cd7..5cd7c898d38 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:23 +FROM container-registry.oracle.com/graalvm/native-image:24 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile index f506d3e9fb8..3f41572b0d1 100644 --- a/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.14.3-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-jdbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:23 +FROM openjdk:24 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/libs/micronaut-data-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile index 003ace5e920..2523f8a8c9d 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:23 +FROM container-registry.oracle.com/graalvm/native-image:24 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile index 16c0061d17a..f0265880881 100644 --- a/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.14.3-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-mongodb:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:23 +FROM openjdk:24 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/libs/micronaut-data-mongodb-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile index 740abd93847..d96f5945b06 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:23 +FROM container-registry.oracle.com/graalvm/native-image:24 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile index f8a07dc83a0..3caef969781 100644 --- a/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.14.3-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-data-r2dbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:23 +FROM openjdk:24 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/libs/micronaut-data-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile index bbef52f862a..5638f4242bb 100644 --- a/frameworks/Java/micronaut/micronaut-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:23 +FROM container-registry.oracle.com/graalvm/native-image:24 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile index 671d236193d..5defe25a9ad 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:23 +FROM container-registry.oracle.com/graalvm/native-image:24 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile index d6a026f0778..08af177c9e2 100644 --- a/frameworks/Java/micronaut/micronaut-jdbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-jdbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.14.3-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-jdbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:23 +FROM openjdk:24 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-jdbc/build/libs/micronaut-jdbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile index eaf2985de2d..32c282bbcd2 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile @@ -1,4 +1,4 @@ -FROM container-registry.oracle.com/graalvm/native-image:23 +FROM container-registry.oracle.com/graalvm/native-image:24 RUN microdnf install findutils # Gradle 8.7 requires xargs COPY . /home/gradle/src WORKDIR /home/gradle/src diff --git a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile index e0fd59fc36b..1ddbd04a84c 100644 --- a/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile +++ b/frameworks/Java/micronaut/micronaut-r2dbc.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.14.3-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-r2dbc:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:23 +FROM openjdk:24 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-r2dbc/build/libs/micronaut-r2dbc-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh diff --git a/frameworks/Java/micronaut/micronaut.dockerfile b/frameworks/Java/micronaut/micronaut.dockerfile index 5672b1c6ff4..b50cc0fa117 100644 --- a/frameworks/Java/micronaut/micronaut.dockerfile +++ b/frameworks/Java/micronaut/micronaut.dockerfile @@ -1,9 +1,9 @@ -FROM gradle:8.7.0-jdk17 as build +FROM gradle:8.14.3-jdk21 as build COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src RUN gradle micronaut-vertx-pg-client:build -x test -x internalStartTestResourcesService --no-daemon -FROM openjdk:21 +FROM openjdk:24 WORKDIR /micronaut COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/libs/micronaut-vertx-pg-client-all.jar micronaut.jar COPY run_benchmark.sh run_benchmark.sh From 6c26a89dd7f9bf03fa5b6211d5462f030c7dc6bb Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Aug 2025 18:55:34 +0200 Subject: [PATCH 1543/1766] [ruby] Use Rack::Utils.escape_html for escaping (#10032) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rack::Utils.escape_html is faster than CGI.escape_html: ```ruby require 'benchmark/ips' require 'cgi' require 'rack' Benchmark.ips do |x| x.config(warmup: 2, time: 5) message = 'Additional fortune added at request time.' x.report("CGI") do CGI.escape_html(message) end x.report("Rack") do Rack::Utils.escape_html(message) end x.compare! end ``` ``` ruby 3.4.4 (2025-05-14 revision a38531fd3f) +PRISM [arm64-darwin24] Warming up -------------------------------------- CGI 1.016M i/100ms Rack 1.586M i/100ms Calculating ------------------------------------- CGI 10.821M (± 0.3%) i/s (92.42 ns/i) - 54.837M in 5.067830s Rack 15.861M (± 0.3%) i/s (63.05 ns/i) - 80.886M in 5.099606s Comparison: Rack: 15861352.0 i/s CGI: 10820753.9 i/s - 1.47x slower ``` --- frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb | 2 +- frameworks/Ruby/rage/app/views/fortunes.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb index 2614ca7a7b2..c416e40b48f 100644 --- a/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb +++ b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb @@ -5,7 +5,7 @@ <% records.each do |record| %> - + <% end %>
      idmessage
      <%= record.id %><%= CGI.escape_html(record.message) %>
      <%= record.id %><%= Rack::Utils.escape_html(record.message) %>
      diff --git a/frameworks/Ruby/rage/app/views/fortunes.html.erb b/frameworks/Ruby/rage/app/views/fortunes.html.erb index 1aa63f3772a..1b5afeaa763 100644 --- a/frameworks/Ruby/rage/app/views/fortunes.html.erb +++ b/frameworks/Ruby/rage/app/views/fortunes.html.erb @@ -5,7 +5,7 @@ <% records.each do |record| %> - + <% end %>
      idmessage
      <%= record[:id] %><%= CGI.escape_html(record[:message]) %>
      <%= record[:id] %><%= Rack::Utils.escape_html(record[:message]) %>
      From f710381b026b99c205afb08852a0281d1e194445 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:55:48 -0700 Subject: [PATCH 1544/1766] Build(deps): bump github.com/gofiber/fiber/v2 (#10033) Bumps [github.com/gofiber/fiber/v2](https://github.com/gofiber/fiber) from 2.52.4 to 2.52.9. - [Release notes](https://github.com/gofiber/fiber/releases) - [Commits](https://github.com/gofiber/fiber/compare/v2.52.4...v2.52.9) --- updated-dependencies: - dependency-name: github.com/gofiber/fiber/v2 dependency-version: 2.52.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/goravel/src/fiber/go.mod | 7 ++++--- frameworks/Go/goravel/src/fiber/go.sum | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frameworks/Go/goravel/src/fiber/go.mod b/frameworks/Go/goravel/src/fiber/go.mod index e8ef6a81e1a..6fd142f91bf 100644 --- a/frameworks/Go/goravel/src/fiber/go.mod +++ b/frameworks/Go/goravel/src/fiber/go.mod @@ -1,6 +1,7 @@ module goravel -go 1.22 +go 1.23.0 + toolchain go1.24.1 require ( @@ -62,7 +63,7 @@ require ( github.com/go-redsync/redsync/v4 v4.8.1 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-stack/stack v1.8.0 // indirect - github.com/gofiber/fiber/v2 v2.52.4 // indirect + github.com/gofiber/fiber/v2 v2.52.9 // indirect github.com/gofiber/template v1.8.3 // indirect github.com/gofiber/template/html/v2 v2.1.1 // indirect github.com/gofiber/utils v1.1.0 // indirect @@ -107,7 +108,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/microsoft/go-mssqldb v1.6.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect diff --git a/frameworks/Go/goravel/src/fiber/go.sum b/frameworks/Go/goravel/src/fiber/go.sum index 1ad640938ec..bc5125921ca 100644 --- a/frameworks/Go/goravel/src/fiber/go.sum +++ b/frameworks/Go/goravel/src/fiber/go.sum @@ -273,8 +273,8 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= -github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw= +github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/gofiber/template v1.8.3 h1:hzHdvMwMo/T2kouz2pPCA0zGiLCeMnoGsQZBTSYgZxc= github.com/gofiber/template v1.8.3/go.mod h1:bs/2n0pSNPOkRa5VJ8zTIvedcI/lEYxzV3+YPXdBvq8= github.com/gofiber/template/html/v2 v2.1.1 h1:QEy3O3EBkvwDthy5bXVGUseOyO6ldJoiDxlF4+MJiV8= @@ -496,8 +496,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -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/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= From 3f11c708f55a4eaebf397e56d0d35ad0df30f80b Mon Sep 17 00:00:00 2001 From: rio Date: Tue, 12 Aug 2025 01:56:13 +0900 Subject: [PATCH 1545/1766] [js] update 0http js 1.2.1 to 4.3.0 (#10035) --- frameworks/JavaScript/0http/0http.dockerfile | 2 +- frameworks/JavaScript/0http/app.js | 8 ++------ frameworks/JavaScript/0http/package.json | 3 +-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/frameworks/JavaScript/0http/0http.dockerfile b/frameworks/JavaScript/0http/0http.dockerfile index 06be53b55c1..88dce479f8a 100644 --- a/frameworks/JavaScript/0http/0http.dockerfile +++ b/frameworks/JavaScript/0http/0http.dockerfile @@ -1,4 +1,4 @@ -FROM node:10 +FROM node:20.16-slim WORKDIR /usr/src/app diff --git a/frameworks/JavaScript/0http/app.js b/frameworks/JavaScript/0http/app.js index 8e6c81eb4b3..a0e19cde5a4 100644 --- a/frameworks/JavaScript/0http/app.js +++ b/frameworks/JavaScript/0http/app.js @@ -1,9 +1,5 @@ const cero = require('0http') -const low = require('0http/lib/server/low') - -const { router, server } = cero({ - server: low() -}) +const { router, server } = cero() router.on('GET', '/json', (req, res) => { res.setHeader('server', '0http') @@ -19,4 +15,4 @@ router.on('GET', '/plaintext', (req, res) => { res.end('Hello, World!') }) -server.start(8080, socket => {}) \ No newline at end of file +server.listen(8080) \ No newline at end of file diff --git a/frameworks/JavaScript/0http/package.json b/frameworks/JavaScript/0http/package.json index e25595b7ccf..041ccd1588c 100644 --- a/frameworks/JavaScript/0http/package.json +++ b/frameworks/JavaScript/0http/package.json @@ -1,8 +1,7 @@ { "name": "0http", "dependencies": { - "0http": "1.2.1", - "uWebSockets.js": "github:uNetworking/uWebSockets.js#v15.11.0" + "0http": "4.3.0" }, "main": "app.js" } From 7e6c49cc7ef1e6f76c7e8a066b73afacffb8cff9 Mon Sep 17 00:00:00 2001 From: Bradley Chatha Date: Mon, 11 Aug 2025 17:57:19 +0100 Subject: [PATCH 1546/1766] [D, Juptune] Fix: Don't recreate reader & writer each loop - supports pipelining (#10036) * fix(d,juptune): Don't recreate reader & writer each loop - supports pipelining * feat(d,juptune): add JSON benchmark --- frameworks/D/juptune/benchmark_config.json | 1 + frameworks/D/juptune/juptune.dockerfile | 2 +- frameworks/D/juptune/src/main.d | 31 +++++-- frameworks/D/juptune/src/meson.build | 1 + frameworks/D/juptune/src/tests/json.d | 103 +++++++++++++++++++++ 5 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 frameworks/D/juptune/src/tests/json.d diff --git a/frameworks/D/juptune/benchmark_config.json b/frameworks/D/juptune/benchmark_config.json index 02b9075844e..0a091dc9fa6 100755 --- a/frameworks/D/juptune/benchmark_config.json +++ b/frameworks/D/juptune/benchmark_config.json @@ -4,6 +4,7 @@ { "default": { "plaintext_url": "/plaintext", + "json_url": "/json", "port": 8080, "approach": "Realistic", "classification": "Platform", diff --git a/frameworks/D/juptune/juptune.dockerfile b/frameworks/D/juptune/juptune.dockerfile index 5d619ba4bc2..0a671e08d8d 100644 --- a/frameworks/D/juptune/juptune.dockerfile +++ b/frameworks/D/juptune/juptune.dockerfile @@ -1,7 +1,7 @@ FROM debian:bookworm-slim ARG LDC_VERSION=1.41.0 -ARG JUPTUNE_REF=3a27a36ce2f5f2ff7df7151311e18d9c3660ea8c +ARG JUPTUNE_REF=52294fa45912dacac24efc80b4a2fad8db958841 ARG TFB_TEST_NAME ENV TEST_NAME=${TFB_TEST_NAME} diff --git a/frameworks/D/juptune/src/main.d b/frameworks/D/juptune/src/main.d index 91084b24288..fb8c2100d7c 100644 --- a/frameworks/D/juptune/src/main.d +++ b/frameworks/D/juptune/src/main.d @@ -9,7 +9,7 @@ import juptune.core.util, juptune.http; import tests.common : log; -import tests.plaintext; +import tests.plaintext, tests.json; /++++ Constant config ++++/ @@ -73,6 +73,7 @@ void router() nothrow { FAILSAFE, plaintext, + json, } enum Method @@ -84,6 +85,7 @@ void router() nothrow union RouteInput { PlainTextHeaderInput plaintext; + JsonHeaderInput json; } while(!juptuneEventLoopIsThreadCanceled()) @@ -103,17 +105,18 @@ void router() nothrow auto _ = client.close(); Http1MessageSummary readSummary, writeSummary; + + // Read & Write primitives + ubyte[HTTP_READ_BUFFER_BYTES] readBuffer; + ubyte[HTTP_WRITE_BUFFER_BYTES] writeBuffer; + auto reader = Http1Reader(client, readBuffer, HTTP_CONFIG); + auto writer = Http1Writer(client, writeBuffer, HTTP_CONFIG); + do { if(!client.isOpen) return; - // Read & Write primitives - ubyte[HTTP_READ_BUFFER_BYTES] readBuffer; - ubyte[HTTP_WRITE_BUFFER_BYTES] writeBuffer; - auto reader = Http1Reader(client, readBuffer, HTTP_CONFIG); - auto writer = Http1Writer(client, writeBuffer, HTTP_CONFIG); - // Routing state Route route; Method method; @@ -158,6 +161,10 @@ void router() nothrow route = Route.plaintext; break; + case "/json": + route = Route.json; + break; + default: setError(404, "Not found"); break; @@ -195,6 +202,9 @@ void router() nothrow case plaintext: break; + + case json: + break; } }); } @@ -218,6 +228,9 @@ void router() nothrow case plaintext: break; + + case json: + break; } }); } while(chunk.hasDataLeft); @@ -255,6 +268,10 @@ void router() nothrow case plaintext: handlePlainText(input.plaintext, writer, writeSummary); break; + + case json: + handleJson(input.json, writer, writeSummary); + break; } } while(!readSummary.connectionClosed && !writeSummary.connectionClosed); }, client, &asyncMoveSetter!TcpSocket); diff --git a/frameworks/D/juptune/src/meson.build b/frameworks/D/juptune/src/meson.build index 6178143b97c..e4feb4ac896 100644 --- a/frameworks/D/juptune/src/meson.build +++ b/frameworks/D/juptune/src/meson.build @@ -7,6 +7,7 @@ project('juptune-tfb', 'd') srcs = files( './main.d', './tests/common.d', + './tests/json.d', './tests/plaintext.d', ) diff --git a/frameworks/D/juptune/src/tests/json.d b/frameworks/D/juptune/src/tests/json.d new file mode 100644 index 00000000000..cb363d7939c --- /dev/null +++ b/frameworks/D/juptune/src/tests/json.d @@ -0,0 +1,103 @@ +module tests.json; + +import juptune.core.ds : ArrayNonShrink; +import juptune.core.util : Result; +import juptune.http : Http1Writer, Http1Version, Http1MessageSummary; + +import tests.common : putServerAndDate, log; + +struct JsonHeaderInput +{ + // No header input, it's here just so the overarching logic exists. +} + +private struct Message +{ + string message; +} + +void handleJson( + scope ref JsonHeaderInput input, + scope ref Http1Writer writer, + scope ref Http1MessageSummary summary, +) nothrow +{ + import juptune.core.util : then; + import juptune.core.util.conv : IntToCharBuffer, toBase10; + + ArrayNonShrink!char buffer; + buffer.reserve(256); + + auto result = serialise(buffer, Message("Hello, World!")); + if(result.isError) + { + result = writer.putResponseLine(Http1Version.http11, 500, "Internal Error").then!( + () => writer.putServerAndDate(), + () => writer.finishHeaders(), + () => writer.finishBody(), + () => writer.finishTrailers(), + () => writer.finishMessage(summary) + ); + if(result.isError) + { + log("writing error response [json] failed: ", result); + return; + } + + log("serialising value failed: ", result); + return; + } + + IntToCharBuffer contentLengthBuffer; + const contentLength = toBase10(buffer.length, contentLengthBuffer); + + result = writer.putResponseLine(Http1Version.http11, 200, "OK").then!( + () => writer.putServerAndDate(), + () => writer.putHeader("Content-Length", contentLength), + () => writer.putHeader("Content-Type", "application/json"), + () => writer.finishHeaders(), + () => writer.putBody(buffer.slice), + () => writer.finishBody(), + () => writer.finishTrailers(), + () => writer.finishMessage(summary) + ); + if(result.isError) + { + log("writing response [json] failed: ", result); + return; + } +} + +// There's currently no built-in serialiser, however because of D's incredibly powerful metaprogramming +// this watered-down serialiser would likely generate almost the exact same code as a full-blown serialiser +// in this simple case. +private Result serialise(T)(scope ref ArrayNonShrink!char buffer, T value) +if(is(T == struct)) +{ + import juptune.data.json : JsonBuilder; + scope append = (scope const(char)[] text) { + buffer.put(text); + return Result.noError; + }; + + ubyte[8] depthBuffer; + auto builder = JsonBuilder!(typeof(append))(append, depthBuffer[]); + + auto result = builder.startObject(); + if(result.isError) + return result; + + static foreach(fieldSymbol; value.tupleof) + {{ + immutable FieldName = __traits(identifier, fieldSymbol); + + result = builder.putObjectValue(FieldName, mixin("value."~FieldName)); + if(result.isError) + return result; + }} + + result = builder.endObject(); + if(result.isError) + return result; + return builder.finish(); +} \ No newline at end of file From 442ac2dd7b1373c13ba2b687d7d60ac72c52500f Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Aug 2025 18:58:09 +0200 Subject: [PATCH 1547/1766] [php] Laravel Octane Swoole (#10039) * [php] Laravel Octane Swoole * Update display_names [ci skip] --- frameworks/PHP/laravel/benchmark_config.json | 26 +++++------ .../PHP/laravel/deploy/swoole/composer.json | 43 ------------------- .../PHP/laravel/laravel-swoole.dockerfile | 9 ++-- 3 files changed, 16 insertions(+), 62 deletions(-) delete mode 100644 frameworks/PHP/laravel/deploy/swoole/composer.json diff --git a/frameworks/PHP/laravel/benchmark_config.json b/frameworks/PHP/laravel/benchmark_config.json index 716cbea52a7..8a2f001e6c8 100644 --- a/frameworks/PHP/laravel/benchmark_config.json +++ b/frameworks/PHP/laravel/benchmark_config.json @@ -14,7 +14,7 @@ "database": "MySQL", "framework": "laravel", "language": "PHP", - "flavor": "PHP8.1", + "flavor": "PHP8", "orm": "Full", "platform": "FPM/FastCGI", "webserver": "nginx", @@ -37,13 +37,13 @@ "database": "MySQL", "framework": "laravel", "language": "PHP", - "flavor": "None", + "flavor": "PHP8", "orm": "Full", "platform": "swoole", "webserver": "none", "os": "Linux", "database_os": "Linux", - "display_name": "laravel-swoole", + "display_name": "laravel [octane,swoole]", "notes": "", "versus": "swoole" }, @@ -60,13 +60,13 @@ "database": "MySQL", "framework": "laravel", "language": "PHP", - "flavor": "None", + "flavor": "PHP8", "orm": "Full", "platform": "swoole", "webserver": "none", "os": "Linux", "database_os": "Linux", - "display_name": "laravel-laravel-s", + "display_name": "laravel [laravel-s]", "notes": "", "versus": "swoole" }, @@ -83,13 +83,13 @@ "database": "MySQL", "framework": "laravel", "language": "PHP", - "flavor": "None", + "flavor": "PHP8", "orm": "Full", "platform": "roadrunner", "webserver": "none", "os": "Linux", "database_os": "Linux", - "display_name": "laravel-roadrunner", + "display_name": "laravel [roadrunner]", "notes": "", "versus": "swoole" }, @@ -106,13 +106,13 @@ "database": "MySQL", "framework": "laravel", "language": "PHP", - "flavor": "PHP8.1", + "flavor": "PHP8", "orm": "Full", "platform": "workerman", "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "laravel-workerman", + "display_name": "laravel [workerman]", "notes": "", "versus": "php" }, @@ -129,13 +129,13 @@ "database": "MySQL", "framework": "laravel", "language": "PHP", - "flavor": "None", + "flavor": "PHP8", "orm": "Full", "platform": "Frankenphp", "webserver": "caddy", "os": "Linux", "database_os": "Linux", - "display_name": "laravel-octane [frankenphp]", + "display_name": "laravel [octane,frankenphp]", "notes": "", "versus": "php" }, @@ -152,13 +152,13 @@ "database": "MySQL", "framework": "laravel", "language": "PHP", - "flavor": "PHP8.3", + "flavor": "PHP8", "orm": "Full", "platform": "Ripple", "webserver": "PServer", "os": "Linux", "database_os": "Linux", - "display_name": "laravel-ripple", + "display_name": "laravel [ripple]", "notes": "", "versus": "php", "tags": ["broken"] diff --git a/frameworks/PHP/laravel/deploy/swoole/composer.json b/frameworks/PHP/laravel/deploy/swoole/composer.json deleted file mode 100644 index 8293ab06f70..00000000000 --- a/frameworks/PHP/laravel/deploy/swoole/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "laravel/laravel", - "type": "project", - "description": "The Laravel Framework.", - "keywords": [ - "framework", - "laravel" - ], - "license": "MIT", - "require": { - "laravel/framework": "^9", - "swooletw/laravel-swoole": "^v2.6" - }, - "config": { - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true - }, - "extra": { - "laravel": { - "dont-discover": [] - } - }, - "autoload": { - "psr-4": { - "App\\": "app/" - } - }, - "minimum-stability": "dev", - "prefer-stable": true, - "scripts": { - "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", - "@php artisan package:discover --ansi" - ], - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ], - "post-create-project-cmd": [ - "@php artisan key:generate --ansi" - ] - } -} diff --git a/frameworks/PHP/laravel/laravel-swoole.dockerfile b/frameworks/PHP/laravel/laravel-swoole.dockerfile index d8d9881c82f..de27380656d 100644 --- a/frameworks/PHP/laravel/laravel-swoole.dockerfile +++ b/frameworks/PHP/laravel/laravel-swoole.dockerfile @@ -15,13 +15,10 @@ RUN mkdir -p bootstrap/cache \ storage/framework/views \ storage/framework/cache -COPY --link deploy/swoole/composer.json . - -RUN echo "APP_SWOOLE=true" >> .env - -RUN composer install -a --no-dev --quiet +RUN composer require laravel/octane:2.11 --update-no-dev --no-scripts --quiet +RUN php artisan octane:install --server="swoole" RUN php artisan optimize EXPOSE 8080 -ENTRYPOINT [ "php", "artisan", "swoole:http", "start" ] +ENTRYPOINT ["php", "artisan", "octane:swoole", "--host=0.0.0.0", "--port=8080", "--workers=auto", "--task-workers=auto", "--max-requests=10000"] From a9f7dcd9f5531a58c43d981beb036f46653699ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 12 Aug 2025 00:59:28 +0800 Subject: [PATCH 1548/1766] Fix bad benchmark_config.json in frameworks (#10023) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/.gitignore | 2 +- frameworks/Rust/hyperlane/Cargo.lock | 121 +++++------ frameworks/Rust/hyperlane/Cargo.toml | 20 +- frameworks/Rust/hyperlane/README.md | 4 +- .../Rust/hyperlane/benchmark_config.json | 94 +-------- .../hyperlane.cached_query.dockerfile | 15 -- ...ockerfile => hyperlane.default.dockerfile} | 2 +- .../hyperlane/hyperlane.fortunes.dockerfile | 15 -- .../Rust/hyperlane/hyperlane.json.dockerfile | 15 -- .../hyperlane/hyperlane.plaintext.dockerfile | 15 -- .../Rust/hyperlane/hyperlane.query.dockerfile | 15 -- .../hyperlane/hyperlane.update.dockerfile | 15 -- frameworks/Rust/hyperlane/src/const.rs | 1 + frameworks/Rust/hyperlane/src/db.rs | 3 +- .../Rust/hyperlane/src/request_middleware.rs | 33 +-- frameworks/Rust/hyperlane/src/route.rs | 190 +++++++++++------- frameworks/Rust/hyperlane/src/server.rs | 73 ++++--- 17 files changed, 238 insertions(+), 395 deletions(-) delete mode 100644 frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile rename frameworks/Rust/hyperlane/{hyperlane.db.dockerfile => hyperlane.default.dockerfile} (91%) delete mode 100644 frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile delete mode 100644 frameworks/Rust/hyperlane/hyperlane.json.dockerfile delete mode 100644 frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile delete mode 100644 frameworks/Rust/hyperlane/hyperlane.query.dockerfile delete mode 100644 frameworks/Rust/hyperlane/hyperlane.update.dockerfile diff --git a/frameworks/Rust/hyperlane/.gitignore b/frameworks/Rust/hyperlane/.gitignore index c0ed7d09f10..791af9f28cb 100644 --- a/frameworks/Rust/hyperlane/.gitignore +++ b/frameworks/Rust/hyperlane/.gitignore @@ -1,2 +1,2 @@ /target -/logs \ No newline at end of file +/logs diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 536749cba52..73d56f9e079 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -187,9 +187,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -219,20 +219,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "der" version = "0.7.10" @@ -301,9 +287,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -485,12 +471,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.4" @@ -508,7 +488,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.4", + "hashbrown", ] [[package]] @@ -558,9 +538,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.13.7" +version = "2.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e96d49fe9cb2263dd459ed72df6206870f0c0c6befa0bbc79227771c630a4c" +checksum = "757db00ff4cb103647c32497514aceeb685bc2686d84c8707124f1c8eeaac2e3" dependencies = [ "brotli", "flate2", @@ -569,17 +549,16 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.51.1" +version = "1.59.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bcafcd7f8e3b8801c795910e390f461c765065502b294decccb7715d20c3bfa" +checksum = "8d68fc1cd9b672083471b783a0f17f4df5eb470f79a2685b6f55e631618bcd2b" [[package]] name = "http-type" -version = "4.27.3" +version = "4.55.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b7ebec2f82af03e6e15005e0244ad2e08df1fffccafee3493e70222fa11a10" +checksum = "06966dd52009ec38901b439b9060dd9ed0ead6d1204f214fa9a933ae3cb85328" dependencies = [ - "dashmap", "hex", "http-compress", "http-constant", @@ -594,21 +573,22 @@ dependencies = [ [[package]] name = "hyperlane" -version = "5.40.1" +version = "6.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21630ec0514aff461fbd197da6d8436649559f5508806e80c5ddc0ef34287f82" +checksum = "8b7977949b728631efd15f05ac20930c3d4881cab8ec1ad7d723a99431a21443" dependencies = [ "http-type", "lombok-macros", "regex", "serde", + "serde_json", ] [[package]] name = "hyperlane-time" -version = "0.5.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d7e07007bd67be0c3f07646066d9300ea999fb7d3371610354393101ac2db2c" +checksum = "ed590017e6b8cd1c4f25cf6b5beda4efd3c5a76842c8782dca4fe650552a6c21" [[package]] name = "hyperlane_techempower" @@ -619,7 +599,7 @@ dependencies = [ "hyperlane-time", "num_cpus", "once_cell", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_json", "sqlx", @@ -734,19 +714,19 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown", ] [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ "bitflags", "cfg-if", @@ -814,9 +794,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lombok-macros" -version = "1.12.2" +version = "1.13.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9490d57fd90a670d464a8a464e65a5822d1f34badd8ada1c53c0572f98e10e" +checksum = "7647fa75302b5ffffa7ff8bdb78220beb7da2be7eaf3a939453012f25931d749" dependencies = [ "proc-macro2", "quote", @@ -1069,9 +1049,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -1117,9 +1097,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags", ] @@ -1175,9 +1155,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "ryu" @@ -1225,9 +1205,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -1271,9 +1251,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -1305,12 +1285,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1361,7 +1341,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.4", + "hashbrown", "hashlink", "indexmap", "log", @@ -1632,9 +1612,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -1647,7 +1627,7 @@ dependencies = [ "slab", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1710,7 +1690,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56" dependencies = [ - "rand 0.9.1", + "rand 0.9.2", ] [[package]] @@ -1815,15 +1795,6 @@ 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.6", -] - [[package]] name = "windows-sys" version = "0.59.0" @@ -1971,9 +1942,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "yoke" @@ -2059,9 +2030,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 96d2bc484a9..afccb3c2ee0 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -1,12 +1,13 @@ [package] name = "hyperlane_techempower" version = "0.1.0" +readme = "README.md" edition = "2024" authors = ["root@ltpp.vip"] license = "MIT" -description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication.""" +description = """A lightweight, high-performance, and cross-platform Rust HTTP server library built on Tokio. It simplifies modern web service development by providing built-in support for middleware, WebSocket, Server-Sent Events (SSE), and raw TCP communication. With a unified and ergonomic API across Windows, Linux, and MacOS, it enables developers to build robust, scalable, and event-driven network applications with minimal overhead and maximum flexibility.""" keywords = ["http", "request", "response", "tcp", "redirect"] -repository = "https://github.com/eastspire/hyperlane.git" +repository = "https://github.com/hyperlane-dev/hyperlane.git" categories = ["network-programming", "web-programming"] exclude = [ "target", @@ -19,13 +20,13 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "5.40.1" -hyperlane-time = "0.5.6" +hyperlane = "6.6.0" +hyperlane-time = "0.7.7" num_cpus = "1.17.0" once_cell = "1.21.3" -rand = "0.9.1" +rand = "0.9.2" serde = "1.0.219" -serde_json = "1.0.140" +serde_json = "1.0.142" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } [profile.dev] @@ -48,10 +49,3 @@ strip = "debuginfo" [features] dev = [] -json = [] -plaintext = [] -fortunes = [] -db = [] -query = [] -update = [] -cached_query = [] diff --git a/frameworks/Rust/hyperlane/README.md b/frameworks/Rust/hyperlane/README.md index d2b95b513b9..8afc763acc2 100644 --- a/frameworks/Rust/hyperlane/README.md +++ b/frameworks/Rust/hyperlane/README.md @@ -1,8 +1,8 @@ -# [hyperlane](https://github.com/eastspire/hyperlane) web framework +# [hyperlane](https://github.com/hyperlane-dev/hyperlane) web framework ## Description -> Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication. Built with pure Rust and standard library, Hyperlane offers true cross-platform compatibility across Windows, Linux and macOS, with the same API experience on all platforms, powered by Tokio's async runtime for seamless networking without platform-specific dependencies. +> A lightweight, high-performance, and cross-platform Rust HTTP server library built on Tokio. It simplifies modern web service development by providing built-in support for middleware, WebSocket, Server-Sent Events (SSE), and raw TCP communication. With a unified and ergonomic API across Windows, Linux, and MacOS, it enables developers to build robust, scalable, and event-driven network applications with minimal overhead and maximum flexibility. ## Database diff --git a/frameworks/Rust/hyperlane/benchmark_config.json b/frameworks/Rust/hyperlane/benchmark_config.json index 7864eb27b08..5476d84b5dd 100644 --- a/frameworks/Rust/hyperlane/benchmark_config.json +++ b/frameworks/Rust/hyperlane/benchmark_config.json @@ -2,104 +2,14 @@ "framework": "hyperlane", "tests": [ { - "json": { - "dockerfile": "hyperlane.json.dockerfile", + "default": { + "dockerfile": "hyperlane.default.dockerfile", "json_url": "/json", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "hyperlane", - "language": "Rust", - "orm": "raw", - "platform": "Rust", - "webserver": "hyperlane", - "os": "Linux", - "database_os": "Linux", - "display_name": "hyperlane" - }, - "plaintext": { - "dockerfile": "hyperlane.plaintext.dockerfile", "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "hyperlane", - "language": "Rust", - "orm": "raw", - "platform": "Rust", - "webserver": "hyperlane", - "os": "Linux", - "database_os": "Linux", - "display_name": "hyperlane" - }, - "fortunes": { - "dockerfile": "hyperlane.fortunes.dockerfile", "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "hyperlane", - "language": "Rust", - "orm": "raw", - "platform": "Rust", - "webserver": "hyperlane", - "os": "Linux", - "database_os": "Linux", - "display_name": "hyperlane" - }, - "db": { - "dockerfile": "hyperlane.db.dockerfile", "db_url": "/db", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "hyperlane", - "language": "Rust", - "orm": "raw", - "platform": "Rust", - "webserver": "hyperlane", - "os": "Linux", - "database_os": "Linux", - "display_name": "hyperlane" - }, - "query": { - "dockerfile": "hyperlane.query.dockerfile", "query_url": "/query?q=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "hyperlane", - "language": "Rust", - "orm": "raw", - "platform": "Rust", - "webserver": "hyperlane", - "os": "Linux", - "database_os": "Linux", - "display_name": "hyperlane" - }, - "update": { - "dockerfile": "hyperlane.update.dockerfile", "update_url": "/upda?q=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "database": "Postgres", - "framework": "hyperlane", - "language": "Rust", - "orm": "raw", - "platform": "Rust", - "webserver": "hyperlane", - "os": "Linux", - "database_os": "Linux", - "display_name": "hyperlane" - }, - "cached_query": { - "dockerfile": "hyperlane.cached_query.dockerfile", "cached_query_url": "/cached-quer?c=", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile b/frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile deleted file mode 100644 index d90fbed9fc8..00000000000 --- a/frameworks/Rust/hyperlane/hyperlane.cached_query.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM rust:1.85 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld - -ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -ADD ./ /hyperlane_techempower -WORKDIR /hyperlane_techempower - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features cached_query - -EXPOSE 8080 - -CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.db.dockerfile b/frameworks/Rust/hyperlane/hyperlane.default.dockerfile similarity index 91% rename from frameworks/Rust/hyperlane/hyperlane.db.dockerfile rename to frameworks/Rust/hyperlane/hyperlane.default.dockerfile index 632f725fc54..d9bd815fd04 100644 --- a/frameworks/Rust/hyperlane/hyperlane.db.dockerfile +++ b/frameworks/Rust/hyperlane/hyperlane.default.dockerfile @@ -8,7 +8,7 @@ ADD ./ /hyperlane_techempower WORKDIR /hyperlane_techempower RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features db +RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release EXPOSE 8080 diff --git a/frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile b/frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile deleted file mode 100644 index 6c17364aab5..00000000000 --- a/frameworks/Rust/hyperlane/hyperlane.fortunes.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM rust:1.85 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld - -ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -ADD ./ /hyperlane_techempower -WORKDIR /hyperlane_techempower - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features fortunes - -EXPOSE 8080 - -CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.json.dockerfile b/frameworks/Rust/hyperlane/hyperlane.json.dockerfile deleted file mode 100644 index 225112b5b38..00000000000 --- a/frameworks/Rust/hyperlane/hyperlane.json.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM rust:1.85 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld - -ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -ADD ./ /hyperlane_techempower -WORKDIR /hyperlane_techempower - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features json - -EXPOSE 8080 - -CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile b/frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile deleted file mode 100644 index f2620d45892..00000000000 --- a/frameworks/Rust/hyperlane/hyperlane.plaintext.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM rust:1.85 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld - -ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -ADD ./ /hyperlane_techempower -WORKDIR /hyperlane_techempower - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features plaintext - -EXPOSE 8080 - -CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.query.dockerfile b/frameworks/Rust/hyperlane/hyperlane.query.dockerfile deleted file mode 100644 index 04463e5b6dd..00000000000 --- a/frameworks/Rust/hyperlane/hyperlane.query.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM rust:1.85 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld - -ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -ADD ./ /hyperlane_techempower -WORKDIR /hyperlane_techempower - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features query - -EXPOSE 8080 - -CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/hyperlane.update.dockerfile b/frameworks/Rust/hyperlane/hyperlane.update.dockerfile deleted file mode 100644 index c265407a1ff..00000000000 --- a/frameworks/Rust/hyperlane/hyperlane.update.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM rust:1.85 - -RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld - -ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -ADD ./ /hyperlane_techempower -WORKDIR /hyperlane_techempower - -RUN cargo clean -RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release --features update - -EXPOSE 8080 - -CMD ./target/release/hyperlane_techempower diff --git a/frameworks/Rust/hyperlane/src/const.rs b/frameworks/Rust/hyperlane/src/const.rs index 93728efd2e4..c68b37c2bd1 100644 --- a/frameworks/Rust/hyperlane/src/const.rs +++ b/frameworks/Rust/hyperlane/src/const.rs @@ -15,3 +15,4 @@ pub const KEY_ID: &str = "id"; pub const KEY_RANDOM_NUMBER: &str = "randomnumber"; pub const KEY_MESSAGE: &str = "message"; pub const DB_MAX_CONNECTIONS: u32 = 100; +pub const HTTP_BUFFER: usize = 256; diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index eb7c57b779e..136b451438c 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -153,7 +153,8 @@ pub async fn init_db() { create_table().await; insert_records().await; } - black_box(init_cache().await); + let _ = get_db_connection(); + let _ = CACHE.get(0); } pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 2c598f982b2..7f7105e9363 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -1,35 +1,16 @@ use super::*; pub async fn request(ctx: Context) { - ctx.set_response_header(CONNECTION, KEEP_ALIVE) + ctx.set_response_version(HttpVersion::HTTP1_1) .await - .set_response_header(SERVER, HYPERLANE) + .replace_response_header(CONNECTION, KEEP_ALIVE) .await - .set_response_header(DATE, gmt()) + .replace_response_header(SERVER, HYPERLANE) + .await + .replace_response_header(DATE, gmt()) .await .set_response_status_code(200) + .await + .replace_response_header(CONTENT_TYPE, APPLICATION_JSON) .await; - #[cfg(feature = "plaintext")] - { - ctx.set_response_header(CONTENT_TYPE, TEXT_PLAIN).await; - } - #[cfg(feature = "fortunes")] - { - ctx.set_response_header( - CONTENT_TYPE, - ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), - ) - .await; - } - #[cfg(any( - feature = "json", - feature = "db", - feature = "query", - feature = "update", - feature = "cached_query" - ))] - { - ctx.set_response_header(CONTENT_TYPE, APPLICATION_JSON) - .await; - } } diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 1eaa40d61d7..75683e1c313 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -4,91 +4,145 @@ pub async fn json(ctx: Context) { let json: Value = json!({ "message": RESPONSEDATA_STR }); - let _ = ctx - .set_response_body(serde_json::to_string(&json).unwrap_or_default()) - .await - .send() - .await; + let run = || async { + ctx.set_response_body(serde_json::to_string(&json).unwrap_or_default()) + .await; + ctx.send().await.unwrap(); + }; + run().await; + while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { + run().await; + } + ctx.closed().await; } pub async fn plaintext(ctx: Context) { - let _ = ctx.set_response_body(RESPONSEDATA_BIN).await.send().await; + ctx.replace_response_header(CONTENT_TYPE, TEXT_PLAIN).await; + ctx.set_response_body(RESPONSEDATA_BIN).await; + let run = || async { + ctx.send().await.unwrap(); + }; + run().await; + while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { + run().await; + } + ctx.closed().await; } pub async fn db(ctx: Context) { let db_connection: &DbPoolConnection = get_db_connection(); - let query_row: QueryRow = random_world_row(db_connection).await; - let _ = ctx - .set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) - .await - .send() - .await; + let run = || async { + let query_row: QueryRow = random_world_row(db_connection).await; + ctx.set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { + run().await; + } + ctx.closed().await; } pub async fn query(ctx: Context) { - let queries: Queries = ctx - .get_request_query("q") - .await - .and_then(|queries| queries.parse::().ok()) - .unwrap_or_default() - .min(ROW_LIMIT as Queries) - .max(1); - let db_pool: &DbPoolConnection = get_db_connection(); - let data: Vec = get_some_row_id(queries, db_pool).await; - let _ = ctx - .set_response_body(serde_json::to_string(&data).unwrap_or_default()) - .await - .send() - .await; + let run = || async { + let queries: Queries = ctx + .get_request_query("q") + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let db_pool: &DbPoolConnection = get_db_connection(); + let data: Vec = get_some_row_id(queries, db_pool).await; + ctx.set_response_body(serde_json::to_string(&data).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { + run().await; + } + ctx.closed().await; } pub async fn fortunes(ctx: Context) { - let all_rows: Vec = all_world_row().await; - let mut fortunes_list: Vec = all_rows - .iter() - .map(|row| { - let id: i32 = row.get(KEY_ID); - let message: String = row.get(KEY_MESSAGE); - Fortunes::new(id, message) - }) - .collect(); - fortunes_list.push(Fortunes::new( - 0, - "Additional fortune added at request time.".to_owned(), - )); - fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); - let res: String = FortunesTemplate::new(fortunes_list).to_string(); - let _ = ctx.set_response_body(res).await.send().await; + ctx.replace_response_header( + CONTENT_TYPE, + ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), + ) + .await; + let run = || async { + let all_rows: Vec = all_world_row().await; + let mut fortunes_list: Vec = all_rows + .iter() + .map(|row| { + let id: i32 = row.get(KEY_ID); + let message: String = row.get(KEY_MESSAGE); + Fortunes::new(id, message) + }) + .collect(); + fortunes_list.push(Fortunes::new( + 0, + "Additional fortune added at request time.".to_owned(), + )); + fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); + let res: String = FortunesTemplate::new(fortunes_list).to_string(); + ctx.set_response_body(res).await.send().await.unwrap(); + }; + run().await; + while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { + run().await; + } + ctx.closed().await; } pub async fn update(ctx: Context) { - let queries: Queries = ctx - .get_request_query("q") - .await - .and_then(|queries| queries.parse::().ok()) - .unwrap_or_default() - .min(ROW_LIMIT as Queries) - .max(1); - let res: Vec = update_world_rows(queries).await; - let _ = ctx - .set_response_body(serde_json::to_string(&res).unwrap_or_default()) - .await - .send() - .await; + let run = || async { + let queries: Queries = ctx + .get_request_query("q") + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let res: Vec = update_world_rows(queries).await; + ctx.set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { + run().await; + } + ctx.closed().await; } pub async fn cached_query(ctx: Context) { - let count: Queries = ctx - .get_request_query("c") - .await - .and_then(|queries| queries.parse::().ok()) - .unwrap_or_default() - .min(ROW_LIMIT as Queries) - .max(1); - let res: Vec = CACHE.iter().take(count as usize).cloned().collect(); - let _ = ctx - .set_response_body(serde_json::to_string(&res).unwrap_or_default()) - .await - .send() - .await; + let run = || async { + let count: Queries = ctx + .get_request_query("c") + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let res: Vec = CACHE.iter().take(count as usize).cloned().collect(); + ctx.set_response_body(serde_json::to_string(&res).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { + run().await; + } + ctx.closed().await; } diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index e469a774c9f..49781cf544b 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -17,36 +17,57 @@ async fn init_server() { server.port(8080).await; server.disable_linger().await; server.disable_nodelay().await; - server.error_handler(async |_: PanicInfo| {}).await; - server.http_buffer_size(256).await; - server.ws_buffer_size(256).await; + server.http_buffer(256).await; + server.ws_buffer(256).await; + server.request_middleware(request_middleware::request).await; - #[cfg(any(feature = "dev", feature = "plaintext"))] - server.route("/plaintext", route::plaintext).await; - #[cfg(any(feature = "dev", feature = "json"))] - server.route("/json", route::json).await; - #[cfg(any(feature = "dev", feature = "cached_query"))] - server.route("/cached-quer", route::cached_query).await; - #[cfg(any(feature = "dev", feature = "db"))] - server.route("/db", route::db).await; - #[cfg(any(feature = "dev", feature = "query"))] - server.route("/query", route::query).await; - #[cfg(any(feature = "dev", feature = "fortunes"))] - server.route("/fortunes", route::fortunes).await; - #[cfg(any(feature = "dev", feature = "update"))] - server.route("/upda", route::update).await; - server.run().await.unwrap(); + + server + .disable_http_hook("/plaintext") + .await + .route("/plaintext", route::plaintext) + .await; + + server + .disable_http_hook("/json") + .await + .route("/json", route::json) + .await; + + server + .disable_http_hook("/cached-quer") + .await + .route("/cached-quer", route::cached_query) + .await; + + server + .disable_http_hook("/db") + .await + .route("/db", route::db) + .await; + + server + .disable_http_hook("/query") + .await + .route("/query", route::query) + .await; + + server + .disable_http_hook("/fortunes") + .await + .route("/fortunes", route::fortunes) + .await; + + server + .disable_http_hook("/upda") + .await + .route("/upda", route::update) + .await; + + server.run().await.unwrap().wait().await; } async fn init() { - #[cfg(any( - feature = "dev", - feature = "db", - feature = "query", - feature = "update", - feature = "fortunes", - feature = "cached_query", - ))] init_db().await; init_server().await; } From 7455a4adf69361889d8261212a7d068bc6190b0f Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Aug 2025 19:00:29 +0200 Subject: [PATCH 1549/1766] [php] Wolff add Adapterman variant (#10024) --- frameworks/PHP/wolff/app/controllers/Home.php | 1 + frameworks/PHP/wolff/benchmark_config.json | 31 ++++++++++-- .../PHP/wolff/deploy/conf/adapterman-php.ini | 16 +++++++ frameworks/PHP/wolff/public/start.php | 32 +++++++++++++ frameworks/PHP/wolff/server.php | 47 +++++++++++++++++++ .../PHP/wolff/wolff-workerman.dockerfile | 30 ++++++++++++ 6 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 frameworks/PHP/wolff/deploy/conf/adapterman-php.ini create mode 100644 frameworks/PHP/wolff/public/start.php create mode 100644 frameworks/PHP/wolff/server.php create mode 100644 frameworks/PHP/wolff/wolff-workerman.dockerfile diff --git a/frameworks/PHP/wolff/app/controllers/Home.php b/frameworks/PHP/wolff/app/controllers/Home.php index 949e1cf71d1..39ce093edae 100644 --- a/frameworks/PHP/wolff/app/controllers/Home.php +++ b/frameworks/PHP/wolff/app/controllers/Home.php @@ -101,6 +101,7 @@ public function fortunes(Request $req, Response $res) usort($fortunes, function ($left, $right) { return $left['message'] <=> $right['message']; }); + $res->setHeader('Content-Type', 'text/html; charset=utf-8'); View::render('fortunes', [ 'fortunes' => $fortunes, ]); diff --git a/frameworks/PHP/wolff/benchmark_config.json b/frameworks/PHP/wolff/benchmark_config.json index 9752e40967e..f5fae37d32e 100755 --- a/frameworks/PHP/wolff/benchmark_config.json +++ b/frameworks/PHP/wolff/benchmark_config.json @@ -5,10 +5,10 @@ "default": { "json_url": "/json", "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/update?queries=", - "fortune_url": "/fortunes", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/update?queries=", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -24,6 +24,29 @@ "display_name": "Wolff", "notes": "", "versus": "php" + }, + "workerman": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/update?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "mysql", + "framework": "Wolff", + "language": "PHP", + "flavor": "PHP8", + "orm": "raw", + "platform": "workerman", + "webserver": "none", + "os": "Linux", + "database_os": "Linux", + "display_name": "Wolff [workerman]", + "notes": "", + "versus": "php" } } ] diff --git a/frameworks/PHP/wolff/deploy/conf/adapterman-php.ini b/frameworks/PHP/wolff/deploy/conf/adapterman-php.ini new file mode 100644 index 00000000000..9f0f3171834 --- /dev/null +++ b/frameworks/PHP/wolff/deploy/conf/adapterman-php.ini @@ -0,0 +1,16 @@ +opcache.enable=1 +opcache.enable_cli=1 +opcache.validate_timestamps=0 +opcache.save_comments=0 +opcache.enable_file_override=1 +opcache.memory_consumption=256 +opcache.interned_strings_buffer=16 +opcache.huge_code_pages=1 + +mysqlnd.collect_statistics = Off +memory_limit = 512M + +opcache.jit_buffer_size=128M +opcache.jit=tracing + +disable_functions=header,header_remove,headers_sent,headers_list,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,session_unset,session_get_cookie_params,session_set_cookie_params,set_time_limit diff --git a/frameworks/PHP/wolff/public/start.php b/frameworks/PHP/wolff/public/start.php new file mode 100644 index 00000000000..6000846e077 --- /dev/null +++ b/frameworks/PHP/wolff/public/start.php @@ -0,0 +1,32 @@ +start(); + header(HeaderDate::$date); // To pass the bench, nginx auto add it + + return ob_get_clean(); +} diff --git a/frameworks/PHP/wolff/server.php b/frameworks/PHP/wolff/server.php new file mode 100644 index 00000000000..507f3df619f --- /dev/null +++ b/frameworks/PHP/wolff/server.php @@ -0,0 +1,47 @@ +count = (int) shell_exec('nproc') * 4; +$http_worker->reusePort = true; +$http_worker->name = 'AdapterMan Wolff'; + +$http_worker->onWorkerStart = static function () { + HeaderDate::init(); + chdir(__DIR__.'/public'); + require 'start.php'; +}; + +$http_worker->onMessage = static function ($connection) { + + $connection->send(run()); +}; + +Worker::runAll(); + +class HeaderDate +{ + const NAME = 'Date: '; + + /** + * Date header + * + * @var string + */ + public static $date; + + public static function init(): void + { + self::$date = self::NAME . gmdate(DATE_RFC7231); + Timer::add(1, static function() { + self::$date = self::NAME . gmdate(DATE_RFC7231); + }); + } +} \ No newline at end of file diff --git a/frameworks/PHP/wolff/wolff-workerman.dockerfile b/frameworks/PHP/wolff/wolff-workerman.dockerfile new file mode 100644 index 00000000000..920de95b389 --- /dev/null +++ b/frameworks/PHP/wolff/wolff-workerman.dockerfile @@ -0,0 +1,30 @@ +FROM ubuntu:24.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 > /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.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl > /dev/null + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini + +COPY deploy/conf/adapterman-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini + +WORKDIR /wolff/bench +COPY --link . . + +EXPOSE 8080 + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer require joanhey/adapterman:^0.7 --quiet + +RUN chmod -R 777 /wolff + +CMD php server.php start + From 4af4805eba5028dc1e3863dfeab268b849a60e5b Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Mon, 11 Aug 2025 12:01:59 -0500 Subject: [PATCH 1550/1766] Add Shelf Framework (#10025) --- frameworks/Dart/shelf/.dockerignore | 9 +++ frameworks/Dart/shelf/.gitignore | 5 ++ frameworks/Dart/shelf/README.md | 23 ++++++ frameworks/Dart/shelf/benchmark_config.json | 26 +++++++ frameworks/Dart/shelf/bin/server.dart | 84 +++++++++++++++++++++ frameworks/Dart/shelf/pubspec.yaml | 7 ++ frameworks/Dart/shelf/shelf.dockerfile | 14 ++++ 7 files changed, 168 insertions(+) create mode 100644 frameworks/Dart/shelf/.dockerignore create mode 100644 frameworks/Dart/shelf/.gitignore create mode 100644 frameworks/Dart/shelf/README.md create mode 100644 frameworks/Dart/shelf/benchmark_config.json create mode 100755 frameworks/Dart/shelf/bin/server.dart create mode 100644 frameworks/Dart/shelf/pubspec.yaml create mode 100644 frameworks/Dart/shelf/shelf.dockerfile diff --git a/frameworks/Dart/shelf/.dockerignore b/frameworks/Dart/shelf/.dockerignore new file mode 100644 index 00000000000..6a6cc8727a7 --- /dev/null +++ b/frameworks/Dart/shelf/.dockerignore @@ -0,0 +1,9 @@ +# From https://hub.docker.com/_/dart +.dockerignore +Dockerfile +build/ +.dart_tool/ +.git/ +.github/ +.gitignore +.packages diff --git a/frameworks/Dart/shelf/.gitignore b/frameworks/Dart/shelf/.gitignore new file mode 100644 index 00000000000..27fe9f77a4b --- /dev/null +++ b/frameworks/Dart/shelf/.gitignore @@ -0,0 +1,5 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ +*.lock +!bin diff --git a/frameworks/Dart/shelf/README.md b/frameworks/Dart/shelf/README.md new file mode 100644 index 00000000000..90820f340dd --- /dev/null +++ b/frameworks/Dart/shelf/README.md @@ -0,0 +1,23 @@ +# Shelf Benchmarking Test + +### Test Type Implementation Source Code + +- [JSON](server.dart) +- [PLAINTEXT](server.dart) + +## Important Libraries + +The tests were run with: + +- [pkg:shelf](https://pub.dev/packages/shelf) +- [Dart](https://dart.dev/) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Dart/shelf/benchmark_config.json b/frameworks/Dart/shelf/benchmark_config.json new file mode 100644 index 00000000000..29200587d0c --- /dev/null +++ b/frameworks/Dart/shelf/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "shelf", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "shelf", + "language": "Dart", + "flavor": "None", + "orm": "None", + "platform": "shelf", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "shelf", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Dart/shelf/bin/server.dart b/frameworks/Dart/shelf/bin/server.dart new file mode 100755 index 00000000000..e3c3b71ca64 --- /dev/null +++ b/frameworks/Dart/shelf/bin/server.dart @@ -0,0 +1,84 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:isolate'; + +import 'package:shelf/shelf.dart'; +import 'package:shelf/shelf_io.dart' as shelf_io; + +void main(List args) async { + /// Create an [Isolate] containing an [HttpServer] + /// for each processor after the first + for (var i = 1; i < Platform.numberOfProcessors; i++) { + await Isolate.spawn(_startServer, args); + } + + /// Create a [HttpServer] for the first processor + await _startServer(args); +} + +/// Create a request handler +Response _handler(Request request) { + switch (request.url.path) { + case 'json': + return _jsonTest(); + case 'plaintext': + return _plaintextTest(); + default: + return _sendResponse(HttpStatus.notFound); + } +} + +/// Creates and setup a [HttpServer]. +Future _startServer(List _) async { + final server = await shelf_io.serve( + _handler, + InternetAddress.anyIPv4, + 8080, + shared: true, + ); + + /// Sets [HttpServer]'s [serverHeader]. + server + ..defaultResponseHeaders.clear() + ..serverHeader = 'shelf'; +} + +/// Completes the given [request] by writing the [bytes] with the given +/// [statusCode] and [type]. +Response _sendResponse( + int statusCode, { + ContentType? type, + List bytes = const [], +}) { + return Response( + statusCode, + headers: { + HttpHeaders.contentLengthHeader: '${bytes.length}', + HttpHeaders.dateHeader: '${HttpDate.format(DateTime.now())}', + if (type != null) HttpHeaders.contentTypeHeader: type.mimeType, + }, + body: bytes, + ); +} + +/// Completes the given [request] by writing the [response] as JSON. +Response _sendJson(Object response) => _sendResponse( + HttpStatus.ok, + type: ContentType.json, + bytes: _jsonEncoder.convert(response), +); + +/// Completes the given [request] by writing the [response] as plain text. +Response _sendText(String response) => _sendResponse( + HttpStatus.ok, + type: ContentType.text, + bytes: utf8.encode(response), +); + +/// Responds with the JSON test to the [request]. +Response _jsonTest() => _sendJson(const {'message': 'Hello, World!'}); + +/// Responds with the plaintext test to the [request]. +Response _plaintextTest() => _sendText('Hello, World!'); + +final _jsonEncoder = JsonUtf8Encoder(); diff --git a/frameworks/Dart/shelf/pubspec.yaml b/frameworks/Dart/shelf/pubspec.yaml new file mode 100644 index 00000000000..c41cff1b872 --- /dev/null +++ b/frameworks/Dart/shelf/pubspec.yaml @@ -0,0 +1,7 @@ +name: shelfbenchmark +description: A benchmark of pkg:shelf +environment: + sdk: ^3.8.0 + +dependencies: + shelf: ^1.0.0 diff --git a/frameworks/Dart/shelf/shelf.dockerfile b/frameworks/Dart/shelf/shelf.dockerfile new file mode 100644 index 00000000000..812b7e959ee --- /dev/null +++ b/frameworks/Dart/shelf/shelf.dockerfile @@ -0,0 +1,14 @@ + +FROM dart:3.8 AS builder + +COPY . /app +WORKDIR /app +RUN mkdir build +RUN dart compile exe ./bin/server.dart -o build/server + +FROM scratch +COPY --from=builder /runtime/ / +COPY --from=builder /app/build /bin + +EXPOSE 8080 +CMD ["server"] From 4cf964f7b2b8322e3ad999c40736bdc4513b9078 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Aug 2025 19:02:46 +0200 Subject: [PATCH 1551/1766] [php] Fix FrankenPHP (#10019) * [php] Fix FrankenPHP * Delete docker line for test --- frameworks/PHP/php/php-franken.dockerfile | 2 +- frameworks/PHP/symfony/symfony-franken.dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/PHP/php/php-franken.dockerfile b/frameworks/PHP/php/php-franken.dockerfile index 70d28b7a1ba..747a3722169 100644 --- a/frameworks/PHP/php/php-franken.dockerfile +++ b/frameworks/PHP/php/php-franken.dockerfile @@ -7,7 +7,7 @@ RUN install-php-extensions \ opcache > /dev/null -COPY --link deploy/franken/Caddyfile /etc/caddy/Caddyfile +COPY --link deploy/franken/Caddyfile /etc/frankenphp/Caddyfile COPY --link deploy/conf/php.ini /usr/local/etc/php/ COPY --link . /php diff --git a/frameworks/PHP/symfony/symfony-franken.dockerfile b/frameworks/PHP/symfony/symfony-franken.dockerfile index 05b8267409b..a985294ab58 100644 --- a/frameworks/PHP/symfony/symfony-franken.dockerfile +++ b/frameworks/PHP/symfony/symfony-franken.dockerfile @@ -1,4 +1,4 @@ -FROM dunglas/frankenphp +FROM dunglas/frankenphp:php8.4 # add additional extensions here: RUN install-php-extensions \ @@ -8,7 +8,7 @@ RUN install-php-extensions \ COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -COPY --link deploy/Caddyfile /etc/caddy/Caddyfile +COPY --link deploy/Caddyfile /etc/frankenphp/Caddyfile COPY --link deploy/conf/php.ini /usr/local/etc/php/ WORKDIR /symfony From 082fe667f36894347db61264c09e1e064c8e1b9d Mon Sep 17 00:00:00 2001 From: Ali RajabNezhad Date: Mon, 11 Aug 2025 20:33:09 +0330 Subject: [PATCH 1552/1766] [Python] Bump Panther to 5.0.2 (#10020) --- frameworks/Python/panther/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/Python/panther/requirements.txt b/frameworks/Python/panther/requirements.txt index d5fbd99e7b8..730b0ed72f8 100644 --- a/frameworks/Python/panther/requirements.txt +++ b/frameworks/Python/panther/requirements.txt @@ -1,5 +1,6 @@ -panther==5.0.1 +panther==5.0.2 cython==3.1.2 asyncpg==0.30.0 gunicorn==23.0.0 uvloop==0.21.0 +uvicorn==0.27.0 \ No newline at end of file From 7a4a9525bead4c0053698ed73931b49b559b8918 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Aug 2025 19:03:43 +0200 Subject: [PATCH 1553/1766] [php] Fix ubiquity-workerman-mongo (#10021) --- .../ubiquity/ubiquity-workerman-mongo.dockerfile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile index f4834e90eb5..a1408d288be 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile @@ -1,18 +1,18 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.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 LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.3-cli php8.3-mongodb php8.3-xml php8.3-mbstring > /dev/null + apt-get install -yqq git php8.4-cli php8.4-mongodb php8.4-xml php8.4-mbstring > /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 > /dev/null -RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.4-dev libevent-dev > /dev/null +RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.4/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.3/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.4/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.4/cli/php.ini EXPOSE 8080 From f6c3ffc6cbd3c52ee821dbcb65a7d9d8539bdd5b Mon Sep 17 00:00:00 2001 From: Vetrichelvan Date: Mon, 11 Aug 2025 22:36:55 +0530 Subject: [PATCH 1554/1766] Feat/litestar (#9905) * feat: add support for litestar * feat: add support for litestar * feat: refactor app structure and update dependencies * feat: update app structure and replace ujson5 with orjson * feat: add comprehensive .gitignore for Python and IDE files * feat: update benchmark configuration for Granian support * feat: update display names in benchmark configuration and modify Dockerfile installation * feat: update response handling to return Response objects for JSON endpoints * feat: update response handling to return Response objects for JSON endpoints * fix: copy files in Dockerfiles * fix: copy files in Dockerfiles * fix: remove usage of restricting to http2 * fix: resposne types * fix: resposne types * fix: remove socketify with pypy --- frameworks/Python/litestar/.gitignore | 244 ++++++++++++++++++ frameworks/Python/litestar/README.md | 37 +++ .../Python/litestar/app-socketify-asgi.py | 49 ++++ frameworks/Python/litestar/app.py | 152 +++++++++++ frameworks/Python/litestar/app_orm.py | 185 +++++++++++++ .../Python/litestar/benchmark_config.json | 186 +++++++++++++ frameworks/Python/litestar/config.toml | 184 +++++++++++++ .../litestar/litestar-granian-orm.dockerfile | 20 ++ .../litestar/litestar-granian.dockerfile | 18 ++ .../litestar/litestar-gunicorn-orm.dockerfile | 20 ++ .../litestar/litestar-gunicorn.dockerfile | 18 ++ .../litestar/litestar-nginx-unit.dockerfile | 20 ++ .../litestar-socketify-asgi.dockerfile | 19 ++ .../litestar/litestar-uvicorn.dockerfile | 18 ++ .../Python/litestar/litestar.dockerfile | 18 ++ frameworks/Python/litestar/litestar_conf.py | 12 + .../Python/litestar/nginx-unit-config.sh | 26 ++ .../Python/litestar/requirements-granian.txt | 2 + .../Python/litestar/requirements-gunicorn.txt | 2 + .../litestar/requirements-socketify.txt | 3 + .../litestar/requirements-sqlalchemy.txt | 3 + .../Python/litestar/requirements-uvicorn.txt | 3 + frameworks/Python/litestar/requirements.txt | 4 + frameworks/Python/litestar/ruff.toml | 79 ++++++ .../Python/litestar/templates/fortune.html | 10 + .../Python/litestar/templates/fortune.jinja | 10 + 26 files changed, 1342 insertions(+) create mode 100644 frameworks/Python/litestar/.gitignore create mode 100755 frameworks/Python/litestar/README.md create mode 100755 frameworks/Python/litestar/app-socketify-asgi.py create mode 100755 frameworks/Python/litestar/app.py create mode 100755 frameworks/Python/litestar/app_orm.py create mode 100755 frameworks/Python/litestar/benchmark_config.json create mode 100644 frameworks/Python/litestar/config.toml create mode 100644 frameworks/Python/litestar/litestar-granian-orm.dockerfile create mode 100644 frameworks/Python/litestar/litestar-granian.dockerfile create mode 100644 frameworks/Python/litestar/litestar-gunicorn-orm.dockerfile create mode 100644 frameworks/Python/litestar/litestar-gunicorn.dockerfile create mode 100644 frameworks/Python/litestar/litestar-nginx-unit.dockerfile create mode 100644 frameworks/Python/litestar/litestar-socketify-asgi.dockerfile create mode 100644 frameworks/Python/litestar/litestar-uvicorn.dockerfile create mode 100644 frameworks/Python/litestar/litestar.dockerfile create mode 100644 frameworks/Python/litestar/litestar_conf.py create mode 100755 frameworks/Python/litestar/nginx-unit-config.sh create mode 100644 frameworks/Python/litestar/requirements-granian.txt create mode 100644 frameworks/Python/litestar/requirements-gunicorn.txt create mode 100644 frameworks/Python/litestar/requirements-socketify.txt create mode 100644 frameworks/Python/litestar/requirements-sqlalchemy.txt create mode 100644 frameworks/Python/litestar/requirements-uvicorn.txt create mode 100644 frameworks/Python/litestar/requirements.txt create mode 100644 frameworks/Python/litestar/ruff.toml create mode 100644 frameworks/Python/litestar/templates/fortune.html create mode 100644 frameworks/Python/litestar/templates/fortune.jinja diff --git a/frameworks/Python/litestar/.gitignore b/frameworks/Python/litestar/.gitignore new file mode 100644 index 00000000000..738a70f9240 --- /dev/null +++ b/frameworks/Python/litestar/.gitignore @@ -0,0 +1,244 @@ +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### PyCharm+all template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +.ruff_cache/ \ No newline at end of file diff --git a/frameworks/Python/litestar/README.md b/frameworks/Python/litestar/README.md new file mode 100755 index 00000000000..c4b2b3e7ec8 --- /dev/null +++ b/frameworks/Python/litestar/README.md @@ -0,0 +1,37 @@ +# Litestar Benchmarking Test + +This is the Litestar portion of a [benchmarking tests suite](../../) +comparing a variety of web development platforms. + +The information below is specific to Litestar. 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 + +[**Litestar**](https://github.com/litestar-org/litestar) is a modern, fast (high-performance), web framework for building APIs with Python 3.6+. + +The key features are: + +* **Fast**: Very high performance, on par with **NodeJS** and **Go**. + +* **Fast to code**: Increase the speed to develop features by about 200% to 300% *. +* **Less bugs**: Reduce about 40% of human (developer) induced errors. * +* **Intuitive**: Great editor support. Completion everywhere. Less time debugging. +* **Easy**: Designed to be easy to use and learn. Less time reading docs. +* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Less bugs. +* **Robust**: Get production-ready code. With automatic interactive documentation. +* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: OpenAPI and JSON Schema. + +* estimation based on tests on an internal development team, building production applications. + +## Test Paths & Sources + +All of the test implementations are located within a single file ([app.py](app.py)). + + +## Resources + +* [Litestar source code on GitHub](https://github.com/litestar-org/litestar) +* [Litestar website - documentation](https://litestar.dev) diff --git a/frameworks/Python/litestar/app-socketify-asgi.py b/frameworks/Python/litestar/app-socketify-asgi.py new file mode 100755 index 00000000000..2e9de792826 --- /dev/null +++ b/frameworks/Python/litestar/app-socketify-asgi.py @@ -0,0 +1,49 @@ +import os +import multiprocessing +import logging + +import orjson +from litestar import Litestar, get, MediaType, Response +from socketify import ASGI + + +@get("/json") +async def json_serialization() -> Response: + return Response(content=orjson.dumps({"message": "Hello, world!"}), media_type=MediaType.JSON) + + +@get("/plaintext", media_type=MediaType.TEXT) +async def plaintext() -> bytes: + return b"Hello, world!" + + +app = Litestar( + route_handlers=[ + json_serialization, + plaintext, + ] +) + +_is_travis = os.environ.get("TRAVIS") == "true" + +workers = int(multiprocessing.cpu_count()) +if _is_travis: + workers = 2 + + +def run_app(): + ASGI(app).listen(8080, lambda config: logging.info(f"Listening on port http://localhost:{config.port} now\n")).run() + + +def create_fork(): + n = os.fork() + # n greater than 0 means parent process + if not n > 0: + run_app() + + +# fork limiting the cpu count - 1 +for i in range(1, workers): + create_fork() + +run_app() # run app on the main process too :) diff --git a/frameworks/Python/litestar/app.py b/frameworks/Python/litestar/app.py new file mode 100755 index 00000000000..6c5d0678ad9 --- /dev/null +++ b/frameworks/Python/litestar/app.py @@ -0,0 +1,152 @@ +import multiprocessing +import os +from contextlib import asynccontextmanager +from pathlib import Path +from random import randint, sample +from typing import Any + +import asyncpg +import orjson +from litestar import Litestar, MediaType, Request, get, Response +from litestar.contrib.jinja import JinjaTemplateEngine +from litestar.response import Template +from litestar.template import TemplateConfig + +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) + + +def get_num_queries(queries): + try: + query_count = int(queries) + except (ValueError, TypeError): + return 1 + + if query_count < 1: + return 1 + if query_count > 500: + return 500 + return query_count + + +connection_pool = None + + +async def setup_database(): + return await asyncpg.create_pool( + user=os.getenv("PGUSER", "benchmarkdbuser"), + password=os.getenv("PGPASS", "benchmarkdbpass"), + database="hello_world", + host="tfb-database", + port=5432, + min_size=MIN_POOL_SIZE, + max_size=MAX_POOL_SIZE, + ) + + +@asynccontextmanager +async def lifespan(app: Litestar): + # Set up the database connection pool + app.state.connection_pool = await setup_database() + yield + # Close the database connection pool + await app.state.connection_pool.close() + + +@get("/json") +async def json_serialization() -> Response: + return Response( + content=orjson.dumps({"message": "Hello, world!"}), + media_type=MediaType.JSON, + ) + + +@get("/db") +async def single_database_query() -> Response: + row_id = randint(1, 10000) + async with app.state.connection_pool.acquire() as connection: + number = await connection.fetchval(READ_ROW_SQL, row_id) + + return Response( + content=orjson.dumps({"id": row_id, "randomNumber": number}), + media_type=MediaType.JSON, + ) + + +@get("/queries") +async def multiple_database_queries(queries: Any = None) -> Response: + num_queries = get_num_queries(queries) + row_ids = sample(range(1, 10000), num_queries) + worlds = [] + + async with app.state.connection_pool.acquire() as connection: + statement = await connection.prepare(READ_ROW_SQL) + for row_id in row_ids: + number = await statement.fetchval(row_id) + worlds.append({"id": row_id, "randomNumber": number}) + + return Response( + content=orjson.dumps(worlds), + media_type=MediaType.JSON, + ) + + +@get("/fortunes", media_type=MediaType.HTML) +async def fortunes(request: Request) -> Template: + async with app.state.connection_pool.acquire() as connection: + fortunes = await connection.fetch("SELECT * FROM Fortune") + + fortunes.append(ADDITIONAL_ROW) + fortunes.sort(key=lambda row: row[1]) + return Template( + "fortune.html", + context={"fortunes": fortunes, "request": request}, + media_type=MediaType.HTML, + ) + + +@get("/updates") +async def database_updates(queries: Any = None) -> bytes: + num_queries = get_num_queries(queries) + # To avoid deadlock + ids = sorted(sample(range(1, 10000 + 1), num_queries)) + numbers = sorted(sample(range(1, 10000), num_queries)) + updates = list(zip(ids, numbers, strict=False)) + + worlds = [{"id": row_id, "randomNumber": number} for row_id, number in updates] + + async with app.state.connection_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( + content=orjson.dumps(worlds), + media_type=MediaType.JSON, + ) + + +@get("/plaintext", media_type=MediaType.TEXT) +async def plaintext() -> bytes: + return b"Hello, world!" + + +app = Litestar( + lifespan=[lifespan], + template_config=TemplateConfig( + directory=Path("templates"), + engine=JinjaTemplateEngine, + ), + route_handlers=[ + json_serialization, + single_database_query, + multiple_database_queries, + fortunes, + database_updates, + plaintext, + ], +) diff --git a/frameworks/Python/litestar/app_orm.py b/frameworks/Python/litestar/app_orm.py new file mode 100755 index 00000000000..ab7f415450c --- /dev/null +++ b/frameworks/Python/litestar/app_orm.py @@ -0,0 +1,185 @@ +import logging +import multiprocessing +import os +from contextlib import asynccontextmanager +from operator import attrgetter +from pathlib import Path +from random import randint, sample +from typing import Any + +import orjson +from litestar import Litestar, MediaType, Request, get, Response +from litestar.contrib.jinja import JinjaTemplateEngine +from litestar.response import Template +from litestar.template import TemplateConfig +from sqlalchemy import Column, Integer, String, select +from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm.attributes import flag_modified + +logger = logging.getLogger(__name__) + +Base = declarative_base() + + +class World(Base): + __tablename__ = "world" + id = Column(Integer, primary_key=True) + randomnumber = Column(Integer) + + def __json__(self): + return {"id": self.id, "randomnumber": self.randomnumber} + + +sa_data = World.__table__ + + +class Fortune(Base): + __tablename__ = "fortune" + id = Column(Integer, primary_key=True) + message = Column(String) + + +sa_fortunes = Fortune.__table__ + +ADDITIONAL_FORTUNE = Fortune(id=0, message="Additional fortune added at request time.") +MAX_POOL_SIZE = 1000 // multiprocessing.cpu_count() + +sort_fortunes_key = attrgetter("message") + +template_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates") + + +async def setup_database(): + dsn = "postgresql+asyncpg://%s:%s@tfb-database:5432/hello_world" % ( + os.getenv("PGPASS", "benchmarkdbuser"), + os.getenv("PGPASS", "benchmarkdbpass"), + ) + + engine = create_async_engine( + dsn, + future=True, + pool_size=MAX_POOL_SIZE, + connect_args={ + "ssl": False # NEEDED FOR NGINX-UNIT OTHERWISE IT FAILS + }, + ) + return async_sessionmaker(engine) + + +@asynccontextmanager +async def lifespan(app: Litestar): + # Set up the database connection pool + app.state.db_session = await setup_database() + yield + # Close the database connection pool + await app.state.db_session().close() + + +def get_num_queries(queries): + try: + query_count = int(queries) + except (ValueError, TypeError): + return 1 + + if query_count < 1: + return 1 + if query_count > 500: + return 500 + return query_count + + +@get("/json") +async def json_serialization() -> Response: + return Response( + content=orjson.dumps({"message": "Hello, world!"}), + media_type=MediaType.JSON, + ) + + +@get("/db") +async def single_database_query() -> Response: + id_ = randint(1, 10000) + + async with app.state.db_session() as sess: + result = await sess.get(World, id_) + + return Response( + content=orjson.dumps(result.__json__()), + media_type=MediaType.JSON, + ) + + +@get("/queries") +async def multiple_database_queries(queries: Any = None) -> Response: + num_queries = get_num_queries(queries) + data = [] + + async with app.state.db_session() as sess: + for id_ in sample(range(1, 10001), num_queries): + result = await sess.get(World, id_) + data.append(result.__json__()) + + return Response( + content=orjson.dumps(data), + media_type=MediaType.JSON, + ) + + +@get("/fortunes", media_type=MediaType.HTML) +async def fortunes(request: Request) -> Template: + async with app.state.db_session() as sess: + ret = await sess.execute(select(Fortune.id, Fortune.message)) + data = ret.all() + + data.append(ADDITIONAL_FORTUNE) + data.sort(key=sort_fortunes_key) + + return Template( + "fortune.jinja", + context={"request": request, "fortunes": data}, + media_type=MediaType.HTML, + ) + + +@get("/updates") +async def database_updates(queries: Any = None) -> Response: + num_queries = get_num_queries(queries) + + ids = sorted(sample(range(1, 10000 + 1), num_queries)) + data = [] + async with app.state.db_session.begin() as sess: + for id_ in ids: + world = await sess.get(World, id_, populate_existing=True) + world.randomnumber = randint(1, 10000) + # force sqlalchemy to UPDATE entry even if the value has not changed + # doesn't make sense in a real application, added only for pass `tfb verify` + flag_modified(world, "randomnumber") + data.append(world.__json__()) + + return Response( + content=orjson.dumps(data), + media_type=MediaType.JSON, + ) + + +@get("/plaintext", media_type=MediaType.TEXT) +async def plaintext() -> bytes: + return b"Hello, world!" + + +app = Litestar( + template_config=TemplateConfig( + directory=Path("templates"), + engine=JinjaTemplateEngine, + ), + lifespan=[lifespan], + route_handlers=[ + json_serialization, + single_database_query, + multiple_database_queries, + fortunes, + database_updates, + plaintext, + ], +) diff --git a/frameworks/Python/litestar/benchmark_config.json b/frameworks/Python/litestar/benchmark_config.json new file mode 100755 index 00000000000..1f94fc49174 --- /dev/null +++ b/frameworks/Python/litestar/benchmark_config.json @@ -0,0 +1,186 @@ +{ + "framework": "litestar", + "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", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "Gunicorn", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar", + "notes": "", + "versus": "None" + }, + "socketify-asgi": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "Socketify.py", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar [Socketify.py ASGI]", + "notes": "", + "versus": "None" + }, + "gunicorn": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "Gunicorn", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar-gunicorn", + "notes": "", + "versus": "None" + }, + "gunicorn-orm": { + "fortune_url": "/fortunes", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Full", + "platform": "asyncio", + "webserver": "Gunicorn", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar-gunicorn-orm", + "notes": "", + "versus": "None" + }, + "granian": { + "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", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "Granian", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar-granian", + "notes": "", + "versus": "None" + }, + "granian-orm": { + "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", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "Granian", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar-granian-orm", + "notes": "", + "versus": "None" + }, + "nginx-unit": { + "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", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "nginx-unit", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar-nginx-unit", + "notes": "", + "versus": "None", + "tags": [ + "broken" + ] + }, + "uvicorn": { + "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", + "database": "Postgres", + "framework": "Litestar", + "language": "Python", + "flavor": "Python3", + "orm": "Raw", + "platform": "asyncio", + "webserver": "Uvicorn", + "os": "Linux", + "database_os": "Linux", + "display_name": "Litestar-uvicorn", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Python/litestar/config.toml b/frameworks/Python/litestar/config.toml new file mode 100644 index 00000000000..7f9955e83d5 --- /dev/null +++ b/frameworks/Python/litestar/config.toml @@ -0,0 +1,184 @@ +[framework] +name = "litestar" + +[gunicorn] +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 = "None" +webserver = "Gunicorn" +versus = "None" + +[socketify-asgi-pypy] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "Socketify.py" +versus = "None" + +[socketify-asgi] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "Socketify.py" +versus = "None" + +[gunicorn-orjson] +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 = "None" +webserver = "Gunicorn" +versus = "None" + + +[gunicorn-orm] +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 = "Full" +platform = "None" +webserver = "Gunicorn" +versus = "None" + +[hypercorn] +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 = "None" +webserver = "Hypercorn" +versus = "None" + + +[hypercorn-orjson] +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 = "None" +webserver = "Hypercorn" +versus = "None" + +[nginx-unit] +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 = "None" +webserver = "nginx-unit" +versus = "None" + +[nginx-unit-orjson] +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 = "None" +webserver = "nginx-unit" +versus = "None" + + +[uvicorn] +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 = "None" +webserver = "uvicorn" +versus = "None" + +[uvicorn-orjson] +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 = "None" +webserver = "uvicorn" +versus = "None" diff --git a/frameworks/Python/litestar/litestar-granian-orm.dockerfile b/frameworks/Python/litestar/litestar-granian-orm.dockerfile new file mode 100644 index 00000000000..72c989b5f42 --- /dev/null +++ b/frameworks/Python/litestar/litestar-granian-orm.dockerfile @@ -0,0 +1,20 @@ +FROM python:3.13 + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN pip3 install cython==3.0.12 + +COPY requirements.txt requirements-sqlalchemy.txt requirements-granian.txt ./ + +RUN pip3 install -r requirements.txt -r requirements-sqlalchemy.txt -r requirements-granian.txt + +COPY . ./ + +EXPOSE 8080 + +ENV CONNECTION=ORM + +CMD granian --interface asgi app:app --host '0.0.0.0' --port 8080 --workers $(nproc) diff --git a/frameworks/Python/litestar/litestar-granian.dockerfile b/frameworks/Python/litestar/litestar-granian.dockerfile new file mode 100644 index 00000000000..ae838eaedf6 --- /dev/null +++ b/frameworks/Python/litestar/litestar-granian.dockerfile @@ -0,0 +1,18 @@ +FROM python:3.13 + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN pip3 install cython==3.0.12 + +COPY requirements.txt requirements-granian.txt ./ + +RUN pip3 install -r requirements.txt -r requirements-granian.txt + +COPY . ./ + +EXPOSE 8080 + +CMD granian --interface asgi app:app --host '0.0.0.0' --port 8080 --workers $(nproc) diff --git a/frameworks/Python/litestar/litestar-gunicorn-orm.dockerfile b/frameworks/Python/litestar/litestar-gunicorn-orm.dockerfile new file mode 100644 index 00000000000..a5c01176b32 --- /dev/null +++ b/frameworks/Python/litestar/litestar-gunicorn-orm.dockerfile @@ -0,0 +1,20 @@ +FROM python:3.13 + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN pip3 install cython==3.0.12 + +COPY requirements.txt requirements-sqlalchemy.txt requirements-gunicorn.txt ./ + +RUN pip3 install -r requirements.txt -r requirements-sqlalchemy.txt -r requirements-gunicorn.txt + +COPY . ./ + +EXPOSE 8080 + +ENV CONNECTION=ORM + +CMD gunicorn app_orm:app -k uvicorn_worker.UvicornWorker -c litestar_conf.py diff --git a/frameworks/Python/litestar/litestar-gunicorn.dockerfile b/frameworks/Python/litestar/litestar-gunicorn.dockerfile new file mode 100644 index 00000000000..6d3d793e6fc --- /dev/null +++ b/frameworks/Python/litestar/litestar-gunicorn.dockerfile @@ -0,0 +1,18 @@ +FROM python:3.13 + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN pip3 install cython==3.0.12 + +COPY requirements.txt requirements-gunicorn.txt ./ + +RUN pip3 install -r requirements.txt -r requirements-gunicorn.txt + +COPY . ./ + +EXPOSE 8080 + +CMD gunicorn app:app -k uvicorn_worker.UvicornWorker -c litestar_conf.py diff --git a/frameworks/Python/litestar/litestar-nginx-unit.dockerfile b/frameworks/Python/litestar/litestar-nginx-unit.dockerfile new file mode 100644 index 00000000000..b7b60b6f3d9 --- /dev/null +++ b/frameworks/Python/litestar/litestar-nginx-unit.dockerfile @@ -0,0 +1,20 @@ +FROM nginx/unit:1.29.1-python3.13 + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN pip3 install cython==3.0.12 + +COPY requirements.txt ./ + +RUN pip3 install -r requirements.txt + +COPY . ./ + +COPY ./nginx-unit-config.sh /docker-entrypoint.d/ + +ENV PGSSLMODE disable + +EXPOSE 8080 diff --git a/frameworks/Python/litestar/litestar-socketify-asgi.dockerfile b/frameworks/Python/litestar/litestar-socketify-asgi.dockerfile new file mode 100644 index 00000000000..0233ec1aebf --- /dev/null +++ b/frameworks/Python/litestar/litestar-socketify-asgi.dockerfile @@ -0,0 +1,19 @@ +FROM python:3.13-bullseye + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN apt-get update; apt-get install libuv1 -y +RUN pip3 install cython==3.0.12 + +COPY requirements-socketify.txt ./ + +RUN pip3 install -r requirements-socketify.txt + +COPY . ./ + +EXPOSE 8080 + +CMD python ./app-socketify-asgi.py diff --git a/frameworks/Python/litestar/litestar-uvicorn.dockerfile b/frameworks/Python/litestar/litestar-uvicorn.dockerfile new file mode 100644 index 00000000000..bacb4961ba1 --- /dev/null +++ b/frameworks/Python/litestar/litestar-uvicorn.dockerfile @@ -0,0 +1,18 @@ +FROM python:3.13 + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN pip3 install cython==3.0.12 + +COPY requirements.txt requirements-uvicorn.txt ./ + +RUN pip3 install -r requirements.txt -r requirements-uvicorn.txt + +COPY . ./ + +EXPOSE 8080 + +CMD uvicorn app:app --host 0.0.0.0 --port 8080 --workers $(nproc) --log-level error diff --git a/frameworks/Python/litestar/litestar.dockerfile b/frameworks/Python/litestar/litestar.dockerfile new file mode 100644 index 00000000000..6d3d793e6fc --- /dev/null +++ b/frameworks/Python/litestar/litestar.dockerfile @@ -0,0 +1,18 @@ +FROM python:3.13 + +WORKDIR /litestar + +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +RUN pip3 install cython==3.0.12 + +COPY requirements.txt requirements-gunicorn.txt ./ + +RUN pip3 install -r requirements.txt -r requirements-gunicorn.txt + +COPY . ./ + +EXPOSE 8080 + +CMD gunicorn app:app -k uvicorn_worker.UvicornWorker -c litestar_conf.py diff --git a/frameworks/Python/litestar/litestar_conf.py b/frameworks/Python/litestar/litestar_conf.py new file mode 100644 index 00000000000..c0f0af8f743 --- /dev/null +++ b/frameworks/Python/litestar/litestar_conf.py @@ -0,0 +1,12 @@ +import multiprocessing +import os + +_is_travis = os.environ.get("TRAVIS") == "true" + +workers = multiprocessing.cpu_count() + +bind = "0.0.0.0:8080" +keepalive = 120 +errorlog = "-" +pidfile = "/tmp/litestar.pid" +loglevel = "error" diff --git a/frameworks/Python/litestar/nginx-unit-config.sh b/frameworks/Python/litestar/nginx-unit-config.sh new file mode 100755 index 00000000000..3f947f13a90 --- /dev/null +++ b/frameworks/Python/litestar/nginx-unit-config.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +config='{' +config+=' "listeners": {' +config+=' "*:8080": {' +config+=' "pass": "applications/litestar"' +config+=' }' +config+=' },' +config+=' "applications": {' +config+=' "litestar": {' +config+=' "type": "python",' +config+=' "path": "/litestar",' +config+=' "home": "/opt/venv/",' +config+=' "protocol": "asgi",' +config+=' "module": "app",' +config+=' "callable": "app",' +config+=' "processes": '"$(nproc)"',' +config+=' }' +config+=' }', +config+=' "access_log": "/dev/null"' +config+='}' + +curl -X PUT \ + --data-binary "$config" \ + --unix-socket /var/run/control.unit.sock \ + http://localhost/config diff --git a/frameworks/Python/litestar/requirements-granian.txt b/frameworks/Python/litestar/requirements-granian.txt new file mode 100644 index 00000000000..946bfa8d0b1 --- /dev/null +++ b/frameworks/Python/litestar/requirements-granian.txt @@ -0,0 +1,2 @@ +granian==2.3.1 +litestar-granian==0.13.0 \ No newline at end of file diff --git a/frameworks/Python/litestar/requirements-gunicorn.txt b/frameworks/Python/litestar/requirements-gunicorn.txt new file mode 100644 index 00000000000..c95d2c0209a --- /dev/null +++ b/frameworks/Python/litestar/requirements-gunicorn.txt @@ -0,0 +1,2 @@ +gunicorn==23.0.0 +uvicorn-worker==0.3.0 diff --git a/frameworks/Python/litestar/requirements-socketify.txt b/frameworks/Python/litestar/requirements-socketify.txt new file mode 100644 index 00000000000..70c19fabec9 --- /dev/null +++ b/frameworks/Python/litestar/requirements-socketify.txt @@ -0,0 +1,3 @@ +orjson==3.10.16 +litestar==2.16.0 +git+https://github.com/cirospaciari/socketify.py.git@main#socketify diff --git a/frameworks/Python/litestar/requirements-sqlalchemy.txt b/frameworks/Python/litestar/requirements-sqlalchemy.txt new file mode 100644 index 00000000000..d2e7a36be45 --- /dev/null +++ b/frameworks/Python/litestar/requirements-sqlalchemy.txt @@ -0,0 +1,3 @@ +psycopg2==2.9.10 +SQLAlchemy==2.0.40 +litestar[sqlalchemy]==2.16.0 \ No newline at end of file diff --git a/frameworks/Python/litestar/requirements-uvicorn.txt b/frameworks/Python/litestar/requirements-uvicorn.txt new file mode 100644 index 00000000000..e9603a4a89c --- /dev/null +++ b/frameworks/Python/litestar/requirements-uvicorn.txt @@ -0,0 +1,3 @@ +uvicorn==0.34.2 +uvloop==0.21.0 +httptools==0.6.4 diff --git a/frameworks/Python/litestar/requirements.txt b/frameworks/Python/litestar/requirements.txt new file mode 100644 index 00000000000..e2b341ae256 --- /dev/null +++ b/frameworks/Python/litestar/requirements.txt @@ -0,0 +1,4 @@ +asyncpg==0.30.0 +litestar==2.16.0 +Jinja2==3.1.6 +orjson==3.10.18 \ No newline at end of file diff --git a/frameworks/Python/litestar/ruff.toml b/frameworks/Python/litestar/ruff.toml new file mode 100644 index 00000000000..adaca462881 --- /dev/null +++ b/frameworks/Python/litestar/ruff.toml @@ -0,0 +1,79 @@ +fix = true +line-length = 120 +src = ["evalai_backend", "tests"] +target-version = "py312" + +[format] +docstring-code-format = true +docstring-code-line-length = 120 +indent-style = "tab" +quote-style = "double" +skip-magic-trailing-comma = false + +[lint] +ignore = [ + "TID252", + "E501", + "S101", + "S102", + "S104", + "S324", + "EXE002", + "D100", + "D102", + "D203", # clash with formatter + "D206", # we use tabs + "D103", + "D104", + "D105", + "D106", + "D101", + "D107", + "D212", + "D211", + "PGH003", + "PGH004", + "N811", + "N804", + "N818", + "N806", + "N815", + "ARG001", + "ARG002", + "DTZ003", + "DTZ005", + "RSE102", + "SLF001", + "PLR", + "INP", + "TRY", + "SIM300", + "SIM114", + "DJ008", + "FIX002", + "S603", + "S607", + "TD002", + "TD003", + "W191", # We use tabs + "COM812", # missing trailing comma + "ISC001", # handled by formatter + "FBT001", + "FBT002", + "FBT003", + "ERA001", +] +select = [ + "ALL" +] + +[lint.flake8-annotations] +suppress-none-returning = true + +[lint.flake8-quotes] +docstring-quotes = "double" +inline-quotes = "double" +multiline-quotes = "double" + +[lint.isort] +combine-as-imports = true diff --git a/frameworks/Python/litestar/templates/fortune.html b/frameworks/Python/litestar/templates/fortune.html new file mode 100644 index 00000000000..1c90834285d --- /dev/null +++ b/frameworks/Python/litestar/templates/fortune.html @@ -0,0 +1,10 @@ + + +Fortunes + + + +{% for fortune in fortunes %} +{% endfor %}
      idmessage
      {{ fortune[0] }}{{ fortune[1]|e }}
      + + diff --git a/frameworks/Python/litestar/templates/fortune.jinja b/frameworks/Python/litestar/templates/fortune.jinja new file mode 100644 index 00000000000..5126edffbf7 --- /dev/null +++ b/frameworks/Python/litestar/templates/fortune.jinja @@ -0,0 +1,10 @@ + + +Fortunes + + + +{% for fortune in fortunes %} +{% endfor %}
      idmessage
      {{ fortune.id }}{{ fortune.message|e }}
      + + From f69cde7a468b63c7167fcbfba9113b2bcd86b200 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 12 Aug 2025 17:57:12 +0200 Subject: [PATCH 1555/1766] [php] Plain PHP with Adapterman add JIT (#10013) * [php] Plain PHP with Adapterman add JIT * Small change to rerun CI * Again small change that fail the CI build * Again small change for CI * Rerun CI * Fix dockerfile --- frameworks/PHP/php/php-h2o.dockerfile | 18 +++++++++--------- frameworks/PHP/php/php-workerman.dockerfile | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index f61bbdbcea6..a54bd0f8136 100644 --- a/frameworks/PHP/php/php-h2o.dockerfile +++ b/frameworks/PHP/php/php-h2o.dockerfile @@ -27,9 +27,9 @@ RUN apt-get -yqq update && \ pkg-config \ rsync \ ruby \ - systemtap-sdt-dev && \ + systemtap-sdt-dev > /dev/null && \ curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ - tar --strip-components=1 -xz && \ + tar --strip-components=1 -xz > /dev/null && \ cmake \ -B build \ -DCMAKE_AR=/usr/bin/gcc-ar \ @@ -38,9 +38,9 @@ RUN apt-get -yqq update && \ -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ -DWITH_MRUBY=on \ -G Ninja \ - -S . && \ - cmake --build build -j && \ - cmake --install build + -S . > /dev/null && \ + cmake --build build -j > /dev/null && \ + cmake --install build > /dev/null FROM "ubuntu:${UBUNTU_VERSION}" @@ -49,13 +49,13 @@ ARG PHP_VERSION=8.4 ENV TZ=America/Los_Angeles ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update && \ +RUN apt-get -yqq update > /dev/null && \ apt-get -yqq install \ apt-utils \ - software-properties-common && \ + software-properties-common > /dev/null && \ LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \ - apt-get -yqq update && \ - apt-get -yqq install \ + apt-get -yqq update > /dev/null && \ + apt-get -yqq install > /dev/null \ "php${PHP_VERSION}" \ "php${PHP_VERSION}-cli" \ "php${PHP_VERSION}-common" \ diff --git a/frameworks/PHP/php/php-workerman.dockerfile b/frameworks/PHP/php/php-workerman.dockerfile index b23e8c3249b..40ce5e187af 100644 --- a/frameworks/PHP/php/php-workerman.dockerfile +++ b/frameworks/PHP/php/php-workerman.dockerfile @@ -12,9 +12,9 @@ RUN apt-get install -yqq git unzip \ RUN apt-get install -y php-pear php8.4-dev php8.4-xml libevent-dev > /dev/null RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/event.ini -COPY deploy/workerman/cli-php.ini /etc/php/8.4/cli/php.ini +COPY deploy/workerman/cli-php.ini /etc/php/8.4/cli/conf.d/20-adapterman.ini -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer WORKDIR /php COPY --link . . From 5d44d6c270f82ee2f0b33ba5de5e7dcce81bcef2 Mon Sep 17 00:00:00 2001 From: rio Date: Wed, 13 Aug 2025 00:58:21 +0900 Subject: [PATCH 1556/1766] [php] Laravel apply opcache preloading (#9950) * [php] laravel apply opcache preloading * [php] fix: laravel apply opcache preloading not apply for frankenPHP * [php] fix: laravel-s build laravel-s test php 8.0 change composer minimum-stability dev to stable * [php] delete empty file --- frameworks/PHP/laravel/composer.json | 2 +- frameworks/PHP/laravel/deploy/conf/php.ini | 3 + frameworks/PHP/laravel/deploy/franken/php.ini | 1917 +++++++++++++++++ .../laravel/deploy/laravel-s/composer.json | 6 +- .../laravel/deploy/roadrunner/composer.json | 2 +- .../PHP/laravel/laravel-laravel-s.dockerfile | 4 +- .../laravel-octane-frankenphp.dockerfile | 3 +- frameworks/PHP/laravel/opcache_preload.php | 3 + frameworks/PHP/laravel/routes/web.php | 16 +- 9 files changed, 1940 insertions(+), 16 deletions(-) create mode 100644 frameworks/PHP/laravel/deploy/franken/php.ini create mode 100644 frameworks/PHP/laravel/opcache_preload.php diff --git a/frameworks/PHP/laravel/composer.json b/frameworks/PHP/laravel/composer.json index 5f11cec0b6d..391fa9a1106 100644 --- a/frameworks/PHP/laravel/composer.json +++ b/frameworks/PHP/laravel/composer.json @@ -25,7 +25,7 @@ "App\\": "app/" } }, - "minimum-stability": "dev", + "minimum-stability": "stable", "prefer-stable": true, "scripts": { "post-autoload-dump": [ diff --git a/frameworks/PHP/laravel/deploy/conf/php.ini b/frameworks/PHP/laravel/deploy/conf/php.ini index 6254bf9b20e..b7faa09421b 100644 --- a/frameworks/PHP/laravel/deploy/conf/php.ini +++ b/frameworks/PHP/laravel/deploy/conf/php.ini @@ -1886,6 +1886,9 @@ opcache.huge_code_pages=1 ; Prevent name collisions in chroot'ed environment. ;opcache.validate_root=0 +opcache.preload_user=www-data +opcache.preload=/laravel/opcache_preload.php + [curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. diff --git a/frameworks/PHP/laravel/deploy/franken/php.ini b/frameworks/PHP/laravel/deploy/franken/php.ini new file mode 100644 index 00000000000..6254bf9b20e --- /dev/null +++ b/frameworks/PHP/laravel/deploy/franken/php.ini @@ -0,0 +1,1917 @@ +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; PHP's initialization file, generally called php.ini, is responsible for +; configuring many of the aspects of PHP's behavior. + +; PHP attempts to find and load this configuration from a number of locations. +; The following is a summary of its search order: +; 1. SAPI module specific location. +; 2. The PHPRC environment variable. (As of PHP 5.2.0) +; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) +; 4. Current working directory (except CLI) +; 5. The web server's directory (for SAPI modules), or directory of PHP +; (otherwise in Windows) +; 6. The directory from the --with-config-file-path compile time option, or the +; Windows directory (C:\windows or C:\winnt) +; See the PHP docs for more specific information. +; http://php.net/configuration.file + +; The syntax of the file is extremely simple. Whitespace and lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. + +; Directives following the section heading [PATH=/www/mysite] only +; apply to PHP files in the /www/mysite directory. Directives +; following the section heading [HOST=www.example.com] only apply to +; PHP files served from www.example.com. Directives set in these +; special sections cannot be overridden by user-defined INI files or +; at runtime. Currently, [PATH=] and [HOST=] sections only work under +; CGI/FastCGI. +; http://php.net/ini.sections + +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; Directives are variables used to configure PHP or PHP extensions. +; There is no name validation. If PHP can't find an expected +; directive because it is not set or is mistyped, a default value will be used. + +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a +; previously set variable or directive (e.g. ${foo}) + +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; ^ bitwise XOR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT + +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. + +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: + +; foo = ; sets foo to an empty string +; foo = None ; sets foo to an empty string +; foo = "None" ; sets foo to the string 'None' + +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. + +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; PHP comes packaged with two INI files. One that is recommended to be used +; in production environments and one that is recommended to be used in +; development environments. + +; php.ini-production contains settings which hold security, performance and +; best practices at its core. But please be aware, these settings may break +; compatibility with older or less security conscience applications. We +; recommending using the production ini in production and testing environments. + +; php.ini-development is very similar to its production variant, except it is +; much more verbose when it comes to errors. We recommend using the +; development version only in development environments, as errors shown to +; application users can inadvertently leak otherwise secure information. + +; This is php.ini-production INI file. + +;;;;;;;;;;;;;;;;;;; +; Quick Reference ; +;;;;;;;;;;;;;;;;;;; +; The following are all the settings which are different in either the production +; or development versions of the INIs with respect to PHP's default behavior. +; Please see the actual settings later in the document for more details as to why +; we recommend these changes in PHP's behavior. + +; display_errors +; Default Value: On +; Development Value: On +; Production Value: Off + +; display_startup_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; error_reporting +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT + +; html_errors +; Default Value: On +; Development Value: On +; Production value: On + +; log_errors +; Default Value: Off +; Development Value: On +; Production Value: On + +; max_input_time +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) + +; output_buffering +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 + +; register_argc_argv +; Default Value: On +; Development Value: Off +; Production Value: Off + +; request_order +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" + +; session.gc_divisor +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 + +; session.sid_bits_per_character +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 + +; short_open_tag +; Default Value: On +; Development Value: Off +; Production Value: Off + +; track_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; variables_order +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS" + +;;;;;;;;;;;;;;;;;;;; +; php.ini Options ; +;;;;;;;;;;;;;;;;;;;; +; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" +;user_ini.filename = ".user.ini" + +; To disable this feature set this option to empty value +;user_ini.filename = + +; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) +;user_ini.cache_ttl = 300 + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +; http://php.net/engine +engine = On + +; This directive determines whether or not PHP will recognize code between +; tags as PHP source which should be processed as such. It is +; generally recommended that should be used and that this feature +; should be disabled, as enabling it may result in issues when generating XML +; documents, however this remains supported for backward compatibility reasons. +; Note that this directive does not control the would work. +; http://php.net/syntax-highlighting +;highlight.string = #DD0000 +;highlight.comment = #FF9900 +;highlight.keyword = #007700 +;highlight.default = #0000BB +;highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long requests, which may end up +; being interrupted by the user or a browser timing out. PHP's default behavior +; is to disable this feature. +; http://php.net/ignore-user-abort +;ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; http://php.net/realpath-cache-size +realpath_cache_size = 4096k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; http://php.net/realpath-cache-ttl +realpath_cache_ttl = 600 + +; Enables or disables the circular reference collector. +; http://php.net/zend.enable-gc +zend.enable_gc = On + +; If enabled, scripts may be written in encodings that are incompatible with +; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such +; encodings. To use this feature, mbstring extension must be enabled. +; Default: Off +;zend.multibyte = Off + +; Allows to set the default encoding for the scripts. This value will be used +; unless "declare(encoding=...)" directive appears at the top of the script. +; Only affects if zend.multibyte is set. +; Default: "" +;zend.script_encoding = + +;;;;;;;;;;;;;;;;; +; Miscellaneous ; +;;;;;;;;;;;;;;;;; + +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +; http://php.net/expose-php +expose_php = Off + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +; Maximum execution time of each script, in seconds +; http://php.net/max-execution-time +; Note: This directive is hardcoded to 0 for the CLI SAPI +max_execution_time = 30 + +; Maximum amount of time each script may spend parsing request data. It's a good +; idea to limit this time on productions servers in order to eliminate unexpectedly +; long running scripts. +; Note: This directive is hardcoded to -1 for the CLI SAPI +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) +; http://php.net/max-input-time +max_input_time = 60 + +; Maximum input variable nesting level +; http://php.net/max-input-nesting-level +;max_input_nesting_level = 64 + +; How many GET/POST/COOKIE input variables may be accepted +; max_input_vars = 1000 + +; Maximum amount of memory a script may consume (128MB) +; http://php.net/memory-limit +memory_limit = 128M + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; This directive informs PHP of which errors, warnings and notices you would like +; it to take action for. The recommended way of setting values for this +; directive is through the use of the error level constants and bitwise +; operators. The error level constants are below here for convenience as well as +; some common settings and their meanings. +; By default, PHP is set to take action on all errors, notices and warnings EXCEPT +; those related to E_NOTICE and E_STRICT, which together cover best practices and +; recommended coding standards in PHP. For performance reasons, this is the +; recommend error reporting setting. Your production server shouldn't be wasting +; resources complaining about best practices and coding standards. That's what +; development servers and development settings are for. +; Note: The php.ini-development file has this setting as E_ALL. This +; means it pretty much reports everything which is exactly what you want during +; development and early testing. +; +; Error Level Constants: +; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) +; E_ERROR - fatal run-time errors +; E_RECOVERABLE_ERROR - almost fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it is automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; E_DEPRECATED - warn about code that will not work in future versions +; of PHP +; E_USER_DEPRECATED - user-generated deprecation warnings +; +; Common Values: +; E_ALL (Show all errors, warnings and notices including coding standards.) +; E_ALL & ~E_NOTICE (Show all errors, except for notices) +; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) +; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT +; http://php.net/error-reporting +error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT + +; This directive controls whether or not and where PHP will output errors, +; notices and warnings too. Error output is very useful during development, but +; it could be very dangerous in production environments. Depending on the code +; which is triggering the error, sensitive information could potentially leak +; out of your application such as database usernames and passwords or worse. +; For production environments, we recommend logging errors rather than +; sending them to STDOUT. +; Possible Values: +; Off = Do not display any errors +; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout = Display errors to STDOUT +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/display-errors +display_errors = Off + +; The display of errors which occur during PHP's startup sequence are handled +; separately from display_errors. PHP's default behavior is to suppress those +; errors from clients. Turning the display of startup errors on can be useful in +; debugging configuration problems. We strongly recommend you +; set this to 'off' for production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/display-startup-errors +display_startup_errors = Off + +; Besides displaying errors, PHP can also log errors to locations such as a +; server-specific log, STDERR, or a location specified by the error_log +; directive found below. While errors should not be displayed on productions +; servers they should still be monitored and logging is a great way to do that. +; Default Value: Off +; Development Value: On +; Production Value: On +; http://php.net/log-errors +log_errors = On + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +; http://php.net/log-errors-max-len +log_errors_max_len = 1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line unless ignore_repeated_source is set true. +; http://php.net/ignore-repeated-errors +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; source lines. +; http://php.net/ignore-repeated-source +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +; http://php.net/report-memleaks +report_memleaks = On + +; This setting is on by default. +;report_zend_debug = 0 + +; Store the last error/warning message in $php_errormsg (boolean). Setting this value +; to On can assist in debugging and is appropriate for development servers. It should +; however be disabled on production servers. +; This directive is DEPRECATED. +; Default Value: Off +; Development Value: Off +; Production Value: Off +; http://php.net/track-errors +;track_errors = Off + +; Turn off normal error reporting and emit XML-RPC error XML +; http://php.net/xmlrpc-errors +;xmlrpc_errors = 0 + +; An XML-RPC faultCode +;xmlrpc_error_number = 0 + +; When PHP displays or logs an error, it has the capability of formatting the +; error message as HTML for easier reading. This directive controls whether +; the error message is formatted as HTML or not. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: On +; Development Value: On +; Production value: On +; http://php.net/html-errors +html_errors = On + +; If html_errors is set to On *and* docref_root is not empty, then PHP +; produces clickable error messages that direct to a page describing the error +; or function causing the error in detail. +; You can download a copy of the PHP manual from http://php.net/docs +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. PHP's default behavior is to leave these settings empty, in which +; case no links to documentation are generated. +; Note: Never use this feature for production boxes. +; http://php.net/docref-root +; Examples +;docref_root = "/phpmanual/" + +; http://php.net/docref-ext +;docref_ext = .html + +; String to output before an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-prepend-string +; Example: +;error_prepend_string = "" + +; String to output after an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-append-string +; Example: +;error_append_string = "" + +; Log errors to specified file. PHP's default behavior is to leave this value +; empty. +; http://php.net/error-log +; Example: +;error_log = php_errors.log +; Log errors to syslog (Event Log on Windows). +;error_log = syslog + +;windows.show_crt_warning +; Default value: 0 +; Development value: 0 +; Production value: 0 + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; + +; The separator used in PHP generated URLs to separate arguments. +; PHP's default setting is "&". +; http://php.net/arg-separator.output +; Example: +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; PHP's default setting is "&". +; NOTE: Every character in this directive is considered as separator! +; http://php.net/arg-separator.input +; Example: +;arg_separator.input = ";&" + +; This directive determines which super global arrays are registered when PHP +; starts up. G,P,C,E & S are abbreviations for the following respective super +; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty +; paid for the registration of these arrays and because ENV is not as commonly +; used as the others, ENV is not recommended on productions servers. You +; can still get access to the environment variables through getenv() should you +; need to. +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS"; +; http://php.net/variables-order +variables_order = "GPCS" + +; This directive determines which super global data (G,P & C) should be +; registered into the super global array REQUEST. If so, it also determines +; the order in which that data is registered. The values for this directive +; are specified in the same manner as the variables_order directive, +; EXCEPT one. Leaving this value empty will cause PHP to use the value set +; in the variables_order directive. It does not mean it will leave the super +; globals array REQUEST empty. +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" +; http://php.net/request-order +request_order = "GP" + +; This directive determines whether PHP registers $argv & $argc each time it +; runs. $argv contains an array of all the arguments passed to PHP when a script +; is invoked. $argc contains an integer representing the number of arguments +; that were passed when the script was invoked. These arrays are extremely +; useful when running scripts from the command line. When this directive is +; enabled, registering these variables consumes CPU cycles and memory each time +; a script is executed. For performance reasons, this feature should be disabled +; on production servers. +; Note: This directive is hardcoded to On for the CLI SAPI +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/register-argc-argv +register_argc_argv = Off + +; When enabled, the ENV, REQUEST and SERVER variables are created when they're +; first used (Just In Time) instead of when the script starts. If these +; variables are not used within a script, having this directive on will result +; in a performance gain. The PHP directive register_argc_argv must be disabled +; for this directive to have any affect. +; http://php.net/auto-globals-jit +auto_globals_jit = On + +; Whether PHP will read the POST data. +; This option is enabled by default. +; Most likely, you won't want to disable this option globally. It causes $_POST +; and $_FILES to always be empty; the only way you will be able to read the +; POST data will be through the php://input stream wrapper. This can be useful +; to proxy requests or to process the POST data in a memory efficient fashion. +; http://php.net/enable-post-data-reading +;enable_post_data_reading = Off + +; Maximum size of POST data that PHP will accept. +; Its value may be 0 to disable the limit. It is ignored if POST data reading +; is disabled through enable_post_data_reading. +; http://php.net/post-max-size +post_max_size = 8M + +; Automatically add files before PHP document. +; http://php.net/auto-prepend-file +auto_prepend_file = + +; Automatically add files after PHP document. +; http://php.net/auto-append-file +auto_append_file = + +; By default, PHP will output a media type using the Content-Type header. To +; disable this, simply set it to be empty. +; +; PHP's built-in default media type is set to text/html. +; http://php.net/default-mimetype +default_mimetype = "text/html" + +; PHP's default character set is set to UTF-8. +; http://php.net/default-charset +default_charset = "UTF-8" + +; PHP internal character encoding is set to empty. +; If empty, default_charset is used. +; http://php.net/internal-encoding +;internal_encoding = + +; PHP input character encoding is set to empty. +; If empty, default_charset is used. +; http://php.net/input-encoding +;input_encoding = + +; PHP output character encoding is set to empty. +; If empty, default_charset is used. +; See also output_buffer. +; http://php.net/output-encoding +;output_encoding = + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = ".:/usr/share/php" +; +; Windows: "\path1;\path2" +;include_path = ".;c:\php\includes" +; +; PHP's default setting for include_path is ".;/path/to/php/pear" +; http://php.net/include-path + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +; http://php.net/doc-root +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +; http://php.net/user-dir +user_dir = + +; Directory in which the loadable extensions (modules) reside. +; http://php.net/extension-dir +; extension_dir = "./" +; On windows: +; extension_dir = "ext" + +; Directory where the temporary files should be placed. +; Defaults to the system default (see sys_get_temp_dir) +; sys_temp_dir = "/tmp" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +; http://php.net/enable-dl +enable_dl = Off + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; http://php.net/cgi.force-redirect +;cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. PHP's default behavior is to disable this feature. +;cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; http://php.net/cgi.redirect-status-env +;cgi.redirect_status_env = + +; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's +; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok +; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting +; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting +; of zero causes PHP to behave as before. Default is 1. You should fix your scripts +; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. +; http://php.net/cgi.fix-pathinfo + cgi.fix_pathinfo=0 + +; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside +; of the web tree and people will not be able to circumvent .htaccess security. +; http://php.net/cgi.dicard-path +;cgi.discard_path=1 + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; http://php.net/fastcgi.impersonate +;fastcgi.impersonate = 1 + +; Disable logging through FastCGI connection. PHP's default behavior is to enable +; this feature. +;fastcgi.logging = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If set to 0, PHP sends Status: header that +; is supported by Apache. When this option is set to 1, PHP will send +; RFC2616 compliant header. +; Default is zero. +; http://php.net/cgi.rfc2616-headers +;cgi.rfc2616_headers = 0 + +; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! +; (shebang) at the top of the running script. This line might be needed if the +; script support running both as stand-alone script and via PHP CGI<. PHP in CGI +; mode skips this line and ignores its content if this directive is turned on. +; http://php.net/cgi.check-shebang-line +;cgi.check_shebang_line=1 + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +; http://php.net/file-uploads +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +; http://php.net/upload-tmp-dir +;upload_tmp_dir = + +; Maximum allowed size for uploaded files. +; http://php.net/upload-max-filesize +upload_max_filesize = 2M + +; Maximum number of files that can be uploaded via a single request +max_file_uploads = 20 + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-fopen +allow_url_fopen = On + +; Whether to allow include/require to open URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-include +allow_url_include = Off + +; Define the anonymous ftp password (your email address). PHP's default setting +; for this is empty. +; http://php.net/from +;from="john@doe.com" + +; Define the User-Agent string. PHP's default setting for this is empty. +; http://php.net/user-agent +;user_agent="PHP" + +; Default timeout for socket based streams (seconds) +; http://php.net/default-socket-timeout +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; http://php.net/auto-detect-line-endings +;auto_detect_line_endings = Off + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; + +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename +; +; For example: +; +; extension=mysqli +; +; When the extension library to load is not located in the default extension +; directory, You may specify an absolute path to the library file: +; +; extension=/path/to/extension/mysqli.so +; +; Note : The syntax used in previous PHP versions ('extension=.so' and +; 'extension='php_.dll') is supported for legacy reasons and may be +; deprecated in a future PHP major version. So, when it is possible, please +; move to the new ('extension=) syntax. +; +; Notes for Windows environments : +; +; - ODBC support is built in, so no dll is needed for it. +; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) +; extension folders as well as the separate PECL DLL download (PHP 5+). +; Be sure to appropriately set the extension_dir directive. +; +;extension=bz2 +;extension=curl +;extension=fileinfo +;extension=gd2 +;extension=gettext +;extension=gmp +;extension=intl +;extension=imap +;extension=interbase +;extension=ldap +;extension=mbstring +;extension=exif ; Must be after mbstring as it depends on it +;extension=mysqli +;extension=oci8_12c ; Use with Oracle Database 12c Instant Client +;extension=openssl +;extension=pdo_firebird +;extension=pdo_mysql +;extension=pdo_oci +;extension=pdo_odbc +;extension=pdo_pgsql +;extension=pdo_sqlite +;extension=pgsql +;extension=shmop + +; The MIBS data available in the PHP distribution must be installed. +; See http://www.php.net/manual/en/snmp.installation.php +;extension=snmp + +;extension=soap +;extension=sockets +;extension=sqlite3 +;extension=tidy +;extension=xmlrpc +;extension=xsl + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[CLI Server] +; Whether the CLI web server uses ANSI color coding in its terminal output. +cli_server.color = On + +[Date] +; Defines the default timezone used by the date functions +; http://php.net/date.timezone +date.timezone = UTC + +; http://php.net/date.default-latitude +;date.default_latitude = 31.7667 + +; http://php.net/date.default-longitude +;date.default_longitude = 35.2333 + +; http://php.net/date.sunrise-zenith +;date.sunrise_zenith = 90.583333 + +; http://php.net/date.sunset-zenith +;date.sunset_zenith = 90.583333 + +[filter] +; http://php.net/filter.default +;filter.default = unsafe_raw + +; http://php.net/filter.default-flags +;filter.default_flags = + +[iconv] +; Use of this INI entry is deprecated, use global input_encoding instead. +; If empty, default_charset or input_encoding or iconv.input_encoding is used. +; The precedence is: default_charset < intput_encoding < iconv.input_encoding +;iconv.input_encoding = + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;iconv.internal_encoding = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; If empty, default_charset or output_encoding or iconv.output_encoding is used. +; The precedence is: default_charset < output_encoding < iconv.output_encoding +; To use an output encoding conversion, iconv's output handler must be set +; otherwise output encoding conversion cannot be performed. +;iconv.output_encoding = + +[intl] +;intl.default_locale = +; This directive allows you to produce PHP errors when some error +; happens within intl functions. The value is the level of the error produced. +; Default is 0, which does not produce any errors. +;intl.error_level = E_WARNING +;intl.use_exceptions = 0 + +[sqlite3] +;sqlite3.extension_dir = + +[Pcre] +;PCRE library backtracking limit. +; http://php.net/pcre.backtrack-limit +;pcre.backtrack_limit=100000 + +;PCRE library recursion limit. +;Please note that if you set this value to a high number you may consume all +;the available process stack and eventually crash PHP (due to reaching the +;stack size limit imposed by the Operating System). +; http://php.net/pcre.recursion-limit +;pcre.recursion_limit=100000 + +;Enables or disables JIT compilation of patterns. This requires the PCRE +;library to be compiled with JIT support. +;pcre.jit=1 + +[Pdo] +; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" +; http://php.net/pdo-odbc.connection-pooling +;pdo_odbc.connection_pooling=strict + +;pdo_odbc.db2_instance_name + +[Pdo_mysql] +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/pdo_mysql.cache_size +pdo_mysql.cache_size = 2000 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/pdo_mysql.default-socket +pdo_mysql.default_socket= + +[Phar] +; http://php.net/phar.readonly +;phar.readonly = On + +; http://php.net/phar.require-hash +;phar.require_hash = On + +;phar.cache_list = + +[mail function] +; For Win32 only. +; http://php.net/smtp +SMTP = localhost +; http://php.net/smtp-port +smtp_port = 25 + +; For Win32 only. +; http://php.net/sendmail-from +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +; http://php.net/sendmail-path +;sendmail_path = + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(). +;mail.force_extra_parameters = + +; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename +mail.add_x_header = On + +; The path to a log file that will log all mail() calls. Log entries include +; the full path of the script, line number, To address and headers. +;mail.log = +; Log mail to syslog (Event Log on Windows). +;mail.log = syslog + +[ODBC] +; http://php.net/odbc.default-db +;odbc.default_db = Not yet implemented + +; http://php.net/odbc.default-user +;odbc.default_user = Not yet implemented + +; http://php.net/odbc.default-pw +;odbc.default_pw = Not yet implemented + +; Controls the ODBC cursor model. +; Default: SQL_CURSOR_STATIC (default). +;odbc.default_cursortype + +; Allow or prevent persistent links. +; http://php.net/odbc.allow-persistent +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +; http://php.net/odbc.check-persistent +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/odbc.max-persistent +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/odbc.max-links +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +; http://php.net/odbc.defaultlrl +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of odbc.defaultlrl and odbc.defaultbinmode +; http://php.net/odbc.defaultbinmode +odbc.defaultbinmode = 1 + +;birdstep.max_links = -1 + +[Interbase] +; Allow or prevent persistent links. +ibase.allow_persistent = 1 + +; Maximum number of persistent links. -1 means no limit. +ibase.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ibase.max_links = -1 + +; Default database name for ibase_connect(). +;ibase.default_db = + +; Default username for ibase_connect(). +;ibase.default_user = + +; Default password for ibase_connect(). +;ibase.default_password = + +; Default charset for ibase_connect(). +;ibase.default_charset = + +; Default timestamp format. +ibase.timestampformat = "%Y-%m-%d %H:%M:%S" + +; Default date format. +ibase.dateformat = "%Y-%m-%d" + +; Default time format. +ibase.timeformat = "%H:%M:%S" + +[MySQLi] + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/mysqli.max-persistent +mysqli.max_persistent = -1 + +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; http://php.net/mysqli.allow_local_infile +;mysqli.allow_local_infile = On + +; Allow or prevent persistent links. +; http://php.net/mysqli.allow-persistent +mysqli.allow_persistent = On + +; Maximum number of links. -1 means no limit. +; http://php.net/mysqli.max-links +mysqli.max_links = -1 + +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/mysqli.cache_size +mysqli.cache_size = 2000 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +; http://php.net/mysqli.default-port +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/mysqli.default-socket +mysqli.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-host +mysqli.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-user +mysqli.default_user = + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; http://php.net/mysqli.default-pw +mysqli.default_pw = + +; Allow or prevent reconnect +mysqli.reconnect = Off + +[mysqlnd] +; Enable / Disable collection of general statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_statistics +mysqlnd.collect_statistics = Off + +; Enable / Disable collection of memory usage statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_memory_statistics +mysqlnd.collect_memory_statistics = Off + +; Records communication from all extensions using mysqlnd to the specified log +; file. +; http://php.net/mysqlnd.debug +;mysqlnd.debug = + +; Defines which queries will be logged. +; http://php.net/mysqlnd.log_mask +;mysqlnd.log_mask = 0 + +; Default size of the mysqlnd memory pool, which is used by result sets. +; http://php.net/mysqlnd.mempool_default_size +;mysqlnd.mempool_default_size = 16000 + +; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. +; http://php.net/mysqlnd.net_cmd_buffer_size +;mysqlnd.net_cmd_buffer_size = 2048 + +; Size of a pre-allocated buffer used for reading data sent by the server in +; bytes. +; http://php.net/mysqlnd.net_read_buffer_size +;mysqlnd.net_read_buffer_size = 32768 + +; Timeout for network requests in seconds. +; http://php.net/mysqlnd.net_read_timeout +;mysqlnd.net_read_timeout = 31536000 + +; SHA-256 Authentication Plugin related. File with the MySQL server public RSA +; key. +; http://php.net/mysqlnd.sha256_server_public_key +;mysqlnd.sha256_server_public_key = + +[OCI8] + +; Connection: Enables privileged connections using external +; credentials (OCI_SYSOPER, OCI_SYSDBA) +; http://php.net/oci8.privileged-connect +;oci8.privileged_connect = Off + +; Connection: The maximum number of persistent OCI8 connections per +; process. Using -1 means no limit. +; http://php.net/oci8.max-persistent +;oci8.max_persistent = -1 + +; Connection: The maximum number of seconds a process is allowed to +; maintain an idle persistent connection. Using -1 means idle +; persistent connections will be maintained forever. +; http://php.net/oci8.persistent-timeout +;oci8.persistent_timeout = -1 + +; Connection: The number of seconds that must pass before issuing a +; ping during oci_pconnect() to check the connection validity. When +; set to 0, each oci_pconnect() will cause a ping. Using -1 disables +; pings completely. +; http://php.net/oci8.ping-interval +;oci8.ping_interval = 60 + +; Connection: Set this to a user chosen connection class to be used +; for all pooled server requests with Oracle 11g Database Resident +; Connection Pooling (DRCP). To use DRCP, this value should be set to +; the same string for all web servers running the same application, +; the database pool must be configured, and the connection string must +; specify to use a pooled server. +;oci8.connection_class = + +; High Availability: Using On lets PHP receive Fast Application +; Notification (FAN) events generated when a database node fails. The +; database must also be configured to post FAN events. +;oci8.events = Off + +; Tuning: This option enables statement caching, and specifies how +; many statements to cache. Using 0 disables statement caching. +; http://php.net/oci8.statement-cache-size +;oci8.statement_cache_size = 20 + +; Tuning: Enables statement prefetching and sets the default number of +; rows that will be fetched automatically after statement execution. +; http://php.net/oci8.default-prefetch +;oci8.default_prefetch = 100 + +; Compatibility. Using On means oci_close() will not close +; oci_connect() and oci_new_connect() connections. +; http://php.net/oci8.old-oci-close-semantics +;oci8.old_oci_close_semantics = Off + +[PostgreSQL] +; Allow or prevent persistent links. +; http://php.net/pgsql.allow-persistent +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +; http://php.net/pgsql.auto-reset-persistent +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/pgsql.max-persistent +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +; http://php.net/pgsql.max-links +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +; http://php.net/pgsql.ignore-notice +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Notice message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +; http://php.net/pgsql.log-notice +pgsql.log_notice = 0 + +[bcmath] +; Number of decimal digits for all bcmath functions. +; http://php.net/bcmath.scale +bcmath.scale = 0 + +[browscap] +; http://php.net/browscap +;browscap = extra/browscap.ini + +[Session] +; Handler used to store/retrieve data. +; http://php.net/session.save-handler +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; The path can be defined as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if +; your OS has problems with many files in one directory, and is +; a more efficient layout for servers that handle many sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +; http://php.net/session.save-path +;session.save_path = "/var/lib/php/sessions" + +; Whether to use strict session mode. +; Strict session mode does not accept uninitialized session ID and regenerate +; session ID if browser sends uninitialized session ID. Strict mode protects +; applications from session fixation via session adoption vulnerability. It is +; disabled by default for maximum compatibility, but enabling it is encouraged. +; https://wiki.php.net/rfc/strict_sessions +session.use_strict_mode = 0 + +; Whether to use cookies. +; http://php.net/session.use-cookies +session.use_cookies = 1 + +; http://php.net/session.cookie-secure +;session.cookie_secure = + +; This option forces PHP to fetch and use a cookie for storing and maintaining +; the session id. We encourage this operation as it's very helpful in combating +; session hijacking when not specifying and managing your own session id. It is +; not the be-all and end-all of session hijacking defense, but it's a good start. +; http://php.net/session.use-only-cookies +session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +; http://php.net/session.name +session.name = PHPSESSID + +; Initialize session on request startup. +; http://php.net/session.auto-start +session.auto_start = 0 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +; http://php.net/session.cookie-lifetime +session.cookie_lifetime = 0 + +; The path for which the cookie is valid. +; http://php.net/session.cookie-path +session.cookie_path = / + +; The domain for which the cookie is valid. +; http://php.net/session.cookie-domain +session.cookie_domain = + +; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. +; http://php.net/session.cookie-httponly +session.cookie_httponly = + +; Handler used to serialize data. php is the standard serializer of PHP. +; http://php.net/session.serialize-handler +session.serialize_handler = php + +; Defines the probability that the 'garbage collection' process is started +; on every session initialization. The probability is calculated by using +; gc_probability/gc_divisor. Where session.gc_probability is the numerator +; and gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.gc-probability +session.gc_probability = 0 + +; Defines the probability that the 'garbage collection' process is started on every +; session initialization. The probability is calculated by using the following equation: +; gc_probability/gc_divisor. Where session.gc_probability is the numerator and +; session.gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. Increasing this value to 1000 will give you +; a 0.1% chance the gc will run on any give request. For high volume production servers, +; this is a more efficient approach. +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 +; http://php.net/session.gc-divisor +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +; http://php.net/session.gc-maxlifetime +session.gc_maxlifetime = 1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; find /path/to/sessions -cmin +24 -type f | xargs rm + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +; http://php.net/session.referer-check +session.referer_check = + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +; http://php.net/session.cache-limiter +session.cache_limiter = nocache + +; Document expires after n minutes. +; http://php.net/session.cache-expire +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users' security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publicly accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +; http://php.net/session.use-trans-sid +session.use_trans_sid = 0 + +; Set session ID character length. This value could be between 22 to 256. +; Shorter length than default is supported only for compatibility reason. +; Users should use 32 or more chars. +; http://php.net/session.sid-length +; Default Value: 32 +; Development Value: 26 +; Production Value: 26 +session.sid_length = 26 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; is special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. tag's action attribute URL will not be modified +; unless it is specified. +; Note that all valid entries require a "=", even if no value follows. +; Default Value: "a=href,area=href,frame=src,form=" +; Development Value: "a=href,area=href,frame=src,form=" +; Production Value: "a=href,area=href,frame=src,form=" +; http://php.net/url-rewriter.tags +session.trans_sid_tags = "a=href,area=href,frame=src,form=" + +; URL rewriter does not rewrite absolute URLs by default. +; To enable rewrites for absolute pathes, target hosts must be specified +; at RUNTIME. i.e. use ini_set() +; tags is special. PHP will check action attribute's URL regardless +; of session.trans_sid_tags setting. +; If no host is defined, HTTP_HOST will be used for allowed host. +; Example value: php.net,www.php.net,wiki.php.net +; Use "," for multiple hosts. No spaces are allowed. +; Default Value: "" +; Development Value: "" +; Production Value: "" +;session.trans_sid_hosts="" + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; Possible values: +; 4 (4 bits: 0-9, a-f) +; 5 (5 bits: 0-9, a-v) +; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 +; http://php.net/session.hash-bits-per-character +session.sid_bits_per_character = 5 + +; Enable upload progress tracking in $_SESSION +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.enabled +;session.upload_progress.enabled = On + +; Cleanup the progress information as soon as all POST data has been read +; (i.e. upload completed). +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.cleanup +;session.upload_progress.cleanup = On + +; A prefix used for the upload progress key in $_SESSION +; Default Value: "upload_progress_" +; Development Value: "upload_progress_" +; Production Value: "upload_progress_" +; http://php.net/session.upload-progress.prefix +;session.upload_progress.prefix = "upload_progress_" + +; The index name (concatenated with the prefix) in $_SESSION +; containing the upload progress information +; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" +; http://php.net/session.upload-progress.name +;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" + +; How frequently the upload progress should be updated. +; Given either in percentages (per-file), or in bytes +; Default Value: "1%" +; Development Value: "1%" +; Production Value: "1%" +; http://php.net/session.upload-progress.freq +;session.upload_progress.freq = "1%" + +; The minimum delay between updates, in seconds +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.upload-progress.min-freq +;session.upload_progress.min_freq = "1" + +; Only write session data when session data is changed. Enabled by default. +; http://php.net/session.lazy-write +;session.lazy_write = On + +[Assertion] +; Switch whether to compile assertions at all (to have no overhead at run-time) +; -1: Do not compile at all +; 0: Jump over assertion at run-time +; 1: Execute assertions +; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) +; Default Value: 1 +; Development Value: 1 +; Production Value: -1 +; http://php.net/zend.assertions +zend.assertions = -1 + +; Assert(expr); active by default. +; http://php.net/assert.active +;assert.active = On + +; Throw an AssertationException on failed assertions +; http://php.net/assert.exception +;assert.exception = On + +; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) +; http://php.net/assert.warning +;assert.warning = On + +; Don't bail out by default. +; http://php.net/assert.bail +;assert.bail = Off + +; User-function to be called if an assertion fails. +; http://php.net/assert.callback +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +; http://php.net/assert.quiet-eval +;assert.quiet_eval = 0 + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +; http://php.net/com.typelib-file +;com.typelib_file = + +; allow Distributed-COM calls +; http://php.net/com.allow-dcom +;com.allow_dcom = true + +; autoregister constants of a components typlib on com_load() +; http://php.net/com.autoregister-typelib +;com.autoregister_typelib = true + +; register constants casesensitive +; http://php.net/com.autoregister-casesensitive +;com.autoregister_casesensitive = false + +; show warnings on duplicate constant registrations +; http://php.net/com.autoregister-verbose +;com.autoregister_verbose = true + +; The default character set code-page to use when passing strings to and from COM objects. +; Default: system ANSI code page +;com.code_page= + +[mbstring] +; language for internal character representation. +; This affects mb_send_mail() and mbstring.detect_order. +; http://php.net/mbstring.language +;mbstring.language = Japanese + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; internal/script encoding. +; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;mbstring.internal_encoding = + +; Use of this INI entry is deprecated, use global input_encoding instead. +; http input encoding. +; mbstring.encoding_traslation = On is needed to use this setting. +; If empty, default_charset or input_encoding or mbstring.input is used. +; The precedence is: default_charset < intput_encoding < mbsting.http_input +; http://php.net/mbstring.http-input +;mbstring.http_input = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; http output encoding. +; mb_output_handler must be registered as output buffer to function. +; If empty, default_charset or output_encoding or mbstring.http_output is used. +; The precedence is: default_charset < output_encoding < mbstring.http_output +; To use an output encoding conversion, mbstring's output handler must be set +; otherwise output encoding conversion cannot be performed. +; http://php.net/mbstring.http-output +;mbstring.http_output = + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +; http://php.net/mbstring.encoding-translation +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; "auto" detect order is changed according to mbstring.language +; http://php.net/mbstring.detect-order +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +; http://php.net/mbstring.substitute-character +;mbstring.substitute_character = none + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +; http://php.net/mbstring.func-overload +;mbstring.func_overload = 0 + +; enable strict encoding detection. +; Default: Off +;mbstring.strict_detection = On + +; This directive specifies the regex pattern of content types for which mb_output_handler() +; is activated. +; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) +;mbstring.http_output_conv_mimetype= + +[gd] +; Tell the jpeg decode to ignore warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +; http://php.net/gd.jpeg-ignore-warning +;gd.jpeg_ignore_warning = 1 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +; http://php.net/exif.encode-unicode +;exif.encode_unicode = ISO-8859-15 + +; http://php.net/exif.decode-unicode-motorola +;exif.decode_unicode_motorola = UCS-2BE + +; http://php.net/exif.decode-unicode-intel +;exif.decode_unicode_intel = UCS-2LE + +; http://php.net/exif.encode-jis +;exif.encode_jis = + +; http://php.net/exif.decode-jis-motorola +;exif.decode_jis_motorola = JIS + +; http://php.net/exif.decode-jis-intel +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +; http://php.net/tidy.default-config +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +; http://php.net/tidy.clean-output +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +; http://php.net/soap.wsdl-cache-enabled +soap.wsdl_cache_enabled=1 + +; Sets the directory name where SOAP extension will put cache files. +; http://php.net/soap.wsdl-cache-dir +soap.wsdl_cache_dir="/tmp" + +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +; http://php.net/soap.wsdl-cache-ttl +soap.wsdl_cache_ttl=86400 + +; Sets the size of the cache limit. (Max. number of WSDL files to cache) +soap.wsdl_cache_limit = 5 + +[sysvshm] +; A default size of the shared memory segment +;sysvshm.init_mem = 10000 + +[ldap] +; Sets the maximum number of open links or -1 for unlimited. +ldap.max_links = -1 + +[dba] +;dba.default_handler= + +[opcache] +; Determines if Zend OPCache is enabled +opcache.enable=1 + +; Determines if Zend OPCache is enabled for the CLI version of PHP +opcache.enable_cli=1 + +; The OPcache shared memory storage size. +opcache.memory_consumption=256 + +; The amount of memory for interned strings in Mbytes. +;opcache.interned_strings_buffer=8 + +; The maximum number of keys (scripts) in the OPcache hash table. +; Only numbers between 200 and 1000000 are allowed. +opcache.max_accelerated_files=20000 + +; The maximum percentage of "wasted" memory until a restart is scheduled. +;opcache.max_wasted_percentage=5 + +; When this directive is enabled, the OPcache appends the current working +; directory to the script key, thus eliminating possible collisions between +; files with the same name (basename). Disabling the directive improves +; performance, but may break existing applications. +;opcache.use_cwd=1 + +; When disabled, you must reset the OPcache manually or restart the +; webserver for changes to the filesystem to take effect. +opcache.validate_timestamps=0 + +; How often (in seconds) to check file timestamps for changes to the shared +; memory storage allocation. ("1" means validate once per second, but only +; once per request. "0" means always validate) +;opcache.revalidate_freq=2 + +; Enables or disables file search in include_path optimization +;opcache.revalidate_path=0 + +; If disabled, all PHPDoc comments are dropped from the code to reduce the +; size of the optimized code. +opcache.save_comments=0 + +; Allow file existence override (file_exists, etc.) performance feature. +opcache.enable_file_override=1 + +; A bitmask, where each bit enables or disables the appropriate OPcache +; passes +;opcache.optimization_level=0xffffffff + +;opcache.inherited_hack=1 +;opcache.dups_fix=0 + +; The location of the OPcache blacklist file (wildcards allowed). +; Each OPcache blacklist file is a text file that holds the names of files +; that should not be accelerated. The file format is to add each filename +; to a new line. The filename may be a full path or just a file prefix +; (i.e., /var/www/x blacklists all the files and directories in /var/www +; that start with 'x'). Line starting with a ; are ignored (comments). +;opcache.blacklist_filename= + +; Allows exclusion of large files from being cached. By default all files +; are cached. +;opcache.max_file_size=0 + +; Check the cache checksum each N requests. +; The default value of "0" means that the checks are disabled. +;opcache.consistency_checks=0 + +; How long to wait (in seconds) for a scheduled restart to begin if the cache +; is not being accessed. +;opcache.force_restart_timeout=180 + +; OPcache error_log file name. Empty string assumes "stderr". +;opcache.error_log= + +; All OPcache errors go to the Web server log. +; By default, only fatal errors (level 0) or errors (level 1) are logged. +; You can also enable warnings (level 2), info messages (level 3) or +; debug messages (level 4). +;opcache.log_verbosity_level=1 + +; Preferred Shared Memory back-end. Leave empty and let the system decide. +;opcache.preferred_memory_model= + +; Protect the shared memory from unexpected writing during script execution. +; Useful for internal debugging only. +;opcache.protect_memory=0 + +; Allows calling OPcache API functions only from PHP scripts which path is +; started from specified string. The default "" means no restriction +;opcache.restrict_api= + +; Mapping base of shared memory segments (for Windows only). All the PHP +; processes have to map shared memory into the same address space. This +; directive allows to manually fix the "Unable to reattach to base address" +; errors. +;opcache.mmap_base= + +; Enables and sets the second level cache directory. +; It should improve performance when SHM memory is full, at server restart or +; SHM reset. The default "" disables file based caching. +;opcache.file_cache= + +; Enables or disables opcode caching in shared memory. +;opcache.file_cache_only=0 + +; Enables or disables checksum validation when script loaded from file cache. +;opcache.file_cache_consistency_checks=1 + +; Implies opcache.file_cache_only=1 for a certain process that failed to +; reattach to the shared memory (for Windows only). Explicitly enabled file +; cache is required. +;opcache.file_cache_fallback=1 + +; Enables or disables copying of PHP code (text segment) into HUGE PAGES. +; This should improve performance, but requires appropriate OS configuration. +opcache.huge_code_pages=1 + +; Validate cached file permissions. +;opcache.validate_permission=0 + +; Prevent name collisions in chroot'ed environment. +;opcache.validate_root=0 + +[curl] +; A default value for the CURLOPT_CAINFO option. This is required to be an +; absolute path. +;curl.cainfo = + +[openssl] +; The location of a Certificate Authority (CA) file on the local filesystem +; to use when verifying the identity of SSL/TLS peers. Most users should +; not specify a value for this directive as PHP will attempt to use the +; OS-managed cert stores in its absence. If specified, this value may still +; be overridden on a per-stream basis via the "cafile" SSL stream context +; option. +;openssl.cafile= + +; If openssl.cafile is not specified or if the CA file is not found, the +; directory pointed to by openssl.capath is searched for a suitable +; certificate. This value must be a correctly hashed certificate directory. +; Most users should not specify a value for this directive as PHP will +; attempt to use the OS-managed cert stores in its absence. If specified, +; this value may still be overridden on a per-stream basis via the "capath" +; 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/laravel/deploy/laravel-s/composer.json b/frameworks/PHP/laravel/deploy/laravel-s/composer.json index fd1c676c2af..c53ddcf304c 100644 --- a/frameworks/PHP/laravel/deploy/laravel-s/composer.json +++ b/frameworks/PHP/laravel/deploy/laravel-s/composer.json @@ -8,7 +8,7 @@ ], "license": "MIT", "require": { - "php": "^7.3|^8.1", + "php": "^8.0", "laravel/framework": "^9", "hhxsv5/laravel-s": "~3.7.0" }, @@ -27,7 +27,7 @@ "App\\": "app/" } }, - "minimum-stability": "dev", + "minimum-stability": "stable", "prefer-stable": true, "scripts": { "post-autoload-dump": [ @@ -42,5 +42,3 @@ ] } } - - diff --git a/frameworks/PHP/laravel/deploy/roadrunner/composer.json b/frameworks/PHP/laravel/deploy/roadrunner/composer.json index c3528e5e4e3..3e8ad235c55 100644 --- a/frameworks/PHP/laravel/deploy/roadrunner/composer.json +++ b/frameworks/PHP/laravel/deploy/roadrunner/composer.json @@ -28,7 +28,7 @@ "App\\": "app/" } }, - "minimum-stability": "dev", + "minimum-stability": "stable", "prefer-stable": true, "scripts": { "post-autoload-dump": [ diff --git a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile index e6804935087..ba8bdb4bd4f 100644 --- a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile +++ b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile @@ -1,6 +1,6 @@ -FROM phpswoole/swoole:php8.4 +FROM phpswoole/swoole:php8.0 -RUN docker-php-ext-install pcntl opcache curl > /dev/null +RUN docker-php-ext-install pcntl curl > /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini diff --git a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile index c21eeeacf8a..b483b396d10 100644 --- a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile +++ b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile @@ -1,7 +1,6 @@ FROM dunglas/frankenphp RUN install-php-extensions \ - opcache \ pcntl \ pdo_mysql \ zip > /dev/null @@ -16,7 +15,7 @@ RUN mkdir -p bootstrap/cache \ storage/framework/views \ storage/framework/cache -COPY --link deploy/conf/php.ini /usr/local/etc/php +COPY --link deploy/franken/php.ini /usr/local/etc/php RUN composer require laravel/octane guzzlehttp/guzzle --update-no-dev --no-scripts --quiet RUN php artisan optimize diff --git a/frameworks/PHP/laravel/opcache_preload.php b/frameworks/PHP/laravel/opcache_preload.php new file mode 100644 index 00000000000..687af36e6b9 --- /dev/null +++ b/frameworks/PHP/laravel/opcache_preload.php @@ -0,0 +1,3 @@ + Date: Tue, 12 Aug 2025 17:58:51 +0200 Subject: [PATCH 1557/1766] [ruby] Upgrade rack to latest (#10030) For most frameworks this is 3.20.0. --- frameworks/Ruby/agoo/Gemfile.lock | 2 +- frameworks/Ruby/grape/Gemfile.lock | 2 +- frameworks/Ruby/hanami/Gemfile.lock | 2 +- frameworks/Ruby/rack-sequel/Gemfile.lock | 2 +- frameworks/Ruby/rack/Gemfile.lock | 2 +- frameworks/Ruby/rage-sequel/Gemfile.lock | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/agoo/Gemfile.lock b/frameworks/Ruby/agoo/Gemfile.lock index 053edac5d9e..2e54ffc3d8c 100644 --- a/frameworks/Ruby/agoo/Gemfile.lock +++ b/frameworks/Ruby/agoo/Gemfile.lock @@ -9,7 +9,7 @@ GEM ostruct (>= 0.2) ostruct (0.6.1) pg (1.5.9) - rack (3.1.11) + rack (3.2.0) PLATFORMS ruby diff --git a/frameworks/Ruby/grape/Gemfile.lock b/frameworks/Ruby/grape/Gemfile.lock index 1c904f7e158..72c44a59d9b 100644 --- a/frameworks/Ruby/grape/Gemfile.lock +++ b/frameworks/Ruby/grape/Gemfile.lock @@ -63,7 +63,7 @@ GEM nio4r (2.7.4) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.12) + rack (3.2.0) raindrops (0.20.1) ruby2_keywords (0.0.5) securerandom (0.4.1) diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index 8226e1f0f7c..2b764af4a61 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -122,7 +122,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (2.2.13) + rack (2.2.17) rake (13.2.1) rom (5.4.2) rom-changeset (~> 5.4) diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index eb62d14787f..064a949fa98 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -8,7 +8,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.16) + rack (3.2.0) sequel (5.90.0) bigdecimal sequel_pg (1.17.1) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index b84bbe27496..3ad3086d2ce 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -97,7 +97,7 @@ GEM puma (6.6.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.11) + rack (3.2.0) rack-test (2.2.0) rack (>= 1.3) rackup (2.2.1) diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index a70dfb560c2..448145375f9 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -4,7 +4,7 @@ GEM bigdecimal (3.1.9) logger (1.7.0) pg (1.5.9) - rack (2.2.13) + rack (2.2.17) rack-test (2.2.0) rack (>= 1.3) rage-iodine (4.0.0) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 64c215ece23..abf7dd33965 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -11,7 +11,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.12) + rack (3.2.0) roda (3.90.0) rack sequel (5.90.0) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index bf11ecedd6f..2a83a0f8571 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -13,7 +13,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.14) + rack (3.2.0) rack-protection (4.1.1) base64 (>= 0.1.0) logger (>= 1.6.0) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index b148973d984..cc02f2df0c5 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -39,7 +39,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.14) + rack (3.2.0) rack-protection (4.1.1) base64 (>= 0.1.0) logger (>= 1.6.0) From e6cbbdcc30c8c5633668e7791693fa301f9b12e9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 12 Aug 2025 17:59:14 +0200 Subject: [PATCH 1558/1766] [ruby] Upgrade json to 2.13.2 (#10031) --- frameworks/Ruby/rack-sequel/Gemfile.lock | 2 +- frameworks/Ruby/rack/Gemfile.lock | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 064a949fa98..c336c9058ba 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -2,7 +2,7 @@ GEM remote: https://rubygems.org/ specs: bigdecimal (3.1.9) - json (2.11.3) + json (2.13.2) mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 3ad3086d2ce..17c7d11ca03 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -61,7 +61,7 @@ GEM io-event (1.9.0) io-stream (0.6.1) iodine (0.7.58) - json (2.11.3) + json (2.13.2) kgio (2.11.4) language_server-protocol (3.17.0.4) lint_roller (1.1.0) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index abf7dd33965..f29a7c751a6 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -5,7 +5,7 @@ GEM bigdecimal (3.1.9) erubi (1.13.1) iodine (0.7.58) - json (2.11.3) + json (2.13.2) mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 2a83a0f8571..b132a9f89b0 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -4,7 +4,7 @@ GEM base64 (0.2.0) bigdecimal (3.1.9) iodine (0.7.58) - json (2.11.3) + json (2.13.2) logger (1.6.6) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index cc02f2df0c5..64b39e52b14 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -29,7 +29,7 @@ GEM i18n (1.14.7) concurrent-ruby (~> 1.0) iodine (0.7.58) - json (2.11.3) + json (2.13.2) logger (1.6.6) minitest (5.25.4) mustermann (3.0.3) From cf5874988e5674f09ec3f0be298ccc46fa9512c1 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 12 Aug 2025 18:00:44 +0200 Subject: [PATCH 1559/1766] [php] RoadRunner Symfony update to 2025.1 and PHP 8.4 (#10037) * [php] RoadRunner Symfony update to 2025.1 and PHP 8.4 * Update display_name [ci skip] * Add protobuf extension * Small change to rerun CI * Another small change to rerun CI Failed to build the TFB dockerfile. --- frameworks/PHP/symfony/benchmark_config.json | 10 +++++----- frameworks/PHP/symfony/symfony-roadrunner.dockerfile | 7 ++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/frameworks/PHP/symfony/benchmark_config.json b/frameworks/PHP/symfony/benchmark_config.json index d5f97f06800..05955fb8944 100644 --- a/frameworks/PHP/symfony/benchmark_config.json +++ b/frameworks/PHP/symfony/benchmark_config.json @@ -63,7 +63,7 @@ "webserver": "nginx", "os": "Linux", "database_os": "Linux", - "display_name": "symfony-raw", + "display_name": "symfony [raw orm]", "notes": "", "versus": "php", "tags": [] @@ -87,7 +87,7 @@ "webserver": "none", "os": "Linux", "database_os": "Linux", - "display_name": "symfony-swoole", + "display_name": "symfony [swoole]", "notes": "", "versus": "swoole", "tags": [] @@ -111,7 +111,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "symfony-workerman", + "display_name": "symfony [workerman]", "notes": "", "versus": "php", "tags": [] @@ -135,7 +135,7 @@ "webserver": "None", "os": "Linux", "database_os": "Linux", - "display_name": "symfony-roadrunner", + "display_name": "symfony [roadrunner]", "notes": "", "versus": "php", "tags": [] @@ -159,7 +159,7 @@ "webserver": "caddy", "os": "Linux", "database_os": "Linux", - "display_name": "symfony-frankenphp", + "display_name": "symfony [frankenphp]", "notes": "Use php 8.2", "versus": "php", "tags": [] diff --git a/frameworks/PHP/symfony/symfony-roadrunner.dockerfile b/frameworks/PHP/symfony/symfony-roadrunner.dockerfile index 1fc48dadcdc..a388570c60f 100644 --- a/frameworks/PHP/symfony/symfony-roadrunner.dockerfile +++ b/frameworks/PHP/symfony/symfony-roadrunner.dockerfile @@ -1,6 +1,6 @@ -FROM php:8.3-cli +FROM php:8.4-cli -COPY --from=ghcr.io/roadrunner-server/roadrunner:2023.3 --link /usr/bin/rr /usr/local/bin/rr +COPY --from=ghcr.io/roadrunner-server/roadrunner:2025.1 --link /usr/bin/rr /usr/local/bin/rr COPY --from=mlocati/php-extension-installer --link /usr/bin/install-php-extensions /usr/local/bin/ COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer @@ -15,11 +15,12 @@ COPY --link deploy/conf/php.ini /usr/local/etc/php/ WORKDIR /symfony COPY --link . . +RUN pecl install protobuf > /dev/null && echo "extension=protobuf.so" > /usr/local/etc/php/conf.d/protobuf.ini + ENV APP_RUNTIME="Runtime\RoadRunnerSymfonyNyholm\Runtime" RUN composer require runtime/roadrunner-symfony-nyholm --update-no-dev --no-scripts --quiet RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear EXPOSE 8080 -RUN rr -v ENTRYPOINT ["rr", "serve"] From 222d7a12228c52d163dc706b7c2ef555350aaee0 Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Tue, 12 Aug 2025 11:01:27 -0500 Subject: [PATCH 1560/1766] Add Dart Frog Framework (#10048) --- frameworks/Dart/dart_frog/.dockerignore | 9 +++++++ frameworks/Dart/dart_frog/.gitignore | 6 +++++ frameworks/Dart/dart_frog/README.md | 23 ++++++++++++++++ .../Dart/dart_frog/benchmark_config.json | 26 +++++++++++++++++++ .../Dart/dart_frog/dart_frog.dockerfile | 16 ++++++++++++ frameworks/Dart/dart_frog/pubspec.yaml | 7 +++++ frameworks/Dart/dart_frog/routes/json.dart | 13 ++++++++++ .../Dart/dart_frog/routes/plaintext.dart | 13 ++++++++++ 8 files changed, 113 insertions(+) create mode 100644 frameworks/Dart/dart_frog/.dockerignore create mode 100644 frameworks/Dart/dart_frog/.gitignore create mode 100644 frameworks/Dart/dart_frog/README.md create mode 100644 frameworks/Dart/dart_frog/benchmark_config.json create mode 100644 frameworks/Dart/dart_frog/dart_frog.dockerfile create mode 100644 frameworks/Dart/dart_frog/pubspec.yaml create mode 100644 frameworks/Dart/dart_frog/routes/json.dart create mode 100644 frameworks/Dart/dart_frog/routes/plaintext.dart diff --git a/frameworks/Dart/dart_frog/.dockerignore b/frameworks/Dart/dart_frog/.dockerignore new file mode 100644 index 00000000000..6a6cc8727a7 --- /dev/null +++ b/frameworks/Dart/dart_frog/.dockerignore @@ -0,0 +1,9 @@ +# From https://hub.docker.com/_/dart +.dockerignore +Dockerfile +build/ +.dart_tool/ +.git/ +.github/ +.gitignore +.packages diff --git a/frameworks/Dart/dart_frog/.gitignore b/frameworks/Dart/dart_frog/.gitignore new file mode 100644 index 00000000000..75e470c7bc8 --- /dev/null +++ b/frameworks/Dart/dart_frog/.gitignore @@ -0,0 +1,6 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ +*.lock +!bin +build/ \ No newline at end of file diff --git a/frameworks/Dart/dart_frog/README.md b/frameworks/Dart/dart_frog/README.md new file mode 100644 index 00000000000..b7f5351b7e2 --- /dev/null +++ b/frameworks/Dart/dart_frog/README.md @@ -0,0 +1,23 @@ +# Dart Frog Benchmarking Test + +### Test Type Implementation Source Code + +- [JSON](server.dart) +- [PLAINTEXT](server.dart) + +## Important Libraries + +The tests were run with: + +- [pkg:dart_frog](https://pub.dev/packages/dart_frog) +- [Dart](https://dart.dev/) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Dart/dart_frog/benchmark_config.json b/frameworks/Dart/dart_frog/benchmark_config.json new file mode 100644 index 00000000000..06b90f52372 --- /dev/null +++ b/frameworks/Dart/dart_frog/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "dart_frog", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "dart_frog", + "language": "Dart", + "flavor": "None", + "orm": "None", + "platform": "dart_frog", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "dart_frog", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Dart/dart_frog/dart_frog.dockerfile b/frameworks/Dart/dart_frog/dart_frog.dockerfile new file mode 100644 index 00000000000..345f891c6db --- /dev/null +++ b/frameworks/Dart/dart_frog/dart_frog.dockerfile @@ -0,0 +1,16 @@ +FROM dart:3.8 AS builder + +COPY . /app +WORKDIR /app + +RUN dart pub global activate dart_frog_cli +RUN dart_frog build + +RUN dart compile exe build/bin/server.dart -o build/bin/server + +FROM scratch +COPY --from=builder /runtime/ / +COPY --from=builder /app/build/bin/server /app/build/bin/ + +EXPOSE 8080 +CMD ["/app/build/bin/server"] diff --git a/frameworks/Dart/dart_frog/pubspec.yaml b/frameworks/Dart/dart_frog/pubspec.yaml new file mode 100644 index 00000000000..e521d43a053 --- /dev/null +++ b/frameworks/Dart/dart_frog/pubspec.yaml @@ -0,0 +1,7 @@ +name: dartfrogbenchmark +description: A benchmark of pkg:dart_frog +environment: + sdk: ^3.8.0 + +dependencies: + dart_frog: ^1.0.0 diff --git a/frameworks/Dart/dart_frog/routes/json.dart b/frameworks/Dart/dart_frog/routes/json.dart new file mode 100644 index 00000000000..1bd5d704d02 --- /dev/null +++ b/frameworks/Dart/dart_frog/routes/json.dart @@ -0,0 +1,13 @@ +import 'dart:io'; + +import 'package:dart_frog/dart_frog.dart'; + +Response onRequest(RequestContext context) { + return Response.json( + body: {'message': 'Hello, World!'}, + headers: { + HttpHeaders.dateHeader: '${HttpDate.format(DateTime.now())}', + HttpHeaders.serverHeader: 'dart_frog', + }, + ); +} diff --git a/frameworks/Dart/dart_frog/routes/plaintext.dart b/frameworks/Dart/dart_frog/routes/plaintext.dart new file mode 100644 index 00000000000..b54a1c91f83 --- /dev/null +++ b/frameworks/Dart/dart_frog/routes/plaintext.dart @@ -0,0 +1,13 @@ +import 'dart:io'; +import 'package:dart_frog/dart_frog.dart'; + +Response onRequest(RequestContext context) { + return Response( + body: 'Hello, World!', + headers: { + HttpHeaders.contentTypeHeader: ContentType.text.mimeType, + HttpHeaders.dateHeader: '${HttpDate.format(DateTime.now())}', + HttpHeaders.serverHeader: 'dart_frog', + }, + ); +} From 618e19ca5eb99782290ba520ce1a4a7cde709dd8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 13 Aug 2025 00:53:21 +0200 Subject: [PATCH 1561/1766] [ruby/rack] Update puma to 7.0.0-pre1 (#10049) --- frameworks/Ruby/rack/Gemfile | 2 +- frameworks/Ruby/rack/Gemfile.lock | 4 ++-- frameworks/Ruby/rack/README.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index ec8051585e2..cb31832d3fe 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -33,7 +33,7 @@ group :pitchfork, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.5' + gem 'puma', '7.0.0.pre1' end group :unicorn, optional: true do diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 17c7d11ca03..92f3c7e98d5 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -94,7 +94,7 @@ GEM protocol-rack (0.11.2) protocol-http (~> 0.43) rack (>= 1.0) - puma (6.6.0) + puma (7.0.0.pre1) nio4r (~> 2.0) racc (1.8.1) rack (3.2.0) @@ -156,7 +156,7 @@ DEPENDENCIES passenger (~> 6.0) pg (~> 1.5) pitchfork (~> 0.17) - puma (~> 6.5) + puma (= 7.0.0.pre1) rack (~> 3.0) rack-test rubocop diff --git a/frameworks/Ruby/rack/README.md b/frameworks/Ruby/rack/README.md index 92c954d5228..53a5d5c5b09 100644 --- a/frameworks/Ruby/rack/README.md +++ b/frameworks/Ruby/rack/README.md @@ -15,7 +15,7 @@ The tests were run with: * [JRuby 9.4](http://jruby.org/) * [Rack 3.1](http://rack.github.com/) * [Unicorn 6.1.0](http://unicorn.bogomips.org/) -* [Puma 6.4](http://puma.io/) +* [Puma 7](http://puma.io/) * [Iodine](https://github.com/boazsegev/iodine) * [Falcon](https://github.com/socketry/falcon) * [Pitchfork](https://github.com/Shopify/pitchfork) From 72054aa91f2d271767ae290aec18bbb7f0d8adb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:34:24 +0000 Subject: [PATCH 1562/1766] Build(deps): bump activerecord in /frameworks/Ruby/sinatra Bumps [activerecord](https://github.com/rails/rails) from 8.0.1 to 8.0.2.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v8.0.2.1/activerecord/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v8.0.1...v8.0.2.1) --- updated-dependencies: - dependency-name: activerecord dependency-version: 8.0.2.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/sinatra/Gemfile.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 64b39e52b14..880182d6951 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -1,13 +1,13 @@ GEM remote: https://rubygems.org/ specs: - activemodel (8.0.1) - activesupport (= 8.0.1) - activerecord (8.0.1) - activemodel (= 8.0.1) - activesupport (= 8.0.1) + activemodel (8.0.2.1) + activesupport (= 8.0.2.1) + activerecord (8.0.2.1) + activemodel (= 8.0.2.1) + activesupport (= 8.0.2.1) timeout (>= 0.4.0) - activesupport (8.0.1) + activesupport (8.0.2.1) base64 benchmark (>= 0.3) bigdecimal @@ -20,18 +20,18 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - base64 (0.2.0) - benchmark (0.4.0) - bigdecimal (3.1.9) + base64 (0.3.0) + benchmark (0.4.1) + bigdecimal (3.2.2) concurrent-ruby (1.3.5) - connection_pool (2.5.0) - drb (2.2.1) + connection_pool (2.5.3) + drb (2.2.3) i18n (1.14.7) concurrent-ruby (~> 1.0) iodine (0.7.58) json (2.13.2) - logger (1.6.6) - minitest (5.25.4) + logger (1.7.0) + minitest (5.25.5) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) mysql2 (0.5.6) From ab9649bd88614f191a5a898503c6537475d79781 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:31:44 -0700 Subject: [PATCH 1563/1766] Build(deps): bump litestar in /frameworks/Python/litestar (#10050) Bumps [litestar](https://github.com/litestar-org/litestar) from 2.16.0 to 2.17.0. - [Release notes](https://github.com/litestar-org/litestar/releases) - [Commits](https://github.com/litestar-org/litestar/compare/v2.16.0...v2.17.0) --- updated-dependencies: - dependency-name: litestar dependency-version: 2.17.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/litestar/requirements-socketify.txt | 2 +- frameworks/Python/litestar/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Python/litestar/requirements-socketify.txt b/frameworks/Python/litestar/requirements-socketify.txt index 70c19fabec9..75fdf6fc3dd 100644 --- a/frameworks/Python/litestar/requirements-socketify.txt +++ b/frameworks/Python/litestar/requirements-socketify.txt @@ -1,3 +1,3 @@ orjson==3.10.16 -litestar==2.16.0 +litestar==2.17.0 git+https://github.com/cirospaciari/socketify.py.git@main#socketify diff --git a/frameworks/Python/litestar/requirements.txt b/frameworks/Python/litestar/requirements.txt index e2b341ae256..f45f8fd344d 100644 --- a/frameworks/Python/litestar/requirements.txt +++ b/frameworks/Python/litestar/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.30.0 -litestar==2.16.0 +litestar==2.17.0 Jinja2==3.1.6 orjson==3.10.18 \ No newline at end of file From 9fca06985c728e14056449c7fd3ec494f39fd91e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:32:05 -0700 Subject: [PATCH 1564/1766] Build(deps): bump activestorage in /frameworks/Ruby/rails (#10052) Bumps [activestorage](https://github.com/rails/rails) from 8.0.1 to 8.0.2.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v8.0.2.1/activestorage/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v8.0.1...v8.0.2.1) --- updated-dependencies: - dependency-name: activestorage dependency-version: 8.0.2.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Ruby/rails/Gemfile.lock | 136 ++++++++++++++--------------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index d42971cccd4..b8c3c6f6156 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://rubygems.org/ specs: - actioncable (8.0.1) - actionpack (= 8.0.1) - activesupport (= 8.0.1) + actioncable (8.0.2.1) + actionpack (= 8.0.2.1) + activesupport (= 8.0.2.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.1) - actionpack (= 8.0.1) - activejob (= 8.0.1) - activerecord (= 8.0.1) - activestorage (= 8.0.1) - activesupport (= 8.0.1) + actionmailbox (8.0.2.1) + actionpack (= 8.0.2.1) + activejob (= 8.0.2.1) + activerecord (= 8.0.2.1) + activestorage (= 8.0.2.1) + activesupport (= 8.0.2.1) mail (>= 2.8.0) - actionmailer (8.0.1) - actionpack (= 8.0.1) - actionview (= 8.0.1) - activejob (= 8.0.1) - activesupport (= 8.0.1) + actionmailer (8.0.2.1) + actionpack (= 8.0.2.1) + actionview (= 8.0.2.1) + activejob (= 8.0.2.1) + activesupport (= 8.0.2.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.1) - actionview (= 8.0.1) - activesupport (= 8.0.1) + actionpack (8.0.2.1) + actionview (= 8.0.2.1) + activesupport (= 8.0.2.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -31,35 +31,35 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.1) - actionpack (= 8.0.1) - activerecord (= 8.0.1) - activestorage (= 8.0.1) - activesupport (= 8.0.1) + actiontext (8.0.2.1) + actionpack (= 8.0.2.1) + activerecord (= 8.0.2.1) + activestorage (= 8.0.2.1) + activesupport (= 8.0.2.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.1) - activesupport (= 8.0.1) + actionview (8.0.2.1) + activesupport (= 8.0.2.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.1) - activesupport (= 8.0.1) + activejob (8.0.2.1) + activesupport (= 8.0.2.1) globalid (>= 0.3.6) - activemodel (8.0.1) - activesupport (= 8.0.1) - activerecord (8.0.1) - activemodel (= 8.0.1) - activesupport (= 8.0.1) + activemodel (8.0.2.1) + activesupport (= 8.0.2.1) + activerecord (8.0.2.1) + activemodel (= 8.0.2.1) + activesupport (= 8.0.2.1) timeout (>= 0.4.0) - activestorage (8.0.1) - actionpack (= 8.0.1) - activejob (= 8.0.1) - activerecord (= 8.0.1) - activesupport (= 8.0.1) + activestorage (8.0.2.1) + actionpack (= 8.0.2.1) + activejob (= 8.0.2.1) + activerecord (= 8.0.2.1) + activesupport (= 8.0.2.1) marcel (~> 1.0) - activesupport (8.0.1) + activesupport (8.0.2.1) base64 benchmark (>= 0.3) bigdecimal @@ -102,19 +102,19 @@ GEM async-service (0.13.0) async async-container (~> 0.16) - base64 (0.2.0) - benchmark (0.4.0) - bigdecimal (3.1.9) + base64 (0.3.0) + benchmark (0.4.1) + bigdecimal (3.2.2) builder (3.3.0) concurrent-ruby (1.3.5) - connection_pool (2.5.0) + connection_pool (2.5.3) console (1.30.0) fiber-annotation fiber-local (~> 1.1) json crass (1.0.6) date (3.4.1) - drb (2.2.1) + drb (2.2.3) erubi (1.13.1) falcon (0.51.1) async @@ -148,8 +148,8 @@ GEM reline (>= 0.4.2) json (2.11.3) localhost (1.3.1) - logger (1.6.6) - loofah (2.24.0) + logger (1.7.0) + loofah (2.24.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -162,8 +162,8 @@ GEM memory-leak (0.5.2) metrics (0.12.2) mini_mime (1.1.5) - mini_portile2 (2.8.8) - minitest (5.25.4) + mini_portile2 (2.8.9) + minitest (5.25.5) net-imap (0.5.7) date net-protocol @@ -174,12 +174,12 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.18.8) + nokogiri (1.18.9) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.8-x86_64-darwin) + nokogiri (1.18.9-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.8-x86_64-linux-gnu) + nokogiri (1.18.9-x86_64-linux-gnu) racc (~> 1.4) openssl (3.3.0) pg (1.5.9) @@ -205,38 +205,38 @@ GEM puma (6.6.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.1.12) - rack-session (2.1.0) + rack (3.2.0) + rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) rack-test (2.2.0) rack (>= 1.3) rackup (2.2.1) rack (>= 3) - rails (8.0.1) - actioncable (= 8.0.1) - actionmailbox (= 8.0.1) - actionmailer (= 8.0.1) - actionpack (= 8.0.1) - actiontext (= 8.0.1) - actionview (= 8.0.1) - activejob (= 8.0.1) - activemodel (= 8.0.1) - activerecord (= 8.0.1) - activestorage (= 8.0.1) - activesupport (= 8.0.1) + rails (8.0.2.1) + actioncable (= 8.0.2.1) + actionmailbox (= 8.0.2.1) + actionmailer (= 8.0.2.1) + actionpack (= 8.0.2.1) + actiontext (= 8.0.2.1) + actionview (= 8.0.2.1) + activejob (= 8.0.2.1) + activemodel (= 8.0.2.1) + activerecord (= 8.0.2.1) + activestorage (= 8.0.2.1) + activesupport (= 8.0.2.1) bundler (>= 1.15.0) - railties (= 8.0.1) - rails-dom-testing (2.2.0) + railties (= 8.0.2.1) + rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.1) - actionpack (= 8.0.1) - activesupport (= 8.0.1) + railties (8.0.2.1) + actionpack (= 8.0.2.1) + activesupport (= 8.0.2.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From f26732f7fc30e8736e80d09accc64afea436e58f Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Fri, 15 Aug 2025 20:32:28 +0200 Subject: [PATCH 1565/1766] [php] Laravel with RoadRunner fixed and updated (#10053) --- frameworks/PHP/laravel/config/octane.php | 7 +++ .../PHP/laravel/deploy/roadrunner/.rr.yaml | 32 ++++++++----- .../laravel/deploy/roadrunner/composer.json | 45 ------------------- .../PHP/laravel/laravel-roadrunner.dockerfile | 25 +++++------ 4 files changed, 39 insertions(+), 70 deletions(-) create mode 100644 frameworks/PHP/laravel/config/octane.php delete mode 100644 frameworks/PHP/laravel/deploy/roadrunner/composer.json diff --git a/frameworks/PHP/laravel/config/octane.php b/frameworks/PHP/laravel/config/octane.php new file mode 100644 index 00000000000..9e7a655f37d --- /dev/null +++ b/frameworks/PHP/laravel/config/octane.php @@ -0,0 +1,7 @@ + [ + 'max_requests' => 10000, // Reload workers after requests + ], +]; diff --git a/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml b/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml index bd19a378b20..e1b9eaa98e9 100644 --- a/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml +++ b/frameworks/PHP/laravel/deploy/roadrunner/.rr.yaml @@ -1,23 +1,35 @@ -# see https://roadrunner.dev/docs/intro-config +# see https://docs.roadrunner.dev/docs/general/config +# https://github.com/roadrunner-server/roadrunner/blob/master/.rr.yaml + version: "3" -#https://github.com/roadrunner-server/roadrunner/blob/master/.rr.yaml -server: - command: "php ./vendor/bin/rr-worker start --relay-dsn unix:///usr/local/var/run/rr-rpc.sock" - relay: "unix:///usr/local/var/run/rr-rpc.sock" -logs: - mode: production - level: error http: address: 0.0.0.0:8080 - middleware: ["headers"] pool: - #max_jobs: 64 # feel free to change this + num_workers: 0 + max_jobs: 0 supervisor: exec_ttl: 60s headers: response: Server: "RoadRunner" + middleware: ["headers"] + +server: + command: "php /laravel/vendor/bin/roadrunner-worker" + #command: "php /laravel/vendor/bin/roadrunner-worker start --relay-dsn unix:///usr/local/var/run/rr-rpc.sock" + #relay: "unix:///usr/local/var/run/rr-rpc.sock" + env: + - APP_ENV: production + - APP_BASE_PATH: "/laravel" + - LARAVEL_OCTANE: "1" +rpc: + listen: tcp://127.0.0.1:6001 +logs: + mode: production + level: error + output: stdout + #encoding: json diff --git a/frameworks/PHP/laravel/deploy/roadrunner/composer.json b/frameworks/PHP/laravel/deploy/roadrunner/composer.json deleted file mode 100644 index 3e8ad235c55..00000000000 --- a/frameworks/PHP/laravel/deploy/roadrunner/composer.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "laravel/laravel", - "type": "project", - "description": "The Laravel Framework.", - "keywords": [ - "framework", - "laravel" - ], - "license": "MIT", - "require": { - "laravel/framework": "^9", - "nyholm/psr7": "*", - "spiral/roadrunner": "^2.11", - "spiral/roadrunner-laravel": "^5.9" - }, - "config": { - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true - }, - "extra": { - "laravel": { - "dont-discover": [] - } - }, - "autoload": { - "psr-4": { - "App\\": "app/" - } - }, - "minimum-stability": "stable", - "prefer-stable": true, - "scripts": { - "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", - "@php artisan package:discover --ansi" - ], - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ], - "post-create-project-cmd": [ - "@php artisan key:generate --ansi" - ] - } -} diff --git a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile index 33c7067c7b0..9a0c3aed98b 100644 --- a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile +++ b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile @@ -1,10 +1,10 @@ -FROM php:8.3-cli +FROM php:8.4-cli RUN docker-php-ext-install pdo_mysql pcntl opcache sockets > /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -#RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini -#RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini +RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini +RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini WORKDIR /laravel COPY --link . . @@ -18,21 +18,16 @@ RUN mkdir -p bootstrap/cache \ RUN apt-get update > /dev/null && \ apt-get install -yqq curl unzip > /dev/null -COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer +RUN pecl install protobuf > /dev/null && echo "extension=protobuf.so" > /usr/local/etc/php/conf.d/protobuf.ini -COPY --link deploy/roadrunner/composer.json . -COPY --link deploy/roadrunner/.rr.yaml . +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer -RUN composer install -a --no-dev --quiet +RUN composer require laravel/octane --update-no-dev --no-scripts --quiet +RUN php artisan octane:install --server="roadrunner" RUN php artisan optimize -# install roadrunner -COPY --from=ghcr.io/roadrunner-server/roadrunner:2023.3 --link /usr/bin/rr /usr/local/bin/rr - -RUN php artisan vendor:publish --provider='Spiral\RoadRunnerLaravel\ServiceProvider' --tag=config -RUN rr -v - EXPOSE 8080 -# CMD bash -CMD rr serve -c .rr.yaml +# https://artisan.page/12.x/ +#ENTRYPOINT ["php", "artisan", "octane:roadrunner", "--host=0.0.0.0", "--port=8080", "--workers=auto", "--max-requests=10000", "--rr-config=/laravel/deploy/roadrunner/.rr.yaml"] +ENTRYPOINT ["/laravel/rr", "serve", "-c", "/laravel/deploy/roadrunner/.rr.yaml"] From 357165c495448e10312ba99010e59f0e0484825e Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Fri, 15 Aug 2025 20:33:19 +0200 Subject: [PATCH 1566/1766] [micronaut] Add loom variants (#10055) * loom benchmarks * inherit JAVA_OPTIONS * add async-profiler support * Revert "add async-profiler support" This reverts commit 497c017121af2f8ec119b0fe22ebd370ea5508b8. * disable trackAllThreads * more logging * try disabling throughput mode * io_uring * remove views dependency * use io_uring for all vertx connections --- .../Java/micronaut/benchmark_config.json | 66 ++++- frameworks/Java/micronaut/common/build.gradle | 4 +- .../src/main/java/benchmark/Application.java | 8 + .../src/main/resources/application-common.yml | 14 ++ .../resources/application-loom-on-netty.yml | 8 + .../src/main/resources/application-loom.yml | 3 + .../common/src/main/resources/logback.xml | 3 + .../micronaut/micronaut-loom-fjp.dockerfile | 13 + .../micronaut-loom-on-netty.dockerfile | 13 + .../micronaut-vertx-pg-client/build.gradle | 2 +- .../main/java/benchmark/ConnectionHolder.java | 227 ++++++++++++------ frameworks/Java/micronaut/run_benchmark.sh | 15 +- 12 files changed, 286 insertions(+), 90 deletions(-) create mode 100644 frameworks/Java/micronaut/common/src/main/resources/application-loom-on-netty.yml create mode 100644 frameworks/Java/micronaut/common/src/main/resources/application-loom.yml create mode 100644 frameworks/Java/micronaut/micronaut-loom-fjp.dockerfile create mode 100644 frameworks/Java/micronaut/micronaut-loom-on-netty.dockerfile diff --git a/frameworks/Java/micronaut/benchmark_config.json b/frameworks/Java/micronaut/benchmark_config.json index a72758e6862..db44857f540 100755 --- a/frameworks/Java/micronaut/benchmark_config.json +++ b/frameworks/Java/micronaut/benchmark_config.json @@ -21,7 +21,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut Vertx PG Client", + "display_name": "Micronaut [Vertx PG Client]", "notes": "", "versus": "None" }, @@ -44,7 +44,53 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut Vertx PG Client GraalVM", + "display_name": "Micronaut [Vertx PG Client] [GraalVM]", + "notes": "", + "versus": "None" + }, + "loom-fjp": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Micronaut", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "Netty", + "os": "Linux", + "database_os": "Linux", + "display_name": "Micronaut [Vertx PG Client] [Virtual Threads FJP]", + "notes": "", + "versus": "None" + }, + "loom-on-netty": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Micronaut", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Netty", + "webserver": "Netty", + "os": "Linux", + "database_os": "Linux", + "display_name": "Micronaut [Vertx PG Client] [Virtual Threads Loom-On-Netty]", "notes": "", "versus": "None" }, @@ -65,7 +111,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut JDBC", + "display_name": "Micronaut [JDBC]", "notes": "", "versus": "None" }, @@ -86,7 +132,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut JDBC GraalVM", + "display_name": "Micronaut [JDBC] [GraalVM]", "notes": "", "versus": "None" }, @@ -107,7 +153,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut R2DBC", + "display_name": "Micronaut [R2DBC]", "notes": "", "versus": "None" }, @@ -128,7 +174,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut R2DBC GraalVM", + "display_name": "Micronaut [R2DBC] [GraalVM]", "notes": "", "versus": "None" }, @@ -149,7 +195,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut Data JDBC", + "display_name": "Micronaut [Data JDBC]", "notes": "", "versus": "None" }, @@ -170,7 +216,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut Data JDBC GraalVM", + "display_name": "Micronaut [Data JDBC] [GraalVM]", "notes": "", "versus": "None" }, @@ -191,7 +237,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut Data MongoDB", + "display_name": "Micronaut [Data MongoDB]", "notes": "", "versus": "None" }, @@ -212,7 +258,7 @@ "webserver": "Netty", "os": "Linux", "database_os": "Linux", - "display_name": "Micronaut Data MongoDB GraalVM", + "display_name": "Micronaut [Data MongoDB] [GraalVM]", "notes": "", "versus": "None" } diff --git a/frameworks/Java/micronaut/common/build.gradle b/frameworks/Java/micronaut/common/build.gradle index 61c68255503..ea12d5e8675 100644 --- a/frameworks/Java/micronaut/common/build.gradle +++ b/frameworks/Java/micronaut/common/build.gradle @@ -34,7 +34,9 @@ dependencies { transitive = false } - implementation("io.micronaut.views:micronaut-views-jte") + implementation("gg.jte:jte") + + runtimeOnly("io.netty:netty-transport-native-io_uring::linux-x86_64") runtimeOnly("ch.qos.logback:logback-classic") runtimeOnly("org.yaml:snakeyaml") diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/Application.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/Application.java index d3e7dc92125..0623e41085c 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/Application.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/Application.java @@ -1,10 +1,18 @@ package benchmark; import io.micronaut.runtime.Micronaut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Application { + private static final Logger log = LoggerFactory.getLogger(Application.class); + public static void main(String[] args) { + log.info("Runtime.maxMemory: {}", Runtime.getRuntime().maxMemory()); + log.info("Runtime.totalMemory: {}", Runtime.getRuntime().totalMemory()); + log.info("Runtime.availableProcessors: {}", Runtime.getRuntime().availableProcessors()); + Micronaut.build(args).environments("common").classes(Application.class).start(); } diff --git a/frameworks/Java/micronaut/common/src/main/resources/application-common.yml b/frameworks/Java/micronaut/common/src/main/resources/application-common.yml index 0e7745c6b29..852e0fa6079 100644 --- a/frameworks/Java/micronaut/common/src/main/resources/application-common.yml +++ b/frameworks/Java/micronaut/common/src/main/resources/application-common.yml @@ -6,6 +6,20 @@ micronaut: server-header: Micronaut date-header: false validate-url: false + netty: + parent: + event-loop-group: default + prefer-native-transport: true + worker: + event-loop-group: default + prefer-native-transport: true + http: + client: + event-loop-group: default + netty: + event-loops: + default: + prefer-native-transport: true netty: resource-leak-detector-level: DISABLED diff --git a/frameworks/Java/micronaut/common/src/main/resources/application-loom-on-netty.yml b/frameworks/Java/micronaut/common/src/main/resources/application-loom-on-netty.yml new file mode 100644 index 00000000000..68a6b805706 --- /dev/null +++ b/frameworks/Java/micronaut/common/src/main/resources/application-loom-on-netty.yml @@ -0,0 +1,8 @@ +micronaut: + netty: + event-loops: + default: + loom-carrier: true + loom-carrier: + work-spill-threshold: 1000000 + throughput-mode-threshold: 1000000 diff --git a/frameworks/Java/micronaut/common/src/main/resources/application-loom.yml b/frameworks/Java/micronaut/common/src/main/resources/application-loom.yml new file mode 100644 index 00000000000..576ea1b8e4e --- /dev/null +++ b/frameworks/Java/micronaut/common/src/main/resources/application-loom.yml @@ -0,0 +1,3 @@ +micronaut: + server: + thread-selection: blocking diff --git a/frameworks/Java/micronaut/common/src/main/resources/logback.xml b/frameworks/Java/micronaut/common/src/main/resources/logback.xml index d15761dd727..0f6f1052520 100644 --- a/frameworks/Java/micronaut/common/src/main/resources/logback.xml +++ b/frameworks/Java/micronaut/common/src/main/resources/logback.xml @@ -12,4 +12,7 @@ + + + \ No newline at end of file diff --git a/frameworks/Java/micronaut/micronaut-loom-fjp.dockerfile b/frameworks/Java/micronaut/micronaut-loom-fjp.dockerfile new file mode 100644 index 00000000000..29ceea4e896 --- /dev/null +++ b/frameworks/Java/micronaut/micronaut-loom-fjp.dockerfile @@ -0,0 +1,13 @@ +FROM gradle:8.14.3-jdk21 as build +COPY --chown=gradle:gradle . /home/gradle/src +WORKDIR /home/gradle/src +RUN gradle micronaut-vertx-pg-client:build -x test -x internalStartTestResourcesService --no-daemon + +FROM openjdk:24 +WORKDIR /micronaut +COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/libs/micronaut-vertx-pg-client-all.jar micronaut.jar +COPY run_benchmark.sh run_benchmark.sh + +EXPOSE 8080 +ENV MN_ENV=loom +ENTRYPOINT "./run_benchmark.sh" diff --git a/frameworks/Java/micronaut/micronaut-loom-on-netty.dockerfile b/frameworks/Java/micronaut/micronaut-loom-on-netty.dockerfile new file mode 100644 index 00000000000..76f2cdebfa6 --- /dev/null +++ b/frameworks/Java/micronaut/micronaut-loom-on-netty.dockerfile @@ -0,0 +1,13 @@ +FROM gradle:8.14.3-jdk21 as build +COPY --chown=gradle:gradle . /home/gradle/src +WORKDIR /home/gradle/src +RUN gradle micronaut-vertx-pg-client:build -x test -x internalStartTestResourcesService --no-daemon + +FROM openjdk:24 +WORKDIR /micronaut +COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/libs/micronaut-vertx-pg-client-all.jar micronaut.jar +COPY run_benchmark.sh run_benchmark.sh + +EXPOSE 8080 +ENV MN_ENV=loom,loom-on-netty +ENTRYPOINT "./run_benchmark.sh" diff --git a/frameworks/Java/micronaut/micronaut-vertx-pg-client/build.gradle b/frameworks/Java/micronaut/micronaut-vertx-pg-client/build.gradle index ce83fa28bf2..fe8dd5d09bf 100644 --- a/frameworks/Java/micronaut/micronaut-vertx-pg-client/build.gradle +++ b/frameworks/Java/micronaut/micronaut-vertx-pg-client/build.gradle @@ -9,6 +9,6 @@ micronaut { } dependencies { - implementation("io.vertx:vertx-pg-client") + implementation("io.vertx:vertx-pg-client:5.0.2") implementation('com.ongres.scram:client') } \ No newline at end of file diff --git a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java index d471adc91c3..6d7d91cd3f9 100644 --- a/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java +++ b/frameworks/Java/micronaut/micronaut-vertx-pg-client/src/main/java/benchmark/ConnectionHolder.java @@ -1,21 +1,28 @@ package benchmark; import io.micronaut.context.annotation.Property; +import io.micronaut.core.util.SupplierUtil; +import io.micronaut.http.netty.channel.loom.EventLoopVirtualThreadScheduler; +import io.micronaut.http.netty.channel.loom.PrivateLoomSupport; +import io.micronaut.scheduling.LoomSupport; import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFactory; import io.netty.channel.EventLoop; import io.netty.channel.EventLoopGroup; +import io.netty.channel.IoHandlerFactory; import io.netty.channel.ServerChannel; import io.netty.channel.socket.DatagramChannel; import io.netty.channel.socket.InternetProtocolFamily; +import io.netty.util.Attribute; +import io.netty.util.AttributeKey; import io.netty.util.concurrent.FastThreadLocal; import io.netty.util.internal.ThreadExecutorMap; import io.vertx.core.Future; import io.vertx.core.Vertx; +import io.vertx.core.VertxBuilder; import io.vertx.core.datagram.DatagramSocketOptions; -import io.vertx.core.impl.VertxBuilder; import io.vertx.core.net.ClientOptionsBase; import io.vertx.core.net.NetServerOptions; import io.vertx.core.spi.transport.Transport; @@ -23,118 +30,190 @@ import io.vertx.pgclient.PgConnection; import io.vertx.sqlclient.PoolOptions; import jakarta.inject.Singleton; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.net.SocketAddress; +import java.util.List; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Supplier; +import java.util.stream.IntStream; +import java.util.stream.Stream; @Singleton public class ConnectionHolder { + private static final Logger log = LoggerFactory.getLogger(ConnectionHolder.class); private final FastThreadLocal> conn = new FastThreadLocal<>(); + private final AttributeKey> loomConn = AttributeKey.valueOf("vertx-pg-connection"); @Property(name = "datasources.default.url") String url; @Property(name = "datasources.default.username") String user; @Property(name = "datasources.default.password") String password; @Property(name = "datasources.default.maximum-pool-size") int maxPoolSize; - public Future get() { - Future c = conn.get(); - if (c == null) { - - PgConnectOptions connectOptions = PgConnectOptions.fromUri(url.substring(5)) - .setUser(user) - .setPassword(password) - .setCachePreparedStatements(true) - .setTcpNoDelay(true) - .setTcpQuickAck(true) - .setPipeliningLimit(1024); - PoolOptions poolOptions = new PoolOptions(); - poolOptions.setMaxSize(maxPoolSize); - - VertxBuilder builder = new VertxBuilder() - .init(); + private final Supplier>> pool = SupplierUtil.memoized(() -> { + Vertx vertx = Vertx.builder() + .withTransport(vertxTransport()) + .build(); + return IntStream.range(0, maxPoolSize) + .mapToObj(i -> PgConnection.connect(vertx, connectOptions())) + .toList(); + }); - EventLoop loop = (EventLoop) ThreadExecutorMap.currentExecutor(); - - Vertx vertx = builder - .findTransport(new ExistingTransport(builder.findTransport(), loop)) - .vertx(); + public Future get() { + if (PrivateLoomSupport.isSupported() && + LoomSupport.isVirtual(Thread.currentThread()) && + PrivateLoomSupport.getScheduler(Thread.currentThread()) instanceof EventLoopVirtualThreadScheduler sch) { + + Attribute> attr = sch.attributeMap().attr(loomConn); + Future c = attr.get(); + if (c == null) { + c = connect((EventLoop) sch.eventLoop()); + attr.set(c); + } + return c; + } else if (ThreadExecutorMap.currentExecutor() instanceof EventLoop el) { - c = PgConnection.connect(vertx, connectOptions); - conn.set(c); + Future c = conn.get(); + if (c == null) { + c = connect(el); + conn.set(c); + } + return c; + } else { + List> l = pool.get(); + return l.get(ThreadLocalRandom.current().nextInt(l.size())); } - return c; } - private record ExistingTransport(Transport transport, EventLoop loop) implements Transport { - - @Override - public boolean supportsDomainSockets() { - return transport.supportsDomainSockets(); - } + private Future connect(EventLoop loop) { + VertxBuilder builder = Vertx.builder(); + io.vertx.core.transport.Transport original = vertxTransport(); + ExistingTransport mapped = new ExistingTransport(original.implementation(), loop); + io.vertx.core.transport.Transport tr = new io.vertx.core.transport.Transport() { @Override - public boolean supportFileRegion() { - return transport.supportFileRegion(); + public String name() { + return "ExistingTransport"; } @Override - public boolean isAvailable() { - return transport.isAvailable(); + public boolean available() { + return true; } @Override public Throwable unavailabilityCause() { - return transport.unavailabilityCause(); + return null; } @Override - public SocketAddress convert(io.vertx.core.net.SocketAddress address) { - return transport.convert(address); + public Transport implementation() { + return mapped; } + }; + Vertx vertx = builder + .withTransport(tr) + .build(); + return PgConnection.connect(vertx, connectOptions()); + } - @Override - public io.vertx.core.net.SocketAddress convert(SocketAddress address) { - return transport.convert(address); - } + private static io.vertx.core.transport.Transport vertxTransport() { + return Stream.of(io.vertx.core.transport.Transport.IO_URING, io.vertx.core.transport.Transport.NIO) + .filter(t -> t != null && t.available()) + .findFirst().orElseThrow(); + } - @Override - public EventLoopGroup eventLoopGroup(int type, int nThreads, ThreadFactory threadFactory, int ignoredIoRatio) { - return loop; - } + private PoolOptions poolOptions() { + PoolOptions poolOptions = new PoolOptions(); + poolOptions.setMaxSize(maxPoolSize); + return poolOptions; + } - @Override - public DatagramChannel datagramChannel() { - return transport.datagramChannel(); - } + private PgConnectOptions connectOptions() { + return PgConnectOptions.fromUri(url.substring(5)) + .setUser(user) + .setPassword(password) + .setCachePreparedStatements(true) + .setPipeliningLimit(1024); + } - @Override - public DatagramChannel datagramChannel(InternetProtocolFamily family) { - return transport.datagramChannel(family); - } + private record ExistingTransport(Transport transport, EventLoop loop) implements Transport { - @Override - public ChannelFactory channelFactory(boolean domainSocket) { - return transport.channelFactory(domainSocket); - } + @Override + public boolean supportsDomainSockets() { + return transport.supportsDomainSockets(); + } - @Override - public ChannelFactory serverChannelFactory(boolean domainSocket) { - return transport.serverChannelFactory(domainSocket); - } + @Override + public boolean supportFileRegion() { + return transport.supportFileRegion(); + } - @Override - public void configure(DatagramChannel channel, DatagramSocketOptions options) { - transport.configure(channel, options); - } + @Override + public boolean isAvailable() { + return transport.isAvailable(); + } - @Override - public void configure(ClientOptionsBase options, boolean domainSocket, Bootstrap bootstrap) { - transport.configure(options, domainSocket, bootstrap); - } + @Override + public Throwable unavailabilityCause() { + return transport.unavailabilityCause(); + } - @Override - public void configure(NetServerOptions options, boolean domainSocket, ServerBootstrap bootstrap) { - transport.configure(options, domainSocket, bootstrap); - } + @Override + public SocketAddress convert(io.vertx.core.net.SocketAddress address) { + return transport.convert(address); } + + @Override + public io.vertx.core.net.SocketAddress convert(SocketAddress address) { + return transport.convert(address); + } + + @Override + public IoHandlerFactory ioHandlerFactory() { + return transport.ioHandlerFactory(); + } + + @Override + public EventLoopGroup eventLoopGroup(int type, int nThreads, ThreadFactory threadFactory, int ignoredIoRatio) { + return loop; + } + + @Override + public DatagramChannel datagramChannel() { + return transport.datagramChannel(); + } + + @Override + public DatagramChannel datagramChannel(InternetProtocolFamily family) { + return transport.datagramChannel(family); + } + + @Override + public ChannelFactory channelFactory(boolean domainSocket) { + return transport.channelFactory(domainSocket); + } + + @Override + public ChannelFactory serverChannelFactory(boolean domainSocket) { + return transport.serverChannelFactory(domainSocket); + } + + @Override + public void configure(DatagramChannel channel, DatagramSocketOptions options) { + transport.configure(channel, options); + } + + @Override + public void configure(ClientOptionsBase options, int connectTimeout, boolean domainSocket, Bootstrap bootstrap) { + transport.configure(options, connectTimeout, domainSocket, bootstrap); + } + + @Override + public void configure(NetServerOptions options, boolean domainSocket, ServerBootstrap bootstrap) { + transport.configure(options, domainSocket, bootstrap); + } + } } diff --git a/frameworks/Java/micronaut/run_benchmark.sh b/frameworks/Java/micronaut/run_benchmark.sh index 40e9572de48..a5db04ab957 100755 --- a/frameworks/Java/micronaut/run_benchmark.sh +++ b/frameworks/Java/micronaut/run_benchmark.sh @@ -1,16 +1,23 @@ #!/bin/bash -JAVA_OPTIONS="-server \ +if [ -z "$MN_ENV" ]; then + MN_ENV=benchmark +else + MN_ENV=benchmark,$MN_ENV +fi + +JAVA_OPTIONS="$JAVA_OPTIONS -server \ -XX:+UseParallelGC \ -XX:+UseNUMA \ - -XX:-StackTraceInThrowable \ + -Djdk.trackAllThreads=false \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ -Dvertx.disableMetrics=true \ -Dvertx.threadChecks=false \ -Dvertx.disableContextTimings=true \ -Dvertx.disableTCCL=true \ - -Dmicronaut.environments=benchmark + -Dmicronaut.environments=$MN_ENV \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ $@" -java $JAVA_OPTIONS -jar micronaut.jar +exec java $JAVA_OPTIONS -jar micronaut.jar From d973e2b334eb2b70cfffa8af08a80dab0d0908cc Mon Sep 17 00:00:00 2001 From: Diogo Martins <165835485+MDA2AV@users.noreply.github.com> Date: Fri, 15 Aug 2025 19:45:50 +0100 Subject: [PATCH 1567/1766] Add Wired.IO framework (#10022) * Add Wired.IO * fix plain text header * fix json and plaintext responses * Fix plaintext response * Fix runtime identifier * Add missing headers --- frameworks/CSharp/wiredio/.gitignore | 38 +++++++++++++++++++ .../wiredio/Benchmarks/Benchmarks.csproj | 23 +++++++++++ .../CSharp/wiredio/Benchmarks/Program.cs | 32 ++++++++++++++++ frameworks/CSharp/wiredio/README.md | 22 +++++++++++ .../CSharp/wiredio/benchmark_config.json | 24 ++++++++++++ frameworks/CSharp/wiredio/config.toml | 14 +++++++ frameworks/CSharp/wiredio/wiredio.dockerfile | 24 ++++++++++++ 7 files changed, 177 insertions(+) create mode 100644 frameworks/CSharp/wiredio/.gitignore create mode 100644 frameworks/CSharp/wiredio/Benchmarks/Benchmarks.csproj create mode 100644 frameworks/CSharp/wiredio/Benchmarks/Program.cs create mode 100644 frameworks/CSharp/wiredio/README.md create mode 100644 frameworks/CSharp/wiredio/benchmark_config.json create mode 100644 frameworks/CSharp/wiredio/config.toml create mode 100644 frameworks/CSharp/wiredio/wiredio.dockerfile diff --git a/frameworks/CSharp/wiredio/.gitignore b/frameworks/CSharp/wiredio/.gitignore new file mode 100644 index 00000000000..c8d1eed0116 --- /dev/null +++ b/frameworks/CSharp/wiredio/.gitignore @@ -0,0 +1,38 @@ +[Oo]bj/ +[Bb]in/ +TestResults/ +.nuget/ +*.sln +*.sln.ide/ +_ReSharper.*/ +.idea/ +packages/ +artifacts/ +PublishProfiles/ +.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/wiredio/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/wiredio/Benchmarks/Benchmarks.csproj new file mode 100644 index 00000000000..627c09fb8c8 --- /dev/null +++ b/frameworks/CSharp/wiredio/Benchmarks/Benchmarks.csproj @@ -0,0 +1,23 @@ + + + + Exe + net9.0 + 13.0 + enable + enable + + true + true + + + linux-musl-x64 + true + + + + + + + + diff --git a/frameworks/CSharp/wiredio/Benchmarks/Program.cs b/frameworks/CSharp/wiredio/Benchmarks/Program.cs new file mode 100644 index 00000000000..8a41b222386 --- /dev/null +++ b/frameworks/CSharp/wiredio/Benchmarks/Program.cs @@ -0,0 +1,32 @@ +using System.Net; +using System.Text.Json; +using Wired.IO.App; +using Wired.IO.Http11.Response.Content; +using Wired.IO.Protocol.Response; +using StringContent = Wired.IO.Http11.Response.Content.StringContent; + +var builder = WiredApp.CreateBuilder(); + +await builder + .Endpoint(IPAddress.Any, 8080) + .MapGet("/plaintext", scope => context => + { + context + .Respond() + .Status(ResponseStatus.Ok) + .Content(new StringContent("Hello, World!")) + .Type("text/plain"); + }) + .MapGet("/json", scope => context => + { + context + .Respond() + .Status(ResponseStatus.Ok) + .Content(new JsonContent(new + { + Message = "Hello, World!" + }, JsonSerializerOptions.Default)) + .Type("application/json"); + }) + .Build() + .RunAsync(); \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/README.md b/frameworks/CSharp/wiredio/README.md new file mode 100644 index 00000000000..4f137ae45c2 --- /dev/null +++ b/frameworks/CSharp/wiredio/README.md @@ -0,0 +1,22 @@ +# Wired.IO Tests on Linux + +See the [Wired.IO Documentation](https://mda2av.github.io/Wired.IO.Docs/) for more information. + +## Infrastructure Software Versions + +**Language** + +* C# 13.0 + +**Platforms** + +* .NET 8/9 + +**Web Servers** + +* [Wired.IO](https://github.com/MDA2AV/Wired.IO) + +## Paths & Source for Tests + +* [Plaintext](Benchmarks/Program.cs): "/plaintext" +* [JSON](Benchmarks/Program.cs): "/json" diff --git a/frameworks/CSharp/wiredio/benchmark_config.json b/frameworks/CSharp/wiredio/benchmark_config.json new file mode 100644 index 00000000000..f136d0588b7 --- /dev/null +++ b/frameworks/CSharp/wiredio/benchmark_config.json @@ -0,0 +1,24 @@ +{ + "framework": "wiredio", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "None", + "framework": "Wired.IO", + "language": "C#", + "orm": "None", + "platform": ".NET", + "webserver": "Wired.IO", + "os": "Linux", + "database_os": "Linux", + "display_name": "Wired.IO", + "notes": "Only plaintext and JSON benchmarks implemented" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/config.toml b/frameworks/CSharp/wiredio/config.toml new file mode 100644 index 00000000000..55e724fde37 --- /dev/null +++ b/frameworks/CSharp/wiredio/config.toml @@ -0,0 +1,14 @@ +[framework] +name = "wiredio" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Fullstack" +os = "Linux" +database_os = "Linux" +orm = "None" +platform = ".NET" +webserver = "Wired.IO" +versus = "None" diff --git a/frameworks/CSharp/wiredio/wiredio.dockerfile b/frameworks/CSharp/wiredio/wiredio.dockerfile new file mode 100644 index 00000000000..8c473477a61 --- /dev/null +++ b/frameworks/CSharp/wiredio/wiredio.dockerfile @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build +WORKDIR /source + +# copy csproj and restore as distinct layers +COPY Benchmarks/*.csproj . +RUN dotnet restore -r linux-musl-x64 + +# copy and publish app and libraries +COPY Benchmarks/ . +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained + +# final stage/image +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine + +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 + +WORKDIR /app +COPY --from=build /app . + +ENTRYPOINT ["./Benchmarks"] + +EXPOSE 8080 From df5fb4163a6fa8ac8f7f7ad6c321a3cdf546ec63 Mon Sep 17 00:00:00 2001 From: Ajay Kidave <130696958+akclace@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:32:29 -0700 Subject: [PATCH 1568/1766] Renamed Clace to OpenRun (#10056) * Added localhost path * [clace] - Changed to use no_args handlers * Rename Clace to OpenRun --- frameworks/Python/clace/README.md | 11 ----------- frameworks/Python/clace/clace.dockerfile | 11 ----------- frameworks/Python/{clace => openrun}/.dockerignore | 0 frameworks/Python/openrun/README.md | 11 +++++++++++ frameworks/Python/{clace => openrun}/app.star | 0 .../Python/{clace => openrun}/benchmark_config.json | 8 ++++---- frameworks/Python/openrun/openrun.dockerfile | 11 +++++++++++ frameworks/Python/{clace => openrun}/run.sh | 6 +++--- 8 files changed, 29 insertions(+), 29 deletions(-) delete mode 100755 frameworks/Python/clace/README.md delete mode 100644 frameworks/Python/clace/clace.dockerfile rename frameworks/Python/{clace => openrun}/.dockerignore (100%) create mode 100755 frameworks/Python/openrun/README.md rename frameworks/Python/{clace => openrun}/app.star (100%) rename frameworks/Python/{clace => openrun}/benchmark_config.json (75%) create mode 100644 frameworks/Python/openrun/openrun.dockerfile rename frameworks/Python/{clace => openrun}/run.sh (67%) diff --git a/frameworks/Python/clace/README.md b/frameworks/Python/clace/README.md deleted file mode 100755 index f510c5c8f54..00000000000 --- a/frameworks/Python/clace/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Introduction - -[Clace](https://github.com/claceio/clace) is a platform for developing and deploying internal tools. - -Clace is implemented in Go. Clace apps are written in [Starlark](https://starlark-lang.org/). Starlark is a thread-safe language with Python syntax, designed for embedding. Clace uses the [Starlark Go](https://github.com/google/starlark-go) implementation. Since apps are developed using a python like syntax, the benchmark is added under the Python category. - -# Benchmarking - -The JSON and plaintext tests are implemented. Clace supports SQLite database only currently, so the database tests are not implemented. - -The Dockerfile starts the Clace server and creates a single app which implements the benchmark apis (app.star). diff --git a/frameworks/Python/clace/clace.dockerfile b/frameworks/Python/clace/clace.dockerfile deleted file mode 100644 index 40c8c69608b..00000000000 --- a/frameworks/Python/clace/clace.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.11 -WORKDIR /clace/ - -RUN curl -L https://clace.io/install.sh | bash -ENV CL_HOME="/root/clhome" -ENV PATH="/root/clhome/bin:$PATH" - -COPY . . - -EXPOSE 8080 -CMD /clace/run.sh diff --git a/frameworks/Python/clace/.dockerignore b/frameworks/Python/openrun/.dockerignore similarity index 100% rename from frameworks/Python/clace/.dockerignore rename to frameworks/Python/openrun/.dockerignore diff --git a/frameworks/Python/openrun/README.md b/frameworks/Python/openrun/README.md new file mode 100755 index 00000000000..cee6a1a0dd9 --- /dev/null +++ b/frameworks/Python/openrun/README.md @@ -0,0 +1,11 @@ +# Introduction + +[OpenRun](https://github.com/openrundev/openrun) is a platform for developing and deploying internal tools. + +OpenRun is implemented in Go. OpenRun apps are written in [Starlark](https://starlark-lang.org/). Starlark is a thread-safe language with Python syntax, designed for embedding. OpenRun uses the [Starlark Go](https://github.com/google/starlark-go) implementation. Since apps are developed using a python like syntax, the benchmark is added under the Python category. + +# Benchmarking + +The JSON and plaintext tests are implemented. OpenRun supports SQLite database only currently, so the database tests are not implemented. + +The Dockerfile starts the OpenRun server and creates a single app which implements the benchmark apis (app.star). diff --git a/frameworks/Python/clace/app.star b/frameworks/Python/openrun/app.star similarity index 100% rename from frameworks/Python/clace/app.star rename to frameworks/Python/openrun/app.star diff --git a/frameworks/Python/clace/benchmark_config.json b/frameworks/Python/openrun/benchmark_config.json similarity index 75% rename from frameworks/Python/clace/benchmark_config.json rename to frameworks/Python/openrun/benchmark_config.json index c836299e939..88edd90bdc9 100755 --- a/frameworks/Python/clace/benchmark_config.json +++ b/frameworks/Python/openrun/benchmark_config.json @@ -1,5 +1,5 @@ { - "framework": "clace", + "framework": "openrun", "tests": [ { "default": { @@ -8,13 +8,13 @@ "port": 8080, "approach": "Realistic", "classification": "Micro", - "framework": "Clace", + "framework": "OpenRun", "language": "python", "flavor": "Starlark", "platform": "None", - "webserver": "Clace", + "webserver": "OpenRun", "os": "Linux", - "display_name": "Clace", + "display_name": "OpenRun", "notes": "", "versus": "None" } diff --git a/frameworks/Python/openrun/openrun.dockerfile b/frameworks/Python/openrun/openrun.dockerfile new file mode 100644 index 00000000000..f0de014b790 --- /dev/null +++ b/frameworks/Python/openrun/openrun.dockerfile @@ -0,0 +1,11 @@ +FROM python:3.11 +WORKDIR /openrun/ + +RUN curl -L https://openrun.dev/install.sh | bash +ENV OPENRUN_HOME="/root/openrun" +ENV PATH="/root/openrun/bin:$PATH" + +COPY . . + +EXPOSE 8080 +CMD /openrun/run.sh diff --git a/frameworks/Python/clace/run.sh b/frameworks/Python/openrun/run.sh similarity index 67% rename from frameworks/Python/clace/run.sh rename to frameworks/Python/openrun/run.sh index e50158afcc5..2e6961527db 100755 --- a/frameworks/Python/clace/run.sh +++ b/frameworks/Python/openrun/run.sh @@ -1,7 +1,7 @@ #!/bin/sh cd /root -cat < /root/clhome/clace.toml +cat < /root/openrun/openrun.toml [logging] console = false file = false @@ -20,7 +20,7 @@ cors.allow_origin = "" EOF -clace server start & +openrun server start & sleep 2 -clace app create --auth=none --approve /clace / +openrun app create --auth=none --approve /openrun / tail -f /dev/null From 0ca8dd3cb2b0590dbc6f34c02fbc2dbde7096099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 20 Aug 2025 02:33:08 +0800 Subject: [PATCH 1569/1766] Upgrade hyperlane (#10057) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update * feat: cache * feat: cache * feat: config * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 75 +++++++++++-------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/src/db.rs | 56 +++++--------- .../Rust/hyperlane/src/request_middleware.rs | 8 +- frameworks/Rust/hyperlane/src/route.rs | 4 +- frameworks/Rust/hyperlane/src/server.rs | 15 ++-- 6 files changed, 76 insertions(+), 84 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 73d56f9e079..a59b4766d9c 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -91,9 +91,9 @@ checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" dependencies = [ "serde", ] @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.1" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -473,9 +473,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -549,15 +549,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.59.5" +version = "1.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d68fc1cd9b672083471b783a0f17f4df5eb470f79a2685b6f55e631618bcd2b" +checksum = "c10a92fc539f5fc3b2c5c3de4255e4f62f2768c9cd5a0e7879edf3d3b3189186" [[package]] name = "http-type" -version = "4.55.6" +version = "4.58.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06966dd52009ec38901b439b9060dd9ed0ead6d1204f214fa9a933ae3cb85328" +checksum = "abed1c209d167f814d402413f3de1ea85b9d200ddf7724d5cf487531580beafb" dependencies = [ "hex", "http-compress", @@ -573,9 +573,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "6.6.0" +version = "7.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7977949b728631efd15f05ac20930c3d4881cab8ec1ad7d723a99431a21443" +checksum = "0f9d7945668a0db60ff3ed6b139d6a5d3e59bb171a3b065745066f74e01eaab7" dependencies = [ "http-type", "lombok-macros", @@ -750,9 +750,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libm" @@ -760,6 +760,17 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "libredox" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -1014,9 +1025,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -1270,9 +1281,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -1352,7 +1363,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", "tokio", "tokio-stream", "tracing", @@ -1434,7 +1445,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 2.0.15", "tracing", "whoami", ] @@ -1471,7 +1482,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 2.0.15", "tracing", "whoami", ] @@ -1495,7 +1506,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.12", + "thiserror 2.0.15", "tracing", "url", ] @@ -1525,9 +1536,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1556,11 +1567,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.15", ] [[package]] @@ -1576,9 +1587,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" dependencies = [ "proc-macro2", "quote", @@ -1778,11 +1789,11 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "whoami" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall", + "libredox", "wasite", ] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index afccb3c2ee0..419170cf4e9 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,7 +20,7 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "6.6.0" +hyperlane = "7.6.1" hyperlane-time = "0.7.7" num_cpus = "1.17.0" once_cell = "1.21.3" diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db.rs index 136b451438c..c5aa4c9dbef 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db.rs @@ -113,37 +113,19 @@ pub async fn connection_db() -> DbPoolConnection { pool } -pub async fn get_update_data( - limit: Queries, -) -> (String, Vec, Vec, Vec) { +pub async fn get_update_data(limit: Queries) -> (Vec, Vec, Vec) { let db_pool: &DbPoolConnection = get_db_connection(); let mut query_res_list: Vec = Vec::with_capacity(limit as usize); let rows: Vec = get_some_row_id(limit, db_pool).await; - let mut sql: String = String::with_capacity(rows.len() * 32); - sql.push_str(&format!( - "UPDATE {} SET randomNumber = CASE id ", - TABLE_NAME_WORLD - )); let mut id_list: Vec = Vec::with_capacity(rows.len()); - let mut value_list: Vec = Vec::with_capacity(rows.len()); let mut random_numbers: Vec = Vec::with_capacity(rows.len()); - for (i, row) in rows.iter().enumerate() { + for row in rows.iter() { let new_random_number: i32 = get_random_id() as i32; id_list.push(row.id); random_numbers.push(new_random_number); - value_list.push(format!("WHEN ${} THEN ${}", i * 2 + 1, i * 2 + 2)); query_res_list.push(QueryRow::new(row.id, new_random_number)); } - sql.push_str(&value_list.join(" ")); - let id_params: String = (0..rows.len()) - .map(|i| format!("${}", (rows.len() * 2 + 1) + i)) - .collect::>() - .join(","); - sql.push_str(&format!( - " ELSE randomNumber END WHERE id IN ({})", - id_params - )); - (sql, query_res_list, id_list, random_numbers) + (query_res_list, id_list, random_numbers) } pub async fn init_db() { @@ -163,11 +145,8 @@ pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { } pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRow { - let sql: String = format!( - "SELECT id, randomNumber FROM {} WHERE id = {}", - TABLE_NAME_WORLD, id - ); - if let Ok(rows) = query(&sql).fetch_one(db_pool).await { + let sql: &str = "SELECT id, randomNumber FROM World WHERE id = $1"; + if let Ok(rows) = query(sql).bind(id).fetch_one(db_pool).await { let random_number: i32 = rows.get(KEY_RANDOM_NUMBER); return QueryRow::new(id as i32, random_number); } @@ -176,15 +155,20 @@ pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRo pub async fn update_world_rows(limit: Queries) -> Vec { let db_pool: &DbPoolConnection = get_db_connection(); - let (sql, data, id_list, random_numbers) = get_update_data(limit).await; - let mut query_builder = query(&sql); - for (id, random_number) in id_list.iter().zip(random_numbers.iter()) { - query_builder = query_builder.bind(id).bind(random_number); - } - for id in &id_list { - query_builder = query_builder.bind(id); + let (data, id_list, random_numbers) = get_update_data(limit).await; + let sql: &str = "UPDATE World SET randomNumber = $1 WHERE id = $2"; + let mut tasks: Vec> = Vec::with_capacity(limit as usize); + for (id, random_number) in id_list.into_iter().zip(random_numbers.into_iter()) { + let db_pool: Pool = db_pool.clone(); + tasks.push(spawn(async move { + query(sql) + .bind(random_number) + .bind(id) + .execute(&db_pool) + .await + })); } - let _ = query_builder.execute(db_pool).await; + join_all(tasks).await; data } @@ -196,14 +180,10 @@ pub async fn all_world_row() -> Vec { } pub async fn get_some_row_id(limit: Queries, db_pool: &DbPoolConnection) -> Vec { - let semaphore: Arc = Arc::new(Semaphore::new(32)); let tasks: Vec<_> = (0..limit) .map(|_| { - let semaphore: Arc = semaphore.clone(); let db_pool: Pool = db_pool.clone(); spawn(async move { - let _permit: Result = - semaphore.acquire_owned().await; let id: i32 = get_random_id(); query_world_row(&db_pool, id).await }) diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/request_middleware.rs index 7f7105e9363..02c9af06667 100644 --- a/frameworks/Rust/hyperlane/src/request_middleware.rs +++ b/frameworks/Rust/hyperlane/src/request_middleware.rs @@ -3,14 +3,14 @@ use super::*; pub async fn request(ctx: Context) { ctx.set_response_version(HttpVersion::HTTP1_1) .await - .replace_response_header(CONNECTION, KEEP_ALIVE) + .set_response_header(CONNECTION, KEEP_ALIVE) .await - .replace_response_header(SERVER, HYPERLANE) + .set_response_header(SERVER, HYPERLANE) .await - .replace_response_header(DATE, gmt()) + .set_response_header(DATE, gmt()) .await .set_response_status_code(200) .await - .replace_response_header(CONTENT_TYPE, APPLICATION_JSON) + .set_response_header(CONTENT_TYPE, APPLICATION_JSON) .await; } diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route.rs index 75683e1c313..2a5fcc7222c 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route.rs @@ -17,7 +17,7 @@ pub async fn json(ctx: Context) { } pub async fn plaintext(ctx: Context) { - ctx.replace_response_header(CONTENT_TYPE, TEXT_PLAIN).await; + ctx.set_response_header(CONTENT_TYPE, TEXT_PLAIN).await; ctx.set_response_body(RESPONSEDATA_BIN).await; let run = || async { ctx.send().await.unwrap(); @@ -71,7 +71,7 @@ pub async fn query(ctx: Context) { } pub async fn fortunes(ctx: Context) { - ctx.replace_response_header( + ctx.set_response_header( CONTENT_TYPE, ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), ) diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server.rs index 49781cf544b..fc12d800b43 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server.rs @@ -12,13 +12,14 @@ fn runtime() -> Runtime { } async fn init_server() { - let server: Server = Server::new(); - server.host("0.0.0.0").await; - server.port(8080).await; - server.disable_linger().await; - server.disable_nodelay().await; - server.http_buffer(256).await; - server.ws_buffer(256).await; + let config: ServerConfig = ServerConfig::new().await; + config.host("0.0.0.0").await; + config.port(8080).await; + config.disable_nodelay().await; + config.http_buffer(256).await; + config.ws_buffer(256).await; + + let server: Server = Server::from(config).await; server.request_middleware(request_middleware::request).await; From fb5b6af23ee4a2beb26743c5ae79ca7848b14daa Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 19 Aug 2025 20:33:40 +0200 Subject: [PATCH 1570/1766] [ruby] Cleanup references to Unicorn and Passenger (#10059) Most Unicorn and Passenger variants have been removed but there were still some references. --- frameworks/Ruby/rack-sequel/hello_world.rb | 10 +--- frameworks/Ruby/roda-sequel/Gemfile | 1 - frameworks/Ruby/roda-sequel/Gemfile.lock | 2 - frameworks/Ruby/sinatra/README.md | 2 - frameworks/Ruby/sinatra/config.toml | 68 ---------------------- 5 files changed, 1 insertion(+), 82 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index e8507d3c54c..17ff4a42c57 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -130,15 +130,7 @@ def respond(content_type, body) ] end - if defined?(Unicorn) - def headers(content_type, body) - { - CONTENT_TYPE => content_type, - SERVER => SERVER_STRING, - CONTENT_LENGTH => body.bytesize.to_s - } - end - elsif defined?(Puma) + if defined?(Puma) def headers(content_type, _) { CONTENT_TYPE => content_type, diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index d8468922b5a..054231e8eb6 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -1,6 +1,5 @@ source "https://rubygems.org" -gem 'base64' # required by passenger on Ruby 3.4 gem "erubi", "~> 1.12" gem "json", "~> 2.8" gem "sequel", "~> 5.67" diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index f29a7c751a6..59809e0b877 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -1,7 +1,6 @@ GEM remote: https://rubygems.org/ specs: - base64 (0.2.0) bigdecimal (3.1.9) erubi (1.13.1) iodine (0.7.58) @@ -27,7 +26,6 @@ PLATFORMS x86_64-linux DEPENDENCIES - base64 erubi (~> 1.12) iodine (~> 0.7) json (~> 2.8) diff --git a/frameworks/Ruby/sinatra/README.md b/frameworks/Ruby/sinatra/README.md index 311b5d21a69..307d995c942 100644 --- a/frameworks/Ruby/sinatra/README.md +++ b/frameworks/Ruby/sinatra/README.md @@ -14,8 +14,6 @@ The tests will be run with: * [Ruby 3.4](http://www.ruby-lang.org) * [Puma 6](http://puma.io) -* [Passenger 6](https://www.phusionpassenger.com) -* [Unicorn 6](https://bogomips.org/unicorn/) * [Sinatra 4](http://www.sinatrarb.com) * [ActiveRecord 7](https://github.com/rails/rails/tree/master/activerecord) * [MySQL 5.5](https://www.mysql.com) diff --git a/frameworks/Ruby/sinatra/config.toml b/frameworks/Ruby/sinatra/config.toml index 035f0c5541e..fec67b1fc9b 100644 --- a/frameworks/Ruby/sinatra/config.toml +++ b/frameworks/Ruby/sinatra/config.toml @@ -34,71 +34,3 @@ orm = "Full" platform = "Rack" webserver = "Puma" versus = "rack-puma-mri" - -[postgres-passenger-mri] -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 = "Full" -platform = "Rack" -webserver = "Passenger" -versus = "rack-postgres-passenger-mri" - -[postgres-unicorn-mri] -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 = "Full" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-postgres-unicorn-mri" - -[passenger-mri] -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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Rack" -webserver = "Passenger" -versus = "rack-passenger-mri" - -[unicorn-mri] -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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-unicorn-mri" From b1383f02896dc757dbbd18c7c6801bf21f2bd499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=B0=8F=E9=A9=AC?= <1417262058@qq.com> Date: Wed, 20 Aug 2025 02:34:17 +0800 Subject: [PATCH 1571/1766] Update hserver and hserver-business version (#10060) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update hserver version 3.7.0 pom.xml * Update hserver version 3.7.0 pom.xml * 4.0.0 * 4.0.0 * 4.0.0 * 4.0.0 --------- Co-authored-by: 黑小马 --- frameworks/Java/hserver-business/pom.xml | 13 ++- .../main/java/com/test/hserver/StartApp.java | 8 +- .../hserver/controller/TestController.java | 34 ++++---- .../com/test/hserver/db/DataSourceConfig.java | 2 +- .../com/test/hserver/db/PostgresConfig.java | 2 +- .../java/com/test/hserver/task/TimeAdd.java | 6 +- .../src/main/resources/app.properties | 1 + frameworks/Java/hserver/pom.xml | 14 ++-- .../main/java/com/test/hserver/StartApp.java | 18 +++-- .../hserver/controller/TestController.java | 81 ++++++++----------- .../com/test/hserver/db/DataSourceConfig.java | 2 +- .../com/test/hserver/db/PostgresConfig.java | 2 +- .../java/com/test/hserver/task/TimeAdd.java | 6 +- .../hserver/src/main/resources/app.properties | 3 +- 14 files changed, 92 insertions(+), 100 deletions(-) diff --git a/frameworks/Java/hserver-business/pom.xml b/frameworks/Java/hserver-business/pom.xml index f632bfe0307..391ac6bb666 100644 --- a/frameworks/Java/hserver-business/pom.xml +++ b/frameworks/Java/hserver-business/pom.xml @@ -11,7 +11,7 @@ hserver-parent cn.hserver - 3.7.0 + 4.0.0-beta.3 UTF-8 @@ -20,15 +20,14 @@ - - hserver + hserver-web-starter cn.hserver - - hserver-plugin-web - cn.hserver + org.slf4j + slf4j-api + 2.0.17 com.zaxxer @@ -44,7 +43,7 @@ - hserver-plugin-maven + hserver-maven cn.hserver diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java index b4e215081da..5169f645377 100644 --- a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java @@ -1,10 +1,8 @@ package com.test.hserver; -import cn.hserver.HServerApplication; -import cn.hserver.core.ioc.annotation.HServerBoot; -import cn.hserver.core.server.context.ConstConfig; - +import cn.hserver.core.boot.HServerApplication; +import cn.hserver.core.boot.annotation.HServerBoot; /** * @author hxm @@ -13,6 +11,6 @@ public class StartApp { public static void main(String[] args) { - HServerApplication.run(StartApp.class, 8888, args); + HServerApplication.run(StartApp.class, args); } } diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java index c4bc3b4b0fb..de963b2db86 100644 --- a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java @@ -1,16 +1,14 @@ package com.test.hserver.controller; import cn.hserver.core.ioc.annotation.Autowired; -import cn.hserver.plugin.web.annotation.Controller; -import cn.hserver.plugin.web.annotation.GET; -import cn.hserver.plugin.web.interfaces.HttpRequest; -import cn.hserver.plugin.web.interfaces.HttpResponse; +import cn.hserver.mvc.annotation.Controller; +import cn.hserver.mvc.annotation.router.GET; +import cn.hserver.mvc.request.Request; +import cn.hserver.mvc.response.Response; import com.test.hserver.bean.Fortune; import com.test.hserver.bean.Message; import com.test.hserver.bean.World; import com.test.hserver.util.DateUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.sql.DataSource; import java.sql.Connection; @@ -34,19 +32,19 @@ public class TestController { private DataSource dataSource; @GET("/json") - public Message json(HttpResponse response) { - response.setHeader("Date", DateUtil.getTime()); + public Message json(Response response) { + response.addHeader("Date", DateUtil.getTime()); return new Message(); } @GET("/plaintext") - public String plaintext(HttpResponse response) { - response.setHeader("Date", DateUtil.getTime()); + public String plaintext(Response response) { + response.addHeader("Date", DateUtil.getTime()); return HELLO; } @GET("/db") - public void db(HttpResponse response) throws SQLException { + public void db(Response response) throws SQLException { World result; try (Connection conn = dataSource.getConnection()) { try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) { @@ -57,12 +55,12 @@ public void db(HttpResponse response) throws SQLException { } } } - response.setHeader("Date", DateUtil.getTime()); + response.addHeader("Date", DateUtil.getTime()); response.sendJson(result); } @GET("/queries") - public void queries(HttpRequest request,HttpResponse response) throws Exception { + public void queries(Request request, Response response) throws Exception { World[] result = new World[getQueries(request.query("queries"))]; try (Connection conn = dataSource.getConnection()) { for (int i = 0; i < result.length; i++) { @@ -75,13 +73,13 @@ public void queries(HttpRequest request,HttpResponse response) throws Exception } } } - response.setHeader("Date", DateUtil.getTime()); + response.addHeader("Date", DateUtil.getTime()); response.sendJson(result); } @GET("/updates") - public void updates(HttpRequest request,HttpResponse response) throws Exception { + public void updates(Request request,Response response) throws Exception { World[] result = new World[getQueries(request.query("queries"))]; StringJoiner updateSql = new StringJoiner( ", ", @@ -110,12 +108,12 @@ public void updates(HttpRequest request,HttpResponse response) throws Exception statement.executeUpdate(); } } - response.setHeader("Date", DateUtil.getTime()); + response.addHeader("Date", DateUtil.getTime()); response.sendJson(result); } @GET("/fortunes") - public void fortunes(HttpResponse response) throws Exception { + public void fortunes(Response response) throws Exception { List fortunes = new ArrayList<>(); try (Connection connection = dataSource.getConnection()) { try (PreparedStatement stt = connection.prepareStatement("select * from fortune")) { @@ -128,7 +126,7 @@ public void fortunes(HttpResponse response) throws Exception { } fortunes.add(new Fortune(0, "Additional fortune added at request time.")); Collections.sort(fortunes); - response.setHeader("Date", DateUtil.getTime()); + response.addHeader("Date", DateUtil.getTime()); Map data=new HashMap<>(); data.put("data",fortunes); response.sendTemplate("fortunes.ftl",data); diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java index 0fee7b56b1c..9781d6d3fbd 100644 --- a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java @@ -1,8 +1,8 @@ package com.test.hserver.db; +import cn.hserver.core.config.annotation.Configuration; import cn.hserver.core.ioc.annotation.Autowired; import cn.hserver.core.ioc.annotation.Bean; -import cn.hserver.core.ioc.annotation.Configuration; import com.zaxxer.hikari.HikariDataSource; import javax.sql.DataSource; diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java index 57c08ea4b25..420c8a78ce1 100644 --- a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java @@ -1,7 +1,7 @@ package com.test.hserver.db; -import cn.hserver.core.ioc.annotation.ConfigurationProperties; +import cn.hserver.core.config.annotation.ConfigurationProperties; @ConfigurationProperties public class PostgresConfig { diff --git a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java index a1f866b2d89..0390b60971a 100644 --- a/frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java +++ b/frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java @@ -1,10 +1,10 @@ package com.test.hserver.task; -import cn.hserver.core.ioc.annotation.Bean; -import cn.hserver.core.ioc.annotation.Task; +import cn.hserver.core.ioc.annotation.Component; +import cn.hserver.core.scheduling.annotation.Task; import com.test.hserver.util.DateUtil; -@Bean +@Component public class TimeAdd { @Task(name = "时间计算", time = "1000") diff --git a/frameworks/Java/hserver-business/src/main/resources/app.properties b/frameworks/Java/hserver-business/src/main/resources/app.properties index 11b8d560772..39bb1a65409 100644 --- a/frameworks/Java/hserver-business/src/main/resources/app.properties +++ b/frameworks/Java/hserver-business/src/main/resources/app.properties @@ -4,3 +4,4 @@ password= benchmarkdbpass maximumPoolSize= 256 log=info +netty.pool= 64 diff --git a/frameworks/Java/hserver/pom.xml b/frameworks/Java/hserver/pom.xml index 1778ca9db75..3aba63dfa4b 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -11,8 +11,9 @@ hserver-parent cn.hserver - 3.7.0 + 4.0.0-beta.3 + UTF-8 3.3.1 @@ -20,15 +21,14 @@ - - hserver + hserver-web-starter cn.hserver - - hserver-plugin-web - cn.hserver + org.slf4j + slf4j-api + 2.0.17 com.zaxxer @@ -44,7 +44,7 @@ - hserver-plugin-maven + hserver-maven cn.hserver diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java index b4e215081da..3ee44fa000c 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/StartApp.java @@ -1,10 +1,10 @@ package com.test.hserver; -import cn.hserver.HServerApplication; -import cn.hserver.core.ioc.annotation.HServerBoot; -import cn.hserver.core.server.context.ConstConfig; - +import cn.hserver.core.boot.HServerApplication; +import cn.hserver.core.boot.annotation.HServerBoot; +import cn.hserver.mvc.server.WebServer; +import com.test.hserver.controller.TestController; /** * @author hxm @@ -13,6 +13,14 @@ public class StartApp { public static void main(String[] args) { - HServerApplication.run(StartApp.class, 8888, args); + WebServer.router + .get("/json", TestController::json) + .get("/plaintext", TestController::plaintext) + .get("/db", TestController::db) + .get("/queries", TestController::queries) + .get("/updates", TestController::updates) + .get("/fortunes", TestController::fortunes) + ; + HServerApplication.run(StartApp.class, args); } } diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java index 8055d476a55..7bea7268f33 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java @@ -1,17 +1,12 @@ package com.test.hserver.controller; -import cn.hserver.core.ioc.annotation.Autowired; -import cn.hserver.plugin.web.annotation.Controller; -import cn.hserver.plugin.web.annotation.GET; -import cn.hserver.plugin.web.interfaces.HttpRequest; -import cn.hserver.plugin.web.interfaces.HttpResponse; +import cn.hserver.core.context.IocApplicationContext; + +import cn.hserver.mvc.context.WebContext; import com.test.hserver.bean.Fortune; import com.test.hserver.bean.Message; import com.test.hserver.bean.World; import com.test.hserver.util.DateUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; @@ -25,37 +20,34 @@ /** * @author hxm */ -@Controller public class TestController { private static final String HELLO = "Hello, World!"; private static final String SELECT_WORLD = "select * from world where id=?"; - @Autowired - private DataSource dataSource; - + private static DataSource dataSource; - @GET("/jso2n") - private Message jso2n(long ud,int a,HttpResponse response) { - response.setHeader("Date", DateUtil.getTime()); - return new Message(); + public static DataSource getDataSource() { + if (dataSource == null) { + dataSource= IocApplicationContext.getBean(DataSource.class); + } + return dataSource; } - @GET("/json") - public Message json(HttpResponse response) { - response.setHeader("Date", DateUtil.getTime()); - return new Message(); + + public static void json(WebContext webContext) { + webContext.response.addHeader("Date", DateUtil.getTime()); + webContext.response.sendJson(new Message()); } - @GET("/plaintext") - public String plaintext(HttpResponse response) { - response.setHeader("Date", DateUtil.getTime()); - return HELLO; + public static void plaintext(WebContext webContext) { + webContext.response.addHeader("Date", DateUtil.getTime()); + webContext.response.sendText(HELLO); + } - @GET("/db") - public void db(HttpResponse response) throws SQLException { + public static void db(WebContext webContext) throws SQLException { World result; - try (Connection conn = dataSource.getConnection()) { + try (Connection conn = getDataSource().getConnection()) { try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) { statement.setInt(1, randomWorld()); try (ResultSet rs = statement.executeQuery()) { @@ -64,14 +56,13 @@ public void db(HttpResponse response) throws SQLException { } } } - response.setHeader("Date", DateUtil.getTime()); - response.sendJson(result); + webContext.response.addHeader("Date", DateUtil.getTime()); + webContext.response.sendJson(result); } - @GET("/queries") - public void queries(HttpRequest request,HttpResponse response) throws Exception { - World[] result = new World[getQueries(request.query("queries"))]; - try (Connection conn = dataSource.getConnection()) { + public static void queries(WebContext webContext) throws Exception { + World[] result = new World[getQueries(webContext.request.query("queries"))]; + try (Connection conn = getDataSource().getConnection()) { for (int i = 0; i < result.length; i++) { try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) { statement.setInt(1, randomWorld()); @@ -82,20 +73,19 @@ public void queries(HttpRequest request,HttpResponse response) throws Exception } } } - response.setHeader("Date", DateUtil.getTime()); - response.sendJson(result); + webContext.response.addHeader("Date", DateUtil.getTime()); + webContext.response.sendJson(result); } - @GET("/updates") - public void updates(HttpRequest request,HttpResponse response) throws Exception { - World[] result = new World[getQueries(request.query("queries"))]; + public static void updates(WebContext webContext) throws Exception { + World[] result = new World[getQueries(webContext.request.query("queries"))]; StringJoiner updateSql = new StringJoiner( ", ", "UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ", " ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id"); - try (Connection connection = dataSource.getConnection()) { + try (Connection connection = getDataSource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement(SELECT_WORLD)) { for (int i = 0; i < result.length; i++) { statement.setInt(1, randomWorld()); @@ -117,14 +107,13 @@ public void updates(HttpRequest request,HttpResponse response) throws Exception statement.executeUpdate(); } } - response.setHeader("Date", DateUtil.getTime()); - response.sendJson(result); + webContext.response.addHeader("Date", DateUtil.getTime()); + webContext.response.sendJson(result); } - @GET("/fortunes") - public void fortunes(HttpResponse response) throws Exception { + public static void fortunes(WebContext webContext) throws Exception { List fortunes = new ArrayList<>(); - try (Connection connection = dataSource.getConnection()) { + try (Connection connection = getDataSource().getConnection()) { try (PreparedStatement stt = connection.prepareStatement("select * from fortune")) { try (ResultSet rs = stt.executeQuery()) { while (rs.next()) { @@ -135,9 +124,9 @@ public void fortunes(HttpResponse response) throws Exception { } fortunes.add(new Fortune(0, "Additional fortune added at request time.")); Collections.sort(fortunes); - response.setHeader("Date", DateUtil.getTime()); + webContext.response.addHeader("Date", DateUtil.getTime()); Map data=new HashMap<>(); data.put("data",fortunes); - response.sendTemplate("fortunes.ftl",data); + webContext.response.sendTemplate("fortunes.ftl",data); } } diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/db/DataSourceConfig.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/db/DataSourceConfig.java index 0fee7b56b1c..9781d6d3fbd 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/db/DataSourceConfig.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/db/DataSourceConfig.java @@ -1,8 +1,8 @@ package com.test.hserver.db; +import cn.hserver.core.config.annotation.Configuration; import cn.hserver.core.ioc.annotation.Autowired; import cn.hserver.core.ioc.annotation.Bean; -import cn.hserver.core.ioc.annotation.Configuration; import com.zaxxer.hikari.HikariDataSource; import javax.sql.DataSource; diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/db/PostgresConfig.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/db/PostgresConfig.java index 57c08ea4b25..420c8a78ce1 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/db/PostgresConfig.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/db/PostgresConfig.java @@ -1,7 +1,7 @@ package com.test.hserver.db; -import cn.hserver.core.ioc.annotation.ConfigurationProperties; +import cn.hserver.core.config.annotation.ConfigurationProperties; @ConfigurationProperties public class PostgresConfig { diff --git a/frameworks/Java/hserver/src/main/java/com/test/hserver/task/TimeAdd.java b/frameworks/Java/hserver/src/main/java/com/test/hserver/task/TimeAdd.java index a1f866b2d89..0390b60971a 100644 --- a/frameworks/Java/hserver/src/main/java/com/test/hserver/task/TimeAdd.java +++ b/frameworks/Java/hserver/src/main/java/com/test/hserver/task/TimeAdd.java @@ -1,10 +1,10 @@ package com.test.hserver.task; -import cn.hserver.core.ioc.annotation.Bean; -import cn.hserver.core.ioc.annotation.Task; +import cn.hserver.core.ioc.annotation.Component; +import cn.hserver.core.scheduling.annotation.Task; import com.test.hserver.util.DateUtil; -@Bean +@Component public class TimeAdd { @Task(name = "时间计算", time = "1000") diff --git a/frameworks/Java/hserver/src/main/resources/app.properties b/frameworks/Java/hserver/src/main/resources/app.properties index 1a3bd9c7ae7..4fa6afbf7cc 100644 --- a/frameworks/Java/hserver/src/main/resources/app.properties +++ b/frameworks/Java/hserver/src/main/resources/app.properties @@ -3,5 +3,4 @@ username= benchmarkdbuser password= benchmarkdbpass maximumPoolSize= 256 -log=info -web.businessPool=-1 +log=info \ No newline at end of file From d4b92e91fdb4bb81be10030cf7d225488a40dcdc Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 19 Aug 2025 20:34:41 +0200 Subject: [PATCH 1572/1766] [php] Wolff simplify code (#10061) --- frameworks/PHP/wolff/app/controllers/Home.php | 38 ++++++------------- frameworks/PHP/wolff/system/web.php | 5 +-- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/frameworks/PHP/wolff/app/controllers/Home.php b/frameworks/PHP/wolff/app/controllers/Home.php index 39ce093edae..1ba61adf674 100644 --- a/frameworks/PHP/wolff/app/controllers/Home.php +++ b/frameworks/PHP/wolff/app/controllers/Home.php @@ -25,15 +25,10 @@ public function json(Request $req, Response $res) public function db(Request $req, Response $res) { - $random_id = mt_rand(1, 10000); - /** @var \Wolff\Core\DB */ - $db = Container::get('db'); - $row = $db->select('World', 'id = ?', $random_id)[0]; + $row = Container::get('db')->select('World', 'id = ?', mt_rand(1, 10000))[0]; + $res->setHeader('Content-Type', 'application/json'); - $res->writeJson([ - 'id' => $row['id'], - 'randomNumber' => $row['randomNumber'] - ]); + $res->writeJson($row); } public function queries(Request $req, Response $res) @@ -50,13 +45,7 @@ public function queries(Request $req, Response $res) $worlds = []; for ($i = 0; $i < $queries; ++$i) { - $random_id = mt_rand(1, 10000); - $row = $db->select('World', 'id = ?', $random_id)[0]; - $world = [ - 'id' => $row['id'], - 'randomNumber' => $row['randomNumber'] - ]; - $worlds[] = $world; + $worlds[] = $db->select('World', 'id = ?', mt_rand(1, 10000))[0]; } $res->setHeader('Content-Type', 'application/json'); $res->writeJson($worlds); @@ -80,11 +69,10 @@ public function update(Request $req, Response $res) $random_update_id = mt_rand(1, 10000); $row = $db->select('World', 'id = ?', $random_id)[0]; $db->query('UPDATE World SET randomNumber = ? WHERE id = ?', $random_update_id, $row['id']); - $world = [ - 'id' => $row['id'], - 'randomNumber' => $random_update_id - ]; - $worlds[] = $world; + $worlds[] = [ + 'id' => $row['id'], + 'randomNumber' => $random_update_id + ]; } $res->setHeader('Content-Type', 'application/json'); $res->writeJson($worlds); @@ -93,14 +81,10 @@ public function update(Request $req, Response $res) public function fortunes(Request $req, Response $res) { - /** @var \Wolff\Core\DB */ - $db = Container::get('db'); - - $fortunes = $db->select('Fortune'); + $fortunes = Container::get('db')->select('Fortune'); $fortunes[] = [ 'id' => 0, 'message' => 'Additional fortune added at request time.' ]; - usort($fortunes, function ($left, $right) { - return $left['message'] <=> $right['message']; - }); + usort($fortunes, fn($left, $right) => $left['message'] <=> $right['message'] ); + $res->setHeader('Content-Type', 'text/html; charset=utf-8'); View::render('fortunes', [ 'fortunes' => $fortunes, diff --git a/frameworks/PHP/wolff/system/web.php b/frameworks/PHP/wolff/system/web.php index 4c94a4a4607..5797eff92f3 100644 --- a/frameworks/PHP/wolff/system/web.php +++ b/frameworks/PHP/wolff/system/web.php @@ -14,6 +14,5 @@ Route::get('/update', [ Controller\Home::class, 'update' ]); Route::get('/fortunes', [ Controller\Home::class, 'fortunes' ]); -Container::singleton('db', function() { - return new \Wolff\Core\DB; -}); + +Container::singleton('db', fn() => new \Wolff\Core\DB ); From 6b5a3025f5329abfeac1414e84feb36236a76f64 Mon Sep 17 00:00:00 2001 From: silnex <24711610+silnex@users.noreply.github.com> Date: Wed, 20 Aug 2025 02:37:31 +0800 Subject: [PATCH 1573/1766] Adds support for Hypervel (#10058) * init hypervel * Hypervel Benchmark * Dockerfile: optimize composer installation and artisan commands * Delete useless files --- frameworks/PHP/hypervel/.env | 27 +++ frameworks/PHP/hypervel/README.md | 42 ++++ .../PHP/hypervel/app/Console/Kernel.php | 26 +++ .../PHP/hypervel/app/Exceptions/Handler.php | 38 ++++ .../Http/Controllers/AbstractController.php | 9 + .../app/Http/Controllers/IndexController.php | 87 ++++++++ frameworks/PHP/hypervel/app/Http/Kernel.php | 73 +++++++ .../PHP/hypervel/app/Models/Fortune.php | 14 ++ frameworks/PHP/hypervel/app/Models/Model.php | 12 ++ frameworks/PHP/hypervel/app/Models/User.php | 20 ++ frameworks/PHP/hypervel/app/Models/World.php | 14 ++ .../app/Providers/AppServiceProvider.php | 18 ++ .../app/Providers/RouteServiceProvider.php | 34 +++ frameworks/PHP/hypervel/artisan | 26 +++ frameworks/PHP/hypervel/benchmark_config.json | 28 +++ frameworks/PHP/hypervel/bootstrap/app.php | 40 ++++ frameworks/PHP/hypervel/composer.json | 100 +++++++++ frameworks/PHP/hypervel/config.toml | 19 ++ frameworks/PHP/hypervel/config/app.php | 171 +++++++++++++++ frameworks/PHP/hypervel/config/cache.php | 103 +++++++++ frameworks/PHP/hypervel/config/database.php | 137 ++++++++++++ frameworks/PHP/hypervel/config/logging.php | 140 +++++++++++++ frameworks/PHP/hypervel/config/queue.php | 137 ++++++++++++ frameworks/PHP/hypervel/config/server.php | 45 ++++ frameworks/PHP/hypervel/config/view.php | 20 ++ frameworks/PHP/hypervel/config/watcher.php | 17 ++ .../database/factories/UserFactory.php | 16 ++ .../2023_08_03_000000_create_users_table.php | 32 +++ .../database/seeders/DatabaseSeeder.php | 21 ++ frameworks/PHP/hypervel/hypervel.dockerfile | 22 ++ .../PHP/hypervel/lang/en/validation.php | 197 ++++++++++++++++++ frameworks/PHP/hypervel/phpunit.xml.dist | 30 +++ frameworks/PHP/hypervel/public/robots.txt | 2 + .../resources/views/fortunes.blade.php | 13 ++ frameworks/PHP/hypervel/routes/api.php | 8 + frameworks/PHP/hypervel/routes/channels.php | 20 ++ frameworks/PHP/hypervel/routes/console.php | 23 ++ frameworks/PHP/hypervel/routes/web.php | 13 ++ .../hypervel/tests/Feature/ExampleTest.php | 20 ++ .../tests/Feature/RefreshDatabaseTest.php | 39 ++++ frameworks/PHP/hypervel/tests/TestCase.php | 13 ++ .../PHP/hypervel/tests/Unit/ExampleTest.php | 22 ++ frameworks/PHP/hypervel/tests/bootstrap.php | 38 ++++ frameworks/PHP/hypervel/tests/helpers.php | 15 ++ 44 files changed, 1941 insertions(+) create mode 100644 frameworks/PHP/hypervel/.env create mode 100644 frameworks/PHP/hypervel/README.md create mode 100644 frameworks/PHP/hypervel/app/Console/Kernel.php create mode 100644 frameworks/PHP/hypervel/app/Exceptions/Handler.php create mode 100644 frameworks/PHP/hypervel/app/Http/Controllers/AbstractController.php create mode 100644 frameworks/PHP/hypervel/app/Http/Controllers/IndexController.php create mode 100644 frameworks/PHP/hypervel/app/Http/Kernel.php create mode 100644 frameworks/PHP/hypervel/app/Models/Fortune.php create mode 100644 frameworks/PHP/hypervel/app/Models/Model.php create mode 100644 frameworks/PHP/hypervel/app/Models/User.php create mode 100644 frameworks/PHP/hypervel/app/Models/World.php create mode 100644 frameworks/PHP/hypervel/app/Providers/AppServiceProvider.php create mode 100644 frameworks/PHP/hypervel/app/Providers/RouteServiceProvider.php create mode 100644 frameworks/PHP/hypervel/artisan create mode 100644 frameworks/PHP/hypervel/benchmark_config.json create mode 100644 frameworks/PHP/hypervel/bootstrap/app.php create mode 100644 frameworks/PHP/hypervel/composer.json create mode 100644 frameworks/PHP/hypervel/config.toml create mode 100644 frameworks/PHP/hypervel/config/app.php create mode 100644 frameworks/PHP/hypervel/config/cache.php create mode 100644 frameworks/PHP/hypervel/config/database.php create mode 100644 frameworks/PHP/hypervel/config/logging.php create mode 100644 frameworks/PHP/hypervel/config/queue.php create mode 100644 frameworks/PHP/hypervel/config/server.php create mode 100644 frameworks/PHP/hypervel/config/view.php create mode 100644 frameworks/PHP/hypervel/config/watcher.php create mode 100644 frameworks/PHP/hypervel/database/factories/UserFactory.php create mode 100644 frameworks/PHP/hypervel/database/migrations/2023_08_03_000000_create_users_table.php create mode 100644 frameworks/PHP/hypervel/database/seeders/DatabaseSeeder.php create mode 100644 frameworks/PHP/hypervel/hypervel.dockerfile create mode 100644 frameworks/PHP/hypervel/lang/en/validation.php create mode 100644 frameworks/PHP/hypervel/phpunit.xml.dist create mode 100644 frameworks/PHP/hypervel/public/robots.txt create mode 100644 frameworks/PHP/hypervel/resources/views/fortunes.blade.php create mode 100644 frameworks/PHP/hypervel/routes/api.php create mode 100644 frameworks/PHP/hypervel/routes/channels.php create mode 100644 frameworks/PHP/hypervel/routes/console.php create mode 100644 frameworks/PHP/hypervel/routes/web.php create mode 100644 frameworks/PHP/hypervel/tests/Feature/ExampleTest.php create mode 100644 frameworks/PHP/hypervel/tests/Feature/RefreshDatabaseTest.php create mode 100644 frameworks/PHP/hypervel/tests/TestCase.php create mode 100644 frameworks/PHP/hypervel/tests/Unit/ExampleTest.php create mode 100644 frameworks/PHP/hypervel/tests/bootstrap.php create mode 100644 frameworks/PHP/hypervel/tests/helpers.php diff --git a/frameworks/PHP/hypervel/.env b/frameworks/PHP/hypervel/.env new file mode 100644 index 00000000000..ed082ec88c7 --- /dev/null +++ b/frameworks/PHP/hypervel/.env @@ -0,0 +1,27 @@ +APP_NAME=Hypervel +APP_ENV=production +APP_DEBUG=false +APP_KEY=base64:bZw/z/v+8K+n5GzPy/3hZkTlV/t2IOET7AGNmqO8W4E= + +LOG_CHANNEL=stdout + +DB_CONNECTION=mysql +DB_HOST=tfb-database +DB_PORT=3306 +DB_DATABASE=hello_world +DB_USERNAME=benchmarkdbuser +DB_PASSWORD=benchmarkdbpass + +SESSION_DRIVER=array +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_DRIVER=null + +CACHE_DRIVER=file + +QUEUE_DRIVER=sync + +JWT_SECRET= \ No newline at end of file diff --git a/frameworks/PHP/hypervel/README.md b/frameworks/PHP/hypervel/README.md new file mode 100644 index 00000000000..ca3a7d0e76b --- /dev/null +++ b/frameworks/PHP/hypervel/README.md @@ -0,0 +1,42 @@ +

      + +

      +Build Status +Total Downloads +Latest Stable Version +License +

      + +## Introduction + +**Hypervel** is a Laravel-style PHP framework with native coroutine support for ultra-high performance. + +Hypervel ports many core components from Laravel while maintaining familiar usage patterns, making it instantly accessible to Laravel developers. The framework combines the elegant and expressive development experience of Laravel with the powerful performance benefits of coroutine-based programming. If you're a Laravel developer, you'll feel right at home with this framework, requiring minimal learning curve. + +This is an ideal choice for building microservices, API gateways, and high-concurrency applications where traditional PHP frameworks often encounter performance constraints. + +## Why Hypervel? + +While Laravel Octane impressively enhances your Laravel application's performance, it's crucial to understand the nature of modern web applications. In most cases, the majority of latency stems from I/O operations, such as file operations, database queries, and API requests. + +However, Laravel doesn't support coroutines - the entire framework is designed for a blocking I/O environment. Applications heavily dependent on I/O operations will still face performance bottlenecks. Consider this scenario: + +Imagine building an AI-powered chatbot where each conversation API takes 3-5 seconds to respond. With 10 workers in Laravel Octane receiving 10 concurrent requests, all workers would be blocked until these requests complete. + +> You can see [benchmark comparison](https://hypervel.org/docs/introduction.html#benchmark) between Laravel Octane and Hypervel + +Even with Laravel Octane's improvements, your application's concurrent request handling capacity remains constrained by I/O operation duration. Hypervel addresses this limitation through coroutines, enabling efficient handling of concurrent I/O operations without blocking workers. This approach significantly enhances performance and concurrency for I/O-intensive applications. + +> See [this issue](https://github.com/laravel/octane/issues/765) for more discussions. + +## Documentation + +[https://hypervel.org/docs](https://hypervel.org/docs) + +Hypervel provides comprehensive and user-friendly documentation that allows you to quickly get started. From this documentation, you can learn how to use various components in Hypervel and understand the differences between this framework and Laravel. + +> Most of the content in this documentation is referenced from the official Laravel documentation. We appreciate the Laravel community's contributions. + +## License + +The Hypervel framework is open-sourced software licensed under the [MIT](https://opensource.org/licenses/MIT) license. \ No newline at end of file diff --git a/frameworks/PHP/hypervel/app/Console/Kernel.php b/frameworks/PHP/hypervel/app/Console/Kernel.php new file mode 100644 index 00000000000..920b99ae538 --- /dev/null +++ b/frameworks/PHP/hypervel/app/Console/Kernel.php @@ -0,0 +1,26 @@ +command('demo:hi')->everyFiveSeconds(); + } + + public function commands(): void + { + $this->load(__DIR__ . '/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/frameworks/PHP/hypervel/app/Exceptions/Handler.php b/frameworks/PHP/hypervel/app/Exceptions/Handler.php new file mode 100644 index 00000000000..8cdb40b9f40 --- /dev/null +++ b/frameworks/PHP/hypervel/app/Exceptions/Handler.php @@ -0,0 +1,38 @@ + + */ + protected array $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + // return json when path start with `api` + $this->shouldRenderJsonWhen(function (Request $request, Throwable $e) { + return str_starts_with($path = $request->path(), 'api') + && (strlen($path) === 3 || $path[3] === '/'); + }); + + $this->reportable(function (Throwable $e) { + }); + } +} diff --git a/frameworks/PHP/hypervel/app/Http/Controllers/AbstractController.php b/frameworks/PHP/hypervel/app/Http/Controllers/AbstractController.php new file mode 100644 index 00000000000..1ca5dabd22a --- /dev/null +++ b/frameworks/PHP/hypervel/app/Http/Controllers/AbstractController.php @@ -0,0 +1,9 @@ +json(['message' => 'Hello, World!']); + } + + public function db() + { + return response()->json(World::query()->find(self::randomInt())); + } + + public function queries($queries = 1) + { + $queries = self::clamp($queries); + + $rows = []; + while ($queries--) { + $rows[] = World::query()->find(self::randomInt()); + } + + return response()->json($rows); + } + + public function fortunes() + { + $rows = Fortune::all(); + + $insert = new Fortune(); + $insert->id = 0; + $insert->message = 'Additional fortune added at request time.'; + + $rows->add($insert); + $rows = $rows->sortBy('message'); + + return response(view('fortunes', ['rows' => $rows]), 200, ['Content-Type' => 'text/html; charset=UTF-8']); + } + + public function updates($queries = 1) + { + $queries = self::clamp($queries); + + $rows = []; + + while ($queries--) { + $row = World::query()->find(self::randomInt()); + while (($randomInt = self::randomInt()) === $row->randomNumber) { + } + $row->randomNumber = $randomInt; + $row->save(); + + $rows[] = $row; + } + + return response()->json($rows); + } + + public function plaintext() + { + return response('Hello, World!', 200, ['Content-Type' => 'text/plain']); + } + + private static function randomInt() + { + return random_int(1, 10000); + } + + private static function clamp($value) + { + if (!is_numeric($value) || $value < 1) { + return 1; + } + if ($value > 500) { + return 500; + } + return (int)$value; + } +} diff --git a/frameworks/PHP/hypervel/app/Http/Kernel.php b/frameworks/PHP/hypervel/app/Http/Kernel.php new file mode 100644 index 00000000000..8e0cfe0e32b --- /dev/null +++ b/frameworks/PHP/hypervel/app/Http/Kernel.php @@ -0,0 +1,73 @@ + + */ + protected array $middleware = [ + // \App\Http\Middleware\TrimStrings::class, + // \Hypervel\Http\Middleware\HandleCors::class, + // \App\Http\Middleware\ConvertEmptyStringsToNull::class + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected array $middlewareGroups = [ + 'web' => [ + // \Hypervel\Router\Middleware\SubstituteBindings::class, + // \Hypervel\Cookie\Middleware\AddQueuedCookiesToResponse::class, + // \Hypervel\Session\Middleware\StartSession::class, + // \Hypervel\View\Middleware\ShareErrorsFromSession::class, + // \App\Http\Middleware\VerifyCsrfToken::class, + ], + + 'api' => [ + // 'throttle:60,1,api', + // \Hypervel\Router\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected array $middlewareAliases = [ + // 'auth' => \App\Http\Middleware\Authenticate::class, + // 'can' => \Hypervel\Auth\Middleware\Authorize::class, + // 'throttle' => \Hypervel\Router\Middleware\ThrottleRequests::class, + // 'bindings' => \Hypervel\Router\Middleware\SubstituteBindings::class, + // 'signed' => \App\Http\Middleware\ValidateSignature::class, + ]; + + /** + * The priority-sorted list of middleware. + * + * Forces non-global middleware to always be in the given order. + * + * @var string[] + */ + protected array $middlewarePriority = [ + // \Hypervel\Router\Middleware\ThrottleRequests::class, + // \Hypervel\Router\Middleware\SubstituteBindings::class, + // \Hypervel\Session\Middleware\StartSession::class, + // \Hypervel\View\Middleware\ShareErrorsFromSession::class, + // \App\Http\Middleware\VerifyCsrfToken::class, + ]; +} diff --git a/frameworks/PHP/hypervel/app/Models/Fortune.php b/frameworks/PHP/hypervel/app/Models/Fortune.php new file mode 100644 index 00000000000..6ee000d9693 --- /dev/null +++ b/frameworks/PHP/hypervel/app/Models/Fortune.php @@ -0,0 +1,14 @@ + 'api'] + ); + + Route::group( + '/', + base_path('routes/web.php'), + ['middleware' => 'web'] + ); + } +} diff --git a/frameworks/PHP/hypervel/artisan b/frameworks/PHP/hypervel/artisan new file mode 100644 index 00000000000..ba8a7340ac6 --- /dev/null +++ b/frameworks/PHP/hypervel/artisan @@ -0,0 +1,26 @@ +#!/usr/bin/env php +get(Hyperf\Contract\ApplicationInterface::class); + $application->run(); +})(); diff --git a/frameworks/PHP/hypervel/benchmark_config.json b/frameworks/PHP/hypervel/benchmark_config.json new file mode 100644 index 00000000000..fae8242ba6f --- /dev/null +++ b/frameworks/PHP/hypervel/benchmark_config.json @@ -0,0 +1,28 @@ +{ + "framework": "hypervel", + "tests": [{ + "default": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "fortune_url": "/fortunes", + "update_url": "/updates/", + "plaintext_url": "/plaintext", + "port": 9501, + "approach": "Realistic", + "classification": "Fullstack", + "database": "MySQL", + "framework": "lypervel", + "language": "PHP", + "flavor": "PHP8", + "orm": "Full", + "platform": "swoole", + "webserver": "none", + "os": "Linux", + "database_os": "Linux", + "display_name": "hypervel", + "notes": "", + "versus": "swoole" + } + }] +} diff --git a/frameworks/PHP/hypervel/bootstrap/app.php b/frameworks/PHP/hypervel/bootstrap/app.php new file mode 100644 index 00000000000..bb8615ddd96 --- /dev/null +++ b/frameworks/PHP/hypervel/bootstrap/app.php @@ -0,0 +1,40 @@ +bind( + Hypervel\Foundation\Console\Contracts\Kernel::class, + App\Console\Kernel::class +); + +$app->bind( + Hypervel\Foundation\Exceptions\Contracts\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +Hypervel\Context\ApplicationContext::setContainer($app); + +return $app; diff --git a/frameworks/PHP/hypervel/composer.json b/frameworks/PHP/hypervel/composer.json new file mode 100644 index 00000000000..d877dcae4e7 --- /dev/null +++ b/frameworks/PHP/hypervel/composer.json @@ -0,0 +1,100 @@ +{ + "name": "hypervel/hypervel", + "type": "project", + "keywords": [ + "php", + "swoole", + "framework", + "hyperf", + "microservice", + "laravel", + "hypervel" + ], + "description": "A Laravel-style PHP framework with native coroutine support for ultra-high performance.", + "license": "MIT", + "require": { + "php": ">=8.2", + "friendsofhyperf/tinker": "~3.1.0", + "hypervel/framework": "^0.2" + }, + "require-dev": { + "fakerphp/faker": "^1.24.1", + "filp/whoops": "^2.15", + "friendsofphp/php-cs-fixer": "^3.57.2", + "hyperf/testing": "~3.1.0", + "hyperf/watcher": "~3.1.0", + "hypervel/devtool": "^0.2", + "mockery/mockery": "1.6.x-dev", + "nunomaduro/collision": "^8.5", + "phpstan/phpstan": "^1.11.5", + "phpunit/phpunit": "10.5.45", + "swoole/ide-helper": "~5.1.0" + }, + "autoload": { + "psr-4": { + "App\\": "app/" + }, + "files": [] + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + }, + "files": [ + "tests/helpers.php" + ] + }, + "minimum-stability": "dev", + "prefer-stable": true, + "suggest": { + "ext-redis": "Required to use Redis-based drivers, such as cache, session, queue, etc.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-hash": "Required to use the Filesystem class.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "flysystem-google-cloud-storage": "Required to use the Flysystem Google Cloud Storage driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "symfony/http-client": "Required to use the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "pda/pheanstalk": "Required to use the Beanstalk queue driver (^5.0)." + }, + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "extra": { + "hypervel": { + "dont-discover": [] + } + }, + "scripts": { + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi", + "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"", + "@php artisan migrate --graceful --ansi" + ], + "post-autoload-dump": [ + "rm -rf runtime/container" + ], + "test": "phpunit -c phpunit.xml.dist --colors=always", + "cs-diff": "php-cs-fixer fix --path-mode=intersection `git diff --name-only --diff-filter=ACMRTUXB origin/main..HEAD`", + "cs-fix": "php-cs-fixer fix $1", + "analyse": "phpstan analyse --memory-limit 300M -c phpstan.neon", + "start": [ + "Composer\\Config::disableProcessTimeout", + "php artisan start" + ] + } +} diff --git a/frameworks/PHP/hypervel/config.toml b/frameworks/PHP/hypervel/config.toml new file mode 100644 index 00000000000..29da2690e8d --- /dev/null +++ b/frameworks/PHP/hypervel/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "hypervel" + +[hypervel] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Fullstack" +database = "MySQL" +database_os = "Linux" +os = "Linux" +orm = "Full" +platform = "swoole" +webserver = "none" +versus = "swoole" diff --git a/frameworks/PHP/hypervel/config/app.php b/frameworks/PHP/hypervel/config/app.php new file mode 100644 index 00000000000..42a924312ad --- /dev/null +++ b/frameworks/PHP/hypervel/config/app.php @@ -0,0 +1,171 @@ + env('APP_NAME', 'Hypervel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set "APP_ENV" in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | Set "APP_DEBUG" in your ".env" file. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Cacheable Flag for Annotations Scanning + |-------------------------------------------------------------------------- + | + | Enabling this option will cache the annotations scanning result. It + | can boost the performance of the framework initialization. + | Please disable it in the development environment. + | + */ + 'scan_cacheable' => env('SCAN_CACHEABLE', false), + + /* + |-------------------------------------------------------------------------- + | Log Levels for StdoutLogger + |-------------------------------------------------------------------------- + | + | This value only determines the log levels that are written to the stdout logger. + | It does not affect the log levels that are written to the other loggers. + | + */ + 'stdout_log_level' => [ + LogLevel::ALERT, + LogLevel::CRITICAL, + // LogLevel::DEBUG, + LogLevel::EMERGENCY, + LogLevel::ERROR, + LogLevel::INFO, + LogLevel::NOTICE, + LogLevel::WARNING, + ], + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => env('APP_TIMEZONE', 'UTC'), + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', env('APP_PREVIOUS_KEYS', '')) + ), + ], + + 'providers' => ServiceProvider::defaultProviders()->merge([ + /* + * Package Service Providers... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + // App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + // 'Example' => App\Facades\Example::class, + ])->toArray(), +]; diff --git a/frameworks/PHP/hypervel/config/cache.php b/frameworks/PHP/hypervel/config/cache.php new file mode 100644 index 00000000000..b07273025b7 --- /dev/null +++ b/frameworks/PHP/hypervel/config/cache.php @@ -0,0 +1,103 @@ + env('CACHE_DRIVER', 'array'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "file", "redis", "swoole", "stack", "null" + | + */ + + 'stores' => [ + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('cache/data'), + 'lock_path' => storage_path('cache/data'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'lock_connection' => 'default', + ], + + 'swoole' => [ + 'driver' => 'swoole', + 'table' => 'default', + 'memory_limit_buffer' => 0.05, + 'eviction_policy' => SwooleStore::EVICTION_POLICY_LRU, + 'eviction_proportion' => 0.05, + 'eviction_interval' => 10000, // milliseconds + ], + + 'stack' => [ + 'driver' => 'stack', + 'stores' => [ + 'swoole' => [ + 'ttl' => 3, // seconds + ], + 'redis', + ], + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION', env('DB_CONNECTION', 'default')), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE', 'cache_locks'), + 'lock_lottery' => [2, 100], + 'lock_timeout' => 86400, + ], + ], + + 'swoole_tables' => [ + 'default' => [ + 'rows' => 1024, + 'bytes' => 10240, + 'conflict_proportion' => 0.2, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'hypervel'), '_') . '_cache'), +]; diff --git a/frameworks/PHP/hypervel/config/database.php b/frameworks/PHP/hypervel/config/database.php new file mode 100644 index 00000000000..14f2b3ae2b4 --- /dev/null +++ b/frameworks/PHP/hypervel/config/database.php @@ -0,0 +1,137 @@ + env('DB_CONNECTION', 'mysql'), + + 'connections' => [ + 'mysql' => [ + 'driver' => env('DB_DRIVER', 'mysql'), + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'hypervel'), + 'port' => env('DB_PORT', 3306), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => env('DB_PREFIX', ''), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => env('DB_MAX_CONNECTIONS', 10), + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60), + ], + ], + + 'pgsql' => [ + 'driver' => env('DB_DRIVER', 'pgsql'), + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'hypervel'), + 'schema' => env('DB_SCHEMA', 'public'), + 'port' => env('DB_PORT', 5432), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => env('DB_MAX_CONNECTIONS', 10), + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60), + ], + ], + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'sqlite_testing' => [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + 'options' => [ + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'hypervel'), '_') . '_database_'), + ], + + 'default' => [ + 'host' => env('REDIS_HOST', 'localhost'), + 'auth' => env('REDIS_AUTH', null), + 'port' => (int) env('REDIS_PORT', 6379), + 'db' => (int) env('REDIS_DB', 0), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => 10, + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60), + ], + ], + + 'queue' => [ + 'host' => env('REDIS_HOST', 'localhost'), + 'auth' => env('REDIS_AUTH', null), + 'port' => (int) env('REDIS_PORT', 6379), + 'db' => (int) env('REDIS_DB', 0), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => 10, + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60), + ], + ], + ], +]; diff --git a/frameworks/PHP/hypervel/config/logging.php b/frameworks/PHP/hypervel/config/logging.php new file mode 100644 index 00000000000..75c4b59727b --- /dev/null +++ b/frameworks/PHP/hypervel/config/logging.php @@ -0,0 +1,140 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/hypervel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/hypervel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stdout' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDOUT_FORMATTER'), + 'with' => [ + 'stream' => 'php://stdout', + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/hypervel.log'), + ], + ], +]; diff --git a/frameworks/PHP/hypervel/config/queue.php b/frameworks/PHP/hypervel/config/queue.php new file mode 100644 index 00000000000..6e3ba9be3e1 --- /dev/null +++ b/frameworks/PHP/hypervel/config/queue.php @@ -0,0 +1,137 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Concurrency Number + |-------------------------------------------------------------------------- + | + | This value determines the number of jobs that will be processed at once + | by every worker. + | + */ + 'concurrency_number' => env('QUEUE_CONCURRENCY_NUMBER', 1), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Hypervel. You're also free to add more. + | + | Drivers: "sync", "defer", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + 'sync' => [ + 'driver' => 'sync', + ], + + 'defer' => [ + 'driver' => 'defer', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + 'pool' => [ + 'min_objects' => 1, + 'max_objects' => 10, + 'wait_timeout' => 3.0, + 'max_lifetime' => 60.0, + ], + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + 'pool' => [ + 'min_objects' => 1, + 'max_objects' => 10, + 'wait_timeout' => 3.0, + 'max_lifetime' => 60.0, + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Hypervel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], +]; diff --git a/frameworks/PHP/hypervel/config/server.php b/frameworks/PHP/hypervel/config/server.php new file mode 100644 index 00000000000..8fe740d8b54 --- /dev/null +++ b/frameworks/PHP/hypervel/config/server.php @@ -0,0 +1,45 @@ + SWOOLE_PROCESS, + 'servers' => [ + [ + 'name' => 'http', + 'type' => Server::SERVER_HTTP, + 'host' => env('HTTP_SERVER_HOST', '0.0.0.0'), + 'port' => (int) env('HTTP_SERVER_PORT', 9501), + 'sock_type' => SWOOLE_SOCK_TCP, + 'callbacks' => [ + Event::ON_REQUEST => [HttpKernel::class, 'onRequest'], + ], + ], + ], + 'kernels' => [ + 'http' => HttpKernel::class, + ], + 'settings' => [ + 'document_root' => base_path('public'), + 'enable_static_handler' => true, + Constant::OPTION_ENABLE_COROUTINE => true, + Constant::OPTION_WORKER_NUM => env('SERVER_WORKERS_NUMBER', swoole_cpu_num()), + Constant::OPTION_PID_FILE => base_path('runtime/hypervel.pid'), + Constant::OPTION_OPEN_TCP_NODELAY => true, + Constant::OPTION_MAX_COROUTINE => 100000, + Constant::OPTION_OPEN_HTTP2_PROTOCOL => true, + Constant::OPTION_MAX_REQUEST => 100000, + Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024, + Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024, + ], + 'callbacks' => [ + Event::ON_WORKER_START => [Hyperf\Framework\Bootstrap\WorkerStartCallback::class, 'onWorkerStart'], + Event::ON_PIPE_MESSAGE => [Hyperf\Framework\Bootstrap\PipeMessageCallback::class, 'onPipeMessage'], + Event::ON_WORKER_EXIT => [Hyperf\Framework\Bootstrap\WorkerExitCallback::class, 'onWorkerExit'], + ], +]; diff --git a/frameworks/PHP/hypervel/config/view.php b/frameworks/PHP/hypervel/config/view.php new file mode 100644 index 00000000000..8c77d2746bc --- /dev/null +++ b/frameworks/PHP/hypervel/config/view.php @@ -0,0 +1,20 @@ + HyperfViewEngine::class, + 'mode' => Mode::SYNC, + 'config' => [ + 'view_path' => base_path('resources/views'), + 'cache_path' => storage_path('framework/views'), + ], + 'event' => [ + 'enable' => false, + ], + 'components' => [ + ], +]; diff --git a/frameworks/PHP/hypervel/config/watcher.php b/frameworks/PHP/hypervel/config/watcher.php new file mode 100644 index 00000000000..24b64d8f97f --- /dev/null +++ b/frameworks/PHP/hypervel/config/watcher.php @@ -0,0 +1,17 @@ + ScanFileDriver::class, + 'bin' => PHP_BINARY, + 'command' => 'artisan serve', + 'watch' => [ + 'dir' => ['app', 'config', 'routes', 'resources'], + 'file' => ['.env'], + 'scan_interval' => 2000, + ], + 'ext' => ['.php', '.env'], +]; diff --git a/frameworks/PHP/hypervel/database/factories/UserFactory.php b/frameworks/PHP/hypervel/database/factories/UserFactory.php new file mode 100644 index 00000000000..756ac304b55 --- /dev/null +++ b/frameworks/PHP/hypervel/database/factories/UserFactory.php @@ -0,0 +1,16 @@ +define(User::class, function (Faker $faker) { + return [ + 'name' => $faker->unique()->name(), + 'email' => $faker->unique()->safeEmail(), + 'email_verified_at' => Carbon::now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + ]; +}); diff --git a/frameworks/PHP/hypervel/database/migrations/2023_08_03_000000_create_users_table.php b/frameworks/PHP/hypervel/database/migrations/2023_08_03_000000_create_users_table.php new file mode 100644 index 00000000000..358effaf8b3 --- /dev/null +++ b/frameworks/PHP/hypervel/database/migrations/2023_08_03_000000_create_users_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + } +}; diff --git a/frameworks/PHP/hypervel/database/seeders/DatabaseSeeder.php b/frameworks/PHP/hypervel/database/seeders/DatabaseSeeder.php new file mode 100644 index 00000000000..7da216a82b4 --- /dev/null +++ b/frameworks/PHP/hypervel/database/seeders/DatabaseSeeder.php @@ -0,0 +1,21 @@ +create(); + + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); + } +} diff --git a/frameworks/PHP/hypervel/hypervel.dockerfile b/frameworks/PHP/hypervel/hypervel.dockerfile new file mode 100644 index 00000000000..8001546aab4 --- /dev/null +++ b/frameworks/PHP/hypervel/hypervel.dockerfile @@ -0,0 +1,22 @@ +FROM phpswoole/swoole:php8.4 + +RUN docker-php-ext-install pcntl opcache curl > /dev/null + +RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini +RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini +RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini + +WORKDIR /hypervel +COPY --link . . + +RUN mkdir -p bootstrap/cache \ + storage/logs \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache + +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet + +EXPOSE 9501 + +ENTRYPOINT ["php", "artisan", "serve"] diff --git a/frameworks/PHP/hypervel/lang/en/validation.php b/frameworks/PHP/hypervel/lang/en/validation.php new file mode 100644 index 00000000000..b535c494d6c --- /dev/null +++ b/frameworks/PHP/hypervel/lang/en/validation.php @@ -0,0 +1,197 @@ + 'The :attribute must be accepted.', + 'accepted_if' => 'The :attribute must be accepted when :other is :value.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'ascii' => 'The :attribute must only contain single-byte alphanumeric characters and symbols.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'decimal' => 'The :attribute must have :decimal decimal places.', + 'declined' => 'The :attribute must be declined.', + 'declined_if' => 'The :attribute must be declined when :other is :value.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'doesnt_end_with' => 'The :attribute must not end with one of the following: :values.', + 'doesnt_start_with' => 'The :attribute must not start with one of the following: :values.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field is required.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value', + 'file' => 'The :attribute must be greater than :value kb', + 'string' => 'The :attribute must be greater than :value characters', + 'array' => 'The :attribute must be greater than :value items', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be great than or equal to :value', + 'file' => 'The :attribute must be great than or equal to :value kb', + 'string' => 'The :attribute must be great than or equal to :value characters', + 'array' => 'The :attribute must be great than or equal to :value items', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'list' => 'The :attribute must be a list.', + 'lowercase' => 'The :attribute must be lowercase.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value', + 'file' => 'The :attribute must be less than :value kb', + 'string' => 'The :attribute must be less than :value characters', + 'array' => 'The :attribute must be less than :value items', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal to :value', + 'file' => 'The :attribute must be less than or equal to :value kb', + 'string' => 'The :attribute must be less than or equal to :value characters', + 'array' => 'The :attribute must be less than or equal to :value items', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'max_digits' => 'The :attribute must not have more than :max digits.', + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'min_digits' => 'The :attribute must have at least :min digits.', + 'missing' => 'The :attribute must be missing.', + 'missing_if' => 'The :attribute must be missing when :other is :value.', + 'missing_unless' => 'The :attribute must be missing unless :other is :value.', + 'missing_with' => 'The :attribute must be missing when :values is present.', + 'missing_with_all' => 'The :attribute must be missing when :values are present.', + 'multiple_of' => 'The :attribute must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute cannot match a given regular rule.', + 'numeric' => 'The :attribute must be a number.', + 'present' => 'The :attribute field must be present.', + 'prohibits' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'exclude' => 'The :attribute field is excluded.', + 'exclude_if' => 'The :attribute field is excluded when :other is :value.', + 'exclude_unless' => 'The :attribute field is excluded unless :other is in :values.', + 'exclude_with' => 'The :attribute field is excluded when :values is present.', + 'exclude_without' => 'The :attribute field is excluded when :values is not present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'starts_with' => 'The :attribute must be start with :values ', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'uppercase' => 'The :attribute must be uppercase.', + 'url' => 'The :attribute format is invalid.', + 'ulid' => 'The :attribute must be a valid ULID.', + 'uuid' => 'The :attribute is invalid UUID.', + 'max_if' => [ + 'numeric' => 'The :attribute may not be greater than :max when :other is :value.', + 'file' => 'The :attribute may not be greater than :max kilobytes when :other is :value.', + 'string' => 'The :attribute may not be greater than :max characters when :other is :value.', + 'array' => 'The :attribute may not have more than :max items when :other is :value.', + ], + 'min_if' => [ + 'numeric' => 'The :attribute must be at least :min when :other is :value.', + 'file' => 'The :attribute must be at least :min kilobytes when :other is :value.', + 'string' => 'The :attribute must be at least :min characters when :other is :value.', + 'array' => 'The :attribute must have at least :min items when :other is :value.', + ], + 'between_if' => [ + 'numeric' => 'The :attribute must be between :min and :max when :other is :value.', + 'file' => 'The :attribute must be between :min and :max kilobytes when :other is :value.', + 'string' => 'The :attribute must be between :min and :max characters when :other is :value.', + 'array' => 'The :attribute must have between :min and :max items when :other is :value.', + ], + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + 'phone_number' => 'The :attribute must be a valid phone number', + 'telephone_number' => 'The :attribute must be a valid telephone number', + + 'chinese_word' => 'The :attribute must contain valid characters(chinese/english character, number, underscore)', + 'sequential_array' => 'The :attribute must be sequential array', +]; diff --git a/frameworks/PHP/hypervel/phpunit.xml.dist b/frameworks/PHP/hypervel/phpunit.xml.dist new file mode 100644 index 00000000000..b151c4877dd --- /dev/null +++ b/frameworks/PHP/hypervel/phpunit.xml.dist @@ -0,0 +1,30 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + diff --git a/frameworks/PHP/hypervel/public/robots.txt b/frameworks/PHP/hypervel/public/robots.txt new file mode 100644 index 00000000000..6f27bb66a34 --- /dev/null +++ b/frameworks/PHP/hypervel/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: \ No newline at end of file diff --git a/frameworks/PHP/hypervel/resources/views/fortunes.blade.php b/frameworks/PHP/hypervel/resources/views/fortunes.blade.php new file mode 100644 index 00000000000..e8791bd34a8 --- /dev/null +++ b/frameworks/PHP/hypervel/resources/views/fortunes.blade.php @@ -0,0 +1,13 @@ + + +Fortunes + + + + + @foreach($rows as $row) + + @endforeach +
      idmessage
      {{$row->id}}{{$row->message}}
      + + \ No newline at end of file diff --git a/frameworks/PHP/hypervel/routes/api.php b/frameworks/PHP/hypervel/routes/api.php new file mode 100644 index 00000000000..7b15ec2dd59 --- /dev/null +++ b/frameworks/PHP/hypervel/routes/api.php @@ -0,0 +1,8 @@ +id === (int) $id; +}); diff --git a/frameworks/PHP/hypervel/routes/console.php b/frameworks/PHP/hypervel/routes/console.php new file mode 100644 index 00000000000..5f8ed15b28c --- /dev/null +++ b/frameworks/PHP/hypervel/routes/console.php @@ -0,0 +1,23 @@ +comment('Hypervel is awesome!'); +})->purpose('This is a demo closure command.'); + +// Schedule::command('hello')->everyFiveSeconds(); diff --git a/frameworks/PHP/hypervel/routes/web.php b/frameworks/PHP/hypervel/routes/web.php new file mode 100644 index 00000000000..bbc1cd97146 --- /dev/null +++ b/frameworks/PHP/hypervel/routes/web.php @@ -0,0 +1,13 @@ +get('/') + ->assertSuccessful(); + } +} diff --git a/frameworks/PHP/hypervel/tests/Feature/RefreshDatabaseTest.php b/frameworks/PHP/hypervel/tests/Feature/RefreshDatabaseTest.php new file mode 100644 index 00000000000..54f41f938a3 --- /dev/null +++ b/frameworks/PHP/hypervel/tests/Feature/RefreshDatabaseTest.php @@ -0,0 +1,39 @@ +create(); + + $this->assertDatabaseHas('users', [ + 'id' => $user->id, + ]); + } + + public function testCreateMultipleUsers() + { + factory(User::class, $count = 5)->create(); + + $this->assertDatabaseCount('users', $count); + } + + public function testZeroUserAfterRefresh() + { + $this->assertSame(0, User::count()); + } +} diff --git a/frameworks/PHP/hypervel/tests/TestCase.php b/frameworks/PHP/hypervel/tests/TestCase.php new file mode 100644 index 00000000000..754c7277ca5 --- /dev/null +++ b/frameworks/PHP/hypervel/tests/TestCase.php @@ -0,0 +1,13 @@ +assertTrue(true); + } +} diff --git a/frameworks/PHP/hypervel/tests/bootstrap.php b/frameworks/PHP/hypervel/tests/bootstrap.php new file mode 100644 index 00000000000..d5afa4a9b22 --- /dev/null +++ b/frameworks/PHP/hypervel/tests/bootstrap.php @@ -0,0 +1,38 @@ +get(Hyperf\Contract\ApplicationInterface::class); diff --git a/frameworks/PHP/hypervel/tests/helpers.php b/frameworks/PHP/hypervel/tests/helpers.php new file mode 100644 index 00000000000..cbd0f353a0a --- /dev/null +++ b/frameworks/PHP/hypervel/tests/helpers.php @@ -0,0 +1,15 @@ +get(ModelFactory::class) + ->factory($class, ...$arguments); + } +} From 7a345534d2ae88b574e0c2037bd71f581f1c298a Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Tue, 19 Aug 2025 23:41:07 +0100 Subject: [PATCH 1574/1766] Update the H2O-based implementations to Ubuntu 25.10 (#10062) Signed-off-by: Anton Kirilov --- frameworks/C/h2o/CMakeLists.txt | 4 +- frameworks/C/h2o/h2o.dockerfile | 42 +++++-------------- frameworks/PHP/php/php-h2o.dockerfile | 18 ++++---- .../Ruby/h2o_mruby/h2o_mruby.dockerfile | 4 +- 4 files changed, 23 insertions(+), 45 deletions(-) diff --git a/frameworks/C/h2o/CMakeLists.txt b/frameworks/C/h2o/CMakeLists.txt index 2bc33436366..37499b68ffa 100644 --- a/frameworks/C/h2o/CMakeLists.txt +++ b/frameworks/C/h2o/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.18.0) -project(h2o_app) +project(h2o-app) find_library(CRYPTO_LIB crypto REQUIRED) find_library(H2O_LIB h2o-evloop REQUIRED) find_library(MUSTACHE_C_LIB mustache_c REQUIRED) @@ -19,7 +19,7 @@ include_directories(${PQ_INCLUDE} ${YAJL_INCLUDE}) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) add_compile_definitions(H2O_USE_LIBUV=0) -set(COMMON_OPTIONS -flto -pthread) +set(COMMON_OPTIONS -flto=auto -pthread) add_compile_options(-pedantic -Wall -Wextra ${COMMON_OPTIONS}) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_FORTIFY_SOURCE=2") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 109c5e4375a..6e6e5be09aa 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -1,26 +1,16 @@ -ARG UBUNTU_VERSION=24.04 +ARG UBUNTU_VERSION=25.10 -ARG H2O_APP_PREFIX=/opt/h2o_app +ARG H2O_APP_PREFIX=/opt/h2o-app FROM "ubuntu:${UBUNTU_VERSION}" AS compile ARG DEBIAN_FRONTEND=noninteractive RUN apt-get -yqq update && \ - apt-get -yqq install \ - ca-certificates \ - curl \ - lsb-release && \ - install -dm755 /usr/share/postgresql-common/pgdg && \ - curl --fail -LSso /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \ - "https://www.postgresql.org/media/keys/ACCC4CF8.asc" && \ - sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \ - https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > \ - /etc/apt/sources.list.d/pgdg.list' && \ - apt-get -yqq update && \ apt-get -yqq install \ autoconf \ bison \ cmake \ + curl \ flex \ g++ \ libbpfcc-dev \ @@ -50,7 +40,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ cmake \ -B build \ -DCMAKE_AR=/usr/bin/gcc-ar \ - -DCMAKE_C_FLAGS="-flto -march=native -mtune=native" \ + -DCMAKE_C_FLAGS="-flto=auto -march=native -mtune=native" \ -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ -DWITH_MRUBY=on \ -G Ninja \ @@ -63,7 +53,8 @@ ARG MUSTACHE_C_REVISION=7fe52392879d0188c172d94bb4fde7c513d6b929 WORKDIR /tmp/mustache-c-build RUN curl -LSs "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISION}.tar.gz" | \ tar --strip-components=1 -xz && \ - CFLAGS="-flto -march=native -mtune=native -O3" ./autogen.sh && \ + CFLAGS="-flto=auto -march=native -mtune=native -O3 -Wno-implicit-function-declaration" \ + ./autogen.sh && \ make -j "$(nproc)" install ARG H2O_APP_PREFIX @@ -82,25 +73,12 @@ RUN cmake \ FROM "ubuntu:${UBUNTU_VERSION}" -ARG POSTGRESQL_VERSION=17 - ARG DEBIAN_FRONTEND=noninteractive RUN apt-get -yqq update && \ - apt-get -yqq install \ - ca-certificates \ - curl \ - lsb-release && \ - install -dm755 /usr/share/postgresql-common/pgdg && \ - curl --fail -LSso /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \ - "https://www.postgresql.org/media/keys/ACCC4CF8.asc" && \ - sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \ - https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > \ - /etc/apt/sources.list.d/pgdg.list' && \ - apt-get -yqq update && \ apt-get -yqq install \ libnuma1 \ - libyajl2 \ - "postgresql-client-${POSTGRESQL_VERSION}" + libpq5 \ + libyajl2 ARG H2O_APP_PREFIX COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/" COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/" @@ -113,10 +91,10 @@ ARG TFB_TEST_NAME CMD ["taskset", \ "-c", \ "0", \ - "/opt/h2o_app/bin/h2o_app", \ + "/opt/h2o-app/bin/h2o-app", \ "-a20", \ "-d", \ "dbname=hello_world host=tfb-database password=benchmarkdbpass sslmode=disable user=benchmarkdbuser", \ "-f", \ - "/opt/h2o_app/share/h2o_app/template", \ + "/opt/h2o-app/share/h2o-app/template", \ "-m1"] diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index a54bd0f8136..d7fec3d6c96 100644 --- a/frameworks/PHP/php/php-h2o.dockerfile +++ b/frameworks/PHP/php/php-h2o.dockerfile @@ -9,7 +9,7 @@ ARG H2O_VERSION=c54c63285b52421da2782f028022647fc2ea3dd1 ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX WORKDIR /tmp/h2o-build -RUN apt-get -yqq update && \ +RUN apt-get -yqq update > /dev/null && \ apt-get -yqq install \ cmake \ curl \ @@ -33,14 +33,14 @@ RUN apt-get -yqq update && \ cmake \ -B build \ -DCMAKE_AR=/usr/bin/gcc-ar \ - -DCMAKE_C_FLAGS="-flto -march=native -mtune=native" \ + -DCMAKE_C_FLAGS="-flto=auto -march=native -mtune=native" \ -DCMAKE_INSTALL_PREFIX="${H2O_PREFIX}" \ -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ -DWITH_MRUBY=on \ -G Ninja \ - -S . > /dev/null && \ + -S . > /dev/null && \ cmake --build build -j > /dev/null && \ - cmake --install build > /dev/null + cmake --install build > /dev/null FROM "ubuntu:${UBUNTU_VERSION}" @@ -49,18 +49,18 @@ ARG PHP_VERSION=8.4 ENV TZ=America/Los_Angeles ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update > /dev/null && \ +RUN apt-get -yqq update > /dev/null && \ apt-get -yqq install \ apt-utils \ - software-properties-common > /dev/null && \ + software-properties-common > /dev/null && \ LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \ - apt-get -yqq update > /dev/null && \ - apt-get -yqq install > /dev/null \ + apt-get -yqq update > /dev/null && \ + apt-get -yqq install \ "php${PHP_VERSION}" \ "php${PHP_VERSION}-cli" \ "php${PHP_VERSION}-common" \ "php${PHP_VERSION}-fpm" \ - "php${PHP_VERSION}-mysql" + "php${PHP_VERSION}-mysql" > /dev/null ARG H2O_PREFIX COPY --from=compile "${H2O_PREFIX}/bin/h2o" "${H2O_PREFIX}/bin/" COPY --from=compile "${H2O_PREFIX}/share" "${H2O_PREFIX}/share/" diff --git a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile index cdfbf5811b2..98a1b31657f 100644 --- a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile +++ b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile @@ -1,4 +1,4 @@ -ARG UBUNTU_VERSION=24.04 +ARG UBUNTU_VERSION=25.10 ARG H2O_PREFIX=/opt/h2o @@ -33,7 +33,7 @@ RUN apt-get -yqq update && \ cmake \ -B build \ -DCMAKE_AR=/usr/bin/gcc-ar \ - -DCMAKE_C_FLAGS="-flto -march=native -mtune=native" \ + -DCMAKE_C_FLAGS="-flto=auto -march=native -mtune=native" \ -DCMAKE_INSTALL_PREFIX="${H2O_PREFIX}" \ -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ -DWITH_MRUBY=on \ From 9526fa9398b26ae90631fb737ab7c1a32d66bfb2 Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Thu, 21 Aug 2025 11:56:19 -1000 Subject: [PATCH 1575/1766] upgrade to tio-boot 2.0.1 (#10063) * update to tio-boot v1.9.7 * upgrade to tio-boot v1.9.8 * upgrade to 2.0.1 --- frameworks/Java/tio-boot/pom.xml | 4 ++-- .../tio/http/server/handler/IndexHandler.java | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/frameworks/Java/tio-boot/pom.xml b/frameworks/Java/tio-boot/pom.xml index 14b3116b5b1..021e8366683 100644 --- a/frameworks/Java/tio-boot/pom.xml +++ b/frameworks/Java/tio-boot/pom.xml @@ -11,7 +11,7 @@ 1.8 ${java.version} ${java.version} - 1.9.8 + 2.0.1 com.litongjava.tio.http.server.MainApp @@ -26,7 +26,7 @@ com.litongjava java-db - 1.5.0 + 1.5.3 diff --git a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java index 27047b7344f..2122b1608e9 100644 --- a/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java +++ b/frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/handler/IndexHandler.java @@ -1,5 +1,7 @@ package com.litongjava.tio.http.server.handler; +import java.nio.charset.StandardCharsets; + import com.alibaba.fastjson2.JSON; import com.litongjava.tio.boot.http.TioRequestContext; import com.litongjava.tio.http.common.HttpRequest; @@ -8,16 +10,15 @@ import com.litongjava.tio.http.server.model.Message; /** - * ab -k -n1000000 -c10 http://127.0.0.1:8080/json - * ab -k -n1000000 -c10 http://127.0.0.1:8080/plaintext + * ab -k -n1000000 -c10 http://127.0.0.1:8080/json ab -k -n1000000 -c10 + * http://127.0.0.1:8080/plaintext */ public class IndexHandler { - private static final String HELLO_WORLD_RN = "Hello, World!\r\n"; - + private static final String HELLO_WORLD = "Hello, World!"; - private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD_RN.getBytes(); - private static byte[] JSON_BYTES = JSON.toJSONBytes(new Message(HELLO_WORLD)); + private static final byte[] HELLO_WORLD_BYTES = HELLO_WORLD.getBytes(StandardCharsets.UTF_8); + private static final byte[] JSON_BYTES = JSON.toJSONBytes(new Message(HELLO_WORLD)); public HttpResponse plaintext(HttpRequest request) { HttpResponse response = TioRequestContext.getResponse(); From 04c761601482eb1a63a18fdc78c5529983462f1b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 21 Aug 2025 23:56:39 +0200 Subject: [PATCH 1576/1766] [rails] Update stringio to 3.1.7 (#10066) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes the following error: rails: Gem::Ext::BuildError: ERROR: Failed to build gem native extension. rails: current directory: /usr/local/bundle/gems/stringio-3.1.5/ext/stringio rails: /usr/local/bin/ruby extconf.rb rails: creating Makefile rails: current directory: /usr/local/bundle/gems/stringio-3.1.5/ext/stringio rails: make DESTDIR\= sitearchdir\=./.gem.20250821-7-vydpnd rails: sitelibdir\=./.gem.20250821-7-vydpnd clean rails: current directory: /usr/local/bundle/gems/stringio-3.1.5/ext/stringio rails: make DESTDIR\= sitearchdir\=./.gem.20250821-7-vydpnd rails: sitelibdir\=./.gem.20250821-7-vydpnd rails: compiling stringio.c rails: stringio.c: In function ‘strio_init’: rails: stringio.c:295:52: error: passing argument 5 of ‘rb_io_extract_modeenc’ from rails: incompatible pointer type [-Wincompatible-pointer-types] rails: 295 | rb_io_extract_modeenc(&vmode, 0, opt, &oflags, &ptr->flags, rails: &convconfig); rails: | ^~~~~~~~~~~ rails: | | rails: | int * rails: In file included from stringio.c:21: rails: /usr/local/include/ruby-3.5.0+0/ruby/io.h:877:107: note: expected ‘enum rails: rb_io_mode *’ but argument is of type ‘int *’ rails: 877 | void rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE rails: opthash, int *oflags_p, enum rb_io_mode *fmode_p, rb_io_enc_t *convconfig_p); --- 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 b8c3c6f6156..3f986aa3f6f 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -255,7 +255,7 @@ GEM console (~> 1.0) mapping (~> 1.0) securerandom (0.4.1) - stringio (3.1.5) + stringio (3.1.7) thor (1.4.0) timeout (0.4.3) traces (0.15.2) From 095c7de84c6ee4667ff69f6c6a2b18ade47b969c Mon Sep 17 00:00:00 2001 From: Alexander Kosachev <38947781+gohryt@users.noreply.github.com> Date: Fri, 22 Aug 2025 00:57:13 +0300 Subject: [PATCH 1577/1766] Add indigo go networking framework (#9965) * Add indigo * Fix paths * Fix paths * More correct naming * Add missing headers * Rename from go to indigo * Fix logic * Do not error on n != int * Update go version * Add charset to fortunes endpoint * Update dependencies * Update code to lookup for n instead of get --- frameworks/Go/fiber/src/server_test.go | 7 +- frameworks/Go/indigo/README.md | 14 + frameworks/Go/indigo/benchmark_config.json | 31 + frameworks/Go/indigo/config.toml | 20 + frameworks/Go/indigo/indigo.dockerfile | 19 + frameworks/Go/indigo/src/app.go | 163 ++ frameworks/Go/indigo/src/database.go | 124 ++ frameworks/Go/indigo/src/go.mod | 25 + frameworks/Go/indigo/src/go.sum | 50 + frameworks/Go/indigo/src/main.go | 48 + frameworks/Go/indigo/src/models/models.go | 23 + frameworks/Go/indigo/src/templates/fortune.go | 3 + .../Go/indigo/src/templates/fortune.qtpl | 19 + .../Go/indigo/src/templates/fortune.qtpl.go | 96 ++ frameworks/Rust/may-minihttp/Cargo.lock | 1420 +++++++++++++++++ 15 files changed, 2058 insertions(+), 4 deletions(-) create mode 100644 frameworks/Go/indigo/README.md create mode 100644 frameworks/Go/indigo/benchmark_config.json create mode 100644 frameworks/Go/indigo/config.toml create mode 100644 frameworks/Go/indigo/indigo.dockerfile create mode 100644 frameworks/Go/indigo/src/app.go create mode 100644 frameworks/Go/indigo/src/database.go create mode 100644 frameworks/Go/indigo/src/go.mod create mode 100644 frameworks/Go/indigo/src/go.sum create mode 100644 frameworks/Go/indigo/src/main.go create mode 100644 frameworks/Go/indigo/src/models/models.go create mode 100644 frameworks/Go/indigo/src/templates/fortune.go create mode 100644 frameworks/Go/indigo/src/templates/fortune.qtpl create mode 100644 frameworks/Go/indigo/src/templates/fortune.qtpl.go create mode 100644 frameworks/Rust/may-minihttp/Cargo.lock diff --git a/frameworks/Go/fiber/src/server_test.go b/frameworks/Go/fiber/src/server_test.go index 84ec001a54c..3fcb783d8bb 100644 --- a/frameworks/Go/fiber/src/server_test.go +++ b/frameworks/Go/fiber/src/server_test.go @@ -1,8 +1,7 @@ package main import ( - "encoding/json" - "io/ioutil" + "io" "net/http" "net/http/httptest" "testing" @@ -37,7 +36,7 @@ func Benchmark_Plaintext(b *testing.B) { utils.AssertEqual(b, nil, err, "app.Test(req)") utils.AssertEqual(b, 200, resp.StatusCode, "Status code") utils.AssertEqual(b, fiber.MIMETextPlainCharsetUTF8, resp.Header.Get("Content-Type")) - body, _ := ioutil.ReadAll(resp.Body) + body, _ := io.ReadAll(resp.Body) utils.AssertEqual(b, helloworldRaw, body) } @@ -66,6 +65,6 @@ func Benchmark_JSON(b *testing.B) { utils.AssertEqual(b, nil, err, "app.Test(req)") utils.AssertEqual(b, 200, resp.StatusCode, "Status code") utils.AssertEqual(b, fiber.MIMEApplicationJSON, resp.Header.Get("Content-Type")) - body, _ := ioutil.ReadAll(resp.Body) + body, _ := io.ReadAll(resp.Body) utils.AssertEqual(b, `{"message":"Hello, World!"}`, string(body)) } diff --git a/frameworks/Go/indigo/README.md b/frameworks/Go/indigo/README.md new file mode 100644 index 00000000000..2349ae2cf15 --- /dev/null +++ b/frameworks/Go/indigo/README.md @@ -0,0 +1,14 @@ +# [Indigo](https://github.com/indigo-web/indigo) (Go) Benchmarking Test + +This is the go portion of a [benchmarking test suite](https://www.techempower.com/benchmarks/) comparing a variety of web development platforms. + +> Indigo is a web-framework focusing at performance, elegancy and robustness. + +## Test URLs +* http://localhost:8080/json +* http://localhost:8080/db +* http://localhost:8080/query?n=[1-500] +* http://localhost:8080/update?n=[1-500] +* http://localhost:8080/cached-query?n=[1-500] +* http://localhost:8080/fortune +* http://localhost:8080/plaintext diff --git a/frameworks/Go/indigo/benchmark_config.json b/frameworks/Go/indigo/benchmark_config.json new file mode 100644 index 00000000000..a1915a0fedf --- /dev/null +++ b/frameworks/Go/indigo/benchmark_config.json @@ -0,0 +1,31 @@ +{ + "framework": "indigo", + "tests": [ + { + "default": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/query?n=", + "update_url": "/update?n=", + "cached_query_url": "/cached-query?n=", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "indigo", + "language": "Go", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Indigo", + "notes": "", + "versus": "go" + } + } + ] +} diff --git a/frameworks/Go/indigo/config.toml b/frameworks/Go/indigo/config.toml new file mode 100644 index 00000000000..abc0d4b02ce --- /dev/null +++ b/frameworks/Go/indigo/config.toml @@ -0,0 +1,20 @@ +[framework] +name = "indigo" + +[main] +urls.json = "/json" +urls.db = "/db" +urls.query = "/query?n=" +urls.update = "/update?n=" +urls.cached_query = "/cached-query?n=" +urls.fortune = "/fortunes" +urls.plaintext = "/plaintext" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "None" +versus = "go" diff --git a/frameworks/Go/indigo/indigo.dockerfile b/frameworks/Go/indigo/indigo.dockerfile new file mode 100644 index 00000000000..3096d7cd738 --- /dev/null +++ b/frameworks/Go/indigo/indigo.dockerfile @@ -0,0 +1,19 @@ +FROM golang:1.25-alpine3.22 as builder + +WORKDIR /indigo + +COPY ./src /indigo + +RUN go mod download && \ + go generate -x ./templates && \ + GOAMD64=v3 go build -ldflags="-s -w" -o app . + +FROM alpine:3.22 + +WORKDIR /indigo + +COPY --from=builder /indigo/app . + +EXPOSE 8080 + +CMD ./app diff --git a/frameworks/Go/indigo/src/app.go b/frameworks/Go/indigo/src/app.go new file mode 100644 index 00000000000..f8aa2930462 --- /dev/null +++ b/frameworks/Go/indigo/src/app.go @@ -0,0 +1,163 @@ +package main + +import ( + "context" + "math/rand/v2" + "slices" + "strconv" + "time" + + "github.com/indigo-web/indigo/http" + "github.com/indigo-web/indigo/http/mime" + + "indigo/app/models" + "indigo/app/templates" +) + +type ( + App struct { + DB *DB + Cache models.Worlds + } +) + +func NewApp(DB *DB) *App { + return &App{DB: DB} +} + +func (app *App) PopulateCache(ctx context.Context) error { + cache := make(models.Worlds, 10000) + + err := app.DB.FillWorlds(context.Background(), cache) + if err != nil { + return err + } + + app.Cache = cache + + return nil +} + +func (app *App) HandleJSON(request *http.Request) *http.Response { + return request.Respond().Header("Date", time.Now().Format(time.RFC1123)).Header("Server", "indigo").JSON(&models.Message{ + Message: "Hello, World!", + }) +} + +func (app *App) HandleDB(request *http.Request) *http.Response { + world := &models.World{ + ID: rand.IntN(10000) + 1, + } + + err := app.DB.FillWorldByID(context.Background(), world) + if err != nil { + return http.Error(request, err) + } + + return request.Respond().Header("Date", time.Now().Format(time.RFC1123)).Header("Server", "indigo").JSON(world) +} + +func (app *App) HandleQuery(request *http.Request) *http.Response { + n := normalizeNumber(request.Params.Lookup("n")) + + i, worlds := 0, make(models.Worlds, n) + + for i = range worlds { + worlds[i].ID = rand.IntN(10000) + 1 + } + + err := app.DB.FillWorldsByID(context.Background(), worlds) + if err != nil { + return http.Error(request, err) + } + + return request.Respond().Header("Date", time.Now().Format(time.RFC1123)).Header("Server", "indigo").JSON(&worlds) +} + +func (app *App) HandleUpdate(request *http.Request) *http.Response { + n := normalizeNumber(request.Params.Lookup("n")) + + i, worlds := 0, make(models.Worlds, n) + + for i = range worlds { + worlds[i].ID = rand.IntN(10000) + 1 + } + + err := app.DB.FillWorldsByID(context.Background(), worlds) + if err != nil { + return http.Error(request, err) + } + + for i = range worlds { + worlds[i].RandomNumber = rand.IntN(10000) + 1 + } + + slices.SortFunc(worlds, func(a, b models.World) int { + return a.ID - b.ID + }) + + err = app.DB.UpdateWorlds(context.Background(), worlds) + if err != nil { + return http.Error(request, err) + } + + return request.Respond().Header("Date", time.Now().Format(time.RFC1123)).Header("Server", "indigo").JSON(&worlds) +} + +func (app *App) HandleCachedQuery(request *http.Request) *http.Response { + n := normalizeNumber(request.Params.Lookup("n")) + + i, worlds := 0, make(models.Worlds, n) + + for i = range worlds { + worlds[i] = app.Cache[rand.Int32N(10000)] + } + + return request.Respond().Header("Date", time.Now().Format(time.RFC1123)).Header("Server", "indigo").JSON(&worlds) +} + +func (app *App) HandleFortune(request *http.Request) *http.Response { + fortunes, err := app.DB.GetFortunes(context.Background()) + if err != nil { + return http.Error(request, err) + } + + fortunes = append(fortunes, models.Fortune{ + Message: "Additional fortune added at request time.", + }) + + slices.SortFunc(fortunes, func(a, b models.Fortune) int { + if a.Message < b.Message { + return -1 + } else if a.Message > b.Message { + return 1 + } + + return 0 + }) + + return request.Respond().Header("Date", time.Now().Format(time.RFC1123)).Header("Server", "indigo").ContentType(mime.HTML + "; charset=UTF-8").String(templates.HTMLFortunes(fortunes)) +} + +func (app *App) HandlePlaintext(request *http.Request) *http.Response { + return request.Respond().Header("Date", time.Now().Format(time.RFC1123)).Header("Server", "indigo").ContentType(mime.Plain).String("Hello, World!") +} + +func normalizeNumber(nString string, found bool) int { + if !found { + nString = "0" + } + + n, err := strconv.Atoi(nString) + if err != nil { + n = 0 + } + + if n < 1 { + n = 1 + } else if n > 500 { + n = 500 + } + + return n +} diff --git a/frameworks/Go/indigo/src/database.go b/frameworks/Go/indigo/src/database.go new file mode 100644 index 00000000000..476891408f8 --- /dev/null +++ b/frameworks/Go/indigo/src/database.go @@ -0,0 +1,124 @@ +package main + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgxpool" + + "indigo/app/models" +) + +type ( + DB struct { + pool *pgxpool.Pool + } +) + +func NewDB(pool *pgxpool.Pool) *DB { + return &DB{ + pool: pool, + } +} + +func (DB *DB) GetFortunes(ctx context.Context) ([]models.Fortune, error) { + query := `SELECT id, message FROM Fortune` + + rows, err := DB.pool.Query(ctx, query) + if err != nil { + return nil, err + } + + fortunes, fortune := []models.Fortune(nil), models.Fortune{} + + for rows.Next() { + err = rows.Scan(&fortune.ID, &fortune.Message) + if err != nil { + return nil, err + } + + fortunes = append(fortunes, fortune) + } + + err = rows.Err() + if err != nil { + return nil, err + } + + return fortunes, nil +} + +func (DB *DB) FillWorldByID(ctx context.Context, world *models.World) error { + query := `SELECT randomNumber FROM World WHERE id = $1 LIMIT 1` + + return DB.pool.QueryRow( + context.Background(), + query, + world.ID, + ).Scan(&world.RandomNumber) +} + +func (DB *DB) FillWorlds(ctx context.Context, worlds []models.World) error { + query := `SELECT id, randomNumber FROM World` + + rows, err := DB.pool.Query(ctx, query) + if err != nil { + return err + } + + i, world := 0, (*models.World)(nil) + + for rows.Next() && i < len(worlds) { + world = &worlds[i] + + err = rows.Scan(&world.ID, &world.RandomNumber) + if err != nil { + return err + } + + i += 1 + } + + return rows.Err() +} + +func (DB *DB) FillWorldsByID(ctx context.Context, worlds []models.World) error { + connection, err := DB.pool.Acquire(ctx) + if err != nil { + return err + } + defer connection.Release() + + query := `SELECT randomNumber FROM World WHERE id = $1 LIMIT 1` + + i, world, err := 0, (*models.World)(nil), error(nil) + + for i = range worlds { + world = &worlds[i] + + err = connection.QueryRow( + context.Background(), + query, + world.ID, + ).Scan(&world.RandomNumber) + if err != nil { + return err + } + } + + return nil +} + +func (DB *DB) UpdateWorlds(ctx context.Context, worlds models.Worlds) error { + query := `UPDATE World SET randomNumber = $1 WHERE id = $2` + batch := new(pgx.Batch) + + i, world := 0, (*models.World)(nil) + + for i = range worlds { + world = &worlds[i] + batch.Queue(query, &world.RandomNumber, &world.ID) + } + + return DB.pool.SendBatch(context.Background(), batch).Close() +} diff --git a/frameworks/Go/indigo/src/go.mod b/frameworks/Go/indigo/src/go.mod new file mode 100644 index 00000000000..cf0eeb1cb9e --- /dev/null +++ b/frameworks/Go/indigo/src/go.mod @@ -0,0 +1,25 @@ +module indigo/app + +go 1.25 + +require ( + github.com/indigo-web/indigo v0.17.2 + github.com/jackc/pgx/v5 v5.7.5 + github.com/valyala/quicktemplate v1.8.0 +) + +require ( + github.com/flrdv/uf v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + golang.org/x/crypto v0.41.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/text v0.28.0 // indirect +) diff --git a/frameworks/Go/indigo/src/go.sum b/frameworks/Go/indigo/src/go.sum new file mode 100644 index 00000000000..2207dda2ca6 --- /dev/null +++ b/frameworks/Go/indigo/src/go.sum @@ -0,0 +1,50 @@ +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/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= +github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= +github.com/flrdv/uf v1.0.0 h1:udtfbC/UyGas47F4leoelaSvvCW27YOfyNe+7VZz2q8= +github.com/flrdv/uf v1.0.0/go.mod h1:vqLw82T3RKKxRXoXEPFgOaZNYCzE6Lz9e6NnALzVbI8= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/indigo-web/indigo v0.17.2 h1:3KEkVjTa5/URz44l2rUllK1lxau0fg5gh/emKBIfUgM= +github.com/indigo-web/indigo v0.17.2/go.mod h1:v1KnCE1B2Bx60WupVpZy3NQlH4oraxg3GpvpW2QTphk= +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-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +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/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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +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/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= +github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frameworks/Go/indigo/src/main.go b/frameworks/Go/indigo/src/main.go new file mode 100644 index 00000000000..6f8643b4b21 --- /dev/null +++ b/frameworks/Go/indigo/src/main.go @@ -0,0 +1,48 @@ +package main + +import ( + "context" + "fmt" + "log" + + "github.com/indigo-web/indigo" + "github.com/indigo-web/indigo/router/inbuilt" + "github.com/jackc/pgx/v5/pgxpool" +) + +func main() { + pool, err := pgxpool.New(context.Background(), + fmt.Sprintf( + "host=%s port=%d user=%s password=%s dbname=%s", + "tfb-database", 5432, + "benchmarkdbuser", + "benchmarkdbpass", + "hello_world", + )) + if err != nil { + log.Fatal(err) + } + + DB := NewDB(pool) + app := NewApp(DB) + + err = app.PopulateCache(context.Background()) + if err != nil { + log.Fatal(err) + } + + router := inbuilt.New() + + router.Resource("/json").Get(app.HandleJSON) + router.Resource("/db").Get(app.HandleDB) + router.Resource("/query").Get(app.HandleQuery) + router.Resource("/update").Get(app.HandleUpdate) + router.Resource("/cached-query").Get(app.HandleCachedQuery) + router.Resource("/fortunes").Get(app.HandleFortune) + router.Resource("/plaintext").Get(app.HandlePlaintext) + + err = indigo.New(":8080").Serve(router) + if err != nil { + log.Fatal(err) + } +} diff --git a/frameworks/Go/indigo/src/models/models.go b/frameworks/Go/indigo/src/models/models.go new file mode 100644 index 00000000000..021d79dc320 --- /dev/null +++ b/frameworks/Go/indigo/src/models/models.go @@ -0,0 +1,23 @@ +package models + +type ( + Message struct { + Message string `json:"message"` + } +) + +type ( + Worlds []World + + World struct { + ID int `json:"id"` + RandomNumber int `json:"randomNumber"` + } +) + +type ( + Fortune struct { + ID int `json:"id,omitempty"` + Message string `json:"message,omitempty"` + } +) diff --git a/frameworks/Go/indigo/src/templates/fortune.go b/frameworks/Go/indigo/src/templates/fortune.go new file mode 100644 index 00000000000..e7448b6fbd5 --- /dev/null +++ b/frameworks/Go/indigo/src/templates/fortune.go @@ -0,0 +1,3 @@ +package templates + +//go:generate go run github.com/valyala/quicktemplate/qtc diff --git a/frameworks/Go/indigo/src/templates/fortune.qtpl b/frameworks/Go/indigo/src/templates/fortune.qtpl new file mode 100644 index 00000000000..8438680c3e7 --- /dev/null +++ b/frameworks/Go/indigo/src/templates/fortune.qtpl @@ -0,0 +1,19 @@ +{% import "indigo/app/models" %} + +{% func HTMLFortunes(fortunes []models.Fortune) %} + + +Fortunes + + + + +{% code i, fortune := 0, (*models.Fortune)(nil) %} +{% for i = range fortunes %} +{% code fortune = &fortunes[i] %} + +{% endfor %} +
      idmessage
      {%d fortune.ID %}{%s fortune.Message %}
      + + +{% endfunc %} diff --git a/frameworks/Go/indigo/src/templates/fortune.qtpl.go b/frameworks/Go/indigo/src/templates/fortune.qtpl.go new file mode 100644 index 00000000000..d67ed68a8da --- /dev/null +++ b/frameworks/Go/indigo/src/templates/fortune.qtpl.go @@ -0,0 +1,96 @@ +// Code generated by qtc from "fortune.qtpl". DO NOT EDIT. +// See https://github.com/valyala/quicktemplate for details. + +//line fortune.qtpl:1 +package templates + +//line fortune.qtpl:1 +import "indigo/app/models" + +//line fortune.qtpl:3 +import ( + qtio422016 "io" + + qt422016 "github.com/valyala/quicktemplate" +) + +//line fortune.qtpl:3 +var ( + _ = qtio422016.Copy + _ = qt422016.AcquireByteBuffer +) + +//line fortune.qtpl:3 +func StreamHTMLFortunes(qw422016 *qt422016.Writer, fortunes []models.Fortune) { +//line fortune.qtpl:3 + qw422016.N().S(` + + +Fortunes + + + + +`) +//line fortune.qtpl:11 + i, fortune := 0, (*models.Fortune)(nil) + +//line fortune.qtpl:11 + qw422016.N().S(` +`) +//line fortune.qtpl:12 + for i = range fortunes { +//line fortune.qtpl:12 + qw422016.N().S(` +`) +//line fortune.qtpl:13 + fortune = &fortunes[i] + +//line fortune.qtpl:13 + qw422016.N().S(` + +`) +//line fortune.qtpl:15 + } +//line fortune.qtpl:15 + qw422016.N().S(` +
      idmessage
      `) +//line fortune.qtpl:14 + qw422016.N().D(fortune.ID) +//line fortune.qtpl:14 + qw422016.N().S(``) +//line fortune.qtpl:14 + qw422016.E().S(fortune.Message) +//line fortune.qtpl:14 + qw422016.N().S(`
      + + +`) +//line fortune.qtpl:19 +} + +//line fortune.qtpl:19 +func WriteHTMLFortunes(qq422016 qtio422016.Writer, fortunes []models.Fortune) { +//line fortune.qtpl:19 + qw422016 := qt422016.AcquireWriter(qq422016) +//line fortune.qtpl:19 + StreamHTMLFortunes(qw422016, fortunes) +//line fortune.qtpl:19 + qt422016.ReleaseWriter(qw422016) +//line fortune.qtpl:19 +} + +//line fortune.qtpl:19 +func HTMLFortunes(fortunes []models.Fortune) string { +//line fortune.qtpl:19 + qb422016 := qt422016.AcquireByteBuffer() +//line fortune.qtpl:19 + WriteHTMLFortunes(qb422016, fortunes) +//line fortune.qtpl:19 + qs422016 := string(qb422016.B) +//line fortune.qtpl:19 + qt422016.ReleaseByteBuffer(qb422016) +//line fortune.qtpl:19 + return qs422016 +//line fortune.qtpl:19 +} diff --git a/frameworks/Rust/may-minihttp/Cargo.lock b/frameworks/Rust/may-minihttp/Cargo.lock new file mode 100644 index 00000000000..d5c50284a95 --- /dev/null +++ b/frameworks/Rust/may-minihttp/Cargo.lock @@ -0,0 +1,1420 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "annotate-snippets" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "buf-min" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22d5698cf6842742ed64805705798f8b351fff53fa546fd45c52184bee58dc90" +dependencies = [ + "bytes", +] + +[[package]] +name = "bumpalo" +version = "3.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core_affinity" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a034b3a7b624016c6e13f5df875747cc25f884156aad2abd12b6c46797971342" +dependencies = [ + "libc", + "num_cpus", + "winapi", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.104", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "generator" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88cd67e9de251c1781dbe2f641a1a3ad66eaae831b8a2c38fbdc5ddae16d4d" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "may" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a812e25193d07288695d0e12e30ec5cd52f9fefc3c55038b89f1ef906dcab078" +dependencies = [ + "cfg-if", + "core_affinity", + "crossbeam", + "generator", + "libc", + "log", + "may_queue", + "nix", + "num_cpus", + "parking_lot", + "rustversion", + "smallvec", + "socket2", + "windows-sys 0.59.0", +] + +[[package]] +name = "may-minihttp" +version = "0.1.0" +dependencies = [ + "atoi", + "buf-min", + "bytes", + "log", + "may", + "may_minihttp", + "may_postgres", + "mimalloc", + "nanorand", + "num_cpus", + "smallvec", + "yarte", +] + +[[package]] +name = "may_minihttp" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710fda59b93aa204a26bfc7ba9c349d90035bd1b30df10df46d7c552d107291e" +dependencies = [ + "bytes", + "httparse", + "httpdate", + "itoa", + "log", + "may", + "once_cell", +] + +[[package]] +name = "may_postgres" +version = "0.1.0" +source = "git+https://github.com/Xudong-Huang/may_postgres.git?rev=917ed78#917ed788c31825b79d38e15ad8742369bec89761" +dependencies = [ + "byteorder", + "bytes", + "crossbeam", + "fallible-iterator", + "log", + "may", + "percent-encoding", + "phf", + "postgres-protocol", + "postgres-types", + "smallvec", + "spin", +] + +[[package]] +name = "may_queue" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7026ba39000f40c16ba8ea206967380471726dd26fc34f51491b47fba9d84a94" +dependencies = [ + "crossbeam-utils", + "rustversion", + "smallvec", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mimalloc" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1791cbe101e95af5764f06f20f6760521f7158f69dbf9d6baf941ee1bf6bc40" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "postgres-protocol" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" +dependencies = [ + "base64", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" +dependencies = [ + "bytes", + "fallible-iterator", + "postgres-protocol", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "v_eval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" +dependencies = [ + "regex", + "syn 1.0.109", +] + +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" +dependencies = [ + "buf-min", +] + +[[package]] +name = "v_jsonescape" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8219cc464ba10c48c3231a6871f11d26d831c5c45a47467eea387ea7bb10e8" +dependencies = [ + "buf-min", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.104", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[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" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "yarte" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfce1df93f3b16e5272221a559e60bbbaaa71dbc042a43996d223e51a690aab2" +dependencies = [ + "buf-min", + "yarte_derive", + "yarte_helpers", +] + +[[package]] +name = "yarte_codegen" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a79312078b97a195de91a8c1457c2e0d7abd97e6e605f3cdeb01b3c105d2cff" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_helpers", + "yarte_hir", +] + +[[package]] +name = "yarte_derive" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "v_jsonescape", + "yarte_codegen", + "yarte_helpers", + "yarte_hir", + "yarte_parser", +] + +[[package]] +name = "yarte_helpers" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" +dependencies = [ + "buf-min", + "chrono", + "dtoa", + "itoa", + "prettyplease", + "ryu", + "serde", + "serde_json", + "syn 1.0.109", + "toml", + "v_htmlescape", + "v_jsonescape", +] + +[[package]] +name = "yarte_hir" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee42d2f704a3b1d8bc111d47a705d1302a0943d85e4c230f4e8300ee0dde4a6" +dependencies = [ + "derive_more", + "proc-macro2", + "quote", + "syn 1.0.109", + "v_eval", + "v_htmlescape", + "yarte_helpers", + "yarte_parser", +] + +[[package]] +name = "yarte_parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538f72049cf7104e12d5c444048d112cb8fc788a31308afd912442a381ba860c" +dependencies = [ + "annotate-snippets", + "derive_more", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "unicode-xid", + "yarte_helpers", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] From ac100068a12dd775c85e3c4511b7e9a8012465dd Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 25 Aug 2025 20:46:20 +0200 Subject: [PATCH 1578/1766] [ruby/sinatra] Use trilogy for the MySQL adapter (#8471) (#10067) Trilogy is a new client library for MySQL-compatible database servers, designed for performance, flexibility, and ease of embedding. It is used by Github and Shopify in production and will probably replace the `mysql2` library. https://github.com/trilogy-libraries/trilogy --- frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 4 ++-- frameworks/Ruby/sinatra/boot.rb | 13 +++++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 0f9f863b31f..c8de92098c1 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -5,7 +5,7 @@ gem 'json', '~> 2.8' gem 'sinatra', '~> 4.0', require: 'sinatra/base' group :mysql, optional: true do - gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :windows] + gem 'trilogy', '~> 2.9.0', platforms: [:ruby, :windows] end group :postgresql, optional: true do diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 880182d6951..f69851da1b2 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -34,7 +34,6 @@ GEM minitest (5.25.5) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) - mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) puma (6.6.0) @@ -58,6 +57,7 @@ GEM tilt (~> 2.0) tilt (2.6.0) timeout (0.4.3) + trilogy (2.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uri (1.0.3) @@ -71,10 +71,10 @@ DEPENDENCIES activerecord (~> 8.0) iodine (~> 0.7) json (~> 2.8) - mysql2 (~> 0.5) pg (~> 1.5) puma (~> 6.4) sinatra (~> 4.0) + trilogy (~> 2.9.0) BUNDLED WITH 2.7.0 diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index 55be87eb951..f29c2cca1e1 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -15,13 +15,22 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules opts = { - adapter: (dbtype == :mysql ? 'mysql2' : 'postgresql'), username: 'benchmarkdbuser', password: 'benchmarkdbpass', host: 'tfb-database', database: 'hello_world' } + if dbtype == :mysql + opts[:adapter] = 'trilogy' + opts[:ssl] = true + opts[:ssl_mode] = 4 # Trilogy::SSL_PREFERRED_NOVERIFY + opts[:tls_min_version] = 3 # Trilogy::TLS_VERSION_12 + else + opts[:adapter] = 'postgresql' + end + + # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:pool] = (2 * Math.log(threads)).floor @@ -44,7 +53,7 @@ class World < ActiveRecord::Base alias_attribute(:randomNumber, :randomnumber) \ if connection.adapter_name.downcase.start_with?('postgres') - if connection.adapter_name.downcase.start_with?('mysql') + if connection.adapter_name.downcase.start_with?('trilogy') def self.upsert_all(attributes, on_duplicate: :update, update_only: nil, returning: nil, unique_by: nil, record_timestamps: nil) # On MySQL Batch updates verification isn't supported yet by TechEmpower. # https://github.com/TechEmpower/FrameworkBenchmarks/issues/5983 From b35988fe622cb60f42c7aa8c7cb9d35b3dd7198c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 25 Aug 2025 20:46:37 +0200 Subject: [PATCH 1579/1766] [ruby/roda-sequel] Use trilogy for the MySQL adapter (#10068) Trilogy is a new client library for MySQL-compatible database servers, designed for performance, flexibility, and ease of embedding. It is used by Github and Shopify in production and will probably replace the mysql2 library. https://github.com/trilogy-libraries/trilogy --- frameworks/Ruby/roda-sequel/Gemfile | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 4 ++-- frameworks/Ruby/roda-sequel/boot.rb | 21 ++++++++++----------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 054231e8eb6..6cada0b74fc 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -7,7 +7,7 @@ gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" group :mysql, optional: true do - gem "mysql2", "~> 0.5", platforms: %i[ruby windows] + gem 'trilogy', '~> 2.9.0', platforms: [:ruby, :windows] end group :postgresql, optional: true do diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 59809e0b877..c83ae96e3de 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -5,7 +5,6 @@ GEM erubi (1.13.1) iodine (0.7.58) json (2.13.2) - mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) puma (6.6.0) @@ -19,6 +18,7 @@ GEM pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) tilt (2.6.0) + trilogy (2.9.0) PLATFORMS ruby @@ -29,13 +29,13 @@ DEPENDENCIES erubi (~> 1.12) iodine (~> 0.7) json (~> 2.8) - mysql2 (~> 0.5) pg (~> 1.4) puma (~> 6.2) roda (~> 3.66) sequel (~> 5.67) sequel_pg (~> 1.17) tilt (~> 2.1) + trilogy (~> 2.9.0) BUNDLED WITH 2.7.0 diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index 346d8614aa3..80fbc11f944 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -22,17 +22,17 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules - adapters = { - mysql: { - mri: "mysql2" - }, - postgresql: { - mri: "postgres" - } - } - opts = {} + if dbtype == :mysql + adapter = 'trilogy' + opts[:ssl] = true + opts[:ssl_mode] = 4 # Trilogy::SSL_PREFERRED_NOVERIFY + opts[:tls_min_version] = 3 # Trilogy::TLS_VERSION_12 + else + adapter = 'postgresql' + end + # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 @@ -42,8 +42,7 @@ def connect(dbtype) Sequel.connect "%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}" % { - adapter: - adapters.fetch(dbtype).fetch(:mri), + adapter: adapter, host: "tfb-database", database: "hello_world", user: "benchmarkdbuser", From 28fac6a6356286105e1542ee1c6590a2a5bf14b7 Mon Sep 17 00:00:00 2001 From: AkazawaYun <62974697+AkazawaYun@users.noreply.github.com> Date: Tue, 26 Aug 2025 02:49:13 +0800 Subject: [PATCH 1580/1766] [akazawayun.pro] add db tests (#10070) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add new test : CSharp/akazawayun.pro * modify config and code * add content-type * update url * update package version * add 3 new tests: db、queries、updates 1. add 3 new tests: db、queries、updates; 2. split code to multi files; * - * use generated sql instead const string. * update version * fix bug of db query --- .../akazawayun.pro/akazawayun.pro.dockerfile | 6 +- .../akazawayun.pro/benchmark_config.json | 49 +++++----- .../src/AkazawaYun.FrameworkBenchmarks.csproj | 11 ++- frameworks/CSharp/akazawayun.pro/src/Model.cs | 21 +++++ frameworks/CSharp/akazawayun.pro/src/Mysql.cs | 10 ++ .../CSharp/akazawayun.pro/src/Program.cs | 94 ++++++++++++++----- .../CSharp/akazawayun.pro/src/WorldService.cs | 45 +++++++++ 7 files changed, 185 insertions(+), 51 deletions(-) create mode 100644 frameworks/CSharp/akazawayun.pro/src/Model.cs create mode 100644 frameworks/CSharp/akazawayun.pro/src/Mysql.cs create mode 100644 frameworks/CSharp/akazawayun.pro/src/WorldService.cs diff --git a/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile index f2549e6f8da..44d69f1c8fa 100644 --- a/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile +++ b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile @@ -1,13 +1,13 @@ -# 此阶段用于生成项目 +# 生成 FROM mcr.microsoft.com/dotnet/sdk:9.0 AS publish WORKDIR /app COPY src . RUN dotnet publish -c Release -o /app/publish -# 此阶段用于运行 +# 运行 FROM mcr.microsoft.com/dotnet/sdk:9.0 AS runtime WORKDIR /app COPY --from=publish /app/publish . EXPOSE 2022 -ENTRYPOINT ["dotnet", "AkazawaYun.FrameworkBenchmarks.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "AkazawaYun.FrameworkBenchmarks.dll"] diff --git a/frameworks/CSharp/akazawayun.pro/benchmark_config.json b/frameworks/CSharp/akazawayun.pro/benchmark_config.json index 74968041e6b..d03b12ca608 100644 --- a/frameworks/CSharp/akazawayun.pro/benchmark_config.json +++ b/frameworks/CSharp/akazawayun.pro/benchmark_config.json @@ -1,25 +1,28 @@ { - "framework": "akazawayun.pro", - "tests": [ - { - "default": { - "display_name": "akazawayun.pro", - "framework": "akazawayun.pro", - "webserver": "akazawayun.pro", - "plaintext_url": "/post/plaintext", - "json_url": "/post/json", - "port": 2022, - "classification": "Micro", - "approach": "Realistic", - "platform": ".NET", - "language": "C#", - "flavor": "CoreCLR", - "os": "Linux", - "database_os": "Linux", - "database": "MySQL", - "orm": "Micro", - "notes": "" - } - } - ] + "framework": "akazawayun.pro", + "tests": [ + { + "default": { + "display_name": "akazawayun.pro", + "framework": "akazawayun.pro", + "webserver": "akazawayun.pro", + "plaintext_url": "/post/plaintext", + "json_url": "/post/json", + "db_url": "/post/db", + "query_url": "/post/queries?queries=", + "update_url": "/post/updates?queries=", + "port": 2022, + "classification": "Micro", + "approach": "Realistic", + "platform": ".NET", + "language": "C#", + "flavor": "CoreCLR", + "os": "Linux", + "database_os": "Linux", + "database": "MySQL", + "orm": "Micro", + "notes": "" + } + } + ] } diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj index caf04a7827b..c2c063469d0 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj @@ -1,19 +1,22 @@ - + Exe net9.0 enable enable + true + false - + true true - + - + + diff --git a/frameworks/CSharp/akazawayun.pro/src/Model.cs b/frameworks/CSharp/akazawayun.pro/src/Model.cs new file mode 100644 index 00000000000..2fdf2c6d1f3 --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/Model.cs @@ -0,0 +1,21 @@ +#pragma warning disable IDE1006,CS8981 +using AkazawaYun.AOT; +using System.Text.Json.Serialization; + +namespace AkazawaYun.FrameworkBenchmarks; + + +[JsonSerializable(typeof(JsonModel))] +[JsonSerializable(typeof(world[]))] +public partial class AotJsonContext : JsonSerializerContext { } + + +public class JsonModel +{ + public string? message { get; set; } +} +public class world : IAotModel +{ + public int id { get; set; } + public int randomNumber { get; set; } +} diff --git a/frameworks/CSharp/akazawayun.pro/src/Mysql.cs b/frameworks/CSharp/akazawayun.pro/src/Mysql.cs new file mode 100644 index 00000000000..8c056b15baa --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/Mysql.cs @@ -0,0 +1,10 @@ +using AkazawaYun.PRO7; +using MySql.Data.MySqlClient; +using System.Data.Common; + +namespace AkazawaYun.FrameworkBenchmarks; + +class Mysql : akzDbFactory +{ + protected override DbConnection NewConnection() => new MySqlConnection(ConString); +} diff --git a/frameworks/CSharp/akazawayun.pro/src/Program.cs b/frameworks/CSharp/akazawayun.pro/src/Program.cs index 808424483f4..077fc489ddb 100644 --- a/frameworks/CSharp/akazawayun.pro/src/Program.cs +++ b/frameworks/CSharp/akazawayun.pro/src/Program.cs @@ -1,41 +1,93 @@ -using AkazawaYun.PRO7; +#pragma warning disable IDE1006,IL2026 + +using AkazawaYun.AOT; +using AkazawaYun.PRO7; +using AkazawaYun.PRO7.AkazawaYunWebFunctionAOP; using AkazawaYun.PRO7.AkazawaYunWebInterceptor; -using System.Text.Json.Serialization; +using System.Diagnostics.CodeAnalysis; namespace AkazawaYun.FrameworkBenchmarks; -public class Program : IPostFunction +class Program : IPostFunctionWrapper { - static async Task Main() + static readonly akzWebBuilder builder; + static readonly akzDbFactory mysql; + + + static Program() { - akzJson.Config(null, Json.Default); - var server = await akzWebBuilder.Shared.Load().SetDefault().Build() + akzJson.Config(null, AotJsonContext.Default); + builder = akzWebBuilder.Shared.SetDefault() + .Build() .Config(itc => { + itc.ClearInterceptor(); itc.AddInterceptor(new akzWebInterceptorNotOnlyPost()); - }).Launch(); + }); + mysql = new akzDbBuilderII() + .SetServer("tfb-database:3306") + //.SetServer("localhost:3306") + .SetUser("benchmarkdbuser") + .SetPwd("benchmarkdbpass") + .SetDatabase("hello_world") + .SetCharset() + .SetOtherset() + .Build(); + } + static async Task Main() + { + await builder.Launch(); akzLog.Default = akzLog.Output.None; await Task.Delay(-1); } - public static ValueTask plaintext(HttpReq _) + public static HttpRes plaintext() => HttpRes.HttpOK("Hello, World!", ".txt"); + public static JsonModel json() => new() + { + message = "Hello, World!" + }; + + //[WebFunctionAopTry] + public static async Task db() { - return HttpRes.HttpOK("Hello, World!", ".txt"); + await using IDb con = await mysql.Connect(); + world obj = await WorldService.GetRandomWorld(con); + return obj; } - public static ValueTask json(HttpReq _) + //[WebFunctionAopTry] + public static async Task queries(string queries) { - return HttpRes.HttpJson(new JsonResponse - { - message = "Hello, World!" - }); + int count = ParseCount(queries); + + await using IDb con = await mysql.Connect(); + world[] lst = await WorldService.GetWorlds(con, count); + return lst; } -} + //[WebFunctionAopTry] + public static async Task updates(string queries) + { + int count = ParseCount(queries); -public class JsonResponse -{ - public string? message { get; set; } -} + await using IDb con = await mysql.Connect(); + world[] lst = await WorldService.GetWorlds(con, count); + + foreach (world obj in lst) + obj.randomNumber = Random.Shared.Next(1, 10001); + + await WorldService.SaveWorlds(con, lst); + + return lst; + } -[JsonSerializable(typeof(JsonResponse))] -public partial class Json : JsonSerializerContext { } + + static int ParseCount(string queries) + { + if (!int.TryParse(queries, out int count)) + return 1; + + count = Math.Clamp(count, 1, 500); + return count; + } + +} diff --git a/frameworks/CSharp/akazawayun.pro/src/WorldService.cs b/frameworks/CSharp/akazawayun.pro/src/WorldService.cs new file mode 100644 index 00000000000..1ef7f17e8a4 --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/WorldService.cs @@ -0,0 +1,45 @@ +using AkazawaYun.PRO7; + +namespace AkazawaYun.FrameworkBenchmarks; + +class WorldService +{ + static readonly int @id; + // SELECT id, randomNumber FROM world WHERE id=@id ; + public static readonly string SqlSelect = akzSqlinq.Query().Select(m => new + { + m.id, + m.randomNumber, + }).Where(m => m.id == @id).Build(); + // UPDATE world SET randomNumber=@randomNumber WHERE id=@id ; + public static readonly string SqlUpdate = akzSqlinq.Update().Set(m => new() + { + randomNumber = m.randomNumber, + }).Where(m => m.id == @id).Build(); + + + public static async Task GetRandomWorld(IDb con, IDictionary? shared = null) + { + int id = Random.Shared.Next(1, 10001); + shared ??= new DpSingleBuilder().Build(); + shared["id"] = id; + + world? obj = await con.Find(SqlSelect, shared).Toworld(); + return obj!; + } + public static async Task GetWorlds(IDb con, int count) + { + world[] lst = new world[count]; + var dp = new DpSingleBuilder().Build(); + for (int i = 0; i < count; i++) + { + world obj = await GetRandomWorld(con, dp); + lst[i] = obj; + } + return lst; + } + public static async Task SaveWorlds(IDb con, world[] lst) + { + await con.Execute(SqlUpdate, lst.ToDp()); + } +} From 433e1f8a8e96304ddcf78fb84a774159dc6bf42b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 26 Aug 2025 02:50:01 +0800 Subject: [PATCH 1581/1766] Upgrade hyperlane (#10071) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: config * feat: config * feat: v4.36.1 * docs: readme * feat: remove dyn * docs: readme * feat: lock * feat: lock * feat: lock * feat: lock * feat: db pool * feat: db pool * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 57 ++++++++++++------- frameworks/Rust/hyperlane/Cargo.toml | 6 +- .../Rust/hyperlane/src/{db.rs => db/fn.rs} | 20 +++---- frameworks/Rust/hyperlane/src/db/mod.rs | 9 +++ .../hyperlane/src/{lazy.rs => db/static.rs} | 0 frameworks/Rust/hyperlane/src/db/type.rs | 3 + frameworks/Rust/hyperlane/src/main.rs | 18 ++---- .../fn.rs} | 0 .../Rust/hyperlane/src/middleware/mod.rs | 5 ++ .../hyperlane/src/{route.rs => route/fn.rs} | 8 +-- frameworks/Rust/hyperlane/src/route/mod.rs | 7 +++ .../Rust/hyperlane/src/{ => server}/const.rs | 3 + .../hyperlane/src/{server.rs => server/fn.rs} | 2 +- .../hyperlane/src/{type.rs => server/impl.rs} | 19 ------- frameworks/Rust/hyperlane/src/server/mod.rs | 12 ++++ .../Rust/hyperlane/src/server/struct.rs | 17 ++++++ frameworks/Rust/hyperlane/src/server/type.rs | 1 + .../hyperlane/src/{utils.rs => utils/fn.rs} | 0 frameworks/Rust/hyperlane/src/utils/mod.rs | 5 ++ 19 files changed, 122 insertions(+), 70 deletions(-) rename frameworks/Rust/hyperlane/src/{db.rs => db/fn.rs} (91%) create mode 100644 frameworks/Rust/hyperlane/src/db/mod.rs rename frameworks/Rust/hyperlane/src/{lazy.rs => db/static.rs} (100%) create mode 100644 frameworks/Rust/hyperlane/src/db/type.rs rename frameworks/Rust/hyperlane/src/{request_middleware.rs => middleware/fn.rs} (100%) create mode 100644 frameworks/Rust/hyperlane/src/middleware/mod.rs rename frameworks/Rust/hyperlane/src/{route.rs => route/fn.rs} (94%) create mode 100644 frameworks/Rust/hyperlane/src/route/mod.rs rename frameworks/Rust/hyperlane/src/{ => server}/const.rs (86%) rename frameworks/Rust/hyperlane/src/{server.rs => server/fn.rs} (96%) rename frameworks/Rust/hyperlane/src/{type.rs => server/impl.rs} (74%) create mode 100644 frameworks/Rust/hyperlane/src/server/mod.rs create mode 100644 frameworks/Rust/hyperlane/src/server/struct.rs create mode 100644 frameworks/Rust/hyperlane/src/server/type.rs rename frameworks/Rust/hyperlane/src/{utils.rs => utils/fn.rs} (100%) create mode 100644 frameworks/Rust/hyperlane/src/utils/mod.rs diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index a59b4766d9c..96734958c13 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -325,9 +325,9 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -538,9 +538,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.16.5" +version = "2.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757db00ff4cb103647c32497514aceeb685bc2686d84c8707124f1c8eeaac2e3" +checksum = "f86b015115d24b1fb70b663fdbc1f1c849883372fb19143709a718751074b907" dependencies = [ "brotli", "flate2", @@ -555,9 +555,9 @@ checksum = "c10a92fc539f5fc3b2c5c3de4255e4f62f2768c9cd5a0e7879edf3d3b3189186" [[package]] name = "http-type" -version = "4.58.1" +version = "4.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abed1c209d167f814d402413f3de1ea85b9d200ddf7724d5cf487531580beafb" +checksum = "31db399a7dbd7ddd5098b6c8ace6959ed1651a21d9ac76cc099c8bd10af3038c" dependencies = [ "hex", "http-compress", @@ -573,11 +573,12 @@ dependencies = [ [[package]] name = "hyperlane" -version = "7.6.1" +version = "8.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9d7945668a0db60ff3ed6b139d6a5d3e59bb171a3b065745066f74e01eaab7" +checksum = "7968f7272ce9339f8d77effc5f27b7ae571e0061decc67c5d44508e729a93603" dependencies = [ "http-type", + "inventory", "lombok-macros", "regex", "serde", @@ -586,9 +587,9 @@ dependencies = [ [[package]] name = "hyperlane-time" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed590017e6b8cd1c4f25cf6b5beda4efd3c5a76842c8782dca4fe650552a6c21" +checksum = "19b7a0bcb6105d14602c6777b955605fd0abee9c3fd412b4af4712db8a61e358" [[package]] name = "hyperlane_techempower" @@ -693,9 +694,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -722,6 +723,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "inventory" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" +dependencies = [ + "rustversion", +] + [[package]] name = "io-uring" version = "0.7.9" @@ -962,9 +972,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" @@ -1117,9 +1127,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -1170,6 +1180,12 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.20" @@ -1216,9 +1232,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -1739,13 +1755,14 @@ checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 419170cf4e9..b2770c7010a 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,13 +20,13 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "7.6.1" -hyperlane-time = "0.7.7" +hyperlane = "8.1.2" +hyperlane-time = "0.7.8" num_cpus = "1.17.0" once_cell = "1.21.3" rand = "0.9.2" serde = "1.0.219" -serde_json = "1.0.142" +serde_json = "1.0.143" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } [profile.dev] diff --git a/frameworks/Rust/hyperlane/src/db.rs b/frameworks/Rust/hyperlane/src/db/fn.rs similarity index 91% rename from frameworks/Rust/hyperlane/src/db.rs rename to frameworks/Rust/hyperlane/src/db/fn.rs index c5aa4c9dbef..3bf01087988 100644 --- a/frameworks/Rust/hyperlane/src/db.rs +++ b/frameworks/Rust/hyperlane/src/db/fn.rs @@ -7,7 +7,7 @@ pub fn get_db_connection() -> &'static DbPoolConnection { #[cfg(feature = "dev")] pub async fn create_database() { let db_pool: &DbPoolConnection = get_db_connection(); - let _ = query(&format!("CREATE DATABASE {};", DATABASE_NAME)) + let _ = db_query(&format!("CREATE DATABASE {};", DATABASE_NAME)) .execute(db_pool) .await; } @@ -15,7 +15,7 @@ pub async fn create_database() { #[cfg(feature = "dev")] pub async fn create_table() { let db_pool: &DbPoolConnection = get_db_connection(); - let _ = query(&format!( + let _ = db_query(&format!( "CREATE TABLE IF NOT EXISTS {} ( id SERIAL PRIMARY KEY, randomNumber INT NOT NULL );", @@ -23,7 +23,7 @@ pub async fn create_table() { )) .execute(db_pool) .await; - let _ = query(&format!( + let _ = db_query(&format!( "CREATE TABLE IF NOT EXISTS {} ( id SERIAL PRIMARY KEY, message VARCHAR NOT NULL );", @@ -36,7 +36,7 @@ pub async fn create_table() { #[cfg(feature = "dev")] pub async fn insert_records() { let db_pool: &DbPoolConnection = get_db_connection(); - let row: PgRow = query(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME_WORLD)) + let row: PgRow = db_query(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME_WORLD)) .fetch_one(db_pool) .await .unwrap(); @@ -56,7 +56,7 @@ pub async fn insert_records() { TABLE_NAME_WORLD, values.join(",") ); - let _ = query(&sql).execute(db_pool).await; + let _ = db_query(&sql).execute(db_pool).await; let mut values: Vec = Vec::new(); for _ in 0..missing_count { let random_number: i32 = get_random_id(); @@ -67,7 +67,7 @@ pub async fn insert_records() { TABLE_NAME_FORTUNE, values.join(",") ); - let _ = query(&sql).execute(db_pool).await; + let _ = db_query(&sql).execute(db_pool).await; } pub async fn init_cache() -> Vec { @@ -77,7 +77,7 @@ pub async fn init_cache() -> Vec { "SELECT id, randomNumber FROM {} LIMIT {}", TABLE_NAME_WORLD, RANDOM_MAX ); - if let Ok(rows) = query(&sql).fetch_all(db_pool).await { + if let Ok(rows) = db_query(&sql).fetch_all(db_pool).await { for row in rows { let id: i32 = row.get(KEY_ID); let random_number: i32 = row.get(KEY_RANDOM_NUMBER); @@ -146,7 +146,7 @@ pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRow { let sql: &str = "SELECT id, randomNumber FROM World WHERE id = $1"; - if let Ok(rows) = query(sql).bind(id).fetch_one(db_pool).await { + if let Ok(rows) = db_query(sql).bind(id).fetch_one(db_pool).await { let random_number: i32 = rows.get(KEY_RANDOM_NUMBER); return QueryRow::new(id as i32, random_number); } @@ -161,7 +161,7 @@ pub async fn update_world_rows(limit: Queries) -> Vec { for (id, random_number) in id_list.into_iter().zip(random_numbers.into_iter()) { let db_pool: Pool = db_pool.clone(); tasks.push(spawn(async move { - query(sql) + db_query(sql) .bind(random_number) .bind(id) .execute(&db_pool) @@ -175,7 +175,7 @@ pub async fn update_world_rows(limit: Queries) -> Vec { pub async fn all_world_row() -> Vec { let db_pool: &DbPoolConnection = get_db_connection(); let sql: String = format!("SELECT id, message FROM {}", TABLE_NAME_FORTUNE); - let res: Vec = query(&sql).fetch_all(db_pool).await.unwrap_or_default(); + let res: Vec = db_query(&sql).fetch_all(db_pool).await.unwrap_or_default(); return res; } diff --git a/frameworks/Rust/hyperlane/src/db/mod.rs b/frameworks/Rust/hyperlane/src/db/mod.rs new file mode 100644 index 00000000000..bc37c1dd653 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/db/mod.rs @@ -0,0 +1,9 @@ +pub(crate) mod r#fn; +pub(crate) mod r#static; +pub(crate) mod r#type; + +pub use r#fn::*; +pub use r#static::*; +pub use r#type::*; + +use super::*; diff --git a/frameworks/Rust/hyperlane/src/lazy.rs b/frameworks/Rust/hyperlane/src/db/static.rs similarity index 100% rename from frameworks/Rust/hyperlane/src/lazy.rs rename to frameworks/Rust/hyperlane/src/db/static.rs diff --git a/frameworks/Rust/hyperlane/src/db/type.rs b/frameworks/Rust/hyperlane/src/db/type.rs new file mode 100644 index 00000000000..6598b97602c --- /dev/null +++ b/frameworks/Rust/hyperlane/src/db/type.rs @@ -0,0 +1,3 @@ +use super::*; + +pub type DbPoolConnection = Pool; diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index 49cad12eb5b..defdd97c550 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -1,41 +1,33 @@ -#![allow(dead_code)] -#![allow(unused_imports)] -pub(crate) mod r#const; pub(crate) mod db; -pub(crate) mod lazy; -pub(crate) mod request_middleware; +pub(crate) mod middleware; pub(crate) mod route; pub(crate) mod server; -pub(crate) mod r#type; pub(crate) mod utils; -pub(crate) use r#const::*; pub(crate) use db::*; -pub(crate) use r#type::*; +pub(crate) use server::*; pub(crate) use utils::*; -pub(crate) use std::{fmt, hint::black_box, sync::Arc}; +pub(crate) use std::fmt; pub(crate) use futures::{executor::block_on, future::join_all}; pub(crate) use hyperlane::{ tokio::{ runtime::{Builder, Runtime}, spawn, - sync::{AcquireError, OwnedSemaphorePermit, Semaphore}, task::JoinHandle, }, *, }; pub(crate) use hyperlane_time::*; -pub(crate) use lazy::*; pub(crate) use once_cell::sync::Lazy; pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng}; pub(crate) use serde::*; pub(crate) use serde_json::{Value, json}; -pub(crate) use server::*; pub(crate) use sqlx::{ + Pool, Postgres, Row, postgres::{PgPoolOptions, PgRow}, - *, + query as db_query, }; fn main() { diff --git a/frameworks/Rust/hyperlane/src/request_middleware.rs b/frameworks/Rust/hyperlane/src/middleware/fn.rs similarity index 100% rename from frameworks/Rust/hyperlane/src/request_middleware.rs rename to frameworks/Rust/hyperlane/src/middleware/fn.rs diff --git a/frameworks/Rust/hyperlane/src/middleware/mod.rs b/frameworks/Rust/hyperlane/src/middleware/mod.rs new file mode 100644 index 00000000000..4ecc55e4383 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/middleware/mod.rs @@ -0,0 +1,5 @@ +pub(crate) mod r#fn; + +pub use r#fn::*; + +use super::*; diff --git a/frameworks/Rust/hyperlane/src/route.rs b/frameworks/Rust/hyperlane/src/route/fn.rs similarity index 94% rename from frameworks/Rust/hyperlane/src/route.rs rename to frameworks/Rust/hyperlane/src/route/fn.rs index 2a5fcc7222c..2f7bb9595f7 100644 --- a/frameworks/Rust/hyperlane/src/route.rs +++ b/frameworks/Rust/hyperlane/src/route/fn.rs @@ -49,7 +49,7 @@ pub async fn db(ctx: Context) { pub async fn query(ctx: Context) { let run = || async { let queries: Queries = ctx - .get_request_query("q") + .try_get_request_query(QUERY_DB_QUERY_KEY) .await .and_then(|queries| queries.parse::().ok()) .unwrap_or_default() @@ -104,7 +104,7 @@ pub async fn fortunes(ctx: Context) { pub async fn update(ctx: Context) { let run = || async { let queries: Queries = ctx - .get_request_query("q") + .try_get_request_query(UPDATE_DB_QUERY_KEY) .await .and_then(|queries| queries.parse::().ok()) .unwrap_or_default() @@ -127,13 +127,13 @@ pub async fn update(ctx: Context) { pub async fn cached_query(ctx: Context) { let run = || async { let count: Queries = ctx - .get_request_query("c") + .try_get_request_query(CACHE_QUERY_KEY) .await .and_then(|queries| queries.parse::().ok()) .unwrap_or_default() .min(ROW_LIMIT as Queries) .max(1); - let res: Vec = CACHE.iter().take(count as usize).cloned().collect(); + let res: Vec<&QueryRow> = CACHE.iter().take(count as usize).collect(); ctx.set_response_body(serde_json::to_string(&res).unwrap_or_default()) .await .send() diff --git a/frameworks/Rust/hyperlane/src/route/mod.rs b/frameworks/Rust/hyperlane/src/route/mod.rs new file mode 100644 index 00000000000..9fb49d8480f --- /dev/null +++ b/frameworks/Rust/hyperlane/src/route/mod.rs @@ -0,0 +1,7 @@ +pub(crate) mod r#fn; + +pub use r#fn::*; + +use super::*; + +use sqlx::{Row, postgres::PgRow}; diff --git a/frameworks/Rust/hyperlane/src/const.rs b/frameworks/Rust/hyperlane/src/server/const.rs similarity index 86% rename from frameworks/Rust/hyperlane/src/const.rs rename to frameworks/Rust/hyperlane/src/server/const.rs index c68b37c2bd1..ec9fcd751dc 100644 --- a/frameworks/Rust/hyperlane/src/const.rs +++ b/frameworks/Rust/hyperlane/src/server/const.rs @@ -16,3 +16,6 @@ pub const KEY_RANDOM_NUMBER: &str = "randomnumber"; pub const KEY_MESSAGE: &str = "message"; pub const DB_MAX_CONNECTIONS: u32 = 100; pub const HTTP_BUFFER: usize = 256; +pub const QUERY_DB_QUERY_KEY: &str = "q"; +pub const UPDATE_DB_QUERY_KEY: &str = "q"; +pub const CACHE_QUERY_KEY: &str = "c"; diff --git a/frameworks/Rust/hyperlane/src/server.rs b/frameworks/Rust/hyperlane/src/server/fn.rs similarity index 96% rename from frameworks/Rust/hyperlane/src/server.rs rename to frameworks/Rust/hyperlane/src/server/fn.rs index fc12d800b43..d27bc3b2b4d 100644 --- a/frameworks/Rust/hyperlane/src/server.rs +++ b/frameworks/Rust/hyperlane/src/server/fn.rs @@ -21,7 +21,7 @@ async fn init_server() { let server: Server = Server::from(config).await; - server.request_middleware(request_middleware::request).await; + server.request_middleware(middleware::request).await; server .disable_http_hook("/plaintext") diff --git a/frameworks/Rust/hyperlane/src/type.rs b/frameworks/Rust/hyperlane/src/server/impl.rs similarity index 74% rename from frameworks/Rust/hyperlane/src/type.rs rename to frameworks/Rust/hyperlane/src/server/impl.rs index 0e23804c3d7..49072195701 100644 --- a/frameworks/Rust/hyperlane/src/type.rs +++ b/frameworks/Rust/hyperlane/src/server/impl.rs @@ -1,15 +1,5 @@ use super::*; -pub type DbPoolConnection = Pool; -pub type Queries = i32; - -#[allow(bad_style)] -#[derive(Serialize, Default, Clone)] -pub struct QueryRow { - pub id: Queries, - pub randomNumber: Queries, -} - impl QueryRow { pub fn new(id: Queries, random_number: Queries) -> Self { Self { @@ -19,21 +9,12 @@ impl QueryRow { } } -#[derive(Serialize)] -pub struct Fortunes { - pub id: Queries, - pub message: String, -} - impl Fortunes { pub fn new(id: Queries, message: String) -> Self { Self { id, message } } } -#[derive(Serialize)] -pub struct FortunesTemplate(pub Vec); - impl FortunesTemplate { pub fn new(list: Vec) -> Self { Self(list) diff --git a/frameworks/Rust/hyperlane/src/server/mod.rs b/frameworks/Rust/hyperlane/src/server/mod.rs new file mode 100644 index 00000000000..b5ef54eb72a --- /dev/null +++ b/frameworks/Rust/hyperlane/src/server/mod.rs @@ -0,0 +1,12 @@ +pub(crate) mod r#const; +pub(crate) mod r#fn; +pub(crate) mod r#impl; +pub(crate) mod r#struct; +pub(crate) mod r#type; + +pub use r#const::*; +pub use r#fn::*; +pub use r#struct::*; +pub use r#type::*; + +use super::*; diff --git a/frameworks/Rust/hyperlane/src/server/struct.rs b/frameworks/Rust/hyperlane/src/server/struct.rs new file mode 100644 index 00000000000..47cda95e823 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/server/struct.rs @@ -0,0 +1,17 @@ +use super::*; + +#[allow(bad_style)] +#[derive(Serialize, Default, Clone)] +pub struct QueryRow { + pub id: Queries, + pub randomNumber: Queries, +} + +#[derive(Serialize)] +pub struct Fortunes { + pub id: Queries, + pub message: String, +} + +#[derive(Serialize)] +pub struct FortunesTemplate(pub Vec); diff --git a/frameworks/Rust/hyperlane/src/server/type.rs b/frameworks/Rust/hyperlane/src/server/type.rs new file mode 100644 index 00000000000..797ed2084a0 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/server/type.rs @@ -0,0 +1 @@ +pub type Queries = i32; diff --git a/frameworks/Rust/hyperlane/src/utils.rs b/frameworks/Rust/hyperlane/src/utils/fn.rs similarity index 100% rename from frameworks/Rust/hyperlane/src/utils.rs rename to frameworks/Rust/hyperlane/src/utils/fn.rs diff --git a/frameworks/Rust/hyperlane/src/utils/mod.rs b/frameworks/Rust/hyperlane/src/utils/mod.rs new file mode 100644 index 00000000000..4ecc55e4383 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/utils/mod.rs @@ -0,0 +1,5 @@ +pub(crate) mod r#fn; + +pub use r#fn::*; + +use super::*; From cd6138930c6e35b619a853da0426b98d0d0e034c Mon Sep 17 00:00:00 2001 From: Tong Li <31761981+litongjava@users.noreply.github.com> Date: Mon, 25 Aug 2025 08:50:31 -1000 Subject: [PATCH 1582/1766] update to tio-http-server 3.7.3.v20250501-RELEASETio server (#9922) * upgrade to tio-http-server-3.7.3.v20250415-RELEASE * update to tio-http-server 3.7.3.v20250501-RELEASE --------- Co-authored-by: litongjava --- frameworks/Java/tio-http-server/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Java/tio-http-server/pom.xml b/frameworks/Java/tio-http-server/pom.xml index 51de86cf0b7..a4416f26e29 100644 --- a/frameworks/Java/tio-http-server/pom.xml +++ b/frameworks/Java/tio-http-server/pom.xml @@ -16,13 +16,13 @@ com.litongjava tio-http-server - 3.7.3.v20250415-RELEASE + 3.7.3.v20250501-RELEASE com.litongjava tio-utils - 3.7.3.v20250415-RELEASE + 3.7.3.v20250501-RELEASE com.litongjava From b79f8ba005ed83450bb8ee509295fb8cdfbdb65b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 28 Aug 2025 20:07:12 +0200 Subject: [PATCH 1583/1766] [ruby/rack-sequel] Use trilogy for the MySQL adapter (#10072) Trilogy is a new client library for MySQL-compatible database servers, designed for performance, flexibility, and ease of embedding. It is used by Github and Shopify in production and will probably replace the mysql2 library. https://github.com/trilogy-libraries/trilogy --- frameworks/Ruby/rack-sequel/Gemfile | 2 +- frameworks/Ruby/rack-sequel/Gemfile.lock | 4 ++-- frameworks/Ruby/rack-sequel/boot.rb | 16 ++++++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 944f2c8cc71..e0f583ed6af 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -5,7 +5,7 @@ gem 'sequel', '~> 5.0' gem 'rack', '~> 3.1' group :mysql, optional: true do - gem 'mysql2', '~> 0.4', platforms: [:ruby, :windows] + gem 'trilogy', '~> 2.9', platforms: [:ruby, :windows] end group :postgresql, optional: true do diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index c336c9058ba..4375f7cf65b 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -3,7 +3,6 @@ GEM specs: bigdecimal (3.1.9) json (2.13.2) - mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) puma (6.6.0) @@ -14,6 +13,7 @@ GEM sequel_pg (1.17.1) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) + trilogy (2.9.0) PLATFORMS ruby @@ -22,12 +22,12 @@ PLATFORMS DEPENDENCIES json (~> 2.8) - mysql2 (~> 0.4) pg (~> 1.5) puma (~> 6.5) rack (~> 3.1) sequel (~> 5.0) sequel_pg (~> 1.6) + trilogy (~> 2.9) BUNDLED WITH 2.7.0 diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index ff68415ef69..4a3aebbb651 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -8,13 +8,17 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules - adapters = { - mysql: 'mysql2', - postgresql: 'postgres' - } - opts = {} + if dbtype == :mysql + adapter = 'trilogy' + opts[:ssl] = true + opts[:ssl_mode] = 4 # Trilogy::SSL_PREFERRED_NOVERIFY + opts[:tls_min_version] = 3 # Trilogy::TLS_VERSION_12 + else + adapter = 'postgresql' + end + # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor @@ -23,7 +27,7 @@ def connect(dbtype) Sequel.connect \ '%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}' % { - adapter: (dbtype == :mysql ? 'mysql2' : 'postgresql'), + adapter: adapter, host: 'tfb-database', database: 'hello_world', user: 'benchmarkdbuser', From c2cb99bd6cf64d236b9fded28074075d9e84d055 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 28 Aug 2025 20:07:28 +0200 Subject: [PATCH 1584/1766] [ruby/sinatra-sequel] Use trilogy for the MySQL adapter (#10073) Trilogy is a new client library for MySQL-compatible database servers, designed for performance, flexibility, and ease of embedding. It is used by Github and Shopify in production and will probably replace the mysql2 library. https://github.com/trilogy-libraries/trilogy --- frameworks/Ruby/roda-sequel/Gemfile | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 4 ++-- frameworks/Ruby/sinatra-sequel/boot.rb | 16 ++++++++++------ 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 6cada0b74fc..ac560d03260 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -7,7 +7,7 @@ gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" group :mysql, optional: true do - gem 'trilogy', '~> 2.9.0', platforms: [:ruby, :windows] + gem 'trilogy', '~> 2.9', platforms: [:ruby, :windows] end group :postgresql, optional: true do diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index c83ae96e3de..16b023e0050 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -35,7 +35,7 @@ DEPENDENCIES sequel (~> 5.67) sequel_pg (~> 1.17) tilt (~> 2.1) - trilogy (~> 2.9.0) + trilogy (~> 2.9) BUNDLED WITH 2.7.0 diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index d8075931712..682ba17204d 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -5,7 +5,7 @@ gem 'sequel', '~> 5.0' gem 'sinatra', '~> 4.0', :require=>'sinatra/base' group :mysql, optional: true do - gem 'mysql2', '~> 0.5', :platforms=>[:ruby, :windows] + gem 'trilogy', '~> 2.9', platforms: [:ruby, :windows] end group :postgresql, optional: true do diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index b132a9f89b0..a935bd0f671 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -8,7 +8,6 @@ GEM logger (1.6.6) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) - mysql2 (0.5.6) nio4r (2.7.4) pg (1.5.9) puma (6.6.0) @@ -35,6 +34,7 @@ GEM rack-session (>= 2.0.0, < 3) tilt (~> 2.0) tilt (2.6.0) + trilogy (2.9.0) PLATFORMS ruby @@ -44,12 +44,12 @@ PLATFORMS DEPENDENCIES iodine (~> 0.7) json (~> 2.8) - mysql2 (~> 0.5) pg (~> 1.5) puma (~> 6.4) sequel (~> 5.0) sequel_pg (~> 1.6) sinatra (~> 4.0) + trilogy (~> 2.9) BUNDLED WITH 2.7.0 diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index bf12ee2a818..f47e26aaba0 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -15,13 +15,17 @@ def connect(dbtype) Bundler.require(dbtype) # Load database-specific modules - adapters = { - mysql: 'mysql2', - postgresql: 'postgres' - } - opts = {} + if dbtype == :mysql + adapter = 'trilogy' + opts[:ssl] = true + opts[:ssl_mode] = 4 # Trilogy::SSL_PREFERRED_NOVERIFY + opts[:tls_min_version] = 3 # Trilogy::TLS_VERSION_12 + else + adapter = 'postgresql' + end + # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor @@ -30,7 +34,7 @@ def connect(dbtype) Sequel.connect \ '%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}' % { - adapter: (dbtype == :mysql ? 'mysql2' : 'postgresql'), + adapter: adapter, host: 'tfb-database', database: 'hello_world', user: 'benchmarkdbuser', From 11542ce5710776b78a567e003f12d96323ee70c6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 28 Aug 2025 20:07:43 +0200 Subject: [PATCH 1585/1766] [ruby/rack] Set timeslice to 10ms (#10074) By default this is set to 100ms. https://github.com/ruby/ruby/pull/11981 --- frameworks/Ruby/rack/rack.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 63121a0ab02..6494c5be48b 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -2,6 +2,7 @@ FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 ENV RUBY_MN_THREADS=1 +ENV RUBY_THREAD_TIMESLICE=10 # Use Jemalloc RUN apt-get update && \ From f5eee1c9e4395cf68240983cd4bdc568638983fa Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 28 Aug 2025 20:07:56 +0200 Subject: [PATCH 1586/1766] [ruby/roda-sequel] Set timeslice to 10ms (#10075) --- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index 7a19e414a63..0ebcb805187 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -4,6 +4,7 @@ ADD ./ /roda-sequel WORKDIR /roda-sequel ENV RUBY_YJIT_ENABLE=1 +ENV RUBY_THREAD_TIMESLICE=10 # Use Jemalloc RUN apt-get update && \ From 5c7606bfa4738e735dc669fddf79d01a75d855a3 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Thu, 28 Aug 2025 19:08:11 +0100 Subject: [PATCH 1587/1766] H2O: Fix a build failure (#10076) --- frameworks/C/h2o/h2o.dockerfile | 3 ++- frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 6e6e5be09aa..b9c9aedd609 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -78,7 +78,8 @@ RUN apt-get -yqq update && \ apt-get -yqq install \ libnuma1 \ libpq5 \ - libyajl2 + libyajl2 && \ + apt-get -yqq upgrade ARG H2O_APP_PREFIX COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/" COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/" diff --git a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile index 98a1b31657f..984017f5503 100644 --- a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile +++ b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile @@ -44,6 +44,8 @@ RUN apt-get -yqq update && \ FROM "ubuntu:${UBUNTU_VERSION}" +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get -yqq update && apt-get -yqq upgrade ARG H2O_PREFIX COPY --from=compile "${H2O_PREFIX}/bin/h2o" "${H2O_PREFIX}/bin/" COPY --from=compile "${H2O_PREFIX}/share" "${H2O_PREFIX}/share/" From 474485fe30e51cd1700c40713c740833e4546753 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 28 Aug 2025 20:08:28 +0200 Subject: [PATCH 1588/1766] [ruby/rack-sequel] Use CGI.escape_html (#10077) For Rage this seems to be faster. --- frameworks/Ruby/rack-sequel/hello_world.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 17ff4a42c57..b1da02bb80b 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -70,7 +70,7 @@ def fortunes html << <<~"HTML" #{fortune.id} - #{Rack::Utils.escape_html(fortune.message)} + #{CGI.escape_html(fortune.message)} HTML end From b3db501e849bdcac1770770adca2734cea74b346 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 28 Aug 2025 20:08:44 +0200 Subject: [PATCH 1589/1766] Revert "[ruby] Use Rack::Utils.escape_html for escaping (#10032)" (#10078) Changing CGI.escape_html to Rack::Utils.escape_html made things slower instead of faster. Before commit 6c26a89dd7f9 +-----------+--------+-----+ | name|fortunes|query| +-----------+--------+-----+ |rage-sequel| 171239|28494| |rage | 105726|18625| After commit 6c26a89dd7f9 +-----------+--------+-----+ | name|fortunes|query| +-----------+--------+-----+ |rage-sequel| 153681|28319| |rage | 99163|19365| This reverts commit 6c26a89dd7f9bf03fa5b6211d5462f030c7dc6bb. --- frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb | 2 +- frameworks/Ruby/rage/app/views/fortunes.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb index c416e40b48f..2614ca7a7b2 100644 --- a/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb +++ b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb @@ -5,7 +5,7 @@ <% records.each do |record| %> - + <% end %>
      idmessage
      <%= record.id %><%= Rack::Utils.escape_html(record.message) %>
      <%= record.id %><%= CGI.escape_html(record.message) %>
      diff --git a/frameworks/Ruby/rage/app/views/fortunes.html.erb b/frameworks/Ruby/rage/app/views/fortunes.html.erb index 1b5afeaa763..1aa63f3772a 100644 --- a/frameworks/Ruby/rage/app/views/fortunes.html.erb +++ b/frameworks/Ruby/rage/app/views/fortunes.html.erb @@ -5,7 +5,7 @@ <% records.each do |record| %> - + <% end %>
      idmessage
      <%= record[:id] %><%= Rack::Utils.escape_html(record[:message]) %>
      <%= record[:id] %><%= CGI.escape_html(record[:message]) %>
      From 985c1a9c812fa20753d1f2793ee34d709a059052 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 28 Aug 2025 20:08:58 +0200 Subject: [PATCH 1590/1766] [ruby/agoo] Use CGI.escape_html (#10079) For Rage this seems to be faster. --- frameworks/Ruby/agoo/app.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index c288cffa9fe..4ec43676334 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -127,7 +127,7 @@ def self.call(_req) f_2 = f_1.map(&:to_h). append({ 'id' => '0', 'message' => 'Additional fortune added at request time.' }). sort_by { |item| item['message'] }. - map { |f| "#{ f['id'] }#{ Rack::Utils.escape_html(f['message']) }" }. + map { |f| "#{ f['id'] }#{ CGI.escape_html(f['message']) }" }. join html_response(<<-HTML) From 536cd18efec11f76b41452bdc9dddb40eab503e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Aug 2025 18:16:13 +0000 Subject: [PATCH 1591/1766] Build(deps): bump tornado from 6.4.2 to 6.5 in /frameworks/Python/bottle Bumps [tornado](https://github.com/tornadoweb/tornado) from 6.4.2 to 6.5. - [Changelog](https://github.com/tornadoweb/tornado/blob/master/docs/releases.rst) - [Commits](https://github.com/tornadoweb/tornado/compare/v6.4.2...v6.5.0) --- updated-dependencies: - dependency-name: tornado dependency-version: '6.5' dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/bottle/requirements-pypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/bottle/requirements-pypy.txt b/frameworks/Python/bottle/requirements-pypy.txt index 2924995bee7..0e66864a04e 100644 --- a/frameworks/Python/bottle/requirements-pypy.txt +++ b/frameworks/Python/bottle/requirements-pypy.txt @@ -3,4 +3,4 @@ bottle-sqlalchemy==0.4.3 gunicorn==23.0.0 PyMySQL==0.8.0 SQLAlchemy==1.3.0 -tornado==6.4.2 +tornado==6.5 From cd793dd456ced3de6551fbfc294fee62f308efd6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Aug 2025 20:56:33 +0000 Subject: [PATCH 1592/1766] Build(deps): bump tracing-subscriber in /frameworks/Rust/hyper Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.19 to 0.3.20. - [Release notes](https://github.com/tokio-rs/tracing/releases) - [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.19...tracing-subscriber-0.3.20) --- updated-dependencies: - dependency-name: tracing-subscriber dependency-version: 0.3.20 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Rust/hyper/Cargo.lock | 39 ++++---------------------------- frameworks/Rust/hyper/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 35 deletions(-) diff --git a/frameworks/Rust/hyper/Cargo.lock b/frameworks/Rust/hyper/Cargo.lock index 5158b30a40c..e0f90aad74a 100644 --- a/frameworks/Rust/hyper/Cargo.lock +++ b/frameworks/Rust/hyper/Cargo.lock @@ -620,12 +620,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -653,12 +652,6 @@ version = "1.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "parking_lot" version = "0.12.3" @@ -1155,9 +1148,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -1323,28 +1316,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[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.52.0" diff --git a/frameworks/Rust/hyper/Cargo.toml b/frameworks/Rust/hyper/Cargo.toml index 9eb7ef7ccbc..829dadf8bcd 100644 --- a/frameworks/Rust/hyper/Cargo.toml +++ b/frameworks/Rust/hyper/Cargo.toml @@ -44,7 +44,7 @@ tokio-postgres = { version = "0.7.13", default-features = false, features = [ "runtime", ] } tracing = "0.1.41" -tracing-subscriber = "0.3.19" +tracing-subscriber = "0.3.20" v_htmlescape = "0.15.8" [profile.release] From 72165896d3042c26dd0b5649eb2ffa29c36ececf Mon Sep 17 00:00:00 2001 From: kanarus Date: Sat, 30 Aug 2025 09:07:22 +0900 Subject: [PATCH 1593/1766] rust: bump ohkami to v0.24 (#10081) * rust: bump ohkami to v0.24 * update rt_tokio impl --- .../Rust/ohkami/{rt_async-std => }/Cargo.lock | 2194 ++++++++--------- frameworks/Rust/ohkami/Cargo.toml | 25 +- frameworks/Rust/ohkami/README.md | 20 +- frameworks/Rust/ohkami/benchmark_config.json | 21 - .../Rust/ohkami/rt_async-std.dockerfile | 26 - .../Rust/ohkami/rt_async-std/Cargo.toml | 14 - .../Rust/ohkami/rt_async-std/src/main.rs | 5 - frameworks/Rust/ohkami/rt_glommio.dockerfile | 2 +- frameworks/Rust/ohkami/rt_glommio/Cargo.toml | 4 +- frameworks/Rust/ohkami/rt_glommio/src/main.rs | 13 +- frameworks/Rust/ohkami/rt_nio.dockerfile | 2 +- frameworks/Rust/ohkami/rt_nio/Cargo.toml | 2 +- frameworks/Rust/ohkami/rt_smol.dockerfile | 2 +- frameworks/Rust/ohkami/rt_smol/Cargo.toml | 2 +- frameworks/Rust/ohkami/rt_tokio.dockerfile | 2 +- frameworks/Rust/ohkami/rt_tokio/Cargo.lock | 1677 +++++-------- frameworks/Rust/ohkami/rt_tokio/Cargo.toml | 5 +- frameworks/Rust/ohkami/rt_tokio/src/main.rs | 42 +- frameworks/Rust/ohkami/src/fangs.rs | 41 +- frameworks/Rust/ohkami/src/lib.rs | 78 +- frameworks/Rust/ohkami/src/models.rs | 6 +- frameworks/Rust/ohkami/src/postgres.rs | 151 +- frameworks/Rust/ohkami/src/templates.rs | 3 +- 23 files changed, 1823 insertions(+), 2514 deletions(-) rename frameworks/Rust/ohkami/{rt_async-std => }/Cargo.lock (63%) delete mode 100644 frameworks/Rust/ohkami/rt_async-std.dockerfile delete mode 100644 frameworks/Rust/ohkami/rt_async-std/Cargo.toml delete mode 100644 frameworks/Rust/ohkami/rt_async-std/src/main.rs diff --git a/frameworks/Rust/ohkami/rt_async-std/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock similarity index 63% rename from frameworks/Rust/ohkami/rt_async-std/Cargo.lock rename to frameworks/Rust/ohkami/Cargo.lock index 8893a3fae9b..4760079eca4 100644 --- a/frameworks/Rust/ohkami/rt_async-std/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -2,6 +2,32 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -11,12 +37,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "annotate-snippets" version = "0.9.2" @@ -28,33 +48,22 @@ dependencies = [ ] [[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "async-channel" -version = "1.9.0" +name = "anysc-rustls" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "7b04ec47ea6da4486baee0d3d4b18fb4b8c89d777f1005d5235c4caf164fa6d1" dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", + "futures-rustls", + "tokio-rustls", ] [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ - "concurrent-queue", + "concurrent-queue 2.5.0", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -62,116 +71,103 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ "async-task", - "concurrent-queue", + "concurrent-queue 2.5.0", "fastrand 2.3.0", - "futures-lite 2.6.0", + "futures-lite 2.6.1", + "pin-project-lite", "slab", ] [[package]] -name = "async-global-executor" -version = "2.4.1" +name = "async-fs" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +checksum = "09f7e37c0ed80b2a977691c47dae8625cfb21e205827106c64f7c588766b2e50" dependencies = [ - "async-channel 2.3.1", - "async-executor", - "async-io 2.4.0", - "async-lock 3.4.0", + "async-lock", "blocking", - "futures-lite 2.6.0", - "once_cell", + "futures-lite 2.6.1", ] [[package]] name = "async-io" -version = "1.13.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" dependencies = [ - "async-lock 2.8.0", - "autocfg", + "async-lock", "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", + "concurrent-queue 2.5.0", + "futures-io", + "futures-lite 2.6.1", "parking", - "polling 2.8.0", - "rustix 0.37.28", + "polling", + "rustix 1.0.8", "slab", - "socket2", - "waker-fn", + "windows-sys 0.60.2", ] [[package]] -name = "async-io" -version = "2.4.0" +name = "async-lock" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "async-lock 3.4.0", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.6.0", - "parking", - "polling 3.7.4", - "rustix 0.38.44", - "slab", - "tracing", - "windows-sys 0.59.0", + "event-listener", + "event-listener-strategy", + "pin-project-lite", ] [[package]] -name = "async-lock" -version = "2.8.0" +name = "async-net" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "event-listener 2.5.3", + "async-io", + "blocking", + "futures-lite 2.6.1", ] [[package]] -name = "async-lock" -version = "3.4.0" +name = "async-process" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" dependencies = [ - "event-listener 5.4.0", - "event-listener-strategy", - "pin-project-lite", + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite 2.6.1", + "rustix 1.0.8", ] [[package]] -name = "async-std" -version = "1.13.0" +name = "async-signal" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" dependencies = [ - "async-attributes", - "async-channel 1.9.0", - "async-global-executor", - "async-io 2.4.0", - "async-lock 3.4.0", - "crossbeam-utils", - "futures-channel", + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", "futures-core", "futures-io", - "futures-lite 2.6.0", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", + "rustix 1.0.8", + "signal-hook-registry", "slab", - "wasm-bindgen-futures", + "windows-sys 0.60.2", ] [[package]] @@ -181,12 +177,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] -name = "atoi" -version = "2.0.0" +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ - "num-traits", + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -197,9 +195,47 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "backtrace" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] [[package]] name = "base64" @@ -208,25 +244,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "base64ct" -version = "1.6.0" +name = "bindgen" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease 0.2.37", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.106", + "which", +] [[package]] name = "bitflags" -version = "1.3.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" [[package]] -name = "bitflags" -version = "2.8.0" +name = "bitmaps" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" -dependencies = [ - "serde", -] +checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" [[package]] name = "block-buffer" @@ -239,22 +289,28 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.3.1", + "async-channel", "async-task", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "piper", ] +[[package]] +name = "buddy-alloc" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3240a4cb09cf0da6a51641bd40ce90e96ea6065e3a1adc46434029254bcc2d09" + [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byte_reader" @@ -270,24 +326,41 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cache-padded" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" [[package]] name = "cc" -version = "1.2.10" +version = "1.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" dependencies = [ + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -295,20 +368,43 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + [[package]] name = "concurrent-queue" -version = "2.5.0" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c" dependencies = [ - "crossbeam-utils", + "cache-padded", ] [[package]] -name = "const-oid" -version = "0.9.6" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] [[package]] name = "convert_case" @@ -317,44 +413,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] -name = "core-foundation" -version = "0.9.4" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "core-foundation-sys", "libc", ] [[package]] -name = "core-foundation-sys" -version = "0.8.7" +name = "crossbeam" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "crossbeam-channel" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "libc", + "crossbeam-utils", ] [[package]] -name = "crc" -version = "3.2.1" +name = "crossbeam-deque" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "crc-catalog", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "crc-catalog" -version = "2.4.0" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] [[package]] name = "crossbeam-queue" @@ -383,36 +489,25 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.5" +version = "3.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" dependencies = [ - "nix", + "nix 0.30.1", "windows-sys 0.59.0", ] -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] @@ -422,97 +517,71 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", - "const-oid", "crypto-common", "subtle", ] [[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" +name = "dtoa" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] -name = "dtoa" -version = "1.0.9" +name = "dunce" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" -dependencies = [ - "serde", -] +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "equivalent" -version = "1.0.1" +name = "enclose" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "eef75b364b1baff88ff28dc34e4c7c0ebd138abd76f4e58e24e37d9b7f54b8f1" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.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", + "windows-sys 0.60.2", ] [[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 = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ - "concurrent-queue", + "concurrent-queue 2.5.0", "parking", "pin-project-lite", ] [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.0", + "event-listener", "pin-project-lite", ] +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fastrand" version = "1.9.0" @@ -530,62 +599,48 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flume" -version = "0.11.1" +version = "0.10.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" dependencies = [ "futures-core", "futures-sink", + "nanorand", + "pin-project", "spin", ] [[package]] -name = "foldhash" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +name = "framework_benchmarks" +version = "0.24.0" dependencies = [ - "foreign-types-shared", + "futures-util", + "ohkami", + "rand 0.8.5", + "tokio", + "tokio-postgres", + "yarte", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "fs_extra" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "framework_benchmarks" -version = "0.21.0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", "futures-util", - "ohkami", - "rand", - "sqlx", - "yarte", -] - -[[package]] -name = "framework_benchmarks-async-std" -version = "0.0.0" -dependencies = [ - "async-std", - "framework_benchmarks", ] [[package]] @@ -615,17 +670,6 @@ dependencies = [ "futures-util", ] -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - [[package]] name = "futures-io" version = "0.3.31" @@ -649,9 +693,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand 2.3.0", "futures-core", @@ -668,7 +712,18 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", +] + +[[package]] +name = "futures-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" +dependencies = [ + "futures-io", + "rustls", + "rustls-pki-types", ] [[package]] @@ -689,6 +744,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -712,79 +768,81 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] -name = "hashbrown" -version = "0.15.2" +name = "getrandom" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.3+wasi-0.2.4", ] [[package]] -name = "hashlink" -version = "0.10.0" +name = "gimli" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown", -] +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] -name = "heck" -version = "0.5.0" +name = "glob" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] -name = "hermit-abi" -version = "0.3.9" +name = "glommio" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "e1f8bc1fce949d18098dc0a4e861314e40351a0144ebf61e59bdb5254a2273b2" +dependencies = [ + "ahash", + "backtrace", + "bitflags", + "bitmaps", + "buddy-alloc", + "cc", + "concurrent-queue 1.2.4", + "crossbeam", + "enclose", + "flume", + "futures-lite 1.13.0", + "intrusive-collections", + "lazy_static", + "libc", + "lockfree", + "log", + "nix 0.27.1", + "pin-project-lite", + "rlimit", + "scoped-tls", + "scopeguard", + "signal-hook", + "sketches-ddsketch", + "smallvec", + "socket2 0.4.10", + "tracing", + "typenum", +] [[package]] name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hex" -version = "0.4.3" +version = "0.5.2" 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", -] +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hmac" @@ -805,395 +863,354 @@ dependencies = [ ] [[package]] -name = "icu_collections" -version = "1.5.0" +name = "instant" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", + "cfg-if", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "intrusive-collections" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "memoffset", ] [[package]] -name = "icu_locid_transform" -version = "1.5.0" +name = "io-uring" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", + "bitflags", + "cfg-if", + "libc", ] [[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", + "either", ] [[package]] -name = "icu_normalizer_data" -version = "1.5.0" +name = "itoa" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] -name = "icu_properties" -version = "1.5.1" +name = "jobserver" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", + "getrandom 0.3.3", + "libc", ] [[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" +name = "js-sys" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "icu_provider_macros" +name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "idna" -version = "1.0.3" +name = "lazycell" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] -name = "idna_adapter" -version = "1.2.0" +name = "libc" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] -name = "indexmap" -version = "2.7.1" +name = "libloading" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ - "equivalent", - "hashbrown", + "cfg-if", + "windows-targets 0.53.3", ] [[package]] -name = "instant" -version = "0.1.13" +name = "libredox" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ - "cfg-if", + "bitflags", + "libc", + "redox_syscall", ] [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "linux-raw-sys" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] -name = "itoa" -version = "1.0.14" +name = "linux-raw-sys" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] -name = "js-sys" -version = "0.3.77" +name = "lock_api" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ - "once_cell", - "wasm-bindgen", + "autocfg", + "scopeguard", ] [[package]] -name = "kv-log-macro" -version = "1.0.7" +name = "lockfree" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +checksum = "74ee94b5ad113c7cb98c5a040f783d0952ee4fe100993881d1673c2cb002dd23" dependencies = [ - "log", + "owned-alloc", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "log" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "spin", + "cfg-if", + "digest", ] [[package]] -name = "libc" -version = "0.2.169" +name = "memchr" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] -name = "libm" -version = "0.2.11" +name = "memoffset" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] [[package]] -name = "libsqlite3-sys" -version = "0.30.1" +name = "mews" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +checksum = "8554a5554e9be00776567382b100a89e550a6031fc76356455157d230caca7a5" dependencies = [ - "pkg-config", - "vcpkg", + "base64", + "futures-util", + "glommio", + "nio", + "sha1", + "smol", + "tokio", ] [[package]] -name = "linux-raw-sys" -version = "0.3.8" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "linux-raw-sys" -version = "0.4.15" +name = "mime_guess" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] [[package]] -name = "litemap" -version = "0.7.4" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "lock_api" -version = "0.4.12" +name = "miniz_oxide" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "autocfg", - "scopeguard", + "adler2", ] [[package]] -name = "log" -version = "0.4.25" +name = "mio" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ - "value-bag", + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] -name = "md-5" -version = "0.10.6" +name = "mpmc-channel" +version = "0.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] +checksum = "9184bf37b24a7fcdc91a9ca61efc4f3510276693f4693735556a77cc42cc342c" [[package]] -name = "memchr" -version = "2.7.4" +name = "nanorand" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.16", +] [[package]] -name = "mews" -version = "0.2.0" +name = "nio" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21788e6e675e8f19754e8c520ed420977ebade2867e2ff8363357b68c2ef8e8a" +checksum = "85c8716fafb666bc4100593e8dcbbf930480692f9cd7755b21279343ff52b8db" dependencies = [ - "async-std", - "base64", - "sha1", + "crossbeam-channel", + "futures", + "libc", + "mio", + "mpmc-channel", + "nio-macros", + "socket2 0.5.10", + "tokio", ] [[package]] -name = "native-tls" -version = "0.2.13" +name = "nio-macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" +checksum = "4a67f7f91ca31eaa3fa95a2654d86f34ea912e3b0fec9f4a89e0890b64a4e33e" dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "quote2", + "syn 2.0.106", ] [[package]] name = "nix" -version = "0.29.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.8.0", + "bitflags", "cfg-if", - "cfg_aliases", "libc", + "memoffset", ] [[package]] -name = "num-bigint-dig" -version = "0.8.4" +name = "nix" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "num-traits", + "memchr", + "minimal-lexical", ] [[package]] -name = "num-iter" -version = "0.1.45" +name = "num_cpus" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "hermit-abi", + "libc", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "object" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ - "autocfg", - "libm", + "memchr", ] [[package]] name = "ohkami" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37844b8da12eece89bd239e4d8cb7d7dad07978f6f20b3917d6fe7c289361f58" +checksum = "82a18bebc444bf9ed43b2ae864b111da831d584fa46e88aa9fa26b72d3afaf4a" dependencies = [ - "async-std", + "anysc-rustls", "base64", "byte_reader", "ctrlc", "futures-util", + "glommio", "hmac", "mews", + "mime_guess", + "nio", + "num_cpus", "ohkami_lib", "ohkami_macros", "serde", "serde_json", "sha2", + "smol", + "tokio", + "uuid", ] [[package]] name = "ohkami_lib" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e95fa8274aba0c04904453fdd847898faf86856f7e80180305a51a5636338ed8" +checksum = "057e4f200cc0d0cc66a28d55fe371acc5a7c02f66ef13c0b41a84c8ff88d1025" dependencies = [ "byte_reader", "percent-encoding", @@ -1202,64 +1219,26 @@ dependencies = [ [[package]] name = "ohkami_macros" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f326ade375c9f24daa9c029f2f6019bff9157bb780239839a6e4ce9aa136178f" +checksum = "15df818179dd272de9c427c08b3d5eaf7511cfdf41e63b232ce99723d603be0c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "openssl" -version = "0.10.72" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" -dependencies = [ - "bitflags 2.8.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" +name = "owned-alloc" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] +checksum = "30fceb411f9a12ff9222c5f824026be368ff15dc2f13468d850c7d3f502205d6" [[package]] name = "parking" @@ -1269,9 +1248,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1279,9 +1258,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -1291,19 +1270,48 @@ dependencies = [ ] [[package]] -name = "pem-rfc7468" -version = "0.7.0" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "base64ct", + "phf_shared", ] [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] name = "pin-project-lite" @@ -1329,68 +1337,53 @@ dependencies = [ ] [[package]] -name = "pkcs1" -version = "0.7.5" +name = "polling" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" dependencies = [ - "der", - "pkcs8", - "spki", + "cfg-if", + "concurrent-queue 2.5.0", + "hermit-abi", + "pin-project-lite", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "postgres-protocol" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", + "base64", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand 0.9.2", + "sha2", + "stringprep", ] [[package]] -name = "polling" -version = "3.7.4" +name = "postgres-types" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi 0.4.0", - "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "bytes", + "fallible-iterator", + "postgres-protocol", ] [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -1405,24 +1398,57 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.106", +] + [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "c61aa775e928368b9a33bcac44f47f4132f30b0b6a17eb15c0873fc8af899211" dependencies = [ "proc-macro2", + "quote", + "quote2-macros", ] +[[package]] +name = "quote2-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ceeba20cfeffd4e0f7dd03ef72e55d115be2927b97424249a02fed0e86647a" + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -1430,8 +1456,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -1441,7 +1477,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1450,23 +1496,32 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", ] [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.8.0", + "bitflags", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -1476,9 +1531,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -1487,30 +1542,45 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] -name = "rsa" -version = "0.9.7" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", ] +[[package]] +name = "rlimit" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc0bf25554376fd362f54332b8410a625c71f15445bca32ffdfdf4ec9ac91726" +dependencies = [ + "libc", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.1" @@ -1522,112 +1592,121 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.28" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 1.3.2", + "bitflags", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "0.38.44" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags 2.8.0", + "bitflags", "errno", "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "linux-raw-sys 0.9.4", + "windows-sys 0.60.2", ] [[package]] -name = "rustversion" -version = "1.0.19" +name = "rustls" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] [[package]] -name = "ryu" -version = "1.0.18" +name = "rustls-pki-types" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] -name = "schannel" -version = "0.1.27" +name = "rustls-webpki" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ - "windows-sys 0.59.0", + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] -name = "security-framework" -version = "2.11.1" +name = "ryu" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.8.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] -name = "security-framework-sys" -version = "2.14.0" +name = "scoped-tls" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.137" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -1635,18 +1714,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "sha1" version = "0.10.6" @@ -1660,9 +1727,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -1676,255 +1743,103 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[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 = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.4.10" +name = "signal-hook" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", - "winapi", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", + "signal-hook-registry", ] [[package]] -name = "spki" -version = "0.7.3" +name = "signal-hook-registry" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ - "base64ct", - "der", + "libc", ] [[package]] -name = "sqlx" -version = "0.8.3" +name = "siphasher" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] -name = "sqlx-core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" -dependencies = [ - "async-io 1.13.0", - "async-std", - "bytes", - "crc", - "crossbeam-queue", - "either", - "event-listener 5.4.0", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashbrown", - "hashlink", - "indexmap", - "log", - "memchr", - "native-tls", - "once_cell", - "percent-encoding", - "serde", - "serde_json", - "sha2", - "smallvec", - "thiserror", - "tracing", - "url", -] +name = "sketches-ddsketch" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d2ecae5fcf33b122e2e6bd520a57ccf152d2dde3b38c71039df1a6867264ee" [[package]] -name = "sqlx-macros" -version = "0.8.3" +name = "slab" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 2.0.96", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "sqlx-macros-core" -version = "0.8.3" +name = "smol" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" dependencies = [ - "async-std", - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 2.0.96", - "tempfile", - "url", + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite 2.6.1", ] [[package]] -name = "sqlx-mysql" -version = "0.8.3" +name = "socket2" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ - "atoi", - "base64", - "bitflags 2.8.0", - "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", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "whoami", + "libc", + "winapi", ] [[package]] -name = "sqlx-postgres" -version = "0.8.3" +name = "socket2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "atoi", - "base64", - "bitflags 2.8.0", - "byteorder", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "whoami", + "libc", + "windows-sys 0.52.0", ] [[package]] -name = "sqlx-sqlite" -version = "0.8.3" +name = "socket2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ - "atoi", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "serde_urlencoded", - "sqlx-core", - "tracing", - "url", + "libc", + "windows-sys 0.59.0", ] [[package]] -name = "stable_deref_trait" -version = "1.2.0" +name = "spin" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "stringprep" @@ -1956,9 +1871,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1966,75 +1881,86 @@ dependencies = [ ] [[package]] -name = "synstructure" -version = "0.13.1" +name = "tinyvec" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", + "tinyvec_macros", ] [[package]] -name = "tempfile" -version = "3.15.0" +name = "tinyvec_macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" -dependencies = [ - "cfg-if", - "fastrand 2.3.0", - "getrandom", - "once_cell", - "rustix 0.38.44", - "windows-sys 0.59.0", -] +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] -name = "thiserror" -version = "2.0.11" +name = "tokio" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ - "thiserror-impl", + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "pin-project-lite", + "slab", + "socket2 0.6.0", + "windows-sys 0.59.0", ] [[package]] -name = "thiserror-impl" -version = "2.0.11" +name = "tokio-postgres" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.9.2", + "socket2 0.5.10", + "tokio", + "tokio-util", + "whoami", ] [[package]] -name = "tinystr" -version = "0.7.6" +name = "tokio-rustls" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "displaydoc", - "zerovec", + "rustls", + "tokio", ] [[package]] -name = "tinyvec" -version = "1.8.1" +name = "tokio-util" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ - "tinyvec_macros", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml" version = "0.5.11" @@ -2050,7 +1976,6 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2058,29 +1983,35 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicase" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" @@ -2090,9 +2021,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -2122,27 +2053,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "utf8_iter" -version = "1.0.4" +name = "uuid" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "v_eval" @@ -2160,18 +2084,6 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" -[[package]] -name = "value-bag" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" @@ -2186,9 +2098,18 @@ checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.3+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +dependencies = [ + "wit-bindgen", +] [[package]] name = "wasite" @@ -2218,23 +2139,10 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.100" @@ -2253,7 +2161,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2277,14 +2185,27 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + [[package]] name = "whoami" -version = "1.5.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall", + "libredox", "wasite", + "web-sys", ] [[package]] @@ -2309,13 +2230,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2328,18 +2255,12 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-sys" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 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", + "windows-targets 0.53.3", ] [[package]] @@ -2351,7 +2272,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", @@ -2359,10 +2280,21 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" +name = "windows-targets" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] [[package]] name = "windows_aarch64_gnullvm" @@ -2371,10 +2303,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +name = "windows_aarch64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" @@ -2383,10 +2315,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] -name = "windows_i686_gnu" -version = "0.48.5" +name = "windows_aarch64_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" @@ -2394,6 +2326,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" @@ -2401,10 +2339,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] -name = "windows_i686_msvc" -version = "0.48.5" +name = "windows_i686_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" @@ -2413,10 +2351,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +name = "windows_i686_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" @@ -2425,10 +2363,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +name = "windows_x86_64_gnu" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" @@ -2437,10 +2375,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +name = "windows_x86_64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" @@ -2449,16 +2387,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "write16" -version = "1.0.0" +name = "windows_x86_64_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] -name = "writeable" -version = "0.5.5" +name = "wit-bindgen" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" [[package]] name = "yansi-term" @@ -2515,7 +2453,7 @@ checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" dependencies = [ "dtoa", "itoa", - "prettyplease", + "prettyplease 0.1.25", "serde", "syn 1.0.109", "toml", @@ -2554,70 +2492,24 @@ dependencies = [ "yarte_helpers", ] -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", - "synstructure", -] - [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", - "synstructure", + "syn 2.0.106", ] [[package]] @@ -2625,25 +2517,3 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index 83638ba7d79..c905f405235 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -1,20 +1,19 @@ [package] name = "framework_benchmarks" -version = "0.21.0" -edition = "2021" +version = "0.24.0" +edition = "2024" authors = ["kanarus "] [dependencies] -ohkami = { version = "0.21" } -yarte = { optional = true, version = "0.15" } -futures-util = { optional = true, version = "0.3" } -rand = { optional = true, version = "0.8", features = ["small_rng"] } -sqlx = { optional = true, version = "0.8", features = ["postgres", "tls-native-tls"] } +ohkami = { version = "0.24" } +tokio = { optional = true, version = "1.47", features = ["rt"] } +tokio-postgres = { optional = true, version = "0.7" } +yarte = { optional = true, version = "0.15" } +futures-util = { optional = true, version = "0.3" } +rand = { optional = true, version = "0.8", features = ["small_rng"] } [features] -db = ["yarte", "futures-util", "rand", "sqlx"] -rt_tokio = ["ohkami/rt_tokio", "db", "sqlx/runtime-tokio"] -rt_async-std = ["ohkami/rt_async-std", "db", "sqlx/runtime-async-std"] -rt_smol = ["ohkami/rt_smol"] -rt_glommio = ["ohkami/rt_glommio"] -rt_nio = ["ohkami/rt_nio"] +rt_tokio = ["ohkami/rt_tokio", "tokio", "tokio-postgres", "yarte", "futures-util", "rand"] +rt_smol = ["ohkami/rt_smol"] +rt_glommio = ["ohkami/rt_glommio"] +rt_nio = ["ohkami/rt_nio"] diff --git a/frameworks/Rust/ohkami/README.md b/frameworks/Rust/ohkami/README.md index d9fda426ed3..288c9fe1b1d 100644 --- a/frameworks/Rust/ohkami/README.md +++ b/frameworks/Rust/ohkami/README.md @@ -1,18 +1,10 @@ -# [Ohkami](https://github.com/kana-rus/ohkami) - Intuitive and Declarative Web Framework for Rust +# [Ohkami](https://github.com/ohkami-rs/ohkami) - A performant, declarative, and runtime-flexible web framework for Rust -## Description +## Features -> 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`, `worker` (Cloudflare Workers) - -- [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 with [sqlx](https://github.com/launchbadge/sqlx) +> - *macro-less and type-safe* APIs for declarative, ergonomic code +> - *runtime-flexible* : `tokio`, `smol`, `nio`, `glommio` and `worker` (Cloudflare Workers), `lambda` (AWS Lambda) +> - good performance, no-network testing, well-structured middlewares, Server-Sent Events, WebSocket, highly integrated OpenAPI document generation, ... ## Test URLs @@ -38,4 +30,4 @@ PostgreSQL with [sqlx](https://github.com/launchbadge/sqlx) ### 6. Plaintext - http://localhost:8000/plaintext \ No newline at end of file + http://localhost:8000/plaintext diff --git a/frameworks/Rust/ohkami/benchmark_config.json b/frameworks/Rust/ohkami/benchmark_config.json index 654faa24d48..ce44db39c24 100644 --- a/frameworks/Rust/ohkami/benchmark_config.json +++ b/frameworks/Rust/ohkami/benchmark_config.json @@ -23,27 +23,6 @@ "update_url": "/updates?q=", "plaintext_url": "/plaintext" }, - "rt_async-std": { - "dockerfile": "rt_async-std.dockerfile", - "display_name": "Ohkami [async-std]", - "framework": "Ohkami", - "webserver": "Ohkami", - "language": "Rust", - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "orm": "Raw", - "platform": "None", - "os": "Linux", - "database_os": "Linux", - "port": 8000, - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?q=", - "fortune_url": "/fortunes", - "update_url": "/updates?q=", - "plaintext_url": "/plaintext" - }, "rt_smol": { "dockerfile": "rt_smol.dockerfile", "display_name": "Ohkami [smol]", diff --git a/frameworks/Rust/ohkami/rt_async-std.dockerfile b/frameworks/Rust/ohkami/rt_async-std.dockerfile deleted file mode 100644 index c9fd1be3388..00000000000 --- a/frameworks/Rust/ohkami/rt_async-std.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM rust:1.84-slim-bookworm AS builder - -RUN apt update && apt install -y --no-install-recommends \ - pkg-config \ - libpq-dev libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -COPY ./Cargo.toml /build/ -COPY ./src/ /build/src/ -COPY ./rt_async-std/ /build/rt_async-std/ - -WORKDIR /build/rt_async-std -ENV RUSTFLAGS="-C target-cpu=native" -RUN cargo build --release - -########################################################## - -FROM gcr.io/distroless/cc-debian12 - -COPY --from=builder /build/rt_async-std/target/release/framework_benchmarks-async-std /app/ - -EXPOSE 8000 -ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world -ENV MAX_CONNECTIONS=56 -ENV MIN_CONNECTIONS=56 -CMD [ "/app/framework_benchmarks-async-std" ] diff --git a/frameworks/Rust/ohkami/rt_async-std/Cargo.toml b/frameworks/Rust/ohkami/rt_async-std/Cargo.toml deleted file mode 100644 index 81cc7b817b9..00000000000 --- a/frameworks/Rust/ohkami/rt_async-std/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "framework_benchmarks-async-std" -version = "0.0.0" -edition = "2021" -authors = ["kanarus "] - -[profile.release] -lto = true -panic = "abort" -codegen-units = 1 - -[dependencies] -framework_benchmarks = { path = "..", features = ["rt_async-std"] } -async-std = { version = "1.13", features = ["attributes"] } diff --git a/frameworks/Rust/ohkami/rt_async-std/src/main.rs b/frameworks/Rust/ohkami/rt_async-std/src/main.rs deleted file mode 100644 index b65f3148d9b..00000000000 --- a/frameworks/Rust/ohkami/rt_async-std/src/main.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[async_std::main] -async fn main() { - framework_benchmarks::ohkami().await - .howl("0.0.0.0:8000").await -} diff --git a/frameworks/Rust/ohkami/rt_glommio.dockerfile b/frameworks/Rust/ohkami/rt_glommio.dockerfile index e7462c2765f..d8426468dec 100644 --- a/frameworks/Rust/ohkami/rt_glommio.dockerfile +++ b/frameworks/Rust/ohkami/rt_glommio.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.84-slim-bookworm AS builder +FROM rust:1.89-slim-bookworm AS builder RUN apt update && apt install -y --no-install-recommends \ pkg-config \ diff --git a/frameworks/Rust/ohkami/rt_glommio/Cargo.toml b/frameworks/Rust/ohkami/rt_glommio/Cargo.toml index 09aee0f200d..78bc03f50b8 100644 --- a/frameworks/Rust/ohkami/rt_glommio/Cargo.toml +++ b/frameworks/Rust/ohkami/rt_glommio/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "framework_benchmarks-glommio" version = "0.0.0" -edition = "2021" +edition = "2024" authors = ["kanarus "] [profile.release] @@ -12,4 +12,4 @@ codegen-units = 1 [dependencies] framework_benchmarks = { path = "..", features = ["rt_glommio"] } glommio = { version = "0.9" } -num_cpus = { version = "1.16" } +num_cpus = { version = "1.17" } diff --git a/frameworks/Rust/ohkami/rt_glommio/src/main.rs b/frameworks/Rust/ohkami/rt_glommio/src/main.rs index af663d416b6..965a47f4912 100644 --- a/frameworks/Rust/ohkami/rt_glommio/src/main.rs +++ b/frameworks/Rust/ohkami/rt_glommio/src/main.rs @@ -1,10 +1,11 @@ use glommio::{LocalExecutorPoolBuilder, PoolPlacement, CpuSet}; fn main() { - LocalExecutorPoolBuilder::new(PoolPlacement::MaxSpread( - num_cpus::get(), CpuSet::online().ok() - )).on_all_shards(|| async { - framework_benchmarks::ohkami().await - .howl("0.0.0.0:8000").await - }).unwrap().join_all(); + LocalExecutorPoolBuilder::new(PoolPlacement::MaxSpread(num_cpus::get(), CpuSet::online().ok())) + .on_all_shards(|| async { + framework_benchmarks::ohkami().await + .howl("0.0.0.0:8000").await + }) + .unwrap() + .join_all(); } diff --git a/frameworks/Rust/ohkami/rt_nio.dockerfile b/frameworks/Rust/ohkami/rt_nio.dockerfile index 49b764a9cb9..af664d37c84 100644 --- a/frameworks/Rust/ohkami/rt_nio.dockerfile +++ b/frameworks/Rust/ohkami/rt_nio.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.84-slim-bookworm AS builder +FROM rust:1.89-slim-bookworm AS builder RUN apt update && apt install -y --no-install-recommends \ pkg-config \ diff --git a/frameworks/Rust/ohkami/rt_nio/Cargo.toml b/frameworks/Rust/ohkami/rt_nio/Cargo.toml index 2c86b10f8fe..a159e3e829f 100644 --- a/frameworks/Rust/ohkami/rt_nio/Cargo.toml +++ b/frameworks/Rust/ohkami/rt_nio/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "framework_benchmarks-nio" version = "0.0.0" -edition = "2021" +edition = "2024" authors = ["kanarus "] [profile.release] diff --git a/frameworks/Rust/ohkami/rt_smol.dockerfile b/frameworks/Rust/ohkami/rt_smol.dockerfile index 42684323acf..935e4d09f93 100644 --- a/frameworks/Rust/ohkami/rt_smol.dockerfile +++ b/frameworks/Rust/ohkami/rt_smol.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.84-slim-bookworm AS builder +FROM rust:1.89-slim-bookworm AS builder RUN apt update && apt install -y --no-install-recommends \ pkg-config \ diff --git a/frameworks/Rust/ohkami/rt_smol/Cargo.toml b/frameworks/Rust/ohkami/rt_smol/Cargo.toml index cc4b0fd9043..2484a598d18 100644 --- a/frameworks/Rust/ohkami/rt_smol/Cargo.toml +++ b/frameworks/Rust/ohkami/rt_smol/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "framework_benchmarks-smol" version = "0.0.0" -edition = "2021" +edition = "2024" authors = ["kanarus "] [profile.release] diff --git a/frameworks/Rust/ohkami/rt_tokio.dockerfile b/frameworks/Rust/ohkami/rt_tokio.dockerfile index 56ce1bfa4fa..35359c9a9bf 100644 --- a/frameworks/Rust/ohkami/rt_tokio.dockerfile +++ b/frameworks/Rust/ohkami/rt_tokio.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.84-slim-bookworm AS builder +FROM rust:1.89-slim-bookworm AS builder RUN apt update && apt install -y --no-install-recommends \ pkg-config \ diff --git a/frameworks/Rust/ohkami/rt_tokio/Cargo.lock b/frameworks/Rust/ohkami/rt_tokio/Cargo.lock index 0c4a16e9d35..4a5fe5e8bf6 100644 --- a/frameworks/Rust/ohkami/rt_tokio/Cargo.lock +++ b/frameworks/Rust/ohkami/rt_tokio/Cargo.lock @@ -26,12 +26,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "annotate-snippets" version = "0.9.2" @@ -43,12 +37,24 @@ dependencies = [ ] [[package]] -name = "atoi" -version = "2.0.0" +name = "anysc-rustls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b04ec47ea6da4486baee0d3d4b18fb4b8c89d777f1005d5235c4caf164fa6d1" +dependencies = [ + "futures-rustls", + "tokio-rustls", +] + +[[package]] +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ - "num-traits", + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -57,6 +63,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "aws-lc-rs" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -69,7 +98,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -79,19 +108,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "base64ct" -version = "1.6.0" +name = "bindgen" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease 0.2.37", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.106", + "which", +] [[package]] name = "bitflags" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" -dependencies = [ - "serde", -] [[package]] name = "block-buffer" @@ -102,6 +145,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "byte_reader" version = "3.1.1" @@ -126,9 +175,20 @@ version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -142,19 +202,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] -name = "concurrent-queue" -version = "2.5.0" +name = "clang-sys" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ - "crossbeam-utils", + "glob", + "libc", + "libloading", ] [[package]] -name = "const-oid" -version = "0.9.6" +name = "cmake" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] [[package]] name = "convert_case" @@ -162,22 +227,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - [[package]] name = "cpufeatures" version = "0.2.17" @@ -187,36 +236,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - [[package]] name = "crypto-common" version = "0.1.6" @@ -237,17 +256,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - [[package]] name = "derive_more" version = "0.99.18" @@ -258,7 +266,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] @@ -268,28 +276,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", - "const-oid", "crypto-common", "subtle", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - [[package]] name = "dtoa" version = "1.0.9" @@ -297,19 +287,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] -name = "either" -version = "1.13.0" +name = "dunce" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" -dependencies = [ - "serde", -] +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] -name = "equivalent" -version = "1.0.1" +name = "either" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "errno" @@ -322,82 +309,20 @@ dependencies = [ ] [[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]] -name = "event-listener" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "spin", -] - -[[package]] -name = "foldhash" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "fallible-iterator" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "framework_benchmarks" -version = "0.21.0" +version = "0.24.0" dependencies = [ "futures-util", "ohkami", - "rand", - "sqlx", + "rand 0.8.5", + "tokio", + "tokio-postgres", "yarte", ] @@ -406,9 +331,16 @@ name = "framework_benchmarks-tokio" version = "0.0.0" dependencies = [ "framework_benchmarks", + "num_cpus", "tokio", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures-channel" version = "0.3.31" @@ -425,28 +357,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - [[package]] name = "futures-io" version = "0.3.31" @@ -461,7 +371,18 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", +] + +[[package]] +name = "futures-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" +dependencies = [ + "futures-io", + "rustls", + "rustls-pki-types", ] [[package]] @@ -483,11 +404,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", - "futures-io", "futures-macro", "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", "slab", @@ -511,55 +430,38 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] -name = "hashlink" -version = "0.10.0" +name = "getrandom" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ - "hashbrown", + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.3+wasi-0.2.4", ] [[package]] -name = "heck" -version = "0.5.0" +name = "gimli" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] -name = "hex" -version = "0.4.3" +name = "glob" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] -name = "hkdf" -version = "0.12.4" +name = "hermit-abi" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hmac" @@ -580,245 +482,150 @@ dependencies = [ ] [[package]] -name = "icu_collections" -version = "1.5.0" +name = "io-uring" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", + "bitflags", + "cfg-if", + "libc", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "either", ] [[package]] -name = "icu_locid_transform" -version = "1.5.0" +name = "itoa" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] -name = "icu_locid_transform_data" -version = "1.5.0" +name = "jobserver" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.3", + "libc", +] [[package]] -name = "icu_normalizer" -version = "1.5.0" +name = "js-sys" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "icu_normalizer_data" +name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "icu_properties" -version = "1.5.1" +name = "lazycell" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] -name = "icu_properties_data" -version = "1.5.0" +name = "libc" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] -name = "icu_provider" -version = "1.5.0" +name = "libloading" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", + "cfg-if", + "windows-targets", ] [[package]] -name = "icu_provider_macros" -version = "1.5.0" +name = "linux-raw-sys" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] -name = "idna" -version = "1.0.3" +name = "lock_api" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "autocfg", + "scopeguard", ] [[package]] -name = "idna_adapter" -version = "1.2.0" +name = "log" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] -name = "indexmap" -version = "2.7.1" +name = "md-5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "equivalent", - "hashbrown", + "cfg-if", + "digest", ] [[package]] -name = "itoa" -version = "1.0.14" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.169" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" - -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - -[[package]] -name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" -dependencies = [ - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - -[[package]] -name = "lock_api" -version = "0.4.12" +name = "mews" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "8554a5554e9be00776567382b100a89e550a6031fc76356455157d230caca7a5" dependencies = [ - "autocfg", - "scopeguard", + "base64", + "futures-util", + "sha1", + "tokio", ] [[package]] -name = "log" -version = "0.4.25" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "md-5" -version = "0.10.6" +name = "mime_guess" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ - "cfg-if", - "digest", + "mime", + "unicase", ] [[package]] -name = "memchr" -version = "2.7.4" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mews" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21788e6e675e8f19754e8c520ed420977ebade2867e2ff8363357b68c2ef8e8a" -dependencies = [ - "base64", - "sha1", - "tokio", -] +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" @@ -836,27 +643,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] -[[package]] -name = "native-tls" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "nix" version = "0.29.0" @@ -870,50 +660,23 @@ dependencies = [ ] [[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.46" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "memchr", + "minimal-lexical", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "num_cpus" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "autocfg", - "libm", + "hermit-abi", + "libc", ] [[package]] @@ -927,28 +690,31 @@ dependencies = [ [[package]] name = "ohkami" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37844b8da12eece89bd239e4d8cb7d7dad07978f6f20b3917d6fe7c289361f58" +checksum = "82a18bebc444bf9ed43b2ae864b111da831d584fa46e88aa9fa26b72d3afaf4a" dependencies = [ + "anysc-rustls", "base64", "byte_reader", "ctrlc", "hmac", "mews", + "mime_guess", "ohkami_lib", "ohkami_macros", "serde", "serde_json", "sha2", "tokio", + "uuid", ] [[package]] name = "ohkami_lib" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e95fa8274aba0c04904453fdd847898faf86856f7e80180305a51a5636338ed8" +checksum = "057e4f200cc0d0cc66a28d55fe371acc5a7c02f66ef13c0b41a84c8ff88d1025" dependencies = [ "byte_reader", "percent-encoding", @@ -957,13 +723,13 @@ dependencies = [ [[package]] name = "ohkami_macros" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f326ade375c9f24daa9c029f2f6019bff9157bb780239839a6e4ce9aa136178f" +checksum = "15df818179dd272de9c427c08b3d5eaf7511cfdf41e63b232ce99723d603be0c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] @@ -972,56 +738,6 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" -[[package]] -name = "openssl" -version = "0.10.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.3" @@ -1042,23 +758,32 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] -name = "pem-rfc7468" -version = "0.7.0" +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "base64ct", + "phf_shared", ] [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "phf_shared" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] [[package]] name = "pin-project-lite" @@ -1073,32 +798,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "pkcs1" -version = "0.7.5" +name = "postgres-protocol" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" dependencies = [ - "der", - "pkcs8", - "spki", + "base64", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand 0.9.2", + "sha2", + "stringprep", ] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "postgres-types" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ - "der", - "spki", + "bytes", + "fallible-iterator", + "postgres-protocol", ] -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -1118,6 +845,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.106", +] + [[package]] name = "proc-macro2" version = "1.0.93" @@ -1136,6 +873,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -1143,8 +886,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -1154,7 +907,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1163,7 +926,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", ] [[package]] @@ -1205,23 +977,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] -name = "rsa" -version = "0.9.7" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] @@ -1230,6 +996,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.1" @@ -1253,48 +1025,58 @@ dependencies = [ ] [[package]] -name = "ryu" -version = "1.0.18" +name = "rustls" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] [[package]] -name = "schannel" -version = "0.1.27" +name = "rustls-pki-types" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "windows-sys 0.59.0", + "zeroize", ] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "rustls-webpki" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] [[package]] -name = "security-framework" -version = "2.11.1" +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] -name = "security-framework-sys" -version = "2.14.0" +name = "ryu" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" @@ -1319,7 +1101,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] @@ -1334,18 +1116,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "sha1" version = "0.10.6" @@ -1384,255 +1154,45 @@ dependencies = [ ] [[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 = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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 = "sqlx" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" -dependencies = [ - "bytes", - "crc", - "crossbeam-queue", - "either", - "event-listener", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashbrown", - "hashlink", - "indexmap", - "log", - "memchr", - "native-tls", - "once_cell", - "percent-encoding", - "serde", - "serde_json", - "sha2", - "smallvec", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", -] - -[[package]] -name = "sqlx-macros" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 2.0.96", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 2.0.96", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" -dependencies = [ - "atoi", - "base64", - "bitflags", - "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", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" -dependencies = [ - "atoi", - "base64", - "bitflags", - "byteorder", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "whoami", +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", ] [[package]] -name = "sqlx-sqlite" -version = "0.8.3" +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ - "atoi", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "serde_urlencoded", - "sqlx-core", - "tracing", - "url", + "libc", + "windows-sys 0.52.0", ] [[package]] -name = "stable_deref_trait" -version = "1.2.0" +name = "socket2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] [[package]] name = "stringprep" @@ -1664,70 +1224,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "tempfile" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" -dependencies = [ - "cfg-if", - "fastrand", - "getrandom", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tinyvec" version = "1.8.1" @@ -1745,20 +1250,22 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1769,59 +1276,65 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.106", ] [[package]] -name = "tokio-stream" -version = "0.1.17" +name = "tokio-postgres" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" dependencies = [ - "futures-core", + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.9.2", + "socket2 0.5.8", "tokio", + "tokio-util", + "whoami", ] [[package]] -name = "toml" -version = "0.5.11" +name = "tokio-rustls" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "serde", + "rustls", + "tokio", ] [[package]] -name = "tracing" -version = "0.1.41" +name = "tokio-util" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ - "log", + "bytes", + "futures-core", + "futures-sink", "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", + "tokio", ] [[package]] -name = "tracing-core" -version = "0.1.33" +name = "toml" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "once_cell", + "serde", ] [[package]] @@ -1830,6 +1343,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -1870,27 +1389,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "utf8_iter" -version = "1.0.4" +name = "uuid" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "v_eval" @@ -1908,12 +1420,6 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" @@ -1926,12 +1432,101 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.3+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasite" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "whoami" version = "1.5.2" @@ -1940,6 +1535,7 @@ checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ "redox_syscall", "wasite", + "web-sys", ] [[package]] @@ -1964,22 +1560,13 @@ 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.6", + "windows-targets", ] [[package]] @@ -1988,22 +1575,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[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", + "windows-targets", ] [[package]] @@ -2012,46 +1584,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[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.6" @@ -2064,48 +1618,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[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.6" @@ -2113,16 +1643,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" +name = "wit-bindgen" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" [[package]] name = "yansi-term" @@ -2179,7 +1703,7 @@ checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" dependencies = [ "dtoa", "itoa", - "prettyplease", + "prettyplease 0.1.25", "serde", "syn 1.0.109", "toml", @@ -2218,30 +1742,6 @@ dependencies = [ "yarte_helpers", ] -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.7.35" @@ -2260,28 +1760,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", - "synstructure", + "syn 2.0.106", ] [[package]] @@ -2289,25 +1768,3 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] diff --git a/frameworks/Rust/ohkami/rt_tokio/Cargo.toml b/frameworks/Rust/ohkami/rt_tokio/Cargo.toml index fe49fca4b98..8f464cad8b9 100644 --- a/frameworks/Rust/ohkami/rt_tokio/Cargo.toml +++ b/frameworks/Rust/ohkami/rt_tokio/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "framework_benchmarks-tokio" version = "0.0.0" -edition = "2021" +edition = "2024" authors = ["kanarus "] [profile.release] @@ -11,4 +11,5 @@ codegen-units = 1 [dependencies] framework_benchmarks = { path = "..", features = ["rt_tokio"] } -tokio = { version = "1.43", features = ["full"] } +tokio = { version = "1.47", features = ["full"] } +num_cpus = { version = "1.17" } diff --git a/frameworks/Rust/ohkami/rt_tokio/src/main.rs b/frameworks/Rust/ohkami/rt_tokio/src/main.rs index 660405f7862..8a801fa838e 100644 --- a/frameworks/Rust/ohkami/rt_tokio/src/main.rs +++ b/frameworks/Rust/ohkami/rt_tokio/src/main.rs @@ -1,5 +1,39 @@ -#[tokio::main] -async fn main() { - framework_benchmarks::ohkami().await - .howl("0.0.0.0:8000").await +fn runtime() -> tokio::runtime::Runtime { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() +} + +async fn serve( + server: impl FnOnce(tokio::net::TcpListener) -> ServeFuture, +) -> std::io::Result<()> { + println!("start serving !"); + + let socket = tokio::net::TcpSocket::new_v4()?; + socket.set_reuseport(true)?; + socket.set_reuseaddr(true)?; + socket.set_nodelay(true)?; + + socket.bind("0.0.0.0:8000".parse().unwrap())?; + server(socket.listen(4096)?).await; + + Ok(()) +} + +fn main() { + for _ in 0..(num_cpus::get() - 1/*for main thread*/) { + std::thread::spawn(|| { + runtime().block_on(async { + serve(|listener| async { + framework_benchmarks::ohkami().await.howl(listener).await + }).await.expect("serving error") + }) + }); + } + runtime().block_on(async { + serve(|listener| async { + framework_benchmarks::ohkami().await.howl(listener).await + }).await.expect("serving error") + }); } diff --git a/frameworks/Rust/ohkami/src/fangs.rs b/frameworks/Rust/ohkami/src/fangs.rs index 8b69cbb156d..f7592303d63 100644 --- a/frameworks/Rust/ohkami/src/fangs.rs +++ b/frameworks/Rust/ohkami/src/fangs.rs @@ -5,45 +5,6 @@ pub struct SetServer; impl FangAction for SetServer { #[inline(always)] async fn back<'a>(&'a self, res: &'a mut ohkami::Response) { - res.headers.set().Server("ohkami"); - } -} - -#[cfg(feature = "db")] -impl crate::Postgres { - pub async fn init() -> impl FangAction { - #[derive(Clone)] - pub struct UsePostgres(crate::Postgres); - impl FangAction for UsePostgres { - #[inline(always)] - async fn fore<'a>(&'a self, req: &'a mut Request) -> Result<(), Response> { - Ok(req.memorize(self.0.clone())) - } - } - - 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 - } - - let pool = sqlx::postgres::PgPoolOptions::new() - .max_connections(MAX_CONNECTIONS) - .min_connections(MIN_CONNECTIONS) - .connect(&DATABASE_URL).await - .unwrap(); - - UsePostgres(pool.into()) + res.headers.set().server("ohkami"); } } diff --git a/frameworks/Rust/ohkami/src/lib.rs b/frameworks/Rust/ohkami/src/lib.rs index 9a60a5f0a59..aa289a822d5 100644 --- a/frameworks/Rust/ohkami/src/lib.rs +++ b/frameworks/Rust/ohkami/src/lib.rs @@ -1,68 +1,67 @@ mod fangs; mod models; -#[cfg(feature = "db")] mod postgres; -#[cfg(feature = "db")] mod templates; +#[cfg(feature = "rt_tokio")] mod postgres; +#[cfg(feature = "rt_tokio")] mod templates; use { fangs::SetServer, models::Message, ohkami::prelude::*, - ohkami::format::JSON, }; -#[cfg(feature = "db")] use { +#[cfg(feature = "rt_tokio")] use { models::{Fortune, World, WorldsMeta}, postgres::Postgres, templates::FortunesTemplate, - ohkami::format::Query, }; pub async fn ohkami() -> Ohkami { - #[cfg(feature = "db")] { - Ohkami::new(( - 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), - )) - } - #[cfg(not(feature = "db"))] { - Ohkami::new(( - SetServer, - "/json" .GET(json_serialization), - "/plaintext".GET(plaintext), - )) - } + Ohkami::new(( + SetServer, + #[cfg(feature = "rt_tokio")] + Context::new(Postgres::new().await), + + "/plaintext".GET(plaintext), + "/json".GET(json_serialization), + #[cfg(feature = "rt_tokio")] + "/db".GET(single_database_query), + #[cfg(feature = "rt_tokio")] + "/queries".GET(multiple_database_query), + #[cfg(feature = "rt_tokio")] + "/fortunes".GET(fortunes), + #[cfg(feature = "rt_tokio")] + "/updates".GET(database_updates), + )) } -async fn json_serialization() -> JSON { - JSON(Message { +async fn plaintext() -> &'static str { + "Hello, World!" +} + +async fn json_serialization() -> Json { + Json(Message { message: "Hello, World!" }) } -#[cfg(feature = "db")] +#[cfg(feature = "rt_tokio")] async fn single_database_query( Context(db): Context<'_, Postgres>, -) -> JSON { +) -> Json { let world = db.select_random_world().await; - JSON(world) + Json(world) } -#[cfg(feature = "db")] +#[cfg(feature = "rt_tokio")] async fn multiple_database_query( Query(q): Query>, Context(db): Context<'_, Postgres>, -) -> JSON> { +) -> Json> { let n = q.parse(); let worlds = db.select_n_random_worlds(n).await; - JSON(worlds) + Json(worlds) } -#[cfg(feature = "db")] +#[cfg(feature = "rt_tokio")] async fn fortunes( Context(db): Context<'_, Postgres>, ) -> FortunesTemplate { @@ -75,17 +74,12 @@ async fn fortunes( FortunesTemplate { fortunes } } -#[cfg(feature = "db")] +#[cfg(feature = "rt_tokio")] async fn database_updates( Query(q): Query>, Context(db): Context<'_, Postgres>, -) -> JSON> { +) -> Json> { let n = q.parse(); - let mut worlds = db.select_n_random_worlds(n).await; - db.update_random_ids_of_worlds(&mut worlds).await; - JSON(worlds) -} - -async fn plaintext() -> &'static str { - "Hello, World!" + let worlds = db.update_randomnumbers_of_n_worlds(n).await; + Json(worlds) } diff --git a/frameworks/Rust/ohkami/src/models.rs b/frameworks/Rust/ohkami/src/models.rs index cdbd7b2df00..45120b3d7f4 100644 --- a/frameworks/Rust/ohkami/src/models.rs +++ b/frameworks/Rust/ohkami/src/models.rs @@ -5,19 +5,17 @@ pub struct Message { pub message: &'static str, } -#[cfg(feature = "db")] +#[cfg(feature = "rt_tokio")] pub use db::*; -#[cfg(feature = "db")] +#[cfg(feature = "rt_tokio")] mod db { use super::*; - #[derive(sqlx::FromRow)] pub struct Fortune { pub id: i32, pub message: String, } - #[derive(sqlx::FromRow)] #[derive(serde::Serialize)] #[allow(non_snake_case)] pub struct World { diff --git a/frameworks/Rust/ohkami/src/postgres.rs b/frameworks/Rust/ohkami/src/postgres.rs index ffb57e467ef..b9a402cc50f 100644 --- a/frameworks/Rust/ohkami/src/postgres.rs +++ b/frameworks/Rust/ohkami/src/postgres.rs @@ -1,64 +1,131 @@ -#![cfg(feature = "db")] +#![cfg(feature = "rt_tokio")] -use futures_util::{stream::FuturesUnordered, TryStreamExt}; -use rand::{rngs::SmallRng, SeedableRng, Rng, thread_rng}; use crate::models::{World, Fortune}; +use std::sync::Arc; +use futures_util::stream::{StreamExt, FuturesUnordered}; +use rand::{rngs::SmallRng, SeedableRng, Rng, distributions::Uniform, thread_rng}; #[derive(Clone)] -pub struct Postgres(sqlx::PgPool); +pub struct Postgres { + client: Arc, + statements: TechEmpowerStatements, +} -impl From for Postgres { - fn from(pgpool: sqlx::PgPool) -> Self { - Self(pgpool) +#[derive(Clone)] +struct TechEmpowerStatements { + select_world_by_id: tokio_postgres::Statement, + select_all_fortunes: tokio_postgres::Statement, + update_worlds: tokio_postgres::Statement, +} + +impl Postgres { + pub async fn new() -> Self { + let (client, connection) = tokio_postgres::connect( + &std::env::var("DATABASE_URL").unwrap(), + tokio_postgres::NoTls + ).await.expect("failed to connect database"); + + tokio::spawn(async { + if let Err(e) = connection.await { + eprintln!("error in database connection: {e}"); + } + }); + + let statements = TechEmpowerStatements { + select_world_by_id: client + .prepare("SELECT id, randomnumber FROM world WHERE id = $1 LIMIT 1") + .await + .unwrap(), + select_all_fortunes: client + .prepare("SELECT id, message FROM fortune") + .await + .unwrap(), + update_worlds: client + .prepare("\ + UPDATE world SET randomnumber = new.randomnumber FROM ( \ + SELECT * FROM UNNEST($1::int[], $2::int[]) AS v(id, randomnumber) \ + ) AS new WHERE world.id = new.id \ + ") + .await + .unwrap(), + }; + + Self { client: Arc::new(client), statements } } } impl Postgres { - pub async fn select_random_world(&self) -> World { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + const ID_RANGE: std::ops::Range = 1..10001; - 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") + async fn select_random_world_by_id(&self, id: i32) -> World { + let row = self.client + .query_one(&self.statements.select_world_by_id, &[&id]) + .await + .expect("failed to fetch a world"); + + World { + id: row.get(0), + randomnumber: row.get(1), + } } - - 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") +} + +impl Postgres { + pub async fn select_random_world(&self) -> World { + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + self.select_random_world_by_id(rng.gen_range(Self::ID_RANGE)).await } pub async fn select_n_random_worlds(&self, n: usize) -> Vec { - let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - + let 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) - ) + for id in rng.sample_iter(Uniform::new(Self::ID_RANGE.start, Self::ID_RANGE.end)).take(n) { + selects.push(self.select_random_world_by_id(id)) } - - selects.try_collect().await.expect("Failed to fetch worlds") + + selects.collect::>().await } - 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) - ) + pub async fn select_all_fortunes(&self) -> Vec { + let mut rows = std::pin::pin!(self + .client + .query_raw::<_, _, &[i32; 0]>(&self.statements.select_all_fortunes, &[]) + .await + .expect("failed to fetch fortunes") + ); + + let mut fortunes = Vec::new(); + while let Some(row) = rows.next().await.transpose().unwrap() { + fortunes.push(Fortune { + id: row.get(0), + message: row.get(1), + }); } + + fortunes + } - let _: sqlx::postgres::PgQueryResult = updates.try_collect().await.expect("Failed to fetch worlds"); + pub async fn update_randomnumbers_of_n_worlds(&self, n: usize) -> Vec { + let rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + + let mut worlds = self.select_n_random_worlds(n).await; + + let mut ids = Vec::with_capacity(n); + let new_randomnumbers = rng + .sample_iter(Uniform::new(Self::ID_RANGE.start, Self::ID_RANGE.end)) + .take(n) + .collect::>(); + for i in 0..n { + worlds[i].randomnumber = new_randomnumbers[i]; + ids.push(worlds[i].id); + } + + self.client + .execute(&self.statements.update_worlds, &[&ids, &new_randomnumbers]) + .await + .expect("failed to update worlds"); + + worlds } } diff --git a/frameworks/Rust/ohkami/src/templates.rs b/frameworks/Rust/ohkami/src/templates.rs index d4f4c4306ea..486d3dd901f 100644 --- a/frameworks/Rust/ohkami/src/templates.rs +++ b/frameworks/Rust/ohkami/src/templates.rs @@ -1,4 +1,4 @@ -#![cfg(feature = "db")] +#![cfg(feature = "rt_tokio")] use ohkami::{IntoResponse, Response}; use yarte::Template; @@ -17,6 +17,7 @@ pub struct FortunesTemplate { } impl IntoResponse for FortunesTemplate { + #[inline] fn into_response(self) -> Response { match Template::call(&self) { Ok(template) => Response::OK().with_html(template), From 8cc3cc19066293acbdeb20c8ab8c565c4fefbe99 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 2 Sep 2025 18:52:55 +0200 Subject: [PATCH 1594/1766] [ruby/hanami] Auto config workers (#10085) Let Puma select the number of workers. --- frameworks/Ruby/hanami/config/auto_tune.rb | 43 ---------------------- frameworks/Ruby/hanami/config/puma.rb | 6 --- frameworks/Ruby/hanami/hanami.dockerfile | 1 + 3 files changed, 1 insertion(+), 49 deletions(-) delete mode 100644 frameworks/Ruby/hanami/config/auto_tune.rb diff --git a/frameworks/Ruby/hanami/config/auto_tune.rb b/frameworks/Ruby/hanami/config/auto_tune.rb deleted file mode 100644 index 476ed1a45bd..00000000000 --- a/frameworks/Ruby/hanami/config/auto_tune.rb +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# Instantiate about one process per X MiB of available memory, scaling up to as -# close to MAX_THREADS as possible while observing an upper bound based on the -# number of virtual/logical CPUs. If there are fewer processes than -# MAX_THREADS, add threads per process to reach MAX_THREADS. -require 'etc' - -KB_PER_WORKER = 128 * 1_024 # average of peak PSS of single-threaded processes (watch smem -k) -MIN_WORKERS = 2 -MAX_WORKERS_PER_VCPU = 1.25 # virtual/logical -MIN_THREADS_PER_WORKER = 1 -MAX_THREADS = Integer(ENV['MAX_CONCURRENCY'] || 256) - -def meminfo(arg) - File.open('/proc/meminfo') do |f| - f.each_line do |line| - key, value = line.split(/:\s+/) - return value.split(/\s+/).first.to_i if key == arg - end - end - - raise "Unable to find `#{arg}' in /proc/meminfo!" -end - -def auto_tune - avail_mem = meminfo('MemAvailable') * 0.8 - MAX_THREADS * 1_024 - - workers = [ - [(1.0 * avail_mem / KB_PER_WORKER).floor, MIN_WORKERS].max, - [(Etc.nprocessors * MAX_WORKERS_PER_VCPU).ceil, MIN_WORKERS].max - ].min - - threads_per_worker = [ - workers < MAX_THREADS ? (1.0 * MAX_THREADS / workers).ceil : -Float::INFINITY, - MIN_THREADS_PER_WORKER - ].max - - [workers, threads_per_worker] -end - -p auto_tune if $PROGRAM_NAME == __FILE__ diff --git a/frameworks/Ruby/hanami/config/puma.rb b/frameworks/Ruby/hanami/config/puma.rb index 83e2dc90637..a2be144a827 100644 --- a/frameworks/Ruby/hanami/config/puma.rb +++ b/frameworks/Ruby/hanami/config/puma.rb @@ -1,10 +1,4 @@ # frozen_string_literal: true -require_relative 'auto_tune' - -# FWBM only... use the puma_auto_tune gem in production! -num_workers, num_threads = auto_tune - -workers num_workers threads 3, 3 port ENV.fetch("HANAMI_PORT", 2300) diff --git a/frameworks/Ruby/hanami/hanami.dockerfile b/frameworks/Ruby/hanami/hanami.dockerfile index 80ab2a6c31f..46bb0e3beaa 100644 --- a/frameworks/Ruby/hanami/hanami.dockerfile +++ b/frameworks/Ruby/hanami/hanami.dockerfile @@ -1,6 +1,7 @@ FROM ruby:3.4 ENV RUBY_YJIT_ENABLE=1 +ENV WEB_CONCURRENCY=auto # Use Jemalloc RUN apt-get update && \ From efbcbfe94721926ad797e189065927655722f0c8 Mon Sep 17 00:00:00 2001 From: Richard Schneeman Date: Wed, 10 Sep 2025 14:50:26 -0500 Subject: [PATCH 1595/1766] Remove ENV RUBY_MN_THREADS=1 (#10090) Reported in https://github.com/puma/puma/issues/3715#issuecomment-3245560096. Setting this value tanks the performance of Puma 7.0.0.pre1. Independently, there are other reports that there are some bugs with this feature - https://bugs.ruby-lang.org/issues/20638 - https://bugs.ruby-lang.org/issues/19996 - https://github.com/puma/puma/issues/3715#issuecomment-3247114128 I also work at Heroku where I see many many (cannot say a number, but it's a lot) of production Ruby apps, and I don't think I've ever seen one use this in production (not saying it doesn't happen, but that it's not the default). --- frameworks/Ruby/rack/rack.dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 6494c5be48b..e1487dfe5f1 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -1,7 +1,6 @@ FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 -ENV RUBY_MN_THREADS=1 ENV RUBY_THREAD_TIMESLICE=10 # Use Jemalloc From ad8aca66d0f2545467bab424e5c0098ab4b3c6d7 Mon Sep 17 00:00:00 2001 From: Andrea Fontana Date: Wed, 10 Sep 2025 21:50:53 +0200 Subject: [PATCH 1596/1766] Add support for serverino (#10092) * first serverino commit * latest version * log level off * README * serverino description * pump up serverino version --- frameworks/D/serverino/.gitignore | 16 +++++++++ frameworks/D/serverino/README.md | 22 ++++++++++++ frameworks/D/serverino/benchmark_config.json | 26 ++++++++++++++ frameworks/D/serverino/dub.json | 14 ++++++++ frameworks/D/serverino/serverino.dockerfile | 16 +++++++++ frameworks/D/serverino/source/app.d | 36 ++++++++++++++++++++ 6 files changed, 130 insertions(+) create mode 100644 frameworks/D/serverino/.gitignore create mode 100755 frameworks/D/serverino/README.md create mode 100755 frameworks/D/serverino/benchmark_config.json create mode 100644 frameworks/D/serverino/dub.json create mode 100644 frameworks/D/serverino/serverino.dockerfile create mode 100644 frameworks/D/serverino/source/app.d diff --git a/frameworks/D/serverino/.gitignore b/frameworks/D/serverino/.gitignore new file mode 100644 index 00000000000..cbf457ea779 --- /dev/null +++ b/frameworks/D/serverino/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/serverino +serverino.so +serverino.dylib +serverino.dll +serverino.a +serverino.lib +serverino-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/frameworks/D/serverino/README.md b/frameworks/D/serverino/README.md new file mode 100755 index 00000000000..ab101f91a85 --- /dev/null +++ b/frameworks/D/serverino/README.md @@ -0,0 +1,22 @@ +# serverino Benchmarking Test + +## About Serverino + +Serverino is a small and ready-to-go http server written in D. + +- Homepage: https://github.com/trikko/serverino + +### Test Type Implementation Source Code + +* [JSON](source/app.d) +* [PLAINTEXT](source/app.d) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + diff --git a/frameworks/D/serverino/benchmark_config.json b/frameworks/D/serverino/benchmark_config.json new file mode 100755 index 00000000000..9265e4f55e6 --- /dev/null +++ b/frameworks/D/serverino/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "serverino", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "serverino", + "language": "D", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "serverino", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/D/serverino/dub.json b/frameworks/D/serverino/dub.json new file mode 100644 index 00000000000..d5b733728eb --- /dev/null +++ b/frameworks/D/serverino/dub.json @@ -0,0 +1,14 @@ +{ + "authors": [ + "Andrea Fontana" + ], + "dependencies": { + "serverino": "~>0.7.19" + }, + "dflags-ldc": [ + "-static", + "-nodefaultlib" + ], + "license": "proprietary", + "name": "serverino-benchmark" +} \ No newline at end of file diff --git a/frameworks/D/serverino/serverino.dockerfile b/frameworks/D/serverino/serverino.dockerfile new file mode 100644 index 00000000000..26e39be0a41 --- /dev/null +++ b/frameworks/D/serverino/serverino.dockerfile @@ -0,0 +1,16 @@ +FROM alpine:latest +RUN apk update && apk upgrade +RUN apk add gcc musl-dev ldc dub llvm-libunwind-static openssl-libs-static git make +RUN ln -fs /usr/share/zoneinfo/Europe/Rome /etc/localtime +RUN apk add tzdata +RUN apk cache clean + +RUN adduser -D -S www-data + +WORKDIR /app +COPY . . +RUN dub build --build=release-nobounds + +EXPOSE 8080 +USER www-data +CMD ["./serverino-benchmark"] diff --git a/frameworks/D/serverino/source/app.d b/frameworks/D/serverino/source/app.d new file mode 100644 index 00000000000..ca787c4af95 --- /dev/null +++ b/frameworks/D/serverino/source/app.d @@ -0,0 +1,36 @@ +module app; + +import std.logger; +import std.json; +import serverino; +import std.parallelism: totalCPUs; + +mixin ServerinoMain; + +void catchAll(Request request, Output output) +{ + if (request.path == "/json") { + + output ~= JSONValue(["message" : "Hello, World!"]).toString(); + output.addHeader("content-type", "application/json"); + } + else if (request.path == "/plaintext") { + output ~= "Hello, World!"; + output.addHeader("content-type", "text/plain"); + } + else output.status = 200; +} + + +@onServerInit ServerinoConfig configure() +{ + return ServerinoConfig + .create() + .setLogLevel(LogLevel.off) + .enableServerSignature(true) + .setWorkers(4) + .setDaemonInstances(10) + .addListener("0.0.0.0", 8080); +} + + From 782c58d15e67d392353120e28bf849c35b3684c0 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 10 Sep 2025 21:51:20 +0200 Subject: [PATCH 1597/1766] [ruby/sinatra] Use CGI.escape_html (#10094) CGI.escape_html seems more performant. --- frameworks/Ruby/sinatra-sequel/views/fortunes.erb | 2 +- frameworks/Ruby/sinatra/views/fortunes.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/views/fortunes.erb b/frameworks/Ruby/sinatra-sequel/views/fortunes.erb index 3d27f4dc50f..67d99d2e55c 100644 --- a/frameworks/Ruby/sinatra-sequel/views/fortunes.erb +++ b/frameworks/Ruby/sinatra-sequel/views/fortunes.erb @@ -6,7 +6,7 @@ <% @fortunes.each do |fortune| %> <%= fortune.id %> - <%= Rack::Utils.escape_html(fortune.message) %> + <%= CGI.escape_html(fortune.message) %> <% end %> diff --git a/frameworks/Ruby/sinatra/views/fortunes.erb b/frameworks/Ruby/sinatra/views/fortunes.erb index 3d27f4dc50f..67d99d2e55c 100644 --- a/frameworks/Ruby/sinatra/views/fortunes.erb +++ b/frameworks/Ruby/sinatra/views/fortunes.erb @@ -6,7 +6,7 @@ <% @fortunes.each do |fortune| %> <%= fortune.id %> - <%= Rack::Utils.escape_html(fortune.message) %> + <%= CGI.escape_html(fortune.message) %> <% end %> From 934151289f91822cdc4f647955330a166ae5e89d Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 10 Sep 2025 21:51:35 +0200 Subject: [PATCH 1598/1766] [rails] Upgrade to 8.1.0.beta1 (#10095) --- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 113 +++++++++++++++-------------- 2 files changed, 60 insertions(+), 55 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 1a9e362342c..6b8ad45304c 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'rails', '~> 8.0.0' +gem 'rails', '~> 8.1.0.beta1' gem 'redis', '~> 5.0' gem 'tzinfo-data' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 3f986aa3f6f..1a29d0c06c8 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,29 +1,31 @@ GEM remote: https://rubygems.org/ specs: - actioncable (8.0.2.1) - actionpack (= 8.0.2.1) - activesupport (= 8.0.2.1) + action_text-trix (2.1.15) + railties + actioncable (8.1.0.beta1) + actionpack (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.2.1) - actionpack (= 8.0.2.1) - activejob (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionmailbox (8.1.0.beta1) + actionpack (= 8.1.0.beta1) + activejob (= 8.1.0.beta1) + activerecord (= 8.1.0.beta1) + activestorage (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) mail (>= 2.8.0) - actionmailer (8.0.2.1) - actionpack (= 8.0.2.1) - actionview (= 8.0.2.1) - activejob (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionmailer (8.1.0.beta1) + actionpack (= 8.1.0.beta1) + actionview (= 8.1.0.beta1) + activejob (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.2.1) - actionview (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionpack (8.1.0.beta1) + actionview (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -31,35 +33,36 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.2.1) - actionpack (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + actiontext (8.1.0.beta1) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.0.beta1) + activerecord (= 8.1.0.beta1) + activestorage (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.2.1) - activesupport (= 8.0.2.1) + actionview (8.1.0.beta1) + activesupport (= 8.1.0.beta1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.2.1) - activesupport (= 8.0.2.1) + activejob (8.1.0.beta1) + activesupport (= 8.1.0.beta1) globalid (>= 0.3.6) - activemodel (8.0.2.1) - activesupport (= 8.0.2.1) - activerecord (8.0.2.1) - activemodel (= 8.0.2.1) - activesupport (= 8.0.2.1) + activemodel (8.1.0.beta1) + activesupport (= 8.1.0.beta1) + activerecord (8.1.0.beta1) + activemodel (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) timeout (>= 0.4.0) - activestorage (8.0.2.1) - actionpack (= 8.0.2.1) - activejob (= 8.0.2.1) - activerecord (= 8.0.2.1) - activesupport (= 8.0.2.1) + activestorage (8.1.0.beta1) + actionpack (= 8.1.0.beta1) + activejob (= 8.1.0.beta1) + activerecord (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) marcel (~> 1.0) - activesupport (8.0.2.1) + activesupport (8.1.0.beta1) base64 benchmark (>= 0.3) bigdecimal @@ -213,20 +216,20 @@ GEM rack (>= 1.3) rackup (2.2.1) rack (>= 3) - rails (8.0.2.1) - actioncable (= 8.0.2.1) - actionmailbox (= 8.0.2.1) - actionmailer (= 8.0.2.1) - actionpack (= 8.0.2.1) - actiontext (= 8.0.2.1) - actionview (= 8.0.2.1) - activejob (= 8.0.2.1) - activemodel (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + rails (8.1.0.beta1) + actioncable (= 8.1.0.beta1) + actionmailbox (= 8.1.0.beta1) + actionmailer (= 8.1.0.beta1) + actionpack (= 8.1.0.beta1) + actiontext (= 8.1.0.beta1) + actionview (= 8.1.0.beta1) + activejob (= 8.1.0.beta1) + activemodel (= 8.1.0.beta1) + activerecord (= 8.1.0.beta1) + activestorage (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) bundler (>= 1.15.0) - railties (= 8.0.2.1) + railties (= 8.1.0.beta1) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -234,13 +237,14 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.2.1) - actionpack (= 8.0.2.1) - activesupport (= 8.0.2.1) + railties (8.1.0.beta1) + actionpack (= 8.1.0.beta1) + activesupport (= 8.1.0.beta1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) zeitwerk (~> 2.6) rake (13.2.1) rdoc (6.12.0) @@ -260,6 +264,7 @@ GEM timeout (0.4.3) traces (0.15.2) trilogy (2.8.1) + tsort (0.2.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2025.1) @@ -283,7 +288,7 @@ DEPENDENCIES pg (~> 1.5) pitchfork (~> 0.17) puma (~> 6.5) - rails (~> 8.0.0) + rails (~> 8.1.0.beta1) redis (~> 5.0) trilogy (~> 2.8.1) tzinfo-data From b42bd58bbf84d91d5a8a5b245f2ab59350b0aae8 Mon Sep 17 00:00:00 2001 From: Edgar Espina Date: Wed, 10 Sep 2025 15:52:03 -0400 Subject: [PATCH 1599/1766] jooby: 4.0.7 (#10096) - update to latest jooby - upgrade jdk 24 --- frameworks/Java/jooby/jooby-jetty.dockerfile | 2 +- frameworks/Java/jooby/jooby-mvc.dockerfile | 4 ++-- frameworks/Java/jooby/jooby-netty.dockerfile | 4 ++-- frameworks/Java/jooby/jooby-pgclient.dockerfile | 4 ++-- frameworks/Java/jooby/jooby.dockerfile | 2 +- frameworks/Java/jooby/pom.xml | 8 ++++---- frameworks/Kotlin/kooby/kooby.dockerfile | 4 ++-- frameworks/Kotlin/kooby/pom.xml | 8 ++++---- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/frameworks/Java/jooby/jooby-jetty.dockerfile b/frameworks/Java/jooby/jooby-jetty.dockerfile index c5d636ada2d..0c3c605cc1b 100644 --- a/frameworks/Java/jooby/jooby-jetty.dockerfile +++ b/frameworks/Java/jooby/jooby-jetty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-22-alpine +FROM maven:3.9.9-eclipse-temurin-24-noble as maven 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 b2a4db4712b..ec8150d3fae 100644 --- a/frameworks/Java/jooby/jooby-mvc.dockerfile +++ b/frameworks/Java/jooby/jooby-mvc.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-22-alpine +FROM maven:3.9.9-eclipse-temurin-24-noble as maven WORKDIR /jooby COPY pom.xml pom.xml COPY src src @@ -8,4 +8,4 @@ RUN mvn package -q -P netty EXPOSE 8080 -CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-cp", "target/jooby.jar", "com.techempower.MvcApp"] +CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "--enable-native-access=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.noUnsafe=false", "-Dio.netty.eventLoopGroup=single", "-cp", "target/jooby.jar", "com.techempower.MvcApp"] diff --git a/frameworks/Java/jooby/jooby-netty.dockerfile b/frameworks/Java/jooby/jooby-netty.dockerfile index 1c3efc2585e..daf8bed238c 100644 --- a/frameworks/Java/jooby/jooby-netty.dockerfile +++ b/frameworks/Java/jooby/jooby-netty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-22-alpine +FROM maven:3.9.9-eclipse-temurin-24-noble as maven WORKDIR /jooby COPY pom.xml pom.xml COPY src src @@ -8,4 +8,4 @@ RUN mvn package -q -P netty EXPOSE 8080 -CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/jooby.jar"] +CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "--enable-native-access=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.noUnsafe=false", "-Dio.netty.eventLoopGroup=single", "-jar", "target/jooby.jar"] diff --git a/frameworks/Java/jooby/jooby-pgclient.dockerfile b/frameworks/Java/jooby/jooby-pgclient.dockerfile index 044cdd5c5de..77eb7d3bea5 100644 --- a/frameworks/Java/jooby/jooby-pgclient.dockerfile +++ b/frameworks/Java/jooby/jooby-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-22-alpine +FROM maven:3.9.9-eclipse-temurin-24-noble as maven WORKDIR /jooby COPY pom.xml pom.xml COPY src src @@ -8,4 +8,4 @@ RUN mvn package -q -P netty EXPOSE 8080 -CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-cp", "target/jooby.jar", "com.techempower.ReactivePg"] +CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "--enable-native-access=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.noUnsafe=false", "-Dio.netty.eventLoopGroup=single", "-cp", "target/jooby.jar", "com.techempower.ReactivePg"] diff --git a/frameworks/Java/jooby/jooby.dockerfile b/frameworks/Java/jooby/jooby.dockerfile index a5d4570a60d..4685ba51c95 100644 --- a/frameworks/Java/jooby/jooby.dockerfile +++ b/frameworks/Java/jooby/jooby.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-22-alpine +FROM maven:3.9.9-eclipse-temurin-24-noble as maven 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 d50222ee6f7..20c192196cf 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -6,17 +6,17 @@ jooby com.techempower - 3.0 + 4.0 jooby - 4.0.5 + 4.0.7 2.0.2 42.7.7 UTF-8 - 22 - 22 + 24 + 24 com.techempower.App diff --git a/frameworks/Kotlin/kooby/kooby.dockerfile b/frameworks/Kotlin/kooby/kooby.dockerfile index 678fc57b8d4..b689c6e7348 100644 --- a/frameworks/Kotlin/kooby/kooby.dockerfile +++ b/frameworks/Kotlin/kooby/kooby.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-22-alpine +FROM maven:3.9.9-eclipse-temurin-24-noble as maven WORKDIR /kooby COPY pom.xml pom.xml COPY src src @@ -8,4 +8,4 @@ RUN mvn package -q EXPOSE 8080 -CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/kooby.jar"] +CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "--enable-native-access=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.noUnsafe=false", "-Dio.netty.eventLoopGroup=single", "-jar", "target/kooby.jar"] diff --git a/frameworks/Kotlin/kooby/pom.xml b/frameworks/Kotlin/kooby/pom.xml index 6e4dbaf8e46..4e962e35034 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -7,16 +7,16 @@ kooby com.techempower - 3.0 + 4.0 kooby: jooby+kotlin - 4.0.5 + 4.0.7 42.7.7 UTF-8 - 22 - 22 + 24 + 24 2.2.0 From 42c5d8989f5d66fd49e60d55219f549cc6d4a120 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 10 Sep 2025 21:52:23 +0200 Subject: [PATCH 1600/1766] [ruby/roda-sequel] Use CGI.escape_html (#10097) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Roda will use the faster `CGI.escape_html` if the "cgi" gem is installed: https://github.com/jeremyevans/roda/blob/d89cd5d7310dad20eb706eb392ebbce49f815e67/lib/roda/plugins/h.rb ```ruby require 'benchmark/ips' require 'erb' Benchmark.ips do |x| x.config(time: 5) messages = [] messages << 'Additional fortune added at request time.' messages << 'フレームワークのベンチマーク' messages << '' require 'cgi' x.report("CGI") do messages.each do |m| CGI.escape_html(m) end end ESCAPE_HTML = { "&" => "&".freeze, "<" => "<".freeze, ">" => ">".freeze, "'" => "'".freeze, '"' => """.freeze, }.freeze # A Regexp of HTML entities to match for escaping. ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys) x.report("ESCAPE_HTML") do messages.each do |m| m.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] } end end x.compare! end ``` ``` ruby 3.4.5 (2025-07-16 revision 20cda200d3) +PRISM [arm64-darwin24] Warming up -------------------------------------- CGI 39.444k i/100ms ESCAPE_HTML 33.482k i/100ms Calculating ------------------------------------- CGI 394.120k (± 1.0%) i/s (2.54 μs/i) - 1.972M in 5.004594s ESCAPE_HTML 333.558k (± 1.6%) i/s (3.00 μs/i) - 1.674M in 5.020278s Comparison: CGI: 394120.5 i/s ESCAPE_HTML: 333557.6 i/s - 1.18x slower ``` --- frameworks/Ruby/roda-sequel/Gemfile | 1 + frameworks/Ruby/roda-sequel/Gemfile.lock | 2 ++ 2 files changed, 3 insertions(+) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index ac560d03260..82ea81b15ef 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -5,6 +5,7 @@ gem "json", "~> 2.8" gem "sequel", "~> 5.67" gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" +gem "cgi" # Make sure the h plugin uses the faster CGI.escape_html group :mysql, optional: true do gem 'trilogy', '~> 2.9', platforms: [:ruby, :windows] diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 16b023e0050..9ee9022ffa9 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -2,6 +2,7 @@ GEM remote: https://rubygems.org/ specs: bigdecimal (3.1.9) + cgi (0.5.0) erubi (1.13.1) iodine (0.7.58) json (2.13.2) @@ -26,6 +27,7 @@ PLATFORMS x86_64-linux DEPENDENCIES + cgi erubi (~> 1.12) iodine (~> 0.7) json (~> 2.8) From d1d2b0d3d6ea13c3370fde78d64f2499f7ebd855 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Wed, 10 Sep 2025 20:52:45 +0100 Subject: [PATCH 1601/1766] Update H2O to revision 3b9b6a53c (#10098) Signed-off-by: Anton Kirilov --- frameworks/C/h2o/h2o.dockerfile | 13 ++++++------- frameworks/PHP/php/php-h2o.dockerfile | 8 +++----- frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile | 9 +++------ 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index b9c9aedd609..e7fe80db90c 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -9,30 +9,29 @@ RUN apt-get -yqq update && \ apt-get -yqq install \ autoconf \ bison \ + clang \ cmake \ curl \ flex \ - g++ \ - libbpfcc-dev \ libbrotli-dev \ libcap-dev \ libnuma-dev \ libpq-dev \ libssl-dev \ + libstdc++-15-dev \ libtool \ + liburing-dev \ libuv1-dev \ libwslay-dev \ libyajl-dev \ libz-dev \ - llvm-dev \ make \ ninja-build \ pkg-config \ - rsync \ ruby \ systemtap-sdt-dev -ARG H2O_VERSION=c54c63285b52421da2782f028022647fc2ea3dd1 +ARG H2O_VERSION=3b9b6a53cac8bcc6a25fb28df81ad295fc5f9402 WORKDIR /tmp/h2o-build RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ @@ -78,8 +77,8 @@ RUN apt-get -yqq update && \ apt-get -yqq install \ libnuma1 \ libpq5 \ - libyajl2 && \ - apt-get -yqq upgrade + liburing2 \ + libyajl2 ARG H2O_APP_PREFIX COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/" COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/" diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index d7fec3d6c96..e66307ba85e 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=c54c63285b52421da2782f028022647fc2ea3dd1 +ARG H2O_VERSION=3b9b6a53cac8bcc6a25fb28df81ad295fc5f9402 ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX @@ -14,18 +14,15 @@ RUN apt-get -yqq update > /dev/null && \ cmake \ curl \ g++ \ - libbpfcc-dev \ libbrotli-dev \ libcap-dev \ libssl-dev \ - libtool \ + liburing-dev \ libuv1-dev \ libwslay-dev \ libz-dev \ - llvm-dev \ ninja-build \ pkg-config \ - rsync \ ruby \ systemtap-sdt-dev > /dev/null && \ curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ @@ -56,6 +53,7 @@ RUN apt-get -yqq update > /dev/null && \ LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \ apt-get -yqq update > /dev/null && \ apt-get -yqq install \ + liburing2 \ "php${PHP_VERSION}" \ "php${PHP_VERSION}-cli" \ "php${PHP_VERSION}-common" \ diff --git a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile index 984017f5503..5f7823bcd13 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=c54c63285b52421da2782f028022647fc2ea3dd1 +ARG H2O_VERSION=3b9b6a53cac8bcc6a25fb28df81ad295fc5f9402 ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX @@ -14,18 +14,15 @@ RUN apt-get -yqq update && \ cmake \ curl \ g++ \ - libbpfcc-dev \ libbrotli-dev \ libcap-dev \ libssl-dev \ - libtool \ + liburing-dev \ libuv1-dev \ libwslay-dev \ libz-dev \ - llvm-dev \ ninja-build \ pkg-config \ - rsync \ ruby \ systemtap-sdt-dev && \ curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ @@ -45,7 +42,7 @@ RUN apt-get -yqq update && \ FROM "ubuntu:${UBUNTU_VERSION}" ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update && apt-get -yqq upgrade +RUN apt-get -yqq update && apt-get -yqq install liburing2 ARG H2O_PREFIX COPY --from=compile "${H2O_PREFIX}/bin/h2o" "${H2O_PREFIX}/bin/" COPY --from=compile "${H2O_PREFIX}/share" "${H2O_PREFIX}/share/" From 38fadb8de9cdf8dfcc593a3aed7437ca37089c8f Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Thu, 11 Sep 2025 03:53:04 +0800 Subject: [PATCH 1602/1766] [rust]: update deps and upgrade to rust 1.89 (#10099) --- frameworks/Rust/viz/Cargo.toml | 10 +++++----- frameworks/Rust/viz/src/server.rs | 15 +++++++-------- 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 +- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index bd461396428..7047dbe3666 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -35,14 +35,14 @@ mime = "0.3" rand = { version = "0.9", features = ["small_rng"] } thiserror = "2.0" futures-util = "0.3" -socket2 = "0.5.8" +socket2 = { version = "0.6.0", features = ["all"] } num_cpus = "1.16.0" [target.'cfg(not(unix))'.dependencies] -nanorand = { version = "0.7" } +nanorand = { version = "0.8" } [target.'cfg(unix)'.dependencies] -nanorand = { version = "0.7", features = ["getrandom"] } +nanorand = { version = "0.8", features = ["getrandom"] } tokio = { version = "1", features = ["full"] } tokio-postgres = { version = "0.7", optional = true } @@ -55,7 +55,7 @@ sqlx = { version = "0.8", features = [ diesel = { version = "2.2", default-features = false, features = [ "i-implement-a-third-party-backend-and-opt-into-breaking-changes", ], optional = true } -diesel-async = { version = "0.5", default-features = false, features = [ +diesel-async = { version = "0.6", default-features = false, features = [ "postgres", "bb8", ], optional = true } @@ -63,7 +63,7 @@ diesel-async = { version = "0.5", default-features = false, features = [ yarte = { version = "0.15", features = ["bytes-buf", "json"], optional = true } markup = { version = "0.15", optional = true } v_htmlescape = { version = "0.15", optional = true } -sailfish = { version = "0.9", optional = true } +sailfish = { version = "0.10", optional = true } [profile.release] lto = true diff --git a/frameworks/Rust/viz/src/server.rs b/frameworks/Rust/viz/src/server.rs index 99386fb71dc..047da0ba88a 100644 --- a/frameworks/Rust/viz/src/server.rs +++ b/frameworks/Rust/viz/src/server.rs @@ -5,9 +5,9 @@ use std::net::{Ipv4Addr, SocketAddr}; use std::sync::Arc; use std::thread; -use socket2::{Domain, SockAddr, Socket}; use hyper::server::conn::http1::Builder; use hyper_util::rt::TokioIo; +use socket2::{Domain, SockAddr, Socket}; use tokio::{net::TcpListener, runtime}; use viz::{Responder, Router, Tree}; @@ -31,12 +31,11 @@ pub async fn serve(router: Router) -> Result<(), Box> { let tree = tree.clone(); tokio::spawn(async move { - http - .serve_connection( - TokioIo::new(tcp), - Responder::>::new(tree, None), - ) - .await + http.serve_connection( + TokioIo::new(tcp), + Responder::>::new(tree, None), + ) + .await }); } } @@ -52,7 +51,7 @@ fn create_socket(addr: SocketAddr) -> Result { #[cfg(unix)] socket.set_reuse_port(true)?; socket.set_reuse_address(true)?; - socket.set_nodelay(true)?; + socket.set_tcp_nodelay(true)?; socket.set_nonblocking(true)?; socket.bind(&addr)?; socket.listen(backlog)?; diff --git a/frameworks/Rust/viz/viz-diesel.dockerfile b/frameworks/Rust/viz/viz-diesel.dockerfile index 9dac40c5efe..4d10b67baa1 100644 --- a/frameworks/Rust/viz/viz-diesel.dockerfile +++ b/frameworks/Rust/viz/viz-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.89 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz-pg.dockerfile b/frameworks/Rust/viz/viz-pg.dockerfile index d0ee0ebed7a..23bc34e49c3 100644 --- a/frameworks/Rust/viz/viz-pg.dockerfile +++ b/frameworks/Rust/viz/viz-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.89 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz-sqlx.dockerfile b/frameworks/Rust/viz/viz-sqlx.dockerfile index 734fccc8d4a..c9a7685855f 100644 --- a/frameworks/Rust/viz/viz-sqlx.dockerfile +++ b/frameworks/Rust/viz/viz-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.89 ADD ./ /viz WORKDIR /viz diff --git a/frameworks/Rust/viz/viz.dockerfile b/frameworks/Rust/viz/viz.dockerfile index df606181820..bf5102b2bec 100644 --- a/frameworks/Rust/viz/viz.dockerfile +++ b/frameworks/Rust/viz/viz.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.89 ADD ./ /viz WORKDIR /viz From 24b87cd71e86a97ce828cc56d324af80278b3496 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 10 Sep 2025 21:53:39 +0200 Subject: [PATCH 1603/1766] [ruby/rack-sequel] Update puma to 7.0.2 (#10102) --- frameworks/Ruby/rack-sequel/Gemfile | 2 +- frameworks/Ruby/rack-sequel/Gemfile.lock | 4 ++-- frameworks/Ruby/rack-sequel/README.md | 2 +- frameworks/Ruby/rack-sequel/config/mri_puma.rb | 4 ++++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index e0f583ed6af..9f69b105215 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -14,5 +14,5 @@ group :postgresql, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.5', require: false + gem 'puma', '~> 7.0', require: false end diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 4375f7cf65b..6929e4287c0 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -5,7 +5,7 @@ GEM json (2.13.2) nio4r (2.7.4) pg (1.5.9) - puma (6.6.0) + puma (7.0.2) nio4r (~> 2.0) rack (3.2.0) sequel (5.90.0) @@ -23,7 +23,7 @@ PLATFORMS DEPENDENCIES json (~> 2.8) pg (~> 1.5) - puma (~> 6.5) + puma (~> 7.0) rack (~> 3.1) sequel (~> 5.0) sequel_pg (~> 1.6) diff --git a/frameworks/Ruby/rack-sequel/README.md b/frameworks/Ruby/rack-sequel/README.md index 10c66ab28c3..3639fca8cc6 100644 --- a/frameworks/Ruby/rack-sequel/README.md +++ b/frameworks/Ruby/rack-sequel/README.md @@ -13,7 +13,7 @@ a variety of web platforms. The tests will be run with: * [Ruby 3.4](http://www.ruby-lang.org) -* [Puma 6](http://puma.io) +* [Puma 7](http://puma.io) * [Rack 3](http://rack.rubyforge.org) * [Sequel 5](http://sequel.jeremyevans.net) * [MySQL 5.5](https://www.mysql.com) diff --git a/frameworks/Ruby/rack-sequel/config/mri_puma.rb b/frameworks/Ruby/rack-sequel/config/mri_puma.rb index 95b855bafd3..9454ae36e44 100644 --- a/frameworks/Ruby/rack-sequel/config/mri_puma.rb +++ b/frameworks/Ruby/rack-sequel/config/mri_puma.rb @@ -5,3 +5,7 @@ workers num_workers threads num_threads, num_threads + +before_fork do + Sequel::DATABASES.each(&:disconnect) +end From 6394199979d37fca4dd1ce37fbd75d4fc9f048b9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 10 Sep 2025 21:53:57 +0200 Subject: [PATCH 1604/1766] [ruby/sinatra] Use Puma 7.0 (#10103) --- frameworks/Ruby/sinatra-sequel/Gemfile | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 4 ++-- frameworks/Ruby/sinatra-sequel/README.md | 2 +- frameworks/Ruby/sinatra-sequel/config/mri_puma.rb | 4 ++++ frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 4 ++-- frameworks/Ruby/sinatra/README.md | 4 ++-- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 682ba17204d..71268362105 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -18,5 +18,5 @@ group :iodine, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.4', require: false + gem 'puma', '~> 7.0', require: false end diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index a935bd0f671..f98e693a32f 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -10,7 +10,7 @@ GEM ruby2_keywords (~> 0.0.1) nio4r (2.7.4) pg (1.5.9) - puma (6.6.0) + puma (7.0.2) nio4r (~> 2.0) rack (3.2.0) rack-protection (4.1.1) @@ -45,7 +45,7 @@ DEPENDENCIES iodine (~> 0.7) json (~> 2.8) pg (~> 1.5) - puma (~> 6.4) + puma (~> 7.0) sequel (~> 5.0) sequel_pg (~> 1.6) sinatra (~> 4.0) diff --git a/frameworks/Ruby/sinatra-sequel/README.md b/frameworks/Ruby/sinatra-sequel/README.md index 291b26d9151..a031a9566df 100644 --- a/frameworks/Ruby/sinatra-sequel/README.md +++ b/frameworks/Ruby/sinatra-sequel/README.md @@ -13,7 +13,7 @@ comparing a variety of web platforms. The tests will be run with: * [Ruby 3.4](http://www.ruby-lang.org) -* [Puma 6](http://puma.io) +* [Puma 7](http://puma.io) * [Sinatra 4](http://www.sinatrarb.com) * [Sequel 5](http://sequel.jeremyevans.net) * [MySQL 5.5](https://www.mysql.com) diff --git a/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb b/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb index 95b855bafd3..9454ae36e44 100644 --- a/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb +++ b/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb @@ -5,3 +5,7 @@ workers num_workers threads num_threads, num_threads + +before_fork do + Sequel::DATABASES.each(&:disconnect) +end diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index c8de92098c1..61dae4790d3 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -17,5 +17,5 @@ group :iodine, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.4', require: false + gem 'puma', '~> 7.0', require: false end diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index f69851da1b2..55cbe455179 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -36,7 +36,7 @@ GEM ruby2_keywords (~> 0.0.1) nio4r (2.7.4) pg (1.5.9) - puma (6.6.0) + puma (7.0.2) nio4r (~> 2.0) rack (3.2.0) rack-protection (4.1.1) @@ -72,7 +72,7 @@ DEPENDENCIES iodine (~> 0.7) json (~> 2.8) pg (~> 1.5) - puma (~> 6.4) + puma (~> 7.0) sinatra (~> 4.0) trilogy (~> 2.9.0) diff --git a/frameworks/Ruby/sinatra/README.md b/frameworks/Ruby/sinatra/README.md index 307d995c942..fabf6b58283 100644 --- a/frameworks/Ruby/sinatra/README.md +++ b/frameworks/Ruby/sinatra/README.md @@ -13,9 +13,9 @@ comparing a variety of web platforms. The tests will be run with: * [Ruby 3.4](http://www.ruby-lang.org) -* [Puma 6](http://puma.io) +* [Puma 7](http://puma.io) * [Sinatra 4](http://www.sinatrarb.com) -* [ActiveRecord 7](https://github.com/rails/rails/tree/master/activerecord) +* [ActiveRecord 8](https://github.com/rails/rails/tree/master/activerecord) * [MySQL 5.5](https://www.mysql.com) * [Postgres 9.3](https://www.postgresql.org) From 323f78b08dafd327db8fc59924786eba37d44153 Mon Sep 17 00:00:00 2001 From: Huang ziquan Date: Tue, 16 Sep 2025 23:50:04 +0800 Subject: [PATCH 1605/1766] [C++] Paozhu update entry file (#10105) * Paozhu update * Update orm file * [Paozhu] update orm file * update paozhu * update paozhu * [C++ paozhu] update ORM * update orm files * update orm files * update startup --- frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt index a25af789299..e63ec9c1a13 100755 --- a/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt +++ b/frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt @@ -197,9 +197,9 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) - add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testbenchmark.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/startup/main_docker.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) else() - add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) + add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/startup/main_dev.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list}) endif() if (ENABLE_WIN_VCPKG STREQUAL "ON") From 252660538223b8bc457a95c78233e851e93a8cfe Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 16 Sep 2025 17:55:18 +0200 Subject: [PATCH 1606/1766] [ruby/grape] Upgrade to Ruby 3.5-rc (#10106) --- frameworks/Ruby/grape/grape-unicorn.dockerfile | 2 +- frameworks/Ruby/grape/grape.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/grape/grape-unicorn.dockerfile b/frameworks/Ruby/grape/grape-unicorn.dockerfile index 4f32633e8bb..a20de1c8e3f 100644 --- a/frameworks/Ruby/grape/grape-unicorn.dockerfile +++ b/frameworks/Ruby/grape/grape-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/grape/grape.dockerfile b/frameworks/Ruby/grape/grape.dockerfile index e14f49a9bb4..bf7d2259a35 100644 --- a/frameworks/Ruby/grape/grape.dockerfile +++ b/frameworks/Ruby/grape/grape.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 From 2d0b0f627fd21cdf4e1e307c61139a29983f9259 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 16 Sep 2025 17:55:39 +0200 Subject: [PATCH 1607/1766] [ruby/rack] Update puma to 7.0.2 (#10107) 7.0.2 fixes several issues in 7.0.0.pre1. --- frameworks/Ruby/rack/Gemfile | 2 +- frameworks/Ruby/rack/Gemfile.lock | 4 ++-- frameworks/Ruby/rack/config/puma.rb | 11 ----------- frameworks/Ruby/rack/pg_db.rb | 1 - 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index cb31832d3fe..f321aee7ac8 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -33,7 +33,7 @@ group :pitchfork, optional: true do end group :puma, optional: true do - gem 'puma', '7.0.0.pre1' + gem 'puma', '~> 7.0' end group :unicorn, optional: true do diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 92f3c7e98d5..4c5104d8517 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -94,7 +94,7 @@ GEM protocol-rack (0.11.2) protocol-http (~> 0.43) rack (>= 1.0) - puma (7.0.0.pre1) + puma (7.0.2) nio4r (~> 2.0) racc (1.8.1) rack (3.2.0) @@ -156,7 +156,7 @@ DEPENDENCIES passenger (~> 6.0) pg (~> 1.5) pitchfork (~> 0.17) - puma (= 7.0.0.pre1) + puma (~> 7.0) rack (~> 3.0) rack-test rubocop diff --git a/frameworks/Ruby/rack/config/puma.rb b/frameworks/Ruby/rack/config/puma.rb index 4b5a210d689..27d851c89b1 100644 --- a/frameworks/Ruby/rack/config/puma.rb +++ b/frameworks/Ruby/rack/config/puma.rb @@ -19,14 +19,3 @@ workers num_workers threads num_threads, num_threads - # 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 - # process behavior so workers use less memory. - # - preload_app! - - - - - diff --git a/frameworks/Ruby/rack/pg_db.rb b/frameworks/Ruby/rack/pg_db.rb index 0851ee2acfe..bcaa1dad480 100644 --- a/frameworks/Ruby/rack/pg_db.rb +++ b/frameworks/Ruby/rack/pg_db.rb @@ -28,7 +28,6 @@ def prepare_statements @world_select = @connection['SELECT id, randomNumber FROM World WHERE id = ?', :$id].prepare(:select, :select_by_id) @world_update = @connection['UPDATE World SET randomNumber = ? WHERE id = ?', :$random_number, :$id].prepare(:update, :update_by_id) - @fortune_select = @connection['SELECT id, message FROM Fortune'].prepare(:select, :select_all) end From c890b86e0d7bcec2fffb09377c1869781bfb114b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 16 Sep 2025 17:55:59 +0200 Subject: [PATCH 1608/1766] [ruby/puma] Use same number of connections as threads (#10108) When using puma use the same amount of connections as threads. For other servers default to 512. --- frameworks/Ruby/padrino/config/database.rb | 2 +- frameworks/Ruby/rack-sequel/boot.rb | 4 +++- frameworks/Ruby/roda-sequel/boot.rb | 4 +++- frameworks/Ruby/sinatra-sequel/boot.rb | 4 +++- frameworks/Ruby/sinatra/boot.rb | 6 ++---- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/padrino/config/database.rb b/frameworks/Ruby/padrino/config/database.rb index 494a834d052..06324898cd9 100644 --- a/frameworks/Ruby/padrino/config/database.rb +++ b/frameworks/Ruby/padrino/config/database.rb @@ -9,7 +9,7 @@ # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 - opts[:pool] = (2 * Math.log(threads)).floor + opts[:pool] = threads opts[:checkout_timeout] = 10 else # TODO: ActiveRecord doesn't have a single-threaded mode? diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index 4a3aebbb651..9566c227d38 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -21,8 +21,10 @@ def connect(dbtype) # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 - opts[:max_connections] = (2 * Math.log(threads)).floor + opts[:max_connections] = threads opts[:pool_timeout] = 10 + else + opts[:max_connections] = 512 end Sequel.connect \ diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index 80fbc11f944..0878b21e9d3 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -36,8 +36,10 @@ def connect(dbtype) # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 - opts[:max_connections] = (2 * Math.log(threads)).floor + opts[:max_connections] = threads opts[:pool_timeout] = 10 + else + opts[:max_connections] = 512 end Sequel.connect "%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}" % diff --git a/frameworks/Ruby/sinatra-sequel/boot.rb b/frameworks/Ruby/sinatra-sequel/boot.rb index f47e26aaba0..ca44bdc08df 100644 --- a/frameworks/Ruby/sinatra-sequel/boot.rb +++ b/frameworks/Ruby/sinatra-sequel/boot.rb @@ -28,8 +28,10 @@ def connect(dbtype) # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 - opts[:max_connections] = (2 * Math.log(threads)).floor + opts[:max_connections] = threads opts[:pool_timeout] = 10 + else + opts[:max_connections] = 512 end Sequel.connect \ diff --git a/frameworks/Ruby/sinatra/boot.rb b/frameworks/Ruby/sinatra/boot.rb index f29c2cca1e1..e27fe4e928c 100644 --- a/frameworks/Ruby/sinatra/boot.rb +++ b/frameworks/Ruby/sinatra/boot.rb @@ -33,12 +33,10 @@ def connect(dbtype) # Determine threading/thread pool size and timeout if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 - opts[:pool] = (2 * Math.log(threads)).floor + opts[:pool] = threads opts[:checkout_timeout] = 10 else - # TODO: ActiveRecord doesn't have a single-threaded mode? - opts[:pool] = 1 - opts[:checkout_timeout] = 0 + opts[:pool] = 512 end ActiveRecord::Base.establish_connection(opts) From 845516f1571165663061918954448f43619e825a Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Tue, 16 Sep 2025 16:56:37 +0100 Subject: [PATCH 1609/1766] Fix the framework order for each continuous benchmarking run (#10109) The environment variable values used by system services are not persistent, so any changes to them are lost after services finish execution. As a result, the framework order was not toggled properly after each continuous benchmarking run completed. Instead, use a regular file to keep track of the order. Signed-off-by: Anton Kirilov --- toolset/continuous/tfb-startup.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/toolset/continuous/tfb-startup.sh b/toolset/continuous/tfb-startup.sh index c008df0d07f..438f3deba51 100644 --- a/toolset/continuous/tfb-startup.sh +++ b/toolset/continuous/tfb-startup.sh @@ -20,10 +20,12 @@ git clone \ echo "moving to tfb directory" cd $TFB_REPOPARENT/$TFB_REPONAME -if [ -z "$TFB_RUN_ORDER" ]; then +if [ -e "${TFB_REPOPARENT}/tfb-reverse-order" ]; then export TFB_RUN_ORDER="reverse" + sudo rm -rf "${TFB_REPOPARENT}/tfb-reverse-order" else unset TFB_RUN_ORDER + touch "${TFB_REPOPARENT}/tfb-reverse-order" fi echo "building tfb docker image" From f9ab8cdbf5531a7209356027430cbecc1950e2e1 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 16 Sep 2025 17:57:05 +0200 Subject: [PATCH 1610/1766] [php] Symfony add ReactPHP runtime (#10110) * [php] Symfony add ReactPHP runtime * Add JIT * Add libuv --- frameworks/PHP/symfony/benchmark_config.json | 24 ++++++++++++ frameworks/PHP/symfony/deploy/swoole/php.ini | 3 ++ .../PHP/symfony/symfony-react.dockerfile | 38 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 frameworks/PHP/symfony/symfony-react.dockerfile diff --git a/frameworks/PHP/symfony/benchmark_config.json b/frameworks/PHP/symfony/benchmark_config.json index 05955fb8944..5d37f665589 100644 --- a/frameworks/PHP/symfony/benchmark_config.json +++ b/frameworks/PHP/symfony/benchmark_config.json @@ -140,6 +140,30 @@ "versus": "php", "tags": [] }, + "react": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "update_url": "/updates?queries=", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "symfony", + "language": "PHP", + "flavor": "PHP8", + "orm": "Full", + "platform": "reactphp", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "symfony [react]", + "notes": "", + "versus": "php", + "tags": [] + }, "franken": { "plaintext_url": "/plaintext", "json_url": "/json", diff --git a/frameworks/PHP/symfony/deploy/swoole/php.ini b/frameworks/PHP/symfony/deploy/swoole/php.ini index 5a77f55e2ad..54182323396 100644 --- a/frameworks/PHP/symfony/deploy/swoole/php.ini +++ b/frameworks/PHP/symfony/deploy/swoole/php.ini @@ -17,3 +17,6 @@ opcache.validate_timestamps=0 opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.preload_user=www-data + +opcache.jit_buffer_size = 128M +opcache.jit = tracing diff --git a/frameworks/PHP/symfony/symfony-react.dockerfile b/frameworks/PHP/symfony/symfony-react.dockerfile new file mode 100644 index 00000000000..e2a47c08f73 --- /dev/null +++ b/frameworks/PHP/symfony/symfony-react.dockerfile @@ -0,0 +1,38 @@ +FROM php:8.4-cli + +RUN apt-get update -yqq && \ + apt-get install -yqq libpq-dev libicu-dev git > /dev/null && \ + docker-php-ext-install pdo_pgsql opcache intl pcntl > /dev/null + +COPY --link deploy/swoole/php.ini /usr/local/etc/php/ +WORKDIR /symfony +COPY --link . . + +# We deal with concurrencies over 1k, which stream_select doesn't support. +# libuv +RUN apt-get install -yqq libuv1-dev > /dev/null \ + && pecl install uv-beta > /dev/null +RUN docker-php-ext-enable uv + +# libevent +# RUN apt-get install -y libevent-dev > /dev/null \ +# && pecl install event-3.1.4 > /dev/null +# RUN docker-php-ext-enable event + + +COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer + +#ENV APP_DEBUG 1 +ENV APP_ENV prod + +#ENV APP_RUNTIME "Runtime\React\Runtime" +#RUN composer require runtime/react --update-no-dev --no-scripts --quiet + +ENV APP_RUNTIME "Zolex\ReactPhpBundle\Runtime\ReactPhpRuntime" +ENV REACT_HOST "0.0.0.0" +RUN composer require zolex/reactphp-bundle --update-no-dev --no-scripts --quiet +RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear + +EXPOSE 8080 + +ENTRYPOINT [ "php", "/symfony/public/runtime.php" ] From 2481f23006fdf0f240ba4fdbae37e79f93b8faa7 Mon Sep 17 00:00:00 2001 From: Outer Heaven Legacy Date: Tue, 16 Sep 2025 19:57:55 +0400 Subject: [PATCH 1611/1766] Bump sib to v0.0.12 (#10111) * bump sib to v0.0.12 * fix: readme --- frameworks/Rust/sib/Cargo.toml | 16 +++-- frameworks/Rust/sib/README.md | 3 +- frameworks/Rust/sib/sib.dockerfile | 1 + frameworks/Rust/sib/src/main.rs | 93 ++++++++++++++++-------------- 4 files changed, 62 insertions(+), 51 deletions(-) diff --git a/frameworks/Rust/sib/Cargo.toml b/frameworks/Rust/sib/Cargo.toml index 546b0997b78..a2d8da27f8e 100644 --- a/frameworks/Rust/sib/Cargo.toml +++ b/frameworks/Rust/sib/Cargo.toml @@ -12,14 +12,20 @@ categories = ["development-tools"] readme = "README.md" [dependencies] -sib = { version = "0.0.10", default-features = false, features = [ +sib = { version = "0.0.12", default-features = false, features = [ "net-h1-server", ] } bytes = { version = "1.10.1", default-features = false } -mimalloc = { version = "0.1.47", features = ["secure"] } -num_cpus = { version = "1.17.0" } -serde = { version = "1.0.219", default-features = false, features = ["derive"] } -serde_json = { version = "1.0.141" } +heapless = { version = "0.9.1", default-features = false } +http = { version = "1.3.1", default-features = false } +mimalloc = { version = "0.1.48", default-features = false, features = [ + "secure", +] } +num_cpus = { version = "1.17.0", default-features = false } +serde = { version = "1.0.221", default-features = false, features = ["derive"] } +serde_json = { version = "1.0.144", default-features = false, features = [ + "std", +] } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/sib/README.md b/frameworks/Rust/sib/README.md index d211c71acf7..2903a7a11ec 100644 --- a/frameworks/Rust/sib/README.md +++ b/frameworks/Rust/sib/README.md @@ -2,8 +2,7 @@ ## Description -A high-performance, secure, and cross-platform modules optimized for efficiency, scalability, and reliability. -SIB supports HTTP/1.1 as well as HTTP/3, and uses coroutine-based concurrency via [may](https://github.com/Xudong-Huang/may) along with zero-copy request/response handling, aiming for the lowest possible overhead. +Sib supports HTTP/1.1, HTTP/2, and HTTP/3. It uses coroutines and io_uring, along with zero-copy request/response handling, to achieve the lowest possible overhead. ## Test URLs diff --git a/frameworks/Rust/sib/sib.dockerfile b/frameworks/Rust/sib/sib.dockerfile index e4cf3f2530c..98c76de2cdd 100644 --- a/frameworks/Rust/sib/sib.dockerfile +++ b/frameworks/Rust/sib/sib.dockerfile @@ -3,6 +3,7 @@ FROM rust:latest ADD ./ /sib WORKDIR /sib +RUN apt-get update && apt-get install -y cmake clang lld llvm libclang-dev RUN cargo clean RUN RUSTFLAGS="-C target-cpu=native" cargo build --release diff --git a/frameworks/Rust/sib/src/main.rs b/frameworks/Rust/sib/src/main.rs index 8f649d08cef..0013400cf8a 100644 --- a/frameworks/Rust/sib/src/main.rs +++ b/frameworks/Rust/sib/src/main.rs @@ -1,9 +1,6 @@ -use bytes::Bytes; use sib::network::http::{ - server::HFactory, session::{HService, Session}, util::Status -}; -use std::{ - fs + server::{H1Config, HFactory}, + session::{HService, Session}, }; #[global_allocator] @@ -26,28 +23,47 @@ struct Server; impl HService for Server { fn call(&mut self, session: &mut S) -> std::io::Result<()> { - if session.req_path() == Some("/json") { + use core::fmt::Write; + use sib::network::http::h1_session; + if session.req_path() == "/json" { // Respond with JSON + let mut res: heapless::String<192> = heapless::String::new(); let json = serde_json::to_vec(&JsonMessage::default())?; - session - .status_code(Status::Ok) - .header_str("Content-Type", "application/json")? - .header_str("Content-Length", &json.len().to_string())? - .body(&Bytes::from(json)) - .eom(); - return Ok(()); + write!( + res, + "HTTP/1.1 200 OK\r\n\ + Server: sib\r\n\ + Date: {}\r\n\ + Content-Type: application/json\r\n\ + Content-Length: {}\r\n\ + \r\n\ + {}", + h1_session::CURRENT_DATE.load(), + &json.len().to_string(), + String::from_utf8_lossy(&json) + ) + .unwrap(); + session.write_all_eom(res.as_bytes()) + } else { + let mut res: heapless::String<160> = heapless::String::new(); + write!( + res, + "HTTP/1.1 200 OK\r\n\ + Server: sib\r\n\ + Date: {}\r\n\ + Content-Type: text/plain\r\n\ + Content-Length: 13\r\n\ + \r\n\ + Hello, World!", + h1_session::CURRENT_DATE.load() + ) + .unwrap(); + session.write_all_eom(res.as_bytes()) } - session - .status_code(Status::Ok) - .header_str("Content-Type", "text/plain")? - .header_str("Content-Length", "13")? - .body(&Bytes::from_static(b"Hello, World!")) - .eom(); - Ok(()) } } -impl HFactory for Server{ +impl HFactory for Server { type Service = Server; fn service(&self, _id: usize) -> Server { @@ -56,27 +72,10 @@ impl HFactory for Server{ } fn main() { - // Print number of CPU cores + let stack_size = 4 * 1024; // 4 KB stack let cpus = num_cpus::get(); - println!("CPU cores: {cpus}"); - - sib::set_num_workers(cpus); - // Print total RAM in MB - if let Ok(meminfo) = fs::read_to_string("/proc/meminfo") { - for line in meminfo.lines() { - if line.starts_with("MemTotal:") { - let parts: Vec<&str> = line.split_whitespace().collect(); - if parts.len() >= 2 { - if let Ok(kb) = parts[1].parse::() { - let mb = kb / 1024; - println!("Total RAM: {mb} MB"); - } - } - break; - } - } - } + sib::init_global_poller(cpus, stack_size); // Pick a port and start the server let addr = "0.0.0.0:8080"; @@ -87,15 +86,21 @@ fn main() { let id = std::thread::current().id(); println!("Listening {addr} on thread: {id:?}"); Server - .start_h1(addr, 0) - .unwrap_or_else(|_| panic!("h1 server failed to start for thread {id:?}")) + .start_h1( + addr, + H1Config { + io_timeout: std::time::Duration::from_secs(15), + stack_size, + }, + ) + .unwrap_or_else(|_| panic!("H1 server failed to start for thread {id:?}")) .join() - .unwrap_or_else(|_| panic!("h1 server failed to joining thread {id:?}")); + .unwrap_or_else(|_| panic!("H1 server failed to join thread {id:?}")); }); threads.push(handle); } - // Wait for all threads to complete (they won’t unless crashed) + // Wait for all threads to complete for handle in threads { handle.join().expect("Thread panicked"); } From 073ad61f5593c6703054faffc8fe2a85905492da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 16 Sep 2025 23:58:30 +0800 Subject: [PATCH 1612/1766] Upgrade hyperlane v9.4.4 (#10112) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: lock * feat: lock * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 39 ++++++++----- frameworks/Rust/hyperlane/Cargo.toml | 6 +- .../hyperlane/hyperlane.default.dockerfile | 2 +- .../Rust/hyperlane/src/middleware/fn.rs | 2 +- frameworks/Rust/hyperlane/src/route/fn.rs | 16 +++--- frameworks/Rust/hyperlane/src/server/fn.rs | 57 +++++++------------ 6 files changed, 57 insertions(+), 65 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 96734958c13..389012017e0 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -538,9 +538,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.16.6" +version = "2.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86b015115d24b1fb70b663fdbc1f1c849883372fb19143709a718751074b907" +checksum = "589c065ec266404f9e35eb5ae75c542933647f225ee7d66224ae5f187ac8e061" dependencies = [ "brotli", "flate2", @@ -555,9 +555,9 @@ checksum = "c10a92fc539f5fc3b2c5c3de4255e4f62f2768c9cd5a0e7879edf3d3b3189186" [[package]] name = "http-type" -version = "4.60.0" +version = "5.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31db399a7dbd7ddd5098b6c8ace6959ed1651a21d9ac76cc099c8bd10af3038c" +checksum = "30aba9d0d56c9b62634b3074d8450d164f9f99b829df1942884491654368ad92" dependencies = [ "hex", "http-compress", @@ -573,9 +573,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "8.1.2" +version = "9.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7968f7272ce9339f8d77effc5f27b7ae571e0061decc67c5d44508e729a93603" +checksum = "5be294cf7ebe0164f6bff1d1b5ea1a26ce4b1b5d98c84b7013ba886c777eb8bd" dependencies = [ "http-type", "inventory", @@ -1200,10 +1200,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "a505d71960adde88e293da5cb5eda57093379f64e61cf77bf0e6a63af07a7bac" dependencies = [ + "serde_core", "serde_derive", ] @@ -1219,11 +1220,20 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "serde_core" +version = "1.0.223" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20f57cbd357666aa7b3ac84a90b4ea328f1d4ddb6772b430caa5d9e1309bb9e9" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "3d428d07faf17e306e699ec1e91996e5a165ba5d6bce5b5155173e91a8a01a56" dependencies = [ "proc-macro2", "quote", @@ -1232,14 +1242,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -1713,9 +1724,9 @@ dependencies = [ [[package]] name = "twox-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" dependencies = [ "rand 0.9.2", ] diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index b2770c7010a..a22792ddef0 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,13 +20,13 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "8.1.2" +hyperlane = "9.4.4" hyperlane-time = "0.7.8" num_cpus = "1.17.0" once_cell = "1.21.3" rand = "0.9.2" -serde = "1.0.219" -serde_json = "1.0.143" +serde = "1.0.223" +serde_json = "1.0.145" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } [profile.dev] diff --git a/frameworks/Rust/hyperlane/hyperlane.default.dockerfile b/frameworks/Rust/hyperlane/hyperlane.default.dockerfile index d9bd815fd04..023ac9612cc 100644 --- a/frameworks/Rust/hyperlane/hyperlane.default.dockerfile +++ b/frameworks/Rust/hyperlane/hyperlane.default.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.89 RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld diff --git a/frameworks/Rust/hyperlane/src/middleware/fn.rs b/frameworks/Rust/hyperlane/src/middleware/fn.rs index 02c9af06667..ec7bfc7c7dc 100644 --- a/frameworks/Rust/hyperlane/src/middleware/fn.rs +++ b/frameworks/Rust/hyperlane/src/middleware/fn.rs @@ -7,7 +7,7 @@ pub async fn request(ctx: Context) { .await .set_response_header(SERVER, HYPERLANE) .await - .set_response_header(DATE, gmt()) + .set_response_header(DATE, &gmt()) .await .set_response_status_code(200) .await diff --git a/frameworks/Rust/hyperlane/src/route/fn.rs b/frameworks/Rust/hyperlane/src/route/fn.rs index 2f7bb9595f7..f0bb54f8a84 100644 --- a/frameworks/Rust/hyperlane/src/route/fn.rs +++ b/frameworks/Rust/hyperlane/src/route/fn.rs @@ -5,7 +5,7 @@ pub async fn json(ctx: Context) { "message": RESPONSEDATA_STR }); let run = || async { - ctx.set_response_body(serde_json::to_string(&json).unwrap_or_default()) + ctx.set_response_body(&serde_json::to_vec(&json).unwrap_or_default()) .await; ctx.send().await.unwrap(); }; @@ -18,7 +18,7 @@ pub async fn json(ctx: Context) { pub async fn plaintext(ctx: Context) { ctx.set_response_header(CONTENT_TYPE, TEXT_PLAIN).await; - ctx.set_response_body(RESPONSEDATA_BIN).await; + ctx.set_response_body(&RESPONSEDATA_BIN).await; let run = || async { ctx.send().await.unwrap(); }; @@ -33,7 +33,7 @@ pub async fn db(ctx: Context) { let db_connection: &DbPoolConnection = get_db_connection(); let run = || async { let query_row: QueryRow = random_world_row(db_connection).await; - ctx.set_response_body(serde_json::to_string(&query_row).unwrap_or_default()) + ctx.set_response_body(&serde_json::to_vec(&query_row).unwrap_or_default()) .await .send() .await @@ -57,7 +57,7 @@ pub async fn query(ctx: Context) { .max(1); let db_pool: &DbPoolConnection = get_db_connection(); let data: Vec = get_some_row_id(queries, db_pool).await; - ctx.set_response_body(serde_json::to_string(&data).unwrap_or_default()) + ctx.set_response_body(&serde_json::to_vec(&data).unwrap_or_default()) .await .send() .await @@ -73,7 +73,7 @@ pub async fn query(ctx: Context) { pub async fn fortunes(ctx: Context) { ctx.set_response_header( CONTENT_TYPE, - ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), + &ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), ) .await; let run = || async { @@ -92,7 +92,7 @@ pub async fn fortunes(ctx: Context) { )); fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); let res: String = FortunesTemplate::new(fortunes_list).to_string(); - ctx.set_response_body(res).await.send().await.unwrap(); + ctx.set_response_body(&res).await.send().await.unwrap(); }; run().await; while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { @@ -111,7 +111,7 @@ pub async fn update(ctx: Context) { .min(ROW_LIMIT as Queries) .max(1); let res: Vec = update_world_rows(queries).await; - ctx.set_response_body(serde_json::to_string(&res).unwrap_or_default()) + ctx.set_response_body(&serde_json::to_vec(&res).unwrap_or_default()) .await .send() .await @@ -134,7 +134,7 @@ pub async fn cached_query(ctx: Context) { .min(ROW_LIMIT as Queries) .max(1); let res: Vec<&QueryRow> = CACHE.iter().take(count as usize).collect(); - ctx.set_response_body(serde_json::to_string(&res).unwrap_or_default()) + ctx.set_response_body(&serde_json::to_vec(&res).unwrap_or_default()) .await .send() .await diff --git a/frameworks/Rust/hyperlane/src/server/fn.rs b/frameworks/Rust/hyperlane/src/server/fn.rs index d27bc3b2b4d..fb2b691c292 100644 --- a/frameworks/Rust/hyperlane/src/server/fn.rs +++ b/frameworks/Rust/hyperlane/src/server/fn.rs @@ -13,59 +13,40 @@ fn runtime() -> Runtime { async fn init_server() { let config: ServerConfig = ServerConfig::new().await; - config.host("0.0.0.0").await; - config.port(8080).await; - config.disable_nodelay().await; - config.http_buffer(256).await; - config.ws_buffer(256).await; - - let server: Server = Server::from(config).await; - - server.request_middleware(middleware::request).await; - - server - .disable_http_hook("/plaintext") + config + .host("0.0.0.0") .await - .route("/plaintext", route::plaintext) + .port(8080) + .await + .disable_linger() + .await + .disable_nodelay() + .await + .buffer(256) .await; - - server - .disable_http_hook("/json") + Server::from(config) + .await + .request_middleware(middleware::request) + .await + .route("/plaintext", route::plaintext) .await .route("/json", route::json) - .await; - - server - .disable_http_hook("/cached-quer") .await .route("/cached-quer", route::cached_query) - .await; - - server - .disable_http_hook("/db") .await .route("/db", route::db) - .await; - - server - .disable_http_hook("/query") .await .route("/query", route::query) - .await; - - server - .disable_http_hook("/fortunes") .await .route("/fortunes", route::fortunes) - .await; - - server - .disable_http_hook("/upda") .await .route("/upda", route::update) + .await + .run() + .await + .unwrap() + .wait() .await; - - server.run().await.unwrap().wait().await; } async fn init() { From ea7463af6a1394193e0039eec1545f70301d17d7 Mon Sep 17 00:00:00 2001 From: Aleksandr Razumov Date: Tue, 16 Sep 2025 18:59:00 +0300 Subject: [PATCH 1613/1766] [go/go-faster]: Add go-faster (#10113) --- frameworks/Go/go-faster/README.md | 16 +++ frameworks/Go/go-faster/benchmark_config.json | 24 ++++ frameworks/Go/go-faster/config.toml | 15 +++ frameworks/Go/go-faster/go-faster.dockerfile | 8 ++ frameworks/Go/go-faster/src/.gitignore | 1 + frameworks/Go/go-faster/src/Makefile | 2 + frameworks/Go/go-faster/src/go.mod | 36 +++++ frameworks/Go/go-faster/src/go.sum | 68 ++++++++++ frameworks/Go/go-faster/src/main.go | 50 +++++++ .../Go/go-faster/src/message.encoder.go | 7 + frameworks/Go/go-faster/src/message.go | 123 ++++++++++++++++++ .../Go/go-faster/src/message.schema.json | 11 ++ 12 files changed, 361 insertions(+) create mode 100644 frameworks/Go/go-faster/README.md create mode 100644 frameworks/Go/go-faster/benchmark_config.json create mode 100644 frameworks/Go/go-faster/config.toml create mode 100644 frameworks/Go/go-faster/go-faster.dockerfile create mode 100644 frameworks/Go/go-faster/src/.gitignore create mode 100644 frameworks/Go/go-faster/src/Makefile create mode 100644 frameworks/Go/go-faster/src/go.mod create mode 100644 frameworks/Go/go-faster/src/go.sum create mode 100644 frameworks/Go/go-faster/src/main.go create mode 100644 frameworks/Go/go-faster/src/message.encoder.go create mode 100644 frameworks/Go/go-faster/src/message.go create mode 100644 frameworks/Go/go-faster/src/message.schema.json diff --git a/frameworks/Go/go-faster/README.md b/frameworks/Go/go-faster/README.md new file mode 100644 index 00000000000..4e2f3475b87 --- /dev/null +++ b/frameworks/Go/go-faster/README.md @@ -0,0 +1,16 @@ +# [go-faster](https://github.com/go-faster) (Go) Benchmarking Test + +The [go-faster/hx][hx] is a low-level http package for Go, simplified fork of [fasthttp][fasthttp]. +The [go-faster/jx][jx] is a low-level json package for Go. +The [ogen][ogen] project is a fast OpenAPI v3 implementation for Go. + +[go-faster]: https://github.com/go-faster +[hx]: https://github.com/go-faster/hx +[jx]: https://github.com/go-faster/jx +[ogen]: https://github.com/ogen-go +[fasthttp]: https://github.com/valyala/fasthttp + +## Test URLs + + http://localhost:8080/plaintext + http://localhost:8080/json diff --git a/frameworks/Go/go-faster/benchmark_config.json b/frameworks/Go/go-faster/benchmark_config.json new file mode 100644 index 00000000000..67ccf198078 --- /dev/null +++ b/frameworks/Go/go-faster/benchmark_config.json @@ -0,0 +1,24 @@ +{ + "framework": "go-faster", + "tests": [{ + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "go-faster", + "language": "Go", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "go-faster", + "notes": "", + "versus": "go" + } + }] +} diff --git a/frameworks/Go/go-faster/config.toml b/frameworks/Go/go-faster/config.toml new file mode 100644 index 00000000000..775da34271c --- /dev/null +++ b/frameworks/Go/go-faster/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "go-faster" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "None" +versus = "go" diff --git a/frameworks/Go/go-faster/go-faster.dockerfile b/frameworks/Go/go-faster/go-faster.dockerfile new file mode 100644 index 00000000000..32f40e082a8 --- /dev/null +++ b/frameworks/Go/go-faster/go-faster.dockerfile @@ -0,0 +1,8 @@ +FROM docker.io/golang:1.25.0 + +WORKDIR /go-faster +COPY ./src /go-faster +RUN make build + +EXPOSE 8080 +CMD ["./go-faster-techempower"] diff --git a/frameworks/Go/go-faster/src/.gitignore b/frameworks/Go/go-faster/src/.gitignore new file mode 100644 index 00000000000..d9beb2c6bf8 --- /dev/null +++ b/frameworks/Go/go-faster/src/.gitignore @@ -0,0 +1 @@ +/go-faster-techempower diff --git a/frameworks/Go/go-faster/src/Makefile b/frameworks/Go/go-faster/src/Makefile new file mode 100644 index 00000000000..e4988315f8b --- /dev/null +++ b/frameworks/Go/go-faster/src/Makefile @@ -0,0 +1,2 @@ +build: + GOAMD64=v3 go build -ldflags="-s -w" -o go-faster-techempower . diff --git a/frameworks/Go/go-faster/src/go.mod b/frameworks/Go/go-faster/src/go.mod new file mode 100644 index 00000000000..4b1d09314e8 --- /dev/null +++ b/frameworks/Go/go-faster/src/go.mod @@ -0,0 +1,36 @@ +module go-faster/app + +go 1.24.0 + +toolchain go1.25.0 + +require ( + github.com/go-faster/errors v0.7.1 + github.com/go-faster/hx v0.4.0 + github.com/go-faster/jx v1.1.0 + github.com/ogen-go/ogen v1.14.0 +) + +tool github.com/ogen-go/ogen/cmd/jschemagen + +require ( + github.com/dlclark/regexp2 v1.11.5 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-faster/yaml v0.4.6 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/segmentio/asm v1.2.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 // indirect + golang.org/x/mod v0.24.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.25.0 // indirect + golang.org/x/tools v0.33.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/frameworks/Go/go-faster/src/go.sum b/frameworks/Go/go-faster/src/go.sum new file mode 100644 index 00000000000..2c90e39872f --- /dev/null +++ b/frameworks/Go/go-faster/src/go.sum @@ -0,0 +1,68 @@ +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/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= +github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= +github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= +github.com/go-faster/hx v0.4.0 h1:HQHQJWjRX6OrOq5Eym+iUEuQQ3fE204LzTSxkGmqc/o= +github.com/go-faster/hx v0.4.0/go.mod h1:T+v3cOtXcUkJrFH9iBrKCK8gV77tU2RVC9UKaAZ1wLI= +github.com/go-faster/jx v1.1.0 h1:ZsW3wD+snOdmTDy9eIVgQdjUpXRRV4rqW8NS3t+20bg= +github.com/go-faster/jx v1.1.0/go.mod h1:vKDNikrKoyUmpzaJ0OkIkRQClNHFX/nF3dnTJZb3skg= +github.com/go-faster/yaml v0.4.6 h1:lOK/EhI04gCpPgPhgt0bChS6bvw7G3WwI8xxVe0sw9I= +github.com/go-faster/yaml v0.4.6/go.mod h1:390dRIvV4zbnO7qC9FGo6YYutc+wyyUSHBgbXL52eXk= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +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.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/ogen-go/ogen v1.14.0 h1:TU1Nj4z9UBsAfTkf+IhuNNp7igdFQKqkk9+6/y4XuWg= +github.com/ogen-go/ogen v1.14.0/go.mod h1:Iw1vkqkx6SU7I9th5ceP+fVPJ6Wge4e3kAVzAxJEpPE= +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/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY= +golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +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.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frameworks/Go/go-faster/src/main.go b/frameworks/Go/go-faster/src/main.go new file mode 100644 index 00000000000..9d596209d9d --- /dev/null +++ b/frameworks/Go/go-faster/src/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "context" + "flag" + "log/slog" + "net/http" + + "github.com/go-faster/hx" +) + +//go:generate go tool jschemagen -target message.go -typename Message message.schema.json + +func main() { + var arg struct { + Workers int + Addr string + Mode string + } + flag.StringVar(&arg.Addr, "addr", ":8080", "listen address") + flag.IntVar(&arg.Workers, "j", 1024, "count of workers") + flag.Parse() + + slog.Info("starting server", + slog.String("addr", arg.Addr), + slog.Int("workers", arg.Workers), + ) + + s := &hx.Server{ + Workers: arg.Workers, + Name: "hx", + Handler: func(ctx *hx.Ctx) { + switch string(ctx.Request.URI().Path()) { + case "/plaintext": + ctx.Response.Header.Add("Content-Type", "text/plain") + ctx.Response.AppendBodyString("Hello, World!") + case "/json": + ctx.Response.Header.Add("Content-Type", "application/json") + msg := Message{Message: "Hello, World!"} + ctx.JSON.Encode(msg) + ctx.Response.AppendBody(ctx.JSON.Encoder.Bytes()) + default: + ctx.Response.SetStatusCode(http.StatusNotFound) + } + }, + } + if err := s.ListenAndServe(context.Background(), arg.Addr); err != nil { + slog.Error("Failed to start server", slog.Any("err", err)) + } +} diff --git a/frameworks/Go/go-faster/src/message.encoder.go b/frameworks/Go/go-faster/src/message.encoder.go new file mode 100644 index 00000000000..51fbf69b2db --- /dev/null +++ b/frameworks/Go/go-faster/src/message.encoder.go @@ -0,0 +1,7 @@ +package main + +import "github.com/go-faster/jx" + +func (m Message) JSONEncode(e *jx.Encoder) { + m.Encode(e) +} diff --git a/frameworks/Go/go-faster/src/message.go b/frameworks/Go/go-faster/src/message.go new file mode 100644 index 00000000000..acbbddc43af --- /dev/null +++ b/frameworks/Go/go-faster/src/message.go @@ -0,0 +1,123 @@ +// Code generated by ogen, DO NOT EDIT. + +package main + +import ( + "math/bits" + "strconv" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + + "github.com/ogen-go/ogen/validate" +) + +type Message struct { + Message string `json:"message"` +} + +// GetMessage returns the value of Message. +func (s *Message) GetMessage() string { + return s.Message +} + +// SetMessage sets the value of Message. +func (s *Message) SetMessage(val string) { + s.Message = val +} + +// Encode implements json.Marshaler. +func (s *Message) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *Message) encodeFields(e *jx.Encoder) { + { + e.FieldStart("message") + e.Str(s.Message) + } +} + +var jsonFieldsNameOfMessage = [1]string{ + 0: "message", +} + +// Decode decodes Message from json. +func (s *Message) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Message to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "message": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Message = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode Message") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfMessage) { + name = jsonFieldsNameOfMessage[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *Message) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Message) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} diff --git a/frameworks/Go/go-faster/src/message.schema.json b/frameworks/Go/go-faster/src/message.schema.json new file mode 100644 index 00000000000..f4e5c81a095 --- /dev/null +++ b/frameworks/Go/go-faster/src/message.schema.json @@ -0,0 +1,11 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "required": ["message"], + "additionalProperties": false +} \ No newline at end of file From a9c8fdae48caa77410956388ce293648167baf77 Mon Sep 17 00:00:00 2001 From: Dmitry Olshansky Date: Mon, 22 Sep 2025 21:33:44 +0300 Subject: [PATCH 1614/1766] Photon - a D programming language fiber based framework (#10114) * Add photon-http benchmark source code * Update readme * Other files * Two minor fixes * s/Stripped/Realistic/ --------- Co-authored-by: Dmitry Olshansky --- frameworks/D/photon-http/.gitignore | 16 ++++ frameworks/D/photon-http/README.md | 25 +++++++ .../D/photon-http/benchmark_config.json | 26 +++++++ frameworks/D/photon-http/dub.json | 14 ++++ .../D/photon-http/photon-http.dockerfile | 13 ++++ frameworks/D/photon-http/source/app.d | 75 +++++++++++++++++++ 6 files changed, 169 insertions(+) create mode 100644 frameworks/D/photon-http/.gitignore create mode 100755 frameworks/D/photon-http/README.md create mode 100755 frameworks/D/photon-http/benchmark_config.json create mode 100644 frameworks/D/photon-http/dub.json create mode 100644 frameworks/D/photon-http/photon-http.dockerfile create mode 100644 frameworks/D/photon-http/source/app.d diff --git a/frameworks/D/photon-http/.gitignore b/frameworks/D/photon-http/.gitignore new file mode 100644 index 00000000000..190749e53b9 --- /dev/null +++ b/frameworks/D/photon-http/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/photon-http +photon-http.so +photon-http.dylib +photon-http.dll +photon-http.a +photon-http.lib +photon-http-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/frameworks/D/photon-http/README.md b/frameworks/D/photon-http/README.md new file mode 100755 index 00000000000..6bd107bb878 --- /dev/null +++ b/frameworks/D/photon-http/README.md @@ -0,0 +1,25 @@ +# photon-http benchmark + +A benchmark for photon fiber scheduler for D running with minimalistic http server library photon-http. + +# photon-http Benchmarking Test + +### Test Type Implementation Source Code + +* [JSON](./source/app.d) +* [PLAINTEXT](./source/app.d) + +## Important Libraries +The tests were run with: +* [photon](https://github.com/DmitryOlshansky/photon) +* [photon-http][https://github.com/DmitryOlshansky/photon-http] + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/D/photon-http/benchmark_config.json b/frameworks/D/photon-http/benchmark_config.json new file mode 100755 index 00000000000..315143dbe2e --- /dev/null +++ b/frameworks/D/photon-http/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "photon-http", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "None", + "language": "D", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "photon-http", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/D/photon-http/dub.json b/frameworks/D/photon-http/dub.json new file mode 100644 index 00000000000..08d1abe3589 --- /dev/null +++ b/frameworks/D/photon-http/dub.json @@ -0,0 +1,14 @@ +{ + "authors": [ + "Dmitry Olshansky" + ], + "copyright": "Copyright © 2025, Dmitry Olshansky", + "dependencies": { + "asdf": "~>0.7.17", + "photon": "~>0.14.3", + "photon-http": "~>0.5.5" + }, + "description": "Benchmark of photon-http", + "license": "BSL-1.0", + "name": "photon-http-benchmark" +} \ No newline at end of file diff --git a/frameworks/D/photon-http/photon-http.dockerfile b/frameworks/D/photon-http/photon-http.dockerfile new file mode 100644 index 00000000000..e9c86a93afb --- /dev/null +++ b/frameworks/D/photon-http/photon-http.dockerfile @@ -0,0 +1,13 @@ +FROM dlangdockerized/ldc + + +WORKDIR /app + +COPY . . + +RUN dub build -b release --compiler=ldc2 + +EXPOSE 8080 + +CMD ["/app/photon-http-benchmark"] + diff --git a/frameworks/D/photon-http/source/app.d b/frameworks/D/photon-http/source/app.d new file mode 100644 index 00000000000..db57623853c --- /dev/null +++ b/frameworks/D/photon-http/source/app.d @@ -0,0 +1,75 @@ +import std.stdio; +import std.socket; +import std.array; + +import asdf.serialization; + +import photon, photon.http; + +struct Message +{ + string message; +} + +class BenchmarkProcessor : HttpProcessor { + HttpHeader[] plainText = [HttpHeader("Content-Type", "text/plain; charset=utf-8")]; + HttpHeader[] json = [HttpHeader("Content-Type", "application/json")]; + Appender!(char[]) jsonBuf; + this(Socket sock) { + super(sock); + jsonBuf = appender!(char[]); + } + + override void handle(HttpRequest req) { + if (req.uri == "/plaintext") { + respondWith("Hello, world!", 200, plainText); + } else if(req.uri == "/json") { + jsonBuf.clear(); + Message("Hello, World!").serializeToJsonPretty!""(jsonBuf); + respondWith(jsonBuf.data, 200, json); + } else { + respondWith("Not found", 404, plainText); + } + } +} + +void server_worker(Socket client) { + scope processor = new BenchmarkProcessor(client); + try { + processor.run(); + } + catch(Exception e) { + debug stderr.writeln(e); + } +} + +void server() { + Socket server = new TcpSocket(); + server.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, true); + server.bind(new InternetAddress("0.0.0.0", 8080)); + server.listen(1000); + + debug writeln("Started server"); + + void processClient(Socket client) { + go(() => server_worker(client)); + } + + while(true) { + try { + debug writeln("Waiting for server.accept()"); + Socket client = server.accept(); + debug writeln("New client accepted"); + processClient(client); + } + catch(Exception e) { + writefln("Failure to accept %s", e); + } + } +} + +void main() { + startloop(); + go(() => server()); + runFibers(); +} From 53abdd50123c11d8a4ec4bfa3b38a450eb6958fd Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 22 Sep 2025 20:34:09 +0200 Subject: [PATCH 1615/1766] [ruby/hanami] Use Ruby 3.5-rc (#10115) --- frameworks/Ruby/hanami/Gemfile | 1 + frameworks/Ruby/hanami/Gemfile.lock | 2 ++ frameworks/Ruby/hanami/hanami.dockerfile | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frameworks/Ruby/hanami/Gemfile b/frameworks/Ruby/hanami/Gemfile index 83b7c0d287b..956ff09ad32 100644 --- a/frameworks/Ruby/hanami/Gemfile +++ b/frameworks/Ruby/hanami/Gemfile @@ -16,3 +16,4 @@ gem "rake" gem "rom", "~> 5.3" gem "rom-sql", "~> 3.6" gem "pg" +gem "ostruct" # required for Ruby 3.5 diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index 2b764af4a61..95e73418dce 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -119,6 +119,7 @@ GEM hansi (~> 0.2.0) mustermann (= 3.0.3) nio4r (2.7.4) + ostruct (0.6.3) pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) @@ -171,6 +172,7 @@ DEPENDENCIES hanami-router (~> 2.2) hanami-validations (~> 2.2) hanami-view (~> 2.2) + ostruct pg puma rake diff --git a/frameworks/Ruby/hanami/hanami.dockerfile b/frameworks/Ruby/hanami/hanami.dockerfile index 46bb0e3beaa..172d55b4946 100644 --- a/frameworks/Ruby/hanami/hanami.dockerfile +++ b/frameworks/Ruby/hanami/hanami.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc ENV RUBY_YJIT_ENABLE=1 ENV WEB_CONCURRENCY=auto From 9c1868ee0b5a99a6fdd7b6bb12d8f42ab8e4cd2c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 22 Sep 2025 20:34:26 +0200 Subject: [PATCH 1616/1766] [ruby/rack] Let Puma decide the number of workers (#10117) --- frameworks/Ruby/rack/config/puma.rb | 18 ++++++------------ frameworks/Ruby/rack/hello_world.rb | 6 ++---- frameworks/Ruby/rack/rack.dockerfile | 1 + 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/frameworks/Ruby/rack/config/puma.rb b/frameworks/Ruby/rack/config/puma.rb index 27d851c89b1..d714d611d5e 100644 --- a/frameworks/Ruby/rack/config/puma.rb +++ b/frameworks/Ruby/rack/config/puma.rb @@ -1,21 +1,15 @@ -# frozen_string_literal: true - require_relative 'auto_tune' -require 'etc' -require 'sequel' # FWBM only... use the puma_auto_tune gem in production! -num_workers, num_threads = auto_tune -num_threads = [num_threads, 32].min - -before_fork do - Sequel::DATABASES.each(&:disconnect) -end +_, num_threads = auto_tune if RUBY_PLATFORM == 'java' num_threads = 512 num_workers = 0 end -workers num_workers -threads num_threads, num_threads +threads num_threads + +before_fork do + Sequel::DATABASES.each(&:disconnect) +end diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index a0c32d2421d..d2861847a32 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -42,10 +42,8 @@ class HelloWorld ' def initialize - if defined?(Puma) - num_workers, num_threads = auto_tune - num_threads = [num_threads, 32].min - max_connections = num_workers * num_threads + if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 + max_connections = threads else max_connections = 512 end diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index e1487dfe5f1..b39a067e356 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -19,5 +19,6 @@ RUN bundle install --jobs=8 COPY . . EXPOSE 8080 +ENV WEB_CONCURRENCY=auto CMD bundle exec puma -C config/puma.rb -b tcp://0.0.0.0:8080 -e production From 419e62517da5e29bea67b98d0bd2abf2363b39b8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 22 Sep 2025 20:35:13 +0200 Subject: [PATCH 1617/1766] [ruby/grape] Let Puma decide the number of workers (#10118) --- frameworks/Ruby/grape/config/puma.rb | 6 ++---- frameworks/Ruby/grape/grape.dockerfile | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/grape/config/puma.rb b/frameworks/Ruby/grape/config/puma.rb index 1ac05407d4a..a489e1af89d 100644 --- a/frameworks/Ruby/grape/config/puma.rb +++ b/frameworks/Ruby/grape/config/puma.rb @@ -1,11 +1,9 @@ require_relative 'auto_tune' # FWBM only... use the puma_auto_tune gem in production! -num_workers, num_threads = auto_tune +_, num_threads = auto_tune -workers num_workers - -threads 3, 3 +threads num_threads # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code diff --git a/frameworks/Ruby/grape/grape.dockerfile b/frameworks/Ruby/grape/grape.dockerfile index bf7d2259a35..3108a40dc55 100644 --- a/frameworks/Ruby/grape/grape.dockerfile +++ b/frameworks/Ruby/grape/grape.dockerfile @@ -13,6 +13,7 @@ WORKDIR /grape RUN bundle install --jobs=4 --gemfile=/grape/Gemfile +ENV WEB_CONCURRENCY=auto EXPOSE 8080 CMD bundle exec puma -C config/puma.rb -b tcp://0.0.0.0:8080 -e production From 037b691a1ed4d358920db288648fc83c4ba9e27f Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 22 Sep 2025 20:35:30 +0200 Subject: [PATCH 1618/1766] [ruby/roda] Let Puma decide the number of workers (#10119) --- frameworks/Ruby/roda-sequel/Gemfile | 1 + frameworks/Ruby/roda-sequel/Gemfile.lock | 2 ++ frameworks/Ruby/roda-sequel/config/mri_puma.rb | 9 ++++++--- .../Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 1 + frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 1 + 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 82ea81b15ef..9094dc82714 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -6,6 +6,7 @@ gem "sequel", "~> 5.67" gem "roda", "~> 3.66" gem "tilt", "~> 2.1", require: "tilt/erb" gem "cgi" # Make sure the h plugin uses the faster CGI.escape_html +gem "concurrent-ruby" group :mysql, optional: true do gem 'trilogy', '~> 2.9', platforms: [:ruby, :windows] diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 9ee9022ffa9..d4de8380167 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -3,6 +3,7 @@ GEM specs: bigdecimal (3.1.9) cgi (0.5.0) + concurrent-ruby (1.3.5) erubi (1.13.1) iodine (0.7.58) json (2.13.2) @@ -28,6 +29,7 @@ PLATFORMS DEPENDENCIES cgi + concurrent-ruby erubi (~> 1.12) iodine (~> 0.7) json (~> 2.8) diff --git a/frameworks/Ruby/roda-sequel/config/mri_puma.rb b/frameworks/Ruby/roda-sequel/config/mri_puma.rb index 95b855bafd3..794c18f0c08 100644 --- a/frameworks/Ruby/roda-sequel/config/mri_puma.rb +++ b/frameworks/Ruby/roda-sequel/config/mri_puma.rb @@ -1,7 +1,10 @@ require_relative 'auto_tune' # FWBM only... use the puma_auto_tune gem in production! -num_workers, num_threads = auto_tune +_, num_threads = auto_tune -workers num_workers -threads num_threads, num_threads +threads num_threads + +before_fork do + Sequel::DATABASES.each(&:disconnect) +end diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile index 0db48567b65..542d2d49cc9 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile @@ -16,6 +16,7 @@ RUN bundle install --jobs=8 ENV DBTYPE=postgresql +ENV WEB_CONCURRENCY=auto EXPOSE 8080 CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index 0ebcb805187..87dcf9ce1ff 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -17,6 +17,7 @@ RUN bundle install --jobs=8 ENV DBTYPE=mysql +ENV WEB_CONCURRENCY=auto EXPOSE 8080 CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production From 403b0f68331ad6bf7a18ad983b508639005a6ed3 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 22 Sep 2025 20:37:15 +0200 Subject: [PATCH 1619/1766] [ruby/sinatra] Let Puma decide the number of workers (#10120) --- frameworks/Ruby/sinatra-sequel/config/mri_puma.rb | 5 ++--- frameworks/Ruby/sinatra/sinatra-postgres.dockerfile | 1 + frameworks/Ruby/sinatra/sinatra.dockerfile | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb b/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb index 9454ae36e44..794c18f0c08 100644 --- a/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb +++ b/frameworks/Ruby/sinatra-sequel/config/mri_puma.rb @@ -1,10 +1,9 @@ require_relative 'auto_tune' # FWBM only... use the puma_auto_tune gem in production! -num_workers, num_threads = auto_tune +_, num_threads = auto_tune -workers num_workers -threads num_threads, num_threads +threads num_threads before_fork do Sequel::DATABASES.each(&:disconnect) diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 42a0b7ad813..e1d8162412d 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -13,6 +13,7 @@ WORKDIR /sinatra ENV BUNDLE_WITH=postgresql:puma RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile +ENV WEB_CONCURRENCY=auto ENV DBTYPE=postgresql EXPOSE 8080 diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index ac4a1618ed3..83a6cbb359d 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -15,6 +15,7 @@ RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV DBTYPE=mysql +ENV WEB_CONCURRENCY=auto EXPOSE 8080 CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production From 8130a9f27744ce18740623caee0f537904c3991a Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 22 Sep 2025 20:37:30 +0200 Subject: [PATCH 1620/1766] [ruby/rack-sequel] Let Puma decide the number of workers (#10121) --- frameworks/Ruby/rack-sequel/Gemfile | 1 + frameworks/Ruby/rack-sequel/Gemfile.lock | 2 ++ frameworks/Ruby/rack-sequel/config/mri_puma.rb | 3 +-- frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile | 1 + frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile b/frameworks/Ruby/rack-sequel/Gemfile index 9f69b105215..fa1f161147d 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile +++ b/frameworks/Ruby/rack-sequel/Gemfile @@ -3,6 +3,7 @@ source 'https://rubygems.org' gem 'json', '~> 2.8' gem 'sequel', '~> 5.0' gem 'rack', '~> 3.1' +gem "concurrent-ruby" group :mysql, optional: true do gem 'trilogy', '~> 2.9', platforms: [:ruby, :windows] diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 6929e4287c0..5eb3509a13f 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -2,6 +2,7 @@ GEM remote: https://rubygems.org/ specs: bigdecimal (3.1.9) + concurrent-ruby (1.3.5) json (2.13.2) nio4r (2.7.4) pg (1.5.9) @@ -21,6 +22,7 @@ PLATFORMS x86_64-linux DEPENDENCIES + concurrent-ruby json (~> 2.8) pg (~> 1.5) puma (~> 7.0) diff --git a/frameworks/Ruby/rack-sequel/config/mri_puma.rb b/frameworks/Ruby/rack-sequel/config/mri_puma.rb index 9454ae36e44..d70db95a94f 100644 --- a/frameworks/Ruby/rack-sequel/config/mri_puma.rb +++ b/frameworks/Ruby/rack-sequel/config/mri_puma.rb @@ -1,9 +1,8 @@ require_relative 'auto_tune' # FWBM only... use the puma_auto_tune gem in production! -num_workers, num_threads = auto_tune +_, num_threads = auto_tune -workers num_workers threads num_threads, num_threads before_fork do diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index aa704ec8fe3..65728878595 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile @@ -16,6 +16,7 @@ RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=postgresql +ENV WEB_CONCURRENCY=auto EXPOSE 8080 CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index 76a88efab27..a7e0c901daa 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -16,6 +16,7 @@ RUN bundle install --jobs=4 --gemfile=/rack-sequel/Gemfile ENV DBTYPE=mysql +ENV WEB_CONCURRENCY=auto EXPOSE 8080 CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production From a3906c0a4cb12f9dc9a401455b6e36e1c21fdd17 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 22 Sep 2025 20:37:47 +0200 Subject: [PATCH 1621/1766] [rails] Use 5 threads for puma (#10122) This should score better for the fortunes test. --- frameworks/Ruby/rails/rails-mysql.dockerfile | 1 + frameworks/Ruby/rails/rails.dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index feb5e3ddd55..1009954ca6e 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -21,6 +21,7 @@ RUN bundle install --jobs=8 COPY . /rails/ ENV WEB_CONCURRENCY=auto +ENV RAILS_MAX_THREADS=5 ENV RAILS_ENV=production_mysql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 2ba009331cd..a1095428571 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -21,6 +21,7 @@ RUN bundle install --jobs=8 COPY . /rails/ ENV WEB_CONCURRENCY=auto +ENV RAILS_MAX_THREADS=5 ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 From a37058b9a45063970aa41d99ceeaa40db859c734 Mon Sep 17 00:00:00 2001 From: youfeng1100 <112539276+youfeng1100@users.noreply.github.com> Date: Tue, 23 Sep 2025 02:39:08 +0800 Subject: [PATCH 1622/1766] update org.postgresql:postgresql 42.2.5 to 42.7.2 (#10116) --- frameworks/Java/gemini/servlet/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/gemini/servlet/pom.xml b/frameworks/Java/gemini/servlet/pom.xml index c1a1a797344..053c91c81df 100644 --- a/frameworks/Java/gemini/servlet/pom.xml +++ b/frameworks/Java/gemini/servlet/pom.xml @@ -29,7 +29,7 @@ org.postgresql postgresql - 42.2.5 + 42.7.2 com.techempower From e279c64b07b777e1cb5aea0dc7711b23b2b9df71 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Mon, 22 Sep 2025 20:39:39 +0200 Subject: [PATCH 1623/1766] chore: upgrade ultimate express to v2 (#9928) * chore: upgrade ultimate express to v2 * chore: update deps * chore: npm install ci * try fix uWebSockets version --- .../ultimate-express/package-lock.json | 320 +++++++++++------- .../JavaScript/ultimate-express/package.json | 2 +- .../ultimate-express-mysql.dockerfile | 4 +- .../ultimate-express-postgres.dockerfile | 4 +- .../ultimate-express.dockerfile | 4 +- 5 files changed, 214 insertions(+), 120 deletions(-) diff --git a/frameworks/JavaScript/ultimate-express/package-lock.json b/frameworks/JavaScript/ultimate-express/package-lock.json index 8359c81b60a..682c187f205 100644 --- a/frameworks/JavaScript/ultimate-express/package-lock.json +++ b/frameworks/JavaScript/ultimate-express/package-lock.json @@ -13,22 +13,32 @@ "lru-cache": "^10.0.1", "mariadb": "^3.2.0", "postgres": "^3.3.5", - "ultimate-express": "^1.3.17" + "ultimate-express": "^2.0.9" } }, "node_modules/@fastify/merge-json-schemas": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", - "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "dequal": "^2.0.3" } }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -45,9 +55,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -69,15 +79,15 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, "node_modules/@types/mime": { @@ -87,18 +97,18 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "license": "MIT", "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~7.10.0" } }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -108,9 +118,9 @@ "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -118,9 +128,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -142,9 +152,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -186,12 +196,6 @@ } } }, - "node_modules/ajv/node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "license": "BSD-3-Clause" - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -202,9 +206,10 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -214,12 +219,13 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -228,10 +234,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", "engines": { "node": ">=18" } @@ -254,10 +270,20 @@ "node": ">=0.10" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -280,6 +306,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -288,14 +315,16 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -325,17 +354,26 @@ "license": "MIT" }, "node_modules/fast-json-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.0.tgz", - "integrity": "sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.1.tgz", + "integrity": "sha512-s7SJE83QKBZwg54dIbD5rCtzOBVD43V1ReWXXYqBgwCwHLYAAT0RQc/FmrQglXqWPpz6omtryJQOau5jI4Nrvg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", "dependencies": { - "@fastify/merge-json-schemas": "^0.1.1", + "@fastify/merge-json-schemas": "^0.2.0", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.3.0", - "json-schema-ref-resolver": "^1.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^2.0.0", "rfdc": "^1.2.0" } }, @@ -349,10 +387,20 @@ } }, "node_modules/fast-uri": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", - "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", - "license": "MIT" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fast-zlib": { "version": "2.0.1", @@ -386,21 +434,23 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -417,6 +467,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -429,6 +480,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -440,6 +492,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -451,6 +504,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -480,12 +534,22 @@ } }, "node_modules/json-schema-ref-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", - "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-2.0.1.tgz", + "integrity": "sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "dequal": "^2.0.3" } }, "node_modules/json-schema-traverse": { @@ -501,16 +565,16 @@ "license": "ISC" }, "node_modules/mariadb": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.0.tgz", - "integrity": "sha512-hdRPcAzs+MTxK5VG1thBW18gGTlw6yWBe9YnLB65GLo7q0fO5DWsgomIevV/pXSaWRmD3qi6ka4oSFRTExRiEQ==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.5.tgz", + "integrity": "sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==", "license": "LGPL-2.1-or-later", "dependencies": { - "@types/geojson": "^7946.0.14", - "@types/node": "^22.5.4", + "@types/geojson": "^7946.0.16", + "@types/node": "^24.0.13", "denque": "^2.1.0", "iconv-lite": "^0.6.3", - "lru-cache": "^10.3.0" + "lru-cache": "^10.4.3" }, "engines": { "node": ">= 14" @@ -520,17 +584,18 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/mime-db": { @@ -570,9 +635,10 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -581,9 +647,9 @@ } }, "node_modules/postgres": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.5.tgz", - "integrity": "sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", + "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", "license": "Unlicense", "engines": { "node": ">=12" @@ -607,11 +673,12 @@ } }, "node_modules/qs": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", - "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -654,6 +721,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -672,6 +740,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -687,6 +756,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -704,6 +774,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -719,9 +790,9 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -734,26 +805,49 @@ "license": "MIT" }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/ultimate-express": { - "version": "1.3.17", - "resolved": "https://registry.npmjs.org/ultimate-express/-/ultimate-express-1.3.17.tgz", - "integrity": "sha512-LRqSl+wE9xtuP+S03wSZXmYoQwyCXohGzL8zy3aQs4CChfnbDOQ9tbZwz4iCineUGwp7LFj7h5Oi1eqWiB6XGw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/ultimate-express/-/ultimate-express-2.0.9.tgz", + "integrity": "sha512-7Pw3iueUmS7603iq9b1pntYYhpvMdjtnvoe/VZEHEctU/TRZ/X1B48wGZaZklSYFoTy1SDDjsPz/Qfes1ADDJg==", + "license": "Apache-2.0", "dependencies": { - "@types/express": "^4.0.0", + "@types/express": "^4.17.21", "accepts": "^1.3.8", - "acorn": "^8.14.0", + "acorn": "^8.14.1", "bytes": "^3.1.2", "cookie": "^1.0.2", "cookie-signature": "^1.2.2", @@ -765,27 +859,27 @@ "mime-types": "^2.1.35", "ms": "^2.1.3", "proxy-addr": "^2.0.7", - "qs": "^6.13.1", + "qs": "^6.14.0", "range-parser": "^1.2.1", "statuses": "^2.0.1", "tseep": "^1.3.1", - "type-is": "^1.6.18", - "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.51.0", + "type-is": "^2.0.1", + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.52.0", "vary": "^1.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "license": "MIT" }, "node_modules/uWebSockets.js": { - "version": "20.49.0", - "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#442087c0a01bf146acb7386910739ec81df06700", + "version": "20.52.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#cfc9a40d8132a34881813cec3d5f8e3a185b3ce3", "license": "Apache-2.0" }, "node_modules/vary": { diff --git a/frameworks/JavaScript/ultimate-express/package.json b/frameworks/JavaScript/ultimate-express/package.json index 292933b7185..968b92c246e 100644 --- a/frameworks/JavaScript/ultimate-express/package.json +++ b/frameworks/JavaScript/ultimate-express/package.json @@ -12,7 +12,7 @@ "lru-cache": "^10.0.1", "mariadb": "^3.2.0", "postgres": "^3.3.5", - "ultimate-express": "^1.3.17" + "ultimate-express": "^2.0.9" }, "type": "module" } diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile index 37d0fe86351..18de0be4891 100644 --- a/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile +++ b/frameworks/JavaScript/ultimate-express/ultimate-express-mysql.dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM node:22-slim +FROM node:24-slim WORKDIR /app @@ -7,7 +7,7 @@ COPY --chown=node:node . . ENV NODE_ENV production -RUN npm install +RUN npm install ci ENV DATABASE mysql diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile index 6212cefbf1d..2e055cd0857 100644 --- a/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile +++ b/frameworks/JavaScript/ultimate-express/ultimate-express-postgres.dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM node:22-slim +FROM node:24-slim WORKDIR /app @@ -7,7 +7,7 @@ COPY --chown=node:node . . ENV NODE_ENV production -RUN npm install +RUN npm install ci ENV DATABASE postgres diff --git a/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile b/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile index 52aa5a3ea55..cf49a184b60 100644 --- a/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile +++ b/frameworks/JavaScript/ultimate-express/ultimate-express.dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM node:22-slim +FROM node:24-slim WORKDIR /app @@ -7,7 +7,7 @@ COPY --chown=node:node . . ENV NODE_ENV production -RUN npm install +RUN npm install ci USER node From fdf7264007e06b00db9910e6848754eebddd608d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Wed, 24 Sep 2025 23:37:00 +0800 Subject: [PATCH 1624/1766] Upgrade(TouchSocket):nuget version (#10124) --- .../touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj | 2 +- .../CSharp/touchsocket/src/TouchSocketWebApi/Program.cs | 2 +- .../src/TouchSocketWebApi/TouchSocketWebApi.csproj | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index aaef77cb15b..0bb227659f8 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -12,6 +12,6 @@ - +
      diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs index 52fcf5a4edf..c3be15cb4ad 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -32,7 +32,7 @@ public static void Main(string[] args) }) .ConfigurePlugins(a => { - a.UseCheckClear(); + a.UseTcpSessionCheckClear(); a.UseWebApi() .ConfigureConverter(converter => diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index 6d44f27c2f5..d35803a494a 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -12,8 +12,8 @@ - - - + + + From 749e9b3d9f52a36e6a45879722c759743760566f Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Wed, 24 Sep 2025 16:39:40 +0100 Subject: [PATCH 1625/1766] H2O: Track image build timings (#10125) Signed-off-by: Anton Kirilov --- frameworks/C/h2o/h2o.dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index e7fe80db90c..783cede6984 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -4,6 +4,7 @@ ARG H2O_APP_PREFIX=/opt/h2o-app FROM "ubuntu:${UBUNTU_VERSION}" AS compile +RUN echo "[timing] Installing system packages: $(date)" ARG DEBIAN_FRONTEND=noninteractive RUN apt-get -yqq update && \ apt-get -yqq install \ @@ -31,6 +32,7 @@ RUN apt-get -yqq update && \ ruby \ systemtap-sdt-dev +RUN echo "[timing] Building H2O: $(date)" ARG H2O_VERSION=3b9b6a53cac8bcc6a25fb28df81ad295fc5f9402 WORKDIR /tmp/h2o-build @@ -47,6 +49,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ cmake --build build -j && \ cmake --install build +RUN echo "[timing] Building mustache-c: $(date)" ARG MUSTACHE_C_REVISION=7fe52392879d0188c172d94bb4fde7c513d6b929 WORKDIR /tmp/mustache-c-build @@ -56,6 +59,7 @@ RUN curl -LSs "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISIO ./autogen.sh && \ make -j "$(nproc)" install +RUN echo "[timing] Building h2o-app: $(date)" ARG H2O_APP_PREFIX WORKDIR /tmp/build COPY CMakeLists.txt ../ @@ -69,9 +73,11 @@ RUN cmake \ -S .. && \ cmake --build . -j && \ cmake --install . +RUN echo "[timing] Finished compiling: $(date)" FROM "ubuntu:${UBUNTU_VERSION}" +RUN echo "[timing] Installing final system packages: $(date)" ARG DEBIAN_FRONTEND=noninteractive RUN apt-get -yqq update && \ apt-get -yqq install \ @@ -79,6 +85,7 @@ RUN apt-get -yqq update && \ libpq5 \ liburing2 \ libyajl2 +RUN echo "[timing] Copying h2o-app to its final location: $(date)" ARG H2O_APP_PREFIX COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/" COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/" @@ -87,6 +94,7 @@ EXPOSE 8080 ARG BENCHMARK_ENV ARG TFB_TEST_DATABASE ARG TFB_TEST_NAME +RUN echo "[timing] Running h2o-app: $(date)" CMD ["taskset", \ "-c", \ From d49dd473afcbbd0b9332e6868bc42614da678d0b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 24 Sep 2025 17:40:01 +0200 Subject: [PATCH 1626/1766] [ruby/rack-sequel] Use `with_pk` instead of contants for queries (#10126) rack-sequel has connection pools timeouts, unlike roda-sequel and sinatra-sequel: rack-sequel: 2025-09-13 11:30:07 +0000 Rack app ("GET /queries?queries=10" - (10.0.1.3)): # https://tfb-status.techempower.com/unzip/results.2025-09-18-05-29-59-113.zip/results/20250910230442/rack-sequel/run/rack-sequel.log The only difference appears to be the prepared statements. Let's see if this fixes things. --- frameworks/Ruby/rack-sequel/boot.rb | 7 +------ frameworks/Ruby/rack-sequel/hello_world.rb | 13 ++++++++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/boot.rb b/frameworks/Ruby/rack-sequel/boot.rb index 9566c227d38..9c06a7f981f 100644 --- a/frameworks/Ruby/rack-sequel/boot.rb +++ b/frameworks/Ruby/rack-sequel/boot.rb @@ -41,16 +41,11 @@ def connect(dbtype) # Define ORM models class World < Sequel::Model(:World) - BY_ID = naked.where(id: :$id).prepare(:first, :world_by_id) - UPDATE = where(id: :$id).prepare(:update, :world_update, randomnumber: :$randomnumber) - def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql def self.batch_update(worlds) if DB.database_type == :mysql - worlds.each do |world| - UPDATE.(id: world[:id], randomnumber: world[:randomnumber]) - end + worlds.map(&:save_changes) else ids = [] sql = String.new("UPDATE world SET randomnumber = CASE id ") diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index b1da02bb80b..6a19304f7aa 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -30,14 +30,14 @@ def rand1 end def db - World::BY_ID.(id: rand1) + World.with_pk(rand1).values end def queries(env) ids = ALL_IDS.sample(bounded_queries(env)) DB.synchronize do ids.map do |id| - World::BY_ID.(id: id) + World.with_pk(id).values end end end @@ -84,17 +84,20 @@ def fortunes end def updates(env) + worlds = [] ids = ALL_IDS.sample(bounded_queries(env)) DB.synchronize do worlds = ids.map do |id| - world = World::BY_ID.(id: id) - world[:randomnumber] = rand1 + world = World.with_pk(id) + new_value = rand1 + new_value = rand1 while new_value == world.randomnumber + world.randomnumber = new_value world end World.batch_update(worlds) - worlds end + worlds.map!(&:values) end def call(env) From d06130a6311cc4872c8f83dba11248319a1db65d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 17:25:46 +0000 Subject: [PATCH 1627/1766] Build(deps): bump rack from 2.2.14 to 2.2.18 in /frameworks/Ruby/rage Bumps [rack](https://github.com/rack/rack) from 2.2.14 to 2.2.18. - [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/v2.2.14...v2.2.18) --- updated-dependencies: - dependency-name: rack dependency-version: 2.2.18 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rage/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rage/Gemfile.lock b/frameworks/Ruby/rage/Gemfile.lock index e11d05e427b..d1967d0bf05 100644 --- a/frameworks/Ruby/rage/Gemfile.lock +++ b/frameworks/Ruby/rage/Gemfile.lock @@ -31,7 +31,7 @@ GEM logger (1.7.0) minitest (5.25.5) pg (1.5.9) - rack (2.2.14) + rack (2.2.18) rack-test (2.2.0) rack (>= 1.3) rage-iodine (4.0.0) From 31c1afbe4370c734db7f758ae38fbca233ed0786 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Fri, 26 Sep 2025 23:36:25 +0100 Subject: [PATCH 1628/1766] H2O: Improve worker thread load balancing (#10128) Use a simple eBPF program that assigns incoming connections to worker threads in a mostly round-robin fashion. Signed-off-by: Anton Kirilov --- frameworks/C/h2o/CMakeLists.txt | 45 +++++++++++--- frameworks/C/h2o/README.md | 19 ++++-- frameworks/C/h2o/h2o.dockerfile | 17 ++++-- .../C/h2o/src/bpf/socket_load_balancer.c | 58 +++++++++++++++++++ frameworks/C/h2o/src/event_loop.c | 43 ++++++++++---- frameworks/C/h2o/src/global_data.h | 3 + frameworks/C/h2o/src/main.c | 20 +++++++ 7 files changed, 177 insertions(+), 28 deletions(-) create mode 100644 frameworks/C/h2o/src/bpf/socket_load_balancer.c diff --git a/frameworks/C/h2o/CMakeLists.txt b/frameworks/C/h2o/CMakeLists.txt index 37499b68ffa..5126e991a82 100644 --- a/frameworks/C/h2o/CMakeLists.txt +++ b/frameworks/C/h2o/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.18.0) project(h2o-app) +find_library(BPF_LIB bpf REQUIRED) find_library(CRYPTO_LIB crypto REQUIRED) find_library(H2O_LIB h2o-evloop REQUIRED) find_library(MUSTACHE_C_LIB mustache_c REQUIRED) @@ -8,27 +9,57 @@ find_library(PQ_LIB pq REQUIRED) find_library(SSL_LIB ssl REQUIRED) find_library(YAJL_LIB yajl REQUIRED) find_library(Z_LIB z REQUIRED) +find_path(ASM_INCLUDE asm/types.h REQUIRED) +find_path(BPF_INCLUDE bpf/libbpf.h REQUIRED) find_path(H2O_INCLUDE h2o.h REQUIRED) find_path(MUSTACHE_C_INCLUDE mustache.h REQUIRED) find_path(NUMA_INCLUDE numaif.h REQUIRED) find_path(OPENSSL_INCLUDE openssl/ssl.h REQUIRED) find_path(PQ_INCLUDE postgresql/libpq-fe.h REQUIRED) find_path(YAJL_INCLUDE yajl/yajl_gen.h REQUIRED) -include_directories(src ${H2O_INCLUDE} ${MUSTACHE_C_INCLUDE} ${NUMA_INCLUDE} ${OPENSSL_INCLUDE}) -include_directories(${PQ_INCLUDE} ${YAJL_INCLUDE}) +find_program(BPFTOOL_BIN bpftool REQUIRED) +find_program(CLANG_BIN clang REQUIRED) +include_directories(src ${CMAKE_BINARY_DIR}/generated-headers ${BPF_INCLUDE} ${H2O_INCLUDE}) +include_directories(${MUSTACHE_C_INCLUDE} ${NUMA_INCLUDE} ${OPENSSL_INCLUDE} ${PQ_INCLUDE}) +include_directories(${YAJL_INCLUDE}) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) add_compile_definitions(H2O_USE_LIBUV=0) set(COMMON_OPTIONS -flto=auto -pthread) -add_compile_options(-pedantic -Wall -Wextra ${COMMON_OPTIONS}) +set(WARNING_OPTIONS -pedantic -Wall -Wextra) +add_compile_options(${COMMON_OPTIONS} ${WARNING_OPTIONS}) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_FORTIFY_SOURCE=2") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3") -file(GLOB_RECURSE SOURCES "src/*.c") -add_executable(${PROJECT_NAME} ${SOURCES}) +add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/generated-headers/socket_load_balancer.h + COMMAND ${CLANG_BIN} + -c + -DNDEBUG + -g + -I ${ASM_INCLUDE} + -I ${BPF_INCLUDE} + -mcpu=v3 + -o ${CMAKE_BINARY_DIR}/socket_load_balancer.o + -O3 + -std=gnu11 + -target bpf + ${WARNING_OPTIONS} + ${CMAKE_CURRENT_SOURCE_DIR}/src/bpf/socket_load_balancer.c + COMMAND ${BPFTOOL_BIN} gen skeleton ${CMAKE_BINARY_DIR}/socket_load_balancer.o > + ${CMAKE_BINARY_DIR}/generated-headers/socket_load_balancer.h + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/bpf/socket_load_balancer.c + VERBATIM) +add_custom_target( + generated_headers + DEPENDS ${CMAKE_BINARY_DIR}/generated-headers/socket_load_balancer.h) +file(GLOB_RECURSE HANDLER_SOURCES "src/handlers/*.c") +file(GLOB SOURCES "src/*.c") +add_executable(${PROJECT_NAME} ${HANDLER_SOURCES} ${SOURCES}) +add_dependencies(${PROJECT_NAME} generated_headers) target_link_libraries(${PROJECT_NAME} ${COMMON_OPTIONS}) -target_link_libraries(${PROJECT_NAME} ${H2O_LIB} m ${MUSTACHE_C_LIB} ${NUMA_LIB} ${PQ_LIB}) -target_link_libraries(${PROJECT_NAME} ${SSL_LIB} ${CRYPTO_LIB} ${YAJL_LIB} ${Z_LIB}) +target_link_libraries(${PROJECT_NAME} ${BPF_LIB} ${H2O_LIB} m ${MUSTACHE_C_LIB} ${NUMA_LIB}) +target_link_libraries(${PROJECT_NAME} ${PQ_LIB} ${SSL_LIB} ${CRYPTO_LIB} ${YAJL_LIB} ${Z_LIB}) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) file(GLOB TEMPLATES "template/*") install(FILES ${TEMPLATES} DESTINATION share/${PROJECT_NAME}/template) diff --git a/frameworks/C/h2o/README.md b/frameworks/C/h2o/README.md index 1bb77b677c2..85fd65c2bfd 100644 --- a/frameworks/C/h2o/README.md +++ b/frameworks/C/h2o/README.md @@ -1,13 +1,22 @@ -# h2o +# h2o-app This is a framework implementation using the [H2O](https://h2o.examp1e.net) HTTP server. It builds directly on top of `libh2o` instead of running the standalone server. ## Requirements -[CMake](https://cmake.org), [H2O](https://h2o.examp1e.net), [libpq](https://www.postgresql.org), -[mustache-c](https://github.com/x86-64/mustache-c), [numactl](https://github.com/numactl/numactl), -[OpenSSL](https://www.openssl.org), [YAJL](https://lloyd.github.io/yajl) +[bpftool](https://bpftool.dev/), +[Clang](https://clang.llvm.org/), +[CMake](https://cmake.org/), +[GNU C Library](https://www.gnu.org/software/libc), +[H2O](https://h2o.examp1e.net/), +[libbpf](https://github.com/libbpf/libbpf), +[libpq](https://www.postgresql.org/), +[Linux](https://kernel.org/), +[mustache-c](https://github.com/x86-64/mustache-c), +[numactl](https://github.com/numactl/numactl), +[OpenSSL](https://www.openssl.org/), +[YAJL](https://lloyd.github.io/yajl) ## Test implementations @@ -30,4 +39,4 @@ options respectively. ## Contact -Anton Kirilov +Anton Kirilov diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 783cede6984..a86e36a7ebc 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -6,14 +6,19 @@ FROM "ubuntu:${UBUNTU_VERSION}" AS compile RUN echo "[timing] Installing system packages: $(date)" ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update && \ - apt-get -yqq install \ +RUN apt-get install \ + --no-install-recommends \ + -qqUy \ autoconf \ + automake \ bison \ + bpftool \ clang \ cmake \ curl \ flex \ + gcc \ + libbpf-dev \ libbrotli-dev \ libcap-dev \ libnuma-dev \ @@ -40,9 +45,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ tar --strip-components=1 -xz && \ cmake \ -B build \ - -DCMAKE_AR=/usr/bin/gcc-ar \ -DCMAKE_C_FLAGS="-flto=auto -march=native -mtune=native" \ - -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ -DWITH_MRUBY=on \ -G Ninja \ -S . && \ @@ -79,8 +82,10 @@ FROM "ubuntu:${UBUNTU_VERSION}" RUN echo "[timing] Installing final system packages: $(date)" ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update && \ - apt-get -yqq install \ +RUN apt-get install \ + --no-install-recommends \ + -qqUy \ + libbpf1 \ libnuma1 \ libpq5 \ liburing2 \ diff --git a/frameworks/C/h2o/src/bpf/socket_load_balancer.c b/frameworks/C/h2o/src/bpf/socket_load_balancer.c new file mode 100644 index 00000000000..ff342947617 --- /dev/null +++ b/frameworks/C/h2o/src/bpf/socket_load_balancer.c @@ -0,0 +1,58 @@ +/* + Copyright (c) 2025 Anton Valentinov Kirilov + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT + OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +// TODO: Switch to the standard atomics () after +// the system header file mess gets sorted for eBPF. +#include +#include +#include +#include + +// We need a finite number of iterations to keep the eBPF verifier happy. +#define MAX_ITERATIONS 42 + +static size_t thread_idx; +size_t thread_num = 1; + +SEC("socket") int socket_load_balancer(void *skb) +{ + (void) skb; + + // TODO: Use __atomic_load_n() after LLVM starts supporting it for eBPF. + size_t idx = *(const volatile size_t *) &thread_idx; + int ret = thread_num; + + __atomic_thread_fence(__ATOMIC_RELAXED); + + for (size_t i = 0; i < MAX_ITERATIONS; i++) { + const size_t new_idx = (idx + 1) % thread_num; + + if (__atomic_compare_exchange_n(&thread_idx, + &idx, + new_idx, + false, + __ATOMIC_RELAXED, + __ATOMIC_RELAXED)) { + ret = idx; + break; + } + } + + return ret; +} diff --git a/frameworks/C/h2o/src/event_loop.c b/frameworks/C/h2o/src/event_loop.c index 5e49f246d60..6e95bea496e 100644 --- a/frameworks/C/h2o/src/event_loop.c +++ b/frameworks/C/h2o/src/event_loop.c @@ -46,11 +46,16 @@ static void accept_connection(h2o_socket_t *listener, const char *err); static void accept_http_connection(h2o_socket_t *listener, const char *err); -static int get_listener_socket(const char *bind_address, uint16_t port); +static int get_listener_socket(bool is_main_thread, + int bpf_fd, + const char *bind_address, + uint16_t port); static void on_close_connection(void *data); static void process_messages(h2o_multithread_receiver_t *receiver, h2o_linklist_t *messages); static void shutdown_server(h2o_socket_t *listener, const char *err); -static void start_accept_polling(const config_t *config, +static void start_accept_polling(bool is_main_thread, + int bpf_fd, + const config_t *config, h2o_socket_cb accept_cb, bool is_https, event_loop_t *loop); @@ -98,7 +103,10 @@ static void accept_http_connection(h2o_socket_t *listener, const char *err) ctx->event_loop.h2o_accept_ctx.ssl_ctx = ssl_ctx; } -static int get_listener_socket(const char *bind_address, uint16_t port) +static int get_listener_socket(bool is_main_thread, + int bpf_fd, + const char *bind_address, + uint16_t port) { int ret = -1; char buf[16]; @@ -148,6 +156,15 @@ static int get_listener_socket(const char *bind_address, uint16_t port) LOCAL_CHECK_ERRNO(setsockopt, s, IPPROTO_TCP, TCP_FASTOPEN, &option, sizeof(option)); LOCAL_CHECK_ERRNO(bind, s, iter->ai_addr, iter->ai_addrlen); LOCAL_CHECK_ERRNO(listen, s, INT_MAX); + + if (is_main_thread && bpf_fd >= 0) + LOCAL_CHECK_ERRNO(setsockopt, + s, + SOL_SOCKET, + SO_ATTACH_REUSEPORT_EBPF, + &bpf_fd, + sizeof(bpf_fd)); + ret = s; break; @@ -256,16 +273,17 @@ static void shutdown_server(h2o_socket_t *listener, const char *err) } } -static void start_accept_polling(const config_t *config, +static void start_accept_polling(bool is_main_thread, + int bpf_fd, + const config_t *config, h2o_socket_cb accept_cb, bool is_https, event_loop_t *loop) { - const int listener_sd = get_listener_socket(config->bind_address, + const int listener_sd = get_listener_socket(is_main_thread, + bpf_fd, + config->bind_address, is_https ? config->https_port : config->port); - // Let all the threads race to call accept() on the socket; since the latter is - // non-blocking, that will virtually act as load balancing, and SO_REUSEPORT - // will make it efficient. h2o_socket_t * const h2o_socket = h2o_evloop_socket_create(loop->h2o_ctx.loop, listener_sd, H2O_SOCKET_FLAG_DONT_READ); @@ -345,13 +363,18 @@ void initialize_event_loop(bool is_main_thread, if (global_data->ssl_ctx) { loop->h2o_accept_ctx.ssl_ctx = global_data->ssl_ctx; - start_accept_polling(config, accept_connection, true, loop); + start_accept_polling(is_main_thread, + global_data->bpf_fd, + config, + accept_connection, + true, + loop); // Assume that the majority of the connections use HTTPS, // so HTTP can take a few extra operations. accept_cb = accept_http_connection; } - start_accept_polling(config, accept_cb, false, loop); + start_accept_polling(is_main_thread, global_data->bpf_fd, config, accept_cb, false, loop); h2o_multithread_register_receiver(loop->h2o_ctx.queue, h2o_receiver, process_messages); diff --git a/frameworks/C/h2o/src/global_data.h b/frameworks/C/h2o/src/global_data.h index 156efa8a6df..74e986cbcbf 100644 --- a/frameworks/C/h2o/src/global_data.h +++ b/frameworks/C/h2o/src/global_data.h @@ -30,6 +30,7 @@ #include "handlers/request_handler_data.h" struct global_thread_data_t; +struct socket_load_balancer; struct thread_context_t; typedef struct config_t { @@ -55,8 +56,10 @@ typedef struct { h2o_logger_t *file_logger; struct global_thread_data_t *global_thread_data; h2o_socket_t *signals; + struct socket_load_balancer *socket_load_balancer; SSL_CTX *ssl_ctx; size_t memory_alignment; + int bpf_fd; int signal_fd; h2o_buffer_prototype_t buffer_prototype; h2o_globalconf_t h2o_config; diff --git a/frameworks/C/h2o/src/main.c b/frameworks/C/h2o/src/main.c index f393b006542..c068e9919a6 100644 --- a/frameworks/C/h2o/src/main.c +++ b/frameworks/C/h2o/src/main.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include #include @@ -38,6 +40,7 @@ #include "global_data.h" #include "list.h" #include "request_handler.h" +#include "socket_load_balancer.h" #include "thread.h" #include "tls.h" #include "utility.h" @@ -81,6 +84,8 @@ static void free_global_data(global_data_t *global_data) if (global_data->file_logger) global_data->file_logger->dispose(global_data->file_logger); + close(global_data->bpf_fd); + socket_load_balancer__destroy(global_data->socket_load_balancer); cleanup_request_handlers(&global_data->request_handler_data); h2o_config_dispose(&global_data->h2o_config); @@ -93,6 +98,7 @@ static int initialize_global_data(const config_t *config, global_data_t *global_ sigset_t signals; memset(global_data, 0, sizeof(*global_data)); + global_data->bpf_fd = -1; global_data->buffer_prototype._initial_buf.capacity = H2O_SOCKET_INITIAL_INPUT_BUFFER_SIZE; global_data->memory_alignment = get_maximum_cache_line_size(); CHECK_ERRNO(sigemptyset, &signals); @@ -134,6 +140,20 @@ static int initialize_global_data(const config_t *config, global_data_t *global_ global_data->file_logger = h2o_access_log_register(pathconf, log_handle); } + global_data->socket_load_balancer = socket_load_balancer__open(); + + if (global_data->socket_load_balancer) { + global_data->socket_load_balancer->data->thread_num = config->thread_num; + + if (socket_load_balancer__load(global_data->socket_load_balancer)) { + socket_load_balancer__destroy(global_data->socket_load_balancer); + global_data->socket_load_balancer = NULL; + } + else + global_data->bpf_fd = + bpf_program__fd(global_data->socket_load_balancer->progs.socket_load_balancer); + } + global_data->global_thread_data = initialize_global_thread_data(config, global_data); if (global_data->global_thread_data) { From 3d025b68b6c015ca9f61f604c68c2f760cd4838f Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Sat, 27 Sep 2025 00:36:46 +0200 Subject: [PATCH 1629/1766] [ruby] Copy Gemfile.lock in docker (#10132) This makes sure the gem versions in the lock file are used, resulting in more predictable runs. --- frameworks/Ruby/agoo/agoo.dockerfile | 2 +- frameworks/Ruby/padrino/padrino-unicorn.dockerfile | 1 + frameworks/Ruby/padrino/padrino.dockerfile | 1 + frameworks/Ruby/rack/rack-falcon.dockerfile | 2 +- frameworks/Ruby/rack/rack-iodine.dockerfile | 2 +- frameworks/Ruby/rack/rack-jruby.dockerfile | 2 +- frameworks/Ruby/rack/rack-passenger.dockerfile | 2 +- frameworks/Ruby/rack/rack-pitchfork.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 2 +- frameworks/Ruby/rack/rack.dockerfile | 2 +- 10 files changed, 10 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/agoo/agoo.dockerfile b/frameworks/Ruby/agoo/agoo.dockerfile index 39047b6c150..b4c252a768e 100644 --- a/frameworks/Ruby/agoo/agoo.dockerfile +++ b/frameworks/Ruby/agoo/agoo.dockerfile @@ -15,7 +15,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile app.rb ./ +COPY Gemfile* app.rb ./ RUN bundle install --jobs=4 diff --git a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile b/frameworks/Ruby/padrino/padrino-unicorn.dockerfile index 95a44be3678..81a6e0fefda 100644 --- a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile +++ b/frameworks/Ruby/padrino/padrino-unicorn.dockerfile @@ -7,6 +7,7 @@ COPY models models COPY .components .components COPY config.ru config.ru COPY Gemfile Gemfile +COPY Gemfile.lock Gemfile.lock COPY Rakefile Rakefile RUN bundle config set with 'unicorn' diff --git a/frameworks/Ruby/padrino/padrino.dockerfile b/frameworks/Ruby/padrino/padrino.dockerfile index eb3bf6f68de..fc6ba9456d3 100644 --- a/frameworks/Ruby/padrino/padrino.dockerfile +++ b/frameworks/Ruby/padrino/padrino.dockerfile @@ -7,6 +7,7 @@ COPY models models COPY .components .components COPY config.ru config.ru COPY Gemfile Gemfile +COPY Gemfile.lock Gemfile.lock COPY Rakefile Rakefile RUN bundle config set with 'puma' diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index 572953b2e0b..608fb7a39a9 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -9,7 +9,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile* ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'falcon' diff --git a/frameworks/Ruby/rack/rack-iodine.dockerfile b/frameworks/Ruby/rack/rack-iodine.dockerfile index dfb4a14214f..0c4f7aafc6d 100644 --- a/frameworks/Ruby/rack/rack-iodine.dockerfile +++ b/frameworks/Ruby/rack/rack-iodine.dockerfile @@ -9,7 +9,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile* ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'iodine' diff --git a/frameworks/Ruby/rack/rack-jruby.dockerfile b/frameworks/Ruby/rack/rack-jruby.dockerfile index 00104b585dc..062547508ca 100644 --- a/frameworks/Ruby/rack/rack-jruby.dockerfile +++ b/frameworks/Ruby/rack/rack-jruby.dockerfile @@ -4,7 +4,7 @@ RUN apt-get update -y && apt-get install netbase -y WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile* ./ RUN bundle config set with 'puma' RUN bundle install --jobs=8 diff --git a/frameworks/Ruby/rack/rack-passenger.dockerfile b/frameworks/Ruby/rack/rack-passenger.dockerfile index fa2eef0c9b9..bde26ea58bc 100644 --- a/frameworks/Ruby/rack/rack-passenger.dockerfile +++ b/frameworks/Ruby/rack/rack-passenger.dockerfile @@ -9,7 +9,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile* ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'passenger' diff --git a/frameworks/Ruby/rack/rack-pitchfork.dockerfile b/frameworks/Ruby/rack/rack-pitchfork.dockerfile index c659dd52f7a..dbb0e24e3f8 100644 --- a/frameworks/Ruby/rack/rack-pitchfork.dockerfile +++ b/frameworks/Ruby/rack/rack-pitchfork.dockerfile @@ -9,7 +9,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile* ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'pitchfork' diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index 3968f0f6af0..4b464a25ddf 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -9,7 +9,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile* ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'unicorn' diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index b39a067e356..ce1c639ea11 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -10,7 +10,7 @@ ENV LD_PRELOAD=libjemalloc.so.2 WORKDIR /rack -COPY Gemfile ./ +COPY Gemfile* ./ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'puma' From 6823e07aa4186c9cf5fa335e4e1f444b795f5da8 Mon Sep 17 00:00:00 2001 From: Oxule <44937089+Oxule@users.noreply.github.com> Date: Tue, 30 Sep 2025 00:21:21 +0300 Subject: [PATCH 1630/1766] Add Celerio C# framework benchmark (#10129) * Add Celerio C# framework benchmark * Add Celerio C# framework benchmark * Readme fix --- frameworks/CSharp/celerio/README.md | 23 ++++++++++++++++ .../CSharp/celerio/benchmark_config.json | 26 +++++++++++++++++++ frameworks/CSharp/celerio/celerio.dockerfile | 24 +++++++++++++++++ frameworks/CSharp/celerio/config.toml | 15 +++++++++++ frameworks/CSharp/celerio/src/.dockerignore | 25 ++++++++++++++++++ frameworks/CSharp/celerio/src/Endpoints.cs | 25 ++++++++++++++++++ frameworks/CSharp/celerio/src/Program.cs | 6 +++++ frameworks/CSharp/celerio/src/src.csproj | 18 +++++++++++++ 8 files changed, 162 insertions(+) create mode 100644 frameworks/CSharp/celerio/README.md create mode 100644 frameworks/CSharp/celerio/benchmark_config.json create mode 100644 frameworks/CSharp/celerio/celerio.dockerfile create mode 100644 frameworks/CSharp/celerio/config.toml create mode 100644 frameworks/CSharp/celerio/src/.dockerignore create mode 100644 frameworks/CSharp/celerio/src/Endpoints.cs create mode 100644 frameworks/CSharp/celerio/src/Program.cs create mode 100644 frameworks/CSharp/celerio/src/src.csproj diff --git a/frameworks/CSharp/celerio/README.md b/frameworks/CSharp/celerio/README.md new file mode 100644 index 00000000000..438fe9ac12f --- /dev/null +++ b/frameworks/CSharp/celerio/README.md @@ -0,0 +1,23 @@ +# Celerio Benchmarks + +Celerio is a modern C# framework designed for high-performance web applications based on Source Generation **only**. +This benchmark tests Celerio using the standard TechEmpower FrameworkBenchmarks suite. + +## Links + +- [GitHub](https://github.com/Oxule/Celerio) +- [NuGet](https://www.nuget.org/packages/Celerio) + +## Infrastructure Software Versions + +- C# 12 +- .NET 8 + +## Benchmarks Included + +- **Plaintext** +- **JSON** + +## Author + +* [Oxule](https://github.com/Oxule) diff --git a/frameworks/CSharp/celerio/benchmark_config.json b/frameworks/CSharp/celerio/benchmark_config.json new file mode 100644 index 00000000000..9cd233d5d6a --- /dev/null +++ b/frameworks/CSharp/celerio/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "celerio", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Celerio", + "language": "CSharp", + "flavor": "None", + "orm": "None", + "platform": ".NET", + "webserver": "Celerio", + "os": "Linux", + "database_os": "Linux", + "display_name": "Celerio", + "notes": "", + "versus": "aspcore-mvc" + } + } + ] +} diff --git a/frameworks/CSharp/celerio/celerio.dockerfile b/frameworks/CSharp/celerio/celerio.dockerfile new file mode 100644 index 00000000000..3558ec99b4b --- /dev/null +++ b/frameworks/CSharp/celerio/celerio.dockerfile @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base +USER $APP_UID +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["src/src.csproj", "src/"] +RUN dotnet restore "src/src.csproj" +COPY . . +WORKDIR "/src/src" +RUN dotnet build "./src.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./src.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "src.dll"] diff --git a/frameworks/CSharp/celerio/config.toml b/frameworks/CSharp/celerio/config.toml new file mode 100644 index 00000000000..e942fe23094 --- /dev/null +++ b/frameworks/CSharp/celerio/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "celerio" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "None" +platform = ".NET" +webserver = "Celerio" +versus = "aspcore-mvc" \ No newline at end of file diff --git a/frameworks/CSharp/celerio/src/.dockerignore b/frameworks/CSharp/celerio/src/.dockerignore new file mode 100644 index 00000000000..cd967fc3a29 --- /dev/null +++ b/frameworks/CSharp/celerio/src/.dockerignore @@ -0,0 +1,25 @@ +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.idea +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/frameworks/CSharp/celerio/src/Endpoints.cs b/frameworks/CSharp/celerio/src/Endpoints.cs new file mode 100644 index 00000000000..eb90fb38413 --- /dev/null +++ b/frameworks/CSharp/celerio/src/Endpoints.cs @@ -0,0 +1,25 @@ +namespace src; + +using Celerio; +using static Celerio.Result; + +public static class Endpoints +{ + [Get("/plaintext")] + public static Result Plaintext() + { + return Ok().Text("Hello, World!"); + } + + [Serializable] + public class SampleResponse + { + public string message { get; set; } = "Hello, World!"; + } + + [Get("/json")] + public static Result Json() + { + return Ok().Json(new SampleResponse()); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/celerio/src/Program.cs b/frameworks/CSharp/celerio/src/Program.cs new file mode 100644 index 00000000000..c442387575e --- /dev/null +++ b/frameworks/CSharp/celerio/src/Program.cs @@ -0,0 +1,6 @@ +using System.Net; +using Celerio.Generated; + +var server = new Server(IPAddress.Any, 8080); +server.Start(); +await Task.Delay(Timeout.Infinite); \ No newline at end of file diff --git a/frameworks/CSharp/celerio/src/src.csproj b/frameworks/CSharp/celerio/src/src.csproj new file mode 100644 index 00000000000..d262c58dd1f --- /dev/null +++ b/frameworks/CSharp/celerio/src/src.csproj @@ -0,0 +1,18 @@ + + + + Exe + net8.0 + preview + enable + enable + + true + Linux + + + + + + + From 7417eb1c7546b0d00bca5223bc6736c8f08964f8 Mon Sep 17 00:00:00 2001 From: karlivory <5895483+karlivory@users.noreply.github.com> Date: Tue, 30 Sep 2025 00:24:00 +0300 Subject: [PATCH 1631/1766] add khttp (#10134) --- frameworks/Rust/khttp/Cargo.lock | 657 ++++++++++++++++++++ frameworks/Rust/khttp/Cargo.toml | 17 + frameworks/Rust/khttp/README.md | 18 + frameworks/Rust/khttp/benchmark_config.json | 26 + frameworks/Rust/khttp/khttp.dockerfile | 13 + frameworks/Rust/khttp/src/main.rs | 40 ++ 6 files changed, 771 insertions(+) create mode 100644 frameworks/Rust/khttp/Cargo.lock create mode 100644 frameworks/Rust/khttp/Cargo.toml create mode 100755 frameworks/Rust/khttp/README.md create mode 100755 frameworks/Rust/khttp/benchmark_config.json create mode 100644 frameworks/Rust/khttp/khttp.dockerfile create mode 100644 frameworks/Rust/khttp/src/main.rs diff --git a/frameworks/Rust/khttp/Cargo.lock b/frameworks/Rust/khttp/Cargo.lock new file mode 100644 index 00000000000..c9ada33c42a --- /dev/null +++ b/frameworks/Rust/khttp/Cargo.lock @@ -0,0 +1,657 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "annotate-snippets" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "buf-min" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22d5698cf6842742ed64805705798f8b351fff53fa546fd45c52184bee58dc90" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "cc" +version = "1.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.106", +] + +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khttp" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f065beacc9822de303c4a5c66c30044ed62023b5afe70407bdcf77a088b91e" +dependencies = [ + "libc", + "memchr", +] + +[[package]] +name = "khttp-techempower" +version = "0.1.0" +dependencies = [ + "khttp", + "yarte", +] + +[[package]] +name = "libc" +version = "0.2.176" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.227" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.227" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.227" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "v_eval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" +dependencies = [ + "regex", + "syn 1.0.109", +] + +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" +dependencies = [ + "buf-min", +] + +[[package]] +name = "v_jsonescape" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8219cc464ba10c48c3231a6871f11d26d831c5c45a47467eea387ea7bb10e8" +dependencies = [ + "buf-min", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[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-core" +version = "0.62.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link", +] + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "yarte" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfce1df93f3b16e5272221a559e60bbbaaa71dbc042a43996d223e51a690aab2" +dependencies = [ + "buf-min", + "yarte_derive", + "yarte_helpers", +] + +[[package]] +name = "yarte_codegen" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a79312078b97a195de91a8c1457c2e0d7abd97e6e605f3cdeb01b3c105d2cff" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_helpers", + "yarte_hir", +] + +[[package]] +name = "yarte_derive" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "v_jsonescape", + "yarte_codegen", + "yarte_helpers", + "yarte_hir", + "yarte_parser", +] + +[[package]] +name = "yarte_helpers" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" +dependencies = [ + "buf-min", + "chrono", + "dtoa", + "itoa", + "prettyplease", + "ryu", + "serde", + "serde_json", + "syn 1.0.109", + "toml", + "v_htmlescape", + "v_jsonescape", +] + +[[package]] +name = "yarte_hir" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee42d2f704a3b1d8bc111d47a705d1302a0943d85e4c230f4e8300ee0dde4a6" +dependencies = [ + "derive_more", + "proc-macro2", + "quote", + "syn 1.0.109", + "v_eval", + "v_htmlescape", + "yarte_helpers", + "yarte_parser", +] + +[[package]] +name = "yarte_parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538f72049cf7104e12d5c444048d112cb8fc788a31308afd912442a381ba860c" +dependencies = [ + "annotate-snippets", + "derive_more", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "unicode-xid", + "yarte_helpers", +] diff --git a/frameworks/Rust/khttp/Cargo.toml b/frameworks/Rust/khttp/Cargo.toml new file mode 100644 index 00000000000..c081e85f87e --- /dev/null +++ b/frameworks/Rust/khttp/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "khttp-techempower" +version = "0.1.0" +edition = "2024" + +[dependencies] +khttp = { version = "0.2", features = ["epoll"] } +yarte = { version = "0.15", features = ["json"] } + +[profile.release] +opt-level = 3 +codegen-units = 1 +panic = 'abort' +lto = true +debug = false +incremental = false +overflow-checks = false diff --git a/frameworks/Rust/khttp/README.md b/frameworks/Rust/khttp/README.md new file mode 100755 index 00000000000..11f2240ca2c --- /dev/null +++ b/frameworks/Rust/khttp/README.md @@ -0,0 +1,18 @@ +# khttp Benchmarking Test + +Benchmark for [khttp](https://github.com/karlivory/khttp) - a low-level HTTP/1.1 micro-framework. + +### Test Type Implementation Source Code + +* [JSON](./src/main.rs) +* [PLAINTEXT](./src/main.rs) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Rust/khttp/benchmark_config.json b/frameworks/Rust/khttp/benchmark_config.json new file mode 100755 index 00000000000..6cf61a135d8 --- /dev/null +++ b/frameworks/Rust/khttp/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "khttp", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "khttp", + "language": "Rust", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "khttp", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Rust/khttp/khttp.dockerfile b/frameworks/Rust/khttp/khttp.dockerfile new file mode 100644 index 00000000000..85096783cfd --- /dev/null +++ b/frameworks/Rust/khttp/khttp.dockerfile @@ -0,0 +1,13 @@ +FROM docker.io/rust:1.88 + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /app +WORKDIR /app + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release + +EXPOSE 8080 + +CMD ./target/release/khttp-techempower diff --git a/frameworks/Rust/khttp/src/main.rs b/frameworks/Rust/khttp/src/main.rs new file mode 100644 index 00000000000..a1b4f0c770f --- /dev/null +++ b/frameworks/Rust/khttp/src/main.rs @@ -0,0 +1,40 @@ +use khttp::{Headers, Method::*, Server}; +use yarte::Serialize; + +#[derive(Serialize)] +struct HelloMessage { + message: &'static str, +} + +fn main() { + let mut app = Server::builder("0.0.0.0:8080").unwrap(); + + app.route(Get, "/plaintext", |_ctx, res| { + // headers + let mut headers = Headers::new(); + headers.add(Headers::CONTENT_TYPE, b"text/plain"); + headers.add("server", b"khttp"); + + // response + res.ok(&headers, "Hello, World!") + }); + + app.route(Get, "/json", |_ctx, res| { + // headers + let mut headers = Headers::new(); + headers.add(Headers::CONTENT_TYPE, b"application/json"); + headers.add("server", b"khttp"); + + // body + let msg = HelloMessage { + message: "Hello, World!", + }; + let mut buf = Vec::with_capacity(32); + msg.to_bytes_mut(&mut buf); + + // response + res.ok(&headers, buf) + }); + + app.build().serve_epoll().unwrap(); +} From 4a34943189f0baae834ddc5b51f8757baad5f354 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 29 Sep 2025 23:25:05 +0200 Subject: [PATCH 1632/1766] [ruby/sinatra-sequel] Enable WEB_CONCURRENCY=auto for puma (#10135) --- frameworks/Ruby/sinatra-sequel/Gemfile | 1 + frameworks/Ruby/sinatra-sequel/Gemfile.lock | 2 ++ .../Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile | 1 + frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 1 + 4 files changed, 5 insertions(+) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 71268362105..2c23ecdc6d2 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -19,4 +19,5 @@ end group :puma, optional: true do gem 'puma', '~> 7.0', require: false + gem 'concurrent-ruby' # used by Puma for auto-tuning end diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index f98e693a32f..0a36eae113b 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -3,6 +3,7 @@ GEM specs: base64 (0.2.0) bigdecimal (3.1.9) + concurrent-ruby (1.3.5) iodine (0.7.58) json (2.13.2) logger (1.6.6) @@ -42,6 +43,7 @@ PLATFORMS x86_64-linux DEPENDENCIES + concurrent-ruby iodine (~> 0.7) json (~> 2.8) pg (~> 1.5) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index fbd5ccb65c3..211b710bfed 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile @@ -13,6 +13,7 @@ WORKDIR /sinatra-sequel ENV BUNDLE_WITH=postgresql:puma RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile +ENV WEB_CONCURRENCY=auto ENV DBTYPE=postgresql EXPOSE 8080 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index 3ec82224ff8..78e0443b469 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -13,6 +13,7 @@ WORKDIR /sinatra-sequel ENV BUNDLE_WITH=mysql:puma RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile +ENV WEB_CONCURRENCY=auto ENV DBTYPE=mysql EXPOSE 8080 From d5e556f571500196dd8eeed4aa5cc0e399b35cdd Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 29 Sep 2025 23:25:32 +0200 Subject: [PATCH 1633/1766] [php] Laravel-s update to PHP 8.4 and Laravel 12 (#10136) * [php] Laravel-s update to PHP 8.4 and Laravel 12 * Update composer.json * Less verbose build --- frameworks/PHP/laravel/deploy/laravel-s/composer.json | 4 ++-- frameworks/PHP/laravel/laravel-laravel-s.dockerfile | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/frameworks/PHP/laravel/deploy/laravel-s/composer.json b/frameworks/PHP/laravel/deploy/laravel-s/composer.json index c53ddcf304c..42e2a47c827 100644 --- a/frameworks/PHP/laravel/deploy/laravel-s/composer.json +++ b/frameworks/PHP/laravel/deploy/laravel-s/composer.json @@ -9,8 +9,8 @@ "license": "MIT", "require": { "php": "^8.0", - "laravel/framework": "^9", - "hhxsv5/laravel-s": "~3.7.0" + "laravel/framework": "^12", + "hhxsv5/laravel-s": "~3.8.5" }, "config": { "optimize-autoloader": true, diff --git a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile index ba8bdb4bd4f..5cc47e90375 100644 --- a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile +++ b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile @@ -1,6 +1,11 @@ -FROM phpswoole/swoole:php8.0 +FROM phpswoole/swoole:php8.4 -RUN docker-php-ext-install pcntl curl > /dev/null +RUN apt-get -y update > /dev/null \ + && apt-get install -y libicu-dev > /dev/null \ + && docker-php-ext-configure intl > /dev/null \ + && docker-php-ext-install intl > /dev/null + +RUN docker-php-ext-install pcntl opcache curl > /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini From 35c41dfb977daf805eb2942c01b4cbfea032af52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 30 Sep 2025 05:25:49 +0800 Subject: [PATCH 1634/1766] Upgrade hyperlane (#10137) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 28 ++++++++++++++-------------- frameworks/Rust/hyperlane/Cargo.toml | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 389012017e0..816160ac6fd 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -555,9 +555,9 @@ checksum = "c10a92fc539f5fc3b2c5c3de4255e4f62f2768c9cd5a0e7879edf3d3b3189186" [[package]] name = "http-type" -version = "5.4.3" +version = "5.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30aba9d0d56c9b62634b3074d8450d164f9f99b829df1942884491654368ad92" +checksum = "063a939c0353308b3ea2b27c676b8dcb5efe121fe34899de7bc1fe5e8944bb77" dependencies = [ "hex", "http-compress", @@ -573,9 +573,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "9.4.4" +version = "9.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be294cf7ebe0164f6bff1d1b5ea1a26ce4b1b5d98c84b7013ba886c777eb8bd" +checksum = "e132d66f36a5905f3594effaeb74aaa5bacdfb4c6e059db9676dbe52f093f90e" dependencies = [ "http-type", "inventory", @@ -1127,9 +1127,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -1139,9 +1139,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -1200,9 +1200,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.223" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a505d71960adde88e293da5cb5eda57093379f64e61cf77bf0e6a63af07a7bac" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -1222,18 +1222,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.223" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f57cbd357666aa7b3ac84a90b4ea328f1d4ddb6772b430caa5d9e1309bb9e9" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.223" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d428d07faf17e306e699ec1e91996e5a165ba5d6bce5b5155173e91a8a01a56" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index a22792ddef0..a371ef71030 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,12 +20,12 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "9.4.4" +hyperlane = "9.4.5" hyperlane-time = "0.7.8" num_cpus = "1.17.0" once_cell = "1.21.3" rand = "0.9.2" -serde = "1.0.223" +serde = "1.0.228" serde_json = "1.0.145" sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } From f89731b9109223b7b8002e5314eebecd4a6d926b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Tue, 30 Sep 2025 05:26:33 +0800 Subject: [PATCH 1635/1766] Upgrade(TouchSocket):nuget version and code (#10138) --- .../src/TouchSocketHttp/Program.cs | 49 +++++++------------ .../TouchSocketHttp/TouchSocketHttp.csproj | 2 +- .../src/TouchSocketWebApi/Program.cs | 18 ++++--- .../TouchSocketWebApi.csproj | 6 +-- 4 files changed, 33 insertions(+), 42 deletions(-) diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs index f326d1bd78c..be8410c5d6b 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs @@ -2,23 +2,25 @@ using TouchSocket.Core; using TouchSocket.Http; using TouchSocket.Sockets; -using static System.Net.Mime.MediaTypeNames; using HttpContent = TouchSocket.Http.HttpContent; namespace TouchSocketHttp; public class Program { - static async Task Main(string[] args) + private static async Task Main(string[] args) { int port = 8080; - - Console.WriteLine(DateHelper.DateString); - var service = new MyHttpService(); + MyHttpService service = new MyHttpService(); await service.SetupAsync(new TouchSocketConfig() .SetListenIPHosts(port) .SetNoDelay(true) + .SetTransportOption(options => + { + options.ReceivePipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); + options.SendPipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); + }) .SetMaxCount(1000000) .SetBacklog(1000) .ConfigureContainer(a => @@ -35,7 +37,7 @@ await service.SetupAsync(new TouchSocketConfig() } } -sealed class MyHttpService : HttpService +internal sealed class MyHttpService : HttpService { protected override MyHttpSessionClient NewClient() { @@ -43,24 +45,24 @@ protected override MyHttpSessionClient NewClient() } } -sealed class MyHttpSessionClient : HttpSessionClient +internal sealed class MyHttpSessionClient : HttpSessionClient { - private readonly HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); - private readonly HttpContent m_contentJson = new StringHttpContent("{\"message\":\"Hello, World!\"}", Encoding.UTF8, $"application/json"); + private readonly HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, "text/plain"); + private readonly HttpContent m_contentJson = new StringHttpContent("{\"message\":\"Hello, World!\"}", Encoding.UTF8, "application/json"); protected override async Task OnReceivedHttpRequest(HttpContext httpContext) { - var request = httpContext.Request; - var response = httpContext.Response; + HttpRequest request = httpContext.Request; + HttpResponse response = httpContext.Response; switch (request.RelativeURL) { case "/plaintext": { response.StatusCode = 200; - response.StatusMessage = "success"; + response.StatusMessage = "ok"; response.Headers.Add(HttpHeaders.Server, "T"); - response.Headers.Add(HttpHeaders.Date, DateHelper.DateString); + response.Headers.Add(HttpHeaders.Date, HttpExtensions.CurrentHttpDate); response.Content = m_contentPlaintext; await response.AnswerAsync().ConfigureAwait(false); } @@ -68,9 +70,9 @@ protected override async Task OnReceivedHttpRequest(HttpContext httpContext) case "/json": { response.StatusCode = 200; - response.StatusMessage = "success"; + response.StatusMessage = "ok"; response.Headers.Add(HttpHeaders.Server, "T"); - response.Headers.Add(HttpHeaders.Date, DateHelper.DateString); + response.Headers.Add(HttpHeaders.Date, HttpExtensions.CurrentHttpDate); response.Content = m_contentJson; await response.AnswerAsync().ConfigureAwait(false); } @@ -81,19 +83,4 @@ protected override async Task OnReceivedHttpRequest(HttpContext httpContext) break; } } -} - -static class DateHelper -{ - static Timer m_timer; - static DateHelper() - { - m_timer = new Timer((state) => - { - DateString = DateTime.UtcNow.ToGMTString(); - }, null, 0, 1000); - } - - public static string DateString { get; private set; } -} - +} \ No newline at end of file diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index 0bb227659f8..a0a36e8a443 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -12,6 +12,6 @@ - + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs index c3be15cb4ad..a6ada596dda 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -5,7 +5,6 @@ using TouchSocket.Rpc; using TouchSocket.Sockets; using TouchSocket.WebApi; -using TouchSocket.WebApi.Swagger; using HttpContent = TouchSocket.Http.HttpContent; namespace TouchSocketWebApi; @@ -14,12 +13,17 @@ public class Program { public static void Main(string[] args) { - var builder = Host.CreateApplicationBuilder(args); + HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); builder.Services.AddServiceHostedService(config => { config.SetListenIPHosts(8080) .SetNoDelay(true) + .SetTransportOption(options => + { + options.ReceivePipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); + options.SendPipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); + }) .SetMaxCount(1000000) .SetBacklog(1000) .ConfigureContainer(a => @@ -53,7 +57,7 @@ public static void Main(string[] args) }); }); - var host = builder.Build(); + IHost host = builder.Build(); host.Run(); } } @@ -61,16 +65,16 @@ public static void Main(string[] args) public partial class ApiServer : SingletonRpcServer { private readonly HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); - + public static MyJson MyJson { get; set; } = new MyJson() { Message = "Hello, World!" }; [Router("/plaintext")] [WebApi(Method = HttpMethodType.Get)] public async Task Plaintext(IWebApiCallContext callContext) { - var response= callContext.HttpContext.Response; - response.SetStatus(200, "success"); - response.Content= m_contentPlaintext; + HttpResponse response = callContext.HttpContext.Response; + response.SetStatus(200, "ok"); + response.Content = m_contentPlaintext; await response.AnswerAsync().ConfigureAwait(false); } diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index d35803a494a..ec2fa17651e 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -12,8 +12,8 @@ - - - + + + From b6deb5f435abde3a9d0fb1281afc50c15d962947 Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Tue, 30 Sep 2025 19:09:31 +0200 Subject: [PATCH 1636/1766] [ Kotlin / Hexagon ] Update dependencies (#10141) * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Fix native image settings * Change implementations * Update version * Add tests for new adapter * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Disable native benchmarks * Update configuration * Update configuration * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies --- frameworks/Kotlin/hexagon/build.gradle | 18 +++++++++--------- frameworks/Kotlin/hexagon/core/build.gradle | 4 ++-- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 43764 -> 45457 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew | 5 +---- frameworks/Kotlin/hexagon/gradlew.bat | 3 +-- .../hexagon/hexagon-helidon-native.dockerfile | 2 +- .../hexagon-helidon-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-helidon.dockerfile | 4 ++-- .../hexagon/hexagon-jdk-pgclient.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-jdk.dockerfile | 4 ++-- .../hexagon/hexagon-jetty-native.dockerfile | 2 +- .../hexagon-nettyepoll-pgclient.dockerfile | 4 ++-- .../hexagon/hexagon-nettyepoll.dockerfile | 4 ++-- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 4 ++-- frameworks/Kotlin/hexagon/hexagon.dockerfile | 4 ++-- 16 files changed, 32 insertions(+), 36 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 56329c753c5..7938c3958ac 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,7 +1,7 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "2.2.0" apply false - id "org.graalvm.buildtools.native" version "0.11.0" apply false + id "org.jetbrains.kotlin.jvm" version "2.2.20" apply false + id "org.graalvm.buildtools.native" version "0.11.1" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagontk" ext { - hexagonVersion = "4.2.3" - jettyVersion = "12.0.23" - nettyVersion = "4.2.3.Final" + hexagonVersion = "4.2.4" + jettyVersion = "12.1.1" + nettyVersion = "4.2.6.Final" - hikariVersion = "7.0.1" - postgresqlVersion = "42.7.7" - vertxVersion = "5.0.2" + hikariVersion = "7.0.2" + postgresqlVersion = "42.7.8" + vertxVersion = "5.0.4" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagontk.BenchmarkKt" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.14.3" + gradleVersion = "9.1.0" } diff --git a/frameworks/Kotlin/hexagon/core/build.gradle b/frameworks/Kotlin/hexagon/core/build.gradle index d4d2650a0dc..8ca086d1905 100644 --- a/frameworks/Kotlin/hexagon/core/build.gradle +++ b/frameworks/Kotlin/hexagon/core/build.gradle @@ -1,6 +1,6 @@ plugins { - id("gg.jte.gradle") version("3.1.13") + id("gg.jte.gradle") version("3.2.1") } dependencies { @@ -10,7 +10,7 @@ dependencies { api("com.hexagontk.serialization:serialization_jackson_json:$hexagonVersion") api("org.cache2k:cache2k-core:$cache2kVersion") - jteGenerate("gg.jte:jte-native-resources:3.1.13") + jteGenerate("gg.jte:jte-native-resources:3.2.1") } tasks.register("minimizeTemplate") { diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index 1b33c55baabb587c669f562ae36f953de2481846..8bdaf60c75ab801e22807dde59e12a8735a34077 100644 GIT binary patch delta 37256 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 delta 35551 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 diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index d4081da476b..2e1113280ef 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.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew b/frameworks/Kotlin/hexagon/gradlew index 23d15a93670..adff685a034 100755 --- a/frameworks/Kotlin/hexagon/gradlew +++ b/frameworks/Kotlin/hexagon/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat index db3a6ac207e..c4bdd3ab8e3 100644 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ b/frameworks/Kotlin/hexagon/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index 3158876f7db..2cabf6006e0 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM container-registry.oracle.com/graalvm/native-image:24-muslib-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:25-muslib-ol10 as build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index 3effb8623a3..a000e1e6cf1 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/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-25-cds-slim-musl ARG PROJECT=hexagon_helidon_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 04c375f2d3e..335d6e20d9d 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-25-cds-slim-musl ARG PROJECT=hexagon_helidon_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile index 1cfcd6cb6d2..d169dfcdfa2 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jdk-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-25-cds-slim-musl ARG PROJECT=hexagon_jdk_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile index 71bafcce051..d80d61c88b2 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jdk.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-25-cds-slim-musl ARG PROJECT=hexagon_jdk_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile index f301ecc3d55..1360bb8556c 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM container-registry.oracle.com/graalvm/native-image:24-muslib-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:25-muslib-ol10 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 509625769d2..957951bc713 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/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-25-cds-slim-musl ARG PROJECT=hexagon_nettyepoll_pgclient ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index 5686ba65a55..64e5077b30e 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-25-cds-slim-musl ARG PROJECT=hexagon_nettyepoll_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index e9411ce8d37..50a13f35392 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test war # # RUNTIME # -FROM docker.io/tomcat:11-jre21-temurin-noble +FROM docker.io/tomcat:11-jre25-temurin-noble ARG MODULE=/hexagon/hexagon_tomcat_postgresql ENV POSTGRESQL_DB_HOST tfb-database diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 6613348410c..7d7a48b0e6b 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-24-cds-musl AS build +FROM docker.io/bellsoft/liberica-runtime-container:jdk-all-25-cds-musl AS build USER root WORKDIR /hexagon @@ -12,7 +12,7 @@ RUN ./gradlew --quiet -x test installDist # # RUNTIME # -FROM docker.io/bellsoft/liberica-runtime-container:jre-24-musl +FROM docker.io/bellsoft/liberica-runtime-container:jre-25-cds-slim-musl ARG PROJECT=hexagon_jetty_postgresql ENV POSTGRESQL_DB_HOST tfb-database From aa6ff279c76261ed9ea7d4f786b2f36892b076a2 Mon Sep 17 00:00:00 2001 From: cclilshy Date: Wed, 1 Oct 2025 01:10:38 +0800 Subject: [PATCH 1637/1766] Sync the update of the Ripple (#10142) --- frameworks/PHP/ripple/composer.json | 3 +- frameworks/PHP/ripple/ripple.dockerfile | 9 +- frameworks/PHP/ripple/server.php | 295 ++++++++++++++++-------- 3 files changed, 203 insertions(+), 104 deletions(-) diff --git a/frameworks/PHP/ripple/composer.json b/frameworks/PHP/ripple/composer.json index 679f58c8cd2..350f9763c06 100644 --- a/frameworks/PHP/ripple/composer.json +++ b/frameworks/PHP/ripple/composer.json @@ -1,8 +1,7 @@ { "require": { "ext-pdo": "*", - "cloudtay/ripple-http": "^1.0", - "cloudtay/ripple": "^1.0" + "cloudtay/ripple": "^2.0" }, "minimum-stability": "beta", "prefer-stable": true diff --git a/frameworks/PHP/ripple/ripple.dockerfile b/frameworks/PHP/ripple/ripple.dockerfile index fb521c874f4..138d91d0918 100644 --- a/frameworks/PHP/ripple/ripple.dockerfile +++ b/frameworks/PHP/ripple/ripple.dockerfile @@ -2,21 +2,22 @@ FROM php:8.3-cli RUN apt-get update -yqq >> /dev/null RUN apt-get install -y libevent-dev \ + libffi-dev \ libssl-dev \ pkg-config \ build-essential \ unzip >> /dev/null RUN docker-php-ext-install pdo_mysql \ + ffi \ opcache \ posix \ pcntl \ sockets >> /dev/null -RUN pecl install event >> /dev/null +RUN pecl install ev >> /dev/null -RUN docker-php-ext-enable posix pcntl sockets -RUN docker-php-ext-enable --ini-name zz-event.ini event +RUN docker-php-ext-enable posix pcntl sockets ev COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer @@ -25,7 +26,7 @@ WORKDIR /ripple COPY --link . . # Configure -RUN composer install --quiet +RUN composer install # Start EXPOSE 8080 diff --git a/frameworks/PHP/ripple/server.php b/frameworks/PHP/ripple/server.php index 45d6c44fe50..7d197c53a89 100644 --- a/frameworks/PHP/ripple/server.php +++ b/frameworks/PHP/ripple/server.php @@ -2,32 +2,45 @@ include __DIR__ . '/vendor/autoload.php'; -use Ripple\Http\Server; +use Ripple\Database\Interface\AbstractResultSet; +use Ripple\Database\MySQL\Client; +use Ripple\Net\Http\Server; +use Ripple\Net\Http\Server\Request; +use Ripple\Sync\Channel; +use Ripple\Sync\WaitGroup; +use Ripple\Worker; use Ripple\Worker\Manager; +use Ripple\Net\Http; -use function Co\repeat; +use function Co\go; use function Co\wait; class Setup { - public static PDO $pdo; + /** + * @var string + */ public static string $dateFormatted; - public static PDOStatement $queryWorldWhereID; - public static PDOStatement $updateWorldRandomNumber; - public static PDOStatement $queryFortune; + /** + * @var null|callable + */ + private static $fortunesRenderer = null; + /** + * @return void + */ public static function dateRefresh(): void { try { $date = new DateTime('now', new DateTimeZone('GMT')); - } catch (Throwable $e) { + } catch (Throwable) { return; } + Setup::$dateFormatted = $date->format('D, d M Y H:i:s T'); } - /** * @return int */ @@ -36,13 +49,12 @@ public static function randomInt(): int try { return \random_int(1, 10000); } catch (Throwable $e) { - return mt_rand(1, 10000); + return \mt_rand(1, 10000); } } /** * @param mixed $value - * * @return int */ public static function clamp(mixed $value): int @@ -57,37 +69,71 @@ public static function clamp(mixed $value): int } /** - * @param string $template - * @param array $data - * + * @param array $rows * @return string */ - public static function render(string $template, array $data = []): string + public static function renderFortunes(array $rows): string { - foreach ($data as $key => $value) { - $$key = $value; + if (self::$fortunesRenderer === null) { + $code = \file_get_contents(__DIR__ . '/fortunes.php'); + if ($code === false) { + return ''; + } + + $renderer = static function (array $scope) use ($code): string { + foreach ($scope as $key => $value) { + $$key = $value; + } + \ob_start(); + + eval('?>' . $code); + return (string) \ob_get_clean(); + }; + + self::$fortunesRenderer = $renderer; } - \ob_start(); - include $template; - return \ob_get_clean(); + /** @var callable $renderer */ + $renderer = self::$fortunesRenderer; + return $renderer(['rows' => $rows]); } } $manager = new Manager(); -$worker = new class() extends \Ripple\Worker { - /*** @var \Ripple\Http\Server */ - public Server $server; +$worker = new class () extends Worker { + /** + * @var Server + */ + private Server $server; + + /** + * @var Channel + */ + private Channel $STM_queryWorldWhereID; + + /** + * @var Channel + */ + private Channel $STM_updateWorldRandomNumber; + + /** + * @var Channel + */ + private Channel $STM_queryFortune; /** - * @param \Ripple\Worker\Manager $manager - * * @return void */ - public function register(Manager $manager): void + public function register(): void { - $this->count = 64; - $this->server = new Server('http://0.0.0.0:8080'); + $this->count = 32; + $context = \stream_context_create([ + 'socket' => [ + 'so_reuseport' => 1, + 'so_reuseaddr' => 1 + ] + ]); + $this->server = Http::server('http://0.0.0.0:8080', $context); } /** @@ -96,101 +142,154 @@ public function register(Manager $manager): void public function boot(): void { Setup::dateRefresh(); - repeat(static fn () => Setup::dateRefresh(), 1); - - Setup::$pdo = new \PDO( - 'mysql:host=tfb-database;port=3306;dbname=hello_world', - 'benchmarkdbuser', - 'benchmarkdbpass', - [ - \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, - \PDO::ATTR_EMULATE_PREPARES => false, - \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, - ] - ); + go(static function () { + while (1) { + \Co\sleep(1); + Setup::dateRefresh(); + } + }); - Setup::$queryWorldWhereID = Setup::$pdo->prepare('SELECT id, randomNumber FROM World WHERE id = ?'); - Setup::$updateWorldRandomNumber = Setup::$pdo->prepare('UPDATE World SET randomNumber = ? WHERE id = ?'); - Setup::$queryFortune = Setup::$pdo->prepare('SELECT * FROM `Fortune`'); - $this->server->onRequest(fn (Server\Request $request) => $this->onRequest($request)); + $this->STM_queryWorldWhereID = new Channel(10); + $this->STM_updateWorldRandomNumber = new Channel(10); + $this->STM_queryFortune = new Channel(10); + + for ($i = 0; $i < 10; $i++) { + $client = new Client( + 'mysql:host=tfb-database;port=3306;dbname=hello_world', + 'benchmarkdbuser', + 'benchmarkdbpass', + ); + + $this->STM_queryWorldWhereID->send($client->prepare('SELECT id, randomNumber FROM World WHERE id = ?')); + $this->STM_updateWorldRandomNumber->send($client->prepare('UPDATE World SET randomNumber = ? WHERE id = ?')); + $this->STM_queryFortune->send($client->prepare('SELECT * FROM `Fortune`')); + } + + $this->server->onRequest = fn (Request $request) => $this->onRequest($request); $this->server->listen(); } /** - * @param \Ripple\Http\Server\Request $request - * + * @param Request $request * @return void */ - public function onRequest(Server\Request $request): void + public function onRequest(Request $request): void { switch ($request->SERVER['REQUEST_URI']) { case '/json': - $request->respondJson( - ['message' => 'Hello, World!'], - ['Date' => Setup::$dateFormatted] - ); - break; + { + $request->respondJson( + ['message' => 'Hello, World!'], + ['Date' => Setup::$dateFormatted] + ); + break; + } case '/db': - $statement = Setup::$queryWorldWhereID; - $statement->execute([Setup::randomInt()]); - $request->respondJson($statement->fetch(), ['Date' => Setup::$dateFormatted]); - break; + { + $statement = $this->STM_queryWorldWhereID->receive(); + $statement->execute([Setup::randomInt()]); + $request->respondJson($statement->fetch(AbstractResultSet::ASSOC_ARRAY), ['Date' => Setup::$dateFormatted]); + $this->STM_queryWorldWhereID->send($statement); + break; + } case '/queries': - $queries = Setup::clamp($request->GET['queries'] ?? 1); - $results = []; - $statement = Setup::$queryWorldWhereID; - while ($queries--) { - $statement->execute([Setup::randomInt()]); - $results[] = $statement->fetch(); + { + $queries = Setup::clamp($request->GET['queries'] ?? 1); + $results = []; + + $waitGroup = new WaitGroup(); + $waitGroup->add($queries); + + while ($queries--) { + go(function () use (&$results, $waitGroup) { + $statement = $this->STM_queryWorldWhereID->receive(); + + $statement->execute([Setup::randomInt()]); + $results[] = $statement->fetch(AbstractResultSet::ASSOC_ARRAY); + + $this->STM_queryWorldWhereID->send($statement); + $waitGroup->done(); + }); + } + + $waitGroup->wait(); + + $request->respondJson($results, ['Date' => Setup::$dateFormatted]); + break; } - $request->respondJson($results, ['Date' => Setup::$dateFormatted]); - break; case '/fortunes': - $rows = Setup::$pdo->query('SELECT * FROM `Fortune`')?->fetchAll(); - $rows[] = ['id' => 0, 'message' => 'Additional fortune added at request time.']; - \usort($rows, function ($a, $b) { - return $a['message'] <=> $b['message']; - }); - - $request->respondHtml( - Setup::render('fortunes.php', ['rows' => $rows]), - [ - 'Date' => Setup::$dateFormatted, - 'Content-Type' => 'text/html; charset=UTF-8' - ] - ); - break; + { + $statement = $this->STM_queryFortune->receive(); + $statement->execute(); + $rows = $statement->fetchAll(AbstractResultSet::ASSOC_ARRAY); + $this->STM_queryFortune->send($statement); + + $rows[] = ['id' => 0, 'message' => 'Additional fortune added at request time.']; + \usort($rows, function ($a, $b) { + return $a['message'] <=> $b['message']; + }); + + $request->respondHtml( + Setup::renderFortunes($rows), + [ + 'Date' => Setup::$dateFormatted, + 'Content-Type' => 'text/html; charset=UTF-8' + ] + ); + break; + } case '/updates': - $queries = Setup::clamp($request->GET['queries'] ?? 1); - $results = []; - $statement = Setup::$queryWorldWhereID; - $update = Setup::$updateWorldRandomNumber; - while ($queries--) { - $statement->execute([Setup::randomInt()]); - $row = $statement->fetch(); - $row['randomNumber'] = Setup::randomInt(); - $results[] = $row; - $update->execute([$row['randomNumber'], $row['id']]); + { + $queries = Setup::clamp($request->GET['queries'] ?? 1); + $results = []; + + $waitGroup = new WaitGroup(); + $waitGroup->add($queries); + + while ($queries--) { + go(function () use (&$results, $waitGroup) { + $statement = $this->STM_queryWorldWhereID->receive(); + $update = $this->STM_updateWorldRandomNumber->receive(); + + $statement->execute([Setup::randomInt()]); + $row = $statement->fetch(AbstractResultSet::ASSOC_ARRAY); + $row['randomNumber'] = Setup::randomInt(); + $results[] = $row; + $update->execute([$row['randomNumber'], $row['id']]); + + $this->STM_queryWorldWhereID->send($statement); + $this->STM_updateWorldRandomNumber->send($update); + + $waitGroup->done(); + }); + } + + $waitGroup->wait(); + $request->respondJson($results, ['Date' => Setup::$dateFormatted]); + + break; } - $request->respondJson($results, ['Date' => Setup::$dateFormatted]); - break; case '/plaintext': - $request->respond( - 'Hello, World!', - [ - 'Content-Type' => 'text/plain; charset=utf-8', - 'Date' => Setup::$dateFormatted - ] - ); - break; + { + $request->respond( + 'Hello, World!', + [ + 'Content-Type' => 'text/plain; charset=utf-8', + 'Date' => Setup::$dateFormatted + ] + ); + break; + } default: - $request->respond('Not Found', [], 404); + { + $request->respond('Not Found', [], 404); + } } } }; From 798664c2c31dea6291a524967a8fa2d67a5d8f6d Mon Sep 17 00:00:00 2001 From: karlivory <5895483+karlivory@users.noreply.github.com> Date: Fri, 3 Oct 2025 00:48:31 +0300 Subject: [PATCH 1638/1766] khttp: implement /fortunes benchmark (postgres) (#10143) update readme --- frameworks/Rust/khttp/Cargo.lock | 17 +++ frameworks/Rust/khttp/Cargo.toml | 1 + frameworks/Rust/khttp/README.md | 5 + frameworks/Rust/khttp/benchmark_config.json | 5 +- frameworks/Rust/khttp/src/main.rs | 152 ++++++++++++++++++- frameworks/Rust/khttp/templates/fortunes.hbs | 5 + 6 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 frameworks/Rust/khttp/templates/fortunes.hbs diff --git a/frameworks/Rust/khttp/Cargo.lock b/frameworks/Rust/khttp/Cargo.lock index c9ada33c42a..47c239fec8b 100644 --- a/frameworks/Rust/khttp/Cargo.lock +++ b/frameworks/Rust/khttp/Cargo.lock @@ -169,6 +169,7 @@ name = "khttp-techempower" version = "0.1.0" dependencies = [ "khttp", + "pq-sys", "yarte", ] @@ -205,6 +206,16 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "pq-sys" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfd6cf44cca8f9624bc19df234fc4112873432f5fda1caff174527846d026fa9" +dependencies = [ + "libc", + "vcpkg", +] + [[package]] name = "prettyplease" version = "0.1.25" @@ -415,6 +426,12 @@ dependencies = [ "buf-min", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "wasm-bindgen" version = "0.2.104" diff --git a/frameworks/Rust/khttp/Cargo.toml b/frameworks/Rust/khttp/Cargo.toml index c081e85f87e..21a5bb042d4 100644 --- a/frameworks/Rust/khttp/Cargo.toml +++ b/frameworks/Rust/khttp/Cargo.toml @@ -6,6 +6,7 @@ edition = "2024" [dependencies] khttp = { version = "0.2", features = ["epoll"] } yarte = { version = "0.15", features = ["json"] } +pq-sys = "0.7" [profile.release] opt-level = 3 diff --git a/frameworks/Rust/khttp/README.md b/frameworks/Rust/khttp/README.md index 11f2240ca2c..a0a5ad4d398 100755 --- a/frameworks/Rust/khttp/README.md +++ b/frameworks/Rust/khttp/README.md @@ -6,6 +6,7 @@ Benchmark for [khttp](https://github.com/karlivory/khttp) - a low-level HTTP/1.1 * [JSON](./src/main.rs) * [PLAINTEXT](./src/main.rs) +* [FORTUNES](./src/main.rs) ## Test URLs @@ -16,3 +17,7 @@ http://localhost:8080/json ### PLAINTEXT http://localhost:8080/plaintext + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/Rust/khttp/benchmark_config.json b/frameworks/Rust/khttp/benchmark_config.json index 6cf61a135d8..4e951342ef2 100755 --- a/frameworks/Rust/khttp/benchmark_config.json +++ b/frameworks/Rust/khttp/benchmark_config.json @@ -5,14 +5,15 @@ "default": { "json_url": "/json", "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Micro", - "database": "None", + "database": "Postgres", "framework": "khttp", "language": "Rust", "flavor": "None", - "orm": "None", + "orm": "raw", "platform": "None", "webserver": "None", "os": "Linux", diff --git a/frameworks/Rust/khttp/src/main.rs b/frameworks/Rust/khttp/src/main.rs index a1b4f0c770f..38d0755dadc 100644 --- a/frameworks/Rust/khttp/src/main.rs +++ b/frameworks/Rust/khttp/src/main.rs @@ -1,5 +1,6 @@ -use khttp::{Headers, Method::*, Server}; -use yarte::Serialize; +use khttp::{Headers, Method::*, RequestContext, ResponseHandle, Server, Status}; +use std::{ffi::CStr, io, ptr}; +use yarte::{Serialize, ywrite_html}; #[derive(Serialize)] struct HelloMessage { @@ -36,5 +37,152 @@ fn main() { res.ok(&headers, buf) }); + app.route(Get, "/fortunes", handle_fortunes); + app.build().serve_epoll().unwrap(); } + +// --------------------------------------------------------------------- +// GET /fortunes handler +// --------------------------------------------------------------------- + +fn handle_fortunes(_ctx: RequestContext, res: &mut ResponseHandle) -> io::Result<()> { + // headers + let mut headers = Headers::new(); + headers.add(Headers::CONTENT_TYPE, b"text/html; charset=utf-8"); + headers.add("server", b"khttp"); + + // response + match fetch_fortunes_html() { + Ok(body) => res.ok(&headers, body), + Err(_) => res.send0(&Status::INTERNAL_SERVER_ERROR, &headers), + } +} + +// --------------------------------------------------------------------- +// /fortunes query implementation using postgres (libpq) +// --------------------------------------------------------------------- + +use pq_sys::{ + ConnStatusType, ExecStatusType, PGconn, PQclear, PQconnectdb, PQerrorMessage, PQexecPrepared, + PQfinish, PQgetlength, PQgetvalue, PQntuples, PQprepare, PQresultStatus, PQstatus, +}; + +const DB_CONNINFO: &CStr = c"postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; +const PG_FORTUNES_SQL: &CStr = c"SELECT id, message FROM fortune"; +const PG_FORTUNES_PREPARED_STMT: &CStr = c"s_fortunes"; + +#[derive(Serialize)] +struct Fortune<'a> { + id: i32, + message: &'a str, +} + +fn fetch_fortunes_html() -> Result, String> { + PG_CONN.with(|pg| unsafe { + let res = PQexecPrepared( + pg.conn, + PG_FORTUNES_PREPARED_STMT.as_ptr(), // stmtName + 0, // nParams + ptr::null(), // paramValues + ptr::null(), // paramLengths + ptr::null(), // paramFormats + 1, // resultFormat = 1 (binary) + ); + if res.is_null() { + return Err("PQexecPrepared returned null".to_owned()); + } + if PQresultStatus(res) != ExecStatusType::PGRES_TUPLES_OK { + PQclear(res); + return Err("PQexecPrepared non-ok result status".to_owned()); + } + + let rows = PQntuples(res); + let mut fortunes = Vec::with_capacity(rows as usize + 1); + + for i in 0..rows { + // field 0: id (int) + let id_ptr = PQgetvalue(res, i, 0) as *const i32; + let id = i32::from_be(ptr::read_unaligned(id_ptr)); + + // field 1: message (text) + let msg_len = PQgetlength(res, i, 1) as usize; + let msg_ptr = PQgetvalue(res, i, 1) as *const u8; + let msg_slice = std::slice::from_raw_parts(msg_ptr, msg_len); + let message = std::str::from_utf8_unchecked(msg_slice); // message fields are stored in utf8 + + fortunes.push(Fortune { id, message }); + } + + // add extra fortune + fortunes.push(Fortune { + id: 0, + message: "Additional fortune added at request time.", + }); + + // sort + fortunes.sort_by(|a, b| a.message.cmp(b.message)); + + // render html template + let mut buf = Vec::with_capacity(2048); + ywrite_html!(buf, "{{> fortunes }}"); + + PQclear(res); + Ok(buf) + }) +} + +// TLS: connection per thread +thread_local! { + static PG_CONN: PgConnection = PgConnection::new(); +} + +struct PgConnection { + conn: *mut PGconn, +} + +impl PgConnection { + fn new() -> Self { + unsafe { + // connect + let conn = PQconnectdb(DB_CONNINFO.as_ptr()); + if PQstatus(conn) != ConnStatusType::CONNECTION_OK { + let err = get_pg_error_message(conn); + PQfinish(conn); + panic!("PQconnectdb failed: {err}"); + } + + // prepare fortunes statement + let res = PQprepare( + conn, + PG_FORTUNES_PREPARED_STMT.as_ptr(), + PG_FORTUNES_SQL.as_ptr(), + 0, + ptr::null(), + ); + if res.is_null() { + PQfinish(conn); + panic!("PQprepare returned null"); + } + + let st = PQresultStatus(res); + PQclear(res); + if st != ExecStatusType::PGRES_COMMAND_OK { + let err = get_pg_error_message(conn); + PQfinish(conn); + panic!("prepare failed: {err}"); + } + + PgConnection { conn } + } + } +} + +#[cold] +fn get_pg_error_message(conn: *mut PGconn) -> String { + unsafe { + CStr::from_ptr(PQerrorMessage(conn)) + .to_string_lossy() + .into_owned() + } +} diff --git a/frameworks/Rust/khttp/templates/fortunes.hbs b/frameworks/Rust/khttp/templates/fortunes.hbs new file mode 100644 index 00000000000..7e535aad0d0 --- /dev/null +++ b/frameworks/Rust/khttp/templates/fortunes.hbs @@ -0,0 +1,5 @@ +Fortunes + {{~# each fortunes ~}} + + {{~/each ~}} +
      idmessage
      {{id}}{{message}}
      From e33b74ffbafd8bbe1de43dadd2067ebfea139f51 Mon Sep 17 00:00:00 2001 From: Santiago Pericas-Geertsen Date: Thu, 2 Oct 2025 17:48:46 -0400 Subject: [PATCH 1639/1766] Switch to JDK 25 to run tests. (#10144) Signed-off-by: Santiago Pericas-Geertsen --- frameworks/Java/helidon/helidon-nima.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/helidon/helidon-nima.dockerfile b/frameworks/Java/helidon/helidon-nima.dockerfile index 3e34b8b275c..25278db67a9 100644 --- a/frameworks/Java/helidon/helidon-nima.dockerfile +++ b/frameworks/Java/helidon/helidon-nima.dockerfile @@ -4,7 +4,7 @@ COPY nima/src src COPY nima/pom.xml pom.xml RUN mvn package -q -FROM openjdk:22-rc-jdk-slim +FROM openjdk:25-jdk-slim WORKDIR /helidon COPY --from=maven /helidon/target/libs libs COPY --from=maven /helidon/target/benchmark-nima.jar app.jar From f6ea7f3d777c024aa67a3969a1b12f535b90c8f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 17:29:16 +0000 Subject: [PATCH 1640/1766] Build(deps): bump rack from 3.2.0 to 3.2.2 in /frameworks/Ruby/grape Bumps [rack](https://github.com/rack/rack) from 3.2.0 to 3.2.2. - [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.2.0...v3.2.2) --- updated-dependencies: - dependency-name: rack dependency-version: 3.2.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/grape/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/grape/Gemfile.lock b/frameworks/Ruby/grape/Gemfile.lock index 72c44a59d9b..781fddd196c 100644 --- a/frameworks/Ruby/grape/Gemfile.lock +++ b/frameworks/Ruby/grape/Gemfile.lock @@ -63,7 +63,7 @@ GEM nio4r (2.7.4) puma (6.6.0) nio4r (~> 2.0) - rack (3.2.0) + rack (3.2.2) raindrops (0.20.1) ruby2_keywords (0.0.5) securerandom (0.4.1) From 97afada0c9a44e81ea6f46c4732abc4953519c55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:10:37 +0000 Subject: [PATCH 1641/1766] Build(deps): bump rack from 2.2.17 to 2.2.19 in /frameworks/Ruby/hanami Bumps [rack](https://github.com/rack/rack) from 2.2.17 to 2.2.19. - [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/v2.2.17...v2.2.19) --- updated-dependencies: - dependency-name: rack dependency-version: 2.2.19 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/hanami/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/hanami/Gemfile.lock b/frameworks/Ruby/hanami/Gemfile.lock index 95e73418dce..853de823128 100644 --- a/frameworks/Ruby/hanami/Gemfile.lock +++ b/frameworks/Ruby/hanami/Gemfile.lock @@ -123,7 +123,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (2.2.17) + rack (2.2.19) rake (13.2.1) rom (5.4.2) rom-changeset (~> 5.4) From f20e2879a53074142550e089687bbb9dddd06412 Mon Sep 17 00:00:00 2001 From: Aarambh Dev Hub Date: Wed, 8 Oct 2025 03:50:27 +0530 Subject: [PATCH 1642/1766] Add Ignitia Framework v0.2.4 for TechEmpower Benchmarks (#10145) * Add Ignitia framework implementation for TechEmpower benchmarks * Add Ignitia framework with all TechEmpower requirements --- frameworks/Rust/ignitia/.gitignore | 2 + frameworks/Rust/ignitia/Cargo.lock | 3438 +++++++++++++++++ frameworks/Rust/ignitia/Cargo.toml | 46 + frameworks/Rust/ignitia/README.md | 135 + frameworks/Rust/ignitia/benchmark_config.json | 97 + frameworks/Rust/ignitia/config.toml | 19 + frameworks/Rust/ignitia/ignitia.dockerfile | 49 + frameworks/Rust/ignitia/rustfmt.toml | 3 + frameworks/Rust/ignitia/src/common/mod.rs | 38 + frameworks/Rust/ignitia/src/common/models.rs | 25 + frameworks/Rust/ignitia/src/common/utils.rs | 37 + frameworks/Rust/ignitia/src/main.rs | 50 + frameworks/Rust/ignitia/src/main_mongo.rs | 156 + frameworks/Rust/ignitia/src/main_pg.rs | 113 + frameworks/Rust/ignitia/src/main_pg_pool.rs | 225 ++ frameworks/Rust/ignitia/src/mongo/database.rs | 103 + frameworks/Rust/ignitia/src/mongo/mod.rs | 1 + frameworks/Rust/ignitia/src/pg/database.rs | 104 + frameworks/Rust/ignitia/src/pg/mod.rs | 2 + frameworks/Rust/ignitia/src/pg/models.rs | 15 + .../Rust/ignitia/src/pg_pool/database.rs | 65 + frameworks/Rust/ignitia/src/pg_pool/mod.rs | 2 + frameworks/Rust/ignitia/src/pg_pool/models.rs | 17 + .../Rust/ignitia/templates/fortunes.html.hbs | 5 + 24 files changed, 4747 insertions(+) create mode 100644 frameworks/Rust/ignitia/.gitignore create mode 100644 frameworks/Rust/ignitia/Cargo.lock create mode 100644 frameworks/Rust/ignitia/Cargo.toml create mode 100644 frameworks/Rust/ignitia/README.md create mode 100644 frameworks/Rust/ignitia/benchmark_config.json create mode 100644 frameworks/Rust/ignitia/config.toml create mode 100644 frameworks/Rust/ignitia/ignitia.dockerfile create mode 100644 frameworks/Rust/ignitia/rustfmt.toml create mode 100644 frameworks/Rust/ignitia/src/common/mod.rs create mode 100644 frameworks/Rust/ignitia/src/common/models.rs create mode 100644 frameworks/Rust/ignitia/src/common/utils.rs create mode 100644 frameworks/Rust/ignitia/src/main.rs create mode 100644 frameworks/Rust/ignitia/src/main_mongo.rs create mode 100644 frameworks/Rust/ignitia/src/main_pg.rs create mode 100644 frameworks/Rust/ignitia/src/main_pg_pool.rs create mode 100644 frameworks/Rust/ignitia/src/mongo/database.rs create mode 100644 frameworks/Rust/ignitia/src/mongo/mod.rs create mode 100644 frameworks/Rust/ignitia/src/pg/database.rs create mode 100644 frameworks/Rust/ignitia/src/pg/mod.rs create mode 100644 frameworks/Rust/ignitia/src/pg/models.rs create mode 100644 frameworks/Rust/ignitia/src/pg_pool/database.rs create mode 100644 frameworks/Rust/ignitia/src/pg_pool/mod.rs create mode 100644 frameworks/Rust/ignitia/src/pg_pool/models.rs create mode 100644 frameworks/Rust/ignitia/templates/fortunes.html.hbs diff --git a/frameworks/Rust/ignitia/.gitignore b/frameworks/Rust/ignitia/.gitignore new file mode 100644 index 00000000000..fedaa2b1d2a --- /dev/null +++ b/frameworks/Rust/ignitia/.gitignore @@ -0,0 +1,2 @@ +/target +.env diff --git a/frameworks/Rust/ignitia/Cargo.lock b/frameworks/Rust/ignitia/Cargo.lock new file mode 100644 index 00000000000..229c20bd620 --- /dev/null +++ b/frameworks/Rust/ignitia/Cargo.lock @@ -0,0 +1,3438 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "annotate-snippets" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "async-compression" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-tempfile" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acb90d9834a8015109afc79f1f548223a0614edcbab62fb35b62d4b707e975e7" +dependencies = [ + "tokio", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.0", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bson" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969a9ba84b0ff843813e7249eed1678d9b6607ce5a3b8f0a47af3fcf7978e6e" +dependencies = [ + "ahash", + "base64 0.22.1", + "bitvec", + "getrandom 0.2.16", + "getrandom 0.3.3", + "hex", + "indexmap 2.11.4", + "js-sys", + "once_cell", + "rand 0.9.2", + "serde", + "serde_bytes", + "serde_json", + "time", + "uuid", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.0", +] + +[[package]] +name = "compression-codecs" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "deadpool" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b" +dependencies = [ + "deadpool-runtime", + "lazy_static", + "num_cpus", + "serde", + "tokio", +] + +[[package]] +name = "deadpool-postgres" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" +dependencies = [ + "async-trait", + "deadpool", + "getrandom 0.2.16", + "serde", + "tokio", + "tokio-postgres", + "tracing", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +dependencies = [ + "tokio", +] + +[[package]] +name = "deranged" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "derive-where" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.106", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.1", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.11.4", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hickory-proto" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.0", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignitia" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520e629828e7090b53df761ae703d2c1a5e89741570072804f5caa3018a75b1d" +dependencies = [ + "ahash", + "arc-swap", + "async-compression", + "async-tempfile", + "async-trait", + "bytes", + "chrono", + "dashmap", + "futures", + "futures-util", + "http", + "http-body-util", + "httpdate", + "hyper", + "hyper-util", + "libc", + "memchr", + "mimalloc", + "mime", + "mime_guess", + "multer", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project", + "rand 0.8.5", + "regex", + "serde", + "serde_json", + "smallvec", + "socket2 0.5.10", + "tempfile", + "thiserror", + "tokio", + "tokio-util", + "tower", + "tower-service", + "tracing", + "tracing-subscriber", + "url", + "urlencoding", + "uuid", +] + +[[package]] +name = "ignitia-techempower" +version = "0.1.0" +dependencies = [ + "deadpool-postgres", + "dotenv", + "futures", + "futures-util", + "httpdate", + "ignitia", + "mimalloc", + "mongodb", + "num_cpus", + "rand 0.9.2", + "serde", + "serde_json", + "tokio", + "tokio-pg-mapper", + "tokio-pg-mapper-derive", + "tokio-postgres", + "yarte", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", + "serde", + "serde_core", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.176" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.9.4", + "libc", + "redox_syscall", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "macro_magic" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "macro_magic_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" +dependencies = [ + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mimalloc" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "mongocrypt" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22426d6318d19c5c0773f783f85375265d6a8f0fa76a733da8dc4355516ec63d" +dependencies = [ + "bson", + "mongocrypt-sys", + "once_cell", + "serde", +] + +[[package]] +name = "mongocrypt-sys" +version = "0.1.4+1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dda42df21d035f88030aad8e877492fac814680e1d7336a57b2a091b989ae388" + +[[package]] +name = "mongodb" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622f272c59e54a3c85f5902c6b8e7b1653a6b6681f45e4c42d6581301119a4b8" +dependencies = [ + "async-trait", + "base64 0.13.1", + "bitflags 1.3.2", + "bson", + "chrono", + "derive-where", + "derive_more", + "flate2", + "futures-core", + "futures-executor", + "futures-io", + "futures-util", + "hex", + "hickory-proto", + "hickory-resolver", + "hmac", + "macro_magic", + "md-5", + "mongocrypt", + "mongodb-internal-macros", + "once_cell", + "pbkdf2", + "percent-encoding", + "rand 0.8.5", + "rustc_version_runtime", + "rustls", + "rustversion", + "serde", + "serde_bytes", + "serde_with", + "sha1", + "sha2", + "snap", + "socket2 0.5.10", + "stringprep", + "strsim", + "take_mut", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "typed-builder", + "uuid", + "webpki-roots 0.26.11", + "zstd", +] + +[[package]] +name = "mongodb-internal-macros" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63981427a0f26b89632fd2574280e069d09fb2912a3138da15de0174d11dd077" +dependencies = [ + "macro_magic", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + +[[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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.0", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_shared", + "serde", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "postgres-protocol" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand 0.9.2", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a120daaabfcb0e324d5bf6e411e9222994cb3795c79943a0ef28ed27ea76e4" +dependencies = [ + "bytes", + "fallible-iterator", + "postgres-protocol", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "regex" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "resolv-conf" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustc_version_runtime" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" +dependencies = [ + "rustc_version", + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.9.4", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.1", +] + +[[package]] +name = "rustls" +version = "0.23.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "indexmap 2.11.4", + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.11.4", + "schemars 0.9.0", + "schemars 1.0.4", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.4", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "take_mut" +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.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.61.1", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2 0.6.0", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tokio-pg-mapper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f2b78f3566383ffabc553c72bbb2f129962a54886c5c4d8e8c706f84eceab8" +dependencies = [ + "tokio-postgres", +] + +[[package]] +name = "tokio-pg-mapper-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8548f756cd6eb4069c5af0fb0cec57001fb42bd1fb7330d8f24067ee3fa62608" +dependencies = [ + "quote", + "syn 1.0.109", + "tokio-postgres", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156efe7fff213168257853e1dfde202eed5f487522cbbbf7d219941d753d853" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.9.2", + "socket2 0.6.0", + "tokio", + "tokio-util", + "whoami", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typed-builder" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9d30e3a08026c78f246b173243cf07b3696d274debd26680773b6773c2afc7" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c36781cc0e46a83726d9879608e4cf6c2505237e263a8eb8c24502989cfdb28" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "v_eval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" +dependencies = [ + "regex", + "syn 1.0.109", +] + +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[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-core" +version = "0.62.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", +] + +[[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.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +dependencies = [ + "windows-link 0.2.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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[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 = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "yarte" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfce1df93f3b16e5272221a559e60bbbaaa71dbc042a43996d223e51a690aab2" +dependencies = [ + "yarte_derive", + "yarte_helpers", +] + +[[package]] +name = "yarte_codegen" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a79312078b97a195de91a8c1457c2e0d7abd97e6e605f3cdeb01b3c105d2cff" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_helpers", + "yarte_hir", +] + +[[package]] +name = "yarte_derive" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "yarte_codegen", + "yarte_helpers", + "yarte_hir", + "yarte_parser", +] + +[[package]] +name = "yarte_helpers" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" +dependencies = [ + "dtoa", + "itoa", + "prettyplease", + "serde", + "syn 1.0.109", + "toml", + "v_htmlescape", +] + +[[package]] +name = "yarte_hir" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee42d2f704a3b1d8bc111d47a705d1302a0943d85e4c230f4e8300ee0dde4a6" +dependencies = [ + "derive_more", + "proc-macro2", + "quote", + "syn 1.0.109", + "v_eval", + "v_htmlescape", + "yarte_helpers", + "yarte_parser", +] + +[[package]] +name = "yarte_parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538f72049cf7104e12d5c444048d112cb8fc788a31308afd912442a381ba860c" +dependencies = [ + "annotate-snippets", + "derive_more", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "unicode-xid", + "yarte_helpers", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/frameworks/Rust/ignitia/Cargo.toml b/frameworks/Rust/ignitia/Cargo.toml new file mode 100644 index 00000000000..61487fc4504 --- /dev/null +++ b/frameworks/Rust/ignitia/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "ignitia-techempower" +version = "0.1.0" +edition = "2024" + +[dependencies] +ignitia = { version = "0.2.4" } +tokio = { version = "1.46", features = ["full"] } +tokio-postgres = "0.7.13" +deadpool-postgres = { version = "0.14.1", features = ["rt_tokio_1", "serde"] } +tokio-pg-mapper = "0.2.0" +tokio-pg-mapper-derive = "0.2.0" +mongodb = { version = "3.2.4", features = ["zstd-compression", "snappy-compression", "zlib-compression"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +dotenv = "0.15.0" +rand = { version = "0.9.2", features = ["small_rng"] } +futures = "0.3.31" +futures-util = "0.3.31" +yarte = "0.15.7" +mimalloc = "0.1.47" +num_cpus = "1.17.0" +httpdate = "1.0" + +[profile.release] +lto = "fat" +codegen-units = 1 +opt-level = 3 +strip = true + + +[[bin]] +name = "ignitia" +path = "src/main.rs" + +[[bin]] +name = "ignitia-pg" +path = "src/main_pg.rs" + +[[bin]] +name = "ignitia-pg-pool" +path = "src/main_pg_pool.rs" + +[[bin]] +name = "ignitia-mongo" +path = "src/main_mongo.rs" diff --git a/frameworks/Rust/ignitia/README.md b/frameworks/Rust/ignitia/README.md new file mode 100644 index 00000000000..1b8b73b8324 --- /dev/null +++ b/frameworks/Rust/ignitia/README.md @@ -0,0 +1,135 @@ +# Ignitia TechEmpower Benchmarks + +This repository contains the TechEmpower FrameworkBenchmarks implementations for the Ignitia web framework, designed to showcase high-performance web API serving in Rust. + +--- + +## Project Variants + +| Binary | Description | +|------------------|-------------------------------------------------| +| `ignitia` | Basic variant with JSON and plaintext endpoints | +| `ignitia-pg` | PostgreSQL variant using tokio-postgres | +| `ignitia-pg-pool`| PostgreSQL variant using deadpool connection pooling | +| `ignitia-mongo` | MongoDB variant | + +--- + +## Benchmarked Endpoints + +All variants implement the following HTTP endpoints: + +- `/plaintext` - Returns a simple plaintext "Hello, World!" +- `/json` - Returns a JSON-serialized message +- `/db` - Single database query for a random World record +- `/queries?q=N` - Multiple database queries, default 1, max 500 +- `/updates?q=N` - Database updates with N queries, default 1, max 500 +- `/fortunes` - Renders HTML table with fortunes and adds one dynamically + +--- + +## Getting Started + +### Prerequisites + +- Rust (latest stable) +- Docker & Docker Compose (for database services) +- PostgreSQL or MongoDB instance running (Docker recommended) + +### Setup Databases + +Use the provided `docker-compose.yml` to start PostgreSQL and MongoDB databases locally: + +``` +docker-compose up -d +``` + +Initialize databases using provided SQL and JS scripts (`init-db.sql`, `init-mongo.js`). + +Update `.env` with correct connection URLs and ports. + +### Build and Run + +Build all variants: + +``` +cargo build --release +``` + +Run a variant (example PostgreSQL): + +``` +./target/release/ignitia-pg +``` + +Change ports if needed by modifying `.env`. + +### Test APIs + +Use curl or the included test scripts to verify endpoints. + +Example: + +``` +curl http://localhost:8000/json +curl http://localhost:8000/queries?q=5 +curl http://localhost:8000/fortunes +``` + +--- + +## Performance + +Ignitia includes several performance optimizations: + +- Zero-copy response construction +- Efficient routing with a radix tree +- High-performance async runtime using Tokio +- Connection pooling (deadpool for PostgreSQL) +- MiMalloc memory allocator for improved throughput +- HTTP/2 support and TCP tuning + +The expected throughput matches or exceeds other Rust web frameworks in TechEmpower benchmarks. + +--- + +## Docker Support + +Build the container image: + +``` +docker build -t ignitia-techempower -f ignitia.dockerfile . +``` + +Run the container (default JSON/plaintext variant): + +``` +docker run -p 8000:8000 ignitia-techempower +``` + +Override command to run other variants: + +``` +docker run -p 8000:8000 ignitia-techempower /app/ignitia-pg +``` + +--- + +## Contributing + +Contributions, bug reports, and feature requests are welcome. + +Please submit issues or pull requests following the project coding and style guidelines. + +--- + +## License + +This project is licensed under MIT License. + +--- + +## Acknowledgements + +- Inspired by the TechEmpower Framework Benchmarks project +- Thanks to the Rust community and authors of Ignitia framework diff --git a/frameworks/Rust/ignitia/benchmark_config.json b/frameworks/Rust/ignitia/benchmark_config.json new file mode 100644 index 00000000000..96a3522b92e --- /dev/null +++ b/frameworks/Rust/ignitia/benchmark_config.json @@ -0,0 +1,97 @@ +{ + "framework": "ignitia", + "tests": [ + { + "default": { + "dockerfile": "ignitia.dockerfile", + "docker_cmd": "/app/ignitia", + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8000, + "approach": "Realistic", + "classification": "Platform", + "database": "none", + "framework": "Ignitia", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Tokio", + "os": "Linux", + "database_os": "Linux", + "display_name": "Ignitia", + "notes": "Blazing fast Rust web framework with zero-copy optimizations", + "versus": "None" + }, + "pg": { + "dockerfile": "ignitia.dockerfile", + "docker_cmd": "/app/ignitia-pg", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "Ignitia", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Tokio", + "os": "Linux", + "database_os": "Linux", + "display_name": "Ignitia [PostgreSQL]", + "notes": "PostgreSQL with tokio-postgres and prepared statements", + "versus": "None" + }, + "pg-pool": { + "dockerfile": "ignitia.dockerfile", + "docker_cmd": "/app/ignitia-pg-pool", + "db_url": "/db", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "fortune_url": "/fortunes", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "postgres", + "framework": "Ignitia", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Tokio", + "os": "Linux", + "database_os": "Linux", + "display_name": "Ignitia [PostgreSQL - deadpool]", + "notes": "PostgreSQL with deadpool connection pooling", + "versus": "None" + }, + "mongo": { + "dockerfile": "ignitia.dockerfile", + "docker_cmd": "/app/ignitia-mongo", + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "update_url": "/updates?q=", + "port": 8000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "mongodb", + "framework": "Ignitia", + "language": "Rust", + "flavor": "None", + "orm": "Raw", + "platform": "Rust", + "webserver": "Tokio", + "os": "Linux", + "database_os": "Linux", + "display_name": "Ignitia [MongoDB]", + "notes": "MongoDB with native driver and compression", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Rust/ignitia/config.toml b/frameworks/Rust/ignitia/config.toml new file mode 100644 index 00000000000..0e7b5718de6 --- /dev/null +++ b/frameworks/Rust/ignitia/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "ignitia" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?q=" +urls.update = "/updates?q=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Rust" +webserver = "Tokio" +versus = "None" diff --git a/frameworks/Rust/ignitia/ignitia.dockerfile b/frameworks/Rust/ignitia/ignitia.dockerfile new file mode 100644 index 00000000000..98ad5cb3203 --- /dev/null +++ b/frameworks/Rust/ignitia/ignitia.dockerfile @@ -0,0 +1,49 @@ +FROM docker.io/rust:1.88-slim-bookworm AS builder + +# Install build dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + pkg-config \ + libssl-dev \ + && rm -rf /var/lib/apt/lists/* + +# Set working directory +WORKDIR /build + +# Copy dependency files first for better caching +COPY ./Cargo.toml ./Cargo.lock /build/ + +# Fetch dependencies +RUN cargo fetch + +# Copy template files +COPY ./templates/ /build/templates/ + +# Copy source code +COPY ./src/ /build/src/ + +# Set Rust compilation flags for native CPU optimizations +ENV RUSTFLAGS="-C target-cpu=native" + +# Build all release binaries +RUN cargo build --release + +# Use distroless for minimal runtime image +FROM gcr.io/distroless/cc-debian12 + +# Set environment variables +ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world +ENV POSTGRES_MIN_POOL_SIZE=56 +ENV POSTGRES_MAX_POOL_SIZE=56 +ENV MONGODB_URL=mongodb://tfb-database:27017 +ENV MONGODB_MIN_POOL_SIZE=56 +ENV MONGODB_MAX_POOL_SIZE=56 + +# Copy all compiled binaries from builder +COPY --from=builder /build/target/release/ignitia* /app/ + +# Expose port +EXPOSE 8000 + +# Default command (can be overridden by docker_cmd in benchmark_config.json) +CMD ["/app/ignitia"] + diff --git a/frameworks/Rust/ignitia/rustfmt.toml b/frameworks/Rust/ignitia/rustfmt.toml new file mode 100644 index 00000000000..e418c53afd2 --- /dev/null +++ b/frameworks/Rust/ignitia/rustfmt.toml @@ -0,0 +1,3 @@ +max_width = 100 +reorder_imports = true +edition = "2021" diff --git a/frameworks/Rust/ignitia/src/common/mod.rs b/frameworks/Rust/ignitia/src/common/mod.rs new file mode 100644 index 00000000000..bec23c4fed0 --- /dev/null +++ b/frameworks/Rust/ignitia/src/common/mod.rs @@ -0,0 +1,38 @@ +pub mod models; +pub mod utils; + +use rand::{Rng, RngCore, distr::Uniform, rngs::SmallRng}; +use std::{env, fmt::Debug, str::FromStr}; + +#[allow(dead_code)] +pub const SELECT_ALL_FORTUNES: &str = "SELECT * FROM fortune"; +#[allow(dead_code)] +pub const SELECT_WORLD_BY_ID: &str = "SELECT id, randomnumber FROM world WHERE id = $1 LIMIT 1"; +#[allow(dead_code)] +pub const UPDATE_WORLDS: &str = r#"UPDATE world SET randomnumber = new.rnum FROM + (SELECT * FROM UNNEST($1::int[], $2::int[]) AS v(id, rnum) ORDER BY 1) AS new +WHERE world.id = new.id"#; + +#[allow(dead_code)] +pub fn get_env(key: &str) -> T +where + ::Err: Debug, +{ + env::var(key) + .unwrap_or_else(|_| panic!("{key} environment variable was not set")) + .parse::() + .unwrap_or_else(|_| panic!("could not parse {key}")) +} + +#[allow(dead_code)] +#[inline(always)] +pub fn random_id(rng: &mut impl RngCore) -> i32 { + rng.random_range(1..=10_000) as i32 +} + +#[allow(dead_code)] +#[inline(always)] +pub fn random_ids(rng: &mut SmallRng, count: usize) -> impl Iterator + use<'_> { + rng.sample_iter(Uniform::new_inclusive(1, 10_000).unwrap()) + .take(count) +} diff --git a/frameworks/Rust/ignitia/src/common/models.rs b/frameworks/Rust/ignitia/src/common/models.rs new file mode 100644 index 00000000000..1644447c3cd --- /dev/null +++ b/frameworks/Rust/ignitia/src/common/models.rs @@ -0,0 +1,25 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize)] +pub struct Message { + pub message: &'static str, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct Fortune { + pub id: i32, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct FortuneInfo { + pub id: i32, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct World { + pub id: i32, + #[serde(rename = "randomNumber")] + pub random_number: i32, +} diff --git a/frameworks/Rust/ignitia/src/common/utils.rs b/frameworks/Rust/ignitia/src/common/utils.rs new file mode 100644 index 00000000000..892b92e2ca3 --- /dev/null +++ b/frameworks/Rust/ignitia/src/common/utils.rs @@ -0,0 +1,37 @@ +use serde::{Deserialize, Deserializer}; + +#[allow(dead_code)] +#[derive(Debug, Deserialize)] +pub struct Params { + #[serde(default, deserialize_with = "deserialize_query_count")] + pub q: usize, +} + +// Custom deserializer that handles invalid values +fn deserialize_query_count<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + #[derive(Deserialize)] + #[serde(untagged)] + enum QueryValue { + Int(usize), + String(String), + } + + let value = Option::::deserialize(deserializer)?; + + let count = match value { + Some(QueryValue::Int(i)) => i, + Some(QueryValue::String(s)) => s.parse().unwrap_or(1), + None => 1, + }; + + Ok(count.clamp(1, 500)) +} + +#[allow(dead_code)] +#[inline(always)] +pub fn parse_params(params: Params) -> usize { + params.q +} diff --git a/frameworks/Rust/ignitia/src/main.rs b/frameworks/Rust/ignitia/src/main.rs new file mode 100644 index 00000000000..1695a348b18 --- /dev/null +++ b/frameworks/Rust/ignitia/src/main.rs @@ -0,0 +1,50 @@ +mod common; + +use common::models::Message; +use ignitia::{Response, Router, Server}; + +const HELLO_WORLD: &str = "Hello, World!"; + +#[inline(always)] +async fn plaintext() -> Response { + Response::text(HELLO_WORLD) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "text/plain") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ) +} + +#[inline(always)] +async fn json() -> Response { + // Create new Message object for each request (no caching) + let message = Message { + message: HELLO_WORLD, + }; + + Response::json(message) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ) +} + +#[tokio::main] +async fn main() { + dotenv::dotenv().ok(); + + let app = Router::new() + .get("/plaintext", plaintext) + .get("/json", json); + + println!("Starting Ignitia server on 0.0.0.0:8000"); + + Server::new(app, "0.0.0.0:8000".parse().unwrap()) + .with_performance_config(ignitia::PerformanceConfig::max_rps()) + .ignitia() + .await + .unwrap(); +} diff --git a/frameworks/Rust/ignitia/src/main_mongo.rs b/frameworks/Rust/ignitia/src/main_mongo.rs new file mode 100644 index 00000000000..35ca4914daa --- /dev/null +++ b/frameworks/Rust/ignitia/src/main_mongo.rs @@ -0,0 +1,156 @@ +mod common; +mod mongo; + +use common::{ + get_env, + models::{FortuneInfo, World}, + random_id, + utils::{Params, parse_params}, +}; +use ignitia::{Query, Response, Router, Server, State}; +use mongo::database::{fetch_fortunes, find_world_by_id, find_worlds, update_worlds}; +use mongodb::{ + Client, + options::{ClientOptions, Compressor}, +}; +use rand::{SeedableRng, rng, rngs::SmallRng}; +use std::time::Duration; +use yarte::Template; + +#[derive(Template)] +#[template(path = "fortunes.html.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + +async fn db(State(db): State) -> Response { + let random_id = random_id(&mut rng()); + + match find_world_by_id(db, random_id).await { + Ok(world) => Response::json(world) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } +} + +async fn queries(State(db): State, Query(params): Query) -> Response { + let q = parse_params(params); + let mut rng = SmallRng::from_rng(&mut rng()); + + match find_worlds(db, &mut rng, q).await { + Ok(results) => Response::json(results) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } +} + +async fn updates(State(db): State, Query(params): Query) -> Response { + let q = parse_params(params); + let mut rng = SmallRng::from_rng(&mut rng()); + + match find_worlds(db.clone(), &mut rng, q).await { + Ok(worlds) => { + let mut updated_worlds: Vec = Vec::with_capacity(q); + + for mut world in worlds { + world.random_number = random_id(&mut rng); + updated_worlds.push(world); + } + + match update_worlds(db, updated_worlds.clone()).await { + Ok(_) => Response::json(updated_worlds) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } +} + +async fn fortunes(State(db): State) -> Response { + match fetch_fortunes(db).await { + Ok(fortune_infos) => { + let html = FortunesTemplate { + fortunes: &fortune_infos, + } + .call() + .expect("error rendering template"); + + Response::html(html) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "text/html; charset=utf-8") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ) + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } +} + +#[tokio::main] +async fn main() { + dotenv::dotenv().ok(); + + let database_url: String = get_env("MONGODB_URL"); + let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE"); + let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE"); + + let mut client_options = ClientOptions::parse(database_url).await.unwrap(); + + client_options.max_pool_size = Some(max_pool_size); + client_options.min_pool_size = Some(min_pool_size); + client_options.connect_timeout = Some(Duration::from_millis(200)); + client_options.compressors = Some(vec![ + Compressor::Snappy, + Compressor::Zlib { + level: Default::default(), + }, + Compressor::Zstd { + level: Default::default(), + }, + ]); + + let client = Client::with_options(client_options).unwrap(); + let database = client.database("hello_world"); + + let app = Router::new() + .get("/db", db) + .get("/queries", queries) + .get("/updates", updates) + .get("/fortunes", fortunes) + .state(database); + + println!("Starting Ignitia MongoDB server on 0.0.0.0:8000"); + + Server::new(app, "0.0.0.0:8000".parse().unwrap()) + .with_performance_config(ignitia::PerformanceConfig::max_rps()) + .ignitia() + .await + .unwrap(); +} diff --git a/frameworks/Rust/ignitia/src/main_pg.rs b/frameworks/Rust/ignitia/src/main_pg.rs new file mode 100644 index 00000000000..e58ceb965b9 --- /dev/null +++ b/frameworks/Rust/ignitia/src/main_pg.rs @@ -0,0 +1,113 @@ +mod common; +mod pg; + +use common::{ + get_env, random_id, + utils::{Params, parse_params}, +}; +use ignitia::{Query, Response, Router, Server, State}; +use pg::database::PgConnection; +use pg::models::Fortune; +use rand::rng; +use yarte::Template; + +#[derive(Template)] +#[template(path = "fortunes.html.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + +async fn db(State(conn): State>) -> Response { + let id = random_id(&mut rng()); + match conn.fetch_world_by_id(id).await { + Ok(world) => Response::json(world) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error(), + } +} + +async fn queries( + State(conn): State>, + Query(params): Query, +) -> Response { + let q = parse_params(params); + match conn.fetch_random_worlds(q).await { + Ok(results) => Response::json(results) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } +} + +async fn fortunes(State(conn): State>) -> Response { + match conn.fetch_all_fortunes().await { + Ok(fortunes) => { + let html = FortunesTemplate { + fortunes: &fortunes, + } + .call() + .expect("error rendering template"); + Response::html(html) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "text/html; charset=utf-8") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ) + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } +} + +async fn updates( + State(conn): State>, + Query(params): Query, +) -> Response { + let q = parse_params(params); + match conn.update_worlds(q).await { + Ok(worlds) => Response::json(worlds) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header("Date", httpdate::fmt_http_date(std::time::SystemTime::now())), + } +} + +#[tokio::main] +async fn main() { + dotenv::dotenv().ok(); + + let database_url: String = get_env("POSTGRES_URL"); + let pg_connection = PgConnection::connect(database_url).await; + + let app = Router::new() + .get("/db", db) + .get("/queries", queries) + .get("/fortunes", fortunes) + .get("/updates", updates) + .state(pg_connection); + + Server::new(app, "0.0.0.0:8000".parse().unwrap()) + .with_performance_config(ignitia::PerformanceConfig::max_rps()) + .ignitia() + .await + .unwrap(); +} diff --git a/frameworks/Rust/ignitia/src/main_pg_pool.rs b/frameworks/Rust/ignitia/src/main_pg_pool.rs new file mode 100644 index 00000000000..4356101d566 --- /dev/null +++ b/frameworks/Rust/ignitia/src/main_pg_pool.rs @@ -0,0 +1,225 @@ +mod common; +mod pg_pool; + +use common::{ + SELECT_ALL_FORTUNES, SELECT_WORLD_BY_ID, UPDATE_WORLDS, get_env, random_id, random_ids, + utils::{Params, parse_params}, +}; +use futures_util::{TryStreamExt, stream::FuturesUnordered}; +use ignitia::{Query, Response, Router, Server, State}; +use pg_pool::database::{create_pool, fetch_all_fortunes, fetch_world_by_id}; +use pg_pool::models::{Fortune, World}; +use rand::{SeedableRng, rng, rngs::SmallRng}; +use yarte::Template; + +#[derive(Template)] +#[template(path = "fortunes.html.hbs")] +pub struct FortunesTemplate<'a> { + pub fortunes: &'a Vec, +} + +async fn db(State(pool): State) -> Response { + let random_id = random_id(&mut rng()); + + match pool.get().await { + Ok(client) => { + let select = client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + match fetch_world_by_id(&client, random_id, &select).await { + Ok(world) => Response::json(world) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } +} + +async fn queries( + State(pool): State, + Query(params): Query, +) -> Response { + let q = parse_params(params); + let mut rng = SmallRng::from_rng(&mut rng()); + + match pool.get().await { + Ok(client) => { + let select = client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + let future_worlds = FuturesUnordered::new(); + + for id in random_ids(&mut rng, q) { + future_worlds.push(fetch_world_by_id(&client, id, &select)); + } + + match future_worlds.try_collect::>().await { + Ok(results) => Response::json(results) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } +} + +async fn fortunes(State(pool): State) -> Response { + match pool.get().await { + Ok(client) => { + let select = client.prepare_cached(SELECT_ALL_FORTUNES).await.unwrap(); + + match fetch_all_fortunes(client, &select).await { + Ok(mut fortunes) => { + fortunes.push(Fortune { + id: 0, + message: "Additional fortune added at request time.".to_string(), + }); + + fortunes.sort_by(|a, b| a.message.cmp(&b.message)); + + let html = FortunesTemplate { + fortunes: &fortunes, + } + .call() + .expect("error rendering template"); + Response::html(html) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "text/html; charset=utf-8") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ) + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } +} + +async fn updates( + State(pool): State, + Query(params): Query, +) -> Response { + let q = parse_params(params); + let mut rng = SmallRng::from_rng(&mut rng()); + + match pool.get().await { + Ok(client) => { + let select = client.prepare_cached(SELECT_WORLD_BY_ID).await.unwrap(); + let update = client.prepare_cached(UPDATE_WORLDS).await.unwrap(); + + let future_worlds = FuturesUnordered::new(); + for id in random_ids(&mut rng, q) { + future_worlds.push(fetch_world_by_id(&client, id, &select)); + } + + match future_worlds.try_collect::>().await { + Ok(worlds) => { + let mut ids = Vec::with_capacity(q); + let mut nids = Vec::with_capacity(q); + + let worlds: Vec = worlds + .into_iter() + .map(|mut w| { + w.randomnumber = random_id(&mut rng); + ids.push(w.id); + nids.push(w.randomnumber); + w + }) + .collect(); + + match client.execute(&update, &[&ids, &nids]).await { + Ok(_) => Response::json(worlds) + .with_header("Server", "Ignitia") + .with_header("Content-Type", "application/json") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } + } + Err(_) => Response::internal_error() + .with_header("Server", "Ignitia") + .with_header( + "Date", + httpdate::fmt_http_date(std::time::SystemTime::now()), + ), + } +} + +#[tokio::main] +async fn main() { + dotenv::dotenv().ok(); + + let database_url: String = get_env("POSTGRES_URL"); + let max_pool_size: u32 = get_env("POSTGRES_MAX_POOL_SIZE"); + + let pool = create_pool(database_url, max_pool_size).await; + + let app = Router::new() + .get("/db", db) + .get("/queries", queries) + .get("/fortunes", fortunes) + .get("/updates", updates) + .state(pool); + + println!("Starting Ignitia PostgreSQL (deadpool) server on 0.0.0.0:8000"); + + Server::new(app, "0.0.0.0:8000".parse().unwrap()) + .with_performance_config(ignitia::PerformanceConfig::max_rps()) + .ignitia() + .await + .unwrap(); +} diff --git a/frameworks/Rust/ignitia/src/mongo/database.rs b/frameworks/Rust/ignitia/src/mongo/database.rs new file mode 100644 index 00000000000..1017b44882d --- /dev/null +++ b/frameworks/Rust/ignitia/src/mongo/database.rs @@ -0,0 +1,103 @@ +use crate::common::{ + models::{Fortune, FortuneInfo, World}, + random_ids, +}; +use futures_util::{StreamExt, TryStreamExt, stream::FuturesUnordered}; +use mongodb::{Database, bson::doc}; +use rand::rngs::SmallRng; +use std::io; + +#[allow(dead_code)] +#[derive(Debug)] +pub enum MongoError { + Io(io::Error), + Mongo(mongodb::error::Error), +} + +impl From for MongoError { + fn from(err: io::Error) -> Self { + MongoError::Io(err) + } +} + +impl From for MongoError { + fn from(err: mongodb::error::Error) -> Self { + MongoError::Mongo(err) + } +} + +pub async fn find_world_by_id(db: Database, id: i32) -> Result { + let world_collection = db.collection::("world"); + let filter = doc! { "_id": id as f32 }; + + let world: World = world_collection + .find_one(filter) + .await + .unwrap() + .expect("expected world, found none"); + + Ok(world) +} + +pub async fn find_worlds( + db: Database, + rng: &mut SmallRng, + count: usize, +) -> Result, MongoError> { + let future_worlds = FuturesUnordered::new(); + + for id in random_ids(rng, count) { + future_worlds.push(find_world_by_id(db.clone(), id)); + } + + let worlds: Result, MongoError> = future_worlds.try_collect().await; + worlds +} + +pub async fn fetch_fortunes(db: Database) -> Result, MongoError> { + let fortune_collection = db.collection::("fortune"); + + let mut fortune_cursor = fortune_collection + .find(doc! {}) + .await + .expect("fortunes could not be loaded"); + + let mut fortunes: Vec = Vec::new(); + + while let Some(doc) = fortune_cursor.next().await { + let fortune = doc.expect("could not load fortune"); + fortunes.push(FortuneInfo { + id: fortune.id, + message: fortune.message, + }); + } + + fortunes.push(FortuneInfo { + id: 0, + message: "Additional fortune added at request time.".to_string(), + }); + + fortunes.sort_by(|a, b| a.message.cmp(&b.message)); + Ok(fortunes) +} + +pub async fn update_worlds(db: Database, worlds: Vec) -> Result { + let mut updates = Vec::new(); + + for world in worlds { + updates.push(doc! { + "q": { "id": world.id }, + "u": { "$set": { "randomNumber": world.random_number }} + }); + } + + db.run_command(doc! { + "update": "world", + "updates": updates, + "ordered": false + }) + .await + .expect("could not update worlds"); + + Ok(true) +} diff --git a/frameworks/Rust/ignitia/src/mongo/mod.rs b/frameworks/Rust/ignitia/src/mongo/mod.rs new file mode 100644 index 00000000000..8fd0a6be869 --- /dev/null +++ b/frameworks/Rust/ignitia/src/mongo/mod.rs @@ -0,0 +1 @@ +pub mod database; diff --git a/frameworks/Rust/ignitia/src/pg/database.rs b/frameworks/Rust/ignitia/src/pg/database.rs new file mode 100644 index 00000000000..6f40b31d599 --- /dev/null +++ b/frameworks/Rust/ignitia/src/pg/database.rs @@ -0,0 +1,104 @@ +use super::models::{Fortune, World}; +use crate::common::{random_id, random_ids}; +use futures::StreamExt; +use rand::{SeedableRng, rng, rngs::SmallRng}; +use std::{borrow::Cow, sync::Arc}; +use tokio::pin; +use tokio_postgres::{Client, NoTls, Statement, connect}; + +pub struct PgConnection { + client: Client, + fortune: Statement, + world: Statement, + updates: Statement, +} + +impl PgConnection { + pub async fn connect(db_url: String) -> Arc { + let (cl, conn) = connect(&db_url, NoTls) + .await + .expect("cannot connect to postgresql"); + + tokio::spawn(async move { + if let Err(error) = conn.await { + eprintln!("database connection error: {error}"); + } + }); + + let fortune = cl + .prepare(crate::common::SELECT_ALL_FORTUNES) + .await + .unwrap(); + let world = cl.prepare(crate::common::SELECT_WORLD_BY_ID).await.unwrap(); + let updates = cl.prepare(crate::common::UPDATE_WORLDS).await.unwrap(); + + Arc::new(PgConnection { + client: cl, + fortune, + world, + updates, + }) + } + + pub async fn fetch_world_by_id(&self, id: i32) -> Result { + self.client + .query_one(&self.world, &[&id]) + .await + .map(|row| World { + id: row.get(0), + randomnumber: row.get(1), + }) + } + + pub async fn fetch_random_worlds( + &self, + num: usize, + ) -> Result, tokio_postgres::Error> { + let mut rng = SmallRng::from_rng(&mut rng()); + let mut worlds = Vec::with_capacity(num); + + for id in random_ids(&mut rng, num) { + worlds.push(self.fetch_world_by_id(id).await?); + } + Ok(worlds) + } + + pub async fn update_worlds(&self, num: usize) -> Result, tokio_postgres::Error> { + let mut worlds = self.fetch_random_worlds(num).await?; + let mut rng = SmallRng::from_rng(&mut rng()); + let mut ids = Vec::with_capacity(num); + let mut nids = Vec::with_capacity(num); + + for w in &mut worlds { + w.randomnumber = random_id(&mut rng); + ids.push(&w.id); + nids.push(&w.randomnumber); + } + + self.client.execute(&self.updates, &[&ids, &nids]).await?; + Ok(worlds) + } + + pub async fn fetch_all_fortunes(&self) -> Result, tokio_postgres::Error> { + let mut fortunes = vec![Fortune { + id: 0, + message: Cow::Borrowed("Additional fortune added at request time."), + }]; + + let rows = self + .client + .query_raw::<_, _, &[i32; 0]>(&self.fortune, &[]) + .await?; + pin!(rows); + + while let Some(row) = rows.next().await.transpose()? { + fortunes.push(Fortune { + id: row.get(0), + message: Cow::Owned(row.get(1)), + }); + } + + fortunes.sort_by(|it, next| it.message.cmp(&next.message)); + Ok(fortunes) + } +} diff --git a/frameworks/Rust/ignitia/src/pg/mod.rs b/frameworks/Rust/ignitia/src/pg/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/ignitia/src/pg/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/ignitia/src/pg/models.rs b/frameworks/Rust/ignitia/src/pg/models.rs new file mode 100644 index 00000000000..2feb81f7d4f --- /dev/null +++ b/frameworks/Rust/ignitia/src/pg/models.rs @@ -0,0 +1,15 @@ +use serde::{Deserialize, Serialize}; +use std::borrow::Cow; + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct Fortune { + pub id: i32, + pub message: Cow<'static, str>, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct World { + pub id: i32, + #[serde(rename = "randomNumber")] + pub randomnumber: i32, +} diff --git a/frameworks/Rust/ignitia/src/pg_pool/database.rs b/frameworks/Rust/ignitia/src/pg_pool/database.rs new file mode 100644 index 00000000000..09b5a09c822 --- /dev/null +++ b/frameworks/Rust/ignitia/src/pg_pool/database.rs @@ -0,0 +1,65 @@ +use deadpool_postgres::{Client, Manager, ManagerConfig, RecyclingMethod}; +use futures_util::StreamExt; +use std::io; +use tokio::pin; +use tokio_pg_mapper::FromTokioPostgresRow; +use tokio_postgres::{NoTls, Row, Statement}; + +use super::models::{Fortune, World}; + +#[allow(dead_code)] +#[derive(Debug)] +pub enum PgError { + Io(io::Error), + Pg(tokio_postgres::Error), +} + +impl From for PgError { + fn from(err: io::Error) -> Self { + PgError::Io(err) + } +} + +impl From for PgError { + fn from(err: tokio_postgres::Error) -> Self { + PgError::Pg(err) + } +} + +pub async fn create_pool(database_url: String, max_pool_size: u32) -> deadpool_postgres::Pool { + let pg_config: tokio_postgres::Config = database_url.parse().expect("invalid database url"); + + let mgr_config = ManagerConfig { + recycling_method: RecyclingMethod::Fast, + }; + + let mgr = Manager::from_config(pg_config, NoTls, mgr_config); + deadpool_postgres::Pool::builder(mgr) + .max_size(max_pool_size as usize) + .build() + .unwrap() +} + +pub async fn fetch_world_by_id( + client: &Client, + id: i32, + select: &Statement, +) -> Result { + let row: Row = client.query_one(select, &[&id]).await.unwrap(); + Ok(World::from_row(row).unwrap()) +} + +pub async fn fetch_all_fortunes( + client: Client, + select: &Statement, +) -> Result, PgError> { + let mut fortunes: Vec = Vec::new(); + let rows = client.query_raw::<_, _, &[i32; 0]>(select, &[]).await?; + pin!(rows); + + while let Some(row) = rows.next().await.transpose()? { + fortunes.push(Fortune::from_row(row).expect("could not convert row to fortune")); + } + + Ok(fortunes) +} diff --git a/frameworks/Rust/ignitia/src/pg_pool/mod.rs b/frameworks/Rust/ignitia/src/pg_pool/mod.rs new file mode 100644 index 00000000000..c51e02d23d3 --- /dev/null +++ b/frameworks/Rust/ignitia/src/pg_pool/mod.rs @@ -0,0 +1,2 @@ +pub mod database; +pub mod models; diff --git a/frameworks/Rust/ignitia/src/pg_pool/models.rs b/frameworks/Rust/ignitia/src/pg_pool/models.rs new file mode 100644 index 00000000000..61fe8dda977 --- /dev/null +++ b/frameworks/Rust/ignitia/src/pg_pool/models.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; +use tokio_pg_mapper_derive::PostgresMapper; + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, PostgresMapper)] +#[pg_mapper(table = "Fortune")] +pub struct Fortune { + pub id: i32, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, PostgresMapper)] +#[pg_mapper(table = "World")] +pub struct World { + pub id: i32, + #[serde(rename = "randomNumber")] + pub randomnumber: i32, +} diff --git a/frameworks/Rust/ignitia/templates/fortunes.html.hbs b/frameworks/Rust/ignitia/templates/fortunes.html.hbs new file mode 100644 index 00000000000..b9e25a52a8e --- /dev/null +++ b/frameworks/Rust/ignitia/templates/fortunes.html.hbs @@ -0,0 +1,5 @@ +Fortunes + {{~# each fortunes ~}} + + {{~/each ~}} +
      idmessage
      {{id}}{{message}}
      From 3330bcf1123b8b9c98fda54a55b53b02fcd219b9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 Oct 2025 00:20:49 +0200 Subject: [PATCH 1643/1766] [ruby/rack] Only add before_fork in multiple workers (#10146) Fix the following warning: Warning: The code in the `before_fork` block will not execute in the current Puma configuration. The `before_fork` block only executes in Puma's cluster mode. To fix this, either remove the `before_fork` call or increase Puma's worker count above zero. --- frameworks/Ruby/rack/config/puma.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rack/config/puma.rb b/frameworks/Ruby/rack/config/puma.rb index d714d611d5e..5f6c878f757 100644 --- a/frameworks/Ruby/rack/config/puma.rb +++ b/frameworks/Ruby/rack/config/puma.rb @@ -1,7 +1,7 @@ require_relative 'auto_tune' # FWBM only... use the puma_auto_tune gem in production! -_, num_threads = auto_tune +num_workers, num_threads = auto_tune if RUBY_PLATFORM == 'java' num_threads = 512 @@ -10,6 +10,8 @@ threads num_threads -before_fork do - Sequel::DATABASES.each(&:disconnect) +if num_workers > 0 + before_fork do + Sequel::DATABASES.each(&:disconnect) + end end From 8e1a175fa0dc17431d83ce7f4f8dec324fb13bbb Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 8 Oct 2025 00:21:05 +0200 Subject: [PATCH 1644/1766] [ruby/rack] Update protocol-http1 to handle warnings (#10147) Fixes the following errors: with unhandled exception.","event":{"type":"failure","root":"/rack","class":"Errno::ECONNRESET","message":"Connection reset by peer","backtrace":[ /usr/local/lib/ruby/3.5.0+0/socket.rb:457:in 'BasicSocket#__read_nonblock' /usr/local/lib/ruby/3.5.0+0/socket.rb:457:in 'BasicSocket#read_nonblock' /usr/local/bundle/gems/io-stream-0.10.0/lib/io/stream/buffered.rb:138:in 'IO::Stream::Buffered#sysread' /usr/local/bundle/gems/io-stream-0.10.0/lib/io/stream/readable.rb:347:in 'IO::Stream::Readable#fill_read_buffer' /usr/local/bundle/gems/io-stream-0.10.0/lib/io/stream/readable.rb:268:in 'IO::Stream::Readable#gets' /usr/local/bundle/gems/protocol-http1-0.35.1/lib/protocol/http1/connection.rb:356:in 'Protocol::HTTP1::Connection#read_line?' /usr/local/bundle/gems/protocol-http1-0.35.1/lib/protocol/http1/connection.rb:378:in 'Protocol::HTTP1::Connection#read_request_line' /usr/local/bundle/gems/protocol-http1-0.35.1/lib/protocol/http1/connection.rb:399:in 'Protocol::HTTP1::Connection#read_request' /usr/local/bundle/gems/async-http-0.91.0/lib/async/http/protocol/http1/request.rb:26:in 'Async::HTTP::Protocol::HTTP1::Request.read' /usr/local/bundle/gems/async-http-0.91.0/lib/async/http/protocol/http1/server.rb:49:in 'Async::HTTP::Protocol::HTTP1::Server#next_request' /usr/local/bundle/gems/async-http-0.91.0/lib/async/http/protocol/http1/server.rb:66:in 'Async::HTTP::Protocol::HTTP1::Server#each' /usr/local/bundle/gems/async-http-0.91.0/lib/async/http/server.rb:49:in 'Async::HTTP::Server#accept' /usr/local/bundle/gems/falcon-0.52.3/lib/falcon/server.rb:57:in 'Falcon::Server#accept' /usr/local/bundle/gems/io-endpoint-0.15.2/lib/io/endpoint/wrapper.rb:216:in 'block (2 levels) in IO::Endpoint::Wrapper#accept' /usr/local/bundle/gems/async-2.32.0/lib/async/task.rb:207:in 'block in Async::Task#run' /usr/local/bundle/gems/async-2.32.0/lib/async/task.rb:452:in 'block in Async::Task#schedule' --- frameworks/Ruby/rack/Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 4c5104d8517..e9f7e2878a0 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -85,8 +85,8 @@ GEM logger rack (>= 2.0) protocol-hpack (1.5.1) - protocol-http (0.49.0) - protocol-http1 (0.30.0) + protocol-http (0.54.0) + protocol-http1 (0.35.2) protocol-http (~> 0.22) protocol-http2 (0.22.1) protocol-hpack (~> 1.4) From 91d41d358907d8391bc2a778bd2f486e098d801a Mon Sep 17 00:00:00 2001 From: Dmitry Olshansky Date: Wed, 8 Oct 2025 01:21:32 +0300 Subject: [PATCH 1645/1766] Update photon-http to implement http pipelining (#10148) * Update photon-http to implement http pipelining * Update to new naming in photon v0.15+ --------- Co-authored-by: Dmitry Olshansky --- frameworks/D/photon-http/dub.json | 4 ++-- frameworks/D/photon-http/source/app.d | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/D/photon-http/dub.json b/frameworks/D/photon-http/dub.json index 08d1abe3589..ab3f38cad36 100644 --- a/frameworks/D/photon-http/dub.json +++ b/frameworks/D/photon-http/dub.json @@ -5,8 +5,8 @@ "copyright": "Copyright © 2025, Dmitry Olshansky", "dependencies": { "asdf": "~>0.7.17", - "photon": "~>0.14.3", - "photon-http": "~>0.5.5" + "photon": "~>0.18.5", + "photon-http": "~>0.6.0" }, "description": "Benchmark of photon-http", "license": "BSL-1.0", diff --git a/frameworks/D/photon-http/source/app.d b/frameworks/D/photon-http/source/app.d index db57623853c..c730b26e9b3 100644 --- a/frameworks/D/photon-http/source/app.d +++ b/frameworks/D/photon-http/source/app.d @@ -69,7 +69,7 @@ void server() { } void main() { - startloop(); + initPhoton(); go(() => server()); - runFibers(); + runScheduler(); } From 53e2e9d3f21a4d22a6de2caf8393b038405ec311 Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Tue, 7 Oct 2025 23:21:53 +0100 Subject: [PATCH 1646/1766] Hummingbird and Swift 6.2 (#10149) * Hummingbird and Swift 6.2 * Increase postgres connections --- frameworks/Swift/hummingbird2/README.md | 2 +- .../Swift/hummingbird2/hummingbird2-postgres.dockerfile | 4 ++-- frameworks/Swift/hummingbird2/hummingbird2.dockerfile | 4 ++-- frameworks/Swift/hummingbird2/src-postgres/Package.swift | 2 +- .../Swift/hummingbird2/src-postgres/Sources/server/main.swift | 2 +- frameworks/Swift/hummingbird2/src/Package.swift | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Swift/hummingbird2/README.md b/frameworks/Swift/hummingbird2/README.md index 06f66d168c8..2a46d18fd45 100755 --- a/frameworks/Swift/hummingbird2/README.md +++ b/frameworks/Swift/hummingbird2/README.md @@ -13,7 +13,7 @@ Hummingbird 2 is a lightweight, flexible HTTP server framework written in Swift. ## Important Libraries This version of Hummingbird requires -* [Swift 5.10](https://swift.org) +* [Swift 6.0](https://swift.org) * [SwiftNIO 2.x](https://github.com/apple/swift-nio/) In these tests for database access it uses * [PostgresKit 2.21](https://github.com/vapor/postgres-nio/) diff --git a/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile b/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile index 544e4d8752e..dea0a3ddc22 100644 --- a/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile +++ b/frameworks/Swift/hummingbird2/hummingbird2-postgres.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:6.1 AS build +FROM swift:6.2 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:6.1-slim +FROM swift:6.2-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird2/hummingbird2.dockerfile b/frameworks/Swift/hummingbird2/hummingbird2.dockerfile index 2c474797381..79f0d72c891 100644 --- a/frameworks/Swift/hummingbird2/hummingbird2.dockerfile +++ b/frameworks/Swift/hummingbird2/hummingbird2.dockerfile @@ -1,7 +1,7 @@ # ================================ # Build image # ================================ -FROM swift:6.1 AS build +FROM swift:6.2 AS build WORKDIR /build # Copy entire repo into container @@ -15,7 +15,7 @@ RUN swift build \ # ================================ # Run image # ================================ -FROM swift:6.1-slim +FROM swift:6.2-slim WORKDIR /run # Copy build artifacts diff --git a/frameworks/Swift/hummingbird2/src-postgres/Package.swift b/frameworks/Swift/hummingbird2/src-postgres/Package.swift index 838dd261b93..840869e7289 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Package.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Package.swift @@ -7,7 +7,7 @@ let package = Package( name: "server", platforms: [.macOS(.v14)], dependencies: [ - .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0"), + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.16.0"), .package(url: "https://github.com/hummingbird-project/swift-mustache.git", from: "2.0.0"), .package(url: "https://github.com/vapor/postgres-nio.git", from: "1.21.0"), ], diff --git a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift index fa5d5cdf100..a062237d6f9 100644 --- a/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift +++ b/frameworks/Swift/hummingbird2/src-postgres/Sources/server/main.swift @@ -32,7 +32,7 @@ func runApp() async throws { database: "hello_world", tls: .disable ) - postgresConfiguration.options.maximumConnections = 100 + postgresConfiguration.options.maximumConnections = 200 let postgresClient = PostgresClient( configuration: postgresConfiguration, eventLoopGroup: MultiThreadedEventLoopGroup.singleton diff --git a/frameworks/Swift/hummingbird2/src/Package.swift b/frameworks/Swift/hummingbird2/src/Package.swift index a512221f486..dfa3529b4a2 100644 --- a/frameworks/Swift/hummingbird2/src/Package.swift +++ b/frameworks/Swift/hummingbird2/src/Package.swift @@ -7,7 +7,7 @@ let package = Package( name: "server", platforms: [.macOS(.v14)], dependencies: [ - .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0") + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.16.0") ], targets: [ .executableTarget( From 1838aa5df242f103a335b74c9095bc88f22643b1 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Fri, 10 Oct 2025 00:15:27 +0200 Subject: [PATCH 1647/1766] Misc updates (#10159) * Add UnlockDiagnosticVMOptions/DebugNonSafepoints JVM flags as they provide useful profililng information whitout overhead by default * Upgrade to vertx 5.0.4 * Filter module descriptors as we are in a fat jar * Prefer space over tab in pom.xml --- frameworks/Java/vertx/pom.xml | 469 +++++++++--------- .../Java/vertx/vertx-postgres.dockerfile | 2 + frameworks/Java/vertx/vertx.dockerfile | 2 +- 3 files changed, 242 insertions(+), 231 deletions(-) diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 7bac1baa546..06fd8183ed5 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -1,243 +1,252 @@ - 4.0.0 - com.techempower - vertx.benchmark - 0.0.1-SNAPSHOT + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.techempower + vertx.benchmark + 0.0.1-SNAPSHOT - - 17 - 17 - - vertx.App - 5.0.0.CR8 - 4.2.1.Final - 2.16.1 - + + 17 + 17 + + vertx.App + 5.0.4 + 4.2.5.Final + 2.16.1 + - - - io.vertx - vertx-core - ${vertx.version} - - - io.vertx - vertx-core-logging - ${vertx.version} - - - io.vertx - vertx-pg-client - ${vertx.version} - - - com.dslplatform - dsl-json - 2.0.2 - - - com.julienviet - jsonsergen - 0.0.5 - - - com.github.ben-manes.caffeine - caffeine - 3.1.3 - - - com.fizzed - rocker-compiler - 1.3.0 - - - javax.xml.bind - jaxb-api - 2.3.1 - - + + + io.vertx + vertx-core + ${vertx.version} + + + io.vertx + vertx-core-logging + ${vertx.version} + + + io.vertx + vertx-pg-client + ${vertx.version} + + + com.dslplatform + dsl-json + 2.0.2 + + + com.julienviet + jsonsergen + 0.0.5 + + + com.github.ben-manes.caffeine + caffeine + 3.1.3 + + + com.fizzed + rocker-compiler + 1.3.0 + + + javax.xml.bind + jaxb-api + 2.3.1 + + - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.10.1 - - false - - - - default-compile - - - io.vertx.codegen.CodeGenProcessor - - - - - - - com.fizzed - rocker-maven-plugin - 1.3.0 - - - generate-rocker-templates - generate-sources - - generate - - - 17 - ${basedir}/src/main/templates - ${basedir}/target/generated-sources/rocker - true - true - true - true - - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.1 - - - package - - shade - - - - - - ${main.class} - - - - META-INF/services/io.vertx.core.spi.VerticleFactory - - - - - ${project.build.directory}/${project.artifactId}-${project.version}-fat.jar - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + false + + + + default-compile + + + io.vertx.codegen.CodeGenProcessor + + + + + + + com.fizzed + rocker-maven-plugin + 1.3.0 + + + generate-rocker-templates + generate-sources + + generate + + + 17 + ${basedir}/src/main/templates + ${basedir}/target/generated-sources/rocker + true + true + true + true + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.1 + + + package + + shade + + + + + + ${main.class} + + + + META-INF/services/io.vertx.core.spi.VerticleFactory + + + + + + + *:* + + META-INF/versions/**/module-info.class + module-info.class + + + + ${project.build.directory}/${project.artifactId}-${project.version}-fat.jar + + + + + - + - - - linux-x86_64 - - - linux - x86_64 - - - - - io.netty - netty-transport-native-io_uring - ${netty.version} - linux-x86_64 - - - + + + linux-x86_64 + + + linux + x86_64 + + + + + io.netty + netty-transport-native-io_uring + ${netty.version} + linux-x86_64 + + + - - linux-amd64 - - - linux - amd64 - - - - - io.netty - netty-transport-native-io_uring - ${netty.version} - linux-x86_64 - - - + + linux-amd64 + + + linux + amd64 + + + + + io.netty + netty-transport-native-io_uring + ${netty.version} + linux-x86_64 + + + - - linux-aarch64 - - - linux - aarch64 - - - - - io.netty - netty-transport-native-io_uring - ${netty.version} - linux-aarch_64 - - - + + linux-aarch64 + + + linux + aarch64 + + + + + io.netty + netty-transport-native-io_uring + ${netty.version} + linux-aarch_64 + + + - - osx-x86_64 - - - mac - x86_64 - - - - - io.netty - netty-resolver-dns-native-macos - ${netty.version} - osx-x86_64 - - - io.netty - netty-transport-native-kqueue - ${netty.version} - osx-x86_64 - - - + + osx-x86_64 + + + mac + x86_64 + + + + + io.netty + netty-resolver-dns-native-macos + ${netty.version} + osx-x86_64 + + + io.netty + netty-transport-native-kqueue + ${netty.version} + osx-x86_64 + + + - - osx-aarch64 - - - mac - aarch64 - - - - - io.netty - netty-resolver-dns-native-macos - ${netty.version} - osx-aarch_64 - - - io.netty - netty-transport-native-kqueue - ${netty.version} - osx-aarch_64 - - - + + osx-aarch64 + + + mac + aarch64 + + + + + io.netty + netty-resolver-dns-native-macos + ${netty.version} + osx-aarch_64 + + + io.netty + netty-transport-native-kqueue + ${netty.version} + osx-aarch_64 + + + - + diff --git a/frameworks/Java/vertx/vertx-postgres.dockerfile b/frameworks/Java/vertx/vertx-postgres.dockerfile index afcb00f4866..fe4477726c8 100644 --- a/frameworks/Java/vertx/vertx-postgres.dockerfile +++ b/frameworks/Java/vertx/vertx-postgres.dockerfile @@ -17,6 +17,8 @@ CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ -server \ -XX:+UseNUMA \ -XX:+UseParallelGC \ + -XX:+UnlockDiagnosticVMOptions \ + -XX:+DebugNonSafepoints \ -Djava.lang.Integer.IntegerCache.high=10000 \ -Dvertx.disableMetrics=true \ -Dvertx.disableWebsockets=true \ diff --git a/frameworks/Java/vertx/vertx.dockerfile b/frameworks/Java/vertx/vertx.dockerfile index e78d0ff9038..ae194f4c7f8 100644 --- a/frameworks/Java/vertx/vertx.dockerfile +++ b/frameworks/Java/vertx/vertx.dockerfile @@ -6,4 +6,4 @@ RUN mvn package -q EXPOSE 8080 -CMD ["java", "--enable-native-access=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "--add-opens=java.base/java.lang=ALL-UNNAMED", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableWebsockets=true", "-Dvertx.disableContextTimings=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.cacheImmutableHttpResponseHeaders=true", "-Dvertx.internCommonHttpRequestHeadersToLowerCase=true", "-Dio.netty.noUnsafe=false", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] +CMD ["java", "--enable-native-access=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "--add-opens=java.base/java.lang=ALL-UNNAMED", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableWebsockets=true", "-Dvertx.disableContextTimings=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.cacheImmutableHttpResponseHeaders=true", "-Dvertx.internCommonHttpRequestHeadersToLowerCase=true", "-Dio.netty.noUnsafe=false", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] From 993b52b1d55c3dec9f0b4cf8a390d31bb01155d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Fri, 10 Oct 2025 06:16:02 +0800 Subject: [PATCH 1648/1766] Upgrade hyperlane (#10153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: db * feat: db * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 12 +++--- frameworks/Rust/hyperlane/Cargo.toml | 2 +- frameworks/Rust/hyperlane/src/db/fn.rs | 39 +++++++------------- frameworks/Rust/hyperlane/src/server/impl.rs | 2 +- 4 files changed, 21 insertions(+), 34 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 816160ac6fd..34ca8f6945a 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -549,15 +549,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.63.0" +version = "1.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10a92fc539f5fc3b2c5c3de4255e4f62f2768c9cd5a0e7879edf3d3b3189186" +checksum = "3ed2dc878c44b9486a88b9751dd07290d13ca4ad19d68810fb5a5448c924a581" [[package]] name = "http-type" -version = "5.4.4" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063a939c0353308b3ea2b27c676b8dcb5efe121fe34899de7bc1fe5e8944bb77" +checksum = "b9c55fba426eef13b6e820c4ba8917ef3a74d99e9d47dd5c79abab0c691cadd5" dependencies = [ "hex", "http-compress", @@ -573,9 +573,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "9.4.5" +version = "9.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e132d66f36a5905f3594effaeb74aaa5bacdfb4c6e059db9676dbe52f093f90e" +checksum = "905bdfbd1cb98993eb90d97248f6c9dda002af35b93eca6096c8362751499f88" dependencies = [ "http-type", "inventory", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index a371ef71030..a1a42b0caf4 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,7 +20,7 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "9.4.5" +hyperlane = "9.5.0" hyperlane-time = "0.7.8" num_cpus = "1.17.0" once_cell = "1.21.3" diff --git a/frameworks/Rust/hyperlane/src/db/fn.rs b/frameworks/Rust/hyperlane/src/db/fn.rs index 3bf01087988..6385c2ded85 100644 --- a/frameworks/Rust/hyperlane/src/db/fn.rs +++ b/frameworks/Rust/hyperlane/src/db/fn.rs @@ -7,7 +7,7 @@ pub fn get_db_connection() -> &'static DbPoolConnection { #[cfg(feature = "dev")] pub async fn create_database() { let db_pool: &DbPoolConnection = get_db_connection(); - let _ = db_query(&format!("CREATE DATABASE {};", DATABASE_NAME)) + let _ = db_query(&format!("CREATE DATABASE {DATABASE_NAME};")) .execute(db_pool) .await; } @@ -16,18 +16,16 @@ pub async fn create_database() { pub async fn create_table() { let db_pool: &DbPoolConnection = get_db_connection(); let _ = db_query(&format!( - "CREATE TABLE IF NOT EXISTS {} ( + "CREATE TABLE IF NOT EXISTS {TABLE_NAME_WORLD} ( id SERIAL PRIMARY KEY, randomNumber INT NOT NULL - );", - TABLE_NAME_WORLD + );" )) .execute(db_pool) .await; let _ = db_query(&format!( - "CREATE TABLE IF NOT EXISTS {} ( + "CREATE TABLE IF NOT EXISTS {TABLE_NAME_FORTUNE} ( id SERIAL PRIMARY KEY, message VARCHAR NOT NULL - );", - TABLE_NAME_FORTUNE + );" )) .execute(db_pool) .await; @@ -36,7 +34,7 @@ pub async fn create_table() { #[cfg(feature = "dev")] pub async fn insert_records() { let db_pool: &DbPoolConnection = get_db_connection(); - let row: PgRow = db_query(&format!("SELECT COUNT(*) FROM {}", TABLE_NAME_WORLD)) + let row: PgRow = db_query(&format!("SELECT COUNT(*) FROM {TABLE_NAME_WORLD}")) .fetch_one(db_pool) .await .unwrap(); @@ -49,22 +47,20 @@ pub async fn insert_records() { let mut values: Vec = Vec::new(); for _ in 0..missing_count { let random_number: i32 = get_random_id(); - values.push(format!("(DEFAULT, {})", random_number)); + values.push(format!("(DEFAULT, {random_number})")); } let sql: String = format!( - "INSERT INTO {} (id, randomNumber) VALUES {}", - TABLE_NAME_WORLD, + "INSERT INTO {TABLE_NAME_WORLD} (id, randomNumber) VALUES {}", values.join(",") ); let _ = db_query(&sql).execute(db_pool).await; let mut values: Vec = Vec::new(); for _ in 0..missing_count { let random_number: i32 = get_random_id(); - values.push(format!("(DEFAULT, {})", random_number)); + values.push(format!("(DEFAULT, {random_number})")); } let sql: String = format!( - "INSERT INTO {} (id, message) VALUES {}", - TABLE_NAME_FORTUNE, + "INSERT INTO {TABLE_NAME_FORTUNE} (id, message) VALUES {}", values.join(",") ); let _ = db_query(&sql).execute(db_pool).await; @@ -73,10 +69,7 @@ pub async fn insert_records() { pub async fn init_cache() -> Vec { let mut res: Vec = Vec::with_capacity(RANDOM_MAX as usize); let db_pool: &DbPoolConnection = get_db_connection(); - let sql: String = format!( - "SELECT id, randomNumber FROM {} LIMIT {}", - TABLE_NAME_WORLD, RANDOM_MAX - ); + let sql: String = format!("SELECT id, randomNumber FROM {TABLE_NAME_WORLD} LIMIT {RANDOM_MAX}"); if let Ok(rows) = db_query(&sql).fetch_all(db_pool).await { for row in rows { let id: i32 = row.get(KEY_ID); @@ -91,13 +84,7 @@ pub async fn connection_db() -> DbPoolConnection { let db_url: &str = match option_env!("POSTGRES_URL") { Some(it) => it, _ => &format!( - "{}://{}:{}@{}:{}/{}", - DATABASE_TYPE, - DATABASE_USER_NAME, - DATABASE_USER_PASSWORD, - DATABASE_HOST, - DATABASE_PORT, - DATABASE_NAME + "{DATABASE_TYPE}://{DATABASE_USER_NAME}:{DATABASE_USER_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_NAME}" ), }; let pool_size: u32 = (get_thread_count() as u32).min(DB_MAX_CONNECTIONS); @@ -174,7 +161,7 @@ pub async fn update_world_rows(limit: Queries) -> Vec { pub async fn all_world_row() -> Vec { let db_pool: &DbPoolConnection = get_db_connection(); - let sql: String = format!("SELECT id, message FROM {}", TABLE_NAME_FORTUNE); + let sql: String = format!("SELECT id, message FROM {TABLE_NAME_FORTUNE}"); let res: Vec = db_query(&sql).fetch_all(db_pool).await.unwrap_or_default(); return res; } diff --git a/frameworks/Rust/hyperlane/src/server/impl.rs b/frameworks/Rust/hyperlane/src/server/impl.rs index 49072195701..ee8045d2dff 100644 --- a/frameworks/Rust/hyperlane/src/server/impl.rs +++ b/frameworks/Rust/hyperlane/src/server/impl.rs @@ -34,7 +34,7 @@ impl fmt::Display for FortunesTemplate { tem.id, escape_html(&tem.message) ); - let _ = write!(f, "{}", row); + let _ = write!(f, "{row}"); } let _ = write!(f, ""); Ok(()) From 0b0482b24f8c79a4a5adff705ee14256a40b6512 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:33:33 +0000 Subject: [PATCH 1649/1766] Build(deps): bump rack in /frameworks/Ruby/roda-sequel Bumps [rack](https://github.com/rack/rack) from 3.2.0 to 3.2.3. - [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.2.0...v3.2.3) --- updated-dependencies: - dependency-name: rack dependency-version: 3.2.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/roda-sequel/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index d4de8380167..7af765ec746 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -11,7 +11,7 @@ GEM pg (1.5.9) puma (6.6.0) nio4r (~> 2.0) - rack (3.2.0) + rack (3.2.3) roda (3.90.0) rack sequel (5.90.0) From 425a9f3ca5ab1b1edff1593d976ee0e6c6181b14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:43:21 +0000 Subject: [PATCH 1650/1766] Build(deps): bump rack from 3.2.2 to 3.2.3 in /frameworks/Ruby/grape Bumps [rack](https://github.com/rack/rack) from 3.2.2 to 3.2.3. - [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.2.2...v3.2.3) --- updated-dependencies: - dependency-name: rack dependency-version: 3.2.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/grape/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/grape/Gemfile.lock b/frameworks/Ruby/grape/Gemfile.lock index 781fddd196c..ddbd759f26b 100644 --- a/frameworks/Ruby/grape/Gemfile.lock +++ b/frameworks/Ruby/grape/Gemfile.lock @@ -63,7 +63,7 @@ GEM nio4r (2.7.4) puma (6.6.0) nio4r (~> 2.0) - rack (3.2.2) + rack (3.2.3) raindrops (0.20.1) ruby2_keywords (0.0.5) securerandom (0.4.1) From 5819d515f45ed312a926a14ea88e8ffaf844a2e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 18:11:57 +0000 Subject: [PATCH 1651/1766] Build(deps): bump rack from 3.1.12 to 3.1.18 in /frameworks/Ruby/padrino Bumps [rack](https://github.com/rack/rack) from 3.1.12 to 3.1.18. - [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.1.12...v3.1.18) --- updated-dependencies: - dependency-name: rack dependency-version: 3.1.18 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/padrino/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/padrino/Gemfile.lock b/frameworks/Ruby/padrino/Gemfile.lock index 9917636c697..05bb6a6315a 100644 --- a/frameworks/Ruby/padrino/Gemfile.lock +++ b/frameworks/Ruby/padrino/Gemfile.lock @@ -96,7 +96,7 @@ GEM nio4r (2.7.4) puma (6.6.0) nio4r (~> 2.0) - rack (3.1.12) + rack (3.1.18) rack-protection (4.1.1) base64 (>= 0.1.0) logger (>= 1.6.0) From 9622e6ce26a57274aafa2ec07f4ab818520e1c15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 19:02:55 +0000 Subject: [PATCH 1652/1766] Build(deps): bump rack in /frameworks/Ruby/rage-sequel Bumps [rack](https://github.com/rack/rack) from 2.2.17 to 2.2.20. - [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/v2.2.17...v2.2.20) --- updated-dependencies: - dependency-name: rack dependency-version: 2.2.20 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rage-sequel/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index 448145375f9..ee8be847544 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -4,7 +4,7 @@ GEM bigdecimal (3.1.9) logger (1.7.0) pg (1.5.9) - rack (2.2.17) + rack (2.2.20) rack-test (2.2.0) rack (>= 1.3) rage-iodine (4.0.0) From 88b7233ba4aa7e35270a01f26e12810b24a87c89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 20:54:57 +0000 Subject: [PATCH 1653/1766] Build(deps): bump sinatra in /frameworks/Ruby/sinatra Bumps [sinatra](https://github.com/sinatra/sinatra) from 4.1.1 to 4.2.0. - [Changelog](https://github.com/sinatra/sinatra/blob/main/CHANGELOG.md) - [Commits](https://github.com/sinatra/sinatra/compare/v4.1.1...v4.2.0) --- updated-dependencies: - dependency-name: sinatra dependency-version: 4.2.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index 61dae4790d3..e456bc6f846 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' gem 'activerecord', '~> 8.0', require: 'active_record' gem 'json', '~> 2.8' -gem 'sinatra', '~> 4.0', require: 'sinatra/base' +gem 'sinatra', '~> 4.2', require: 'sinatra/base' group :mysql, optional: true do gem 'trilogy', '~> 2.9.0', platforms: [:ruby, :windows] diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index 55cbe455179..c5ae3bfb03b 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -32,14 +32,14 @@ GEM json (2.13.2) logger (1.7.0) minitest (5.25.5) - mustermann (3.0.3) + mustermann (3.0.4) ruby2_keywords (~> 0.0.1) nio4r (2.7.4) pg (1.5.9) puma (7.0.2) nio4r (~> 2.0) - rack (3.2.0) - rack-protection (4.1.1) + rack (3.2.3) + rack-protection (4.2.0) base64 (>= 0.1.0) logger (>= 1.6.0) rack (>= 3.0.0, < 4) @@ -48,14 +48,14 @@ GEM rack (>= 3.0.0) ruby2_keywords (0.0.5) securerandom (0.4.1) - sinatra (4.1.1) + sinatra (4.2.0) logger (>= 1.6.0) mustermann (~> 3.0) rack (>= 3.0.0, < 4) - rack-protection (= 4.1.1) + rack-protection (= 4.2.0) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - tilt (2.6.0) + tilt (2.6.1) timeout (0.4.3) trilogy (2.9.0) tzinfo (2.0.6) @@ -73,7 +73,7 @@ DEPENDENCIES json (~> 2.8) pg (~> 1.5) puma (~> 7.0) - sinatra (~> 4.0) + sinatra (~> 4.2) trilogy (~> 2.9.0) BUNDLED WITH From 1e047d88e11f68131c6586d9c197ed3798f7defb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:51:07 +0000 Subject: [PATCH 1654/1766] Build(deps): bump mongodb from 3.2.1 to 3.2.5 in /frameworks/Rust/actix Bumps [mongodb](https://github.com/mongodb/mongo-rust-driver) from 3.2.1 to 3.2.5. - [Release notes](https://github.com/mongodb/mongo-rust-driver/releases) - [Commits](https://github.com/mongodb/mongo-rust-driver/compare/v3.2.1...v3.2.5) --- updated-dependencies: - dependency-name: mongodb dependency-version: 3.2.5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Rust/actix/Cargo.lock | 72 +++++++++++++++++--------------- frameworks/Rust/actix/Cargo.toml | 2 +- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/frameworks/Rust/actix/Cargo.lock b/frameworks/Rust/actix/Cargo.lock index 319b6121912..559b8a510fb 100644 --- a/frameworks/Rust/actix/Cargo.lock +++ b/frameworks/Rust/actix/Cargo.lock @@ -540,18 +540,20 @@ dependencies = [ [[package]] name = "bson" -version = "2.13.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068208f2b6fcfa27a7f1ee37488d2bb8ba2640f68f5475d08e1d9130696aba59" +checksum = "7969a9ba84b0ff843813e7249eed1678d9b6607ce5a3b8f0a47af3fcf7978e6e" dependencies = [ "ahash", - "base64 0.13.1", + "base64 0.22.1", "bitvec", + "getrandom 0.2.10", + "getrandom 0.3.1", "hex", "indexmap 2.7.1", "js-sys", "once_cell", - "rand 0.8.5", + "rand 0.9.0", "serde", "serde_bytes", "serde_json", @@ -1174,8 +1176,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.13.3+wasi-0.2.2", + "wasm-bindgen", "windows-targets 0.52.6", ] @@ -1609,10 +1613,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1824,9 +1829,9 @@ dependencies = [ [[package]] name = "mongodb" -version = "3.2.1" +version = "3.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a93560fa3ec754ed9aa0954ae8307c5997150dbba7aa735173b514660088475" +checksum = "f6e3788f35159bbcf461227af84711950525343b64451fdd90de4e237a0b8a13" dependencies = [ "async-trait", "base64 0.13.1", @@ -1856,7 +1861,7 @@ dependencies = [ "serde", "serde_bytes", "serde_with", - "sha-1", + "sha1", "sha2", "socket2 0.5.8", "stringprep", @@ -1873,9 +1878,9 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b3dace6c4f33db61d492b3d3b02f4358687a1eb59457ffef6f6cfe461cdb54" +checksum = "63981427a0f26b89632fd2574280e069d09fb2912a3138da15de0174d11dd077" dependencies = [ "macro_magic", "proc-macro2", @@ -2347,6 +2352,12 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.14" @@ -2458,17 +2469,6 @@ dependencies = [ "syn 2.0.98", ] -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha1" version = "0.10.5" @@ -3054,6 +3054,7 @@ checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" dependencies = [ "getrandom 0.2.10", "serde", + "wasm-bindgen", ] [[package]] @@ -3128,23 +3129,25 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.98", @@ -3153,9 +3156,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3163,9 +3166,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -3176,9 +3179,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" diff --git a/frameworks/Rust/actix/Cargo.toml b/frameworks/Rust/actix/Cargo.toml index b4862239793..67e60eb04c4 100644 --- a/frameworks/Rust/actix/Cargo.toml +++ b/frameworks/Rust/actix/Cargo.toml @@ -54,7 +54,7 @@ tokio = { version = "1", features = ["full"] } tokio-util = "0.7.13" tokio-postgres = "0.7.13" deadpool-postgres = "0.14.1" -mongodb = "3.2.1" +mongodb = "3.2.5" url = "2.5" v_htmlescape = "0.15" yarte = { version = "0.15", features = ["bytes-buf"] } From 5b03eb973ce7ea3834b05e8305ca7029829051ee Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 14 Oct 2025 19:12:52 +0200 Subject: [PATCH 1655/1766] [ruby] Use ERB::Escape for html escaping (#10176) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It should be slight faster as it doesn't allocate a new string when nothing needs to be escaped. https://github.com/ruby/erb/blob/6a5729b7e291e30432f3955e443cc3e6c9215b60/ext/erb/escape/escape.c Also Rack::Utils delegates to ERB if it's present. Co-authored-by: 尤雨东 --- frameworks/Ruby/agoo/app.rb | 2 +- frameworks/Ruby/rack-sequel/hello_world.rb | 2 +- frameworks/Ruby/rack/hello_world.rb | 2 +- frameworks/Ruby/sinatra-sequel/views/fortunes.erb | 2 +- frameworks/Ruby/sinatra/views/fortunes.erb | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index 4ec43676334..8c01a4852ba 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -127,7 +127,7 @@ def self.call(_req) f_2 = f_1.map(&:to_h). append({ 'id' => '0', 'message' => 'Additional fortune added at request time.' }). sort_by { |item| item['message'] }. - map { |f| "#{ f['id'] }#{ CGI.escape_html(f['message']) }" }. + map { |f| "#{ f['id'] }#{ ERB::Escape.html_escape(f['message']) }" }. join html_response(<<-HTML) diff --git a/frameworks/Ruby/rack-sequel/hello_world.rb b/frameworks/Ruby/rack-sequel/hello_world.rb index 6a19304f7aa..9b496788da6 100644 --- a/frameworks/Ruby/rack-sequel/hello_world.rb +++ b/frameworks/Ruby/rack-sequel/hello_world.rb @@ -70,7 +70,7 @@ def fortunes html << <<~"HTML" #{fortune.id} - #{CGI.escape_html(fortune.message)} + #{ERB::Escape.html_escape(fortune.message)} HTML end diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index d2861847a32..c438d7b4c75 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -58,7 +58,7 @@ def fortunes buffer << TEMPLATE_PREFIX fortunes.each do |item| - buffer << "#{item[:id]}#{Rack::Utils.escape_html(item[:message])}" + buffer << "#{item[:id]}#{ERB::Escape.html_escape(item[:message])}" end buffer << TEMPLATE_POSTFIX end diff --git a/frameworks/Ruby/sinatra-sequel/views/fortunes.erb b/frameworks/Ruby/sinatra-sequel/views/fortunes.erb index 67d99d2e55c..6b773ec5dc5 100644 --- a/frameworks/Ruby/sinatra-sequel/views/fortunes.erb +++ b/frameworks/Ruby/sinatra-sequel/views/fortunes.erb @@ -6,7 +6,7 @@ <% @fortunes.each do |fortune| %> <%= fortune.id %> - <%= CGI.escape_html(fortune.message) %> + <%= ERB::Escape.html_escape(fortune.message) %> <% end %> diff --git a/frameworks/Ruby/sinatra/views/fortunes.erb b/frameworks/Ruby/sinatra/views/fortunes.erb index 67d99d2e55c..6b773ec5dc5 100644 --- a/frameworks/Ruby/sinatra/views/fortunes.erb +++ b/frameworks/Ruby/sinatra/views/fortunes.erb @@ -6,7 +6,7 @@ <% @fortunes.each do |fortune| %> <%= fortune.id %> - <%= CGI.escape_html(fortune.message) %> + <%= ERB::Escape.html_escape(fortune.message) %> <% end %> From 6f9b7a58d8d61a55727842efbf8ebf8b6ed598d2 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 14 Oct 2025 19:13:00 +0200 Subject: [PATCH 1656/1766] [ruby/rage] Use ERB::Escape for html escaping (#10175) It should be slight faster as it doesn't allocate a new string when nothing needs to be escaped. https://github.com/ruby/erb/blob/6a5729b7e291e30432f3955e443cc3e6c9215b60/ext/erb/escape/escape.c --- frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb | 2 +- frameworks/Ruby/rage/app/views/fortunes.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb index 2614ca7a7b2..f524ee8b8a5 100644 --- a/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb +++ b/frameworks/Ruby/rage-sequel/app/views/fortunes.html.erb @@ -5,7 +5,7 @@ <% records.each do |record| %> - + <% end %>
      idmessage
      <%= record.id %><%= CGI.escape_html(record.message) %>
      <%= record.id %><%= ERB::Escape.html_escape(record.message) %>
      diff --git a/frameworks/Ruby/rage/app/views/fortunes.html.erb b/frameworks/Ruby/rage/app/views/fortunes.html.erb index 1aa63f3772a..565e143803b 100644 --- a/frameworks/Ruby/rage/app/views/fortunes.html.erb +++ b/frameworks/Ruby/rage/app/views/fortunes.html.erb @@ -5,7 +5,7 @@ <% records.each do |record| %> - + <% end %>
      idmessage
      <%= record[:id] %><%= CGI.escape_html(record[:message]) %>
      <%= record[:id] %><%= ERB::Escape.html_escape(record[:message]) %>
      From 9d9c3e55b6390ffa6c7d521f7f0718e83e3fce25 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 14 Oct 2025 19:13:07 +0200 Subject: [PATCH 1657/1766] [ruby/sequel] Update pg to 1.6.2 (#10165) --- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 10 ++++++---- frameworks/Ruby/sinatra/Gemfile.lock | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index 0a36eae113b..bcc9cac8bb2 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -2,7 +2,7 @@ GEM remote: https://rubygems.org/ specs: base64 (0.2.0) - bigdecimal (3.1.9) + bigdecimal (3.3.1) concurrent-ruby (1.3.5) iodine (0.7.58) json (2.13.2) @@ -10,7 +10,9 @@ GEM mustermann (3.0.3) ruby2_keywords (~> 0.0.1) nio4r (2.7.4) - pg (1.5.9) + pg (1.6.2) + pg (1.6.2-x86_64-darwin) + pg (1.6.2-x86_64-linux) puma (7.0.2) nio4r (~> 2.0) rack (3.2.0) @@ -22,9 +24,9 @@ GEM base64 (>= 0.1.0) rack (>= 3.0.0) ruby2_keywords (0.0.5) - sequel (5.90.0) + sequel (5.97.0) bigdecimal - sequel_pg (1.17.1) + sequel_pg (1.17.2) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) sinatra (4.1.1) diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index c5ae3bfb03b..ba5a80e73b0 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -35,7 +35,9 @@ GEM mustermann (3.0.4) ruby2_keywords (~> 0.0.1) nio4r (2.7.4) - pg (1.5.9) + pg (1.6.2) + pg (1.6.2-x86_64-darwin) + pg (1.6.2-x86_64-linux) puma (7.0.2) nio4r (~> 2.0) rack (3.2.3) From cb9cbd7ad0d8f28a1cc81c8ea7818af503228cb8 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 14 Oct 2025 19:13:16 +0200 Subject: [PATCH 1658/1766] [ruby/rack] Update pg to 1.6.2 (#10164) --- frameworks/Ruby/rack-sequel/Gemfile.lock | 10 ++++++---- frameworks/Ruby/rack/Gemfile.lock | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/rack-sequel/Gemfile.lock b/frameworks/Ruby/rack-sequel/Gemfile.lock index 5eb3509a13f..25aedc6282a 100644 --- a/frameworks/Ruby/rack-sequel/Gemfile.lock +++ b/frameworks/Ruby/rack-sequel/Gemfile.lock @@ -1,17 +1,19 @@ GEM remote: https://rubygems.org/ specs: - bigdecimal (3.1.9) + bigdecimal (3.3.1) concurrent-ruby (1.3.5) json (2.13.2) nio4r (2.7.4) - pg (1.5.9) + pg (1.6.2) + pg (1.6.2-x86_64-darwin) + pg (1.6.2-x86_64-linux) puma (7.0.2) nio4r (~> 2.0) rack (3.2.0) - sequel (5.90.0) + sequel (5.97.0) bigdecimal - sequel_pg (1.17.1) + sequel_pg (1.17.2) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) trilogy (2.9.0) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index e9f7e2878a0..09a09fbcbf1 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -80,7 +80,9 @@ GEM rack (>= 1.6.13) rackup (>= 2.0.0) rake (>= 12.3.3) - pg (1.5.9) + pg (1.6.2-arm64-darwin) + pg (1.6.2-x86_64-darwin) + pg (1.6.2-x86_64-linux) pitchfork (0.17.0) logger rack (>= 2.0) From ed28f6328e2bb33ebc71c944d1f89e6f2f7774f4 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 14 Oct 2025 19:13:23 +0200 Subject: [PATCH 1659/1766] [ruby/agoo] Update pg to 1.6.2 (#10163) --- frameworks/Ruby/agoo/Gemfile.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/Ruby/agoo/Gemfile.lock b/frameworks/Ruby/agoo/Gemfile.lock index 2e54ffc3d8c..7f05c4040ea 100644 --- a/frameworks/Ruby/agoo/Gemfile.lock +++ b/frameworks/Ruby/agoo/Gemfile.lock @@ -8,7 +8,8 @@ GEM bigdecimal (>= 3.0) ostruct (>= 0.2) ostruct (0.6.1) - pg (1.5.9) + pg (1.6.2) + pg (1.6.2-x86_64-linux) rack (3.2.0) PLATFORMS From 3ae4a2efc84adfa711da31d7a65e4d119a5babb6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 14 Oct 2025 19:13:32 +0200 Subject: [PATCH 1660/1766] [ruby/roda-sequel] Update pg to 1.6.2 (#10162) --- frameworks/Ruby/roda-sequel/Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 7af765ec746..93d8d275065 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -8,7 +8,9 @@ GEM iodine (0.7.58) json (2.13.2) nio4r (2.7.4) - pg (1.5.9) + pg (1.6.2) + pg (1.6.2-x86_64-darwin) + pg (1.6.2-x86_64-linux) puma (6.6.0) nio4r (~> 2.0) rack (3.2.3) From 94749c818b6a6517437e1a6c3c5a391ac9758467 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 14 Oct 2025 19:13:42 +0200 Subject: [PATCH 1661/1766] [ruby/rack] Update passenger to 6.1 (#10157) --- frameworks/Ruby/rack/Gemfile | 3 +-- frameworks/Ruby/rack/Gemfile.lock | 12 +++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index f321aee7ac8..4a6ba0c30aa 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -23,9 +23,8 @@ group :iodine, optional: true do end group :passenger, optional: true do - gem 'base64' # required by passenger on Ruby 3.4 gem 'logger' # required by passenger on Ruby 3.5 - gem 'passenger', '~> 6.0', platforms: [:ruby, :windows], require: false + gem 'passenger', '~> 6.1', platforms: [:ruby, :windows], require: false end group :pitchfork, optional: true do diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 09a09fbcbf1..c988b474189 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -32,7 +32,6 @@ GEM async-service (0.13.0) async async-container (~> 0.16) - base64 (0.2.0) bigdecimal (3.1.9) concurrent-ruby (1.3.5) connection_pool (2.5.0) @@ -76,9 +75,9 @@ GEM parser (3.3.7.1) ast (~> 2.4.1) racc - passenger (6.0.26) + passenger (6.1.0) rack (>= 1.6.13) - rackup (>= 2.0.0) + rackup (>= 1.0.1) rake (>= 12.3.3) pg (1.6.2-arm64-darwin) pg (1.6.2-x86_64-darwin) @@ -99,14 +98,14 @@ GEM puma (7.0.2) nio4r (~> 2.0) racc (1.8.1) - rack (3.2.0) + rack (3.2.2) rack-test (2.2.0) rack (>= 1.3) rackup (2.2.1) rack (>= 3) rainbow (3.1.1) raindrops (0.20.1) - rake (13.2.1) + rake (13.3.0) regexp_parser (2.10.0) rubocop (1.73.2) json (~> 2.3) @@ -148,14 +147,13 @@ PLATFORMS x86_64-linux DEPENDENCIES - base64 connection_pool (~> 2.4) falcon (~> 0.47) iodine (~> 0.7) jdbc-postgres (~> 42.2) json (~> 2.10) logger - passenger (~> 6.0) + passenger (~> 6.1) pg (~> 1.5) pitchfork (~> 0.17) puma (~> 7.0) From b5b7ff512fac61b8b716a23b7c7597ab25f0ce5e Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Tue, 14 Oct 2025 18:13:56 +0100 Subject: [PATCH 1662/1766] Reduce the build time for h2o_mruby and php-h2o (#10173) Signed-off-by: Anton Kirilov --- frameworks/PHP/php/php-h2o.dockerfile | 20 ++++++++++--------- .../Ruby/h2o_mruby/h2o_mruby.dockerfile | 12 +++++------ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index e66307ba85e..a722b660011 100644 --- a/frameworks/PHP/php/php-h2o.dockerfile +++ b/frameworks/PHP/php/php-h2o.dockerfile @@ -2,15 +2,16 @@ ARG UBUNTU_VERSION=24.04 ARG H2O_PREFIX=/opt/h2o -FROM "ubuntu:${UBUNTU_VERSION}" AS compile +FROM "buildpack-deps:${UBUNTU_VERSION}" AS compile ARG H2O_VERSION=3b9b6a53cac8bcc6a25fb28df81ad295fc5f9402 ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX WORKDIR /tmp/h2o-build -RUN apt-get -yqq update > /dev/null && \ - apt-get -yqq install \ +RUN apt-get install \ + --no-install-recommends \ + -qqUy \ cmake \ curl \ g++ \ @@ -21,6 +22,7 @@ RUN apt-get -yqq update > /dev/null && \ libuv1-dev \ libwslay-dev \ libz-dev \ + make \ ninja-build \ pkg-config \ ruby \ @@ -29,10 +31,8 @@ RUN apt-get -yqq update > /dev/null && \ tar --strip-components=1 -xz > /dev/null && \ cmake \ -B build \ - -DCMAKE_AR=/usr/bin/gcc-ar \ -DCMAKE_C_FLAGS="-flto=auto -march=native -mtune=native" \ -DCMAKE_INSTALL_PREFIX="${H2O_PREFIX}" \ - -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ -DWITH_MRUBY=on \ -G Ninja \ -S . > /dev/null && \ @@ -46,13 +46,15 @@ ARG PHP_VERSION=8.4 ENV TZ=America/Los_Angeles ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update > /dev/null && \ - apt-get -yqq install \ +RUN apt-get install \ + --no-install-recommends \ + -qqUy \ apt-utils \ software-properties-common > /dev/null && \ LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \ - apt-get -yqq update > /dev/null && \ - apt-get -yqq install \ + apt-get install \ + --no-install-recommends \ + -qqUy \ liburing2 \ "php${PHP_VERSION}" \ "php${PHP_VERSION}-cli" \ diff --git a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile index 5f7823bcd13..aaf6a6eaa96 100644 --- a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile +++ b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile @@ -2,15 +2,16 @@ ARG UBUNTU_VERSION=25.10 ARG H2O_PREFIX=/opt/h2o -FROM "ubuntu:${UBUNTU_VERSION}" AS compile +FROM "buildpack-deps:${UBUNTU_VERSION}" AS compile ARG H2O_VERSION=3b9b6a53cac8bcc6a25fb28df81ad295fc5f9402 ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX WORKDIR /tmp/h2o-build -RUN apt-get -yqq update && \ - apt-get -yqq install \ +RUN apt-get install \ + --no-install-recommends \ + -qqUy \ cmake \ curl \ g++ \ @@ -21,6 +22,7 @@ RUN apt-get -yqq update && \ libuv1-dev \ libwslay-dev \ libz-dev \ + make \ ninja-build \ pkg-config \ ruby \ @@ -29,10 +31,8 @@ RUN apt-get -yqq update && \ tar --strip-components=1 -xz && \ cmake \ -B build \ - -DCMAKE_AR=/usr/bin/gcc-ar \ -DCMAKE_C_FLAGS="-flto=auto -march=native -mtune=native" \ -DCMAKE_INSTALL_PREFIX="${H2O_PREFIX}" \ - -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ -DWITH_MRUBY=on \ -G Ninja \ -S . && \ @@ -42,7 +42,7 @@ RUN apt-get -yqq update && \ FROM "ubuntu:${UBUNTU_VERSION}" ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update && apt-get -yqq install liburing2 +RUN apt-get install --no-install-recommends -qqUy liburing2 ARG H2O_PREFIX COPY --from=compile "${H2O_PREFIX}/bin/h2o" "${H2O_PREFIX}/bin/" COPY --from=compile "${H2O_PREFIX}/share" "${H2O_PREFIX}/share/" From 4580dcc064b2e71b4b2e549ecab0a94654a499b0 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Wed, 15 Oct 2025 06:57:41 +0800 Subject: [PATCH 1663/1766] remove wasm bench (#10154) --- frameworks/Rust/xitca-web/Cargo.lock | 619 +++++++++--------- frameworks/Rust/xitca-web/Cargo.toml | 36 +- .../Rust/xitca-web/benchmark_config.json | 18 - frameworks/Rust/xitca-web/config.toml | 10 - .../Rust/xitca-web/src/db_unrealistic.rs | 5 +- frameworks/Rust/xitca-web/src/db_util.rs | 3 +- .../Rust/xitca-web/src/main_unrealistic.rs | 2 +- frameworks/Rust/xitca-web/src/main_wasm.rs | 33 - frameworks/Rust/xitca-web/src/util.rs | 26 +- .../Rust/xitca-web/xitca-web-orm.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-sync.dockerfile | 2 +- .../xitca-web-unrealistic.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-wasm.dockerfile | 35 - .../Rust/xitca-web/xitca-web.dockerfile | 2 +- 14 files changed, 350 insertions(+), 445 deletions(-) delete mode 100644 frameworks/Rust/xitca-web/src/main_wasm.rs delete mode 100644 frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index d57f388c2aa..4eb82962d66 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -4,30 +4,18 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "allocator-api2" @@ -37,9 +25,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "async-trait" -version = "0.1.87" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -57,15 +45,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -73,7 +61,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-link", ] [[package]] @@ -84,11 +72,10 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bb8" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89aabfae550a5c44b43ab941844ffcd2e993cb6900b342debf59e9ea74acdb8" +checksum = "212d8b8e1a22743d9241575c6ba822cf9c8fef34771c86ab7e477a4fbfd254e5" dependencies = [ - "async-trait", "futures-util", "parking_lot", "tokio", @@ -102,9 +89,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "block-buffer" @@ -117,9 +104,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -129,24 +116,25 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.16" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ + "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "core_affinity" @@ -180,9 +168,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -190,9 +178,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", @@ -204,9 +192,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", @@ -215,13 +203,14 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.8" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "470eb10efc8646313634c99bb1593f402a6434cbd86e266770c6e39219adb86a" +checksum = "e8496eeb328dce26ee9d9b73275d396d9bddb433fa30106cf6056dd8c3c2764c" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "byteorder", "diesel_derives", + "downcast-rs", "itoa", "pq-sys", "r2d2", @@ -229,12 +218,13 @@ dependencies = [ [[package]] name = "diesel-async" -version = "0.5.0" -source = "git+https://github.com/weiznich/diesel_async?rev=5b8262b#5b8262b86d8ed0e13adbbc4aee39500b9931ef8d" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c69eded9cb72c7e112505caec23da00149d4dd49f4c96b3c83b2b63f0aa3da5f" dependencies = [ - "async-trait", "bb8", "diesel", + "futures-core", "futures-util", "scoped-futures", "tokio", @@ -243,9 +233,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.2.4" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93958254b70bea63b4187ff73d10180599d9d8d177071b7f91e6da4e0c0ad55" +checksum = "09af0e983035368439f1383011cd87c46f41da81d0f21dc3727e2857d5a43c8e" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", @@ -256,9 +246,9 @@ dependencies = [ [[package]] name = "diesel_table_macro_syntax" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" +checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" dependencies = [ "syn", ] @@ -274,11 +264,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "downcast-rs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" + [[package]] name = "dsl_auto_type" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ae9aca7527f85f26dd76483eb38533fd84bd571065da1739656ef71c5ff5b" +checksum = "dd122633e4bef06db27737f21d3738fb89c8f6d5360d6d9d7635dda142a7757e" dependencies = [ "darling", "either", @@ -290,9 +286,15 @@ dependencies = [ [[package]] name = "either" -version = "1.14.0" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "fallible-iterator" @@ -300,6 +302,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + [[package]] name = "float-cmp" version = "0.10.0" @@ -315,11 +323,17 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -340,17 +354,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "futures-sink" version = "0.3.31" @@ -370,7 +373,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", - "futures-macro", "futures-sink", "futures-task", "pin-project-lite", @@ -390,40 +392,27 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "halfbrown" -version = "0.2.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +checksum = "0c7ed2f2edad8a14c8186b847909a41fbb9c3eafa44f88bd891114ed5019da09" dependencies = [ "hashbrown", "serde", @@ -431,12 +420,13 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", ] [[package]] @@ -447,9 +437,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hmac" @@ -462,9 +452,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -499,6 +489,17 @@ dependencies = [ "libc", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "itoa" version = "1.0.15" @@ -513,9 +514,9 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -523,35 +524,45 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.170" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libmimalloc-sys" -version = "0.1.39" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" +checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" dependencies = [ "cc", "libc", ] +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.9.4", + "libc", + "redox_syscall", +] + [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.26" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "md-5" @@ -565,36 +576,36 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mimalloc" -version = "0.1.43" +version = "0.1.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633" +checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" dependencies = [ "libmimalloc-sys", ] [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" -source = "git+https://github.com/fakeshadow/mio?rev=9bae6012b7ecfc6083350785f71a5e8265358178#9bae6012b7ecfc6083350785f71a5e8265358178" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ - "hermit-abi", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys", ] @@ -609,9 +620,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -619,24 +630,24 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -644,37 +655,38 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ "phf_shared", + "serde", ] [[package]] name = "phf_shared" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ "siphasher", ] @@ -691,11 +703,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "postgres-protocol" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" +checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" dependencies = [ "base64", "byteorder", @@ -711,9 +729,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" +checksum = "77a120daaabfcb0e324d5bf6e411e9222994cb3795c79943a0ef28ed27ea76e4" dependencies = [ "bytes", "fallible-iterator", @@ -722,41 +740,48 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy", ] [[package]] name = "pq-sys" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b51d65ebe1cb1f40641b15abae017fed35ccdda46e3dab1ff8768f625a3222" +checksum = "412a4cb9e93795c0594dab7c1c4ec1c8b42b514e1baf6e9f63d14aa376e5bd04" dependencies = [ "libc", + "pkg-config", "vcpkg", ] [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.39" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r2d2" version = "0.8.10" @@ -770,13 +795,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", "rand_core", - "zerocopy 0.8.21", ] [[package]] @@ -795,32 +819,32 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", + "getrandom", ] [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", @@ -829,9 +853,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -841,9 +871,9 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "sailfish" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d5cd6d4f24f3ab107e949ab424738cf55b03deddce3b184c46985d7b1394ef" +checksum = "40efbac4e16ca6b1a5706348ada4d8b67d7b417ac2001aa6c4ae092511bb1763" dependencies = [ "itoap", "ryu", @@ -876,18 +906,28 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -896,14 +936,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -920,9 +961,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -937,20 +978,19 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] [[package]] name = "simd-json" -version = "0.14.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" +checksum = "4255126f310d2ba20048db6321c81ab376f6a6735608bf11f0785c41f01f64e3" dependencies = [ - "getrandom 0.2.15", "halfbrown", "ref-cast", "serde", @@ -961,9 +1001,9 @@ dependencies = [ [[package]] name = "simd-json-derive" -version = "0.15.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde9e4ab4322320af4f9709170ca77dec74ef4e44db7c0600cf6f3d601b74cee" +checksum = "8582b571efbbb6d89a2d3807c283a42de7e2a5d92fa09c6498ac17abb3f58220" dependencies = [ "itoa", "ryu", @@ -975,9 +1015,9 @@ dependencies = [ [[package]] name = "simd-json-derive-int" -version = "0.15.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cebcbb57e77f41aee1cef06b800c6c79288b133054a478135a9a0e8e79c938dd" +checksum = "e60b40db276e0d588874b1317a1603e0795ef38889e09111d841a9845623efd0" dependencies = [ "proc-macro2", "quote", @@ -1000,18 +1040,15 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" @@ -1025,9 +1062,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", "windows-sys", @@ -1058,9 +1095,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.99" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1069,18 +1106,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -1089,9 +1126,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -1104,26 +1141,28 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring 0.7.10", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.8", + "slab", + "socket2 0.6.0", "windows-sys", ] [[package]] name = "tokio-postgres" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" +checksum = "a156efe7fff213168257853e1dfde202eed5f487522cbbbf7d219941d753d853" dependencies = [ "async-trait", "byteorder", @@ -1139,7 +1178,7 @@ dependencies = [ "postgres-protocol", "postgres-types", "rand", - "socket2 0.5.8", + "socket2 0.6.0", "tokio", "tokio-util", "whoami", @@ -1153,7 +1192,7 @@ checksum = "748482e3e13584a34664a710168ad5068e8cb1d968aa4ffa887e83ca6dd27967" dependencies = [ "bytes", "futures-util", - "io-uring", + "io-uring 0.6.4", "libc", "slab", "socket2 0.4.10", @@ -1162,9 +1201,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -1185,15 +1224,15 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-bidi" @@ -1203,9 +1242,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" @@ -1224,9 +1263,9 @@ checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "value-trait" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" +checksum = "f83d93718a3c9696765926b8acd98588727b285ae969901f76fcf1b6cad5d5d9" dependencies = [ "float-cmp", "halfbrown", @@ -1248,17 +1287,26 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -1269,20 +1317,22 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -1294,9 +1344,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1304,9 +1354,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -1317,18 +1367,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -1336,11 +1386,11 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall", + "libredox", "wasite", "web-sys", ] @@ -1367,11 +1417,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets", ] @@ -1441,18 +1497,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "wit-bindgen-rt" -version = "0.33.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags 2.9.0", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "xitca-codegen" version = "0.4.0" -source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" +source = "git+http://github.com/HFQR/xitca-web?rev=7c22b4a#7c22b4a8a23500368be2c9e30e81bd8fb39ebc12" dependencies = [ "quote", "syn", @@ -1460,8 +1513,8 @@ dependencies = [ [[package]] name = "xitca-http" -version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" +version = "0.7.1" +source = "git+http://github.com/HFQR/xitca-web?rev=7c22b4a#7c22b4a8a23500368be2c9e30e81bd8fb39ebc12" dependencies = [ "futures-core", "http", @@ -1469,7 +1522,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.8", + "socket2 0.6.0", "tokio", "tokio-uring", "tracing", @@ -1491,27 +1544,10 @@ dependencies = [ "xitca-unsafe-collection", ] -[[package]] -name = "xitca-postgres" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46046cb7a3d4fcfb5c858bab0651c73bb45c0c5f9f0f53dd4eb991f2d6e5d6f4" -dependencies = [ - "fallible-iterator", - "futures-core", - "percent-encoding", - "postgres-protocol", - "postgres-types", - "tokio", - "tracing", - "xitca-io", - "xitca-unsafe-collection", -] - [[package]] name = "xitca-postgres" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" +source = "git+http://github.com/HFQR/xitca-web?rev=7c22b4a#7c22b4a8a23500368be2c9e30e81bd8fb39ebc12" dependencies = [ "fallible-iterator", "futures-core", @@ -1526,15 +1562,15 @@ dependencies = [ [[package]] name = "xitca-postgres-diesel" -version = "0.1.0" -source = "git+https://github.com/fakeshadow/xitca-postgres-diesel?rev=ae93ee9#ae93ee95277e281fb87b351c42bfc2fc5a56703a" +version = "0.2.0" +source = "git+https://github.com/fakeshadow/xitca-postgres-diesel?rev=8ce4e5b#8ce4e5bb138765bc1780642adfefc4d3b8427bb7" dependencies = [ "diesel", "diesel-async", - "futures-core", + "futures-util", "scoped-futures", "tokio", - "xitca-postgres 0.2.1", + "xitca-postgres", ] [[package]] @@ -1549,9 +1585,9 @@ dependencies = [ [[package]] name = "xitca-server" version = "0.5.0" -source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" +source = "git+http://github.com/HFQR/xitca-web?rev=7c22b4a#7c22b4a8a23500368be2c9e30e81bd8fb39ebc12" dependencies = [ - "socket2 0.5.8", + "socket2 0.6.0", "tokio", "tokio-uring", "tracing", @@ -1563,7 +1599,7 @@ dependencies = [ [[package]] name = "xitca-service" version = "0.3.0" -source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" +source = "git+http://github.com/HFQR/xitca-web?rev=7c22b4a#7c22b4a8a23500368be2c9e30e81bd8fb39ebc12" [[package]] name = "xitca-unsafe-collection" @@ -1596,18 +1632,18 @@ dependencies = [ "tokio-uring", "xitca-http", "xitca-io", - "xitca-postgres 0.3.0", + "xitca-postgres", "xitca-postgres-diesel", "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.7.0", + "xitca-web 0.7.1", ] [[package]] name = "xitca-web" -version = "0.7.0" -source = "git+http://github.com/HFQR/xitca-web?rev=915b14d#915b14dfed1aaed0da9450cba70b629c9c415353" +version = "0.7.1" +source = "git+http://github.com/HFQR/xitca-web?rev=7c22b4a#7c22b4a8a23500368be2c9e30e81bd8fb39ebc12" dependencies = [ "futures-core", "pin-project-lite", @@ -1624,39 +1660,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" -dependencies = [ - "zerocopy-derive 0.8.21", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ - "proc-macro2", - "quote", - "syn", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.21" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 9fcea2ad8b4..dd95fc7b92a 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -13,11 +13,6 @@ name = "xitca-web-unrealistic" path = "./src/main_unrealistic.rs" required-features = ["perf", "pg", "template"] -[[bin]] -name = "xitca-web-wasm" -path = "./src/main_wasm.rs" -required-features = ["web"] - [[bin]] name = "xitca-web-orm" path = "./src/main_orm.rs" @@ -70,12 +65,12 @@ xitca-postgres = { version = "0.3", optional = true } diesel = { version = "2", features = ["postgres"], optional = true } # orm async optional -diesel-async = { version = "0.5", features = ["bb8", "postgres"], optional = true } -xitca-postgres-diesel = { version = "0.1", optional = true } +diesel-async = { version = "0.7", features = ["bb8", "postgres"], optional = true } +xitca-postgres-diesel = { version = "0.2", optional = true } futures-util = { version = "0.3", default-features = false, optional = true } # template optional -sailfish = { version = "0.9", default-features = false, features = ["perf-inline"], optional = true } +sailfish = { version = "0.10", default-features = false, features = ["perf-inline"], optional = true } # io-uring optional tokio-uring = { version = "0.5", optional = true } @@ -83,11 +78,9 @@ tokio-uring = { version = "0.5", optional = true } # perf optional core_affinity = { version = "0.8.1", optional = true } mimalloc = { version = "0.1", default-features = false, optional = true } -simd-json = { version = "0.14", optional = true } -simd-json-derive = { version = "0.15", default-features = false, optional = true } +simd-json = { version = "0.17", optional = true } +simd-json-derive = { version = "0.18", default-features = false, 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 } rand = { version = "0.9", features = ["os_rng", "small_rng"], default-features = false } tokio = "1.41" @@ -99,14 +92,11 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres-diesel = { git = "https://github.com/fakeshadow/xitca-postgres-diesel", rev = "ae93ee9" } - -diesel-async = { git = "https://github.com/weiznich/diesel_async", rev = "5b8262b" } -mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" } - -xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } -xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } -xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } -xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } -xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } -xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "915b14d" } +xitca-postgres-diesel = { git = "https://github.com/fakeshadow/xitca-postgres-diesel", rev = "8ce4e5b" } + +xitca-codegen = { git = "http://github.com/HFQR/xitca-web", rev = "7c22b4a" } +xitca-http = { git = "http://github.com/HFQR/xitca-web", rev = "7c22b4a" } +xitca-postgres = { git = "http://github.com/HFQR/xitca-web", rev = "7c22b4a" } +xitca-server = { git = "http://github.com/HFQR/xitca-web", rev = "7c22b4a" } +xitca-service = { git = "http://github.com/HFQR/xitca-web", rev = "7c22b4a" } +xitca-web = { git = "http://github.com/HFQR/xitca-web", rev = "7c22b4a" } diff --git a/frameworks/Rust/xitca-web/benchmark_config.json b/frameworks/Rust/xitca-web/benchmark_config.json index db81e362742..c60cf0bc3b2 100755 --- a/frameworks/Rust/xitca-web/benchmark_config.json +++ b/frameworks/Rust/xitca-web/benchmark_config.json @@ -46,24 +46,6 @@ "notes": "", "versus": "" }, - "wasm": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "none", - "framework": "xitca-web", - "language": "rust", - "orm": "raw", - "platform": "none", - "webserver": "xitca-server", - "os": "linux", - "database_os": "linux", - "display_name": "xitca-web [wasm]", - "notes": "", - "versus": "" - }, "orm": { "json_url": "/json", "plaintext_url": "/plaintext", diff --git a/frameworks/Rust/xitca-web/config.toml b/frameworks/Rust/xitca-web/config.toml index 7ffa19fbbce..8646eae05e0 100644 --- a/frameworks/Rust/xitca-web/config.toml +++ b/frameworks/Rust/xitca-web/config.toml @@ -47,13 +47,3 @@ orm = "Raw" platform = "None" webserver = "xitca-server" versus = "" - -[wasm] -urls.json = "/json" -urls.plaintext = "/plaintext" -approach = "Realistic" -classification = "Micro" -os = "wasi" -platform = "wasm" -webserver = "xitca-server" -versus = "" diff --git a/frameworks/Rust/xitca-web/src/db_unrealistic.rs b/frameworks/Rust/xitca-web/src/db_unrealistic.rs index 71e51e8e8f0..cacd6367656 100644 --- a/frameworks/Rust/xitca-web/src/db_unrealistic.rs +++ b/frameworks/Rust/xitca-web/src/db_unrealistic.rs @@ -72,8 +72,9 @@ impl Client { let mut worlds = Vec::with_capacity(len); while let Some(mut item) = res.try_next().await? { - let row = item.try_next().await?.ok_or_else(not_found)?; - worlds.push(World::new(row.get(0), row.get(1))); + while let Some(row) = item.try_next().await? { + worlds.push(World::new(row.get(0), row.get(1))); + } } Ok(worlds) diff --git a/frameworks/Rust/xitca-web/src/db_util.rs b/frameworks/Rust/xitca-web/src/db_util.rs index 42c2c455bbe..74936ab14e4 100644 --- a/frameworks/Rust/xitca-web/src/db_util.rs +++ b/frameworks/Rust/xitca-web/src/db_util.rs @@ -64,10 +64,11 @@ pub mod pg { .into_boxed_str() } - pub fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator { + pub fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator + Clone { let mut params = params.to_owned(); params.sort_by(|a, b| a[0].cmp(&b[0])); + #[derive(Clone)] struct ParamIter(I); impl Iterator for ParamIter diff --git a/frameworks/Rust/xitca-web/src/main_unrealistic.rs b/frameworks/Rust/xitca-web/src/main_unrealistic.rs index 18dc72a9847..2b45164fd8d 100644 --- a/frameworks/Rust/xitca-web/src/main_unrealistic.rs +++ b/frameworks/Rust/xitca-web/src/main_unrealistic.rs @@ -41,7 +41,7 @@ fn main() -> io::Result<()> { tokio::runtime::Builder::new_current_thread() .enable_all() - .build_local(&Default::default()) + .build_local(Default::default()) .unwrap() .block_on(async { let socket = tokio::net::TcpSocket::new_v4()?; diff --git a/frameworks/Rust/xitca-web/src/main_wasm.rs b/frameworks/Rust/xitca-web/src/main_wasm.rs deleted file mode 100644 index ec06d5dec68..00000000000 --- a/frameworks/Rust/xitca-web/src/main_wasm.rs +++ /dev/null @@ -1,33 +0,0 @@ -mod ser; -mod util; - -use std::os::wasi::io::FromRawFd; - -use xitca_web::{ - App, - handler::{json::Json, text::Text}, - http::{WebResponse, header::SERVER}, - route::get, -}; - -fn main() -> std::io::Result<()> { - let listener = std::env::var("FD_COUNT") - .ok() - .and_then(|v| v.parse().ok()) - .map(|fd| unsafe { std::net::TcpListener::from_raw_fd(fd) }) - .expect("failed to parse FD_COUNT env"); - - App::new() - .at("/json", get(Json(ser::Message::new()))) - .at("/plaintext", get(Text("Hello, World!"))) - .map(header) - .serve() - .listen(listener)? - .run() - .wait() -} - -fn header(mut res: WebResponse) -> WebResponse { - 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 f4764a4a34c..48e2c24cc68 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -45,25 +45,19 @@ impl State { } } -#[cfg(not(target_arch = "wasm32"))] -pub mod non_wasm { - use rand::{Rng, SeedableRng, rngs::SmallRng}; +use rand::{Rng, SeedableRng, rngs::SmallRng}; - pub struct Rand(SmallRng); +pub struct Rand(SmallRng); - impl Default for Rand { - fn default() -> Self { - Self(SmallRng::from_os_rng()) - } +impl Default for Rand { + fn default() -> Self { + Self(SmallRng::from_os_rng()) } +} - impl Rand { - #[inline] - pub fn gen_id(&mut self) -> i32 { - self.0.random_range(1..=10000) - } +impl Rand { + #[inline] + pub fn gen_id(&mut self) -> i32 { + self.0.random_range(1..=10000) } } - -#[cfg(not(target_arch = "wasm32"))] -pub use non_wasm::*; diff --git a/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile b/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile index b50a348dcd2..19a4adad80f 100644 --- a/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-orm.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.90 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 cf951f74e47..b2f2b128395 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.85 +FROM rust:1.90 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile b/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile index 50aa44a4bc0..6e6ed7828b6 100644 --- a/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-unrealistic.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.90 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 deleted file mode 100644 index 16d96cfafc5..00000000000 --- a/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -ARG WASMTIME_VERSION=15.0.0 -ARG WASM_TARGET=wasm32-wasip1-threads - -FROM rust:1.85 AS compile - -ARG WASMTIME_VERSION -ARG WASM_TARGET - -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} - - -FROM ubuntu:22.04 - -ARG WASM_TARGET -ARG BENCHMARK_ENV -ARG TFB_TEST_DATABASE -ARG TFB_TEST_NAME - -COPY --from=compile \ -/tmp/target/${WASM_TARGET}/release/xitca-web-wasm.wasm \ -/tmp/wasmtime \ -/opt/xitca-web-wasm/ -EXPOSE 8080 - -CMD /opt/xitca-web-wasm/wasmtime run \ ---wasm all-proposals=y \ ---wasi threads=y,tcplisten=0.0.0.0:8080 \ ---env FD_COUNT=3 \ -/opt/xitca-web-wasm/xitca-web-wasm.wasm diff --git a/frameworks/Rust/xitca-web/xitca-web.dockerfile b/frameworks/Rust/xitca-web/xitca-web.dockerfile index 0a4f87e8423..7558d46f428 100644 --- a/frameworks/Rust/xitca-web/xitca-web.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.85 +FROM rust:1.90 ADD ./ /xitca-web WORKDIR /xitca-web From 2801d3d726def8cd5269991f3c22a68a624e5eef Mon Sep 17 00:00:00 2001 From: Alexander Sandor <137198655+SandPod@users.noreply.github.com> Date: Wed, 15 Oct 2025 00:58:18 +0200 Subject: [PATCH 1664/1766] feat: Add Relic framework. (#10155) --- frameworks/Dart/relic/.dockerignore | 9 +++ frameworks/Dart/relic/.gitignore | 5 ++ frameworks/Dart/relic/README.md | 23 +++++++ frameworks/Dart/relic/benchmark_config.json | 26 ++++++++ frameworks/Dart/relic/bin/server.dart | 70 +++++++++++++++++++++ frameworks/Dart/relic/pubspec.yaml | 7 +++ frameworks/Dart/relic/relic.dockerfile | 14 +++++ 7 files changed, 154 insertions(+) create mode 100644 frameworks/Dart/relic/.dockerignore create mode 100644 frameworks/Dart/relic/.gitignore create mode 100644 frameworks/Dart/relic/README.md create mode 100644 frameworks/Dart/relic/benchmark_config.json create mode 100644 frameworks/Dart/relic/bin/server.dart create mode 100644 frameworks/Dart/relic/pubspec.yaml create mode 100644 frameworks/Dart/relic/relic.dockerfile diff --git a/frameworks/Dart/relic/.dockerignore b/frameworks/Dart/relic/.dockerignore new file mode 100644 index 00000000000..6a6cc8727a7 --- /dev/null +++ b/frameworks/Dart/relic/.dockerignore @@ -0,0 +1,9 @@ +# From https://hub.docker.com/_/dart +.dockerignore +Dockerfile +build/ +.dart_tool/ +.git/ +.github/ +.gitignore +.packages diff --git a/frameworks/Dart/relic/.gitignore b/frameworks/Dart/relic/.gitignore new file mode 100644 index 00000000000..27fe9f77a4b --- /dev/null +++ b/frameworks/Dart/relic/.gitignore @@ -0,0 +1,5 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ +*.lock +!bin diff --git a/frameworks/Dart/relic/README.md b/frameworks/Dart/relic/README.md new file mode 100644 index 00000000000..4c70cc1fd20 --- /dev/null +++ b/frameworks/Dart/relic/README.md @@ -0,0 +1,23 @@ +# Relic Benchmarking Test + +### Test Type Implementation Source Code + +- [JSON](server.dart) +- [PLAINTEXT](server.dart) + +## Important Libraries + +The tests were run with: + +- [pkg:relic](https://pub.dev/packages/relic) +- [Dart](https://dart.dev/) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext diff --git a/frameworks/Dart/relic/benchmark_config.json b/frameworks/Dart/relic/benchmark_config.json new file mode 100644 index 00000000000..1f309015336 --- /dev/null +++ b/frameworks/Dart/relic/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "relic", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "relic", + "language": "Dart", + "flavor": "None", + "orm": "None", + "platform": "relic", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "relic", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Dart/relic/bin/server.dart b/frameworks/Dart/relic/bin/server.dart new file mode 100644 index 00000000000..b020cb396d4 --- /dev/null +++ b/frameworks/Dart/relic/bin/server.dart @@ -0,0 +1,70 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:isolate'; +import 'dart:typed_data'; + +import 'package:relic/io_adapter.dart'; +import 'package:relic/relic.dart'; + +void main() async { + /// Number of [Isolate]s to spawn + /// This is based on the number of available processors + /// minus one for the main isolate + final isolateCount = Platform.numberOfProcessors * 2 - 1; + + /// Create an [Isolate] containing an [HttpServer] + await Future.wait( + List.generate( + isolateCount, + (final index) => + Isolate.spawn((final _) => _serve(), null, debugName: '$index'), + ), + ); + + _serve(); +} + +/// [_serve] is called in each spawned isolate. +Future _serve() async { + final router = Router() + ..get('/json', respondWith((req) => _responseJson())) + ..get('/plaintext', respondWith((req) => _responsePlainText())); + + final handler = const Pipeline() + .addMiddleware(_requiredHeadersMiddleware()) + .addMiddleware(routeWith(router)) + .addHandler(respondWith((_) => Response.notFound())); + + // start the server + await serve(handler, InternetAddress.anyIPv4, 8080, shared: true); +} + +Middleware _requiredHeadersMiddleware() { + var addHeaders = createMiddleware( + onResponse: (response) => response.copyWith( + headers: response.headers.transform((headers) { + headers.server = 'relic'; + // Date header is added by default, but we set it here for clarity. + headers.date = DateTime.now(); + }), + ), + ); + return addHeaders; +} + +Response _responseJson() { + return Response.ok( + body: Body.fromData( + _jsonEncoder.convert(const {'message': 'Hello, World!'}) as Uint8List, + mimeType: MimeType.json, + ), + ); +} + +Response _responsePlainText() { + return Response.ok( + body: Body.fromString('Hello, World!', mimeType: MimeType.plainText), + ); +} + +final _jsonEncoder = JsonUtf8Encoder(); diff --git a/frameworks/Dart/relic/pubspec.yaml b/frameworks/Dart/relic/pubspec.yaml new file mode 100644 index 00000000000..a473d37b055 --- /dev/null +++ b/frameworks/Dart/relic/pubspec.yaml @@ -0,0 +1,7 @@ +name: relicbenchmark +description: A benchmark of pkg:relic +environment: + sdk: ^3.8.0 + +dependencies: + relic: ^0.7.0 diff --git a/frameworks/Dart/relic/relic.dockerfile b/frameworks/Dart/relic/relic.dockerfile new file mode 100644 index 00000000000..1671de7d052 --- /dev/null +++ b/frameworks/Dart/relic/relic.dockerfile @@ -0,0 +1,14 @@ + +FROM dart:3.9 AS builder + +COPY . /app +WORKDIR /app +RUN mkdir build +RUN dart compile exe ./bin/server.dart -o build/server + +FROM scratch +COPY --from=builder /runtime/ / +COPY --from=builder /app/build /bin + +EXPOSE 8080 +CMD ["server"] From cac7817fa2fc0b257063d674729ee3056fd00c7b Mon Sep 17 00:00:00 2001 From: karlivory <5895483+karlivory@users.noreply.github.com> Date: Wed, 15 Oct 2025 01:58:55 +0300 Subject: [PATCH 1665/1766] [rust/khttp] update (#10156) * khttp: remove /plaintext benchmark, use mimalloc * khttp: use static base headers for /json * cleanup --- frameworks/Rust/khttp/Cargo.lock | 79 ++++++++++++++------- frameworks/Rust/khttp/Cargo.toml | 1 + frameworks/Rust/khttp/README.md | 5 -- frameworks/Rust/khttp/benchmark_config.json | 1 - frameworks/Rust/khttp/src/main.rs | 45 +++++------- 5 files changed, 73 insertions(+), 58 deletions(-) diff --git a/frameworks/Rust/khttp/Cargo.lock b/frameworks/Rust/khttp/Cargo.lock index 47c239fec8b..5278faf3a17 100644 --- a/frameworks/Rust/khttp/Cargo.lock +++ b/frameworks/Rust/khttp/Cargo.lock @@ -50,9 +50,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "cc" -version = "1.2.39" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ "find-msvc-tools", "shlex", @@ -110,9 +110,9 @@ checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" [[package]] name = "iana-time-zone" @@ -169,6 +169,7 @@ name = "khttp-techempower" version = "0.1.0" dependencies = [ "khttp", + "mimalloc", "pq-sys", "yarte", ] @@ -179,6 +180,16 @@ version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +[[package]] +name = "libmimalloc-sys" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "log" version = "0.4.28" @@ -191,6 +202,15 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "mimalloc" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" +dependencies = [ + "libmimalloc-sys", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -206,13 +226,20 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "pq-sys" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfd6cf44cca8f9624bc19df234fc4112873432f5fda1caff174527846d026fa9" +checksum = "412a4cb9e93795c0594dab7c1c4ec1c8b42b514e1baf6e9f63d14aa376e5bd04" dependencies = [ "libc", + "pkg-config", "vcpkg", ] @@ -237,9 +264,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -302,9 +329,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -312,18 +339,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -515,9 +542,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.62.1" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", @@ -528,9 +555,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.1" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -539,9 +566,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.2" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -550,24 +577,24 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] diff --git a/frameworks/Rust/khttp/Cargo.toml b/frameworks/Rust/khttp/Cargo.toml index 21a5bb042d4..68af03b1cb8 100644 --- a/frameworks/Rust/khttp/Cargo.toml +++ b/frameworks/Rust/khttp/Cargo.toml @@ -7,6 +7,7 @@ edition = "2024" khttp = { version = "0.2", features = ["epoll"] } yarte = { version = "0.15", features = ["json"] } pq-sys = "0.7" +mimalloc = "0.1" [profile.release] opt-level = 3 diff --git a/frameworks/Rust/khttp/README.md b/frameworks/Rust/khttp/README.md index a0a5ad4d398..02671bc3d7f 100755 --- a/frameworks/Rust/khttp/README.md +++ b/frameworks/Rust/khttp/README.md @@ -5,7 +5,6 @@ Benchmark for [khttp](https://github.com/karlivory/khttp) - a low-level HTTP/1.1 ### Test Type Implementation Source Code * [JSON](./src/main.rs) -* [PLAINTEXT](./src/main.rs) * [FORTUNES](./src/main.rs) ## Test URLs @@ -14,10 +13,6 @@ Benchmark for [khttp](https://github.com/karlivory/khttp) - a low-level HTTP/1.1 http://localhost:8080/json -### PLAINTEXT - -http://localhost:8080/plaintext - ### FORTUNES http://localhost:8080/fortunes diff --git a/frameworks/Rust/khttp/benchmark_config.json b/frameworks/Rust/khttp/benchmark_config.json index 4e951342ef2..dc1c39a912c 100755 --- a/frameworks/Rust/khttp/benchmark_config.json +++ b/frameworks/Rust/khttp/benchmark_config.json @@ -4,7 +4,6 @@ { "default": { "json_url": "/json", - "plaintext_url": "/plaintext", "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Rust/khttp/src/main.rs b/frameworks/Rust/khttp/src/main.rs index 38d0755dadc..8a147f21705 100644 --- a/frameworks/Rust/khttp/src/main.rs +++ b/frameworks/Rust/khttp/src/main.rs @@ -1,5 +1,12 @@ +#[global_allocator] +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; + use khttp::{Headers, Method::*, RequestContext, ResponseHandle, Server, Status}; -use std::{ffi::CStr, io, ptr}; +use pq_sys::{ + ConnStatusType, ExecStatusType, PGconn, PQclear, PQconnectdb, PQerrorMessage, PQexecPrepared, + PQfinish, PQgetlength, PQgetvalue, PQntuples, PQprepare, PQresultStatus, PQstatus, +}; +use std::{ffi::CStr, io, ptr, sync::LazyLock}; use yarte::{Serialize, ywrite_html}; #[derive(Serialize)] @@ -7,25 +14,17 @@ struct HelloMessage { message: &'static str, } +static JSON_HEADERS: LazyLock> = LazyLock::new(|| { + let mut headers = Headers::new(); + headers.add(Headers::CONTENT_TYPE, b"application/json"); + headers.add("server", b"khttp"); + headers +}); + fn main() { let mut app = Server::builder("0.0.0.0:8080").unwrap(); - app.route(Get, "/plaintext", |_ctx, res| { - // headers - let mut headers = Headers::new(); - headers.add(Headers::CONTENT_TYPE, b"text/plain"); - headers.add("server", b"khttp"); - - // response - res.ok(&headers, "Hello, World!") - }); - app.route(Get, "/json", |_ctx, res| { - // headers - let mut headers = Headers::new(); - headers.add(Headers::CONTENT_TYPE, b"application/json"); - headers.add("server", b"khttp"); - // body let msg = HelloMessage { message: "Hello, World!", @@ -34,7 +33,7 @@ fn main() { msg.to_bytes_mut(&mut buf); // response - res.ok(&headers, buf) + res.ok(&JSON_HEADERS, buf) }); app.route(Get, "/fortunes", handle_fortunes); @@ -63,11 +62,6 @@ fn handle_fortunes(_ctx: RequestContext, res: &mut ResponseHandle) -> io::Result // /fortunes query implementation using postgres (libpq) // --------------------------------------------------------------------- -use pq_sys::{ - ConnStatusType, ExecStatusType, PGconn, PQclear, PQconnectdb, PQerrorMessage, PQexecPrepared, - PQfinish, PQgetlength, PQgetvalue, PQntuples, PQprepare, PQresultStatus, PQstatus, -}; - const DB_CONNINFO: &CStr = c"postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; const PG_FORTUNES_SQL: &CStr = c"SELECT id, message FROM fortune"; const PG_FORTUNES_PREPARED_STMT: &CStr = c"s_fortunes"; @@ -78,7 +72,7 @@ struct Fortune<'a> { message: &'a str, } -fn fetch_fortunes_html() -> Result, String> { +fn fetch_fortunes_html() -> Result, &'static str> { PG_CONN.with(|pg| unsafe { let res = PQexecPrepared( pg.conn, @@ -90,11 +84,11 @@ fn fetch_fortunes_html() -> Result, String> { 1, // resultFormat = 1 (binary) ); if res.is_null() { - return Err("PQexecPrepared returned null".to_owned()); + return Err("PQexecPrepared returned null"); } if PQresultStatus(res) != ExecStatusType::PGRES_TUPLES_OK { PQclear(res); - return Err("PQexecPrepared non-ok result status".to_owned()); + return Err("PQexecPrepared non-ok result status"); } let rows = PQntuples(res); @@ -164,7 +158,6 @@ impl PgConnection { PQfinish(conn); panic!("PQprepare returned null"); } - let st = PQresultStatus(res); PQclear(res); if st != ExecStatusType::PGRES_COMMAND_OK { From e3ea8e693b8b7f967dfed876f4e2ae7c7911b62c Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Wed, 15 Oct 2025 01:59:44 +0300 Subject: [PATCH 1666/1766] Add majavat templating engine (#10158) Only clojure ring-http-exchange and kit are impacted Co-authored-by: jj --- frameworks/Clojure/kit/benchmark_config.json | 18 +++ frameworks/Clojure/kit/deps.edn | 24 +-- frameworks/Clojure/kit/kit-majavat.dockerfile | 19 +++ .../clj/io/github/kit_clj/te_bench/core.clj | 9 +- .../te_bench/web/controllers/bench.clj | 31 +++- .../kit_clj/te_bench/web/routes/bench.clj | 8 +- .../ring-http-exchange/benchmark_config.json | 20 ++- .../Clojure/ring-http-exchange/config.toml | 12 +- frameworks/Clojure/ring-http-exchange/pom.xml | 140 ------------------ .../Clojure/ring-http-exchange/project.clj | 21 +++ .../ring-http-exchange/resources/fortune.html | 15 ++ .../ring-http-exchange-graalvm.dockerfile | 9 +- ...ng-http-exchange-robaho-graalvm.dockerfile | 9 +- .../ring-http-exchange-robaho.dockerfile | 9 +- .../ring-http-exchange.dockerfile | 9 +- .../src/ring_http_exchange/benchmark.clj | 76 +++++++--- 16 files changed, 211 insertions(+), 218 deletions(-) create mode 100644 frameworks/Clojure/kit/kit-majavat.dockerfile delete mode 100644 frameworks/Clojure/ring-http-exchange/pom.xml create mode 100644 frameworks/Clojure/ring-http-exchange/project.clj create mode 100644 frameworks/Clojure/ring-http-exchange/resources/fortune.html diff --git a/frameworks/Clojure/kit/benchmark_config.json b/frameworks/Clojure/kit/benchmark_config.json index f5e13d358bb..bbde2d31918 100755 --- a/frameworks/Clojure/kit/benchmark_config.json +++ b/frameworks/Clojure/kit/benchmark_config.json @@ -25,6 +25,24 @@ "display_name": "Kit", "notes": "", "versus": "None" + }, + "majavat": { + "fortune_url": "/majavat-fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "postgres", + "framework": "None", + "language": "Clojure", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "kit-majavat", + "notes": "", + "versus": "kit" } } ] diff --git a/frameworks/Clojure/kit/deps.edn b/frameworks/Clojure/kit/deps.edn index 29ff4d19400..50a41284745 100644 --- a/frameworks/Clojure/kit/deps.edn +++ b/frameworks/Clojure/kit/deps.edn @@ -1,29 +1,31 @@ {:paths ["src/clj" "resources"] - :deps {org.clojure/clojure {:mvn/version "1.11.1"} + :deps {org.clojure/clojure {:mvn/version "1.12.3"} ;; Routing - metosin/reitit {:mvn/version "0.5.18"} + metosin/reitit {:mvn/version "0.9.1"} ;; Ring - metosin/ring-http-response {:mvn/version "0.9.3"} - ring/ring-core {:mvn/version "1.9.5"} + metosin/ring-http-response {:mvn/version "0.9.5"} + ring/ring-core {:mvn/version "1.15.3"} ;; Data coercion - metosin/muuntaja {:mvn/version "0.6.8"} + metosin/muuntaja {:mvn/version "0.6.11"} ;; HTML templating - selmer/selmer {:mvn/version "1.12.55"} + selmer/selmer {:mvn/version "1.12.62"} + org.clojars.jj/majavat {:mvn/version "1.12.1"} ;; Database - org.postgresql/postgresql {:mvn/version "42.5.1"} + org.postgresql/postgresql {:mvn/version "42.7.8"} + ;; kit Libs - io.github.kit-clj/kit-core {:mvn/version "1.0.3"} - io.github.kit-clj/kit-undertow {:mvn/version "1.0.4"} - io.github.kit-clj/kit-sql-hikari {:mvn/version "1.0.2"} - org.clojure/core.cache {:mvn/version "1.0.225"} + io.github.kit-clj/kit-core {:mvn/version "1.0.9"} + io.github.kit-clj/kit-undertow {:mvn/version "1.0.9"} + io.github.kit-clj/kit-sql-hikari {:mvn/version "1.0.6"} + org.clojure/core.cache {:mvn/version "1.1.234"} } diff --git a/frameworks/Clojure/kit/kit-majavat.dockerfile b/frameworks/Clojure/kit/kit-majavat.dockerfile new file mode 100644 index 00000000000..55b27b6f122 --- /dev/null +++ b/frameworks/Clojure/kit/kit-majavat.dockerfile @@ -0,0 +1,19 @@ +# syntax = docker/dockerfile:1.2 +FROM clojure:openjdk-17 AS build + +WORKDIR / +COPY . / + +RUN clj -Sforce -T:build all + +FROM azul/zulu-openjdk-alpine:17 + +COPY --from=build /target/te-bench-standalone.jar /te-bench/te-bench-standalone.jar + +EXPOSE 8080 + +ENV PORT=8080 +ENV JAVA_OPTS="-XX:+UseContainerSupport -Dfile.encoding=UTF-8" +ENV JDBC_URL="jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass" + +ENTRYPOINT exec java $JAVA_OPTS -jar /te-bench/te-bench-standalone.jar diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/core.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/core.clj index 872d2d31334..fe893e40441 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/core.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/core.clj @@ -17,11 +17,10 @@ ;; log uncaught exceptions in threads (Thread/setDefaultUncaughtExceptionHandler - (reify Thread$UncaughtExceptionHandler - (uncaughtException [_ thread ex] - (log/error {:what :uncaught-exception - :exception ex - :where (str "Uncaught exception on" (.getName thread))})))) + (fn [thread ex] + (log/error {:what :uncaught-exception + :exception ex + :where (str "Uncaught exception on" (.getName thread))}))) (defonce system (atom nil)) diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj index 71cda1008ec..0ac7c6f2b2b 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj @@ -3,6 +3,9 @@ [clojure.core.cache :as cache] [next.jdbc :as jdbc] [next.jdbc.result-set :as rs] + [jj.majavat :as majavat] + [jj.majavat.renderer :refer [->InputStreamRenderer]] + [jj.majavat.renderer.sanitizer :refer [->Html]] [ring.util.http-response :as http-response] [selmer.parser :as parser])) @@ -13,15 +16,24 @@ (def ^:const HELLO_WORLD "Hello, World!") (def ^:const MAX_ID_ZERO_IDX 9999) (def ^:const CACHE_TTL (* 24 60 60)) - +(def ^:private render-fortune (majavat/build-renderer "html/fortunes.html" + {:renderer (->InputStreamRenderer + {:sanitizer (->Html)})})) (def selmer-opts {:custom-resource-path (clojure.java.io/resource "html")}) -(defn html-response +(defn selmer-html-response [template & [params]] (-> (parser/render-file template params selmer-opts) (http-response/ok) (http-response/content-type "text/html; charset=utf-8"))) +(defn majavat-html-response + [context] + (-> (render-fortune context) + (http-response/ok) + (http-response/content-type "text/html; charset=utf-8"))) + + (defn rand-id [n] (inc (rand-int n))) @@ -31,7 +43,7 @@ "Parse provided string value of query count, clamping values to between 1 and 500." [^String queries] (let [n (try (Integer/parseInt queries) - (catch Exception _ 1))] ; default to 1 on parse failure + (catch Exception _ 1))] ; default to 1 on parse failure (cond (< n 1) 1 (> n 500) 500 @@ -101,7 +113,7 @@ (defn update-db-handler [db-conn request] - (let [items (db-multi-query-world! db-conn request)] + (let [items (db-multi-query-world! db-conn request)] (http-response/ok (mapv (fn [{:keys [id]}] @@ -122,9 +134,16 @@ [] (range-from-req request)))) -(defn fortune-handler +(defn selmer-fortune-handler + [db-conn _request] + (as-> (jdbc/execute! db-conn ["select * from \"Fortune\";"] jdbc-opts) fortunes + (conj fortunes {:id 0 :message "Additional fortune added at request time."}) + (sort-by :message fortunes) + (selmer-html-response "fortunes.html" {:messages fortunes}))) + +(defn majavat-fortune-handler [db-conn _request] (as-> (jdbc/execute! db-conn ["select * from \"Fortune\";"] jdbc-opts) fortunes (conj fortunes {:id 0 :message "Additional fortune added at request time."}) (sort-by :message fortunes) - (html-response "fortunes.html" {:messages fortunes}))) \ No newline at end of file + (majavat-html-response {:messages fortunes}))) \ No newline at end of file diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj index 2b81a381c86..032ceb143f7 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj @@ -17,7 +17,8 @@ ["/queries" {:get (partial bench/multi-db-handler db-conn)}] ["/updates" {:get (partial bench/update-db-handler db-conn)}] ["/cached-queries" {:get (partial bench/cached-query-handler db-conn cache)}] - ["/fortunes" {:get (partial bench/fortune-handler db-conn)}]]) + ["/fortunes" {:get (partial bench/selmer-fortune-handler db-conn)}] + ["/majavat-fortunes" {:get (partial bench/majavat-fortune-handler db-conn)}]]) (defmethod ig/init-key :reitit.routes/bench [_ {:keys [base-path] @@ -25,10 +26,7 @@ :as opts}] [base-path {:muuntaja formats/instance - :middleware [;; query-params & form-params - parameters/parameters-middleware - ;; encoding response body + :middleware [parameters/parameters-middleware muuntaja/format-response-middleware - ;; default header middleware default-headers/default-headers-middleware]} (bench-routes opts)]) diff --git a/frameworks/Clojure/ring-http-exchange/benchmark_config.json b/frameworks/Clojure/ring-http-exchange/benchmark_config.json index 0d7e64dcf6a..d8d2ba0ce3e 100755 --- a/frameworks/Clojure/ring-http-exchange/benchmark_config.json +++ b/frameworks/Clojure/ring-http-exchange/benchmark_config.json @@ -5,14 +5,15 @@ "default": { "json_url": "/json", "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Platform", - "database": "None", + "database": "postgres", "framework": "None", "language": "Clojure", "flavor": "None", - "orm": "None", + "orm": "Raw", "platform": "None", "webserver": "None", "os": "Linux", @@ -24,14 +25,15 @@ "robaho": { "json_url": "/json", "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Platform", - "database": "None", + "database": "postgres", "framework": "None", "language": "Clojure", "flavor": "None", - "orm": "None", + "orm": "Raw", "platform": "None", "webserver": "None", "os": "Linux", @@ -43,14 +45,15 @@ "graalvm": { "json_url": "/json", "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Platform", - "database": "None", + "database": "postgres", "framework": "None", "language": "Clojure", "flavor": "None", - "orm": "None", + "orm": "Raw", "platform": "None", "webserver": "None", "os": "Linux", @@ -62,14 +65,15 @@ "robaho-graalvm": { "json_url": "/json", "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Platform", - "database": "None", + "database": "postgres", "framework": "None", "language": "Clojure", "flavor": "None", - "orm": "None", + "orm": "Raw", "platform": "None", "webserver": "None", "os": "Linux", diff --git a/frameworks/Clojure/ring-http-exchange/config.toml b/frameworks/Clojure/ring-http-exchange/config.toml index 48ba799aef5..17193d6169a 100644 --- a/frameworks/Clojure/ring-http-exchange/config.toml +++ b/frameworks/Clojure/ring-http-exchange/config.toml @@ -4,9 +4,10 @@ name = "ring-http-exchange" [main] urls.plaintext = "/plaintext" urls.json = "/json" +urls.fortune = "/fortunes" approach = "Realistic" classification = "Platform" -database = "None" +database = "postgres" database_os = "Linux" os = "Linux" orm = "Raw" @@ -18,9 +19,10 @@ versus = "httpserver" [graalvm] urls.plaintext = "/plaintext" urls.json = "/json" +urls.fortune = "/fortunes" approach = "Realistic" classification = "Platform" -database = "None" +database = "postgres" database_os = "Linux" os = "Linux" orm = "Raw" @@ -31,9 +33,10 @@ versus = "httpserver-graalvm" [robaho] urls.plaintext = "/plaintext" urls.json = "/json" +urls.fortune = "/fortunes" approach = "Realistic" classification = "Platform" -database = "None" +database = "postgres" database_os = "Linux" os = "Linux" orm = "Raw" @@ -44,9 +47,10 @@ versus = "httpserver-robaho" [robaho-graalvm] urls.plaintext = "/plaintext" urls.json = "/json" +urls.fortune = "/fortunes" approach = "Realistic" classification = "Platform" -database = "None" +database = "postgres" database_os = "Linux" os = "Linux" orm = "Raw" diff --git a/frameworks/Clojure/ring-http-exchange/pom.xml b/frameworks/Clojure/ring-http-exchange/pom.xml deleted file mode 100644 index bee1ed47c88..00000000000 --- a/frameworks/Clojure/ring-http-exchange/pom.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - 4.0.0 - ring-http-server - ring-http-server - jar - 1.0.0 - ring-http-server - - - EPL-2.0 - https://www.eclipse.org/legal/epl-2.0/ - - - - java - java-test - - - resources - - - - - resources - - - target - target\classes - - - com.theoryinpractise - clojure-maven-plugin - 1.8.3 - true - - - compile-clojure - compile - - compile - - - - test-clojure - test - - test - - - - - - src/ - - - - - maven-assembly-plugin - - - - ring_http_exchange.benchmark - - - - jar-with-dependencies - - - - - make-assembly - package - - single - - - - - - - - - central - https://repo1.maven.org/maven2/ - - false - - - true - - - - clojars - https://repo.clojars.org/ - - true - - - true - - - - - - - - - org.clojure - clojure - 1.11.2 - - - org.clojars.jj - ring-http-exchange - 1.2.0 - - - metosin - jsonista - 0.3.13 - - - - - robaho - - false - - - - io.github.robaho - httpserver - 1.0.23 - - - - - diff --git a/frameworks/Clojure/ring-http-exchange/project.clj b/frameworks/Clojure/ring-http-exchange/project.clj new file mode 100644 index 00000000000..de2033a7550 --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/project.clj @@ -0,0 +1,21 @@ +(defproject ring-http-server "1.0.0" + :description "ring benchmark" + :url "" + :license {:name "EPL-2.0" + :url "https://www.eclipse.org/legal/epl-2.0/"} + + :dependencies [[org.clojure/clojure "1.12.3"] + [org.clojure/tools.logging "1.3.0"] + [org.clojars.jj/ring-http-exchange "1.2.4"] + [seancorfield/next.jdbc "1.2.659"] + [org.clojars.jj/majavat "1.12.1"] + [hikari-cp "3.3.0"] + [org.postgresql/postgresql "42.7.8"] + [metosin/jsonista "0.3.13"] + ] + + :profiles {:robaho {:dependencies [[io.github.robaho/httpserver "1.0.28"]]}} + :resource-paths ["resources"] + :main ring-http-exchange.benchmark + + ) diff --git a/frameworks/Clojure/ring-http-exchange/resources/fortune.html b/frameworks/Clojure/ring-http-exchange/resources/fortune.html new file mode 100644 index 00000000000..3f4dd2fca9e --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/resources/fortune.html @@ -0,0 +1,15 @@ + + +Fortunes + + + + {% for message in messages %} + + + + + {% endfor %} +
      idmessage
      {{message.id}}{{message.message}}
      + + \ No newline at end of file diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile index f2aed8bf3d7..1d9e25ecef6 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile @@ -1,12 +1,13 @@ -FROM maven:3-eclipse-temurin-24-alpine as maven +FROM clojure:lein as lein WORKDIR /ring-http-exchange -COPY pom.xml pom.xml +COPY project.clj project.clj +COPY resources resources COPY src src -RUN mvn clean clojure:compile package +RUN lein uberjar FROM ghcr.io/graalvm/graalvm-community:24 WORKDIR /ring-http-exchange -COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar +COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar EXPOSE 8080 diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile index 1783b1878eb..1362b411aed 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile @@ -1,12 +1,13 @@ -FROM maven:3-eclipse-temurin-24-alpine as maven +FROM clojure:lein as lein WORKDIR /ring-http-exchange -COPY pom.xml pom.xml +COPY project.clj project.clj +COPY resources resources COPY src src -RUN mvn clean clojure:compile -P robaho package +RUN lein with-profile robaho uberjar FROM ghcr.io/graalvm/graalvm-community:24 WORKDIR /ring-http-exchange -COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar +COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar EXPOSE 8080 diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile index 55be60f11f4..e31848de2e6 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile @@ -1,12 +1,13 @@ -FROM maven:3-eclipse-temurin-24-alpine as maven +FROM clojure:lein as lein WORKDIR /ring-http-exchange -COPY pom.xml pom.xml +COPY project.clj project.clj +COPY resources resources COPY src src -RUN mvn clean clojure:compile -P robaho package +RUN lein with-profile robaho uberjar FROM openjdk:25-jdk-slim WORKDIR /ring-http-exchange -COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar +COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar EXPOSE 8080 diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile index fe3b450b87a..b558aa938cf 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile @@ -1,12 +1,13 @@ -FROM maven:3-eclipse-temurin-24-alpine as maven +FROM clojure:lein as lein WORKDIR /ring-http-exchange -COPY pom.xml pom.xml +COPY project.clj project.clj +COPY resources resources COPY src src -RUN mvn clean clojure:compile package +RUN lein uberjar FROM openjdk:25-jdk-slim WORKDIR /ring-http-exchange -COPY --from=maven /ring-http-exchange/target/ring-http-server-1.0.0-jar-with-dependencies.jar app.jar +COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar EXPOSE 8080 diff --git a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj index 1f7c448e279..95341069bc2 100644 --- a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj +++ b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj @@ -1,29 +1,59 @@ (ns ring-http-exchange.benchmark - (:gen-class) - (:require [jsonista.core :as json] - [ring-http-exchange.core :as server]) - (:import - (java.util.concurrent Executors))) + (:gen-class) + (:require + [jsonista.core :as json] + [jj.majavat :as majavat] + [jj.majavat.renderer :refer [->InputStreamRenderer]] + [jj.majavat.renderer.sanitizer :refer [->Html]] + [ring-http-exchange.core :as server] + [next.jdbc :as jdbc] + [next.jdbc.connection :as connection]) + (:import + (com.zaxxer.hikari HikariDataSource) + (java.util.concurrent Executors))) +(def db-spec + {:jdbcUrl "jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass"}) + +(def datasource + (connection/->pool HikariDataSource db-spec)) + +(defn query-fortunes [] + (jdbc/execute! datasource + ["SELECT * FROM \"Fortune\""] + {:builder-fn next.jdbc.result-set/as-unqualified-lower-maps})) + +(def ^:private ^:const additional-message {:id 0 + :message "Additional fortune added at request time."}) +(def ^:private ^:const fortune-headers {"Server" "ring-http-exchange" + "Content-Type" "text/html; charset=UTF-8"}) (def ^:private ^:const json-headers {"Server" "ring-http-exchange" "Content-Type" "application/json"}) -(def ^:private ^:const plaintext-response - {:status 200 - :headers { - "Server" "ring-http-exchange" - "Content-Type" "text/plain"} - :body "Hello, World!"}) +(def ^:private ^:const plaintext-response {:status 200 + :headers {"Server" "ring-http-exchange" + "Content-Type" "text/plain"} + :body "Hello, World!"}) +(def ^:private render-fortune (majavat/build-renderer "fortune.html" + {:renderer (->InputStreamRenderer + {:sanitizer (->Html)})})) (defn -main - [& args] - (println "Starting server on port 8080") - (server/run-http-server - (fn [req] - (case (req :uri) - "/json" {:status 200 - :headers json-headers - :body (json/write-value-as-bytes {:message "Hello, World!"})} - plaintext-response)) - {:port 8080 - :host "0.0.0.0" - :executor (Executors/newVirtualThreadPerTaskExecutor)})) + [& _] + (println "Starting server on port 8080") + (server/run-http-server + (fn [req] + (case (req :uri) + "/json" {:status 200 + :headers json-headers + :body (json/write-value-as-bytes {:message "Hello, World!"})} + "/fortunes" (let [input (as-> (query-fortunes) fortunes + (conj fortunes additional-message) + (sort-by :message fortunes)) + body (render-fortune {:messages input})] + {:status 200 + :headers fortune-headers + :body body}) + plaintext-response)) + {:port 8080 + :host "0.0.0.0" + :executor (Executors/newVirtualThreadPerTaskExecutor)})) \ No newline at end of file From f343eb645cd4b52f4eb600504f0a4f4849c28451 Mon Sep 17 00:00:00 2001 From: Sylvain PHILIP Date: Wed, 15 Oct 2025 01:20:42 +0200 Subject: [PATCH 1667/1766] Add Piko framework (#10160) * Add the Piko framework benchmark test * Changing the display name of piko-postgres test --- frameworks/PHP/piko/.gitignore | 1 + frameworks/PHP/piko/README.md | 39 + frameworks/PHP/piko/benchmark_config.json | 54 + frameworks/PHP/piko/composer.json | 16 + frameworks/PHP/piko/config/app.php | 28 + frameworks/PHP/piko/config/routes.php | 17 + frameworks/PHP/piko/deploy/conf/php-fpm.conf | 551 +++++ frameworks/PHP/piko/deploy/conf/php.ini | 1916 +++++++++++++++++ frameworks/PHP/piko/deploy/nginx.conf | 64 + frameworks/PHP/piko/modules/site/Module.php | 6 + .../site/controllers/DatabaseController.php | 123 ++ .../site/controllers/DefaultController.php | 30 + .../PHP/piko/modules/site/layouts/main.php | 17 + .../PHP/piko/modules/site/models/Fortune.php | 18 + .../PHP/piko/modules/site/models/World.php | 20 + .../modules/site/views/database/fortunes.php | 15 + frameworks/PHP/piko/piko-postgres.dockerfile | 28 + frameworks/PHP/piko/piko.dockerfile | 25 + frameworks/PHP/piko/www/index.php | 8 + 19 files changed, 2976 insertions(+) create mode 100644 frameworks/PHP/piko/.gitignore create mode 100755 frameworks/PHP/piko/README.md create mode 100755 frameworks/PHP/piko/benchmark_config.json create mode 100644 frameworks/PHP/piko/composer.json create mode 100644 frameworks/PHP/piko/config/app.php create mode 100644 frameworks/PHP/piko/config/routes.php create mode 100644 frameworks/PHP/piko/deploy/conf/php-fpm.conf create mode 100644 frameworks/PHP/piko/deploy/conf/php.ini create mode 100644 frameworks/PHP/piko/deploy/nginx.conf create mode 100644 frameworks/PHP/piko/modules/site/Module.php create mode 100644 frameworks/PHP/piko/modules/site/controllers/DatabaseController.php create mode 100644 frameworks/PHP/piko/modules/site/controllers/DefaultController.php create mode 100644 frameworks/PHP/piko/modules/site/layouts/main.php create mode 100644 frameworks/PHP/piko/modules/site/models/Fortune.php create mode 100644 frameworks/PHP/piko/modules/site/models/World.php create mode 100644 frameworks/PHP/piko/modules/site/views/database/fortunes.php create mode 100644 frameworks/PHP/piko/piko-postgres.dockerfile create mode 100644 frameworks/PHP/piko/piko.dockerfile create mode 100644 frameworks/PHP/piko/www/index.php diff --git a/frameworks/PHP/piko/.gitignore b/frameworks/PHP/piko/.gitignore new file mode 100644 index 00000000000..136e525b7af --- /dev/null +++ b/frameworks/PHP/piko/.gitignore @@ -0,0 +1 @@ +.phpactor.json diff --git a/frameworks/PHP/piko/README.md b/frameworks/PHP/piko/README.md new file mode 100755 index 00000000000..29e61d13324 --- /dev/null +++ b/frameworks/PHP/piko/README.md @@ -0,0 +1,39 @@ +# Piko Benchmarking Test + +### Test Type Implementation Source Code + +* [JSON](modules/site/controllers/DefaultController.php) +* [PLAINTEXT](modules/site/controllers/DefaultController.php) +* [DB](modules/site/controllers/DatabaseController.php) +* [QUERY](modules/site/controllers/DatabaseController.php) +* [UPDATE](modules/site/controllers/DatabaseController.php) +* [FORTUNES](modules/site/controllers/DatabaseController.php) + +## Important Libraries +The tests were run with: +* [Piko](https://piko-framework.github.io/) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/query?queries= + +### UPDATE + +http://localhost:8080/update?queries= + +### FORTUNES + +http://localhost:8080/fortunes diff --git a/frameworks/PHP/piko/benchmark_config.json b/frameworks/PHP/piko/benchmark_config.json new file mode 100755 index 00000000000..2b945ad8f60 --- /dev/null +++ b/frameworks/PHP/piko/benchmark_config.json @@ -0,0 +1,54 @@ +{ + "framework": "piko", + "tests": [ + { + "default": { + "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": "mysql", + "framework": "Piko", + "language": "PHP", + "flavor": "None", + "orm": "Micro", + "platform": "None", + "webserver": "nginx", + "os": "Linux", + "database_os": "Linux", + "display_name": "Piko Mysql", + "notes": "", + "versus": "None" + }, + "postgres": { + "dockerfile": "piko-postgres.dockerfile", + "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": "Piko", + "language": "PHP", + "flavor": "None", + "orm": "Micro", + "platform": "None", + "webserver": "nginx", + "os": "Linux", + "database_os": "Linux", + "display_name": "Piko Postgres", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/PHP/piko/composer.json b/frameworks/PHP/piko/composer.json new file mode 100644 index 00000000000..e1eaadc660d --- /dev/null +++ b/frameworks/PHP/piko/composer.json @@ -0,0 +1,16 @@ +{ + "name": "piko/project-benchmark", + "description": "Application to be tested on the FrameworkBenchmarks.", + "type": "project", + "license": "MIT", + "require": { + "php": ">=8.0", + "piko/framework": "^3.4", + "piko/db-record": "^2.2" + }, + "autoload": { + "psr-4": { + "app\\": "" + } + } +} diff --git a/frameworks/PHP/piko/config/app.php b/frameworks/PHP/piko/config/app.php new file mode 100644 index 00000000000..67b6f9b1d6d --- /dev/null +++ b/frameworks/PHP/piko/config/app.php @@ -0,0 +1,28 @@ + realpath(__DIR__ . '/../'), + 'defaultLayoutPath' => '@app/modules/site/layouts', + 'defaultLayout' => 'main', + 'language' => 'en', + 'components' => [ + 'Piko\View' => [], + 'Piko\Router' => [ + 'construct' => [ + [ + 'routes' => require __DIR__ . '/routes.php', + ] + ] + ], + 'PDO' => [ + 'construct' => [ + (getenv('DATABASE_DRIVER') ? getenv('DATABASE_DRIVER') : 'mysql') . ':host=tfb-database;dbname=hello_world', + 'benchmarkdbuser', + 'benchmarkdbpass' + ] + ], + ], + 'modules' => [ + 'site' => 'app\modules\site\Module' + ] +]; diff --git a/frameworks/PHP/piko/config/routes.php b/frameworks/PHP/piko/config/routes.php new file mode 100644 index 00000000000..b4fdc8d785b --- /dev/null +++ b/frameworks/PHP/piko/config/routes.php @@ -0,0 +1,17 @@ + 'site/default/plaintext', + '/json' => 'site/default/json', + '/db' => 'site/database/query', + '/queries' => 'site/database/queries', + '/fortunes' => 'site/database/fortunes', + '/updates' => 'site/database/updates', +]; diff --git a/frameworks/PHP/piko/deploy/conf/php-fpm.conf b/frameworks/PHP/piko/deploy/conf/php-fpm.conf new file mode 100644 index 00000000000..a90976aca61 --- /dev/null +++ b/frameworks/PHP/piko/deploy/conf/php-fpm.conf @@ -0,0 +1,551 @@ +;;;;;;;;;;;;;;;;;;;;; +; FPM Configuration ; +;;;;;;;;;;;;;;;;;;;;; + +; All relative paths in this configuration file are relative to PHP's install +; prefix (/usr). This prefix can be dynamically changed by using the +; '-p' argument from the command line. + +;;;;;;;;;;;;;;;;;; +; Global Options ; +;;;;;;;;;;;;;;;;;; + +[global] +; Pid file +; Note: the default prefix is /var +; Default Value: none +pid = /run/php/php-fpm.pid + +; Error log file +; If it's set to "syslog", log is sent to syslogd instead of being written +; into a local file. +; Note: the default prefix is /var +; Default Value: log/php-fpm.log +error_log = /dev/stderr + + +; syslog_facility is used to specify what type of program is logging the +; message. This lets syslogd specify that messages from different facilities +; will be handled differently. +; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON) +; Default Value: daemon +;syslog.facility = daemon + +; syslog_ident is prepended to every message. If you have multiple FPM +; instances running on the same server, you can change the default value +; which must suit common needs. +; Default Value: php-fpm +;syslog.ident = php-fpm + +; Log level +; Possible Values: alert, error, warning, notice, debug +; Default Value: notice +;log_level = notice + +; If this number of child processes exit with SIGSEGV or SIGBUS within the time +; interval set by emergency_restart_interval then FPM will restart. A value +; of '0' means 'Off'. +; Default Value: 0 +;emergency_restart_threshold = 0 + +; Interval of time used by emergency_restart_interval to determine when +; a graceful restart will be initiated. This can be useful to work around +; accidental corruptions in an accelerator's shared memory. +; Available Units: s(econds), m(inutes), h(ours), or d(ays) +; Default Unit: seconds +; Default Value: 0 +;emergency_restart_interval = 0 + +; Time limit for child processes to wait for a reaction on signals from master. +; Available units: s(econds), m(inutes), h(ours), or d(ays) +; Default Unit: seconds +; Default Value: 0 +;process_control_timeout = 0 + +; The maximum number of processes FPM will fork. This has been designed to control +; the global number of processes when using dynamic PM within a lot of pools. +; Use it with caution. +; Note: A value of 0 indicates no limit +; Default Value: 0 +; process.max = 128 + +; Specify the nice(2) priority to apply to the master process (only if set) +; The value can vary from -19 (highest priority) to 20 (lowest priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool process will inherit the master process priority +; unless specified otherwise +; Default Value: no set +; process.priority = -19 + +; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging. +; Default Value: yes +;daemonize = yes + +; Set open file descriptor rlimit for the master process. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit for the master process. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Specify the event mechanism FPM will use. The following is available: +; - select (any POSIX os) +; - poll (any POSIX os) +; - epoll (linux >= 2.5.44) +; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0) +; - /dev/poll (Solaris >= 7) +; - port (Solaris >= 10) +; Default Value: not set (auto detection) +;events.mechanism = epoll + +; When FPM is built with systemd integration, specify the interval, +; in seconds, between health report notification to systemd. +; Set to 0 to disable. +; Available Units: s(econds), m(inutes), h(ours) +; Default Unit: seconds +; Default value: 10 +systemd_interval = 0 + +;;;;;;;;;;;;;;;;;;;; +; Pool Definitions ; +;;;;;;;;;;;;;;;;;;;; + +; Multiple pools of child processes may be started with different listening +; ports and different management options. The name of the pool will be +; used in logs and stats. There is no limitation on the number of pools which +; FPM can handle. Your system will tell you anyway :) + +; Include one or more files. If glob(3) exists, it is used to include a bunch of +; files from a glob(3) pattern. This directive can be used everywhere in the +; file. +; Relative path can also be used. They will be prefixed by: +; - the global prefix if it's been set (-p argument) +; - /usr otherwise +;include=/etc/php/7.3/fpm/pool.d/*.conf + +; Start a new pool named 'www'. +; the variable $pool can be used in any directive and will be replaced by the +; pool name ('www' here) +[www] + +; Per pool prefix +; It only applies on the following directives: +; - 'access.log' +; - 'slowlog' +; - 'listen' (unixsocket) +; - 'chroot' +; - 'chdir' +; - 'php_values' +; - 'php_admin_values' +; When not set, the global prefix (or /usr) applies instead. +; Note: This directive can also be relative to the global prefix. +; Default Value: none +;prefix = /path/to/pools/$pool + +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = www-data +group = www-data + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +listen = /run/php/php-fpm.sock + +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +listen.backlog = 65535 + +; Set permissions for unix socket, if one is used. In Linux, read/write +; permissions must be set in order to allow connections from a web server. Many +; BSD-derived systems allow connections regardless of permissions. +; Default Values: user and group are set as the running user +; mode is set to 0660 +listen.owner = www-data +listen.group = www-data +;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. +; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original +; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address +; must be separated by a comma. If this value is left blank, connections will be +; accepted from any ip address. +; Default Value: any +;listen.allowed_clients = 127.0.0.1 + +; Specify the nice(2) priority to apply to the pool processes (only if set) +; The value can vary from -19 (highest priority) to 20 (lower priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool processes will inherit the master process priority +; unless it specified otherwise +; Default Value: no set +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = static + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +pm.max_children = 1024 + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 +pm.start_servers = 512 + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.min_spare_servers = 50 + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.max_spare_servers = 512 + +; The number of seconds after which an idle process will be killed. +; Note: Used only when pm is set to 'ondemand' +; Default Value: 10s +;pm.process_idle_timeout = 10s; + +; The number of requests each child process should execute before respawning. +; This can be useful to work around memory leaks in 3rd party libraries. For +; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. +; Default Value: 0 +;pm.max_requests = 500 + +; The URI to view the FPM status page. If this value is not set, no URI will be +; recognized as a status page. It shows the following informations: +; pool - the name of the pool; +; process manager - static, dynamic or ondemand; +; start time - the date and time FPM has started; +; start since - number of seconds since FPM has started; +; accepted conn - the number of request accepted by the pool; +; listen queue - the number of request in the queue of pending +; connections (see backlog in listen(2)); +; max listen queue - the maximum number of requests in the queue +; of pending connections since FPM has started; +; listen queue len - the size of the socket queue of pending connections; +; idle processes - the number of idle processes; +; active processes - the number of active processes; +; total processes - the number of idle + active processes; +; max active processes - the maximum number of active processes since FPM +; has started; +; max children reached - number of times, the process limit has been reached, +; when pm tries to start more children (works only for +; pm 'dynamic' and 'ondemand'); +; Value are updated in real time. +; Example output: +; pool: www +; process manager: static +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 62636 +; accepted conn: 190460 +; listen queue: 0 +; max listen queue: 1 +; listen queue len: 42 +; idle processes: 4 +; active processes: 11 +; total processes: 15 +; max active processes: 12 +; max children reached: 0 +; +; By default the status page output is formatted as text/plain. Passing either +; 'html', 'xml' or 'json' in the query string will return the corresponding +; output syntax. Example: +; http://www.foo.bar/status +; http://www.foo.bar/status?json +; http://www.foo.bar/status?html +; http://www.foo.bar/status?xml +; +; By default the status page only outputs short status. Passing 'full' in the +; query string will also return status for each pool process. +; Example: +; http://www.foo.bar/status?full +; http://www.foo.bar/status?json&full +; http://www.foo.bar/status?html&full +; http://www.foo.bar/status?xml&full +; The Full status returns for each process: +; pid - the PID of the process; +; state - the state of the process (Idle, Running, ...); +; start time - the date and time the process has started; +; start since - the number of seconds since the process has started; +; requests - the number of requests the process has served; +; request duration - the duration in µs of the requests; +; request method - the request method (GET, POST, ...); +; request URI - the request URI with the query string; +; content length - the content length of the request (only with POST); +; user - the user (PHP_AUTH_USER) (or '-' if not set); +; script - the main script called (or '-' if not set); +; last request cpu - the %cpu the last request consumed +; it's always 0 if the process is not in Idle state +; because CPU calculation is done when the request +; processing has terminated; +; last request memory - the max amount of memory the last request consumed +; it's always 0 if the process is not in Idle state +; because memory calculation is done when the request +; processing has terminated; +; If the process is in Idle state, then informations are related to the +; last request the process has served. Otherwise informations are related to +; the current request being served. +; Example output: +; ************************ +; pid: 31330 +; state: Running +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 63087 +; requests: 12808 +; request duration: 1250261 +; request method: GET +; request URI: /test_mem.php?N=10000 +; content length: 0 +; user: - +; script: /home/fat/web/docs/php/test_mem.php +; last request cpu: 0.00 +; last request memory: 0 +; +; Note: There is a real-time FPM status monitoring sample web page available +; It's available in: /usr/share/php/7.3/fpm/status.html +; +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;pm.status_path = /status + +; The ping URI to call the monitoring page of FPM. If this value is not set, no +; URI will be recognized as a ping page. This could be used to test from outside +; that FPM is alive and responding, or to +; - create a graph of FPM availability (rrd or such); +; - remove a server from a group if it is not responding (load balancing); +; - trigger alerts for the operating team (24/7). +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;ping.path = /ping + +; This directive may be used to customize the response of a ping request. The +; response is formatted as text/plain with a 200 response code. +; Default Value: pong +;ping.response = pong + +; The access log file +; Default: not set +;access.log = log/$pool.access.log + +; The access log format. +; The following syntax is allowed +; %%: the '%' character +; %C: %CPU used by the request +; it can accept the following format: +; - %{user}C for user CPU only +; - %{system}C for system CPU only +; - %{total}C for user + system CPU (default) +; %d: time taken to serve the request +; it can accept the following format: +; - %{seconds}d (default) +; - %{miliseconds}d +; - %{mili}d +; - %{microseconds}d +; - %{micro}d +; %e: an environment variable (same as $_ENV or $_SERVER) +; it must be associated with embraces to specify the name of the env +; variable. Some exemples: +; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e +; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e +; %f: script filename +; %l: content-length of the request (for POST request only) +; %m: request method +; %M: peak of memory allocated by PHP +; it can accept the following format: +; - %{bytes}M (default) +; - %{kilobytes}M +; - %{kilo}M +; - %{megabytes}M +; - %{mega}M +; %n: pool name +; %o: output header +; it must be associated with embraces to specify the name of the header: +; - %{Content-Type}o +; - %{X-Powered-By}o +; - %{Transfert-Encoding}o +; - .... +; %p: PID of the child that serviced the request +; %P: PID of the parent of the child that serviced the request +; %q: the query string +; %Q: the '?' character if query string exists +; %r: the request URI (without the query string, see %q and %Q) +; %R: remote IP address +; %s: status (response code) +; %t: server time the request was received +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %T: time the log has been written (the request has finished) +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %u: remote user +; +; Default: "%R - %u %t \"%m %r\" %s" +;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" + +; The log file for slow requests +; Default Value: not set +; Note: slowlog is mandatory if request_slowlog_timeout is set +;slowlog = log/$pool.log.slow + +; The timeout for serving a single request after which a PHP backtrace will be +; dumped to the 'slowlog' file. A value of '0s' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_slowlog_timeout = 0 + +; Depth of slow log stack trace. +; Default Value: 20 +;request_slowlog_trace_depth = 20 + +; The timeout for serving a single request after which the worker process will +; be killed. This option should be used when the 'max_execution_time' ini option +; does not stop script execution for some reason. A value of '0' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_terminate_timeout = 0 + +; Set open file descriptor rlimit. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Chroot to this directory at the start. This value must be defined as an +; absolute path. When this value is not set, chroot is not used. +; Note: you can prefix with '$prefix' to chroot to the pool prefix or one +; of its subdirectories. If the pool prefix is not set, the global prefix +; will be used instead. +; Note: chrooting is a great security feature and should be used whenever +; possible. However, all PHP paths will be relative to the chroot +; (error_log, sessions.save_path, ...). +; Default Value: not set +;chroot = + +; Chdir to this directory at the start. +; Note: relative path can be used. +; Default Value: current directory or / when chroot +;chdir = /var/www + +; Redirect worker stdout and stderr into main error log. If not set, stdout and +; stderr will be redirected to /dev/null according to FastCGI specs. +; Note: on highloaded environement, this can cause some delay in the page +; process time (several ms). +; Default Value: no +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no + +; Limits the extensions of the main script FPM will allow to parse. This can +; prevent configuration mistakes on the web server side. You should only limit +; FPM to .php extensions to prevent malicious users to use other extensions to +; execute php code. +; Note: set an empty value to allow all extensions. +; Default Value: .php +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + +; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from +; the current environment. +; Default Value: clean env +;env[HOSTNAME] = $HOSTNAME +;env[PATH] = /usr/local/bin:/usr/bin:/bin +;env[TMP] = /tmp +;env[TMPDIR] = /tmp +;env[TEMP] = /tmp +env[DATABASE_DRIVER] = $DATABASE_DRIVER + +; Additional php.ini defines, specific to this pool of workers. These settings +; overwrite the values previously defined in the php.ini. The directives are the +; same as the PHP SAPI: +; php_value/php_flag - you can set classic ini defines which can +; be overwritten from PHP call 'ini_set'. +; php_admin_value/php_admin_flag - these directives won't be overwritten by +; PHP call 'ini_set' +; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. + +; Defining 'extension' will load the corresponding shared extension from +; extension_dir. Defining 'disable_functions' or 'disable_classes' will not +; overwrite previously defined php.ini values, but will append the new value +; instead. + +; Note: path INI options can be relative and will be expanded with the prefix +; (pool, global or /usr) + +; Default Value: nothing is defined by default except the values in php.ini and +; specified at startup with the -d argument +;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com +;php_flag[display_errors] = off +;php_admin_value[error_log] = /var/log/fpm-php.www.log +;php_admin_flag[log_errors] = on +;php_admin_value[memory_limit] = 32M diff --git a/frameworks/PHP/piko/deploy/conf/php.ini b/frameworks/PHP/piko/deploy/conf/php.ini new file mode 100644 index 00000000000..9fa04df9edf --- /dev/null +++ b/frameworks/PHP/piko/deploy/conf/php.ini @@ -0,0 +1,1916 @@ +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; PHP's initialization file, generally called php.ini, is responsible for +; configuring many of the aspects of PHP's behavior. + +; PHP attempts to find and load this configuration from a number of locations. +; The following is a summary of its search order: +; 1. SAPI module specific location. +; 2. The PHPRC environment variable. (As of PHP 5.2.0) +; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) +; 4. Current working directory (except CLI) +; 5. The web server's directory (for SAPI modules), or directory of PHP +; (otherwise in Windows) +; 6. The directory from the --with-config-file-path compile time option, or the +; Windows directory (C:\windows or C:\winnt) +; See the PHP docs for more specific information. +; http://php.net/configuration.file + +; The syntax of the file is extremely simple. Whitespace and lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. + +; Directives following the section heading [PATH=/www/mysite] only +; apply to PHP files in the /www/mysite directory. Directives +; following the section heading [HOST=www.example.com] only apply to +; PHP files served from www.example.com. Directives set in these +; special sections cannot be overridden by user-defined INI files or +; at runtime. Currently, [PATH=] and [HOST=] sections only work under +; CGI/FastCGI. +; http://php.net/ini.sections + +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; Directives are variables used to configure PHP or PHP extensions. +; There is no name validation. If PHP can't find an expected +; directive because it is not set or is mistyped, a default value will be used. + +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a +; previously set variable or directive (e.g. ${foo}) + +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; ^ bitwise XOR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT + +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. + +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: + +; foo = ; sets foo to an empty string +; foo = None ; sets foo to an empty string +; foo = "None" ; sets foo to the string 'None' + +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. + +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; PHP comes packaged with two INI files. One that is recommended to be used +; in production environments and one that is recommended to be used in +; development environments. + +; php.ini-production contains settings which hold security, performance and +; best practices at its core. But please be aware, these settings may break +; compatibility with older or less security conscience applications. We +; recommending using the production ini in production and testing environments. + +; php.ini-development is very similar to its production variant, except it is +; much more verbose when it comes to errors. We recommend using the +; development version only in development environments, as errors shown to +; application users can inadvertently leak otherwise secure information. + +; This is php.ini-production INI file. + +;;;;;;;;;;;;;;;;;;; +; Quick Reference ; +;;;;;;;;;;;;;;;;;;; +; The following are all the settings which are different in either the production +; or development versions of the INIs with respect to PHP's default behavior. +; Please see the actual settings later in the document for more details as to why +; we recommend these changes in PHP's behavior. + +; display_errors +; Default Value: On +; Development Value: On +; Production Value: Off + +; display_startup_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; error_reporting +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT + +; html_errors +; Default Value: On +; Development Value: On +; Production value: On + +; log_errors +; Default Value: Off +; Development Value: On +; Production Value: On + +; max_input_time +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) + +; output_buffering +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 + +; register_argc_argv +; Default Value: On +; Development Value: Off +; Production Value: Off + +; request_order +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" + +; session.gc_divisor +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 + +; session.sid_bits_per_character +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 + +; short_open_tag +; Default Value: On +; Development Value: Off +; Production Value: Off + +; track_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; variables_order +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS" + +;;;;;;;;;;;;;;;;;;;; +; php.ini Options ; +;;;;;;;;;;;;;;;;;;;; +; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" +;user_ini.filename = ".user.ini" + +; To disable this feature set this option to empty value +;user_ini.filename = + +; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) +;user_ini.cache_ttl = 300 + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +; http://php.net/engine +engine = On + +; This directive determines whether or not PHP will recognize code between +; tags as PHP source which should be processed as such. It is +; generally recommended that should be used and that this feature +; should be disabled, as enabling it may result in issues when generating XML +; documents, however this remains supported for backward compatibility reasons. +; Note that this directive does not control the would work. +; http://php.net/syntax-highlighting +;highlight.string = #DD0000 +;highlight.comment = #FF9900 +;highlight.keyword = #007700 +;highlight.default = #0000BB +;highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long requests, which may end up +; being interrupted by the user or a browser timing out. PHP's default behavior +; is to disable this feature. +; http://php.net/ignore-user-abort +;ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; http://php.net/realpath-cache-size +realpath_cache_size = 4096k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; http://php.net/realpath-cache-ttl +realpath_cache_ttl = 600 + +; Enables or disables the circular reference collector. +; http://php.net/zend.enable-gc +zend.enable_gc = On + +; If enabled, scripts may be written in encodings that are incompatible with +; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such +; encodings. To use this feature, mbstring extension must be enabled. +; Default: Off +;zend.multibyte = Off + +; Allows to set the default encoding for the scripts. This value will be used +; unless "declare(encoding=...)" directive appears at the top of the script. +; Only affects if zend.multibyte is set. +; Default: "" +;zend.script_encoding = + +;;;;;;;;;;;;;;;;; +; Miscellaneous ; +;;;;;;;;;;;;;;;;; + +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +; http://php.net/expose-php +expose_php = Off + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +; Maximum execution time of each script, in seconds +; http://php.net/max-execution-time +; Note: This directive is hardcoded to 0 for the CLI SAPI +max_execution_time = 30 + +; Maximum amount of time each script may spend parsing request data. It's a good +; idea to limit this time on productions servers in order to eliminate unexpectedly +; long running scripts. +; Note: This directive is hardcoded to -1 for the CLI SAPI +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) +; http://php.net/max-input-time +max_input_time = 60 + +; Maximum input variable nesting level +; http://php.net/max-input-nesting-level +;max_input_nesting_level = 64 + +; How many GET/POST/COOKIE input variables may be accepted +; max_input_vars = 1000 + +; Maximum amount of memory a script may consume (128MB) +; http://php.net/memory-limit +memory_limit = 128M + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; This directive informs PHP of which errors, warnings and notices you would like +; it to take action for. The recommended way of setting values for this +; directive is through the use of the error level constants and bitwise +; operators. The error level constants are below here for convenience as well as +; some common settings and their meanings. +; By default, PHP is set to take action on all errors, notices and warnings EXCEPT +; those related to E_NOTICE and E_STRICT, which together cover best practices and +; recommended coding standards in PHP. For performance reasons, this is the +; recommend error reporting setting. Your production server shouldn't be wasting +; resources complaining about best practices and coding standards. That's what +; development servers and development settings are for. +; Note: The php.ini-development file has this setting as E_ALL. This +; means it pretty much reports everything which is exactly what you want during +; development and early testing. +; +; Error Level Constants: +; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) +; E_ERROR - fatal run-time errors +; E_RECOVERABLE_ERROR - almost fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it is automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; E_DEPRECATED - warn about code that will not work in future versions +; of PHP +; E_USER_DEPRECATED - user-generated deprecation warnings +; +; Common Values: +; E_ALL (Show all errors, warnings and notices including coding standards.) +; E_ALL & ~E_NOTICE (Show all errors, except for notices) +; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) +; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT +; http://php.net/error-reporting +error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT + +; This directive controls whether or not and where PHP will output errors, +; notices and warnings too. Error output is very useful during development, but +; it could be very dangerous in production environments. Depending on the code +; which is triggering the error, sensitive information could potentially leak +; out of your application such as database usernames and passwords or worse. +; For production environments, we recommend logging errors rather than +; sending them to STDOUT. +; Possible Values: +; Off = Do not display any errors +; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout = Display errors to STDOUT +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/display-errors +display_errors = Off + +; The display of errors which occur during PHP's startup sequence are handled +; separately from display_errors. PHP's default behavior is to suppress those +; errors from clients. Turning the display of startup errors on can be useful in +; debugging configuration problems. We strongly recommend you +; set this to 'off' for production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/display-startup-errors +display_startup_errors = Off + +; Besides displaying errors, PHP can also log errors to locations such as a +; server-specific log, STDERR, or a location specified by the error_log +; directive found below. While errors should not be displayed on productions +; servers they should still be monitored and logging is a great way to do that. +; Default Value: Off +; Development Value: On +; Production Value: On +; http://php.net/log-errors +log_errors = On + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +; http://php.net/log-errors-max-len +log_errors_max_len = 1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line unless ignore_repeated_source is set true. +; http://php.net/ignore-repeated-errors +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; source lines. +; http://php.net/ignore-repeated-source +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +; http://php.net/report-memleaks +report_memleaks = On + +; This setting is on by default. +;report_zend_debug = 0 + +; Store the last error/warning message in $php_errormsg (boolean). Setting this value +; to On can assist in debugging and is appropriate for development servers. It should +; however be disabled on production servers. +; This directive is DEPRECATED. +; Default Value: Off +; Development Value: Off +; Production Value: Off +; http://php.net/track-errors +;track_errors = Off + +; Turn off normal error reporting and emit XML-RPC error XML +; http://php.net/xmlrpc-errors +;xmlrpc_errors = 0 + +; An XML-RPC faultCode +;xmlrpc_error_number = 0 + +; When PHP displays or logs an error, it has the capability of formatting the +; error message as HTML for easier reading. This directive controls whether +; the error message is formatted as HTML or not. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: On +; Development Value: On +; Production value: On +; http://php.net/html-errors +html_errors = On + +; If html_errors is set to On *and* docref_root is not empty, then PHP +; produces clickable error messages that direct to a page describing the error +; or function causing the error in detail. +; You can download a copy of the PHP manual from http://php.net/docs +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. PHP's default behavior is to leave these settings empty, in which +; case no links to documentation are generated. +; Note: Never use this feature for production boxes. +; http://php.net/docref-root +; Examples +;docref_root = "/phpmanual/" + +; http://php.net/docref-ext +;docref_ext = .html + +; String to output before an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-prepend-string +; Example: +;error_prepend_string = "" + +; String to output after an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-append-string +; Example: +;error_append_string = "" + +; Log errors to specified file. PHP's default behavior is to leave this value +; empty. +; http://php.net/error-log +; Example: +;error_log = php_errors.log +; Log errors to syslog (Event Log on Windows). +;error_log = syslog + +;windows.show_crt_warning +; Default value: 0 +; Development value: 0 +; Production value: 0 + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; + +; The separator used in PHP generated URLs to separate arguments. +; PHP's default setting is "&". +; http://php.net/arg-separator.output +; Example: +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; PHP's default setting is "&". +; NOTE: Every character in this directive is considered as separator! +; http://php.net/arg-separator.input +; Example: +;arg_separator.input = ";&" + +; This directive determines which super global arrays are registered when PHP +; starts up. G,P,C,E & S are abbreviations for the following respective super +; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty +; paid for the registration of these arrays and because ENV is not as commonly +; used as the others, ENV is not recommended on productions servers. You +; can still get access to the environment variables through getenv() should you +; need to. +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS"; +; http://php.net/variables-order +variables_order = "GPCS" + +; This directive determines which super global data (G,P & C) should be +; registered into the super global array REQUEST. If so, it also determines +; the order in which that data is registered. The values for this directive +; are specified in the same manner as the variables_order directive, +; EXCEPT one. Leaving this value empty will cause PHP to use the value set +; in the variables_order directive. It does not mean it will leave the super +; globals array REQUEST empty. +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" +; http://php.net/request-order +request_order = "GP" + +; This directive determines whether PHP registers $argv & $argc each time it +; runs. $argv contains an array of all the arguments passed to PHP when a script +; is invoked. $argc contains an integer representing the number of arguments +; that were passed when the script was invoked. These arrays are extremely +; useful when running scripts from the command line. When this directive is +; enabled, registering these variables consumes CPU cycles and memory each time +; a script is executed. For performance reasons, this feature should be disabled +; on production servers. +; Note: This directive is hardcoded to On for the CLI SAPI +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/register-argc-argv +register_argc_argv = Off + +; When enabled, the ENV, REQUEST and SERVER variables are created when they're +; first used (Just In Time) instead of when the script starts. If these +; variables are not used within a script, having this directive on will result +; in a performance gain. The PHP directive register_argc_argv must be disabled +; for this directive to have any affect. +; http://php.net/auto-globals-jit +auto_globals_jit = On + +; Whether PHP will read the POST data. +; This option is enabled by default. +; Most likely, you won't want to disable this option globally. It causes $_POST +; and $_FILES to always be empty; the only way you will be able to read the +; POST data will be through the php://input stream wrapper. This can be useful +; to proxy requests or to process the POST data in a memory efficient fashion. +; http://php.net/enable-post-data-reading +;enable_post_data_reading = Off + +; Maximum size of POST data that PHP will accept. +; Its value may be 0 to disable the limit. It is ignored if POST data reading +; is disabled through enable_post_data_reading. +; http://php.net/post-max-size +post_max_size = 8M + +; Automatically add files before PHP document. +; http://php.net/auto-prepend-file +auto_prepend_file = + +; Automatically add files after PHP document. +; http://php.net/auto-append-file +auto_append_file = + +; By default, PHP will output a media type using the Content-Type header. To +; disable this, simply set it to be empty. +; +; PHP's built-in default media type is set to text/html. +; http://php.net/default-mimetype +default_mimetype = "text/html" + +; PHP's default character set is set to UTF-8. +; http://php.net/default-charset +default_charset = "UTF-8" + +; PHP internal character encoding is set to empty. +; If empty, default_charset is used. +; http://php.net/internal-encoding +;internal_encoding = + +; PHP input character encoding is set to empty. +; If empty, default_charset is used. +; http://php.net/input-encoding +;input_encoding = + +; PHP output character encoding is set to empty. +; If empty, default_charset is used. +; See also output_buffer. +; http://php.net/output-encoding +;output_encoding = + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = ".:/usr/share/php" +; +; Windows: "\path1;\path2" +;include_path = ".;c:\php\includes" +; +; PHP's default setting for include_path is ".;/path/to/php/pear" +; http://php.net/include-path + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +; http://php.net/doc-root +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +; http://php.net/user-dir +user_dir = + +; Directory in which the loadable extensions (modules) reside. +; http://php.net/extension-dir +; extension_dir = "./" +; On windows: +; extension_dir = "ext" + +; Directory where the temporary files should be placed. +; Defaults to the system default (see sys_get_temp_dir) +; sys_temp_dir = "/tmp" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +; http://php.net/enable-dl +enable_dl = Off + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; http://php.net/cgi.force-redirect +;cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. PHP's default behavior is to disable this feature. +;cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; http://php.net/cgi.redirect-status-env +;cgi.redirect_status_env = + +; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's +; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok +; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting +; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting +; of zero causes PHP to behave as before. Default is 1. You should fix your scripts +; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. +; http://php.net/cgi.fix-pathinfo + cgi.fix_pathinfo=0 + +; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside +; of the web tree and people will not be able to circumvent .htaccess security. +; http://php.net/cgi.dicard-path +;cgi.discard_path=1 + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; http://php.net/fastcgi.impersonate +;fastcgi.impersonate = 1 + +; Disable logging through FastCGI connection. PHP's default behavior is to enable +; this feature. +;fastcgi.logging = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If set to 0, PHP sends Status: header that +; is supported by Apache. When this option is set to 1, PHP will send +; RFC2616 compliant header. +; Default is zero. +; http://php.net/cgi.rfc2616-headers +;cgi.rfc2616_headers = 0 + +; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! +; (shebang) at the top of the running script. This line might be needed if the +; script support running both as stand-alone script and via PHP CGI<. PHP in CGI +; mode skips this line and ignores its content if this directive is turned on. +; http://php.net/cgi.check-shebang-line +;cgi.check_shebang_line=1 + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +; http://php.net/file-uploads +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +; http://php.net/upload-tmp-dir +;upload_tmp_dir = + +; Maximum allowed size for uploaded files. +; http://php.net/upload-max-filesize +upload_max_filesize = 2M + +; Maximum number of files that can be uploaded via a single request +max_file_uploads = 20 + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-fopen +allow_url_fopen = On + +; Whether to allow include/require to open URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-include +allow_url_include = Off + +; Define the anonymous ftp password (your email address). PHP's default setting +; for this is empty. +; http://php.net/from +;from="john@doe.com" + +; Define the User-Agent string. PHP's default setting for this is empty. +; http://php.net/user-agent +;user_agent="PHP" + +; Default timeout for socket based streams (seconds) +; http://php.net/default-socket-timeout +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; http://php.net/auto-detect-line-endings +;auto_detect_line_endings = Off + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; + +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename +; +; For example: +; +; extension=mysqli +; +; When the extension library to load is not located in the default extension +; directory, You may specify an absolute path to the library file: +; +; extension=/path/to/extension/mysqli.so +; +; Note : The syntax used in previous PHP versions ('extension=.so' and +; 'extension='php_.dll') is supported for legacy reasons and may be +; deprecated in a future PHP major version. So, when it is possible, please +; move to the new ('extension=) syntax. +; +; Notes for Windows environments : +; +; - ODBC support is built in, so no dll is needed for it. +; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) +; extension folders as well as the separate PECL DLL download (PHP 5+). +; Be sure to appropriately set the extension_dir directive. +; +;extension=bz2 +;extension=curl +;extension=fileinfo +;extension=gd2 +;extension=gettext +;extension=gmp +;extension=intl +;extension=imap +;extension=interbase +;extension=ldap +;extension=mbstring +;extension=exif ; Must be after mbstring as it depends on it +;extension=mysqli +;extension=oci8_12c ; Use with Oracle Database 12c Instant Client +;extension=openssl +;extension=pdo_firebird +;extension=pdo_mysql +;extension=pdo_oci +;extension=pdo_odbc +;extension=pdo_pgsql +;extension=pdo_sqlite +;extension=pgsql +;extension=shmop + +; The MIBS data available in the PHP distribution must be installed. +; See http://www.php.net/manual/en/snmp.installation.php +;extension=snmp + +;extension=soap +;extension=sockets +;extension=sqlite3 +;extension=tidy +;extension=xmlrpc +;extension=xsl + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[CLI Server] +; Whether the CLI web server uses ANSI color coding in its terminal output. +cli_server.color = On + +[Date] +; Defines the default timezone used by the date functions +; http://php.net/date.timezone +date.timezone = UTC + +; http://php.net/date.default-latitude +;date.default_latitude = 31.7667 + +; http://php.net/date.default-longitude +;date.default_longitude = 35.2333 + +; http://php.net/date.sunrise-zenith +;date.sunrise_zenith = 90.583333 + +; http://php.net/date.sunset-zenith +;date.sunset_zenith = 90.583333 + +[filter] +; http://php.net/filter.default +;filter.default = unsafe_raw + +; http://php.net/filter.default-flags +;filter.default_flags = + +[iconv] +; Use of this INI entry is deprecated, use global input_encoding instead. +; If empty, default_charset or input_encoding or iconv.input_encoding is used. +; The precedence is: default_charset < intput_encoding < iconv.input_encoding +;iconv.input_encoding = + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;iconv.internal_encoding = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; If empty, default_charset or output_encoding or iconv.output_encoding is used. +; The precedence is: default_charset < output_encoding < iconv.output_encoding +; To use an output encoding conversion, iconv's output handler must be set +; otherwise output encoding conversion cannot be performed. +;iconv.output_encoding = + +[intl] +;intl.default_locale = +; This directive allows you to produce PHP errors when some error +; happens within intl functions. The value is the level of the error produced. +; Default is 0, which does not produce any errors. +;intl.error_level = E_WARNING +;intl.use_exceptions = 0 + +[sqlite3] +;sqlite3.extension_dir = + +[Pcre] +;PCRE library backtracking limit. +; http://php.net/pcre.backtrack-limit +;pcre.backtrack_limit=100000 + +;PCRE library recursion limit. +;Please note that if you set this value to a high number you may consume all +;the available process stack and eventually crash PHP (due to reaching the +;stack size limit imposed by the Operating System). +; http://php.net/pcre.recursion-limit +;pcre.recursion_limit=100000 + +;Enables or disables JIT compilation of patterns. This requires the PCRE +;library to be compiled with JIT support. +;pcre.jit=1 + +[Pdo] +; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" +; http://php.net/pdo-odbc.connection-pooling +;pdo_odbc.connection_pooling=strict + +;pdo_odbc.db2_instance_name + +[Pdo_mysql] +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/pdo_mysql.cache_size +pdo_mysql.cache_size = 2000 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/pdo_mysql.default-socket +pdo_mysql.default_socket= + +[Phar] +; http://php.net/phar.readonly +;phar.readonly = On + +; http://php.net/phar.require-hash +;phar.require_hash = On + +;phar.cache_list = + +[mail function] +; For Win32 only. +; http://php.net/smtp +SMTP = localhost +; http://php.net/smtp-port +smtp_port = 25 + +; For Win32 only. +; http://php.net/sendmail-from +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +; http://php.net/sendmail-path +;sendmail_path = + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(). +;mail.force_extra_parameters = + +; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename +mail.add_x_header = On + +; The path to a log file that will log all mail() calls. Log entries include +; the full path of the script, line number, To address and headers. +;mail.log = +; Log mail to syslog (Event Log on Windows). +;mail.log = syslog + +[ODBC] +; http://php.net/odbc.default-db +;odbc.default_db = Not yet implemented + +; http://php.net/odbc.default-user +;odbc.default_user = Not yet implemented + +; http://php.net/odbc.default-pw +;odbc.default_pw = Not yet implemented + +; Controls the ODBC cursor model. +; Default: SQL_CURSOR_STATIC (default). +;odbc.default_cursortype + +; Allow or prevent persistent links. +; http://php.net/odbc.allow-persistent +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +; http://php.net/odbc.check-persistent +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/odbc.max-persistent +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/odbc.max-links +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +; http://php.net/odbc.defaultlrl +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of odbc.defaultlrl and odbc.defaultbinmode +; http://php.net/odbc.defaultbinmode +odbc.defaultbinmode = 1 + +;birdstep.max_links = -1 + +[Interbase] +; Allow or prevent persistent links. +ibase.allow_persistent = 1 + +; Maximum number of persistent links. -1 means no limit. +ibase.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ibase.max_links = -1 + +; Default database name for ibase_connect(). +;ibase.default_db = + +; Default username for ibase_connect(). +;ibase.default_user = + +; Default password for ibase_connect(). +;ibase.default_password = + +; Default charset for ibase_connect(). +;ibase.default_charset = + +; Default timestamp format. +ibase.timestampformat = "%Y-%m-%d %H:%M:%S" + +; Default date format. +ibase.dateformat = "%Y-%m-%d" + +; Default time format. +ibase.timeformat = "%H:%M:%S" + +[MySQLi] + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/mysqli.max-persistent +mysqli.max_persistent = -1 + +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; http://php.net/mysqli.allow_local_infile +;mysqli.allow_local_infile = On + +; Allow or prevent persistent links. +; http://php.net/mysqli.allow-persistent +mysqli.allow_persistent = On + +; Maximum number of links. -1 means no limit. +; http://php.net/mysqli.max-links +mysqli.max_links = -1 + +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/mysqli.cache_size +mysqli.cache_size = 2000 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +; http://php.net/mysqli.default-port +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/mysqli.default-socket +mysqli.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-host +mysqli.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-user +mysqli.default_user = + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; http://php.net/mysqli.default-pw +mysqli.default_pw = + +; Allow or prevent reconnect +mysqli.reconnect = Off + +[mysqlnd] +; Enable / Disable collection of general statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_statistics +mysqlnd.collect_statistics = Off + +; Enable / Disable collection of memory usage statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_memory_statistics +mysqlnd.collect_memory_statistics = Off + +; Records communication from all extensions using mysqlnd to the specified log +; file. +; http://php.net/mysqlnd.debug +;mysqlnd.debug = + +; Defines which queries will be logged. +; http://php.net/mysqlnd.log_mask +;mysqlnd.log_mask = 0 + +; Default size of the mysqlnd memory pool, which is used by result sets. +; http://php.net/mysqlnd.mempool_default_size +;mysqlnd.mempool_default_size = 16000 + +; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. +; http://php.net/mysqlnd.net_cmd_buffer_size +;mysqlnd.net_cmd_buffer_size = 2048 + +; Size of a pre-allocated buffer used for reading data sent by the server in +; bytes. +; http://php.net/mysqlnd.net_read_buffer_size +;mysqlnd.net_read_buffer_size = 32768 + +; Timeout for network requests in seconds. +; http://php.net/mysqlnd.net_read_timeout +;mysqlnd.net_read_timeout = 31536000 + +; SHA-256 Authentication Plugin related. File with the MySQL server public RSA +; key. +; http://php.net/mysqlnd.sha256_server_public_key +;mysqlnd.sha256_server_public_key = + +[OCI8] + +; Connection: Enables privileged connections using external +; credentials (OCI_SYSOPER, OCI_SYSDBA) +; http://php.net/oci8.privileged-connect +;oci8.privileged_connect = Off + +; Connection: The maximum number of persistent OCI8 connections per +; process. Using -1 means no limit. +; http://php.net/oci8.max-persistent +;oci8.max_persistent = -1 + +; Connection: The maximum number of seconds a process is allowed to +; maintain an idle persistent connection. Using -1 means idle +; persistent connections will be maintained forever. +; http://php.net/oci8.persistent-timeout +;oci8.persistent_timeout = -1 + +; Connection: The number of seconds that must pass before issuing a +; ping during oci_pconnect() to check the connection validity. When +; set to 0, each oci_pconnect() will cause a ping. Using -1 disables +; pings completely. +; http://php.net/oci8.ping-interval +;oci8.ping_interval = 60 + +; Connection: Set this to a user chosen connection class to be used +; for all pooled server requests with Oracle 11g Database Resident +; Connection Pooling (DRCP). To use DRCP, this value should be set to +; the same string for all web servers running the same application, +; the database pool must be configured, and the connection string must +; specify to use a pooled server. +;oci8.connection_class = + +; High Availability: Using On lets PHP receive Fast Application +; Notification (FAN) events generated when a database node fails. The +; database must also be configured to post FAN events. +;oci8.events = Off + +; Tuning: This option enables statement caching, and specifies how +; many statements to cache. Using 0 disables statement caching. +; http://php.net/oci8.statement-cache-size +;oci8.statement_cache_size = 20 + +; Tuning: Enables statement prefetching and sets the default number of +; rows that will be fetched automatically after statement execution. +; http://php.net/oci8.default-prefetch +;oci8.default_prefetch = 100 + +; Compatibility. Using On means oci_close() will not close +; oci_connect() and oci_new_connect() connections. +; http://php.net/oci8.old-oci-close-semantics +;oci8.old_oci_close_semantics = Off + +[PostgreSQL] +; Allow or prevent persistent links. +; http://php.net/pgsql.allow-persistent +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +; http://php.net/pgsql.auto-reset-persistent +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/pgsql.max-persistent +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +; http://php.net/pgsql.max-links +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +; http://php.net/pgsql.ignore-notice +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Notice message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +; http://php.net/pgsql.log-notice +pgsql.log_notice = 0 + +[bcmath] +; Number of decimal digits for all bcmath functions. +; http://php.net/bcmath.scale +bcmath.scale = 0 + +[browscap] +; http://php.net/browscap +;browscap = extra/browscap.ini + +[Session] +; Handler used to store/retrieve data. +; http://php.net/session.save-handler +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; The path can be defined as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if +; your OS has problems with many files in one directory, and is +; a more efficient layout for servers that handle many sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +; http://php.net/session.save-path +;session.save_path = "/var/lib/php/sessions" + +; Whether to use strict session mode. +; Strict session mode does not accept uninitialized session ID and regenerate +; session ID if browser sends uninitialized session ID. Strict mode protects +; applications from session fixation via session adoption vulnerability. It is +; disabled by default for maximum compatibility, but enabling it is encouraged. +; https://wiki.php.net/rfc/strict_sessions +session.use_strict_mode = 0 + +; Whether to use cookies. +; http://php.net/session.use-cookies +session.use_cookies = 1 + +; http://php.net/session.cookie-secure +;session.cookie_secure = + +; This option forces PHP to fetch and use a cookie for storing and maintaining +; the session id. We encourage this operation as it's very helpful in combating +; session hijacking when not specifying and managing your own session id. It is +; not the be-all and end-all of session hijacking defense, but it's a good start. +; http://php.net/session.use-only-cookies +session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +; http://php.net/session.name +session.name = PHPSESSID + +; Initialize session on request startup. +; http://php.net/session.auto-start +session.auto_start = 0 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +; http://php.net/session.cookie-lifetime +session.cookie_lifetime = 0 + +; The path for which the cookie is valid. +; http://php.net/session.cookie-path +session.cookie_path = / + +; The domain for which the cookie is valid. +; http://php.net/session.cookie-domain +session.cookie_domain = + +; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. +; http://php.net/session.cookie-httponly +session.cookie_httponly = + +; Handler used to serialize data. php is the standard serializer of PHP. +; http://php.net/session.serialize-handler +session.serialize_handler = php + +; Defines the probability that the 'garbage collection' process is started +; on every session initialization. The probability is calculated by using +; gc_probability/gc_divisor. Where session.gc_probability is the numerator +; and gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.gc-probability +session.gc_probability = 0 + +; Defines the probability that the 'garbage collection' process is started on every +; session initialization. The probability is calculated by using the following equation: +; gc_probability/gc_divisor. Where session.gc_probability is the numerator and +; session.gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. Increasing this value to 1000 will give you +; a 0.1% chance the gc will run on any give request. For high volume production servers, +; this is a more efficient approach. +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 +; http://php.net/session.gc-divisor +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +; http://php.net/session.gc-maxlifetime +session.gc_maxlifetime = 1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; find /path/to/sessions -cmin +24 -type f | xargs rm + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +; http://php.net/session.referer-check +session.referer_check = + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +; http://php.net/session.cache-limiter +session.cache_limiter = nocache + +; Document expires after n minutes. +; http://php.net/session.cache-expire +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users' security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publicly accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +; http://php.net/session.use-trans-sid +session.use_trans_sid = 0 + +; Set session ID character length. This value could be between 22 to 256. +; Shorter length than default is supported only for compatibility reason. +; Users should use 32 or more chars. +; http://php.net/session.sid-length +; Default Value: 32 +; Development Value: 26 +; Production Value: 26 +session.sid_length = 26 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; is special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. tag's action attribute URL will not be modified +; unless it is specified. +; Note that all valid entries require a "=", even if no value follows. +; Default Value: "a=href,area=href,frame=src,form=" +; Development Value: "a=href,area=href,frame=src,form=" +; Production Value: "a=href,area=href,frame=src,form=" +; http://php.net/url-rewriter.tags +session.trans_sid_tags = "a=href,area=href,frame=src,form=" + +; URL rewriter does not rewrite absolute URLs by default. +; To enable rewrites for absolute pathes, target hosts must be specified +; at RUNTIME. i.e. use ini_set() +; tags is special. PHP will check action attribute's URL regardless +; of session.trans_sid_tags setting. +; If no host is defined, HTTP_HOST will be used for allowed host. +; Example value: php.net,www.php.net,wiki.php.net +; Use "," for multiple hosts. No spaces are allowed. +; Default Value: "" +; Development Value: "" +; Production Value: "" +;session.trans_sid_hosts="" + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; Possible values: +; 4 (4 bits: 0-9, a-f) +; 5 (5 bits: 0-9, a-v) +; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 +; http://php.net/session.hash-bits-per-character +session.sid_bits_per_character = 5 + +; Enable upload progress tracking in $_SESSION +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.enabled +;session.upload_progress.enabled = On + +; Cleanup the progress information as soon as all POST data has been read +; (i.e. upload completed). +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.cleanup +;session.upload_progress.cleanup = On + +; A prefix used for the upload progress key in $_SESSION +; Default Value: "upload_progress_" +; Development Value: "upload_progress_" +; Production Value: "upload_progress_" +; http://php.net/session.upload-progress.prefix +;session.upload_progress.prefix = "upload_progress_" + +; The index name (concatenated with the prefix) in $_SESSION +; containing the upload progress information +; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" +; http://php.net/session.upload-progress.name +;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" + +; How frequently the upload progress should be updated. +; Given either in percentages (per-file), or in bytes +; Default Value: "1%" +; Development Value: "1%" +; Production Value: "1%" +; http://php.net/session.upload-progress.freq +;session.upload_progress.freq = "1%" + +; The minimum delay between updates, in seconds +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.upload-progress.min-freq +;session.upload_progress.min_freq = "1" + +; Only write session data when session data is changed. Enabled by default. +; http://php.net/session.lazy-write +;session.lazy_write = On + +[Assertion] +; Switch whether to compile assertions at all (to have no overhead at run-time) +; -1: Do not compile at all +; 0: Jump over assertion at run-time +; 1: Execute assertions +; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) +; Default Value: 1 +; Development Value: 1 +; Production Value: -1 +; http://php.net/zend.assertions +zend.assertions = -1 + +; Assert(expr); active by default. +; http://php.net/assert.active +;assert.active = On + +; Throw an AssertationException on failed assertions +; http://php.net/assert.exception +;assert.exception = On + +; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) +; http://php.net/assert.warning +;assert.warning = On + +; Don't bail out by default. +; http://php.net/assert.bail +;assert.bail = Off + +; User-function to be called if an assertion fails. +; http://php.net/assert.callback +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +; http://php.net/assert.quiet-eval +;assert.quiet_eval = 0 + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +; http://php.net/com.typelib-file +;com.typelib_file = + +; allow Distributed-COM calls +; http://php.net/com.allow-dcom +;com.allow_dcom = true + +; autoregister constants of a components typlib on com_load() +; http://php.net/com.autoregister-typelib +;com.autoregister_typelib = true + +; register constants casesensitive +; http://php.net/com.autoregister-casesensitive +;com.autoregister_casesensitive = false + +; show warnings on duplicate constant registrations +; http://php.net/com.autoregister-verbose +;com.autoregister_verbose = true + +; The default character set code-page to use when passing strings to and from COM objects. +; Default: system ANSI code page +;com.code_page= + +[mbstring] +; language for internal character representation. +; This affects mb_send_mail() and mbstring.detect_order. +; http://php.net/mbstring.language +;mbstring.language = Japanese + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; internal/script encoding. +; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;mbstring.internal_encoding = + +; Use of this INI entry is deprecated, use global input_encoding instead. +; http input encoding. +; mbstring.encoding_traslation = On is needed to use this setting. +; If empty, default_charset or input_encoding or mbstring.input is used. +; The precedence is: default_charset < intput_encoding < mbsting.http_input +; http://php.net/mbstring.http-input +;mbstring.http_input = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; http output encoding. +; mb_output_handler must be registered as output buffer to function. +; If empty, default_charset or output_encoding or mbstring.http_output is used. +; The precedence is: default_charset < output_encoding < mbstring.http_output +; To use an output encoding conversion, mbstring's output handler must be set +; otherwise output encoding conversion cannot be performed. +; http://php.net/mbstring.http-output +;mbstring.http_output = + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +; http://php.net/mbstring.encoding-translation +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; "auto" detect order is changed according to mbstring.language +; http://php.net/mbstring.detect-order +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +; http://php.net/mbstring.substitute-character +;mbstring.substitute_character = none + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +; http://php.net/mbstring.func-overload +;mbstring.func_overload = 0 + +; enable strict encoding detection. +; Default: Off +;mbstring.strict_detection = On + +; This directive specifies the regex pattern of content types for which mb_output_handler() +; is activated. +; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) +;mbstring.http_output_conv_mimetype= + +[gd] +; Tell the jpeg decode to ignore warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +; http://php.net/gd.jpeg-ignore-warning +;gd.jpeg_ignore_warning = 1 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +; http://php.net/exif.encode-unicode +;exif.encode_unicode = ISO-8859-15 + +; http://php.net/exif.decode-unicode-motorola +;exif.decode_unicode_motorola = UCS-2BE + +; http://php.net/exif.decode-unicode-intel +;exif.decode_unicode_intel = UCS-2LE + +; http://php.net/exif.encode-jis +;exif.encode_jis = + +; http://php.net/exif.decode-jis-motorola +;exif.decode_jis_motorola = JIS + +; http://php.net/exif.decode-jis-intel +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +; http://php.net/tidy.default-config +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +; http://php.net/tidy.clean-output +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +; http://php.net/soap.wsdl-cache-enabled +soap.wsdl_cache_enabled=1 + +; Sets the directory name where SOAP extension will put cache files. +; http://php.net/soap.wsdl-cache-dir +soap.wsdl_cache_dir="/tmp" + +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +; http://php.net/soap.wsdl-cache-ttl +soap.wsdl_cache_ttl=86400 + +; Sets the size of the cache limit. (Max. number of WSDL files to cache) +soap.wsdl_cache_limit = 5 + +[sysvshm] +; A default size of the shared memory segment +;sysvshm.init_mem = 10000 + +[ldap] +; Sets the maximum number of open links or -1 for unlimited. +ldap.max_links = -1 + +[dba] +;dba.default_handler= + +[opcache] +; Determines if Zend OPCache is enabled +opcache.enable=1 + +opcache.jit_buffer_size = 128M + +; Determines if Zend OPCache is enabled for the CLI version of PHP +;opcache.enable_cli=0 + +; The OPcache shared memory storage size. +;opcache.memory_consumption=128 + +; The amount of memory for interned strings in Mbytes. +;opcache.interned_strings_buffer=8 + +; The maximum number of keys (scripts) in the OPcache hash table. +; Only numbers between 200 and 1000000 are allowed. +;opcache.max_accelerated_files=10000 + +; The maximum percentage of "wasted" memory until a restart is scheduled. +;opcache.max_wasted_percentage=5 + +; When this directive is enabled, the OPcache appends the current working +; directory to the script key, thus eliminating possible collisions between +; files with the same name (basename). Disabling the directive improves +; performance, but may break existing applications. +;opcache.use_cwd=1 + +; When disabled, you must reset the OPcache manually or restart the +; webserver for changes to the filesystem to take effect. +opcache.validate_timestamps=0 + +; How often (in seconds) to check file timestamps for changes to the shared +; memory storage allocation. ("1" means validate once per second, but only +; once per request. "0" means always validate) +;opcache.revalidate_freq=2 + +; Enables or disables file search in include_path optimization +;opcache.revalidate_path=0 + +; If disabled, all PHPDoc comments are dropped from the code to reduce the +; size of the optimized code. +opcache.save_comments=0 + +; Allow file existence override (file_exists, etc.) performance feature. +opcache.enable_file_override=1 + +; A bitmask, where each bit enables or disables the appropriate OPcache +; passes +;opcache.optimization_level=0xffffffff + +;opcache.inherited_hack=1 +;opcache.dups_fix=0 + +; The location of the OPcache blacklist file (wildcards allowed). +; Each OPcache blacklist file is a text file that holds the names of files +; that should not be accelerated. The file format is to add each filename +; to a new line. The filename may be a full path or just a file prefix +; (i.e., /var/www/x blacklists all the files and directories in /var/www +; that start with 'x'). Line starting with a ; are ignored (comments). +;opcache.blacklist_filename= + +; Allows exclusion of large files from being cached. By default all files +; are cached. +;opcache.max_file_size=0 + +; Check the cache checksum each N requests. +; The default value of "0" means that the checks are disabled. +;opcache.consistency_checks=0 + +; How long to wait (in seconds) for a scheduled restart to begin if the cache +; is not being accessed. +;opcache.force_restart_timeout=180 + +; OPcache error_log file name. Empty string assumes "stderr". +;opcache.error_log= + +; All OPcache errors go to the Web server log. +; By default, only fatal errors (level 0) or errors (level 1) are logged. +; You can also enable warnings (level 2), info messages (level 3) or +; debug messages (level 4). +;opcache.log_verbosity_level=1 + +; Preferred Shared Memory back-end. Leave empty and let the system decide. +;opcache.preferred_memory_model= + +; Protect the shared memory from unexpected writing during script execution. +; Useful for internal debugging only. +;opcache.protect_memory=0 + +; Allows calling OPcache API functions only from PHP scripts which path is +; started from specified string. The default "" means no restriction +;opcache.restrict_api= + +; Mapping base of shared memory segments (for Windows only). All the PHP +; processes have to map shared memory into the same address space. This +; directive allows to manually fix the "Unable to reattach to base address" +; errors. +;opcache.mmap_base= + +; Enables and sets the second level cache directory. +; It should improve performance when SHM memory is full, at server restart or +; SHM reset. The default "" disables file based caching. +;opcache.file_cache= + +; Enables or disables opcode caching in shared memory. +;opcache.file_cache_only=0 + +; Enables or disables checksum validation when script loaded from file cache. +;opcache.file_cache_consistency_checks=1 + +; Implies opcache.file_cache_only=1 for a certain process that failed to +; reattach to the shared memory (for Windows only). Explicitly enabled file +; cache is required. +;opcache.file_cache_fallback=1 + +; Enables or disables copying of PHP code (text segment) into HUGE PAGES. +; This should improve performance, but requires appropriate OS configuration. +opcache.huge_code_pages=1 + +; Validate cached file permissions. +;opcache.validate_permission=0 + +; Prevent name collisions in chroot'ed environment. +;opcache.validate_root=0 + +[curl] +; A default value for the CURLOPT_CAINFO option. This is required to be an +; absolute path. +;curl.cainfo = + +[openssl] +; The location of a Certificate Authority (CA) file on the local filesystem +; to use when verifying the identity of SSL/TLS peers. Most users should +; not specify a value for this directive as PHP will attempt to use the +; OS-managed cert stores in its absence. If specified, this value may still +; be overridden on a per-stream basis via the "cafile" SSL stream context +; option. +;openssl.cafile= + +; If openssl.cafile is not specified or if the CA file is not found, the +; directory pointed to by openssl.capath is searched for a suitable +; certificate. This value must be a correctly hashed certificate directory. +; Most users should not specify a value for this directive as PHP will +; attempt to use the OS-managed cert stores in its absence. If specified, +; this value may still be overridden on a per-stream basis via the "capath" +; SSL stream context option. +;openssl.capath= + +; Local Variables: +; tab-width: 4 +; End: diff --git a/frameworks/PHP/piko/deploy/nginx.conf b/frameworks/PHP/piko/deploy/nginx.conf new file mode 100644 index 00000000000..9914073e1c9 --- /dev/null +++ b/frameworks/PHP/piko/deploy/nginx.conf @@ -0,0 +1,64 @@ +user www-data; +worker_processes auto; +daemon off; +events { + worker_connections 16384; + multi_accept off; + +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log off; + server_tokens off; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + keepalive_disable none; + keepalive_requests 10000; + + #the bench don't use any static file + #open_file_cache max=2000 inactive=20s; + #open_file_cache_valid 60s; + #open_file_cache_min_uses 5; + #open_file_cache_errors off; + + #FastCGI optimizations + fastcgi_buffers 256 16k; + fastcgi_buffer_size 128k; + fastcgi_connect_timeout 30s; + fastcgi_send_timeout 60s; + fastcgi_read_timeout 60s; + fastcgi_busy_buffers_size 256k; + fastcgi_temp_file_write_size 256k; + reset_timedout_connection on; + server_names_hash_bucket_size 100; + + + upstream fastcgi_backend { + server unix:/var/run/php/php-fpm.sock; + keepalive 40; + } + + server { + listen 8080; + server_name tfb-server; + + root /piko/www; + index index.php; + + location / { + try_files $uri $uri/ /index.php$is_args$args; + } + + location /index.php { + fastcgi_pass fastcgi_backend; + fastcgi_keep_conn on; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include /etc/nginx/fastcgi_params; + } + } +} diff --git a/frameworks/PHP/piko/modules/site/Module.php b/frameworks/PHP/piko/modules/site/Module.php new file mode 100644 index 00000000000..a583457066c --- /dev/null +++ b/frameworks/PHP/piko/modules/site/Module.php @@ -0,0 +1,6 @@ +db); + $id = mt_rand(1, 10000); + $world->load($id); + + return $this->jsonResponse($world->toArray()); + } + + /** + * Return as Json response a set of random records form the World table + * + * @param string $queries The number of queries requested to fetch records + * + * @return ResponseInterface + */ + public function queriesAction(string $queries = ''): ResponseInterface + { + // Bound and sanitize $queries parameter + $queries = is_numeric($queries) ? (int) $queries : 1; + + if ($queries < 1) { + $queries = 1; + } elseif ($queries > 500) { + $queries = 500; + } + + $rows = []; + $world = new World($this->db); + + while ($queries) { + $id = mt_rand(1, 10000); + $rows[] = $world->load($id)->toArray(); + $queries--; + } + + return $this->jsonResponse($rows); + } + + /** + * Retrieves, sorts, and renders the list of fortunes. + * + * Fetches all fortunes from the database, adds an additional fortune at request time, + * sorts the list of fortunes by message text, and renders the result using the "fortunes" view. + * + * @return string The rendered Fortune page + */ + public function fortunesAction(): string + { + $st = $this->db->prepare('SELECT * FROM fortune'); + $st->execute(); + $rows = $st->fetchAll(PDO::FETCH_CLASS, Fortune::class, [$this->db]); + + // Add a new record without saving it in the db + $fortune = new Fortune($this->db); + $fortune->message = 'Additional fortune added at request time.'; + $rows[] = $fortune; + + // Sort messages + usort($rows, function($a, $b) { + return strcmp($a->message, $b->message); + }); + + return $this->render('fortunes', [ + 'fortunes' => $rows + ]); + } + + /** + * Updates a set of random records in the World table and returns them as a Json response. + * + * Fetches the specified number of World records, + * assigns each a new randomNumber, saves, and returns the modified records. + * + * @param string $queries The number of records to update and return + * + * @return ResponseInterface + */ + public function updatesAction(string $queries = ''): ResponseInterface + { + // Bound and sanitize $queries parameter + $queries = is_numeric($queries) ? (int) $queries : 1; + + if ($queries < 1) { + $queries = 1; + } elseif ($queries > 500) { + $queries = 500; + } + + $rows = []; + $world = new World($this->db); + + while ($queries) { + $id = mt_rand(1, 10000); + $world = $world->load($id); + $world->randomnumber = mt_rand(1, 10000); + $world->save(); + $rows[] = $world->toArray(); + $queries--; + } + + return $this->jsonResponse($rows); + } +} diff --git a/frameworks/PHP/piko/modules/site/controllers/DefaultController.php b/frameworks/PHP/piko/modules/site/controllers/DefaultController.php new file mode 100644 index 00000000000..4b9cfd9a51d --- /dev/null +++ b/frameworks/PHP/piko/modules/site/controllers/DefaultController.php @@ -0,0 +1,30 @@ +createStream('Hello, World!'); + + return $this->response->withHeader('Content-Type', 'text/plain; charset=UTF-8')->withBody($body); + } + + /** + * Return a json response with a Hello, World! message + * + * @return ResponseInterface + */ + public function jsonAction(): ResponseInterface + { + return $this->jsonResponse(['message' => 'Hello, World!']); + } +} diff --git a/frameworks/PHP/piko/modules/site/layouts/main.php b/frameworks/PHP/piko/modules/site/layouts/main.php new file mode 100644 index 00000000000..2fc30f17bbd --- /dev/null +++ b/frameworks/PHP/piko/modules/site/layouts/main.php @@ -0,0 +1,17 @@ + + + + + + <?= $this->escape($this->title) ?> + head() ?> + + + + + diff --git a/frameworks/PHP/piko/modules/site/models/Fortune.php b/frameworks/PHP/piko/modules/site/models/Fortune.php new file mode 100644 index 00000000000..ca85714ad10 --- /dev/null +++ b/frameworks/PHP/piko/modules/site/models/Fortune.php @@ -0,0 +1,18 @@ + $fortunes + */ + + $this->title = 'Fortunes'; +?> + + + + + + +
      idmessage
      id ?>escape((string) $fortune->message) ?>
      diff --git a/frameworks/PHP/piko/piko-postgres.dockerfile b/frameworks/PHP/piko/piko-postgres.dockerfile new file mode 100644 index 00000000000..6f9b970d864 --- /dev/null +++ b/frameworks/PHP/piko/piko-postgres.dockerfile @@ -0,0 +1,28 @@ +FROM ubuntu:24.04 + +ENV DATABASE_DRIVER pgsql + +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.4-fpm php8.4-pgsql > /dev/null + +COPY deploy/conf/* /etc/php/8.4/fpm/ + +WORKDIR /piko +COPY --link . . + +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.4/fpm/php-fpm.conf ; fi; + +RUN chmod -R 777 /piko + +EXPOSE 8080 + +CMD set -e; \ + /usr/sbin/nginx -c /piko/deploy/nginx.conf 2>&1 > /dev/stderr & \ + exec /usr/sbin/php-fpm8.4 --nodaemonize --fpm-config /etc/php/8.4/fpm/php-fpm.conf diff --git a/frameworks/PHP/piko/piko.dockerfile b/frameworks/PHP/piko/piko.dockerfile new file mode 100644 index 00000000000..e525d2b64d7 --- /dev/null +++ b/frameworks/PHP/piko/piko.dockerfile @@ -0,0 +1,25 @@ +FROM ubuntu:24.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.4-fpm php8.4-mysql > /dev/null + +COPY deploy/conf/* /etc/php/8.4/fpm/ + +WORKDIR /piko +COPY --link . . + +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.4/fpm/php-fpm.conf ; fi; + +RUN chmod -R 777 /piko + +EXPOSE 8080 + +CMD service php8.4-fpm start && \ + nginx -c /piko/deploy/nginx.conf 2>&1 > /dev/stderr diff --git a/frameworks/PHP/piko/www/index.php b/frameworks/PHP/piko/www/index.php new file mode 100644 index 00000000000..4aac7d862ef --- /dev/null +++ b/frameworks/PHP/piko/www/index.php @@ -0,0 +1,8 @@ +run(); From 7953522f80b5baf199c2dd2a61bc520b11f0ff0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Wed, 15 Oct 2025 07:22:50 +0800 Subject: [PATCH 1668/1766] Refact(touchsocket): Upgrade framework and dependent versions (#10171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 重构(project): 升级框架和依赖版本 升级目标框架至 net9.0,更新 TouchSocket 和 Hosting 相关依赖版本 调整 Program.cs 中变量声明为隐式类型,优化 Web API 配置方式 移除调试模式下的 Swagger 和浏览器启动功能 更新 Dockerfile 基础镜像至 .NET 9.0 * New (Project Configuration): Add TouchSocketHttp31 and TouchSocketWebAni31 Add TouchSocketHttp31 and TouchSocketWebAni31 projects to the solution -Update Benchmarks.sln to support new projects and upgrade VS version to 18 -Add new configuration items to benchmark∝json and config. toml -Add Dockerfiles for TouchSocketHttp31 and TouchSocketWebApp i31 -TouchSocketHttp project adds HTTP service program, supporting/plaintext and/json routing -TouchSocketWebApi project adds Web API service program, supporting/plaintext and/json routing -Add the configuration files' appsets.json 'and' appsettings. Development. json ' -The target frameworks for TouchSocketHttp31 and TouchSocketWebApp i31 projects are NET 8.0 -Add NuGet. Config to specify the unique package source as the official source of VNet * fix(touchsocket):build error * fix(touchsocket):build error x2 * update(touchsocket):nuget version to 4.0.0-beta.120 --- frameworks/CSharp/touchsocket/Benchmarks.sln | 16 ++- .../CSharp/touchsocket/benchmark_config.json | 41 +++++++- frameworks/CSharp/touchsocket/config.toml | 26 +++++ .../src/TouchSocketHttp/Program.cs | 9 +- .../TouchSocketHttp/TouchSocketHttp.csproj | 12 +-- .../src/TouchSocketHttp31/NuGet.Config | 7 ++ .../src/TouchSocketHttp31/Program.cs | 99 +++++++++++++++++++ .../TouchSocketHttp31.csproj | 17 ++++ .../src/TouchSocketWebApi/Program.cs | 26 ++--- .../TouchSocketWebApi.csproj | 14 +-- .../src/TouchSocketWebApi31/NuGet.Config | 7 ++ .../src/TouchSocketWebApi31/Program.cs | 85 ++++++++++++++++ .../TouchSocketWebApi31.csproj | 18 ++++ .../appsettings.Development.json | 8 ++ .../src/TouchSocketWebApi31/appsettings.json | 8 ++ .../touchsocket/touchsocket-http.dockerfile | 4 +- .../touchsocket/touchsocket-http31.dockerfile | 13 +++ .../touchsocket-webapi31.dockerfile | 13 +++ .../CSharp/touchsocket/touchsocket.dockerfile | 4 +- 19 files changed, 384 insertions(+), 43 deletions(-) create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttp31/NuGet.Config create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttp31/Program.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/NuGet.Config create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/Program.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.Development.json create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.json create mode 100644 frameworks/CSharp/touchsocket/touchsocket-http31.dockerfile create mode 100644 frameworks/CSharp/touchsocket/touchsocket-webapi31.dockerfile diff --git a/frameworks/CSharp/touchsocket/Benchmarks.sln b/frameworks/CSharp/touchsocket/Benchmarks.sln index 9e760787179..6f164942105 100644 --- a/frameworks/CSharp/touchsocket/Benchmarks.sln +++ b/frameworks/CSharp/touchsocket/Benchmarks.sln @@ -1,12 +1,16 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31717.71 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11109.219 d18.0-oob MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketWebApi", "src\TouchSocketWebApi\TouchSocketWebApi.csproj", "{6BD9363A-D77F-5D90-8444-2BC37495C920}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketHttp", "src\TouchSocketHttp\TouchSocketHttp.csproj", "{A7FB43AB-672B-8854-68D7-C2B383B0BC04}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketHttp31", "src\TouchSocketHttp31\TouchSocketHttp31.csproj", "{DE261A06-A254-FD54-4ACF-EE4D4352BA77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketWebApi31", "src\TouchSocketWebApi31\TouchSocketWebApi31.csproj", "{6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +25,14 @@ Global {A7FB43AB-672B-8854-68D7-C2B383B0BC04}.Debug|Any CPU.Build.0 = Debug|Any CPU {A7FB43AB-672B-8854-68D7-C2B383B0BC04}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7FB43AB-672B-8854-68D7-C2B383B0BC04}.Release|Any CPU.Build.0 = Release|Any CPU + {DE261A06-A254-FD54-4ACF-EE4D4352BA77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE261A06-A254-FD54-4ACF-EE4D4352BA77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE261A06-A254-FD54-4ACF-EE4D4352BA77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE261A06-A254-FD54-4ACF-EE4D4352BA77}.Release|Any CPU.Build.0 = Release|Any CPU + {6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/frameworks/CSharp/touchsocket/benchmark_config.json b/frameworks/CSharp/touchsocket/benchmark_config.json index 7590b2a1866..8aa1e953f59 100644 --- a/frameworks/CSharp/touchsocket/benchmark_config.json +++ b/frameworks/CSharp/touchsocket/benchmark_config.json @@ -8,6 +8,7 @@ "port": 8080, "approach": "Realistic", "classification": "Fullstack", + "database": "Postgres", "framework": "touchsocket.webapi", "language": "C#", "orm": "Raw", @@ -38,7 +39,45 @@ "display_name": "touchsocket.http", "notes": "", "versus": "aspnetcore" + }, + "http31": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "touchsocket.http31", + "language": "C#", + "orm": "Micro", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "touchsocket", + "os": "Linux", + "database_os": "Linux", + "display_name": "touchsocket.http31", + "notes": "", + "versus": "aspnetcore" + }, + "webapi31": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "touchsocket.webapi31", + "language": "C#", + "orm": "Raw", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "touchsocket", + "os": "Linux", + "database_os": "Linux", + "display_name": "touchsocket.webapi31", + "notes": "", + "versus": "aspnetcore-mvc" } } ] -} +} \ No newline at end of file diff --git a/frameworks/CSharp/touchsocket/config.toml b/frameworks/CSharp/touchsocket/config.toml index 4e386939aff..9af10d4a486 100644 --- a/frameworks/CSharp/touchsocket/config.toml +++ b/frameworks/CSharp/touchsocket/config.toml @@ -26,3 +26,29 @@ orm = "Raw" platform = ".NET" webserver = "touchsocket.http" versus = "aspcore" + +[http31] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "touchsocket.http31" +versus = "aspcore" + +[webapi31] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "touchsocket.webapi31" +versus = "aspcore-mvc" diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs index be8410c5d6b..c54ff87c76e 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs @@ -10,8 +10,8 @@ public class Program { private static async Task Main(string[] args) { - int port = 8080; - MyHttpService service = new MyHttpService(); + var port = 8080; + var service = new MyHttpService(); await service.SetupAsync(new TouchSocketConfig() .SetListenIPHosts(port) @@ -22,7 +22,6 @@ await service.SetupAsync(new TouchSocketConfig() options.SendPipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); }) .SetMaxCount(1000000) - .SetBacklog(1000) .ConfigureContainer(a => { a.AddConsoleLogger(); @@ -52,8 +51,8 @@ internal sealed class MyHttpSessionClient : HttpSessionClient protected override async Task OnReceivedHttpRequest(HttpContext httpContext) { - HttpRequest request = httpContext.Request; - HttpResponse response = httpContext.Response; + var request = httpContext.Request; + var response = httpContext.Response; switch (request.RelativeURL) { diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index a0a36e8a443..1b9d682382f 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -1,17 +1,17 @@ - + - net8.0 + net9.0 enable Exe enable - true - dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb6-47d798a5a131 - true - + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/NuGet.Config b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/NuGet.Config new file mode 100644 index 00000000000..f05d5867888 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/NuGet.Config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/Program.cs new file mode 100644 index 00000000000..a85a45ed82e --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/Program.cs @@ -0,0 +1,99 @@ +using System.Text; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Sockets; +using static System.Net.Mime.MediaTypeNames; +using HttpContent = TouchSocket.Http.HttpContent; + +namespace TouchSocketHttp; + +public class Program +{ + static async Task Main(string[] args) + { + int port = 8080; + + Console.WriteLine(DateHelper.DateString); + var service = new MyHttpService(); + + await service.SetupAsync(new TouchSocketConfig() + .SetListenIPHosts(port) + .SetNoDelay(true) + .SetMaxCount(1000000) + .ConfigureContainer(a => + { + a.AddConsoleLogger(); + })); + + await service.StartAsync(); + service.Logger.Info($"server is started,port:{port}"); + while (true) + { + Console.ReadLine(); + } + } +} + +sealed class MyHttpService : HttpService +{ + protected override MyHttpSessionClient NewClient() + { + return new MyHttpSessionClient(); + } +} + +sealed class MyHttpSessionClient : HttpSessionClient +{ + private readonly HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); + private readonly HttpContent m_contentJson = new StringHttpContent("{\"message\":\"Hello, World!\"}", Encoding.UTF8, $"application/json"); + + protected override async Task OnReceivedHttpRequest(HttpContext httpContext) + { + var request = httpContext.Request; + var response = httpContext.Response; + + switch (request.RelativeURL) + { + case "/plaintext": + { + response.StatusCode = 200; + response.StatusMessage = "success"; + response.Headers.Add(HttpHeaders.Server, "T"); + response.Headers.Add(HttpHeaders.Date, DateHelper.DateString); + response.Content = m_contentPlaintext; + await response.AnswerAsync().ConfigureAwait(false); + } + break; + case "/json": + { + response.StatusCode = 200; + response.StatusMessage = "success"; + response.Headers.Add(HttpHeaders.Server, "T"); + response.Headers.Add(HttpHeaders.Date, DateHelper.DateString); + response.Content = m_contentJson; + await response.AnswerAsync().ConfigureAwait(false); + } + break; + default: + response.SetStatus(404, "not find"); + await response.AnswerAsync().ConfigureAwait(false); + break; + } + } +} + +static class DateHelper +{ + static Timer m_timer; + static DateHelper() + { + DateString = DateTime.UtcNow.ToGMTString(); + m_timer = new Timer((state) => + { + DateString = DateTime.UtcNow.ToGMTString(); + }, null, 0, 1000); + } + + public static string DateString { get; private set; } +} + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj new file mode 100644 index 00000000000..41261ace4f9 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + Exe + enable + true + + dotnet-TouchSocketWebApi-987c185f-10b1-455b-beb6-47d798a5a131 + true + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs index a6ada596dda..66d4c955f40 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -25,7 +25,6 @@ public static void Main(string[] args) options.SendPipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); }) .SetMaxCount(1000000) - .SetBacklog(1000) .ConfigureContainer(a => { a.AddConsoleLogger(); @@ -36,28 +35,23 @@ public static void Main(string[] args) }) .ConfigurePlugins(a => { - a.UseTcpSessionCheckClear(); - - a.UseWebApi() - .ConfigureConverter(converter => + a.UseWebApi(options => { - converter.Clear(); - converter.AddSystemTextJsonSerializerFormatter(options => + options.ConfigureConverter(converter => { - options.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default); + converter.Clear(); + converter.AddSystemTextJsonSerializerFormatter(jsonOptions => + { + jsonOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default); + }); }); }); -#if DEBUG - a.UseSwagger() - .UseLaunchBrowser(); -#endif - a.UseDefaultHttpServicePlugin(); }); }); - IHost host = builder.Build(); + var host = builder.Build(); host.Run(); } } @@ -72,7 +66,7 @@ public partial class ApiServer : SingletonRpcServer [WebApi(Method = HttpMethodType.Get)] public async Task Plaintext(IWebApiCallContext callContext) { - HttpResponse response = callContext.HttpContext.Response; + var response = callContext.HttpContext.Response; response.SetStatus(200, "ok"); response.Content = m_contentPlaintext; await response.AnswerAsync().ConfigureAwait(false); @@ -86,7 +80,7 @@ public MyJson Json() } } -[JsonSerializable(typeof(MyJson))]//ʵ1 +[JsonSerializable(typeof(MyJson))] internal partial class AppJsonSerializerContext : JsonSerializerContext { diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index ec2fa17651e..9067bb77f51 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -1,19 +1,15 @@ - net8.0 + net9.0 enable enable - true - - dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb6-47d798a5a131 - true + dotnet-WorkerService1-19b37b17-6043-4334-ad9a-9e0e3c670da3 - - - - + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/NuGet.Config b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/NuGet.Config new file mode 100644 index 00000000000..f05d5867888 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/NuGet.Config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/Program.cs new file mode 100644 index 00000000000..472ab7b8b5e --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/Program.cs @@ -0,0 +1,85 @@ +using System.Text; +using System.Text.Json.Serialization; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Rpc; +using TouchSocket.Sockets; +using TouchSocket.WebApi; + +using HttpContent = TouchSocket.Http.HttpContent; + +namespace TouchSocketWebApi31; + +public class Program +{ + public static void Main(string[] args) + { + var builder = Host.CreateApplicationBuilder(args); + + builder.Services.AddServiceHostedService(config => + { + config.SetListenIPHosts(8080) + .SetNoDelay(true) + .SetMaxCount(1000000) + .ConfigureContainer(a => + { + a.AddConsoleLogger(); + a.AddRpcStore(store => + { + store.RegisterServer(); + }); + }) + .ConfigurePlugins(a => + { + a.UseWebApi() + .ConfigureConverter(converter => + { + converter.Clear(); + converter.AddSystemTextJsonSerializerFormatter(options => + { + options.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default); + }); + }); + a.UseDefaultHttpServicePlugin(); + }); + }); + + var host = builder.Build(); + host.Run(); + } +} + +public partial class ApiServer : SingletonRpcServer +{ + private readonly HttpContent m_contentPlaintext = new StringHttpContent("Hello, World!", Encoding.UTF8, $"text/plain"); + + public static MyJson MyJson { get; set; } = new MyJson() { Message = "Hello, World!" }; + + [Router("/plaintext")] + [WebApi(Method = HttpMethodType.Get)] + public async Task Plaintext(IWebApiCallContext callContext) + { + var response= callContext.HttpContext.Response; + response.SetStatus(200, "ok"); + response.Content= m_contentPlaintext; + await response.AnswerAsync().ConfigureAwait(false); + } + + [Router("/json")] + [WebApi(Method = HttpMethodType.Get)] + public MyJson Json() + { + return MyJson; + } +} + +[JsonSerializable(typeof(MyJson))] +internal partial class AppJsonSerializerContext : JsonSerializerContext +{ + +} + +public class MyJson +{ + public string? Message { get; set; } +} \ No newline at end of file diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj new file mode 100644 index 00000000000..80742a45b17 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + true + + dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb7-47d798a5a131 + true + + + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.Development.json b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.Development.json new file mode 100644 index 00000000000..b2dcdb67421 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.json b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.json new file mode 100644 index 00000000000..b2dcdb67421 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/frameworks/CSharp/touchsocket/touchsocket-http.dockerfile b/frameworks/CSharp/touchsocket/touchsocket-http.dockerfile index ba6b39ac880..28def83f5e4 100644 --- a/frameworks/CSharp/touchsocket/touchsocket-http.dockerfile +++ b/frameworks/CSharp/touchsocket/touchsocket-http.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /app COPY src/TouchSocketHttp . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime WORKDIR /app COPY --from=build /app/out ./ diff --git a/frameworks/CSharp/touchsocket/touchsocket-http31.dockerfile b/frameworks/CSharp/touchsocket/touchsocket-http31.dockerfile new file mode 100644 index 00000000000..b7437e1068b --- /dev/null +++ b/frameworks/CSharp/touchsocket/touchsocket-http31.dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /app +COPY src/TouchSocketHttp31 . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "TouchSocketHttp31.dll"] diff --git a/frameworks/CSharp/touchsocket/touchsocket-webapi31.dockerfile b/frameworks/CSharp/touchsocket/touchsocket-webapi31.dockerfile new file mode 100644 index 00000000000..0d528dbfb91 --- /dev/null +++ b/frameworks/CSharp/touchsocket/touchsocket-webapi31.dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /app +COPY src/TouchSocketWebApi31 . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "TouchSocketWebApi31.dll"] diff --git a/frameworks/CSharp/touchsocket/touchsocket.dockerfile b/frameworks/CSharp/touchsocket/touchsocket.dockerfile index a65674ef5d3..96f1a166854 100644 --- a/frameworks/CSharp/touchsocket/touchsocket.dockerfile +++ b/frameworks/CSharp/touchsocket/touchsocket.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /app COPY src/TouchSocketWebApi . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime WORKDIR /app COPY --from=build /app/out ./ From b1d7a2bd41ab8c76b238ff32676ac92b72ecdf22 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 15 Oct 2025 01:23:13 +0200 Subject: [PATCH 1669/1766] [ruby/sinatra] Pass environment as APP_ENV (#10178) Instead of passing it as an option to the server. This also fixes the iodine versions, as these were using development instead of production. --- .../sinatra-sequel-postgres-iodine-mri.dockerfile | 1 + .../Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile | 3 ++- frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 3 ++- frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile | 1 + frameworks/Ruby/sinatra/sinatra-postgres.dockerfile | 3 ++- frameworks/Ruby/sinatra/sinatra.dockerfile | 3 ++- 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile index 7d3e1f20c14..83d1de64132 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-iodine-mri.dockerfile @@ -13,6 +13,7 @@ WORKDIR /sinatra-sequel ENV BUNDLE_WITH=postgresql:iodine RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile +ENV APP_ENV=production ENV DBTYPE=postgresql EXPOSE 8080 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index 211b710bfed..afbbc915d22 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile @@ -14,8 +14,9 @@ ENV BUNDLE_WITH=postgresql:puma RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV WEB_CONCURRENCY=auto +ENV APP_ENV=production ENV DBTYPE=postgresql EXPOSE 8080 -CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production +CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index 78e0443b469..7f622501ddf 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -14,8 +14,9 @@ ENV BUNDLE_WITH=mysql:puma RUN bundle install --jobs=4 --gemfile=/sinatra-sequel/Gemfile ENV WEB_CONCURRENCY=auto +ENV APP_ENV=production ENV DBTYPE=mysql EXPOSE 8080 -CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production +CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile index a78a053763f..a6a29633958 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-iodine-mri.dockerfile @@ -13,6 +13,7 @@ WORKDIR /sinatra ENV BUNDLE_WITH=postgresql:iodine RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile +ENV APP_ENV=production ENV DBTYPE=postgresql EXPOSE 8080 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index e1d8162412d..5d16f620330 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -14,8 +14,9 @@ ENV BUNDLE_WITH=postgresql:puma RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile ENV WEB_CONCURRENCY=auto +ENV APP_ENV=production ENV DBTYPE=postgresql EXPOSE 8080 -CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production +CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 83a6cbb359d..252f6743a01 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -13,9 +13,10 @@ WORKDIR /sinatra ENV BUNDLE_WITH=mysql:puma RUN bundle install --jobs=4 --gemfile=/sinatra/Gemfile +ENV APP_ENV=production ENV DBTYPE=mysql ENV WEB_CONCURRENCY=auto EXPOSE 8080 -CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production +CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 From 67852f7ae759e6b43c37df33a29f19ca8c123808 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 15 Oct 2025 01:23:32 +0200 Subject: [PATCH 1670/1766] [ruby/roda-sequel] Pass environment as RACK_ENV (#10179) Instead of passing it as an option to the server. --- .../roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile | 1 + frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 3 ++- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile index b8990b4ba3c..2ab0b2de6cc 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-iodine-mri.dockerfile @@ -14,6 +14,7 @@ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'postgresql iodine' RUN bundle install --jobs=8 +ENV RACK_ENV=production ENV DBTYPE=postgresql EXPOSE 8080 diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile index 542d2d49cc9..46cff7f1b39 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile @@ -14,9 +14,10 @@ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'postgresql puma' RUN bundle install --jobs=8 +ENV RACK_ENV=production ENV DBTYPE=postgresql ENV WEB_CONCURRENCY=auto EXPOSE 8080 -CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production +CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index 87dcf9ce1ff..1506324b59c 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -15,9 +15,10 @@ ENV BUNDLE_FORCE_RUBY_PLATFORM=true RUN bundle config set with 'mysql puma' RUN bundle install --jobs=8 +ENV RACK_ENV=production ENV DBTYPE=mysql ENV WEB_CONCURRENCY=auto EXPOSE 8080 -CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 -e production +CMD bundle exec puma -C config/mri_puma.rb -b tcp://0.0.0.0:8080 From 43edfc13fb7496a771a48e309f47b6c308b1a4f8 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Wed, 15 Oct 2025 01:24:17 +0200 Subject: [PATCH 1671/1766] [Python] Update Granian to 2.5, remove "wrk" variant, add "nogil" variant (#10177) --- frameworks/Python/granian/app_rsgi_nogil.py | 42 +++++++++++++++++++ .../Python/granian/benchmark_config.json | 4 +- frameworks/Python/granian/config.toml | 2 +- .../Python/granian/granian-nogil.dockerfile | 16 +++++++ .../Python/granian/granian-rsgi.dockerfile | 4 +- .../Python/granian/granian-wrk.dockerfile | 11 ----- .../Python/granian/granian-wsgi.dockerfile | 2 +- frameworks/Python/granian/granian.dockerfile | 4 +- .../Python/granian/requirements-nogil.txt | 1 + frameworks/Python/granian/requirements.txt | 4 +- frameworks/Python/granian/run_nogil.py | 32 ++++++++++++++ 11 files changed, 101 insertions(+), 21 deletions(-) create mode 100644 frameworks/Python/granian/app_rsgi_nogil.py create mode 100644 frameworks/Python/granian/granian-nogil.dockerfile delete mode 100644 frameworks/Python/granian/granian-wrk.dockerfile create mode 100644 frameworks/Python/granian/requirements-nogil.txt create mode 100644 frameworks/Python/granian/run_nogil.py diff --git a/frameworks/Python/granian/app_rsgi_nogil.py b/frameworks/Python/granian/app_rsgi_nogil.py new file mode 100644 index 00000000000..b87931f61b1 --- /dev/null +++ b/frameworks/Python/granian/app_rsgi_nogil.py @@ -0,0 +1,42 @@ +import json + +JSON_HEADERS = [('content-type', 'application/json')] +PLAINTEXT_HEADERS = [('content-type', 'text/plain; charset=utf-8')] + +# json_dumps = orjson.dumps +json_dumps = json.dumps + + +async def route_json(scope, proto): + proto.response_str( + 200, + JSON_HEADERS, + json_dumps({'message': 'Hello, world!'}) + ) + + +async def route_plaintext(scope, proto): + proto.response_bytes( + 200, + PLAINTEXT_HEADERS, + b'Hello, world!' + ) + + +async def handle_404(scope, proto): + proto.response_bytes( + 404, + PLAINTEXT_HEADERS, + b'Not found' + ) + + +routes = { + '/json': route_json, + '/plaintext': route_plaintext +} + + +def main(scope, proto): + handler = routes.get(scope.path, handle_404) + return handler(scope, proto) diff --git a/frameworks/Python/granian/benchmark_config.json b/frameworks/Python/granian/benchmark_config.json index 140075ee0a3..857d81e68ca 100644 --- a/frameworks/Python/granian/benchmark_config.json +++ b/frameworks/Python/granian/benchmark_config.json @@ -63,7 +63,7 @@ "notes": "", "versus": "uvicorn" }, - "wrk": { + "nogil": { "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, @@ -77,7 +77,7 @@ "webserver": "granian", "os": "Linux", "database_os": "Linux", - "display_name": "granian [rsgi wrk]", + "display_name": "granian [rsgi nogil]", "notes": "", "versus": "uvicorn" } diff --git a/frameworks/Python/granian/config.toml b/frameworks/Python/granian/config.toml index ade7eab9673..2338f0d4a48 100644 --- a/frameworks/Python/granian/config.toml +++ b/frameworks/Python/granian/config.toml @@ -48,7 +48,7 @@ platform = "None" webserver = "granian" versus = "uvicorn" -[wrk] +[nogil] urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" diff --git a/frameworks/Python/granian/granian-nogil.dockerfile b/frameworks/Python/granian/granian-nogil.dockerfile new file mode 100644 index 00000000000..5f0e4045f40 --- /dev/null +++ b/frameworks/Python/granian/granian-nogil.dockerfile @@ -0,0 +1,16 @@ +FROM ghcr.io/astral-sh/uv:debian-slim + +RUN uv python install 3.14t + +ENV UV_PYTHON=3.14t +ENV PYTHON_GIL=0 + +ADD ./ /granian +WORKDIR /granian + +RUN uv venv +RUN uv pip install -r requirements-nogil.txt + +EXPOSE 8080 + +CMD uv run python run_nogil.py rsgi st diff --git a/frameworks/Python/granian/granian-rsgi.dockerfile b/frameworks/Python/granian/granian-rsgi.dockerfile index cba5380d5fd..1eb5066dfeb 100644 --- a/frameworks/Python/granian/granian-rsgi.dockerfile +++ b/frameworks/Python/granian/granian-rsgi.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-slim +FROM python:3.13-slim ADD ./ /granian @@ -8,4 +8,4 @@ RUN pip install -r /granian/requirements.txt EXPOSE 8080 -CMD python run.py rsgi mt +CMD python run.py rsgi st diff --git a/frameworks/Python/granian/granian-wrk.dockerfile b/frameworks/Python/granian/granian-wrk.dockerfile deleted file mode 100644 index 50a1e008ae8..00000000000 --- a/frameworks/Python/granian/granian-wrk.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.10-slim - -ADD ./ /granian - -WORKDIR /granian - -RUN pip install -r /granian/requirements.txt - -EXPOSE 8080 - -CMD python run.py rsgi st diff --git a/frameworks/Python/granian/granian-wsgi.dockerfile b/frameworks/Python/granian/granian-wsgi.dockerfile index 1ecac416f49..366f274ff0c 100644 --- a/frameworks/Python/granian/granian-wsgi.dockerfile +++ b/frameworks/Python/granian/granian-wsgi.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-slim +FROM python:3.13-slim ADD ./ /granian diff --git a/frameworks/Python/granian/granian.dockerfile b/frameworks/Python/granian/granian.dockerfile index 443c501448f..139ba2300d8 100644 --- a/frameworks/Python/granian/granian.dockerfile +++ b/frameworks/Python/granian/granian.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-slim +FROM python:3.13-slim ADD ./ /granian @@ -8,4 +8,4 @@ RUN pip install -r /granian/requirements.txt EXPOSE 8080 -CMD python run.py asgi mt +CMD python run.py asgi st diff --git a/frameworks/Python/granian/requirements-nogil.txt b/frameworks/Python/granian/requirements-nogil.txt new file mode 100644 index 00000000000..c49d8ced726 --- /dev/null +++ b/frameworks/Python/granian/requirements-nogil.txt @@ -0,0 +1 @@ +granian[rloop]>=2.5.0,<2.6.0 diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index dd9715142d3..8fc318454b4 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.30.0 -granian[uvloop]>=2.4.0,<2.5.0 +granian[uvloop]>=2.5.0,<2.6.0 jinja2==3.1.6 -orjson==3.10.16 +orjson==3.11.3 diff --git a/frameworks/Python/granian/run_nogil.py b/frameworks/Python/granian/run_nogil.py new file mode 100644 index 00000000000..b11779eea63 --- /dev/null +++ b/frameworks/Python/granian/run_nogil.py @@ -0,0 +1,32 @@ +import multiprocessing +import sys + +from granian import Granian + + +if __name__ == '__main__': + interface = sys.argv[1] + runtime_mode = sys.argv[2] + workers = multiprocessing.cpu_count() + + if interface == "rsgi": + #: leave 25% cpu to the Rust runtime + workers = round(workers * 0.75) + + blocking_threads = None + if interface == "wsgi": + #: we don't run any I/O in WSGI benches + blocking_threads = 1 + + Granian( + f"app_{interface}_nogil:main", + address="0.0.0.0", + port=8080, + workers=workers, + runtime_mode=runtime_mode, + blocking_threads=blocking_threads, + backlog=16384, + interface=interface, + http="1", + websockets=False + ).serve() From d08bb821ebe68b35862e82b9f9d8d46390149206 Mon Sep 17 00:00:00 2001 From: Diogo Martins <165835485+MDA2AV@users.noreply.github.com> Date: Wed, 22 Oct 2025 00:00:43 +0100 Subject: [PATCH 1672/1766] Bump Wired.IO to 9.5.3, supports pipelined http. Add platform benchmark (#10180) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bump Wired.IO to 9.5.0, supports pipelined http. Add platform benchmark * Header mismatch fix * Tune nº of working threads, add comments. * bump unhinged to 9.0.1 * Update README and maintainers * Change to linux-musl-x64 * bump to 9.5.3 * bump to 9.5.3 --- .../wiredio/Benchmarks/Benchmarks.csproj | 23 ----- .../CSharp/wiredio/Benchmarks/Program.cs | 32 ------ frameworks/CSharp/wiredio/README.md | 8 +- .../CSharp/wiredio/benchmark_config.json | 22 ++++- frameworks/CSharp/wiredio/config.toml | 12 +++ .../wiredio/src/Fullstack/Fullstack.csproj | 26 +++++ .../CSharp/wiredio/src/Fullstack/Program.cs | 60 +++++++++++ .../wiredio/src/Platform/Platform.csproj | 25 +++++ .../CSharp/wiredio/src/Platform/Program.cs | 99 +++++++++++++++++++ .../CSharp/wiredio/wiredio-plt.dockerfile | 22 +++++ frameworks/CSharp/wiredio/wiredio.dockerfile | 36 ++++--- 11 files changed, 285 insertions(+), 80 deletions(-) delete mode 100644 frameworks/CSharp/wiredio/Benchmarks/Benchmarks.csproj delete mode 100644 frameworks/CSharp/wiredio/Benchmarks/Program.cs create mode 100644 frameworks/CSharp/wiredio/src/Fullstack/Fullstack.csproj create mode 100644 frameworks/CSharp/wiredio/src/Fullstack/Program.cs create mode 100644 frameworks/CSharp/wiredio/src/Platform/Platform.csproj create mode 100644 frameworks/CSharp/wiredio/src/Platform/Program.cs create mode 100644 frameworks/CSharp/wiredio/wiredio-plt.dockerfile diff --git a/frameworks/CSharp/wiredio/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/wiredio/Benchmarks/Benchmarks.csproj deleted file mode 100644 index 627c09fb8c8..00000000000 --- a/frameworks/CSharp/wiredio/Benchmarks/Benchmarks.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - Exe - net9.0 - 13.0 - enable - enable - - true - true - - - linux-musl-x64 - true - - - - - - - - diff --git a/frameworks/CSharp/wiredio/Benchmarks/Program.cs b/frameworks/CSharp/wiredio/Benchmarks/Program.cs deleted file mode 100644 index 8a41b222386..00000000000 --- a/frameworks/CSharp/wiredio/Benchmarks/Program.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Net; -using System.Text.Json; -using Wired.IO.App; -using Wired.IO.Http11.Response.Content; -using Wired.IO.Protocol.Response; -using StringContent = Wired.IO.Http11.Response.Content.StringContent; - -var builder = WiredApp.CreateBuilder(); - -await builder - .Endpoint(IPAddress.Any, 8080) - .MapGet("/plaintext", scope => context => - { - context - .Respond() - .Status(ResponseStatus.Ok) - .Content(new StringContent("Hello, World!")) - .Type("text/plain"); - }) - .MapGet("/json", scope => context => - { - context - .Respond() - .Status(ResponseStatus.Ok) - .Content(new JsonContent(new - { - Message = "Hello, World!" - }, JsonSerializerOptions.Default)) - .Type("application/json"); - }) - .Build() - .RunAsync(); \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/README.md b/frameworks/CSharp/wiredio/README.md index 4f137ae45c2..7b852008832 100644 --- a/frameworks/CSharp/wiredio/README.md +++ b/frameworks/CSharp/wiredio/README.md @@ -10,13 +10,13 @@ See the [Wired.IO Documentation](https://mda2av.github.io/Wired.IO.Docs/) for mo **Platforms** -* .NET 8/9 +* .NET 9 **Web Servers** * [Wired.IO](https://github.com/MDA2AV/Wired.IO) -## Paths & Source for Tests +**Engines** -* [Plaintext](Benchmarks/Program.cs): "/plaintext" -* [JSON](Benchmarks/Program.cs): "/json" +* [Wired.IO](https://github.com/MDA2AV/Wired.IO) +* [Unhinged](https://github.com/MDA2AV/Unhinged) \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/benchmark_config.json b/frameworks/CSharp/wiredio/benchmark_config.json index f136d0588b7..e74c7696415 100644 --- a/frameworks/CSharp/wiredio/benchmark_config.json +++ b/frameworks/CSharp/wiredio/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "wiredio", + "maintainers": ["MDA2AV"], "tests": [ { "default": { @@ -17,8 +18,25 @@ "os": "Linux", "database_os": "Linux", "display_name": "Wired.IO", - "notes": "Only plaintext and JSON benchmarks implemented" + "notes": "Only plaintext and JSON benchmarks implemented yet" + }, + "plt": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "Unhinged", + "language": "C#", + "orm": "None", + "platform": ".NET", + "webserver": "Unhinged", + "os": "Linux", + "database_os": "Linux", + "display_name": "Wired.IO [Unhinged]", + "notes": "Not a framework" } } ] -} \ No newline at end of file +} diff --git a/frameworks/CSharp/wiredio/config.toml b/frameworks/CSharp/wiredio/config.toml index 55e724fde37..fe292c91330 100644 --- a/frameworks/CSharp/wiredio/config.toml +++ b/frameworks/CSharp/wiredio/config.toml @@ -12,3 +12,15 @@ orm = "None" platform = ".NET" webserver = "Wired.IO" versus = "None" + +[plt] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Platform" +os = "Linux" +database_os = "Linux" +orm = "None" +platform = ".NET" +webserver = "Unhinged" +versus = "None" \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/src/Fullstack/Fullstack.csproj b/frameworks/CSharp/wiredio/src/Fullstack/Fullstack.csproj new file mode 100644 index 00000000000..b8e2ca0256d --- /dev/null +++ b/frameworks/CSharp/wiredio/src/Fullstack/Fullstack.csproj @@ -0,0 +1,26 @@ + + + + Exe + net9.0 + enable + enable + true + true + true + true + + + linux-musl-x64 + true + + + + + + + + + + + \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/src/Fullstack/Program.cs b/frameworks/CSharp/wiredio/src/Fullstack/Program.cs new file mode 100644 index 00000000000..6d658ff0441 --- /dev/null +++ b/frameworks/CSharp/wiredio/src/Fullstack/Program.cs @@ -0,0 +1,60 @@ +using System.IO.Pipelines; +using System.Text.Json; +using System.Text.Json.Serialization; +using Wired.IO.App; + +namespace Fullstack; + +internal class Program +{ + public static async Task Main(string[] args) + { + var expressBuilder = WiredApp.CreateExpressBuilder(); + + await expressBuilder + .Port(8080) + .NoScopedEndpoints() + .MapGet("/json", _ => async ctx => + { + var payload = new JsonMessage { Message = JsonBody }; + var myHandler = CreateBoundHandler(ctx.Writer, payload); + + ctx + .Respond() + .Type("application/json"u8) + .Content(myHandler, 27); + + }) + .MapGet("/plaintext", _ => async ctx => + { + ctx + .Respond() + .Type("text/plain"u8) + .Content(_plainTextBody); + }) + .Build() + .RunAsync(); + } + + private static ReadOnlySpan _plainTextBody => "Hello, World!"u8; + private const string JsonBody = "Hello, World!"; + + [ThreadStatic] + private static Utf8JsonWriter? t_writer; + private static readonly Action StaticHandler = HandleFast; + private static Action CreateBoundHandler(PipeWriter writer, JsonMessage message) => () => StaticHandler.Invoke(writer, message); + private static void HandleFast(PipeWriter writer, JsonMessage message) + { + var utf8JsonWriter = t_writer ??= new Utf8JsonWriter(writer, new JsonWriterOptions { SkipValidation = true }); + utf8JsonWriter.Reset(writer); + JsonSerializer.Serialize(utf8JsonWriter, message, SerializerContext.JsonMessage); + } + + private static readonly JsonContext SerializerContext = JsonContext.Default; +} + +public struct JsonMessage { public string Message { get; set; } } + +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Serialization | JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(JsonMessage))] +public partial class JsonContext : JsonSerializerContext { } \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/src/Platform/Platform.csproj b/frameworks/CSharp/wiredio/src/Platform/Platform.csproj new file mode 100644 index 00000000000..1fd01bf2e63 --- /dev/null +++ b/frameworks/CSharp/wiredio/src/Platform/Platform.csproj @@ -0,0 +1,25 @@ + + + + Exe + net9.0 + enable + enable + true + true + true + true + + + linux-musl-x64 + true + + + + + + + + + + diff --git a/frameworks/CSharp/wiredio/src/Platform/Program.cs b/frameworks/CSharp/wiredio/src/Platform/Program.cs new file mode 100644 index 00000000000..0b76948f66f --- /dev/null +++ b/frameworks/CSharp/wiredio/src/Platform/Program.cs @@ -0,0 +1,99 @@ +// ReSharper disable always SuggestVarOrType_BuiltInTypes +// (var is avoided intentionally in this project so that concrete types are visible at call sites.) +// ReSharper disable always StackAllocInsideLoop + +using System.Runtime.CompilerServices; +using System.Text.Json; +using Unhinged; + +#pragma warning disable CA2014 + +/* (MDA2AV)Dev notes: + * + * Wired.IO Platform benchmark using [Unhinged - https://github.com/MDA2AV/Unhinged] epoll engine. + * + * This test was created purely for benchmark/comparison between .NET solutions. + * It should not be considered EVER as a go-to framework to build any kind of webserver! + * For such purpose please use the main Wired.IO framework [Wired.IO - https://github.com/MDA2AV/Wired.IO]. + * + * This benchmarks follows the JsonSerialization and PlainText rules imposed by the TechEmpower team. + * + * The Http parsing by the Unhinged engine is still naive(work in progress), yet it's development will not have any impact + * on these benchmarks results as the extra request parsing overhead is much smaller than the read/send syscalls'. + */ + +namespace Platform; + +[SkipLocalsInit] +internal static class Program +{ + public static void Main(string[] args) + { + var builder = UnhingedEngine + .CreateBuilder() + .SetPort(8080) + + + // Number of working threads + // Reasoning behind Environment.ProcessorCount / 2 + // It's the number of real cpu cores not cpu threads + // This can improve the cache hits on L1/L2 since only one thread + // is running per cpu core. + .SetNWorkersSolver(() => Environment.ProcessorCount/2) + + // Accept up to 16384 connections + .SetBacklog(16384) + + // Max 512 epoll events per wake (quite overkill) + .SetMaxEventsPerWake(512) + + // Max 1024 connection per thread + .SetMaxNumberConnectionsPerWorker(1024) + + // 32KB in and 16KB out slabs to handle 16 pipeline depth + .SetSlabSizes(32 * 1024, 16 * 1024) + .InjectRequestHandler(RequestHandler); + + var engine = builder.Build(); + engine.Run(); + } + + private static void RequestHandler(Connection connection) + { + // FNV-1a Hashed routes to avoid string allocations + if(connection.HashedRoute == 291830056) // /json + CommitJsonResponse(connection); + + else if (connection.HashedRoute == 3454831873) // /plaintext + CommitPlainTextResponse(connection); + } + + [ThreadStatic] private static Utf8JsonWriter? t_utf8JsonWriter; + private static readonly JsonContext SerializerContext = JsonContext.Default; + private static void CommitJsonResponse(Connection connection) + { + connection.WriteBuffer.WriteUnmanaged("HTTP/1.1 200 OK\r\n"u8 + + "Server: W\r\n"u8 + + "Content-Type: application/json; charset=UTF-8\r\n"u8 + + "Content-Length: 27\r\n"u8); + connection.WriteBuffer.WriteUnmanaged(DateHelper.HeaderBytes); + + t_utf8JsonWriter ??= new Utf8JsonWriter(connection.WriteBuffer, new JsonWriterOptions { SkipValidation = true }); + t_utf8JsonWriter.Reset(connection.WriteBuffer); + + // Creating(Allocating) a new JsonMessage every request + var message = new JsonMessage { Message = "Hello, World!" }; + // Serializing it every request + JsonSerializer.Serialize(t_utf8JsonWriter, message, SerializerContext.JsonMessage); + } + + private static void CommitPlainTextResponse(Connection connection) + { + connection.WriteBuffer.WriteUnmanaged("HTTP/1.1 200 OK\r\n"u8 + + "Server: W\r\n"u8 + + "Content-Type: text/plain\r\n"u8 + + "Content-Length: 13\r\n"u8); + connection.WriteBuffer.WriteUnmanaged(DateHelper.HeaderBytes); + connection.WriteBuffer.WriteUnmanaged("Hello, World!"u8); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/wiredio-plt.dockerfile b/frameworks/CSharp/wiredio/wiredio-plt.dockerfile new file mode 100644 index 00000000000..9bd497eec84 --- /dev/null +++ b/frameworks/CSharp/wiredio/wiredio-plt.dockerfile @@ -0,0 +1,22 @@ +# Build +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build +RUN apk add --no-cache clang build-base zlib-dev linux-headers +WORKDIR /src +COPY src/Platform/ ./Platform/ +WORKDIR /src/Platform +RUN dotnet publish -c Release \ + -r linux-musl-x64 \ + --self-contained true \ + -p:PublishAot=true \ + -p:OptimizationPreference=Speed \ + -p:GarbageCollectionAdaptationMode=0 \ + -o /app/out + +# Runtime (musl) +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine +ENV URLS=http://+:8080 +WORKDIR /app +COPY --from=build /app/out ./ +RUN chmod +x ./Platform +EXPOSE 8080 +ENTRYPOINT ["./Platform"] diff --git a/frameworks/CSharp/wiredio/wiredio.dockerfile b/frameworks/CSharp/wiredio/wiredio.dockerfile index 8c473477a61..2c6d853b0a2 100644 --- a/frameworks/CSharp/wiredio/wiredio.dockerfile +++ b/frameworks/CSharp/wiredio/wiredio.dockerfile @@ -1,24 +1,22 @@ +# Build FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build -WORKDIR /source +RUN apk add --no-cache clang build-base zlib-dev linux-headers +WORKDIR /src +COPY src/Fullstack/ ./Fullstack/ +WORKDIR /src/Fullstack +RUN dotnet publish -c Release \ + -r linux-musl-x64 \ + --self-contained true \ + -p:PublishAot=true \ + -p:OptimizationPreference=Speed \ + -p:GarbageCollectionAdaptationMode=0 \ + -o /app/out -# copy csproj and restore as distinct layers -COPY Benchmarks/*.csproj . -RUN dotnet restore -r linux-musl-x64 - -# copy and publish app and libraries -COPY Benchmarks/ . -RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained - -# final stage/image +# Runtime (musl) FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine - -ENV DOTNET_GCDynamicAdaptationMode=0 -ENV DOTNET_ReadyToRun=0 -ENV DOTNET_HillClimbing_Disable=1 - +ENV URLS=http://+:8080 WORKDIR /app -COPY --from=build /app . - -ENTRYPOINT ["./Benchmarks"] - +COPY --from=build /app/out ./ +RUN chmod +x ./Fullstack EXPOSE 8080 +ENTRYPOINT ["./Fullstack"] From 69a2bffe23c4eaf7a100361f95bf6081cb135e04 Mon Sep 17 00:00:00 2001 From: Bogdan Popa Date: Wed, 22 Oct 2025 02:00:58 +0300 Subject: [PATCH 1673/1766] Racket: bump RACKET_VERSION to 8.18 (#10181) --- frameworks/Racket/racket/racket.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Racket/racket/racket.dockerfile b/frameworks/Racket/racket/racket.dockerfile index f5d975e077d..58448b4c541 100644 --- a/frameworks/Racket/racket/racket.dockerfile +++ b/frameworks/Racket/racket/racket.dockerfile @@ -11,7 +11,7 @@ RUN echo 'APT::Get::Install-Recommends "false";' > /etc/apt/apt.conf.d/00-genera FROM debian AS racket -ARG RACKET_VERSION=8.9 +ARG RACKET_VERSION=8.18 RUN apt-get update -q \ && apt-get install --no-install-recommends -q -y \ From 6ba61ce9d86715ebf8808c9cc6c6193d1693be40 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Wed, 22 Oct 2025 02:01:27 +0300 Subject: [PATCH 1674/1766] uplift dependencies in clojure aleph (#10182) * uplift dependencies in clojure aleph Removed unneeded and unmaintained libs also uplift jdk to 25 for clojure kit * update donkey deps --------- Co-authored-by: jj --- frameworks/Clojure/aleph/aleph.dockerfile | 18 +- frameworks/Clojure/aleph/project.clj | 27 +-- .../Clojure/aleph/src/hello/handler.clj | 209 ++++++++---------- frameworks/Clojure/donkey/donkey.dockerfile | 4 +- frameworks/Clojure/donkey/project.clj | 4 +- frameworks/Clojure/kit/kit-majavat.dockerfile | 2 +- frameworks/Clojure/kit/kit.dockerfile | 2 +- 7 files changed, 110 insertions(+), 156 deletions(-) diff --git a/frameworks/Clojure/aleph/aleph.dockerfile b/frameworks/Clojure/aleph/aleph.dockerfile index 5b35fe895d2..e8268bd6b15 100644 --- a/frameworks/Clojure/aleph/aleph.dockerfile +++ b/frameworks/Clojure/aleph/aleph.dockerfile @@ -1,20 +1,14 @@ -FROM clojure:temurin-19-lein +FROM clojure:lein as lein WORKDIR /aleph COPY src src COPY project.clj project.clj RUN lein uberjar -# HTTP server -EXPOSE 8080 -# async-profiler HTTP-server -EXPOSE 8081 -# JMX port -EXPOSE 9999 +FROM openjdk:25-jdk-slim -RUN apt update -y -RUN apt install perl -y +WORKDIR /aleph +COPY --from=lein /aleph/target/hello-aleph-standalone.jar app.jar -CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.net.preferIPv4Stack=true", "-Dio.netty.leakDetection.level=disabled", "-jar", "target/hello-aleph-standalone.jar"] +EXPOSE 8080 -# To enable JMX and async-profiler -#CMD ["java", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints", "-Djdk.attach.allowAttachSelf", "-Dcom.sun.management.jmxremote=true", "-Djava.rmi.server.hostname=0.0.0.0","-Dcom.sun.management.jmxremote.rmi.port=9999" ,"-Dcom.sun.management.jmxremote.port=9999", "-Dcom.sun.management.jmxremote.ssl=false", "-Dcom.sun.management.jmxremote.authenticate=false", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.net.preferIPv4Stack=true", "-jar", "target/hello-aleph-standalone.jar"] +CMD ["java", "-server", "--enable-native-access=ALL-UNNAMED", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Clojure/aleph/project.clj b/frameworks/Clojure/aleph/project.clj index b63dc7a0abe..1c20d439829 100644 --- a/frameworks/Clojure/aleph/project.clj +++ b/frameworks/Clojure/aleph/project.clj @@ -1,23 +1,12 @@ (defproject hello "aleph" :description "Aleph benchmarks" - :dependencies [[org.clojure/clojure "1.11.1"] - [aleph "0.6.1"] - [metosin/jsonista "0.3.7"] - [hiccup "1.0.5"] - [com.github.arnaudgeiser/porsas "0.0.1-alpha14" - :exclusions [io.netty/netty-codec-dns - io.netty/netty-codec - io.netty/netty-buffer - io.netty/netty-common - io.netty/netty-codec-http - io.netty/netty-codec-http2 - io.netty/netty-codec-socks - io.netty/netty-handler - io.netty/netty-handler-proxy - io.netty/netty-transport - io.netty/netty-resolver-dns - io.netty/netty-resolver]] - [com.clojure-goes-fast/clj-async-profiler "1.0.3"]] + :dependencies [[org.clojure/clojure "1.12.3"] + [aleph "0.9.3"] + [metosin/jsonista "0.3.13"] + [hiccup "2.0.0"] + [seancorfield/next.jdbc "1.2.659"] + [hikari-cp "3.3.0"] + [org.postgresql/postgresql "42.7.8"] + ] :main hello.handler - :jvm-opts ^:replace ["-Dclojure.compiler.direct-linking=true"] :aot :all) diff --git a/frameworks/Clojure/aleph/src/hello/handler.clj b/frameworks/Clojure/aleph/src/hello/handler.clj index 2130bae1136..758f5e8c98d 100644 --- a/frameworks/Clojure/aleph/src/hello/handler.clj +++ b/frameworks/Clojure/aleph/src/hello/handler.clj @@ -1,89 +1,73 @@ (ns hello.handler (:require - [aleph.http :as http] - [aleph.netty :as netty] - [byte-streams :as bs] - [clj-async-profiler.core :as prof] - [hiccup.page :as hp] - [hiccup.util :as hu] - [jsonista.core :as json] - [manifold.deferred :as d] - [porsas.async :as async]) - (:import (clojure.lang IDeref) - (io.netty.channel ChannelOption) + [aleph.http :as http] + [aleph.netty :as netty] + [hiccup.page :as hp] + [hiccup.util :as hu] + [jsonista.core :as json] + [manifold.deferred :as d] + [next.jdbc :as jdbc] + [next.jdbc.connection :as connection] + [next.jdbc.result-set :as rs]) + + (:import (com.zaxxer.hikari HikariDataSource) (io.netty.buffer PooledByteBufAllocator) - (java.util.function Supplier) - (java.util.concurrent ThreadLocalRandom) - (porsas.async Context)) + (io.netty.channel ChannelOption) + (java.util.concurrent ThreadLocalRandom)) (:gen-class)) +(def jdbc-opts {:builder-fn rs/as-unqualified-maps}) + +(def db-spec + {:jdbcUrl "jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass"}) + +(def datasource + (connection/->pool HikariDataSource db-spec)) + (def plaintext-response - {:status 200 + {:status 200 :headers {"Content-Type" "text/plain"} - :body (bs/to-byte-array "Hello, World!")}) + :body (.getBytes "Hello, World!")}) (def json-response - {:status 200 + {:status 200 :headers {"Content-Type" "application/json"}}) (def html-response - {:status 200 + {:status 200 :headers {"Content-Type" "text/html; charset=utf-8"}}) -(def db-spec - {:uri "postgresql://tfb-database:5432/hello_world" - :user "benchmarkdbuser" - :password "benchmarkdbpass" - :size 1}) - -(defmacro thread-local [& body] - `(let [tl# (ThreadLocal/withInitial (reify Supplier (get [_] ~@body)))] - (reify IDeref (deref [_] (.get tl#))))) -(def pool - "PostgreSQL pool of connections (`PgPool`)." - (thread-local (async/pool db-spec))) - -(defn random +(defn- random "Generate a random number between 1 and 10'000." [] (unchecked-inc (.nextInt (ThreadLocalRandom/current) 10000))) -(defn sanitize-queries-param - "Sanitizes the `queries` parameter. Clamps the value between 1 and 500. - Invalid (string) values become 1." +(defn- sanitize-queries-param [request] (let [queries (-> request :query-string (subs 8)) n (try (Integer/parseInt queries) - (catch Exception _ 1))] ; default to 1 on parse failure + (catch Exception _ 1))] ; default to 1 on parse failure (cond (< n 1) 1 (> n 500) 500 :else n))) -(def ^Context - query-mapper - "Map each row into a record." - (async/context {:row (async/rs->compiled-record)})) -(defn query-one-random-world - "Query a random world on the database. - Return a `CompletableFuture`." - [] - (async/query-one query-mapper - @pool - ["SELECT id, randomnumber FROM world WHERE id=$1" (random)])) - -(defn update-world - "Update a world on the database. - Return a `CompletableFuture`." - [{:keys [randomNumber id]}] - (async/query @pool - ["UPDATE world SET randomnumber=$1 WHERE id=$2" randomNumber id])) - -(defn run-queries +(defn- query-one-random-world [] + (jdbc/execute-one! datasource + ["select * from \"World\" where id = ?;" (random)] + jdbc-opts)) + +(defn- update-world + [{:keys [randomnumber id]}] + (jdbc/execute-one! datasource + ["update \"World\" set randomNumber = ? where id = ? returning *;" randomnumber id] + jdbc-opts)) + +(defn- run-queries "Run a number of `queries` on the database to fetch a random world. Return a `manifold.deferred`." [queries] @@ -91,13 +75,13 @@ (take queries (repeatedly query-one-random-world)))) -(defn query-fortunes - "Query the fortunes on database. - Return a `CompletableFuture`." - [] - (async/query query-mapper @pool ["SELECT id, message from FORTUNE"])) -(defn get-fortunes +(defn query-fortunes [] + (jdbc/execute! datasource + ["select * from \"Fortune\";"] + jdbc-opts)) + +(defn- get-fortunes "Fetch the full list of Fortunes from the database, sort them by the fortune message text. Return a `CompletableFuture` with the results." @@ -106,35 +90,31 @@ (fn [fortunes] (sort-by :message (conj fortunes - {:id 0 + {:id 0 :message "Additional fortune added at request time."}))))) -(defn update-and-persist - "Fetch a number of `queries` random world from the database. - Compute a new `randomNumber` for each of them a return a `CompletableFuture` - with the updated worlds." - [queries] +(defn- update-and-persist [queries] (d/chain' (run-queries queries) (fn [worlds] - (let [worlds' (mapv #(assoc % :randomNumber (random)) worlds)] + (let [worlds' (mapv #(assoc % :randomnumber (random)) worlds)] (d/chain' (apply d/zip (mapv update-world worlds')) (fn [_] worlds')))))) -(defn fortunes-hiccup +(defn- fortunes-hiccup "Render the given fortunes to simple HTML using Hiccup." [fortunes] (hp/html5 - [:head - [:title "Fortunes"]] - [:body - [:table - [:tr - [:th "id"] - [:th "message"]] - (for [x fortunes] - [:tr - [:td (:id x)] - [:td (hu/escape-html (:message x))]])]])) + [:head + [:title "Fortunes"]] + [:body + [:table + [:tr + [:th "id"] + [:th "message"]] + (for [x fortunes] + [:tr + [:td (:id x)] + [:td (hu/escape-html (:message x))]])]])) (defn handler "Ring handler representing the different tests." @@ -142,47 +122,38 @@ (let [uri (:uri req)] (cond (.equals "/plaintext" uri) plaintext-response - (.equals "/json" uri) (assoc json-response - :body (json/write-value-as-bytes {:message "Hello, World!"})) - (.equals "/db" uri) (-> (query-one-random-world) - (d/chain (fn [world] - (assoc json-response - :body (json/write-value-as-bytes world))))) - (.equals "/queries" uri) (-> (sanitize-queries-param req) - (run-queries) - (d/chain (fn [worlds] - (assoc json-response - :body (json/write-value-as-bytes worlds))))) - (.equals "/fortunes" uri) (d/chain' (get-fortunes) - fortunes-hiccup - (fn [body] - (assoc html-response :body body))) - (.equals "/updates" uri) (-> (sanitize-queries-param req) - (update-and-persist) - (d/chain (fn [worlds] - (assoc json-response - :body (json/write-value-as-bytes worlds))))) - :else {:status 404}))) - -;;; + (.equals "/json" uri) (assoc json-response + :body (json/write-value-as-bytes {:message "Hello, World!"})) + (.equals "/db" uri) (-> (query-one-random-world) + (d/chain (fn [world] + (assoc json-response + :body (json/write-value-as-bytes world))))) + (.equals "/queries" uri) (-> (sanitize-queries-param req) + (run-queries) + (d/chain (fn [worlds] + (assoc json-response + :body (json/write-value-as-bytes worlds))))) + (.equals "/fortunes" uri) (d/chain' (get-fortunes) + fortunes-hiccup + (fn [body] + (assoc html-response :body body))) + (.equals "/updates" uri) (-> (sanitize-queries-param req) + (update-and-persist) + (d/chain (fn [worlds] + (assoc json-response + :body (json/write-value-as-bytes worlds))))) + :else {:body "Not found" + :status 404}))) + (defn -main [& _] (netty/leak-detector-level! :disabled) - (http/start-server handler {:port 8080 - :raw-stream? true - :epoll? true - :executor :none + (println "starting server on port 8080") + (http/start-server handler {:port 8080 + :raw-stream? true + :executor :none :bootstrap-transform (fn [bootstrap] (.option bootstrap ChannelOption/ALLOCATOR PooledByteBufAllocator/DEFAULT) (.childOption bootstrap ChannelOption/ALLOCATOR PooledByteBufAllocator/DEFAULT)) - :pipeline-transform (fn [pipeline] - (.remove pipeline "continue-handler"))}) - ;; Uncomment to enable async-profiler - #_ - (do - (prof/profile-for 60 - #_ - {:transform (fn [s] - (when-not (re-find #"(writev|__libc|epoll_wait|write|__pthread)" s) - s))}) - (prof/serve-files 8081))) + :pipeline-transform (fn [pipeline] + (.remove pipeline "continue-handler"))})) diff --git a/frameworks/Clojure/donkey/donkey.dockerfile b/frameworks/Clojure/donkey/donkey.dockerfile index d93b82c7c10..cd7e6d18e57 100644 --- a/frameworks/Clojure/donkey/donkey.dockerfile +++ b/frameworks/Clojure/donkey/donkey.dockerfile @@ -1,10 +1,10 @@ -FROM clojure:openjdk-11-lein-2.9.3 as lein +FROM clojure:lein as lein WORKDIR /donkey COPY src src COPY project.clj project.clj RUN lein uberjar -FROM openjdk:11.0.9.1-jdk-slim +FROM openjdk:25-jdk-slim COPY --from=lein /donkey/target/hello-donkey-standalone.jar app.jar EXPOSE 8080 diff --git a/frameworks/Clojure/donkey/project.clj b/frameworks/Clojure/donkey/project.clj index 00dd3bd84e3..55818a8751a 100644 --- a/frameworks/Clojure/donkey/project.clj +++ b/frameworks/Clojure/donkey/project.clj @@ -1,7 +1,7 @@ (defproject hello "donkey" :description "Donkey Server" - :dependencies [[org.clojure/clojure "1.10.1"] - [com.appsflyer/donkey "0.4.1"]] + :dependencies [[org.clojure/clojure "1.12.3"] + [com.appsflyer/donkey "0.5.2"]] :jvm-opts ^:replace ["-Dclojure.compiler.direct-linking=true"] :main hello.handler :aot :all) diff --git a/frameworks/Clojure/kit/kit-majavat.dockerfile b/frameworks/Clojure/kit/kit-majavat.dockerfile index 55b27b6f122..fbea7e95bd4 100644 --- a/frameworks/Clojure/kit/kit-majavat.dockerfile +++ b/frameworks/Clojure/kit/kit-majavat.dockerfile @@ -6,7 +6,7 @@ COPY . / RUN clj -Sforce -T:build all -FROM azul/zulu-openjdk-alpine:17 +FROM openjdk:25-jdk-slim COPY --from=build /target/te-bench-standalone.jar /te-bench/te-bench-standalone.jar diff --git a/frameworks/Clojure/kit/kit.dockerfile b/frameworks/Clojure/kit/kit.dockerfile index 55b27b6f122..fbea7e95bd4 100644 --- a/frameworks/Clojure/kit/kit.dockerfile +++ b/frameworks/Clojure/kit/kit.dockerfile @@ -6,7 +6,7 @@ COPY . / RUN clj -Sforce -T:build all -FROM azul/zulu-openjdk-alpine:17 +FROM openjdk:25-jdk-slim COPY --from=build /target/te-bench-standalone.jar /te-bench/te-bench-standalone.jar From 72cffb8bbb1ace245ba5e46e469efef91383ed83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Wed, 22 Oct 2025 01:01:54 +0200 Subject: [PATCH 1675/1766] Fix and update Watson to latest (#10183) --- .../watson/Benchmarks/Benchmarks.csproj | 8 +++---- .../CSharp/watson/Benchmarks/Program.cs | 24 +++++++++---------- frameworks/CSharp/watson/README.md | 4 ++-- .../CSharp/watson/benchmark_config.json | 3 +-- frameworks/CSharp/watson/watson.dockerfile | 6 ++--- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/frameworks/CSharp/watson/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/watson/Benchmarks/Benchmarks.csproj index f199ceb3b59..01a0483b2d4 100644 --- a/frameworks/CSharp/watson/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/watson/Benchmarks/Benchmarks.csproj @@ -2,8 +2,8 @@ - net5.0 - 9.0 + net9.0 + 13.0 EmbedIO Benchmarks Test suite to be executed with TechEmpower FrameworkBenchmarks. @@ -17,8 +17,8 @@ - - + + \ No newline at end of file diff --git a/frameworks/CSharp/watson/Benchmarks/Program.cs b/frameworks/CSharp/watson/Benchmarks/Program.cs index 99e4d5922e4..d15cdbd5db1 100644 --- a/frameworks/CSharp/watson/Benchmarks/Program.cs +++ b/frameworks/CSharp/watson/Benchmarks/Program.cs @@ -1,11 +1,10 @@ using System; -using System.Linq; -using System.Net; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using WatsonWebserver; +using WatsonWebserver.Core; namespace Benchmarks { @@ -23,7 +22,7 @@ public class JsonResult public static class Program { - private static readonly ManualResetEvent _WaitEvent = new ManualResetEvent(false); + private static readonly ManualResetEvent WaitEvent = new(false); public static async Task Main(string[] args) { @@ -33,21 +32,23 @@ public static async Task Main(string[] args) var host = "tfb-server"; #endif - using var server = new Server(host, 8080, false, DefaultRoute); + var settings = new WebserverSettings(host, 8080, false); - server.Routes.Static.Add(HttpMethod.GET, "/plaintext", PlaintextRoute); - server.Routes.Static.Add(HttpMethod.GET, "/json", JsonRoute); + using var server = new Webserver(settings, DefaultRoute); + + server.Routes.PreAuthentication.Static.Add(HttpMethod.GET, "/plaintext", PlaintextRoute); + server.Routes.PreAuthentication.Static.Add(HttpMethod.GET, "/json", JsonRoute); try { AppDomain.CurrentDomain.ProcessExit += (_, __) => { - _WaitEvent.Set(); + WaitEvent.Set(); }; await server.StartAsync(); - _WaitEvent.WaitOne(); + WaitEvent.WaitOne(); return 0; } @@ -59,22 +60,21 @@ public static async Task Main(string[] args) } } - static async Task DefaultRoute(HttpContext ctx) + static async Task DefaultRoute(HttpContextBase ctx) { ctx.Response.StatusCode = 404; - ctx.Response.StatusDescription = "Not Found"; await ctx.Response.Send("Not found."); } - static async Task PlaintextRoute(HttpContext ctx) + static async Task PlaintextRoute(HttpContextBase ctx) { ctx.Response.Headers.Add("Content-Type", "text/plain; charset=UTF-8"); await ctx.Response.Send("Hello, World!"); } - static async Task JsonRoute(HttpContext ctx) + static async Task JsonRoute(HttpContextBase ctx) { var response = new JsonResult() { Message = "Hello, World!" }; var serialized = JsonSerializer.Serialize(response); diff --git a/frameworks/CSharp/watson/README.md b/frameworks/CSharp/watson/README.md index 549fa94b793..5ee00dc66d7 100644 --- a/frameworks/CSharp/watson/README.md +++ b/frameworks/CSharp/watson/README.md @@ -6,11 +6,11 @@ See the [project website](https://github.com/jchristn/WatsonWebserver) for more **Language** -* C# 9.0 +* C# 13.0 **Platforms** -* .NET 5 +* .NET 9 **Web Servers** diff --git a/frameworks/CSharp/watson/benchmark_config.json b/frameworks/CSharp/watson/benchmark_config.json index d6f8c86dece..6017f614566 100644 --- a/frameworks/CSharp/watson/benchmark_config.json +++ b/frameworks/CSharp/watson/benchmark_config.json @@ -16,8 +16,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "Watson Webserver", - "notes": "", - "tags": ["broken"] + "notes": "" } }] } diff --git a/frameworks/CSharp/watson/watson.dockerfile b/frameworks/CSharp/watson/watson.dockerfile index 675c16d8841..35e05ff1fc4 100644 --- a/frameworks/CSharp/watson/watson.dockerfile +++ b/frameworks/CSharp/watson/watson.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build WORKDIR /source # copy csproj and restore as distinct layers @@ -7,10 +7,10 @@ RUN dotnet restore -r linux-musl-x64 # copy and publish app and libraries COPY Benchmarks/ . -RUN dotnet publish -c release -o /app -r linux-musl-x64 +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained # final stage/image -FROM mcr.microsoft.com/dotnet/runtime-deps:5.0-alpine +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine WORKDIR /app COPY --from=build /app . From b6cb61e8796dede6b8d2f1dace432ff6ac0a008b Mon Sep 17 00:00:00 2001 From: "Benjamin M." Date: Wed, 22 Oct 2025 01:03:08 +0200 Subject: [PATCH 1676/1766] Fix warp (#10185) * Bring warp base back to work. * Try to fix mysql-haskell, but auth protocol not supported. * Upgrade ghc to 9.10 * Fix hasql and update stackage snapshot. * Auto-formatting --------- Co-authored-by: Benjamin Maurer --- frameworks/Haskell/warp/.gitignore | 1 + frameworks/Haskell/warp/benchmark_config.json | 12 +- .../Haskell/warp/shared/tfb-hasql/TFB/Db.hs | 141 ++++++++------ .../warp/shared/tfb-hasql/tfb-hasql.cabal | 7 +- .../warp/shared/tfb-mysql-haskell/README.md | 3 + .../warp/shared/tfb-mysql-haskell/TFB/Db.hs | 131 +++++++------ .../tfb-mysql-haskell/tfb-mysql-haskell.cabal | 5 +- .../warp/shared/tfb-postgres-simple/README.md | 3 + .../warp/shared/tfb-postgres-simple/TFB/Db.hs | 155 ++++++++++++++++ .../tfb-postgres-simple.cabal} | 11 +- .../warp/shared/tfb-postgres-wire/README.md | 3 - .../warp/shared/tfb-postgres-wire/TFB/Db.hs | 174 ------------------ .../warp/shared/tfb-types/TFB/Types.hs | 95 +++------- .../warp/shared/tfb-types/tfb-types.cabal | 3 +- frameworks/Haskell/warp/stack.yaml | 12 +- frameworks/Haskell/warp/stack.yaml.lock | 26 +++ .../Haskell/warp/warp-shared.dockerfile | 14 +- frameworks/Haskell/warp/warp-shared/README.md | 2 +- .../Haskell/warp/warp-shared/src/Lib.hs | 106 +++++------ .../Haskell/warp/warp-shared/src/Main.hs | 25 +-- .../warp/warp-shared/warp-shared.cabal | 12 +- 21 files changed, 481 insertions(+), 460 deletions(-) create mode 100644 frameworks/Haskell/warp/.gitignore create mode 100644 frameworks/Haskell/warp/shared/tfb-postgres-simple/README.md create mode 100644 frameworks/Haskell/warp/shared/tfb-postgres-simple/TFB/Db.hs rename frameworks/Haskell/warp/shared/{tfb-postgres-wire/tfb-postgres-wire.cabal => tfb-postgres-simple/tfb-postgres-simple.cabal} (76%) delete mode 100644 frameworks/Haskell/warp/shared/tfb-postgres-wire/README.md delete mode 100644 frameworks/Haskell/warp/shared/tfb-postgres-wire/TFB/Db.hs create mode 100644 frameworks/Haskell/warp/stack.yaml.lock diff --git a/frameworks/Haskell/warp/.gitignore b/frameworks/Haskell/warp/.gitignore new file mode 100644 index 00000000000..c1d9b4c9b89 --- /dev/null +++ b/frameworks/Haskell/warp/.gitignore @@ -0,0 +1 @@ +.stack-work \ No newline at end of file diff --git a/frameworks/Haskell/warp/benchmark_config.json b/frameworks/Haskell/warp/benchmark_config.json index 686d95a1758..e96726ac64d 100644 --- a/frameworks/Haskell/warp/benchmark_config.json +++ b/frameworks/Haskell/warp/benchmark_config.json @@ -14,16 +14,16 @@ "database": "Postgres", "framework": "Warp", "language": "Haskell", - "flavor": "GHC683", + "flavor": "GHC910", "orm": "Raw", "platform": "Wai", "webserver": "Wai", "os": "Linux", "database_os": "Linux", - "display_name": "Warp+Postgres-wire", + "display_name": "Warp+Postgres-simple", "notes": "Pure haskell.", "dockerfile": "warp-shared.dockerfile", - "tags": ["broken"] + "tags": [] }, "hasql": { "json_url": "/json", @@ -38,7 +38,7 @@ "database": "Postgres", "framework": "Warp", "language": "Haskell", - "flavor": "GHC683", + "flavor": "GHC910", "orm": "Raw", "platform": "Wai", "webserver": "Wai", @@ -47,7 +47,7 @@ "display_name": "Warp+Hasql", "notes": "Uses libpq system dependency.", "dockerfile": "warp-shared.dockerfile", - "tags": ["broken"] + "tags": [] }, "mysql-haskell": { "json_url": "/json", @@ -62,7 +62,7 @@ "database": "MySQL", "framework": "Warp", "language": "Haskell", - "flavor": "GHC683", + "flavor": "GHC910", "orm": "Raw", "platform": "Wai", "webserver": "Wai", diff --git a/frameworks/Haskell/warp/shared/tfb-hasql/TFB/Db.hs b/frameworks/Haskell/warp/shared/tfb-hasql/TFB/Db.hs index 8dcca736120..435d35e8f79 100644 --- a/frameworks/Haskell/warp/shared/tfb-hasql/TFB/Db.hs +++ b/frameworks/Haskell/warp/shared/tfb-hasql/TFB/Db.hs @@ -1,74 +1,101 @@ {-# OPTIONS -funbox-strict-fields #-} -{-# LANGUAGE OverloadedStrings #-} - -module TFB.Db ( - Pool - , mkPool - , Config(..) - , queryWorldById - , queryWorldByIds - , updateWorlds - , queryFortunes - , Error -) where - -import qualified TFB.Types as Types -import Control.Monad (forM, forM_) - -import qualified Hasql.Decoders as HasqlDec -import qualified Hasql.Encoders as HasqlEnc -import Hasql.Pool (Pool, acquire, UsageError, use) -import qualified Hasql.Statement as HasqlStatement -import Hasql.Session (statement) -import Hasql.Connection (settings, Settings) -import Data.Functor.Contravariant (contramap) -import Data.ByteString (ByteString) +{-# LANGUAGE OverloadedStrings #-} + +module TFB.Db + ( Pool, + mkPool, + Config (..), + queryWorldById, + queryWorldByIds, + updateWorlds, + queryFortunes, + Error, + ) +where + +import Control.Monad (forM, forM_) +import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as BSC +import Data.Functor.Contravariant (contramap) +import qualified Data.Text as T +import qualified Data.Text.Encoding as TE +import qualified Hasql.Connection.Setting as ConnectionSetting +import Hasql.Connection.Setting.Connection (params) +import qualified Hasql.Connection.Setting.Connection.Param as ConnectionParam +import qualified Hasql.Decoders as HasqlDec +import qualified Hasql.Encoders as HasqlEnc +import Hasql.Pool (Pool, UsageError, acquire, use) +import qualified Hasql.Pool.Config as PoolCfg +import Hasql.Session (statement) +import qualified Hasql.Statement as HasqlStatement +import qualified TFB.Types as Types ------------------------------------------------------------------------------- + -- * Database data Config = Config - { configHost :: String - , configName :: ByteString - , configUser :: ByteString - , configPass :: ByteString - , configStripes :: Int - , configPoolSize :: Int + { configHost :: String, + configName :: ByteString, + configUser :: ByteString, + configPass :: ByteString, + configStripes :: Int, + configPoolSize :: Int } + instance Show Config where - show c - = "Config {" - <> " configHost = " <> configHost c - <> ", configName = " <> BSC.unpack (configName c) - <> ", configUser = " <> BSC.unpack (configUser c) - <> ", configPass = REDACTED" - <> ", configStripes = " <> show (configStripes c) - <> ", configPoolSize = " <> show (configPoolSize c) - <> " }" + show c = + "Config {" + <> " configHost = " + <> configHost c + <> ", configName = " + <> BSC.unpack (configName c) + <> ", configUser = " + <> BSC.unpack (configUser c) + <> ", configPass = REDACTED" + <> ", configStripes = " + <> show (configStripes c) + <> ", configPoolSize = " + <> show (configPoolSize c) + <> " }" type Error = UsageError -mkSettings :: Config -> Settings -mkSettings c = settings (BSC.pack $ configHost c) 5432 (configUser c) (configPass c) (configName c) +mkSettings :: Config -> ConnectionSetting.Setting +mkSettings c = + ConnectionSetting.connection $ + params + [ ConnectionParam.host (T.pack $ configHost c), + ConnectionParam.port 5432, + ConnectionParam.user (TE.decodeUtf8 $ configUser c), + ConnectionParam.password (TE.decodeUtf8 $ configPass c), + ConnectionParam.dbname (TE.decodeUtf8 $ configName c) + ] mkPool :: Config -> IO Pool -mkPool c = acquire (configPoolSize c, 0.5, mkSettings c) +mkPool c = + acquire $ + PoolCfg.settings + [ PoolCfg.staticConnectionSettings [mkSettings c], + PoolCfg.size (configPoolSize c) + ] + +qidEnc :: HasqlEnc.Params Types.QId +qidEnc = contramap fromIntegral (HasqlEnc.param (HasqlEnc.nonNullable HasqlEnc.int4)) -intValEnc :: HasqlEnc.Params Types.QId -intValEnc = contramap fromIntegral $ HasqlEnc.param HasqlEnc.int2 -intValDec :: HasqlDec.Row Types.QId -intValDec = fmap fromIntegral $ HasqlDec.column HasqlDec.int2 +qidDec :: HasqlDec.Row Types.QId +qidDec = fromIntegral <$> (HasqlDec.column . HasqlDec.nonNullable) HasqlDec.int4 ------------------------------------------------------------------------------- + -- * World selectSingle :: HasqlStatement.Statement Types.QId Types.World -selectSingle = HasqlStatement.Statement q intValEnc decoder True +selectSingle = HasqlStatement.Statement q qidEnc decoder True where - q = "SELECT * FROM World WHERE (id = $1)" - decoder = HasqlDec.singleRow $ Types.World <$> intValDec <*> intValDec + q = "SELECT * FROM World WHERE (id = $1)" + decoder = HasqlDec.singleRow $ Types.World <$> qidDec <*> qidDec queryWorldById :: Pool -> Types.QId -> IO (Either Error Types.World) queryWorldById pool wId = use pool (statement wId selectSingle) @@ -79,11 +106,10 @@ queryWorldByIds pool wIds = use pool $ do forM wIds $ \wId -> statement wId selectSingle updateSingle :: HasqlStatement.Statement (Types.QId, Types.QId) () -updateSingle = HasqlStatement.Statement q encoder decoder True +updateSingle = HasqlStatement.Statement q encoder HasqlDec.noResult True where q = "UPDATE World SET randomNumber = $1 WHERE id = $2" - encoder = contramap fst intValEnc <> contramap snd intValEnc - decoder = HasqlDec.unit + encoder = contramap fst qidEnc <> contramap snd qidEnc updateWorlds :: Pool -> [(Types.World, Types.QId)] -> IO (Either Error [Types.World]) updateWorlds _ [] = pure . pure $ mempty @@ -93,18 +119,19 @@ updateWorlds pool wsUpdates = use pool $ do statement (Types.wId w, wNum) updateSingle return ws where - updateW (w,wNum) = w { Types.wRandomNumber = wNum } + updateW (w, wNum) = w {Types.wRandomNumber = wNum} ------------------------------------------------------------------------------- + -- * Fortunes selectFortunes :: HasqlStatement.Statement () [Types.Fortune] selectFortunes = HasqlStatement.Statement q encoder decoder True where - q = "SELECT * FROM Fortune" - encoder = HasqlEnc.unit - -- TODO: investigate whether 'rowList' is worth the more expensive 'cons'. - decoder = HasqlDec.rowList $ Types.Fortune <$> intValDec <*> HasqlDec.column HasqlDec.text + q = "SELECT * FROM Fortune" + encoder = HasqlEnc.noParams + -- TODO: investigate whether 'rowList' is worth the more expensive 'cons'. + decoder = HasqlDec.rowList $ Types.Fortune <$> qidDec <*> HasqlDec.column (HasqlDec.nonNullable HasqlDec.text) {-# INLINE selectFortunes #-} queryFortunes :: Pool -> IO (Either Error [Types.Fortune]) diff --git a/frameworks/Haskell/warp/shared/tfb-hasql/tfb-hasql.cabal b/frameworks/Haskell/warp/shared/tfb-hasql/tfb-hasql.cabal index 77e0b24cd9a..b9524dc33c3 100644 --- a/frameworks/Haskell/warp/shared/tfb-hasql/tfb-hasql.cabal +++ b/frameworks/Haskell/warp/shared/tfb-hasql/tfb-hasql.cabal @@ -15,10 +15,11 @@ library default-language: Haskell2010 exposed-modules: TFB.Db build-depends: - base >= 4.7 && < 5 + base >= 4.18 && < 5 , tfb-types , bytestring , text - , hasql >= 0.19 - , hasql-pool >= 0.4 + , hasql >= 1.9.3 + , hasql-pool >= 1.3.0 + , hasql-th >= 0.4.0 , contravariant diff --git a/frameworks/Haskell/warp/shared/tfb-mysql-haskell/README.md b/frameworks/Haskell/warp/shared/tfb-mysql-haskell/README.md index 8c156e8b795..f506958767d 100644 --- a/frameworks/Haskell/warp/shared/tfb-mysql-haskell/README.md +++ b/frameworks/Haskell/warp/shared/tfb-mysql-haskell/README.md @@ -1,3 +1,6 @@ # TFB MySQLHaskell `mysql-haskell` backend for TFB benchmarks that can re-used with any server. + +Note: Currently broken, as test server uses `caching_sha2_password` authentication, +but library mysql-haskell does not support this yet. diff --git a/frameworks/Haskell/warp/shared/tfb-mysql-haskell/TFB/Db.hs b/frameworks/Haskell/warp/shared/tfb-mysql-haskell/TFB/Db.hs index 057d0986911..2aa6e8d637d 100644 --- a/frameworks/Haskell/warp/shared/tfb-mysql-haskell/TFB/Db.hs +++ b/frameworks/Haskell/warp/shared/tfb-mysql-haskell/TFB/Db.hs @@ -1,76 +1,93 @@ -{-# OPTIONS -funbox-strict-fields #-} -{-# LANGUAGE OverloadedStrings #-} - -module TFB.Db ( - Pool - , mkPool - , Config(..) - , queryWorldById - , queryWorldByIds - , updateWorlds - , queryFortunes - , Error -) where - -import qualified TFB.Types as Types -import qualified Data.Either as Either -import Control.Monad (forM, forM_) - -import qualified Data.Pool as Pool -import Data.ByteString (ByteString) -import qualified Data.ByteString.Char8 as BSC -import qualified Database.MySQL.Base as MySQL -import qualified System.IO.Streams as Streams -import Data.Text (Text) -import qualified Data.Text as Text +{-# LANGUAGE OverloadedStrings #-} + +module TFB.Db + ( Pool, + mkPool, + Config (..), + queryWorldById, + queryWorldByIds, + updateWorlds, + queryFortunes, + Error, + ) +where + +import Control.Monad (forM, forM_) +import Data.ByteString (ByteString) +import Data.ByteString.Char8 qualified as BSC +import Data.Either qualified as Either +import Data.Pool qualified as Pool +import Data.Text (Text) +import Data.Text qualified as Text +import Database.MySQL.Base qualified as MySQL +import System.IO.Streams qualified as Streams +import TFB.Types qualified as Types ------------------------------------------------------------------------------- + -- * Database data Config = Config - { configHost :: String - , configName :: ByteString - , configUser :: ByteString - , configPass :: ByteString - , configStripes :: Int - , configPoolSize :: Int + { configHost :: String, + configName :: ByteString, + configUser :: ByteString, + configPass :: ByteString, + configStripes :: Int, + configPoolSize :: Int } + instance Show Config where - show c - = "Config {" - <> " configHost = " <> configHost c - <> ", configName = " <> BSC.unpack (configName c) - <> ", configUser = " <> BSC.unpack (configUser c) - <> ", configPass = REDACTED" - <> ", configStripes = " <> show (configStripes c) - <> ", configPoolSize = " <> show (configPoolSize c) - <> " }" + show c = + "Config {" + <> " configHost = " + <> configHost c + <> ", configName = " + <> BSC.unpack (configName c) + <> ", configUser = " + <> BSC.unpack (configUser c) + <> ", configPass = REDACTED" + <> ", configStripes = " + <> show (configStripes c) + <> ", configPoolSize = " + <> show (configPoolSize c) + <> " }" type Connection = MySQL.MySQLConn + type Pool = Pool.Pool Connection + type Error = Text + type DbRow = [MySQL.MySQLValue] connect :: Config -> IO Connection connect c = MySQL.connect myc where - myc = MySQL.defaultConnectInfoMB4 - { MySQL.ciHost = configHost c - , MySQL.ciDatabase = configName c - , MySQL.ciUser = configUser c - , MySQL.ciPassword = configPass c + myc = + MySQL.defaultConnectInfoMB4 + { MySQL.ciHost = configHost c, + MySQL.ciDatabase = configName c, + MySQL.ciUser = configUser c, + MySQL.ciPassword = configPass c } close :: Connection -> IO () close = MySQL.close mkPool :: Config -> IO Pool -mkPool c = Pool.createPool (connect c) close (configStripes c) 0.5 (configPoolSize c) +mkPool c = + Pool.newPool $ + Pool.setNumStripes (Just $ configStripes c) $ + Pool.defaultPoolConfig + (connect c) + close + 0.5 + (configPoolSize c) {-# SPECIALIZE intValEnc :: Int -> MySQL.MySQLValue #-} {-# SPECIALIZE intValEnc :: Types.QId -> MySQL.MySQLValue #-} -intValEnc :: Integral a => a -> MySQL.MySQLValue +intValEnc :: (Integral a) => a -> MySQL.MySQLValue intValEnc = MySQL.MySQLInt16U . fromIntegral intValDec :: MySQL.MySQLValue -> Either Text Int @@ -82,19 +99,20 @@ intValDec (MySQL.MySQLInt32U i) = pure . fromIntegral $ i intValDec (MySQL.MySQLInt32 i) = pure . fromIntegral $ i intValDec (MySQL.MySQLInt64U i) = pure . fromIntegral $ i intValDec (MySQL.MySQLInt64 i) = pure . fromIntegral $ i -intValDec x = Left $ "Expected MySQLInt*, received" <> (Text.pack $ show x) +intValDec x = Left $ "Expected MySQLInt*, received" <> Text.pack (show x) textValDec :: MySQL.MySQLValue -> Either Text Text textValDec (MySQL.MySQLText t) = pure t -textValDec x = Left $ "Expected Text, received" <> (Text.pack $ show x) +textValDec x = Left $ "Expected Text, received" <> Text.pack (show x) ------------------------------------------------------------------------------- + -- * World decodeWorld :: DbRow -> Either Error Types.World decodeWorld [] = Left "MarshalError: Expected 2 columns for World, found 0" -decodeWorld (_:[]) = Left "MarshalError: Expected 2 columns for World, found 1" -decodeWorld (c1:c2:_) = Types.World <$> intValDec c1 <*> intValDec c2 +decodeWorld [_] = Left "MarshalError: Expected 2 columns for World, found 1" +decodeWorld (c1 : c2 : _) = Types.World <$> intValDec c1 <*> intValDec c2 queryWorldById :: Pool -> Types.QId -> IO (Either Error Types.World) queryWorldById dbPool wId = Pool.withResource dbPool $ \conn -> do @@ -105,7 +123,7 @@ queryWorldById dbPool wId = Pool.withResource dbPool $ \conn -> do return $ case err of [] -> case oks of [] -> Left "World not found!" - ws -> pure $ head ws + w : _ -> pure w _ -> Left . mconcat $ err where s = "SELECT * FROM World WHERE id = ?" @@ -134,15 +152,16 @@ updateWorlds dbPool wsUpdates = Pool.withResource dbPool $ \conn -> do MySQL.closeStmt conn sId return . pure $ ws where - updateW (w,wNum) = w { Types.wRandomNumber = wNum } + updateW (w, wNum) = w {Types.wRandomNumber = wNum} ------------------------------------------------------------------------------- + -- * Fortunes decodeFortune :: DbRow -> Either Error Types.Fortune decodeFortune [] = Left "MarshalError: Expected 2 columns for Fortune, found 0" -decodeFortune (_:[]) = Left "MarshalError: Expected 2 columns for Fortune, found 1" -decodeFortune (c1:c2:_) = Types.Fortune <$> intValDec c1 <*> textValDec c2 +decodeFortune [_] = Left "MarshalError: Expected 2 columns for Fortune, found 1" +decodeFortune (c1 : c2 : _) = Types.Fortune <$> intValDec c1 <*> textValDec c2 queryFortunes :: Pool -> IO (Either Error [Types.Fortune]) queryFortunes dbPool = Pool.withResource dbPool $ \conn -> do @@ -152,4 +171,4 @@ queryFortunes dbPool = Pool.withResource dbPool $ \conn -> do let (err, oks) = Either.partitionEithers eFortunes return $ case err of [] -> pure oks - _ -> Left $ head err + w : _ -> Left w diff --git a/frameworks/Haskell/warp/shared/tfb-mysql-haskell/tfb-mysql-haskell.cabal b/frameworks/Haskell/warp/shared/tfb-mysql-haskell/tfb-mysql-haskell.cabal index 637c615e498..f1c17cf7ba8 100644 --- a/frameworks/Haskell/warp/shared/tfb-mysql-haskell/tfb-mysql-haskell.cabal +++ b/frameworks/Haskell/warp/shared/tfb-mysql-haskell/tfb-mysql-haskell.cabal @@ -12,10 +12,11 @@ extra-source-files: README.md library hs-source-dirs: . - default-language: Haskell2010 + default-language: GHC2021 + ghc-options: -funbox-strict-fields exposed-modules: TFB.Db build-depends: - base >= 4.7 && < 5 + base >= 4.18 && < 5 , tfb-types , bytestring , text diff --git a/frameworks/Haskell/warp/shared/tfb-postgres-simple/README.md b/frameworks/Haskell/warp/shared/tfb-postgres-simple/README.md new file mode 100644 index 00000000000..e558b2ae6f0 --- /dev/null +++ b/frameworks/Haskell/warp/shared/tfb-postgres-simple/README.md @@ -0,0 +1,3 @@ +# TFB PostgresSimple + +`postgres-simple` backend for TFB benchmarks that can re-used with any server. diff --git a/frameworks/Haskell/warp/shared/tfb-postgres-simple/TFB/Db.hs b/frameworks/Haskell/warp/shared/tfb-postgres-simple/TFB/Db.hs new file mode 100644 index 00000000000..3b1ed8e52f5 --- /dev/null +++ b/frameworks/Haskell/warp/shared/tfb-postgres-simple/TFB/Db.hs @@ -0,0 +1,155 @@ +{-# OPTIONS -Wno-orphans #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} + +module TFB.Db + ( Pool, + mkPool, + Config (..), + queryWorldById, + queryWorldByIds, + updateWorlds, + queryFortunes, + Error, + ) +where + +import Control.Exception (catch, try) +import Control.Monad (forM) +import Data.Bifunctor qualified as Bi +import Data.ByteString (ByteString) +import Data.ByteString.Char8 qualified as BSC +import Data.Either qualified as Either +import Data.Pool qualified as Pool +import Database.PostgreSQL.Simple (SomePostgreSqlException) +import Database.PostgreSQL.Simple qualified as PG +import Database.PostgreSQL.Simple.FromRow (FromRow (fromRow), field) +import System.IO.Error qualified as Error +import TFB.Types qualified as Types + +------------------------------------------------------------------------------- + +-- * Database + +data Config + = Config + { configHost :: String, + configName :: ByteString, + configUser :: ByteString, + configPass :: ByteString, + configStripes :: Int, + configPoolSize :: Int + } + +instance Show Config where + show c = + "Config {" + <> " configHost = " + <> configHost c + <> ", configName = " + <> BSC.unpack (configName c) + <> ", configUser = " + <> BSC.unpack (configUser c) + <> ", configPass = REDACTED" + <> ", configStripes = " + <> show (configStripes c) + <> ", configPoolSize = " + <> show (configPoolSize c) + <> " }" + +instance FromRow Types.World where + fromRow = Types.World <$> field <*> field + +instance FromRow Types.Fortune where + fromRow = Types.Fortune <$> field <*> field + +type Connection = PG.Connection + +type Pool = Pool.Pool Connection + +data Error + = DbError ByteString + | DbErrors [ByteString] + | NotFound + deriving (Show) + +connect :: Config -> IO Connection +connect c = catch (PG.connect pgc) failError + where + failError :: PG.SomePostgreSqlException -> IO a + failError = Error.ioError . Error.userError . show + pgc = + PG.defaultConnectInfo + { PG.connectHost = configHost c, + PG.connectDatabase = BSC.unpack $ configName c, + PG.connectUser = BSC.unpack $ configUser c, + PG.connectPassword = BSC.unpack $ configPass c + } + +close :: Connection -> IO () +close = PG.close + +mkPool :: Config -> IO Pool +mkPool c = + Pool.newPool $ + Pool.setNumStripes (Just $ configStripes c) $ + Pool.defaultPoolConfig + (connect c) + close + 0.5 + (configPoolSize c) + +------------------------------------------------------------------------------- + +-- * World + +queryWorldByIdInner :: Types.QId -> Connection -> IO (Either Error Types.World) +queryWorldByIdInner wId conn = do + let query = PG.query conn "SELECT * FROM World WHERE id = ?" (PG.Only wId :: PG.Only Types.QId) :: IO [Types.World] + res <- try @SomePostgreSqlException query + pure $ Either.either (Left . DbError . BSC.pack . show) mkW res + where + mkW [] = Left NotFound + mkW (w : _) = pure w + +queryWorldById :: Pool -> Types.QId -> IO (Either Error Types.World) +queryWorldById dbPool wId = Pool.withResource dbPool (queryWorldByIdInner wId) + +queryWorldByIds :: Pool -> [Types.QId] -> IO (Either Error [Types.World]) +queryWorldByIds dbPool wIds = Pool.withResource dbPool $ \conn -> do + rows <- forM wIds $ \wId -> queryWorldByIdInner wId conn + let (errs, rowsList) = Either.partitionEithers rows + return $ case errs of + [] -> pure rowsList + _ -> + Left . DbErrors $ + map + ( \case + DbError e -> e + _ -> error "Unexpected error" + ) + errs + +updateWorlds :: Pool -> [(Types.World, Int)] -> IO (Either Error [Types.World]) +updateWorlds dbPool wsUpdates = Pool.withResource dbPool $ \conn -> do + let worlds = Bi.first Types.wId <$> wsUpdates + res <- + try @SomePostgreSqlException $ + PG.executeMany + conn + "UPDATE World SET randomNumber = upd.rnd FROM (VALUES (?,?)) as upd(wid,rnd) WHERE World.id = upd.wid" + worlds + _ <- case res of + Left e -> print e + Right _ -> return () + pure $ Bi.bimap (DbError . BSC.pack . show) (const $ map (uncurry Types.World) worlds) res + +------------------------------------------------------------------------------- + +-- * Fortunes + +queryFortunes :: Pool -> IO (Either Error [Types.Fortune]) +queryFortunes dbPool = Pool.withResource dbPool $ \conn -> do + let query = PG.query_ conn "SELECT * FROM Fortune" :: IO [Types.Fortune] + res <- try @SomePostgreSqlException query + pure $ Bi.first (DbError . BSC.pack . show) res diff --git a/frameworks/Haskell/warp/shared/tfb-postgres-wire/tfb-postgres-wire.cabal b/frameworks/Haskell/warp/shared/tfb-postgres-simple/tfb-postgres-simple.cabal similarity index 76% rename from frameworks/Haskell/warp/shared/tfb-postgres-wire/tfb-postgres-wire.cabal rename to frameworks/Haskell/warp/shared/tfb-postgres-simple/tfb-postgres-simple.cabal index ac031c383ab..53e42d1c36d 100644 --- a/frameworks/Haskell/warp/shared/tfb-postgres-wire/tfb-postgres-wire.cabal +++ b/frameworks/Haskell/warp/shared/tfb-postgres-simple/tfb-postgres-simple.cabal @@ -1,6 +1,6 @@ -name: tfb-postgres-wire +name: tfb-postgres-simple version: 0.1.0.0 -homepage: https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/Haskell/warp/shared/tfb-postgres-wire +homepage: https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/Haskell/warp/shared/tfb-postgres-simple license: BSD3 author: Naushadh maintainer: naushadh@protonmail.com @@ -12,13 +12,14 @@ extra-source-files: README.md library hs-source-dirs: . - default-language: Haskell2010 + default-language: GHC2021 + ghc-options: -funbox-strict-fields exposed-modules: TFB.Db build-depends: - base >= 4.7 && < 5 + base >= 4.18 && < 5 , tfb-types , resource-pool - , postgres-wire + , postgresql-simple , bytestring , vector , text diff --git a/frameworks/Haskell/warp/shared/tfb-postgres-wire/README.md b/frameworks/Haskell/warp/shared/tfb-postgres-wire/README.md deleted file mode 100644 index 070d34f71a9..00000000000 --- a/frameworks/Haskell/warp/shared/tfb-postgres-wire/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# TFB PostgresWire - -`postgres-wire` backend for TFB benchmarks that can re-used with any server. diff --git a/frameworks/Haskell/warp/shared/tfb-postgres-wire/TFB/Db.hs b/frameworks/Haskell/warp/shared/tfb-postgres-wire/TFB/Db.hs deleted file mode 100644 index 00d35a9aa75..00000000000 --- a/frameworks/Haskell/warp/shared/tfb-postgres-wire/TFB/Db.hs +++ /dev/null @@ -1,174 +0,0 @@ -{-# OPTIONS -funbox-strict-fields #-} -{-# LANGUAGE OverloadedStrings #-} - -module TFB.Db ( - Pool - , mkPool - , Config(..) - , queryWorldById - , queryWorldByIds - , updateWorlds - , queryFortunes - , Error -) where - -import qualified TFB.Types as Types -import qualified Data.Either as Either -import qualified System.IO.Error as Error -import Control.Monad (replicateM, forM) - -import qualified Data.Pool as Pool -import Data.ByteString (ByteString) -import qualified Data.ByteString.Char8 as BSC -import qualified Database.PostgreSQL.Driver as PG -import qualified Database.PostgreSQL.Protocol.Types as PGT -import qualified Database.PostgreSQL.Protocol.DataRows as PGD -import qualified Database.PostgreSQL.Protocol.Store.Decode as PGSD -import qualified Database.PostgreSQL.Protocol.Store.Encode as PGSE -import qualified Database.PostgreSQL.Protocol.Codecs.Decoders as PGCD -import qualified Database.PostgreSQL.Protocol.Codecs.Encoders as PGCE -import qualified Database.PostgreSQL.Protocol.Codecs.PgTypes as PGCT -import qualified Data.Vector as V -import Data.Text (Text) -import qualified Data.Text.Encoding as TE - -------------------------------------------------------------------------------- --- * Database - -data Config - = Config - { configHost :: String - , configName :: ByteString - , configUser :: ByteString - , configPass :: ByteString - , configStripes :: Int - , configPoolSize :: Int - } -instance Show Config where - show c - = "Config {" - <> " configHost = " <> configHost c - <> ", configName = " <> BSC.unpack (configName c) - <> ", configUser = " <> BSC.unpack (configUser c) - <> ", configPass = REDACTED" - <> ", configStripes = " <> show (configStripes c) - <> ", configPoolSize = " <> show (configPoolSize c) - <> " }" - -type Connection = PG.Connection -type Pool = Pool.Pool Connection -data Error - = DbError PG.Error - | DbErrors [PG.Error] - | NotFound - deriving Show - -connect :: Config -> IO Connection -connect c = simplifyError =<< PG.connect pgc - where - simplifyError = Either.either (Error.ioError . Error.userError . show) pure - pgc = PG.defaultConnectionSettings - { PG.settingsHost = BSC.pack $ configHost c - , PG.settingsDatabase = configName c - , PG.settingsUser = configUser c - , PG.settingsPassword = configPass c - } - -close :: Connection -> IO () -close = PG.close - -mkPool :: Config -> IO Pool -mkPool c = Pool.createPool (connect c) close (configStripes c) 0.5 (configPoolSize c) - -runQuery :: Connection -> PGSD.Decode a -> PG.Query -> IO (Either PG.Error (V.Vector a)) -runQuery conn dec q = do - PG.sendBatchAndSync conn [q] - eRows <- PG.readNextData conn - _ <- PG.waitReadyForQuery conn - return $ fmap (PGD.decodeManyRows dec) eRows - -decodeInt :: PGSD.Decode Int -decodeInt = fromIntegral <$> PGCD.getNonNullable PGCD.int4 - -decodeText :: PGSD.Decode Text -decodeText = TE.decodeUtf8 <$> PGCD.getNonNullable PGCD.bytea - -encodeInt :: Integral a => a -> (PGCT.Oids, PGSE.Encode) -encodeInt qId = (PGCT.int2, PGCE.int2 $ fromIntegral qId) - -mkQuery :: ByteString -> [(PGCT.Oids, PGSE.Encode)] -> PG.Query -mkQuery q es = PG.Query q ps PGT.Binary PGT.Binary PG.NeverCache - where - mkP (oid, e) = (PGCT.oidType oid, Just e) - ps = fmap mkP es - -------------------------------------------------------------------------------- --- * World - -decodeWorld :: PGSD.Decode Types.World -decodeWorld = PGCD.dataRowHeader *> decoder - where - decoder = Types.World - <$> decodeInt - <*> decodeInt - -queryWorldById :: Pool -> Types.QId -> IO (Either Error Types.World) -queryWorldById dbPool wId = Pool.withResource dbPool $ \conn -> do - fmap go $ runQuery conn decodeWorld q - where - s = "SELECT * FROM World WHERE id = $1" - q = mkQuery s [encodeInt wId] - mkW [] = Left NotFound - mkW ws = pure . head $ ws - go = Either.either (Left . DbError) (mkW . V.toList) - -queryWorldByIds :: Pool -> [Types.QId] -> IO (Either Error [Types.World]) -queryWorldByIds _ [] = pure . pure $ mempty -queryWorldByIds dbPool wIds = Pool.withResource dbPool $ \conn -> do - let s = "SELECT * FROM World WHERE id = $1" - let mkQ wId = mkQuery s [encodeInt wId] - let qs = fmap mkQ wIds - PG.sendBatchAndSync conn qs - eRowsMany <- replicateM (length qs) $ PG.readNextData conn - _ <- PG.waitReadyForQuery conn - let (errs, rowsList) = Either.partitionEithers eRowsMany - return $ case errs of - [] -> pure . mconcat $ fmap (V.toList . PGD.decodeManyRows decodeWorld) rowsList - _ -> Left . DbErrors $ errs - -updateWorlds :: Pool -> [(Types.World, Int)] -> IO (Either Error [Types.World]) -updateWorlds _ [] = pure . pure $ mempty -updateWorlds dbPool wsUpdates = Pool.withResource dbPool $ \conn -> do - let ws = fmap updateW wsUpdates - let qs = fmap mkQ ws - eRowsMany <- forM qs $ \q -> do - PG.sendBatchAndSync conn [q] - eRows <- PG.readNextData conn - _ <- PG.waitReadyForQuery conn - return eRows - let (errs, _) = Either.partitionEithers eRowsMany - return $ case errs of - [] -> pure ws - _ -> Left . DbErrors $ errs - where - s = "UPDATE World SET randomNumber = $1 WHERE id = $2" - updateW (w,wNum) = w { Types.wRandomNumber = wNum } - mkQ w = mkQuery s [encodeInt . Types.wRandomNumber $ w, encodeInt . Types.wId $ w] - -------------------------------------------------------------------------------- --- * Fortunes - -decodeFortune :: PGSD.Decode Types.Fortune -decodeFortune = PGCD.dataRowHeader *> decoder - where - decoder = Types.Fortune - <$> decodeInt - <*> decodeText - -queryFortunes :: Pool -> IO (Either Error [Types.Fortune]) -queryFortunes dbPool = Pool.withResource dbPool $ \conn -> do - fmap go $ runQuery conn decodeFortune q - where - s = "SELECT * FROM Fortune" - q = mkQuery s [] - go = Either.either (Left . DbError) (pure . V.toList) diff --git a/frameworks/Haskell/warp/shared/tfb-types/TFB/Types.hs b/frameworks/Haskell/warp/shared/tfb-types/TFB/Types.hs index 0d0718e7b37..e0f0cd55319 100644 --- a/frameworks/Haskell/warp/shared/tfb-types/TFB/Types.hs +++ b/frameworks/Haskell/warp/shared/tfb-types/TFB/Types.hs @@ -1,30 +1,24 @@ {-# OPTIONS -funbox-strict-fields #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE TypeOperators #-} - -module TFB.Types ( - unsafeJsonString - , parseCount - , getCount - , Count - , World(..) - , Fortune(..) - , FortunesHtml - , QId -) where - -import qualified Data.Either as Either -import qualified Data.Char as Char +{-# LANGUAGE OverloadedStrings #-} + +module TFB.Types + ( unsafeJsonString, + parseCount, + getCount, + Count, + World (..), + Fortune (..), + QId, + ) +where -import Data.ByteString (ByteString) import qualified Data.Attoparsec.ByteString.Char8 as Parsec -import qualified Data.BufferBuilder.Utf8 as Utf8 +import Data.BufferBuilder.Json ((.=)) import qualified Data.BufferBuilder.Json as Json -import Data.BufferBuilder.Json ((.=)) -import qualified Html -import Html (type (#), type (>)) -import Data.Text (Text) +import qualified Data.BufferBuilder.Utf8 as Utf8 +import Data.ByteString (ByteString) +import qualified Data.Either as Either +import Data.Text (Text) ------------------------------------------------------------------------------- -- * Inputs @@ -32,65 +26,28 @@ import Data.Text (Text) newtype Count = Count Int parseCount :: ByteString -> Maybe Count -parseCount = fmap Count . Either.either (const Nothing) pure . Parsec.parseOnly parseInt +parseCount = fmap Count . Either.either (const Nothing) pure . Parsec.parseOnly Parsec.decimal getCount :: Maybe Count -> Int getCount Nothing = 1 getCount (Just (Count c)) = max 1 (min c 500) --- https://stackoverflow.com/a/24171263 -parseInt :: Parsec.Parser Int -parseInt = do - digits <- Parsec.many1 parseIntDigit - let n = foldl (\x d -> 10*x + (Char.digitToInt d)) 0 digits - seq n (return n) - -parseIntDigit :: Parsec.Parser Char -parseIntDigit = digit - where - digit = Parsec.satisfy isDigit - isDigit c = c >= '0' && c <= '9' - type QId = Int ------------------------------------------------------------------------------- -- * Outputs -data World = World { wId :: QId , wRandomNumber :: QId } - deriving Show +data World = World {wId :: QId, wRandomNumber :: QId} + deriving (Show) instance Json.ToJson World where - toJson w - = Json.toJson - $ "id" .= wId w - <> "randomNumber" .= wRandomNumber w - -data Fortune = Fortune { fId :: QId , fMessage :: Text } - deriving Show + toJson w = + Json.toJson $ + "id" .= wId w + <> "randomNumber" .= wRandomNumber w -type FortunesHtml - = (('Html.DOCTYPE Html.> ()) - # ('Html.Html - > (('Html.Head > ('Html.Title > Html.Raw Text)) - # ('Html.Body - > ('Html.Table - > ( - ('Html.Tr - > ( ('Html.Th > Html.Raw Text) - # ('Html.Th > Html.Raw Text) - ) - ) - # ['Html.Tr - > ( ('Html.Td > QId) - # ('Html.Td > Text) - ) - ] - ) - ) - ) - ) - ) - ) +data Fortune = Fortune {fId :: QId, fMessage :: Text} + deriving (Show) unsafeJsonString :: ByteString -> Json.Value unsafeJsonString = Json.unsafeValueUtf8Builder . Utf8.appendBS7 . quote diff --git a/frameworks/Haskell/warp/shared/tfb-types/tfb-types.cabal b/frameworks/Haskell/warp/shared/tfb-types/tfb-types.cabal index 250ed43cf8e..3fc2c9446f9 100644 --- a/frameworks/Haskell/warp/shared/tfb-types/tfb-types.cabal +++ b/frameworks/Haskell/warp/shared/tfb-types/tfb-types.cabal @@ -15,9 +15,8 @@ library default-language: Haskell2010 exposed-modules: TFB.Types build-depends: - base >= 4.7 && < 5 + base >= 4.18 && < 5 , bytestring , attoparsec , buffer-builder - , type-of-html , text diff --git a/frameworks/Haskell/warp/stack.yaml b/frameworks/Haskell/warp/stack.yaml index ff09c250201..7df4cd85668 100644 --- a/frameworks/Haskell/warp/stack.yaml +++ b/frameworks/Haskell/warp/stack.yaml @@ -1,18 +1,16 @@ -resolver: lts-13.13 +resolver: lts-24.11 packages: - ./shared/tfb-types - ./shared/tfb-hasql - ./shared/tfb-mysql-haskell -- ./shared/tfb-postgres-wire +- ./shared/tfb-postgres-simple - ./warp-shared extra-deps: -- socket-0.8.2.0 -- socket-unix-0.2.0.0 -- git: https://github.com/postgres-haskell/postgres-wire.git - commit: fda5e3b70c3cc0bab8365b4b872991d50da0348c +- buffer-builder-0.2.4.9 +- mysql-haskell-1.1.7 # the following flags are meant for use with warp.dockerfile -compiler: ghc-8.6.3 # this MUST match the resolver's GHC; minor hack to ensure GHC isn't downloaded into sandbox. +compiler: ghc-9.10.2 # this MUST match the resolver's GHC; minor hack to ensure GHC isn't downloaded into sandbox. allow-different-user: true diff --git a/frameworks/Haskell/warp/stack.yaml.lock b/frameworks/Haskell/warp/stack.yaml.lock new file mode 100644 index 00000000000..16819ffff37 --- /dev/null +++ b/frameworks/Haskell/warp/stack.yaml.lock @@ -0,0 +1,26 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/topics/lock_files + +packages: +- completed: + hackage: buffer-builder-0.2.4.9@sha256:22600bcca6b8657865d1dce07cfa791767bdb6241c0cd5cadd6444678bf9a8a7,5257 + pantry-tree: + sha256: f5eddef2db3cd6e0c2e2199a5a59cae0329b057045aa67705492d069f9e204f0 + size: 1155 + original: + hackage: buffer-builder-0.2.4.9 +- completed: + hackage: mysql-haskell-1.1.7@sha256:e1fc81c03063a50a169464e9983466249339c718b28012e2b69cd58e7c18487c,5498 + pantry-tree: + sha256: 8720dcd88265638550d96b2ef560fafd1b708bcf196a1c3add5f98c82d014711 + size: 4968 + original: + hackage: mysql-haskell-1.1.7 +snapshots: +- completed: + sha256: 468e1afa06cd069e57554f10e84fdf1ac5e8893e3eefc503ef837e2449f7e60c + size: 726310 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/24/11.yaml + original: lts-24.11 diff --git a/frameworks/Haskell/warp/warp-shared.dockerfile b/frameworks/Haskell/warp/warp-shared.dockerfile index 9c8091768d9..635674f2f46 100644 --- a/frameworks/Haskell/warp/warp-shared.dockerfile +++ b/frameworks/Haskell/warp/warp-shared.dockerfile @@ -1,7 +1,11 @@ -FROM haskell:8.6.3 +FROM haskell:9.10-slim-bullseye -RUN apt-get update -yqq && apt-get install -yqq xz-utils make -RUN apt-get install -yqq libpq-dev +RUN apt-get update -yqq && apt-get install -yqq xz-utils make curl ca-certificates +RUN install -d /usr/share/postgresql-common/pgdg +RUN curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc +RUN . /etc/os-release +RUN sh -c "echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list" +RUN apt-get update && apt-get install -yqq libpq-dev WORKDIR /app @@ -9,7 +13,7 @@ COPY stack.yaml ./ COPY ./shared/tfb-types/tfb-types.cabal ./shared/tfb-types/ COPY ./shared/tfb-hasql/tfb-hasql.cabal ./shared/tfb-hasql/ COPY ./shared/tfb-mysql-haskell/tfb-mysql-haskell.cabal ./shared/tfb-mysql-haskell/ -COPY ./shared/tfb-postgres-wire/tfb-postgres-wire.cabal ./shared/tfb-postgres-wire/ +COPY ./shared/tfb-postgres-simple/tfb-postgres-simple.cabal ./shared/tfb-postgres-simple/ COPY ./warp-shared/warp-shared.cabal ./warp-shared/ RUN stack setup RUN stack install --dependencies-only @@ -17,7 +21,7 @@ RUN stack install --dependencies-only ADD ./shared ./shared ADD ./warp-shared ./warp-shared RUN stack build --pedantic --copy-bins -RUN ln -s ~/.local/bin/warp-postgres-wire ~/.local/bin/warp +RUN ln -s ~/.local/bin/warp-postgres-simple ~/.local/bin/warp ARG TFB_TEST_NAME ENV TFB_TEST_NAME=${TFB_TEST_NAME} diff --git a/frameworks/Haskell/warp/warp-shared/README.md b/frameworks/Haskell/warp/warp-shared/README.md index 49bf57aef21..cc08a916e62 100644 --- a/frameworks/Haskell/warp/warp-shared/README.md +++ b/frameworks/Haskell/warp/warp-shared/README.md @@ -4,4 +4,4 @@ This is a generic test that produces an executable for each supported backend li - `warp-hasql`: PostgreSQL database via the [`hasql`](https://github.com/nikita-volkov/hasql) library. - `warp-mysql-haskell`: MySQL database via the [`mysql-haskell`](https://github.com/winterland1989/mysql-haskell) library. -- `warp-postgres-wire` (default): PostgreSQL database via the [`postgres-wire`](https://github.com/postgres-haskell/postgres-wire) library. +- `warp-postgres-simple` (default): PostgreSQL database via the [`postgres-simple`](https://github.com/postgres-haskell/postgres-simple) library. diff --git a/frameworks/Haskell/warp/warp-shared/src/Lib.hs b/frameworks/Haskell/warp/warp-shared/src/Lib.hs index 3b419a88eaa..210db9b25ab 100644 --- a/frameworks/Haskell/warp/warp-shared/src/Lib.hs +++ b/frameworks/Haskell/warp/warp-shared/src/Lib.hs @@ -1,27 +1,27 @@ -{-# LANGUAGE OverloadedStrings #-} - -module Lib ( - main - , Db.Config(..) -) where - -import qualified TFB.Types as Types -import qualified TFB.Db as Db -import qualified Data.Either as Either -import Data.List (sortOn) -import Control.Monad (replicateM, join) - -import qualified Data.ByteString.Lazy as LBS -import qualified Data.ByteString.Lazy.Char8 as LBSC -import qualified Network.HTTP.Types.Status as Status -import qualified Network.HTTP.Types.Header as Header -import qualified Network.Wai as Wai -import qualified Network.Wai.Handler.Warp as Warp -import qualified Data.BufferBuilder.Json as Json -import Data.BufferBuilder.Json ((.=)) -import qualified System.Random.MWC as MWC -import qualified Html -import Html ((#)) +{-# LANGUAGE OverloadedStrings #-} + +module Lib + ( main, + Db.Config (..), + ) +where + +import Control.Monad (join, replicateM) +import Data.BufferBuilder.Json ((.=)) +import Data.BufferBuilder.Json qualified as Json +import Data.ByteString.Lazy qualified as LBS +import Data.ByteString.Lazy.Char8 qualified as LBSC +import Data.Either qualified as Either +import Data.List (sortOn) +import Network.HTTP.Types.Header qualified as Header +import Network.HTTP.Types.Status qualified as Status +import Network.Wai qualified as Wai +import Network.Wai.Handler.Warp qualified as Warp +import System.Random.MWC qualified as MWC +import TFB.Db qualified as Db +import TFB.Types qualified as Types +import Text.Blaze.Html.Renderer.Utf8 qualified as Html +import Text.Blaze.Html5 qualified as Html -- entry point main :: Db.Config -> IO () @@ -41,18 +41,18 @@ app gen dbPool req respond = do let qParams = Wai.queryString req let mCount = Types.parseCount =<< join (lookup "queries" qParams) case (Wai.requestMethod req, Wai.pathInfo req) of - ("GET", ["plaintext"]) - -> respond getPlaintext - ("GET", ["json"]) - -> respond getJson - ("GET", ["db"]) - -> respond =<< getWorld gen dbPool - ("GET", ["fortunes"]) - -> respond =<< getFortunes dbPool - ("GET", ["queries"]) - -> respond =<< getWorlds gen dbPool mCount - ("GET", ["updates"]) - -> respond =<< updateWorlds gen dbPool mCount + ("GET", ["plaintext"]) -> + respond getPlaintext + ("GET", ["json"]) -> + respond getJson + ("GET", ["db"]) -> + respond =<< getWorld gen dbPool + ("GET", ["fortunes"]) -> + respond =<< getFortunes dbPool + ("GET", ["queries"]) -> + respond =<< getWorlds gen dbPool mCount + ("GET", ["updates"]) -> + respond =<< updateWorlds gen dbPool mCount _ -> respond routeNotFound -- * response helpers @@ -68,7 +68,7 @@ contentJson = [(Header.hContentType, "application/json")] {-# SPECIALIZE respondJson :: Json.ObjectBuilder -> Wai.Response #-} {-# SPECIALIZE respondJson :: Types.World -> Wai.Response #-} -respondJson :: Json.ToJson a => a -> Wai.Response +respondJson :: (Json.ToJson a) => a -> Wai.Response respondJson = Wai.responseLBS Status.status200 contentJson . mkBs where mkBs = LBS.fromStrict . Json.encodeJson @@ -76,8 +76,8 @@ respondJson = Wai.responseLBS Status.status200 contentJson . mkBs contentHtml :: Header.ResponseHeaders contentHtml = [(Header.hContentType, "text/html; charset=UTF-8")] -respondHtml :: Types.FortunesHtml -> Wai.Response -respondHtml = Wai.responseLBS Status.status200 contentHtml . Html.renderByteString +respondHtml :: Html.Html -> Wai.Response +respondHtml = Wai.responseBuilder Status.status200 contentHtml . Html.renderHtmlBuilder -- * error responses @@ -138,20 +138,22 @@ getFortunes dbPool = do res <- Db.queryFortunes dbPool return $ case res of Left e -> respondDbError e - Right fs -> respondHtml $ do + Right fs -> let new = Types.Fortune 0 "Additional fortune added at request time." - let header = Html.tr_ $ Html.th_ (Html.Raw "id") # Html.th_ (Html.Raw "message") - let mkRow f = Html.tr_ $ Html.td_ (fromIntegral $ Types.fId f) # Html.td_ (Types.fMessage $ f) - let rows = fmap mkRow $ sortOn Types.fMessage (new : fs) - Html.doctype_ # - Html.html_ ( - Html.head_ ( - Html.title_ (Html.Raw "Fortunes") - ) # - Html.body_ ( Html.table_ $ - header # rows - ) - ) + header = Html.tr $ do + Html.th $ Html.preEscapedToHtml ("id" :: String) + Html.th $ Html.preEscapedToHtml ("message" :: String) + mkRow f = Html.tr $ do + Html.td $ Html.toHtml ((fromIntegral $ Types.fId f) :: Int) + Html.td $ Html.toHtml (Types.fMessage f) + rows = (mkRow <$> sortOn Types.fMessage (new : fs)) + in respondHtml $ Html.docTypeHtml $ do + Html.head $ do + Html.title $ Html.preEscapedToHtml ("Fortunes" :: String) + Html.body $ do + Html.table $ do + header + sequence_ rows {-# INLINE getFortunes #-} randomId :: MWC.GenIO -> IO Types.QId diff --git a/frameworks/Haskell/warp/warp-shared/src/Main.hs b/frameworks/Haskell/warp/warp-shared/src/Main.hs index 654e19ac5da..4f85fa6e5de 100644 --- a/frameworks/Haskell/warp/warp-shared/src/Main.hs +++ b/frameworks/Haskell/warp/warp-shared/src/Main.hs @@ -1,10 +1,10 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} module Main where -import qualified Lib -import qualified GHC.Conc -import System.Environment (getArgs, lookupEnv) +import GHC.Conc qualified +import Lib qualified +import System.Environment (getArgs, lookupEnv) main :: IO () main = do @@ -15,11 +15,12 @@ main = do [x] -> pure x _ -> pure "0.0.0.0" numCaps <- GHC.Conc.getNumCapabilities - Lib.main $ Lib.Config { - Lib.configHost = dbHost, - Lib.configName = "hello_world", - Lib.configUser = "benchmarkdbuser", - Lib.configPass = "benchmarkdbpass", - Lib.configStripes = numCaps, - Lib.configPoolSize= 512 - } + Lib.main $ + Lib.Config + { Lib.configHost = dbHost, + Lib.configName = "hello_world", + Lib.configUser = "benchmarkdbuser", + Lib.configPass = "benchmarkdbpass", + Lib.configStripes = numCaps, + Lib.configPoolSize = 512 + } diff --git a/frameworks/Haskell/warp/warp-shared/warp-shared.cabal b/frameworks/Haskell/warp/warp-shared/warp-shared.cabal index 75d6a72ff5d..bc7bf933d48 100644 --- a/frameworks/Haskell/warp/warp-shared/warp-shared.cabal +++ b/frameworks/Haskell/warp/warp-shared/warp-shared.cabal @@ -1,4 +1,4 @@ -cabal-version: 2.4 +cabal-version: 3.8 -- `cabal-version` MUST match the version bundled with stack. -- run `stack exec -- cabal --version` to find out name: warp-shared @@ -15,15 +15,15 @@ extra-source-files: README.md common deps hs-source-dirs: src other-modules: Lib - default-language: Haskell2010 + default-language: GHC2021 ghc-options: -Wall -threaded -rtsopts -O2 -funbox-strict-fields build-depends: - base >= 4.7 && < 5 + base >= 4.18 && < 5 , bytestring , text , attoparsec , buffer-builder - , type-of-html + , blaze-html , mwc-random , wai , warp @@ -45,10 +45,10 @@ executable warp-mysql-haskell tfb-types , tfb-mysql-haskell -executable warp-postgres-wire +executable warp-postgres-simple import: deps main-is: Main.hs build-depends: tfb-types - , tfb-postgres-wire + , tfb-postgres-simple From c6c69adae387b52d9d293adc2caaa5abf7e54ae6 Mon Sep 17 00:00:00 2001 From: "Benjamin M." Date: Wed, 22 Oct 2025 01:03:27 +0200 Subject: [PATCH 1677/1766] Update dependencies for http4s. (#10186) Co-authored-by: Benjamin Maurer --- frameworks/Scala/http4s/blaze/build.sbt | 22 +++++++++++----------- frameworks/Scala/http4s/http4s.dockerfile | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Scala/http4s/blaze/build.sbt b/frameworks/Scala/http4s/blaze/build.sbt index c7be0723a4b..71578bedef4 100644 --- a/frameworks/Scala/http4s/blaze/build.sbt +++ b/frameworks/Scala/http4s/blaze/build.sbt @@ -2,7 +2,7 @@ name := "http4s" version := "1.0" -scalaVersion := "2.13.11" +scalaVersion := "2.13.17" scalacOptions ++= Seq( "-deprecation", @@ -19,9 +19,9 @@ scalacOptions ++= Seq( enablePlugins(SbtTwirl) -val http4sVersion = "0.23.22" -val http4sBlazeVersion = "0.23.15" -val http4sTwirlVersion = "0.23.17" +val http4sVersion = "0.23.32" +val http4sBlazeVersion = "0.23.17" +val http4sTwirlVersion = "0.23.18" assembly / assemblyMergeStrategy := { case PathList(xs @ _*) if xs.last == "io.netty.versions.properties" => MergeStrategy.rename @@ -35,13 +35,13 @@ libraryDependencies ++= Seq( "org.http4s" %% "http4s-twirl" % http4sTwirlVersion, "org.http4s" %% "http4s-circe" % http4sVersion, // Optional for auto-derivation of JSON codecs - "io.circe" %% "circe-generic" % "0.14.5", - "org.typelevel" %% "cats-effect" % "3.5.1", - "co.fs2" %% "fs2-core" % "3.7.0", - "co.fs2" %% "fs2-io" % "3.7.0", - "io.getquill" %% "quill-jasync-postgres" % "3.19.0", - "io.getquill" %% "quill-jasync" % "3.19.0", - "ch.qos.logback" % "logback-classic" % "1.4.8" + "io.circe" %% "circe-generic" % "0.14.15", + "org.typelevel" %% "cats-effect" % "3.6.3", + "co.fs2" %% "fs2-core" % "3.12.2", + "co.fs2" %% "fs2-io" % "3.12.2", + "io.getquill" %% "quill-jasync-postgres" % "4.8.0", + "io.getquill" %% "quill-jasync" % "4.8.0", + "ch.qos.logback" % "logback-classic" % "1.5.19" ) addCompilerPlugin("com.olegpy" %% "better-monadic-for" % "0.3.1") diff --git a/frameworks/Scala/http4s/http4s.dockerfile b/frameworks/Scala/http4s/http4s.dockerfile index c9ece9f5f9b..e059893aa79 100644 --- a/frameworks/Scala/http4s/http4s.dockerfile +++ b/frameworks/Scala/http4s/http4s.dockerfile @@ -1,4 +1,4 @@ -FROM sbtscala/scala-sbt:eclipse-temurin-21.0.6_7_1.10.11_2.13.16 AS builder +FROM sbtscala/scala-sbt:eclipse-temurin-21.0.8_9_1.11.7_2.13.17 AS builder WORKDIR /http4s COPY blaze/project project COPY blaze/src src @@ -10,7 +10,7 @@ RUN sbt assembly -batch && \ rm -Rf ~/.sbt && \ rm -Rf ~/.ivy2 && \ rm -Rf /var/cache - + FROM openjdk:21 WORKDIR /http4s COPY --from=builder /http4s/http4s-assembly-1.0.jar /http4s/http4s-assembly-1.0.jar From 78fe686f656d34a523723d83a6d2755c8e020143 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 22 Oct 2025 01:03:43 +0200 Subject: [PATCH 1678/1766] [ruby/rack] Update puma to 7.1 (#10187) This should improve the results for JRuby. --- frameworks/Ruby/rack/Gemfile | 2 +- frameworks/Ruby/rack/Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index 4a6ba0c30aa..7b63c17d3d6 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -32,7 +32,7 @@ group :pitchfork, optional: true do end group :puma, optional: true do - gem 'puma', '~> 7.0' + gem 'puma', '~> 7.1' end group :unicorn, optional: true do diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index c988b474189..806575b74d2 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -95,7 +95,7 @@ GEM protocol-rack (0.11.2) protocol-http (~> 0.43) rack (>= 1.0) - puma (7.0.2) + puma (7.1.0) nio4r (~> 2.0) racc (1.8.1) rack (3.2.2) @@ -156,7 +156,7 @@ DEPENDENCIES passenger (~> 6.1) pg (~> 1.5) pitchfork (~> 0.17) - puma (~> 7.0) + puma (~> 7.1) rack (~> 3.0) rack-test rubocop From 8eb2a7885fcece1c1e96b4473c850931b9ed4020 Mon Sep 17 00:00:00 2001 From: Dmitry Olshansky Date: Wed, 22 Oct 2025 02:04:03 +0300 Subject: [PATCH 1679/1766] Switch JSON library for photon-http (#10190) * Use Mir Ion for JSON and use buffer from xbuf * Use constants not magic numbers --------- Co-authored-by: Dmitry Olshansky --- frameworks/D/photon-http/dub.json | 5 +++-- frameworks/D/photon-http/source/app.d | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/frameworks/D/photon-http/dub.json b/frameworks/D/photon-http/dub.json index ab3f38cad36..d6f02952c74 100644 --- a/frameworks/D/photon-http/dub.json +++ b/frameworks/D/photon-http/dub.json @@ -4,9 +4,10 @@ ], "copyright": "Copyright © 2025, Dmitry Olshansky", "dependencies": { - "asdf": "~>0.7.17", + "mir-ion": "~>2.3.4", + "xbuf" : "~>0.2.1", "photon": "~>0.18.5", - "photon-http": "~>0.6.0" + "photon-http": "~>0.6.8" }, "description": "Benchmark of photon-http", "license": "BSL-1.0", diff --git a/frameworks/D/photon-http/source/app.d b/frameworks/D/photon-http/source/app.d index c730b26e9b3..94c585bfd59 100644 --- a/frameworks/D/photon-http/source/app.d +++ b/frameworks/D/photon-http/source/app.d @@ -2,7 +2,12 @@ import std.stdio; import std.socket; import std.array; -import asdf.serialization; +import mir.ser; +import mir.ser.json; + +import std.range.primitives; + +import glow.xbuf; import photon, photon.http; @@ -14,21 +19,21 @@ struct Message class BenchmarkProcessor : HttpProcessor { HttpHeader[] plainText = [HttpHeader("Content-Type", "text/plain; charset=utf-8")]; HttpHeader[] json = [HttpHeader("Content-Type", "application/json")]; - Appender!(char[]) jsonBuf; + Buffer!char jsonBuf; this(Socket sock) { super(sock); - jsonBuf = appender!(char[]); + jsonBuf = Buffer!char(256); } override void handle(HttpRequest req) { if (req.uri == "/plaintext") { - respondWith("Hello, world!", 200, plainText); + respondWith("Hello, world!", HttpStatus.OK, plainText); } else if(req.uri == "/json") { jsonBuf.clear(); - Message("Hello, World!").serializeToJsonPretty!""(jsonBuf); - respondWith(jsonBuf.data, 200, json); + serializeJsonPretty!""(jsonBuf, Message("Hello, World!")); + respondWith(jsonBuf.data, HttpStatus.OK, json); } else { - respondWith("Not found", 404, plainText); + respondWith("Not found", HttpStatus.NotFound, plainText); } } } From da8b3dd357c2770ca81ef25a964bd2a999aebbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 22 Oct 2025 07:04:39 +0800 Subject: [PATCH 1680/1766] Upgrade hyperlane (#10191) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: db * feat: db * feat: db * feat: db * feat: rand * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 371 ++++++++++-------- frameworks/Rust/hyperlane/Cargo.toml | 4 +- frameworks/Rust/hyperlane/src/db/fn.rs | 34 +- frameworks/Rust/hyperlane/src/db/mod.rs | 6 +- frameworks/Rust/hyperlane/src/main.rs | 34 +- .../Rust/hyperlane/src/middleware/fn.rs | 16 - .../Rust/hyperlane/src/middleware/impl.rs | 22 ++ .../Rust/hyperlane/src/middleware/mod.rs | 5 +- .../Rust/hyperlane/src/middleware/struct.rs | 1 + frameworks/Rust/hyperlane/src/route/fn.rs | 148 ------- frameworks/Rust/hyperlane/src/route/impl.rs | 189 +++++++++ frameworks/Rust/hyperlane/src/route/mod.rs | 5 +- frameworks/Rust/hyperlane/src/route/struct.rs | 7 + frameworks/Rust/hyperlane/src/server/const.rs | 42 +- frameworks/Rust/hyperlane/src/server/fn.rs | 59 --- frameworks/Rust/hyperlane/src/server/mod.rs | 8 +- .../Rust/hyperlane/src/server/struct.rs | 14 +- frameworks/Rust/hyperlane/src/utils/fn.rs | 6 +- frameworks/Rust/hyperlane/src/utils/mod.rs | 2 +- 19 files changed, 514 insertions(+), 459 deletions(-) delete mode 100644 frameworks/Rust/hyperlane/src/middleware/fn.rs create mode 100644 frameworks/Rust/hyperlane/src/middleware/impl.rs create mode 100644 frameworks/Rust/hyperlane/src/middleware/struct.rs delete mode 100644 frameworks/Rust/hyperlane/src/route/fn.rs create mode 100644 frameworks/Rust/hyperlane/src/route/impl.rs create mode 100644 frameworks/Rust/hyperlane/src/route/struct.rs delete mode 100644 frameworks/Rust/hyperlane/src/server/fn.rs diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 34ca8f6945a..ecbf124903f 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -62,21 +53,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.22.1" @@ -91,11 +67,11 @@ checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bitflags" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -142,9 +118,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "concurrent-queue" @@ -298,9 +274,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -434,9 +410,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -450,27 +426,21 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "hashbrown" version = "0.15.5" @@ -482,13 +452,19 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "hashlink" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown", + "hashbrown 0.15.5", ] [[package]] @@ -538,9 +514,9 @@ dependencies = [ [[package]] name = "http-compress" -version = "2.16.7" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589c065ec266404f9e35eb5ae75c542933647f225ee7d66224ae5f187ac8e061" +checksum = "9c1b2aca6817a5a211bd1aeafd3f3f5c9d222f3b1cac5416f667fd04d5ac655d" dependencies = [ "brotli", "flate2", @@ -549,15 +525,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.64.0" +version = "1.64.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed2dc878c44b9486a88b9751dd07290d13ca4ad19d68810fb5a5448c924a581" +checksum = "024182a8acc397613d6afdea76c8614c32296430248c99a4f9869d7b389b8456" [[package]] name = "http-type" -version = "5.5.0" +version = "5.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c55fba426eef13b6e820c4ba8917ef3a74d99e9d47dd5c79abab0c691cadd5" +checksum = "abb3fd7b0174cfa0fe95c630fc1b606eb82b4b2a44a47732d5474c79ec6265bd" dependencies = [ "hex", "http-compress", @@ -573,9 +549,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "9.5.0" +version = "10.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905bdfbd1cb98993eb90d97248f6c9dda002af35b93eca6096c8362751499f88" +checksum = "9f96f80d25daefea9a5e7d4a26723dd6b28e3144b24c76d7290f6acd23b6bf3a" dependencies = [ "http-type", "inventory", @@ -587,9 +563,9 @@ dependencies = [ [[package]] name = "hyperlane-time" -version = "0.7.8" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b7a0bcb6105d14602c6777b955605fd0abee9c3fd412b4af4712db8a61e358" +checksum = "0c1902a81b87724c226187b798658dd38038afe79eb337735eff39ec5f4d3d30" [[package]] name = "hyperlane_techempower" @@ -715,12 +691,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.0", ] [[package]] @@ -732,17 +708,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - [[package]] name = "itoa" version = "1.0.15" @@ -760,9 +725,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libm" @@ -772,9 +737,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags", "libc", @@ -799,25 +764,24 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lombok-macros" -version = "1.13.11" +version = "1.13.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7647fa75302b5ffffa7ff8bdb78220beb7da2be7eaf3a939453012f25931d749" +checksum = "3bf89b026ebf6e1c51f466b40f60f8e90a64305d9cf07268e1adaeceefcb3c7a" dependencies = [ "proc-macro2", "quote", @@ -836,9 +800,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "miniz_oxide" @@ -847,17 +811,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -917,15 +882,6 @@ dependencies = [ "libc", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -940,9 +896,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -950,15 +906,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1017,9 +973,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -1044,9 +1000,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -1113,23 +1069,23 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -1139,9 +1095,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -1150,9 +1106,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rsa" @@ -1174,12 +1130,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - [[package]] name = "rustversion" version = "1.0.22" @@ -1306,6 +1256,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "slab" version = "0.4.11" @@ -1323,12 +1279,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1379,7 +1335,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown", + "hashbrown 0.15.5", "hashlink", "indexmap", "log", @@ -1390,7 +1346,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -1472,7 +1428,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.15", + "thiserror 2.0.17", "tracing", "whoami", ] @@ -1509,7 +1465,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.15", + "thiserror 2.0.17", "tracing", "whoami", ] @@ -1533,16 +1489,16 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.15", + "thiserror 2.0.17", "tracing", "url", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stringprep" @@ -1563,9 +1519,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.106" +version = "2.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" dependencies = [ "proc-macro2", "quote", @@ -1594,11 +1550,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.15" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.15", + "thiserror-impl 2.0.17", ] [[package]] @@ -1614,9 +1570,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.15" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -1635,9 +1591,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -1650,29 +1606,26 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -1733,9 +1686,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-bidi" @@ -1745,9 +1698,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" @@ -1801,12 +1754,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -1825,6 +1778,12 @@ dependencies = [ "wasite", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.48.0" @@ -1843,6 +1802,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -1867,13 +1844,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -1886,6 +1880,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -1898,6 +1898,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -1910,12 +1916,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -1928,6 +1946,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -1940,6 +1964,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -1952,6 +1982,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -1965,13 +2001,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "windows_x86_64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -2011,18 +2050,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -2052,9 +2091,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index a1a42b0caf4..cedd3fad820 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,8 +20,8 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "9.5.0" -hyperlane-time = "0.7.8" +hyperlane = "10.6.0" +hyperlane-time = "0.7.12" num_cpus = "1.17.0" once_cell = "1.21.3" rand = "0.9.2" diff --git a/frameworks/Rust/hyperlane/src/db/fn.rs b/frameworks/Rust/hyperlane/src/db/fn.rs index 6385c2ded85..8418f711c88 100644 --- a/frameworks/Rust/hyperlane/src/db/fn.rs +++ b/frameworks/Rust/hyperlane/src/db/fn.rs @@ -1,11 +1,11 @@ use super::*; -pub fn get_db_connection() -> &'static DbPoolConnection { +pub(crate) fn get_db_connection() -> &'static DbPoolConnection { &DB } #[cfg(feature = "dev")] -pub async fn create_database() { +pub(crate) async fn create_database() { let db_pool: &DbPoolConnection = get_db_connection(); let _ = db_query(&format!("CREATE DATABASE {DATABASE_NAME};")) .execute(db_pool) @@ -13,7 +13,7 @@ pub async fn create_database() { } #[cfg(feature = "dev")] -pub async fn create_table() { +pub(crate) async fn create_table() { let db_pool: &DbPoolConnection = get_db_connection(); let _ = db_query(&format!( "CREATE TABLE IF NOT EXISTS {TABLE_NAME_WORLD} ( @@ -32,7 +32,7 @@ pub async fn create_table() { } #[cfg(feature = "dev")] -pub async fn insert_records() { +pub(crate) async fn insert_records() { let db_pool: &DbPoolConnection = get_db_connection(); let row: PgRow = db_query(&format!("SELECT COUNT(*) FROM {TABLE_NAME_WORLD}")) .fetch_one(db_pool) @@ -66,7 +66,7 @@ pub async fn insert_records() { let _ = db_query(&sql).execute(db_pool).await; } -pub async fn init_cache() -> Vec { +pub(crate) async fn init_cache() -> Vec { let mut res: Vec = Vec::with_capacity(RANDOM_MAX as usize); let db_pool: &DbPoolConnection = get_db_connection(); let sql: String = format!("SELECT id, randomNumber FROM {TABLE_NAME_WORLD} LIMIT {RANDOM_MAX}"); @@ -80,7 +80,7 @@ pub async fn init_cache() -> Vec { res } -pub async fn connection_db() -> DbPoolConnection { +pub(crate) async fn connection_db() -> DbPoolConnection { let db_url: &str = match option_env!("POSTGRES_URL") { Some(it) => it, _ => &format!( @@ -100,7 +100,7 @@ pub async fn connection_db() -> DbPoolConnection { pool } -pub async fn get_update_data(limit: Queries) -> (Vec, Vec, Vec) { +pub(crate) async fn get_update_data(limit: Queries) -> (Vec, Vec, Vec) { let db_pool: &DbPoolConnection = get_db_connection(); let mut query_res_list: Vec = Vec::with_capacity(limit as usize); let rows: Vec = get_some_row_id(limit, db_pool).await; @@ -115,7 +115,7 @@ pub async fn get_update_data(limit: Queries) -> (Vec, Vec, Vec QueryRow { +pub(crate) async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow { let random_id: Queries = get_random_id(); query_world_row(db_pool, random_id).await } -pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRow { +pub(crate) async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRow { let sql: &str = "SELECT id, randomNumber FROM World WHERE id = $1"; if let Ok(rows) = db_query(sql).bind(id).fetch_one(db_pool).await { let random_number: i32 = rows.get(KEY_RANDOM_NUMBER); - return QueryRow::new(id as i32, random_number); + return QueryRow::new(id, random_number); } - return QueryRow::new(id as i32, 1); + QueryRow::new(id, 1) } -pub async fn update_world_rows(limit: Queries) -> Vec { +pub(crate) async fn update_world_rows(limit: Queries) -> Vec { let db_pool: &DbPoolConnection = get_db_connection(); let (data, id_list, random_numbers) = get_update_data(limit).await; let sql: &str = "UPDATE World SET randomNumber = $1 WHERE id = $2"; @@ -159,14 +159,14 @@ pub async fn update_world_rows(limit: Queries) -> Vec { data } -pub async fn all_world_row() -> Vec { +pub(crate) async fn all_world_row() -> Vec { let db_pool: &DbPoolConnection = get_db_connection(); let sql: String = format!("SELECT id, message FROM {TABLE_NAME_FORTUNE}"); let res: Vec = db_query(&sql).fetch_all(db_pool).await.unwrap_or_default(); - return res; + res } -pub async fn get_some_row_id(limit: Queries, db_pool: &DbPoolConnection) -> Vec { +pub(crate) async fn get_some_row_id(limit: Queries, db_pool: &DbPoolConnection) -> Vec { let tasks: Vec<_> = (0..limit) .map(|_| { let db_pool: Pool = db_pool.clone(); diff --git a/frameworks/Rust/hyperlane/src/db/mod.rs b/frameworks/Rust/hyperlane/src/db/mod.rs index bc37c1dd653..7607362706f 100644 --- a/frameworks/Rust/hyperlane/src/db/mod.rs +++ b/frameworks/Rust/hyperlane/src/db/mod.rs @@ -2,8 +2,8 @@ pub(crate) mod r#fn; pub(crate) mod r#static; pub(crate) mod r#type; -pub use r#fn::*; -pub use r#static::*; -pub use r#type::*; +pub(crate) use r#fn::*; +pub(crate) use r#static::*; +pub(crate) use r#type::*; use super::*; diff --git a/frameworks/Rust/hyperlane/src/main.rs b/frameworks/Rust/hyperlane/src/main.rs index defdd97c550..ea346052b05 100644 --- a/frameworks/Rust/hyperlane/src/main.rs +++ b/frameworks/Rust/hyperlane/src/main.rs @@ -12,11 +12,7 @@ pub(crate) use std::fmt; pub(crate) use futures::{executor::block_on, future::join_all}; pub(crate) use hyperlane::{ - tokio::{ - runtime::{Builder, Runtime}, - spawn, - task::JoinHandle, - }, + tokio::{spawn, task::JoinHandle}, *, }; pub(crate) use hyperlane_time::*; @@ -30,6 +26,30 @@ pub(crate) use sqlx::{ query as db_query, }; -fn main() { - run_server(); +use middleware::*; +use route::*; + +#[tokio::main] +async fn main() { + init_db().await; + + let config: ServerConfig = ServerConfig::new().await; + config.host("0.0.0.0").await; + config.port(8080).await; + config.buffer(256).await; + config.disable_linger().await; + config.disable_nodelay().await; + + let server: Server = Server::from(config).await; + server.request_middleware::().await; + server.route::("/plaintext").await; + server.route::("/json").await; + server.route::("/cached-quer").await; + server.route::("/db").await; + server.route::("/query").await; + server.route::("/fortunes").await; + server.route::("/upda").await; + + let server_hook: ServerControlHook = server.run().await.unwrap_or_default(); + server_hook.wait().await; } diff --git a/frameworks/Rust/hyperlane/src/middleware/fn.rs b/frameworks/Rust/hyperlane/src/middleware/fn.rs deleted file mode 100644 index ec7bfc7c7dc..00000000000 --- a/frameworks/Rust/hyperlane/src/middleware/fn.rs +++ /dev/null @@ -1,16 +0,0 @@ -use super::*; - -pub async fn request(ctx: Context) { - ctx.set_response_version(HttpVersion::HTTP1_1) - .await - .set_response_header(CONNECTION, KEEP_ALIVE) - .await - .set_response_header(SERVER, HYPERLANE) - .await - .set_response_header(DATE, &gmt()) - .await - .set_response_status_code(200) - .await - .set_response_header(CONTENT_TYPE, APPLICATION_JSON) - .await; -} diff --git a/frameworks/Rust/hyperlane/src/middleware/impl.rs b/frameworks/Rust/hyperlane/src/middleware/impl.rs new file mode 100644 index 00000000000..f0559d8d539 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/middleware/impl.rs @@ -0,0 +1,22 @@ +use super::*; + +impl ServerHook for RequestMiddleware { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + ctx.set_response_version(HttpVersion::HTTP1_1) + .await + .set_response_header(CONNECTION, KEEP_ALIVE) + .await + .set_response_header(SERVER, HYPERLANE) + .await + .set_response_header(DATE, &gmt()) + .await + .set_response_status_code(200) + .await + .set_response_header(CONTENT_TYPE, APPLICATION_JSON) + .await; + } +} diff --git a/frameworks/Rust/hyperlane/src/middleware/mod.rs b/frameworks/Rust/hyperlane/src/middleware/mod.rs index 4ecc55e4383..976fe87bede 100644 --- a/frameworks/Rust/hyperlane/src/middleware/mod.rs +++ b/frameworks/Rust/hyperlane/src/middleware/mod.rs @@ -1,5 +1,6 @@ -pub(crate) mod r#fn; +pub(crate) mod r#impl; +pub(crate) mod r#struct; -pub use r#fn::*; +pub(crate) use r#struct::*; use super::*; diff --git a/frameworks/Rust/hyperlane/src/middleware/struct.rs b/frameworks/Rust/hyperlane/src/middleware/struct.rs new file mode 100644 index 00000000000..dd36f832031 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/middleware/struct.rs @@ -0,0 +1 @@ +pub(crate) struct RequestMiddleware; diff --git a/frameworks/Rust/hyperlane/src/route/fn.rs b/frameworks/Rust/hyperlane/src/route/fn.rs deleted file mode 100644 index f0bb54f8a84..00000000000 --- a/frameworks/Rust/hyperlane/src/route/fn.rs +++ /dev/null @@ -1,148 +0,0 @@ -use super::*; - -pub async fn json(ctx: Context) { - let json: Value = json!({ - "message": RESPONSEDATA_STR - }); - let run = || async { - ctx.set_response_body(&serde_json::to_vec(&json).unwrap_or_default()) - .await; - ctx.send().await.unwrap(); - }; - run().await; - while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { - run().await; - } - ctx.closed().await; -} - -pub async fn plaintext(ctx: Context) { - ctx.set_response_header(CONTENT_TYPE, TEXT_PLAIN).await; - ctx.set_response_body(&RESPONSEDATA_BIN).await; - let run = || async { - ctx.send().await.unwrap(); - }; - run().await; - while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { - run().await; - } - ctx.closed().await; -} - -pub async fn db(ctx: Context) { - let db_connection: &DbPoolConnection = get_db_connection(); - let run = || async { - let query_row: QueryRow = random_world_row(db_connection).await; - ctx.set_response_body(&serde_json::to_vec(&query_row).unwrap_or_default()) - .await - .send() - .await - .unwrap(); - }; - run().await; - while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { - run().await; - } - ctx.closed().await; -} - -pub async fn query(ctx: Context) { - let run = || async { - let queries: Queries = ctx - .try_get_request_query(QUERY_DB_QUERY_KEY) - .await - .and_then(|queries| queries.parse::().ok()) - .unwrap_or_default() - .min(ROW_LIMIT as Queries) - .max(1); - let db_pool: &DbPoolConnection = get_db_connection(); - let data: Vec = get_some_row_id(queries, db_pool).await; - ctx.set_response_body(&serde_json::to_vec(&data).unwrap_or_default()) - .await - .send() - .await - .unwrap(); - }; - run().await; - while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { - run().await; - } - ctx.closed().await; -} - -pub async fn fortunes(ctx: Context) { - ctx.set_response_header( - CONTENT_TYPE, - &ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), - ) - .await; - let run = || async { - let all_rows: Vec = all_world_row().await; - let mut fortunes_list: Vec = all_rows - .iter() - .map(|row| { - let id: i32 = row.get(KEY_ID); - let message: String = row.get(KEY_MESSAGE); - Fortunes::new(id, message) - }) - .collect(); - fortunes_list.push(Fortunes::new( - 0, - "Additional fortune added at request time.".to_owned(), - )); - fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); - let res: String = FortunesTemplate::new(fortunes_list).to_string(); - ctx.set_response_body(&res).await.send().await.unwrap(); - }; - run().await; - while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { - run().await; - } - ctx.closed().await; -} - -pub async fn update(ctx: Context) { - let run = || async { - let queries: Queries = ctx - .try_get_request_query(UPDATE_DB_QUERY_KEY) - .await - .and_then(|queries| queries.parse::().ok()) - .unwrap_or_default() - .min(ROW_LIMIT as Queries) - .max(1); - let res: Vec = update_world_rows(queries).await; - ctx.set_response_body(&serde_json::to_vec(&res).unwrap_or_default()) - .await - .send() - .await - .unwrap(); - }; - run().await; - while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { - run().await; - } - ctx.closed().await; -} - -pub async fn cached_query(ctx: Context) { - let run = || async { - let count: Queries = ctx - .try_get_request_query(CACHE_QUERY_KEY) - .await - .and_then(|queries| queries.parse::().ok()) - .unwrap_or_default() - .min(ROW_LIMIT as Queries) - .max(1); - let res: Vec<&QueryRow> = CACHE.iter().take(count as usize).collect(); - ctx.set_response_body(&serde_json::to_vec(&res).unwrap_or_default()) - .await - .send() - .await - .unwrap(); - }; - run().await; - while let Ok(_) = ctx.http_from_stream(HTTP_BUFFER).await { - run().await; - } - ctx.closed().await; -} diff --git a/frameworks/Rust/hyperlane/src/route/impl.rs b/frameworks/Rust/hyperlane/src/route/impl.rs new file mode 100644 index 00000000000..96eb1080be9 --- /dev/null +++ b/frameworks/Rust/hyperlane/src/route/impl.rs @@ -0,0 +1,189 @@ +use super::*; + +impl ServerHook for JsonRoute { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + let json: Value = json!({ + KEY_MESSAGE: RESPONSEDATA_STR + }); + let run = || async { + ctx.set_response_body(&serde_json::to_vec(&json).unwrap_or_default()) + .await; + ctx.send().await.unwrap(); + }; + run().await; + while ctx.http_from_stream(HTTP_BUFFER).await.is_ok() { + run().await; + } + ctx.closed().await; + } +} + +impl ServerHook for PlaintextRoute { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + ctx.set_response_header(CONTENT_TYPE, TEXT_PLAIN).await; + ctx.set_response_body(&RESPONSEDATA_BIN).await; + let run = || async { + ctx.send().await.unwrap(); + }; + run().await; + while ctx.http_from_stream(HTTP_BUFFER).await.is_ok() { + run().await; + } + ctx.closed().await; + } +} + +impl ServerHook for DbRoute { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + let db_connection: &DbPoolConnection = get_db_connection(); + let run = || async { + let query_row: QueryRow = random_world_row(db_connection).await; + ctx.set_response_body(&serde_json::to_vec(&query_row).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while ctx.http_from_stream(HTTP_BUFFER).await.is_ok() { + run().await; + } + ctx.closed().await; + } +} + +impl ServerHook for QueryRoute { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + let run = || async { + let queries: Queries = ctx + .try_get_request_query(QUERY_DB_QUERY_KEY) + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let db_pool: &DbPoolConnection = get_db_connection(); + let data: Vec = get_some_row_id(queries, db_pool).await; + ctx.set_response_body(&serde_json::to_vec(&data).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while ctx.http_from_stream(HTTP_BUFFER).await.is_ok() { + run().await; + } + ctx.closed().await; + } +} + +impl ServerHook for FortunesRoute { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + ctx.set_response_header( + CONTENT_TYPE, + &ContentType::format_content_type_with_charset(TEXT_HTML, UTF8), + ) + .await; + let run = || async { + let all_rows: Vec = all_world_row().await; + let mut fortunes_list: Vec = all_rows + .iter() + .map(|row| { + let id: i32 = row.get(KEY_ID); + Fortunes::new(id, row.get(KEY_MESSAGE)) + }) + .collect(); + fortunes_list.push(Fortunes::new( + 0, + "Additional fortune added at request time.".to_owned(), + )); + fortunes_list.sort_by(|it, next| it.message.cmp(&next.message)); + let res: String = FortunesTemplate::new(fortunes_list).to_string(); + ctx.set_response_body(&res).await.send().await.unwrap(); + }; + run().await; + while ctx.http_from_stream(HTTP_BUFFER).await.is_ok() { + run().await; + } + ctx.closed().await; + } +} + +impl ServerHook for UpdateRoute { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + let run = || async { + let queries: Queries = ctx + .try_get_request_query(UPDATE_DB_QUERY_KEY) + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let res: Vec = update_world_rows(queries).await; + ctx.set_response_body(&serde_json::to_vec(&res).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while ctx.http_from_stream(HTTP_BUFFER).await.is_ok() { + run().await; + } + ctx.closed().await; + } +} + +impl ServerHook for CachedQueryRoute { + async fn new(_ctx: &Context) -> Self { + Self + } + + async fn handle(self, ctx: &Context) { + let run = || async { + let count: Queries = ctx + .try_get_request_query(CACHE_QUERY_KEY) + .await + .and_then(|queries| queries.parse::().ok()) + .unwrap_or_default() + .min(ROW_LIMIT as Queries) + .max(1); + let res: Vec<&QueryRow> = CACHE.iter().take(count as usize).collect(); + ctx.set_response_body(&serde_json::to_vec(&res).unwrap_or_default()) + .await + .send() + .await + .unwrap(); + }; + run().await; + while ctx.http_from_stream(HTTP_BUFFER).await.is_ok() { + run().await; + } + ctx.closed().await; + } +} diff --git a/frameworks/Rust/hyperlane/src/route/mod.rs b/frameworks/Rust/hyperlane/src/route/mod.rs index 9fb49d8480f..6d47ae6e8b4 100644 --- a/frameworks/Rust/hyperlane/src/route/mod.rs +++ b/frameworks/Rust/hyperlane/src/route/mod.rs @@ -1,6 +1,7 @@ -pub(crate) mod r#fn; +pub(crate) mod r#impl; +pub(crate) mod r#struct; -pub use r#fn::*; +pub(crate) use r#struct::*; use super::*; diff --git a/frameworks/Rust/hyperlane/src/route/struct.rs b/frameworks/Rust/hyperlane/src/route/struct.rs new file mode 100644 index 00000000000..107268ec78a --- /dev/null +++ b/frameworks/Rust/hyperlane/src/route/struct.rs @@ -0,0 +1,7 @@ +pub(crate) struct JsonRoute; +pub(crate) struct PlaintextRoute; +pub(crate) struct DbRoute; +pub(crate) struct QueryRoute; +pub(crate) struct FortunesRoute; +pub(crate) struct UpdateRoute; +pub(crate) struct CachedQueryRoute; diff --git a/frameworks/Rust/hyperlane/src/server/const.rs b/frameworks/Rust/hyperlane/src/server/const.rs index ec9fcd751dc..c6c0cd98828 100644 --- a/frameworks/Rust/hyperlane/src/server/const.rs +++ b/frameworks/Rust/hyperlane/src/server/const.rs @@ -1,21 +1,21 @@ -pub const RESPONSEDATA_STR: &str = "Hello, World!"; -pub const RESPONSEDATA_BIN: &[u8] = b"Hello, World!"; -pub const DATABASE_TYPE: &str = "postgres"; -pub const DATABASE_HOST: &str = "tfb-database"; -pub const DATABASE_USER_NAME: &str = "benchmarkdbuser"; -pub const DATABASE_USER_PASSWORD: &str = "benchmarkdbpass"; -pub const DATABASE_PORT: usize = 5_432; -pub const DATABASE_NAME: &str = "hello_world"; -pub const TABLE_NAME_WORLD: &str = "World"; -pub const TABLE_NAME_FORTUNE: &str = "Fortune"; -pub const ROW_LIMIT: i32 = 500; -pub const RANDOM_MAX: i32 = 10_000; -pub const RANDOM_MAX_ADD_ONE: u32 = 10_001; -pub const KEY_ID: &str = "id"; -pub const KEY_RANDOM_NUMBER: &str = "randomnumber"; -pub const KEY_MESSAGE: &str = "message"; -pub const DB_MAX_CONNECTIONS: u32 = 100; -pub const HTTP_BUFFER: usize = 256; -pub const QUERY_DB_QUERY_KEY: &str = "q"; -pub const UPDATE_DB_QUERY_KEY: &str = "q"; -pub const CACHE_QUERY_KEY: &str = "c"; +pub(crate) const RESPONSEDATA_STR: &str = "Hello, World!"; +pub(crate) const RESPONSEDATA_BIN: &[u8] = b"Hello, World!"; +pub(crate) const DATABASE_TYPE: &str = "postgres"; +pub(crate) const DATABASE_HOST: &str = "tfb-database"; +pub(crate) const DATABASE_USER_NAME: &str = "benchmarkdbuser"; +pub(crate) const DATABASE_USER_PASSWORD: &str = "benchmarkdbpass"; +pub(crate) const DATABASE_PORT: usize = 5_432; +pub(crate) const DATABASE_NAME: &str = "hello_world"; +pub(crate) const TABLE_NAME_WORLD: &str = "World"; +pub(crate) const TABLE_NAME_FORTUNE: &str = "Fortune"; +pub(crate) const ROW_LIMIT: i32 = 500; +pub(crate) const RANDOM_MAX: i32 = 10_000; +pub(crate) const RANDOM_MAX_ADD_ONE: u32 = 10_001; +pub(crate) const KEY_ID: &str = "id"; +pub(crate) const KEY_RANDOM_NUMBER: &str = "randomnumber"; +pub(crate) const KEY_MESSAGE: &str = "message"; +pub(crate) const DB_MAX_CONNECTIONS: u32 = 100; +pub(crate) const HTTP_BUFFER: usize = 256; +pub(crate) const QUERY_DB_QUERY_KEY: &str = "q"; +pub(crate) const UPDATE_DB_QUERY_KEY: &str = "q"; +pub(crate) const CACHE_QUERY_KEY: &str = "c"; diff --git a/frameworks/Rust/hyperlane/src/server/fn.rs b/frameworks/Rust/hyperlane/src/server/fn.rs deleted file mode 100644 index fb2b691c292..00000000000 --- a/frameworks/Rust/hyperlane/src/server/fn.rs +++ /dev/null @@ -1,59 +0,0 @@ -use super::*; - -fn runtime() -> Runtime { - Builder::new_multi_thread() - .worker_threads(get_thread_count()) - .thread_stack_size(1_048_576) - .max_blocking_threads(2_048) - .max_io_events_per_tick(1_024) - .enable_all() - .build() - .unwrap() -} - -async fn init_server() { - let config: ServerConfig = ServerConfig::new().await; - config - .host("0.0.0.0") - .await - .port(8080) - .await - .disable_linger() - .await - .disable_nodelay() - .await - .buffer(256) - .await; - Server::from(config) - .await - .request_middleware(middleware::request) - .await - .route("/plaintext", route::plaintext) - .await - .route("/json", route::json) - .await - .route("/cached-quer", route::cached_query) - .await - .route("/db", route::db) - .await - .route("/query", route::query) - .await - .route("/fortunes", route::fortunes) - .await - .route("/upda", route::update) - .await - .run() - .await - .unwrap() - .wait() - .await; -} - -async fn init() { - init_db().await; - init_server().await; -} - -pub fn run_server() { - runtime().block_on(init()); -} diff --git a/frameworks/Rust/hyperlane/src/server/mod.rs b/frameworks/Rust/hyperlane/src/server/mod.rs index b5ef54eb72a..d806bc43dc2 100644 --- a/frameworks/Rust/hyperlane/src/server/mod.rs +++ b/frameworks/Rust/hyperlane/src/server/mod.rs @@ -1,12 +1,10 @@ pub(crate) mod r#const; -pub(crate) mod r#fn; pub(crate) mod r#impl; pub(crate) mod r#struct; pub(crate) mod r#type; -pub use r#const::*; -pub use r#fn::*; -pub use r#struct::*; -pub use r#type::*; +pub(crate) use r#const::*; +pub(crate) use r#struct::*; +pub(crate) use r#type::*; use super::*; diff --git a/frameworks/Rust/hyperlane/src/server/struct.rs b/frameworks/Rust/hyperlane/src/server/struct.rs index 47cda95e823..779f5dd691f 100644 --- a/frameworks/Rust/hyperlane/src/server/struct.rs +++ b/frameworks/Rust/hyperlane/src/server/struct.rs @@ -2,16 +2,16 @@ use super::*; #[allow(bad_style)] #[derive(Serialize, Default, Clone)] -pub struct QueryRow { - pub id: Queries, - pub randomNumber: Queries, +pub(crate) struct QueryRow { + pub(crate) id: Queries, + pub(crate) randomNumber: Queries, } #[derive(Serialize)] -pub struct Fortunes { - pub id: Queries, - pub message: String, +pub(crate) struct Fortunes { + pub(crate) id: Queries, + pub(crate) message: String, } #[derive(Serialize)] -pub struct FortunesTemplate(pub Vec); +pub(crate) struct FortunesTemplate(pub(crate) Vec); diff --git a/frameworks/Rust/hyperlane/src/utils/fn.rs b/frameworks/Rust/hyperlane/src/utils/fn.rs index dbd4da546f3..bd29a75f21f 100644 --- a/frameworks/Rust/hyperlane/src/utils/fn.rs +++ b/frameworks/Rust/hyperlane/src/utils/fn.rs @@ -1,10 +1,10 @@ use super::*; -pub fn get_thread_count() -> usize { +pub(crate) fn get_thread_count() -> usize { num_cpus::get().max(1) } -pub fn escape_html(input: &str) -> String { +pub(crate) fn escape_html(input: &str) -> String { let mut result: String = String::new(); for ch in input.chars() { match ch { @@ -19,7 +19,7 @@ pub fn escape_html(input: &str) -> String { result } -pub fn get_random_id() -> Queries { +pub(crate) fn get_random_id() -> Queries { let mut rng: SmallRng = SmallRng::from_rng(&mut rng()); let random_id: u32 = rng.random_range(1..RANDOM_MAX_ADD_ONE); random_id as Queries diff --git a/frameworks/Rust/hyperlane/src/utils/mod.rs b/frameworks/Rust/hyperlane/src/utils/mod.rs index 4ecc55e4383..910fe065558 100644 --- a/frameworks/Rust/hyperlane/src/utils/mod.rs +++ b/frameworks/Rust/hyperlane/src/utils/mod.rs @@ -1,5 +1,5 @@ pub(crate) mod r#fn; -pub use r#fn::*; +pub(crate) use r#fn::*; use super::*; From 77f4e1e97ffd4e81074bb4035012e7b7f73ca975 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 22 Oct 2025 01:05:52 +0200 Subject: [PATCH 1681/1766] [ruby/agoo] Use prepared statements (#10193) +------------------------+-----+-----+-------+ | branch_name| db|query|fortune| +------------------------+-----+-----+-------+ | master|69028|68419| 60723| |agoo/prepared-statements|98140|78085| 71027| +------------------------+-----+-----+-------+ --- frameworks/Ruby/agoo/app.rb | 62 +++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/frameworks/Ruby/agoo/app.rb b/frameworks/Ruby/agoo/app.rb index 8c01a4852ba..2c8e64bc9a9 100644 --- a/frameworks/Ruby/agoo/app.rb +++ b/frameworks/Ruby/agoo/app.rb @@ -7,13 +7,17 @@ require 'rack' $pool = ConnectionPool.new(size: 1, timeout: 5) do - PG::Connection.new({ - dbname: 'hello_world', - host: 'tfb-database', - user: 'benchmarkdbuser', - password: 'benchmarkdbpass' - }) - end + conn = PG::Connection.new({ + dbname: 'hello_world', + host: 'tfb-database', + user: 'benchmarkdbuser', + password: 'benchmarkdbpass' + }) + conn.set_error_verbosity(PG::PQERRORS_VERBOSE) + conn.prepare('select_world', 'SELECT * FROM world WHERE id = $1') + conn.prepare('select_fortune', 'SELECT id, message FROM fortune') + conn +end QUERY_RANGE = (1..10_000).freeze ALL_IDS = QUERY_RANGE.to_a @@ -43,11 +47,7 @@ def self.get_one_random_number def self.get_one_record(id = get_one_random_number) $pool.with do |conn| - conn.exec_params(<<-SQL, [id]).first - - SELECT * FROM world WHERE id = $1 - - SQL + conn.exec_prepared('select_world', [id]).first end end @@ -114,15 +114,12 @@ def self.call(_req) end end + class FortunesHandler < BaseHandler def self.call(_req) f_1 = $pool.with do |conn| - conn.exec(<<-SQL) - - SELECT id, message FROM fortune - - SQL - end + conn.exec_prepared('select_fortune', []) + end f_2 = f_1.map(&:to_h). append({ 'id' => '0', 'message' => 'Additional fortune added at request time.' }). @@ -192,21 +189,20 @@ def self.call(req) end Agoo::Log.configure({ - classic: true, - colorize: true, - console: true, - dir: '', - states: { - DEBUG: false, - INFO: false, - - connect: false, - eval: false, - push: false, - request: false, - response: false - } - }) + classic: true, + colorize: true, + console: true, + dir: '', + states: { + DEBUG: false, + INFO: false, + connect: false, + eval: false, + push: false, + request: false, + response: false + } +}) worker_count = 4 worker_count = ENV['AGOO_WORKER_COUNT'].to_i if ENV.key?('AGOO_WORKER_COUNT') From c0cfcd4685a57219a625c67ff3c914f624aa1fbc Mon Sep 17 00:00:00 2001 From: Edgar Espina Date: Tue, 21 Oct 2025 19:06:21 -0400 Subject: [PATCH 1682/1766] jooby: 4.0.9 (#10195) - use built-in vertx pg client - code clean-up --- .../Java/jooby/conf/application.vertx.conf | 6 + .../Java/jooby/jooby-pgclient.dockerfile | 4 +- frameworks/Java/jooby/pom.xml | 20 +- .../src/main/java/com/techempower/App.java | 2 +- .../main/java/com/techempower/PgClient.java | 201 ------------- .../main/java/com/techempower/ReactivePg.java | 277 +++++++++++------- frameworks/Kotlin/kooby/pom.xml | 2 +- 7 files changed, 196 insertions(+), 316 deletions(-) create mode 100644 frameworks/Java/jooby/conf/application.vertx.conf delete mode 100644 frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java diff --git a/frameworks/Java/jooby/conf/application.vertx.conf b/frameworks/Java/jooby/conf/application.vertx.conf new file mode 100644 index 00000000000..d3a286c4b71 --- /dev/null +++ b/frameworks/Java/jooby/conf/application.vertx.conf @@ -0,0 +1,6 @@ +# Add/Override some properties to matches Vertx pg Driver properties +db.database = ${db.databaseName} +db.host = ${db.serverName} +db.cachePreparedStatements = true +db.preparedStatementCacheMaxSize = 1024 +db.pipeliningLimit = 256 diff --git a/frameworks/Java/jooby/jooby-pgclient.dockerfile b/frameworks/Java/jooby/jooby-pgclient.dockerfile index 77eb7d3bea5..e5917ae2af5 100644 --- a/frameworks/Java/jooby/jooby-pgclient.dockerfile +++ b/frameworks/Java/jooby/jooby-pgclient.dockerfile @@ -4,8 +4,8 @@ COPY pom.xml pom.xml COPY src src COPY public public COPY conf conf -RUN mvn package -q -P netty +RUN mvn package -q -P vertx EXPOSE 8080 -CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "--enable-native-access=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.noUnsafe=false", "-Dio.netty.eventLoopGroup=single", "-cp", "target/jooby.jar", "com.techempower.ReactivePg"] +CMD ["java", "-server", "-Xms2g", "-Xmx2g", "-XX:+UseNUMA", "-XX:+UseParallelGC", "--enable-native-access=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--sun-misc-unsafe-memory-access=allow", "-Dio.netty.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-Dio.netty.noUnsafe=false", "-Dio.netty.eventLoopGroup=single", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableContextTimings=true", "-cp", "target/jooby.jar", "com.techempower.ReactivePg", "vertx"] diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index 20c192196cf..1c86733ddc9 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,7 +11,7 @@ jooby - 4.0.7 + 4.0.9 2.0.2 42.7.7 UTF-8 @@ -44,10 +44,11 @@ ${postgresql.version}
      + - io.vertx - vertx-pg-client - 5.0.1 + io.jooby + jooby-vertx-pg-client + ${jooby.version} @@ -205,6 +206,17 @@
      + + + vertx + + + io.jooby + jooby-vertx + ${jooby.version} + + + diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/App.java b/frameworks/Java/jooby/src/main/java/com/techempower/App.java index bd43f712c5c..fbc4bdb8164 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/App.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/App.java @@ -27,7 +27,7 @@ public class App extends Jooby { private static final String MESSAGE = "Hello, World!"; - private static final byte[] MESSAGE_BYTES = MESSAGE.getBytes(StandardCharsets.US_ASCII); + private static final byte[] MESSAGE_BYTES = MESSAGE.getBytes(StandardCharsets.UTF_8); { /** Database: */ diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java b/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java deleted file mode 100644 index 3bb393c8a3d..00000000000 --- a/frameworks/Java/jooby/src/main/java/com/techempower/PgClient.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.techempower; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.function.BiConsumer; - -import com.typesafe.config.Config; -import io.jooby.SneakyThrows; -import io.vertx.core.AsyncResult; -import io.vertx.core.Future; -import io.vertx.core.Handler; -import io.vertx.core.Vertx; -import io.vertx.core.VertxOptions; -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.Tuple; -import io.vertx.sqlclient.impl.SqlClientInternal; - -public class PgClient { - - static { - // Should be all I/O processing for SQL responses - System.setProperty("vertx.nettyIORatio", "100"); - } - - private static final String UPDATE_WORLD = "UPDATE world SET randomnumber=$1 WHERE id=$2"; - private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; - private static final String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; - - private static class DbConnection { - private SqlClientInternal queries; - private PreparedQuery> SELECT_WORLD_QUERY; - private PreparedQuery> SELECT_FORTUNE_QUERY; - private PreparedQuery> UPDATE_WORLD_QUERY; - private SqlClientInternal updates; - @SuppressWarnings("unchecked") - private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[500]; - } - - public static class PgUpdate { - private DbConnection connection; - - public PgUpdate(DbConnection connection) { - this.connection = connection; - } - - public void selectWorldForUpdate(int queries, BiConsumer>> consumer) { - connection.queries.group(c -> { - PreparedQuery> statement = c.preparedQuery(SELECT_WORLD); - for (int i = 0; i < queries; i++) { - consumer.accept(i, statement); - } - }); - } - - public void updateWorld(World[] worlds, Handler>> handler) { - Arrays.sort(worlds); - int len = worlds.length; - if (0 < len && len <= connection.AGGREGATED_UPDATE_WORLD_QUERY.length) { - List arguments = new ArrayList<>(); - for (World world : worlds) { - arguments.add(world.getId()); - arguments.add(world.getRandomNumber()); - } - Tuple tuple = Tuple.tuple(arguments); - PreparedQuery> query = connection.AGGREGATED_UPDATE_WORLD_QUERY[len - 1]; - query.execute(tuple).onComplete(handler); - } else { - List batch = new ArrayList<>(); - for (World world : worlds) { - batch.add(Tuple.of(world.getRandomNumber(), world.getId())); - } - connection.UPDATE_WORLD_QUERY.executeBatch(batch).onComplete(handler); - } - } - } - - private static class DbConnectionFactory extends ThreadLocal { - - private final PgConnectOptions options; - - public DbConnectionFactory(PgConnectOptions options) { - this.options = options; - } - - private Handler> onSuccess(Handler handler) { - return ar -> { - if (ar.succeeded()) { - handler.handle(ar.result()); - } - }; - } - - @Override protected DbConnection initialValue() { - try { - DbConnection result = new DbConnection(); - Vertx vertx = Vertx.vertx( - new VertxOptions() - .setPreferNativeTransport(true) - .setEventLoopPoolSize(1) - .setWorkerPoolSize(1) - .setInternalBlockingPoolSize(1) - ); - var client1 = PgConnection.connect(vertx, options) - .flatMap(conn -> { - result.queries = (SqlClientInternal) conn; - Future f1 = conn.prepare(SELECT_WORLD) - .andThen(onSuccess(ps -> result.SELECT_WORLD_QUERY = ps.query())); - Future f2 = conn.prepare(SELECT_FORTUNE) - .andThen(onSuccess(ps -> result.SELECT_FORTUNE_QUERY = ps.query())); - return Future.join(f1, f2); - }); - - var client2 = PgConnection.connect(vertx, options) - .flatMap(conn -> { - result.updates = (SqlClientInternal) conn; - List> list = new ArrayList<>(); - Future f1 = conn.prepare(UPDATE_WORLD) - .andThen(onSuccess(ps -> result.UPDATE_WORLD_QUERY = ps.query())); - list.add(f1); - for (int i = 0; i < result.AGGREGATED_UPDATE_WORLD_QUERY.length; i++) { - int idx = i; - list.add(conn - .prepare(buildAggregatedUpdateQuery(1 + idx)) - .andThen(onSuccess(ps -> result.AGGREGATED_UPDATE_WORLD_QUERY[idx] = ps.query()))); - } - return Future.join(list); - }); - var future = Future.join(client1, client2).toCompletionStage().toCompletableFuture().get(); - - Throwable cause = future.cause(); - if (cause != null) { - throw SneakyThrows.propagate(cause); - } - return result; - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - throw SneakyThrows.propagate(ex); - } catch (ExecutionException ex) { - throw SneakyThrows.propagate(ex.getCause()); - } - } - - private static String buildAggregatedUpdateQuery(int len) { - StringBuilder sb = new StringBuilder(); - sb.append("UPDATE world SET randomNumber = update_data.randomNumber FROM (VALUES"); - char sep = ' '; - for (int i = 1;i <= len;i++) { - sb.append(sep).append("($").append(2 * i - 1).append("::int,$").append(2 * i).append("::int)"); - sep = ','; - } - sb.append(") AS update_data (id, randomNumber) WHERE world.id = update_data.id"); - return sb.toString(); - } - } - - private final ThreadLocal sqlClient; - - public PgClient(Config config) { - this.sqlClient = new DbConnectionFactory(pgPoolOptions(config)); - } - - public void selectWorld(Tuple row, Handler>> handler) { - this.sqlClient.get().SELECT_WORLD_QUERY.execute(row).onComplete(handler); - } - - public void selectWorlds(int queries, Handler>> handler) { - this.sqlClient.get().queries.group(c -> { - for (int i = 0; i < queries; i++) { - c.preparedQuery(SELECT_WORLD).execute(Tuple.of(Util.boxedRandomWorld())).onComplete(handler); - } - }); - } - - public void fortunes(Handler>> handler) { - this.sqlClient.get().SELECT_FORTUNE_QUERY.execute().onComplete(handler); - } - - public PgUpdate updater() { - return new PgUpdate(sqlClient.get()); - } - - private PgConnectOptions pgPoolOptions(Config config) { - PgConnectOptions options = new PgConnectOptions(); - options.setDatabase(config.getString("databaseName")); - options.setHost(config.getString("serverName")); - options.setPort(config.getInt("portNumber")); - options.setUser(config.getString("user")); - options.setPassword(config.getString("password")); - options.setCachePreparedStatements(true); - // Large pipelining means less flushing and we use a single connection anyway - options.setPipeliningLimit(100_000); - return options; - } -} diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java index c14e45e317f..385c7180539 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java @@ -1,125 +1,188 @@ package com.techempower; -import static com.techempower.Util.boxedRandomWorld; -import static com.techempower.Util.randomWorld; import static io.jooby.ExecutionMode.EVENT_LOOP; import static io.jooby.MediaType.JSON; +import static io.jooby.Reified.getParameterized; +import static java.util.stream.IntStream.range; import java.util.*; +import java.util.function.Consumer; import io.jooby.*; import io.jooby.rocker.RockerModule; -import io.vertx.sqlclient.Row; -import io.vertx.sqlclient.RowIterator; -import io.vertx.sqlclient.Tuple; +import io.jooby.vertx.pgclient.VertxPgConnectionModule; +import io.vertx.core.AsyncResult; +import io.vertx.core.Handler; +import io.vertx.sqlclient.*; +import io.vertx.sqlclient.impl.SqlClientInternal; public class ReactivePg extends Jooby { - { - /** PG client: */ - PgClient client = new PgClient(getConfig().getConfig("db")); - - /** Template engine: */ - install(new RockerModule()); - Json.configure(getOutputFactory()); - - /** Single query: */ - get("/db", ctx -> { - client.selectWorld(Tuple.of(boxedRandomWorld()), rsp -> { - if (rsp.succeeded()) { - RowIterator rs = rsp.result().iterator(); - Row row = rs.next(); - ctx.setResponseType(JSON) - .send(Json.encode(new World(row.getInteger(0), row.getInteger(1)))); - } else { - ctx.sendError(rsp.cause()); + private final PreparedQuery> selectWorldQuery; + private final PreparedQuery> selectFortuneQuery; + private final List>> updateWorldQuery; + private final SqlClientInternal sqlClient; + + { + /** PG client: */ + install(new VertxPgConnectionModule().prepare(statements())); + + /** Template engine: */ + install(new RockerModule()); + Json.configure(getOutputFactory()); + + this.selectWorldQuery = require(PreparedQueryType, "selectWorld"); + this.selectFortuneQuery = require(PreparedQueryType, "selectFortune"); + this.updateWorldQuery = require(PreparedQueryTypeList, "updateWorld"); + this.sqlClient = require(SqlClientInternal.class); + + /** Single query: */ + get("/db", ctx -> { + selectWorldQuery + .execute(Tuple.of(Util.boxedRandomWorld())) + .onComplete( + rsp -> { + if (rsp.succeeded()) { + var rs = rsp.result().iterator(); + var row = rs.next(); + ctx.setResponseType(JSON) + .send(Json.encode(new World(row.getInteger(0), row.getInteger(1)))); + } else { + ctx.sendError(rsp.cause()); + } + }); + return ctx; + }); + + /** Multiple queries: */ + get("/queries", ctx -> { + int queries = Util.queries(ctx); + selectWorlds(ctx, queries, result -> ctx.setResponseType(JSON).send(Json.encode(result))); + return ctx; + }); + + /** Update queries: */ + get("/updates", ctx -> { + int queries = Util.queries(ctx); + selectWorlds( + ctx, + queries, + result -> { + updateWorld( + result, + ar -> { + if (ar.failed()) { + sendError(ctx, ar.cause()); + } else { + ctx.setResponseType(JSON).send(Json.encode(result)); + } + }); + }); + return ctx; + }); + + /** Fortunes: */ + get("/fortunes", ctx -> { + selectFortuneQuery.execute() + .onComplete(rsp -> { + if (rsp.succeeded()) { + RowIterator rs = rsp.result().iterator(); + List fortunes = new ArrayList<>(); + + while (rs.hasNext()) { + Row row = rs.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); + + /** render view: */ + ctx.setResponseType(MediaType.html) + .render(views.fortunes.template(fortunes)); + } else { + sendError(ctx, rsp.cause()); + } + }); + return ctx; + }); + } + + private void selectWorlds(Context ctx, int queries, Consumer> consumer) { + sqlClient.group( + client -> { + var statement = client.preparedQuery(SELECT_WORLD); + List worlds = new ArrayList<>(queries); + for (int i = 0; i < queries; i++) { + statement + .execute(Tuple.of(Util.boxedRandomWorld())) + .map(rs -> new World(rs.iterator().next().getInteger(0), Util.boxedRandomWorld())) + .onComplete( + ar -> { + if (ar.succeeded()) { + worlds.add(ar.result()); + if (worlds.size() == queries) { + consumer.accept(worlds); + } + } else { + sendError(ctx, ar.cause()); + } + }); + } + }); + } + + private void updateWorld(List worlds, Handler>> handler) { + Collections.sort(worlds); + int len = worlds.size(); + List arguments = new ArrayList<>(); + for (var world : worlds) { + arguments.add(world.getId()); + arguments.add(world.getRandomNumber()); } - }); - return ctx; - }); - - /** Multiple queries: */ - get("/queries", ctx -> { - int queries = Util.queries(ctx); - var result = new ArrayList(queries); - client.selectWorlds(queries, rsp -> { - if (rsp.succeeded()) { - RowIterator rs = rsp.result().iterator(); - Row row = rs.next(); - result.add(new World(row.getInteger(0), row.getInteger(1))); - } else { - sendError(ctx, rsp.cause()); + updateWorldQuery.get(len - 1).execute(Tuple.wrap(arguments)).onComplete(handler); + } + + private void sendError(Context ctx, Throwable cause) { + if (!ctx.isResponseStarted()) { + ctx.sendError(cause); } - // ready? - if (result.size() == queries) { - ctx.setResponseType(JSON) - .send(Json.encode(result)); + } + + private Map> statements() { + return Map.of( + "selectWorld", List.of(SELECT_WORLD), + "selectFortune", List.of(SELECT_FORTUNE), + "updateWorld", + range(0, 500).map(i -> i + 1).mapToObj(this::buildAggregatedUpdateQuery).toList()); + } + + private String buildAggregatedUpdateQuery(int len) { + var sql = new StringBuilder(); + sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); + for (int i = 0; i < len; i++) { + int offset = (i * 2) + 1; + sql.append(" WHEN $").append(offset).append(" THEN $").append(offset + 1); } - }); - return ctx; - }); - - /** Update queries: */ - get("/updates", ctx -> { - int queries = Util.queries(ctx); - World[] result = new World[queries]; - var updater = client.updater(); - updater.selectWorldForUpdate(queries, (index, statement) -> { - statement.execute(Tuple.of(boxedRandomWorld())).onComplete(rsp -> { - if (rsp.failed()) { - sendError(ctx, rsp.cause()); - return; - } - result[index] = new World( - rsp.result().iterator().next().getInteger(0), - boxedRandomWorld()); - if (index == queries - 1) { - updater.updateWorld(result, updateCallback -> { - if (updateCallback.failed()) { - sendError(ctx, updateCallback.cause()); - } else { - ctx.setResponseType(JSON) - .send(Json.encode(result)); - } - }); - } - }); - }); - return ctx; - }); - - /** Fortunes: */ - get("/fortunes", ctx -> { - client.fortunes(rsp -> { - if (rsp.succeeded()) { - RowIterator rs = rsp.result().iterator(); - List fortunes = new ArrayList<>(); - - while (rs.hasNext()) { - Row row = rs.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); - - /** render view: */ - ctx.setResponseType(MediaType.html) - .render(views.fortunes.template(fortunes)); - } else { - sendError(ctx, rsp.cause()); + sql.append(" ELSE RANDOMNUMBER"); + sql.append(" END WHERE ID IN ($1"); + for (int i = 1; i < len; i++) { + int offset = (i * 2) + 1; + sql.append(",$").append(offset); } - }); - return ctx; - }); - } - - private void sendError(Context ctx, Throwable cause) { - if (!ctx.isResponseStarted()) { - ctx.sendError(cause); + sql.append(")"); + return sql.toString(); } - } - public static void main(String[] args) { - runApp(args, EVENT_LOOP, ReactivePg::new); - } + private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; + private static final String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; + + private static final Reified>> PreparedQueryType = + getParameterized(PreparedQuery.class, getParameterized(RowSet.class, Row.class)); + + private static final Reified>>> PreparedQueryTypeList = + Reified.list(PreparedQueryType); + + public static void main(String[] args) { + runApp(args, EVENT_LOOP, ReactivePg::new); + } } diff --git a/frameworks/Kotlin/kooby/pom.xml b/frameworks/Kotlin/kooby/pom.xml index 4e962e35034..a27aaaa2a03 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -12,7 +12,7 @@ kooby: jooby+kotlin - 4.0.7 + 4.0.9 42.7.7 UTF-8 24 From cd4bc28d2df61cfb148359061a96f15864afa970 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 16:48:26 +0000 Subject: [PATCH 1683/1766] Build(deps): bump aiomysql in /frameworks/Python/api_hour Bumps [aiomysql](https://github.com/aio-libs/aiomysql) from 0.0.7 to 0.3.0. - [Release notes](https://github.com/aio-libs/aiomysql/releases) - [Changelog](https://github.com/aio-libs/aiomysql/blob/main/CHANGES.txt) - [Commits](https://github.com/aio-libs/aiomysql/commits) --- updated-dependencies: - dependency-name: aiomysql dependency-version: 0.3.0 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 5c128add682..c39d8dc9404 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -15,5 +15,5 @@ requests==2.32.4 requests-futures==0.9.5 setproctitle==1.1.8 ujson==1.33 -aiomysql==0.0.7 +aiomysql==0.3.0 PyMySQL==1.1.1 From 80bf2730bf62fb50ba615726b23570514aa3ca77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seonghyeon=20Cho=20=28=EC=A1=B0=EC=84=B1=ED=98=84=29?= Date: Thu, 23 Oct 2025 03:08:07 +0900 Subject: [PATCH 1684/1766] Update library, jdk, etc (#10189) Signed-off-by: Seonghyeon Cho --- frameworks/Java/armeria/README.md | 8 ++++---- frameworks/Java/armeria/armeria.dockerfile | 4 ++-- frameworks/Java/armeria/pom.xml | 18 +++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frameworks/Java/armeria/README.md b/frameworks/Java/armeria/README.md index 8ab23b8bcc6..685cebe559e 100644 --- a/frameworks/Java/armeria/README.md +++ b/frameworks/Java/armeria/README.md @@ -4,10 +4,10 @@ This is the armeria portion of a [benchmarking test suite](../) comparing a vari ## Infrastructure Software Versions -* [Armeria 0.71.1](https://line.github.io/armeria/) -* [HikariCP 2.7.8](https://github.com/brettwooldridge/HikariCP) -* [Postgresql 42.1.4](https://jdbc.postgresql.org/) -* [Mustache 0.9.5](https://mustache.github.io/) +* [Armeria 1.33.4](https://armeria.dev/) +* [HikariCP 7.0.2](https://github.com/brettwooldridge/HikariCP) +* [Postgresql 42.7.8](https://jdbc.postgresql.org/) +* [Mustache 0.9.14](https://mustache.github.io/) ## Source for Tests diff --git a/frameworks/Java/armeria/armeria.dockerfile b/frameworks/Java/armeria/armeria.dockerfile index c6d4e268f7a..ed0d6f546b3 100644 --- a/frameworks/Java/armeria/armeria.dockerfile +++ b/frameworks/Java/armeria/armeria.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.9.11-eclipse-temurin-25-alpine as maven WORKDIR /armeria COPY src src COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:11.0.3-jdk-slim +FROM eclipse-temurin:25-jre-alpine WORKDIR /armeria COPY --from=maven /armeria/target/hello-1.0-SNAPSHOT.jar app.jar diff --git a/frameworks/Java/armeria/pom.xml b/frameworks/Java/armeria/pom.xml index e73e9d61e3c..2b749491eb0 100644 --- a/frameworks/Java/armeria/pom.xml +++ b/frameworks/Java/armeria/pom.xml @@ -12,11 +12,11 @@ - 11 - 11 + 25 + 25 - 1.24.3 + 1.33.4 @@ -28,22 +28,22 @@ org.apache.logging.log4j log4j-slf4j-impl - 2.12.1 + 2.25.2 org.postgresql postgresql - 42.7.2 + 42.7.8 com.github.spullara.mustache.java compiler - 0.9.6 + 0.9.14 com.zaxxer HikariCP - 3.3.1 + 7.0.2 compile @@ -53,7 +53,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.14.1 false @@ -62,7 +62,7 @@ org.springframework.boot spring-boot-maven-plugin - 2.1.8.RELEASE + 3.5.6 From 5b694f14441d3fbb2e96553d12c3898b7ce38aac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 19:40:05 +0000 Subject: [PATCH 1685/1766] Build(deps): bump io.vertx:vertx-web in /frameworks/Prolog/tuProlog Bumps [io.vertx:vertx-web](https://github.com/vert-x3/vertx-web) from 4.3.8 to 4.5.22. - [Commits](https://github.com/vert-x3/vertx-web/compare/4.3.8...4.5.22) --- updated-dependencies: - dependency-name: io.vertx:vertx-web dependency-version: 4.5.22 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Prolog/tuProlog/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Prolog/tuProlog/pom.xml b/frameworks/Prolog/tuProlog/pom.xml index dd86c6a45a2..6705fd2ebed 100644 --- a/frameworks/Prolog/tuProlog/pom.xml +++ b/frameworks/Prolog/tuProlog/pom.xml @@ -12,7 +12,7 @@ 16 16 0.18.2 - 4.3.8 + 4.5.22 2.16.0 From f99bb89276455eb3f90eb3cac8253bfa70b73af3 Mon Sep 17 00:00:00 2001 From: "Benjamin M." Date: Thu, 23 Oct 2025 21:29:02 +0200 Subject: [PATCH 1686/1766] Fix postgrest (#10064) * Fix response media type for plaintext. * raw-media-types option was removed. * Rename json route, as json is a reserved keyword. * Use stricter stability modifiers. * Rename update path according to wiki * Minor improvement to docker-compose file. * Minor changes. * Fix fortunes benchmark. * Add clarifying comment for content-type. * Disable 'fortunes' benchmark, as harness doesn't count queries correctly. --------- Co-authored-by: Benjamin Maurer --- frameworks/Haskell/postgrest/README.md | 23 ++++++--- .../Haskell/postgrest/benchmark_config.json | 3 +- frameworks/Haskell/postgrest/config.toml | 1 + .../Haskell/postgrest/docker-compose.yml | 5 +- frameworks/Haskell/postgrest/postgrest.conf | 1 - .../Haskell/postgrest/postgrest.dockerfile | 4 +- frameworks/Haskell/postgrest/src/fortunes.sql | 49 +++++++------------ frameworks/Haskell/postgrest/src/json.sql | 4 +- .../Haskell/postgrest/src/plaintext.sql | 6 ++- frameworks/Haskell/postgrest/src/update.sql | 7 ++- 10 files changed, 49 insertions(+), 54 deletions(-) mode change 100755 => 100644 frameworks/Haskell/postgrest/README.md diff --git a/frameworks/Haskell/postgrest/README.md b/frameworks/Haskell/postgrest/README.md old mode 100755 new mode 100644 index 385ebf7b6ab..3ecb125391a --- a/frameworks/Haskell/postgrest/README.md +++ b/frameworks/Haskell/postgrest/README.md @@ -7,7 +7,7 @@ * [DB](src/db.sql) * [QUERY](src/query.sql) * [CACHED QUERY] Not Implemented -* [UPDATE] Not Implemented +* [UPDATE](src/update.sql) * [FORTUNES](src/fortunes.sql) ## Important Libraries @@ -17,7 +17,7 @@ The tests were run with: ## Test URLs ### JSON -http://localhost:3000/rpc/json +http://localhost:3000/rpc/jsonser ### PLAINTEXT @@ -31,14 +31,25 @@ http://localhost:3000/rpc/db http://localhost:3000/rpc/query?queries= -### CACHED QUERY Not Implemented +### CACHED QUERY - Not Implemented http://localhost:8080/cached_query?queries= -### UPDATE Not Implemented +### UPDATE - Not Working -http://localhost:3000/rpc/update?queries= +http://localhost:3000/rpc/updates?queries= -### FORTUNES +Technically, this is implemented (maybe not correctly though). +However, the benchmark issues this as a GET request. +PostgREST sets the transaction to READ ONLY for GET requests, +as they are supposed to be idempotent. +Hence this results in an error. Calling the endpoint with POST +works though. + +### FORTUNES - Disabled http://localhost:3000/rpc/fortunes.html + +This is supposed to work, but somehow the benchmark harness +doesn't count the queries correctly? +Was not able to figure this one out. diff --git a/frameworks/Haskell/postgrest/benchmark_config.json b/frameworks/Haskell/postgrest/benchmark_config.json index be82b4771a8..835943c34d8 100755 --- a/frameworks/Haskell/postgrest/benchmark_config.json +++ b/frameworks/Haskell/postgrest/benchmark_config.json @@ -3,11 +3,10 @@ "tests": [ { "default": { - "json_url": "/rpc/json", + "json_url": "/rpc/jsonser", "plaintext_url": "/rpc/plaintext", "db_url": "/rpc/db", "query_url": "/rpc/queries?queries=", - "fortunes_url": "/rpc/fortunes.html", "port": 3000, "approach": "Realistic", "classification": "Micro", diff --git a/frameworks/Haskell/postgrest/config.toml b/frameworks/Haskell/postgrest/config.toml index b98dcecc8ed..a5606004603 100644 --- a/frameworks/Haskell/postgrest/config.toml +++ b/frameworks/Haskell/postgrest/config.toml @@ -6,6 +6,7 @@ urls.plaintext = "/rpc/plaintext" urls.json = "/rpc/json" urls.db = "/rpc/db" urls.query = "/rpc/queries?queries=" +urls.fortune = "/rpc/fortunes" approach = "Realistic" classification = "Micro" database = "postgres" diff --git a/frameworks/Haskell/postgrest/docker-compose.yml b/frameworks/Haskell/postgrest/docker-compose.yml index 8b8b2a03e0f..eca0e4bbfb8 100644 --- a/frameworks/Haskell/postgrest/docker-compose.yml +++ b/frameworks/Haskell/postgrest/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3' services: tfb-database: build: @@ -13,4 +12,6 @@ services: dockerfile: postgrest.dockerfile context: . ports: - - 3030:3000 \ No newline at end of file + - 3030:3000 + depends_on: + - tfb-database diff --git a/frameworks/Haskell/postgrest/postgrest.conf b/frameworks/Haskell/postgrest/postgrest.conf index 688ef63d886..eaf7acfddac 100644 --- a/frameworks/Haskell/postgrest/postgrest.conf +++ b/frameworks/Haskell/postgrest/postgrest.conf @@ -16,4 +16,3 @@ role-claim-key = "$(PGRST_ROLE_CLAIM_KEY)" max-rows = "$(PGRST_MAX_ROWS)" pre-request = "$(PGRST_PRE_REQUEST)" root-spec = "$(PGRST_ROOT_SPEC)" -raw-media-types = "$(PGRST_RAW_MEDIA_TYPES)" \ No newline at end of file diff --git a/frameworks/Haskell/postgrest/postgrest.dockerfile b/frameworks/Haskell/postgrest/postgrest.dockerfile index fb5f224e9bd..fb25374ce37 100644 --- a/frameworks/Haskell/postgrest/postgrest.dockerfile +++ b/frameworks/Haskell/postgrest/postgrest.dockerfile @@ -23,12 +23,10 @@ ENV PGRST_MAX_ROWS= ENV PGRST_PRE_REQUEST= ENV PGRST_ROLE_CLAIM_KEY=.role ENV PGRST_ROOT_SPEC= -ENV PGRST_RAW_MEDIA_TYPES= ENV PGRST_DB_URI=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world ENV PGRST_DB_SCHEMA=public ENV PGRST_DB_ANON_ROLE=benchmarkdbuser -ENV PGRST_RAW_MEDIA_TYPES="text/html, text/plain" ENV PGRST_DB_POOL=64 RUN mkdir /app COPY src /app @@ -37,4 +35,4 @@ WORKDIR /app EXPOSE 3000 -ENTRYPOINT [ "/app/entrypoint.sh" ] \ No newline at end of file +ENTRYPOINT [ "/app/entrypoint.sh" ] diff --git a/frameworks/Haskell/postgrest/src/fortunes.sql b/frameworks/Haskell/postgrest/src/fortunes.sql index 5d4444b9529..f8de4591c8c 100644 --- a/frameworks/Haskell/postgrest/src/fortunes.sql +++ b/frameworks/Haskell/postgrest/src/fortunes.sql @@ -1,35 +1,20 @@ -CREATE TYPE fortune_t AS (id int, message text); +create domain "text/html" as text; -create or replace function fortune_template(f fortune_t) returns text as $$ - SELECT format('%s%s', $1.id, regexp_replace($1.message, '<', '<','g')); -$$ language sql volatile; +create or replace function sanitize_html(text) returns text as $$ + select replace(replace(replace(replace(replace($1, '&', '&'), '"', '"'),'>', '>'),'<', '<'), '''', ''') +$$ language sql immutable; -create or replace function fortunes_template(fortunes fortune_t[]) returns text as $$ -WITH header AS ( - SELECT 0 as id,' -Fortunes' as html -), footer AS ( - SELECT 2,'
      idmessage
      ' as html -), fortunes AS ( - SELECT unnest as fortune from unnest($1) -), additional AS ( - SELECT (-1, 'Additional fortune added at request time.')::fortune_t as f -), all_fortunes AS ( - SELECT * from (SELECT * FROM fortunes UNION ALL SELECT * from additional) p ORDER BY (fortune).message -), fortunes_html AS ( - SELECT 1,string_agg(fortune_template(fortune), '') from all_fortunes -), html AS ( - SELECT * FROM header UNION SELECT * FROM fortunes_html UNION SELECT * from footer ORDER BY id -) -SELECT string_agg(html,'') from html; -$$ language sql volatile; +create or replace function fortune_template("Fortune") returns text as $$ + SELECT format('%s%s', $1.id, sanitize_html($1.message)); +$$ language sql immutable; -create or replace function "fortunes.html"() returns bytea as $$ -DECLARE - fortunes fortune_t[]; -BEGIN - SET LOCAL "response.headers" = '[{"Content-Type": "text/html"}]'; - SELECT array_agg(CAST((id,message) AS fortune_t)) FROM "Fortunes" INTO fortunes; - RETURN convert_to(fortunes_template(fortunes), 'UTF8'); -END -$$ language plpgsql volatile; +create or replace function fortunes() returns "text/html" as $$ + -- This is only necessary bc. of the benchmark: The domain gives us content-type: text/html, + -- but the benchmark explicitly tests for the charset in the content-type. + select set_config('response.headers', '[{"Content-Type": "text/html; charset=utf-8"}]', true); + + select 'Fortunes' + || string_agg(fortune_template(f), NULL order by f.message collate unicode asc) + || '
      idmessage
      ' + from (select * from "Fortune" union all select 0, 'Additional fortune added at request time.') f; +$$ language sql volatile; diff --git a/frameworks/Haskell/postgrest/src/json.sql b/frameworks/Haskell/postgrest/src/json.sql index 69f468887f8..5df9168e372 100644 --- a/frameworks/Haskell/postgrest/src/json.sql +++ b/frameworks/Haskell/postgrest/src/json.sql @@ -1,3 +1,3 @@ -create function json() returns json as $$ +create function jsonser() returns json as $$ SELECT json_build_object('message', 'Hello, World!'); -$$ language sql volatile; \ No newline at end of file +$$ language sql immutable; diff --git a/frameworks/Haskell/postgrest/src/plaintext.sql b/frameworks/Haskell/postgrest/src/plaintext.sql index ed9dbda1784..b5be0003fcc 100644 --- a/frameworks/Haskell/postgrest/src/plaintext.sql +++ b/frameworks/Haskell/postgrest/src/plaintext.sql @@ -1,3 +1,5 @@ -create function plaintext() returns text as $$ +create domain "text/plain" as text; + +create function plaintext() returns "text/plain" as $$ SELECT 'Hello, World!'; -$$ language sql volatile; \ No newline at end of file +$$ language sql immutable; diff --git a/frameworks/Haskell/postgrest/src/update.sql b/frameworks/Haskell/postgrest/src/update.sql index 541e2a507cc..71aededfe44 100644 --- a/frameworks/Haskell/postgrest/src/update.sql +++ b/frameworks/Haskell/postgrest/src/update.sql @@ -1,4 +1,4 @@ -create or replace function update(queries text default '') returns jsonb as $$ +create or replace function updates(queries text default '') returns jsonb as $$ DECLARE r "World"%ROWTYPE; j jsonb := jsonb_build_array(); @@ -6,11 +6,10 @@ DECLARE rnd_id int; count int; BEGIN - SET TRANSACTION READ WRITE; IF queries ~ '^[1-9]\d{0,2}$' THEN count := CAST(queries as int); - ELSE - count := 1; + ELSE + count := 1; END IF; IF count > 500 THEN count := 500; From dceb70aecfe00627c62705e8f1491f9b1bf83dff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 28 Oct 2025 05:34:24 +0800 Subject: [PATCH 1687/1766] Upgrade hyperlane (#10201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: rand * feat: rand * feat: rand * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: 2025-10-24 12:22:32 * feat: v0.1.0 * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 97 ++++------------------------ frameworks/Rust/hyperlane/Cargo.toml | 2 +- 2 files changed, 13 insertions(+), 86 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index ecbf124903f..b2c7b644187 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -505,11 +505,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -549,9 +549,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "10.6.0" +version = "10.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f96f80d25daefea9a5e7d4a26723dd6b28e3144b24c76d7290f6acd23b6bf3a" +checksum = "05aff625011d8505138f31ce05a506c4754c6f7240200c06e1e053f70ee6b952" dependencies = [ "http-type", "inventory", @@ -991,9 +991,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -1519,9 +1519,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.107" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -1698,9 +1698,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-normalization" @@ -1793,15 +1793,6 @@ dependencies = [ "windows-targets 0.48.5", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" @@ -1835,22 +1826,6 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - [[package]] name = "windows-targets" version = "0.53.5" @@ -1861,7 +1836,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", + "windows_i686_gnullvm", "windows_i686_msvc 0.53.1", "windows_x86_64_gnu 0.53.1", "windows_x86_64_gnullvm 0.53.1", @@ -1874,12 +1849,6 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - [[package]] name = "windows_aarch64_gnullvm" version = "0.53.1" @@ -1892,12 +1861,6 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - [[package]] name = "windows_aarch64_msvc" version = "0.53.1" @@ -1910,24 +1873,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - [[package]] name = "windows_i686_gnu" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - [[package]] name = "windows_i686_gnullvm" version = "0.53.1" @@ -1940,12 +1891,6 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - [[package]] name = "windows_i686_msvc" version = "0.53.1" @@ -1958,12 +1903,6 @@ 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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - [[package]] name = "windows_x86_64_gnu" version = "0.53.1" @@ -1976,12 +1915,6 @@ 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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - [[package]] name = "windows_x86_64_gnullvm" version = "0.53.1" @@ -1994,12 +1927,6 @@ 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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - [[package]] name = "windows_x86_64_msvc" version = "0.53.1" diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index cedd3fad820..d24001b5f29 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,7 +20,7 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "10.6.0" +hyperlane = "10.7.2" hyperlane-time = "0.7.12" num_cpus = "1.17.0" once_cell = "1.21.3" From 1290aa7853a5391683e33021638b8de10cb2f5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Tue, 28 Oct 2025 05:34:42 +0800 Subject: [PATCH 1688/1766] update(touchsocket):version to 4.0.0-rc.2 (#10202) * update(touchsocket):version to 4.0.0-rc.2 * update(touchsocket):version to 4.0.0-rc.5 --- .../touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj | 4 ++-- .../src/TouchSocketWebApi/TouchSocketWebApi.csproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index 1b9d682382f..b09d51fff00 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index 9067bb77f51..572563f16bb 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -9,7 +9,7 @@ - - + + From 4a7376bb97d58fbfa5b7cfb1674ef440495a8a90 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 27 Oct 2025 22:35:04 +0100 Subject: [PATCH 1689/1766] [ruby/rails] Use nginx for Pitchfork (#10203) Pitchfork relies on a buffering reverse proxy to efficiently deal with slow clients. +---------------+-------------------------+-------+ | name| branch_name|fortune| +---------------+-------------------------+-------+ |rails-pitchfork| master| 7359| |rails-pitchfork| rails/nginx-pitchfork| 12162| +---------------+-------------------------+-------+ --- frameworks/Ruby/rails/config/nginx.conf | 158 ++++++++++++++++++ frameworks/Ruby/rails/config/pitchfork.rb | 2 + .../Ruby/rails/rails-pitchfork.dockerfile | 3 + 3 files changed, 163 insertions(+) create mode 100644 frameworks/Ruby/rails/config/nginx.conf diff --git a/frameworks/Ruby/rails/config/nginx.conf b/frameworks/Ruby/rails/config/nginx.conf new file mode 100644 index 00000000000..83d4479f28d --- /dev/null +++ b/frameworks/Ruby/rails/config/nginx.conf @@ -0,0 +1,158 @@ +# This is example contains the bare mininum to get nginx going with +# Unicorn or Rainbows! servers. Generally these configuration settings +# are applicable to other HTTP application servers (and not just Ruby +# ones), so if you have one working well for proxying another app +# server, feel free to continue using it. +# +# The only setting we feel strongly about is the fail_timeout=0 +# directive in the "upstream" block. max_fails=0 also has the same +# effect as fail_timeout=0 for current versions of nginx and may be +# used in its place. +# +# Users are strongly encouraged to refer to nginx documentation for more +# details and search for other example configs. + +# you generally only need one nginx worker unless you're serving +# large amounts of static files which require blocking disk reads +worker_processes 8; + +# # drop privileges, root is needed on most systems for binding to port 80 +# # (or anything < 1024). Capability-based security may be available for +# # your system and worth checking out so you won't need to be root to +# # start nginx to bind on 80 +# user nobody nogroup; # for systems with a "nogroup" +#user nobody nobody; # for systems with "nobody" as a group instead + +# Feel free to change all paths to suite your needs here, of course +pid /tmp/nginx.pid; +#error_log /tmp/nginx.error.log; +error_log stderr error; + +events { + worker_connections 4096; # increase if you have lots of clients + accept_mutex off; # "on" if nginx worker_processes > 1 + use epoll; # enable for Linux 2.6+ + # use kqueue; # enable for FreeBSD, OSX +} + +http { + # nginx will find this file in the config directory set at nginx build time + include /etc/nginx/mime.types; + + # fallback in case we can't determine a type + default_type application/octet-stream; + + # click tracking! + #access_log /tmp/nginx.access.log combined; + access_log off; + + # you generally want to serve static files with nginx since neither + # Unicorn nor Rainbows! is optimized for it at the moment + sendfile on; + + tcp_nopush on; # off may be better for *some* Comet/long-poll stuff + tcp_nodelay off; # on may be better for some Comet/long-poll stuff + + # we haven't checked to see if Rack::Deflate on the app server is + # faster or not than doing compression via nginx. It's easier + # to configure it all in one place here for static files and also + # to disable gzip for clients who don't get gzip/deflate right. + # There are other gzip settings that may be needed used to deal with + # bad clients out there, see http://wiki.nginx.org/NginxHttpGzipModule + #gzip on; + #gzip_http_version 1.0; + #gzip_proxied any; + #gzip_min_length 500; + #gzip_disable "MSIE [1-6]\."; + #gzip_types text/plain text/html text/xml text/css + # text/comma-separated-values + # text/javascript application/x-javascript + # application/atom+xml; + + # this can be any application server, not just Unicorn/Rainbows! + upstream app_server { + # fail_timeout=0 means we always retry an upstream even if it failed + # to return a good HTTP response (in case the Unicorn master nukes a + # single worker for timing out). + + # for UNIX domain socket setups: + server unix:/tmp/.sock fail_timeout=0; + + # for TCP setups, point these to your backend servers + # server 192.168.0.7:8080 fail_timeout=0; + # server 192.168.0.8:8080 fail_timeout=0; + # server 192.168.0.9:8080 fail_timeout=0; + } + + server { + # enable one of the following if you're on Linux or FreeBSD + listen 8080 default deferred; # for Linux + # listen 80 default accept_filter=httpready; # for FreeBSD + + # If you have IPv6, you'll likely want to have two separate listeners. + # One on IPv4 only (the default), and another on IPv6 only instead + # of a single dual-stack listener. A dual-stack listener will make + # for ugly IPv4 addresses in $remote_addr (e.g ":ffff:10.0.0.1" + # instead of just "10.0.0.1") and potentially trigger bugs in + # some software. + # listen [::]:80 ipv6only=on; # deferred or accept_filter recommended + + client_max_body_size 4G; + server_name _; + + # ~2 seconds is often enough for most folks to parse HTML/CSS and + # retrieve needed images/icons/frames, connections are cheap in + # nginx so increasing this is generally safe... + keepalive_timeout 10; + + # path for static files + root /path/to/app/current/public; + + # Prefer to serve static files directly from nginx to avoid unnecessary + # data copies from the application server. + # + # try_files directive appeared in in nginx 0.7.27 and has stabilized + # over time. Older versions of nginx (e.g. 0.6.x) requires + # "if (!-f $request_filename)" which was less efficient: + # http://bogomips.org/unicorn.git/tree/examples/nginx.conf?id=v3.3.1#n127 + try_files $uri/index.html $uri.html $uri @app; + + location @app { + # an HTTP header important enough to have its own Wikipedia entry: + # http://en.wikipedia.org/wiki/X-Forwarded-For + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # enable this if you forward HTTPS traffic to unicorn, + # this helps Rack set the proper URL scheme for doing redirects: + # proxy_set_header X-Forwarded-Proto $scheme; + + # pass the Host: header from the client right along so redirects + # can be set properly within the Rack application + proxy_set_header Host $http_host; + + # we don't want nginx trying to do something clever with + # redirects, we set the Host: header above already. + proxy_redirect off; + + # set "proxy_buffering off" *only* for Rainbows! when doing + # Comet/long-poll/streaming. It's also safe to set if you're using + # only serving fast clients with Unicorn + nginx, but not slow + # clients. You normally want nginx to buffer responses to slow + # clients, even with Rails 3.1 streaming because otherwise a slow + # client can become a bottleneck of Unicorn. + # + # The Rack application may also set "X-Accel-Buffering (yes|no)" + # in the response headers do disable/enable buffering on a + # per-response basis. + # proxy_buffering off; + + proxy_pass http://app_server; + } + + # Rails error pages + error_page 500 502 503 504 /500.html; + location = /500.html { + root /path/to/app/current/public; + } + } +} diff --git a/frameworks/Ruby/rails/config/pitchfork.rb b/frameworks/Ruby/rails/config/pitchfork.rb index 676ebdf956d..e50470d2ed8 100644 --- a/frameworks/Ruby/rails/config/pitchfork.rb +++ b/frameworks/Ruby/rails/config/pitchfork.rb @@ -5,3 +5,5 @@ num_workers, = auto_tune worker_processes num_workers + +listen "/tmp/.sock", :backlog => 4096 diff --git a/frameworks/Ruby/rails/rails-pitchfork.dockerfile b/frameworks/Ruby/rails/rails-pitchfork.dockerfile index 66b26a16b55..190f30a4926 100644 --- a/frameworks/Ruby/rails/rails-pitchfork.dockerfile +++ b/frameworks/Ruby/rails/rails-pitchfork.dockerfile @@ -12,6 +12,8 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN apt-get install -yqq nginx + COPY ./Gemfile* /rails/ ENV BUNDLE_FORCE_RUBY_PLATFORM=true @@ -24,4 +26,5 @@ ENV RAILS_ENV=production_postgresql ENV PORT=8080 ENV REDIS_URL=redis://localhost:6379/0 CMD service redis-server start && \ + nginx -c /rails/config/nginx.conf && \ RACK_ENV=production bundle exec pitchfork -c config/pitchfork.rb From 0f453976f6b0ffabd59a67d148489d322e832fbd Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 27 Oct 2025 22:35:31 +0100 Subject: [PATCH 1690/1766] [ruby/rack] Use nginx for Pitchfork (#10204) Pitchfork relies on a buffering reverse proxy to efficiently deal with slow clients. +-------------------------+-------+ | branch_name|fortune| +-------------------------+-------+ | master| 9302| | rack/nginx-pitchfork| 34447| +-------------------------+-------+ --- frameworks/Ruby/rack/config/nginx.conf | 158 ++++++++++++++++++ frameworks/Ruby/rack/config/pitchfork.rb | 2 + .../Ruby/rack/rack-pitchfork.dockerfile | 5 +- 3 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 frameworks/Ruby/rack/config/nginx.conf diff --git a/frameworks/Ruby/rack/config/nginx.conf b/frameworks/Ruby/rack/config/nginx.conf new file mode 100644 index 00000000000..83d4479f28d --- /dev/null +++ b/frameworks/Ruby/rack/config/nginx.conf @@ -0,0 +1,158 @@ +# This is example contains the bare mininum to get nginx going with +# Unicorn or Rainbows! servers. Generally these configuration settings +# are applicable to other HTTP application servers (and not just Ruby +# ones), so if you have one working well for proxying another app +# server, feel free to continue using it. +# +# The only setting we feel strongly about is the fail_timeout=0 +# directive in the "upstream" block. max_fails=0 also has the same +# effect as fail_timeout=0 for current versions of nginx and may be +# used in its place. +# +# Users are strongly encouraged to refer to nginx documentation for more +# details and search for other example configs. + +# you generally only need one nginx worker unless you're serving +# large amounts of static files which require blocking disk reads +worker_processes 8; + +# # drop privileges, root is needed on most systems for binding to port 80 +# # (or anything < 1024). Capability-based security may be available for +# # your system and worth checking out so you won't need to be root to +# # start nginx to bind on 80 +# user nobody nogroup; # for systems with a "nogroup" +#user nobody nobody; # for systems with "nobody" as a group instead + +# Feel free to change all paths to suite your needs here, of course +pid /tmp/nginx.pid; +#error_log /tmp/nginx.error.log; +error_log stderr error; + +events { + worker_connections 4096; # increase if you have lots of clients + accept_mutex off; # "on" if nginx worker_processes > 1 + use epoll; # enable for Linux 2.6+ + # use kqueue; # enable for FreeBSD, OSX +} + +http { + # nginx will find this file in the config directory set at nginx build time + include /etc/nginx/mime.types; + + # fallback in case we can't determine a type + default_type application/octet-stream; + + # click tracking! + #access_log /tmp/nginx.access.log combined; + access_log off; + + # you generally want to serve static files with nginx since neither + # Unicorn nor Rainbows! is optimized for it at the moment + sendfile on; + + tcp_nopush on; # off may be better for *some* Comet/long-poll stuff + tcp_nodelay off; # on may be better for some Comet/long-poll stuff + + # we haven't checked to see if Rack::Deflate on the app server is + # faster or not than doing compression via nginx. It's easier + # to configure it all in one place here for static files and also + # to disable gzip for clients who don't get gzip/deflate right. + # There are other gzip settings that may be needed used to deal with + # bad clients out there, see http://wiki.nginx.org/NginxHttpGzipModule + #gzip on; + #gzip_http_version 1.0; + #gzip_proxied any; + #gzip_min_length 500; + #gzip_disable "MSIE [1-6]\."; + #gzip_types text/plain text/html text/xml text/css + # text/comma-separated-values + # text/javascript application/x-javascript + # application/atom+xml; + + # this can be any application server, not just Unicorn/Rainbows! + upstream app_server { + # fail_timeout=0 means we always retry an upstream even if it failed + # to return a good HTTP response (in case the Unicorn master nukes a + # single worker for timing out). + + # for UNIX domain socket setups: + server unix:/tmp/.sock fail_timeout=0; + + # for TCP setups, point these to your backend servers + # server 192.168.0.7:8080 fail_timeout=0; + # server 192.168.0.8:8080 fail_timeout=0; + # server 192.168.0.9:8080 fail_timeout=0; + } + + server { + # enable one of the following if you're on Linux or FreeBSD + listen 8080 default deferred; # for Linux + # listen 80 default accept_filter=httpready; # for FreeBSD + + # If you have IPv6, you'll likely want to have two separate listeners. + # One on IPv4 only (the default), and another on IPv6 only instead + # of a single dual-stack listener. A dual-stack listener will make + # for ugly IPv4 addresses in $remote_addr (e.g ":ffff:10.0.0.1" + # instead of just "10.0.0.1") and potentially trigger bugs in + # some software. + # listen [::]:80 ipv6only=on; # deferred or accept_filter recommended + + client_max_body_size 4G; + server_name _; + + # ~2 seconds is often enough for most folks to parse HTML/CSS and + # retrieve needed images/icons/frames, connections are cheap in + # nginx so increasing this is generally safe... + keepalive_timeout 10; + + # path for static files + root /path/to/app/current/public; + + # Prefer to serve static files directly from nginx to avoid unnecessary + # data copies from the application server. + # + # try_files directive appeared in in nginx 0.7.27 and has stabilized + # over time. Older versions of nginx (e.g. 0.6.x) requires + # "if (!-f $request_filename)" which was less efficient: + # http://bogomips.org/unicorn.git/tree/examples/nginx.conf?id=v3.3.1#n127 + try_files $uri/index.html $uri.html $uri @app; + + location @app { + # an HTTP header important enough to have its own Wikipedia entry: + # http://en.wikipedia.org/wiki/X-Forwarded-For + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # enable this if you forward HTTPS traffic to unicorn, + # this helps Rack set the proper URL scheme for doing redirects: + # proxy_set_header X-Forwarded-Proto $scheme; + + # pass the Host: header from the client right along so redirects + # can be set properly within the Rack application + proxy_set_header Host $http_host; + + # we don't want nginx trying to do something clever with + # redirects, we set the Host: header above already. + proxy_redirect off; + + # set "proxy_buffering off" *only* for Rainbows! when doing + # Comet/long-poll/streaming. It's also safe to set if you're using + # only serving fast clients with Unicorn + nginx, but not slow + # clients. You normally want nginx to buffer responses to slow + # clients, even with Rails 3.1 streaming because otherwise a slow + # client can become a bottleneck of Unicorn. + # + # The Rack application may also set "X-Accel-Buffering (yes|no)" + # in the response headers do disable/enable buffering on a + # per-response basis. + # proxy_buffering off; + + proxy_pass http://app_server; + } + + # Rails error pages + error_page 500 502 503 504 /500.html; + location = /500.html { + root /path/to/app/current/public; + } + } +} diff --git a/frameworks/Ruby/rack/config/pitchfork.rb b/frameworks/Ruby/rack/config/pitchfork.rb index 218c8c96759..9cf3d92dfbe 100644 --- a/frameworks/Ruby/rack/config/pitchfork.rb +++ b/frameworks/Ruby/rack/config/pitchfork.rb @@ -9,3 +9,5 @@ before_fork do |_server| Sequel::DATABASES.each(&:disconnect) end + +listen "/tmp/.sock", :backlog => 4096 diff --git a/frameworks/Ruby/rack/rack-pitchfork.dockerfile b/frameworks/Ruby/rack/rack-pitchfork.dockerfile index dbb0e24e3f8..bebaf61bcb4 100644 --- a/frameworks/Ruby/rack/rack-pitchfork.dockerfile +++ b/frameworks/Ruby/rack/rack-pitchfork.dockerfile @@ -7,6 +7,8 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends libjemalloc2 ENV LD_PRELOAD=libjemalloc.so.2 +RUN apt-get install -yqq nginx + WORKDIR /rack COPY Gemfile* ./ @@ -19,4 +21,5 @@ COPY . . EXPOSE 8080 -CMD bundle exec pitchfork -c config/pitchfork.rb -o 0.0.0.0 -p 8080 -E production +CMD nginx -c /rack/config/nginx.conf && \ + bundle exec pitchfork -c config/pitchfork.rb -E production From 9e81bbf304d02c233df67f3eaa40a12e84866507 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Mon, 27 Oct 2025 23:36:05 +0200 Subject: [PATCH 1691/1766] Update images in httpserver and ring-http-exchange to java 25 (#10205) * Update images for ring-http-exchange httpserver Also replace render type in majavat tests * Update reitit deps --------- Co-authored-by: jj --- frameworks/Clojure/kit/deps.edn | 2 +- .../kit_clj/te_bench/web/controllers/bench.clj | 4 ++-- frameworks/Clojure/reitit/project.clj | 9 ++++----- .../Clojure/reitit/reitit-async.dockerfile | 10 +++++++--- .../Clojure/reitit/reitit-jdbc.dockerfile | 10 +++++++--- frameworks/Clojure/reitit/reitit.dockerfile | 13 ++++++++++--- .../Clojure/ring-http-exchange/project.clj | 2 +- .../ring-http-exchange-graalvm.dockerfile | 2 +- ...ing-http-exchange-robaho-graalvm.dockerfile | 2 +- .../src/ring_http_exchange/benchmark.clj | 4 ++-- .../httpserver/httpserver-graalvm.dockerfile | 4 ++-- .../httpserver/httpserver-postgres.dockerfile | 2 +- .../httpserver-robaho-graalvm.dockerfile | 4 ++-- .../httpserver-robaho-postgres.dockerfile | 4 ++-- .../httpserver/httpserver-robaho.dockerfile | 4 ++-- frameworks/Java/httpserver/pom.xml | 4 ++-- .../src/main/java/benchmarks/Fortune.java | 18 +----------------- .../src/main/java/benchmarks/Server.java | 8 ++++---- 18 files changed, 52 insertions(+), 54 deletions(-) diff --git a/frameworks/Clojure/kit/deps.edn b/frameworks/Clojure/kit/deps.edn index 50a41284745..a365a40b6ab 100644 --- a/frameworks/Clojure/kit/deps.edn +++ b/frameworks/Clojure/kit/deps.edn @@ -15,7 +15,7 @@ ;; HTML templating selmer/selmer {:mvn/version "1.12.62"} - org.clojars.jj/majavat {:mvn/version "1.12.1"} + org.clojars.jj/majavat {:mvn/version "1.12.3"} ;; Database org.postgresql/postgresql {:mvn/version "42.7.8"} diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj index 0ac7c6f2b2b..d2d5b692124 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj @@ -4,7 +4,7 @@ [next.jdbc :as jdbc] [next.jdbc.result-set :as rs] [jj.majavat :as majavat] - [jj.majavat.renderer :refer [->InputStreamRenderer]] + [jj.majavat.renderer :refer [->StringRenderer]] [jj.majavat.renderer.sanitizer :refer [->Html]] [ring.util.http-response :as http-response] [selmer.parser :as parser])) @@ -17,7 +17,7 @@ (def ^:const MAX_ID_ZERO_IDX 9999) (def ^:const CACHE_TTL (* 24 60 60)) (def ^:private render-fortune (majavat/build-renderer "html/fortunes.html" - {:renderer (->InputStreamRenderer + {:renderer (->StringRenderer {:sanitizer (->Html)})})) (def selmer-opts {:custom-resource-path (clojure.java.io/resource "html")}) diff --git a/frameworks/Clojure/reitit/project.clj b/frameworks/Clojure/reitit/project.clj index 03baa1441ec..00953515ebc 100644 --- a/frameworks/Clojure/reitit/project.clj +++ b/frameworks/Clojure/reitit/project.clj @@ -1,11 +1,10 @@ (defproject hello "reitit" :description "pohjavirta, reitit, jsonista & porsas" - :dependencies [[org.clojure/clojure "1.10.1"] + :dependencies [[org.clojure/clojure "1.12.3"] [metosin/pohjavirta "0.0.1-alpha5"] [metosin/porsas "0.0.1-alpha13"] - [metosin/jsonista "0.2.5"] - [metosin/reitit "0.3.10"] - [hikari-cp "2.9.0"]] - :jvm-opts ^:replace ["-Dclojure.compiler.direct-linking=true"] + [metosin/jsonista "0.3.13"] + [metosin/reitit "0.9.1"] + [hikari-cp "3.3.0"]] :main hello.handler :aot :all) diff --git a/frameworks/Clojure/reitit/reitit-async.dockerfile b/frameworks/Clojure/reitit/reitit-async.dockerfile index 74029c7be3d..e24189d9adb 100644 --- a/frameworks/Clojure/reitit/reitit-async.dockerfile +++ b/frameworks/Clojure/reitit/reitit-async.dockerfile @@ -1,9 +1,13 @@ -FROM clojure:openjdk-11-lein-2.9.1 +FROM clojure:lein as lein WORKDIR /reitit -COPY src src COPY project.clj project.clj +COPY src src RUN lein uberjar +FROM openjdk:25-jdk-slim +WORKDIR /reitit +COPY --from=lein /reitit/target/hello-reitit-standalone.jar app.jar + EXPOSE 8080 -CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-XX:+UseStringDeduplication", "-Djava.net.preferIPv4Stack=true", "-jar", "target/hello-reitit-standalone.jar", "async"] +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar", "async"] diff --git a/frameworks/Clojure/reitit/reitit-jdbc.dockerfile b/frameworks/Clojure/reitit/reitit-jdbc.dockerfile index 26998e5abb9..ab746e5c464 100644 --- a/frameworks/Clojure/reitit/reitit-jdbc.dockerfile +++ b/frameworks/Clojure/reitit/reitit-jdbc.dockerfile @@ -1,9 +1,13 @@ -FROM clojure:openjdk-11-lein-2.9.1 +FROM clojure:lein as lein WORKDIR /reitit -COPY src src COPY project.clj project.clj +COPY src src RUN lein uberjar +FROM openjdk:25-jdk-slim +WORKDIR /reitit +COPY --from=lein /reitit/target/hello-reitit-standalone.jar app.jar + EXPOSE 8080 -CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-XX:+UseStringDeduplication", "-Djava.net.preferIPv4Stack=true", "-jar", "target/hello-reitit-standalone.jar", "sync"] +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar", "sync"] diff --git a/frameworks/Clojure/reitit/reitit.dockerfile b/frameworks/Clojure/reitit/reitit.dockerfile index d9b45794959..52fff78793a 100644 --- a/frameworks/Clojure/reitit/reitit.dockerfile +++ b/frameworks/Clojure/reitit/reitit.dockerfile @@ -1,6 +1,13 @@ -FROM clojure:openjdk-11-lein-2.9.1 +FROM clojure:lein as lein WORKDIR /reitit -COPY src src COPY project.clj project.clj +COPY src src RUN lein uberjar -CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-XX:+UseStringDeduplication", "-Djava.net.preferIPv4Stack=true", "-jar", "target/hello-reitit-standalone.jar"] + +FROM openjdk:25-jdk-slim +WORKDIR /reitit +COPY --from=lein /reitit/target/hello-reitit-standalone.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Clojure/ring-http-exchange/project.clj b/frameworks/Clojure/ring-http-exchange/project.clj index de2033a7550..3c06cf711e7 100644 --- a/frameworks/Clojure/ring-http-exchange/project.clj +++ b/frameworks/Clojure/ring-http-exchange/project.clj @@ -8,7 +8,7 @@ [org.clojure/tools.logging "1.3.0"] [org.clojars.jj/ring-http-exchange "1.2.4"] [seancorfield/next.jdbc "1.2.659"] - [org.clojars.jj/majavat "1.12.1"] + [org.clojars.jj/majavat "1.12.3"] [hikari-cp "3.3.0"] [org.postgresql/postgresql "42.7.8"] [metosin/jsonista "0.3.13"] diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile index 1d9e25ecef6..53a3998cd03 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-graalvm.dockerfile @@ -5,7 +5,7 @@ COPY resources resources COPY src src RUN lein uberjar -FROM ghcr.io/graalvm/graalvm-community:24 +FROM ghcr.io/graalvm/graalvm-community:25 WORKDIR /ring-http-exchange COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile index 1362b411aed..8af31aebae0 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-graalvm.dockerfile @@ -5,7 +5,7 @@ COPY resources resources COPY src src RUN lein with-profile robaho uberjar -FROM ghcr.io/graalvm/graalvm-community:24 +FROM ghcr.io/graalvm/graalvm-community:25 WORKDIR /ring-http-exchange COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar diff --git a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj index 95341069bc2..755d39ee0f0 100644 --- a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj +++ b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj @@ -3,7 +3,7 @@ (:require [jsonista.core :as json] [jj.majavat :as majavat] - [jj.majavat.renderer :refer [->InputStreamRenderer]] + [jj.majavat.renderer :refer [->StringRenderer]] [jj.majavat.renderer.sanitizer :refer [->Html]] [ring-http-exchange.core :as server] [next.jdbc :as jdbc] @@ -34,7 +34,7 @@ "Content-Type" "text/plain"} :body "Hello, World!"}) (def ^:private render-fortune (majavat/build-renderer "fortune.html" - {:renderer (->InputStreamRenderer + {:renderer (->StringRenderer {:sanitizer (->Html)})})) (defn -main diff --git a/frameworks/Java/httpserver/httpserver-graalvm.dockerfile b/frameworks/Java/httpserver/httpserver-graalvm.dockerfile index b1d4e09e3d0..f9cd7e29cfb 100644 --- a/frameworks/Java/httpserver/httpserver-graalvm.dockerfile +++ b/frameworks/Java/httpserver/httpserver-graalvm.dockerfile @@ -1,10 +1,10 @@ -FROM maven:3-eclipse-temurin-24-alpine as maven +FROM maven:3-eclipse-temurin-25-alpine as maven WORKDIR /httpserver COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM ghcr.io/graalvm/graalvm-community:24 +FROM ghcr.io/graalvm/graalvm-community:25 WORKDIR /httpserver COPY --from=maven /httpserver/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver/httpserver-postgres.dockerfile b/frameworks/Java/httpserver/httpserver-postgres.dockerfile index c45944e5fe6..4cb88012254 100644 --- a/frameworks/Java/httpserver/httpserver-postgres.dockerfile +++ b/frameworks/Java/httpserver/httpserver-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3-eclipse-temurin-24-alpine as maven +FROM maven:3-eclipse-temurin-25-alpine as maven WORKDIR /httpserver COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile b/frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile index ee9651eb6fe..44b6b0975f0 100644 --- a/frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile +++ b/frameworks/Java/httpserver/httpserver-robaho-graalvm.dockerfile @@ -1,10 +1,10 @@ -FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven +FROM maven:3-eclipse-temurin-25-alpine as maven WORKDIR /httpserver-robaho COPY pom.xml pom.xml COPY src src RUN mvn compile -P robaho assembly:single -q -FROM ghcr.io/graalvm/graalvm-community:24 +FROM ghcr.io/graalvm/graalvm-community:25 WORKDIR /httpserver-robaho COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile b/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile index 8fc18df235d..7e204f66f52 100644 --- a/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile +++ b/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile @@ -1,10 +1,10 @@ -FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven +FROM maven:3-eclipse-temurin-25-alpine as maven WORKDIR /httpserver-robaho COPY pom.xml pom.xml COPY src src RUN mvn compile -P robaho assembly:single -q -FROM openjdk:23-jdk-slim +FROM openjdk:25-jdk-slim WORKDIR /httpserver-robaho COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver/httpserver-robaho.dockerfile b/frameworks/Java/httpserver/httpserver-robaho.dockerfile index 1ccaff150eb..1d09e486ef1 100644 --- a/frameworks/Java/httpserver/httpserver-robaho.dockerfile +++ b/frameworks/Java/httpserver/httpserver-robaho.dockerfile @@ -1,10 +1,10 @@ -FROM jelastic/maven:3.9.9-openjdk-23.0.1-almalinux-9 as maven +FROM maven:3-eclipse-temurin-25-alpine as maven WORKDIR /httpserver-robaho COPY pom.xml pom.xml COPY src src RUN mvn compile -P robaho assembly:single -q -FROM openjdk:23-jdk-slim +FROM openjdk:25-jdk-slim WORKDIR /httpserver-robaho COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver/pom.xml b/frameworks/Java/httpserver/pom.xml index 5d46cff5c4a..26673413278 100644 --- a/frameworks/Java/httpserver/pom.xml +++ b/frameworks/Java/httpserver/pom.xml @@ -10,8 +10,8 @@ UTF-8 - 21 - 21 + 25 + 25 diff --git a/frameworks/Java/httpserver/src/main/java/benchmarks/Fortune.java b/frameworks/Java/httpserver/src/main/java/benchmarks/Fortune.java index 2b420fb4764..7320e188beb 100644 --- a/frameworks/Java/httpserver/src/main/java/benchmarks/Fortune.java +++ b/frameworks/Java/httpserver/src/main/java/benchmarks/Fortune.java @@ -1,22 +1,6 @@ package benchmarks; -public class Fortune implements Comparable { - - private final int id; - private final String message; - - public Fortune(int id, String message) { - this.id = id; - this.message = message; - } - - public int getId() { - return id; - } - - public String getMessage() { - return message; - } +public record Fortune(int id, String message) implements Comparable { @Override public int compareTo(Fortune other) { diff --git a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java index 688e6b65df7..2b4beb71889 100755 --- a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java +++ b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java @@ -61,14 +61,14 @@ private static DataSource createPostgresDataSource() throws ClassNotFoundExcepti return new HikariDataSource(config); } - private static Template loadTemplate(String filename) throws IOException, ParseException { + private static Template loadTemplate() throws IOException, ParseException { Properties props = new Properties(); props.put("import.packages", "java.util," + Fortune.class.getPackage().getName()); props.put("input.encoding", "UTF-8"); props.put("output.encoding", "UTF-8"); props.put("precompiled", "false"); Engine engine = Engine.getEngine(props); - return engine.getTemplate(filename); + return engine.getTemplate("/fortunes.template.httl"); } private static HttpHandler createPlaintextHandler() { @@ -102,7 +102,7 @@ private static HttpHandler createJSONHandler() { } private static HttpHandler createFortunesHandler(DataSource ds) throws IOException, ParseException { - Template template = loadTemplate("/fortunes.template.httl"); + Template template = loadTemplate(); return t -> { try { // query db @@ -127,7 +127,7 @@ private static HttpHandler createFortunesHandler(DataSource ds) throws IOExcepti }; } - public static void main(String[] args) throws Exception { + static void main(String[] args) throws Exception { // parse arguments String settings = args.length > 0 ? args[0] : ""; int port = args.length > 1 ? Integer.parseInt(args[1]) : 8080; From ec0ca683b7f196535988b94e8ca125dbf11ea189 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 27 Oct 2025 22:36:25 +0100 Subject: [PATCH 1692/1766] [ruby/rails] Upgrade puma to 7.1 (#10206) --- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 6b8ad45304c..a47514f2618 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -21,7 +21,7 @@ group :falcon, optional: true do end group :puma, optional: true do - gem 'puma', '~> 6.5', require: false + gem 'puma', '~> 7.1', require: false end group :pitchfork, optional: true do diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 1a29d0c06c8..c31ca5b7cdd 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -205,7 +205,7 @@ GEM psych (5.2.3) date stringio - puma (6.6.0) + puma (7.1.0) nio4r (~> 2.0) racc (1.8.1) rack (3.2.0) @@ -287,7 +287,7 @@ DEPENDENCIES iodine (~> 0.7) pg (~> 1.5) pitchfork (~> 0.17) - puma (~> 6.5) + puma (~> 7.1) rails (~> 8.1.0.beta1) redis (~> 5.0) trilogy (~> 2.8.1) From faf697cae45b5637e40729ddcf40c64b3abcccb0 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 27 Oct 2025 22:36:43 +0100 Subject: [PATCH 1693/1766] [ruby/sinatra] Upgrade puma to 7.1 (#10207) --- frameworks/Ruby/sinatra-sequel/Gemfile | 2 +- frameworks/Ruby/sinatra-sequel/Gemfile.lock | 4 ++-- frameworks/Ruby/sinatra/Gemfile | 2 +- frameworks/Ruby/sinatra/Gemfile.lock | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile b/frameworks/Ruby/sinatra-sequel/Gemfile index 2c23ecdc6d2..6a685b432a6 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile +++ b/frameworks/Ruby/sinatra-sequel/Gemfile @@ -18,6 +18,6 @@ group :iodine, optional: true do end group :puma, optional: true do - gem 'puma', '~> 7.0', require: false + gem 'puma', '~> 7.1', require: false gem 'concurrent-ruby' # used by Puma for auto-tuning end diff --git a/frameworks/Ruby/sinatra-sequel/Gemfile.lock b/frameworks/Ruby/sinatra-sequel/Gemfile.lock index bcc9cac8bb2..e9d49e6d9b1 100644 --- a/frameworks/Ruby/sinatra-sequel/Gemfile.lock +++ b/frameworks/Ruby/sinatra-sequel/Gemfile.lock @@ -13,7 +13,7 @@ GEM pg (1.6.2) pg (1.6.2-x86_64-darwin) pg (1.6.2-x86_64-linux) - puma (7.0.2) + puma (7.1.0) nio4r (~> 2.0) rack (3.2.0) rack-protection (4.1.1) @@ -49,7 +49,7 @@ DEPENDENCIES iodine (~> 0.7) json (~> 2.8) pg (~> 1.5) - puma (~> 7.0) + puma (~> 7.1) sequel (~> 5.0) sequel_pg (~> 1.6) sinatra (~> 4.0) diff --git a/frameworks/Ruby/sinatra/Gemfile b/frameworks/Ruby/sinatra/Gemfile index e456bc6f846..6b0a0c45fd8 100644 --- a/frameworks/Ruby/sinatra/Gemfile +++ b/frameworks/Ruby/sinatra/Gemfile @@ -17,5 +17,5 @@ group :iodine, optional: true do end group :puma, optional: true do - gem 'puma', '~> 7.0', require: false + gem 'puma', '~> 7.1', require: false end diff --git a/frameworks/Ruby/sinatra/Gemfile.lock b/frameworks/Ruby/sinatra/Gemfile.lock index ba5a80e73b0..a9909fd6604 100644 --- a/frameworks/Ruby/sinatra/Gemfile.lock +++ b/frameworks/Ruby/sinatra/Gemfile.lock @@ -38,7 +38,7 @@ GEM pg (1.6.2) pg (1.6.2-x86_64-darwin) pg (1.6.2-x86_64-linux) - puma (7.0.2) + puma (7.1.0) nio4r (~> 2.0) rack (3.2.3) rack-protection (4.2.0) @@ -74,7 +74,7 @@ DEPENDENCIES iodine (~> 0.7) json (~> 2.8) pg (~> 1.5) - puma (~> 7.0) + puma (~> 7.1) sinatra (~> 4.2) trilogy (~> 2.9.0) From a32b6552d3d91d7d580b677b8ac70d0f7e10a5fb Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 27 Oct 2025 22:37:00 +0100 Subject: [PATCH 1694/1766] [ruby/padrino] Upgrade puma to 7.1 (#10208) --- frameworks/Ruby/padrino/Gemfile | 2 +- frameworks/Ruby/padrino/Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/padrino/Gemfile b/frameworks/Ruby/padrino/Gemfile index 47d22ded6ac..3e643448adb 100644 --- a/frameworks/Ruby/padrino/Gemfile +++ b/frameworks/Ruby/padrino/Gemfile @@ -9,7 +9,7 @@ gem 'padrino', git: 'https://github.com/padrino/padrino-framework.git' gem 'rack' group :puma, optional: true do - gem 'puma', '~> 6.4', require: false + gem 'puma', '~> 7.1', require: false end group :unicorn, optional: true do diff --git a/frameworks/Ruby/padrino/Gemfile.lock b/frameworks/Ruby/padrino/Gemfile.lock index 05bb6a6315a..45c6deadd77 100644 --- a/frameworks/Ruby/padrino/Gemfile.lock +++ b/frameworks/Ruby/padrino/Gemfile.lock @@ -94,7 +94,7 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - puma (6.6.0) + puma (7.1.0) nio4r (~> 2.0) rack (3.1.18) rack-protection (4.1.1) @@ -140,7 +140,7 @@ DEPENDENCIES json mysql2 (> 0.5) padrino! - puma (~> 6.4) + puma (~> 7.1) rack slim (= 2.0.3) unicorn (~> 6.1) From 8db06c56818af1ebdc0809abaa87c2aa9f77779f Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 27 Oct 2025 22:37:29 +0100 Subject: [PATCH 1695/1766] [ruby/roda-sequel] Upgrade puma to 7.1 (#10209) --- frameworks/Ruby/roda-sequel/Gemfile | 2 +- frameworks/Ruby/roda-sequel/Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/roda-sequel/Gemfile b/frameworks/Ruby/roda-sequel/Gemfile index 9094dc82714..c78013dc75d 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile +++ b/frameworks/Ruby/roda-sequel/Gemfile @@ -22,5 +22,5 @@ group :iodine, optional: true do end group :puma, optional: true do - gem "puma", "~> 6.2", require: false + gem "puma", "~> 7.1", require: false end diff --git a/frameworks/Ruby/roda-sequel/Gemfile.lock b/frameworks/Ruby/roda-sequel/Gemfile.lock index 93d8d275065..cb7fb373054 100644 --- a/frameworks/Ruby/roda-sequel/Gemfile.lock +++ b/frameworks/Ruby/roda-sequel/Gemfile.lock @@ -11,7 +11,7 @@ GEM pg (1.6.2) pg (1.6.2-x86_64-darwin) pg (1.6.2-x86_64-linux) - puma (6.6.0) + puma (7.1.0) nio4r (~> 2.0) rack (3.2.3) roda (3.90.0) @@ -36,7 +36,7 @@ DEPENDENCIES iodine (~> 0.7) json (~> 2.8) pg (~> 1.4) - puma (~> 6.2) + puma (~> 7.1) roda (~> 3.66) sequel (~> 5.67) sequel_pg (~> 1.17) From 2d41e60a98322147b216828fb5e60c310420e6e5 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 27 Oct 2025 22:37:51 +0100 Subject: [PATCH 1696/1766] [ruby/grape] Upgrade puma to 7.1 (#10210) --- frameworks/Ruby/grape/Gemfile | 2 +- frameworks/Ruby/grape/Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Ruby/grape/Gemfile b/frameworks/Ruby/grape/Gemfile index b1e9fe3b4d5..89f6c86a84e 100644 --- a/frameworks/Ruby/grape/Gemfile +++ b/frameworks/Ruby/grape/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' gem 'mysql2', '0.5.6' gem 'unicorn', '6.1.0' -gem 'puma', '~> 6.5' +gem 'puma', '~> 7.1' gem 'activerecord', '~> 8.0.0', :require => 'active_record' gem 'grape', '2.1.1' gem 'json', '~> 2.9' diff --git a/frameworks/Ruby/grape/Gemfile.lock b/frameworks/Ruby/grape/Gemfile.lock index ddbd759f26b..a1053906658 100644 --- a/frameworks/Ruby/grape/Gemfile.lock +++ b/frameworks/Ruby/grape/Gemfile.lock @@ -61,7 +61,7 @@ GEM mustermann (>= 1.0.0) mysql2 (0.5.6) nio4r (2.7.4) - puma (6.6.0) + puma (7.1.0) nio4r (~> 2.0) rack (3.2.3) raindrops (0.20.1) @@ -86,7 +86,7 @@ DEPENDENCIES grape (= 2.1.1) json (~> 2.9) mysql2 (= 0.5.6) - puma (~> 6.5) + puma (~> 7.1) unicorn (= 6.1.0) BUNDLED WITH From 66f404f8188f4293a5d1c352e1c0b5edd7bc76b6 Mon Sep 17 00:00:00 2001 From: AkazawaYun <62974697+AkazawaYun@users.noreply.github.com> Date: Tue, 28 Oct 2025 05:38:14 +0800 Subject: [PATCH 1697/1766] update akazawayun.pro version (#10211) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add new test : CSharp/akazawayun.pro * modify config and code * add content-type * update url * update package version * add 3 new tests: db、queries、updates 1. add 3 new tests: db、queries、updates; 2. split code to multi files; * - * use generated sql instead const string. * update version * fix bug of db query * set port to 8080 * 升级 akazawayun.pro 框架版本到 14 * i forget to update the port change... * test self whether work fine.. * update nuget version * why pr failed... * 不小心多提交了别人的框架...改回 * akazawayun fix bug * remove db test there is some error in mysql * confirmed there is bug in mysql.data 9.5.0 还是用8080端口吧- -b, 都用8080, 改其他的对比测时不方便 * downgrade mysql.data back to 9.4.0 * fix bug of akazawayun.pro --- .gitignore | 1 + .../AkazawaYun.FrameworkBenchmarks.sln | 25 ++++++++++++++ .../akazawayun.pro/akazawayun.pro.dockerfile | 2 +- .../akazawayun.pro/benchmark_config.json | 12 +++---- .../src/AkazawaYun.FrameworkBenchmarks.csproj | 4 +-- .../CSharp/akazawayun.pro/src/Program.cs | 33 ++++++++++++++----- 6 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 frameworks/CSharp/akazawayun.pro/AkazawaYun.FrameworkBenchmarks.sln diff --git a/.gitignore b/.gitignore index bd7318e44d9..2f4e02babd6 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,4 @@ benchmark.cfg # python .venv/ +frameworks/CSharp/akazawayun.pro/Dockerfile diff --git a/frameworks/CSharp/akazawayun.pro/AkazawaYun.FrameworkBenchmarks.sln b/frameworks/CSharp/akazawayun.pro/AkazawaYun.FrameworkBenchmarks.sln new file mode 100644 index 00000000000..e2c50c4d4fd --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/AkazawaYun.FrameworkBenchmarks.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36310.24 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AkazawaYun.FrameworkBenchmarks", "src/AkazawaYun.FrameworkBenchmarks.csproj", "{BB5587FE-E4A0-851D-6025-F5FF0EC54525}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BB5587FE-E4A0-851D-6025-F5FF0EC54525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB5587FE-E4A0-851D-6025-F5FF0EC54525}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB5587FE-E4A0-851D-6025-F5FF0EC54525}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB5587FE-E4A0-851D-6025-F5FF0EC54525}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {81EA49A3-BB25-4EC5-B861-02520931CF63} + EndGlobalSection +EndGlobal diff --git a/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile index 44d69f1c8fa..7ae1060903d 100644 --- a/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile +++ b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile @@ -9,5 +9,5 @@ FROM mcr.microsoft.com/dotnet/sdk:9.0 AS runtime WORKDIR /app COPY --from=publish /app/publish . -EXPOSE 2022 +EXPOSE 8080 ENTRYPOINT ["dotnet", "AkazawaYun.FrameworkBenchmarks.dll"] diff --git a/frameworks/CSharp/akazawayun.pro/benchmark_config.json b/frameworks/CSharp/akazawayun.pro/benchmark_config.json index d03b12ca608..8f067f8fee6 100644 --- a/frameworks/CSharp/akazawayun.pro/benchmark_config.json +++ b/frameworks/CSharp/akazawayun.pro/benchmark_config.json @@ -6,12 +6,12 @@ "display_name": "akazawayun.pro", "framework": "akazawayun.pro", "webserver": "akazawayun.pro", - "plaintext_url": "/post/plaintext", - "json_url": "/post/json", - "db_url": "/post/db", - "query_url": "/post/queries?queries=", - "update_url": "/post/updates?queries=", - "port": 2022, + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "port": 8080, "classification": "Micro", "approach": "Realistic", "platform": ".NET", diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj index c2c063469d0..d3bbe1b17cc 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj @@ -1,4 +1,4 @@ - + Exe @@ -15,7 +15,7 @@ - + diff --git a/frameworks/CSharp/akazawayun.pro/src/Program.cs b/frameworks/CSharp/akazawayun.pro/src/Program.cs index 077fc489ddb..bd4ffe628bc 100644 --- a/frameworks/CSharp/akazawayun.pro/src/Program.cs +++ b/frameworks/CSharp/akazawayun.pro/src/Program.cs @@ -2,9 +2,6 @@ using AkazawaYun.AOT; using AkazawaYun.PRO7; -using AkazawaYun.PRO7.AkazawaYunWebFunctionAOP; -using AkazawaYun.PRO7.AkazawaYunWebInterceptor; -using System.Diagnostics.CodeAnalysis; namespace AkazawaYun.FrameworkBenchmarks; @@ -12,23 +9,25 @@ class Program : IPostFunctionWrapper { static readonly akzWebBuilder builder; static readonly akzDbFactory mysql; - + const int port = 8080; static Program() { akzJson.Config(null, AotJsonContext.Default); - builder = akzWebBuilder.Shared.SetDefault() + builder = akzWebBuilder.Shared.SetPort(port) .Build() .Config(itc => { itc.ClearInterceptor(); - itc.AddInterceptor(new akzWebInterceptorNotOnlyPost()); + itc.AddInterceptor(new akzWebInterceptorAsPost()); }); mysql = new akzDbBuilderII() - .SetServer("tfb-database:3306") + .SetServer("tfb-database") //.SetServer("localhost:3306") .SetUser("benchmarkdbuser") + //.SetUser("root") .SetPwd("benchmarkdbpass") + //.SetPwd("123456") .SetDatabase("hello_world") .SetCharset() .SetOtherset() @@ -37,7 +36,16 @@ static Program() static async Task Main() { await builder.Launch(); - akzLog.Default = akzLog.Output.None; + + akzLog.Inf("[API SELF-TEST]"); + string url = $"http://localhost:{port}/plaintext"; + akzLog.Inf(" REQ URL :" + url); + string res = await akzHttpClient.Shared.Get(url).FetchString(); + akzLog.Inf(" RES LEN :" + res.Length); + akzLog.Inf(" RES BODY:" + res); + akzLog.Inf("[OK, I WORK FINE]"); + + akzLog.Default = akzLog.Output.NoneButWar; await Task.Delay(-1); } @@ -91,3 +99,12 @@ static int ParseCount(string queries) } } + +public class akzWebInterceptorAsPost : WebInterceptor +{ + public override ValueTask Intercept(IHttpContext http) + { + http.Method = "POST"; + return InterceptorHttpRes.No(); + } +} From 291c2586d75cf1cbe5c22ab0d0254872e4df4b5e Mon Sep 17 00:00:00 2001 From: Outer Heaven Legacy Date: Tue, 28 Oct 2025 01:38:46 +0400 Subject: [PATCH 1698/1766] Bump sib to v0.0.15 (#10212) --- frameworks/Rust/sib/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/sib/Cargo.toml b/frameworks/Rust/sib/Cargo.toml index a2d8da27f8e..1358100f450 100644 --- a/frameworks/Rust/sib/Cargo.toml +++ b/frameworks/Rust/sib/Cargo.toml @@ -12,7 +12,7 @@ categories = ["development-tools"] readme = "README.md" [dependencies] -sib = { version = "0.0.12", default-features = false, features = [ +sib = { version = "0.0.15", default-features = false, features = [ "net-h1-server", ] } bytes = { version = "1.10.1", default-features = false } From e5ab1a126dab35ef59fe54f9d710a5dd67141988 Mon Sep 17 00:00:00 2001 From: Dmitry Olshansky Date: Tue, 28 Oct 2025 00:39:42 +0300 Subject: [PATCH 1699/1766] Add 3 new routes for photon-http + postgres (#10214) --- frameworks/D/photon-http/README.md | 18 +++ .../D/photon-http/benchmark_config.json | 7 +- frameworks/D/photon-http/dub.json | 4 +- .../D/photon-http/photon-http.dockerfile | 2 + frameworks/D/photon-http/source/app.d | 152 ++++++++++++++++-- 5 files changed, 170 insertions(+), 13 deletions(-) diff --git a/frameworks/D/photon-http/README.md b/frameworks/D/photon-http/README.md index 6bd107bb878..3376e6f55b1 100755 --- a/frameworks/D/photon-http/README.md +++ b/frameworks/D/photon-http/README.md @@ -8,11 +8,16 @@ A benchmark for photon fiber scheduler for D running with minimalistic http serv * [JSON](./source/app.d) * [PLAINTEXT](./source/app.d) +* [DB](./source/app.d) +* [QUERIES](./source/app.d) +* [UPDATES](./source/app.d) ## Important Libraries + The tests were run with: * [photon](https://github.com/DmitryOlshansky/photon) * [photon-http][https://github.com/DmitryOlshansky/photon-http] +* [dpq2](https://github.com/denizzzka/dpq2) ## Test URLs @@ -23,3 +28,16 @@ http://localhost:8080/json ### PLAINTEXT http://localhost:8080/plaintext + +### Data-Store/Database Mapping Test + +http://localhost:8080/db + +### Multiple queries + +http://localhost:8080/queries?queries=... + +### Multiple queries with updates + +http://localhost:8080/updates?queries=... + diff --git a/frameworks/D/photon-http/benchmark_config.json b/frameworks/D/photon-http/benchmark_config.json index 315143dbe2e..b097fd78ac6 100755 --- a/frameworks/D/photon-http/benchmark_config.json +++ b/frameworks/D/photon-http/benchmark_config.json @@ -3,16 +3,19 @@ "tests": [ { "default": { + "update_url": "/updates?queries=", + "query_url": "/queries?queries=", + "db_url": "/db", "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", "classification": "Platform", - "database": "None", + "database": "Postgres", "framework": "None", "language": "D", "flavor": "None", - "orm": "None", + "orm": "raw", "platform": "None", "webserver": "None", "os": "Linux", diff --git a/frameworks/D/photon-http/dub.json b/frameworks/D/photon-http/dub.json index d6f02952c74..9946823d368 100644 --- a/frameworks/D/photon-http/dub.json +++ b/frameworks/D/photon-http/dub.json @@ -4,9 +4,11 @@ ], "copyright": "Copyright © 2025, Dmitry Olshansky", "dependencies": { + "dpq2": "~>1.2.4", + "mir-random": "~>2.2.20", "mir-ion": "~>2.3.4", "xbuf" : "~>0.2.1", - "photon": "~>0.18.5", + "photon": "~>0.18.10", "photon-http": "~>0.6.8" }, "description": "Benchmark of photon-http", diff --git a/frameworks/D/photon-http/photon-http.dockerfile b/frameworks/D/photon-http/photon-http.dockerfile index e9c86a93afb..96090d87812 100644 --- a/frameworks/D/photon-http/photon-http.dockerfile +++ b/frameworks/D/photon-http/photon-http.dockerfile @@ -5,6 +5,8 @@ WORKDIR /app COPY . . +RUN apt-get update -yqq && apt-get install -yqq libpq-dev zlib1g-dev + RUN dub build -b release --compiler=ldc2 EXPOSE 8080 diff --git a/frameworks/D/photon-http/source/app.d b/frameworks/D/photon-http/source/app.d index 94c585bfd59..c419eacefd0 100644 --- a/frameworks/D/photon-http/source/app.d +++ b/frameworks/D/photon-http/source/app.d @@ -1,40 +1,164 @@ import std.stdio; import std.socket; import std.array; +import std.algorithm; +import std.conv; +import std.ascii; import mir.ser; import mir.ser.json; +import core.time; + import std.range.primitives; import glow.xbuf; import photon, photon.http; -struct Message -{ +import mir.random : unpredictableSeedOf; +import mir.random.variable : UniformVariable; +import mir.random.engine.xorshift : Xorshift; + +import dpq2; + +struct Message { string message; } +struct WorldResponse { + int id; + int randomNumber; +} + +enum connectionInfo = "host=tfb-database port=5432 " + ~ "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass"; +enum worldSize = 10000; +enum poolSize = 64; + +shared Pool!Connection connectionPool; + class BenchmarkProcessor : HttpProcessor { - HttpHeader[] plainText = [HttpHeader("Content-Type", "text/plain; charset=utf-8")]; - HttpHeader[] json = [HttpHeader("Content-Type", "application/json")]; + HttpHeader[] plainTextHeaders = [HttpHeader("Content-Type", "text/plain; charset=utf-8")]; + HttpHeader[] jsonHeaders = [HttpHeader("Content-Type", "application/json")]; Buffer!char jsonBuf; + Buffer!WorldResponse worlds; + UniformVariable!uint uniformVariable; + Xorshift gen; + this(Socket sock) { super(sock); + gen = Xorshift(unpredictableSeed!uint); + uniformVariable = UniformVariable!uint(1, worldSize); jsonBuf = Buffer!char(256); + worlds = Buffer!WorldResponse(500); } override void handle(HttpRequest req) { if (req.uri == "/plaintext") { - respondWith("Hello, world!", HttpStatus.OK, plainText); + plaintext(); } else if(req.uri == "/json") { - jsonBuf.clear(); - serializeJsonPretty!""(jsonBuf, Message("Hello, World!")); - respondWith(jsonBuf.data, HttpStatus.OK, json); - } else { - respondWith("Not found", HttpStatus.NotFound, plainText); + json(); + } else if(req.uri == "/db") { + db(); + } else if(req.uri.startsWith("/queries")) { + queries(req.uri); + } else if(req.uri.startsWith("/updates")) { + updates(req.uri); + } + else { + respondWith("Not found", HttpStatus.NotFound, plainTextHeaders); + } + } + + final void plaintext() { + respondWith("Hello, world!", HttpStatus.OK, plainTextHeaders); + } + + final void json() { + jsonBuf.clear(); + serializeJsonPretty!""(jsonBuf, Message("Hello, World!")); + respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); + } + + final void db() { + jsonBuf.clear(); + int id = uniformVariable(gen); + auto c = connectionPool.acquire(); + scope(exit) connectionPool.release(c); + QueryParams qp; + qp.preparedStatementName("db_prpq"); + qp.argsVariadic(id); + immutable result = c.execPrepared(qp).rangify.front; + auto w = WorldResponse(id, result[0].as!PGinteger); + serializeJsonPretty!""(jsonBuf, w); + respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); + } + + // GET /queries?queries=... + final void queries(const(char)[] uri) { + jsonBuf.clear(); + worlds.clear(); + auto c = connectionPool.acquire(); + scope(exit) connectionPool.release(c); + + int count = 1; + auto i = uri.indexOf("?queries="); + if (i > 0 && i + 9 <= uri.length && isDigit(uri[i+9])) + { + try count = min(max(uri[i+9..$].to!int, 1), 500); + catch (ConvException) {} + } + + QueryParams qp; + qp.preparedStatementName("db_prpq"); + foreach (_; 0..count) { + int id = uniformVariable(gen); + qp.argsVariadic(id); + immutable result = c.execPrepared(qp).rangify.front; + worlds.put(WorldResponse(id, result[0].as!PGinteger)); + } + serializeJsonPretty!""(jsonBuf, worlds.data); + respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); + } + + // GET /updates?queries=... + final void updates(const(char)[] uri) { + jsonBuf.clear(); + worlds.clear(); + auto c = connectionPool.acquire(); + scope(exit) connectionPool.release(c); + + int count = 1; + auto i = uri.indexOf("?queries="); + if (i > 0 && i + 9 <= uri.length && isDigit(uri[i+9])) + { + try count = min(max(uri[i+9..$].to!int, 1), 500); + catch (ConvException) {} + } + + QueryParams qp; + qp.preparedStatementName("db_prpq"); + + QueryParams qp_update; + qp_update.preparedStatementName("db_update_prpq"); + + foreach (_; 0..count) { + int id = uniformVariable(gen); + qp.argsVariadic(id); + immutable result = c.execPrepared(qp).rangify.front; + auto w = WorldResponse(id, result[0].as!PGinteger); + + // update random number + w.randomNumber = uniformVariable(gen); + qp_update.argsVariadic(w.randomNumber, id); + + // persist to DB + c.execPrepared(qp_update); + worlds.put(w); } + serializeJsonPretty!""(jsonBuf, worlds.data); + respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); } } @@ -75,6 +199,14 @@ void server() { void main() { initPhoton(); + connectionPool = pool(poolSize, 15.seconds, () { + auto c = new Connection(connectionInfo); + c.prepareEx("db_prpq", "SELECT randomNumber, id FROM world WHERE id = $1"); + c.prepareEx("db_update_prpq", "UPDATE world SET randomNumber = $1 WHERE id = $2"); + return c; + }, (ref Connection c) { + destroy(c); + }); go(() => server()); runScheduler(); } From 5cf3193b3e3f7c7b6fb664cfc80ceaaeae2b5581 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Tue, 28 Oct 2025 20:50:58 +0000 Subject: [PATCH 1700/1766] Update PostgreSQL to version 18 (#10194) Also, disable password-based authentication using the MD5 hash algorithm, since that functionality has been officially deprecated: https://www.postgresql.org/docs/18/auth-password.html Signed-off-by: Anton Kirilov --- toolset/databases/postgres/postgres.dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/toolset/databases/postgres/postgres.dockerfile b/toolset/databases/postgres/postgres.dockerfile index aa2bcebf01d..0573b85b2ca 100644 --- a/toolset/databases/postgres/postgres.dockerfile +++ b/toolset/databases/postgres/postgres.dockerfile @@ -1,9 +1,7 @@ -FROM postgres:17-bookworm +FROM postgres:18-trixie 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 From 500c39119b50749b9ee167e63f48327a233ff264 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 Oct 2025 21:51:29 +0100 Subject: [PATCH 1701/1766] [ruby/rails] Update protocol-http1 to handle warnings (#10147) (#10215) Fixes the following errors: rails-falcon: {"time":"2025-10-14T19:50:12+00:00","severity":"warn","oid":36232,"pid":215,"subject":"Async::Task","annotation":"Reading HTTP/1.1 requests for Async::HTTP::Protocol::HTTP1::Server.","message":"Task may have ended with unhandled exception.","event":{"type":"failure","root":"/rails","class":"Errno::ECONNRESET","message":"Connection reset by peer","backtrace":["/usr/local/lib/ruby/3.5.0+0/socket.rb:457:in 'BasicSocket#__read_nonblock'","/usr/local/lib/ruby/3.5.0+0/socket.rb:457:in 'BasicSocket#read_nonblock'","/usr/local/bundle/gems/io-stream-0.6.1/lib/io/stream/buffered.rb:114:in 'IO::Stream::Buffered#sysread'","/usr/local/bundle/gems/io-stream-0.6.1/lib/io/stream/generic.rb:327:in 'IO::Stream::Generic#fill_read_buffer'","/usr/local/bundle/gems/io-stream-0.6.1/lib/io/stream/generic.rb:164:in 'IO::Stream::Generic#gets'","/usr/local/bundle/gems/protocol-http1-0.30.0/lib/protocol/http1/connection.rb:289:in 'Protocol::HTTP1::Connection#read_line?'","/usr/local/bundle/gems/protocol-http1-0.30.0/lib/protocol/http1/connection.rb:304:in 'Protocol::HTTP1::Connection#read_request_line'","/usr/local/bundle/gems/protocol-http1-0.30.0/lib/protocol/http1/connection.rb:318:in 'Protocol::HTTP1::Connection#read_request'","/usr/local/bundle/gems/async-http-0.87.0/lib/async/http/protocol/http1/request.rb:26:in 'Async::HTTP::Protocol::HTTP1::Request.read'","/usr/local/bundle/gems/async-http-0.87.0/lib/async/http/protocol/http1/server.rb:48:in 'Async::HTTP::Protocol::HTTP1::Server#next_request'","/usr/local/bundle/gems/async-http-0.87.0/lib/async/http/protocol/http1/server.rb:65:in 'Async::HTTP::Protocol::HTTP1::Server#each'","/usr/local/bundle/gems/async-http-0.87.0/lib/async/http/server.rb:50:in 'Async::HTTP::Server#accept'","/usr/local/bundle/gems/falcon-0.51.1/lib/falcon/server.rb:57:in 'Falcon::Server#accept'","/usr/local/bundle/gems/io-endpoint-0.15.2/lib/io/endpoint/wrapper.rb:216:in 'block (2 levels) in IO::Endpoint::Wrapper#accept'","/usr/local/bundle/gems/async-2.23.0/lib/async/task.rb:200:in 'block in Async::Task#run'","/usr/local/bundle/gems/async-2.23.0/lib/async/task.rb:438:in 'block in Async::Task#schedule'"]}} --- frameworks/Ruby/rails/Gemfile.lock | 80 ++++++++++++++++++------------ 1 file changed, 49 insertions(+), 31 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index c31ca5b7cdd..e4cf371331b 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -75,43 +75,49 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - async (2.23.0) + async (2.34.0) console (~> 1.29) fiber-annotation - io-event (~> 1.9) + io-event (~> 1.11) metrics (~> 0.12) - traces (~> 0.15) - async-container (0.24.0) + traces (~> 0.18) + async-container (0.27.7) async (~> 2.22) - async-container-supervisor (0.5.1) - async-container (~> 0.22) + async-container-supervisor (0.8.0) async-service io-endpoint + memory (~> 0.7) memory-leak (~> 0.5) - async-http (0.87.0) + process-metrics + async-http (0.92.1) async (>= 2.10.2) - async-pool (~> 0.9) + async-pool (~> 0.11) io-endpoint (~> 0.14) io-stream (~> 0.6) metrics (~> 0.12) protocol-http (~> 0.49) protocol-http1 (~> 0.30) protocol-http2 (~> 0.22) + protocol-url (~> 0.2) traces (~> 0.10) - async-http-cache (0.4.5) + async-http-cache (0.4.6) async-http (~> 0.56) - async-pool (0.10.3) - async (>= 1.25) - async-service (0.13.0) + async-pool (0.11.0) + async (>= 2.0) + async-service (0.14.4) async async-container (~> 0.16) + string-format (~> 0.2) + bake (0.24.1) + bigdecimal + samovar (~> 2.1) base64 (0.3.0) benchmark (0.4.1) bigdecimal (3.2.2) builder (3.3.0) concurrent-ruby (1.3.5) connection_pool (2.5.3) - console (1.30.0) + console (1.34.2) fiber-annotation fiber-local (~> 1.1) json @@ -119,10 +125,10 @@ GEM date (3.4.1) drb (2.2.3) erubi (1.13.1) - falcon (0.51.1) + falcon (0.52.4) async async-container (~> 0.20) - async-container-supervisor (~> 0.5.0) + async-container-supervisor (~> 0.6) async-http (~> 0.75) async-http-cache (~> 0.4) async-service (~> 0.10) @@ -135,22 +141,22 @@ GEM fiber-annotation (0.2.0) fiber-local (1.1.0) fiber-storage - fiber-storage (1.0.0) + fiber-storage (1.0.1) globalid (1.2.1) activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) io-console (0.8.0) io-endpoint (0.15.2) - io-event (1.9.0) - io-stream (0.6.1) + io-event (1.14.0) + io-stream (0.11.0) iodine (0.7.58) irb (1.15.1) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - json (2.11.3) - localhost (1.3.1) + json (2.15.2) + localhost (1.6.0) logger (1.7.0) loofah (2.24.1) crass (~> 1.0.2) @@ -160,13 +166,18 @@ GEM net-imap net-pop net-smtp - mapping (1.1.1) + mapping (1.1.3) marcel (1.0.4) - memory-leak (0.5.2) - metrics (0.12.2) + memory (0.7.1) + bake (~> 0.15) + console + msgpack + memory-leak (0.7.0) + metrics (0.15.0) mini_mime (1.1.5) mini_portile2 (2.8.9) minitest (5.25.5) + msgpack (1.8.0) net-imap (0.5.7) date net-protocol @@ -184,7 +195,7 @@ GEM racc (~> 1.4) nokogiri (1.18.9-x86_64-linux-gnu) racc (~> 1.4) - openssl (3.3.0) + openssl (3.3.2) pg (1.5.9) pitchfork (0.17.0) logger @@ -192,23 +203,29 @@ GEM pp (0.6.2) prettyprint prettyprint (0.2.0) + process-metrics (0.6.0) + console (~> 1.8) + json (~> 2) + samovar (~> 2.1) protocol-hpack (1.5.1) - protocol-http (0.49.0) - protocol-http1 (0.30.0) + protocol-http (0.55.0) + protocol-http1 (0.35.2) protocol-http (~> 0.22) - protocol-http2 (0.22.1) + protocol-http2 (0.23.0) protocol-hpack (~> 1.4) protocol-http (~> 0.47) - protocol-rack (0.11.2) + protocol-rack (0.16.0) + io-stream (>= 0.10) protocol-http (~> 0.43) rack (>= 1.0) + protocol-url (0.4.0) psych (5.2.3) date stringio puma (7.1.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.2.0) + rack (3.2.3) rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) @@ -255,14 +272,15 @@ GEM connection_pool reline (0.6.0) io-console (~> 0.5) - samovar (2.3.0) + samovar (2.4.1) console (~> 1.0) mapping (~> 1.0) securerandom (0.4.1) + string-format (0.2.0) stringio (3.1.7) thor (1.4.0) timeout (0.4.3) - traces (0.15.2) + traces (0.18.2) trilogy (2.8.1) tsort (0.2.0) tzinfo (2.0.6) From a363f008eff78cc718031309dc3a07944764fbdb Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 28 Oct 2025 21:51:46 +0100 Subject: [PATCH 1702/1766] [ruby/rage] Update pg to 1.6.2 (#10216) --- frameworks/Ruby/rage-sequel/Gemfile.lock | 9 +++++---- frameworks/Ruby/rage/Gemfile.lock | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/rage-sequel/Gemfile.lock b/frameworks/Ruby/rage-sequel/Gemfile.lock index ee8be847544..566a7025400 100644 --- a/frameworks/Ruby/rage-sequel/Gemfile.lock +++ b/frameworks/Ruby/rage-sequel/Gemfile.lock @@ -1,9 +1,10 @@ GEM remote: https://rubygems.org/ specs: - bigdecimal (3.1.9) + bigdecimal (3.3.1) logger (1.7.0) - pg (1.5.9) + pg (1.6.2) + pg (1.6.2-x86_64-darwin) rack (2.2.20) rack-test (2.2.0) rack (>= 1.3) @@ -16,9 +17,9 @@ GEM thor (~> 1.0) zeitwerk (~> 2.6) rake (13.2.1) - sequel (5.88.0) + sequel (5.97.0) bigdecimal - sequel_pg (1.17.1) + sequel_pg (1.17.2) pg (>= 0.18.0, != 1.2.0) sequel (>= 4.38.0) thor (1.3.2) diff --git a/frameworks/Ruby/rage/Gemfile.lock b/frameworks/Ruby/rage/Gemfile.lock index d1967d0bf05..d5d524b3192 100644 --- a/frameworks/Ruby/rage/Gemfile.lock +++ b/frameworks/Ruby/rage/Gemfile.lock @@ -30,7 +30,8 @@ GEM concurrent-ruby (~> 1.0) logger (1.7.0) minitest (5.25.5) - pg (1.5.9) + pg (1.6.2) + pg (1.6.2-x86_64-darwin) rack (2.2.18) rack-test (2.2.0) rack (>= 1.3) From e5d795b9c36c20e8a678f0cb781e0ecc75f8d135 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 22:31:31 +0000 Subject: [PATCH 1703/1766] Build(deps): bump starlette in /frameworks/Python/starlette Bumps [starlette](https://github.com/Kludex/starlette) from 0.47.2 to 0.49.1. - [Release notes](https://github.com/Kludex/starlette/releases) - [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/starlette/compare/0.47.2...0.49.1) --- updated-dependencies: - dependency-name: starlette dependency-version: 0.49.1 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 93b3b6b9a83..7a06852153f 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -6,6 +6,6 @@ Jinja2==3.1.4 MarkupSafe==2.1.1 python-dotenv==0.20.0 PyYAML==6.0 -starlette==0.47.2 +starlette==0.49.1 uvicorn==0.20.0 uvloop==0.17.0 From 61bf05d9902310905b3f4e76460f33a33173154e Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 29 Oct 2025 17:19:29 +0100 Subject: [PATCH 1704/1766] [ruby/rails] Update to Rails 8.1 (#10217) --- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 155 +++++++++++++++-------------- 2 files changed, 80 insertions(+), 77 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index a47514f2618..ec48c009fcb 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'rails', '~> 8.1.0.beta1' +gem 'rails', '~> 8.1.0' gem 'redis', '~> 5.0' gem 'tzinfo-data' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index e4cf371331b..5b86a8d2e48 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -3,29 +3,29 @@ GEM specs: action_text-trix (2.1.15) railties - actioncable (8.1.0.beta1) - actionpack (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + actioncable (8.1.0) + actionpack (= 8.1.0) + activesupport (= 8.1.0) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.1.0.beta1) - actionpack (= 8.1.0.beta1) - activejob (= 8.1.0.beta1) - activerecord (= 8.1.0.beta1) - activestorage (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + actionmailbox (8.1.0) + actionpack (= 8.1.0) + activejob (= 8.1.0) + activerecord (= 8.1.0) + activestorage (= 8.1.0) + activesupport (= 8.1.0) mail (>= 2.8.0) - actionmailer (8.1.0.beta1) - actionpack (= 8.1.0.beta1) - actionview (= 8.1.0.beta1) - activejob (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + actionmailer (8.1.0) + actionpack (= 8.1.0) + actionview (= 8.1.0) + activejob (= 8.1.0) + activesupport (= 8.1.0) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.1.0.beta1) - actionview (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + actionpack (8.1.0) + actionview (= 8.1.0) + activesupport (= 8.1.0) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -33,43 +33,43 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.1.0.beta1) + actiontext (8.1.0) action_text-trix (~> 2.1.15) - actionpack (= 8.1.0.beta1) - activerecord (= 8.1.0.beta1) - activestorage (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + actionpack (= 8.1.0) + activerecord (= 8.1.0) + activestorage (= 8.1.0) + activesupport (= 8.1.0) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.1.0.beta1) - activesupport (= 8.1.0.beta1) + actionview (8.1.0) + activesupport (= 8.1.0) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.1.0.beta1) - activesupport (= 8.1.0.beta1) + activejob (8.1.0) + activesupport (= 8.1.0) globalid (>= 0.3.6) - activemodel (8.1.0.beta1) - activesupport (= 8.1.0.beta1) - activerecord (8.1.0.beta1) - activemodel (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + activemodel (8.1.0) + activesupport (= 8.1.0) + activerecord (8.1.0) + activemodel (= 8.1.0) + activesupport (= 8.1.0) timeout (>= 0.4.0) - activestorage (8.1.0.beta1) - actionpack (= 8.1.0.beta1) - activejob (= 8.1.0.beta1) - activerecord (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + activestorage (8.1.0) + actionpack (= 8.1.0) + activejob (= 8.1.0) + activerecord (= 8.1.0) + activesupport (= 8.1.0) marcel (~> 1.0) - activesupport (8.1.0.beta1) + activesupport (8.1.0) base64 - benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + json logger (>= 1.4.2) minitest (>= 5.1) securerandom (>= 0.3) @@ -112,11 +112,10 @@ GEM bigdecimal samovar (~> 2.1) base64 (0.3.0) - benchmark (0.4.1) - bigdecimal (3.2.2) + bigdecimal (3.3.1) builder (3.3.0) concurrent-ruby (1.3.5) - connection_pool (2.5.3) + connection_pool (2.5.4) console (1.34.2) fiber-annotation fiber-local (~> 1.1) @@ -124,6 +123,7 @@ GEM crass (1.0.6) date (3.4.1) drb (2.2.3) + erb (5.1.3) erubi (1.13.1) falcon (0.52.4) async @@ -142,16 +142,16 @@ GEM fiber-local (1.1.0) fiber-storage fiber-storage (1.0.1) - globalid (1.2.1) + globalid (1.3.0) activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) - io-console (0.8.0) + io-console (0.8.1) io-endpoint (0.15.2) io-event (1.14.0) io-stream (0.11.0) iodine (0.7.58) - irb (1.15.1) + irb (1.15.2) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) @@ -161,13 +161,14 @@ GEM loofah (2.24.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) - mail (2.8.1) + mail (2.9.0) + logger mini_mime (>= 0.1.1) net-imap net-pop net-smtp mapping (1.1.3) - marcel (1.0.4) + marcel (1.1.0) memory (0.7.1) bake (~> 0.15) console @@ -176,9 +177,9 @@ GEM metrics (0.15.0) mini_mime (1.1.5) mini_portile2 (2.8.9) - minitest (5.25.5) + minitest (5.26.0) msgpack (1.8.0) - net-imap (0.5.7) + net-imap (0.5.12) date net-protocol net-pop (0.1.2) @@ -188,19 +189,19 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.18.9) + nokogiri (1.18.10) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.9-x86_64-darwin) + nokogiri (1.18.10-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-gnu) + nokogiri (1.18.10-x86_64-linux-gnu) racc (~> 1.4) openssl (3.3.2) pg (1.5.9) pitchfork (0.17.0) logger rack (>= 2.0) - pp (0.6.2) + pp (0.6.3) prettyprint prettyprint (0.2.0) process-metrics (0.6.0) @@ -219,7 +220,7 @@ GEM protocol-http (~> 0.43) rack (>= 1.0) protocol-url (0.4.0) - psych (5.2.3) + psych (5.2.6) date stringio puma (7.1.0) @@ -233,20 +234,20 @@ GEM rack (>= 1.3) rackup (2.2.1) rack (>= 3) - rails (8.1.0.beta1) - actioncable (= 8.1.0.beta1) - actionmailbox (= 8.1.0.beta1) - actionmailer (= 8.1.0.beta1) - actionpack (= 8.1.0.beta1) - actiontext (= 8.1.0.beta1) - actionview (= 8.1.0.beta1) - activejob (= 8.1.0.beta1) - activemodel (= 8.1.0.beta1) - activerecord (= 8.1.0.beta1) - activestorage (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + rails (8.1.0) + actioncable (= 8.1.0) + actionmailbox (= 8.1.0) + actionmailer (= 8.1.0) + actionpack (= 8.1.0) + actiontext (= 8.1.0) + actionview (= 8.1.0) + activejob (= 8.1.0) + activemodel (= 8.1.0) + activerecord (= 8.1.0) + activestorage (= 8.1.0) + activesupport (= 8.1.0) bundler (>= 1.15.0) - railties (= 8.1.0.beta1) + railties (= 8.1.0) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -254,23 +255,25 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.1.0.beta1) - actionpack (= 8.1.0.beta1) - activesupport (= 8.1.0.beta1) + railties (8.1.0) + actionpack (= 8.1.0) + activesupport (= 8.1.0) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) tsort (>= 0.2) zeitwerk (~> 2.6) - rake (13.2.1) - rdoc (6.12.0) + rake (13.3.0) + rdoc (6.15.0) + erb psych (>= 4.0.0) + tsort redis (5.4.0) redis-client (>= 0.22.0) redis-client (0.24.0) connection_pool - reline (0.6.0) + reline (0.6.2) io-console (~> 0.5) samovar (2.4.1) console (~> 1.0) @@ -287,13 +290,13 @@ GEM concurrent-ruby (~> 1.0) tzinfo-data (1.2025.1) tzinfo (>= 1.0.0) - uri (1.0.3) + uri (1.0.4) useragent (0.16.11) - websocket-driver (0.7.7) + websocket-driver (0.8.0) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.7.2) + zeitwerk (2.7.3) PLATFORMS ruby @@ -306,7 +309,7 @@ DEPENDENCIES pg (~> 1.5) pitchfork (~> 0.17) puma (~> 7.1) - rails (~> 8.1.0.beta1) + rails (~> 8.1.0) redis (~> 5.0) trilogy (~> 2.8.1) tzinfo-data From 75020f4944b9a66a2b09837b1d052d4172482edf Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 29 Oct 2025 17:19:45 +0100 Subject: [PATCH 1705/1766] [ruby/agoo] Use Ruby 3.5-rc (#10218) --- frameworks/Ruby/agoo/agoo.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/agoo/agoo.dockerfile b/frameworks/Ruby/agoo/agoo.dockerfile index b4c252a768e..548fb50341b 100644 --- a/frameworks/Ruby/agoo/agoo.dockerfile +++ b/frameworks/Ruby/agoo/agoo.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.4 +FROM ruby:3.5-rc RUN apt-get update -q \ && apt-get install --no-install-recommends -q -y \ From 8c85d6a20d8de6014bafdc7bed7320838c4c2fc1 Mon Sep 17 00:00:00 2001 From: "Benjamin M." Date: Wed, 29 Oct 2025 17:20:44 +0100 Subject: [PATCH 1706/1766] Fix spock (#10220) * Ignore stack build files. * Update GHC, libs, fix breakage. --------- Co-authored-by: Benjamin Maurer --- frameworks/Haskell/spock/.gitignore | 1 + .../Haskell/spock/benchmark_config.json | 4 +- frameworks/Haskell/spock/spock.dockerfile | 7 +- frameworks/Haskell/spock/src/Main.hs | 72 +++++++++++-------- frameworks/Haskell/spock/stack.yaml | 12 +++- frameworks/Haskell/spock/stack.yaml.lock | 68 ++++++++++++++++++ 6 files changed, 129 insertions(+), 35 deletions(-) create mode 100644 frameworks/Haskell/spock/.gitignore create mode 100644 frameworks/Haskell/spock/stack.yaml.lock diff --git a/frameworks/Haskell/spock/.gitignore b/frameworks/Haskell/spock/.gitignore new file mode 100644 index 00000000000..8ee1bf9489a --- /dev/null +++ b/frameworks/Haskell/spock/.gitignore @@ -0,0 +1 @@ +.stack-work diff --git a/frameworks/Haskell/spock/benchmark_config.json b/frameworks/Haskell/spock/benchmark_config.json index 20337467cb5..71da216c231 100644 --- a/frameworks/Haskell/spock/benchmark_config.json +++ b/frameworks/Haskell/spock/benchmark_config.json @@ -14,7 +14,7 @@ "database": "Postgres", "framework": "Spock", "language": "Haskell", - "flavor": "GHC710", + "flavor": "GHC810", "orm": "Raw", "platform": "Wai", "webserver": "Warp", @@ -23,7 +23,7 @@ "display_name": "Spock", "notes": "", "versus": "", - "tags": ["broken"] + "tags": [] } }] } diff --git a/frameworks/Haskell/spock/spock.dockerfile b/frameworks/Haskell/spock/spock.dockerfile index bff65a2ef2b..848b3add166 100644 --- a/frameworks/Haskell/spock/spock.dockerfile +++ b/frameworks/Haskell/spock/spock.dockerfile @@ -1,4 +1,9 @@ -FROM haskell:8.6.3 +FROM haskell:8.10.7 + +# Fix Debian Buster repositories (moved to archive) +RUN sed -i 's/deb.debian.org/archive.debian.org/g' /etc/apt/sources.list && \ + sed -i 's/security.debian.org/archive.debian.org/g' /etc/apt/sources.list && \ + sed -i '/buster-updates/d' /etc/apt/sources.list RUN apt-get update -yqq && apt-get install -yqq xz-utils make RUN apt-get install -yqq libpq-dev diff --git a/frameworks/Haskell/spock/src/Main.hs b/frameworks/Haskell/spock/src/Main.hs index d5ac4e36a84..ee96c833454 100644 --- a/frameworks/Haskell/spock/src/Main.hs +++ b/frameworks/Haskell/spock/src/Main.hs @@ -3,43 +3,54 @@ module Main where +import qualified GHC.Conc import Control.Concurrent.Async import Control.Monad.IO.Class import Data.Aeson hiding (json) import Data.List (sort) import Data.Maybe (catMaybes, fromMaybe) -import Data.Pool +import Data.Pool (Pool) +import qualified Data.Pool as Pool import qualified Database.PostgreSQL.Simple as PG import GHC.Exts import Network.HTTP.Types.Status import Text.Blaze.Html.Renderer.Utf8 import qualified Text.Blaze.Html5 as H -import Web.Spock.Safe +import Web.Spock import Models.Fortune import Models.World import Views.Fortune - - -creds :: PG.ConnectInfo -creds = - PG.ConnectInfo - { PG.connectHost = "tfb-database" - , PG.connectPort = 5432 - , PG.connectUser = "benchmarkdbuser" - , PG.connectPassword = "benchmarkdbpass" - , PG.connectDatabase = "hello_world" - } - - -poolCfg :: PoolCfg -poolCfg = PoolCfg 50 50 60 - -pcconn :: ConnBuilder PG.Connection -pcconn = ConnBuilder (PG.connect creds) PG.close poolCfg - -dbConn :: PoolOrConn PG.Connection -dbConn = PCConn pcconn +import Web.Spock.Config + + +poolCfg :: Int -> PoolCfg +poolCfg numStripes = PoolCfg + { pc_stripes = numStripes + , pc_resPerStripe = 20 + , pc_keepOpenTime = 20 + } + + +mkPool :: PoolCfg -> IO (Pool PG.Connection) +mkPool cfg = Pool.createPool + dbConnect + PG.close + (pc_stripes cfg) + (pc_keepOpenTime cfg) + (pc_resPerStripe cfg) + +dbConnect :: IO PG.Connection +dbConnect = PG.connect creds + where + creds = + PG.ConnectInfo + { PG.connectHost = "tfb-database" + , PG.connectPort = 5432 + , PG.connectUser = "benchmarkdbuser" + , PG.connectPassword = "benchmarkdbpass" + , PG.connectDatabase = "hello_world" + } blaze :: MonadIO m => H.Html -> ActionCtxT ctx m a @@ -77,7 +88,7 @@ test2 = do test3 :: Pool PG.Connection -> ActionCtxT ctx (WebStateM PG.Connection b ()) a test3 pool = do queries <- getQueriesNumber - worlds <- liftIO $ mapConcurrently (const (withResource pool getRandomWorld)) [1..queries] + worlds <- liftIO $ mapConcurrently (const (Pool.withResource pool getRandomWorld)) [1..queries] setHeader "Content-Type" "application/json" lazyBytes $ encode worlds {-# INLINE test3 #-} @@ -95,8 +106,8 @@ test4 = do test5 :: Pool PG.Connection -> ActionCtxT ctx (WebStateM PG.Connection b ()) a test5 pool = do queries <- getQueriesNumber - worlds <- liftIO $ mapConcurrently (const (withResource pool getRandomWorld)) [1..queries] - updatedWorlds <- liftIO $ mapConcurrently (withResource pool . updateWorldRandom) (catMaybes worlds) + worlds <- liftIO $ mapConcurrently (const (Pool.withResource pool getRandomWorld)) [1..queries] + updatedWorlds <- liftIO $ mapConcurrently (Pool.withResource pool . updateWorldRandom) (catMaybes worlds) setHeader "Content-Type" "application/json" lazyBytes $ encode updatedWorlds {-# INLINE test5 #-} @@ -111,10 +122,11 @@ test6 = do main :: IO () main = do - pool <- createPool (cb_createConn pcconn) (cb_destroyConn pcconn) - (pc_stripes poolCfg) (pc_keepOpenTime poolCfg) - (pc_resPerStripe poolCfg) - runSpock 3000 $ spock (defaultSpockCfg Nothing dbConn ()) $ do + numCaps <- GHC.Conc.getNumCapabilities + let numStripes = max 1 numCaps + pool <- mkPool (poolCfg numStripes) + spockCfg <- defaultSpockCfg () (PCPool pool) () + runSpock 3000 $ spock spockCfg $ do get "json" test1 get "db" test2 get "queries" $ test3 pool diff --git a/frameworks/Haskell/spock/stack.yaml b/frameworks/Haskell/spock/stack.yaml index 79abbef4a66..da0996716cd 100644 --- a/frameworks/Haskell/spock/stack.yaml +++ b/frameworks/Haskell/spock/stack.yaml @@ -2,13 +2,21 @@ # For more information, see: http://docs.haskellstack.org/en/stable/yaml_configuration/ # Specifies the GHC version and set of packages available (e.g., lts-3.5, nightly-2015-09-21, ghc-7.10.2) -resolver: lts-6.3 +resolver: lts-18.28 # Local packages, usually specified by relative directory name packages: - '.' # Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3) -extra-deps: [] +extra-deps: + - Spock-0.14.0.0 + - Spock-core-0.14.0.0 + - reroute-0.6.0.0 + - stm-containers-1.2 + - focus-1.0.1.4 + - stm-hamt-1.2.0.4 + - primitive-extras-0.8 + - primitive-unlifted-0.1.3.0 # Override default flag values for local packages and extra-deps flags: {} diff --git a/frameworks/Haskell/spock/stack.yaml.lock b/frameworks/Haskell/spock/stack.yaml.lock new file mode 100644 index 00000000000..86b7fe920c8 --- /dev/null +++ b/frameworks/Haskell/spock/stack.yaml.lock @@ -0,0 +1,68 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/topics/lock_files + +packages: +- completed: + hackage: Spock-0.14.0.0@sha256:7e86ccc9e66ce0fdb84d1dcd328f852d3754c2dbfcb60d0e7e2f1cce2f32f177,3681 + pantry-tree: + sha256: 6829dae9ba2492fae3e447afe13013dd863bd48fd5b8addfa74fc55d979de7b2 + size: 1118 + original: + hackage: Spock-0.14.0.0 +- completed: + hackage: Spock-core-0.14.0.0@sha256:386d330115cf7f82984cfbfd5190a0009b7bf6b4759acbddf2a1c05e0ef57e77,3580 + pantry-tree: + sha256: 8b6ae16a663f791109b6aee858b7989239a9ecd2d58e34f098d42da93f0d3960 + size: 1113 + original: + hackage: Spock-core-0.14.0.0 +- completed: + hackage: reroute-0.6.0.0@sha256:43805b3fdc7ed1ba701cd10e249abc997b2291c8f374b8333bb2ea0e0d1dad0b,2382 + pantry-tree: + sha256: 0a27afabb1730147d6aa0ddf5cc6368951c4625e3706cb8f5388da9739372fa3 + size: 660 + original: + hackage: reroute-0.6.0.0 +- completed: + hackage: stm-containers-1.2@sha256:a887f2e7692b7cf20e0b081e2d66e21076e2bd4b57016ec59c484edfa2d29397,3244 + pantry-tree: + sha256: 20b1076bdb121347ccc512a67df697eed34815a8e35279b6b9a0951963b1eba2 + size: 761 + original: + hackage: stm-containers-1.2 +- completed: + hackage: focus-1.0.1.4@sha256:fb2da753531be62e81da10eefbb6cd91d55b60612c3bbd6d82855664347da2fd,2647 + pantry-tree: + sha256: 0f76ffc78fb23e36c63e8a3e66d09d9e072bd891054adfff48b1983727d2394d + size: 325 + original: + hackage: focus-1.0.1.4 +- completed: + hackage: stm-hamt-1.2.0.4@sha256:7957497c022554b7599e790696d1a3e56359ad99e5da36a251894c626ca1f60a,3970 + pantry-tree: + sha256: d9a8be48da86bd4a2ba9d52ea29b9a74f1b686d439ba1bbfba04ab1a002391da + size: 1009 + original: + hackage: stm-hamt-1.2.0.4 +- completed: + hackage: primitive-extras-0.8@sha256:fca0310150496867f5b9421fe1541ecda87fae17eae44885a29f9c52dd00c8ff,2963 + pantry-tree: + sha256: e7c1d26202b80d1fca2ef780ec7fe76ede1275f4d9a996c6d44c08d8de1c45db + size: 1105 + original: + hackage: primitive-extras-0.8 +- completed: + hackage: primitive-unlifted-0.1.3.0@sha256:a98f827740f5dcf097d885b3a47c32f4462204449620abc9d51b8c4f8619f9e6,1427 + pantry-tree: + sha256: c882dca2a96b98d02b0d21875b651edb11ac67d90e736c0de7a92c410a19eb7f + size: 420 + original: + hackage: primitive-unlifted-0.1.3.0 +snapshots: +- completed: + sha256: 428ec8d5ce932190d3cbe266b9eb3c175cd81e984babf876b64019e2cbe4ea68 + size: 590100 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/28.yaml + original: lts-18.28 From 2c1a5321cf97ce28a65167fdaa5ba7fc0ceb7cf3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 22:16:16 +0000 Subject: [PATCH 1707/1766] Build(deps): bump io.undertow:undertow-core in /frameworks/Java/undertow Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.17.Final to 2.3.20.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.17.Final...2.3.20.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-version: 2.3.20.Final dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- 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 3bdce648fb3..b75308fdd5c 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -20,7 +20,7 @@ 3.2.2 0.9.10 42.7.2 - 2.3.17.Final + 2.3.20.Final From 8249c30167f2807e4fdfc06763f8d792a578f926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Sat, 1 Nov 2025 05:17:13 +0800 Subject: [PATCH 1708/1766] optimize(touchsocket):scheduler (#10222) * update(touchsocket):version to 4.0.0-rc.2 * update(touchsocket):version to 4.0.0-rc.5 * optimize(touchsocket):scheduler * Performance (TouchSocketHttp, TouchSocketWebApi): Enable server garbage collection --- .../CSharp/touchsocket/src/TouchSocketHttp/Program.cs | 6 ------ .../touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj | 1 + .../src/TouchSocketHttp31/TouchSocketHttp31.csproj | 2 +- .../CSharp/touchsocket/src/TouchSocketWebApi/Program.cs | 6 ------ .../src/TouchSocketWebApi/TouchSocketWebApi.csproj | 1 + .../src/TouchSocketWebApi31/TouchSocketWebApi31.csproj | 2 +- 6 files changed, 4 insertions(+), 14 deletions(-) diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs index c54ff87c76e..125284cd970 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs @@ -15,12 +15,6 @@ private static async Task Main(string[] args) await service.SetupAsync(new TouchSocketConfig() .SetListenIPHosts(port) - .SetNoDelay(true) - .SetTransportOption(options => - { - options.ReceivePipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); - options.SendPipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); - }) .SetMaxCount(1000000) .ConfigureContainer(a => { diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index b09d51fff00..e550d0eedb6 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -5,6 +5,7 @@ enable Exe enable + true dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb6-47d798a5a131 diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj index 41261ace4f9..8f8a2d69035 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp31/TouchSocketHttp31.csproj @@ -7,8 +7,8 @@ enable true - dotnet-TouchSocketWebApi-987c185f-10b1-455b-beb6-47d798a5a131 true + dotnet-TouchSocketWebApi-987c185f-10b1-455b-beb6-47d798a5a131 diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs index 66d4c955f40..26cdfb935fd 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -18,12 +18,6 @@ public static void Main(string[] args) builder.Services.AddServiceHostedService(config => { config.SetListenIPHosts(8080) - .SetNoDelay(true) - .SetTransportOption(options => - { - options.ReceivePipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); - options.SendPipeOptions = TransportOption.CreateSchedulerOptimizedPipeOptions(); - }) .SetMaxCount(1000000) .ConfigureContainer(a => { diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index 572563f16bb..0a0fbc559c3 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -4,6 +4,7 @@ net9.0 enable enable + true dotnet-WorkerService1-19b37b17-6043-4334-ad9a-9e0e3c670da3 diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj index 80742a45b17..d385bc8caed 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi31/TouchSocketWebApi31.csproj @@ -6,8 +6,8 @@ enable true - dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb7-47d798a5a131 true + dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb7-47d798a5a131 From 9e8d965057b11df9d87eb1b9eb04629e4e27e1c8 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:17:35 +0200 Subject: [PATCH 1709/1766] Update ring-http-exchange with better executor (#10224) Co-authored-by: jj --- .../Clojure/ring-http-exchange/project.clj | 6 +- .../ring-http-exchange/resources/fortune.sql | 1 + .../src/ring_http_exchange/benchmark.clj | 69 ++++++++++--------- 3 files changed, 42 insertions(+), 34 deletions(-) create mode 100644 frameworks/Clojure/ring-http-exchange/resources/fortune.sql diff --git a/frameworks/Clojure/ring-http-exchange/project.clj b/frameworks/Clojure/ring-http-exchange/project.clj index 3c06cf711e7..2f61228d669 100644 --- a/frameworks/Clojure/ring-http-exchange/project.clj +++ b/frameworks/Clojure/ring-http-exchange/project.clj @@ -10,12 +10,12 @@ [seancorfield/next.jdbc "1.2.659"] [org.clojars.jj/majavat "1.12.3"] [hikari-cp "3.3.0"] + [org.clojars.jj/boa-sql "1.0.0"] + [io.netty/netty-transport-native-epoll "4.2.7.Final" :classifier "linux-x86_64"] [org.postgresql/postgresql "42.7.8"] [metosin/jsonista "0.3.13"] ] :profiles {:robaho {:dependencies [[io.github.robaho/httpserver "1.0.28"]]}} :resource-paths ["resources"] - :main ring-http-exchange.benchmark - - ) + :main ring-http-exchange.benchmark) diff --git a/frameworks/Clojure/ring-http-exchange/resources/fortune.sql b/frameworks/Clojure/ring-http-exchange/resources/fortune.sql new file mode 100644 index 00000000000..47c21ba2b0e --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/resources/fortune.sql @@ -0,0 +1 @@ +SELECT * FROM "Fortune"; \ No newline at end of file diff --git a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj index 755d39ee0f0..a5ee8a34384 100644 --- a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj +++ b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj @@ -1,27 +1,30 @@ (ns ring-http-exchange.benchmark (:gen-class) (:require - [jsonista.core :as json] [jj.majavat :as majavat] [jj.majavat.renderer :refer [->StringRenderer]] [jj.majavat.renderer.sanitizer :refer [->Html]] - [ring-http-exchange.core :as server] - [next.jdbc :as jdbc] - [next.jdbc.connection :as connection]) + [jj.sql.boa :as boa] + [jsonista.core :as json] + [next.jdbc.connection :as connection] + [ring-http-exchange.core :as server]) (:import (com.zaxxer.hikari HikariDataSource) - (java.util.concurrent Executors))) + (io.netty.channel.epoll EpollEventLoopGroup))) -(def db-spec - {:jdbcUrl "jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass"}) +(def query-fortunes (boa/execute (boa/->NextJdbcAdapter) "fortune.sql")) -(def datasource - (connection/->pool HikariDataSource db-spec)) - -(defn query-fortunes [] - (jdbc/execute! datasource - ["SELECT * FROM \"Fortune\""] - {:builder-fn next.jdbc.result-set/as-unqualified-lower-maps})) +(def db-spec {:auto-commit true + :read-only false + :connection-timeout 30000 + :validation-timeout 5000 + :idle-timeout 600000 + :max-lifetime 1800000 + :minimum-idle 10 + :maximum-pool-size 520 + :minimum-pool-size 512 + :register-mbeans false + :jdbcUrl "jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass"}) (def ^:private ^:const additional-message {:id 0 :message "Additional fortune added at request time."}) @@ -37,23 +40,27 @@ {:renderer (->StringRenderer {:sanitizer (->Html)})})) +(defn- get-body [datasource] + (let [context (as-> (query-fortunes datasource) fortunes + (conj fortunes additional-message) + (sort-by :message fortunes))] + (render-fortune {:messages context}))) + (defn -main [& _] (println "Starting server on port 8080") - (server/run-http-server - (fn [req] - (case (req :uri) - "/json" {:status 200 - :headers json-headers - :body (json/write-value-as-bytes {:message "Hello, World!"})} - "/fortunes" (let [input (as-> (query-fortunes) fortunes - (conj fortunes additional-message) - (sort-by :message fortunes)) - body (render-fortune {:messages input})] - {:status 200 - :headers fortune-headers - :body body}) - plaintext-response)) - {:port 8080 - :host "0.0.0.0" - :executor (Executors/newVirtualThreadPerTaskExecutor)})) \ No newline at end of file + (let [datasource (connection/->pool HikariDataSource db-spec)] + (server/run-http-server + (fn [req] + (case (req :uri) + "/json" {:status 200 + :headers json-headers + :body (json/write-value-as-bytes {:message "Hello, World!"})} + "/fortunes" (let [body (get-body datasource)] + {:status 200 + :headers fortune-headers + :body body}) + plaintext-response)) + {:port 8080 + :host "0.0.0.0" + :executor (EpollEventLoopGroup.)}))) \ No newline at end of file From 2820308e0e7b76499172ca2b7c2bdc4e3c63ef8c Mon Sep 17 00:00:00 2001 From: Diogo Martins <165835485+MDA2AV@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:17:53 +0000 Subject: [PATCH 1710/1766] Bump Unhinged to 9.0.2, attempt to fix pipelined h1 (#10225) --- frameworks/CSharp/wiredio/src/Platform/Platform.csproj | 2 +- frameworks/CSharp/wiredio/src/Platform/Program.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/CSharp/wiredio/src/Platform/Platform.csproj b/frameworks/CSharp/wiredio/src/Platform/Platform.csproj index 1fd01bf2e63..f560113a9f5 100644 --- a/frameworks/CSharp/wiredio/src/Platform/Platform.csproj +++ b/frameworks/CSharp/wiredio/src/Platform/Platform.csproj @@ -20,6 +20,6 @@ - + diff --git a/frameworks/CSharp/wiredio/src/Platform/Program.cs b/frameworks/CSharp/wiredio/src/Platform/Program.cs index 0b76948f66f..a572a456ae9 100644 --- a/frameworks/CSharp/wiredio/src/Platform/Program.cs +++ b/frameworks/CSharp/wiredio/src/Platform/Program.cs @@ -39,7 +39,7 @@ public static void Main(string[] args) // It's the number of real cpu cores not cpu threads // This can improve the cache hits on L1/L2 since only one thread // is running per cpu core. - .SetNWorkersSolver(() => Environment.ProcessorCount/2) + .SetNWorkersSolver(() => Environment.ProcessorCount / 2) // Accept up to 16384 connections .SetBacklog(16384) From 613eef20f035d46e205f02cbfb2a928b015d348d Mon Sep 17 00:00:00 2001 From: luyongshou Date: Sat, 1 Nov 2025 05:18:20 +0800 Subject: [PATCH 1711/1766] update edap dependencies version (#10226) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 初始化edap-http-benchmark的项目 * 修改pom文件以及测试的配置 * 修改端口号,jdk版本以及去掉有问题的plaintext的测试项 * 修改Message启动时初始化为每次请求生成新的对象 * 去掉多余的"s"字符 * 增加plaintext的测试配置 * add edap-http framwork * cache plaintext's content. * add edap-http-fast * 解决docker构建文件编写错误 * 修改测试框架配置 * 增加dockerfile暴露端口的设置 * 增加edap-http的新版 * 完善maven快照无法下载的问题 * update edap version * delete edapx module * revert firenio code * edit mvn run option --------- Co-authored-by: louis --- .../Java/edap-http/edap-http-fast.dockerfile | 6 +-- .../Java/edap-http/edap-http.dockerfile | 6 +-- frameworks/Java/edap-http/pom.xml | 46 ++++++------------- .../src/main/java/io/edap/http/Bootstrap.java | 23 ++++++---- 4 files changed, 34 insertions(+), 47 deletions(-) diff --git a/frameworks/Java/edap-http/edap-http-fast.dockerfile b/frameworks/Java/edap-http/edap-http-fast.dockerfile index 4142e4f5785..43c1cdfe073 100644 --- a/frameworks/Java/edap-http/edap-http-fast.dockerfile +++ b/frameworks/Java/edap-http/edap-http-fast.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.3-openjdk-8-slim as maven +FROM maven:3.9.11-amazoncorretto-21 as maven WORKDIR /edap-http COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:8u275-jdk-slim +FROM amazoncorretto:21.0.8 WORKDIR /edap-http COPY --from=maven /edap-http/target/edap-http-benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dedap.http.decoder.type=fast", "-cp", "app.jar", "io.edap.http.Bootstrap"] +CMD ["java", "-DlazyParseHeader=true", "-server", "--add-exports", "java.base/sun.security.action=ALL-UNNAMED", "--add-exports", "java.naming/com.sun.jndi.ldap=ALL-UNNAMED", "--add-exports", "java.naming/com.sun.jndi.url.ldap=ALL-UNNAMED", "--add-exports", "jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED", "--add-exports", "jdk.naming.dns/com.sun.jndi.url.dns=ALL-UNNAMED", "--add-exports", "java.security.jgss/sun.security.krb5.internal=ALL-UNNAMED", "--add-exports", "jdk.attach/sun.tools.attach=ALL-UNNAMED", "--add-opens", "java.base/java.util=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.util.concurrent=ALL-UNNAMED", "--add-opens", "java.base/java.io=ALL-UNNAMED", "--add-opens", "java.base/java.nio=ALL-UNNAMED", "--add-opens", "java.base/sun.nio.ch=ALL-UNNAMED", "--add-opens", "java.naming/javax.naming.spi=ALL-UNNAMED", "--add-opens", "java.naming/com.sun.naming.internal=ALL-UNNAMED", "--add-opens", "jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED", "--add-opens", "java.naming/javax.naming=ALL-UNNAMED", "--add-opens", "java.rmi/java.rmi=ALL-UNNAMED", "--add-opens", "java.sql/java.sql=ALL-UNNAMED", "--add-opens", "java.management/javax.management=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "--add-opens", "java.desktop/java.awt.image=ALL-UNNAMED", "--add-opens", "java.base/java.security=ALL-UNNAMED", "--add-opens", "java.base/java.net=ALL-UNNAMED", "--add-opens", "java.base/java.text=ALL-UNNAMED", "--add-opens", "java.base/sun.net.www.protocol.https=ALL-UNNAMED", "--add-exports", "jdk.management.agent/jdk.internal.agent=ALL-UNNAMED", "--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED", "--add-opens", "java.base/java.lang.ref=ALL-UNNAMED", "--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-cp", "app.jar", "io.edap.http.Bootstrap"] diff --git a/frameworks/Java/edap-http/edap-http.dockerfile b/frameworks/Java/edap-http/edap-http.dockerfile index 9d20ae4ceab..2028d1c3939 100644 --- a/frameworks/Java/edap-http/edap-http.dockerfile +++ b/frameworks/Java/edap-http/edap-http.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.3-openjdk-8-slim as maven +FROM maven:3.9.11-amazoncorretto-21 as maven WORKDIR /edap-http COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:8u275-jdk-slim +FROM amazoncorretto:21.0.8 WORKDIR /edap-http COPY --from=maven /edap-http/target/edap-http-benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-cp", "app.jar", "io.edap.http.Bootstrap"] +CMD ["java", "-server", "--add-exports", "java.base/sun.security.action=ALL-UNNAMED", "--add-exports", "java.naming/com.sun.jndi.ldap=ALL-UNNAMED", "--add-exports", "java.naming/com.sun.jndi.url.ldap=ALL-UNNAMED", "--add-exports", "jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED", "--add-exports", "jdk.naming.dns/com.sun.jndi.url.dns=ALL-UNNAMED", "--add-exports", "java.security.jgss/sun.security.krb5.internal=ALL-UNNAMED", "--add-exports", "jdk.attach/sun.tools.attach=ALL-UNNAMED", "--add-opens", "java.base/java.util=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.util.concurrent=ALL-UNNAMED", "--add-opens", "java.base/java.io=ALL-UNNAMED", "--add-opens", "java.base/java.nio=ALL-UNNAMED", "--add-opens", "java.base/sun.nio.ch=ALL-UNNAMED", "--add-opens", "java.naming/javax.naming.spi=ALL-UNNAMED", "--add-opens", "java.naming/com.sun.naming.internal=ALL-UNNAMED", "--add-opens", "jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED", "--add-opens", "java.naming/javax.naming=ALL-UNNAMED", "--add-opens", "java.rmi/java.rmi=ALL-UNNAMED", "--add-opens", "java.sql/java.sql=ALL-UNNAMED", "--add-opens", "java.management/javax.management=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "--add-opens", "java.desktop/java.awt.image=ALL-UNNAMED", "--add-opens", "java.base/java.security=ALL-UNNAMED", "--add-opens", "java.base/java.net=ALL-UNNAMED", "--add-opens", "java.base/java.text=ALL-UNNAMED", "--add-opens", "java.base/sun.net.www.protocol.https=ALL-UNNAMED", "--add-exports", "jdk.management.agent/jdk.internal.agent=ALL-UNNAMED", "--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED", "--add-opens", "java.base/java.lang.ref=ALL-UNNAMED", "--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-cp", "app.jar", "io.edap.http.Bootstrap"] diff --git a/frameworks/Java/edap-http/pom.xml b/frameworks/Java/edap-http/pom.xml index 9a9a52fe8c2..65b9af2fa54 100644 --- a/frameworks/Java/edap-http/pom.xml +++ b/frameworks/Java/edap-http/pom.xml @@ -11,52 +11,32 @@ UTF-8 - 8 - 8 - 8 - 8 + 21 + 21 + 21 + 21 0.1-SNAPSHOT - edapx + edap io.edap - ${edap.name}-http + ${edap.name}-http-server ${edap.version} - central - Central Repository - https://repo.maven.apache.org/maven2 - - - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - - - central - Central Repository - https://repo.maven.apache.org/maven2 - - - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots - - false - + ossrh + ossrh + https://central.sonatype.com/repository/maven-snapshots/ true - - + + @@ -67,8 +47,8 @@ 3.8.0 false - 8 - 8 + 21 + 21 diff --git a/frameworks/Java/edap-http/src/main/java/io/edap/http/Bootstrap.java b/frameworks/Java/edap-http/src/main/java/io/edap/http/Bootstrap.java index 3d177057454..74c331be93d 100644 --- a/frameworks/Java/edap-http/src/main/java/io/edap/http/Bootstrap.java +++ b/frameworks/Java/edap-http/src/main/java/io/edap/http/Bootstrap.java @@ -1,25 +1,32 @@ package io.edap.http; import io.edap.http.model.Message; -import io.edap.x.Edap; -import io.edap.x.http.HttpServer; -import io.edap.x.http.HttpServerBuilder; +import io.edap.Edap; +import io.edap.http.server.HttpServer; +import io.edap.http.server.HttpServerBuilder; import java.io.IOException; -import static io.edap.x.http.header.ContentType.JSON; -import static io.edap.x.http.header.ContentType.PLAIN; +import static io.edap.http.header.ContentTypeHeader.JSON; +import static io.edap.http.header.ContentTypeHeader.PLAIN; public class Bootstrap { static final byte[] PLAIN_TEXT_CONTENT = "Hello, World!".getBytes(); public static void main(String[] args) throws IOException { - + HttpHandleOption option = new HttpHandleOption(); + String lazyParseHeaderStr = System.getProperty("lazyParseHeader", "false"); + if (Boolean.parseBoolean(lazyParseHeaderStr)) { + option.setLazyParseHeader(true); + } HttpServer httpServer = new HttpServerBuilder() .listen(8080) - .req("/plaintext", (req, resp) -> resp.contentType(PLAIN).write(PLAIN_TEXT_CONTENT)) - .get("/json", (req, resp) -> resp.contentType(JSON).write(new Message("Hello, World!"))) + .req("/plaintext", (req, resp) -> + resp.contentType(PLAIN).write(PLAIN_TEXT_CONTENT), option) + .get("/json", (req, resp) -> { + resp.contentType(JSON).write(new Message("Hello, World!")); + }, option) .build(); Edap edap = new Edap(); edap.addServer(httpServer); From 137da7a6d88e5fcf05c616162430a08849850885 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:19:06 +0000 Subject: [PATCH 1712/1766] Build(deps): bump io.undertow:undertow-core Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.17.Final to 2.3.20.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.17.Final...2.3.20.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-version: 2.3.20.Final 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 bead4b9f0e9..c4f19482f33 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -25,7 +25,7 @@ 11 2.0.1 1.3.12 - 2.3.17.Final + 2.3.20.Final 3.3.1 8.0.28 42.7.2 From 8228bc9e23713318f6502ce67bf230b567ff5bde Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Mon, 3 Nov 2025 21:40:06 +0200 Subject: [PATCH 1713/1766] Update fortunes query in kit (#10233) Co-authored-by: jj --- frameworks/Clojure/kit/deps.edn | 1 + frameworks/Clojure/kit/resources/sql/fortunes.sql | 1 + .../kit/src/clj/io/github/kit_clj/te_bench/db/sql/hikari.clj | 3 +-- .../clj/io/github/kit_clj/te_bench/web/controllers/bench.clj | 4 +++- 4 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 frameworks/Clojure/kit/resources/sql/fortunes.sql diff --git a/frameworks/Clojure/kit/deps.edn b/frameworks/Clojure/kit/deps.edn index a365a40b6ab..d517f976be1 100644 --- a/frameworks/Clojure/kit/deps.edn +++ b/frameworks/Clojure/kit/deps.edn @@ -19,6 +19,7 @@ ;; Database org.postgresql/postgresql {:mvn/version "42.7.8"} + org.clojars.jj/boa-sql {:mvn/version "1.0.0"} ;; kit Libs diff --git a/frameworks/Clojure/kit/resources/sql/fortunes.sql b/frameworks/Clojure/kit/resources/sql/fortunes.sql new file mode 100644 index 00000000000..2fff964d0f4 --- /dev/null +++ b/frameworks/Clojure/kit/resources/sql/fortunes.sql @@ -0,0 +1 @@ +select * from "Fortune"; \ No newline at end of file diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/db/sql/hikari.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/db/sql/hikari.clj index 7fd502127cf..f37b2f526f8 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/db/sql/hikari.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/db/sql/hikari.clj @@ -5,5 +5,4 @@ (defmethod ig/prep-key :db.sql/hikari-connection [_ config] - (let [cpus (.availableProcessors (Runtime/getRuntime))] - (assoc config :maximum-pool-size (* 8 cpus)))) + (assoc config :maximum-pool-size 520)) diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj index d2d5b692124..2057a175140 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj @@ -4,6 +4,7 @@ [next.jdbc :as jdbc] [next.jdbc.result-set :as rs] [jj.majavat :as majavat] + [jj.sql.boa :as boa] [jj.majavat.renderer :refer [->StringRenderer]] [jj.majavat.renderer.sanitizer :refer [->Html]] [ring.util.http-response :as http-response] @@ -19,6 +20,7 @@ (def ^:private render-fortune (majavat/build-renderer "html/fortunes.html" {:renderer (->StringRenderer {:sanitizer (->Html)})})) +(def query-fortunes (boa/execute (boa/->NextJdbcAdapter) "sql/fortunes.sql")) (def selmer-opts {:custom-resource-path (clojure.java.io/resource "html")}) (defn selmer-html-response @@ -143,7 +145,7 @@ (defn majavat-fortune-handler [db-conn _request] - (as-> (jdbc/execute! db-conn ["select * from \"Fortune\";"] jdbc-opts) fortunes + (as-> (query-fortunes db-conn) fortunes (conj fortunes {:id 0 :message "Additional fortune added at request time."}) (sort-by :message fortunes) (majavat-html-response {:messages fortunes}))) \ No newline at end of file From c1d18c565562c85389bd11e5e1d38742923cfef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Gajo?= <50725287+64J0@users.noreply.github.com> Date: Mon, 3 Nov 2025 16:41:25 -0300 Subject: [PATCH 1714/1766] [F#] Upgrade Giraffe to .NET 9 and more (#10234) * Upgrade Giraffe to .NET 9 and more - Upgrade to .NET 9 - Use Fantomas to format the code - Add .editorconfig to configure it - Upgrade libraries - Add Newtonsoft as a separate implementation due to Giraffe upgrade - Add new JSON serializers options (System.Text.Json, Newtonsoft.Json, FSharpFriendly) - Add a chiseled Dockerfile - Add Single Database Query test - Add Multiple Database Queries test * Update .github/workflows/build.yml to use ubuntu-24.04 * Revert "Update .github/workflows/build.yml to use ubuntu-24.04" This reverts commit 354b7384119f5ca78c8f43e246cb0309d75dd6eb. * Fix: rename giraffe-fsharpfriendly.dockerfile into giraffe-fsharp-systemtextjson.dockerfile --- frameworks/FSharp/giraffe/.editorconfig | 17 + frameworks/FSharp/giraffe/README.md | 16 +- .../FSharp/giraffe/benchmark_config.json | 42 ++ frameworks/FSharp/giraffe/config.toml | 30 ++ .../giraffe/giraffe-chiseled.dockerfile | 19 + .../giraffe-fsharp-systemtextjson.dockerfile | 19 + .../giraffe/giraffe-newtonsoft.dockerfile | 4 +- frameworks/FSharp/giraffe/giraffe.dockerfile | 4 +- frameworks/FSharp/giraffe/src/App/App.fsproj | 12 +- .../FSharp/giraffe/src/App/Newtonsoft.fs | 60 +++ frameworks/FSharp/giraffe/src/App/Program.fs | 360 +++++++++++------- 11 files changed, 422 insertions(+), 161 deletions(-) create mode 100644 frameworks/FSharp/giraffe/.editorconfig create mode 100644 frameworks/FSharp/giraffe/giraffe-chiseled.dockerfile create mode 100644 frameworks/FSharp/giraffe/giraffe-fsharp-systemtextjson.dockerfile create mode 100644 frameworks/FSharp/giraffe/src/App/Newtonsoft.fs diff --git a/frameworks/FSharp/giraffe/.editorconfig b/frameworks/FSharp/giraffe/.editorconfig new file mode 100644 index 00000000000..e0f001d4808 --- /dev/null +++ b/frameworks/FSharp/giraffe/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[*.{fs,fsi,fsx}] +indent_size = 4 +indent_style = space +max_line_length = 90 +fsharp_space_before_uppercase_invocation = true +fsharp_space_before_member = true +fsharp_space_before_colon = false +fsharp_space_before_semicolon = false +fsharp_multiline_bracket_style = stroustrup +fsharp_newline_between_type_definition_and_members = true +fsharp_align_function_signature_to_indentation = true +fsharp_alternative_long_member_definitions = true +fsharp_multi_line_lambda_closing_newline = true +fsharp_experimental_keep_indent_in_branch = true +fsharp_bar_before_discriminated_union_declaration = true \ No newline at end of file diff --git a/frameworks/FSharp/giraffe/README.md b/frameworks/FSharp/giraffe/README.md index bdc107b6bcc..99a2e8898fb 100644 --- a/frameworks/FSharp/giraffe/README.md +++ b/frameworks/FSharp/giraffe/README.md @@ -1,23 +1,24 @@ # Giraffe Benchmarks on Linux -This application tests Giraffe in 2 modes: +This application tests Giraffe in 3 modes: - Default: Using Giraffe's Endpoint Routing APIs with the `System.Text.Json` serializer - Newtonsoft: Testing the JSON endpoint with the `NewtonsoftJson` serializer +- FSharpFriendly: Testing the JSON endpoint with the `FSharp.SystemTextJson` serializer ## Infrastructure Software Versions **Language** -* F# 8.0 +* F# 9.0 **Platforms** -* .NET 6 (Windows and Linux) +* .NET 9 (Windows and Linux) **Web Servers** -* [Kestrel](https://github.com/aspnet/KestrelHttpServer) +* [Kestrel](https://github.com/dotnet/aspnetcore/tree/main/src/Servers/Kestrel) **Web Stack** @@ -26,9 +27,8 @@ This application tests Giraffe in 2 modes: ## Paths & Source for Tests -All source code is inside `Program.fs`. - App listens for a single command line argument to pick the desired JSON implementation: - - `system`: `System.Text.Json` - - `newtonsoft`: `Newtonsoft.Json` +- `system`: `System.Text.Json` +- `newtonsoft`: `Newtonsoft.Json` +- `fsharpfriendly`: `FSharp.SystemTextJson` diff --git a/frameworks/FSharp/giraffe/benchmark_config.json b/frameworks/FSharp/giraffe/benchmark_config.json index 4384822a751..5552420b37f 100644 --- a/frameworks/FSharp/giraffe/benchmark_config.json +++ b/frameworks/FSharp/giraffe/benchmark_config.json @@ -5,6 +5,8 @@ "default": { "plaintext_url": "/plaintext", "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", @@ -39,6 +41,46 @@ "display_name": "Giraffe, NewtonsoftJson", "notes": "", "versus": "aspcore" + }, + "fsharp-systemtextjson": { + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Giraffe", + "language": "F#", + "orm": "Raw", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "Kestrel", + "os": "Linux", + "database_os": "Linux", + "display_name": "Giraffe, FSharp.SystemTextJson", + "notes": "", + "versus": "aspcore" + }, + "chiseled": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "fullstack", + "database": "Postgres", + "framework": "giraffe", + "language": "F#", + "orm": "micro", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "Kestrel", + "os": "Linux", + "database_os": "Linux", + "display_name": "Giraffe Chiseled, Default with Dapper", + "notes": "", + "versus": "aspcore" } } ] diff --git a/frameworks/FSharp/giraffe/config.toml b/frameworks/FSharp/giraffe/config.toml index 15122b9ddba..a44ef83d919 100644 --- a/frameworks/FSharp/giraffe/config.toml +++ b/frameworks/FSharp/giraffe/config.toml @@ -4,6 +4,8 @@ name = "giraffe" [main] urls.plaintext = "/plaintext" urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" urls.fortune = "/fortunes" approach = "Realistic" classification = "fullstack" @@ -26,3 +28,31 @@ orm = "Raw" platform = ".NET" webserver = "Kestrel" versus = "aspcore" + +[fsharp-systemtextjson] +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "Kestrel" +versus = "aspcore" + +[chiseled] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "micro" +platform = ".NET" +webserver = "Kestrel" +versus = "aspcore" \ No newline at end of file diff --git a/frameworks/FSharp/giraffe/giraffe-chiseled.dockerfile b/frameworks/FSharp/giraffe/giraffe-chiseled.dockerfile new file mode 100644 index 00000000000..490513ee85c --- /dev/null +++ b/frameworks/FSharp/giraffe/giraffe-chiseled.dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0.306 AS build +WORKDIR /app +COPY src/App . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:9.0-noble-chiseled AS runtime +ENV ASPNETCORE_URLS http://+:8080 + +# Full PGO +ENV DOTNET_TieredPGO 1 +ENV DOTNET_TC_QuickJitForLoops 1 +ENV DOTNET_ReadyToRun 0 + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "App.dll", "system"] diff --git a/frameworks/FSharp/giraffe/giraffe-fsharp-systemtextjson.dockerfile b/frameworks/FSharp/giraffe/giraffe-fsharp-systemtextjson.dockerfile new file mode 100644 index 00000000000..cf377fa97ce --- /dev/null +++ b/frameworks/FSharp/giraffe/giraffe-fsharp-systemtextjson.dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0.306 AS build +WORKDIR /app +COPY src/App . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime +ENV ASPNETCORE_URLS http://+:8080 + +# Full PGO +ENV DOTNET_TieredPGO 1 +ENV DOTNET_TC_QuickJitForLoops 1 +ENV DOTNET_ReadyToRun 0 + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "App.dll", "fsharpfriendly"] diff --git a/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile b/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile index da172b8140e..61cc3d1ec71 100644 --- a/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile +++ b/frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0.306 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime ENV ASPNETCORE_URLS http://+:8080 # Full PGO diff --git a/frameworks/FSharp/giraffe/giraffe.dockerfile b/frameworks/FSharp/giraffe/giraffe.dockerfile index c980686ee14..6ae0606f20b 100644 --- a/frameworks/FSharp/giraffe/giraffe.dockerfile +++ b/frameworks/FSharp/giraffe/giraffe.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0.306 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime ENV ASPNETCORE_URLS http://+:8080 # Full PGO diff --git a/frameworks/FSharp/giraffe/src/App/App.fsproj b/frameworks/FSharp/giraffe/src/App/App.fsproj index 9faae3fe0a1..215f3bfc001 100644 --- a/frameworks/FSharp/giraffe/src/App/App.fsproj +++ b/frameworks/FSharp/giraffe/src/App/App.fsproj @@ -1,18 +1,20 @@ - net8.0 + net9.0 false - - - - + + + + + + diff --git a/frameworks/FSharp/giraffe/src/App/Newtonsoft.fs b/frameworks/FSharp/giraffe/src/App/Newtonsoft.fs new file mode 100644 index 00000000000..6090323e37b --- /dev/null +++ b/frameworks/FSharp/giraffe/src/App/Newtonsoft.fs @@ -0,0 +1,60 @@ +module NewtonsoftJson + +open System.IO +open System.Text +open System.Threading.Tasks +open Microsoft.IO +open Newtonsoft.Json +open Newtonsoft.Json.Serialization +open Giraffe + +type Serializer + (settings: JsonSerializerSettings, rmsManager: RecyclableMemoryStreamManager) + = + let serializer = JsonSerializer.Create settings + let utf8EncodingWithoutBom = UTF8Encoding (false) + + static member DefaultSettings = + JsonSerializerSettings ( + ContractResolver = CamelCasePropertyNamesContractResolver () + ) + + interface Json.ISerializer with + member __.SerializeToString (x: 'T) = + JsonConvert.SerializeObject (x, settings) + + member __.SerializeToBytes (x: 'T) = + JsonConvert.SerializeObject (x, settings) |> Encoding.UTF8.GetBytes + + member __.SerializeToStreamAsync (x: 'T) (stream: Stream) = + task { + use memoryStream = + rmsManager.GetStream ("giraffe-json-serialize-to-stream") + + use streamWriter = new StreamWriter (memoryStream, utf8EncodingWithoutBom) + + use jsonTextWriter = new JsonTextWriter (streamWriter) + serializer.Serialize (jsonTextWriter, x) + jsonTextWriter.Flush () + memoryStream.Seek (0L, SeekOrigin.Begin) |> ignore + do! memoryStream.CopyToAsync (stream, 65536) + } + :> Task + + member __.Deserialize<'T> (json: string) = + JsonConvert.DeserializeObject<'T> (json, settings) + + member __.Deserialize<'T> (bytes: byte array) = + let json = Encoding.UTF8.GetString bytes + JsonConvert.DeserializeObject<'T> (json, settings) + + member __.DeserializeAsync<'T> (stream: Stream) = + task { + use memoryStream = rmsManager.GetStream ("giraffe-json-deserialize") + + do! stream.CopyToAsync (memoryStream) + memoryStream.Seek (0L, SeekOrigin.Begin) |> ignore + use streamReader = new StreamReader (memoryStream) + use jsonTextReader = new JsonTextReader (streamReader) + return serializer.Deserialize<'T> (jsonTextReader) + } diff --git a/frameworks/FSharp/giraffe/src/App/Program.fs b/frameworks/FSharp/giraffe/src/App/Program.fs index ce8514699cd..b4e63e7333f 100644 --- a/frameworks/FSharp/giraffe/src/App/Program.fs +++ b/frameworks/FSharp/giraffe/src/App/Program.fs @@ -1,144 +1,216 @@ -namespace App - -[] -module Common = - open System - open System.Collections.Generic - - [] - type Fortune = - { - id : int - message : string - } - - [] - let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000" - - type JsonMode = - | System - | Newtonsoft - - let FortuneComparer = - { - new IComparer with - member __.Compare (a, b) = - String.CompareOrdinal(a.message, b.message) - } - -[] -module HtmlViews = - open Giraffe.ViewEngine - - let private fortunesHead = - head [] [ - title [] [ rawText "Fortunes" ] - ] - - let private layout (content: XmlNode list) = - html [] [ - fortunesHead - body [] content - ] - - let private fortunesTableHeader = - tr [] [ - th [] [ rawText "id" ] - th [] [ rawText "message" ] - ] - - let fortunes (fortunes: Fortune seq) = - [ - table [] [ - yield fortunesTableHeader - for f in fortunes -> - tr [] [ - td [] [ rawText <| string f.id ] - td [] [ encodedText <| f.message ] - ] - ] - ] |> layout - -[] -module HttpHandlers = - open Giraffe - open Giraffe.EndpointRouting - open Giraffe.ViewEngine - open Dapper - open Npgsql - - let private extra = - { - id = 0 - message = "Additional fortune added at request time." - } - - let private fortunes : HttpHandler = - fun _ ctx -> - task { - use conn = new NpgsqlConnection(ConnectionString) - let! data = conn.QueryAsync("SELECT id, message FROM fortune") - - let view = - let xs = data.AsList() - xs.Add extra - xs.Sort FortuneComparer - HtmlViews.fortunes xs - - let bytes = RenderView.AsBytes.htmlDocument view - - ctx.SetContentType "text/html;charset=utf-8" - return! ctx.WriteBytesAsync bytes - } - - let endpoints : Endpoint list = - [ - route "/plaintext" (text "Hello, World!") - route "/json" (json {| message = "Hello, World!" |}) - route "/fortunes" fortunes - ] - - -module Main = - open Microsoft.AspNetCore.Builder - open Microsoft.AspNetCore.Hosting - open Microsoft.Extensions.DependencyInjection - open Giraffe - open Giraffe.EndpointRouting - open Microsoft.Extensions.Hosting - open Microsoft.Extensions.Logging - - [] - let main args = - let jsonMode = - match args with - | [| "newtonsoft" |] -> Newtonsoft - | _ -> System - - printfn $"Running with %A{jsonMode} JSON serializer" - - let jsonSerializer = - match jsonMode with - | System -> - SystemTextJson.Serializer(SystemTextJson.Serializer.DefaultOptions) - :> Json.ISerializer - | Newtonsoft -> - NewtonsoftJson.Serializer(NewtonsoftJson.Serializer.DefaultSettings) - :> Json.ISerializer - - let builder = WebApplication.CreateBuilder(args) - - builder.Services - .AddSingleton(jsonSerializer) - .AddGiraffe() |> ignore - - builder.Logging.ClearProviders() |> ignore - - let app = builder.Build() - - app.UseRouting() - .UseGiraffe HttpHandlers.endpoints |> ignore - - app.Run() - - 0 \ No newline at end of file +namespace App + +[] +module Common = + open System + open System.Collections.Generic + + [] + type Fortune = { id: int; message: string } + + [] + type World = { id: int; randomNumber: int } + + [] + let ConnectionString = + """ + Server=tfb-database; + Database=hello_world; + User Id=benchmarkdbuser; + Password=benchmarkdbpass; + SSL Mode=Disable; + Maximum Pool Size=1024; + NoResetOnClose=true; + Enlist=false; + Max Auto Prepare=4; + Multiplexing=true; + Write Coalescing Buffer Threshold Bytes=1000 + """ + + [] + type JsonMode = + | System + | Newtonsoft + | FSharpFriendly + + let FortuneComparer = + { new IComparer with + member __.Compare (a, b) = + String.CompareOrdinal (a.message, b.message) + } + + type RandomUtil() = + let rnd = System.Random () + let min = 1 + let max = 10_000 + + member _.Next () = rnd.Next (min, max) + + [] + let MaxDegreeOfParallelism = 3 + +[] +module HtmlViews = + open Giraffe.ViewEngine + + let private fortunesHead = head [] [ title [] [ rawText "Fortunes" ] ] + + let private layout (content: XmlNode list) = + html [] [ fortunesHead; body [] content ] + + let private fortunesTableHeader = + tr [] [ th [] [ rawText "id" ]; th [] [ rawText "message" ] ] + + let fortunes (fortunes: Fortune seq) = + [ + table [] [ + yield fortunesTableHeader + for f in fortunes -> + tr [] [ + td [] [ rawText <| string f.id ] + td [] [ encodedText <| f.message ] + ] + ] + ] + |> layout + +[] +module HttpHandlers = + open Giraffe + open Giraffe.EndpointRouting + open Giraffe.ViewEngine + open Dapper + open Npgsql + + let private extra = { + id = 0 + message = "Additional fortune added at request time." + } + + let private fortunes: HttpHandler = + fun _ ctx -> + task { + use conn = new NpgsqlConnection (ConnectionString) + + let! data = conn.QueryAsync ("SELECT id, message FROM fortune") + + let view = + let xs = data.AsList () + xs.Add extra + xs.Sort FortuneComparer + HtmlViews.fortunes xs + + let bytes = RenderView.AsBytes.htmlDocument view + + ctx.SetContentType "text/html;charset=utf-8" + return! ctx.WriteBytesAsync bytes + } + + let private db: HttpHandler = + fun _ ctx -> + task { + let rnd = ctx.GetService () + use conn = new NpgsqlConnection (ConnectionString) + + let! data = + conn.QuerySingleAsync ( + "SELECT id, randomnumber FROM world WHERE id = @Id", + {| Id = rnd.Next () |} + ) + + return! ctx.WriteJsonAsync data + } + + let private queries: HttpHandler = + fun _ ctx -> + task { + let queryParam = + ctx.TryGetQueryStringValue "queries" + |> Option.map (fun value -> + match System.Int32.TryParse value with + | true, intValue -> + if intValue < 1 then 1 + elif intValue > 500 then 500 + else intValue + | false, _ -> 1 + ) + |> Option.defaultValue 1 + + let rnd = ctx.GetService () + + let! res = + Array.init queryParam (fun _ -> rnd.Next ()) + |> Array.map (fun id -> + use conn = new NpgsqlConnection (ConnectionString) + + conn.QuerySingleAsync ( + "SELECT id, randomnumber FROM world WHERE id = @Id", + {| Id = id |} + ) + |> Async.AwaitTask + ) + |> fun computations -> + Async.Parallel (computations, MaxDegreeOfParallelism) + + return! ctx.WriteJsonAsync res + } + + let endpoints: Endpoint list = [ + route "/plaintext" (text "Hello, World!") + route "/json" (json {| message = "Hello, World!" |}) + route "/db" db + route "/queries" queries + route "/fortunes" fortunes + ] + + +module Main = + open Microsoft.AspNetCore.Builder + open Microsoft.Extensions.DependencyInjection + open Giraffe + open Giraffe.EndpointRouting + open Microsoft.Extensions.Hosting + open Microsoft.Extensions.Logging + open System.Text.Json + open Newtonsoft.Json + + [] + let main args = + let jsonMode = + match args with + | [| "newtonsoft" |] -> Newtonsoft + | [| "fsharpfriendly" |] -> FSharpFriendly + | _ -> System + + printfn $"Running with %A{jsonMode} JSON serializer" + + let jsonSerializer = + match jsonMode with + | System -> Json.Serializer JsonSerializerOptions.Default :> Json.ISerializer + | Newtonsoft -> + NewtonsoftJson.Serializer ( + JsonSerializerSettings (), + Microsoft.IO.RecyclableMemoryStreamManager () + ) + :> Json.ISerializer + | FSharpFriendly -> Json.FsharpFriendlySerializer () :> Json.ISerializer + + let builder = WebApplication.CreateBuilder (args) + + let rnd = RandomUtil () + + builder.Services + .AddSingleton(jsonSerializer) + .AddSingleton(rnd) + .AddGiraffe () + |> ignore + + builder.Logging.ClearProviders () |> ignore + + let app = builder.Build () + + app.UseRouting().UseGiraffe HttpHandlers.endpoints |> ignore + + app.Run () + + 0 From 1e6d95f3b1ace2f3c326bb1d786126186e506408 Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Mon, 3 Nov 2025 21:41:53 +0200 Subject: [PATCH 1715/1766] Update luminus to use jdk 25 (#10235) * Cleanup luminus deps * update jdk version to 25 * update deps --------- Co-authored-by: jj --- frameworks/Clojure/luminus/luminus.dockerfile | 14 +++--- frameworks/Clojure/luminus/project.clj | 43 +++++++------------ .../Clojure/luminus/src/clj/hello/core.clj | 9 ---- .../Clojure/luminus/src/clj/hello/db/core.clj | 7 ++- .../Clojure/luminus/src/clj/hello/handler.clj | 6 +-- .../Clojure/luminus/src/clj/hello/layout.clj | 18 +++----- .../luminus/src/clj/hello/routes/home.clj | 9 ++-- 7 files changed, 38 insertions(+), 68 deletions(-) diff --git a/frameworks/Clojure/luminus/luminus.dockerfile b/frameworks/Clojure/luminus/luminus.dockerfile index ff837b7cc0a..b5aa5430694 100644 --- a/frameworks/Clojure/luminus/luminus.dockerfile +++ b/frameworks/Clojure/luminus/luminus.dockerfile @@ -1,13 +1,15 @@ -FROM clojure:lein-2.8.1 +FROM clojure:lein as lein WORKDIR /luminus COPY env env +COPY project.clj project.clj COPY resources resources COPY src src -COPY test test -COPY Procfile Procfile -COPY project.clj project.clj RUN lein uberjar -EXPOSE 3000 +FROM openjdk:25-jdk-slim +WORKDIR /luminus +COPY --from=lein /luminus/target/hello.jar app.jar + +EXPOSE 8080 -CMD ["java", "-server", "-jar", "target/hello.jar"] +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Clojure/luminus/project.clj b/frameworks/Clojure/luminus/project.clj index 42857020495..ade881af545 100644 --- a/frameworks/Clojure/luminus/project.clj +++ b/frameworks/Clojure/luminus/project.clj @@ -3,32 +3,21 @@ :description "TechEmpower Luminus benchmark" :url "https://github.com/TechEmpower/FrameworkBenchmarks" - :dependencies [[org.clojure/clojure "1.10.0"] - [cheshire "5.7.0"] - [selmer "1.10.7"] - [markdown-clj "0.9.98"] - [metosin/muuntaja "0.2.1"] - [metosin/ring-http-response "0.8.2"] - [bouncer "1.0.1"] - [org.webjars/bootstrap "4.2.1"] - [org.webjars/font-awesome "5.6.1"] - [org.webjars.bower/tether "1.4.4"] - [org.webjars/jquery "3.3.1"] - [org.clojure/tools.logging "0.4.1"] - [com.taoensso/tower "3.0.2"] - [compojure "1.5.2"] - [ring-webjars "0.1.1"] - [ring/ring-defaults "0.2.3"] - [mount "0.1.11"] - [cprop "0.1.10"] - [org.clojure/tools.cli "0.3.5"] - [luminus-nrepl "0.1.4"] - [org.webjars/webjars-locator-jboss-vfs "0.1.0"] - [luminus-immutant "0.2.3"] - [luminus-migrations "0.3.0"] - [conman "0.6.3"] - [org.postgresql/postgresql "42.2.5"] - [luminus-log4j "0.1.5"]] + :dependencies [[org.clojure/clojure "1.12.3"] + [cheshire "6.1.0"] + [selmer "1.12.67"] + [metosin/ring-http-response "0.9.5"] + [org.webjars/bootstrap "5.3.8"] + [org.clojure/tools.logging "1.3.0"] + [compojure "1.7.2"] + [mount "0.1.23"] + [cprop "0.1.21"] + [org.clojure/tools.cli "1.2.245"] + [luminus-immutant "0.2.5"] + [luminus-migrations "0.7.5"] + [conman "0.9.6"] + [org.postgresql/postgresql "42.7.8"] + [luminus-log4j "0.1.7"]] :min-lein-version "2.0.0" @@ -39,8 +28,6 @@ :main hello.core :migratus {:store :database :db ~(get (System/getenv) "DATABASE_URL")} - :plugins [[lein-cprop "1.0.1"] - [migratus-lein "0.2.6"]] :profiles {:uberjar {:omit-source true :jvm-opts ["-D\"clojure.compiler.direct-linking=true\""] diff --git a/frameworks/Clojure/luminus/src/clj/hello/core.clj b/frameworks/Clojure/luminus/src/clj/hello/core.clj index 29db03ce711..67b0ef7072f 100644 --- a/frameworks/Clojure/luminus/src/clj/hello/core.clj +++ b/frameworks/Clojure/luminus/src/clj/hello/core.clj @@ -1,6 +1,5 @@ (ns hello.core (:require [hello.handler :as handler] - [luminus.repl-server :as repl] [luminus.http-server :as http] [hello.config :refer [env]] [clojure.tools.cli :refer [parse-opts]] @@ -28,14 +27,6 @@ :stop (http/stop http-server)) -(mount/defstate repl-server - :start - (when-let [nrepl-port (env :nrepl-port)] - (repl/start {:port nrepl-port})) - :stop - (when repl-server - (repl/stop repl-server))) - (defn stop-app [] (doseq [component (:stopped (mount/stop))] (log/info component "stopped")) diff --git a/frameworks/Clojure/luminus/src/clj/hello/db/core.clj b/frameworks/Clojure/luminus/src/clj/hello/db/core.clj index edf0e08a57d..3af4ed1e35a 100644 --- a/frameworks/Clojure/luminus/src/clj/hello/db/core.clj +++ b/frameworks/Clojure/luminus/src/clj/hello/db/core.clj @@ -1,10 +1,9 @@ (ns hello.db.core (:require - [cheshire.core :refer [generate-string parse-string]] - [clojure.java.jdbc :as jdbc] [conman.core :as conman] [hello.config :refer [env]] - [mount.core :refer [defstate]])) + [mount.core :refer [defstate]]) + (:import (java.sql BatchUpdateException))) (defstate ^:dynamic *db* :start (conman/connect! @@ -53,7 +52,7 @@ (let [w {:id id :randomnumber (unchecked-inc ^long (rand-int 9999))}] (try (update-world! w) - (catch java.sql.BatchUpdateException e + (catch BatchUpdateException e (throw (.getNextException e)))) w)) diff --git a/frameworks/Clojure/luminus/src/clj/hello/handler.clj b/frameworks/Clojure/luminus/src/clj/hello/handler.clj index c5d2559be4f..9588a159e5f 100644 --- a/frameworks/Clojure/luminus/src/clj/hello/handler.clj +++ b/frameworks/Clojure/luminus/src/clj/hello/handler.clj @@ -1,8 +1,8 @@ (ns hello.handler - (:require [compojure.core :refer [routes wrap-routes]] + (:require [compojure.core :refer [routes]] + [compojure.route :as route] [hello.layout :refer [error-page]] - [hello.routes.home :refer [default-routes io-routes]] - [compojure.route :as route])) + [hello.routes.home :refer [default-routes io-routes]])) (def default-handler (routes diff --git a/frameworks/Clojure/luminus/src/clj/hello/layout.clj b/frameworks/Clojure/luminus/src/clj/hello/layout.clj index b65b9fd1f91..2c4ae9008b6 100644 --- a/frameworks/Clojure/luminus/src/clj/hello/layout.clj +++ b/frameworks/Clojure/luminus/src/clj/hello/layout.clj @@ -1,15 +1,9 @@ (ns hello.layout - (:require [selmer.parser :as parser] - [selmer.filters :as filters] - [markdown.core :refer [md-to-html-string]] - [ring.util.http-response :refer [content-type ok]] - [ring.util.anti-forgery :refer [anti-forgery-field]] - [ring.middleware.anti-forgery :refer [*anti-forgery-token*]])) + (:require + [ring.util.http-response :refer [content-type ok]] + [selmer.parser :as parser])) - -(parser/set-resource-path! (clojure.java.io/resource "templates")) -(parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field))) -(filters/add-filter! :markdown (fn [content] [:safe (md-to-html-string content)])) +(parser/set-resource-path! (clojure.java.io/resource "templates")) (defn render "renders the HTML template located relative to resources/templates" @@ -18,9 +12,7 @@ (ok (parser/render-file template - (assoc params - :page template - :csrf-token *anti-forgery-token*))) + (assoc params :page template))) "text/html; charset=utf-8")) (defn error-page diff --git a/frameworks/Clojure/luminus/src/clj/hello/routes/home.clj b/frameworks/Clojure/luminus/src/clj/hello/routes/home.clj index 92736169fc9..b7ca0e0cdc0 100644 --- a/frameworks/Clojure/luminus/src/clj/hello/routes/home.clj +++ b/frameworks/Clojure/luminus/src/clj/hello/routes/home.clj @@ -1,11 +1,10 @@ (ns hello.routes.home - (:require [hello.layout :as layout] + (:require [cheshire.core :refer [generate-string]] + [compojure.core :refer [GET defroutes]] [hello.db.core :as db] - [compojure.core :refer [defroutes GET]] + [hello.layout :as layout] [ring.util.http-response :as response] - [clojure.java.io :as io] - [ring.util.response :refer [content-type]] - [cheshire.core :refer [generate-string]])) + [ring.util.response :refer [content-type]])) (defn encode-json-response [rsp] (-> rsp From 4d76793672fb2e89773914a4358227ac8ed8e216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Tue, 4 Nov 2025 03:42:16 +0800 Subject: [PATCH 1716/1766] Upgrade hyperlane (#10236) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: rand * feat: port * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: 2025-10-24 12:22:32 * feat: v0.1.0 * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: v0.1.0 * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 17 +++++++++-------- frameworks/Rust/hyperlane/Cargo.toml | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index b2c7b644187..08387adbeb8 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -10,9 +10,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -525,15 +525,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.64.1" +version = "1.68.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "024182a8acc397613d6afdea76c8614c32296430248c99a4f9869d7b389b8456" +checksum = "6bd414126bc050b1437bed5a52939854b2b7ef214e8e05aacca3663529514e3e" [[package]] name = "http-type" -version = "5.5.8" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb3fd7b0174cfa0fe95c630fc1b606eb82b4b2a44a47732d5474c79ec6265bd" +checksum = "3cb36d75dbf127e3bfa1c7f404ba69edd760a3a5a93687caaafdb07f73eff64f" dependencies = [ "hex", "http-compress", @@ -549,10 +549,11 @@ dependencies = [ [[package]] name = "hyperlane" -version = "10.7.2" +version = "10.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05aff625011d8505138f31ce05a506c4754c6f7240200c06e1e053f70ee6b952" +checksum = "2c042df01c9d47727269228fa5bacbb25504a6785539c0e5942dd8b2541c33a0" dependencies = [ + "aho-corasick", "http-type", "inventory", "lombok-macros", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index d24001b5f29..83196a7647b 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,7 +20,7 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "10.7.2" +hyperlane = "10.11.3" hyperlane-time = "0.7.12" num_cpus = "1.17.0" once_cell = "1.21.3" From 136a9a668cf9d1c13dc9657b50929d2b82f96371 Mon Sep 17 00:00:00 2001 From: Diogo Martins <165835485+MDA2AV@users.noreply.github.com> Date: Mon, 3 Nov 2025 19:43:12 +0000 Subject: [PATCH 1717/1766] Add simplew framework (#10237) * Add SimpleW frameowork * set readme * rename controller * fix message typo * Remove compression, add date headers * Remove compression, add date headers --- frameworks/CSharp/simplew/.gitignore | 38 +++++++++++++++ .../simplew/Benchmarks/Benchmarks.csproj | 20 ++++++++ .../CSharp/simplew/Benchmarks/Program.cs | 48 +++++++++++++++++++ frameworks/CSharp/simplew/README.md | 18 +++++++ .../CSharp/simplew/benchmark_config.json | 22 +++++++++ frameworks/CSharp/simplew/config.toml | 14 ++++++ frameworks/CSharp/simplew/simplew.dockerfile | 24 ++++++++++ 7 files changed, 184 insertions(+) create mode 100644 frameworks/CSharp/simplew/.gitignore create mode 100644 frameworks/CSharp/simplew/Benchmarks/Benchmarks.csproj create mode 100644 frameworks/CSharp/simplew/Benchmarks/Program.cs create mode 100644 frameworks/CSharp/simplew/README.md create mode 100644 frameworks/CSharp/simplew/benchmark_config.json create mode 100644 frameworks/CSharp/simplew/config.toml create mode 100644 frameworks/CSharp/simplew/simplew.dockerfile diff --git a/frameworks/CSharp/simplew/.gitignore b/frameworks/CSharp/simplew/.gitignore new file mode 100644 index 00000000000..c8d1eed0116 --- /dev/null +++ b/frameworks/CSharp/simplew/.gitignore @@ -0,0 +1,38 @@ +[Oo]bj/ +[Bb]in/ +TestResults/ +.nuget/ +*.sln +*.sln.ide/ +_ReSharper.*/ +.idea/ +packages/ +artifacts/ +PublishProfiles/ +.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/simplew/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/simplew/Benchmarks/Benchmarks.csproj new file mode 100644 index 00000000000..2b894596a8e --- /dev/null +++ b/frameworks/CSharp/simplew/Benchmarks/Benchmarks.csproj @@ -0,0 +1,20 @@ + + + + Exe + net9.0 + enable + enable + SimpleW + + true + true + + linux-musl-x64 + + + + + + + diff --git a/frameworks/CSharp/simplew/Benchmarks/Program.cs b/frameworks/CSharp/simplew/Benchmarks/Program.cs new file mode 100644 index 00000000000..2c69f462d1f --- /dev/null +++ b/frameworks/CSharp/simplew/Benchmarks/Program.cs @@ -0,0 +1,48 @@ +using System; +using System.Buffers.Text; +using System.Net; +using System.Threading.Tasks; +using SimpleW; + +namespace Benchmarks; + +internal static class Program +{ + public static async Task Main(string[] args) + { + var server = new SimpleWServer(IPAddress.Any, 8080); + server.AddDynamicContent("/api"); + server.Start(); + + await Task.Delay(-1); + } + + public class BenchmarksController : Controller { + [Route("GET", "/json")] + public object Json() { + return Response.MakeResponse( + new { message = "Hello, World!" }, // object will be serialized + addHeaders: new Dictionary() + { + { "Server", "SimpleW" }, + { "Date", DateTime.Now.ToString("R") } + } + // compress parameter is default to null, so no compression + ); + } + + [Route("GET", "/plaintext")] + public object Plaintext() { + return Response.MakeResponse( + "Hello, World!", + "text/plain", + addHeaders: new Dictionary() + { + { "Server", "SimpleW" }, + { "Date", DateTime.Now.ToString("R") } + } + // compress parameter is default to null, so no compression + ); + } + } +} \ No newline at end of file diff --git a/frameworks/CSharp/simplew/README.md b/frameworks/CSharp/simplew/README.md new file mode 100644 index 00000000000..3d380883ca7 --- /dev/null +++ b/frameworks/CSharp/simplew/README.md @@ -0,0 +1,18 @@ +# SimpleW Tests on Linux + +See the [SimpleW website](https://stratdev3.github.io/SimpleW/) for more information. + +## Infrastructure Software Versions + +**Language** + +* C# 13.0 + +**Platforms** + +* .NET 8/9 + +## Paths & Source for Tests + +* [Plaintext](Benchmarks/Program.cs): "/api/plaintext" +* [JSON](Benchmarks/Tests/JsonResource.cs): "/api/json" \ No newline at end of file diff --git a/frameworks/CSharp/simplew/benchmark_config.json b/frameworks/CSharp/simplew/benchmark_config.json new file mode 100644 index 00000000000..e1396429d39 --- /dev/null +++ b/frameworks/CSharp/simplew/benchmark_config.json @@ -0,0 +1,22 @@ +{ + "framework": "simplew", + "tests": [{ + "default": { + "plaintext_url": "/api/plaintext", + "json_url": "/api/json", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "None", + "framework": "SimpleW", + "language": "C#", + "orm": "None", + "platform": ".NET", + "webserver": "Netcoreserver", + "os": "Linux", + "database_os": "Linux", + "display_name": "SimpleW", + "notes": "Only plaintext and JSON benchmarks implemented yet" + } + }] +} diff --git a/frameworks/CSharp/simplew/config.toml b/frameworks/CSharp/simplew/config.toml new file mode 100644 index 00000000000..e9d267af88a --- /dev/null +++ b/frameworks/CSharp/simplew/config.toml @@ -0,0 +1,14 @@ +[framework] +name = "simplew" + +[main] +urls.plaintext = "/api/plaintext" +urls.json = "/api/json" +approach = "Realistic" +classification = "Fullstack" +os = "Linux" +database_os = "Linux" +orm = "None" +platform = ".NET" +webserver = "Netcoreserver" +versus = "None" \ No newline at end of file diff --git a/frameworks/CSharp/simplew/simplew.dockerfile b/frameworks/CSharp/simplew/simplew.dockerfile new file mode 100644 index 00000000000..8c473477a61 --- /dev/null +++ b/frameworks/CSharp/simplew/simplew.dockerfile @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build +WORKDIR /source + +# copy csproj and restore as distinct layers +COPY Benchmarks/*.csproj . +RUN dotnet restore -r linux-musl-x64 + +# copy and publish app and libraries +COPY Benchmarks/ . +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained + +# final stage/image +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine + +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 + +WORKDIR /app +COPY --from=build /app . + +ENTRYPOINT ["./Benchmarks"] + +EXPOSE 8080 From 4a5dc97b823e4e5552ff96cba0489f327f1a3f94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 19:44:12 +0000 Subject: [PATCH 1718/1766] Build(deps): bump io.undertow:undertow-core Bumps [io.undertow:undertow-core](https://github.com/undertow-io/undertow) from 2.3.17.Final to 2.3.20.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.3.17.Final...2.3.20.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-version: 2.3.20.Final dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/undertow-jersey/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/undertow-jersey/pom.xml b/frameworks/Java/undertow-jersey/pom.xml index 3dcc90d2d81..84bdc08753d 100644 --- a/frameworks/Java/undertow-jersey/pom.xml +++ b/frameworks/Java/undertow-jersey/pom.xml @@ -174,7 +174,7 @@ io.undertow undertow-core - 2.3.17.Final + 2.3.20.Final From 8218168bcc4a9436519d90055ca2f88fac2b9894 Mon Sep 17 00:00:00 2001 From: Dmitry Olshansky Date: Mon, 3 Nov 2025 22:55:24 +0300 Subject: [PATCH 1719/1766] Photon http fortunes (#10239) * Add Fortunes endpoint * Forgot the template file * Minor fixes to pass the verification --- .../D/photon-http/benchmark_config.json | 1 + frameworks/D/photon-http/dub.json | 4 +- frameworks/D/photon-http/source/app.d | 78 +++++++++++++++---- frameworks/D/photon-http/template.mustache | 12 +++ 4 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 frameworks/D/photon-http/template.mustache diff --git a/frameworks/D/photon-http/benchmark_config.json b/frameworks/D/photon-http/benchmark_config.json index b097fd78ac6..48b08c89288 100755 --- a/frameworks/D/photon-http/benchmark_config.json +++ b/frameworks/D/photon-http/benchmark_config.json @@ -3,6 +3,7 @@ "tests": [ { "default": { + "fortune_url": "/fortunes", "update_url": "/updates?queries=", "query_url": "/queries?queries=", "db_url": "/db", diff --git a/frameworks/D/photon-http/dub.json b/frameworks/D/photon-http/dub.json index 9946823d368..57d3056cc04 100644 --- a/frameworks/D/photon-http/dub.json +++ b/frameworks/D/photon-http/dub.json @@ -9,8 +9,10 @@ "mir-ion": "~>2.3.4", "xbuf" : "~>0.2.1", "photon": "~>0.18.10", - "photon-http": "~>0.6.8" + "photon-http": "~>0.6.8", + "photon-mustache": "~>0.1.1" }, + "dflags": ["-J."], "description": "Benchmark of photon-http", "license": "BSL-1.0", "name": "photon-http-benchmark" diff --git a/frameworks/D/photon-http/source/app.d b/frameworks/D/photon-http/source/app.d index c419eacefd0..b21b1f145dd 100644 --- a/frameworks/D/photon-http/source/app.d +++ b/frameworks/D/photon-http/source/app.d @@ -4,6 +4,8 @@ import std.array; import std.algorithm; import std.conv; import std.ascii; +import core.stdc.stdlib; +import core.stdc.string; import mir.ser; import mir.ser.json; @@ -14,13 +16,14 @@ import std.range.primitives; import glow.xbuf; -import photon, photon.http; +import photon, photon.http, photon.mustache; import mir.random : unpredictableSeedOf; import mir.random.variable : UniformVariable; import mir.random.engine.xorshift : Xorshift; import dpq2; +import dpq2.conv.to_d_types; struct Message { string message; @@ -31,6 +34,11 @@ struct WorldResponse { int randomNumber; } +struct FortuneResponse { + int id; + string message; +} + enum connectionInfo = "host=tfb-database port=5432 " ~ "dbname=hello_world user=benchmarkdbuser password=benchmarkdbpass"; enum worldSize = 10000; @@ -41,7 +49,8 @@ shared Pool!Connection connectionPool; class BenchmarkProcessor : HttpProcessor { HttpHeader[] plainTextHeaders = [HttpHeader("Content-Type", "text/plain; charset=utf-8")]; HttpHeader[] jsonHeaders = [HttpHeader("Content-Type", "application/json")]; - Buffer!char jsonBuf; + HttpHeader[] htmlHeaders = [HttpHeader("Content-Type", "text/html; charset=utf-8")]; + Buffer!char outBuf; Buffer!WorldResponse worlds; UniformVariable!uint uniformVariable; Xorshift gen; @@ -50,7 +59,7 @@ class BenchmarkProcessor : HttpProcessor { super(sock); gen = Xorshift(unpredictableSeed!uint); uniformVariable = UniformVariable!uint(1, worldSize); - jsonBuf = Buffer!char(256); + outBuf = Buffer!char(256); worlds = Buffer!WorldResponse(500); } @@ -65,8 +74,9 @@ class BenchmarkProcessor : HttpProcessor { queries(req.uri); } else if(req.uri.startsWith("/updates")) { updates(req.uri); - } - else { + } else if(req.uri == "/fortunes") { + fortunes(); + } else { respondWith("Not found", HttpStatus.NotFound, plainTextHeaders); } } @@ -76,13 +86,13 @@ class BenchmarkProcessor : HttpProcessor { } final void json() { - jsonBuf.clear(); - serializeJsonPretty!""(jsonBuf, Message("Hello, World!")); - respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); + outBuf.clear(); + serializeJsonPretty!""(outBuf, Message("Hello, World!")); + respondWith(outBuf.data, HttpStatus.OK, jsonHeaders); } final void db() { - jsonBuf.clear(); + outBuf.clear(); int id = uniformVariable(gen); auto c = connectionPool.acquire(); scope(exit) connectionPool.release(c); @@ -91,13 +101,13 @@ class BenchmarkProcessor : HttpProcessor { qp.argsVariadic(id); immutable result = c.execPrepared(qp).rangify.front; auto w = WorldResponse(id, result[0].as!PGinteger); - serializeJsonPretty!""(jsonBuf, w); - respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); + serializeJsonPretty!""(outBuf, w); + respondWith(outBuf.data, HttpStatus.OK, jsonHeaders); } // GET /queries?queries=... final void queries(const(char)[] uri) { - jsonBuf.clear(); + outBuf.clear(); worlds.clear(); auto c = connectionPool.acquire(); scope(exit) connectionPool.release(c); @@ -118,13 +128,13 @@ class BenchmarkProcessor : HttpProcessor { immutable result = c.execPrepared(qp).rangify.front; worlds.put(WorldResponse(id, result[0].as!PGinteger)); } - serializeJsonPretty!""(jsonBuf, worlds.data); - respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); + serializeJsonPretty!""(outBuf, worlds.data); + respondWith(outBuf.data, HttpStatus.OK, jsonHeaders); } // GET /updates?queries=... final void updates(const(char)[] uri) { - jsonBuf.clear(); + outBuf.clear(); worlds.clear(); auto c = connectionPool.acquire(); scope(exit) connectionPool.release(c); @@ -157,11 +167,44 @@ class BenchmarkProcessor : HttpProcessor { c.execPrepared(qp_update); worlds.put(w); } - serializeJsonPretty!""(jsonBuf, worlds.data); - respondWith(jsonBuf.data, HttpStatus.OK, jsonHeaders); + serializeJsonPretty!""(outBuf, worlds.data); + respondWith(outBuf.data, HttpStatus.OK, jsonHeaders); + } + + final void fortunes() { + outBuf.clear(); + auto c = connectionPool.acquire(); + scope(exit) connectionPool.release(c); + import std.algorithm : map, sort; + + auto buf = Buffer!FortuneResponse(20); + QueryParams qp; + qp.preparedStatementName("fortune_prpq"); + auto result = c.execPrepared(qp).rangify; + foreach (ref f; result) { + buf.put(FortuneResponse(f[0].as!PGinteger, f[1].data.alloced)); + } + buf.put(FortuneResponse(0, "Additional fortune added at request time.")); + auto data = buf.data; + data.sort!((a, b) => a.message < b.message); + mustache!(import("template.mustache"))(data, outBuf); + foreach (ref v; data) { + if (v.id != 0) dealloc(v.message); + } + respondWith(outBuf.data, HttpStatus.OK, htmlHeaders); } } +string alloced(const(ubyte)[] data) { + void* ptr = malloc(data.length); + memcpy(ptr, data.ptr, data.length); + return (cast(immutable(char)*)ptr)[0..data.length]; +} + +void dealloc(const(char)[] slice) { + free(cast(void*)slice.ptr); +} + void server_worker(Socket client) { scope processor = new BenchmarkProcessor(client); try { @@ -201,6 +244,7 @@ void main() { initPhoton(); connectionPool = pool(poolSize, 15.seconds, () { auto c = new Connection(connectionInfo); + c.prepareEx("fortune_prpq", "SELECT id, message::text FROM Fortune"); c.prepareEx("db_prpq", "SELECT randomNumber, id FROM world WHERE id = $1"); c.prepareEx("db_update_prpq", "UPDATE world SET randomNumber = $1 WHERE id = $2"); return c; diff --git a/frameworks/D/photon-http/template.mustache b/frameworks/D/photon-http/template.mustache new file mode 100644 index 00000000000..eeff5ba4c11 --- /dev/null +++ b/frameworks/D/photon-http/template.mustache @@ -0,0 +1,12 @@ + + + Fortunes + + + + {{#.}} + + {{/.}} +
      idmessage
      {{id}}{{message}}
      + + From 2fefcb1e1dbc773a91033572b7cd7a493e9d648d Mon Sep 17 00:00:00 2001 From: Shyam <140629171+Shyam20001@users.noreply.github.com> Date: Tue, 4 Nov 2025 01:25:59 +0530 Subject: [PATCH 1720/1766] brahma-firelight added (#10232) --- .../TypeScript/brahma-firelight/.gitignore | 34 +++++++++++++++++ .../TypeScript/brahma-firelight/README.md | 25 +++++++++++++ .../brahma-firelight/benchmark_config.json | 21 +++++++++++ .../brahma-firelight.dockerfile | 13 +++++++ .../TypeScript/brahma-firelight/bun.lock | 34 +++++++++++++++++ .../TypeScript/brahma-firelight/config.toml | 15 ++++++++ .../TypeScript/brahma-firelight/package.json | 19 ++++++++++ .../TypeScript/brahma-firelight/src/main.ts | 37 +++++++++++++++++++ .../TypeScript/brahma-firelight/tsconfig.json | 29 +++++++++++++++ 9 files changed, 227 insertions(+) create mode 100644 frameworks/TypeScript/brahma-firelight/.gitignore create mode 100644 frameworks/TypeScript/brahma-firelight/README.md create mode 100644 frameworks/TypeScript/brahma-firelight/benchmark_config.json create mode 100644 frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile create mode 100644 frameworks/TypeScript/brahma-firelight/bun.lock create mode 100644 frameworks/TypeScript/brahma-firelight/config.toml create mode 100644 frameworks/TypeScript/brahma-firelight/package.json create mode 100644 frameworks/TypeScript/brahma-firelight/src/main.ts create mode 100644 frameworks/TypeScript/brahma-firelight/tsconfig.json diff --git a/frameworks/TypeScript/brahma-firelight/.gitignore b/frameworks/TypeScript/brahma-firelight/.gitignore new file mode 100644 index 00000000000..a14702c409d --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/.gitignore @@ -0,0 +1,34 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/frameworks/TypeScript/brahma-firelight/README.md b/frameworks/TypeScript/brahma-firelight/README.md new file mode 100644 index 00000000000..40053a4be24 --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/README.md @@ -0,0 +1,25 @@ + +# 🗿 Brahma-JS (brahma-firelight) + +Express-style framework ⚡ powered by Rust (Tokio + Hyper). +Plug-n-play for **Node.js**, **Deno**, and **Bun** — no setup, just install and harness the true power of RUST. + +--- + +### 🔗 Links +- Repo: [github.com/Shyam20001/rsjs](https://github.com/Shyam20001/rsjs) +- Site: [shyam20001.github.io/rsjs](https://shyam20001.github.io/rsjs) + +--- + +### ⚙️ Commands +```bash +bun install +bun run build +bun start +# Dev mode: +bun run dev +```` + +Runs on **0.0.0.0:8080** exposing `/plaintext` and `/json` endpoints. + diff --git a/frameworks/TypeScript/brahma-firelight/benchmark_config.json b/frameworks/TypeScript/brahma-firelight/benchmark_config.json new file mode 100644 index 00000000000..5ebbb896e7e --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/benchmark_config.json @@ -0,0 +1,21 @@ +{ + "framework": "brahma-firelight", + "tests": [{ + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "brahma-firelight", + "language": "TypeScript", + "flavor": "bun", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "brahma-firelight", + "versus": "nodejs" + } + }] +} diff --git a/frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile b/frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile new file mode 100644 index 00000000000..dd682eba23f --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile @@ -0,0 +1,13 @@ +FROM oven/bun:1.3 + +WORKDIR /app + +COPY . . + +RUN bun install + +RUN bun run build + +EXPOSE 8080 + +CMD ["bun", "dist/main.js"] diff --git a/frameworks/TypeScript/brahma-firelight/bun.lock b/frameworks/TypeScript/brahma-firelight/bun.lock new file mode 100644 index 00000000000..a24e46c51c5 --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/bun.lock @@ -0,0 +1,34 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "brahma-firelight", + "dependencies": { + "brahma-firelight": "1.5.16", + }, + "devDependencies": { + "@types/bun": "latest", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@types/bun": ["@types/bun@1.3.1", "", { "dependencies": { "bun-types": "1.3.1" } }, "sha512-4jNMk2/K9YJtfqwoAa28c8wK+T7nvJFOjxI4h/7sORWcypRNxBpr+TPNaCfVWq70tLCJsqoFwcf0oI0JU/fvMQ=="], + + "@types/node": ["@types/node@24.9.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA=="], + + "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], + + "brahma-firelight": ["brahma-firelight@1.5.16", "", {}, "sha512-KwqrG3EHBcEYiOjjx7UvZ4TDxnKTP+DPjnQQqblKuHQcS/mw35NzIYf01YnBZLRM/9VZrb5+UrDaNmrAPZGYlw=="], + + "bun-types": ["bun-types@1.3.1", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + } +} diff --git a/frameworks/TypeScript/brahma-firelight/config.toml b/frameworks/TypeScript/brahma-firelight/config.toml new file mode 100644 index 00000000000..c48a28eaa14 --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "brahma-firelight" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database_os = "Linux" +database = "None" +os = "Linux" +orm = "Raw" +platform = "bun" +webserver = "None" +versus = "nodejs" diff --git a/frameworks/TypeScript/brahma-firelight/package.json b/frameworks/TypeScript/brahma-firelight/package.json new file mode 100644 index 00000000000..dbe9f089100 --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/package.json @@ -0,0 +1,19 @@ +{ + "name": "brahma-firelight", + "type": "module", + "main": "src/index.ts", + "scripts": { + "dev": "bun --hot src/main.ts", + "build": "bun build src/main.ts --packages external --sourcemap --outdir dist --minify", + "start": "bun dist/main.js" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "brahma-firelight": "1.5.16" + } +} \ No newline at end of file diff --git a/frameworks/TypeScript/brahma-firelight/src/main.ts b/frameworks/TypeScript/brahma-firelight/src/main.ts new file mode 100644 index 00000000000..639d33f3085 --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/src/main.ts @@ -0,0 +1,37 @@ +import { createApp, type Response, type Request, type App, type NextFunction, type Handler } from "brahma-firelight"; + +const app: App = createApp(); + +// Server Config Middleware +const serverInfo: Handler = (_req: Request, res: Response, next?: NextFunction) => { + res.setHeader("Server", "brahma-firelight"); + next?.(); +}; + +// JSON compute +app.get("/json", serverInfo, (_req: Request, res: Response) => { + res.json({ message: "Hello, World!" }); +}); + +// PLAIN-TEXT +app.get("/plaintext", serverInfo, (_req: Request, res: Response) => { + res.text("Hello, World!"); +}); + +// Port & Host + +app.listen("0.0.0.0", 8080); + +// Enable built in Graceful Shutdown (optional for production use) + +process.on('SIGINT', async () => { + console.log('SIGINT → shutting down...'); + await app.close(2000); // wait up to 2s for requests + process.exit(0); +}); + +process.on('SIGTERM', async () => { + console.log('SIGTERM → shutting down...'); + await app.close(2000); + process.exit(0); +}); \ No newline at end of file diff --git a/frameworks/TypeScript/brahma-firelight/tsconfig.json b/frameworks/TypeScript/brahma-firelight/tsconfig.json new file mode 100644 index 00000000000..976e9d12d50 --- /dev/null +++ b/frameworks/TypeScript/brahma-firelight/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": [ + "ESNext" + ], + "forceConsistentCasingInFileNames": true, + "target": "ESNext", + "module": "es6", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} \ No newline at end of file From d5981af023c0e188ad1292c91f29011d5a4ea7a6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 3 Nov 2025 20:56:23 +0100 Subject: [PATCH 1721/1766] [ruby/rack] Remove Unicorn (#10228) Unicorn hasn't been updated for 4 years and seems unmaintained. It isn't the fastest on any of the benchmarks either. --- frameworks/Ruby/rack/Gemfile | 5 ----- frameworks/Ruby/rack/Gemfile.lock | 6 ------ frameworks/Ruby/rack/benchmark_config.json | 21 ------------------- frameworks/Ruby/rack/config/unicorn.rb | 11 ---------- frameworks/Ruby/rack/hello_world.rb | 10 +-------- frameworks/Ruby/rack/rack-unicorn.dockerfile | 22 -------------------- 6 files changed, 1 insertion(+), 74 deletions(-) delete mode 100644 frameworks/Ruby/rack/config/unicorn.rb delete mode 100644 frameworks/Ruby/rack/rack-unicorn.dockerfile diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index 7b63c17d3d6..091baa8d0e4 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -35,11 +35,6 @@ group :puma, optional: true do gem 'puma', '~> 7.1' end -group :unicorn, optional: true do - gem 'logger' # required by unicorn on Ruby 3.5 - gem 'unicorn', '~> 6.1', platforms: %i[ruby windows] -end - group :development, optional: true do gem 'rack-test' gem 'rubocop', platforms: %i[ruby windows] diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 806575b74d2..0322d2109ed 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -61,7 +61,6 @@ GEM io-stream (0.6.1) iodine (0.7.58) json (2.13.2) - kgio (2.11.4) language_server-protocol (3.17.0.4) lint_roller (1.1.0) localhost (1.3.1) @@ -104,7 +103,6 @@ GEM rackup (2.2.1) rack (>= 3) rainbow (3.1.1) - raindrops (0.20.1) rake (13.3.0) regexp_parser (2.10.0) rubocop (1.73.2) @@ -137,9 +135,6 @@ GEM unicode-display_width (3.1.4) unicode-emoji (~> 4.0, >= 4.0.4) unicode-emoji (4.0.4) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) PLATFORMS arm64-darwin-24 @@ -163,7 +158,6 @@ DEPENDENCIES sequel sequel_pg tzinfo-data (= 1.2023.3) - unicorn (~> 6.1) BUNDLED WITH 2.7.0 diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index bfae6aab9f1..dec94fec3a9 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -44,27 +44,6 @@ "display_name": "rack-iodine-mri-sequel-raw", "notes": "" }, - "unicorn": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Platform", - "orm": "raw", - "database": "Postgres", - "framework": "rack", - "language": "Ruby", - "platform": "Mri", - "webserver": "Unicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "rack-unicorn-mri-sequel-raw", - "notes": "" - }, "falcon": { "json_url": "/json", "plaintext_url": "/plaintext", diff --git a/frameworks/Ruby/rack/config/unicorn.rb b/frameworks/Ruby/rack/config/unicorn.rb deleted file mode 100644 index ecfc229e586..00000000000 --- a/frameworks/Ruby/rack/config/unicorn.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -require_relative 'auto_tune' -require 'sequel' -num_workers, = auto_tune - -worker_processes num_workers - -before_fork do |_server, _worker| - Sequel::DATABASES.each(&:disconnect) -end diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index c438d7b4c75..fdfbe679e00 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -101,15 +101,7 @@ def respond(content_type, body) ] end - if defined?(Unicorn) - def headers(content_type, body) - { - CONTENT_TYPE => content_type, - SERVER => SERVER_STRING, - CONTENT_LENGTH => body.bytesize.to_s - } - end - elsif defined?(Falcon) || defined?(Puma) + if defined?(Falcon) || defined?(Puma) def headers(content_type, _) { CONTENT_TYPE => content_type, diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile deleted file mode 100644 index 4b464a25ddf..00000000000 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM ruby:3.5-rc - -ENV RUBY_YJIT_ENABLE=1 - -# Use Jemalloc -RUN apt-get update && \ - apt-get install -y --no-install-recommends libjemalloc2 -ENV LD_PRELOAD=libjemalloc.so.2 - -WORKDIR /rack - -COPY Gemfile* ./ - -ENV BUNDLE_FORCE_RUBY_PLATFORM=true -RUN bundle config set with 'unicorn' -RUN bundle install --jobs=8 - -COPY . . - -EXPOSE 8080 - -CMD bundle exec unicorn -c config/unicorn.rb -o 0.0.0.0 -p 8080 -E production From 57608cd944833b2c3c181161824c69945959635d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Tue, 4 Nov 2025 03:57:19 +0800 Subject: [PATCH 1722/1766] update(touchsocket):version to 4.0.0-rc.15 (#10230) * update(touchsocket):version to 4.0.0-rc.2 * update(touchsocket):version to 4.0.0-rc.5 * optimize(touchsocket):scheduler * Performance (TouchSocketHttp, TouchSocketWebApi): Enable server garbage collection * update(touchsocket):version to 4.0.0-rc.15 --- .../touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj | 4 ++-- .../src/TouchSocketWebApi/TouchSocketWebApi.csproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index e550d0eedb6..74caaf7a658 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -11,8 +11,8 @@ - - + +
      diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index 0a0fbc559c3..1319cf14650 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -10,7 +10,7 @@ - - + +
      From b965c8bd06374e3d48c35bc041f4d03c9aaace4a Mon Sep 17 00:00:00 2001 From: AkazawaYun <62974697+AkazawaYun@users.noreply.github.com> Date: Tue, 4 Nov 2025 04:05:39 +0800 Subject: [PATCH 1723/1766] update version of akazawayun.pro (#10231) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add new test : CSharp/akazawayun.pro * modify config and code * add content-type * update url * update package version * add 3 new tests: db、queries、updates 1. add 3 new tests: db、queries、updates; 2. split code to multi files; * - * use generated sql instead const string. * update version * fix bug of db query * set port to 8080 * 升级 akazawayun.pro 框架版本到 14 * i forget to update the port change... * test self whether work fine.. * update nuget version * why pr failed... * 不小心多提交了别人的框架...改回 * akazawayun fix bug * remove db test there is some error in mysql * confirmed there is bug in mysql.data 9.5.0 还是用8080端口吧- -b, 都用8080, 改其他的对比测时不方便 * downgrade mysql.data back to 9.4.0 * fix bug of akazawayun.pro * update version of akazawayun.pro * update version * add platform test --- ...enchmarks.sln => AkazawaYun.Benchmark.sln} | 10 ++- .../akazawayun.pro-platform.dockerfile | 13 ++++ .../akazawayun.pro/akazawayun.pro.dockerfile | 4 +- .../akazawayun.pro/benchmark_config.json | 68 ++++++++++++------- .../AkazawaYun.Benchmark.Platform.csproj | 21 ++++++ .../AkazawaYun.Benchmark.Platform/Model.cs | 14 ++++ .../MyBenchmarkReceptor.cs | 55 +++++++++++++++ .../AkazawaYun.Benchmark.Platform/Program.cs | 37 ++++++++++ .../AkazawaYun.Benchmark.WebApi.csproj} | 2 +- .../Model.cs | 2 +- .../Mysql.cs | 2 +- .../Program.cs | 6 +- .../WorldService.cs | 2 +- 13 files changed, 200 insertions(+), 36 deletions(-) rename frameworks/CSharp/akazawayun.pro/{AkazawaYun.FrameworkBenchmarks.sln => AkazawaYun.Benchmark.sln} (58%) create mode 100644 frameworks/CSharp/akazawayun.pro/akazawayun.pro-platform.dockerfile create mode 100644 frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj create mode 100644 frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Model.cs create mode 100644 frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs create mode 100644 frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs rename frameworks/CSharp/akazawayun.pro/src/{AkazawaYun.FrameworkBenchmarks.csproj => AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj} (98%) rename frameworks/CSharp/akazawayun.pro/src/{ => AkazawaYun.Benchmark.WebApi}/Model.cs (90%) rename frameworks/CSharp/akazawayun.pro/src/{ => AkazawaYun.Benchmark.WebApi}/Mysql.cs (82%) rename frameworks/CSharp/akazawayun.pro/src/{ => AkazawaYun.Benchmark.WebApi}/Program.cs (92%) rename frameworks/CSharp/akazawayun.pro/src/{ => AkazawaYun.Benchmark.WebApi}/WorldService.cs (96%) diff --git a/frameworks/CSharp/akazawayun.pro/AkazawaYun.FrameworkBenchmarks.sln b/frameworks/CSharp/akazawayun.pro/AkazawaYun.Benchmark.sln similarity index 58% rename from frameworks/CSharp/akazawayun.pro/AkazawaYun.FrameworkBenchmarks.sln rename to frameworks/CSharp/akazawayun.pro/AkazawaYun.Benchmark.sln index e2c50c4d4fd..66c1850c7f3 100644 --- a/frameworks/CSharp/akazawayun.pro/AkazawaYun.FrameworkBenchmarks.sln +++ b/frameworks/CSharp/akazawayun.pro/AkazawaYun.Benchmark.sln @@ -1,9 +1,11 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.14.36310.24 d17.14 +VisualStudioVersion = 17.14.36310.24 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AkazawaYun.FrameworkBenchmarks", "src/AkazawaYun.FrameworkBenchmarks.csproj", "{BB5587FE-E4A0-851D-6025-F5FF0EC54525}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AkazawaYun.Benchmark.WebApi", "src\AkazawaYun.Benchmark.WebApi\AkazawaYun.Benchmark.WebApi.csproj", "{BB5587FE-E4A0-851D-6025-F5FF0EC54525}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AkazawaYun.Benchmark.Platform", "src\AkazawaYun.Benchmark.Platform\AkazawaYun.Benchmark.Platform.csproj", "{E7CA7DF7-F4AB-47EC-BF2B-1148058CDF43}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +17,10 @@ Global {BB5587FE-E4A0-851D-6025-F5FF0EC54525}.Debug|Any CPU.Build.0 = Debug|Any CPU {BB5587FE-E4A0-851D-6025-F5FF0EC54525}.Release|Any CPU.ActiveCfg = Release|Any CPU {BB5587FE-E4A0-851D-6025-F5FF0EC54525}.Release|Any CPU.Build.0 = Release|Any CPU + {E7CA7DF7-F4AB-47EC-BF2B-1148058CDF43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7CA7DF7-F4AB-47EC-BF2B-1148058CDF43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7CA7DF7-F4AB-47EC-BF2B-1148058CDF43}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7CA7DF7-F4AB-47EC-BF2B-1148058CDF43}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/frameworks/CSharp/akazawayun.pro/akazawayun.pro-platform.dockerfile b/frameworks/CSharp/akazawayun.pro/akazawayun.pro-platform.dockerfile new file mode 100644 index 00000000000..09f68ecd72d --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/akazawayun.pro-platform.dockerfile @@ -0,0 +1,13 @@ +# 生成 +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS publish +WORKDIR /app +COPY src/AkazawaYun.Benchmark.Platform . +RUN dotnet publish -c Release -o /app/publish + +# 运行 +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS runtime +WORKDIR /app +COPY --from=publish /app/publish . + +EXPOSE 8080 +ENTRYPOINT ["dotnet", "AkazawaYun.Benchmark.Platform.dll"] diff --git a/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile index 7ae1060903d..439e8de4959 100644 --- a/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile +++ b/frameworks/CSharp/akazawayun.pro/akazawayun.pro.dockerfile @@ -1,7 +1,7 @@ # 生成 FROM mcr.microsoft.com/dotnet/sdk:9.0 AS publish WORKDIR /app -COPY src . +COPY src/AkazawaYun.Benchmark.WebApi . RUN dotnet publish -c Release -o /app/publish # 运行 @@ -10,4 +10,4 @@ WORKDIR /app COPY --from=publish /app/publish . EXPOSE 8080 -ENTRYPOINT ["dotnet", "AkazawaYun.FrameworkBenchmarks.dll"] +ENTRYPOINT ["dotnet", "AkazawaYun.Benchmark.WebApi.dll"] diff --git a/frameworks/CSharp/akazawayun.pro/benchmark_config.json b/frameworks/CSharp/akazawayun.pro/benchmark_config.json index 8f067f8fee6..c9655a9f9c9 100644 --- a/frameworks/CSharp/akazawayun.pro/benchmark_config.json +++ b/frameworks/CSharp/akazawayun.pro/benchmark_config.json @@ -1,28 +1,44 @@ { - "framework": "akazawayun.pro", - "tests": [ - { - "default": { - "display_name": "akazawayun.pro", - "framework": "akazawayun.pro", - "webserver": "akazawayun.pro", - "plaintext_url": "/plaintext", - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "update_url": "/updates?queries=", - "port": 8080, - "classification": "Micro", - "approach": "Realistic", - "platform": ".NET", - "language": "C#", - "flavor": "CoreCLR", - "os": "Linux", - "database_os": "Linux", - "database": "MySQL", - "orm": "Micro", - "notes": "" - } - } - ] + "framework": "akazawayun.pro", + "tests": [ + { + "default": { + "display_name": "akazawayun.pro [webapi]", + "framework": "akazawayun.pro", + "webserver": "akazawayun.pro", + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "port": 8080, + "classification": "Micro", + "approach": "Realistic", + "platform": ".NET", + "language": "C#", + "flavor": "CoreCLR", + "os": "Linux", + "database_os": "Linux", + "database": "MySQL", + "orm": "Micro", + "notes": "" + }, + "platform": { + "display_name": "akazawayun.pro [platform]", + "framework": "akazawayun.pro", + "webserver": "akazawayun.pro", + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "classification": "Platform", + "approach": "Realistic", + "platform": ".NET", + "language": "C#", + "flavor": "CoreCLR", + "os": "Linux", + "database_os": "Linux", + "notes": "" + } + } + ] } diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj new file mode 100644 index 00000000000..64baee178a5 --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj @@ -0,0 +1,21 @@ + + + + Exe + net9.0 + enable + enable + true + false + + + + true + true + + + + + + + diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Model.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Model.cs new file mode 100644 index 00000000000..574123c3697 --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Model.cs @@ -0,0 +1,14 @@ +#pragma warning disable IDE1006,CS8981 +using System.Text.Json.Serialization; + +namespace AkazawaYun.Benchmark.Platform; + + +[JsonSerializable(typeof(JsonModel))] +public partial class AotJsonContext : JsonSerializerContext { } + + +public class JsonModel +{ + public string? message { get; set; } +} diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs new file mode 100644 index 00000000000..e6ed8e9c5b7 --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs @@ -0,0 +1,55 @@ +using AkazawaYun.PRO7; +using System.Text; + +namespace AkazawaYun.Benchmark.Platform; + +class MyBenchmarkReceptor : akzWebReceptorBenchmark +{ + readonly JsonModel JsonModel; + readonly ReadOnlyMemory JsonContentLength; + + + public MyBenchmarkReceptor() + { + JsonModel = new() + { + message = "Hello, World!" + }; + akzJson.Text2Json(JsonModel, out ReadOnlyMemory json); + JsonContentLength = Encoding.UTF8.GetBytes($"{json.Length}\r\n\r\n"); + } + + + public override ValueTask SendPlaintext(IHttpContext http) + { + return base.SendPlaintext(http); + } + public override async ValueTask SendJson(IHttpContext http) + { + await http.Slient.Send(DataJson_OnlyHeaderExceptContentLength); + await http.Slient.Send(JsonContentLength); + akzJson.Text2Json(JsonModel, out ReadOnlyMemory json); + await http.Slient.Send(json); + } + public override ValueTask SendDb(IHttpContext http) + { + throw new NotImplementedException(); + } + public override ValueTask SendQueries(IHttpContext http) + { + throw new NotImplementedException(); + } + public override ValueTask SendUpdates(IHttpContext http) + { + throw new NotImplementedException(); + } + public override ValueTask SendCachedQueries(IHttpContext http) + { + throw new NotImplementedException(); + } + public override ValueTask SendFortunes(IHttpContext http) + { + throw new NotImplementedException(); + } + +} diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs new file mode 100644 index 00000000000..44dd91c0a3a --- /dev/null +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs @@ -0,0 +1,37 @@ +using AkazawaYun.PRO7; + +namespace AkazawaYun.Benchmark.Platform; + +class Program +{ + static readonly akzWebBuilder builder; + const int port = 8080; + + static Program() + { + akzLog.War("AkazawaYun.PRO 压力测试特供版 ver2025.11.3, 只支持 /plaintext 和 /json"); + akzJson.Config(null, AotJsonContext.Default); + builder = akzWebBuilder.Shared.SetPort(port).SetDev(true) + .Add(() => null) + .Add(() => new MyBenchmarkReceptor()) + .Add(() => new(port) + { + LogLevel = 0 + }).Build(); + } + static async Task Main() + { + await builder.Launch(); + + akzLog.Inf("[API SELF-TEST]"); + string url = $"http://localhost:{port}/plaintext"; + akzLog.Inf(" REQ URL :" + url); + string res = await akzHttpClient.Shared.Get(url).FetchString(); + akzLog.Inf(" RES LEN :" + res.Length); + akzLog.Inf(" RES BODY:" + res); + akzLog.Inf("[OK, I WORK FINE]"); + + akzLog.Default = akzLog.Output.NoneButWar; + await Task.Delay(-1); + } +} diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj similarity index 98% rename from frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj rename to frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj index d3bbe1b17cc..469e112ef00 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.FrameworkBenchmarks.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj @@ -15,7 +15,7 @@ - + diff --git a/frameworks/CSharp/akazawayun.pro/src/Model.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Model.cs similarity index 90% rename from frameworks/CSharp/akazawayun.pro/src/Model.cs rename to frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Model.cs index 2fdf2c6d1f3..c191e3416d5 100644 --- a/frameworks/CSharp/akazawayun.pro/src/Model.cs +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Model.cs @@ -2,7 +2,7 @@ using AkazawaYun.AOT; using System.Text.Json.Serialization; -namespace AkazawaYun.FrameworkBenchmarks; +namespace AkazawaYun.Benchmark.WebApi; [JsonSerializable(typeof(JsonModel))] diff --git a/frameworks/CSharp/akazawayun.pro/src/Mysql.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Mysql.cs similarity index 82% rename from frameworks/CSharp/akazawayun.pro/src/Mysql.cs rename to frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Mysql.cs index 8c056b15baa..049af6e21f3 100644 --- a/frameworks/CSharp/akazawayun.pro/src/Mysql.cs +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Mysql.cs @@ -2,7 +2,7 @@ using MySql.Data.MySqlClient; using System.Data.Common; -namespace AkazawaYun.FrameworkBenchmarks; +namespace AkazawaYun.Benchmark.WebApi; class Mysql : akzDbFactory { diff --git a/frameworks/CSharp/akazawayun.pro/src/Program.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Program.cs similarity index 92% rename from frameworks/CSharp/akazawayun.pro/src/Program.cs rename to frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Program.cs index bd4ffe628bc..ab7234e6f72 100644 --- a/frameworks/CSharp/akazawayun.pro/src/Program.cs +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/Program.cs @@ -3,7 +3,7 @@ using AkazawaYun.AOT; using AkazawaYun.PRO7; -namespace AkazawaYun.FrameworkBenchmarks; +namespace AkazawaYun.Benchmark.WebApi; class Program : IPostFunctionWrapper { @@ -14,8 +14,10 @@ class Program : IPostFunctionWrapper static Program() { akzJson.Config(null, AotJsonContext.Default); - builder = akzWebBuilder.Shared.SetPort(port) + builder = akzWebBuilder.Shared.SetPort(port).SetDev() + .Add(() => null) .Build() + .Config(lis => lis.LogLevel = 0) .Config(itc => { itc.ClearInterceptor(); diff --git a/frameworks/CSharp/akazawayun.pro/src/WorldService.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/WorldService.cs similarity index 96% rename from frameworks/CSharp/akazawayun.pro/src/WorldService.cs rename to frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/WorldService.cs index 1ef7f17e8a4..8f996368ac5 100644 --- a/frameworks/CSharp/akazawayun.pro/src/WorldService.cs +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/WorldService.cs @@ -1,6 +1,6 @@ using AkazawaYun.PRO7; -namespace AkazawaYun.FrameworkBenchmarks; +namespace AkazawaYun.Benchmark.WebApi; class WorldService { From a599716b0e74fa8ef154fefbaaa543419bdacda5 Mon Sep 17 00:00:00 2001 From: AkazawaYun <62974697+AkazawaYun@users.noreply.github.com> Date: Fri, 7 Nov 2025 04:52:30 +0800 Subject: [PATCH 1724/1766] update version to fix websocket bug (#10243) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add new test : CSharp/akazawayun.pro * modify config and code * add content-type * update url * update package version * add 3 new tests: db、queries、updates 1. add 3 new tests: db、queries、updates; 2. split code to multi files; * - * use generated sql instead const string. * update version * fix bug of db query * set port to 8080 * 升级 akazawayun.pro 框架版本到 14 * i forget to update the port change... * test self whether work fine.. * update nuget version * why pr failed... * 不小心多提交了别人的框架...改回 * akazawayun fix bug * remove db test there is some error in mysql * confirmed there is bug in mysql.data 9.5.0 还是用8080端口吧- -b, 都用8080, 改其他的对比测时不方便 * downgrade mysql.data back to 9.4.0 * fix bug of akazawayun.pro * update version of akazawayun.pro * update version * add platform test * update nupkg version --- .../AkazawaYun.Benchmark.Platform.csproj | 2 +- .../AkazawaYun.Benchmark.Platform/Program.cs | 18 ++++++++---------- .../AkazawaYun.Benchmark.WebApi.csproj | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj index 64baee178a5..f59eaf8f615 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj @@ -15,7 +15,7 @@ - + diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs index 44dd91c0a3a..269c16f48be 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs @@ -9,27 +9,25 @@ class Program static Program() { - akzLog.War("AkazawaYun.PRO 压力测试特供版 ver2025.11.3, 只支持 /plaintext 和 /json"); + akzLog.War("AkazawaYun.PRO 平台压力测试特供版 ver2025.11.3, 只支持 /plaintext 和 /json"); akzJson.Config(null, AotJsonContext.Default); builder = akzWebBuilder.Shared.SetPort(port).SetDev(true) .Add(() => null) .Add(() => new MyBenchmarkReceptor()) - .Add(() => new(port) - { - LogLevel = 0 - }).Build(); + .Add(() => new(port)) + .Build(); } static async Task Main() { await builder.Launch(); - akzLog.Inf("[API SELF-TEST]"); + Console.WriteLine("[API SELF-TEST]"); string url = $"http://localhost:{port}/plaintext"; - akzLog.Inf(" REQ URL :" + url); + Console.WriteLine(" REQ URL :" + url); string res = await akzHttpClient.Shared.Get(url).FetchString(); - akzLog.Inf(" RES LEN :" + res.Length); - akzLog.Inf(" RES BODY:" + res); - akzLog.Inf("[OK, I WORK FINE]"); + Console.WriteLine(" RES LEN :" + res.Length); + Console.WriteLine(" RES BODY:" + res); + Console.WriteLine("[OK, I WORK FINE]"); akzLog.Default = akzLog.Output.NoneButWar; await Task.Delay(-1); diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj index 469e112ef00..547064216f4 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj @@ -15,7 +15,7 @@ - + From 2ccf30277a6824966e0ce2902743d92b033a391d Mon Sep 17 00:00:00 2001 From: Edgar Espina Date: Thu, 6 Nov 2025 15:52:52 -0500 Subject: [PATCH 1725/1766] jooby: 4.0.11 (#10244) - fix classpath issue on jetty/undertow tests --- frameworks/Java/jooby/jooby-jetty.dockerfile | 2 +- frameworks/Java/jooby/jooby-mvc.dockerfile | 2 +- frameworks/Java/jooby/jooby-netty.dockerfile | 2 +- frameworks/Java/jooby/jooby-pgclient.dockerfile | 2 +- frameworks/Java/jooby/jooby.dockerfile | 2 +- frameworks/Java/jooby/pom.xml | 6 +++--- .../Java/jooby/src/main/java/com/techempower/App.java | 1 - .../jooby/src/main/java/com/techempower/ReactivePg.java | 3 +-- .../Java/jooby/src/main/java/com/techempower/Util.java | 2 +- frameworks/Kotlin/kooby/kooby.dockerfile | 2 +- frameworks/Kotlin/kooby/pom.xml | 6 +++--- 11 files changed, 14 insertions(+), 16 deletions(-) diff --git a/frameworks/Java/jooby/jooby-jetty.dockerfile b/frameworks/Java/jooby/jooby-jetty.dockerfile index 0c3c605cc1b..fb23bc745c4 100644 --- a/frameworks/Java/jooby/jooby-jetty.dockerfile +++ b/frameworks/Java/jooby/jooby-jetty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-24-noble as maven +FROM maven:3.9.11-eclipse-temurin-25-noble as maven 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 ec8150d3fae..e88198b64bd 100644 --- a/frameworks/Java/jooby/jooby-mvc.dockerfile +++ b/frameworks/Java/jooby/jooby-mvc.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-24-noble as maven +FROM maven:3.9.11-eclipse-temurin-25-noble as maven 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 daf8bed238c..cee8fa0aef4 100644 --- a/frameworks/Java/jooby/jooby-netty.dockerfile +++ b/frameworks/Java/jooby/jooby-netty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-24-noble as maven +FROM maven:3.9.11-eclipse-temurin-25-noble as maven 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 e5917ae2af5..e4ddf09382f 100644 --- a/frameworks/Java/jooby/jooby-pgclient.dockerfile +++ b/frameworks/Java/jooby/jooby-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-24-noble as maven +FROM maven:3.9.11-eclipse-temurin-25-noble as maven 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 4685ba51c95..3170040c2de 100644 --- a/frameworks/Java/jooby/jooby.dockerfile +++ b/frameworks/Java/jooby/jooby.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-24-noble as maven +FROM maven:3.9.11-eclipse-temurin-25-noble as maven 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 1c86733ddc9..eef2366bd98 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,12 +11,12 @@ jooby - 4.0.9 + 4.0.11 2.0.2 42.7.7 UTF-8 - 24 - 24 + 25 + 25 com.techempower.App diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/App.java b/frameworks/Java/jooby/src/main/java/com/techempower/App.java index fbc4bdb8164..0c11074d79f 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/App.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/App.java @@ -5,7 +5,6 @@ import static io.jooby.ExecutionMode.EVENT_LOOP; import static io.jooby.MediaType.JSON; -import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java index 385c7180539..9123447f1a2 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java @@ -110,10 +110,9 @@ public class ReactivePg extends Jooby { private void selectWorlds(Context ctx, int queries, Consumer> consumer) { sqlClient.group( client -> { - var statement = client.preparedQuery(SELECT_WORLD); List worlds = new ArrayList<>(queries); for (int i = 0; i < queries; i++) { - statement + client.preparedQuery(SELECT_WORLD) .execute(Tuple.of(Util.boxedRandomWorld())) .map(rs -> new World(rs.iterator().next().getInteger(0), Util.boxedRandomWorld())) .onComplete( diff --git a/frameworks/Java/jooby/src/main/java/com/techempower/Util.java b/frameworks/Java/jooby/src/main/java/com/techempower/Util.java index fd2f14c86ca..e54ae1074a6 100644 --- a/frameworks/Java/jooby/src/main/java/com/techempower/Util.java +++ b/frameworks/Java/jooby/src/main/java/com/techempower/Util.java @@ -24,7 +24,7 @@ public static int randomWorld() { return 1 + ThreadLocalRandom.current().nextInt(10000); } - public static int boxedRandomWorld() { + public static Integer boxedRandomWorld() { final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); return BOXED_RND[rndValue - 1]; } diff --git a/frameworks/Kotlin/kooby/kooby.dockerfile b/frameworks/Kotlin/kooby/kooby.dockerfile index b689c6e7348..d337708c0df 100644 --- a/frameworks/Kotlin/kooby/kooby.dockerfile +++ b/frameworks/Kotlin/kooby/kooby.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.9-eclipse-temurin-24-noble as maven +FROM maven:3.9.11-eclipse-temurin-25-noble as maven WORKDIR /kooby COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Kotlin/kooby/pom.xml b/frameworks/Kotlin/kooby/pom.xml index a27aaaa2a03..3255a6f63a5 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -12,11 +12,11 @@ kooby: jooby+kotlin - 4.0.9 + 4.0.11 42.7.7 UTF-8 - 24 - 24 + 25 + 25 2.2.0 From 0a405afedc01a25b33e20b4472abd2e15f2cad7b Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Thu, 6 Nov 2025 22:54:17 +0200 Subject: [PATCH 1726/1766] Replace openjdk:25-jdk-slim with amazoncorretto:25 (#10245) openjdk images have been deprecated and 25-jdk-slim image was removed Did not upgrade reitit-async due to failing run --- frameworks/Clojure/aleph/aleph.dockerfile | 2 +- frameworks/Clojure/donkey/donkey.dockerfile | 2 +- frameworks/Clojure/kit/kit-majavat.dockerfile | 2 +- frameworks/Clojure/kit/kit.dockerfile | 2 +- frameworks/Clojure/luminus/luminus.dockerfile | 2 +- .../ring-http-exchange/ring-http-exchange-robaho.dockerfile | 2 +- .../Clojure/ring-http-exchange/ring-http-exchange.dockerfile | 2 +- frameworks/Java/httpserver/httpserver-postgres.dockerfile | 2 +- .../Java/httpserver/httpserver-robaho-postgres.dockerfile | 2 +- frameworks/Java/httpserver/httpserver-robaho.dockerfile | 2 +- frameworks/Java/httpserver/httpserver.dockerfile | 2 +- frameworks/Java/jetty/jetty-servlet.dockerfile | 2 +- frameworks/Java/jetty/jetty.dockerfile | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Clojure/aleph/aleph.dockerfile b/frameworks/Clojure/aleph/aleph.dockerfile index e8268bd6b15..7f5e9642a2c 100644 --- a/frameworks/Clojure/aleph/aleph.dockerfile +++ b/frameworks/Clojure/aleph/aleph.dockerfile @@ -4,7 +4,7 @@ COPY src src COPY project.clj project.clj RUN lein uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /aleph COPY --from=lein /aleph/target/hello-aleph-standalone.jar app.jar diff --git a/frameworks/Clojure/donkey/donkey.dockerfile b/frameworks/Clojure/donkey/donkey.dockerfile index cd7e6d18e57..5afe93e10c3 100644 --- a/frameworks/Clojure/donkey/donkey.dockerfile +++ b/frameworks/Clojure/donkey/donkey.dockerfile @@ -4,7 +4,7 @@ COPY src src COPY project.clj project.clj RUN lein uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 COPY --from=lein /donkey/target/hello-donkey-standalone.jar app.jar EXPOSE 8080 diff --git a/frameworks/Clojure/kit/kit-majavat.dockerfile b/frameworks/Clojure/kit/kit-majavat.dockerfile index fbea7e95bd4..c4b1990a3f8 100644 --- a/frameworks/Clojure/kit/kit-majavat.dockerfile +++ b/frameworks/Clojure/kit/kit-majavat.dockerfile @@ -6,7 +6,7 @@ COPY . / RUN clj -Sforce -T:build all -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 COPY --from=build /target/te-bench-standalone.jar /te-bench/te-bench-standalone.jar diff --git a/frameworks/Clojure/kit/kit.dockerfile b/frameworks/Clojure/kit/kit.dockerfile index fbea7e95bd4..c4b1990a3f8 100644 --- a/frameworks/Clojure/kit/kit.dockerfile +++ b/frameworks/Clojure/kit/kit.dockerfile @@ -6,7 +6,7 @@ COPY . / RUN clj -Sforce -T:build all -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 COPY --from=build /target/te-bench-standalone.jar /te-bench/te-bench-standalone.jar diff --git a/frameworks/Clojure/luminus/luminus.dockerfile b/frameworks/Clojure/luminus/luminus.dockerfile index b5aa5430694..9ea8a1607ac 100644 --- a/frameworks/Clojure/luminus/luminus.dockerfile +++ b/frameworks/Clojure/luminus/luminus.dockerfile @@ -6,7 +6,7 @@ COPY resources resources COPY src src RUN lein uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /luminus COPY --from=lein /luminus/target/hello.jar app.jar diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile index e31848de2e6..b53eb194c09 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho.dockerfile @@ -5,7 +5,7 @@ COPY resources resources COPY src src RUN lein with-profile robaho uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /ring-http-exchange COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile index b558aa938cf..0910a6d9850 100644 --- a/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange.dockerfile @@ -5,7 +5,7 @@ COPY resources resources COPY src src RUN lein uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /ring-http-exchange COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar diff --git a/frameworks/Java/httpserver/httpserver-postgres.dockerfile b/frameworks/Java/httpserver/httpserver-postgres.dockerfile index 4cb88012254..5991ae20026 100644 --- a/frameworks/Java/httpserver/httpserver-postgres.dockerfile +++ b/frameworks/Java/httpserver/httpserver-postgres.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /httpserver COPY --from=maven /httpserver/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile b/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile index 7e204f66f52..e7bdfb11102 100644 --- a/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile +++ b/frameworks/Java/httpserver/httpserver-robaho-postgres.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn compile -P robaho assembly:single -q -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /httpserver-robaho COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver/httpserver-robaho.dockerfile b/frameworks/Java/httpserver/httpserver-robaho.dockerfile index 1d09e486ef1..77f57658d2a 100644 --- a/frameworks/Java/httpserver/httpserver-robaho.dockerfile +++ b/frameworks/Java/httpserver/httpserver-robaho.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn compile -P robaho assembly:single -q -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /httpserver-robaho COPY --from=maven /httpserver-robaho/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/httpserver/httpserver.dockerfile b/frameworks/Java/httpserver/httpserver.dockerfile index 01aaecc935c..b50fbadc157 100644 --- a/frameworks/Java/httpserver/httpserver.dockerfile +++ b/frameworks/Java/httpserver/httpserver.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /httpserver COPY --from=maven /httpserver/target/httpserver-1.0-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/jetty/jetty-servlet.dockerfile b/frameworks/Java/jetty/jetty-servlet.dockerfile index a352022e489..aafe6afc370 100644 --- a/frameworks/Java/jetty/jetty-servlet.dockerfile +++ b/frameworks/Java/jetty/jetty-servlet.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -P servlet -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /jetty COPY --from=maven /jetty/target/jetty-example-0.1-jar-with-dependencies.jar app.jar diff --git a/frameworks/Java/jetty/jetty.dockerfile b/frameworks/Java/jetty/jetty.dockerfile index 15c208ef4e8..996ee1627be 100644 --- a/frameworks/Java/jetty/jetty.dockerfile +++ b/frameworks/Java/jetty/jetty.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /jetty COPY --from=maven /jetty/target/jetty-example-0.1-jar-with-dependencies.jar app.jar From ab77d497ffff8241cce78007a7ec440afe5a4de0 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 6 Nov 2025 21:54:35 +0100 Subject: [PATCH 1727/1766] [ruby] Improve display names (#10246) Use square brackers for test variants names. --- frameworks/Ruby/agoo/benchmark_config.json | 2 +- frameworks/Ruby/grape/benchmark_config.json | 4 ++-- frameworks/Ruby/padrino/benchmark_config.json | 4 ++-- frameworks/Ruby/rack-sequel/benchmark_config.json | 4 ++-- frameworks/Ruby/rack/benchmark_config.json | 12 ++++++------ frameworks/Ruby/rails/benchmark_config.json | 10 +++++----- frameworks/Ruby/roda-sequel/benchmark_config.json | 6 +++--- frameworks/Ruby/sinatra-sequel/benchmark_config.json | 6 +++--- frameworks/Ruby/sinatra/benchmark_config.json | 6 +++--- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/frameworks/Ruby/agoo/benchmark_config.json b/frameworks/Ruby/agoo/benchmark_config.json index a4042facee3..29c8106d1e2 100644 --- a/frameworks/Ruby/agoo/benchmark_config.json +++ b/frameworks/Ruby/agoo/benchmark_config.json @@ -19,7 +19,7 @@ "webserver": "Agoo", "os": "Linux", "database_os": "Linux", - "display_name": "rack-agoo-mri", + "display_name": "rack [agoo]", "notes": "" } }] diff --git a/frameworks/Ruby/grape/benchmark_config.json b/frameworks/Ruby/grape/benchmark_config.json index f0afa34bc72..70e233c3cf6 100644 --- a/frameworks/Ruby/grape/benchmark_config.json +++ b/frameworks/Ruby/grape/benchmark_config.json @@ -18,7 +18,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "grape-puma-mri", + "display_name": "grape [puma]", "notes": "", "versus": "rack-puma-mri" }, @@ -39,7 +39,7 @@ "webserver": "Unicorn", "os": "Linux", "database_os": "Linux", - "display_name": "grape-unicorn-mri", + "display_name": "grape [unicorn]", "notes": "", "versus": "rack-unicorn-mri" } diff --git a/frameworks/Ruby/padrino/benchmark_config.json b/frameworks/Ruby/padrino/benchmark_config.json index 2fa32a70b47..1b467408cc2 100644 --- a/frameworks/Ruby/padrino/benchmark_config.json +++ b/frameworks/Ruby/padrino/benchmark_config.json @@ -19,7 +19,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "padrino-puma-mri", + "display_name": "padrino [puma]", "notes": "", "versus": "rack-puma-mri" }, @@ -41,7 +41,7 @@ "webserver": "Unicorn", "os": "Linux", "database_os": "Linux", - "display_name": "padrino-unicorn", + "display_name": "padrino [unicorn]", "notes": "", "versus": "rack-unicorn" } diff --git a/frameworks/Ruby/rack-sequel/benchmark_config.json b/frameworks/Ruby/rack-sequel/benchmark_config.json index 8c81927c69f..15763639c4c 100644 --- a/frameworks/Ruby/rack-sequel/benchmark_config.json +++ b/frameworks/Ruby/rack-sequel/benchmark_config.json @@ -18,7 +18,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "rack-sequel-puma-mri", + "display_name": "rack-sequel [puma, mysql]", "versus": "rack-puma-mri", "notes": "" }, @@ -38,7 +38,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "rack-sequel-postgres-puma-mri", + "display_name": "rack-sequel [puma, postgres]", "versus": null, "notes": "" } diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index dec94fec3a9..326c20b4f40 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -20,7 +20,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "rack-puma-mri-sequel-raw", + "display_name": "rack [puma]", "notes": "" }, "iodine": { @@ -41,7 +41,7 @@ "webserver": "Iodine", "os": "Linux", "database_os": "Linux", - "display_name": "rack-iodine-mri-sequel-raw", + "display_name": "rack [iodine]", "notes": "" }, "falcon": { @@ -62,7 +62,7 @@ "webserver": "Falcon", "os": "Linux", "database_os": "Linux", - "display_name": "rack-falcon-mri-sequel-raw", + "display_name": "rack [falcon]", "notes": "" }, "jruby": { @@ -83,7 +83,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "rack-puma-jruby-sequel-raw", + "display_name": "rack [jruby, puma]", "notes": "" }, "passenger": { @@ -104,7 +104,7 @@ "webserver": "Passenger", "os": "Linux", "database_os": "Linux", - "display_name": "rack-passenger-mri-sequel-raw", + "display_name": "rack [passenger]", "notes": "" }, "pitchfork": { @@ -125,7 +125,7 @@ "webserver": "Pitchfork", "os": "Linux", "database_os": "Linux", - "display_name": "rack-pitchfork-mri-sequel-raw", + "display_name": "rack [pitchfork]", "notes": "" } } diff --git a/frameworks/Ruby/rails/benchmark_config.json b/frameworks/Ruby/rails/benchmark_config.json index 232a4321e56..5f86a525145 100644 --- a/frameworks/Ruby/rails/benchmark_config.json +++ b/frameworks/Ruby/rails/benchmark_config.json @@ -20,7 +20,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "rails-postgresql", + "display_name": "rails [puma, postgres]", "notes": "", "versus": "" }, @@ -41,7 +41,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "rails-mysql", + "display_name": "rails [puma, mysql]", "notes": "", "versus": "rack-puma-mri" }, @@ -64,7 +64,7 @@ "webserver": "Falcon", "os": "Linux", "database_os": "Linux", - "display_name": "rails-falcon", + "display_name": "rails [falcon]", "notes": "", "versus": "rack-falcon-mri-sequel-raw" }, @@ -87,7 +87,7 @@ "webserver": "Iodine", "os": "Linux", "database_os": "Linux", - "display_name": "rails-iodine", + "display_name": "rails [iodine]", "notes": "", "versus": "rack-iodine-mri-sequel-raw" }, @@ -110,7 +110,7 @@ "webserver": "Pitchfork", "os": "Linux", "database_os": "Linux", - "display_name": "rails-pitchfork", + "display_name": "rails [pitchfork]", "notes": "", "versus": "rack-pitchfork-mri-sequel-raw" } diff --git a/frameworks/Ruby/roda-sequel/benchmark_config.json b/frameworks/Ruby/roda-sequel/benchmark_config.json index f51112ed0f9..c028cc7008c 100644 --- a/frameworks/Ruby/roda-sequel/benchmark_config.json +++ b/frameworks/Ruby/roda-sequel/benchmark_config.json @@ -20,7 +20,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "roda-sequel-puma-mri", + "display_name": "roda-sequel [puma, mysql]", "versus": "rack-sequel-puma-mri", "notes": "" }, @@ -40,7 +40,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "roda-sequel-postgres-puma-mri", + "display_name": "roda-sequel [puma, postgres]", "versus": "rack-sequel-postgres-puma-mri", "notes": "" }, @@ -62,7 +62,7 @@ "webserver": "Iodine", "os": "Linux", "database_os": "Linux", - "display_name": "roda-sequel-postgres-iodine-mri", + "display_name": "roda-sequel [iodine, postgres]", "versus": "rack-sequel-postgres-iodine-mri", "notes": "" } diff --git a/frameworks/Ruby/sinatra-sequel/benchmark_config.json b/frameworks/Ruby/sinatra-sequel/benchmark_config.json index 8b09aafbd54..008e63a8148 100644 --- a/frameworks/Ruby/sinatra-sequel/benchmark_config.json +++ b/frameworks/Ruby/sinatra-sequel/benchmark_config.json @@ -18,7 +18,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "sinatra-sequel-puma-mri", + "display_name": "sinatra-sequel [puma, mysql]", "versus": "rack-sequel-puma-mri", "notes": "" }, @@ -38,7 +38,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "sinatra-sequel-postgres-puma-mri", + "display_name": "sinatra-sequel [puma, postgres]", "versus": "rack-sequel-postgres-puma-mri", "notes": "" }, @@ -58,7 +58,7 @@ "webserver": "Iodine", "os": "Linux", "database_os": "Linux", - "display_name": "sinatra-sequel-postgres-iodine-mri", + "display_name": "sinatra-sequel [iodine, postgres]", "versus": "rack-sequel-postgres-iodine-mri", "notes": "" } diff --git a/frameworks/Ruby/sinatra/benchmark_config.json b/frameworks/Ruby/sinatra/benchmark_config.json index 0d14929dd67..7bdbb62e853 100644 --- a/frameworks/Ruby/sinatra/benchmark_config.json +++ b/frameworks/Ruby/sinatra/benchmark_config.json @@ -20,7 +20,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "sinatra-puma-mri", + "display_name": "sinatra [puma, mysql]", "versus": "rack-puma-mri", "notes": "" }, @@ -40,7 +40,7 @@ "webserver": "Puma", "os": "Linux", "database_os": "Linux", - "display_name": "sinatra-postgres-puma-mri", + "display_name": "sinatra [puma, postgres]", "versus": "rack-postgres-puma-mri", "notes": "" }, @@ -62,7 +62,7 @@ "webserver": "Iodine", "os": "Linux", "database_os": "Linux", - "display_name": "sinatra-postgres-iodine-mri", + "display_name": "sinatra [iodine, postgres]", "versus": "rack-postgres-iodine-mri", "notes": "" } From d62d2941db9b663732ab9bb82ff0fdd631730445 Mon Sep 17 00:00:00 2001 From: Diogo Martins <165835485+MDA2AV@users.noreply.github.com> Date: Thu, 6 Nov 2025 20:55:10 +0000 Subject: [PATCH 1728/1766] Add Unhinged adapter with genhttp (#10247) * Add Unhinged adapter with genhttp * Update Unhinged to 9.0.5 * Update dependencies, unhinged to micro, added http parsing and routing --- frameworks/CSharp/wiredio/UnhGHttp/Program.cs | 40 +++++++++++++++++++ .../CSharp/wiredio/UnhGHttp/UnhGHttp.csproj | 23 +++++++++++ .../CSharp/wiredio/benchmark_config.json | 25 ++++++++++-- frameworks/CSharp/wiredio/config.toml | 16 +++++++- .../wiredio/src/Platform/Platform.csproj | 2 +- .../CSharp/wiredio/src/Platform/Program.cs | 11 +++-- .../CSharp/wiredio/wiredio-gen.dockerfile | 24 +++++++++++ ...-plt.dockerfile => wiredio-mcr.dockerfile} | 0 8 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 frameworks/CSharp/wiredio/UnhGHttp/Program.cs create mode 100644 frameworks/CSharp/wiredio/UnhGHttp/UnhGHttp.csproj create mode 100644 frameworks/CSharp/wiredio/wiredio-gen.dockerfile rename frameworks/CSharp/wiredio/{wiredio-plt.dockerfile => wiredio-mcr.dockerfile} (100%) diff --git a/frameworks/CSharp/wiredio/UnhGHttp/Program.cs b/frameworks/CSharp/wiredio/UnhGHttp/Program.cs new file mode 100644 index 00000000000..82acdd926d6 --- /dev/null +++ b/frameworks/CSharp/wiredio/UnhGHttp/Program.cs @@ -0,0 +1,40 @@ +using System.Text.Json; +using GenHTTP.Api.Protocol; +using GenHTTP.Modules.IO; +using GenHTTP.Modules.Layouting; +using GenHTTP.Modules.Layouting.Provider; +using Unhinged; +using Unhinged.GenHttp.Experimental; + +internal class Program +{ + public static void Main(string[] args) + { + var builder = UnhingedEngine + .CreateBuilder() + .SetNWorkersSolver(() => Environment.ProcessorCount / 2) + .SetBacklog(16384) + .SetMaxEventsPerWake(512) + .SetMaxNumberConnectionsPerWorker(512) + .SetPort(8080) + .SetSlabSizes(32 * 1024, 16 * 1024) + .Map(CreateLayoutBuilder()); + + var engine = builder.Build(); + engine.Run(); + } + + private static LayoutBuilder CreateLayoutBuilder() => + Layout + .Create() + .Add("/plaintext", Content.From(Resource.FromString("Hello, World!"))) + + .Add("/json", Content.From( + Resource.FromString(JsonSerializer.Serialize(new JsonMessage { message = "Hello, World!" })) + .Type(new FlexibleContentType("application/json")))); +} + +public class JsonMessage +{ + public string message { get; set; } +} \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/UnhGHttp/UnhGHttp.csproj b/frameworks/CSharp/wiredio/UnhGHttp/UnhGHttp.csproj new file mode 100644 index 00000000000..09308ff4747 --- /dev/null +++ b/frameworks/CSharp/wiredio/UnhGHttp/UnhGHttp.csproj @@ -0,0 +1,23 @@ + + + + Exe + net9.0 + enable + enable + + true + true + true + true + + linux-musl-x64 + + + + + + + + + diff --git a/frameworks/CSharp/wiredio/benchmark_config.json b/frameworks/CSharp/wiredio/benchmark_config.json index e74c7696415..50fcb4cd13f 100644 --- a/frameworks/CSharp/wiredio/benchmark_config.json +++ b/frameworks/CSharp/wiredio/benchmark_config.json @@ -20,12 +20,12 @@ "display_name": "Wired.IO", "notes": "Only plaintext and JSON benchmarks implemented yet" }, - "plt": { + "mcr": { "plaintext_url": "/plaintext", "json_url": "/json", "port": 8080, "approach": "Realistic", - "classification": "Platform", + "classification": "Micro", "database": "None", "framework": "Unhinged", "language": "C#", @@ -34,8 +34,25 @@ "webserver": "Unhinged", "os": "Linux", "database_os": "Linux", - "display_name": "Wired.IO [Unhinged]", - "notes": "Not a framework" + "display_name": "Unhinged", + "notes": "epoll" + }, + "gen": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "None", + "framework": "GenHttp", + "language": "C#", + "orm": "None", + "platform": ".NET", + "webserver": "Unhinged", + "os": "Linux", + "database_os": "Linux", + "display_name": "genhttp [Unhinged]", + "notes": "Adapter" } } ] diff --git a/frameworks/CSharp/wiredio/config.toml b/frameworks/CSharp/wiredio/config.toml index fe292c91330..b418d57d861 100644 --- a/frameworks/CSharp/wiredio/config.toml +++ b/frameworks/CSharp/wiredio/config.toml @@ -13,11 +13,23 @@ platform = ".NET" webserver = "Wired.IO" versus = "None" -[plt] +[mcr] urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" -classification = "Platform" +classification = "Micro" +os = "Linux" +database_os = "Linux" +orm = "None" +platform = ".NET" +webserver = "Unhinged" +versus = "None" + +[gen] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Fullstack" os = "Linux" database_os = "Linux" orm = "None" diff --git a/frameworks/CSharp/wiredio/src/Platform/Platform.csproj b/frameworks/CSharp/wiredio/src/Platform/Platform.csproj index f560113a9f5..16ae7e90e4c 100644 --- a/frameworks/CSharp/wiredio/src/Platform/Platform.csproj +++ b/frameworks/CSharp/wiredio/src/Platform/Platform.csproj @@ -20,6 +20,6 @@ - + diff --git a/frameworks/CSharp/wiredio/src/Platform/Program.cs b/frameworks/CSharp/wiredio/src/Platform/Program.cs index a572a456ae9..24a76794d6e 100644 --- a/frameworks/CSharp/wiredio/src/Platform/Program.cs +++ b/frameworks/CSharp/wiredio/src/Platform/Program.cs @@ -58,14 +58,19 @@ public static void Main(string[] args) engine.Run(); } - private static void RequestHandler(Connection connection) + private const string Json = "/json"; + private const string PlainText = "/plaintext"; + + private static ValueTask RequestHandler(Connection connection) { // FNV-1a Hashed routes to avoid string allocations - if(connection.HashedRoute == 291830056) // /json + if(connection.H1HeaderData.Route == Json) // /json CommitJsonResponse(connection); - else if (connection.HashedRoute == 3454831873) // /plaintext + else if (connection.H1HeaderData.Route == PlainText) // /plaintext CommitPlainTextResponse(connection); + + return ValueTask.CompletedTask; } [ThreadStatic] private static Utf8JsonWriter? t_utf8JsonWriter; diff --git a/frameworks/CSharp/wiredio/wiredio-gen.dockerfile b/frameworks/CSharp/wiredio/wiredio-gen.dockerfile new file mode 100644 index 00000000000..5436527f964 --- /dev/null +++ b/frameworks/CSharp/wiredio/wiredio-gen.dockerfile @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build +WORKDIR /source + +# copy csproj and restore as distinct layers +COPY UnhGHttp/*.csproj . +RUN dotnet restore -r linux-musl-x64 + +# copy and publish app and libraries +COPY UnhGHttp/ . +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained + +# final stage/image +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine + +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 + +WORKDIR /app +COPY --from=build /app . + +ENTRYPOINT ["./UnhGHttp"] + +EXPOSE 8080 diff --git a/frameworks/CSharp/wiredio/wiredio-plt.dockerfile b/frameworks/CSharp/wiredio/wiredio-mcr.dockerfile similarity index 100% rename from frameworks/CSharp/wiredio/wiredio-plt.dockerfile rename to frameworks/CSharp/wiredio/wiredio-mcr.dockerfile From a06834659ae6b282b180a75f1db1c02d48316675 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Thu, 6 Nov 2025 21:55:45 +0100 Subject: [PATCH 1729/1766] [ruby/rack] Require ERB explicitly (#10248) Avoids the following warning when running just the fortune tests: \# Date: Thu, 6 Nov 2025 21:56:10 +0100 Subject: [PATCH 1730/1766] [ruby/rack] Remove unused method and option (#10249) select_random_numbers and sql_log_level don't seem to get used. --- frameworks/Ruby/rack/pg_db.rb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/frameworks/Ruby/rack/pg_db.rb b/frameworks/Ruby/rack/pg_db.rb index bcaa1dad480..51a38cadc85 100644 --- a/frameworks/Ruby/rack/pg_db.rb +++ b/frameworks/Ruby/rack/pg_db.rb @@ -18,7 +18,7 @@ class PgDb attr_reader :connection def initialize(connection_string = nil, max_connections = 512) - @connection = Sequel.connect(connection_string, max_connections: max_connections, sql_log_level: :warning) + @connection = Sequel.connect(connection_string, max_connections: max_connections) Sequel.extension :fiber_concurrency if defined?(Falcon) prepare_statements @@ -53,13 +53,6 @@ def select_promises(count) end end - def select_random_numbers(count) - count = validate_count(count) - ALL_IDS.sample(count).map do |id| - @world_random_select.call(randomvalue: random_id, id: id).first - end - end - def select_worlds(count) count = validate_count(count) ALL_IDS.sample(count).map do |id| @@ -78,8 +71,7 @@ def update_worlds(count, async = false) else select_worlds(count) end - #values = [] - ids=[] + ids = [] sql = String.new("UPDATE world SET randomnumber = CASE id ") results.each do |r| r[:randomnumber] = random_id From f9b5e791c079b412f6a5e7ccb2ab56c830b44d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Fri, 7 Nov 2025 04:56:32 +0800 Subject: [PATCH 1731/1766] update feat version (#10251) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 适配最新版 * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade smart-socket * upgrade feat * upgrade feat * upgrade feat * upgrade feat * upgrade feat * upgrade feat * upgrade feat * upgrade feat --- frameworks/Java/smart-socket/feat-smart-servlet.dockerfile | 2 +- frameworks/Java/smart-socket/feat.dockerfile | 2 +- frameworks/Java/smart-socket/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Java/smart-socket/feat-smart-servlet.dockerfile b/frameworks/Java/smart-socket/feat-smart-servlet.dockerfile index 4209283ec42..7ec765572a8 100644 --- a/frameworks/Java/smart-socket/feat-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/feat-smart-servlet.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn install -q -FROM openjdk:21-jdk-slim +FROM amazoncorretto:25.0.1-alpine WORKDIR /smart-socket COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0.jar app.jar diff --git a/frameworks/Java/smart-socket/feat.dockerfile b/frameworks/Java/smart-socket/feat.dockerfile index f7eaec61f67..e21235baa58 100644 --- a/frameworks/Java/smart-socket/feat.dockerfile +++ b/frameworks/Java/smart-socket/feat.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn install -q -FROM openjdk:21-jdk-slim +FROM amazoncorretto:25.0.1-alpine WORKDIR /smart-socket COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0.jar app.jar diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 7cf9b85b3e7..171f036e654 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -20,7 +20,7 @@ tech.smartboot.feat feat-cloud-starter - 1.1.0-SNAPSHOT + 1.3.2-SNAPSHOT From 65fc874dad60351b8634bba3d8442da12b0522db Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Fri, 7 Nov 2025 18:59:53 +0000 Subject: [PATCH 1732/1766] toolset: Reduce the packages installed by APT (#10253) Make sure that APT does not install anything unnecessary. Signed-off-by: Anton Kirilov --- Dockerfile | 5 +++-- entrypoint.sh | 2 +- toolset/__init__.py | 0 toolset/continuous/tfb-shutdown.sh | 0 toolset/continuous/tfb-startup.sh | 0 toolset/scaffolding/README.md | 0 toolset/scaffolding/benchmark_config.json | 0 toolset/utils/__init__.py | 0 toolset/utils/benchmark_config.py | 0 toolset/utils/output_helper.py | 0 toolset/utils/scaffolding.py | 0 toolset/wrk/concurrency.sh | 0 toolset/wrk/pipeline.sh | 0 toolset/wrk/query.sh | 0 toolset/wrk/wrk.dockerfile | 6 +----- 15 files changed, 5 insertions(+), 8 deletions(-) mode change 100755 => 100644 toolset/__init__.py mode change 100644 => 100755 toolset/continuous/tfb-shutdown.sh mode change 100644 => 100755 toolset/continuous/tfb-startup.sh mode change 100755 => 100644 toolset/scaffolding/README.md mode change 100755 => 100644 toolset/scaffolding/benchmark_config.json mode change 100755 => 100644 toolset/utils/__init__.py mode change 100755 => 100644 toolset/utils/benchmark_config.py mode change 100755 => 100644 toolset/utils/output_helper.py mode change 100755 => 100644 toolset/utils/scaffolding.py mode change 100644 => 100755 toolset/wrk/concurrency.sh mode change 100644 => 100755 toolset/wrk/pipeline.sh mode change 100644 => 100755 toolset/wrk/query.sh diff --git a/Dockerfile b/Dockerfile index 0e60a78d94c..c02bb66c087 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,10 +4,11 @@ ARG DEBIAN_FRONTEND=noninteractive # WARNING: DON'T PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK # One -q produces output suitable for logging (mostly hides # progress indicators) -RUN apt-get -yqq update && \ - apt-get -yqq install \ +RUN apt-get install \ + --no-install-recommends \ -o Dpkg::Options::="--force-confdef" \ -o Dpkg::Options::="--force-confold" \ + -qqUy \ cloc \ curl \ gcc \ diff --git a/entrypoint.sh b/entrypoint.sh index 71ad543e960..eb22e6e75d7 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -4,4 +4,4 @@ set -eo pipefail -u chown -LR "$USER_ID" /var/run # Drop permissions of user to match those of the host system -gosu "$USER_ID" python3 "${FWROOT}/toolset/run-tests.py" "$@" +exec gosu "$USER_ID" python3 "${FWROOT}/toolset/run-tests.py" "$@" diff --git a/toolset/__init__.py b/toolset/__init__.py old mode 100755 new mode 100644 diff --git a/toolset/continuous/tfb-shutdown.sh b/toolset/continuous/tfb-shutdown.sh old mode 100644 new mode 100755 diff --git a/toolset/continuous/tfb-startup.sh b/toolset/continuous/tfb-startup.sh old mode 100644 new mode 100755 diff --git a/toolset/scaffolding/README.md b/toolset/scaffolding/README.md old mode 100755 new mode 100644 diff --git a/toolset/scaffolding/benchmark_config.json b/toolset/scaffolding/benchmark_config.json old mode 100755 new mode 100644 diff --git a/toolset/utils/__init__.py b/toolset/utils/__init__.py old mode 100755 new mode 100644 diff --git a/toolset/utils/benchmark_config.py b/toolset/utils/benchmark_config.py old mode 100755 new mode 100644 diff --git a/toolset/utils/output_helper.py b/toolset/utils/output_helper.py old mode 100755 new mode 100644 diff --git a/toolset/utils/scaffolding.py b/toolset/utils/scaffolding.py old mode 100755 new mode 100644 diff --git a/toolset/wrk/concurrency.sh b/toolset/wrk/concurrency.sh old mode 100644 new mode 100755 diff --git a/toolset/wrk/pipeline.sh b/toolset/wrk/pipeline.sh old mode 100644 new mode 100755 diff --git a/toolset/wrk/query.sh b/toolset/wrk/query.sh old mode 100644 new mode 100755 diff --git a/toolset/wrk/wrk.dockerfile b/toolset/wrk/wrk.dockerfile index 9bcf42f7b38..772fe3268fa 100644 --- a/toolset/wrk/wrk.dockerfile +++ b/toolset/wrk/wrk.dockerfile @@ -4,11 +4,7 @@ FROM ubuntu:24.04 COPY concurrency.sh pipeline.lua pipeline.sh query.sh ./ ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -yqq update >/dev/null && \ - apt-get -yqq install >/dev/null \ - curl \ - wrk && \ - chmod 777 concurrency.sh pipeline.sh query.sh +RUN apt-get install --no-install-recommends -qqUy curl wrk > /dev/null # Environment vars required by the wrk scripts with nonsense defaults ENV accept=accept \ From eeda59f5331f1f59df71a40c0665ab55067776ce Mon Sep 17 00:00:00 2001 From: Hassan Sharara <167939195+HassanSharara@users.noreply.github.com> Date: Tue, 11 Nov 2025 19:47:21 +0300 Subject: [PATCH 1733/1766] Add water-http framework (#10255) * Add water-http framework * benchmark_config.json update --- frameworks/Rust/water-http/.gitignore | 3 + frameworks/Rust/water-http/Cargo.toml | 45 +++ frameworks/Rust/water-http/README | 39 +++ .../Rust/water-http/benchmark_config.json | 90 +++++ frameworks/Rust/water-http/src/cached.rs | 305 +++++++++++++++++ frameworks/Rust/water-http/src/db.rs | 320 ++++++++++++++++++ frameworks/Rust/water-http/src/json.rs | 55 +++ frameworks/Rust/water-http/src/main.rs | 7 + frameworks/Rust/water-http/src/models.rs | 25 ++ frameworks/Rust/water-http/src/plaintext.rs | 54 +++ frameworks/Rust/water-http/src/server.rs | 290 ++++++++++++++++ .../Rust/water-http/templates/fortune.hbs | 5 + .../Rust/water-http/templates/fortune.html | 12 + .../water-http/water-http-cached.dockerfile | 13 + .../Rust/water-http/water-http-db.dockerfile | 13 + .../water-http/water-http-json.dockerfile | 13 + .../water-http-plaintext.dockerfile | 13 + .../Rust/water-http/water-http.dockerfile | 13 + 18 files changed, 1315 insertions(+) create mode 100644 frameworks/Rust/water-http/.gitignore create mode 100644 frameworks/Rust/water-http/Cargo.toml create mode 100644 frameworks/Rust/water-http/README create mode 100644 frameworks/Rust/water-http/benchmark_config.json create mode 100644 frameworks/Rust/water-http/src/cached.rs create mode 100644 frameworks/Rust/water-http/src/db.rs create mode 100644 frameworks/Rust/water-http/src/json.rs create mode 100644 frameworks/Rust/water-http/src/main.rs create mode 100644 frameworks/Rust/water-http/src/models.rs create mode 100644 frameworks/Rust/water-http/src/plaintext.rs create mode 100644 frameworks/Rust/water-http/src/server.rs create mode 100644 frameworks/Rust/water-http/templates/fortune.hbs create mode 100644 frameworks/Rust/water-http/templates/fortune.html create mode 100644 frameworks/Rust/water-http/water-http-cached.dockerfile create mode 100644 frameworks/Rust/water-http/water-http-db.dockerfile create mode 100644 frameworks/Rust/water-http/water-http-json.dockerfile create mode 100644 frameworks/Rust/water-http/water-http-plaintext.dockerfile create mode 100644 frameworks/Rust/water-http/water-http.dockerfile diff --git a/frameworks/Rust/water-http/.gitignore b/frameworks/Rust/water-http/.gitignore new file mode 100644 index 00000000000..2da6cdebaac --- /dev/null +++ b/frameworks/Rust/water-http/.gitignore @@ -0,0 +1,3 @@ +target +Cargo.lock +.idea \ No newline at end of file diff --git a/frameworks/Rust/water-http/Cargo.toml b/frameworks/Rust/water-http/Cargo.toml new file mode 100644 index 00000000000..fe22c5a9a68 --- /dev/null +++ b/frameworks/Rust/water-http/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "water-http" +version = "0.1.0" +edition = "2018" + +[dependencies] +askama = "0.14.0" +tokio = { version = "1.47.1", features = ["full"] } +water_http = {git = "https://github.com/HassanSharara/water_http.git", branch = "beta", features = ["use_only_http1"],optional = true , version = "3.0.8-beta.5" } +smallvec = "1.15.1" +nanorand = "0.8.0" +tokio-postgres = "0.7.15" +sonic-rs = "0.5.5" +bytes = "1.10.1" +serde = { version = "1.0.228", features = ["derive","rc"] } +futures-util = "0.3.31" +num_cpus = "1.17.0" +httpdate = "1.0.3" +parking_lot = "0.12.5" +yarte = { version = "0.15.7" ,features = ["bytes-buf", "json"] } +itoa = {version = "1.0.15" ,optional = true} + + +[[bin]] +name = "plaintext" +path = "src/plaintext.rs" +required-features = ["json_plaintext"] + +[[bin]] +name = "json" +path = "src/json.rs" +required-features = ["json_plaintext"] + + +[[bin]] +name = "cache" +path = "src/cached.rs" +required-features = ["cache"] + + +[features] +json_plaintext = ["water_http"] +db = ["water_http/thread_shared_struct"] +cache = ["water_http/thread_shared_struct","itoa"] +all = ["water_http/thread_shared_struct"] diff --git a/frameworks/Rust/water-http/README b/frameworks/Rust/water-http/README new file mode 100644 index 00000000000..67e4ecc228a --- /dev/null +++ b/frameworks/Rust/water-http/README @@ -0,0 +1,39 @@ +🌊 Water HTTP — TechEmpower Benchmarks + +Water HTTP is a high-performance Rust web framework built and optimized for the TechEmpower Framework Benchmarks (TFB) +. It is designed to push the limits of speed, stability, and scalability using pure asynchronous Rust and Tokio’s runtime. Every part of the framework is hand-tuned to achieve predictable latency, minimal allocations, and efficient CPU utilization under extreme concurrency. + +This repository contains the official benchmark implementations for all test types, including Plaintext, JSON serialization, Single query, Multiple queries, Fortunes, Database updates, and Cached queries. + +⚡ Highlights + +🚀 One of the fastest and most stable frameworks in the TechEmpower Benchmarks + +🧵 Built entirely on Tokio’s asynchronous runtime — no io_uring or unsafe code + +💾 Zero-copy I/O, preallocated buffers, and predictable memory layout + +🔒 100% safe Rust with no hidden synchronization overhead + +🧱 Designed for consistent high performance at scale + + +🧠 Architecture + +Water HTTP is built around a fully asynchronous, event-driven architecture that leverages non-blocking I/O and efficient request processing. The system is designed to eliminate unnecessary locks and minimize latency even under heavy load. + +[ tokio::net::TcpListener ] + ↓ + [ connection handler ] + ↓ + [ water::http::parser ] + ↓ + [ application logic ] + ↓ + [ response encoder ] +This approach ensures optimal throughput and minimal per-request overhead while keeping code simple and safe. + + +🧭 Mission + +Water HTTP’s mission is to demonstrate how Rust’s async ecosystem can reach record-breaking performance without compromising simplicity, safety, or maintainability. It shows that carefully engineered async Rust can deliver unmatched speed and reliability in real-world workloads, setting a new standard for what modern web frameworks can achieve. diff --git a/frameworks/Rust/water-http/benchmark_config.json b/frameworks/Rust/water-http/benchmark_config.json new file mode 100644 index 00000000000..2b28f0476a3 --- /dev/null +++ b/frameworks/Rust/water-http/benchmark_config.json @@ -0,0 +1,90 @@ +{ + "framework": "water-http", + "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", + "classification": "Micro", + "database": "Postgres", + "framework": "water_http", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "water_http", + "os": "Linux", + "database_os": "Linux", + "display_name": "water_http" + }, + + "db": { + "fortune_url": "/fortunes", + "db_url": "/db", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "water_http", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "water_http", + "os": "Linux", + "database_os": "Linux", + "display_name": "water_http" + }, + + "cached": { + "cached_query_url": "/cached-queries?q=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "water_http", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "water_http", + "os": "Linux", + "database_os": "Linux", + "display_name": "water_http" + }, + "json": { + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "water_http", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "water_http", + "os": "Linux", + "database_os": "Linux", + "display_name": "water_http" + }, + "plaintext": { + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "water_http", + "language": "Rust", + "orm": "raw", + "platform": "Rust", + "webserver": "water_http", + "os": "Linux", + "database_os": "Linux", + "display_name": "water_http" + } + } + ] +} \ No newline at end of file diff --git a/frameworks/Rust/water-http/src/cached.rs b/frameworks/Rust/water-http/src/cached.rs new file mode 100644 index 00000000000..6e1cea1a77f --- /dev/null +++ b/frameworks/Rust/water-http/src/cached.rs @@ -0,0 +1,305 @@ +#![allow(static_mut_refs)] +use std::io; +use std::fmt::Arguments; +use std::io::Write; +use std::mem::MaybeUninit; +use std::rc::Rc; +use std::cell::UnsafeCell; +use std::collections::HashMap; +use nanorand::{Rng, WyRand}; +use tokio_postgres::{connect, Client, NoTls}; +use tokio_postgres::types::private::BytesMut; +use sonic_rs::prelude::WriteExt; +use std::pin::Pin; +use tokio::task::LocalSet; +use water_http::{InitControllersRoot, RunServer, WaterController}; +use water_http::http::{HttpSender, ResponseData}; +use water_http::server::{HttpContext, ServerConfigurations}; +use water_http::http::HttpSenderTrait; + +pub struct DbConnectionPool { + pub connections: Vec>, + pub next: UnsafeCell, +} + +impl DbConnectionPool { + /// Get a connection from the pool (round-robin, relaxed ordering) + #[inline(always)] + pub fn get_connection(&self) -> &Rc { + let n = unsafe{&mut *self.next.get()}; + *n +=1; + let idx = *n % self.connections.len(); + unsafe { self.connections.get_unchecked(idx) } + } + + /// Fill the pool with connections + pub async fn fill_pool(&mut self, url: &'static str, size: usize) { + let mut tasks = Vec::with_capacity(size); + for _ in 0..size { + tasks.push(tokio::task::spawn_local(async move { + for attempt in 0..5 { + match PgConnection::connect(url).await { + Ok(conn) => { + + return Ok(conn); }, + Err(_) if attempt < 4 => { + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + } + Err(_) => return Err(()), + } + } + Err(()) + })); + } + for t in tasks { + if let Ok(Ok(conn)) = t.await { + self.connections.push(Rc::new(conn)); + } + } + } + + +} + + + + +pub struct PgConnection { + cl:Client, + _connection_task: tokio::task::JoinHandle<()>, +} + +// Safety: Only used within LocalSet, no cross-thread access +impl PgConnection { + /// Connect to the database + + pub async fn connect(db_url: &str) -> Result { + let (cl, c) = tokio::time::timeout( + std::time::Duration::from_secs(5), + connect(db_url, NoTls), + ) + .await + .map_err(|_| ())? + .map_err(|_| ())?; + + let connection_task = tokio::task::spawn_local(async move { + let _ = c.await; + }); + + Ok(PgConnection { + _connection_task: connection_task, + cl + }) + } +} + +/// Zero-copy writer for BytesMut +pub struct BytesMuteWriter<'a>(pub &'a mut BytesMut); + +impl BytesMuteWriter<'_> { + + #[inline(always)] + pub fn extend_from_slice(&mut self,data:&[u8]){ + self.0.extend_from_slice(data); + } +} + +impl Write for BytesMuteWriter<'_> { + #[inline(always)] + fn write(&mut self, src: &[u8]) -> Result { + self.0.extend_from_slice(src); + Ok(src.len()) + } + + #[inline(always)] + fn flush(&mut self) -> Result<(), io::Error> { + Ok(()) + } +} + +impl std::fmt::Write for BytesMuteWriter<'_> { + #[inline(always)] + fn write_str(&mut self, s: &str) -> std::fmt::Result { + self.0.extend_from_slice(s.as_bytes()); + Ok(()) + } + + #[inline(always)] + fn write_char(&mut self, c: char) -> std::fmt::Result { + let mut buf = [0u8; 4]; + self.0.extend_from_slice(c.encode_utf8(&mut buf).as_bytes()); + Ok(()) + } + + #[inline(always)] + fn write_fmt(&mut self, args: Arguments<'_>) -> std::fmt::Result { + std::fmt::write(self, args) + } +} + +impl WriteExt for BytesMuteWriter<'_> { + #[inline(always)] + fn reserve_with(&mut self, additional: usize) -> Result<&mut [MaybeUninit], io::Error> { + self.0.reserve(additional); + unsafe { + let ptr = self.0.as_mut_ptr().add(self.0.len()) as *mut MaybeUninit; + Ok(std::slice::from_raw_parts_mut(ptr, additional)) + } + } + + #[inline(always)] + unsafe fn flush_len(&mut self, additional: usize) -> io::Result<()> { + self.0.set_len(self.0.len() + additional); + Ok(()) + } +} + + +InitControllersRoot! { + name:ROOT, + holder_type:MainType, + shared_type:SH, +} + +pub struct ThreadSharedStruct{ + writing_buffer:UnsafeCell, + rng:WyRand, +} + + +impl ThreadSharedStruct { + + #[inline(always)] + pub fn get_value(id:i32)->&'static i32{ + let map = unsafe {CACHED_VALUES.as_ref().unwrap().get(&id)} ; + map.unwrap() + } + pub fn get_cached_queries(&self,num:usize)->&[u8]{ + let buf = unsafe{&mut *(self.writing_buffer.get())}; + buf.clear(); + buf.extend_from_slice(br#"["#); + let mut writer = BytesMuteWriter(buf); + let mut rn = self.rng.clone(); + for _ in 0..num { + let rd: i32 = (rn.generate::() & 0x3FFF) as i32 % 10_000 + 1; + let v = Self::get_value(rd); + writer.extend_from_slice(br"{"); + _ = write!(writer, r#""id":{},"randomnumber":{}"#, rd, v); + writer.extend_from_slice(br"},"); + } + if buf.len() >1 {buf.truncate(buf.len() - 1);} + buf.extend_from_slice(b"]"); + return &buf[..] + } +} + +pub type MainType = u8; +pub type SH = Rc; + + +static mut CACHED_VALUES:Option> = None; + +pub fn run_server(){ + + _= std::thread::spawn( + ||{ + let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap(); + rt.block_on(async move { + const URL:&'static str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; + // const URL:&'static str = "postgres://postgres:root@localhost:5432/techmpower"; + + let mut pool = DbConnectionPool{ + connections:Vec::with_capacity( 1 + ), + next:0.into(), + // rt:tokio::runtime::Builder::new_multi_thread().enable_all().worker_threads(cpu_nums).build().unwrap() + }; + + let local_set = LocalSet::new(); + + _= local_set.run_until(async move { + tokio::task::spawn_local(async move { + pool.fill_pool(URL, 1).await; + let connection = pool.get_connection(); + let statement = connection.cl.prepare("SELECT id,randomnumber FROM World").await.unwrap(); + let res = connection.cl.query(&statement,&[]).await.unwrap(); + let mut map = HashMap::new(); + for row in res { + map.insert(row.get(0),row.get(1)); + } + unsafe { + let static_map = &mut CACHED_VALUES; + *static_map = Some(map); + } + }).await + }).await; + + }); + } + ).join(); + let cpu_nums = num_cpus::get(); + + + println!("start listening on port 8080 while workers count {cpu_nums}"); + let mut conf = ServerConfigurations::bind("0.0.0.0",8080); + conf.worker_threads_count = cpu_nums * 1 ; + + // let addresses = (0..cpu_nums).map(|_| { + // ("0.0.0.0".to_string(),8080) + // }).collect::>(); + // conf.addresses = addresses; + RunServer!( + conf, + ROOT, + EntryController, + shared_factory + ); +} + +fn shared_factory()->Pin>>{ + Box::pin(async { + + // const URL:&'static str = "postgres://postgres:root@localhost:5432/techmpower"; + + Rc::new(ThreadSharedStruct{ + writing_buffer:UnsafeCell::new(BytesMut::with_capacity(100_000)), + rng:WyRand::new() + }) + }) +} + +pub async fn handle_cached_queries(context:&mut HttpContext<'_,MainType,SH,HS,QS>){ + let q = context + .get_from_path_query("q") + .and_then(|v| v.parse::().ok()) // safely parse + .unwrap_or(1) // default to 1 if missing or invalid + .clamp(1, 500); + + let connection:SH = context.thread_shared_struct.clone().unwrap().clone(); + let data = connection.get_cached_queries(q); + let mut sender:HttpSender = context.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + ResponseData::Slice(data) + ).await; +} + +WaterController! { + holder -> super::MainType, + shared -> super::SH, + name -> EntryController, + functions -> { + + GET -> "cached-queries" -> query (context) { + _=super::handle_cached_queries(context).await; + } + } +} + +fn main() { + run_server(); +} + diff --git a/frameworks/Rust/water-http/src/db.rs b/frameworks/Rust/water-http/src/db.rs new file mode 100644 index 00000000000..40640735f88 --- /dev/null +++ b/frameworks/Rust/water-http/src/db.rs @@ -0,0 +1,320 @@ +#![cfg(any(feature = "db",feature = "all"))] +use std::{borrow::Cow, io}; +use std::fmt::Arguments; +use std::io::Write; +use std::mem::MaybeUninit; +use std::rc::Rc; +use std::cell::UnsafeCell; +use bytes::Buf; +use nanorand::{Rng, WyRand}; +use tokio_postgres::{connect, Client, Statement, NoTls}; +use tokio_postgres::types::private::BytesMut; +use crate::models::{Fortune, FortuneTemplate, World}; +use sonic_rs::prelude::WriteExt; +use yarte::TemplateBytesTrait; + +/// Database connection pool with thread-local RNG +pub struct DbConnectionPool { + pub connections: Vec>, + pub next: UnsafeCell, +} + +impl DbConnectionPool { + /// Get a connection from the pool (round-robin, relaxed ordering) + #[inline(always)] + pub fn get_connection(&self) -> &Rc { + let n = unsafe{&mut *self.next.get()}; + *n +=1; + let idx = *n % self.connections.len(); + unsafe { self.connections.get_unchecked(idx) } + } + + /// Fill the pool with connections + pub async fn fill_pool(&mut self, url: &'static str, size: usize) { + let mut tasks = Vec::with_capacity(size); + for _ in 0..size { + tasks.push(tokio::task::spawn_local(async move { + for attempt in 0..5 { + match PgConnection::connect(url).await { + Ok(conn) => { + + return Ok(conn); }, + Err(_) if attempt < 4 => { + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + } + Err(_) => return Err(()), + } + } + Err(()) + })); + } + for t in tasks { + if let Ok(Ok(conn)) = t.await { + self.connections.push(Rc::new(conn)); + } + } + } +} + + +/// Reusable buffer pool per connection +struct BufferPool { + body: BytesMut, + worlds: Vec, + numbers: Vec, + fortunes: Vec, + fortune_output: Vec, +} + +impl BufferPool { + fn new() -> Self { + Self { + body: BytesMut::with_capacity(4096), + worlds: Vec::with_capacity(501), + numbers: Vec::with_capacity(501), + + fortunes: Vec::with_capacity(501), + fortune_output: Vec::with_capacity(4096), + } + } + +} + +/// PostgreSQL connection wrapper with pre-allocated buffers +pub struct PgConnection { + pub cl: Client, + pub fortune: Statement, + pub world: Statement, + pub updates: Vec, + rang:WyRand, + buffers: UnsafeCell, + _connection_task: tokio::task::JoinHandle<()>, +} + +// Safety: Only used within LocalSet, no cross-thread access +impl PgConnection { + /// Connect to the database + + pub async fn connect(db_url: &str) -> Result { + let (cl, conn) = tokio::time::timeout( + std::time::Duration::from_secs(5), + connect(db_url, NoTls), + ) + .await + .map_err(|_| ())? + .map_err(|_| ())?; + + let connection_task = tokio::task::spawn_local(async move { + let _ = conn.await; + }); + + let fortune = cl.prepare("SELECT * FROM fortune").await.map_err(|_| ())?; + let world = cl.prepare("SELECT id,randomnumber FROM world WHERE id=$1 LIMIT 1").await.map_err(|_| ())?; + + // Pre-compile update statements for batch sizes 1-500 + let mut updates = vec![]; + for num in 1..=500 { + let sql = Self::generate_update_values_stmt(num); + updates.push(cl.prepare(&sql).await.unwrap()); + } + + Ok(PgConnection { + cl, + fortune, + world, + updates, + buffers: UnsafeCell::new(BufferPool::new()), + _connection_task: connection_task, + rang: WyRand::new() + }) + } /// Connect to the database + + #[inline(always)] + pub fn generate_update_values_stmt(batch_size: usize) -> String { + + let mut sql = String::from("UPDATE world SET randomNumber = w.r FROM (VALUES "); + + for i in 0..batch_size { + let id_param = i * 2 + 1; + let val_param = id_param + 1; + sql.push_str(&format!("(${}::int, ${}::int),", id_param, val_param)); + } + + // Remove the trailing comma + sql.pop(); + + sql.push_str(") AS w(i, r) WHERE world.id = w.i"); + sql + } + + /// Get mutable access to buffers (safe because connection pool ensures single access) + #[inline(always)] + fn buffers(&self) -> &mut BufferPool { + unsafe { &mut *self.buffers.get() } + } + + /// Get a single random world - optimized with buffer reuse + #[inline] + pub async fn get_world(&self) -> &[u8] { + let rd = (self.rang.clone().generate::() % 10_000 + 1) as i32; + let row = self.cl.query_one(&self.world, &[&rd]).await.unwrap(); + + let buffers = self.buffers(); + buffers.body.clear(); + + sonic_rs::to_writer( + BytesMuteWriter(&mut buffers.body), + &World { + id: row.get(0), + randomnumber: row.get(1), + }, + ).unwrap(); + + buffers.body.chunk() + } + + /// Get multiple random worlds - optimized with buffer reuse + pub async fn get_worlds(&self, num: usize) -> &[u8] { + let buffers = self.buffers(); + buffers.worlds.clear(); + let mut rn = self.rang.clone(); + for _ in 0..num { + let id: i32 = (rn.generate::() & 0x3FFF) as i32 % 10_000 + 1; + let row = self.cl.query_one(&self.world, &[&id]).await.unwrap(); + buffers.worlds.push(World { + id: row.get(0), + randomnumber: row.get(1), + }); + } + buffers.body.clear(); + sonic_rs::to_writer(BytesMuteWriter(&mut buffers.body), &buffers.worlds).unwrap(); + buffers.body.chunk() + } + /// Update worlds in batch - optimized with buffer reuse + /// Update worlds in batch - optimized with buffer reuse + + /// Update worlds in batch - optimized with buffer reuse + + /// Update worlds in batch - optimized with buffer reuse + + /// Update worlds in batch - optimized with RETURNING clause to minimize reads + /// Update worlds - fetch and update each row to handle duplicates correctly + /// Update worlds in batch using CASE statement + pub async fn update(&self, num: usize) -> &[u8] { + + let buffers = self.buffers(); + let mut ids:Vec = Vec::with_capacity(num); + let mut rng = self.rang.clone(); + let mut params: Vec<&(dyn tokio_postgres::types::ToSql + Sync)> = + Vec::with_capacity(num * 2); + let mut futures =vec![]; + for _ in 0..num { + let w_id = (rng.generate::() % 10_000 + 1) as i32; + ids.push(w_id); + } + futures.extend(ids.iter().map(|x| async move {self.cl.query_one(&self.world,&[&x]).await})); + futures_util::future::join_all(futures).await; + ids.sort_unstable(); + buffers.worlds.clear(); + for index in 0..num { + let s_id = (rng.generate::() % 10_000 + 1 ) as i32; + buffers.worlds.push(World{ + id:ids[index], + randomnumber:s_id + }); + buffers.numbers.push(s_id); + } + buffers.body.clear(); + for index in 0..num { + params.push(&ids[index]); + params.push(&buffers.numbers[index]); + } + + _=self.cl.execute(&self.updates[num - 1], ¶ms).await.unwrap(); + sonic_rs::to_writer(BytesMuteWriter(&mut buffers.body), &buffers.worlds).unwrap(); + buffers.body.chunk() + } + + + /// Tell fortunes - optimized with buffer reuse + pub async fn tell_fortune(&self) -> Result<&[u8], ()> { + let res = self.cl.query(&self.fortune, &[]).await.map_err(|_| ())?; + + let buffers = self.buffers(); + buffers.fortunes.clear(); + buffers.fortune_output.clear(); + + buffers.fortunes.push(Fortune { + id: 0, + message: Cow::Borrowed("Additional fortune added at request time."), + }); + + for row in res { + buffers.fortunes.push(Fortune { + id: row.get(0), + message: Cow::Owned(row.get(1)), + }); + } + + buffers.fortunes.sort_unstable_by(|a, b| a.message.cmp(&b.message)); + + let template = FortuneTemplate { items: &buffers.fortunes }; + template.write_call(&mut buffers.fortune_output); + + // Return reference to buffer - zero-copy! + Ok(&buffers.fortune_output) + } +} + +/// Zero-copy writer for BytesMut +pub struct BytesMuteWriter<'a>(pub &'a mut BytesMut); + +impl Write for BytesMuteWriter<'_> { + #[inline(always)] + fn write(&mut self, src: &[u8]) -> Result { + self.0.extend_from_slice(src); + Ok(src.len()) + } + + #[inline(always)] + fn flush(&mut self) -> Result<(), io::Error> { + Ok(()) + } +} + +impl std::fmt::Write for BytesMuteWriter<'_> { + #[inline(always)] + fn write_str(&mut self, s: &str) -> std::fmt::Result { + self.0.extend_from_slice(s.as_bytes()); + Ok(()) + } + + #[inline(always)] + fn write_char(&mut self, c: char) -> std::fmt::Result { + let mut buf = [0u8; 4]; + self.0.extend_from_slice(c.encode_utf8(&mut buf).as_bytes()); + Ok(()) + } + + #[inline(always)] + fn write_fmt(&mut self, args: Arguments<'_>) -> std::fmt::Result { + std::fmt::write(self, args) + } +} + +impl WriteExt for BytesMuteWriter<'_> { + #[inline(always)] + fn reserve_with(&mut self, additional: usize) -> Result<&mut [MaybeUninit], io::Error> { + self.0.reserve(additional); + unsafe { + let ptr = self.0.as_mut_ptr().add(self.0.len()) as *mut MaybeUninit; + Ok(std::slice::from_raw_parts_mut(ptr, additional)) + } + } + + #[inline(always)] + unsafe fn flush_len(&mut self, additional: usize) -> io::Result<()> { + self.0.set_len(self.0.len() + additional); + Ok(()) + } +} \ No newline at end of file diff --git a/frameworks/Rust/water-http/src/json.rs b/frameworks/Rust/water-http/src/json.rs new file mode 100644 index 00000000000..71f406b6051 --- /dev/null +++ b/frameworks/Rust/water-http/src/json.rs @@ -0,0 +1,55 @@ +use water_http::{InitControllersRoot, RunServer, WaterController}; +use water_http::server::ServerConfigurations; + +InitControllersRoot! { + name:ROOT, + holder_type:MainType, +} + + + +pub type MainType = u8; + + +fn main() { + run_server(); +} + + +pub fn run_server(){ + + let cpu_nums = num_cpus::get(); + + + println!("start listening on port 8080 while workers count {cpu_nums}"); + let mut conf = ServerConfigurations::bind("0.0.0.0",8080); + conf.worker_threads_count = cpu_nums * 2 ; + + RunServer!( + conf, + ROOT, + EntryController + ); +} + +const JSON_RESPONSE:&'static [u8] = br#"{"message":"Hello, World!"}"#; + + +WaterController! { + holder -> super::MainType, + name -> EntryController, + functions -> { + + + GET => json => j(cx){ + let mut sender = cx.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _=sender.send_data_as_final_response(http::ResponseData::Slice(super::JSON_RESPONSE)).await; + } + + } +} + diff --git a/frameworks/Rust/water-http/src/main.rs b/frameworks/Rust/water-http/src/main.rs new file mode 100644 index 00000000000..487409af1d6 --- /dev/null +++ b/frameworks/Rust/water-http/src/main.rs @@ -0,0 +1,7 @@ +mod server; +pub mod models; +mod db; + +fn main() { + server::run_server(); +} diff --git a/frameworks/Rust/water-http/src/models.rs b/frameworks/Rust/water-http/src/models.rs new file mode 100644 index 00000000000..1fee7283ba9 --- /dev/null +++ b/frameworks/Rust/water-http/src/models.rs @@ -0,0 +1,25 @@ +use std::borrow::Cow; +use sonic_rs::{Serialize}; +// use askama::Template; +#[derive(Serialize)] +pub struct World { + pub id: i32, + pub randomnumber: i32, +} +#[derive(Serialize,Debug)] +pub struct Fortune { + pub id: i32, + pub message: Cow<'static, str>, +} + +#[derive(yarte::TemplateBytes)] +#[template(path = "fortune.hbs")] +pub struct FortuneTemplate<'a>{ + pub items:&'a Vec +} + + + +// pub async fn to(model:FortuneTemplate<'_>){ +// model.r +// } \ No newline at end of file diff --git a/frameworks/Rust/water-http/src/plaintext.rs b/frameworks/Rust/water-http/src/plaintext.rs new file mode 100644 index 00000000000..197da216e9c --- /dev/null +++ b/frameworks/Rust/water-http/src/plaintext.rs @@ -0,0 +1,54 @@ +use water_http::{InitControllersRoot, RunServer, WaterController}; +use water_http::server::ServerConfigurations; + +InitControllersRoot! { + name:ROOT, + holder_type:MainType, +} + + + +pub type MainType = u8; + + +fn main() { + run_server(); +} + + +pub fn run_server(){ + + let cpu_nums = num_cpus::get(); + + + println!("start listening on port 8080 while workers count {cpu_nums}"); + let mut conf = ServerConfigurations::bind("0.0.0.0",8080); + conf.worker_threads_count = cpu_nums * 1 ; + + RunServer!( + conf, + ROOT, + EntryController + ); +} + +const JSON_RESPONSE:&'static [u8] = br#"{"message":"Hello, World!"}"#; +const P:&'static [u8] = br#"Hello, World!"#; + + +WaterController! { + holder -> super::MainType, + name -> EntryController, + functions -> { + + GET => plaintext => p(cx) { + let mut sender = cx.sender(); + sender.set_header_ef("Content-Type","text/plain; charset=utf-8"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _=sender.send_data_as_final_response(http::ResponseData::Str("Hello, World!")).await; + } + } +} + diff --git a/frameworks/Rust/water-http/src/server.rs b/frameworks/Rust/water-http/src/server.rs new file mode 100644 index 00000000000..be464a0e3d6 --- /dev/null +++ b/frameworks/Rust/water-http/src/server.rs @@ -0,0 +1,290 @@ + +use std::pin::Pin; +use std::rc::Rc; +use water_http::{InitControllersRoot, RunServer, WaterController}; +use water_http::server::ServerConfigurations; +use crate::db::{DbConnectionPool}; +InitControllersRoot! { + name:ROOT, + holder_type:MainType, + shared_type:SharedType, +} + +pub struct ThreadSharedStruct{ + pg_connection: DbConnectionPool +} + +pub type MainType = u8; +pub type SharedType = Rc; + + + + +pub fn run_server(){ + + let cpu_nums = num_cpus::get(); + + + println!("start listening on port 8080 while workers count {cpu_nums}"); + let mut conf = ServerConfigurations::bind("0.0.0.0",8080); + #[cfg(feature = "json_plaintext")] + { + conf.worker_threads_count = cpu_nums * 2 ; + } + #[cfg(not(feature = "json_plaintext"))] + { + conf.worker_threads_count = cpu_nums * 1 ; + } + + // let addresses = (0..cpu_nums).map(|_| { + // ("0.0.0.0".to_string(),8080) + // }).collect::>(); + // conf.addresses = addresses; + RunServer!( + conf, + ROOT, + EntryController, + shared_factory + ); +} + +fn shared_factory()->Pin>>{ + Box::pin(async { + + // const URL:&'static str = "postgres://postgres:root@localhost:5432/techmpower"; + const URL:&'static str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; + let mut pool = DbConnectionPool{ + connections:Vec::with_capacity( 1 + ), + next:0.into(), + // rt:tokio::runtime::Builder::new_multi_thread().enable_all().worker_threads(cpu_nums).build().unwrap() + }; + pool.fill_pool(URL, 1).await; + Rc::new(ThreadSharedStruct{ + pg_connection:pool + }) + }) +} + +#[cfg(any(feature = "json_plaintext",feature = "all"))] +const JSON_RESPONSE:&'static [u8] = br#"{"message":"Hello, World!"}"#; +#[cfg(any(feature = "json_plaintext",feature = "all"))] +const P:&'static [u8] = br#"Hello, World!"#; + +#[cfg(feature = "all")] +WaterController! { + holder -> super::MainType, + shared -> super::SharedType, + name -> EntryController, + functions -> { + + + GET => json => j(cx){ + let mut sender = cx.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _=sender.send_data_as_final_response(http::ResponseData::Slice(super::JSON_RESPONSE)).await; + } + + GET => plaintext => p(cx){ + let mut sender = cx.sender(); + sender.set_header_ef("Content-Type","text/plain; charset=utf-8"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _=sender.send_data_as_final_response(http::ResponseData::Slice(super::P)).await; + } + + + GET -> db -> db (context){ + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = connection.get_world().await; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(data) + ).await; + } + GET -> queries -> query (context){ + let q = context + .get_from_path_query("q") + .and_then(|v| v.parse::().ok()) // safely parse + .unwrap_or(1) // default to 1 if missing or invalid + .clamp(1, 500); + + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = connection.get_worlds(q).await; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(data) + ).await; + } + + GET -> updates -> update (context){ + let q = context + .get_from_path_query("q") + .and_then(|v| v.parse::().ok()) // safely parse + .unwrap_or(1) // default to 1 if missing or invalid + .clamp(1, 500); + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = connection.update(q).await; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(data) + ).await; + } + + + GET -> fortunes -> ft (context){ + + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = match connection.tell_fortune().await { + Ok(r)=>{r}, + _=>{ + _= context.send_str("failed to connect").await; + return + } + }; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","text/html; charset=UTF-8"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(&data) + ).await; + } + + } +} + + + +#[cfg(all(not(feature = "all"),feature = "json_plaintext"))] +WaterController! { + holder -> super::MainType, + shared -> super::SharedType, + name -> EntryController, + functions -> { + + + GET => json => j(cx){ + let mut sender = cx.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _=sender.send_data_as_final_response(http::ResponseData::Slice(super::JSON_RESPONSE)).await; + } + + GET => plaintext => p(cx) { + let mut sender = cx.sender(); + sender.set_header_ef("Content-Type","text/plain; charset=utf-8"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _=sender.send_data_as_final_response(http::ResponseData::Slice(super::P)).await; + } + } +} + +#[cfg(all(not(feature = "all"),feature = "db"))] +WaterController! { + holder -> super::MainType, + shared -> super::SharedType, + name -> EntryController, + functions -> { + + + GET -> db -> db (context){ + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = connection.get_world().await; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(data) + ).await; + } + GET -> queries -> query (context){ + let q = context + .get_from_path_query("q") + .and_then(|v| v.parse::().ok()) // safely parse + .unwrap_or(1) // default to 1 if missing or invalid + .clamp(1, 500); + + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = connection.get_worlds(q).await; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(data) + ).await; + } + + GET -> updates -> update (context){ + let q = context + .get_from_path_query("q") + .and_then(|v| v.parse::().ok()) // safely parse + .unwrap_or(1) // default to 1 if missing or invalid + .clamp(1, 500); + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = connection.update(q).await; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","application/json"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(data) + ).await; + } + + + GET -> fortunes -> ft (context){ + + let connection:Shared = context.thread_shared_struct.clone().unwrap().clone(); + let connection = connection.pg_connection.get_connection(); + let data = match connection.tell_fortune().await { + Ok(r)=>{r}, + _=>{ + _= context.send_str("failed to connect").await; + return + } + }; + let mut sender = context.sender(); + sender.set_header_ef("Content-Type","text/html; charset=UTF-8"); + sender.set_header_ef("Server","water"); + let date = httpdate::fmt_http_date(std::time::SystemTime::now()); + sender.set_header_ef("Date",date); + _= sender.send_data_as_final_response( + http::ResponseData::Slice(&data) + ).await; + } + } +} \ No newline at end of file diff --git a/frameworks/Rust/water-http/templates/fortune.hbs b/frameworks/Rust/water-http/templates/fortune.hbs new file mode 100644 index 00000000000..b219172a075 --- /dev/null +++ b/frameworks/Rust/water-http/templates/fortune.hbs @@ -0,0 +1,5 @@ +Fortunes +{{~# each items ~}} + +{{~/each ~}} +
      idmessage
      {{id}}{{message}}
      diff --git a/frameworks/Rust/water-http/templates/fortune.html b/frameworks/Rust/water-http/templates/fortune.html new file mode 100644 index 00000000000..35923e04b21 --- /dev/null +++ b/frameworks/Rust/water-http/templates/fortune.html @@ -0,0 +1,12 @@ + + +Fortunes + + + + {% for item in items %} + + {% endfor %} +
      idmessage
      {{item.id}}{{item.message}}
      + + diff --git a/frameworks/Rust/water-http/water-http-cached.dockerfile b/frameworks/Rust/water-http/water-http-cached.dockerfile new file mode 100644 index 00000000000..3c873c71520 --- /dev/null +++ b/frameworks/Rust/water-http/water-http-cached.dockerfile @@ -0,0 +1,13 @@ +FROM rust:latest + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /water +WORKDIR /water + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin cache --features cache + +EXPOSE 8080 + +CMD ./target/release/cache \ No newline at end of file diff --git a/frameworks/Rust/water-http/water-http-db.dockerfile b/frameworks/Rust/water-http/water-http-db.dockerfile new file mode 100644 index 00000000000..01d9507b35f --- /dev/null +++ b/frameworks/Rust/water-http/water-http-db.dockerfile @@ -0,0 +1,13 @@ +FROM rust:latest + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /water +WORKDIR /water + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin water-http --features db + +EXPOSE 8080 + +CMD ./target/release/water-http \ No newline at end of file diff --git a/frameworks/Rust/water-http/water-http-json.dockerfile b/frameworks/Rust/water-http/water-http-json.dockerfile new file mode 100644 index 00000000000..4c457496cec --- /dev/null +++ b/frameworks/Rust/water-http/water-http-json.dockerfile @@ -0,0 +1,13 @@ +FROM rust:latest + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /water +WORKDIR /water + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin json --features json_plaintext + +EXPOSE 8080 + +CMD ./target/release/json \ No newline at end of file diff --git a/frameworks/Rust/water-http/water-http-plaintext.dockerfile b/frameworks/Rust/water-http/water-http-plaintext.dockerfile new file mode 100644 index 00000000000..ab53eb54496 --- /dev/null +++ b/frameworks/Rust/water-http/water-http-plaintext.dockerfile @@ -0,0 +1,13 @@ +FROM rust:latest + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /water +WORKDIR /water + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin plaintext --features json_plaintext + +EXPOSE 8080 + +CMD ./target/release/plaintext \ No newline at end of file diff --git a/frameworks/Rust/water-http/water-http.dockerfile b/frameworks/Rust/water-http/water-http.dockerfile new file mode 100644 index 00000000000..5946c8b3821 --- /dev/null +++ b/frameworks/Rust/water-http/water-http.dockerfile @@ -0,0 +1,13 @@ +FROM rust:latest + +RUN apt-get update -yqq && apt-get install -yqq cmake g++ + +ADD ./ /water +WORKDIR /water + +RUN cargo clean +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin water-http --features all + +EXPOSE 8080 + +CMD ./target/release/water-http \ No newline at end of file From 5eb97c441a53a7cb21b55021114e5574d6318bfc Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Nov 2025 17:48:01 +0100 Subject: [PATCH 1734/1766] [ruby] Add rack-app (#10257) rack-app is a minimalist web framework that focuses on simplicity and maintainability. The framework is meant to be used by seasoned web developers. --- frameworks/Ruby/rack-app/Gemfile | 13 ++++ frameworks/Ruby/rack-app/Gemfile.lock | 51 +++++++++++++ frameworks/Ruby/rack-app/README.md | 44 +++++++++++ frameworks/Ruby/rack-app/app.rb | 76 +++++++++++++++++++ .../Ruby/rack-app/app/fortunes.html.erb | 12 +++ .../Ruby/rack-app/benchmark_config.json | 27 +++++++ frameworks/Ruby/rack-app/boot.rb | 68 +++++++++++++++++ frameworks/Ruby/rack-app/config.ru | 5 ++ frameworks/Ruby/rack-app/config/auto_tune.rb | 43 +++++++++++ frameworks/Ruby/rack-app/config/puma.rb | 10 +++ frameworks/Ruby/rack-app/rack-app.dockerfile | 21 +++++ 11 files changed, 370 insertions(+) create mode 100644 frameworks/Ruby/rack-app/Gemfile create mode 100644 frameworks/Ruby/rack-app/Gemfile.lock create mode 100644 frameworks/Ruby/rack-app/README.md create mode 100644 frameworks/Ruby/rack-app/app.rb create mode 100644 frameworks/Ruby/rack-app/app/fortunes.html.erb create mode 100644 frameworks/Ruby/rack-app/benchmark_config.json create mode 100644 frameworks/Ruby/rack-app/boot.rb create mode 100644 frameworks/Ruby/rack-app/config.ru create mode 100644 frameworks/Ruby/rack-app/config/auto_tune.rb create mode 100644 frameworks/Ruby/rack-app/config/puma.rb create mode 100644 frameworks/Ruby/rack-app/rack-app.dockerfile diff --git a/frameworks/Ruby/rack-app/Gemfile b/frameworks/Ruby/rack-app/Gemfile new file mode 100644 index 00000000000..2ad03adfb21 --- /dev/null +++ b/frameworks/Ruby/rack-app/Gemfile @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gem 'rack-app' +gem 'rack-app-front_end' +gem 'iodine', '~> 0.7', platforms: %i[ruby windows] +gem 'irb' # for Ruby 3.5 +gem 'logger' # for Ruby 3.5 +gem 'json', '~> 2.10' +gem 'pg', '~> 1.5' +gem 'sequel', '~> 5.0' +gem 'sequel_pg', '~> 1.6', require: false diff --git a/frameworks/Ruby/rack-app/Gemfile.lock b/frameworks/Ruby/rack-app/Gemfile.lock new file mode 100644 index 00000000000..7da89e051ce --- /dev/null +++ b/frameworks/Ruby/rack-app/Gemfile.lock @@ -0,0 +1,51 @@ +GEM + remote: https://rubygems.org/ + specs: + concurrent-ruby (1.3.5) + date (3.5.0) + erb (5.1.3) + io-console (0.8.1) + irb (1.15.3) + pp (>= 0.6.0) + rdoc (>= 4.0.0) + reline (>= 0.4.2) + json (2.15.2) + logger (1.7.0) + nio4r (2.7.5) + pp (0.6.3) + prettyprint + prettyprint (0.2.0) + psych (5.2.6) + date + stringio + puma (7.1.0) + nio4r (~> 2.0) + rack (3.2.4) + rack-app (11.0.2) + rack (>= 3.0.0) + rackup + rackup (2.2.1) + rack (>= 3) + rdoc (6.15.1) + erb + psych (>= 4.0.0) + tsort + reline (0.6.2) + io-console (~> 0.5) + stringio (3.1.7) + tsort (0.2.0) + +PLATFORMS + arm64-darwin-24 + ruby + +DEPENDENCIES + concurrent-ruby + irb + json (~> 2.10) + logger + puma (~> 7.1) + rack-app + +BUNDLED WITH + 2.7.2 diff --git a/frameworks/Ruby/rack-app/README.md b/frameworks/Ruby/rack-app/README.md new file mode 100644 index 00000000000..585c970919e --- /dev/null +++ b/frameworks/Ruby/rack-app/README.md @@ -0,0 +1,44 @@ +# Rack-app Benchmarking Test + +rack-app is a minimalist web framework that focuses on simplicity and +maintainability. The framework is meant to be used by seasoned web developers. + +https://github.com/rack-app/rack-app + +### Test Type Implementation Source Code + +* [JSON Serialization](app.rb): "/json" +* [Single Database Query](app.rb): "/db" +* [Multiple Database Queries](app.rb): "/db?queries={#}" +* [Fortunes](app.rb): "/fortune" +* [Plaintext](app.rb): "/plaintext" + +## Important Libraries + +The tests were run with: + +* [Sequel](https://rubygems.org/gems/sequel) +* [PG](https://rubygems.org/gems/pg) + +## Test URLs + +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext + +### DB + +http://localhost:8080/db + +### QUERY + +http://localhost:8080/queries?queries= + +### FORTUNES + +http://localhost:8080/fortunes + diff --git a/frameworks/Ruby/rack-app/app.rb b/frameworks/Ruby/rack-app/app.rb new file mode 100644 index 00000000000..e5310fc012d --- /dev/null +++ b/frameworks/Ruby/rack-app/app.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +require 'rack/app' +require 'rack/app/front_end' +require 'json' + +class App < Rack::App + MAX_PK = 10_000 + ID_RANGE = (1..10_000).freeze + ALL_IDS = ID_RANGE.to_a + QUERIES_MIN = 1 + QUERIES_MAX = 500 + JSON_TYPE = 'application/json' + HTML_TYPE = 'text/html; charset=utf-8' + PLAINTEXT_TYPE = 'text/plain' + + apply_extensions :front_end + + helpers do + def fortunes + fortunes = Fortune.all + fortunes << Fortune.new( + id: 0, + message: "Additional fortune added at request time." + ) + fortunes.sort_by!(&:message) + end + end + + get '/json' do + set_headers(JSON_TYPE) + { message: 'Hello, World!' }.to_json + end + + get '/db' do + set_headers(JSON_TYPE) + World.with_pk(rand1).values.to_json + end + + get '/queries' do + set_headers(JSON_TYPE) + ids = ALL_IDS.sample(bounded_queries) + DB.synchronize do + ids.map do |id| + World.with_pk(id).values + end + end.to_json + end + + get '/fortunes' do + set_headers(HTML_TYPE) + render 'fortunes.html.erb' + end + + get '/plaintext' do + set_headers(PLAINTEXT_TYPE) + 'Hello, World!' + end + + private + + # Return a random number between 1 and MAX_PK + def rand1 + rand(MAX_PK).succ + end + + def bounded_queries + queries = params['queries'].to_i + queries.clamp(QUERIES_MIN, QUERIES_MAX) + end + + def set_headers(content_type) + response.headers[::Rack::CONTENT_TYPE] = content_type + response.headers['Server'] = 'rack-app' + end +end diff --git a/frameworks/Ruby/rack-app/app/fortunes.html.erb b/frameworks/Ruby/rack-app/app/fortunes.html.erb new file mode 100644 index 00000000000..56c5c540270 --- /dev/null +++ b/frameworks/Ruby/rack-app/app/fortunes.html.erb @@ -0,0 +1,12 @@ + + + Fortunes + + + + <% fortunes.each do |record| %> + + <% end %> +
      idmessage
      <%= record.id %><%= ERB::Escape.html_escape(record.message) %>
      + + diff --git a/frameworks/Ruby/rack-app/benchmark_config.json b/frameworks/Ruby/rack-app/benchmark_config.json new file mode 100644 index 00000000000..d25acd9a641 --- /dev/null +++ b/frameworks/Ruby/rack-app/benchmark_config.json @@ -0,0 +1,27 @@ +{ + "framework": "rack-app", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "orm": "Full", + "database": "Postgres", + "framework": "rack-app", + "language": "Ruby", + "platform": "Mri", + "webserver": "Iodine", + "os": "Linux", + "database_os": "Linux", + "display_name": "rack-app", + "notes": "" + } + } + ] +} diff --git a/frameworks/Ruby/rack-app/boot.rb b/frameworks/Ruby/rack-app/boot.rb new file mode 100644 index 00000000000..7711f76a0a1 --- /dev/null +++ b/frameworks/Ruby/rack-app/boot.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +require 'bundler/setup' +require 'time' + +MAX_PK = 10_000 +ID_RANGE = (1..MAX_PK).freeze +ALL_IDS = ID_RANGE.to_a +QUERIES_MIN = 1 +QUERIES_MAX = 500 +SEQUEL_NO_ASSOCIATIONS = true +#SERVER_STRING = "Sinatra" + +Bundler.require(:default) # Load core modules + +def connect(dbtype) + Bundler.require(dbtype) # Load database-specific modules + + opts = {} + + adapter = 'postgresql' + + # Determine threading/thread pool size and timeout + if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 + opts[:max_connections] = threads + opts[:pool_timeout] = 10 + else + opts[:max_connections] = 512 + end + + Sequel.connect \ + '%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}' % { + adapter: adapter, + host: 'tfb-database', + database: 'hello_world', + user: 'benchmarkdbuser', + password: 'benchmarkdbpass' + }, opts +end + +DB = connect 'postgres' + +# Define ORM models +class World < Sequel::Model(:World) + def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql + + def self.batch_update(worlds) + if DB.database_type == :mysql + worlds.map(&:save_changes) + else + ids = [] + sql = String.new("UPDATE world SET randomnumber = CASE id ") + worlds.each do |world| + sql << "when #{world.id} then #{world.randomnumber} " + ids << world.id + end + sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})" + DB.run(sql) + end + end +end + +class Fortune < Sequel::Model(:Fortune) + # Allow setting id to zero (0) per benchmark requirements + unrestrict_primary_key +end + +[World, Fortune].each(&:freeze) +DB.freeze diff --git a/frameworks/Ruby/rack-app/config.ru b/frameworks/Ruby/rack-app/config.ru new file mode 100644 index 00000000000..27540c2f4ee --- /dev/null +++ b/frameworks/Ruby/rack-app/config.ru @@ -0,0 +1,5 @@ +# frozen_string_literal: true +require_relative 'boot' +require_relative 'app' + +run App diff --git a/frameworks/Ruby/rack-app/config/auto_tune.rb b/frameworks/Ruby/rack-app/config/auto_tune.rb new file mode 100644 index 00000000000..1e075f56911 --- /dev/null +++ b/frameworks/Ruby/rack-app/config/auto_tune.rb @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# Instantiate about one process per X MiB of available memory, scaling up to as +# close to MAX_THREADS as possible while observing an upper bound based on the +# number of virtual/logical CPUs. If there are fewer processes than +# MAX_THREADS, add threads per process to reach MAX_THREADS. +require 'etc' + +KB_PER_WORKER = 64 * 1_024 # average of peak PSS of single-threaded processes (watch smem -k) +MIN_WORKERS = 2 +MAX_WORKERS_PER_VCPU = 1.25 # virtual/logical +MIN_THREADS_PER_WORKER = 1 +MAX_THREADS = Integer(ENV['MAX_CONCURRENCY'] || 256) + +def meminfo(arg) + File.open('/proc/meminfo') do |f| + f.each_line do |line| + key, value = line.split(/:\s+/) + return value.split(/\s+/).first.to_i if key == arg + end + end + + raise "Unable to find `#{arg}' in /proc/meminfo!" +end + +def auto_tune + avail_mem = meminfo('MemAvailable') * 0.8 - MAX_THREADS * 1_024 + + workers = [ + [(1.0 * avail_mem / KB_PER_WORKER).floor, MIN_WORKERS].max, + [(Etc.nprocessors * MAX_WORKERS_PER_VCPU).ceil, MIN_WORKERS].max + ].min + + threads_per_worker = [ + workers < MAX_THREADS ? (1.0 * MAX_THREADS / workers).ceil : -Float::INFINITY, + MIN_THREADS_PER_WORKER + ].max + + [workers, threads_per_worker] +end + +p auto_tune if $PROGRAM_NAME == __FILE__ diff --git a/frameworks/Ruby/rack-app/config/puma.rb b/frameworks/Ruby/rack-app/config/puma.rb new file mode 100644 index 00000000000..1b6d05d8ac0 --- /dev/null +++ b/frameworks/Ruby/rack-app/config/puma.rb @@ -0,0 +1,10 @@ +require_relative 'auto_tune' + +# FWBM only... use the puma_auto_tune gem in production! +_num_workers, num_threads = auto_tune + +threads num_threads + +before_fork do + Sequel::DATABASES.each(&:disconnect) +end diff --git a/frameworks/Ruby/rack-app/rack-app.dockerfile b/frameworks/Ruby/rack-app/rack-app.dockerfile new file mode 100644 index 00000000000..2b24fcab8bd --- /dev/null +++ b/frameworks/Ruby/rack-app/rack-app.dockerfile @@ -0,0 +1,21 @@ +FROM ruby:3.5-rc + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +WORKDIR /rack-app + +COPY Gemfile* ./ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle install --jobs=8 + +COPY . . + +EXPOSE 8080 + +CMD bundle exec iodine -p 8080 -w $(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From 2dafb0cb24a52f853a0f6339138997d3f48866f9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Nov 2025 17:48:45 +0100 Subject: [PATCH 1735/1766] [ruby/padrino] Only test with Iodine (#10258) Unicorn is no longer maintained. Replace Puma with Iodine, as it performs better than Puma in these benchmarks. --- frameworks/Ruby/padrino/Gemfile | 8 +- frameworks/Ruby/padrino/Gemfile.lock | 12 +- frameworks/Ruby/padrino/README.md | 9 +- frameworks/Ruby/padrino/benchmark_config.json | 28 +--- frameworks/Ruby/padrino/config.toml | 21 +-- frameworks/Ruby/padrino/config/nginx.conf | 158 ------------------ frameworks/Ruby/padrino/config/puma.rb | 9 - frameworks/Ruby/padrino/config/unicorn.rb | 15 -- .../Ruby/padrino/padrino-unicorn.dockerfile | 23 --- frameworks/Ruby/padrino/padrino.dockerfile | 5 +- 10 files changed, 14 insertions(+), 274 deletions(-) delete mode 100644 frameworks/Ruby/padrino/config/nginx.conf delete mode 100644 frameworks/Ruby/padrino/config/puma.rb delete mode 100644 frameworks/Ruby/padrino/config/unicorn.rb delete mode 100644 frameworks/Ruby/padrino/padrino-unicorn.dockerfile diff --git a/frameworks/Ruby/padrino/Gemfile b/frameworks/Ruby/padrino/Gemfile index 3e643448adb..8ccd7f58765 100644 --- a/frameworks/Ruby/padrino/Gemfile +++ b/frameworks/Ruby/padrino/Gemfile @@ -8,10 +8,6 @@ gem 'slim', '2.0.3' gem 'padrino', git: 'https://github.com/padrino/padrino-framework.git' gem 'rack' -group :puma, optional: true do - gem 'puma', '~> 7.1', require: false -end - -group :unicorn, optional: true do - gem 'unicorn', '~> 6.1', platforms: [:ruby, :windows], require: false +group :iodine, optional: true do + gem "iodine", "~> 0.7", require: false end diff --git a/frameworks/Ruby/padrino/Gemfile.lock b/frameworks/Ruby/padrino/Gemfile.lock index 45c6deadd77..3636648c76e 100644 --- a/frameworks/Ruby/padrino/Gemfile.lock +++ b/frameworks/Ruby/padrino/Gemfile.lock @@ -66,8 +66,8 @@ GEM drb (2.2.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + iodine (0.7.58) json (2.11.3) - kgio (2.11.4) logger (1.6.6) mail (2.8.1) mini_mime (>= 0.1.1) @@ -93,9 +93,6 @@ GEM timeout net-smtp (0.5.1) net-protocol - nio4r (2.7.4) - puma (7.1.0) - nio4r (~> 2.0) rack (3.1.18) rack-protection (4.1.1) base64 (>= 0.1.0) @@ -106,7 +103,6 @@ GEM rack (>= 3.0.0) rackup (2.2.1) rack (>= 3) - raindrops (0.20.1) ruby2_keywords (0.0.5) securerandom (0.4.1) sinatra (4.1.1) @@ -125,9 +121,6 @@ GEM timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) uri (1.0.3) PLATFORMS @@ -137,13 +130,12 @@ PLATFORMS DEPENDENCIES activerecord (>= 7.1) + iodine (~> 0.7) json mysql2 (> 0.5) padrino! - puma (~> 7.1) rack slim (= 2.0.3) - unicorn (~> 6.1) BUNDLED WITH 2.7.0 diff --git a/frameworks/Ruby/padrino/README.md b/frameworks/Ruby/padrino/README.md index c0c1e7601fe..9d11b9ef5a4 100644 --- a/frameworks/Ruby/padrino/README.md +++ b/frameworks/Ruby/padrino/README.md @@ -11,14 +11,9 @@ comparing a variety of web servers. ## Infrastructure Software Versions The tests were run with: -* [Ruby 2.0.0-p0](http://www.ruby-lang.org/) -* [JRuby 1.7.8](http://jruby.org/) -* [Rubinius 2.2.10](http://rubini.us/) +* [Ruby 3.5](http://www.ruby-lang.org/) * [Padrino 0.12.3](http://www.padrinorb.com/) -* [Rack 1.5.2](http://rack.github.com/) -* [Unicorn 4.8.3](http://unicorn.bogomips.org/) -* [Puma 3.9](http://puma.io/) -* [Thin 1.6.2](http://code.macournoyer.com/thin/) +* [Iodine](https://github.com/boazsegev/iodine) ## Paths & Source for Tests diff --git a/frameworks/Ruby/padrino/benchmark_config.json b/frameworks/Ruby/padrino/benchmark_config.json index 1b467408cc2..0eaf86be1d9 100644 --- a/frameworks/Ruby/padrino/benchmark_config.json +++ b/frameworks/Ruby/padrino/benchmark_config.json @@ -2,28 +2,6 @@ "framework": "padrino", "tests": [{ "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "padrino", - "language": "Ruby", - "orm": "Full", - "platform": "Rack", - "webserver": "Puma", - "os": "Linux", - "database_os": "Linux", - "display_name": "padrino [puma]", - "notes": "", - "versus": "rack-puma-mri" - }, - "unicorn": { "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", @@ -38,12 +16,12 @@ "language": "Ruby", "orm": "Full", "platform": "Rack", - "webserver": "Unicorn", + "webserver": "Iodine", "os": "Linux", "database_os": "Linux", - "display_name": "padrino [unicorn]", + "display_name": "padrino", "notes": "", - "versus": "rack-unicorn" + "versus": "rack-iodine" } }] } diff --git a/frameworks/Ruby/padrino/config.toml b/frameworks/Ruby/padrino/config.toml index 795c2789614..e5103e75fa5 100644 --- a/frameworks/Ruby/padrino/config.toml +++ b/frameworks/Ruby/padrino/config.toml @@ -15,22 +15,5 @@ database_os = "Linux" os = "Linux" orm = "Full" platform = "Rack" -webserver = "Puma" -versus = "rack-puma-mri" - -[unicorn] -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 = "MySQL" -database_os = "Linux" -os = "Linux" -orm = "Full" -platform = "Rack" -webserver = "Unicorn" -versus = "rack-unicorn" +webserver = "Iodine" +versus = "rack-iodine" diff --git a/frameworks/Ruby/padrino/config/nginx.conf b/frameworks/Ruby/padrino/config/nginx.conf deleted file mode 100644 index 83d4479f28d..00000000000 --- a/frameworks/Ruby/padrino/config/nginx.conf +++ /dev/null @@ -1,158 +0,0 @@ -# This is example contains the bare mininum to get nginx going with -# Unicorn or Rainbows! servers. Generally these configuration settings -# are applicable to other HTTP application servers (and not just Ruby -# ones), so if you have one working well for proxying another app -# server, feel free to continue using it. -# -# The only setting we feel strongly about is the fail_timeout=0 -# directive in the "upstream" block. max_fails=0 also has the same -# effect as fail_timeout=0 for current versions of nginx and may be -# used in its place. -# -# Users are strongly encouraged to refer to nginx documentation for more -# details and search for other example configs. - -# you generally only need one nginx worker unless you're serving -# large amounts of static files which require blocking disk reads -worker_processes 8; - -# # drop privileges, root is needed on most systems for binding to port 80 -# # (or anything < 1024). Capability-based security may be available for -# # your system and worth checking out so you won't need to be root to -# # start nginx to bind on 80 -# user nobody nogroup; # for systems with a "nogroup" -#user nobody nobody; # for systems with "nobody" as a group instead - -# Feel free to change all paths to suite your needs here, of course -pid /tmp/nginx.pid; -#error_log /tmp/nginx.error.log; -error_log stderr error; - -events { - worker_connections 4096; # increase if you have lots of clients - accept_mutex off; # "on" if nginx worker_processes > 1 - use epoll; # enable for Linux 2.6+ - # use kqueue; # enable for FreeBSD, OSX -} - -http { - # nginx will find this file in the config directory set at nginx build time - include /etc/nginx/mime.types; - - # fallback in case we can't determine a type - default_type application/octet-stream; - - # click tracking! - #access_log /tmp/nginx.access.log combined; - access_log off; - - # you generally want to serve static files with nginx since neither - # Unicorn nor Rainbows! is optimized for it at the moment - sendfile on; - - tcp_nopush on; # off may be better for *some* Comet/long-poll stuff - tcp_nodelay off; # on may be better for some Comet/long-poll stuff - - # we haven't checked to see if Rack::Deflate on the app server is - # faster or not than doing compression via nginx. It's easier - # to configure it all in one place here for static files and also - # to disable gzip for clients who don't get gzip/deflate right. - # There are other gzip settings that may be needed used to deal with - # bad clients out there, see http://wiki.nginx.org/NginxHttpGzipModule - #gzip on; - #gzip_http_version 1.0; - #gzip_proxied any; - #gzip_min_length 500; - #gzip_disable "MSIE [1-6]\."; - #gzip_types text/plain text/html text/xml text/css - # text/comma-separated-values - # text/javascript application/x-javascript - # application/atom+xml; - - # this can be any application server, not just Unicorn/Rainbows! - upstream app_server { - # fail_timeout=0 means we always retry an upstream even if it failed - # to return a good HTTP response (in case the Unicorn master nukes a - # single worker for timing out). - - # for UNIX domain socket setups: - server unix:/tmp/.sock fail_timeout=0; - - # for TCP setups, point these to your backend servers - # server 192.168.0.7:8080 fail_timeout=0; - # server 192.168.0.8:8080 fail_timeout=0; - # server 192.168.0.9:8080 fail_timeout=0; - } - - server { - # enable one of the following if you're on Linux or FreeBSD - listen 8080 default deferred; # for Linux - # listen 80 default accept_filter=httpready; # for FreeBSD - - # If you have IPv6, you'll likely want to have two separate listeners. - # One on IPv4 only (the default), and another on IPv6 only instead - # of a single dual-stack listener. A dual-stack listener will make - # for ugly IPv4 addresses in $remote_addr (e.g ":ffff:10.0.0.1" - # instead of just "10.0.0.1") and potentially trigger bugs in - # some software. - # listen [::]:80 ipv6only=on; # deferred or accept_filter recommended - - client_max_body_size 4G; - server_name _; - - # ~2 seconds is often enough for most folks to parse HTML/CSS and - # retrieve needed images/icons/frames, connections are cheap in - # nginx so increasing this is generally safe... - keepalive_timeout 10; - - # path for static files - root /path/to/app/current/public; - - # Prefer to serve static files directly from nginx to avoid unnecessary - # data copies from the application server. - # - # try_files directive appeared in in nginx 0.7.27 and has stabilized - # over time. Older versions of nginx (e.g. 0.6.x) requires - # "if (!-f $request_filename)" which was less efficient: - # http://bogomips.org/unicorn.git/tree/examples/nginx.conf?id=v3.3.1#n127 - try_files $uri/index.html $uri.html $uri @app; - - location @app { - # an HTTP header important enough to have its own Wikipedia entry: - # http://en.wikipedia.org/wiki/X-Forwarded-For - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # enable this if you forward HTTPS traffic to unicorn, - # this helps Rack set the proper URL scheme for doing redirects: - # proxy_set_header X-Forwarded-Proto $scheme; - - # pass the Host: header from the client right along so redirects - # can be set properly within the Rack application - proxy_set_header Host $http_host; - - # we don't want nginx trying to do something clever with - # redirects, we set the Host: header above already. - proxy_redirect off; - - # set "proxy_buffering off" *only* for Rainbows! when doing - # Comet/long-poll/streaming. It's also safe to set if you're using - # only serving fast clients with Unicorn + nginx, but not slow - # clients. You normally want nginx to buffer responses to slow - # clients, even with Rails 3.1 streaming because otherwise a slow - # client can become a bottleneck of Unicorn. - # - # The Rack application may also set "X-Accel-Buffering (yes|no)" - # in the response headers do disable/enable buffering on a - # per-response basis. - # proxy_buffering off; - - proxy_pass http://app_server; - } - - # Rails error pages - error_page 500 502 503 504 /500.html; - location = /500.html { - root /path/to/app/current/public; - } - } -} diff --git a/frameworks/Ruby/padrino/config/puma.rb b/frameworks/Ruby/padrino/config/puma.rb deleted file mode 100644 index 8a42642fd61..00000000000 --- a/frameworks/Ruby/padrino/config/puma.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative 'auto_tune' - -num_workers, num_threads = auto_tune - -workers num_workers -threads num_threads, num_threads - -environment 'production' -bind 'tcp://0.0.0.0:8080' diff --git a/frameworks/Ruby/padrino/config/unicorn.rb b/frameworks/Ruby/padrino/config/unicorn.rb deleted file mode 100644 index 9ca3171328b..00000000000 --- a/frameworks/Ruby/padrino/config/unicorn.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative 'auto_tune' - -num_workers, = auto_tune - -worker_processes num_workers -listen "/tmp/.sock", :backlog => 4096 - -preload_app true -GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true - -before_fork do |server, worker| -end - -after_fork do |server, worker| -end diff --git a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile b/frameworks/Ruby/padrino/padrino-unicorn.dockerfile deleted file mode 100644 index 81a6e0fefda..00000000000 --- a/frameworks/Ruby/padrino/padrino-unicorn.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ruby:3.4 - -WORKDIR /padrino -COPY app app -COPY config config -COPY models models -COPY .components .components -COPY config.ru config.ru -COPY Gemfile Gemfile -COPY Gemfile.lock Gemfile.lock -COPY Rakefile Rakefile - -RUN bundle config set with 'unicorn' -RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile - -RUN apt-get update -yqq && apt-get install -yqq nginx - -EXPOSE 8080 - -ENV RUBY_YJIT_ENABLE=1 - -CMD nginx -c /padrino/config/nginx.conf && \ - bundle exec unicorn -E production -c config/unicorn.rb diff --git a/frameworks/Ruby/padrino/padrino.dockerfile b/frameworks/Ruby/padrino/padrino.dockerfile index fc6ba9456d3..57fe29b1034 100644 --- a/frameworks/Ruby/padrino/padrino.dockerfile +++ b/frameworks/Ruby/padrino/padrino.dockerfile @@ -10,11 +10,12 @@ COPY Gemfile Gemfile COPY Gemfile.lock Gemfile.lock COPY Rakefile Rakefile -RUN bundle config set with 'puma' +RUN bundle config set with 'iodine' RUN bundle install --jobs=4 --gemfile=/padrino/Gemfile EXPOSE 8080 ENV RUBY_YJIT_ENABLE=1 +ENV RACK_ENV=production -CMD bundle exec puma -C config/puma.rb +CMD bundle exec iodine -p 8080 -w $(ruby config/auto_tune.rb | grep -Eo '[0-9]+' | head -n 1) From 1231b12cf2346f5242965a5b20d765b39b4e1986 Mon Sep 17 00:00:00 2001 From: rio Date: Wed, 12 Nov 2025 01:49:27 +0900 Subject: [PATCH 1736/1766] [python/cherrypy] Update python 3.13 (#10259) increase queue_size for pass DB job --- frameworks/Python/cherrypy/app.py | 4 +-- .../Python/cherrypy/benchmark_config.json | 25 +------------------ .../Python/cherrypy/cherrypy-py3.dockerfile | 11 -------- .../Python/cherrypy/cherrypy.dockerfile | 6 ++--- frameworks/Python/cherrypy/requirements.txt | 14 ++++------- 5 files changed, 11 insertions(+), 49 deletions(-) delete mode 100644 frameworks/Python/cherrypy/cherrypy-py3.dockerfile diff --git a/frameworks/Python/cherrypy/app.py b/frameworks/Python/cherrypy/app.py index bf090cfd69b..d92177d379c 100755 --- a/frameworks/Python/cherrypy/app.py +++ b/frameworks/Python/cherrypy/app.py @@ -153,8 +153,8 @@ def fortunes(self): cherrypy.tools.db = SATool() cherrypy.server.socket_host = '0.0.0.0' cherrypy.server.socket_port = 8080 - cherrypy.server.thread_pool = workers - cherrypy.server.socket_queue_size = 25 + cherrypy.server.thread_pool = workers * 2 + cherrypy.server.socket_queue_size = 100 cherrypy.quickstart(CherryPyBenchmark(), '', { '/': { diff --git a/frameworks/Python/cherrypy/benchmark_config.json b/frameworks/Python/cherrypy/benchmark_config.json index 62e51834960..9d4f3c1c8ef 100644 --- a/frameworks/Python/cherrypy/benchmark_config.json +++ b/frameworks/Python/cherrypy/benchmark_config.json @@ -2,29 +2,6 @@ "framework": "cherrypy", "tests": [{ "default": { - "json_url": "/json", - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "None", - "language": "Python", - "flavor": "Python2", - "orm": "Full", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "CherryPy [py2]", - "notes": "CPython 2.7", - "tags": ["broken"] - }, - "py3": { "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", @@ -44,7 +21,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "CherryPy", - "notes": "CPython 3.9" + "notes": "CPython 3.13" } }] } diff --git a/frameworks/Python/cherrypy/cherrypy-py3.dockerfile b/frameworks/Python/cherrypy/cherrypy-py3.dockerfile deleted file mode 100644 index 8a8af2211d8..00000000000 --- a/frameworks/Python/cherrypy/cherrypy-py3.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.9-bullseye - -ADD ./ /cherrypy - -WORKDIR /cherrypy - -RUN pip3 install -r /cherrypy/requirements.txt - -EXPOSE 8080 - -CMD python3 app.py diff --git a/frameworks/Python/cherrypy/cherrypy.dockerfile b/frameworks/Python/cherrypy/cherrypy.dockerfile index ccf988da6a6..eae3768b5fe 100644 --- a/frameworks/Python/cherrypy/cherrypy.dockerfile +++ b/frameworks/Python/cherrypy/cherrypy.dockerfile @@ -1,11 +1,11 @@ -FROM python:2.7.15-stretch +FROM python:3.13-bullseye ADD ./ /cherrypy WORKDIR /cherrypy -RUN pip install -r /cherrypy/requirements.txt +RUN pip3 install -r /cherrypy/requirements.txt EXPOSE 8080 -CMD python app.py +CMD python3 app.py diff --git a/frameworks/Python/cherrypy/requirements.txt b/frameworks/Python/cherrypy/requirements.txt index fc63cbf2a2a..f71069db433 100644 --- a/frameworks/Python/cherrypy/requirements.txt +++ b/frameworks/Python/cherrypy/requirements.txt @@ -1,10 +1,6 @@ -cheroot==8.6.0 -CherryPy==17.4.2 ; python_version=='2.7' CherryPy==18.8.0 ; python_version>'3.5' -more-itertools==4.1.0 -mysqlclient==1.3.12 -portend==2.2 -pytz==2017.3 -six==1.11.0 -SQLAlchemy==1.4.47 -tempora==1.10 +mysqlclient==2.2.4 +pytz==2024.1 +SQLAlchemy==1.4.53 +six==1.17.0 +legacy-cgi==2.6.4 \ No newline at end of file From 4629cb33180037918ba4f29523fbbb809c7b1a27 Mon Sep 17 00:00:00 2001 From: Shyam <140629171+Shyam20001@users.noreply.github.com> Date: Tue, 11 Nov 2025 22:20:11 +0530 Subject: [PATCH 1737/1766] Updated brahma-firelight with CLUSTER mode (#10261) * brahma-firelight added * cluster mode enabled --- .../brahma-firelight/benchmark_config.json | 36 ++++++------ .../brahma-firelight.dockerfile | 22 ++++++-- .../TypeScript/brahma-firelight/bun.lock | 4 +- .../TypeScript/brahma-firelight/package.json | 2 +- .../TypeScript/brahma-firelight/src/main.ts | 55 +++++++++++++------ 5 files changed, 78 insertions(+), 41 deletions(-) diff --git a/frameworks/TypeScript/brahma-firelight/benchmark_config.json b/frameworks/TypeScript/brahma-firelight/benchmark_config.json index 5ebbb896e7e..60db94104a9 100644 --- a/frameworks/TypeScript/brahma-firelight/benchmark_config.json +++ b/frameworks/TypeScript/brahma-firelight/benchmark_config.json @@ -1,21 +1,23 @@ { "framework": "brahma-firelight", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "framework": "brahma-firelight", - "language": "TypeScript", - "flavor": "bun", - "platform": "bun", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "brahma-firelight", - "versus": "nodejs" + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "brahma-firelight", + "language": "TypeScript", + "flavor": "bun", + "platform": "bun", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "brahma-firelight", + "versus": "nodejs" + } } - }] + ] } diff --git a/frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile b/frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile index dd682eba23f..4ae04a5efbf 100644 --- a/frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile +++ b/frameworks/TypeScript/brahma-firelight/brahma-firelight.dockerfile @@ -1,13 +1,25 @@ -FROM oven/bun:1.3 - +FROM oven/bun:1.3 AS builder WORKDIR /app -COPY . . +COPY package.json bun.lock ./ -RUN bun install +RUN bun ci +COPY . . RUN bun run build +FROM oven/bun:1.3 AS runtime +WORKDIR /app + +ENV NODE_ENV=production +ENV PORT=8080 + +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json + +ENV NODE_ENV=production + EXPOSE 8080 -CMD ["bun", "dist/main.js"] +ENTRYPOINT ["bun", "dist/main.js"] diff --git a/frameworks/TypeScript/brahma-firelight/bun.lock b/frameworks/TypeScript/brahma-firelight/bun.lock index a24e46c51c5..067ff9b71e3 100644 --- a/frameworks/TypeScript/brahma-firelight/bun.lock +++ b/frameworks/TypeScript/brahma-firelight/bun.lock @@ -4,7 +4,7 @@ "": { "name": "brahma-firelight", "dependencies": { - "brahma-firelight": "1.5.16", + "brahma-firelight": "^1.5.18", }, "devDependencies": { "@types/bun": "latest", @@ -21,7 +21,7 @@ "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], - "brahma-firelight": ["brahma-firelight@1.5.16", "", {}, "sha512-KwqrG3EHBcEYiOjjx7UvZ4TDxnKTP+DPjnQQqblKuHQcS/mw35NzIYf01YnBZLRM/9VZrb5+UrDaNmrAPZGYlw=="], + "brahma-firelight": ["brahma-firelight@1.5.18", "", {}, "sha512-/raDDeb6/AAHYPfvTi4vWA79BjsHwh5Eg63GWJPwWzyip3mvY0tIsNeMqHit4XBdyJZ9t0UgtsvNaHGx3zqFGw=="], "bun-types": ["bun-types@1.3.1", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw=="], diff --git a/frameworks/TypeScript/brahma-firelight/package.json b/frameworks/TypeScript/brahma-firelight/package.json index dbe9f089100..c7b49a791fd 100644 --- a/frameworks/TypeScript/brahma-firelight/package.json +++ b/frameworks/TypeScript/brahma-firelight/package.json @@ -14,6 +14,6 @@ "typescript": "^5" }, "dependencies": { - "brahma-firelight": "1.5.16" + "brahma-firelight": "^1.5.18" } } \ No newline at end of file diff --git a/frameworks/TypeScript/brahma-firelight/src/main.ts b/frameworks/TypeScript/brahma-firelight/src/main.ts index 639d33f3085..3583f916605 100644 --- a/frameworks/TypeScript/brahma-firelight/src/main.ts +++ b/frameworks/TypeScript/brahma-firelight/src/main.ts @@ -1,10 +1,13 @@ import { createApp, type Response, type Request, type App, type NextFunction, type Handler } from "brahma-firelight"; +import cluster from "node:cluster"; +import os from "node:os"; const app: App = createApp(); // Server Config Middleware const serverInfo: Handler = (_req: Request, res: Response, next?: NextFunction) => { res.setHeader("Server", "brahma-firelight"); + res.setHeader("Connection", "keep-alive") next?.(); }; @@ -19,19 +22,39 @@ app.get("/plaintext", serverInfo, (_req: Request, res: Response) => { }); // Port & Host - -app.listen("0.0.0.0", 8080); - -// Enable built in Graceful Shutdown (optional for production use) - -process.on('SIGINT', async () => { - console.log('SIGINT → shutting down...'); - await app.close(2000); // wait up to 2s for requests - process.exit(0); -}); - -process.on('SIGTERM', async () => { - console.log('SIGTERM → shutting down...'); - await app.close(2000); - process.exit(0); -}); \ No newline at end of file +const PORT = process.env.PORT || 8080; +const HOST = process.env.HOST || "0.0.0.0"; + +// Single CORE +//app.listen(HOST, +PORT); + +// Multi CORE (cluster with max cpus available) +if (cluster.isPrimary) { + const cpuCount = os.cpus().length; + console.log(`Primary ${process.pid} running → forking ${cpuCount} workers...`); + + for (let i = 0; i < cpuCount; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker) => { + console.log(`Worker ${worker.process.pid} died → restarting...`); + cluster.fork(); + }); +} else { + app.listen(HOST, +PORT); +} + +// // Enable built in Graceful Shutdown (optional for production use) + +// process.on('SIGINT', async () => { +// console.log('SIGINT → shutting down...'); +// await app.close(2000); // wait up to 2s for requests +// process.exit(0); +// }); + +// process.on('SIGTERM', async () => { +// console.log('SIGTERM → shutting down...'); +// await app.close(2000); +// process.exit(0); +// }); \ No newline at end of file From d2c875750e2d6d4ba257337f3767cd17adea643a Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:51:16 +0200 Subject: [PATCH 1738/1766] Fix some of the broken java base images (#10262) * fix broken java base images * Update Hikari CP settings in httpserver and ring-http-exchange * Add semeru to ring-http-exchange --------- Co-authored-by: jj --- .../ring-http-exchange/benchmark_config.json | 20 +++++++++++++++++++ ...ing-http-exchange-robaho-semeru.dockerfile | 14 +++++++++++++ .../src/ring_http_exchange/benchmark.clj | 9 ++++----- frameworks/Java/activej/activej.dockerfile | 8 ++++---- .../dropwizard-jdbi-postgres.dockerfile | 2 +- .../dropwizard/dropwizard-mongodb.dockerfile | 2 +- .../dropwizard/dropwizard-postgres.dockerfile | 2 +- .../Java/dropwizard/dropwizard.dockerfile | 2 +- frameworks/Java/httpserver/pom.xml | 12 +++++------ .../src/main/java/benchmarks/Server.java | 17 +++++++++++++--- frameworks/Java/voovan/voovan.dockerfile | 2 +- 11 files changed, 66 insertions(+), 24 deletions(-) create mode 100644 frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-semeru.dockerfile diff --git a/frameworks/Clojure/ring-http-exchange/benchmark_config.json b/frameworks/Clojure/ring-http-exchange/benchmark_config.json index d8d2ba0ce3e..b0381b921ac 100755 --- a/frameworks/Clojure/ring-http-exchange/benchmark_config.json +++ b/frameworks/Clojure/ring-http-exchange/benchmark_config.json @@ -81,6 +81,26 @@ "display_name": "ring-http-exchange-robaho-graalvm", "notes": "", "versus": "ring-http-exchange-robaho" + }, + "robaho-semeru": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "postgres", + "framework": "None", + "language": "Clojure", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "ring-http-exchange-robaho-semeru", + "notes": "", + "versus": "ring-http-exchange-robaho" } } ] diff --git a/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-semeru.dockerfile b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-semeru.dockerfile new file mode 100644 index 00000000000..64f06a3418a --- /dev/null +++ b/frameworks/Clojure/ring-http-exchange/ring-http-exchange-robaho-semeru.dockerfile @@ -0,0 +1,14 @@ +FROM clojure:lein as lein +WORKDIR /ring-http-exchange +COPY project.clj project.clj +COPY resources resources +COPY src src +RUN lein with-profile robaho uberjar + +FROM ibm-semeru-runtimes:open-25-jre-jammy +WORKDIR /ring-http-exchange +COPY --from=lein /ring-http-exchange/target/ring-http-server-1.0.0-standalone.jar app.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] diff --git a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj index a5ee8a34384..fc6afa569b6 100644 --- a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj +++ b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj @@ -15,14 +15,13 @@ (def query-fortunes (boa/execute (boa/->NextJdbcAdapter) "fortune.sql")) (def db-spec {:auto-commit true - :read-only false - :connection-timeout 30000 + :read-only true + :connection-timeout 10000 :validation-timeout 5000 :idle-timeout 600000 :max-lifetime 1800000 - :minimum-idle 10 - :maximum-pool-size 520 - :minimum-pool-size 512 + :minimum-idle 16 + :maximum-pool-size 64 :register-mbeans false :jdbcUrl "jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass"}) diff --git a/frameworks/Java/activej/activej.dockerfile b/frameworks/Java/activej/activej.dockerfile index cea75f79e0d..da3ba92ee5a 100644 --- a/frameworks/Java/activej/activej.dockerfile +++ b/frameworks/Java/activej/activej.dockerfile @@ -1,11 +1,11 @@ -FROM maven:3.6.1-jdk-11-slim as maven - +FROM maven:3.9.0-eclipse-temurin-17 as maven WORKDIR /activej COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:11.0.3-jdk-slim +FROM amazoncorretto:25 WORKDIR /activej COPY --from=maven /activej/target/activej-server-benchmark-0.0.1-SNAPSHOT-jar-with-dependencies.jar app.jar -CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-DHttpServerConnection.initialWriteBufferSize=4096", "-DHttpHeadersMultimap.initialSize=16", "-jar", "app.jar"] \ No newline at end of file +EXPOSE 8080 +CMD ["java", "-server", "-XX:+UseParallelGC", "-jar", "app.jar"] \ No newline at end of file diff --git a/frameworks/Java/dropwizard/dropwizard-jdbi-postgres.dockerfile b/frameworks/Java/dropwizard/dropwizard-jdbi-postgres.dockerfile index 21a897236d7..13b5b94ce53 100644 --- a/frameworks/Java/dropwizard/dropwizard-jdbi-postgres.dockerfile +++ b/frameworks/Java/dropwizard/dropwizard-jdbi-postgres.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn package -q -P postgres,jdbi -FROM openjdk:11.0.3-jdk-slim +FROM amazoncorretto:25 WORKDIR /dropwizard COPY --from=maven /dropwizard/target/hello-world-0.0.1-SNAPSHOT.jar app.jar COPY hello-world-jdbi-postgres.yml hello-world-jdbi-postgres.yml diff --git a/frameworks/Java/dropwizard/dropwizard-mongodb.dockerfile b/frameworks/Java/dropwizard/dropwizard-mongodb.dockerfile index 1d13f4f9013..ce1fb9d4bbc 100644 --- a/frameworks/Java/dropwizard/dropwizard-mongodb.dockerfile +++ b/frameworks/Java/dropwizard/dropwizard-mongodb.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn package -q -P mongo -FROM openjdk:11.0.3-jdk-slim +FROM amazoncorretto:25 WORKDIR /dropwizard COPY --from=maven /dropwizard/target/hello-world-0.0.1-SNAPSHOT.jar app.jar COPY hello-world-mongo.yml hello-world-mongo.yml diff --git a/frameworks/Java/dropwizard/dropwizard-postgres.dockerfile b/frameworks/Java/dropwizard/dropwizard-postgres.dockerfile index b088d2df510..25cb2080922 100644 --- a/frameworks/Java/dropwizard/dropwizard-postgres.dockerfile +++ b/frameworks/Java/dropwizard/dropwizard-postgres.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn package -q -P postgres -FROM openjdk:11.0.3-jdk-slim +FROM amazoncorretto:25 WORKDIR /dropwizard COPY --from=maven /dropwizard/target/hello-world-0.0.1-SNAPSHOT.jar app.jar COPY hello-world-postgres.yml hello-world-postgres.yml diff --git a/frameworks/Java/dropwizard/dropwizard.dockerfile b/frameworks/Java/dropwizard/dropwizard.dockerfile index af3b49c8682..206455df590 100644 --- a/frameworks/Java/dropwizard/dropwizard.dockerfile +++ b/frameworks/Java/dropwizard/dropwizard.dockerfile @@ -4,7 +4,7 @@ COPY pom.xml pom.xml COPY src src RUN mvn package -q -P mysql -FROM openjdk:11.0.3-jdk-slim +FROM amazoncorretto:25 WORKDIR /dropwizard COPY --from=maven /dropwizard/target/hello-world-0.0.1-SNAPSHOT.jar app.jar COPY hello-world-mysql.yml hello-world-mysql.yml diff --git a/frameworks/Java/httpserver/pom.xml b/frameworks/Java/httpserver/pom.xml index 26673413278..5b983699fe6 100644 --- a/frameworks/Java/httpserver/pom.xml +++ b/frameworks/Java/httpserver/pom.xml @@ -30,23 +30,21 @@ postgresql 42.7.2 - - com.zaxxer - HikariCP - 3.3.1 - - com.github.httl httl 1.0.11 - org.slf4j slf4j-simple 1.8.0-beta4 + + com.zaxxer + HikariCP + 7.0.2 +
      diff --git a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java index 2b4beb71889..80566641a9f 100755 --- a/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java +++ b/frameworks/Java/httpserver/src/main/java/benchmarks/Server.java @@ -52,12 +52,23 @@ private static List queryFortunes(DataSource ds) throws SQLException { } private static DataSource createPostgresDataSource() throws ClassNotFoundException { - Class.forName("org.postgresql.Driver"); HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:postgresql://tfb-database:5432/hello_world"); config.setUsername("benchmarkdbuser"); config.setPassword("benchmarkdbpass"); - config.setMaximumPoolSize(512); + + config.setMaximumPoolSize(64); + config.setMinimumIdle(16); + + config.setConnectionTimeout(10000); + config.setIdleTimeout(600000); + config.setMaxLifetime(1800000); + + config.setAutoCommit(true); + + config.setPoolName("PostgreSQL-HikariCP-Pool"); + return new HikariDataSource(config); } @@ -145,4 +156,4 @@ static void main(String[] args) throws Exception { // start server server.start(); } -} +} \ No newline at end of file diff --git a/frameworks/Java/voovan/voovan.dockerfile b/frameworks/Java/voovan/voovan.dockerfile index 2ffcb0dbcfc..26ed65a1bdf 100644 --- a/frameworks/Java/voovan/voovan.dockerfile +++ b/frameworks/Java/voovan/voovan.dockerfile @@ -5,7 +5,7 @@ COPY src src COPY config/framework.properties config/framework.properties RUN mvn package -q -FROM openjdk:25-ea-slim-bullseye +FROM amazoncorretto:25 WORKDIR /voovan COPY --from=maven /voovan/target/voovan-bench-0.1-jar-with-dependencies.jar app.jar COPY --from=maven /voovan/config/framework.properties config/framework.properties From 45329a5d60f8a49a39912c484b4b2595d46a8ef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Gajo?= <50725287+64J0@users.noreply.github.com> Date: Tue, 11 Nov 2025 13:52:16 -0300 Subject: [PATCH 1739/1766] Minor code improvements and add Updates test (#10263) --- .../FSharp/giraffe/benchmark_config.json | 1 + frameworks/FSharp/giraffe/config.toml | 3 +- frameworks/FSharp/giraffe/src/App/App.fsproj | 2 +- frameworks/FSharp/giraffe/src/App/Program.fs | 147 +++++++++++++++--- 4 files changed, 130 insertions(+), 23 deletions(-) diff --git a/frameworks/FSharp/giraffe/benchmark_config.json b/frameworks/FSharp/giraffe/benchmark_config.json index 5552420b37f..cc2e70a748f 100644 --- a/frameworks/FSharp/giraffe/benchmark_config.json +++ b/frameworks/FSharp/giraffe/benchmark_config.json @@ -7,6 +7,7 @@ "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", + "update_url": "/updates?queries=", "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", diff --git a/frameworks/FSharp/giraffe/config.toml b/frameworks/FSharp/giraffe/config.toml index a44ef83d919..ada171349cb 100644 --- a/frameworks/FSharp/giraffe/config.toml +++ b/frameworks/FSharp/giraffe/config.toml @@ -2,11 +2,12 @@ name = "giraffe" [main] -urls.plaintext = "/plaintext" urls.json = "/json" urls.db = "/db" urls.query = "/queries?queries=" urls.fortune = "/fortunes" +urls.update = "/updates?queries=" +urls.plaintext = "/plaintext" approach = "Realistic" classification = "fullstack" database = "Postgres" diff --git a/frameworks/FSharp/giraffe/src/App/App.fsproj b/frameworks/FSharp/giraffe/src/App/App.fsproj index 215f3bfc001..ef58a0c3618 100644 --- a/frameworks/FSharp/giraffe/src/App/App.fsproj +++ b/frameworks/FSharp/giraffe/src/App/App.fsproj @@ -7,10 +7,10 @@ - + diff --git a/frameworks/FSharp/giraffe/src/App/Program.fs b/frameworks/FSharp/giraffe/src/App/Program.fs index b4e63e7333f..f7d62db7d33 100644 --- a/frameworks/FSharp/giraffe/src/App/Program.fs +++ b/frameworks/FSharp/giraffe/src/App/Program.fs @@ -18,15 +18,15 @@ module Common = Database=hello_world; User Id=benchmarkdbuser; Password=benchmarkdbpass; - SSL Mode=Disable; Maximum Pool Size=1024; NoResetOnClose=true; Enlist=false; - Max Auto Prepare=4; - Multiplexing=true; - Write Coalescing Buffer Threshold Bytes=1000 + Max Auto Prepare=4 """ + [] + let MultiplexedConnectionString = ConnectionString + ";Multiplexing=true" + [] type JsonMode = | System @@ -46,8 +46,43 @@ module Common = member _.Next () = rnd.Next (min, max) - [] - let MaxDegreeOfParallelism = 3 + // Cache SQL strings for bulk updates to avoid rebuilding on every request + // This module generates and caches SQL UPDATE statements that use PostgreSQL's + // VALUES clause to update multiple rows in a single statement. + module BatchUpdateSql = + let private cache = Array.zeroCreate 501 + + let get (count: int) = + match cache.[count] with + | null -> + let lastIndex = count - 1 + + // Build the VALUES clause: (@Id_0, @Rn_0), (@Id_1, @Rn_1), ... + // Each pair represents (id, new_randomnumber) for one row + let valueClauses = + List.init lastIndex (fun i -> sprintf "(@Id_%d, @Rn_%d), " i i) + |> String.concat "" + + // The final SQL uses a CTE-like VALUES construct to update multiple rows: + // UPDATE world SET randomnumber = temp.randomnumber + // FROM (VALUES ...) AS temp(id, randomnumber) + // WHERE temp.id = world.id + let sql = + sprintf + """ + UPDATE world + SET randomnumber = temp.randomnumber + FROM (VALUES %s(@Id_%d, @Rn_%d) ORDER BY 1) + AS temp(id, randomnumber) + WHERE temp.id = world.id + """ + valueClauses + lastIndex + lastIndex + + cache.[count] <- sql + sql + | sql -> sql [] module HtmlViews = @@ -87,10 +122,12 @@ module HttpHandlers = message = "Additional fortune added at request time." } - let private fortunes: HttpHandler = + let fortunes: HttpHandler = fun _ ctx -> task { - use conn = new NpgsqlConnection (ConnectionString) + let dataSource = ctx.GetService () + use conn = dataSource.CreateConnection () + do! conn.OpenAsync () let! data = conn.QueryAsync ("SELECT id, message FROM fortune") @@ -106,11 +143,13 @@ module HttpHandlers = return! ctx.WriteBytesAsync bytes } - let private db: HttpHandler = + let db: HttpHandler = fun _ ctx -> task { let rnd = ctx.GetService () - use conn = new NpgsqlConnection (ConnectionString) + let dataSource = ctx.GetService () + use conn = dataSource.CreateConnection () + do! conn.OpenAsync () let! data = conn.QuerySingleAsync ( @@ -121,7 +160,7 @@ module HttpHandlers = return! ctx.WriteJsonAsync data } - let private queries: HttpHandler = + let queries: HttpHandler = fun _ ctx -> task { let queryParam = @@ -137,30 +176,94 @@ module HttpHandlers = |> Option.defaultValue 1 let rnd = ctx.GetService () + let dataSource = ctx.GetService () + + use conn = dataSource.CreateConnection () + do! conn.OpenAsync () - let! res = - Array.init queryParam (fun _ -> rnd.Next ()) - |> Array.map (fun id -> - use conn = new NpgsqlConnection (ConnectionString) + // Read all rows sequentially + let results = Array.zeroCreate queryParam + for i in 0 .. queryParam - 1 do + let! world = conn.QuerySingleAsync ( "SELECT id, randomnumber FROM world WHERE id = @Id", - {| Id = id |} + {| Id = rnd.Next () |} ) - |> Async.AwaitTask + + results.[i] <- world + + return! ctx.WriteJsonAsync results + } + + let updates: HttpHandler = + fun _ ctx -> + task { + let queryParam = + ctx.TryGetQueryStringValue "queries" + |> Option.map (fun value -> + match System.Int32.TryParse value with + | true, intValue -> + if intValue < 1 then 1 + elif intValue > 500 then 500 + else intValue + | false, _ -> 1 ) - |> fun computations -> - Async.Parallel (computations, MaxDegreeOfParallelism) + |> Option.defaultValue 1 + + let rnd = ctx.GetService () + + // Use multiplexed connection for updates (more efficient for sequential ops) + use conn = new NpgsqlConnection (MultiplexedConnectionString) + do! conn.OpenAsync () + + // Read all rows sequentially + let readResults = Array.zeroCreate queryParam - return! ctx.WriteJsonAsync res + for i in 0 .. queryParam - 1 do + let! world = + conn.QuerySingleAsync ( + "SELECT id, randomnumber FROM world WHERE id = @Id", + {| Id = rnd.Next () |} + ) + + readResults.[i] <- world + + // Update random numbers functionally + let updatedData = + readResults + |> Array.map (fun data -> { data with randomNumber = rnd.Next () }) + + // Build bulk update parameters functionally + // We use a single UPDATE statement with a VALUES clause to update all rows at once. + // + // Example SQL for 2 rows: + // UPDATE world SET randomnumber = temp.randomnumber + // FROM (VALUES (@Id_0, @Rn_0), (@Id_1, @Rn_1) ORDER BY 1) AS temp(id, randomnumber) + // WHERE temp.id = world.id + let updateParams = + updatedData + |> Array.mapi (fun i data -> [ + sprintf "@Id_%d" i, box data.id // Parameter for the id + sprintf "@Rn_%d" i, box data.randomNumber // Parameter for the new random number + ]) + |> Array.collect List.toArray // Flatten the list of parameter pairs + |> dict // Convert to dictionary for Dapper + + // Execute bulk update using Dapper + let sql = BatchUpdateSql.get queryParam + let! _ = conn.ExecuteAsync (sql, updateParams) + + return! ctx.WriteJsonAsync updatedData } let endpoints: Endpoint list = [ - route "/plaintext" (text "Hello, World!") route "/json" (json {| message = "Hello, World!" |}) route "/db" db route "/queries" queries route "/fortunes" fortunes + route "/updates" updates + route "/plaintext" (text "Hello, World!") ] @@ -173,6 +276,7 @@ module Main = open Microsoft.Extensions.Logging open System.Text.Json open Newtonsoft.Json + open Npgsql [] let main args = @@ -202,6 +306,7 @@ module Main = builder.Services .AddSingleton(jsonSerializer) .AddSingleton(rnd) + .AddSingleton(NpgsqlDataSource.Create (ConnectionString)) .AddGiraffe () |> ignore From 24daeda25bf15cff2c49cdd501c9da676210daf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:52:42 +0800 Subject: [PATCH 1740/1766] update(touchsocket):version to 4.0.0-rc42 (#10265) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update(touchsocket):version to 4.0.0-rc.2 * update(touchsocket):version to 4.0.0-rc.5 * optimize(touchsocket):scheduler * Performance (TouchSocketHttp, TouchSocketWebApi): Enable server garbage collection * update(touchsocket):version to 4.0.0-rc.15 * update(touchsocket):version to 4.0.0-rc42 * 重构(Program): 显式指定变量类型并优化配置 显式指定变量类型以提高代码可读性和类型安全性 修改命名空间为 `TouchSocketHttp` 将 `options.BufferOnDemand` 默认值从 `false` 修改为 `true` 调整 `SetTransportOption` 和 `ApiServer` 中的相关代码 * 优化(csproj): 升级TouchSocket包版本 在TouchSocketHttp.csproj和TouchSocketWebApi.csproj中,将TouchSocket.Hosting和TouchSocket.WebApi的包引用版本从4.0.0-rc.42升级到4.0.0-rc.44,以修复错误、提高性能或增加新功能 --- .../CSharp/touchsocket/src/TouchSocketHttp/Program.cs | 6 +++++- .../src/TouchSocketHttp/TouchSocketHttp.csproj | 4 ++-- .../CSharp/touchsocket/src/TouchSocketWebApi/Program.cs | 8 ++++++-- .../src/TouchSocketWebApi/TouchSocketWebApi.csproj | 4 ++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs index 125284cd970..d77a1b3249d 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs @@ -10,12 +10,16 @@ public class Program { private static async Task Main(string[] args) { - var port = 8080; + int port = 8080; var service = new MyHttpService(); await service.SetupAsync(new TouchSocketConfig() .SetListenIPHosts(port) .SetMaxCount(1000000) + .SetTransportOption(options => + { + options.BufferOnDemand = true; + }) .ConfigureContainer(a => { a.AddConsoleLogger(); diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index 74caaf7a658..ea6f43327a0 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs index 26cdfb935fd..a7c9e6dcafe 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -19,6 +19,10 @@ public static void Main(string[] args) { config.SetListenIPHosts(8080) .SetMaxCount(1000000) + .SetTransportOption(options => + { + options.BufferOnDemand = true; + }) .ConfigureContainer(a => { a.AddConsoleLogger(); @@ -45,7 +49,7 @@ public static void Main(string[] args) }); }); - var host = builder.Build(); + IHost host = builder.Build(); host.Run(); } } @@ -60,7 +64,7 @@ public partial class ApiServer : SingletonRpcServer [WebApi(Method = HttpMethodType.Get)] public async Task Plaintext(IWebApiCallContext callContext) { - var response = callContext.HttpContext.Response; + HttpResponse response = callContext.HttpContext.Response; response.SetStatus(200, "ok"); response.Content = m_contentPlaintext; await response.AnswerAsync().ConfigureAwait(false); diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index 1319cf14650..d90651bb648 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -10,7 +10,7 @@ - - + + From 96a221905f4d209319110dd62cad7eea29fdb089 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Nov 2025 17:53:19 +0100 Subject: [PATCH 1741/1766] [ruby/rack] Add Itsi webserver for Rack (#10266) --- frameworks/Ruby/rack/Gemfile | 4 ++++ frameworks/Ruby/rack/Gemfile.lock | 15 ++++++++++++++ frameworks/Ruby/rack/README.md | 9 ++++---- frameworks/Ruby/rack/benchmark_config.json | 21 +++++++++++++++++++ frameworks/Ruby/rack/config/itsi.rb | 13 ++++++++++++ frameworks/Ruby/rack/hello_world.rb | 4 ++++ frameworks/Ruby/rack/rack-itsi.dockerfile | 24 ++++++++++++++++++++++ 7 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 frameworks/Ruby/rack/config/itsi.rb create mode 100644 frameworks/Ruby/rack/rack-itsi.dockerfile diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index 091baa8d0e4..0512085a64f 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -22,6 +22,10 @@ group :iodine, optional: true do gem 'iodine', '~> 0.7', platforms: %i[ruby windows] end +group :itsi, optional: true do + gem 'itsi' +end + group :passenger, optional: true do gem 'logger' # required by passenger on Ruby 3.5 gem 'passenger', '~> 6.1', platforms: [:ruby, :windows], require: false diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 0322d2109ed..4030d1e1ecb 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -60,6 +60,16 @@ GEM io-event (1.9.0) io-stream (0.6.1) iodine (0.7.58) + itsi (0.2.18) + itsi-scheduler (~> 0.2.18) + itsi-server (~> 0.2.18) + itsi-scheduler (0.2.18) + rb_sys (~> 0.9.91) + itsi-server (0.2.18) + json (~> 2) + prism (~> 1.4) + rack (>= 1.6) + rb_sys (~> 0.9.91) json (2.13.2) language_server-protocol (3.17.0.4) lint_roller (1.1.0) @@ -84,6 +94,7 @@ GEM pitchfork (0.17.0) logger rack (>= 2.0) + prism (1.4.0) protocol-hpack (1.5.1) protocol-http (0.54.0) protocol-http1 (0.35.2) @@ -104,6 +115,9 @@ GEM rack (>= 3) rainbow (3.1.1) rake (13.3.0) + rake-compiler-dock (1.9.1) + rb_sys (0.9.117) + rake-compiler-dock (= 1.9.1) regexp_parser (2.10.0) rubocop (1.73.2) json (~> 2.3) @@ -145,6 +159,7 @@ DEPENDENCIES connection_pool (~> 2.4) falcon (~> 0.47) iodine (~> 0.7) + itsi jdbc-postgres (~> 42.2) json (~> 2.10) logger diff --git a/frameworks/Ruby/rack/README.md b/frameworks/Ruby/rack/README.md index 53a5d5c5b09..4dd0a7d3954 100644 --- a/frameworks/Ruby/rack/README.md +++ b/frameworks/Ruby/rack/README.md @@ -13,12 +13,13 @@ The tests were run with: * [Ruby 3.4](http://www.ruby-lang.org/) * [JRuby 9.4](http://jruby.org/) -* [Rack 3.1](http://rack.github.com/) -* [Unicorn 6.1.0](http://unicorn.bogomips.org/) -* [Puma 7](http://puma.io/) -* [Iodine](https://github.com/boazsegev/iodine) +* [Rack 3](http://rack.github.com/) * [Falcon](https://github.com/socketry/falcon) +* [Iodine](https://github.com/boazsegev/iodine) +* [Itsi](https://github.com/wouterken/itsi) +* [Passenger](https://github.com/phusion/passenger) * [Pitchfork](https://github.com/Shopify/pitchfork) +* [Puma](http://puma.io/) * [Sequel 5](https://sequel.jeremyevans.net/) diff --git a/frameworks/Ruby/rack/benchmark_config.json b/frameworks/Ruby/rack/benchmark_config.json index 326c20b4f40..031e00dc5e9 100644 --- a/frameworks/Ruby/rack/benchmark_config.json +++ b/frameworks/Ruby/rack/benchmark_config.json @@ -65,6 +65,27 @@ "display_name": "rack [falcon]", "notes": "" }, + "itsi": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "orm": "raw", + "database": "Postgres", + "framework": "rack", + "language": "Ruby", + "platform": "Mri", + "webserver": "Itsi", + "os": "Linux", + "database_os": "Linux", + "display_name": "rack [itsi]", + "notes": "" + }, "jruby": { "json_url": "/json", "plaintext_url": "/plaintext", diff --git a/frameworks/Ruby/rack/config/itsi.rb b/frameworks/Ruby/rack/config/itsi.rb new file mode 100644 index 00000000000..d0dd0992dc1 --- /dev/null +++ b/frameworks/Ruby/rack/config/itsi.rb @@ -0,0 +1,13 @@ +require_relative 'auto_tune' + +rackup_file './config.ru' + +ruby_thread_request_backlog_size 10_000 + +preload false + +num_workers, num_threads = auto_tune + +workers num_workers +threads num_threads +fiber_scheduler false diff --git a/frameworks/Ruby/rack/hello_world.rb b/frameworks/Ruby/rack/hello_world.rb index ca4c8f8671d..2a806461fa2 100644 --- a/frameworks/Ruby/rack/hello_world.rb +++ b/frameworks/Ruby/rack/hello_world.rb @@ -45,6 +45,10 @@ class HelloWorld def initialize if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 max_connections = threads + elsif defined?(Itsi) + require_relative 'config/auto_tune' + _num_workers, num_threads = auto_tune + max_connections = num_threads else max_connections = 512 end diff --git a/frameworks/Ruby/rack/rack-itsi.dockerfile b/frameworks/Ruby/rack/rack-itsi.dockerfile new file mode 100644 index 00000000000..952ac7ccdad --- /dev/null +++ b/frameworks/Ruby/rack/rack-itsi.dockerfile @@ -0,0 +1,24 @@ +FROM ruby:3.5-rc + +ENV RUBY_YJIT_ENABLE=1 + +# Use Jemalloc +RUN apt-get update && \ + apt-get install -y --no-install-recommends libjemalloc2 +ENV LD_PRELOAD=libjemalloc.so.2 + +RUN apt-get install -y build-essential libclang-dev + +WORKDIR /rack + +COPY Gemfile* ./ + +ENV BUNDLE_FORCE_RUBY_PLATFORM=true +RUN bundle config set with 'itsi' +RUN bundle install --jobs=8 + +COPY . . + +EXPOSE 8080 + +CMD bundle exec itsi start -C config/itsi.rb --bind "http://tfb-server:8080" From 72bc54179fe18ccf1a8c141717db4c03d3a04eb5 Mon Sep 17 00:00:00 2001 From: Gabriel Scatolin <17441745+CypherPotato@users.noreply.github.com> Date: Tue, 11 Nov 2025 13:54:11 -0300 Subject: [PATCH 1742/1766] updated sisk tests (#10267) * update sisk cadente * add missing dependencies to aot test * remove aot test * fix: plaintext strings * update cadente version * update cadente version * update sisk benchmarks --- .../CSharp/sisk/sisk-cadente/Program.cs | 70 ++++++++++--------- .../CSharp/sisk/sisk-cadente/sisk.csproj | 2 +- frameworks/CSharp/sisk/sisk.dockerfile | 4 ++ 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/frameworks/CSharp/sisk/sisk-cadente/Program.cs b/frameworks/CSharp/sisk/sisk-cadente/Program.cs index 267877ee584..f198260cbde 100644 --- a/frameworks/CSharp/sisk/sisk-cadente/Program.cs +++ b/frameworks/CSharp/sisk/sisk-cadente/Program.cs @@ -1,44 +1,50 @@ -using System.Net; +using System.Buffers.Text; +using System.Net; using System.Text; using System.Text.Json; using Sisk.Cadente; -HttpHost.QueueSize = 4096; - -var host = new HttpHost ( new IPEndPoint ( IPAddress.Any, 8080 ) ); -host.ContextCreated += Host_ContextCreated; +using var host = new HttpHost ( new IPEndPoint ( IPAddress.Any, 8080 ) ); +host.Handler = new DefaultHandler(); host.Start (); Thread.Sleep ( Timeout.Infinite ); -void Host_ContextCreated ( HttpHost sender, HttpHostContext session ) { - var request = session.Request; - - if (request.Path == "/plaintext") { - SerializePlainTextResponse ( session.Response ); - } - else if (request.Path == "/json") { - SerializeJsonResponse ( session.Response ); - } - else { - session.Response.StatusCode = 404; - } -} - -static void SerializePlainTextResponse ( HttpHostContext.HttpResponse response ) { - - var messageBytes = Encoding.UTF8.GetBytes ( "Hello, World!" ); - response.Headers.Add ( new HttpHeader ( "Content-Type", "text/plain; charset=UTF-8" ) ); - response.ResponseStream = new MemoryStream ( messageBytes ); -} +class DefaultHandler : HttpHostHandler +{ + public override async Task OnContextCreatedAsync(HttpHost host, HttpHostContext context) + { + var request = context.Request; + var response = context.Response; + + if (request.Path == "/plaintext") + { + var contentBytes = Encoding.UTF8.GetBytes("Hello, World!"); + + await SerializeResponseAsync(response, contentBytes, "text/plain; charset=utf-8"); + } + else if (request.Path == "/json") + { + var contentBytes = JsonSerializer.SerializeToUtf8Bytes(new + { + message = "Hello, World!" + }); + + await SerializeResponseAsync(response, contentBytes, "application/json; charset=utf-8"); + } + else + { + response.StatusCode = 404; + } + } -static void SerializeJsonResponse ( HttpHostContext.HttpResponse response ) { + static async ValueTask SerializeResponseAsync(HttpHostContext.HttpResponse response, Memory content, string contentType) + { + response.Headers.Add(new HttpHeader("Content-Type", contentType)); + response.Headers.Add(new HttpHeader("Content-Length", content.Length.ToString())); - var contentBytes = JsonSerializer.SerializeToUtf8Bytes ( new { - message = "Hello, World!" - } ); - - response.Headers.Add ( new HttpHeader ( "Content-Type", "application/json" ) ); - response.ResponseStream = new MemoryStream ( contentBytes ); + using var responseStream = await response.GetResponseStreamAsync(); + await responseStream.WriteAsync(content); + } } \ No newline at end of file diff --git a/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj b/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj index c72c3f1faee..12f1a5d7c2c 100644 --- a/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj +++ b/frameworks/CSharp/sisk/sisk-cadente/sisk.csproj @@ -9,7 +9,7 @@ - + \ No newline at end of file diff --git a/frameworks/CSharp/sisk/sisk.dockerfile b/frameworks/CSharp/sisk/sisk.dockerfile index 2a23e04743f..6509bffbd8a 100644 --- a/frameworks/CSharp/sisk/sisk.dockerfile +++ b/frameworks/CSharp/sisk/sisk.dockerfile @@ -9,6 +9,10 @@ RUN dotnet restore -r linux-musl-x64 COPY sisk/ . RUN dotnet publish -c release -o /app -r linux-musl-x64 +ENV DOTNET_GCDynamicAdaptationMode=0 +ENV DOTNET_ReadyToRun=0 +ENV DOTNET_HillClimbing_Disable=1 + # final stage/image FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app From 195f7bc3f7235591e685c673aa6997c0f0189404 Mon Sep 17 00:00:00 2001 From: AkazawaYun <62974697+AkazawaYun@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:54:31 +0800 Subject: [PATCH 1743/1766] update version for akazawayun.pro (#10269) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add new test : CSharp/akazawayun.pro * modify config and code * add content-type * update url * update package version * add 3 new tests: db、queries、updates 1. add 3 new tests: db、queries、updates; 2. split code to multi files; * - * use generated sql instead const string. * update version * fix bug of db query * set port to 8080 * 升级 akazawayun.pro 框架版本到 14 * i forget to update the port change... * test self whether work fine.. * update nuget version * why pr failed... * 不小心多提交了别人的框架...改回 * akazawayun fix bug * remove db test there is some error in mysql * confirmed there is bug in mysql.data 9.5.0 还是用8080端口吧- -b, 都用8080, 改其他的对比测时不方便 * downgrade mysql.data back to 9.4.0 * fix bug of akazawayun.pro * update version of akazawayun.pro * update version * add platform test * update nupkg version * update version --- .../AkazawaYun.Benchmark.Platform.csproj | 2 +- .../AkazawaYun.Benchmark.WebApi.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj index f59eaf8f615..e43069a4338 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj @@ -15,7 +15,7 @@ - + diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj index 547064216f4..452b23e493c 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.WebApi/AkazawaYun.Benchmark.WebApi.csproj @@ -15,7 +15,7 @@ - + From ee7f5801edfa7658ac992b78ad78f09f1be3aeeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=A4=E9=9B=A8=E4=B8=9C?= Date: Wed, 12 Nov 2025 00:54:54 +0800 Subject: [PATCH 1744/1766] Upgrade hyperlane (#10270) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: port * feat: port * feat: db * feat: db * feat: db * feat: lock * feat: lock * feat: v4.41.0 * feat: v4.42.0 * Merge remote-tracking branch 'upstream/master' * Merge remote-tracking branch 'upstream/master' * feat: inline * feat: dockerfile * feat: v4.52.1 * feat: remove key * remove: log * remove: log * feat: async * remove: empty loop * feat: utf8 * change: pool_size * remove: utf8 * feat: log * feat: log * feat: v3.14.1 * feat: 4.56.3 * feat: 4.56.4 * feat: 4.56.5 * feat: rename * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: speed * feat: speed * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: runtime * feat: runtime * feat: runtime * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * lock: toml * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: hyperlane * feat: update * docs: readme * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: lock * feat: use super * feat: update lock * feat: update * feat: update lock * feat: update lock * feat: update lock * feat: lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * feat: update lock * Merge remote-tracking branch 'upstream/master' * feat: update * feat: utf8 * feat: utf8 * feat: lock * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * update: code * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * feat: update * Merge remote-tracking branch 'upstream/master' * feat: update version * feat: update version * update: code * Merge remote-tracking branch 'upstream/master' * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: lock * feat: error handle * feat: dep * feat: get_thread_count * update: code * feat: lock * feat: speed * feat: speed * update: code * feat: speed * update: code * feat: lock * fix: Framework hyperlane does not define a default test in benchmark_config.json * feat: hyperlane http version * feat: hyperlane http version * feat: toml * feat: toml * feat: toml * feat: toml * feat: v0.1.0 * feat: toml * feat: v6 * feat: v6 * feat: v6 * feat: v6 * feat: v6 * debug: test cache * debug: test cache * feat: v6 * feat: send unwrap * feat: v6 * feat: v6 * feat: v0.1.0 * feat: toml * feat: toml * feat: db * feat: toml * feat: toml * feat: toml * feat: toml * feat: dir update * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: toml * feat: 2025-10-24 12:22:32 * feat: v0.1.0 * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: v0.1.0 * Merge branch 'master' of github.com:TechEmpower/FrameworkBenchmarks * feat: 2025-11-09 18:38:22 --------- Co-authored-by: 尤雨东 <83822098+ltpp-universe@users.noreply.github.com> --- frameworks/Rust/hyperlane/Cargo.lock | 12 ++++++------ frameworks/Rust/hyperlane/Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/Rust/hyperlane/Cargo.lock b/frameworks/Rust/hyperlane/Cargo.lock index 08387adbeb8..2f8ba49c1ee 100644 --- a/frameworks/Rust/hyperlane/Cargo.lock +++ b/frameworks/Rust/hyperlane/Cargo.lock @@ -525,15 +525,15 @@ dependencies = [ [[package]] name = "http-constant" -version = "1.68.0" +version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd414126bc050b1437bed5a52939854b2b7ef214e8e05aacca3663529514e3e" +checksum = "e1dd700ca01982ad65f60942687599f3ac04cf1010673b80af480f1f1f15592a" [[package]] name = "http-type" -version = "5.8.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb36d75dbf127e3bfa1c7f404ba69edd760a3a5a93687caaafdb07f73eff64f" +checksum = "60e700017e6818aca191fd8a2f8ba8f524954375b9525f3dd9aabc83c4f999ec" dependencies = [ "hex", "http-compress", @@ -549,9 +549,9 @@ dependencies = [ [[package]] name = "hyperlane" -version = "10.11.3" +version = "10.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c042df01c9d47727269228fa5bacbb25504a6785539c0e5942dd8b2541c33a0" +checksum = "8285c986ed79e5932f112dafb32ee32caf77b561bb782ac4b3b1af49cc27ff09" dependencies = [ "aho-corasick", "http-type", diff --git a/frameworks/Rust/hyperlane/Cargo.toml b/frameworks/Rust/hyperlane/Cargo.toml index 83196a7647b..88209c8ce36 100644 --- a/frameworks/Rust/hyperlane/Cargo.toml +++ b/frameworks/Rust/hyperlane/Cargo.toml @@ -20,7 +20,7 @@ exclude = [ [dependencies] futures = "0.3.31" -hyperlane = "10.11.3" +hyperlane = "10.12.0" hyperlane-time = "0.7.12" num_cpus = "1.17.0" once_cell = "1.21.3" From a050d10624f81b7b44f2b7de05f24b2d69a65ec0 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Tue, 11 Nov 2025 16:56:55 +0000 Subject: [PATCH 1745/1766] Update the set of broken implementations (#10268) Signed-off-by: Anton Kirilov --- frameworks/C++/ffead-cpp/benchmark_config.json | 4 ++-- frameworks/CSharp/aspnetcore-mono/benchmark_config.json | 3 ++- frameworks/CSharp/revenj/benchmark_config.json | 1 + frameworks/Crystal/grip/benchmark_config.json | 1 + frameworks/Erlang/cowboy/benchmark_config.json | 1 + frameworks/Erlang/elli/benchmark_config.json | 1 + frameworks/Erlang/mochiweb/benchmark_config.json | 1 + frameworks/Go/goravel/benchmark_config.json | 1 + frameworks/Go/ronykit/benchmark_config.json | 4 +++- frameworks/Go/sprapp/benchmark_config.json | 1 + frameworks/Java/gemini/benchmark_config.json | 3 +++ frameworks/Java/officefloor/benchmark_config.json | 4 ++++ frameworks/Java/ratpack/benchmark_config.json | 3 +++ frameworks/Java/revenj-jvm/benchmark_config.json | 1 + frameworks/Java/servlet3/benchmark_config.json | 2 ++ frameworks/Java/wildfly-ee/benchmark_config.json | 3 ++- frameworks/JavaScript/elide/benchmark_config.json | 1 + frameworks/JavaScript/spliffy/benchmark_config.json | 4 ++++ .../vertx-web-kotlin-coroutines/benchmark_config.json | 1 + frameworks/Lua/openresty/benchmark_config.json | 1 + frameworks/Nim/basolato/benchmark_config.json | 1 + frameworks/Nim/httpbeast/benchmark_config.json | 1 + frameworks/Nim/jester/benchmark_config.json | 1 + frameworks/Nim/nim-stdlib/benchmark_config.json | 1 + frameworks/Nim/scorper/benchmark_config.json | 1 + frameworks/PHP/fomo/benchmark_config.json | 2 +- frameworks/PHP/fuel/benchmark_config.json | 1 + frameworks/Perl/plack/benchmark_config.json | 1 + frameworks/Python/eve/benchmark_config.json | 1 + frameworks/Python/flask/benchmark_config.json | 3 ++- frameworks/Python/klein/benchmark_config.json | 1 + frameworks/Python/turbogears/benchmark_config.json | 1 + frameworks/Python/web2py/benchmark_config.json | 2 ++ frameworks/Rust/gotham/benchmark_config.json | 1 + frameworks/Rust/pavex/benchmark_config.json | 1 + frameworks/Rust/rocket/benchmark_config.json | 1 + frameworks/Rust/salvo/benchmark_config.json | 8 ++++++++ frameworks/Rust/warp-rust/benchmark_config.json | 1 + 38 files changed, 63 insertions(+), 7 deletions(-) diff --git a/frameworks/C++/ffead-cpp/benchmark_config.json b/frameworks/C++/ffead-cpp/benchmark_config.json index 6ab98997f9d..0a61221fc46 100644 --- a/frameworks/C++/ffead-cpp/benchmark_config.json +++ b/frameworks/C++/ffead-cpp/benchmark_config.json @@ -198,7 +198,7 @@ "display_name": "ffead-cpp [pg-raw-async-prof-pool-m]", "notes": "async memory profiled", "versus": "", - "tags": [] + "tags": ["broken"] }, "postgresql-raw-async-clibpqb-profiled": { "db_url": "/t4/d", @@ -301,7 +301,7 @@ "display_name": "ffead-cpp [pg-raw-async-qw-prof-pool-m]", "notes": "async memory profiled", "versus": "", - "tags": [] + "tags": ["broken"] } }] } diff --git a/frameworks/CSharp/aspnetcore-mono/benchmark_config.json b/frameworks/CSharp/aspnetcore-mono/benchmark_config.json index e52c7d74b55..74fd85c0b83 100644 --- a/frameworks/CSharp/aspnetcore-mono/benchmark_config.json +++ b/frameworks/CSharp/aspnetcore-mono/benchmark_config.json @@ -40,6 +40,7 @@ "database_os": "Linux", "display_name": "ASP.NET Core [Platform, Mono, Pg]", "notes": "", + "tags": ["broken"], "versus": "aspcore-ado-pg" }, "mw": { @@ -123,4 +124,4 @@ "versus": "aspcore-mono-pg" } }] -} \ No newline at end of file +} diff --git a/frameworks/CSharp/revenj/benchmark_config.json b/frameworks/CSharp/revenj/benchmark_config.json index 8472ef41d12..402a5129f93 100644 --- a/frameworks/CSharp/revenj/benchmark_config.json +++ b/frameworks/CSharp/revenj/benchmark_config.json @@ -22,6 +22,7 @@ "os": "Linux", "display_name": "Revenj", "notes": "", + "tags": ["broken"], "versus": "Revenj" } }] diff --git a/frameworks/Crystal/grip/benchmark_config.json b/frameworks/Crystal/grip/benchmark_config.json index 56cd319dfc9..fbd828243a3 100644 --- a/frameworks/Crystal/grip/benchmark_config.json +++ b/frameworks/Crystal/grip/benchmark_config.json @@ -23,6 +23,7 @@ "database_os": "Linux", "display_name": "Grip", "notes": "", + "tags": ["broken"], "versus": "None" } } diff --git a/frameworks/Erlang/cowboy/benchmark_config.json b/frameworks/Erlang/cowboy/benchmark_config.json index 324b087d481..7c37a4a6864 100644 --- a/frameworks/Erlang/cowboy/benchmark_config.json +++ b/frameworks/Erlang/cowboy/benchmark_config.json @@ -20,6 +20,7 @@ "database_os": "Linux", "display_name": "Cowboy", "notes": "", + "tags": ["broken"], "versus": "" }}] } diff --git a/frameworks/Erlang/elli/benchmark_config.json b/frameworks/Erlang/elli/benchmark_config.json index 2910a94924c..ce58700f3e1 100644 --- a/frameworks/Erlang/elli/benchmark_config.json +++ b/frameworks/Erlang/elli/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "elli", "notes": "", + "tags": ["broken"], "versus": "" }}] } diff --git a/frameworks/Erlang/mochiweb/benchmark_config.json b/frameworks/Erlang/mochiweb/benchmark_config.json index 57f8dcbf8a8..e45bfbf83e7 100644 --- a/frameworks/Erlang/mochiweb/benchmark_config.json +++ b/frameworks/Erlang/mochiweb/benchmark_config.json @@ -21,6 +21,7 @@ "database_os": "Linux", "display_name": "mochiweb", "notes": "", + "tags": ["broken"], "versus": "" }}] } diff --git a/frameworks/Go/goravel/benchmark_config.json b/frameworks/Go/goravel/benchmark_config.json index bcb01875139..5be71f6fdbe 100644 --- a/frameworks/Go/goravel/benchmark_config.json +++ b/frameworks/Go/goravel/benchmark_config.json @@ -48,6 +48,7 @@ "database_os": "Linux", "display_name": "Goravel Fiber", "notes": "", + "tags": ["broken"], "versus": "go" } } diff --git a/frameworks/Go/ronykit/benchmark_config.json b/frameworks/Go/ronykit/benchmark_config.json index 69684f9bcef..dcff4ef38bd 100644 --- a/frameworks/Go/ronykit/benchmark_config.json +++ b/frameworks/Go/ronykit/benchmark_config.json @@ -18,6 +18,7 @@ "os": "Linux", "display_name": "RonyKIT", "notes": "", + "tags": ["broken"], "versus": "go" }, "prefork": { @@ -36,8 +37,9 @@ "os": "Linux", "display_name": "RonyKIT", "notes": "", + "tags": ["broken"], "versus": "go" } } ] -} \ No newline at end of file +} diff --git a/frameworks/Go/sprapp/benchmark_config.json b/frameworks/Go/sprapp/benchmark_config.json index a8764b2fe88..9074fd3c2db 100644 --- a/frameworks/Go/sprapp/benchmark_config.json +++ b/frameworks/Go/sprapp/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "SPRAPP", "notes": "", + "tags": ["broken"], "versus": "None" } } diff --git a/frameworks/Java/gemini/benchmark_config.json b/frameworks/Java/gemini/benchmark_config.json index e4049a488c6..0f051744dfa 100644 --- a/frameworks/Java/gemini/benchmark_config.json +++ b/frameworks/Java/gemini/benchmark_config.json @@ -20,6 +20,7 @@ "database_os": "Linux", "display_name": "Gemini", "notes": "", + "tags": ["broken"], "versus": "servlet" }, "mysql": { @@ -42,6 +43,7 @@ "database_os": "Linux", "display_name": "Gemini", "notes": "", + "tags": ["broken"], "versus": "servlet" }, "postgres": { @@ -64,6 +66,7 @@ "database_os": "Linux", "display_name": "Gemini", "notes": "", + "tags": ["broken"], "versus": "servlet" } } diff --git a/frameworks/Java/officefloor/benchmark_config.json b/frameworks/Java/officefloor/benchmark_config.json index 1a309d4ccbd..d90efc51b9d 100755 --- a/frameworks/Java/officefloor/benchmark_config.json +++ b/frameworks/Java/officefloor/benchmark_config.json @@ -47,6 +47,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "OfficeFloor-r2dbc", + "tags": ["broken"], "notes": "" }, "sqlclient": { @@ -69,6 +70,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "OfficeFloor-sqlclient", + "tags": ["broken"], "notes": "" }, "rawsqlclient": { @@ -91,6 +93,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "OfficeFloor-rawsqlclient", + "tags": ["broken"], "notes": "" }, "async": { @@ -162,6 +165,7 @@ "database_os": "Linux", "display_name": "OfficeFloor-thread_affinity", "notes": "", + "tags": ["broken"], "versus": "OfficeFloor-r2dbc" }, "netty": { diff --git a/frameworks/Java/ratpack/benchmark_config.json b/frameworks/Java/ratpack/benchmark_config.json index c3a755d87ab..85d054fed35 100755 --- a/frameworks/Java/ratpack/benchmark_config.json +++ b/frameworks/Java/ratpack/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "Ratpack", "notes": "", + "tags": ["broken"], "versus": "Netty" }, "jdbc": { @@ -40,6 +41,7 @@ "database_os": "Linux", "display_name": "Ratpack-jdbc", "notes": "", + "tags": ["broken"], "versus": "Netty" }, "pgclient": { @@ -61,6 +63,7 @@ "database_os": "Linux", "display_name": "Ratpack-pgclient", "notes": "", + "tags": ["broken"], "versus": "Netty" } } diff --git a/frameworks/Java/revenj-jvm/benchmark_config.json b/frameworks/Java/revenj-jvm/benchmark_config.json index 4187598430b..ffc6b919ca6 100644 --- a/frameworks/Java/revenj-jvm/benchmark_config.json +++ b/frameworks/Java/revenj-jvm/benchmark_config.json @@ -22,6 +22,7 @@ "database_os": "Linux", "display_name": "Revenj.JVM", "notes": "", + "tags": ["broken"], "versus": "servlet" } }] diff --git a/frameworks/Java/servlet3/benchmark_config.json b/frameworks/Java/servlet3/benchmark_config.json index b6e4d1b5400..cd2a050e174 100644 --- a/frameworks/Java/servlet3/benchmark_config.json +++ b/frameworks/Java/servlet3/benchmark_config.json @@ -17,6 +17,7 @@ "database_os": "Linux", "display_name": "servlet3", "notes": "Servlet 3.1 Async I/O", + "tags": ["broken"], "versus": "servlet" }, "sync": { @@ -35,6 +36,7 @@ "database_os": "Linux", "display_name": "servlet3", "notes": "", + "tags": ["broken"], "versus": "servlet" } }] diff --git a/frameworks/Java/wildfly-ee/benchmark_config.json b/frameworks/Java/wildfly-ee/benchmark_config.json index 1628dc35eef..7fc9770b023 100644 --- a/frameworks/Java/wildfly-ee/benchmark_config.json +++ b/frameworks/Java/wildfly-ee/benchmark_config.json @@ -22,7 +22,8 @@ "database_os": "Linux", "display_name": "wildfly-ee", "notes": "", + "tags": ["broken"], "versus": "" - } + } }] } diff --git a/frameworks/JavaScript/elide/benchmark_config.json b/frameworks/JavaScript/elide/benchmark_config.json index 32c9d7e82aa..8b8e8599c57 100644 --- a/frameworks/JavaScript/elide/benchmark_config.json +++ b/frameworks/JavaScript/elide/benchmark_config.json @@ -14,6 +14,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "elide", + "tags": ["broken"], "versus": "nodejs" } }] diff --git a/frameworks/JavaScript/spliffy/benchmark_config.json b/frameworks/JavaScript/spliffy/benchmark_config.json index 750dc5bd0cc..40dcb1614bd 100644 --- a/frameworks/JavaScript/spliffy/benchmark_config.json +++ b/frameworks/JavaScript/spliffy/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "spliffy", "notes": "directory based routing for node", + "tags": ["broken"], "versus": "nodejs" }, "mongodb": { @@ -41,6 +42,7 @@ "database_os": "Linux", "display_name": "spliffy", "notes": "directory based routing for node", + "tags": ["broken"], "versus": "nodejs" }, "mysql": { @@ -63,6 +65,7 @@ "database_os": "Linux", "display_name": "spliffy", "notes": "directory based routing for node", + "tags": ["broken"], "versus": "nodejs" }, "postgres": { @@ -85,6 +88,7 @@ "database_os": "Linux", "display_name": "spliffy", "notes": "directory based routing for node", + "tags": ["broken"], "versus": "nodejs" } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json b/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json index 2b8ebd26c83..6697013773f 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json +++ b/frameworks/Kotlin/vertx-web-kotlin-coroutines/benchmark_config.json @@ -18,6 +18,7 @@ "database_os": "Linux", "display_name": "vertx-web-kotlin-coroutines", "notes": "", + "tags": ["broken"], "versus": "vertx-web" }, "postgres": { diff --git a/frameworks/Lua/openresty/benchmark_config.json b/frameworks/Lua/openresty/benchmark_config.json index 6b32f71f3de..7fa51aa4a95 100644 --- a/frameworks/Lua/openresty/benchmark_config.json +++ b/frameworks/Lua/openresty/benchmark_config.json @@ -20,6 +20,7 @@ "database_os": "Linux", "display_name": "openresty", "notes": "", + "tags": ["broken"], "versus": "openresty" } }] diff --git a/frameworks/Nim/basolato/benchmark_config.json b/frameworks/Nim/basolato/benchmark_config.json index 1bb2d11484e..e0f90c90dcc 100755 --- a/frameworks/Nim/basolato/benchmark_config.json +++ b/frameworks/Nim/basolato/benchmark_config.json @@ -23,6 +23,7 @@ "database_os": "Linux", "display_name": "Basolato", "notes": "", + "tags": ["broken"], "versus": "httpbeast, prologue" } } diff --git a/frameworks/Nim/httpbeast/benchmark_config.json b/frameworks/Nim/httpbeast/benchmark_config.json index be0ab4480b8..7aa8ac8fc19 100755 --- a/frameworks/Nim/httpbeast/benchmark_config.json +++ b/frameworks/Nim/httpbeast/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "HttpBeast", "notes": "", + "tags": ["broken"], "versus": "None" } } diff --git a/frameworks/Nim/jester/benchmark_config.json b/frameworks/Nim/jester/benchmark_config.json index b5795fba053..61499a79da1 100644 --- a/frameworks/Nim/jester/benchmark_config.json +++ b/frameworks/Nim/jester/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "Jester", "notes": "", + "tags": ["broken"], "versus": "httpbeast" } } diff --git a/frameworks/Nim/nim-stdlib/benchmark_config.json b/frameworks/Nim/nim-stdlib/benchmark_config.json index acd5712689a..710cb9996ea 100644 --- a/frameworks/Nim/nim-stdlib/benchmark_config.json +++ b/frameworks/Nim/nim-stdlib/benchmark_config.json @@ -23,6 +23,7 @@ "database_os": "Linux", "display_name": "nim-stdlib", "notes": "", + "tags": ["broken"], "versus": "httpbeast" } } diff --git a/frameworks/Nim/scorper/benchmark_config.json b/frameworks/Nim/scorper/benchmark_config.json index 77669f6cad2..6a365398a14 100755 --- a/frameworks/Nim/scorper/benchmark_config.json +++ b/frameworks/Nim/scorper/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "scorper", "notes": "", + "tags": ["broken"], "versus": "httpbeast" } } diff --git a/frameworks/PHP/fomo/benchmark_config.json b/frameworks/PHP/fomo/benchmark_config.json index f79f7905e7e..817107d03d2 100755 --- a/frameworks/PHP/fomo/benchmark_config.json +++ b/frameworks/PHP/fomo/benchmark_config.json @@ -23,9 +23,9 @@ "database_os": "Linux", "display_name": "Fomo", "notes": "", + "tags": ["broken"], "versus": "swoole" } } ] } - \ No newline at end of file diff --git a/frameworks/PHP/fuel/benchmark_config.json b/frameworks/PHP/fuel/benchmark_config.json index d831c427cc3..98761b3a7a4 100644 --- a/frameworks/PHP/fuel/benchmark_config.json +++ b/frameworks/PHP/fuel/benchmark_config.json @@ -20,6 +20,7 @@ "database_os": "Linux", "display_name": "fuel", "notes": "", + "tags": ["broken"], "versus": "php" } }] diff --git a/frameworks/Perl/plack/benchmark_config.json b/frameworks/Perl/plack/benchmark_config.json index 6cf3d2a19ff..d3b26a6f800 100644 --- a/frameworks/Perl/plack/benchmark_config.json +++ b/frameworks/Perl/plack/benchmark_config.json @@ -39,6 +39,7 @@ "database_os": "Linux", "display_name": "plack-async", "notes": "", + "tags": ["broken"], "versus": "plack" } }] diff --git a/frameworks/Python/eve/benchmark_config.json b/frameworks/Python/eve/benchmark_config.json index 3e9e7cdc102..cb11c1586d1 100644 --- a/frameworks/Python/eve/benchmark_config.json +++ b/frameworks/Python/eve/benchmark_config.json @@ -18,6 +18,7 @@ "database_os": "Linux", "display_name": "Eve", "notes": "", + "tags": ["broken"], "versus": "" } }] diff --git a/frameworks/Python/flask/benchmark_config.json b/frameworks/Python/flask/benchmark_config.json index dad6b8ef11a..ee505a984c0 100644 --- a/frameworks/Python/flask/benchmark_config.json +++ b/frameworks/Python/flask/benchmark_config.json @@ -45,7 +45,7 @@ "display_name": "Flask [Meinheld] [Raw]", "notes": "", "versus": "wsgi", - "tags": [ ] + "tags": [ "broken" ] }, "socketify-wsgi": { "json_url": "/json-raw", @@ -83,6 +83,7 @@ "database_os": "Linux", "display_name": "Flask [socketify.py] [PyPy3]", "notes": "PyPy", + "tags": ["broken"], "versus": "wsgi" }, "pypy": { diff --git a/frameworks/Python/klein/benchmark_config.json b/frameworks/Python/klein/benchmark_config.json index e43ece59d8d..e00da480751 100644 --- a/frameworks/Python/klein/benchmark_config.json +++ b/frameworks/Python/klein/benchmark_config.json @@ -21,6 +21,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "Klein", + "tags": ["broken"], "notes": "CPython 2.7" } }] diff --git a/frameworks/Python/turbogears/benchmark_config.json b/frameworks/Python/turbogears/benchmark_config.json index cfd4c3efda7..162dbb38e64 100644 --- a/frameworks/Python/turbogears/benchmark_config.json +++ b/frameworks/Python/turbogears/benchmark_config.json @@ -21,6 +21,7 @@ "os": "Linux", "database_os": "Linux", "display_name": "TurboGears", + "tags": ["broken"], "notes": "CPython 2.7" } }] diff --git a/frameworks/Python/web2py/benchmark_config.json b/frameworks/Python/web2py/benchmark_config.json index d1349f5633e..c8bf7c94bf0 100644 --- a/frameworks/Python/web2py/benchmark_config.json +++ b/frameworks/Python/web2py/benchmark_config.json @@ -22,6 +22,7 @@ "database_os": "Linux", "display_name": "web2py-standard", "notes": "CPython 2.7", + "tags": ["broken"], "versus": "wsgi" }, "optimized": { @@ -44,6 +45,7 @@ "database_os": "Linux", "display_name": "web2py-optimized", "notes": "CPython 2.7", + "tags": ["broken"], "versus": "wsgi" } }] diff --git a/frameworks/Rust/gotham/benchmark_config.json b/frameworks/Rust/gotham/benchmark_config.json index 2ee7db2a39f..8813ea15eed 100755 --- a/frameworks/Rust/gotham/benchmark_config.json +++ b/frameworks/Rust/gotham/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "Gotham", "notes": "", + "tags": ["broken"], "versus": "None" } } diff --git a/frameworks/Rust/pavex/benchmark_config.json b/frameworks/Rust/pavex/benchmark_config.json index e9decbdcdd9..1a4bc1856a7 100755 --- a/frameworks/Rust/pavex/benchmark_config.json +++ b/frameworks/Rust/pavex/benchmark_config.json @@ -18,6 +18,7 @@ "database_os": "Linux", "display_name": "pavex", "notes": "", + "tags": ["broken"], "versus": "None" } } diff --git a/frameworks/Rust/rocket/benchmark_config.json b/frameworks/Rust/rocket/benchmark_config.json index 2569f14f9ef..fb37d7377e9 100755 --- a/frameworks/Rust/rocket/benchmark_config.json +++ b/frameworks/Rust/rocket/benchmark_config.json @@ -22,6 +22,7 @@ "database_os": "Linux", "display_name": "Rocket", "notes": "", + "tags": ["broken"], "versus": "None" }, "diesel": { diff --git a/frameworks/Rust/salvo/benchmark_config.json b/frameworks/Rust/salvo/benchmark_config.json index 2890085bf66..d5f4d1f91a0 100644 --- a/frameworks/Rust/salvo/benchmark_config.json +++ b/frameworks/Rust/salvo/benchmark_config.json @@ -19,6 +19,7 @@ "database_os": "Linux", "display_name": "Salvo", "notes": "", + "tags": ["broken"], "versus": "None" }, "diesel": { @@ -39,6 +40,7 @@ "database_os": "Linux", "display_name": "Salvo [postgres-diesel]", "notes": "", + "tags": ["broken"], "versus": "None" }, "pg": { @@ -59,6 +61,7 @@ "database_os": "Linux", "display_name": "Salvo [postgres]", "notes": "", + "tags": ["broken"], "versus": "None" }, "pg-pool": { @@ -79,6 +82,7 @@ "database_os": "Linux", "display_name": "Salvo [postgres-deadpool]", "notes": "", + "tags": ["broken"], "versus": "None" }, "mongo": { @@ -99,6 +103,7 @@ "database_os": "Linux", "display_name": "Salvo [mongodb]", "notes": "", + "tags": ["broken"], "versus": "None" }, "mongo-raw": { @@ -118,6 +123,7 @@ "database_os": "Linux", "display_name": "Salvo [mongodb-raw]", "notes": "", + "tags": ["broken"], "versus": "None" }, "sqlx": { @@ -136,6 +142,7 @@ "database_os": "Linux", "display_name": "Salvo [postgres-sqlx]", "notes": "", + "tags": ["broken"], "versus": "None" }, "lru": { @@ -153,6 +160,7 @@ "database_os": "Linux", "display_name": "Salvo [lru]", "notes": "", + "tags": ["broken"], "versus": "None" } } diff --git a/frameworks/Rust/warp-rust/benchmark_config.json b/frameworks/Rust/warp-rust/benchmark_config.json index 5d91146bef5..1f159f54957 100755 --- a/frameworks/Rust/warp-rust/benchmark_config.json +++ b/frameworks/Rust/warp-rust/benchmark_config.json @@ -22,6 +22,7 @@ "database_os": "Linux", "display_name": "warp-rust", "notes": "", + "tags": ["broken"], "versus": "None" } } From f4188f00397f0340b3a140f79773b313ba728aa9 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Nov 2025 17:58:07 +0100 Subject: [PATCH 1746/1766] Warn if frameworks exceed the maximum number of test mutations (#9667) > The number of test mutations will be limited to 10. https://github.com/TechEmpower/FrameworkBenchmarks/issues/8420 This change shows a warning message for frameworks if the maximum is reached. --- toolset/utils/metadata.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/toolset/utils/metadata.py b/toolset/utils/metadata.py index 6e440fc23ab..6f7388828b8 100644 --- a/toolset/utils/metadata.py +++ b/toolset/utils/metadata.py @@ -191,6 +191,18 @@ def parse_config(self, config, directory): % config['framework'], color=Fore.YELLOW) + # Check that each framework does not have more than the maximum number of tests + maximum_tests = 10 + non_broken_tests_filter = lambda test: (not hasattr(test, "tags")) or ("broken" not in test.tags) + non_broken_tests_to_run = list(filter(non_broken_tests_filter, tests_to_run)) + if len(non_broken_tests_to_run) > maximum_tests: + message = [ + "Framework %s defines %s tests in benchmark_config.json (max is %s)." + % (config['framework'], len(non_broken_tests_to_run), maximum_tests), + "Contact maintainers and remove deprecated or discarded ones to make room." + ] + log("\n".join(message), color=Fore.YELLOW) + # Check that each test configuration is acceptable # Throw exceptions if a field is missing, or how to improve the field for test_name, test_keys in test.items(): From 140ebc97b22cffc2026d4505ec7877a2a94246ea Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Tue, 11 Nov 2025 09:03:56 -0800 Subject: [PATCH 1747/1766] Add --force-rm flag (#9727) * feat: add `--force-rm` flag to configure removing intermediate docker layers This commit makes it possible to turn off the removal of intermediate docker layers when building the tfb containers by adding a `--force-rm` flag to the tfb script. This is useful in situations where you want to inspect the intermediate layers for debugging purposes, or for caching builds of dependencies as a docker layer to speed up the build process. Note that the default behavior is to remove the intermediate layers to avoid filling up the disk with unused layers on the citrine server. Fixes: https://github.com/TechEmpower/FrameworkBenchmarks/issues/9718 * hyper: cache dependencies to reduce build time This change reduces the time it takes to build the hyper Docker image by caching the dependency builds. This is done by building a dummy binary before copying the source code into the image. * Change default for --force-rm to False --------- Co-authored-by: Mike Smith --- frameworks/Rust/hyper/hyper.dockerfile | 13 +++++++++++-- toolset/run-tests.py | 4 ++++ toolset/utils/benchmark_config.py | 1 + toolset/utils/docker_helper.py | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/frameworks/Rust/hyper/hyper.dockerfile b/frameworks/Rust/hyper/hyper.dockerfile index b2f6b8cb6b3..4816011104f 100644 --- a/frameworks/Rust/hyper/hyper.dockerfile +++ b/frameworks/Rust/hyper/hyper.dockerfile @@ -1,8 +1,17 @@ FROM rust:1.85 AS hyper WORKDIR /src -COPY . . -RUN RUSTFLAGS="-C target-cpu=native" cargo install --path . --locked +ENV RUSTFLAGS="-C target-cpu=native" + +# Cache dependency builds (requires passing --force-rm False to tfb command) +COPY Cargo.toml Cargo.lock /src/ +RUN mkdir src \ + && echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs \ + && cargo build --release \ + && rm -rfv src/ target/release/hyper-techempower* target/release/deps/hyper_techempower* + +COPY . /src/ +RUN cargo install --path . --locked EXPOSE 8080 CMD ["hyper-techempower"] HEALTHCHECK CMD curl --fail http://localhost:8080/ping || exit 1 \ No newline at end of file diff --git a/toolset/run-tests.py b/toolset/run-tests.py index a70fff3a490..ac24969c4e4 100644 --- a/toolset/run-tests.py +++ b/toolset/run-tests.py @@ -208,6 +208,10 @@ def main(argv=None): nargs='*', default=None, help='Extra docker arguments to be passed to the test container') + parser.add_argument( + '--force-rm', + default=False, + help='Remove intermediate docker containers after running.') # Network options parser.add_argument( diff --git a/toolset/utils/benchmark_config.py b/toolset/utils/benchmark_config.py index 04dcc2c6cc3..d73dcb4125c 100644 --- a/toolset/utils/benchmark_config.py +++ b/toolset/utils/benchmark_config.py @@ -57,6 +57,7 @@ def __init__(self, args): self.cpuset_cpus = args.cpuset_cpus self.test_container_memory = args.test_container_memory self.extra_docker_runtime_args = args.extra_docker_runtime_args + self.force_rm_intermediate_docker_layers = args.force_rm if self.network_mode is None: self.network = 'tfb' diff --git a/toolset/utils/docker_helper.py b/toolset/utils/docker_helper.py index e48a910e99d..f25a9d133a0 100644 --- a/toolset/utils/docker_helper.py +++ b/toolset/utils/docker_helper.py @@ -39,7 +39,7 @@ def __build(self, base_url, path, build_log_file, log_prefix, dockerfile, path=path, dockerfile=dockerfile, tag=tag, - forcerm=True, + forcerm=self.benchmarker.config.force_rm_intermediate_docker_layers, timeout=3600, pull=True, buildargs=buildargs, From fced31e613e5df4998e5b663636e1176bec40eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Tue, 11 Nov 2025 18:18:29 +0100 Subject: [PATCH 1748/1766] Update some CSharp frameworks to latest (#10184) --- .../embedio/Benchmarks/Benchmarks.csproj | 26 ++++++++--------- .../CSharp/embedio/Benchmarks/Program.cs | 14 ++++++---- frameworks/CSharp/embedio/README.md | 6 ++-- frameworks/CSharp/embedio/embedio.dockerfile | 6 ++-- .../genhttp/Benchmarks/Benchmarks.csproj | 8 +++--- .../Benchmarks/Benchmarks.csproj | 28 +++++++++---------- .../Benchmarks/HttpBenchmarkSession.cs | 2 +- .../netcoreserver/Benchmarks/Program.cs | 6 ++-- frameworks/CSharp/netcoreserver/README.md | 6 ++-- .../netcoreserver/netcoreserver.dockerfile | 6 ++-- 10 files changed, 55 insertions(+), 53 deletions(-) diff --git a/frameworks/CSharp/embedio/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/embedio/Benchmarks/Benchmarks.csproj index 19e73c8b7c4..0015577d97e 100644 --- a/frameworks/CSharp/embedio/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/embedio/Benchmarks/Benchmarks.csproj @@ -1,23 +1,23 @@  - + - - net5.0 - 9.0 - + + net9.0 + 13.0 + EmbedIO Benchmarks Test suite to be executed with TechEmpower FrameworkBenchmarks. - - Benchmarks.Program + + Benchmarks.Program Exe - + true false - + - + - + - - \ No newline at end of file + + diff --git a/frameworks/CSharp/embedio/Benchmarks/Program.cs b/frameworks/CSharp/embedio/Benchmarks/Program.cs index db1f8734c3e..f554daee530 100644 --- a/frameworks/CSharp/embedio/Benchmarks/Program.cs +++ b/frameworks/CSharp/embedio/Benchmarks/Program.cs @@ -1,10 +1,12 @@ -using EmbedIO; -using Swan.Logging; -using System; +using System; using System.Text; using System.Threading; using System.Threading.Tasks; +using EmbedIO; + +using Swan.Logging; + namespace Benchmarks { @@ -21,7 +23,7 @@ public class JsonResult public static class Program { - private static readonly ManualResetEvent _WaitEvent = new ManualResetEvent(false); + private static readonly ManualResetEvent WaitEvent = new(false); public static async Task Main(string[] args) { @@ -60,12 +62,12 @@ public static async Task Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += (_, __) => { - _WaitEvent.Set(); + WaitEvent.Set(); }; await server.RunAsync(); - _WaitEvent.WaitOne(); + WaitEvent.WaitOne(); return 0; } diff --git a/frameworks/CSharp/embedio/README.md b/frameworks/CSharp/embedio/README.md index f04d7d2ecd9..afa7412870f 100644 --- a/frameworks/CSharp/embedio/README.md +++ b/frameworks/CSharp/embedio/README.md @@ -6,17 +6,17 @@ See the [project website](https://github.com/unosquare/embedio) for more informa **Language** -* C# 9.0 +* C# 13.0 **Platforms** -* .NET 5 +* .NET 9 **Web Servers** * [EmbedIO](https://github.com/unosquare/embedio) -## Paths & Source for Tests +## Paths \& Source for Tests * [Plaintext](Benchmarks/Program.cs): "/plaintext" * [JSON](Benchmarks/Program.cs): "/json" diff --git a/frameworks/CSharp/embedio/embedio.dockerfile b/frameworks/CSharp/embedio/embedio.dockerfile index 675c16d8841..35e05ff1fc4 100644 --- a/frameworks/CSharp/embedio/embedio.dockerfile +++ b/frameworks/CSharp/embedio/embedio.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build WORKDIR /source # copy csproj and restore as distinct layers @@ -7,10 +7,10 @@ RUN dotnet restore -r linux-musl-x64 # copy and publish app and libraries COPY Benchmarks/ . -RUN dotnet publish -c release -o /app -r linux-musl-x64 +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained # final stage/image -FROM mcr.microsoft.com/dotnet/runtime-deps:5.0-alpine +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine WORKDIR /app COPY --from=build /app . diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index 529f7add6ca..1189d0c151c 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -26,11 +26,11 @@ - - + + - - + + diff --git a/frameworks/CSharp/netcoreserver/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/netcoreserver/Benchmarks/Benchmarks.csproj index 6d372b01ee3..8315e4a6e83 100644 --- a/frameworks/CSharp/netcoreserver/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/netcoreserver/Benchmarks/Benchmarks.csproj @@ -1,24 +1,24 @@  - + - - net5.0 - 9.0 - + + net9.0 + 13.0 + EmbedIO Benchmarks Test suite to be executed with TechEmpower FrameworkBenchmarks. - - Benchmarks.Program + + Benchmarks.Program Exe - + true false - + - + - - + + - - \ No newline at end of file + + diff --git a/frameworks/CSharp/netcoreserver/Benchmarks/HttpBenchmarkSession.cs b/frameworks/CSharp/netcoreserver/Benchmarks/HttpBenchmarkSession.cs index 25e58bd5aa1..bb99ce8f2c1 100644 --- a/frameworks/CSharp/netcoreserver/Benchmarks/HttpBenchmarkSession.cs +++ b/frameworks/CSharp/netcoreserver/Benchmarks/HttpBenchmarkSession.cs @@ -27,7 +27,7 @@ protected override void OnReceivedRequest(HttpRequest request) } else { - SendResponseAsync(Response.MakeErrorResponse("Not found", 404)); + SendResponseAsync(Response.MakeErrorResponse(404, "Not found")); } } diff --git a/frameworks/CSharp/netcoreserver/Benchmarks/Program.cs b/frameworks/CSharp/netcoreserver/Benchmarks/Program.cs index 411569ffb2f..3a821463b10 100644 --- a/frameworks/CSharp/netcoreserver/Benchmarks/Program.cs +++ b/frameworks/CSharp/netcoreserver/Benchmarks/Program.cs @@ -8,7 +8,7 @@ namespace Benchmarks public static class Program { - private static readonly ManualResetEvent _WaitEvent = new ManualResetEvent(false); + private static readonly ManualResetEvent WaitEvent = new(false); public static int Main(string[] args) { @@ -18,12 +18,12 @@ public static int Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += (_, __) => { - _WaitEvent.Set(); + WaitEvent.Set(); }; server.Start(); - _WaitEvent.WaitOne(); + WaitEvent.WaitOne(); return 0; } diff --git a/frameworks/CSharp/netcoreserver/README.md b/frameworks/CSharp/netcoreserver/README.md index 985758c2bc9..31c1e995dcd 100644 --- a/frameworks/CSharp/netcoreserver/README.md +++ b/frameworks/CSharp/netcoreserver/README.md @@ -6,17 +6,17 @@ See the [project website](https://github.com/chronoxor/NetCoreServer) for more i **Language** -* C# 9.0 +* C# 13.0 **Platforms** -* .NET 5 +* .NET 9 **Web Servers** * [NetCoreServer](https://github.com/chronoxor/NetCoreServer) -## Paths & Source for Tests +## Paths \& Source for Tests * [Plaintext](Benchmarks/HttpBenchmarkSession.cs): "/plaintext" * [JSON](Benchmarks/HttpBenchmarkSession.cs): "/json" diff --git a/frameworks/CSharp/netcoreserver/netcoreserver.dockerfile b/frameworks/CSharp/netcoreserver/netcoreserver.dockerfile index 675c16d8841..35e05ff1fc4 100644 --- a/frameworks/CSharp/netcoreserver/netcoreserver.dockerfile +++ b/frameworks/CSharp/netcoreserver/netcoreserver.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build WORKDIR /source # copy csproj and restore as distinct layers @@ -7,10 +7,10 @@ RUN dotnet restore -r linux-musl-x64 # copy and publish app and libraries COPY Benchmarks/ . -RUN dotnet publish -c release -o /app -r linux-musl-x64 +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained # final stage/image -FROM mcr.microsoft.com/dotnet/runtime-deps:5.0-alpine +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine WORKDIR /app COPY --from=build /app . From e6c7d05c1ea6978f15fa0926197bcdf8a98b48d1 Mon Sep 17 00:00:00 2001 From: cclilshy Date: Wed, 12 Nov 2025 02:34:12 +0800 Subject: [PATCH 1749/1766] [PHP/ripple] Sync the update of the Ripple (#10223) * Sync the update of the Ripple * Sync the update of the Ripple --- frameworks/PHP/ripple/server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/ripple/server.php b/frameworks/PHP/ripple/server.php index 7d197c53a89..400e9fd574b 100644 --- a/frameworks/PHP/ripple/server.php +++ b/frameworks/PHP/ripple/server.php @@ -5,7 +5,7 @@ use Ripple\Database\Interface\AbstractResultSet; use Ripple\Database\MySQL\Client; use Ripple\Net\Http\Server; -use Ripple\Net\Http\Server\Request; +use Ripple\Net\Http\Request; use Ripple\Sync\Channel; use Ripple\Sync\WaitGroup; use Ripple\Worker; From d4197fad5f503884acead8a533980bb0df22a693 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Tue, 11 Nov 2025 22:24:51 +0100 Subject: [PATCH 1750/1766] [ruby/padrino] Cleanup for Iodine (#10271) Remove some unused code. --- frameworks/Ruby/padrino/app/controllers.rb | 4 ---- frameworks/Ruby/padrino/config/database.rb | 11 +++-------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/frameworks/Ruby/padrino/app/controllers.rb b/frameworks/Ruby/padrino/app/controllers.rb index c2a3291d797..e5a200c7f2c 100644 --- a/frameworks/Ruby/padrino/app/controllers.rb +++ b/frameworks/Ruby/padrino/app/controllers.rb @@ -7,10 +7,6 @@ response['Server'] = 'padrino' end - after do - response['Date'] = Time.now.httpdate - end if defined?(Puma) - get '/json', :provides => [:json] do {message: "Hello, World!"}.to_json end diff --git a/frameworks/Ruby/padrino/config/database.rb b/frameworks/Ruby/padrino/config/database.rb index 06324898cd9..c4bf9d564d2 100644 --- a/frameworks/Ruby/padrino/config/database.rb +++ b/frameworks/Ruby/padrino/config/database.rb @@ -8,14 +8,9 @@ } # Determine threading/thread pool size and timeout -if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 - opts[:pool] = threads - opts[:checkout_timeout] = 10 -else - # TODO: ActiveRecord doesn't have a single-threaded mode? - opts[:pool] = 1 - opts[:checkout_timeout] = 0 -end +# TODO: ActiveRecord doesn't have a single-threaded mode? +opts[:pool] = 512 +opts[:checkout_timeout] = 5 # Setup our logger From 92bf758fd3771da4522f6954b5da69f6153b1bf5 Mon Sep 17 00:00:00 2001 From: rio Date: Thu, 13 Nov 2025 06:32:25 +0900 Subject: [PATCH 1751/1766] [PHP] remove unused extension, polyfill (#10272) * [PHP] remove unused extension, polyfill symfony, laravel * [PHP] add laravel, symfony workers intl extension --- frameworks/PHP/laravel/composer.json | 16 ++++++++++++++++ .../laravel/laravel-octane-frankenphp.dockerfile | 7 ++++--- frameworks/PHP/laravel/laravel-ripple.dockerfile | 3 ++- .../PHP/laravel/laravel-roadrunner.dockerfile | 7 +++++-- frameworks/PHP/laravel/laravel-swoole.dockerfile | 4 ++-- .../PHP/laravel/laravel-workerman.dockerfile | 2 +- frameworks/PHP/symfony/composer.json | 1 + frameworks/PHP/symfony/symfony-mysql.dockerfile | 2 +- frameworks/PHP/symfony/symfony.dockerfile | 2 +- 9 files changed, 33 insertions(+), 11 deletions(-) diff --git a/frameworks/PHP/laravel/composer.json b/frameworks/PHP/laravel/composer.json index 391fa9a1106..be731270c67 100644 --- a/frameworks/PHP/laravel/composer.json +++ b/frameworks/PHP/laravel/composer.json @@ -25,6 +25,22 @@ "App\\": "app/" } }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-mbstring":"*", + "symfony/polyfill-intl-idn": "*", + "symfony/polyfill-intl-normalizer": "*", + "symfony/polyfill-intl-grapheme": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php73": "*", + "symfony/polyfill-php74": "*", + "symfony/polyfill-php80": "*", + "symfony/polyfill-php81": "*", + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php84": "*" + }, "minimum-stability": "stable", "prefer-stable": true, "scripts": { diff --git a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile index b483b396d10..da9fc1c16c5 100644 --- a/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile +++ b/frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile @@ -1,12 +1,13 @@ FROM dunglas/frankenphp - + +RUN apt-get update -yqq && apt-get install libicu-dev unzip -y RUN install-php-extensions \ + intl \ pcntl \ pdo_mysql \ zip > /dev/null - -COPY --link . /app/ +COPY --link . /app/ COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer RUN mkdir -p bootstrap/cache \ diff --git a/frameworks/PHP/laravel/laravel-ripple.dockerfile b/frameworks/PHP/laravel/laravel-ripple.dockerfile index 2fc4a480716..0ce2de40016 100644 --- a/frameworks/PHP/laravel/laravel-ripple.dockerfile +++ b/frameworks/PHP/laravel/laravel-ripple.dockerfile @@ -4,6 +4,7 @@ RUN apt-get update -yqq >> /dev/null RUN apt-get install -y libevent-dev \ libssl-dev \ pkg-config \ + libicu-dev \ build-essential \ unzip >> /dev/null @@ -15,7 +16,7 @@ RUN docker-php-ext-install pdo_mysql \ RUN pecl install event >> /dev/null -RUN docker-php-ext-enable pdo_mysql opcache posix pcntl sockets +RUN docker-php-ext-enable intl pdo_mysql opcache posix pcntl sockets RUN docker-php-ext-enable --ini-name zz-event.ini event RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini diff --git a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile index 9a0c3aed98b..730df104fea 100644 --- a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile +++ b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile @@ -1,6 +1,7 @@ FROM php:8.4-cli - -RUN docker-php-ext-install pdo_mysql pcntl opcache sockets > /dev/null +RUN apt-get update -yqq && \ + apt-get install -yqq libpq-dev libicu-dev > /dev/null && \ +docker-php-ext-install intl pdo_mysql pcntl opcache sockets > /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini @@ -26,6 +27,8 @@ RUN composer require laravel/octane --update-no-dev --no-scripts --quiet RUN php artisan octane:install --server="roadrunner" RUN php artisan optimize +RUN export WORKERS=$((1*$(nproc))) +RUN if [ $(nproc) > 2 ]; then export WORKERS=$((1*$(nproc) -1)) ; fi; EXPOSE 8080 # https://artisan.page/12.x/ diff --git a/frameworks/PHP/laravel/laravel-swoole.dockerfile b/frameworks/PHP/laravel/laravel-swoole.dockerfile index de27380656d..89dacff8abe 100644 --- a/frameworks/PHP/laravel/laravel-swoole.dockerfile +++ b/frameworks/PHP/laravel/laravel-swoole.dockerfile @@ -1,7 +1,7 @@ FROM phpswoole/swoole:php8.4 -RUN docker-php-ext-install pcntl opcache curl > /dev/null - +RUN apt-get update -yqq && apt-get install libicu-dev -y +RUN docker-php-ext-install intl pcntl opcache> /dev/null RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini diff --git a/frameworks/PHP/laravel/laravel-workerman.dockerfile b/frameworks/PHP/laravel/laravel-workerman.dockerfile index 8b016a50626..d652fa11f84 100644 --- a/frameworks/PHP/laravel/laravel-workerman.dockerfile +++ b/frameworks/PHP/laravel/laravel-workerman.dockerfile @@ -6,7 +6,7 @@ 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 && \ apt-get install -yqq git unzip \ - php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl > /dev/null + php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-intl php8.4-curl > /dev/null COPY --from=composer --link /usr/bin/composer /usr/local/bin/composer diff --git a/frameworks/PHP/symfony/composer.json b/frameworks/PHP/symfony/composer.json index f6bfbca31d6..9061d99d608 100644 --- a/frameworks/PHP/symfony/composer.json +++ b/frameworks/PHP/symfony/composer.json @@ -41,6 +41,7 @@ "replace": { "symfony/polyfill-ctype": "*", "symfony/polyfill-iconv": "*", + "symfony/polyfill-mbstring":"*", "symfony/polyfill-php72": "*", "symfony/polyfill-php73": "*", "symfony/polyfill-php74": "*", diff --git a/frameworks/PHP/symfony/symfony-mysql.dockerfile b/frameworks/PHP/symfony/symfony-mysql.dockerfile index 157a9179660..a09d877ade2 100644 --- a/frameworks/PHP/symfony/symfony-mysql.dockerfile +++ b/frameworks/PHP/symfony/symfony-mysql.dockerfile @@ -8,7 +8,7 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get install -yqq nginx git unzip curl \ php8.4-cli php8.4-fpm php8.4-mysql \ - php8.4-mbstring php8.4-xml php8.4-curl php8.4-dev > /dev/null + php8.4-mbstring php8.4-xml php8.4-curl > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer diff --git a/frameworks/PHP/symfony/symfony.dockerfile b/frameworks/PHP/symfony/symfony.dockerfile index 2ce94a53eb6..1d2fd84193f 100644 --- a/frameworks/PHP/symfony/symfony.dockerfile +++ b/frameworks/PHP/symfony/symfony.dockerfile @@ -8,7 +8,7 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get install -yqq nginx git unzip curl \ php8.4-bcmath php8.4-cli php8.4-fpm php8.4-pgsql \ - php8.4-mbstring php8.4-xml php8.4-curl php8.4-dev php8.4-intl > /dev/null + php8.4-mbstring php8.4-xml php8.4-curl php8.4-intl > /dev/null COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer From b648eb3d3f821e7f88d3ccd82a3c4077380d5ff6 Mon Sep 17 00:00:00 2001 From: AkazawaYun <62974697+AkazawaYun@users.noreply.github.com> Date: Thu, 13 Nov 2025 05:32:47 +0800 Subject: [PATCH 1752/1766] update test version (#10273) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add new test : CSharp/akazawayun.pro * modify config and code * add content-type * update url * update package version * add 3 new tests: db、queries、updates 1. add 3 new tests: db、queries、updates; 2. split code to multi files; * - * use generated sql instead const string. * update version * fix bug of db query * set port to 8080 * 升级 akazawayun.pro 框架版本到 14 * i forget to update the port change... * test self whether work fine.. * update nuget version * why pr failed... * 不小心多提交了别人的框架...改回 * akazawayun fix bug * remove db test there is some error in mysql * confirmed there is bug in mysql.data 9.5.0 还是用8080端口吧- -b, 都用8080, 改其他的对比测时不方便 * downgrade mysql.data back to 9.4.0 * fix bug of akazawayun.pro * update version of akazawayun.pro * update version * add platform test * update nupkg version * update version * update version. * fix debug --- .../AkazawaYun.Benchmark.Platform.csproj | 2 +- .../MyBenchmarkReceptor.cs | 7 +------ .../AkazawaYun.Benchmark.Platform/Program.cs | 19 ++----------------- 3 files changed, 4 insertions(+), 24 deletions(-) diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj index e43069a4338..cdf987fdeb8 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/AkazawaYun.Benchmark.Platform.csproj @@ -15,7 +15,7 @@ - + diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs index e6ed8e9c5b7..e79ab493524 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/MyBenchmarkReceptor.cs @@ -1,12 +1,10 @@ using AkazawaYun.PRO7; -using System.Text; namespace AkazawaYun.Benchmark.Platform; class MyBenchmarkReceptor : akzWebReceptorBenchmark { readonly JsonModel JsonModel; - readonly ReadOnlyMemory JsonContentLength; public MyBenchmarkReceptor() @@ -15,8 +13,6 @@ public MyBenchmarkReceptor() { message = "Hello, World!" }; - akzJson.Text2Json(JsonModel, out ReadOnlyMemory json); - JsonContentLength = Encoding.UTF8.GetBytes($"{json.Length}\r\n\r\n"); } @@ -26,8 +22,7 @@ public override ValueTask SendPlaintext(IHttpContext http) } public override async ValueTask SendJson(IHttpContext http) { - await http.Slient.Send(DataJson_OnlyHeaderExceptContentLength); - await http.Slient.Send(JsonContentLength); + await http.Slient.Send(DataJson_OnlyHeader); akzJson.Text2Json(JsonModel, out ReadOnlyMemory json); await http.Slient.Send(json); } diff --git a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs index 269c16f48be..e2acab53351 100644 --- a/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs +++ b/frameworks/CSharp/akazawayun.pro/src/AkazawaYun.Benchmark.Platform/Program.cs @@ -5,31 +5,16 @@ namespace AkazawaYun.Benchmark.Platform; class Program { static readonly akzWebBuilder builder; - const int port = 8080; static Program() { akzLog.War("AkazawaYun.PRO 平台压力测试特供版 ver2025.11.3, 只支持 /plaintext 和 /json"); - akzJson.Config(null, AotJsonContext.Default); - builder = akzWebBuilder.Shared.SetPort(port).SetDev(true) - .Add(() => null) - .Add(() => new MyBenchmarkReceptor()) - .Add(() => new(port)) - .Build(); + akzJson.Config(AotJsonContext.Default); + builder = akzWebBuilder.Shared.Build(new MyBenchmarkReceptor()); } static async Task Main() { await builder.Launch(); - - Console.WriteLine("[API SELF-TEST]"); - string url = $"http://localhost:{port}/plaintext"; - Console.WriteLine(" REQ URL :" + url); - string res = await akzHttpClient.Shared.Get(url).FetchString(); - Console.WriteLine(" RES LEN :" + res.Length); - Console.WriteLine(" RES BODY:" + res); - Console.WriteLine("[OK, I WORK FINE]"); - - akzLog.Default = akzLog.Output.NoneButWar; await Task.Delay(-1); } } From 8d81c9b0d6b54130968cfff3d0a037adbf23bd04 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Wed, 12 Nov 2025 21:33:10 +0000 Subject: [PATCH 1753/1766] H2O: Reduce the Docker image build time (#10275) Signed-off-by: Anton Kirilov --- frameworks/C/h2o/CMakeLists.txt | 11 +++++------ frameworks/C/h2o/h2o.dockerfile | 7 +------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/frameworks/C/h2o/CMakeLists.txt b/frameworks/C/h2o/CMakeLists.txt index 5126e991a82..d5062f2b26d 100644 --- a/frameworks/C/h2o/CMakeLists.txt +++ b/frameworks/C/h2o/CMakeLists.txt @@ -19,9 +19,8 @@ find_path(PQ_INCLUDE postgresql/libpq-fe.h REQUIRED) find_path(YAJL_INCLUDE yajl/yajl_gen.h REQUIRED) find_program(BPFTOOL_BIN bpftool REQUIRED) find_program(CLANG_BIN clang REQUIRED) -include_directories(src ${CMAKE_BINARY_DIR}/generated-headers ${BPF_INCLUDE} ${H2O_INCLUDE}) -include_directories(${MUSTACHE_C_INCLUDE} ${NUMA_INCLUDE} ${OPENSSL_INCLUDE} ${PQ_INCLUDE}) -include_directories(${YAJL_INCLUDE}) +include_directories(src ${CMAKE_BINARY_DIR} ${BPF_INCLUDE} ${H2O_INCLUDE} ${MUSTACHE_C_INCLUDE}) +include_directories(${NUMA_INCLUDE} ${OPENSSL_INCLUDE} ${PQ_INCLUDE} ${YAJL_INCLUDE}) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) add_compile_definitions(H2O_USE_LIBUV=0) @@ -32,7 +31,7 @@ set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_FORTIFY_SOURCE=2") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3") add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/generated-headers/socket_load_balancer.h + OUTPUT ${CMAKE_BINARY_DIR}/socket_load_balancer.h COMMAND ${CLANG_BIN} -c -DNDEBUG @@ -47,12 +46,12 @@ add_custom_command( ${WARNING_OPTIONS} ${CMAKE_CURRENT_SOURCE_DIR}/src/bpf/socket_load_balancer.c COMMAND ${BPFTOOL_BIN} gen skeleton ${CMAKE_BINARY_DIR}/socket_load_balancer.o > - ${CMAKE_BINARY_DIR}/generated-headers/socket_load_balancer.h + ${CMAKE_BINARY_DIR}/socket_load_balancer.h DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/bpf/socket_load_balancer.c VERBATIM) add_custom_target( generated_headers - DEPENDS ${CMAKE_BINARY_DIR}/generated-headers/socket_load_balancer.h) + DEPENDS ${CMAKE_BINARY_DIR}/socket_load_balancer.h) file(GLOB_RECURSE HANDLER_SOURCES "src/handlers/*.c") file(GLOB SOURCES "src/*.c") add_executable(${PROJECT_NAME} ${HANDLER_SOURCES} ${SOURCES}) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index a86e36a7ebc..d6713a3e688 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -2,7 +2,7 @@ ARG UBUNTU_VERSION=25.10 ARG H2O_APP_PREFIX=/opt/h2o-app -FROM "ubuntu:${UBUNTU_VERSION}" AS compile +FROM "buildpack-deps:${UBUNTU_VERSION}" AS compile RUN echo "[timing] Installing system packages: $(date)" ARG DEBIAN_FRONTEND=noninteractive @@ -24,15 +24,12 @@ RUN apt-get install \ libnuma-dev \ libpq-dev \ libssl-dev \ - libstdc++-15-dev \ libtool \ liburing-dev \ libuv1-dev \ - libwslay-dev \ libyajl-dev \ libz-dev \ make \ - ninja-build \ pkg-config \ ruby \ systemtap-sdt-dev @@ -47,7 +44,6 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ -B build \ -DCMAKE_C_FLAGS="-flto=auto -march=native -mtune=native" \ -DWITH_MRUBY=on \ - -G Ninja \ -S . && \ cmake --build build -j && \ cmake --install build @@ -72,7 +68,6 @@ RUN cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_FLAGS="-march=native -mtune=native" \ -DCMAKE_INSTALL_PREFIX="${H2O_APP_PREFIX}" \ - -G Ninja \ -S .. && \ cmake --build . -j && \ cmake --install . From 2bb509ea29679219254e782952965534ad366484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Thu, 13 Nov 2025 21:36:36 +0100 Subject: [PATCH 1754/1766] Update GenHTTP to version 10 and udpate to .NET 10 (#10274) * Switch to GenHTTP 10 & .NET 10 * Fix directories in the docker file * Fix DB tests, minor improvements * Align display names with unhinged --- .../genhttp/Benchmarks/Benchmarks.csproj | 15 +++++---- .../CSharp/genhttp/Benchmarks/Program.cs | 4 +++ .../genhttp/Benchmarks/Tests/JsonHandler.cs | 12 +++---- .../Utilities/FixedLengthJsonContent.cs | 31 +++++++++++++++++ .../CSharp/genhttp/benchmark_config.json | 33 ++++++++++++++++--- frameworks/CSharp/genhttp/config.toml | 18 ++++++++++ .../CSharp/genhttp/genhttp-kestrel.dockerfile | 33 +++++++++++++++++++ frameworks/CSharp/genhttp/genhttp.dockerfile | 19 ++++++++--- 8 files changed, 142 insertions(+), 23 deletions(-) create mode 100644 frameworks/CSharp/genhttp/Benchmarks/Utilities/FixedLengthJsonContent.cs create mode 100644 frameworks/CSharp/genhttp/genhttp-kestrel.dockerfile diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index 1189d0c151c..ae302d86dbb 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -2,14 +2,16 @@ - net9.0 - 13.0 + net10.0 + 14.0 true Exe GenHTTP Benchmarks Test suite to be executed with TechEmpower FrameworkBenchmarks. + $(DefineConstants);$(GENHTTP_ENGINE_NAME) + true true @@ -26,11 +28,12 @@ - - + + + - - + + diff --git a/frameworks/CSharp/genhttp/Benchmarks/Program.cs b/frameworks/CSharp/genhttp/Benchmarks/Program.cs index dd55ad6b782..91323662c2d 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Program.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Program.cs @@ -1,7 +1,11 @@ using Benchmarks.Tests; using Benchmarks.Utilities; +#if INTERNAL using GenHTTP.Engine.Internal; +#else +using GenHTTP.Engine.Kestrel; +#endif using GenHTTP.Modules.IO; using GenHTTP.Modules.Layouting; diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs index 4944c669198..7fb89b926d7 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/JsonHandler.cs @@ -1,10 +1,8 @@ -using System.Text.Json; +using Benchmarks.Utilities; using GenHTTP.Api.Content; using GenHTTP.Api.Protocol; -using GenHTTP.Modules.Conversion.Serializers.Json; - namespace Benchmarks.Tests; public sealed class JsonResult @@ -15,9 +13,7 @@ public sealed class JsonResult public sealed class JsonHandler : IHandler { - private static readonly FlexibleContentType _ContentType = new(ContentType.ApplicationJson, "utf-8"); - - private static readonly JsonSerializerOptions _Options = new(); + private static readonly FlexibleContentType ContentType = new(GenHTTP.Api.Protocol.ContentType.ApplicationJson, "utf-8"); public ValueTask PrepareAsync() => new(); @@ -29,8 +25,8 @@ public ValueTask HandleAsync(IRequest request) }; var response = request.Respond() - .Content(new JsonContent(result, _Options)) - .Type(_ContentType) + .Content(new FixedLengthJsonContent(result)) + .Type(ContentType) .Build(); return new(response); diff --git a/frameworks/CSharp/genhttp/Benchmarks/Utilities/FixedLengthJsonContent.cs b/frameworks/CSharp/genhttp/Benchmarks/Utilities/FixedLengthJsonContent.cs new file mode 100644 index 00000000000..7ef372c65f0 --- /dev/null +++ b/frameworks/CSharp/genhttp/Benchmarks/Utilities/FixedLengthJsonContent.cs @@ -0,0 +1,31 @@ +using System.Text.Json; + +using GenHTTP.Api.Protocol; + +using Benchmarks.Tests; + +namespace Benchmarks.Utilities; + +public sealed class FixedLengthJsonContent : IResponseContent +{ + private readonly MemoryStream _buffer = new(); + + public ulong? Length => (ulong)_buffer.Length; + + public FixedLengthJsonContent(JsonResult result) + { + JsonSerializer.SerializeAsync(_buffer, result); + } + + public ValueTask CalculateChecksumAsync() => throw new NotImplementedException(); + + public ValueTask WriteAsync(Stream target, uint bufferSize) + { + _buffer.Seek(0, SeekOrigin.Begin); + + _buffer.CopyTo(target); + + return ValueTask.CompletedTask; + } + +} diff --git a/frameworks/CSharp/genhttp/benchmark_config.json b/frameworks/CSharp/genhttp/benchmark_config.json index bf1780e753a..2943457c204 100644 --- a/frameworks/CSharp/genhttp/benchmark_config.json +++ b/frameworks/CSharp/genhttp/benchmark_config.json @@ -1,5 +1,6 @@ { - "framework": "genhttp", + "framework": "genhttp", + "maintainers": ["Kaliumhexacyanoferrat"], "tests": [{ "default": { "plaintext_url": "/plaintext", @@ -17,11 +18,35 @@ "language": "C#", "orm": "Raw", "platform": ".NET", - "webserver": "Kestrel", + "webserver": "GenHTTP", "os": "Linux", "database_os": "Linux", - "display_name": "GenHTTP", + "display_name": "genhttp [internal]", "notes": "" } - }] + }, + { + "kestrel": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "update_url": "/updates/", + "fortune_url": "/fortunes", + "cached_query_url": "/cached-worlds/", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "GenHTTP", + "language": "C#", + "orm": "Raw", + "platform": ".NET", + "webserver": "Kestrel", + "os": "Linux", + "database_os": "Linux", + "display_name": "genhttp [kestrel]", + "notes": "" + } + }] } diff --git a/frameworks/CSharp/genhttp/config.toml b/frameworks/CSharp/genhttp/config.toml index f984318f53b..538213c05b4 100644 --- a/frameworks/CSharp/genhttp/config.toml +++ b/frameworks/CSharp/genhttp/config.toml @@ -16,5 +16,23 @@ database_os = "Linux" os = "Linux" orm = "Raw" platform = ".NET" +webserver = "GenHTTP" +versus = "None" + +[kestrel] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" +urls.fortune = "/fortunes" +urls.cached_query = "/cached-worlds/" +approach = "Realistic" +classification = "Fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" webserver = "Kestrel" versus = "None" diff --git a/frameworks/CSharp/genhttp/genhttp-kestrel.dockerfile b/frameworks/CSharp/genhttp/genhttp-kestrel.dockerfile new file mode 100644 index 00000000000..e345a538f34 --- /dev/null +++ b/frameworks/CSharp/genhttp/genhttp-kestrel.dockerfile @@ -0,0 +1,33 @@ +FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build +WORKDIR /source + +ENV GENHTTP_ENGINE_NAME=KESTREL +ENV GENHTTP_ENGINE_PACKAGE=GenHTTP.Core.Kestrel + +# copy csproj and restore as distinct layers +COPY Benchmarks/*.csproj . +RUN dotnet restore -r linux-musl-x64 + +# copy and publish app and libraries +COPY Benchmarks/ . +RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained + +# final stage/image +FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-alpine + +ENV DOTNET_GCDynamicAdaptationMode=0 \ + DOTNET_EnableDiagnostics=0 \ + COMPlus_EnableDiagnostics=0 \ + COMPlus_DbgEnableMiniDump=0 \ + COMPlus_DbgEnableMiniDumpCollection=0 \ + COMPlus_DbgMiniDumpType=0 \ + DOTNET_TieredPGO=0 \ + DOTNET_TC_QuickJitForLoops=1 \ + DOTNET_TC_QuickJit=1 + +WORKDIR /app +COPY --from=build /app . + +ENTRYPOINT ["./Benchmarks"] + +EXPOSE 8080 diff --git a/frameworks/CSharp/genhttp/genhttp.dockerfile b/frameworks/CSharp/genhttp/genhttp.dockerfile index 8c473477a61..9414123202e 100644 --- a/frameworks/CSharp/genhttp/genhttp.dockerfile +++ b/frameworks/CSharp/genhttp/genhttp.dockerfile @@ -1,6 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build WORKDIR /source +ENV GENHTTP_ENGINE_NAME=INTERNAL +ENV GENHTTP_ENGINE_PACKAGE=GenHTTP.Core + # copy csproj and restore as distinct layers COPY Benchmarks/*.csproj . RUN dotnet restore -r linux-musl-x64 @@ -10,11 +13,17 @@ COPY Benchmarks/ . RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore --self-contained # final stage/image -FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine +FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-alpine -ENV DOTNET_GCDynamicAdaptationMode=0 -ENV DOTNET_ReadyToRun=0 -ENV DOTNET_HillClimbing_Disable=1 +ENV DOTNET_GCDynamicAdaptationMode=0 \ + DOTNET_EnableDiagnostics=0 \ + COMPlus_EnableDiagnostics=0 \ + COMPlus_DbgEnableMiniDump=0 \ + COMPlus_DbgEnableMiniDumpCollection=0 \ + COMPlus_DbgMiniDumpType=0 \ + DOTNET_TieredPGO=0 \ + DOTNET_TC_QuickJitForLoops=1 \ + DOTNET_TC_QuickJit=1 WORKDIR /app COPY --from=build /app . From b7bca15e4642459862578b2423a8d4f5ffb3ab7b Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Thu, 13 Nov 2025 12:36:58 -0800 Subject: [PATCH 1755/1766] [F#/Oxpecker] Upgraded to .NET10 (#10276) --- frameworks/FSharp/oxpecker/README.md | 2 +- frameworks/FSharp/oxpecker/oxpecker.dockerfile | 4 ++-- frameworks/FSharp/oxpecker/src/App/App.fsproj | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/FSharp/oxpecker/README.md b/frameworks/FSharp/oxpecker/README.md index a35cbf08522..6ac388b2d50 100644 --- a/frameworks/FSharp/oxpecker/README.md +++ b/frameworks/FSharp/oxpecker/README.md @@ -5,7 +5,7 @@ This includes tests for plaintext, json, fortunes, single query, mutliple querie **Language** -* F# 8.0 +* F# 10.0 **Platforms** diff --git a/frameworks/FSharp/oxpecker/oxpecker.dockerfile b/frameworks/FSharp/oxpecker/oxpecker.dockerfile index 6424bcad50c..480ed2e3dd8 100644 --- a/frameworks/FSharp/oxpecker/oxpecker.dockerfile +++ b/frameworks/FSharp/oxpecker/oxpecker.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /app COPY src/App . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime ENV DOTNET_GCDynamicAdaptationMode=0 ENV DOTNET_ReadyToRun 0 diff --git a/frameworks/FSharp/oxpecker/src/App/App.fsproj b/frameworks/FSharp/oxpecker/src/App/App.fsproj index d54b0983e8b..c19d5d614ac 100644 --- a/frameworks/FSharp/oxpecker/src/App/App.fsproj +++ b/frameworks/FSharp/oxpecker/src/App/App.fsproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 false @@ -13,10 +13,10 @@ - - - - + + + + \ No newline at end of file From 40ce2dba0b5c02703ec86116821be2455a9cbf9a Mon Sep 17 00:00:00 2001 From: rio Date: Fri, 14 Nov 2025 05:37:20 +0900 Subject: [PATCH 1756/1766] [PHP] Update PHP eloquent ORM (#10277) Update 8.x to 11.x Add php-curl extension --- frameworks/PHP/php/apc.php | 10 +++++----- .../PHP/php/deploy/eloquent/composer.json | 19 ++++++++++++++++--- frameworks/PHP/php/php-eloquent.dockerfile | 3 ++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/frameworks/PHP/php/apc.php b/frameworks/PHP/php/apc.php index 78e01fb4430..1ed4e7e4d1c 100644 --- a/frameworks/PHP/php/apc.php +++ b/frameworks/PHP/php/apc.php @@ -70,11 +70,11 @@ function defaults($d,$v) { } // operation constants -define('OB_HOST_STATS',1); -define('OB_SYS_CACHE',2); -define('OB_USER_CACHE',3); -define('OB_SYS_CACHE_DIR',4); -define('OB_VERSION_CHECK',9); +const OB_HOST_STATS = 1; +const OB_SYS_CACHE = 2; +const OB_USER_CACHE = 3; +const OB_SYS_CACHE_DIR = 4; +const OB_VERSION_CHECK = 9; // check validity of input variables $vardom=array( diff --git a/frameworks/PHP/php/deploy/eloquent/composer.json b/frameworks/PHP/php/deploy/eloquent/composer.json index e75de3f79ad..ebb6a48c6c9 100644 --- a/frameworks/PHP/php/deploy/eloquent/composer.json +++ b/frameworks/PHP/php/deploy/eloquent/composer.json @@ -1,7 +1,20 @@ { "require": { - "illuminate/database": "8.16.*", - "illuminate/events": "8.16.*", - "illuminate/container": "8.16.*" + "illuminate/database": "11.*", + "illuminate/events": "11.*", + "illuminate/container": "11.*" + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-mbstring":"*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php73": "*", + "symfony/polyfill-php74": "*", + "symfony/polyfill-php80": "*", + "symfony/polyfill-php81": "*", + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php84": "*" } } \ No newline at end of file diff --git a/frameworks/PHP/php/php-eloquent.dockerfile b/frameworks/PHP/php/php-eloquent.dockerfile index ea2e74e1c9a..5f9c0616938 100644 --- a/frameworks/PHP/php/php-eloquent.dockerfile +++ b/frameworks/PHP/php/php-eloquent.dockerfile @@ -5,7 +5,8 @@ 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.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-dev > /dev/null + apt-get install -yqq nginx git unzip \ + php8.4 php8.4-common php8.4-cli php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer From 5060bd2bee6ff77b293eefe4650d93538e495186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <76547834+RRQM@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:28:59 +0800 Subject: [PATCH 1757/1766] Add touchsocket platform test (#10278) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update(touchsocket):version to 4.0.0-rc.2 * update(touchsocket):version to 4.0.0-rc.5 * optimize(touchsocket):scheduler * Performance (TouchSocketHttp, TouchSocketWebApi): Enable server garbage collection * update(touchsocket):version to 4.0.0-rc.15 * update(touchsocket):version to 4.0.0-rc42 * 重构(Program): 显式指定变量类型并优化配置 显式指定变量类型以提高代码可读性和类型安全性 修改命名空间为 `TouchSocketHttp` 将 `options.BufferOnDemand` 默认值从 `false` 修改为 `true` 调整 `SetTransportOption` 和 `ApiServer` 中的相关代码 * 优化(csproj): 升级TouchSocket包版本 在TouchSocketHttp.csproj和TouchSocketWebApi.csproj中,将TouchSocket.Hosting和TouchSocket.WebApi的包引用版本从4.0.0-rc.42升级到4.0.0-rc.44,以修复错误、提高性能或增加新功能 * Add(TouchSocket):platform test * Add:Platform config * 优化(Program.cs): 替换 Console.ReadKey 为 Console.ReadLine 替换 Program.cs 文件中 Program 类的 Console.ReadKey 为 Console.ReadLine 更改目的是更方便地处理用户输入或与其他代码逻辑保持一致 * 优化: 移除不必要的 ServerGarbageCollection 属性并统一命名空间为 TouchSocketHttpPlatform * 优化(Program): 调整HTTP服务器启动逻辑 重构服务器启动流程以支持更灵活的配置: - 替换server.StartAsync(8080)为server.SetupAsync配置流程 - 配置监听端口、最大连接数及控制台日志记录器 - 删除server.SafeDispose,改为通过while(true)保持运行 - 删除直接调用Console.ReadLine的逻辑 * 重构(project): 更新项目依赖和SDK配置 更新 `TouchSocketHttp.csproj` 的项目 SDK 为 `Microsoft.NET.Sdk`,移除 `` 配置 移除 `Microsoft.Extensions.Hosting` 和 `TouchSocket.Hosting` 旧版本依赖,更新 `TouchSocket.WebApi` 至 `4.0.0-rc.46` 更新 `TouchSocketHttpPlatform.csproj` 中 `TouchSocket` 包版本至 `4.0.0-rc.46` 更新 `TouchSocketWebApi.csproj` 中 `TouchSocket.Hosting` 和 `TouchSocket.WebApi` 包版本至 `4.0.0-rc.46` * 新增(config): 添加 NuGet.Config 配置文件 添加新的 NuGet.Config 文件,包含以下更改: - 引入 XML 声明,版本为 1.0,编码为 UTF-8 - 在 `` 节点中定义 `` 节点 - 使用 `` 清除所有现有的包源配置 - 添加新的包源,键为 "NuGet",值为 "https://api.nuget.org/v3/index.json" --- frameworks/CSharp/touchsocket/Benchmarks.sln | 8 +- frameworks/CSharp/touchsocket/README.md | 35 +- .../CSharp/touchsocket/benchmark_config.json | 19 ++ frameworks/CSharp/touchsocket/config.toml | 13 + .../src/TouchSocketHttp/Program.cs | 3 +- .../TouchSocketHttp/TouchSocketHttp.csproj | 8 +- .../src/TouchSocketHttpPlatform/DateHeader.cs | 73 +++++ .../src/TouchSocketHttpPlatform/MyServer.cs | 24 ++ .../MyTcpSessionClientBase.cs | 299 ++++++++++++++++++ .../src/TouchSocketHttpPlatform/NuGet.Config | 7 + .../src/TouchSocketHttpPlatform/Program.cs | 39 +++ .../TouchSocketHttpPlatform.csproj | 13 + .../src/TouchSocketWebApi/Program.cs | 3 +- .../TouchSocketWebApi.csproj | 5 +- .../touchsocket-httpplatform.dockerfile | 13 + 15 files changed, 546 insertions(+), 16 deletions(-) create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/DateHeader.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyServer.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyTcpSessionClientBase.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/NuGet.Config create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/Program.cs create mode 100644 frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/TouchSocketHttpPlatform.csproj create mode 100644 frameworks/CSharp/touchsocket/touchsocket-httpplatform.dockerfile diff --git a/frameworks/CSharp/touchsocket/Benchmarks.sln b/frameworks/CSharp/touchsocket/Benchmarks.sln index 6f164942105..8d41045e044 100644 --- a/frameworks/CSharp/touchsocket/Benchmarks.sln +++ b/frameworks/CSharp/touchsocket/Benchmarks.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 -VisualStudioVersion = 18.0.11109.219 d18.0-oob +VisualStudioVersion = 18.0.11109.219 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketWebApi", "src\TouchSocketWebApi\TouchSocketWebApi.csproj", "{6BD9363A-D77F-5D90-8444-2BC37495C920}" EndProject @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketHttp31", "src\To EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketWebApi31", "src\TouchSocketWebApi31\TouchSocketWebApi31.csproj", "{6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TouchSocketHttpPlatform", "src\TouchSocketHttpPlatform\TouchSocketHttpPlatform.csproj", "{BC320C24-941D-2109-FBC8-92780569BBA4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +35,10 @@ Global {6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}.Debug|Any CPU.Build.0 = Debug|Any CPU {6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B6A57CE-1F69-FA6E-7458-0A4B6AB60683}.Release|Any CPU.Build.0 = Release|Any CPU + {BC320C24-941D-2109-FBC8-92780569BBA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC320C24-941D-2109-FBC8-92780569BBA4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC320C24-941D-2109-FBC8-92780569BBA4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC320C24-941D-2109-FBC8-92780569BBA4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/frameworks/CSharp/touchsocket/README.md b/frameworks/CSharp/touchsocket/README.md index 22524d6f70a..8a520d40eec 100644 --- a/frameworks/CSharp/touchsocket/README.md +++ b/frameworks/CSharp/touchsocket/README.md @@ -2,9 +2,40 @@ See [touchsocket](https://touchsocket.net/) for more information. +## Variants Included + +* `touchsocket.webapi` (`TouchSocketWebApi`) – WebApi style. +* `touchsocket.webapi31` (`TouchSocketWebApi31`) – WebApi targeting .NET 8. +* `touchsocket.http` (`TouchSocketHttp`) – Minimal HTTP implementation. +* `touchsocket.http31` (`TouchSocketHttp31`) – Minimal HTTP targeting .NET 8. +* `touchsocket.httpplatform` (`TouchSocketHttpPlatform`) – High-performance custom pipeline-based HTTP server focusing on low-level parsing and zero-allocation response writing. + ## Infrastructure Software Versions -**Language** +**Language / Runtime** + +* C# / .NET (8.0 & 9.0 depending on variant) + +## Endpoints + +All variants implement: + +* `/plaintext` – Returns a plain text "Hello, World!" response. +* `/json` – Returns a JSON object `{"message": "Hello, World!"}`. + +The `httpplatform` variant manually parses request lines and headers via `System.IO.Pipelines` for maximum throughput. + +## Dockerfiles + +Each variant has a dedicated Dockerfile named: + +* `touchsocket.dockerfile` (webapi) +* `touchsocket-webapi31.dockerfile` +* `touchsocket-http.dockerfile` +* `touchsocket-http31.dockerfile` +* `touchsocket-httpplatform.dockerfile` + +## Notes -* C# 8.0 +The `httpplatform` variant is intended for benchmarking raw server performance. It omits higher-level abstractions to reduce overhead. diff --git a/frameworks/CSharp/touchsocket/benchmark_config.json b/frameworks/CSharp/touchsocket/benchmark_config.json index 8aa1e953f59..86036458c9a 100644 --- a/frameworks/CSharp/touchsocket/benchmark_config.json +++ b/frameworks/CSharp/touchsocket/benchmark_config.json @@ -77,6 +77,25 @@ "display_name": "touchsocket.webapi31", "notes": "", "versus": "aspnetcore-mvc" + }, + "httpplatform": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "touchsocket.httpplatform", + "language": "C#", + "orm": "Micro", + "platform": ".NET", + "flavor": "CoreCLR", + "webserver": "touchsocket", + "os": "Linux", + "database_os": "Linux", + "display_name": "touchsocket.httpplatform", + "notes": "High-performance custom pipeline-based implementation variant.", + "versus": "aspnetcore" } } ] diff --git a/frameworks/CSharp/touchsocket/config.toml b/frameworks/CSharp/touchsocket/config.toml index 9af10d4a486..0d06cb4e331 100644 --- a/frameworks/CSharp/touchsocket/config.toml +++ b/frameworks/CSharp/touchsocket/config.toml @@ -52,3 +52,16 @@ orm = "Raw" platform = ".NET" webserver = "touchsocket.webapi31" versus = "aspcore-mvc" + +[httpplatform] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "touchsocket.httpplatform" +versus = "aspcore" diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs index d77a1b3249d..baa00f9da87 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/Program.cs @@ -1,7 +1,6 @@ using System.Text; using TouchSocket.Core; using TouchSocket.Http; -using TouchSocket.Sockets; using HttpContent = TouchSocket.Http.HttpContent; namespace TouchSocketHttp; @@ -18,7 +17,7 @@ await service.SetupAsync(new TouchSocketConfig() .SetMaxCount(1000000) .SetTransportOption(options => { - options.BufferOnDemand = true; + options.BufferOnDemand = false; }) .ConfigureContainer(a => { diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj index ea6f43327a0..073c2d99413 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttp/TouchSocketHttp.csproj @@ -1,18 +1,14 @@ - + net9.0 enable Exe enable - true - dotnet-TouchSocketWebApi-987c185f-10b1-452b-beb6-47d798a5a131 - - - + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/DateHeader.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/DateHeader.cs new file mode 100644 index 00000000000..9f0049fc54d --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/DateHeader.cs @@ -0,0 +1,73 @@ +// ------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://touchsocket.net/ +// 交流QQ群:234762506 +// 感谢您的下载和使用 +// ------------------------------------------------------------------------------ + +using System.Buffers.Text; +using System.Diagnostics; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocketHttpPlatform; + +internal static class DateHeader +{ + private const int dateTimeRLength = 29; + private const int prefixLength = 6; // "Date: ".Length is 6 in bytes for ASCII + private const int suffixIndex = dateTimeRLength + prefixLength; + + // Wed, 14 Mar 2018 14:20:00 GMT + private const int suffixLength = 2; // crlf + private static readonly Timer s_timer = new((s) => + { + SetDateValues(DateTimeOffset.UtcNow); + }, null, 1000, 1000); + + private static byte[] s_headerBytesMaster = new byte[prefixLength + dateTimeRLength + 2 * suffixLength]; + private static byte[] s_headerBytesScratch = new byte[prefixLength + dateTimeRLength + 2 * suffixLength]; + + static DateHeader() + { + var utf8 = "Date: "u8; + + utf8.CopyTo(s_headerBytesMaster); + utf8.CopyTo(s_headerBytesScratch); + s_headerBytesMaster[suffixIndex] = (byte)'\r'; + s_headerBytesMaster[suffixIndex + 1] = (byte)'\n'; + s_headerBytesMaster[suffixIndex + 2] = (byte)'\r'; + s_headerBytesMaster[suffixIndex + 3] = (byte)'\n'; + s_headerBytesScratch[suffixIndex] = (byte)'\r'; + s_headerBytesScratch[suffixIndex + 1] = (byte)'\n'; + s_headerBytesScratch[suffixIndex + 2] = (byte)'\r'; + s_headerBytesScratch[suffixIndex + 3] = (byte)'\n'; + + SetDateValues(DateTimeOffset.UtcNow); + SyncDateTimer(); + } + + public static ReadOnlySpan HeaderBytes => s_headerBytesMaster; + + public static void SyncDateTimer() + { + s_timer.Change(1000, 1000); + } + private static void SetDateValues(DateTimeOffset value) + { + lock (s_headerBytesScratch) + { + if (!Utf8Formatter.TryFormat(value, s_headerBytesScratch.AsSpan(prefixLength), out var written, 'R')) + { + throw new Exception("date time format failed"); + } + Debug.Assert(written == dateTimeRLength); + (s_headerBytesScratch, s_headerBytesMaster) = (s_headerBytesMaster, s_headerBytesScratch); + } + } +} diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyServer.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyServer.cs new file mode 100644 index 00000000000..714b8ff367b --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyServer.cs @@ -0,0 +1,24 @@ +// ------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://touchsocket.net/ +// 交流QQ群:234762506 +// 感谢您的下载和使用 +// ------------------------------------------------------------------------------ + +using TouchSocket.Sockets; + +namespace TouchSocketHttpPlatform; + +internal sealed class MyServer : TcpService +{ + /// + protected override MyTcpSessionClientBase NewClient() + { + return new MyTcpSessionClientBase(); + } +} diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyTcpSessionClientBase.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyTcpSessionClientBase.cs new file mode 100644 index 00000000000..1b95c2ddd72 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/MyTcpSessionClientBase.cs @@ -0,0 +1,299 @@ +// ------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://touchsocket.net/ +// 交流QQ群:234762506 +// 感谢您的下载和使用 +// ------------------------------------------------------------------------------ + +using System.Buffers; +using System.IO.Pipelines; +using System.Runtime.CompilerServices; +using TouchSocket.Sockets; + +namespace TouchSocketHttpPlatform; + +/// +/// 路由类型 +/// +internal enum RouteType +{ + /// + /// 未知路由 + /// + Unknown, + + /// + /// 纯文本路由 + /// + Plaintext, + + /// + /// JSON路由 + /// + Json +} + +internal sealed class MyTcpSessionClientBase : TcpSessionClient +{ + #region Paths + public static ReadOnlySpan Json => "/json"u8; + public static ReadOnlySpan Plaintext => "/plaintext"u8; + #endregion + + + private static ReadOnlySpan PlainTextBody => "Hello, World!"u8; + private static ReadOnlySpan JsonBody => "{\"message\":\"Hello, World!\"}"u8; + + private static ReadOnlySpan PlaintextPreamble => + "HTTP/1.1 200 OK\r\n"u8 + + "Server: T\r\n"u8 + + "Content-Type: text/plain\r\n"u8 + + "Content-Length: 13\r\n"u8; + + private static ReadOnlySpan JsonPreamble => + "HTTP/1.1 200 OK\r\n"u8 + + "Server: T\r\n"u8 + + "Content-Type: application/json\r\n"u8 + + "Content-Length: 27\r\n"u8; + + protected override async Task ReceiveLoopAsync(ITransport transport) + { + var pipeReader = transport.Reader; + var pipeWriter = transport.Writer; + + while (true) + { + var readResult = await pipeReader.ReadAsync(); + var bufferSequence = readResult.Buffer; + + var totalConsumed = ProcessRequests(bufferSequence, pipeWriter, out var responseCount); + + if (responseCount > 0) + { + await pipeWriter.FlushAsync(); + } + + if (totalConsumed > 0) + { + pipeReader.AdvanceTo(bufferSequence.GetPosition(totalConsumed)); + } + else + { + pipeReader.AdvanceTo(bufferSequence.Start, bufferSequence.End); + } + + if (readResult.IsCompleted) + { + break; + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static long ProcessRequests(ReadOnlySequence buffer, PipeWriter writer, out int responseCount) + { + var seqReader = new SequenceReader(buffer); + var totalConsumed = 0L; + responseCount = 0; + + while (!seqReader.End) + { + var startConsumed = seqReader.Consumed; + + // 请求行 + if (!TryReadLine(ref seqReader, out var requestLineLength)) + { + // 请求行不完整,不消费任何数据 + break; + } + + var requestLineConsumed = requestLineLength + 2; + + // 读取Headers,直到空行;若不完整,回退并等待更多数据 + var headersStartConsumed = seqReader.Consumed; + bool headersComplete = false; + while (!seqReader.End) + { + if (!TryReadLine(ref seqReader, out var headerLength)) + { + // 回退到读取Headers前的位置,等待更多数据 + var rewind = seqReader.Consumed - headersStartConsumed; + if (rewind > 0) + { + seqReader.Rewind(rewind); + } + headersComplete = false; + break; + } + + if (headerLength == 0) + { + headersComplete = true; + break; // headers 结束 + } + } + + if (!headersComplete) + { + // 不完整,等待更多数据 + break; + } + + // 解析URL - 直接在原始位置解析,避免Slice + var routeType = ParseUrlFast(buffer.Slice(startConsumed), requestLineConsumed); + + // 计算本次消费的字节数 + var consumed = seqReader.Consumed - startConsumed; + totalConsumed += consumed; + + // 写入响应 + WriteResponseSync(writer, routeType); + responseCount++; + } + + return totalConsumed; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void WriteResponseSync(PipeWriter writer, RouteType routeType) + { + switch (routeType) + { + case RouteType.Plaintext: + writer.Write(PlaintextPreamble); + writer.Write(DateHeader.HeaderBytes); + writer.Write(PlainTextBody); + break; + case RouteType.Json: + writer.Write(JsonPreamble); + writer.Write(DateHeader.HeaderBytes); + writer.Write(JsonBody); + break; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static bool TryReadLine(ref SequenceReader reader, out long length) + { + var start = reader.Consumed; + + while (!reader.End) + { + if (reader.TryRead(out var b)) + { + if (b == '\r') + { + // 查看是否有'\n',若暂不可用则回退并判定不完整 + if (!reader.TryPeek(out var next)) + { + // 回退已读取的'\r' + reader.Rewind(1); + length = 0; + return false; + } + if (next == '\n') + { + // 消费'\n'并返回本行长度(不含CRLF) + reader.Advance(1); + length = reader.Consumed - start - 2; + return true; + } + } + } + } + + length = 0; + return false; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static RouteType ParseUrlFast(ReadOnlySequence sequence, long requestLineLength) + { + var reader = new SequenceReader(sequence); + + // 跳过方法 + var spaceCount = 0; + var urlStart = 0L; + var urlEnd = 0L; + + while (reader.Consumed < requestLineLength && !reader.End) + { + if (reader.TryRead(out var b)) + { + if (b == ' ') + { + spaceCount++; + if (spaceCount == 1) + { + urlStart = reader.Consumed; + } + else if (spaceCount == 2) + { + urlEnd = reader.Consumed - 1; + break; + } + } + } + } + + if (spaceCount < 2) + { + return RouteType.Unknown; + } + + var urlLength = urlEnd - urlStart; + + // 截取URL片段 + var startPos = sequence.GetPosition(urlStart); + var urlSlice = sequence.Slice(startPos, urlLength); + + // "/plaintext" + if (urlLength == Plaintext.Length) + { + if (urlSlice.IsSingleSegment) + { + if (urlSlice.FirstSpan.SequenceEqual(Plaintext)) + { + return RouteType.Plaintext; + } + } + else + { + Span tmp = stackalloc byte[(int)urlLength]; + urlSlice.CopyTo(tmp); + if (tmp.SequenceEqual(Plaintext)) + { + return RouteType.Plaintext; + } + } + } + // "/json" + else if (urlLength == Json.Length) + { + if (urlSlice.IsSingleSegment) + { + if (urlSlice.FirstSpan.SequenceEqual(Json)) + { + return RouteType.Json; + } + } + else + { + Span tmp = stackalloc byte[(int)urlLength]; + urlSlice.CopyTo(tmp); + if (tmp.SequenceEqual(Json)) + { + return RouteType.Json; + } + } + } + + return RouteType.Unknown; + } +} + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/NuGet.Config b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/NuGet.Config new file mode 100644 index 00000000000..f05d5867888 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/NuGet.Config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/Program.cs new file mode 100644 index 00000000000..95576ee70b5 --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/Program.cs @@ -0,0 +1,39 @@ +// ------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://touchsocket.net/ +// 交流QQ群:234762506 +// 感谢您的下载和使用 +// ------------------------------------------------------------------------------ + +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocketHttpPlatform; + +internal class Program +{ + private static async Task Main(string[] args) + { + var server = new MyServer(); + await server.SetupAsync(new TouchSocketConfig() + .SetListenIPHosts(8080) + .SetMaxCount(1000000) + .ConfigureContainer(a => + { + a.AddConsoleLogger(); + })); + + await server.StartAsync(); + Console.WriteLine("HTTP服务器已启动,端口: 8080"); + + while (true) + { + Console.ReadLine(); + } + } +} diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/TouchSocketHttpPlatform.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/TouchSocketHttpPlatform.csproj new file mode 100644 index 00000000000..8e9841293fc --- /dev/null +++ b/frameworks/CSharp/touchsocket/src/TouchSocketHttpPlatform/TouchSocketHttpPlatform.csproj @@ -0,0 +1,13 @@ + + + + Exe + net9.0 + enable + enable + + + + + + diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs index a7c9e6dcafe..4033ac03745 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/Program.cs @@ -3,7 +3,6 @@ using TouchSocket.Core; using TouchSocket.Http; using TouchSocket.Rpc; -using TouchSocket.Sockets; using TouchSocket.WebApi; using HttpContent = TouchSocket.Http.HttpContent; @@ -21,7 +20,7 @@ public static void Main(string[] args) .SetMaxCount(1000000) .SetTransportOption(options => { - options.BufferOnDemand = true; + options.BufferOnDemand = false; }) .ConfigureContainer(a => { diff --git a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj index d90651bb648..909c2f984ee 100644 --- a/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj +++ b/frameworks/CSharp/touchsocket/src/TouchSocketWebApi/TouchSocketWebApi.csproj @@ -4,13 +4,12 @@ net9.0 enable enable - true dotnet-WorkerService1-19b37b17-6043-4334-ad9a-9e0e3c670da3 - - + + diff --git a/frameworks/CSharp/touchsocket/touchsocket-httpplatform.dockerfile b/frameworks/CSharp/touchsocket/touchsocket-httpplatform.dockerfile new file mode 100644 index 00000000000..c20b0434e76 --- /dev/null +++ b/frameworks/CSharp/touchsocket/touchsocket-httpplatform.dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +WORKDIR /app +COPY src/TouchSocketHttpPlatform . +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime + +WORKDIR /app +COPY --from=build /app/out ./ + +EXPOSE 8080 + +ENTRYPOINT ["dotnet", "TouchSocketHttpPlatform.dll"] From a14b2c9715223da6ec81e7f2ee47f657a8cba8df Mon Sep 17 00:00:00 2001 From: ruroru <111705692+ruroru@users.noreply.github.com> Date: Mon, 17 Nov 2025 19:30:02 +0200 Subject: [PATCH 1758/1766] Add minor improvements in clojure (#10279) * Revert executor service to VirtualThreadPerTaskExecutor * Fix retit base image marked async as broken * Add hiccup to kit --------- Co-authored-by: jj --- frameworks/Clojure/kit/benchmark_config.json | 18 +++++++++ frameworks/Clojure/kit/deps.edn | 1 + frameworks/Clojure/kit/kit-hiccup.dockerfile | 19 ++++++++++ .../te_bench/web/controllers/bench.clj | 31 +++++++++++++++- .../kit_clj/te_bench/web/routes/bench.clj | 4 +- .../Clojure/reitit/benchmark_config.json | 3 +- .../Clojure/reitit/reitit-async.dockerfile | 2 +- .../Clojure/reitit/reitit-jdbc.dockerfile | 2 +- frameworks/Clojure/reitit/reitit.dockerfile | 2 +- .../Clojure/reitit/src/hello/handler.clj | 2 +- .../Clojure/ring-http-exchange/project.clj | 3 +- .../src/ring_http_exchange/benchmark.clj | 37 +++++++++++-------- 12 files changed, 100 insertions(+), 24 deletions(-) create mode 100644 frameworks/Clojure/kit/kit-hiccup.dockerfile diff --git a/frameworks/Clojure/kit/benchmark_config.json b/frameworks/Clojure/kit/benchmark_config.json index bbde2d31918..21581010726 100755 --- a/frameworks/Clojure/kit/benchmark_config.json +++ b/frameworks/Clojure/kit/benchmark_config.json @@ -43,6 +43,24 @@ "display_name": "kit-majavat", "notes": "", "versus": "kit" + }, + "hiccup": { + "fortune_url": "/hiccup-fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "postgres", + "framework": "None", + "language": "Clojure", + "flavor": "None", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "kit-hiccup", + "notes": "", + "versus": "kit" } } ] diff --git a/frameworks/Clojure/kit/deps.edn b/frameworks/Clojure/kit/deps.edn index d517f976be1..972f7bb3d3f 100644 --- a/frameworks/Clojure/kit/deps.edn +++ b/frameworks/Clojure/kit/deps.edn @@ -16,6 +16,7 @@ ;; HTML templating selmer/selmer {:mvn/version "1.12.62"} org.clojars.jj/majavat {:mvn/version "1.12.3"} + hiccup/hiccup {:mvn/version "2.0.0"} ;; Database org.postgresql/postgresql {:mvn/version "42.7.8"} diff --git a/frameworks/Clojure/kit/kit-hiccup.dockerfile b/frameworks/Clojure/kit/kit-hiccup.dockerfile new file mode 100644 index 00000000000..c4b1990a3f8 --- /dev/null +++ b/frameworks/Clojure/kit/kit-hiccup.dockerfile @@ -0,0 +1,19 @@ +# syntax = docker/dockerfile:1.2 +FROM clojure:openjdk-17 AS build + +WORKDIR / +COPY . / + +RUN clj -Sforce -T:build all + +FROM amazoncorretto:25 + +COPY --from=build /target/te-bench-standalone.jar /te-bench/te-bench-standalone.jar + +EXPOSE 8080 + +ENV PORT=8080 +ENV JAVA_OPTS="-XX:+UseContainerSupport -Dfile.encoding=UTF-8" +ENV JDBC_URL="jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass" + +ENTRYPOINT exec java $JAVA_OPTS -jar /te-bench/te-bench-standalone.jar diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj index 2057a175140..c02f3621c49 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/controllers/bench.clj @@ -5,6 +5,8 @@ [next.jdbc.result-set :as rs] [jj.majavat :as majavat] [jj.sql.boa :as boa] + [hiccup.page :as hp] + [hiccup.util :as hu] [jj.majavat.renderer :refer [->StringRenderer]] [jj.majavat.renderer.sanitizer :refer [->Html]] [ring.util.http-response :as http-response] @@ -20,6 +22,21 @@ (def ^:private render-fortune (majavat/build-renderer "html/fortunes.html" {:renderer (->StringRenderer {:sanitizer (->Html)})})) + +(defn render-hiccup-fortune [fortunes] + (hp/html5 + [:head + [:title "Fortunes"]] + [:body + [:table + [:tr + [:th "id"] + [:th "message"]] + (for [x fortunes] + [:tr + [:td (:id x)] + [:td (hu/escape-html (:message x))]])]])) + (def query-fortunes (boa/execute (boa/->NextJdbcAdapter) "sql/fortunes.sql")) (def selmer-opts {:custom-resource-path (clojure.java.io/resource "html")}) @@ -35,6 +52,10 @@ (http-response/ok) (http-response/content-type "text/html; charset=utf-8"))) +(defn hiccup-html-response + [body] + (-> (http-response/ok body) + (http-response/content-type "text/html; charset=utf-8"))) (defn rand-id [n] @@ -148,4 +169,12 @@ (as-> (query-fortunes db-conn) fortunes (conj fortunes {:id 0 :message "Additional fortune added at request time."}) (sort-by :message fortunes) - (majavat-html-response {:messages fortunes}))) \ No newline at end of file + (majavat-html-response {:messages fortunes}))) + +(defn hiccup-fortune-handler + [db-conn _request] + (as-> (query-fortunes db-conn) fortunes + (conj fortunes {:id 0 :message "Additional fortune added at request time."}) + (sort-by :message fortunes) + (render-hiccup-fortune fortunes) + (hiccup-html-response fortunes))) diff --git a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj index 032ceb143f7..070fa899c17 100644 --- a/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj +++ b/frameworks/Clojure/kit/src/clj/io/github/kit_clj/te_bench/web/routes/bench.clj @@ -18,7 +18,9 @@ ["/updates" {:get (partial bench/update-db-handler db-conn)}] ["/cached-queries" {:get (partial bench/cached-query-handler db-conn cache)}] ["/fortunes" {:get (partial bench/selmer-fortune-handler db-conn)}] - ["/majavat-fortunes" {:get (partial bench/majavat-fortune-handler db-conn)}]]) + ["/majavat-fortunes" {:get (partial bench/majavat-fortune-handler db-conn)}] + ["/hiccup-fortunes" {:get (partial bench/hiccup-fortune-handler db-conn)}] + ]) (defmethod ig/init-key :reitit.routes/bench [_ {:keys [base-path] diff --git a/frameworks/Clojure/reitit/benchmark_config.json b/frameworks/Clojure/reitit/benchmark_config.json index 713c812c206..e3793e46827 100755 --- a/frameworks/Clojure/reitit/benchmark_config.json +++ b/frameworks/Clojure/reitit/benchmark_config.json @@ -54,7 +54,8 @@ "database_os": "Linux", "display_name": "reitit-async", "notes": "", - "versus": "undertow" + "versus": "undertow", + "tags": ["broken"] } }] } diff --git a/frameworks/Clojure/reitit/reitit-async.dockerfile b/frameworks/Clojure/reitit/reitit-async.dockerfile index e24189d9adb..2d07ee7f7b7 100644 --- a/frameworks/Clojure/reitit/reitit-async.dockerfile +++ b/frameworks/Clojure/reitit/reitit-async.dockerfile @@ -4,7 +4,7 @@ COPY project.clj project.clj COPY src src RUN lein uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /reitit COPY --from=lein /reitit/target/hello-reitit-standalone.jar app.jar diff --git a/frameworks/Clojure/reitit/reitit-jdbc.dockerfile b/frameworks/Clojure/reitit/reitit-jdbc.dockerfile index ab746e5c464..e202481097a 100644 --- a/frameworks/Clojure/reitit/reitit-jdbc.dockerfile +++ b/frameworks/Clojure/reitit/reitit-jdbc.dockerfile @@ -4,7 +4,7 @@ COPY project.clj project.clj COPY src src RUN lein uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /reitit COPY --from=lein /reitit/target/hello-reitit-standalone.jar app.jar diff --git a/frameworks/Clojure/reitit/reitit.dockerfile b/frameworks/Clojure/reitit/reitit.dockerfile index 52fff78793a..2915a6efd2c 100644 --- a/frameworks/Clojure/reitit/reitit.dockerfile +++ b/frameworks/Clojure/reitit/reitit.dockerfile @@ -4,7 +4,7 @@ COPY project.clj project.clj COPY src src RUN lein uberjar -FROM openjdk:25-jdk-slim +FROM amazoncorretto:25 WORKDIR /reitit COPY --from=lein /reitit/target/hello-reitit-standalone.jar app.jar diff --git a/frameworks/Clojure/reitit/src/hello/handler.clj b/frameworks/Clojure/reitit/src/hello/handler.clj index 7075cd4e5b6..97a8d8d1411 100644 --- a/frameworks/Clojure/reitit/src/hello/handler.clj +++ b/frameworks/Clojure/reitit/src/hello/handler.clj @@ -84,7 +84,7 @@ :else (constantly nil))] (-> (ring/ring-handler (ring/router - [["/plaintext" (exchange/constantly plain-text-handler)] + [["/plaintext" plain-text-handler] ["/json" json-handler] ["/db" db-handler]]) (ring/create-default-handler) diff --git a/frameworks/Clojure/ring-http-exchange/project.clj b/frameworks/Clojure/ring-http-exchange/project.clj index 2f61228d669..448d887f73e 100644 --- a/frameworks/Clojure/ring-http-exchange/project.clj +++ b/frameworks/Clojure/ring-http-exchange/project.clj @@ -11,11 +11,10 @@ [org.clojars.jj/majavat "1.12.3"] [hikari-cp "3.3.0"] [org.clojars.jj/boa-sql "1.0.0"] - [io.netty/netty-transport-native-epoll "4.2.7.Final" :classifier "linux-x86_64"] [org.postgresql/postgresql "42.7.8"] [metosin/jsonista "0.3.13"] ] - :profiles {:robaho {:dependencies [[io.github.robaho/httpserver "1.0.28"]]}} + :profiles {:robaho {:dependencies [[io.github.robaho/httpserver "1.0.29"]]}} :resource-paths ["resources"] :main ring-http-exchange.benchmark) diff --git a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj index fc6afa569b6..24063d085e6 100644 --- a/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj +++ b/frameworks/Clojure/ring-http-exchange/src/ring_http_exchange/benchmark.clj @@ -10,20 +10,19 @@ [ring-http-exchange.core :as server]) (:import (com.zaxxer.hikari HikariDataSource) - (io.netty.channel.epoll EpollEventLoopGroup))) + (java.util.concurrent Executors))) (def query-fortunes (boa/execute (boa/->NextJdbcAdapter) "fortune.sql")) -(def db-spec {:auto-commit true - :read-only true - :connection-timeout 10000 - :validation-timeout 5000 - :idle-timeout 600000 +(def db-spec {:auto-commit false + :connection-timeout 3000 + :validation-timeout 1000 + :idle-timeout 300000 :max-lifetime 1800000 - :minimum-idle 16 - :maximum-pool-size 64 + :minimum-idle 128 + :maximum-pool-size 1024 :register-mbeans false - :jdbcUrl "jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass"}) + :jdbcUrl "jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass&prepareThreshold=1"}) (def ^:private ^:const additional-message {:id 0 :message "Additional fortune added at request time."}) @@ -31,14 +30,18 @@ "Content-Type" "text/html; charset=UTF-8"}) (def ^:private ^:const json-headers {"Server" "ring-http-exchange" "Content-Type" "application/json"}) -(def ^:private ^:const plaintext-response {:status 200 - :headers {"Server" "ring-http-exchange" - "Content-Type" "text/plain"} - :body "Hello, World!"}) + (def ^:private render-fortune (majavat/build-renderer "fortune.html" {:renderer (->StringRenderer {:sanitizer (->Html)})})) + +(defn- plaintext-response [] + {:status 200 + :headers {"Server" "ring-http-exchange" + "Content-Type" "text/plain"} + :body "Hello, World!"}) + (defn- get-body [datasource] (let [context (as-> (query-fortunes datasource) fortunes (conj fortunes additional-message) @@ -47,11 +50,15 @@ (defn -main [& _] + (System/setProperty "jdk.virtualThreadScheduler.parallelism" + (str (* 4 (.availableProcessors (Runtime/getRuntime))))) + (println "Starting server on port 8080") (let [datasource (connection/->pool HikariDataSource db-spec)] (server/run-http-server (fn [req] (case (req :uri) + "/plaintext" (plaintext-response) "/json" {:status 200 :headers json-headers :body (json/write-value-as-bytes {:message "Hello, World!"})} @@ -59,7 +66,7 @@ {:status 200 :headers fortune-headers :body body}) - plaintext-response)) + (plaintext-response))) {:port 8080 :host "0.0.0.0" - :executor (EpollEventLoopGroup.)}))) \ No newline at end of file + :executor (Executors/newVirtualThreadPerTaskExecutor)}))) \ No newline at end of file From 13ff46a55a7a06c17db5d58d2ca2c4cd17982d71 Mon Sep 17 00:00:00 2001 From: Diogo Martins <165835485+MDA2AV@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:30:55 +0000 Subject: [PATCH 1759/1766] Unhinged - Add high worker variant (#10280) * Add high worker variant * bump unhinged to 9.0.7 --- .../CSharp/wiredio/benchmark_config.json | 17 ++++ frameworks/CSharp/wiredio/config.toml | 12 +++ .../wiredio/src/PlatformP/Platform.csproj | 25 +++++ .../CSharp/wiredio/src/PlatformP/Program.cs | 98 +++++++++++++++++++ .../CSharp/wiredio/wiredio-mcr-p.dockerfile | 22 +++++ 5 files changed, 174 insertions(+) create mode 100644 frameworks/CSharp/wiredio/src/PlatformP/Platform.csproj create mode 100644 frameworks/CSharp/wiredio/src/PlatformP/Program.cs create mode 100644 frameworks/CSharp/wiredio/wiredio-mcr-p.dockerfile diff --git a/frameworks/CSharp/wiredio/benchmark_config.json b/frameworks/CSharp/wiredio/benchmark_config.json index 50fcb4cd13f..2d9ebf4896f 100644 --- a/frameworks/CSharp/wiredio/benchmark_config.json +++ b/frameworks/CSharp/wiredio/benchmark_config.json @@ -37,6 +37,23 @@ "display_name": "Unhinged", "notes": "epoll" }, + "mcr-p": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Unhinged", + "language": "C#", + "orm": "None", + "platform": ".NET", + "webserver": "Unhinged", + "os": "Linux", + "database_os": "Linux", + "display_name": "Unhinged [p]", + "notes": "epoll" + }, "gen": { "plaintext_url": "/plaintext", "json_url": "/json", diff --git a/frameworks/CSharp/wiredio/config.toml b/frameworks/CSharp/wiredio/config.toml index b418d57d861..0b973f1f1fb 100644 --- a/frameworks/CSharp/wiredio/config.toml +++ b/frameworks/CSharp/wiredio/config.toml @@ -25,6 +25,18 @@ platform = ".NET" webserver = "Unhinged" versus = "None" +[mcr-p] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +os = "Linux" +database_os = "Linux" +orm = "None" +platform = ".NET" +webserver = "Unhinged" +versus = "None" + [gen] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/CSharp/wiredio/src/PlatformP/Platform.csproj b/frameworks/CSharp/wiredio/src/PlatformP/Platform.csproj new file mode 100644 index 00000000000..ea26e67a376 --- /dev/null +++ b/frameworks/CSharp/wiredio/src/PlatformP/Platform.csproj @@ -0,0 +1,25 @@ + + + + Exe + net9.0 + enable + enable + true + true + true + true + + + linux-musl-x64 + true + + + + + + + + + + diff --git a/frameworks/CSharp/wiredio/src/PlatformP/Program.cs b/frameworks/CSharp/wiredio/src/PlatformP/Program.cs new file mode 100644 index 00000000000..46a7d69219c --- /dev/null +++ b/frameworks/CSharp/wiredio/src/PlatformP/Program.cs @@ -0,0 +1,98 @@ +// ReSharper disable always SuggestVarOrType_BuiltInTypes +// (var is avoided intentionally in this project so that concrete types are visible at call sites.) +// ReSharper disable always StackAllocInsideLoop + +using System.Runtime.CompilerServices; +using System.Text.Json; +using Unhinged; + +#pragma warning disable CA2014 + +/* (MDA2AV)Dev notes: + * + * Wired.IO Platform benchmark using [Unhinged - https://github.com/MDA2AV/Unhinged] epoll engine. + * + * This test was created purely for benchmark/comparison between .NET solutions. + * It should not be considered EVER as a go-to framework to build any kind of webserver! + * For such purpose please use the main Wired.IO framework [Wired.IO - https://github.com/MDA2AV/Wired.IO]. + * + * This benchmarks follows the JsonSerialization and PlainText rules imposed by the TechEmpower team. + * + * The Http parsing by the Unhinged engine is still naive(work in progress), yet it's development will not have any impact + * on these benchmarks results as the extra request parsing overhead is much smaller than the read/send syscalls'. + */ + +namespace Platform; + +[SkipLocalsInit] +internal static class Program +{ + public static void Main(string[] args) + { + var builder = UnhingedEngine + .CreateBuilder() + .SetPort(8080) + + .SetNWorkersSolver(() => Environment.ProcessorCount ) + + // Accept up to 16384 connections + .SetBacklog(16384) + + // Max 512 epoll events per wake (quite overkill) + .SetMaxEventsPerWake(512) + + // Max 1024 connection per thread + .SetMaxNumberConnectionsPerWorker(1024) + + // 32KB in and 16KB out slabs to handle 16 pipeline depth + .SetSlabSizes(32 * 1024, 16 * 1024) + .InjectRequestHandler(RequestHandler); + + var engine = builder.Build(); + engine.Run(); + } + + private const string Json = "/json"; + private const string PlainText = "/plaintext"; + + private static ValueTask RequestHandler(Connection connection) + { + // FNV-1a Hashed routes to avoid string allocations + if(connection.H1HeaderData.Route == Json) // /json + CommitJsonResponse(connection); + + else if (connection.H1HeaderData.Route == PlainText) // /plaintext + CommitPlainTextResponse(connection); + + return ValueTask.CompletedTask; + } + + [ThreadStatic] private static Utf8JsonWriter? t_utf8JsonWriter; + private static readonly JsonContext SerializerContext = JsonContext.Default; + private static void CommitJsonResponse(Connection connection) + { + connection.WriteBuffer.WriteUnmanaged("HTTP/1.1 200 OK\r\n"u8 + + "Server: W\r\n"u8 + + "Content-Type: application/json; charset=UTF-8\r\n"u8 + + "Content-Length: 27\r\n"u8); + connection.WriteBuffer.WriteUnmanaged(DateHelper.HeaderBytes); + + t_utf8JsonWriter ??= new Utf8JsonWriter(connection.WriteBuffer, new JsonWriterOptions { SkipValidation = true }); + t_utf8JsonWriter.Reset(connection.WriteBuffer); + + // Creating(Allocating) a new JsonMessage every request + var message = new JsonMessage { Message = "Hello, World!" }; + // Serializing it every request + JsonSerializer.Serialize(t_utf8JsonWriter, message, SerializerContext.JsonMessage); + } + + private static void CommitPlainTextResponse(Connection connection) + { + connection.WriteBuffer.WriteUnmanaged("HTTP/1.1 200 OK\r\n"u8 + + "Server: W\r\n"u8 + + "Content-Type: text/plain\r\n"u8 + + "Content-Length: 13\r\n"u8); + connection.WriteBuffer.WriteUnmanaged(DateHelper.HeaderBytes); + connection.WriteBuffer.WriteUnmanaged("Hello, World!"u8); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/wiredio/wiredio-mcr-p.dockerfile b/frameworks/CSharp/wiredio/wiredio-mcr-p.dockerfile new file mode 100644 index 00000000000..1ef18f083c2 --- /dev/null +++ b/frameworks/CSharp/wiredio/wiredio-mcr-p.dockerfile @@ -0,0 +1,22 @@ +# Build +FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build +RUN apk add --no-cache clang build-base zlib-dev linux-headers +WORKDIR /src +COPY src/PlatformP/ ./PlatformP/ +WORKDIR /src/PlatformP +RUN dotnet publish -c Release \ + -r linux-musl-x64 \ + --self-contained true \ + -p:PublishAot=true \ + -p:OptimizationPreference=Speed \ + -p:GarbageCollectionAdaptationMode=0 \ + -o /app/out + +# Runtime (musl) +FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-alpine +ENV URLS=http://+:8080 +WORKDIR /app +COPY --from=build /app/out ./ +RUN chmod +x ./Platform +EXPOSE 8080 +ENTRYPOINT ["./Platform"] From fe1810bf707d54d4616001d879f38c013a4f59a6 Mon Sep 17 00:00:00 2001 From: Andrew McCloskey Date: Mon, 17 Nov 2025 12:34:43 -0500 Subject: [PATCH 1760/1766] Performance improvements to vertx-web-kotlin-dsljson (#10281) - Refactored core verticles and introduced ServerVerticle for improved request handling - Enhanced database repositories with optimized query patterns - Streamlined handlers to reduce overhead - Updated PeriodicResolver logic and added centralized Properties configuration - Removed unused profiling scripts and configuration files - Temporarily disabled fortunes endpoint in benchmark configuration - Updated Gradle build configuration and dependencies Verify was called to ensure operability. --- .../Kotlin/vertx-web-kotlin-dsljson/README.md | 10 +- .../benchmark_config.json | 1 - .../vertx-web-kotlin-dsljson/build.gradle.kts | 150 +++++++++------ .../buildSrc/build.gradle.kts | 7 + .../buildSrc/src/main/kotlin/Helper.kt | 58 ++++++ .../configuration/scripts/server.sh | 97 +++++++--- .../gradle/libs.versions.toml | 44 +++++ .../gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 45457 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../Kotlin/vertx-web-kotlin-dsljson/gradlew | 12 +- .../vertx-web-kotlin-dsljson/gradlew.bat | 3 +- .../settings.gradle.kts | 14 ++ .../main/kotlin/com/example/starter/App.kt | 94 ++++++---- .../com/example/starter/BasicVerticle.kt | 64 +++---- .../com/example/starter/PostgresVerticle.kt | 108 +++++------ .../com/example/starter/ServerVerticle.kt | 91 ++++++++++ .../example/starter/db/FortuneRepository.kt | 28 ++- .../com/example/starter/db/WorldRepository.kt | 95 ++++++---- .../starter/handlers/AbstractHandler.kt | 79 ++++---- .../starter/handlers/DefaultHandler.kt | 16 +- .../starter/handlers/FortuneHandler.kt | 71 +++----- .../starter/handlers/MessageHandler.kt | 15 +- .../example/starter/handlers/WorldHandler.kt | 65 +++---- .../{io => helpers}/BufferOutputStream.kt | 162 ++++++++++------- .../starter/helpers/PeriodicResolver.kt | 61 +++++++ .../com/example/starter/helpers/Properties.kt | 171 ++++++++++++++++++ .../com/example/starter/io/JsonResource.kt | 15 -- .../com/example/starter/models/Fortune.kt | 4 +- .../com/example/starter/models/Message.kt | 2 +- .../com/example/starter/models/World.kt | 8 +- .../example/starter/utils/FutureExtensions.kt | 16 +- .../example/starter/utils/JsonExtensions.kt | 5 +- .../starter/utils/PeriodicDateResolver.kt | 19 -- .../example/starter/utils/RowSetExtensions.kt | 9 +- .../starter/utils/ThrowableExtensions.kt | 10 +- .../main/resources/http-server-options.json | 6 - .../main/resources/pg-connect-options.json | 12 -- ...x-web-kotlin-dsljson-postgresql.dockerfile | 73 +++++--- .../vertx-web-kotlin-dsljson.dockerfile | 73 +++++--- 39 files changed, 1165 insertions(+), 605 deletions(-) create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/build.gradle.kts create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/src/main/kotlin/Helper.kt mode change 100644 => 100755 frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/libs.versions.toml mode change 100644 => 100755 frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/ServerVerticle.kt rename frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/{io => helpers}/BufferOutputStream.kt (52%) create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/PeriodicResolver.kt create mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/Properties.kt delete mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt delete mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt delete mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json delete mode 100644 frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md b/frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md index b8ae3f33b30..2cb792746e2 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/README.md @@ -31,6 +31,12 @@ http://localhost:8080/query?queries= http://localhost:8080/update?queries= -### FORTUNES -http://localhost:8080/fortunes +Testing: + +```shell +../../../tfb \ + --mode benchmark \ + --test vertx-web-kotlin-dsljson \ + --type json +``` \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json b/frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json index 445d7e5f319..0625b6406be 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/benchmark_config.json @@ -24,7 +24,6 @@ "postgresql": { "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortunes", "update_url": "/updates?queries=", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts b/frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts index 5131d1b9ec7..03517f3a9a7 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/build.gradle.kts @@ -1,86 +1,116 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - kotlin("jvm") version "1.9.22" - kotlin("kapt") version "1.9.22" + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.shadow) application - id("com.github.johnrengelman.shadow") version "7.1.2" } group = "com.example" version = "1.0.0-SNAPSHOT" -repositories { - mavenCentral() -} - java { toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) + languageVersion.set(JavaLanguageVersion.of(25)) } } kotlin { compilerOptions { - jvmTarget = JvmTarget.JVM_21 + jvmTarget = JvmTarget.JVM_25 + apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_3) + languageVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_3) + freeCompilerArgs.addAll(listOf( + "-Xjvm-default=all", + "-Xlambdas=indy", + "-Xjdk-release=25" + )) } - jvmToolchain(21) + jvmToolchain(25) } -val mainClassName = "com.example.starter.App" - -val vertxVersion = "4.5.9" -val nettyVersion = "4.1.112.Final" -val scramVersion = "2.1" -val dslJsonVersion = "2.0.2" -val htmlFlowVersion = "4.6" -val log4jVersion = "2.23.1" - application { - mainClass = mainClassName + mainClass = "com.example.starter.AppKt" } dependencies { - listOfNotNull( - // Kotlin - kotlin("stdlib-jdk8"), - kotlin("reflect"), - - // Vertx - platform("io.vertx:vertx-stack-depchain:$vertxVersion"), - "io.vertx:vertx-core", - "io.vertx:vertx-web", - "io.vertx:vertx-pg-client", - "io.vertx:vertx-lang-kotlin", - "io.vertx:vertx-lang-kotlin-coroutines", - - // Netty - "io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64", - - // Postgres - "com.ongres.scram:client:$scramVersion", - - // dsljson - "com.dslplatform:dsl-json:$dslJsonVersion", - - // HtmlFlow - "com.github.xmlet:htmlflow:$htmlFlowVersion", - - // Logging - "org.apache.logging.log4j:log4j-core:$log4jVersion", - "org.apache.logging.log4j:log4j-api:$log4jVersion", - "org.apache.logging.log4j:log4j-api-kotlin:1.4.0", - "com.lmax:disruptor:4.0.0", - ).map { implementation(it) } - - listOf( - "com.dslplatform:dsl-json:$dslJsonVersion", - "org.apache.logging.log4j:log4j-core:$log4jVersion", - ).map { kapt(it) } + // Kotlin + implementation(libs.kotlin.stdlib) + implementation(libs.kotlin.reflect) + + // Vert.x + implementation(platform(libs.vertx.bom)) + implementation(libs.vertx.core) + implementation(libs.vertx.web) + implementation(libs.vertx.pg.client) + implementation(libs.vertx.lang.kotlin) + implementation(libs.vertx.lang.kotlin.coroutines) + implementation(libs.vertx.micrometer) + + // Micrometer + implementation(libs.micrometer.registry.prometheus) + + // Netty + implementation(platform(libs.netty.bom)) + resolvePlatformSpecificNettyDependencies(libs.versions.netty.get()) + .forEach { implementation(it) } + + // DSL-JSON + implementation(libs.dsl.json) + kapt(libs.dsl.json) + + // Log4j + implementation(libs.log4j.core) + implementation(libs.log4j.api) + implementation(libs.log4j.api.kotlin) + implementation(libs.disruptor) } -tasks.withType { - archiveClassifier = "fat" - mergeServiceFiles() +tasks { + register("server") { + dependsOn(this@tasks.classes) + + mainClass.set(application.mainClass.get()) + classpath = sourceSets.main.get().runtimeClasspath + + jvmArgs = listOf( + "-server", + "--enable-native-access=ALL-UNNAMED", + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--sun-misc-unsafe-memory-access=allow", + "-Xms2G", + "-Xmx2G", + "-XX:+AlwaysPreTouch", + "-XX:+UseParallelGC", + "-XX:InitialCodeCacheSize=512m", + "-XX:ReservedCodeCacheSize=512m", + "-XX:MaxInlineLevel=20", + "-XX:+UseNUMA", + "-XX:-UseCodeCacheFlushing", + "-XX:AutoBoxCacheMax=10001", + "-XX:+UseCompactObjectHeaders", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+DebugNonSafepoints", + "-Djava.net.preferIPv4Stack=true", + "-Dvertx.disableMetrics=true", + "-Dvertx.disableWebsockets=true", + "-Dvertx.disableContextTimings=true", + "-Dvertx.cacheImmutableHttpResponseHeaders=true", + "-Dvertx.internCommonHttpRequestHeadersToLowerCase=true", + "-Dvertx.disableHttpHeadersValidation=true", + "-Dio.netty.noUnsafe=false", + "-Dio.netty.buffer.checkBounds=false", + "-Dio.netty.buffer.checkAccessible=false", + "-Dio.netty.leakDetection.level=disabled", + "-Dio.netty.iouring.ringSize=4096", + "-Dio.netty.iouring.cqSize=8192", + "-Dtfb.type=basic", + ) + } + + shadowJar { + archiveClassifier = "fat" + mergeServiceFiles() + } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/build.gradle.kts b/frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/build.gradle.kts new file mode 100644 index 00000000000..4a87641372c --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/src/main/kotlin/Helper.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/src/main/kotlin/Helper.kt new file mode 100644 index 00000000000..99d81bec357 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/buildSrc/src/main/kotlin/Helper.kt @@ -0,0 +1,58 @@ +enum class SystemType { + LINUX_X86_64, + LINUX_AMD64, + LINUX_AARCH64, + OSX_X86_64, + OSX_AARCH64, + WINDOWS_AMD64, + WINDOWS_AARCH64, + UNKNOWN, +} + +data class SystemInfo( + val type: SystemType, + val os: OperatingSystem, +) { + data class OperatingSystem( + val name: String, + val arch: String, + ) +} + +val CURRENT_SYSTEM_INFO by lazy { + val os = System.getProperty("os.name").lowercase() + val arch = System.getProperty("os.arch").lowercase() + val type = when { + os.startsWith("linux") && arch == "x86_64" -> SystemType.LINUX_X86_64 + os.startsWith("linux") && arch == "amd64" -> SystemType.LINUX_AMD64 + os.startsWith("linux") && arch == "aarch64" -> SystemType.LINUX_AARCH64 + os.startsWith("mac") && arch == "x86_64" -> SystemType.OSX_X86_64 + os.startsWith("mac") && arch == "aarch64" -> SystemType.OSX_AARCH64 + os.startsWith("windows") && arch == "amd64" -> SystemType.WINDOWS_AMD64 + os.startsWith("windows") && arch == "aarch64" -> SystemType.WINDOWS_AARCH64 + else -> SystemType.UNKNOWN + } + + SystemInfo( + type = type, + os = SystemInfo.OperatingSystem( + name = os, + arch = arch, + ) + ) +} + +fun resolvePlatformSpecificNettyDependencies(version: String) = when (CURRENT_SYSTEM_INFO.type) { + SystemType.LINUX_X86_64, + SystemType.LINUX_AMD64 -> arrayOf( + "io.netty:netty-transport-native-io_uring:$version:linux-x86_64", + ) + SystemType.LINUX_AARCH64 -> arrayOf( + "io.netty:netty-transport-native-io_uring:$version:linux-aarch_64", + ) + SystemType.OSX_AARCH64 -> arrayOf( + "io.netty:netty-transport-native-kqueue:$version:osx-aarch_64", + "io.netty:netty-resolver-dns-native-macos:$version:osx-aarch_64", + ) + else -> throw IllegalStateException("Unsupported system: $CURRENT_SYSTEM_INFO") +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh b/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh old mode 100644 new mode 100755 index a5b03908062..6b8380b9308 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/configuration/scripts/server.sh @@ -1,45 +1,92 @@ #!/bin/bash -JVM_OPTS="-server \ +set -euo pipefail + +if [ -f /proc/cpuinfo ]; then + CPU_COUNT=$(grep --count ^processor /proc/cpuinfo) +else + CPU_COUNT=$(sysctl -n hw.ncpu 2>/dev/null || echo 1) +fi + +JAR_PATH="./build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar" +PG_DOCKER_PATH="../../../toolset/databases/postgres" + +HAS_DB=false +while [[ $# -gt 0 ]]; do + case $1 in + -db) + HAS_DB=true + ;; + esac + shift +done + +if [ "$HAS_DB" = true ]; then + docker image inspect tfb-postgres >/dev/null 2>&1 || \ + docker build -f "$PG_DOCKER_PATH/postgres.dockerfile" -t tfb-postgres "$PG_DOCKER_PATH" + + # ensure no old container blocks name reuse + docker rm -f tfb-postgres >/dev/null 2>&1 || true + + docker run --rm --name tfb-postgres -p 5432:5432 -d tfb-postgres + + until PGPASSWORD=benchmarkdbpass psql -h "0.0.0.0" -U benchmarkdbuser -d hello_world -c '\dt' > /dev/null 2>&1; do + sleep 1 + done +fi + +cleanup() { + echo "Caught termination signal. Cleaning up..." + if [ -n "${JAVA_PID:-}" ]; then + kill -SIGTERM "$JAVA_PID" 2>/dev/null || true + wait "$JAVA_PID" 2>/dev/null || true + fi + + if [ "$HAS_DB" = true ]; then + echo "Stopping postgres container..." + docker stop tfb-postgres >/dev/null 2>&1 || true + docker rm -f tfb-postgres >/dev/null 2>&1 || true + fi +} + +trap cleanup SIGINT SIGTERM EXIT + +java \ + -server \ + --enable-native-access=ALL-UNNAMED \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ -Xms2G \ -Xmx2G \ -XX:+AlwaysPreTouch \ - -XX:+UseParallelGC \ - -XX:+PreserveFramePointer \ + -XX:+UseZGC \ + -XX:+ZUncommit \ + -XX:+DisableExplicitGC \ + -XX:+UseLargePages \ + -XX:+UseStringDeduplication \ -XX:+EnableDynamicAgentLoading \ -XX:InitialCodeCacheSize=512m \ -XX:ReservedCodeCacheSize=512m \ -XX:MaxInlineLevel=20 \ -XX:+UseNUMA \ - -Djava.lang.Integer.IntegerCache.high=10000 \ + -XX:-UseCodeCacheFlushing \ + -XX:AutoBoxCacheMax=10001 \ + -Djava.net.preferIPv4Stack=true \ -Dvertx.disableMetrics=true \ - -Dvertx.disableH2c=true \ + -Dvertx.disableDnsResolver=true \ -Dvertx.disableWebsockets=true \ - -Dvertx.flashPolicyHandler=false \ - -Dvertx.threadChecks=false \ -Dvertx.disableContextTimings=true \ - -Dvertx.disableTCCL=true \ + -Dvertx.cacheImmutableHttpResponseHeaders=true \ + -Dvertx.internCommonHttpRequestHeadersToLowerCase=true \ -Dvertx.disableHttpHeadersValidation=true \ - -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ - -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ + -Dio.netty.noUnsafe=false \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ - -Dtfb.hasDB=false" - -JAR_PATH="./build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar" - -cleanup() { - echo "Caught SIGINT signal. Stopping the Java program..." - if [ ! -z "$JAVA_PID" ]; then - kill -SIGTERM "$JAVA_PID" - wait "$JAVA_PID" - fi - exit 0 -} - -trap cleanup SIGINT + -Dio.netty.recycler.maxCapacity.default=0 \ + -Dio.netty.maxDirectMemory=0 \ + "-Dtfb.hasDB=$HAS_DB" \ + "-Dtfb.pgHostOverride=0.0.0.0" \ + -jar "$JAR_PATH" & -java $JVM_OPTS -jar $JAR_PATH & JAVA_PID=$! echo "Server PID: $JAVA_PID" diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/libs.versions.toml b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/libs.versions.toml new file mode 100644 index 00000000000..42556c390c6 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/libs.versions.toml @@ -0,0 +1,44 @@ +[versions] +kotlin = "2.3.0-Beta2" +shadow = "9.2.2" +vertx = "5.0.5" +micrometer = "1.16.0" +netty = "4.2.7.Final" +dsljson = "2.0.2" +log4j = "2.25.2" +log4j-kotlin = "1.5.0" +disruptor = "4.0.0" + +[libraries] +# Kotlin +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } + +# Vert.x +vertx-bom = { module = "io.vertx:vertx-stack-depchain", version.ref = "vertx" } +vertx-core = { module = "io.vertx:vertx-core" } +vertx-web = { module = "io.vertx:vertx-web" } +vertx-pg-client = { module = "io.vertx:vertx-pg-client" } +vertx-lang-kotlin = { module = "io.vertx:vertx-lang-kotlin" } +vertx-lang-kotlin-coroutines = { module = "io.vertx:vertx-lang-kotlin-coroutines" } +vertx-micrometer = { module = "io.vertx:vertx-micrometer-metrics" } + +# Prometheus +micrometer-registry-prometheus = { module = "io.micrometer:micrometer-registry-prometheus", version.ref = "micrometer" } + +# Netty +netty-bom = { module = "io.netty:netty-bom", version.ref = "netty" } + +# DSL-JSON +dsl-json = { module = "com.dslplatform:dsl-json", version.ref = "dsljson" } + +# Logging +log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } +log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } +log4j-api-kotlin = { module = "org.apache.logging.log4j:log4j-api-kotlin", version.ref = "log4j-kotlin" } +disruptor = { module = "com.lmax:disruptor", version.ref = "disruptor" } + +[plugins] +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..8bdaf60c75ab801e22807dde59e12a8735a34077 100644 GIT binary patch delta 37340 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 UX##k1IU5Uz9RMyC?XF1w2hzEis{jB1 delta 35347 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 diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties index 09523c0e549..bad7c2462f5 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew old mode 100644 new mode 100755 index f5feea6d6b1..adff685a034 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat index 9d21a21834d..c4bdd3ab8e3 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts b/frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts index a5d0428ce6f..a9e579940ea 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/settings.gradle.kts @@ -1 +1,15 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + mavenCentral() + } +} + rootProject.name = "vertx-web-kotlin-dsljson-benchmark" diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt index ee66a635231..21b08c43611 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/App.kt @@ -1,50 +1,80 @@ package com.example.starter -import com.example.starter.utils.PeriodicDateResolver +import com.example.starter.helpers.PeriodicResolver +import com.example.starter.helpers.Properties import com.example.starter.utils.block import io.vertx.core.Vertx import io.vertx.kotlin.core.deploymentOptionsOf import io.vertx.kotlin.core.vertxOptionsOf +import io.vertx.kotlin.coroutines.coAwait +import io.vertx.kotlin.micrometer.micrometerMetricsOptionsOf +import io.vertx.kotlin.micrometer.vertxPrometheusOptionsOf import kotlin.time.Duration.Companion.seconds -import org.apache.logging.log4j.kotlin.Logging +import kotlinx.coroutines.runBlocking +import org.apache.logging.log4j.kotlin.logger -object App : Logging { - private const val SERVER_NAME = "Vert.x-Web Benchmark" +private val LOGGER = logger("App") - @JvmStatic - fun main(args: Array?) { - val eventLoopPoolSize = System.getProperty("vertx.eventLoopPoolSize")?.toInt() - ?: Runtime.getRuntime().availableProcessors() +fun main(): Unit = runBlocking { + val vertx = Vertx.vertx( + vertxOptionsOf( + eventLoopPoolSize = Properties.EVENT_LOOP_POOL_SIZE, + preferNativeTransport = true, + disableTCCL = true, + blockedThreadCheckInterval = 60_000, + metricsOptions = if (Properties.METRICS_ENABLED) { + micrometerMetricsOptionsOf( + enabled = true, + jvmMetricsEnabled = true, + nettyMetricsEnabled = true, + prometheusOptions = vertxPrometheusOptionsOf( + enabled = true, + ), + ) + } else null + ) + ) - val vertx = Vertx.vertx( - vertxOptionsOf( - eventLoopPoolSize = eventLoopPoolSize, - preferNativeTransport = true, - ) + if (!vertx.isNativeTransportEnabled) { + throw IllegalStateException( + "Native transport not enabled; missing required dependencies", + vertx.unavailableNativeTransportCause(), ) - vertx.exceptionHandler { - logger.error(it) { "Vertx unexpected exception:" } - vertx.close().block(5.seconds) - } + } + + vertx.exceptionHandler { + LOGGER.error("Vertx unexpected exception", it) + } - // Add the SIGINT handler - Runtime.getRuntime().addShutdownHook(Thread { + Runtime.getRuntime().addShutdownHook( + Thread { vertx.close().block(5.seconds) - }) + } + ) - // Initialize the periodic date resolver - PeriodicDateResolver.init(vertx) + PeriodicResolver.init(vertx) - // Check the type of test that is being run - val hasDb = System.getProperty("tfb.hasDB")?.toBoolean() ?: false + val options = deploymentOptionsOf( + instances = Properties.EVENT_LOOP_POOL_SIZE, + ) - vertx.deployVerticle( - { if (hasDb) PostgresVerticle() else BasicVerticle() }, - deploymentOptionsOf( - instances = eventLoopPoolSize, - ) + val deployment = when (Properties.TYPE) { + "basic" -> vertx.deployVerticle( + BasicVerticle::class.java, + options ) - - logger.info("$SERVER_NAME started.") + "postgres" -> vertx.deployVerticle( + PostgresVerticle::class.java, + options + ) + "all" -> vertx.deployVerticle( + ServerVerticle::class.java, + options + ) + else -> throw IllegalStateException("Unknown deployment type: ${Properties.TYPE}") } -} \ No newline at end of file + + deployment.coAwait() + + LOGGER.info("${Properties.SERVER_NAME} started.") +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt index 7870a146c78..0a20956558e 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/BasicVerticle.kt @@ -2,55 +2,45 @@ package com.example.starter import com.example.starter.handlers.DefaultHandler import com.example.starter.handlers.MessageHandler -import com.example.starter.io.JsonResource +import com.example.starter.helpers.Properties import com.example.starter.utils.isConnectionReset -import io.vertx.core.AbstractVerticle -import io.vertx.core.Promise -import io.vertx.core.http.HttpServerOptions -import io.vertx.ext.web.Router +import io.vertx.kotlin.coroutines.CoroutineVerticle +import io.vertx.kotlin.coroutines.coAwait import org.apache.logging.log4j.kotlin.Logging -class BasicVerticle : AbstractVerticle() { - override fun start(startPromise: Promise) { +class BasicVerticle : CoroutineVerticle() { + override suspend fun start() { val defaultHandler = DefaultHandler() val messageHandler = MessageHandler() - val router = Router.router(vertx) - - router - .get("/plaintext") - .handler(defaultHandler::plaintext) - - router - .get("/json") - .handler(messageHandler::readDefaultMessage) - val server = vertx - .createHttpServer(HTTP_SERVER_OPTIONS) - .requestHandler(router) + .createHttpServer(Properties.HTTP) + .requestHandler { + val path = it.path() + val code = when (path.length) { + 10 -> if (path == PLAINTEXT_PATH) 1 else 0 + 5 -> if (path == JSON_PATH) 2 else 0 + else -> 0 + } + when (code) { + 1 -> defaultHandler.plaintext(it) + 2 -> messageHandler.readDefaultMessage(it) + else -> it.response().setStatusCode(404).end() + } + } .exceptionHandler { - if (it.isConnectionReset()) return@exceptionHandler - logger.error(it) { "Exception in HttpServer" } + if (!it.isConnectionReset()) { + logger.error("Exception in HttpServer", it) + } } - - server .listen() - .onSuccess { - logger.info { "HTTP server started on port 8080" } - startPromise.complete() - } - .onFailure { - logger.error(it.cause) { "Failed to start" } - startPromise.fail(it.cause) - } + .coAwait() + + logger.info("HTTP server started on port ${server.actualPort()}") } companion object : Logging { - private const val HTTP_SERVER_OPTIONS_RESOURCE = "http-server-options.json" - - private val HTTP_SERVER_OPTIONS: HttpServerOptions by lazy { - val json = JsonResource.of(HTTP_SERVER_OPTIONS_RESOURCE) - HttpServerOptions(json) - } + private const val PLAINTEXT_PATH = "/plaintext" + private const val JSON_PATH = "/json" } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt index 4caa057b488..5d31eb03bc4 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/PostgresVerticle.kt @@ -4,78 +4,60 @@ import com.example.starter.db.FortuneRepository import com.example.starter.db.WorldRepository import com.example.starter.handlers.FortuneHandler import com.example.starter.handlers.WorldHandler -import com.example.starter.io.JsonResource +import com.example.starter.helpers.Properties import com.example.starter.utils.isConnectionReset -import io.vertx.core.AbstractVerticle -import io.vertx.core.Promise -import io.vertx.core.http.HttpServerOptions -import io.vertx.ext.web.Router -import io.vertx.pgclient.PgConnectOptions +import io.vertx.kotlin.coroutines.CoroutineVerticle +import io.vertx.kotlin.coroutines.coAwait import io.vertx.pgclient.PgConnection import org.apache.logging.log4j.kotlin.Logging -class PostgresVerticle : AbstractVerticle() { - override fun start(startPromise: Promise) { - PgConnection.connect(vertx, PG_CONNECT_OPTIONS) - .onSuccess { conn -> - val fortuneHandler = FortuneHandler(FortuneRepository(conn)) - val worldHandler = WorldHandler(WorldRepository(conn)) - - val router = Router.router(vertx) - - router - .get("/fortunes") - .handler(fortuneHandler::templateFortunes) - - router - .get("/db") - .handler(worldHandler::readRandomWorld) - - router - .get("/queries") - .handler(worldHandler::readRandomWorlds) - - router - .get("/updates") - .handler(worldHandler::updateRandomWorlds) - - val server = vertx - .createHttpServer(HTTP_SERVER_OPTIONS) - .requestHandler(router) - .exceptionHandler { - if (it.isConnectionReset()) return@exceptionHandler - logger.error(it) { "Exception in HttpServer" } - } - - server - .listen() - .onSuccess { - logger.info { "HTTP server started on port 8080" } - startPromise.complete() - } - .onFailure { - logger.error(it) { "Failed to start" } - startPromise.fail(it) +class PostgresVerticle : CoroutineVerticle() { + override suspend fun start() { + val conn = PgConnection.connect(vertx, Properties.PG_CONNECT).coAwait() + + val fortuneRepository = FortuneRepository.init(conn) + val worldRepository = WorldRepository.init(conn) + + val fortuneHandler = FortuneHandler(fortuneRepository.coAwait()) + val worldHandler = WorldHandler(worldRepository.coAwait()) + + val server = vertx + .createHttpServer(Properties.HTTP) + .requestHandler { + val path = it.path() + val code = when (path.length) { + 9 -> if (path == FORTUNES_PATH) 1 else 0 + 3 -> if (path == DB_PATH) 2 else 0 + 8 -> when (path) { + QUERIES_PATH -> 3 + UPDATES_PATH -> 4 + else -> 0 } + else -> 0 + } + when (code) { + 1 -> fortuneHandler.templateFortunes(it) + 2 -> worldHandler.readRandomWorld(it) + 3 -> worldHandler.readRandomWorlds(it) + 4 -> worldHandler.updateRandomWorlds(it) + else -> it.response().setStatusCode(404).end() + } } - .onFailure { - logger.error(it) { "Failed to start" } - startPromise.fail(it) + .exceptionHandler { + if (!it.isConnectionReset()) { + logger.error("Exception in HttpServer", it) + } } + .listen() + .coAwait() + + logger.info("HTTP server started on port ${server.actualPort()}") } companion object : Logging { - private const val HTTP_SERVER_OPTIONS_RESOURCE = "http-server-options.json" - private const val PG_CONNECT_OPTIONS_RESOURCE = "pg-connect-options.json" - - private val HTTP_SERVER_OPTIONS: HttpServerOptions by lazy { - val json = JsonResource.of(HTTP_SERVER_OPTIONS_RESOURCE) - HttpServerOptions(json) - } - - private val PG_CONNECT_OPTIONS: PgConnectOptions by lazy { - val json = JsonResource.of(PG_CONNECT_OPTIONS_RESOURCE) - PgConnectOptions(json) - } + private const val FORTUNES_PATH = "/fortunes" + private const val DB_PATH = "/db" + private const val QUERIES_PATH = "/queries" + private const val UPDATES_PATH = "/updates" } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/ServerVerticle.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/ServerVerticle.kt new file mode 100644 index 00000000000..c86ea244774 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/ServerVerticle.kt @@ -0,0 +1,91 @@ +package com.example.starter + +import com.example.starter.db.FortuneRepository +import com.example.starter.db.WorldRepository +import com.example.starter.handlers.DefaultHandler +import com.example.starter.handlers.FortuneHandler +import com.example.starter.handlers.MessageHandler +import com.example.starter.handlers.WorldHandler +import com.example.starter.helpers.Properties +import com.example.starter.utils.isConnectionReset +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry +import io.vertx.core.Handler +import io.vertx.core.http.HttpHeaders.CONTENT_TYPE +import io.vertx.core.http.HttpServerRequest +import io.vertx.kotlin.coroutines.CoroutineVerticle +import io.vertx.kotlin.coroutines.coAwait +import io.vertx.micrometer.backends.BackendRegistries +import io.vertx.pgclient.PgConnection +import org.apache.logging.log4j.kotlin.Logging + +class ServerVerticle() : CoroutineVerticle() { + override suspend fun start() { + val conn = PgConnection.connect(vertx, Properties.PG_CONNECT).coAwait() + + val fortuneRepository = FortuneRepository.init(conn) + val worldRepository = WorldRepository.init(conn) + + val fortuneHandler = FortuneHandler(fortuneRepository.coAwait()) + val worldHandler = WorldHandler(worldRepository.coAwait()) + + val defaultHandler = DefaultHandler() + val messageHandler = MessageHandler() + + val metricsHandler = if (Properties.METRICS_ENABLED) { + val registry = BackendRegistries.getDefaultNow() as PrometheusMeterRegistry + Handler { + it.response() + .putHeader(CONTENT_TYPE, "text/plain; version=0.0.4; charset=utf-8") + .end(registry.scrape()) + } + } else null + + val server = vertx + .createHttpServer(Properties.HTTP) + .requestHandler { + val path = it.path() + val code = when (path.length) { + 10 -> if (path == PLAINTEXT_PATH) 1 else 0 + 5 -> if (path == JSON_PATH) 2 else 0 + 9 -> if (path == FORTUNES_PATH) 3 else 0 + 3 -> if (path == DB_PATH) 4 else 0 + 8 -> when (path) { + QUERIES_PATH -> 5 + UPDATES_PATH -> 6 + METRICS_PATH -> 7 + else -> 0 + } + else -> 0 + } + when (code) { + 1 -> defaultHandler.plaintext(it) + 2 -> messageHandler.readDefaultMessage(it) + 3 -> fortuneHandler.templateFortunes(it) + 4 -> worldHandler.readRandomWorld(it) + 5 -> worldHandler.readRandomWorlds(it) + 6 -> worldHandler.updateRandomWorlds(it) + 7 -> metricsHandler?.handle(it) ?: it.response().setStatusCode(404).end() + else -> it.response().setStatusCode(404).end() + } + } + .exceptionHandler { + if (!it.isConnectionReset()) { + logger.error("Exception in HttpServer", it) + } + } + .listen() + .coAwait() + + logger.info("HTTP server started on port ${server.actualPort()}") + } + + companion object : Logging { + private const val METRICS_PATH = "/metrics" + private const val PLAINTEXT_PATH = "/plaintext" + private const val JSON_PATH = "/json" + private const val FORTUNES_PATH = "/fortunes" + private const val DB_PATH = "/db" + private const val QUERIES_PATH = "/queries" + private const val UPDATES_PATH = "/updates" + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt index b9e4b9ab784..a3c0831f3aa 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/FortuneRepository.kt @@ -5,19 +5,35 @@ import com.example.starter.utils.mapToArray import io.vertx.core.Future import io.vertx.pgclient.PgConnection +import io.vertx.sqlclient.PreparedQuery import io.vertx.sqlclient.Row +import io.vertx.sqlclient.RowSet -class FortuneRepository(conn: PgConnection) : AbstractRepository(conn) { - private val selectFortuneQuery = this.conn.preparedQuery(SELECT_FORTUNE_SQL) +@Suppress("NOTHING_TO_INLINE") +class FortuneRepository( + conn: PgConnection, + private val selectFortunesQuery: PreparedQuery>, +) : AbstractRepository(conn) { - fun selectFortunes(): Future> = selectFortuneQuery + fun selectFortunes(): Future> = selectFortunesQuery .execute() .map { it.mapToArray(FortuneRepository::map) } companion object { - private const val SELECT_FORTUNE_SQL = "SELECT id, message FROM fortune" + private const val SELECT_FORTUNES_SQL = "SELECT id, message FROM fortune" - @Suppress("NOTHING_TO_INLINE") - private inline fun map(row: Row): Fortune = Fortune(row.getInteger(0), row.getString(1)) + private inline fun map(row: Row): Fortune = Fortune( + row.getInteger(0), + row.getString(1), + ) + + fun init(conn: PgConnection): Future = conn.let { conn -> + conn.prepare(SELECT_FORTUNES_SQL).map { ps -> + FortuneRepository( + conn, + ps.query(), + ) + } + } } } \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt index 74823141453..e12717e7228 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/db/WorldRepository.kt @@ -3,38 +3,48 @@ package com.example.starter.db import com.example.starter.models.World import io.vertx.core.Future import io.vertx.core.Promise +import io.vertx.core.impl.future.CompositeFutureImpl import io.vertx.pgclient.PgConnection import io.vertx.sqlclient.PreparedQuery import io.vertx.sqlclient.Row import io.vertx.sqlclient.RowSet import io.vertx.sqlclient.Tuple -import io.vertx.sqlclient.impl.ArrayTuple import io.vertx.sqlclient.impl.SqlClientInternal +import io.vertx.sqlclient.internal.ArrayTuple import java.util.concurrent.ThreadLocalRandom import java.util.concurrent.atomic.AtomicInteger @Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST") -class WorldRepository(conn: PgConnection) : AbstractRepository(conn) { - private val selectWorldQuery = this.conn.preparedQuery(SELECT_WORLD_SQL) - private val updateWorldQueries = generateQueries(this.conn) - +class WorldRepository private constructor( + conn: PgConnection, + private val selectWorldQuery: PreparedQuery>, + private val updateWorldQueries: Array>>, +) : AbstractRepository(conn) { fun selectRandomWorld(): Future = selectWorldQuery .execute(Tuple.of(randomWorld())) - .map { map(it.iterator().next()) } + .map { map(it.first()) } fun selectRandomWorlds(numWorlds: Int): Future> { val promise = Promise.promise>() val arr = arrayOfNulls(numWorlds) val count = AtomicInteger(0) (this.conn as SqlClientInternal).group { c -> - repeat(numWorlds) { - c.preparedQuery(SELECT_WORLD_SQL).execute(Tuple.of(randomWorld())) { ar -> - val index = count.getAndIncrement() - arr[index] = map(ar.result().iterator().next()) - if (index == numWorlds - 1) { - promise.complete(arr as Array) + val query = c.preparedQuery(SELECT_WORLD_SQL) + repeat(numWorlds) { _ -> + query.execute(Tuple.of(randomWorld())) + .onComplete { ar -> + when { + ar.succeeded() -> { + val result = ar.result() + val index = count.getAndIncrement() + arr[index] = map(result.iterator().next()) + if (index == numWorlds - 1) { + promise.complete(arr as Array) + } + } + else -> promise.fail(ar.cause()) + } } - } } } return promise.future() @@ -57,28 +67,49 @@ class WorldRepository(conn: PgConnection) : AbstractRepository(conn) { companion object { private const val SELECT_WORLD_SQL = "SELECT id, randomnumber FROM world WHERE id = $1" - private inline fun randomWorld(): Int = 1 + ThreadLocalRandom.current().nextInt(10000) - private inline fun map(row: Row): World = World(row.getInteger(0), row.getInteger(1)) + private inline fun randomWorld(): Int = 1 + ThreadLocalRandom.current().nextInt(10_000) + private inline fun map(row: Row): World = World( + row.getInteger(0), + row.getInteger(1), + ) - private fun generateQueries(conn: PgConnection): Array>> { - val arr = arrayOfNulls>>(500) - for (num in 1..500) { - var paramIndex = 1 - val sb = StringBuilder() - sb.append("UPDATE world SET randomnumber = CASE id ") - for (i in 1..num) { - sb.append("WHEN \$$paramIndex THEN \$${paramIndex + 1} ") - paramIndex += 2 - } - sb.append("ELSE randomnumber END WHERE id IN (") - for (i in 1..num) { - sb.append("\$$paramIndex,") - paramIndex += 1 + fun init(conn: PgConnection): Future = conn.let { conn -> + val selectWorldQuery = conn.prepare(SELECT_WORLD_SQL).map { ps -> ps.query() } + val updateWorldQueries = run { + val queries = arrayOfNulls>>(500) + Array(500) { num -> + val count = num + 1 + var paramIndex = 1 + val sb = StringBuilder() + sb.append("UPDATE world SET randomnumber = CASE id ") + repeat(count) { + sb.append("WHEN $${paramIndex++} THEN $${paramIndex++} ") + } + sb.append("ELSE randomnumber END WHERE id IN (") + repeat(count) { + sb.append("$${paramIndex++},") + } + sb[sb.length - 1] = ')' + + conn + .prepare(sb.toString()) + .map { ps -> + queries[num] = ps.query() + } + }.let { + CompositeFutureImpl.all(*it).map { + queries as Array>> + } } - sb[sb.length - 1] = ')' - arr[num - 1] = conn.preparedQuery(sb.toString()) } - return arr as Array>> + + CompositeFutureImpl.all(selectWorldQuery, updateWorldQueries).map { + WorldRepository( + conn, + selectWorldQuery.result(), + updateWorldQueries.result(), + ) + } } } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt index cb29d630167..d34e72b5598 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/AbstractHandler.kt @@ -1,57 +1,52 @@ package com.example.starter.handlers -import com.example.starter.utils.PeriodicDateResolver -import io.vertx.core.AsyncResult -import io.vertx.core.Handler +import com.example.starter.helpers.PeriodicResolver +import com.example.starter.helpers.Properties +import io.netty.handler.codec.http.HttpHeaderNames +import io.netty.handler.codec.http.HttpHeaderValues +import io.vertx.core.Future 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 io.vertx.ext.web.RoutingContext +import io.vertx.core.internal.buffer.BufferInternal @Suppress("NOTHING_TO_INLINE") abstract class AbstractHandler { protected companion object { - val NULL_HANDLER: Handler>? = null - - const val SOMETHING_WENT_WRONG = "Something went wrong" + val SOMETHING_WENT_WRONG: Buffer = BufferInternal.buffer("Something went wrong") // Headers - val SERVER: CharSequence = HttpHeaders.createOptimized("Vert.x-Web") - val APPLICATION_JSON: CharSequence = HttpHeaders.createOptimized("application/json") - val TEXT_PLAIN: CharSequence = HttpHeaders.createOptimized("text/plain") - val TEXT_HTML: CharSequence = HttpHeaders.createOptimized("text/html; charset=utf-8") + val SERVER: CharSequence = HttpHeaders.createOptimized(Properties.SERVER_NAME) inline fun MultiMap.common(): MultiMap = this - .add(HttpHeaders.SERVER, SERVER) - .add(HttpHeaders.DATE, PeriodicDateResolver.current) - - inline fun RoutingContext.json(): HttpServerResponse { - val response = this.response() - val headers = response.headers() - headers - .common() - .add(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON) - return response - } - - inline fun RoutingContext.text(): HttpServerResponse { - val response = this.response() - val headers = response.headers() - headers - .common() - .add(HttpHeaders.CONTENT_TYPE, TEXT_PLAIN) - return response - } - - inline fun RoutingContext.html(): HttpServerResponse { - val response = this.response() - val headers = response.headers() - headers - .common() - .add(HttpHeaders.CONTENT_TYPE, TEXT_HTML) - return response - } - - inline fun RoutingContext.error(): Unit = this.text().end(SOMETHING_WENT_WRONG, NULL_HANDLER) + .add(HttpHeaderNames.SERVER, SERVER) + .add(HttpHeaderNames.DATE, PeriodicResolver.current) + + inline fun HttpServerRequest.json(): HttpServerResponse = response() + .apply { + headers() + .common() + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON) + } + + inline fun HttpServerRequest.plaintext(): HttpServerResponse = response() + .apply { + headers() + .common() + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.TEXT_PLAIN) + } + + inline fun HttpServerRequest.html(): HttpServerResponse = response() + .apply { + headers() + .common() + .add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.TEXT_HTML) + } + + inline fun HttpServerRequest.error(): Future = plaintext() + .setStatusCode(500) + .end(SOMETHING_WENT_WRONG) } } \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt index 8311474177e..7f981320192 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/DefaultHandler.kt @@ -1,15 +1,19 @@ package com.example.starter.handlers +import com.example.starter.helpers.PeriodicResolver +import io.vertx.core.Future import io.vertx.core.buffer.Buffer -import io.vertx.ext.web.RoutingContext +import io.vertx.core.http.HttpServerRequest class DefaultHandler : AbstractHandler() { - fun plaintext(ctx: RoutingContext) { - ctx.text().end(MESSAGE_BUFFER, NULL_HANDLER) - } + fun plaintext(req: HttpServerRequest): Future = req + .response().apply { + headers().setAll(PeriodicResolver.plaintext) + } + .end(MESSAGE_BUFFER) companion object { - private const val MESSAGE = "Hello, World!" - private val MESSAGE_BUFFER = Buffer.buffer(MESSAGE, "UTF-8") + const val MESSAGE: String = "Hello, World!" + val MESSAGE_BUFFER: Buffer = Buffer.buffer(MESSAGE, "UTF-8") } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt index 5e60c04cfeb..029026dab4c 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/FortuneHandler.kt @@ -2,56 +2,39 @@ package com.example.starter.handlers import com.example.starter.db.FortuneRepository import com.example.starter.models.Fortune -import htmlflow.HtmlFlow -import htmlflow.HtmlView -import io.vertx.ext.web.RoutingContext +import io.vertx.core.http.HttpServerRequest +import java.lang.Exception import org.apache.logging.log4j.kotlin.Logging class FortuneHandler(private val repository: FortuneRepository) : AbstractHandler() { - fun templateFortunes(ctx: RoutingContext) { + fun templateFortunes(req: HttpServerRequest) { repository .selectFortunes() - .onSuccess { - val updatedFortunes = it.plus(Fortune(0, "Additional fortune added at request time.")) - updatedFortunes.sort() - ctx.html().end(TEMPLATE.render(updatedFortunes), NULL_HANDLER) - } - .onFailure { - logger.error(it) { SOMETHING_WENT_WRONG } - ctx.error() + .onComplete { ar -> + when { + ar.succeeded() -> { + try { + val updatedFortunes = ar.result().plus(Fortune(0, "Additional fortune added at request time.")) + updatedFortunes.sort() + + val html = renderFortunes(updatedFortunes) + req.html().end(html) + } catch (ex: Exception) { + logger.error(SOMETHING_WENT_WRONG, ex) + req.error() + } + } + else -> { + logger.error(SOMETHING_WENT_WRONG, ar.cause()) + req.error() + } + } } } - companion object : Logging { - private val TEMPLATE: HtmlView = HtmlFlow - .view { page -> - page - .html() - .head() - .title() - .text("Fortunes") - .`__`() // title - .`__`() // head - .body() - .table() - .tr() - .th().text("id").`__`() - .th().text("message").`__`() - .`__`() // tr - .dynamic> { container, fortunes -> - fortunes.forEach { - container - .tr() - .td().text(it.id.toString()).`__`() - .td().text(it.message).`__`() - .`__`() // tr - } - } - .`__`() // table - .`__`() // body - .`__`() // html - } - .setIndented(false) - .threadSafe() + private companion object : Logging { + private fun renderFortunes(fortunes: Array): String { + throw NotImplementedError("Not implemented") + } } -} \ No newline at end of file +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt index 1fa432ef313..0a91afea21e 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/MessageHandler.kt @@ -1,15 +1,20 @@ package com.example.starter.handlers +import com.example.starter.helpers.PeriodicResolver import com.example.starter.models.Message import com.example.starter.utils.serialize -import io.vertx.ext.web.RoutingContext +import io.vertx.core.Future +import io.vertx.core.http.HttpServerRequest class MessageHandler : AbstractHandler() { - fun readDefaultMessage(ctx: RoutingContext) { - ctx.json().end(DEFAULT_MESSAGE.serialize(), NULL_HANDLER) - } + fun readDefaultMessage(req: HttpServerRequest): Future = req + .response().apply { + headers().setAll(PeriodicResolver.json) + } + .end(Message(MESSAGE).serialize()) companion object { - private val DEFAULT_MESSAGE = Message("Hello, World!") + const val MESSAGE: String = "Hello, World!" + val DEFAULT_MESSAGE = Message(MESSAGE) } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt index 1226361d71b..c8152dda51f 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/handlers/WorldHandler.kt @@ -2,55 +2,58 @@ package com.example.starter.handlers import com.example.starter.db.WorldRepository import com.example.starter.utils.serialize -import io.vertx.ext.web.RoutingContext +import io.vertx.core.http.HttpServerRequest import org.apache.logging.log4j.kotlin.Logging class WorldHandler(private val repository: WorldRepository) : AbstractHandler() { - fun readRandomWorld(ctx: RoutingContext) { + fun readRandomWorld(req: HttpServerRequest) { repository .selectRandomWorld() - .onSuccess { - ctx.json().end(it.serialize(), NULL_HANDLER) - } - .onFailure { - logger.error(it) { SOMETHING_WENT_WRONG } - ctx.error() + .onComplete { ar -> + when { + ar.succeeded() -> req.json().end(ar.result().serialize()) + else -> { + logger.error(SOMETHING_WENT_WRONG, ar.cause()) + req.error() + } + } } } - fun readRandomWorlds(ctx: RoutingContext) { - val queries = ctx.queries() + fun readRandomWorlds(req: HttpServerRequest) { repository - .selectRandomWorlds(queries) - .onSuccess { - ctx.json().end(it.serialize(), NULL_HANDLER) - } - .onFailure { - logger.error(it) { SOMETHING_WENT_WRONG } - ctx.error() + .selectRandomWorlds(req.queries()) + .onComplete { ar -> + when { + ar.succeeded() -> req.json().end(ar.result().serialize()) + else -> { + logger.error(SOMETHING_WENT_WRONG, ar.cause()) + req.error() + } + } } } - fun updateRandomWorlds(ctx: RoutingContext) { - val queries = ctx.queries() + fun updateRandomWorlds(req: HttpServerRequest) { repository - .updateRandomWorlds(queries) - .onSuccess { - ctx.json().end(it.serialize(), NULL_HANDLER) - } - .onFailure { - logger.error(it) { SOMETHING_WENT_WRONG } - ctx.error() + .updateRandomWorlds(req.queries()) + .onComplete { ar -> + when { + ar.succeeded() -> req.json().end(ar.result().serialize()) + else -> { + logger.error(SOMETHING_WENT_WRONG, ar.cause()) + req.error() + } + } } } - companion object : Logging { + private companion object : Logging { private const val QUERIES_PARAM_NAME = "queries" @Suppress("NOTHING_TO_INLINE") - private inline fun RoutingContext.queries(): Int { - val queriesParam = this.request().getParam(QUERIES_PARAM_NAME) - return queriesParam?.toIntOrNull()?.coerceIn(1, 500) ?: 1 - } + private inline fun HttpServerRequest.queries(): Int = getParam(QUERIES_PARAM_NAME) + ?.toIntOrNull() + ?.coerceIn(1, 500) ?: 1 } } \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/BufferOutputStream.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/BufferOutputStream.kt similarity index 52% rename from frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/BufferOutputStream.kt rename to frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/BufferOutputStream.kt index d82b31fb6ee..162feef9cd6 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/BufferOutputStream.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/BufferOutputStream.kt @@ -1,7 +1,8 @@ -package com.example.starter.io +package com.example.starter.helpers import io.netty.buffer.ByteBuf import io.vertx.core.buffer.Buffer +import io.vertx.core.internal.buffer.BufferInternal import io.vertx.core.json.JsonArray import io.vertx.core.json.JsonObject import java.io.IOException @@ -9,8 +10,8 @@ import java.io.OutputStream import java.nio.ByteBuffer import java.nio.charset.Charset -class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { - private val buffer: Buffer = Buffer.buffer(initialSizeHint) +class BufferOutputStream(initialSizeHint: Int = 256) : BufferInternal, OutputStream() { + private val buffer: BufferInternal = BufferInternal.buffer(initialSizeHint) @Throws(IOException::class) override fun write(b: Int) { @@ -27,23 +28,15 @@ class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { buffer.appendBytes(bytes, offset, len) } - override fun toString(enc: String?): String { + override fun toString(enc: String): String { return buffer.toString(enc) } - override fun toString(enc: Charset?): String { + override fun toString(enc: Charset): String { return buffer.toString(enc) } - override fun writeToBuffer(other: Buffer?) { - buffer.writeToBuffer(other) - } - - override fun readFromBuffer(pos: Int, other: Buffer?): Int { - return buffer.readFromBuffer(pos, other) - } - - override fun copy(): Buffer { + override fun copy(): BufferInternal { return buffer.copy() } @@ -91,10 +84,18 @@ class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { return buffer.getDouble(pos) } + override fun getDoubleLE(pos: Int): Double { + return buffer.getDoubleLE(pos) + } + override fun getFloat(pos: Int): Float { return buffer.getFloat(pos) } + override fun getFloatLE(pos: Int): Float { + return buffer.getFloatLE(pos) + } + override fun getShort(pos: Int): Short { return buffer.getShort(pos) } @@ -135,19 +136,19 @@ class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { return buffer.getBytes(start, end) } - override fun getBytes(dst: ByteArray?): Buffer { + override fun getBytes(dst: ByteArray): Buffer { return buffer.getBytes(dst) } - override fun getBytes(dst: ByteArray?, dstIndex: Int): Buffer { + override fun getBytes(dst: ByteArray, dstIndex: Int): Buffer { return buffer.getBytes(dst, dstIndex) } - override fun getBytes(start: Int, end: Int, dst: ByteArray?): Buffer { + override fun getBytes(start: Int, end: Int, dst: ByteArray): Buffer { return buffer.getBytes(start, end, dst) } - override fun getBytes(start: Int, end: Int, dst: ByteArray?, dstIndex: Int): Buffer { + override fun getBytes(start: Int, end: Int, dst: ByteArray, dstIndex: Int): Buffer { return buffer.getBytes(start, end, dst, dstIndex) } @@ -155,7 +156,7 @@ class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { return buffer.getBuffer(start, end) } - override fun getString(start: Int, end: Int, enc: String?): String { + override fun getString(start: Int, end: Int, enc: String): String { return buffer.getString(start, end, enc) } @@ -163,183 +164,199 @@ class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { return buffer.getString(start, end) } - override fun appendBuffer(buff: Buffer?): Buffer { - return buffer.appendBuffer(buff) + override fun appendBuffer(b: Buffer): BufferInternal { + return buffer.appendBuffer(b) } - override fun appendBuffer(buff: Buffer?, offset: Int, len: Int): Buffer { - return buffer.appendBuffer(buff, offset, len) + override fun appendBuffer(b: Buffer, offset: Int, len: Int): BufferInternal { + return buffer.appendBuffer(b, offset, len) } - override fun appendBytes(bytes: ByteArray?): Buffer { + override fun appendBytes(bytes: ByteArray): BufferInternal { return buffer.appendBytes(bytes) } - override fun appendBytes(bytes: ByteArray?, offset: Int, len: Int): Buffer { + override fun appendBytes(bytes: ByteArray, offset: Int, len: Int): BufferInternal { return buffer.appendBytes(bytes, offset, len) } - override fun appendByte(b: Byte): Buffer { + override fun appendByte(b: Byte): BufferInternal { return buffer.appendByte(b) } - override fun appendUnsignedByte(b: Short): Buffer { + override fun appendUnsignedByte(b: Short): BufferInternal { return buffer.appendUnsignedByte(b) } - override fun appendInt(i: Int): Buffer { + override fun appendInt(i: Int): BufferInternal { return buffer.appendInt(i) } - override fun appendIntLE(i: Int): Buffer { + override fun appendIntLE(i: Int): BufferInternal { return buffer.appendIntLE(i) } - override fun appendUnsignedInt(i: Long): Buffer { + override fun appendUnsignedInt(i: Long): BufferInternal { return buffer.appendUnsignedInt(i) } - override fun appendUnsignedIntLE(i: Long): Buffer { + override fun appendUnsignedIntLE(i: Long): BufferInternal { return buffer.appendUnsignedIntLE(i) } - override fun appendMedium(i: Int): Buffer { + override fun appendMedium(i: Int): BufferInternal { return buffer.appendMedium(i) } - override fun appendMediumLE(i: Int): Buffer { + override fun appendMediumLE(i: Int): BufferInternal { return buffer.appendMediumLE(i) } - override fun appendLong(l: Long): Buffer { + override fun appendLong(l: Long): BufferInternal { return buffer.appendLong(l) } - override fun appendLongLE(l: Long): Buffer { + override fun appendLongLE(l: Long): BufferInternal { return buffer.appendLongLE(l) } - override fun appendShort(s: Short): Buffer { + override fun appendShort(s: Short): BufferInternal { return buffer.appendShort(s) } - override fun appendShortLE(s: Short): Buffer { + override fun appendShortLE(s: Short): BufferInternal { return buffer.appendShortLE(s) } - override fun appendUnsignedShort(s: Int): Buffer { + override fun appendUnsignedShort(s: Int): BufferInternal { return buffer.appendUnsignedShort(s) } - override fun appendUnsignedShortLE(s: Int): Buffer { + override fun appendUnsignedShortLE(s: Int): BufferInternal { return buffer.appendUnsignedShortLE(s) } - override fun appendFloat(f: Float): Buffer { + override fun appendFloat(f: Float): BufferInternal { return buffer.appendFloat(f) } - override fun appendDouble(d: Double): Buffer { + override fun appendFloatLE(f: Float): BufferInternal { + return buffer.appendFloatLE(f) + } + + override fun appendDouble(d: Double): BufferInternal { return buffer.appendDouble(d) } - override fun appendString(str: String?, enc: String?): Buffer { + override fun appendDoubleLE(d: Double): BufferInternal { + return buffer.appendDoubleLE(d) + } + + override fun appendString(str: String, enc: String): BufferInternal { return buffer.appendString(str, enc) } - override fun appendString(str: String?): Buffer { + override fun appendString(str: String): BufferInternal { return buffer.appendString(str) } - override fun setByte(pos: Int, b: Byte): Buffer { + override fun setByte(pos: Int, b: Byte): BufferInternal { return buffer.setByte(pos, b) } - override fun setUnsignedByte(pos: Int, b: Short): Buffer { + override fun setUnsignedByte(pos: Int, b: Short): BufferInternal { return buffer.setUnsignedByte(pos, b) } - override fun setInt(pos: Int, i: Int): Buffer { + override fun setInt(pos: Int, i: Int): BufferInternal { return buffer.setInt(pos, i) } - override fun setIntLE(pos: Int, i: Int): Buffer { + override fun setIntLE(pos: Int, i: Int): BufferInternal { return buffer.setIntLE(pos, i) } - override fun setUnsignedInt(pos: Int, i: Long): Buffer { + override fun setUnsignedInt(pos: Int, i: Long): BufferInternal { return buffer.setUnsignedInt(pos, i) } - override fun setUnsignedIntLE(pos: Int, i: Long): Buffer { + override fun setUnsignedIntLE(pos: Int, i: Long): BufferInternal { return buffer.setUnsignedIntLE(pos, i) } - override fun setMedium(pos: Int, i: Int): Buffer { + override fun setMedium(pos: Int, i: Int): BufferInternal { return buffer.setMedium(pos, i) } - override fun setMediumLE(pos: Int, i: Int): Buffer { + override fun setMediumLE(pos: Int, i: Int): BufferInternal { return buffer.setMediumLE(pos, i) } - override fun setLong(pos: Int, l: Long): Buffer { + override fun setLong(pos: Int, l: Long): BufferInternal { return buffer.setLong(pos, l) } - override fun setLongLE(pos: Int, l: Long): Buffer { + override fun setLongLE(pos: Int, l: Long): BufferInternal { return buffer.setLongLE(pos, l) } - override fun setDouble(pos: Int, d: Double): Buffer { + override fun setDouble(pos: Int, d: Double): BufferInternal { return buffer.setDouble(pos, d) } - override fun setFloat(pos: Int, f: Float): Buffer { + override fun setDoubleLE(pos: Int, d: Double): BufferInternal { + return buffer.setDoubleLE(pos, d) + } + + override fun setFloat(pos: Int, f: Float): BufferInternal { return buffer.setFloat(pos, f) } - override fun setShort(pos: Int, s: Short): Buffer { + override fun setFloatLE(pos: Int, f: Float): BufferInternal { + return buffer.setFloatLE(pos, f) + } + + override fun setShort(pos: Int, s: Short): BufferInternal { return buffer.setShort(pos, s) } - override fun setShortLE(pos: Int, s: Short): Buffer { + override fun setShortLE(pos: Int, s: Short): BufferInternal { return buffer.setShortLE(pos, s) } - override fun setUnsignedShort(pos: Int, s: Int): Buffer { + override fun setUnsignedShort(pos: Int, s: Int): BufferInternal { return buffer.setUnsignedShort(pos, s) } - override fun setUnsignedShortLE(pos: Int, s: Int): Buffer { + override fun setUnsignedShortLE(pos: Int, s: Int): BufferInternal { return buffer.setUnsignedShortLE(pos, s) } - override fun setBuffer(pos: Int, b: Buffer?): Buffer { + override fun setBuffer(pos: Int, b: Buffer): BufferInternal { return buffer.setBuffer(pos, b) } - override fun setBuffer(pos: Int, b: Buffer?, offset: Int, len: Int): Buffer { + override fun setBuffer(pos: Int, b: Buffer, offset: Int, len: Int): BufferInternal { return buffer.setBuffer(pos, b, offset, len) } - override fun setBytes(pos: Int, b: ByteBuffer?): Buffer { + override fun setBytes(pos: Int, b: ByteBuffer): BufferInternal { return buffer.setBytes(pos, b) } - override fun setBytes(pos: Int, b: ByteArray?): Buffer { + override fun setBytes(pos: Int, b: ByteArray): BufferInternal { return buffer.setBytes(pos, b) } - override fun setBytes(pos: Int, b: ByteArray?, offset: Int, len: Int): Buffer { + override fun setBytes(pos: Int, b: ByteArray, offset: Int, len: Int): BufferInternal { return buffer.setBytes(pos, b, offset, len) } - override fun setString(pos: Int, str: String?): Buffer { + override fun setString(pos: Int, str: String): BufferInternal { return buffer.setString(pos, str) } - override fun setString(pos: Int, str: String?, enc: String?): Buffer { + override fun setString(pos: Int, str: String, enc: String): BufferInternal { return buffer.setString(pos, str, enc) } @@ -347,16 +364,23 @@ class BufferOutputStream(initialSizeHint: Int = 0) : Buffer, OutputStream() { return buffer.length() } - override fun slice(): Buffer { + override fun slice(): BufferInternal { return buffer.slice() } - override fun slice(start: Int, end: Int): Buffer { + override fun slice(start: Int, end: Int): BufferInternal { return buffer.slice(start, end) } - @Deprecated("Deprecated in Java") override fun getByteBuf(): ByteBuf { return buffer.byteBuf } + + override fun writeToBuffer(b: Buffer) { + return buffer.writeToBuffer(b) + } + + override fun readFromBuffer(pos: Int, b: Buffer): Int { + return buffer.readFromBuffer(pos, b) + } } \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/PeriodicResolver.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/PeriodicResolver.kt new file mode 100644 index 00000000000..4e08f883e23 --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/PeriodicResolver.kt @@ -0,0 +1,61 @@ +package com.example.starter.helpers + +import com.example.starter.handlers.DefaultHandler +import com.example.starter.handlers.MessageHandler +import com.example.starter.utils.serialize +import io.vertx.core.MultiMap +import io.vertx.core.Vertx +import io.vertx.core.http.HttpHeaders +import java.time.Instant +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter + +private val FORMATTER = DateTimeFormatter.RFC_1123_DATE_TIME.withZone(ZoneOffset.UTC) +private val SERVER: CharSequence = HttpHeaders.createOptimized(Properties.SERVER_NAME) +private val CONTENT_TYPE_TEXT_PLAIN: CharSequence = HttpHeaders.createOptimized("text/plain") +private val CONTENT_TYPE_APPLICATION_JSON: CharSequence = HttpHeaders.createOptimized("application/json") +private val PLAINTEXT_CONTENT_LENGTH: CharSequence= HttpHeaders.createOptimized(DefaultHandler.MESSAGE.length.toString()) +private val JSON_CONTENT_LENGTH: CharSequence = HttpHeaders.createOptimized(MessageHandler.DEFAULT_MESSAGE.serialize().length().toString()) + +@Suppress("NOTHING_TO_INLINE") +object PeriodicResolver { + @Volatile + var current: CharSequence = next() + private set + + @Volatile + var plaintext: MultiMap = nextPlaintext() + private set + + @Volatile + var json: MultiMap = nextJson() + private set + + fun init(vertx: Vertx) { + vertx.setPeriodic(1_000L) { + current = next() + plaintext = nextPlaintext() + json = nextJson() + } + } + + private fun next(): CharSequence = HttpHeaders.createOptimized( + FORMATTER.format(Instant.now()) + ) + + private fun nextPlaintext(): MultiMap = HttpHeaders + .headers() + .add(HttpHeaders.SERVER, SERVER) + .add(HttpHeaders.DATE, current) + .add(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE_TEXT_PLAIN) + .add(HttpHeaders.CONTENT_LENGTH, PLAINTEXT_CONTENT_LENGTH) + .copy(false) + + private fun nextJson(): MultiMap = HttpHeaders + .headers() + .add(HttpHeaders.SERVER, SERVER) + .add(HttpHeaders.DATE, current) + .add(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON) + .add(HttpHeaders.CONTENT_LENGTH, JSON_CONTENT_LENGTH) + .copy(false) +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/Properties.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/Properties.kt new file mode 100644 index 00000000000..ca72dd8a61c --- /dev/null +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/helpers/Properties.kt @@ -0,0 +1,171 @@ +package com.example.starter.helpers + +import io.netty.util.internal.SystemPropertyUtil +import io.vertx.core.impl.cpu.CpuCoreSensor +import io.vertx.core.tracing.TracingPolicy +import io.vertx.kotlin.core.http.httpServerOptionsOf +import io.vertx.kotlin.pgclient.pgConnectOptionsOf + +object Properties { + + /** + * The server name (used in headers and logging). + * Default: `Vert.x-Web` + */ + val SERVER_NAME: String = SystemPropertyUtil.get("tfb.serverName", "Vert.x-Web") + + /** + * Type of verticle to deploy. + * Default: all ([com.example.starter.ServerVerticle]) + */ + val TYPE: String = SystemPropertyUtil.get("tfb.type", "all") + + /** + * Number of event loop threads. + * Default: [io.vertx.core.impl.cpu.CpuCoreSensor.availableProcessors] + */ + val EVENT_LOOP_POOL_SIZE: Int = SystemPropertyUtil.getInt("tfb.eventLoopPoolSize", CpuCoreSensor.availableProcessors()) + + /** + * Whether metrics are enabled. + * Default: Reverse of `vertx.disableMetrics` (defaults to false) + */ + val METRICS_ENABLED: Boolean = SystemPropertyUtil.getBoolean("vertx.disableMetrics", false).not() + + /** + * Port the HTTP server listens on. + * Default: 8080 (tfb.http.port) + */ + val HTTP_PORT: Int = SystemPropertyUtil.getInt("tfb.http.port", 8080) + + /** + * Size of TCP send buffer for HTTP connections, in bytes. + * Default: 32768 (tfb.http.sendBufferSize) + */ + val HTTP_SEND_BUFFER_SIZE: Int = SystemPropertyUtil.getInt("tfb.http.sendBufferSize", 16 * 1024) + + /** + * Size of TCP receive buffer for HTTP connections, in bytes. + * Default: 32768 (tfb.http.receiveBufferSize) + */ + val HTTP_RECEIVE_BUFFER_SIZE: Int = SystemPropertyUtil.getInt("tfb.http.receiveBufferSize", 16 * 1024) + + /** + * Enables TCP Fast Open on the HTTP server. + * Default: true (tfb.http.tcpFastOpen) + */ + val HTTP_TCP_FASTOPEN: Boolean = SystemPropertyUtil.getBoolean("tfb.http.tcpFastOpen", true) + + /** + * Enables TCP_NODELAY (disables Nagle) on HTTP connections. + * Default: true (tfb.http.tcpNoDelay) + */ + val HTTP_TCP_NODELAY: Boolean = SystemPropertyUtil.getBoolean("tfb.http.tcpNoDelay", true) + + /** + * Idle timeout for HTTP connections in seconds. + * 0 disables idle timeout. + * Default: 0 (tfb.http.idleTimeout) + */ + val HTTP_IDLE_TIMEOUT: Int = SystemPropertyUtil.getInt("tfb.http.idleTimeout", 0) + + /** + * Enables SO_REUSEADDR on the HTTP server socket. + * Default: true (tfb.http.reuseAddress) + */ + val HTTP_REUSE_ADDRESS: Boolean = SystemPropertyUtil.getBoolean("tfb.http.reuseAddress", true) + + /** + * Enables SO_REUSEPORT on the HTTP server socket. + * Default: true (tfb.http.reusePort) + */ + val HTTP_REUSE_PORT: Boolean = SystemPropertyUtil.getBoolean("tfb.http.reusePort", true) + + /** + * Size of the TCP accept backlog for the HTTP server. + * Default: 8192 (tfb.http.acceptBacklog) + */ + val HTTP_ACCEPT_BACKLOG: Int = SystemPropertyUtil.getInt("tfb.http.acceptBacklog", 8192) + + /** + * PostgreSQL username used for connections. + * Default: benchmarkdbuser (tfb.pg.user) + */ + val PG_USER: String = SystemPropertyUtil.get("tfb.pg.user", "benchmarkdbuser") + + /** + * PostgreSQL password used for connections. + * Default: benchmarkdbpass (tfb.pg.password) + */ + val PG_PASSWORD: String = SystemPropertyUtil.get("tfb.pg.password", "benchmarkdbpass") + + /** + * PostgreSQL host used for connections. + * Default: tfb.pgHostOverride system property, otherwise "tfb-database". + * Property: tfb.pg.host + */ + val PG_HOST: String = SystemPropertyUtil.get("tfb.pg.host", System.getProperty("tfb.pgHostOverride") ?: "tfb-database") + + /** + * PostgreSQL port used for connections. + * Default: 5432 (tfb.pg.port) + */ + val PG_PORT: Int = SystemPropertyUtil.getInt("tfb.pg.port", 5432) + + /** + * PostgreSQL database name used for connections. + * Default: hello_world (tfb.pg.database) + */ + val PG_DATABASE: String = SystemPropertyUtil.get("tfb.pg.database", "hello_world") + + /** + * Enables prepared statement caching on the PostgreSQL client. + * Default: true (tfb.pg.cachePreparedStatements) + */ + val PG_CACHE_PREPARED_STATEMENTS: Boolean = SystemPropertyUtil.getBoolean("tfb.pg.cachePreparedStatements", true) + + /** + * Maximum size of the prepared statement cache. + * Default: 1024 (tfb.pg.preparedStatementCacheMaxSize) + */ + val PG_PREPARED_STATEMENT_CACHE_MAX_SIZE: Int = + SystemPropertyUtil.getInt("tfb.pg.preparedStatementCacheMaxSize", 1024) + + /** + * Max number of in-flight pipelined requests per connection. + * Default: 1024 (tfb.pg.pipeliningLimit) + */ + val PG_PIPELINING_LIMIT: Int = SystemPropertyUtil.getInt("tfb.pg.pipeliningLimit", 1024) + + val HTTP by lazy { + httpServerOptionsOf( + port = HTTP_PORT, + sendBufferSize = HTTP_SEND_BUFFER_SIZE, + receiveBufferSize = HTTP_RECEIVE_BUFFER_SIZE, + tcpFastOpen = HTTP_TCP_FASTOPEN, + tcpNoDelay = HTTP_TCP_NODELAY, + idleTimeout = HTTP_IDLE_TIMEOUT, + reuseAddress = HTTP_REUSE_ADDRESS, + reusePort = HTTP_REUSE_PORT, + acceptBacklog = HTTP_ACCEPT_BACKLOG, + compressionSupported = false, + tracingPolicy = TracingPolicy.IGNORE, + http2ClearTextEnabled = false, + strictThreadMode = true, + ) + } + + val PG_CONNECT by lazy { + pgConnectOptionsOf( + user = PG_USER, + password = PG_PASSWORD, + host = PG_HOST, + port = PG_PORT, + database = PG_DATABASE, + cachePreparedStatements = PG_CACHE_PREPARED_STATEMENTS, + preparedStatementCacheMaxSize = PG_PREPARED_STATEMENT_CACHE_MAX_SIZE, + tracingPolicy = TracingPolicy.IGNORE, + pipeliningLimit = PG_PIPELINING_LIMIT + ) + } +} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt deleted file mode 100644 index fbf355e66a9..00000000000 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/io/JsonResource.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.starter.io - -import io.vertx.core.json.JsonObject - -object JsonResource { - fun of(resource: String): JsonObject { - val classLoader = ClassLoader.getSystemClassLoader() - classLoader.getResourceAsStream(resource)?.use { input -> - val output = BufferOutputStream() - output.write(input.readAllBytes()) - return output.toJsonObject() - } - throw IllegalStateException("$resource not found") - } -} diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt index 4b832526750..f9293258ed9 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Fortune.kt @@ -5,8 +5,8 @@ import com.dslplatform.json.JsonAttribute @CompiledJson class Fortune( - @JsonAttribute(nullable = false) val id: Int, - @JsonAttribute(nullable = false) val message: String + @field:JsonAttribute(nullable = false) val id: Int, + @field:JsonAttribute(nullable = false) val message: String, ) : Comparable { override fun compareTo(other: Fortune): Int { return message.compareTo(other.message) diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt index eb7fc6250a3..1953c10cfcb 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/Message.kt @@ -4,4 +4,4 @@ import com.dslplatform.json.CompiledJson import com.dslplatform.json.JsonAttribute @CompiledJson -class Message(@JsonAttribute(nullable = false) val message: String) +class Message(@field:JsonAttribute(nullable = false) val message: String) diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt index 5011a2bb2e0..030f96ed314 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/models/World.kt @@ -5,10 +5,8 @@ import com.dslplatform.json.JsonAttribute @CompiledJson class World( - @JsonAttribute(nullable = false) val id: Int, - @JsonAttribute(nullable = false) var randomNumber: Int + @field:JsonAttribute(nullable = false) val id: Int, + @field:JsonAttribute(nullable = false) var randomNumber: Int, ) : Comparable { - override fun compareTo(other: World): Int { - return id.compareTo(other.id) - } + override fun compareTo(other: World): Int = id - other.id } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt index 03d5a018575..1b9ce713000 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/FutureExtensions.kt @@ -1,14 +1,14 @@ package com.example.starter.utils -import io.vertx.core.CompositeFuture import io.vertx.core.Future -import java.util.concurrent.TimeUnit +import io.vertx.kotlin.coroutines.coAwait import kotlin.time.Duration - -inline fun CompositeFuture.array(): Array = Array(this.size()) { this.resultAt(it) } +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout @Suppress("NOTHING_TO_INLINE") -inline fun > T.block(duration: Duration): R = this - .toCompletionStage() - .toCompletableFuture() - .get(duration.inWholeMilliseconds, TimeUnit.MILLISECONDS) \ No newline at end of file +inline fun > T.block(duration: Duration): R = runBlocking { + withTimeout(duration) { + coAwait() + } +} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt index 264be5a7323..f7793af1509 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/JsonExtensions.kt @@ -2,17 +2,16 @@ package com.example.starter.utils import com.dslplatform.json.DslJson import com.dslplatform.json.runtime.Settings -import com.example.starter.io.BufferOutputStream +import com.example.starter.helpers.BufferOutputStream import io.vertx.core.buffer.Buffer val DSL_JSON: DslJson = DslJson( Settings.withRuntime() .includeServiceLoader() - .useStringValuesCache(DslJson.SimpleStringCache()) ) @Suppress("NOTHING_TO_INLINE") -inline fun T.serialize(initialSizeHint: Int = 0): Buffer { +inline fun T.serialize(initialSizeHint: Int = 128): Buffer { val output = BufferOutputStream(initialSizeHint) DSL_JSON.serialize(this, output) return output diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt deleted file mode 100644 index 23786587569..00000000000 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/PeriodicDateResolver.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.starter.utils - -import io.vertx.core.Vertx -import io.vertx.core.http.HttpHeaders -import java.time.ZonedDateTime -import java.time.format.DateTimeFormatter - -object PeriodicDateResolver { - var current: CharSequence = next() - - fun init(vertx: Vertx) { - vertx.setPeriodic(1000L) { current = next() } - } - - @Suppress("NOTHING_TO_INLINE") - private inline fun next(): CharSequence = HttpHeaders.createOptimized( - DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()) - ) -} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt index 3959ba8d9a0..7f7fcc84ab4 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/RowSetExtensions.kt @@ -5,11 +5,8 @@ import io.vertx.sqlclient.RowSet // This extension relies on the assumption the mapper never returns null, as it is defined. Otherwise, // we prevent the overhead from having to do another iteration over the loop for a `filterNotNull` check. -@Suppress("UNCHECKED_CAST") +@Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE") inline fun RowSet.mapToArray(mapper: (Row) -> U): Array { - val arr = arrayOfNulls(this.size()) - val iterator = this.iterator() - var index = 0 - while (iterator.hasNext()) arr[index++] = mapper(iterator.next()) - return arr as Array + val iterator = iterator() + return Array(size()) { mapper(iterator.next()) } } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt index 00cf1463297..3f31f9720a9 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/kotlin/com/example/starter/utils/ThrowableExtensions.kt @@ -7,10 +7,8 @@ import java.net.SocketException const val CONNECTION_RESET_MESSAGE = "Connection reset" @Suppress("NOTHING_TO_INLINE") -inline fun Throwable.isConnectionReset(): Boolean { - return when { - this is NativeIoException && this.expectedErr() == Errors.ERRNO_ECONNRESET_NEGATIVE -> true - this is SocketException && this.message == CONNECTION_RESET_MESSAGE -> true - else -> false - } +inline fun Throwable.isConnectionReset(): Boolean = when (this) { + is NativeIoException if this.expectedErr() == Errors.ERRNO_ECONNRESET_NEGATIVE -> true + is SocketException if this.message == CONNECTION_RESET_MESSAGE -> true + else -> false } diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json deleted file mode 100644 index a790bc93043..00000000000 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/http-server-options.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "port": 8080, - "tcpFastOpen": true, - "receiveBufferSize": 262144, - "sendBufferSize": 262144 -} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json b/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json deleted file mode 100644 index 3cf43317687..00000000000 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/src/main/resources/pg-connect-options.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "user": "benchmarkdbuser", - "password": "benchmarkdbpass", - "host": "tfb-database", - "port": 5432, - "database": "hello_world", - "cachePreparedStatements": true, - "preparedStatementCacheMaxSize": 1024, - "pipeliningLimit": 100000, - "receiveBufferSize": 262144, - "sendBufferSize": 262144 -} \ No newline at end of file diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile index 50152d8df30..b7157b37da2 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson-postgresql.dockerfile @@ -1,39 +1,56 @@ -FROM gradle:8.9-jdk21 as gradle +# --- Build stage with JDK 25 --- +FROM gradle:9.2-jdk25-corretto AS builder WORKDIR /vertx-web-kotlin-dsljson COPY src src +COPY buildSrc buildSrc COPY build.gradle.kts build.gradle.kts -COPY gradle.properties gradle.properties COPY settings.gradle.kts settings.gradle.kts +COPY gradle.properties gradle.properties +COPY gradle/libs.versions.toml gradle/libs.versions.toml + +RUN gradle shadowJar --no-daemon + +# --- Runtime stage using Amazon Corretto 25 --- +FROM amazoncorretto:25 + +WORKDIR /app -RUN gradle shadowJar +COPY --from=builder \ + /vertx-web-kotlin-dsljson/build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar \ + vertx-web-kotlin-dsljson.jar EXPOSE 8080 CMD java \ - -server \ - -Xms2G \ - -Xmx2G \ - -XX:+AlwaysPreTouch \ - -XX:+UseParallelGC \ - -XX:InitialCodeCacheSize=512m \ - -XX:ReservedCodeCacheSize=512m \ - -XX:MaxInlineLevel=20 \ - -XX:+UseNUMA \ - -Djava.lang.Integer.IntegerCache.high=10000 \ - -Dvertx.disableMetrics=true \ - -Dvertx.disableH2c=true \ - -Dvertx.disableWebsockets=true \ - -Dvertx.flashPolicyHandler=false \ - -Dvertx.threadChecks=false \ - -Dvertx.disableContextTimings=true \ - -Dvertx.disableTCCL=true \ - -Dvertx.disableHttpHeadersValidation=true \ - -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ - -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ - -Dio.netty.buffer.checkBounds=false \ - -Dio.netty.buffer.checkAccessible=false \ - -Dtfb.hasDB=true \ - -jar \ - build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar + -server \ + --enable-native-access=ALL-UNNAMED \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ + --sun-misc-unsafe-memory-access=allow \ + -Xms2G \ + -Xmx2G \ + -XX:+AlwaysPreTouch \ + -XX:+UseParallelGC \ + -XX:InitialCodeCacheSize=512m \ + -XX:ReservedCodeCacheSize=512m \ + -XX:MaxInlineLevel=20 \ + -XX:+UseNUMA \ + -XX:-UseCodeCacheFlushing \ + -XX:AutoBoxCacheMax=10001 \ + -XX:+UseCompactObjectHeaders \ + -Djava.net.preferIPv4Stack=true \ + -Dvertx.disableMetrics=true \ + -Dvertx.disableWebsockets=true \ + -Dvertx.disableContextTimings=true \ + -Dvertx.cacheImmutableHttpResponseHeaders=true \ + -Dvertx.internCommonHttpRequestHeadersToLowerCase=true \ + -Dvertx.disableHttpHeadersValidation=true \ + -Dio.netty.noUnsafe=false \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + -Dio.netty.leakDetection.level=disabled \ + -Dio.netty.iouring.ringSize=4096 \ + -Dio.netty.iouring.cqSize=8192 \ + -Dtfb.type=postgres \ + -jar /app/vertx-web-kotlin-dsljson.jar diff --git a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile index 568f19f79dd..c69e49fbbfd 100644 --- a/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile +++ b/frameworks/Kotlin/vertx-web-kotlin-dsljson/vertx-web-kotlin-dsljson.dockerfile @@ -1,39 +1,56 @@ -FROM gradle:8.9-jdk21 as gradle +# --- Build stage with JDK 25 --- +FROM gradle:9.2-jdk25-corretto AS builder WORKDIR /vertx-web-kotlin-dsljson COPY src src +COPY buildSrc buildSrc COPY build.gradle.kts build.gradle.kts -COPY gradle.properties gradle.properties COPY settings.gradle.kts settings.gradle.kts +COPY gradle.properties gradle.properties +COPY gradle/libs.versions.toml gradle/libs.versions.toml + +RUN gradle shadowJar --no-daemon + +# --- Runtime stage using Amazon Corretto 25 --- +FROM amazoncorretto:25 + +WORKDIR /app -RUN gradle shadowJar +COPY --from=builder \ + /vertx-web-kotlin-dsljson/build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar \ + vertx-web-kotlin-dsljson.jar EXPOSE 8080 CMD java \ - -server \ - -Xms2G \ - -Xmx2G \ - -XX:+AlwaysPreTouch \ - -XX:+UseParallelGC \ - -XX:InitialCodeCacheSize=512m \ - -XX:ReservedCodeCacheSize=512m \ - -XX:MaxInlineLevel=20 \ - -XX:+UseNUMA \ - -Djava.lang.Integer.IntegerCache.high=10000 \ - -Dvertx.disableMetrics=true \ - -Dvertx.disableH2c=true \ - -Dvertx.disableWebsockets=true \ - -Dvertx.flashPolicyHandler=false \ - -Dvertx.threadChecks=false \ - -Dvertx.disableContextTimings=true \ - -Dvertx.disableTCCL=true \ - -Dvertx.disableHttpHeadersValidation=true \ - -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ - -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \ - -Dio.netty.buffer.checkBounds=false \ - -Dio.netty.buffer.checkAccessible=false \ - -Dtfb.hasDB=false \ - -jar \ - build/libs/vertx-web-kotlin-dsljson-benchmark-1.0.0-SNAPSHOT-fat.jar + -server \ + --enable-native-access=ALL-UNNAMED \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ + --sun-misc-unsafe-memory-access=allow \ + -Xms2G \ + -Xmx2G \ + -XX:+AlwaysPreTouch \ + -XX:+UseParallelGC \ + -XX:InitialCodeCacheSize=512m \ + -XX:ReservedCodeCacheSize=512m \ + -XX:MaxInlineLevel=20 \ + -XX:+UseNUMA \ + -XX:-UseCodeCacheFlushing \ + -XX:AutoBoxCacheMax=10001 \ + -XX:+UseCompactObjectHeaders \ + -Djava.net.preferIPv4Stack=true \ + -Dvertx.disableMetrics=true \ + -Dvertx.disableWebsockets=true \ + -Dvertx.disableContextTimings=true \ + -Dvertx.cacheImmutableHttpResponseHeaders=true \ + -Dvertx.internCommonHttpRequestHeadersToLowerCase=true \ + -Dvertx.disableHttpHeadersValidation=true \ + -Dio.netty.noUnsafe=false \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + -Dio.netty.leakDetection.level=disabled \ + -Dio.netty.iouring.ringSize=4096 \ + -Dio.netty.iouring.cqSize=8192 \ + -Dtfb.type=basic \ + -jar /app/vertx-web-kotlin-dsljson.jar From dd562f589f954f91ef576162bdd61a2452ab3bf7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 23:11:39 +0000 Subject: [PATCH 1761/1766] Build(deps): bump golang.org/x/crypto in /frameworks/Go/fiber/src Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.36.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.36.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/fiber/src/go.mod | 10 +++++----- frameworks/Go/fiber/src/go.sum | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index 6980da19018..6e1dcc6247f 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -1,6 +1,6 @@ module fiber/app -go 1.23.0 +go 1.24.0 toolchain go1.24.1 @@ -24,8 +24,8 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.60.0 // indirect - golang.org/x/crypto v0.36.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 386b9e79452..bbb70d60f3f 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -43,15 +43,15 @@ github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdq github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 895d00e622da7220089298d920cc8399a57dd441 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 23:17:56 +0000 Subject: [PATCH 1762/1766] Build(deps): bump golang.org/x/crypto in /frameworks/Go/hertz Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.36.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.36.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/hertz/go.mod | 10 +++++----- frameworks/Go/hertz/go.sum | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Go/hertz/go.mod b/frameworks/Go/hertz/go.mod index 4119d421b62..741b2016451 100644 --- a/frameworks/Go/hertz/go.mod +++ b/frameworks/Go/hertz/go.mod @@ -1,6 +1,6 @@ module hertz -go 1.23.0 +go 1.24.0 toolchain go1.24.1 @@ -28,10 +28,10 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect golang.org/x/arch v0.15.0 // indirect - golang.org/x/crypto v0.36.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/frameworks/Go/hertz/go.sum b/frameworks/Go/hertz/go.sum index 7c4f93bbbfe..9159cda26d4 100644 --- a/frameworks/Go/hertz/go.sum +++ b/frameworks/Go/hertz/go.sum @@ -84,8 +84,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -101,8 +101,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -112,8 +112,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -126,8 +126,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= From 118f90427a0d6d772219f9a630eaa1dd0d70ca38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 23:24:34 +0000 Subject: [PATCH 1763/1766] Build(deps): bump golang.org/x/crypto in /frameworks/Go/gin/gin-gorm Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.36.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.36.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/gin/gin-gorm/go.mod | 12 ++++++------ frameworks/Go/gin/gin-gorm/go.sum | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/frameworks/Go/gin/gin-gorm/go.mod b/frameworks/Go/gin/gin-gorm/go.mod index 4e73bd0d4e2..1660edbccf5 100644 --- a/frameworks/Go/gin/gin-gorm/go.mod +++ b/frameworks/Go/gin/gin-gorm/go.mod @@ -1,6 +1,6 @@ module gin-gorm/app -go 1.23.0 +go 1.24.0 toolchain go1.24.1 @@ -39,11 +39,11 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect golang.org/x/arch v0.15.0 // indirect - golang.org/x/crypto v0.36.0 // indirect - golang.org/x/net v0.38.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect google.golang.org/protobuf v1.36.6 // 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 8d103d7745f..79a5ba8e1a4 100644 --- a/frameworks/Go/gin/gin-gorm/go.sum +++ b/frameworks/Go/gin/gin-gorm/go.sum @@ -84,17 +84,17 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 563b3d7e31c04848dc6615966ed4fcc70d8371ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 01:38:24 +0000 Subject: [PATCH 1764/1766] Build(deps): bump golang.org/x/crypto Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.35.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.35.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/goravel/src/fiber/go.mod | 14 +++++------ frameworks/Go/goravel/src/fiber/go.sum | 32 +++++++++++++------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/frameworks/Go/goravel/src/fiber/go.mod b/frameworks/Go/goravel/src/fiber/go.mod index 6fd142f91bf..e0ee741ee37 100644 --- a/frameworks/Go/goravel/src/fiber/go.mod +++ b/frameworks/Go/goravel/src/fiber/go.mod @@ -1,6 +1,6 @@ module goravel -go 1.23.0 +go 1.24.0 toolchain go1.24.1 @@ -162,14 +162,14 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.35.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.26.0 // indirect + golang.org/x/net v0.47.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/term v0.29.0 // indirect - golang.org/x/text v0.22.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.171.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/frameworks/Go/goravel/src/fiber/go.sum b/frameworks/Go/goravel/src/fiber/go.sum index bc5125921ca..5e100bb5998 100644 --- a/frameworks/Go/goravel/src/fiber/go.sum +++ b/frameworks/Go/goravel/src/fiber/go.sum @@ -723,8 +723,8 @@ golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0 golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -764,8 +764,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -812,8 +812,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -840,8 +840,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -905,8 +905,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -917,8 +917,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= -golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -935,8 +935,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1002,8 +1002,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= 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= From 58e20ba817177415cf02f6f75c6a0cf775d03b6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:02:49 +0000 Subject: [PATCH 1765/1766] Build(deps): bump golang.org/x/crypto in /frameworks/Go/atreugo/src Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.36.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.36.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/atreugo/src/go.mod | 10 +++++----- frameworks/Go/atreugo/src/go.sum | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Go/atreugo/src/go.mod b/frameworks/Go/atreugo/src/go.mod index 46944099dc5..01fb51e3d5c 100644 --- a/frameworks/Go/atreugo/src/go.mod +++ b/frameworks/Go/atreugo/src/go.mod @@ -1,6 +1,6 @@ module atreugo/src -go 1.23.0 +go 1.24.0 toolchain go1.24.1 @@ -20,8 +20,8 @@ require ( github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.60.0 // indirect - golang.org/x/crypto v0.36.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect ) diff --git a/frameworks/Go/atreugo/src/go.sum b/frameworks/Go/atreugo/src/go.sum index 0850edc3bd7..87b06ac2495 100644 --- a/frameworks/Go/atreugo/src/go.sum +++ b/frameworks/Go/atreugo/src/go.sum @@ -36,14 +36,14 @@ github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdq github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 47360255070785407b064ed01dd8c85ae08c371c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:45:26 +0000 Subject: [PATCH 1766/1766] Build(deps): bump golang.org/x/crypto in /frameworks/Go/indigo/src Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.41.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.41.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/indigo/src/go.mod | 8 ++++---- frameworks/Go/indigo/src/go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frameworks/Go/indigo/src/go.mod b/frameworks/Go/indigo/src/go.mod index cf0eeb1cb9e..874efeac4de 100644 --- a/frameworks/Go/indigo/src/go.mod +++ b/frameworks/Go/indigo/src/go.mod @@ -18,8 +18,8 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - golang.org/x/crypto v0.41.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/text v0.31.0 // indirect ) diff --git a/frameworks/Go/indigo/src/go.sum b/frameworks/Go/indigo/src/go.sum index 2207dda2ca6..99170600d2b 100644 --- a/frameworks/Go/indigo/src/go.sum +++ b/frameworks/Go/indigo/src/go.sum @@ -36,14 +36,14 @@ 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/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

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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